Merge remote-tracking branch 'origin/dev' into electra

This commit is contained in:
Methodius 2024-04-19 18:07:23 +03:00
commit 7b99f0b0bb
No known key found for this signature in database
GPG key ID: 122FA99A00B41679
963 changed files with 17968 additions and 7052 deletions

View file

@ -69,7 +69,7 @@ Min butthurt: 0
Max butthurt: 9 Max butthurt: 9
Min level: 1 Min level: 1
Max level: 3 Max level: 3
Weight: 4 Weight: 3
Name: L1_Painting_128x64 Name: L1_Painting_128x64
Min butthurt: 0 Min butthurt: 0
@ -85,26 +85,33 @@ Min level: 1
Max level: 3 Max level: 3
Weight: 3 Weight: 3
Name: L1_Senpai_128x64
Min butthurt: 0
Max butthurt: 5
Min level: 1
Max level: 3
Weight: 3
Name: L1_Kaiju_128x64 Name: L1_Kaiju_128x64
Min butthurt: 0 Min butthurt: 0
Max butthurt: 10 Max butthurt: 10
Min level: 1 Min level: 1
Max level: 3 Max level: 3
Weight: 4 Weight: 3
Name: L1_My_dude_128x64 Name: L1_My_dude_128x64
Min butthurt: 0 Min butthurt: 0
Max butthurt: 8 Max butthurt: 8
Min level: 1 Min level: 1
Max level: 3 Max level: 3
Weight: 4 Weight: 3
Name: L2_Wake_up_128x64 Name: L2_Wake_up_128x64
Min butthurt: 0 Min butthurt: 0
Max butthurt: 12 Max butthurt: 12
Min level: 2 Min level: 2
Max level: 3 Max level: 3
Weight: 4 Weight: 3
Name: L2_Furippa2_128x64 Name: L2_Furippa2_128x64
Min butthurt: 0 Min butthurt: 0
@ -132,7 +139,7 @@ Min butthurt: 0
Max butthurt: 8 Max butthurt: 8
Min level: 2 Min level: 2
Max level: 3 Max level: 3
Weight: 4 Weight: 3
Name: L3_Furippa3_128x64 Name: L3_Furippa3_128x64
Min butthurt: 0 Min butthurt: 0
@ -155,30 +162,30 @@ Min level: 3
Max level: 3 Max level: 3
Weight: 3 Weight: 3
Name: L1_Senpai_128x64
Min butthurt: 0
Max butthurt: 5
Min level: 1
Max level: 3
Weight: 4
Name: L1_Sad_song_128x64 Name: L1_Sad_song_128x64
Min butthurt: 8 Min butthurt: 8
Max butthurt: 13 Max butthurt: 13
Min level: 1 Min level: 1
Max level: 3 Max level: 3
Weight: 4 Weight: 3
Name: L2_Coding_in_the_shell_128x64 Name: L2_Coding_in_the_shell_128x64
Min butthurt: 0 Min butthurt: 0
Max butthurt: 12 Max butthurt: 12
Min level: 2 Min level: 2
Max level: 3 Max level: 3
Weight: 4 Weight: 3
Name: L2_Secret_door_128x64 Name: L2_Secret_door_128x64
Min butthurt: 0 Min butthurt: 0
Max butthurt: 12 Max butthurt: 12
Min level: 2 Min level: 2
Max level: 3 Max level: 3
Weight: 4 Weight: 3
Name: L3_Freedom_2_dolphins_128x64
Min butthurt: 0
Max butthurt: 12
Min level: 3
Max level: 3
Weight: 5

View file

@ -527,7 +527,7 @@ index 0000000..572e1df
+ +
+void SK6805_update(void) { +void SK6805_update(void) {
+ SK6805_init(); + SK6805_init();
+ furi_kernel_lock(); + FURI_CRITICAL_ENTER();
+ uint32_t end; + uint32_t end;
+ /* Последовательная отправка цветов светодиодов */ + /* Последовательная отправка цветов светодиодов */
+ for(uint8_t lednumber = 0; lednumber < SK6805_LED_COUNT; lednumber++) { + for(uint8_t lednumber = 0; lednumber < SK6805_LED_COUNT; lednumber++) {
@ -567,7 +567,7 @@ index 0000000..572e1df
+ } + }
+ } + }
+ } + }
+ furi_kernel_unlock(); + FURI_CRITICAL_EXIT();
+} +}
diff --git a/lib/drivers/SK6805.h b/lib/drivers/SK6805.h diff --git a/lib/drivers/SK6805.h b/lib/drivers/SK6805.h
new file mode 100644 new file mode 100644
@ -637,9 +637,9 @@ index 83e1603..45798ca 100644
#include <stdint.h> #include <stdint.h>
+#include <applications/settings/notification_settings/rgb_backlight.h> +#include <applications/settings/notification_settings/rgb_backlight.h>
#define LED_CURRENT_RED 50 #define LED_CURRENT_RED (50u)
#define LED_CURRENT_GREEN 50 #define LED_CURRENT_GREEN (50u)
@@ -31,22 +32,21 @@ void furi_hal_light_init() { @@ -31,22 +32,21 @@ void furi_hal_light_init(void) {
} }
void furi_hal_light_set(Light light, uint8_t value) { void furi_hal_light_set(Light light, uint8_t value) {

View file

@ -1,10 +1,10 @@
# MLib macros we can't do much about. # MLib macros we can't do much about.
//-V:M_LET:1048,1044 //-V:M_LET:1048,1044
//-V:M_EACH:1048,1044 //-V:M_EACH:1048,1044
//-V:ARRAY_DEF:760,747,568,776,729,712,654 //-V:ARRAY_DEF:760,747,568,776,729,712,654,1103
//-V:LIST_DEF:760,747,568,712,729,654,776 //-V:LIST_DEF:760,747,568,712,729,654,776,1103
//-V:BPTREE_DEF2:779,1086,557,773,512 //-V:BPTREE_DEF2:779,1086,557,773,512
//-V:DICT_DEF2:779,524,776,760,1044,1001,729,590,568,747,685 //-V:DICT_DEF2:779,524,776,760,1044,1001,729,590,568,747,685,1103
//-V:ALGO_DEF:1048,747,1044 //-V:ALGO_DEF:1048,747,1044
//-V:TUPLE_DEF2:524,590,1001,760 //-V:TUPLE_DEF2:524,590,1001,760
@ -42,8 +42,5 @@
# Model-related warnings # Model-related warnings
//-V:with_view_model:1044,1048 //-V:with_view_model:1044,1048
# Functions that always return the same error code
//-V:picopass_device_decrypt:1048
# Examples # Examples
//V_EXCLUDE_PATH applications/examples/ //V_EXCLUDE_PATH applications/examples/

2
.vscode/ReadMe.md vendored
View file

@ -1,4 +1,4 @@
# Visual Studio Code workspace for Flipper Zero # Visual Studio Code workspace for Flipper Zero {#vscode}
## Setup ## Setup

View file

@ -14,7 +14,7 @@
"*.scons": "python", "*.scons": "python",
"SConscript": "python", "SConscript": "python",
"SConstruct": "python", "SConstruct": "python",
"*.fam": "python", "*.fam": "python"
}, },
"clangd.arguments": [ "clangd.arguments": [
// We might be able to tighten this a bit more to only include the correct toolchain. // We might be able to tighten this a bit more to only include the correct toolchain.

View file

@ -1,58 +1,54 @@
## New changes ## New changes
* NFC: **Fixed stuck Saved success screen** * NFC: CharlieCard parser (by @zacharyweiss)
* NFC: **Fixed crash when reading mifare classic tag then going to add manually menu and adding NFC-A tag** * SubGHz: Add Manually - Sommer FM fixes
* NFC: Fixed EMV txs render * SubGHz: Enabled tx-rx state on unused gpio pin by default (**external amp option was removed and is enabled by default now**)
* NFC/LFRFID: Don't Stop emulation after 5 mins to avoid antenna damage if debug is ON (by @Leptopt1los) * SubGHz: **Status output !TX/RX on the GDO2 CC1101 pin** (by @quen0n | PR #742)
* LFRFID: Fixed T5577 custom password input (by @Leptopt1los) * SubGHz: Reworked saved settings (by @xMasterX and @Willy-JL)
* OFW PR 3410: lfrfid/em4100: added support for different bit rates - by @Mrkvak (RF/32 full support, RF/16 support without reading (16clk removed for now)) * Desktop: Fixes for animation unload (by @Willy-JL)
* OFW PR 3412: Fixed MyKey LockID - by @zProAle * Misc: Added `void` due to `-Wstrict-prototypes`
<br>----<br> * Misc: Some code cleanup and proper log levels in nfc parsers
**Changes from 070 release:**<br> * Infrared: Allow external apps to use infrared settings (by @Willy-JL)
* NFC: **EMV parser** added (by @Leptopt1los and @wosk | PR #700) * JS & HAL: Various fixes and FURI_HAL_RANDOM_MAX define added (by @Willy-JL)
* NFC: Metromoney parser balance fix (by @Leptopt1los | PR #699) * JS: **BadUSB layout support** (by @Willy-JL)
* NFC/LFRFID: Stop emulation after 5 mins to avoid antenna damage (by @Leptopt1los) * JS: Module `widget` and path globals (by @jamisonderek)
* Archive: Fix two filebrowser bugs * Apps: NFC Magic - **Gen2 writing support, Gen4 NTAG password and PACK fixes** (by @Astrrra)
* SubGHz: **Programming mode for Dea Mio** (right arrow button) * Apps: MFKey - **fixed crashes** (by @noproto)
* SubGHz: **Keeloq fix emulation for multiple systems and extend add manually support** for 2 of them (Dea Mio, Genius Bravo, GSN, Normstahl)
* SubGHz: Fixed hopper state when entering Read via Freq analyzer
* SubGHz: Raw erase fixes (by @Willy-JL)
* SubGHz: Subghz save files with receive time (by @Willy-JL)
* NFC: Fix NFC V dumps with v3 (pre refactor saves) crashing at info page
* NFC: Zolotaya Korona Online parser added (by @Leptopt1los)
* NFC: Add NFC **NDEF parser** (by @Willy-JL)
* LF RFID: **Write T5577 with random and custom password** added (clear password via Extra actions) (by @Leptopt1los)
* SubGHz: Update honeywell protocol (by @Willy-JL)
* System: More contrast values for replacement displays (up to +8 or -8)
* USB/BLE HID: Add macOS Music app volume control
* Apps: **Check out Apps updates by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev) * Apps: **Check out Apps updates by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev)
* OFW PR 3384: NFC: Display unread Mifare Classic bytes as question marks - by @TollyH * OFW: **Felica poller** (NFC-F)
* OFW PR 3396: NFC: **fix application opening from browser** - by @RebornedBrain (+ fix for leftover issues) * OFW: Desktop/Loader: Unload animations before loading FAPs
* OFW PR 3382: NFC UI refactor - by @RebornedBrain * OFW: JS Documentation
* OFW PR 3391: Rework more info scene for Ultralight cards - by @RebornedBrain * OFW: **Update radio stack to v1.19.0**
* OFW PR 3401: it-IT-mac layout - by @nminaylov * OFW: **Move crypto1 to helpers, add it to the public API**
* OFW: Fix expansion protocol crash when fed lots of garbage * OFW: Explain RNG differences, add FURI_HAL_RANDOM_MAX
* OFW: 0.98.0-rc various fixes * OFW: Furi: Add "out of memory" and "malloc(0)" crash messages
* OFW: RFID CLI: better usage * OFW: IR: Fix crash on duty_cycle=1
* OFW: **Mf DESFire fixes** * OFW: **Desktop: ensure that animation is unloaded before app start (fixes some out of memory crashes)**
* OFW: NFC UI refactor * OFW: Hide unlock with reader for MFU-C
* OFW: **Expansion module protocol** (+ expansion settings read and store in ram by @Willy-JL) * OFW: fbt: fixed missing FBT_FAP_DEBUG_ELF_ROOT to dist env
* OFW: Bugfix: Strip last parity bit from decoded FDX-B data * OFW: fbt: added -Wstrict-prototypes for main firmware
* OFW: FuriHal: interrupt priorities and documentation * OFW: Mifare Ultralight naming fix
* OFW: FuriHal: **UART refactoring** * OFW: IR: Remember OTG state
* OFW: SubGhz: add `subghz tx_from_file` CLI cmd, major TX flow refactoring, various improvements and bug fixes * OFW: Bad USB: fix crash when selecting a keyboard layout
* OFW: Furi_hal_rtc: new function * OFW: L1_Mods animation update : adding VGM visual
* OFW: NFC UI refactor * OFW: RFID Improvements
* OFW: assets: checking limits on image size; ufbt: cdb target * OFW: Fixed plugins and UI
* OFW: NFC: system dict skip when user dict is skipped fix (replaces our fix) * OFW: **NFC: Fix mf desfire detect**
* OFW: FuriHal: fix start duration furi_hal_subghz_async_tx * OFW: infrared_transmit.h was missing `#pragma once`
* OFW: NFC: parsers minor cleanup * OFW: Show the wrong PIN Attempt count on the login screen
* OFW: NFC Ntag success write freeze when not saved card * OFW: SavedStruct: Introduce saved_struct_get_metadata
* OFW: ufbt: fixed generated project paths on Windows * OFW: JS CLI command
* OFW: Add ChromeOS Bad USB demo
* OFW: **Configurable Infrared TX output** (previous UL version is replaced with OFW version, new features added "AutoDetect" and saving settings)
* OFW: BadUSB: BLE, media keys, Fn/Globe key commands
* OFW: NFC: Slix privacy password reveal ->(was included in previous UL release) and **Desfire detect fix**
* OFW: github: additional pre-upload checks for doxygen workflow
* OFW: NFC UI fixes
* OFW: Gui: unicode support, new canvas API
* OFW: **Api Symbols: replace asserts with checks**
<br><br> <br><br>
#### Known NFC post-refactor regressions list: #### Known NFC post-refactor regressions list:
- Mifare Mini clones reading is broken (original mini working fine) (OFW) - Mifare Mini clones reading is broken (original mini working fine) (OFW)
- Option to unlock Slix-L (NFC V) with preset or custom password was removed with refactoring (OFW) - NFC CLI was removed with refactoring (OFW) (will be back soon)
- NFC CLI was removed with refactoring (OFW)
- Current list of affected apps: https://github.com/xMasterX/all-the-plugins/tree/dev/apps_broken_by_last_refactors - Current list of affected apps: https://github.com/xMasterX/all-the-plugins/tree/dev/apps_broken_by_last_refactors
- Also in app **Enhanced Sub-GHz Chat** - NFC part was temporarily removed to make app usable, NFC part of the app requires remaking it with new nfc stack - Also in app **Enhanced Sub-GHz Chat** - NFC part was temporarily removed to make app usable, NFC part of the app requires remaking it with new nfc stack
@ -70,13 +66,14 @@
|cloudtips|only RU payments accepted|https://pay.cloudtips.ru/p/7b3e9d65| |cloudtips|only RU payments accepted|https://pay.cloudtips.ru/p/7b3e9d65|
|YooMoney|only RU payments accepted|https://yoomoney.ru/fundraise/XA49mgQLPA0.221209| |YooMoney|only RU payments accepted|https://yoomoney.ru/fundraise/XA49mgQLPA0.221209|
|USDT|(TRC20)|`TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`| |USDT|(TRC20)|`TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`|
|BCH||`qquxfyzntuqufy2dx0hrfr4sndp0tucvky4sw8qyu3`|
|ETH|(BSC/ERC20-Tokens)|`darkflippers.eth` (or `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a`)| |ETH|(BSC/ERC20-Tokens)|`darkflippers.eth` (or `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a`)|
|BTC||`bc1q0np836jk9jwr4dd7p6qv66d04vamtqkxrecck9`| |BTC||`bc1q0np836jk9jwr4dd7p6qv66d04vamtqkxrecck9`|
|SOL|(Solana/Tokens)|`DSgwouAEgu8iP5yr7EHHDqMNYWZxAqXWsTEeqCAXGLj8`|
|DOGE||`D6R6gYgBn5LwTNmPyvAQR6bZ9EtGgFCpvv`| |DOGE||`D6R6gYgBn5LwTNmPyvAQR6bZ9EtGgFCpvv`|
|LTC||`ltc1q3ex4ejkl0xpx3znwrmth4lyuadr5qgv8tmq8z9`| |LTC||`ltc1q3ex4ejkl0xpx3znwrmth4lyuadr5qgv8tmq8z9`|
|BCH||`qquxfyzntuqufy2dx0hrfr4sndp0tucvky4sw8qyu3`|
|XMR|(Monero)| `41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`| |XMR|(Monero)| `41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`|
|TON||`EQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmpGf`| |TON||`UQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmsxa`|
#### Thanks to our sponsors who supported project in the past and special thanks to sponsors who supports us on regular basis: #### Thanks to our sponsors who supported project in the past and special thanks to sponsors who supports us on regular basis:
ClaraCrazy, Pathfinder [Count Zero cDc], callmezimbra, Quen0n, MERRON, grvpvl (lvpvrg), art_col, ThurstonWaffles, Moneron, UterGrooll, LUCFER, Northpirate, zloepuzo, T.Rat, Alexey B., ionelife, ... ClaraCrazy, Pathfinder [Count Zero cDc], callmezimbra, Quen0n, MERRON, grvpvl (lvpvrg), art_col, ThurstonWaffles, Moneron, UterGrooll, LUCFER, Northpirate, zloepuzo, T.Rat, Alexey B., ionelife, ...

View file

@ -1,6 +1,6 @@
<h3 align="center"> <h3 align="center">
<a href="https://github.com/DarkFlippers/unleashed-firmware"> <a href="https://github.com/DarkFlippers/unleashed-firmware">
<img src="https://user-images.githubusercontent.com/10697207/186202043-26947e28-b1cc-459a-8f20-ffcc7fc0c71c.png" align="center" alt="fzCUSTOM" border="0"> <img src="https://user-images.githubusercontent.com/10697207/186202043-26947e28-b1cc-459a-8f20-ffcc7fc0c71c.png" align="center" alt="Unleashed Firmware Logo" border="0">
</a> </a>
</h3> </h3>
<div align="center" id="badges"> <div align="center" id="badges">
@ -20,15 +20,15 @@
### Welcome to the Flipper Zero Unleashed Firmware repo! ### Welcome to the Flipper Zero Unleashed Firmware repo!
#### **This firmware is a fork from** [flipperdevices/flipperzero-firmware](https://github.com/flipperdevices/flipperzero-firmware) #### **This firmware is a fork from original (OFW) firmware** [flipperdevices/flipperzero-firmware](https://github.com/flipperdevices/flipperzero-firmware)
<br> <br>
### Most stable custom firmware focused on new features and improvements of original firmware components, with almost no UI changes ### Most stable custom firmware focused on new features and improvements of original firmware components, keeping compatibility with original firmware API and Apps
<br> <br>
##### This software is for experimental purposes only and is not meant for any illegal activity/purposes. <br> We do not condone illegal activity and strongly encourage keeping transmissions to legal/valid uses allowed by law. <br> Also, this software is made without any support from Flipper Devices and is in no way related to the official devs. ##### This software is for experimental purposes only and is not meant for any illegal activity/purposes. <br> We do not condone illegal activity and strongly encourage keeping transmissions to legal/valid uses allowed by law. <br> Also, this software is made without any support from Flipper Devices and is in no way related to the official team.
<br> <br>
@ -36,7 +36,7 @@
## FAQ (frequently asked questions) ## FAQ (frequently asked questions)
[Follow this link to find answers to most asked questions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/FAQ.md) [Follow this link to find answers to most asked questions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/FAQ.md)
## Dev builds (unstable) ## Dev builds (unstable) (built automatically from dev branch)
- https://dev.unleashedflip.com/ - https://dev.unleashedflip.com/
- https://t.me/kotnehleb - https://t.me/kotnehleb
## Releases in Telegram ## Releases in Telegram
@ -45,19 +45,20 @@
# What's changed # What's changed
- **Sub-GHz** *lib & hal* - **Sub-GHz** *lib & hal*
- Regional TX restrictions removed - Regional TX restrictions removed
- Extra Sub-GHz frequencies - Extra Sub-GHz frequencies added
- Frequency range can be extended in settings file (Warning: It can damage Flipper's hardware) - Frequency range can be extended in settings file (Warning: It can damage Flipper's hardware)
- Many rolling code [protocols](https://github.com/DarkFlippers/unleashed-firmware#current-modified-and-new-sub-ghz-protocols-list) now have the ability to save & send captured signals - Many rolling code [protocols](https://github.com/DarkFlippers/unleashed-firmware#current-modified-and-new-sub-ghz-protocols-list) now have the ability to save & send captured signals
- FAAC SLH (Spa) & BFT Mitto (keeloq secure with seed) manual creation - FAAC SLH (Spa) & BFT Mitto (keeloq secure with seed) manual creation
- External CC1101 module support [(by quen0n)](https://github.com/DarkFlippers/unleashed-firmware/pull/307) - External CC1101 module support [(by quen0n)](https://github.com/DarkFlippers/unleashed-firmware/pull/307)
- **Sub-GHz** *Main App* - **Sub-GHz** *Main App*
- Save last used frequency [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77) - Save last used settings [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77)
- New frequency analyzer [(by ClusterM)](https://github.com/DarkFlippers/unleashed-firmware/pull/43) - New frequency analyzer [(by ClusterM)](https://github.com/DarkFlippers/unleashed-firmware/pull/43)
- Press OK in frequency analyzer to use detected frequency in Read modes [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77) - Press OK in frequency analyzer to use detected frequency in Read modes [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77)
- Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79) - Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79)
- New option to use timestamps + protocol name when you saving file, instead of random name or timestamp only - Enable in `Radio Settings -> Protocol Names = ON` - New option to use timestamps + protocol name when you saving file, instead of random name or timestamp only - Enable in `Radio Settings -> Protocol Names = ON`
- Read mode UI improvements (shows time when signal was received) (by @wosk) - Read mode UI improvements (shows time when signal was received) (by @wosk)
- External CC1101 module support (Hardware SPI used) - External CC1101 module support (Hardware SPI used)
- External CC1101 module amplifier control (or LED control) support (enabled by default)
- **Hold right in received signal list to delete selected signal** - **Hold right in received signal list to delete selected signal**
- **Custom buttons for Keeloq / Alutech AT4N / Nice Flor S / Somfy Telis / Security+ 2.0 / CAME Atomo** - now you can use arrow buttons to send signal with different button code - **Custom buttons for Keeloq / Alutech AT4N / Nice Flor S / Somfy Telis / Security+ 2.0 / CAME Atomo** - now you can use arrow buttons to send signal with different button code
- `Add manually` menu extended with new protocols - `Add manually` menu extended with new protocols
@ -75,12 +76,11 @@
- Recompiled IR TV Universal Remote for ALL buttons - Recompiled IR TV Universal Remote for ALL buttons
- Universal remotes for Projectors, Fans, A/Cs and Audio(soundbars, etc.) -> Also always updated and verified by our team - Universal remotes for Projectors, Fans, A/Cs and Audio(soundbars, etc.) -> Also always updated and verified by our team
- Infrared -> `RCA` Protocol - Infrared -> `RCA` Protocol
- Infrared -> Debug TX PIN output settings - Infrared -> External IR modules support (with autodetect by OFW)
- **NFC/RFID/iButton** - **NFC/RFID/iButton**
* LFRFID/iButton Fuzzer plugins * LFRFID and iButton Fuzzer plugins
* Extra Mifare Classic keys * Extra Mifare Classic keys in system dict
* EMV Protocol + Public data parser (by @Leptopt1los and @wosk) * EMV Protocol + Public data parser (by @Leptopt1los and @wosk)
* NFC/LFRFID - Stop emulation after 5 mins to avoid antenna damage (by @Leptopt1los)
* NFC `Add manually` -> Mifare Classic with custom UID * NFC `Add manually` -> Mifare Classic with custom UID
* NFC parsers: Umarsh, Zolotaya Korona, Kazan, Metromoney, Moscow Social Card, Troika (reworked) and [many others](https://github.com/DarkFlippers/unleashed-firmware/tree/dev/applications/main/nfc/plugins/supported_cards) (by @Leptopt1los and @assasinfil) * NFC parsers: Umarsh, Zolotaya Korona, Kazan, Metromoney, Moscow Social Card, Troika (reworked) and [many others](https://github.com/DarkFlippers/unleashed-firmware/tree/dev/applications/main/nfc/plugins/supported_cards) (by @Leptopt1los and @assasinfil)
- **Quality of life & other features** - **Quality of life & other features**
@ -91,7 +91,7 @@
- Battery percentage display with different styles `Settings -> Desktop -> Battery View` - Battery percentage display with different styles `Settings -> Desktop -> Battery View`
- More games in Dummy Mode -> click or hold any of arrow buttons - More games in Dummy Mode -> click or hold any of arrow buttons
- Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107) - Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107)
- **BadBT** plugin (BT version of BadKB) [(by Willy-JL, ClaraCrazy, XFW contributors)](https://github.com/ClaraCrazy/Flipper-Xtreme/tree/dev/applications/main/bad_kb) - (See in Applications->Tools) - (aka BadUSB via Bluetooth) - **BadKB** plugin [(by Willy-JL, ClaraCrazy, XFW contributors)](https://github.com/Flipper-XFW/Xtreme-Firmware/tree/dev/applications/main/bad_kb) - (See in Applications->Tools) - (aka BadUSB via Bluetooth)
- BadUSB -> Keyboard layouts [(by rien > dummy-decoy)](https://github.com/dummy-decoy/flipperzero-firmware/tree/dummy_decoy/bad_usb_keyboard_layout) - BadUSB -> Keyboard layouts [(by rien > dummy-decoy)](https://github.com/dummy-decoy/flipperzero-firmware/tree/dummy_decoy/bad_usb_keyboard_layout)
- Custom community plugins and games added + all known working apps can be downloaded in extra pack in every release - Custom community plugins and games added + all known working apps can be downloaded in extra pack in every release
- Other small fixes and changes throughout - Other small fixes and changes throughout
@ -100,16 +100,16 @@
Also check the [changelog in releases](https://github.com/DarkFlippers/unleashed-firmware/releases) for latest updates! Also check the [changelog in releases](https://github.com/DarkFlippers/unleashed-firmware/releases) for latest updates!
### Current modified and new Sub-GHz protocols list: ### Current modified and new Sub-GHz protocols list:
Thanks to Official team (to their SubGHz Developer, Skorp) for implementing decoders for these protocols in OFW. Thanks to Official team (to their SubGHz Developer, Skorp) for implementing support (decoder + encoder / or decode only) for these protocols in OFW.
Keeloq [Not ALL systems supported for decode or emulation!] - [Supported manufacturers list](https://pastes.io/raw/unuj9bhe4m) Keeloq [Not ALL systems supported for decode or emulation!] - [Supported manufacturers list](https://pastes.io/raw/unuj9bhe4m)
Encoders or sending made by @xMasterX: Encoders or emulation support made by @xMasterX:
- Nero Radio 57bit (+ 56bit encoder improvements) - Nero Radio 57bit (+ 56bit support)
- CAME 12bit/24bit encoder fixes (Fixes now merged in OFW) - CAME 12bit/24bit encoder fixes (Fixes are now merged in OFW)
- Keeloq: Dea Mio, Genius Bravo, GSN, HCS101, AN-Motors, JCM Tech, MHouse, Nice Smilo, DTM Neo, FAAC RC,XT, Mutancode, Normstahl, Beninca + Allmatic, Stilmatic, CAME Space, Aprimatic (model TR and similar), Centurion Nova (thanks Carlos !) - Keeloq: Dea Mio, Genius Bravo, GSN, HCS101, AN-Motors, JCM Tech, MHouse, Nice Smilo, DTM Neo, FAAC RC,XT, Mutancode, Normstahl, Beninca + Allmatic, Stilmatic, CAME Space, Aprimatic (model TR and similar), Centurion Nova (thanks Carlos !)
Encoders or sending made by @Eng1n33r(first implementation in Q2 2022) & @xMasterX (current version): Encoders or emulation made by @Eng1n33r(first implementation in Q2 2022) and @xMasterX (current version):
- CAME Atomo -> Update! check out new [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md) - CAME Atomo -> Update! check out new [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md)
- Nice Flor S -> How to create new remote - [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md) - Nice Flor S -> How to create new remote - [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md)
- FAAC SLH (Spa) -> Update!!! Check out new [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md) - FAAC SLH (Spa) -> Update!!! Check out new [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md)
@ -117,7 +117,7 @@ Encoders or sending made by @Eng1n33r(first implementation in Q2 2022) & @xMaste
- Star Line - Star Line
- Security+ v1 & v2 (encoders was made in OFW) - Security+ v1 & v2 (encoders was made in OFW)
Encoders made by @assasinfil & @xMasterX: Encoders made by @assasinfil and @xMasterX:
- Somfy Telis -> How to create new remote - [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md) - Somfy Telis -> How to create new remote - [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md)
- Somfy Keytis - Somfy Keytis
- KingGates Stylo 4k - KingGates Stylo 4k
@ -126,10 +126,9 @@ Encoders made by @assasinfil & @xMasterX:
## Please support development of the project ## Please support development of the project
The majority of this project is developed and maintained by me, @xMasterX. The majority of this project is developed and maintained by me, @xMasterX.
I'm unemployed, and the only income I receive is from your donations.
Our team is small and the guys are working on this project as much as they can solely based on the enthusiasm they have for this project and the community. Our team is small and the guys are working on this project as much as they can solely based on the enthusiasm they have for this project and the community.
- @Leptopt1los - NFC, RFID, IR Assets (only ACs), Plugins, and many other things - @Leptopt1los - NFC, RFID, Plugins, and many other things
- @gid9798 - SubGHz, Plugins, many other things - @gid9798 - SubGHz, Plugins, many other things - currently offline :(
- @assasinfil - SubGHz protocols, NFC parsers - @assasinfil - SubGHz protocols, NFC parsers
- @Svaarich - UI design and animations - @Svaarich - UI design and animations
- @amec0e - Infrared assets - @amec0e - Infrared assets
@ -146,13 +145,14 @@ You can support us by using links or addresses below:
|cloudtips|only RU payments accepted|https://pay.cloudtips.ru/p/7b3e9d65| |cloudtips|only RU payments accepted|https://pay.cloudtips.ru/p/7b3e9d65|
|YooMoney|only RU payments accepted|https://yoomoney.ru/fundraise/XA49mgQLPA0.221209| |YooMoney|only RU payments accepted|https://yoomoney.ru/fundraise/XA49mgQLPA0.221209|
|USDT|(TRC20)|`TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`| |USDT|(TRC20)|`TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`|
|BCH||`qquxfyzntuqufy2dx0hrfr4sndp0tucvky4sw8qyu3`|
|ETH|(BSC/ERC20-Tokens)|`darkflippers.eth` (or `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a`)| |ETH|(BSC/ERC20-Tokens)|`darkflippers.eth` (or `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a`)|
|BTC||`bc1q0np836jk9jwr4dd7p6qv66d04vamtqkxrecck9`| |BTC||`bc1q0np836jk9jwr4dd7p6qv66d04vamtqkxrecck9`|
|SOL|(Solana/Tokens)|`DSgwouAEgu8iP5yr7EHHDqMNYWZxAqXWsTEeqCAXGLj8`|
|DOGE||`D6R6gYgBn5LwTNmPyvAQR6bZ9EtGgFCpvv`| |DOGE||`D6R6gYgBn5LwTNmPyvAQR6bZ9EtGgFCpvv`|
|LTC||`ltc1q3ex4ejkl0xpx3znwrmth4lyuadr5qgv8tmq8z9`| |LTC||`ltc1q3ex4ejkl0xpx3znwrmth4lyuadr5qgv8tmq8z9`|
|BCH||`qquxfyzntuqufy2dx0hrfr4sndp0tucvky4sw8qyu3`|
|XMR|(Monero)| `41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`| |XMR|(Monero)| `41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`|
|TON||`EQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmpGf`| |TON||`UQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmsxa`|
## Community apps included ## Community apps included
@ -168,6 +168,8 @@ See full list and sources here: [xMasterX/all-the-plugins](https://github.com/xM
## [How to install](/documentation/HowToInstall.md) - [versions info](/CHANGELOG.md#recommended-update-option---web-updater): `n`,` `,`e`... ## [How to install](/documentation/HowToInstall.md) - [versions info](/CHANGELOG.md#recommended-update-option---web-updater): `n`,` `,`e`...
## Firmware & Development ## Firmware & Development
### - **Developer Documentation** - [developer.flipper.net](https://developer.flipper.net/flipperzero/doxygen)
### - **[How to build](/documentation/HowToBuild.md#how-to-build-by-yourself) | [Project-structure](#project-structure)** ### - **[How to build](/documentation/HowToBuild.md#how-to-build-by-yourself) | [Project-structure](#project-structure)**
### - **CLion IDE** - How to setup workspace for flipper firmware development [by Savely Krasovsky](https://krasovs.ky/2022/11/01/flipper-zero-clion.html) ### - **CLion IDE** - How to setup workspace for flipper firmware development [by Savely Krasovsky](https://krasovs.ky/2022/11/01/flipper-zero-clion.html)
@ -246,6 +248,8 @@ See full list and sources here: [xMasterX/all-the-plugins](https://github.com/xM
* Official Docs: [docs.flipper.net](https://docs.flipper.net/) * Official Docs: [docs.flipper.net](https://docs.flipper.net/)
* Official Forum: [forum.flipperzero.one](https://forum.flipperzero.one/) * Official Forum: [forum.flipperzero.one](https://forum.flipperzero.one/)
* Update! Developer Documentation [developer.flipper.net](https://developer.flipper.net/flipperzero/doxygen)
# Project structure # Project structure
- `applications` - Applications and services used in firmware - `applications` - Applications and services used in firmware

View file

@ -7,7 +7,7 @@
# construction of certain targets behind command-line options. # construction of certain targets behind command-line options.
import os import os
from fbt.util import path_as_posix from fbt.util import open_browser_action
DefaultEnvironment(tools=[]) DefaultEnvironment(tools=[])
@ -42,6 +42,7 @@ distenv = coreenv.Clone(
"openocd", "openocd",
"blackmagic", "blackmagic",
"jflash", "jflash",
"doxygen",
], ],
ENV=os.environ, ENV=os.environ,
UPDATE_BUNDLE_DIR="dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}", UPDATE_BUNDLE_DIR="dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}",
@ -66,6 +67,7 @@ if GetOption("fullenv") or any(
# Target for self-update package # Target for self-update package
dist_basic_arguments = [ dist_basic_arguments = [
"${ARGS}",
"--bundlever", "--bundlever",
"${UPDATE_VERSION_STRING}", "${UPDATE_VERSION_STRING}",
] ]
@ -182,6 +184,7 @@ fap_deploy = distenv.PhonyTarget(
"send", "send",
"${SOURCE}", "${SOURCE}",
"/ext/apps", "/ext/apps",
"${ARGS}",
] ]
] ]
), ),
@ -208,7 +211,7 @@ distenv.Alias("jflash", firmware_jflash)
distenv.PhonyTarget( distenv.PhonyTarget(
"gdb_trace_all", "gdb_trace_all",
"$GDB $GDBOPTS $SOURCES $GDBFLASH", [["${GDB}", "${GDBOPTS}", "${SOURCES}", "${GDBFLASH}"]],
source=firmware_env["FW_ELF"], source=firmware_env["FW_ELF"],
GDBOPTS="${GDBOPTS_BASE}", GDBOPTS="${GDBOPTS_BASE}",
GDBREMOTE="${OPENOCD_GDB_PIPE}", GDBREMOTE="${OPENOCD_GDB_PIPE}",
@ -227,7 +230,7 @@ firmware_debug = distenv.PhonyTarget(
source=firmware_env["FW_ELF"], source=firmware_env["FW_ELF"],
GDBOPTS="${GDBOPTS_BASE}", GDBOPTS="${GDBOPTS_BASE}",
GDBREMOTE="${OPENOCD_GDB_PIPE}", GDBREMOTE="${OPENOCD_GDB_PIPE}",
FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(firmware_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")), FBT_FAP_DEBUG_ELF_ROOT=firmware_env["FBT_FAP_DEBUG_ELF_ROOT"],
) )
distenv.Depends(firmware_debug, firmware_flash) distenv.Depends(firmware_debug, firmware_flash)
@ -237,7 +240,7 @@ distenv.PhonyTarget(
source=firmware_env["FW_ELF"], source=firmware_env["FW_ELF"],
GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}", GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}",
GDBREMOTE="${BLACKMAGIC_ADDR}", GDBREMOTE="${BLACKMAGIC_ADDR}",
FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(firmware_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")), FBT_FAP_DEBUG_ELF_ROOT=firmware_env["FBT_FAP_DEBUG_ELF_ROOT"],
) )
# Debug alien elf # Debug alien elf
@ -272,19 +275,35 @@ distenv.PhonyTarget(
# Just start OpenOCD # Just start OpenOCD
distenv.PhonyTarget( distenv.PhonyTarget(
"openocd", "openocd",
"${OPENOCDCOM}", [["${OPENOCDCOM}", "${ARGS}"]],
) )
# Linter # Linter
distenv.PhonyTarget( distenv.PhonyTarget(
"lint", "lint",
[["${PYTHON3}", "${FBT_SCRIPT_DIR}/lint.py", "check", "${LINT_SOURCES}"]], [
[
"${PYTHON3}",
"${FBT_SCRIPT_DIR}/lint.py",
"check",
"${LINT_SOURCES}",
"${ARGS}",
]
],
LINT_SOURCES=[n.srcnode() for n in firmware_env["LINT_SOURCES"]], LINT_SOURCES=[n.srcnode() for n in firmware_env["LINT_SOURCES"]],
) )
distenv.PhonyTarget( distenv.PhonyTarget(
"format", "format",
[["${PYTHON3}", "${FBT_SCRIPT_DIR}/lint.py", "format", "${LINT_SOURCES}"]], [
[
"${PYTHON3}",
"${FBT_SCRIPT_DIR}/lint.py",
"format",
"${LINT_SOURCES}",
"${ARGS}",
]
],
LINT_SOURCES=[n.srcnode() for n in firmware_env["LINT_SOURCES"]], LINT_SOURCES=[n.srcnode() for n in firmware_env["LINT_SOURCES"]],
) )
@ -307,7 +326,16 @@ firmware_env.Append(
) )
black_commandline = "@${PYTHON3} -m black ${PY_BLACK_ARGS} ${PY_LINT_SOURCES}" black_commandline = [
[
"@${PYTHON3}",
"-m",
"black",
"${PY_BLACK_ARGS}",
"${PY_LINT_SOURCES}",
"${ARGS}",
]
]
black_base_args = [ black_base_args = [
"--include", "--include",
'"(\\.scons|\\.py|SConscript|SConstruct|\\.fam)$"', '"(\\.scons|\\.py|SConscript|SConstruct|\\.fam)$"',
@ -333,12 +361,28 @@ distenv.PhonyTarget(
# Start Flipper CLI via PySerial's miniterm # Start Flipper CLI via PySerial's miniterm
distenv.PhonyTarget( distenv.PhonyTarget(
"cli", [["${PYTHON3}", "${FBT_SCRIPT_DIR}/serial_cli.py", "-p", "${FLIP_PORT}"]] "cli",
[
[
"${PYTHON3}",
"${FBT_SCRIPT_DIR}/serial_cli.py",
"-p",
"${FLIP_PORT}",
"${ARGS}",
]
],
) )
# Update WiFi devboard firmware # Update WiFi devboard firmware with release channel
distenv.PhonyTarget( distenv.PhonyTarget(
"devboard_flash", [["${PYTHON3}", "${FBT_SCRIPT_DIR}/wifi_board.py"]] "devboard_flash",
[
[
"${PYTHON3}",
"${FBT_SCRIPT_DIR}/wifi_board.py",
"${ARGS}",
]
],
) )
@ -353,7 +397,7 @@ distenv.PhonyTarget(
distenv.PhonyTarget( distenv.PhonyTarget(
"get_stlink", "get_stlink",
distenv.Action( distenv.Action(
lambda **kw: distenv.GetDevices(), lambda **_: distenv.GetDevices(),
None, None,
), ),
) )
@ -376,3 +420,18 @@ distenv.PhonyTarget(
"env", "env",
"@echo $( ${FBT_SCRIPT_DIR.abspath}/toolchain/fbtenv.sh $)", "@echo $( ${FBT_SCRIPT_DIR.abspath}/toolchain/fbtenv.sh $)",
) )
doxy_build = distenv.DoxyBuild(
"documentation/doxygen/build/html/index.html",
"documentation/doxygen/Doxyfile-awesome.cfg",
doxy_env_variables={
"DOXY_SRC_ROOT": Dir(".").abspath,
"DOXY_BUILD_DIR": Dir("documentation/doxygen/build").abspath,
"DOXY_CONFIG_DIR": "documentation/doxygen",
},
)
distenv.Alias("doxygen", doxy_build)
distenv.AlwaysBuild(doxy_build)
# Open generated documentation in browser
distenv.PhonyTarget("doxy", open_browser_action, source=doxy_build)

View file

@ -11,29 +11,29 @@ class AccessorApp {
public: public:
void run(void); void run(void);
AccessorApp(); AccessorApp(void);
~AccessorApp(); ~AccessorApp(void);
enum class Scene : uint8_t { enum class Scene : uint8_t {
Exit, Exit,
Start, Start,
}; };
AccessorAppViewManager* get_view_manager(); AccessorAppViewManager* get_view_manager(void);
void switch_to_next_scene(Scene index); void switch_to_next_scene(Scene index);
void search_and_switch_to_previous_scene(std::initializer_list<Scene> scenes_list); void search_and_switch_to_previous_scene(std::initializer_list<Scene> scenes_list);
bool switch_to_previous_scene(uint8_t count = 1); bool switch_to_previous_scene(uint8_t count = 1);
Scene get_previous_scene(); Scene get_previous_scene(void);
void notify_green_blink(); void notify_green_blink(void);
void notify_success(); void notify_success(void);
char* get_text_store(); char* get_text_store(void);
uint8_t get_text_store_size(); uint8_t get_text_store_size(void);
void set_text_store(const char* text...); void set_text_store(const char* text...);
WIEGAND* get_wiegand(); WIEGAND* get_wiegand(void);
OneWireHost* get_one_wire(); OneWireHost* get_one_wire(void);
private: private:
std::list<Scene> previous_scenes_list = {Scene::Exit}; std::list<Scene> previous_scenes_list = {Scene::Exit};

View file

@ -15,16 +15,16 @@ public:
FuriMessageQueue* event_queue; FuriMessageQueue* event_queue;
AccessorAppViewManager(); AccessorAppViewManager(void);
~AccessorAppViewManager(); ~AccessorAppViewManager(void);
void switch_to(ViewType type); void switch_to(ViewType type);
void receive_event(AccessorEvent* event); void receive_event(AccessorEvent* event);
void send_event(AccessorEvent* event); void send_event(AccessorEvent* event);
Submenu* get_submenu(); Submenu* get_submenu(void);
Popup* get_popup(); Popup* get_popup(void);
private: private:
ViewDispatcher* view_dispatcher; ViewDispatcher* view_dispatcher;

View file

@ -2,19 +2,19 @@
class WIEGAND { class WIEGAND {
public: public:
WIEGAND(); WIEGAND(void);
void begin(); void begin(void);
void end(); void end(void);
bool available(); bool available(void);
unsigned long getCode(); unsigned long getCode(void);
unsigned long getCodeHigh(); unsigned long getCodeHigh(void);
int getWiegandType(); int getWiegandType(void);
static void ReadD0(); static void ReadD0(void);
static void ReadD1(); static void ReadD1(void);
private: private:
static bool DoWiegandConversion(); static bool DoWiegandConversion(void);
static unsigned long static unsigned long
GetCardId(unsigned long* codehigh, unsigned long* codelow, char bitlength); GetCardId(unsigned long* codehigh, unsigned long* codelow, char bitlength);

View file

@ -32,7 +32,7 @@ static void battery_test_battery_info_update_model(void* context) {
notification_message(app->notifications, &sequence_display_backlight_on); notification_message(app->notifications, &sequence_display_backlight_on);
} }
BatteryTestApp* battery_test_alloc() { BatteryTestApp* battery_test_alloc(void) {
BatteryTestApp* app = malloc(sizeof(BatteryTestApp)); BatteryTestApp* app = malloc(sizeof(BatteryTestApp));
// Records // Records

View file

@ -116,7 +116,7 @@ static void battery_info_draw_callback(Canvas* canvas, void* context) {
draw_stat(canvas, 104, 42, &I_Health_16x16, health); draw_stat(canvas, 104, 42, &I_Health_16x16, health);
} }
BatteryInfo* battery_info_alloc() { BatteryInfo* battery_info_alloc(void) {
BatteryInfo* battery_info = malloc(sizeof(BatteryInfo)); BatteryInfo* battery_info = malloc(sizeof(BatteryInfo));
battery_info->view = view_alloc(); battery_info->view = view_alloc();
view_set_context(battery_info->view, battery_info); view_set_context(battery_info->view, battery_info);

View file

@ -14,7 +14,7 @@ typedef struct {
uint8_t health; uint8_t health;
} BatteryInfoModel; } BatteryInfoModel;
BatteryInfo* battery_info_alloc(); BatteryInfo* battery_info_alloc(void);
void battery_info_free(BatteryInfo* battery_info); void battery_info_free(BatteryInfo* battery_info);

View file

@ -28,7 +28,7 @@ uint32_t bt_debug_start_view(void* context) {
return BtDebugAppViewSubmenu; return BtDebugAppViewSubmenu;
} }
BtDebugApp* bt_debug_app_alloc() { BtDebugApp* bt_debug_app_alloc(void) {
BtDebugApp* app = malloc(sizeof(BtDebugApp)); BtDebugApp* app = malloc(sizeof(BtDebugApp));
// Gui // Gui

View file

@ -129,7 +129,7 @@ static void bt_test_carrier_timer_callback(void* context) {
} }
} }
BtCarrierTest* bt_carrier_test_alloc() { BtCarrierTest* bt_carrier_test_alloc(void) {
BtCarrierTest* bt_carrier_test = malloc(sizeof(BtCarrierTest)); BtCarrierTest* bt_carrier_test = malloc(sizeof(BtCarrierTest));
bt_carrier_test->bt_test = bt_test_alloc(); bt_carrier_test->bt_test = bt_test_alloc();
bt_test_set_context(bt_carrier_test->bt_test, bt_carrier_test); bt_test_set_context(bt_carrier_test->bt_test, bt_carrier_test);

View file

@ -3,7 +3,7 @@
typedef struct BtCarrierTest BtCarrierTest; typedef struct BtCarrierTest BtCarrierTest;
BtCarrierTest* bt_carrier_test_alloc(); BtCarrierTest* bt_carrier_test_alloc(void);
void bt_carrier_test_free(BtCarrierTest* bt_carrier_test); void bt_carrier_test_free(BtCarrierTest* bt_carrier_test);

View file

@ -97,7 +97,7 @@ static void bt_test_packet_timer_callback(void* context) {
} }
} }
BtPacketTest* bt_packet_test_alloc() { BtPacketTest* bt_packet_test_alloc(void) {
BtPacketTest* bt_packet_test = malloc(sizeof(BtPacketTest)); BtPacketTest* bt_packet_test = malloc(sizeof(BtPacketTest));
bt_packet_test->bt_test = bt_test_alloc(); bt_packet_test->bt_test = bt_test_alloc();
bt_test_set_context(bt_packet_test->bt_test, bt_packet_test); bt_test_set_context(bt_packet_test->bt_test, bt_packet_test);

View file

@ -3,7 +3,7 @@
typedef struct BtPacketTest BtPacketTest; typedef struct BtPacketTest BtPacketTest;
BtPacketTest* bt_packet_test_alloc(); BtPacketTest* bt_packet_test_alloc(void);
void bt_packet_test_free(BtPacketTest* bt_packet_test); void bt_packet_test_free(BtPacketTest* bt_packet_test);

View file

@ -305,7 +305,7 @@ void bt_test_process_back(BtTest* bt_test) {
} }
} }
BtTest* bt_test_alloc() { BtTest* bt_test_alloc(void) {
BtTest* bt_test = malloc(sizeof(BtTest)); BtTest* bt_test = malloc(sizeof(BtTest));
bt_test->view = view_alloc(); bt_test->view = view_alloc();
view_set_context(bt_test->view, bt_test); view_set_context(bt_test->view, bt_test);

View file

@ -12,7 +12,7 @@ typedef void (*BtTestBackCallback)(void* context);
typedef struct BtTestParam BtTestParam; typedef struct BtTestParam BtTestParam;
typedef void (*BtTestParamChangeCallback)(BtTestParam* param); typedef void (*BtTestParamChangeCallback)(BtTestParam* param);
BtTest* bt_test_alloc(); BtTest* bt_test_alloc(void);
void bt_test_free(BtTest* bt_test); void bt_test_free(BtTest* bt_test);

View file

@ -90,7 +90,7 @@ uint32_t ccid_test_exit(void* context) {
return VIEW_NONE; return VIEW_NONE;
} }
CcidTestApp* ccid_test_app_alloc() { CcidTestApp* ccid_test_app_alloc(void) {
CcidTestApp* app = malloc(sizeof(CcidTestApp)); CcidTestApp* app = malloc(sizeof(CcidTestApp));
// Gui // Gui

View file

@ -50,7 +50,7 @@ static void crash_test_submenu_callback(void* context, uint32_t index) {
furi_halt("Crash test: furi_halt"); furi_halt("Crash test: furi_halt");
break; break;
default: default:
furi_crash("Programming error"); furi_crash();
} }
} }
@ -59,7 +59,7 @@ static uint32_t crash_test_exit_callback(void* context) {
return VIEW_NONE; return VIEW_NONE;
} }
CrashTest* crash_test_alloc() { CrashTest* crash_test_alloc(void) {
CrashTest* instance = malloc(sizeof(CrashTest)); CrashTest* instance = malloc(sizeof(CrashTest));
View* view = NULL; View* view = NULL;

View file

@ -26,7 +26,7 @@ static void gui_input_events_callback(const void* value, void* ctx) {
} }
} }
static DirectDraw* direct_draw_alloc() { static DirectDraw* direct_draw_alloc(void) {
DirectDraw* instance = malloc(sizeof(DirectDraw)); DirectDraw* instance = malloc(sizeof(DirectDraw));
instance->input = furi_record_open(RECORD_INPUT_EVENTS); instance->input = furi_record_open(RECORD_INPUT_EVENTS);

View file

@ -121,7 +121,7 @@ static void display_config_set_contrast(VariableItem* item) {
display_test_reload_config(instance); display_test_reload_config(instance);
} }
DisplayTest* display_test_alloc() { DisplayTest* display_test_alloc(void) {
DisplayTest* instance = malloc(sizeof(DisplayTest)); DisplayTest* instance = malloc(sizeof(DisplayTest));
View* view = NULL; View* view = NULL;

View file

@ -154,7 +154,7 @@ static void view_display_test_timer_callback(void* context) {
instance->view, ViewDisplayTestModel * model, { model->counter++; }, true); instance->view, ViewDisplayTestModel * model, { model->counter++; }, true);
} }
ViewDisplayTest* view_display_test_alloc() { ViewDisplayTest* view_display_test_alloc(void) {
ViewDisplayTest* instance = malloc(sizeof(ViewDisplayTest)); ViewDisplayTest* instance = malloc(sizeof(ViewDisplayTest));
instance->view = view_alloc(); instance->view = view_alloc();

View file

@ -5,7 +5,7 @@
typedef struct ViewDisplayTest ViewDisplayTest; typedef struct ViewDisplayTest ViewDisplayTest;
ViewDisplayTest* view_display_test_alloc(); ViewDisplayTest* view_display_test_alloc(void);
void view_display_test_free(ViewDisplayTest* instance); void view_display_test_free(ViewDisplayTest* instance);

View file

@ -81,7 +81,7 @@ static void expansion_test_app_serial_rx_callback(
} }
} }
static ExpansionTestApp* expansion_test_app_alloc() { static ExpansionTestApp* expansion_test_app_alloc(void) {
ExpansionTestApp* instance = malloc(sizeof(ExpansionTestApp)); ExpansionTestApp* instance = malloc(sizeof(ExpansionTestApp));
instance->buf = furi_stream_buffer_alloc(RECEIVE_BUFFER_SIZE, 1); instance->buf = furi_stream_buffer_alloc(RECEIVE_BUFFER_SIZE, 1);
return instance; return instance;

View file

@ -12,7 +12,7 @@ static bool lfrfid_debug_back_event_callback(void* context) {
return scene_manager_handle_back_event(app->scene_manager); return scene_manager_handle_back_event(app->scene_manager);
} }
static LfRfidDebug* lfrfid_debug_alloc() { static LfRfidDebug* lfrfid_debug_alloc(void) {
LfRfidDebug* app = malloc(sizeof(LfRfidDebug)); LfRfidDebug* app = malloc(sizeof(LfRfidDebug));
app->view_dispatcher = view_dispatcher_alloc(); app->view_dispatcher = view_dispatcher_alloc();

View file

@ -170,7 +170,7 @@ static bool lfrfid_debug_view_tune_input_callback(InputEvent* event, void* conte
return consumed; return consumed;
} }
LfRfidTuneView* lfrfid_debug_view_tune_alloc() { LfRfidTuneView* lfrfid_debug_view_tune_alloc(void) {
LfRfidTuneView* tune_view = malloc(sizeof(LfRfidTuneView)); LfRfidTuneView* tune_view = malloc(sizeof(LfRfidTuneView));
tune_view->view = view_alloc(); tune_view->view = view_alloc();
view_set_context(tune_view->view, tune_view); view_set_context(tune_view->view, tune_view);

View file

@ -3,7 +3,7 @@
typedef struct LfRfidTuneView LfRfidTuneView; typedef struct LfRfidTuneView LfRfidTuneView;
LfRfidTuneView* lfrfid_debug_view_tune_alloc(); LfRfidTuneView* lfrfid_debug_view_tune_alloc(void);
void lfrfid_debug_view_tune_free(LfRfidTuneView* tune_view); void lfrfid_debug_view_tune_free(LfRfidTuneView* tune_view);

View file

@ -53,7 +53,7 @@ static uint32_t locale_test_exit(void* context) {
return VIEW_NONE; return VIEW_NONE;
} }
static LocaleTestApp* locale_test_alloc() { static LocaleTestApp* locale_test_alloc(void) {
LocaleTestApp* app = malloc(sizeof(LocaleTestApp)); LocaleTestApp* app = malloc(sizeof(LocaleTestApp));
// Gui // Gui

View file

@ -83,7 +83,7 @@ static bool rpc_debug_app_rpc_init_rpc(RpcDebugApp* app, const char* args) {
return ret; return ret;
} }
static RpcDebugApp* rpc_debug_app_alloc() { static RpcDebugApp* rpc_debug_app_alloc(void) {
RpcDebugApp* app = malloc(sizeof(RpcDebugApp)); RpcDebugApp* app = malloc(sizeof(RpcDebugApp));
app->gui = furi_record_open(RECORD_GUI); app->gui = furi_record_open(RECORD_GUI);

View file

@ -21,7 +21,7 @@ typedef struct {
Cli* cli; Cli* cli;
} SpeakerDebugApp; } SpeakerDebugApp;
static SpeakerDebugApp* speaker_app_alloc() { static SpeakerDebugApp* speaker_app_alloc(void) {
SpeakerDebugApp* app = (SpeakerDebugApp*)malloc(sizeof(SpeakerDebugApp)); SpeakerDebugApp* app = (SpeakerDebugApp*)malloc(sizeof(SpeakerDebugApp));
app->music_worker = music_worker_alloc(); app->music_worker = music_worker_alloc();
app->message_queue = furi_message_queue_alloc(8, sizeof(SpeakerDebugAppMessage)); app->message_queue = furi_message_queue_alloc(8, sizeof(SpeakerDebugAppMessage));

View file

@ -38,7 +38,7 @@ typedef enum {
PrincetonDecoderStepCheckDuration, PrincetonDecoderStepCheckDuration,
} PrincetonDecoderStep; } PrincetonDecoderStep;
SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc() { SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(void) {
SubGhzEncoderPrinceton* instance = malloc(sizeof(SubGhzEncoderPrinceton)); SubGhzEncoderPrinceton* instance = malloc(sizeof(SubGhzEncoderPrinceton));
return instance; return instance;
} }

View file

@ -15,7 +15,7 @@ typedef void (*SubGhzDecoderPrincetonCallback)(SubGhzDecoderPrinceton* parser, v
* Allocate SubGhzEncoderPrinceton * Allocate SubGhzEncoderPrinceton
* @return pointer to SubGhzEncoderPrinceton instance * @return pointer to SubGhzEncoderPrinceton instance
*/ */
SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(); SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(void);
/** /**
* Free SubGhzEncoderPrinceton instance * Free SubGhzEncoderPrinceton instance
@ -69,7 +69,7 @@ LevelDuration subghz_encoder_princeton_for_testing_yield(void* context);
* Allocate SubGhzDecoderPrinceton * Allocate SubGhzDecoderPrinceton
* @return SubGhzDecoderPrinceton* * @return SubGhzDecoderPrinceton*
*/ */
SubGhzDecoderPrinceton* subghz_decoder_princeton_for_testing_alloc(); SubGhzDecoderPrinceton* subghz_decoder_princeton_for_testing_alloc(void);
/** /**
* Free SubGhzDecoderPrinceton * Free SubGhzDecoderPrinceton

View file

@ -12,7 +12,7 @@ void subghz_test_scene_show_only_rx_on_enter(void* context) {
// Setup view // Setup view
Popup* popup = app->popup; Popup* popup = app->popup;
const char* header_text = "Transmission is blocked"; const char* header_text = "Transmission is Blocked";
const char* message_text = "Transmission on\nthis frequency is\nrestricted in\nyour region"; const char* message_text = "Transmission on\nthis frequency is\nrestricted in\nyour region";
if(!furi_hal_region_is_provisioned()) { if(!furi_hal_region_is_provisioned()) {
header_text = "Firmware update needed"; header_text = "Firmware update needed";

View file

@ -21,7 +21,7 @@ static void subghz_test_app_tick_event_callback(void* context) {
scene_manager_handle_tick_event(app->scene_manager); scene_manager_handle_tick_event(app->scene_manager);
} }
SubGhzTestApp* subghz_test_app_alloc() { SubGhzTestApp* subghz_test_app_alloc(void) {
SubGhzTestApp* app = malloc(sizeof(SubGhzTestApp)); SubGhzTestApp* app = malloc(sizeof(SubGhzTestApp));
// GUI // GUI

View file

@ -219,7 +219,7 @@ void subghz_test_carrier_rssi_timer_callback(void* context) {
false); false);
} }
SubGhzTestCarrier* subghz_test_carrier_alloc() { SubGhzTestCarrier* subghz_test_carrier_alloc(void) {
SubGhzTestCarrier* subghz_test_carrier = malloc(sizeof(SubGhzTestCarrier)); SubGhzTestCarrier* subghz_test_carrier = malloc(sizeof(SubGhzTestCarrier));
// View allocation and configuration // View allocation and configuration

View file

@ -16,7 +16,7 @@ void subghz_test_carrier_set_callback(
SubGhzTestCarrierCallback callback, SubGhzTestCarrierCallback callback,
void* context); void* context);
SubGhzTestCarrier* subghz_test_carrier_alloc(); SubGhzTestCarrier* subghz_test_carrier_alloc(void);
void subghz_test_carrier_free(SubGhzTestCarrier* subghz_test_carrier); void subghz_test_carrier_free(SubGhzTestCarrier* subghz_test_carrier);

View file

@ -236,7 +236,7 @@ void subghz_test_packet_exit(void* context) {
furi_hal_subghz_sleep(); furi_hal_subghz_sleep();
} }
SubGhzTestPacket* subghz_test_packet_alloc() { SubGhzTestPacket* subghz_test_packet_alloc(void) {
SubGhzTestPacket* instance = malloc(sizeof(SubGhzTestPacket)); SubGhzTestPacket* instance = malloc(sizeof(SubGhzTestPacket));
// View allocation and configuration // View allocation and configuration

View file

@ -15,7 +15,7 @@ void subghz_test_packet_set_callback(
SubGhzTestPacketCallback callback, SubGhzTestPacketCallback callback,
void* context); void* context);
SubGhzTestPacket* subghz_test_packet_alloc(); SubGhzTestPacket* subghz_test_packet_alloc(void);
void subghz_test_packet_free(SubGhzTestPacket* subghz_test_packet); void subghz_test_packet_free(SubGhzTestPacket* subghz_test_packet);

View file

@ -164,7 +164,7 @@ void subghz_test_static_exit(void* context) {
furi_hal_subghz_sleep(); furi_hal_subghz_sleep();
} }
SubGhzTestStatic* subghz_test_static_alloc() { SubGhzTestStatic* subghz_test_static_alloc(void) {
SubGhzTestStatic* instance = malloc(sizeof(SubGhzTestStatic)); SubGhzTestStatic* instance = malloc(sizeof(SubGhzTestStatic));
// View allocation and configuration // View allocation and configuration

View file

@ -15,7 +15,7 @@ void subghz_test_static_set_callback(
SubGhzTestStaticCallback callback, SubGhzTestStaticCallback callback,
void* context); void* context);
SubGhzTestStatic* subghz_test_static_alloc(); SubGhzTestStatic* subghz_test_static_alloc(void);
void subghz_test_static_free(SubGhzTestStatic* subghz_static); void subghz_test_static_free(SubGhzTestStatic* subghz_static);

View file

@ -283,13 +283,14 @@ static UartEchoApp* uart_echo_app_alloc(uint32_t baudrate) {
static void uart_echo_app_free(UartEchoApp* app) { static void uart_echo_app_free(UartEchoApp* app) {
furi_assert(app); furi_assert(app);
furi_hal_serial_async_rx_stop(app->serial_handle);
furi_hal_serial_deinit(app->serial_handle);
furi_hal_serial_control_release(app->serial_handle);
furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventStop); furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventStop);
furi_thread_join(app->worker_thread); furi_thread_join(app->worker_thread);
furi_thread_free(app->worker_thread); furi_thread_free(app->worker_thread);
furi_hal_serial_deinit(app->serial_handle);
furi_hal_serial_control_release(app->serial_handle);
// Free views // Free views
view_dispatcher_remove_view(app->view_dispatcher, 0); view_dispatcher_remove_view(app->view_dispatcher, 0);

View file

@ -734,7 +734,7 @@ MU_TEST_SUITE(test_bit_lib) {
MU_RUN_TEST(test_bit_lib_bytes_to_num_bcd); MU_RUN_TEST(test_bit_lib_bytes_to_num_bcd);
} }
int run_minunit_test_bit_lib() { int run_minunit_test_bit_lib(void) {
MU_RUN_SUITE(test_bit_lib); MU_RUN_SUITE(test_bit_lib);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -17,7 +17,7 @@ typedef struct {
BtTest* bt_test = NULL; BtTest* bt_test = NULL;
void bt_test_alloc() { void bt_test_alloc(void) {
bt_test = malloc(sizeof(BtTest)); bt_test = malloc(sizeof(BtTest));
bt_test->storage = furi_record_open(RECORD_STORAGE); bt_test->storage = furi_record_open(RECORD_STORAGE);
bt_test->nvm_ram_buff_dut = malloc(BT_TEST_NVM_RAM_BUFF_SIZE); bt_test->nvm_ram_buff_dut = malloc(BT_TEST_NVM_RAM_BUFF_SIZE);
@ -27,7 +27,7 @@ void bt_test_alloc() {
bt_test->bt_keys_storage, bt_test->nvm_ram_buff_dut, BT_TEST_NVM_RAM_BUFF_SIZE); bt_test->bt_keys_storage, bt_test->nvm_ram_buff_dut, BT_TEST_NVM_RAM_BUFF_SIZE);
} }
void bt_test_free() { void bt_test_free(void) {
furi_check(bt_test); furi_check(bt_test);
free(bt_test->nvm_ram_buff_ref); free(bt_test->nvm_ram_buff_ref);
free(bt_test->nvm_ram_buff_dut); free(bt_test->nvm_ram_buff_dut);
@ -37,7 +37,7 @@ void bt_test_free() {
bt_test = NULL; bt_test = NULL;
} }
static void bt_test_keys_storage_profile() { static void bt_test_keys_storage_profile(void) {
// Emulate nvm change on initial connection // Emulate nvm change on initial connection
const int nvm_change_size_on_connection = 88; const int nvm_change_size_on_connection = 88;
for(size_t i = 0; i < nvm_change_size_on_connection; i++) { for(size_t i = 0; i < nvm_change_size_on_connection; i++) {
@ -82,7 +82,7 @@ static void bt_test_keys_storage_profile() {
"Wrong buffer loaded"); "Wrong buffer loaded");
} }
static void bt_test_keys_remove_test_file() { static void bt_test_keys_remove_test_file(void) {
mu_assert( mu_assert(
storage_simply_remove(bt_test->storage, BT_TEST_KEY_STORAGE_FILE_PATH), storage_simply_remove(bt_test->storage, BT_TEST_KEY_STORAGE_FILE_PATH),
"Can't remove test file"); "Can't remove test file");
@ -104,7 +104,7 @@ MU_TEST_SUITE(test_bt) {
bt_test_free(); bt_test_free();
} }
int run_minunit_test_bt() { int run_minunit_test_bt(void) {
MU_RUN_SUITE(test_bt); MU_RUN_SUITE(test_bt);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -112,7 +112,7 @@ MU_TEST_SUITE(test_datetime_validate_datetime) {
MU_TEST(test_datetime_timestamp_to_datetime_min) { MU_TEST(test_datetime_timestamp_to_datetime_min) {
uint32_t test_value = 0; uint32_t test_value = 0;
DateTime min_datetime_expected = {0, 0, 0, 1, 1, 1970, 0}; DateTime min_datetime_expected = {0, 0, 0, 1, 1, 1970, 4};
DateTime result = {0}; DateTime result = {0};
datetime_timestamp_to_datetime(test_value, &result); datetime_timestamp_to_datetime(test_value, &result);
@ -122,7 +122,7 @@ MU_TEST(test_datetime_timestamp_to_datetime_min) {
MU_TEST(test_datetime_timestamp_to_datetime_max) { MU_TEST(test_datetime_timestamp_to_datetime_max) {
uint32_t test_value = UINT32_MAX; uint32_t test_value = UINT32_MAX;
DateTime max_datetime_expected = {6, 28, 15, 7, 2, 2106, 0}; DateTime max_datetime_expected = {6, 28, 15, 7, 2, 2106, 7};
DateTime result = {0}; DateTime result = {0};
datetime_timestamp_to_datetime(test_value, &result); datetime_timestamp_to_datetime(test_value, &result);
@ -141,10 +141,26 @@ MU_TEST(test_datetime_timestamp_to_datetime_to_timestamp) {
mu_assert_int_eq(test_value, result); mu_assert_int_eq(test_value, result);
} }
MU_TEST(test_datetime_timestamp_to_datetime_weekday) {
uint32_t test_value = 1709748421; // Wed Mar 06 18:07:01 2024 UTC
DateTime datetime = {0};
datetime_timestamp_to_datetime(test_value, &datetime);
mu_assert_int_eq(datetime.hour, 18);
mu_assert_int_eq(datetime.minute, 7);
mu_assert_int_eq(datetime.second, 1);
mu_assert_int_eq(datetime.day, 6);
mu_assert_int_eq(datetime.month, 3);
mu_assert_int_eq(datetime.weekday, 3);
mu_assert_int_eq(datetime.year, 2024);
}
MU_TEST_SUITE(test_datetime_timestamp_to_datetime_suite) { MU_TEST_SUITE(test_datetime_timestamp_to_datetime_suite) {
MU_RUN_TEST(test_datetime_timestamp_to_datetime_min); MU_RUN_TEST(test_datetime_timestamp_to_datetime_min);
MU_RUN_TEST(test_datetime_timestamp_to_datetime_max); MU_RUN_TEST(test_datetime_timestamp_to_datetime_max);
MU_RUN_TEST(test_datetime_timestamp_to_datetime_to_timestamp); MU_RUN_TEST(test_datetime_timestamp_to_datetime_to_timestamp);
MU_RUN_TEST(test_datetime_timestamp_to_datetime_weekday);
} }
MU_TEST(test_datetime_datetime_to_timestamp_min) { MU_TEST(test_datetime_datetime_to_timestamp_min) {
@ -166,7 +182,7 @@ MU_TEST_SUITE(test_datetime_datetime_to_timestamp_suite) {
MU_RUN_TEST(test_datetime_datetime_to_timestamp_max); MU_RUN_TEST(test_datetime_datetime_to_timestamp_max);
} }
int run_minunit_test_datetime() { int run_minunit_test_datetime(void) {
MU_RUN_SUITE(test_datetime_timestamp_to_datetime_suite); MU_RUN_SUITE(test_datetime_timestamp_to_datetime_suite);
MU_RUN_SUITE(test_datetime_datetime_to_timestamp_suite); MU_RUN_SUITE(test_datetime_datetime_to_timestamp_suite);
MU_RUN_SUITE(test_datetime_validate_datetime); MU_RUN_SUITE(test_datetime_validate_datetime);

View file

@ -25,7 +25,7 @@ MU_TEST_SUITE(dialogs_file_browser_options) {
MU_RUN_TEST(test_dialog_file_browser_set_basic_options_should_init_all_fields); MU_RUN_TEST(test_dialog_file_browser_set_basic_options_should_init_all_fields);
} }
int run_minunit_test_dialogs_file_browser_options() { int run_minunit_test_dialogs_file_browser_options(void) {
MU_RUN_SUITE(dialogs_file_browser_options); MU_RUN_SUITE(dialogs_file_browser_options);
return MU_EXIT_CODE; return MU_EXIT_CODE;

View file

@ -194,7 +194,7 @@ MU_TEST_SUITE(test_expansion_suite) {
MU_RUN_TEST(test_expansion_garbage_input); MU_RUN_TEST(test_expansion_garbage_input);
} }
int run_minunit_test_expansion() { int run_minunit_test_expansion(void) {
MU_RUN_SUITE(test_expansion_suite); MU_RUN_SUITE(test_expansion_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -331,7 +331,7 @@ MU_TEST_SUITE(flipper_format_string_suite) {
MU_RUN_TEST(flipper_format_file_test); MU_RUN_TEST(flipper_format_file_test);
} }
int run_minunit_test_flipper_format_string() { int run_minunit_test_flipper_format_string(void) {
MU_RUN_SUITE(flipper_format_string_suite); MU_RUN_SUITE(flipper_format_string_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -103,14 +103,14 @@ static bool storage_write_string(const char* path, const char* data) {
return result; return result;
} }
static void tests_setup() { static void tests_setup(void) {
Storage* storage = furi_record_open(RECORD_STORAGE); Storage* storage = furi_record_open(RECORD_STORAGE);
mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data"); mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data");
mu_assert(storage_simply_mkdir(storage, TEST_DIR_NAME), "Cannot create dir"); mu_assert(storage_simply_mkdir(storage, TEST_DIR_NAME), "Cannot create dir");
furi_record_close(RECORD_STORAGE); furi_record_close(RECORD_STORAGE);
} }
static void tests_teardown() { static void tests_teardown(void) {
Storage* storage = furi_record_open(RECORD_STORAGE); Storage* storage = furi_record_open(RECORD_STORAGE);
mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data"); mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data");
furi_record_close(RECORD_STORAGE); furi_record_close(RECORD_STORAGE);
@ -545,7 +545,7 @@ MU_TEST_SUITE(flipper_format) {
tests_teardown(); tests_teardown();
} }
int run_minunit_test_flipper_format() { int run_minunit_test_flipper_format(void) {
MU_RUN_SUITE(flipper_format); MU_RUN_SUITE(flipper_format);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -54,7 +54,7 @@ MU_TEST_SUITE(float_tools_suite) {
MU_RUN_TEST(float_tools_equal_test); MU_RUN_TEST(float_tools_equal_test);
} }
int run_minunit_test_float_tools() { int run_minunit_test_float_tools(void) {
MU_RUN_SUITE(float_tools_suite); MU_RUN_SUITE(float_tools_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -4,7 +4,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
void test_furi_memmgr() { void test_furi_memmgr(void) {
void* ptr; void* ptr;
// allocate memory case // allocate memory case

View file

@ -15,7 +15,7 @@ void test_pubsub_handler(const void* arg, void* ctx) {
pubsub_context_value = *(uint32_t*)ctx; pubsub_context_value = *(uint32_t*)ctx;
} }
void test_furi_pubsub() { void test_furi_pubsub(void) {
FuriPubSub* test_pubsub = NULL; FuriPubSub* test_pubsub = NULL;
FuriPubSubSubscription* test_pubsub_subscription = NULL; FuriPubSubSubscription* test_pubsub_subscription = NULL;

View file

@ -5,7 +5,7 @@
#define TEST_RECORD_NAME "test/holding" #define TEST_RECORD_NAME "test/holding"
void test_furi_create_open() { void test_furi_create_open(void) {
// Test that record does not exist // Test that record does not exist
mu_check(furi_record_exists(TEST_RECORD_NAME) == false); mu_check(furi_record_exists(TEST_RECORD_NAME) == false);

View file

@ -462,7 +462,7 @@ MU_TEST_SUITE(test_suite) {
MU_RUN_TEST(mu_test_furi_string_utf8); MU_RUN_TEST(mu_test_furi_string_utf8);
} }
int run_minunit_test_furi_string() { int run_minunit_test_furi_string(void) {
MU_RUN_SUITE(test_suite); MU_RUN_SUITE(test_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;

View file

@ -4,11 +4,11 @@
#include "../minunit.h" #include "../minunit.h"
// v2 tests // v2 tests
void test_furi_create_open(); void test_furi_create_open(void);
void test_furi_concurrent_access(); void test_furi_concurrent_access(void);
void test_furi_pubsub(); void test_furi_pubsub(void);
void test_furi_memmgr(); void test_furi_memmgr(void);
static int foo = 0; static int foo = 0;
@ -50,7 +50,7 @@ MU_TEST_SUITE(test_suite) {
MU_RUN_TEST(mu_test_furi_memmgr); MU_RUN_TEST(mu_test_furi_memmgr);
} }
int run_minunit_test_furi() { int run_minunit_test_furi(void) {
MU_RUN_SUITE(test_suite); MU_RUN_SUITE(test_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;

View file

@ -409,16 +409,16 @@ static const uint8_t tv_gcm_tag_4[16] = {
0x1B, 0x1B,
}; };
static void furi_hal_crypto_ctr_setup() { static void furi_hal_crypto_ctr_setup(void) {
} }
static void furi_hal_crypto_ctr_teardown() { static void furi_hal_crypto_ctr_teardown(void) {
} }
static void furi_hal_crypto_gcm_setup() { static void furi_hal_crypto_gcm_setup(void) {
} }
static void furi_hal_crypto_gcm_teardown() { static void furi_hal_crypto_gcm_teardown(void) {
} }
MU_TEST(furi_hal_crypto_ctr_1) { MU_TEST(furi_hal_crypto_ctr_1) {
@ -595,7 +595,7 @@ MU_TEST_SUITE(furi_hal_crypto_gcm_test) {
MU_RUN_TEST(furi_hal_crypto_gcm_4); MU_RUN_TEST(furi_hal_crypto_gcm_4);
} }
int run_minunit_test_furi_hal_crypto() { int run_minunit_test_furi_hal_crypto(void) {
MU_RUN_SUITE(furi_hal_crypto_ctr_test); MU_RUN_SUITE(furi_hal_crypto_ctr_test);
MU_RUN_SUITE(furi_hal_crypto_gcm_test); MU_RUN_SUITE(furi_hal_crypto_gcm_test);
return MU_EXIT_CODE; return MU_EXIT_CODE;

View file

@ -14,19 +14,19 @@
#define EEPROM_PAGE_SIZE 16 #define EEPROM_PAGE_SIZE 16
#define EEPROM_WRITE_DELAY_MS 6 #define EEPROM_WRITE_DELAY_MS 6
static void furi_hal_i2c_int_setup() { static void furi_hal_i2c_int_setup(void) {
furi_hal_i2c_acquire(&furi_hal_i2c_handle_power); furi_hal_i2c_acquire(&furi_hal_i2c_handle_power);
} }
static void furi_hal_i2c_int_teardown() { static void furi_hal_i2c_int_teardown(void) {
furi_hal_i2c_release(&furi_hal_i2c_handle_power); furi_hal_i2c_release(&furi_hal_i2c_handle_power);
} }
static void furi_hal_i2c_ext_setup() { static void furi_hal_i2c_ext_setup(void) {
furi_hal_i2c_acquire(&furi_hal_i2c_handle_external); furi_hal_i2c_acquire(&furi_hal_i2c_handle_external);
} }
static void furi_hal_i2c_ext_teardown() { static void furi_hal_i2c_ext_teardown(void) {
furi_hal_i2c_release(&furi_hal_i2c_handle_external); furi_hal_i2c_release(&furi_hal_i2c_handle_external);
} }
@ -227,7 +227,7 @@ MU_TEST_SUITE(furi_hal_i2c_ext_suite) {
MU_RUN_TEST(furi_hal_i2c_ext_eeprom); MU_RUN_TEST(furi_hal_i2c_ext_eeprom);
} }
int run_minunit_test_furi_hal() { int run_minunit_test_furi_hal(void) {
MU_RUN_SUITE(furi_hal_i2c_int_suite); MU_RUN_SUITE(furi_hal_i2c_int_suite);
MU_RUN_SUITE(furi_hal_i2c_ext_suite); MU_RUN_SUITE(furi_hal_i2c_ext_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;

View file

@ -17,7 +17,7 @@ typedef struct {
static InfraredTest* test; static InfraredTest* test;
static void infrared_test_alloc() { static void infrared_test_alloc(void) {
Storage* storage = furi_record_open(RECORD_STORAGE); Storage* storage = furi_record_open(RECORD_STORAGE);
test = malloc(sizeof(InfraredTest)); test = malloc(sizeof(InfraredTest));
test->decoder_handler = infrared_alloc_decoder(); test->decoder_handler = infrared_alloc_decoder();
@ -26,7 +26,7 @@ static void infrared_test_alloc() {
test->file_path = furi_string_alloc(); test->file_path = furi_string_alloc();
} }
static void infrared_test_free() { static void infrared_test_free(void) {
furi_check(test); furi_check(test);
infrared_free_decoder(test->decoder_handler); infrared_free_decoder(test->decoder_handler);
infrared_free_encoder(test->encoder_handler); infrared_free_encoder(test->encoder_handler);
@ -426,53 +426,53 @@ MU_TEST(infrared_test_decoder_mixed) {
infrared_test_run_decoder(InfraredProtocolSIRC, 3); infrared_test_run_decoder(InfraredProtocolSIRC, 3);
infrared_test_run_decoder(InfraredProtocolKaseikyo, 1); infrared_test_run_decoder(InfraredProtocolKaseikyo, 1);
infrared_test_run_decoder(InfraredProtocolRCA, 1); infrared_test_run_decoder(InfraredProtocolRCA, 1);
infrared_test_run_decoder(InfraredProtocolPioneer, 6);
} }
MU_TEST(infrared_test_decoder_nec) { MU_TEST(infrared_test_decoder_nec) {
infrared_test_run_decoder(InfraredProtocolNEC, 1); for(uint32_t i = 1; i <= 3; ++i) {
infrared_test_run_decoder(InfraredProtocolNEC, 2); infrared_test_run_decoder(InfraredProtocolNEC, i);
infrared_test_run_decoder(InfraredProtocolNEC, 3); }
} }
MU_TEST(infrared_test_decoder_unexpected_end_in_sequence) { MU_TEST(infrared_test_decoder_unexpected_end_in_sequence) {
infrared_test_run_decoder(InfraredProtocolNEC, 1); for(uint32_t i = 1; i <= 2; ++i) {
infrared_test_run_decoder(InfraredProtocolNEC, 1); infrared_test_run_decoder(InfraredProtocolNEC, i);
infrared_test_run_decoder(InfraredProtocolNEC, 2); infrared_test_run_decoder(InfraredProtocolNEC, i);
infrared_test_run_decoder(InfraredProtocolNEC, 2); }
} }
MU_TEST(infrared_test_decoder_necext1) { MU_TEST(infrared_test_decoder_necext1) {
for(uint32_t i = 0; i < 2; ++i) {
UNUSED(i);
infrared_test_run_decoder(InfraredProtocolNECext, 1); infrared_test_run_decoder(InfraredProtocolNECext, 1);
infrared_test_run_decoder(InfraredProtocolNECext, 1); }
} }
MU_TEST(infrared_test_decoder_long_packets_with_nec_start) { MU_TEST(infrared_test_decoder_long_packets_with_nec_start) {
infrared_test_run_decoder(InfraredProtocolNEC42ext, 1); for(uint32_t i = 1; i <= 2; ++i) {
infrared_test_run_decoder(InfraredProtocolNEC42ext, 2); infrared_test_run_decoder(InfraredProtocolNEC42ext, i);
}
} }
MU_TEST(infrared_test_encoder_sirc) { MU_TEST(infrared_test_encoder_sirc) {
infrared_test_run_encoder(InfraredProtocolSIRC, 1); for(uint32_t i = 1; i <= 2; ++i) {
infrared_test_run_encoder(InfraredProtocolSIRC, 2); infrared_test_run_encoder(InfraredProtocolSIRC, i);
}
} }
MU_TEST(infrared_test_decoder_sirc) { MU_TEST(infrared_test_decoder_sirc) {
infrared_test_run_decoder(InfraredProtocolSIRC, 3); for(uint32_t i = 1; i <= 5; ++i) {
infrared_test_run_decoder(InfraredProtocolSIRC, 1);
infrared_test_run_decoder(InfraredProtocolSIRC, 2);
infrared_test_run_decoder(InfraredProtocolSIRC, 4);
infrared_test_run_decoder(InfraredProtocolSIRC, 5); infrared_test_run_decoder(InfraredProtocolSIRC, 5);
}
} }
MU_TEST(infrared_test_decoder_rc5) { MU_TEST(infrared_test_decoder_rc5) {
infrared_test_run_decoder(InfraredProtocolRC5X, 1); infrared_test_run_decoder(InfraredProtocolRC5X, 1);
infrared_test_run_decoder(InfraredProtocolRC5, 1);
infrared_test_run_decoder(InfraredProtocolRC5, 2); for(uint32_t i = 1; i <= 7; ++i) {
infrared_test_run_decoder(InfraredProtocolRC5, 3); infrared_test_run_decoder(InfraredProtocolRC5, i);
infrared_test_run_decoder(InfraredProtocolRC5, 4); }
infrared_test_run_decoder(InfraredProtocolRC5, 5);
infrared_test_run_decoder(InfraredProtocolRC5, 6);
infrared_test_run_decoder(InfraredProtocolRC5, 7);
} }
MU_TEST(infrared_test_encoder_rc5x) { MU_TEST(infrared_test_encoder_rc5x) {
@ -492,21 +492,21 @@ MU_TEST(infrared_test_encoder_rc6) {
} }
MU_TEST(infrared_test_decoder_kaseikyo) { MU_TEST(infrared_test_decoder_kaseikyo) {
infrared_test_run_decoder(InfraredProtocolKaseikyo, 1); for(uint32_t i = 1; i <= 6; ++i) {
infrared_test_run_decoder(InfraredProtocolKaseikyo, 2); infrared_test_run_decoder(InfraredProtocolKaseikyo, i);
infrared_test_run_decoder(InfraredProtocolKaseikyo, 3); }
infrared_test_run_decoder(InfraredProtocolKaseikyo, 4);
infrared_test_run_decoder(InfraredProtocolKaseikyo, 5);
infrared_test_run_decoder(InfraredProtocolKaseikyo, 6);
} }
MU_TEST(infrared_test_decoder_rca) { MU_TEST(infrared_test_decoder_rca) {
infrared_test_run_decoder(InfraredProtocolRCA, 1); for(uint32_t i = 1; i <= 6; ++i) {
infrared_test_run_decoder(InfraredProtocolRCA, 2); infrared_test_run_decoder(InfraredProtocolRCA, i);
infrared_test_run_decoder(InfraredProtocolRCA, 3); }
infrared_test_run_decoder(InfraredProtocolRCA, 4); }
infrared_test_run_decoder(InfraredProtocolRCA, 5);
infrared_test_run_decoder(InfraredProtocolRCA, 6); MU_TEST(infrared_test_decoder_pioneer) {
for(uint32_t i = 1; i <= 11; ++i) {
infrared_test_run_decoder(InfraredProtocolPioneer, i);
}
} }
MU_TEST(infrared_test_encoder_decoder_all) { MU_TEST(infrared_test_encoder_decoder_all) {
@ -520,6 +520,7 @@ MU_TEST(infrared_test_encoder_decoder_all) {
infrared_test_run_encoder_decoder(InfraredProtocolSIRC, 1); infrared_test_run_encoder_decoder(InfraredProtocolSIRC, 1);
infrared_test_run_encoder_decoder(InfraredProtocolKaseikyo, 1); infrared_test_run_encoder_decoder(InfraredProtocolKaseikyo, 1);
infrared_test_run_encoder_decoder(InfraredProtocolRCA, 1); infrared_test_run_encoder_decoder(InfraredProtocolRCA, 1);
infrared_test_run_encoder_decoder(InfraredProtocolPioneer, 1);
} }
MU_TEST_SUITE(infrared_test) { MU_TEST_SUITE(infrared_test) {
@ -539,11 +540,12 @@ MU_TEST_SUITE(infrared_test) {
MU_RUN_TEST(infrared_test_decoder_necext1); MU_RUN_TEST(infrared_test_decoder_necext1);
MU_RUN_TEST(infrared_test_decoder_kaseikyo); MU_RUN_TEST(infrared_test_decoder_kaseikyo);
MU_RUN_TEST(infrared_test_decoder_rca); MU_RUN_TEST(infrared_test_decoder_rca);
MU_RUN_TEST(infrared_test_decoder_pioneer);
MU_RUN_TEST(infrared_test_decoder_mixed); MU_RUN_TEST(infrared_test_decoder_mixed);
MU_RUN_TEST(infrared_test_encoder_decoder_all); MU_RUN_TEST(infrared_test_encoder_decoder_all);
} }
int run_minunit_test_infrared() { int run_minunit_test_infrared(void) {
MU_RUN_SUITE(infrared_test); MU_RUN_SUITE(infrared_test);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -547,7 +547,7 @@ MU_TEST_SUITE(test_lfrfid_protocols_suite) {
MU_RUN_TEST(test_lfrfid_protocol_fdxb_emulate_simple); MU_RUN_TEST(test_lfrfid_protocol_fdxb_emulate_simple);
} }
int run_minunit_test_lfrfid_protocols() { int run_minunit_test_lfrfid_protocols(void) {
MU_RUN_SUITE(test_lfrfid_protocols_suite); MU_RUN_SUITE(test_lfrfid_protocols_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -69,7 +69,7 @@ MU_TEST_SUITE(manifest_suite) {
MU_RUN_TEST(manifest_iteration_test); MU_RUN_TEST(manifest_iteration_test);
} }
int run_minunit_test_manifest() { int run_minunit_test_manifest(void) {
MU_RUN_SUITE(manifest_suite); MU_RUN_SUITE(manifest_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -28,12 +28,12 @@ typedef struct {
static NfcTest* nfc_test = NULL; static NfcTest* nfc_test = NULL;
static void nfc_test_alloc() { static void nfc_test_alloc(void) {
nfc_test = malloc(sizeof(NfcTest)); nfc_test = malloc(sizeof(NfcTest));
nfc_test->storage = furi_record_open(RECORD_STORAGE); nfc_test->storage = furi_record_open(RECORD_STORAGE);
} }
static void nfc_test_free() { static void nfc_test_free(void) {
furi_check(nfc_test); furi_check(nfc_test);
furi_record_close(RECORD_STORAGE); furi_record_close(RECORD_STORAGE);
@ -292,7 +292,7 @@ MU_TEST(ntag_213_locked_reader) {
nfc_free(poller); nfc_free(poller);
} }
static void mf_ultralight_write() { static void mf_ultralight_write(void) {
Nfc* poller = nfc_alloc(); Nfc* poller = nfc_alloc();
Nfc* listener = nfc_alloc(); Nfc* listener = nfc_alloc();
@ -342,7 +342,7 @@ static void mf_ultralight_write() {
nfc_free(poller); nfc_free(poller);
} }
static void mf_classic_reader() { static void mf_classic_reader(void) {
Nfc* poller = nfc_alloc(); Nfc* poller = nfc_alloc();
Nfc* listener = nfc_alloc(); Nfc* listener = nfc_alloc();
@ -368,7 +368,7 @@ static void mf_classic_reader() {
nfc_free(poller); nfc_free(poller);
} }
static void mf_classic_write() { static void mf_classic_write(void) {
Nfc* poller = nfc_alloc(); Nfc* poller = nfc_alloc();
Nfc* listener = nfc_alloc(); Nfc* listener = nfc_alloc();
@ -396,7 +396,7 @@ static void mf_classic_write() {
nfc_free(poller); nfc_free(poller);
} }
static void mf_classic_value_block() { static void mf_classic_value_block(void) {
Nfc* poller = nfc_alloc(); Nfc* poller = nfc_alloc();
Nfc* listener = nfc_alloc(); Nfc* listener = nfc_alloc();
@ -548,7 +548,7 @@ MU_TEST_SUITE(nfc) {
nfc_test_free(); nfc_test_free();
} }
int run_minunit_test_nfc() { int run_minunit_test_nfc(void) {
MU_RUN_SUITE(nfc); MU_RUN_SUITE(nfc);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -115,7 +115,7 @@ static void nfc_prepare_col_res_data(
} }
} }
Nfc* nfc_alloc() { Nfc* nfc_alloc(void) {
Nfc* instance = malloc(sizeof(Nfc)); Nfc* instance = malloc(sizeof(Nfc));
return instance; return instance;

View file

@ -63,7 +63,7 @@ MU_TEST_SUITE(test_power_suite) {
power_test_deinit(); power_test_deinit();
} }
int run_minunit_test_power() { int run_minunit_test_power(void) {
MU_RUN_SUITE(test_power_suite); MU_RUN_SUITE(test_power_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -18,7 +18,7 @@ typedef struct {
static const uint32_t protocol_0_decoder_result = 0xDEADBEEF; static const uint32_t protocol_0_decoder_result = 0xDEADBEEF;
static void* protocol_0_alloc() { static void* protocol_0_alloc(void) {
void* data = malloc(sizeof(Protocol0Data)); void* data = malloc(sizeof(Protocol0Data));
return data; return data;
} }
@ -63,7 +63,7 @@ typedef struct {
static const uint64_t protocol_1_decoder_result = 0x1234567890ABCDEF; static const uint64_t protocol_1_decoder_result = 0x1234567890ABCDEF;
static void* protocol_1_alloc() { static void* protocol_1_alloc(void) {
void* data = malloc(sizeof(Protocol1Data)); void* data = malloc(sizeof(Protocol1Data));
return data; return data;
} }
@ -216,7 +216,7 @@ MU_TEST_SUITE(test_protocol_dict_suite) {
MU_RUN_TEST(test_protocol_dict); MU_RUN_TEST(test_protocol_dict);
} }
int run_minunit_test_protocol_dict() { int run_minunit_test_protocol_dict(void) {
MU_RUN_SUITE(test_protocol_dict_suite); MU_RUN_SUITE(test_protocol_dict_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -0,0 +1,205 @@
Filetype: IR tests file
Version: 1
#
name: decoder_input1
type: raw
data: 25557 8437 4188 571 1538 595 1514 567 1542 570 1539 573 501 565 1544 568 506 571 1539 573 501 565 509 568 508 569 506 571 1538 574 501 565 1543 569 506 571 504 573 1536 566 1544 568 506 592 1517 574 1535 567 507 570 505 572 1537 575 500 566 508 600 1509 572 503 574 501 565 1544 568 1540 593
#
name: decoder_expected1
type: parsed_array
count: 1
#
protocol: Pioneer
address: AF 00 00 00
command: 36 00 00 00
repeat: false
#
name: decoder_input2
type: raw
data: 25609 8444 4152 564 1568 544 1565 547 1561 541 1568 544 530 547 1536 566 510 567 1567 545 529 548 526 540 535 542 508 569 1539 573 527 539 1543 569 506 571 504 573 1561 541 508 569 507 570 1538 564 1545 567 507 570 505 572 1537 565 509 568 1541 571 1538 564 511 566 509 568 1539 573 1537 596
#
name: decoder_expected2
type: parsed_array
count: 1
#
protocol: Pioneer
address: AF 00 00 00
command: 32 00 00 00
repeat: false
#
name: decoder_input3
type: raw
data: 25582 8448 4176 571 1537 565 1544 568 1540 572 1537 575 500 566 1542 570 505 572 1537 575 500 566 508 569 506 571 504 573 1536 565 510 567 1542 570 504 573 1536 566 1543 569 506 571 504 573 1536 566 1543 569 506 571 504 573 502 575 500 566 1542 570 1539 573 502 575 500 566 1542 570 1540 572
#
name: decoder_expected3
type: parsed_array
count: 1
#
protocol: Pioneer
address: AF 00 00 00
command: 33 00 00 00
repeat: false
#
name: decoder_input4
type: raw
data: 25594 8443 4181 568 1542 570 505 572 1538 564 1545 567 508 569 1540 572 504 573 1536 566 510 567 1542 571 505 572 504 573 1562 540 510 567 1543 570 506 571 504 573 503 574 501 565 510 567 509 568 507 570 1539 573 502 565 1545 568 1542 571 1539 573 1536 566 1544 569 1541 572 503 574 1537 565
#
name: decoder_expected4
type: parsed_array
count: 1
#
protocol: Pioneer
address: AD 00 00 00
command: 40 00 00 00
repeat: false
#
name: decoder_input5
type: raw
data: 25556 8475 4150 597 1512 600 476 601 1509 603 1506 595 480 597 1512 600 476 601 1508 594 482 595 1515 597 478 599 477 600 1510 602 473 604 1506 595 480 597 1513 599 476 601 475 602 474 603 472 594 482 595 1514 598 477 600 476 601 1508 594 1516 596 1513 599 1510 602 1507 595 480 597 1513 599
#
name: decoder_expected5
type: parsed_array
count: 1
#
protocol: Pioneer
address: AD 00 00 00
command: 41 00 00 00
repeat: false
#
name: decoder_input6
type: raw
data: 25567 8471 4155 604 1506 596 480 597 1513 599 1510 603 473 594 1515 597 478 599 1511 602 474 603 1507 595 480 597 479 598 1511 602 474 603 1506 596 480 597 478 599 1511 602 474 603 472 594 481 596 479 598 1512 601 474 603 1506 596 479 598 1511 602 1508 594 1515 598 1512 600 475 602 1507 595
#
name: decoder_expected6
type: parsed_array
count: 1
#
protocol: Pioneer
address: AD 00 00 00
command: 42 00 00 00
repeat: false
#
name: decoder_input7
type: raw
data: 25584 8444 4180 569 1541 572 504 573 1536 566 1544 569 507 570 1539 574 501 566 1569 596 455 570 1540 573 502 575 501 565 1544 569 507 570 1565 548 503 574 1535 567 1543 570 506 571 529 548 502 565 511 566 1543 601 475 571 504 573 503 574 1536 566 1543 570 1539 574 1536 566 509 568 1541 572
#
name: decoder_expected7
type: parsed_array
count: 1
#
protocol: Pioneer
address: AD 00 00 00
command: 43 00 00 00
repeat: false
#
name: decoder_input8
type: raw
data: 25562 8445 4181 568 1543 570 505 572 1538 575 1535 567 508 569 1539 573 503 595 1514 567 508 600 1509 572 503 595 481 596 1513 568 507 601 1508 573 502 575 501 566 1543 570 506 571 504 573 1536 566 510 567 508 600 475 571 1539 573 502 575 1534 568 1542 571 505 572 1537 575 1534 568 1542 571
#
name: decoder_expected8
type: parsed_array
count: 1
#
protocol: Pioneer
address: AD 00 00 00
command: 12 00 00 00
repeat: false
#
name: decoder_input9
type: raw
data: 25558 8470 4152 597 1513 600 476 601 1508 594 1515 598 478 599 1509 593 483 594 1515 598 478 599 1510 603 474 592 482 595 1514 599 477 600 1509 593 483 594 481 596 1513 600 476 601 1508 594 1515 598 478 599 476 601 474 593 1517 596 479 598 1512 601 474 603 472 594 1515 598 1511 602 1508 594
#
name: decoder_expected9
type: parsed_array
count: 1
#
protocol: Pioneer
address: AD 00 00 00
command: 1A 00 00 00
repeat: false
#
name: decoder_input10
type: raw
data: 25587 8442 4179 601 1507 595 481 565 1544 600 1509 593 482 595 1513 568 507 570 1539 594 481 565 1544 600 476 570 505 593 1516 597 479 598 1511 591 484 593 481 575 1534 600 476 570 1539 595 480 597 478 599 476 570 505 593 1517 564 511 597 1511 602 474 572 1537 597 1513 600 1509 572 1537 565
#
name: decoder_expected10
type: parsed_array
count: 1
#
protocol: Pioneer
address: AD 00 00 00
command: 0A 00 00 00
repeat: false
#
name: decoder_input11
type: raw
data: 25554 8474 4149 600 1510 603 472 594 1515 597 1512 601 475 602 1507 595 480 597 1513 599 475 602 1508 594 481 596 479 598 1512 601 474 603 1506 596 479 598 1512 601 1508 594 481 596 1513 599 476 601 474 603 472 594 481 596 480 597 478 599 1510 603 473 593 1515 597 1512 601 1509 603 1506 596
#
name: decoder_expected11
type: parsed_array
count: 1
#
protocol: Pioneer
address: AD 00 00 00
command: 0B 00 00 00
repeat: false
#
name: encoder_decoder_input1
type: parsed_array
count: 11
#
protocol: Pioneer
address: AF 00 00 00
command: 36 00 00 00
repeat: false
#
protocol: Pioneer
address: AF 00 00 00
command: 32 00 00 00
repeat: false
#
protocol: Pioneer
address: AF 00 00 00
command: 33 00 00 00
repeat: false
#
protocol: Pioneer
address: AD 00 00 00
command: 40 00 00 00
repeat: false
#
protocol: Pioneer
address: AD 00 00 00
command: 41 00 00 00
repeat: false
#
protocol: Pioneer
address: AD 00 00 00
command: 42 00 00 00
repeat: false
#
protocol: Pioneer
address: AD 00 00 00
command: 43 00 00 00
repeat: false
#
protocol: Pioneer
address: AD 00 00 00
command: 12 00 00 00
repeat: false
#
protocol: Pioneer
address: AD 00 00 00
command: 1A 00 00 00
repeat: false
#
protocol: Pioneer
address: AD 00 00 00
command: 0A 00 00 00
repeat: false
#
protocol: Pioneer
address: AD 00 00 00
command: 0B 00 00 00
repeat: false
#

View file

@ -1840,7 +1840,7 @@ MU_TEST_SUITE(test_rpc_session) {
furi_record_close(RECORD_STORAGE); furi_record_close(RECORD_STORAGE);
} }
int run_minunit_test_rpc() { int run_minunit_test_rpc(void) {
Storage* storage = furi_record_open(RECORD_STORAGE); Storage* storage = furi_record_open(RECORD_STORAGE);
if(storage_sd_status(storage) != FSE_OK) { if(storage_sd_status(storage) != FSE_OK) {
FURI_LOG_E(TAG, "SD card not mounted - skip storage tests"); FURI_LOG_E(TAG, "SD card not mounted - skip storage tests");

View file

@ -266,7 +266,7 @@ MU_TEST_SUITE(test_dirwalk_suite) {
furi_record_close(RECORD_STORAGE); furi_record_close(RECORD_STORAGE);
} }
int run_minunit_test_dirwalk() { int run_minunit_test_dirwalk(void) {
MU_RUN_SUITE(test_dirwalk_suite); MU_RUN_SUITE(test_dirwalk_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -36,7 +36,7 @@ static bool storage_file_create(Storage* storage, const char* path, const char*
return result; return result;
} }
static void storage_file_open_lock_setup() { static void storage_file_open_lock_setup(void) {
Storage* storage = furi_record_open(RECORD_STORAGE); Storage* storage = furi_record_open(RECORD_STORAGE);
File* file = storage_file_alloc(storage); File* file = storage_file_alloc(storage);
storage_simply_remove(storage, STORAGE_LOCKED_FILE); storage_simply_remove(storage, STORAGE_LOCKED_FILE);
@ -47,7 +47,7 @@ static void storage_file_open_lock_setup() {
furi_record_close(RECORD_STORAGE); furi_record_close(RECORD_STORAGE);
} }
static void storage_file_open_lock_teardown() { static void storage_file_open_lock_teardown(void) {
Storage* storage = furi_record_open(RECORD_STORAGE); Storage* storage = furi_record_open(RECORD_STORAGE);
mu_check(storage_simply_remove(storage, STORAGE_LOCKED_FILE)); mu_check(storage_simply_remove(storage, STORAGE_LOCKED_FILE));
furi_record_close(RECORD_STORAGE); furi_record_close(RECORD_STORAGE);
@ -702,7 +702,7 @@ MU_TEST_SUITE(test_md5_calc_suite) {
MU_RUN_TEST(test_md5_calc); MU_RUN_TEST(test_md5_calc);
} }
int run_minunit_test_storage() { int run_minunit_test_storage(void) {
MU_RUN_SUITE(storage_file); MU_RUN_SUITE(storage_file);
MU_RUN_SUITE(storage_file_64k); MU_RUN_SUITE(storage_file_64k);
MU_RUN_SUITE(storage_dir); MU_RUN_SUITE(storage_dir);

View file

@ -526,7 +526,7 @@ MU_TEST_SUITE(stream_suite) {
MU_RUN_TEST(stream_buffered_large_file_test); MU_RUN_TEST(stream_buffered_large_file_test);
} }
int run_minunit_test_stream() { int run_minunit_test_stream(void) {
MU_RUN_SUITE(stream_suite); MU_RUN_SUITE(stream_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -312,7 +312,7 @@ static LevelDuration subghz_hal_async_tx_test_yield(void* context) {
furi_crash("Yield after reset"); furi_crash("Yield after reset");
} }
} else { } else {
furi_crash("Programming error"); furi_crash();
} }
} }
@ -902,7 +902,7 @@ MU_TEST_SUITE(subghz) {
subghz_test_deinit(); subghz_test_deinit();
} }
int run_minunit_test_subghz() { int run_minunit_test_subghz(void) {
MU_RUN_SUITE(subghz); MU_RUN_SUITE(subghz);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -8,31 +8,31 @@
#define TAG "UnitTests" #define TAG "UnitTests"
int run_minunit_test_furi(); int run_minunit_test_furi(void);
int run_minunit_test_furi_hal(); int run_minunit_test_furi_hal(void);
int run_minunit_test_furi_hal_crypto(); int run_minunit_test_furi_hal_crypto(void);
int run_minunit_test_furi_string(); int run_minunit_test_furi_string(void);
int run_minunit_test_infrared(); int run_minunit_test_infrared(void);
int run_minunit_test_rpc(); int run_minunit_test_rpc(void);
int run_minunit_test_manifest(); int run_minunit_test_manifest(void);
int run_minunit_test_flipper_format(); int run_minunit_test_flipper_format(void);
int run_minunit_test_flipper_format_string(); int run_minunit_test_flipper_format_string(void);
int run_minunit_test_stream(); int run_minunit_test_stream(void);
int run_minunit_test_storage(); int run_minunit_test_storage(void);
int run_minunit_test_subghz(); int run_minunit_test_subghz(void);
int run_minunit_test_dirwalk(); int run_minunit_test_dirwalk(void);
int run_minunit_test_power(); int run_minunit_test_power(void);
int run_minunit_test_protocol_dict(); int run_minunit_test_protocol_dict(void);
int run_minunit_test_lfrfid_protocols(); int run_minunit_test_lfrfid_protocols(void);
int run_minunit_test_nfc(); int run_minunit_test_nfc(void);
int run_minunit_test_bit_lib(); int run_minunit_test_bit_lib(void);
int run_minunit_test_datetime(); int run_minunit_test_datetime(void);
int run_minunit_test_float_tools(); int run_minunit_test_float_tools(void);
int run_minunit_test_bt(); int run_minunit_test_bt(void);
int run_minunit_test_dialogs_file_browser_options(); int run_minunit_test_dialogs_file_browser_options(void);
int run_minunit_test_expansion(); int run_minunit_test_expansion(void);
typedef int (*UnitTestEntry)(); typedef int (*UnitTestEntry)(void);
typedef struct { typedef struct {
const char* name; const char* name;
@ -66,7 +66,7 @@ const UnitTest unit_tests[] = {
{.name = "expansion", .entry = run_minunit_test_expansion}, {.name = "expansion", .entry = run_minunit_test_expansion},
}; };
void minunit_print_progress() { void minunit_print_progress(void) {
static const char progress[] = {'\\', '|', '/', '-'}; static const char progress[] = {'\\', '|', '/', '-'};
static uint8_t progress_counter = 0; static uint8_t progress_counter = 0;
static uint32_t last_tick = 0; static uint32_t last_tick = 0;
@ -157,7 +157,7 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) {
furi_record_close(RECORD_LOADER); furi_record_close(RECORD_LOADER);
} }
void unit_tests_on_system_start() { void unit_tests_on_system_start(void) {
#ifdef SRV_CLI #ifdef SRV_CLI
Cli* cli = furi_record_open(RECORD_CLI); Cli* cli = furi_record_open(RECORD_CLI);

View file

@ -82,7 +82,7 @@ MU_TEST_SUITE(test_varint_suite) {
MU_RUN_TEST(test_varint_rand_i); MU_RUN_TEST(test_varint_rand_i);
} }
int run_minunit_test_varint() { int run_minunit_test_varint(void) {
MU_RUN_SUITE(test_varint_suite); MU_RUN_SUITE(test_varint_suite);
return MU_EXIT_CODE; return MU_EXIT_CODE;
} }

View file

@ -55,7 +55,7 @@ uint32_t usb_test_exit(void* context) {
return VIEW_NONE; return VIEW_NONE;
} }
UsbTestApp* usb_test_app_alloc() { UsbTestApp* usb_test_app_alloc(void) {
UsbTestApp* app = malloc(sizeof(UsbTestApp)); UsbTestApp* app = malloc(sizeof(UsbTestApp));
// Gui // Gui

View file

@ -98,7 +98,7 @@ typedef struct {
static SubGhzDeviceCC1101Ext* subghz_device_cc1101_ext = NULL; static SubGhzDeviceCC1101Ext* subghz_device_cc1101_ext = NULL;
static bool subghz_device_cc1101_ext_check_init() { static bool subghz_device_cc1101_ext_check_init(void) {
furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateInit); furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateInit);
subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle; subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle;
@ -182,6 +182,14 @@ static bool subghz_device_cc1101_ext_check_init() {
furi_hal_gpio_init( furi_hal_gpio_init(
subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
// Reset GDO2 (!TX/RX) to floating state
cc1101_status = cc1101_write_reg(
subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHighImpedance);
if(cc1101_status.CHIP_RDYn != 0) {
//timeout or error
break;
}
// Go to sleep // Go to sleep
cc1101_status = cc1101_shutdown(subghz_device_cc1101_ext->spi_bus_handle); cc1101_status = cc1101_shutdown(subghz_device_cc1101_ext->spi_bus_handle);
if(cc1101_status.CHIP_RDYn != 0) { if(cc1101_status.CHIP_RDYn != 0) {
@ -232,7 +240,7 @@ bool subghz_device_cc1101_ext_alloc(SubGhzDeviceConf* conf) {
return subghz_device_cc1101_ext_check_init(); return subghz_device_cc1101_ext_check_init();
} }
void subghz_device_cc1101_ext_free() { void subghz_device_cc1101_ext_free(void) {
furi_assert(subghz_device_cc1101_ext != NULL); furi_assert(subghz_device_cc1101_ext != NULL);
furi_hal_spi_bus_handle_deinit(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_bus_handle_deinit(subghz_device_cc1101_ext->spi_bus_handle);
@ -248,11 +256,11 @@ void subghz_device_cc1101_ext_set_async_mirror_pin(const GpioPin* pin) {
subghz_device_cc1101_ext->async_mirror_pin = pin; subghz_device_cc1101_ext->async_mirror_pin = pin;
} }
const GpioPin* subghz_device_cc1101_ext_get_data_gpio() { const GpioPin* subghz_device_cc1101_ext_get_data_gpio(void) {
return subghz_device_cc1101_ext->g0_pin; return subghz_device_cc1101_ext->g0_pin;
} }
bool subghz_device_cc1101_ext_is_connect() { bool subghz_device_cc1101_ext_is_connect(void) {
bool ret = false; bool ret = false;
if(subghz_device_cc1101_ext == NULL) { // not initialized if(subghz_device_cc1101_ext == NULL) { // not initialized
@ -268,7 +276,7 @@ bool subghz_device_cc1101_ext_is_connect() {
return ret; return ret;
} }
void subghz_device_cc1101_ext_sleep() { void subghz_device_cc1101_ext_sleep(void) {
furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateIdle); furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateIdle);
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
@ -283,7 +291,7 @@ void subghz_device_cc1101_ext_sleep() {
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
} }
void subghz_device_cc1101_ext_dump_state() { void subghz_device_cc1101_ext_dump_state(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
printf( printf(
"[subghz_device_cc1101_ext] cc1101 chip %d, version %d\r\n", "[subghz_device_cc1101_ext] cc1101 chip %d, version %d\r\n",
@ -348,19 +356,19 @@ void subghz_device_cc1101_ext_write_packet(const uint8_t* data, uint8_t size) {
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
} }
void subghz_device_cc1101_ext_flush_rx() { void subghz_device_cc1101_ext_flush_rx(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
cc1101_flush_rx(subghz_device_cc1101_ext->spi_bus_handle); cc1101_flush_rx(subghz_device_cc1101_ext->spi_bus_handle);
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
} }
void subghz_device_cc1101_ext_flush_tx() { void subghz_device_cc1101_ext_flush_tx(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
cc1101_flush_tx(subghz_device_cc1101_ext->spi_bus_handle); cc1101_flush_tx(subghz_device_cc1101_ext->spi_bus_handle);
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
} }
bool subghz_device_cc1101_ext_rx_pipe_not_empty() { bool subghz_device_cc1101_ext_rx_pipe_not_empty(void) {
CC1101RxBytes status[1]; CC1101RxBytes status[1];
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
cc1101_read_reg( cc1101_read_reg(
@ -376,7 +384,7 @@ bool subghz_device_cc1101_ext_rx_pipe_not_empty() {
} }
} }
bool subghz_device_cc1101_ext_is_rx_data_crc_valid() { bool subghz_device_cc1101_ext_is_rx_data_crc_valid(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
uint8_t data[1]; uint8_t data[1];
cc1101_read_reg( cc1101_read_reg(
@ -395,14 +403,14 @@ void subghz_device_cc1101_ext_read_packet(uint8_t* data, uint8_t* size) {
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
} }
void subghz_device_cc1101_ext_shutdown() { void subghz_device_cc1101_ext_shutdown(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
// Reset and shutdown // Reset and shutdown
cc1101_shutdown(subghz_device_cc1101_ext->spi_bus_handle); cc1101_shutdown(subghz_device_cc1101_ext->spi_bus_handle);
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
} }
void subghz_device_cc1101_ext_reset() { void subghz_device_cc1101_ext_reset(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
furi_hal_gpio_init(subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); furi_hal_gpio_init(subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle);
@ -410,40 +418,52 @@ void subghz_device_cc1101_ext_reset() {
// Warning: push pull cc1101 clock output on GD0 // Warning: push pull cc1101 clock output on GD0
cc1101_write_reg( cc1101_write_reg(
subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG0, CC1101IocfgHighImpedance); subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG0, CC1101IocfgHighImpedance);
// Reset GDO2 (!TX/RX) to floating state
cc1101_write_reg(
subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHighImpedance);
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
} }
void subghz_device_cc1101_ext_idle() { void subghz_device_cc1101_ext_idle(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle);
//waiting for the chip to switch to IDLE mode //waiting for the chip to switch to IDLE mode
furi_check(cc1101_wait_status_state( furi_check(cc1101_wait_status_state(
subghz_device_cc1101_ext->spi_bus_handle, CC1101StateIDLE, 10000)); subghz_device_cc1101_ext->spi_bus_handle, CC1101StateIDLE, 10000));
// Reset GDO2 (!TX/RX) to floating state
cc1101_write_reg(
subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHighImpedance);
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
if(subghz_device_cc1101_ext->power_amp) { if(subghz_device_cc1101_ext->power_amp) {
furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 0); furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 0);
} }
} }
void subghz_device_cc1101_ext_rx() { void subghz_device_cc1101_ext_rx(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
cc1101_switch_to_rx(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_rx(subghz_device_cc1101_ext->spi_bus_handle);
//waiting for the chip to switch to Rx mode //waiting for the chip to switch to Rx mode
furi_check( furi_check(
cc1101_wait_status_state(subghz_device_cc1101_ext->spi_bus_handle, CC1101StateRX, 10000)); cc1101_wait_status_state(subghz_device_cc1101_ext->spi_bus_handle, CC1101StateRX, 10000));
// Go GDO2 (!TX/RX) to high (RX state)
cc1101_write_reg(
subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHW | CC1101_IOCFG_INV);
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
if(subghz_device_cc1101_ext->power_amp) { if(subghz_device_cc1101_ext->power_amp) {
furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 0); furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 0);
} }
} }
bool subghz_device_cc1101_ext_tx() { bool subghz_device_cc1101_ext_tx(void) {
if(subghz_device_cc1101_ext->regulation != SubGhzDeviceCC1101ExtRegulationTxRx) return false; if(subghz_device_cc1101_ext->regulation != SubGhzDeviceCC1101ExtRegulationTxRx) return false;
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
cc1101_switch_to_tx(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_tx(subghz_device_cc1101_ext->spi_bus_handle);
//waiting for the chip to switch to Tx mode //waiting for the chip to switch to Tx mode
furi_check( furi_check(
cc1101_wait_status_state(subghz_device_cc1101_ext->spi_bus_handle, CC1101StateTX, 10000)); cc1101_wait_status_state(subghz_device_cc1101_ext->spi_bus_handle, CC1101StateTX, 10000));
// Go GDO2 (!TX/RX) to low (TX state)
cc1101_write_reg(subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHW);
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
if(subghz_device_cc1101_ext->power_amp) { if(subghz_device_cc1101_ext->power_amp) {
furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 1); furi_hal_gpio_write(SUBGHZ_DEVICE_CC1101_EXT_E07_AMP_GPIO, 1);
@ -451,7 +471,7 @@ bool subghz_device_cc1101_ext_tx() {
return true; return true;
} }
float subghz_device_cc1101_ext_get_rssi() { float subghz_device_cc1101_ext_get_rssi(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
int32_t rssi_dec = cc1101_get_rssi(subghz_device_cc1101_ext->spi_bus_handle); int32_t rssi_dec = cc1101_get_rssi(subghz_device_cc1101_ext->spi_bus_handle);
furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle);
@ -466,7 +486,7 @@ float subghz_device_cc1101_ext_get_rssi() {
return rssi; return rssi;
} }
uint8_t subghz_device_cc1101_ext_get_lqi() { uint8_t subghz_device_cc1101_ext_get_lqi(void) {
furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle);
uint8_t data[1]; uint8_t data[1];
cc1101_read_reg( cc1101_read_reg(
@ -525,7 +545,7 @@ uint32_t subghz_device_cc1101_ext_set_frequency(uint32_t value) {
return real_frequency; return real_frequency;
} }
static bool subghz_device_cc1101_ext_start_debug() { static bool subghz_device_cc1101_ext_start_debug(void) {
bool ret = false; bool ret = false;
if(subghz_device_cc1101_ext->async_mirror_pin != NULL) { if(subghz_device_cc1101_ext->async_mirror_pin != NULL) {
furi_hal_gpio_init( furi_hal_gpio_init(
@ -538,7 +558,7 @@ static bool subghz_device_cc1101_ext_start_debug() {
return ret; return ret;
} }
static bool subghz_device_cc1101_ext_stop_debug() { static bool subghz_device_cc1101_ext_stop_debug(void) {
bool ret = false; bool ret = false;
if(subghz_device_cc1101_ext->async_mirror_pin != NULL) { if(subghz_device_cc1101_ext->async_mirror_pin != NULL) {
furi_hal_gpio_init( furi_hal_gpio_init(
@ -620,7 +640,7 @@ void subghz_device_cc1101_ext_start_async_rx(
subghz_device_cc1101_ext->async_rx.capture_delta_duration = 0; subghz_device_cc1101_ext->async_rx.capture_delta_duration = 0;
} }
void subghz_device_cc1101_ext_stop_async_rx() { void subghz_device_cc1101_ext_stop_async_rx(void) {
furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncRx); furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncRx);
subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle; subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle;
@ -858,13 +878,13 @@ bool subghz_device_cc1101_ext_start_async_tx(SubGhzDeviceCC1101ExtCallback callb
return true; return true;
} }
bool subghz_device_cc1101_ext_is_async_tx_complete() { bool subghz_device_cc1101_ext_is_async_tx_complete(void) {
return ( return (
(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx) && (subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx) &&
(LL_TIM_GetAutoReload(TIM17) == 0)); (LL_TIM_GetAutoReload(TIM17) == 0));
} }
void subghz_device_cc1101_ext_stop_async_tx() { void subghz_device_cc1101_ext_stop_async_tx(void) {
furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx); furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx);
// Shutdown radio // Shutdown radio

View file

@ -1,6 +1,6 @@
/** /**
* @file furi_hal_subghz.h * @file cc1101_ext.h
* SubGhz HAL API * @brief External CC1101 transceiver access API.
*/ */
#pragma once #pragma once
@ -29,7 +29,7 @@ void subghz_device_cc1101_ext_set_async_mirror_pin(const GpioPin* pin);
* *
* @return pointer to the gpio pin structure * @return pointer to the gpio pin structure
*/ */
const GpioPin* subghz_device_cc1101_ext_get_data_gpio(); const GpioPin* subghz_device_cc1101_ext_get_data_gpio(void);
/** Initialize device /** Initialize device
* *
@ -39,21 +39,21 @@ bool subghz_device_cc1101_ext_alloc(SubGhzDeviceConf* conf);
/** Deinitialize device /** Deinitialize device
*/ */
void subghz_device_cc1101_ext_free(); void subghz_device_cc1101_ext_free(void);
/** Check and switch to power save mode Used by internal API-HAL /** Check and switch to power save mode Used by internal API-HAL
* initialization routine Can be used to reinitialize device to safe state and * initialization routine Can be used to reinitialize device to safe state and
* send it to sleep * send it to sleep
*/ */
bool subghz_device_cc1101_ext_is_connect(); bool subghz_device_cc1101_ext_is_connect(void);
/** Send device to sleep mode /** Send device to sleep mode
*/ */
void subghz_device_cc1101_ext_sleep(); void subghz_device_cc1101_ext_sleep(void);
/** Dump info to stdout /** Dump info to stdout
*/ */
void subghz_device_cc1101_ext_dump_state(); void subghz_device_cc1101_ext_dump_state(void);
/** Load custom registers from preset /** Load custom registers from preset
* *
@ -84,13 +84,13 @@ void subghz_device_cc1101_ext_write_packet(const uint8_t* data, uint8_t size);
* *
* @return true if not empty * @return true if not empty
*/ */
bool subghz_device_cc1101_ext_rx_pipe_not_empty(); bool subghz_device_cc1101_ext_rx_pipe_not_empty(void);
/** Check if received data crc is valid /** Check if received data crc is valid
* *
* @return true if valid * @return true if valid
*/ */
bool subghz_device_cc1101_ext_is_rx_data_crc_valid(); bool subghz_device_cc1101_ext_is_rx_data_crc_valid(void);
/** Read packet from FIFO /** Read packet from FIFO
* *
@ -101,47 +101,47 @@ void subghz_device_cc1101_ext_read_packet(uint8_t* data, uint8_t* size);
/** Flush rx FIFO buffer /** Flush rx FIFO buffer
*/ */
void subghz_device_cc1101_ext_flush_rx(); void subghz_device_cc1101_ext_flush_rx(void);
/** Flush tx FIFO buffer /** Flush tx FIFO buffer
*/ */
void subghz_device_cc1101_ext_flush_tx(); void subghz_device_cc1101_ext_flush_tx(void);
/** Shutdown Issue SPWD command /** Shutdown Issue SPWD command
* @warning registers content will be lost * @warning registers content will be lost
*/ */
void subghz_device_cc1101_ext_shutdown(); void subghz_device_cc1101_ext_shutdown(void);
/** Reset Issue reset command /** Reset Issue reset command
* @warning registers content will be lost * @warning registers content will be lost
*/ */
void subghz_device_cc1101_ext_reset(); void subghz_device_cc1101_ext_reset(void);
/** Switch to Idle /** Switch to Idle
*/ */
void subghz_device_cc1101_ext_idle(); void subghz_device_cc1101_ext_idle(void);
/** Switch to Receive /** Switch to Receive
*/ */
void subghz_device_cc1101_ext_rx(); void subghz_device_cc1101_ext_rx(void);
/** Switch to Transmit /** Switch to Transmit
* *
* @return true if the transfer is allowed by belonging to the region * @return true if the transfer is allowed by belonging to the region
*/ */
bool subghz_device_cc1101_ext_tx(); bool subghz_device_cc1101_ext_tx(void);
/** Get RSSI value in dBm /** Get RSSI value in dBm
* *
* @return RSSI value * @return RSSI value
*/ */
float subghz_device_cc1101_ext_get_rssi(); float subghz_device_cc1101_ext_get_rssi(void);
/** Get LQI /** Get LQI
* *
* @return LQI value * @return LQI value
*/ */
uint8_t subghz_device_cc1101_ext_get_lqi(); uint8_t subghz_device_cc1101_ext_get_lqi(void);
/** Check if frequency is in valid range /** Check if frequency is in valid range
* *
@ -175,7 +175,7 @@ void subghz_device_cc1101_ext_start_async_rx(
/** Disable signal timings capture Resets GPIO and TIM2 /** Disable signal timings capture Resets GPIO and TIM2
*/ */
void subghz_device_cc1101_ext_stop_async_rx(); void subghz_device_cc1101_ext_stop_async_rx(void);
/** Async TX callback type /** Async TX callback type
* @param context callback context * @param context callback context
@ -196,11 +196,11 @@ bool subghz_device_cc1101_ext_start_async_tx(SubGhzDeviceCC1101ExtCallback callb
* *
* @return true if TX complete * @return true if TX complete
*/ */
bool subghz_device_cc1101_ext_is_async_tx_complete(); bool subghz_device_cc1101_ext_is_async_tx_complete(void);
/** Stop async transmission and cleanup resources Resets GPIO, TIM2, and DMA1 /** Stop async transmission and cleanup resources Resets GPIO, TIM2, and DMA1
*/ */
void subghz_device_cc1101_ext_stop_async_tx(); void subghz_device_cc1101_ext_stop_async_tx(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -105,6 +105,6 @@ static const FlipperAppPluginDescriptor subghz_device_cc1101_ext_descriptor = {
.entry_point = &subghz_device_cc1101_ext, .entry_point = &subghz_device_cc1101_ext,
}; };
const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep() { const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(void) {
return &subghz_device_cc1101_ext_descriptor; return &subghz_device_cc1101_ext_descriptor;
} }

View file

@ -5,4 +5,4 @@
typedef struct SubGhzDeviceCC1101Ext SubGhzDeviceCC1101Ext; typedef struct SubGhzDeviceCC1101Ext SubGhzDeviceCC1101Ext;
const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(); const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(void);

View file

@ -1,7 +1,11 @@
# Apps Assets folder Example # Apps Assets folder Example {#example_app_assets}
This example shows how to use the Apps Assets folder to store data that is not part of the application itself, but is required for its operation, and that data is provided with the application. This example shows how to use the Apps Assets folder to store data that is not part of the application itself, but is required for its operation, and that data is provided with the application.
## Source code
Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_apps_assets).
## What is the Apps Assets Folder? ## What is the Apps Assets Folder?
The **Apps Assets** folder is a folder where external applications unpack their assets. The **Apps Assets** folder is a folder where external applications unpack their assets.

View file

@ -1,3 +1,7 @@
/**
* @file example_apps_assets.c
* @brief Application assets example.
*/
#include <furi.h> #include <furi.h>
#include <storage/storage.h> #include <storage/storage.h>
#include <toolbox/stream/stream.h> #include <toolbox/stream/stream.h>

View file

@ -1,7 +1,11 @@
# Apps Data folder Example # Apps Data folder Example {#example_app_data}
This example demonstrates how to utilize the Apps Data folder to store data that is not part of the app itself, such as user data, configuration files, and so forth. This example demonstrates how to utilize the Apps Data folder to store data that is not part of the app itself, such as user data, configuration files, and so forth.
## Source code
Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_apps_data).
## What is the Apps Data Folder? ## What is the Apps Data Folder?
The **Apps Data** folder is a folder used to store data for external apps that are not part of the main firmware. The **Apps Data** folder is a folder used to store data for external apps that are not part of the main firmware.

View file

@ -1,3 +1,7 @@
/**
* @file example_apps_data.c
* @brief Application data example.
*/
#include <furi.h> #include <furi.h>
#include <storage/storage.h> #include <storage/storage.h>

View file

@ -57,7 +57,7 @@ static void ble_beacon_app_restore_beacon_state(BleBeaconApp* app) {
app->beacon_data_len = furi_hal_bt_extra_beacon_get_data(app->beacon_data); app->beacon_data_len = furi_hal_bt_extra_beacon_get_data(app->beacon_data);
} }
static BleBeaconApp* ble_beacon_app_alloc() { static BleBeaconApp* ble_beacon_app_alloc(void) {
BleBeaconApp* app = malloc(sizeof(BleBeaconApp)); BleBeaconApp* app = malloc(sizeof(BleBeaconApp));
app->gui = furi_record_open(RECORD_GUI); app->gui = furi_record_open(RECORD_GUI);

View file

@ -1,3 +1,7 @@
/**
* @file ble_beacon_app.h
* @brief BLE beacon example.
*/
#pragma once #pragma once
#include "extra_beacon.h" #include "extra_beacon.h"

View file

@ -1,3 +1,7 @@
/**
* @file example_custom_font.c
* @brief Custom font example.
*/
#include <furi.h> #include <furi.h>
#include <furi_hal.h> #include <furi_hal.h>
@ -7,35 +11,62 @@
//This arrays contains the font itself. You can use any u8g2 font you want //This arrays contains the font itself. You can use any u8g2 font you want
/* /*
Fontname: -Raccoon-Fixed4x6-Medium-R-Normal--6-60-75-75-P-40-ISO10646-1 Fontname: -Misc-Fixed-Medium-R-Normal--6-60-75-75-C-40-ISO10646-1
Copyright: Copyright: Public domain font. Share and enjoy.
Glyphs: 95/203 Glyphs: 191/919
BBX Build Mode: 0 BBX Build Mode: 0
*/ */
const uint8_t u8g2_font_tom_thumb_4x6_tr[725] = const uint8_t u8g2_font_4x6_t_cyrillic[] =
"_\0\2\2\2\3\3\4\4\3\6\0\377\5\377\5\0\0\352\1\330\2\270 \5\340\315\0!\6\265\310" "\277\0\2\2\3\3\2\4\4\4\6\0\377\5\377\5\377\0\356\1\334\2\301 \5\200\315\0!\6\351\310"
"\254\0\42\6\213\313$\25#\10\227\310\244\241\206\12$\10\227\310\215\70b\2%\10\227\310d\324F\1" "\254\0\42\6\223\313$\25#\12\254\310\244\64T\32*\1$\11\263\307\245\241\301H\11%\10\253\310d"
"&\10\227\310(\65R\22'\5\251\313\10(\6\266\310\251\62)\10\226\310\304\224\24\0*\6\217\312\244" "\324F\1&\11\254\310\305\24\253\230\2'\5\321\313\10(\7\362\307\251f\0)\10\262\307\304T)\0"
"\16+\7\217\311\245\225\0,\6\212\310)\0-\5\207\312\14.\5\245\310\4/\7\227\310Ve\4\60" "*\7\253\310\244j\65+\10\253\310\305\264b\2,\6\222\307)\0-\5\213\312\14.\5\311\310\4/"
"\7\227\310-k\1\61\6\226\310\255\6\62\10\227\310h\220\312\1\63\11\227\310h\220\62X\0\64\10\227" "\7\253\310Ve\4\60\10\253\310UCU\0\61\7\253\310%Y\15\62\7\253\310\65S\32\63\10\253\310"
"\310$\65b\1\65\10\227\310\214\250\301\2\66\10\227\310\315\221F\0\67\10\227\310\314TF\0\70\10\227" "\314\224\301\2\64\10\253\310$\65b\1\65\10\253\310\214\250\301\2\66\7\253\310M\325\2\67\10\253\310\314"
"\310\214\64\324\10\71\10\227\310\214\64\342\2:\6\255\311\244\0;\7\222\310e\240\0<\10\227\310\246\32" "TF\0\70\7\253\310\255\326\2\71\7\253\310\265\344\2:\6\341\310\304\0;\7\252\307e\250\0<\10"
"d\20=\6\217\311l\60>\11\227\310d\220A*\1\77\10\227\310\314\224a\2@\10\227\310UC\3" "\253\310\246\32d\20=\6\233\311l\60>\11\253\310d\220A*\1\77\11\253\310h\220\62L\0@\7"
"\1A\10\227\310UC\251\0B\10\227\310\250\264\322\2C\7\227\310\315\32\10D\10\227\310\250d-\0" "\253\310-\33\10A\10\253\310UC\251\0B\10\253\310\250\264\322\2C\10\253\310U\62U\0D\10\253"
"E\10\227\310\214\70\342\0F\10\227\310\214\70b\4G\10\227\310\315\221\222\0H\10\227\310$\65\224\12" "\310\250d-\0E\10\253\310\214\250\342\0F\10\253\310\214\250b\4G\10\253\310\315\244\222\0H\10\253"
"I\7\227\310\254X\15J\7\227\310\226\252\2K\10\227\310$\265\222\12L\7\227\310\304\346\0M\10\227" "\310$\65\224\12I\7\253\310\254X\15J\7\253\310\226\252\2K\10\253\310$\265\222\12L\7\253\310\304"
"\310\244\61\224\12N\10\227\310\244q\250\0O\7\227\310UV\5P\10\227\310\250\264b\4Q\10\227\310" "\346\0M\10\253\310\244\61\224\12N\10\253\310\252\241$\0O\7\253\310UV\5P\10\253\310\250\264b"
"Uj$\1R\10\227\310\250\64V\1S\10\227\310m\220\301\2T\7\227\310\254\330\2U\7\227\310$" "\4Q\10\263\307UV\15\2R\10\253\310\250\264\222\12S\10\253\310m\220\301\2T\7\253\310\254\330\2"
"W\22V\10\227\310$\253L\0W\10\227\310$\65\206\12X\10\227\310$\325R\1Y\10\227\310$U" "U\7\253\310$\327\10V\10\253\310$k\244\4W\10\253\310$\65\206\12X\10\253\310$\325R\1Y"
"V\0Z\7\227\310\314T\16[\7\227\310\214X\16\134\10\217\311d\220A\0]\7\227\310\314r\4^" "\10\253\310$UV\0Z\7\253\310\314T\16[\6\352\310\254J\134\11\253\310\304\14\62\210\1]\6\252"
"\5\213\313\65_\5\207\310\14`\6\212\313\304\0a\7\223\310\310\65\2b\10\227\310D\225\324\2c\7" "\310\250j^\5\223\313\65_\5\213\307\14`\6\322\313\304\0a\7\243\310-\225\4b\10\253\310D\225"
"\223\310\315\14\4d\10\227\310\246\245\222\0e\6\223\310\235\2f\10\227\310\246\264b\2g\10\227\307\35" "\324\2c\7\243\310\315\14\4d\10\253\310\246\245\222\0e\6\243\310USf\10\253\310\246\264b\2g"
"\61%\0h\10\227\310D\225\254\0i\6\265\310\244\1j\10\233\307f\30U\5k\10\227\310\304\264T" "\10\253\307\255$\27\0h\10\253\310D\225\254\0i\10\253\310e$\323\0j\10\263\307fX.\0k"
"\1l\7\227\310\310\326\0m\7\223\310<R\0n\7\223\310\250d\5o\7\223\310U\252\2p\10\227" "\10\253\310\304\264\222\12l\7\253\310\310\326\0m\10\243\310\244\241T\0n\7\243\310\250d\5o\7\243"
"\307\250\244V\4q\10\227\307-\225d\0r\6\223\310\315\22s\10\223\310\215\70\22\0t\10\227\310\245" "\310U\252\2p\10\253\307\250\264b\4q\10\253\307-\225d\0r\10\243\310\244\25#\0s\10\243\310"
"\25\243\0u\7\223\310$+\11v\10\223\310$\65R\2w\7\223\310\244q\4x\7\223\310\244\62\25" "\215\14\26\0t\10\253\310\245\25\63\10u\7\243\310$+\11v\7\243\310$\253\2w\10\243\310$\65"
"y\11\227\307$\225dJ\0z\7\223\310\254\221\6{\10\227\310\251\32D\1|\6\265\310(\1}\11" "T\0x\7\243\310\244\62\25y\10\253\307$\225\344\2z\7\243\310\314\224\6{\10\263\307\246$k\20"
"\227\310\310\14RR\0~\6\213\313\215\4\0\0\0\4\377\377\0"; "|\6\351\310\14\1}\11\263\307d\20UL\21~\7\224\313%\225\0\0\0\0\4\377\377\4\1\11\253"
"\310\244\261\342\0\4\2\11\253\310\214\250\222\12\4\3\10\253\310\16Y\2\4\4\11\253\310M\225\201\0\4"
"\5\11\253\310m\220\301\2\4\6\10\253\310\254X\15\4\7\11\253\310\244\221b\32\4\10\10\253\310\226\252"
"\2\4\11\11\254\310L\325Z\2\4\12\11\254\310\244\326JK\4\13\11\253\310\250\250\222\12\4\14\10\253"
"\310\312\264\12\4\16\11\263\307\244\32u\2\4\17\11\263\307$\327H\11\4\20\11\253\310UC\251\0\4"
"\21\11\253\310\214\250\322\2\4\22\11\253\310\250\264\322\2\4\23\10\253\310\214\330\4\4\24\11\263\307\254\245"
"\206\12\4\25\11\253\310\214\250\342\0\4\26\12\253\310\244\221\322H\1\4\27\12\253\310h\220\62X\0\4"
"\30\11\253\310\304\64T\14\4\31\11\263\307\315\64T\14\4\32\11\253\310$\265\222\12\4\33\10\253\310-"
"W\0\4\34\11\253\310\244\241\254\0\4\35\11\253\310$\65\224\12\4\36\10\253\310UV\5\4\37\10\253"
"\310\214\344\12\4 \11\253\310\250\264b\4\4!\11\253\310U\62U\0\4\42\10\253\310\254\330\2\4#"
"\11\263\307$\253L\21\4$\12\253\310\245\221FJ\0\4%\11\253\310$\325R\1\4&\10\253\310$"
"\327\10\4'\11\253\310$\225d\1\4(\11\253\310$\65\216\0\4)\12\264\307\244\326#\203\0\4*"
"\13\254\310h\220\201LI\1\4+\12\254\310D\271\324H\1\4,\11\253\310\304\250\322\2\4-\11\253"
"\310h\220\344\2\4.\12\254\310\244\244.\225\0\4/\11\253\310\255\264T\0\4\60\10\243\310-\225\4"
"\4\61\11\253\310\315\221*\0\4\62\11\243\310\14\225\26\0\4\63\10\243\310\214X\2\4\64\11\253\307-"
"\65T\0\4\65\7\243\310US\4\66\11\244\310$S%\1\4\67\11\243\310\254\14\26\0\4\70\11\243"
"\310\244\61T\0\4\71\11\253\310\244\326P\1\4:\10\243\310$\265\12\4;\7\243\310-+\4<\11"
"\243\310\244\241T\0\4=\11\243\310\244\241T\0\4>\10\243\310U\252\2\4\77\10\243\310\214d\5\4"
"@\11\253\307\250\264b\4\4A\10\243\310\315\14\4\4B\10\243\310\254X\1\4C\11\253\307$\225\344"
"\2\4D\12\263\307\305\224T\231\0\4E\10\243\310\244\62\25\4F\11\253\307$k\304\0\4G\11\243"
"\310$\225d\0\4H\10\243\310\244q\4\4I\11\254\307\244\364\310 \4J\12\244\310h SR\0"
"\4K\11\244\310\304\245F\12\4L\11\243\310D\225\26\0\4M\10\243\310H\271\0\4N\12\244\310\244"
"\244\226J\0\4O\10\243\310\255\264\2\4Q\10\253\310\244\326\24\4R\11\263\307D\25U\31\4S\11"
"\253\310\246\64b\4\4T\11\243\310\215\224\201\0\4U\11\243\310\215\14\26\0\4V\11\253\310e$\323"
"\0\4W\11\253\310\244\14d\32\4X\11\263\307fX.\0\4Y\10\244\310\251\326\22\4Z\11\244\310"
"\244\264\322\22\4[\11\253\310D\25U\1\4\134\10\253\310\312\264\12\4^\11\263\307\244\32u\2\4_"
"\11\253\307$k\244\4\4\220\10\253\310\16Y\2\4\221\10\243\310\16\31\1\4\222\11\253\310\251\264b\2"
"\4\223\11\243\310\251\264\22\0\0";
// Screen is 128x64 px // Screen is 128x64 px
static void app_draw_callback(Canvas* canvas, void* ctx) { static void app_draw_callback(Canvas* canvas, void* ctx) {
@ -43,10 +74,11 @@ static void app_draw_callback(Canvas* canvas, void* ctx) {
canvas_clear(canvas); canvas_clear(canvas);
canvas_set_custom_u8g2_font(canvas, u8g2_font_tom_thumb_4x6_tr); canvas_set_custom_u8g2_font(canvas, u8g2_font_4x6_t_cyrillic);
canvas_draw_str(canvas, 0, 6, "This is a tiny custom font"); canvas_draw_str(canvas, 0, 6, "This is a tiny custom font");
canvas_draw_str(canvas, 0, 12, "012345.?! ,:;\"\'@#$%"); canvas_draw_str(canvas, 0, 12, "012345.?! ,:;\"\'@#$%");
canvas_draw_str(canvas, 0, 18, "И немного юникода");
} }
static void app_input_callback(InputEvent* input_event, void* ctx) { static void app_input_callback(InputEvent* input_event, void* ctx) {

View file

@ -1,11 +1,21 @@
# Application icons # Application icons {#example_app_images}
## Source code
Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_images).
## General principle
To use icons, do the following: To use icons, do the following:
* add a line to the application manifest: `fap_icon_assets="folder"`, where `folder` points to the folder where your icons are located
* add `#include "application_id_icons.h"` to the application code, where `application_id` is the appid from the manifest * Add a line to the application manifest: `fap_icon_assets="folder"`, where `folder` points to the folder where your icons are located
* every icon in the folder will be available as a `I_icon_name` variable, where `icon_name` is the name of the icon file without the extension * Add `#include "application_id_icons.h"` to the application code, where `application_id` is the appid from the manifest
* Every icon in the folder will be available as a `I_icon_name` variable, where `icon_name` is the name of the icon file without the extension
## Example ## Example
We have an application with the following manifest: We have an application with the following manifest:
``` ```
App( App(
appid="example_images", appid="example_images",
@ -17,6 +27,7 @@ App(
So the icons are in the `images` folder and will be available in the generated `example_images_icons.h` file. So the icons are in the `images` folder and will be available in the generated `example_images_icons.h` file.
The example code is located in `example_images_main.c` and contains the following line: The example code is located in `example_images_main.c` and contains the following line:
``` ```
#include "example_images_icons.h" #include "example_images_icons.h"
``` ```

View file

@ -1,3 +1,7 @@
/**
* @file example_images.c
* @brief Custom images example.
*/
#include <furi.h> #include <furi.h>
#include <furi_hal.h> #include <furi_hal.h>
@ -9,7 +13,7 @@
#include "example_images_icons.h" #include "example_images_icons.h"
typedef struct { typedef struct {
uint8_t x, y; int32_t x, y;
} ImagePosition; } ImagePosition;
static ImagePosition image_position = {.x = 0, .y = 0}; static ImagePosition image_position = {.x = 0, .y = 0};
@ -19,7 +23,7 @@ static void app_draw_callback(Canvas* canvas, void* ctx) {
UNUSED(ctx); UNUSED(ctx);
canvas_clear(canvas); canvas_clear(canvas);
canvas_draw_icon(canvas, image_position.x % 128, image_position.y % 64, &I_dolphin_71x25); canvas_draw_icon(canvas, image_position.x, image_position.y, &I_dolphin_71x25);
} }
static void app_input_callback(InputEvent* input_event, void* ctx) { static void app_input_callback(InputEvent* input_event, void* ctx) {

View file

@ -1,5 +1,7 @@
/* /**
* An example of a plugin host application. * @file example_plugins.c
* @brief Plugin host application example.
*
* Loads a single plugin and calls its methods. * Loads a single plugin and calls its methods.
*/ */

View file

@ -1,5 +1,7 @@
/* /**
* An example of an advanced plugin host application. * @file example_plugins_multi.c
* @brief Advanced plugin host application example.
*
* It uses PluginManager to load all plugins from a directory * It uses PluginManager to load all plugins from a directory
*/ */

View file

@ -1,10 +1,15 @@
/* A simple plugin implementing example_plugins application's plugin interface */ /**
* @file plugin1.c
* @brief Plugin example 1.
*
* A simple plugin implementing example_plugins application's plugin interface
*/
#include "plugin_interface.h" #include "plugin_interface.h"
#include <flipper_application/flipper_application.h> #include <flipper_application/flipper_application.h>
static int example_plugin1_method1() { static int example_plugin1_method1(void) {
return 42; return 42;
} }
@ -27,6 +32,6 @@ static const FlipperAppPluginDescriptor example_plugin1_descriptor = {
}; };
/* Plugin entry point - must return a pointer to const descriptor */ /* Plugin entry point - must return a pointer to const descriptor */
const FlipperAppPluginDescriptor* example_plugin1_ep() { const FlipperAppPluginDescriptor* example_plugin1_ep(void) {
return &example_plugin1_descriptor; return &example_plugin1_descriptor;
} }

View file

@ -1,10 +1,15 @@
/* Second plugin implementing example_plugins application's plugin interface */ /**
* @file plugin2.c
* @brief Plugin example 2.
*
* Second plugin implementing example_plugins application's plugin interface
*/
#include "plugin_interface.h" #include "plugin_interface.h"
#include <flipper_application/flipper_application.h> #include <flipper_application/flipper_application.h>
static int example_plugin2_method1() { static int example_plugin2_method1(void) {
return 1337; return 1337;
} }
@ -27,6 +32,6 @@ static const FlipperAppPluginDescriptor example_plugin2_descriptor = {
}; };
/* Plugin entry point - must return a pointer to const descriptor */ /* Plugin entry point - must return a pointer to const descriptor */
const FlipperAppPluginDescriptor* example_plugin2_ep() { const FlipperAppPluginDescriptor* example_plugin2_ep(void) {
return &example_plugin2_descriptor; return &example_plugin2_descriptor;
} }

View file

@ -1,12 +1,16 @@
/**
* @file plugin_interface.h
* @brief Example plugin interface.
*
* Common interface between a plugin and host application
*/
#pragma once #pragma once
/* Common interface between a plugin and host application */
#define PLUGIN_APP_ID "example_plugins" #define PLUGIN_APP_ID "example_plugins"
#define PLUGIN_API_VERSION 1 #define PLUGIN_API_VERSION 1
typedef struct { typedef struct {
const char* name; const char* name;
int (*method1)(); int (*method1)(void);
int (*method2)(int, int); int (*method2)(int, int);
} ExamplePlugin; } ExamplePlugin;

View file

@ -8,7 +8,7 @@ void app_api_accumulator_set(uint32_t value) {
accumulator = value; accumulator = value;
} }
uint32_t app_api_accumulator_get() { uint32_t app_api_accumulator_get(void) {
return accumulator; return accumulator;
} }

View file

@ -1,9 +1,12 @@
#pragma once /**
* @file app_api.h
/* * @brief Application API example.
*
* This file contains an API that is internally implemented by the application * This file contains an API that is internally implemented by the application
* It is also exposed to plugins to allow them to use the application's API. * It is also exposed to plugins to allow them to use the application's API.
*/ */
#pragma once
#include <stdint.h> #include <stdint.h>
#ifdef __cplusplus #ifdef __cplusplus
@ -12,7 +15,7 @@ extern "C" {
void app_api_accumulator_set(uint32_t value); void app_api_accumulator_set(uint32_t value);
uint32_t app_api_accumulator_get(); uint32_t app_api_accumulator_get(void);
void app_api_accumulator_add(uint32_t value); void app_api_accumulator_add(uint32_t value);

View file

@ -1,4 +1,7 @@
/* /**
* @file plugin1.c
* @brief Plugin example 1.
*
* This plugin uses both firmware's API interface and private application headers. * This plugin uses both firmware's API interface and private application headers.
* It can be loaded by a plugin manager that uses CompoundApiInterface, * It can be loaded by a plugin manager that uses CompoundApiInterface,
* which combines both interfaces. * which combines both interfaces.
@ -15,7 +18,7 @@ static void advanced_plugin1_method1(int arg1) {
app_api_accumulator_add(arg1); app_api_accumulator_add(arg1);
} }
static void advanced_plugin1_method2() { static void advanced_plugin1_method2(void) {
/* Accumulator value is stored inside host application */ /* Accumulator value is stored inside host application */
FURI_LOG_I("TEST", "Plugin 1, accumulator: %lu", app_api_accumulator_get()); FURI_LOG_I("TEST", "Plugin 1, accumulator: %lu", app_api_accumulator_get());
} }
@ -35,6 +38,6 @@ static const FlipperAppPluginDescriptor advanced_plugin1_descriptor = {
}; };
/* Plugin entry point - must return a pointer to const descriptor */ /* Plugin entry point - must return a pointer to const descriptor */
const FlipperAppPluginDescriptor* advanced_plugin1_ep() { const FlipperAppPluginDescriptor* advanced_plugin1_ep(void) {
return &advanced_plugin1_descriptor; return &advanced_plugin1_descriptor;
} }

View file

@ -1,4 +1,7 @@
/* /**
* @file plugin2.c
* @brief Plugin example 2.
*
* This plugin uses both firmware's API interface and private application headers. * This plugin uses both firmware's API interface and private application headers.
* It can be loaded by a plugin manager that uses CompoundApiInterface, * It can be loaded by a plugin manager that uses CompoundApiInterface,
* which combines both interfaces. * which combines both interfaces.
@ -15,7 +18,7 @@ static void advanced_plugin2_method1(int arg1) {
app_api_accumulator_mul(arg1); app_api_accumulator_mul(arg1);
} }
static void advanced_plugin2_method2() { static void advanced_plugin2_method2(void) {
/* Accumulator value is stored inside host application */ /* Accumulator value is stored inside host application */
FURI_LOG_I("TEST", "Plugin 2, accumulator: %lu", app_api_accumulator_get()); FURI_LOG_I("TEST", "Plugin 2, accumulator: %lu", app_api_accumulator_get());
} }
@ -35,6 +38,6 @@ static const FlipperAppPluginDescriptor advanced_plugin2_descriptor = {
}; };
/* Plugin entry point - must return a pointer to const descriptor */ /* Plugin entry point - must return a pointer to const descriptor */
const FlipperAppPluginDescriptor* advanced_plugin2_ep() { const FlipperAppPluginDescriptor* advanced_plugin2_ep(void) {
return &advanced_plugin2_descriptor; return &advanced_plugin2_descriptor;
} }

View file

@ -1,12 +1,16 @@
/**
* @file plugin_interface.h
* @brief Example plugin interface.
*
* Common interface between a plugin and host application
*/
#pragma once #pragma once
/* Common interface between a plugin and host application */
#define PLUGIN_APP_ID "example_plugins_advanced" #define PLUGIN_APP_ID "example_plugins_advanced"
#define PLUGIN_API_VERSION 1 #define PLUGIN_API_VERSION 1
typedef struct { typedef struct {
const char* name; const char* name;
void (*method1)(int); void (*method1)(int);
void (*method2)(); void (*method2)(void);
} AdvancedPlugin; } AdvancedPlugin;

View file

@ -1,8 +1,14 @@
# 1-Wire Thermometer # 1-Wire Thermometer {#example_thermo}
This example application demonstrates the use of the 1-Wire library with a DS18B20 thermometer. This example application demonstrates the use of the 1-Wire library with a DS18B20 thermometer.
It also covers basic GUI, input handling, threads and localisation. It also covers basic GUI, input handling, threads and localisation.
## Source code
Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_thermo).
## Electrical connections ## Electrical connections
Before launching the application, connect the sensor to Flipper's external GPIO according to the table below: Before launching the application, connect the sensor to Flipper's external GPIO according to the table below:
| DS18B20 | Flipper | | DS18B20 | Flipper |
| :-----: | :-----: | | :-----: | :-----: |
@ -15,12 +21,14 @@ Before launching the application, connect the sensor to Flipper's external GPIO
*NOTE 2*: For any other pin than 17, connect an external 4.7k pull-up resistor to pin 9. *NOTE 2*: For any other pin than 17, connect an external 4.7k pull-up resistor to pin 9.
## Launching the application ## Launching the application
In order to launch this demo, follow the steps below: In order to launch this demo, follow the steps below:
1. Make sure your Flipper has an SD card installed. 1. Make sure your Flipper has an SD card installed.
2. Connect your Flipper to the computer via a USB cable. 2. Connect your Flipper to the computer via a USB cable.
3. Run `./fbt launch APPSRC=example_thermo` in your terminal emulator of choice. 3. Run `./fbt launch APPSRC=example_thermo` in your terminal emulator of choice.
## Changing the data pin ## Changing the data pin
It is possible to use other GPIO pin as a 1-Wire data pin. In order to change it, set the `THERMO_GPIO_PIN` macro to any of the options listed below: It is possible to use other GPIO pin as a 1-Wire data pin. In order to change it, set the `THERMO_GPIO_PIN` macro to any of the options listed below:
```c ```c

Some files were not shown because too many files have changed in this diff Show more