Merge remote-tracking branch 'origin/dev' into release-candidate

This commit is contained in:
Aleksandr Kutuzov 2022-09-20 14:44:52 +09:00
commit 7e86f634ba
1069 changed files with 14335 additions and 4967 deletions

View File

@ -1,86 +1,191 @@
---
Language: Cpp
AccessModifierOffset: -4
AlignAfterOpenBracket: AlwaysBreak
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignArrayOfStructures: None
AlignConsecutiveMacros: None
AlignConsecutiveAssignments: None
AlignConsecutiveBitFields: None
AlignConsecutiveDeclarations: None
AlignEscapedNewlines: Left
AlignOperands: true
AlignOperands: Align
AlignTrailingComments: false
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: true
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros:
- __capability
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: true
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: false
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeComma
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: false
ColumnLimit: 99
CommentPragmas: '^ IWYU pragma:'
QualifierAlignment: Leave
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
PackConstructorInitializers: BinPack
BasedOnStyle: ''
ConstructorInitializerAllOnOneLineOrOnePerLine: false
AllowAllConstructorInitializersOnNextLine: true
FixNamespaceComments: false
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '.*'
Priority: 1
SortPriority: 0
CaseSensitive: false
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: '.*'
Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseLabels: false
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentExternBlock: AfterExternBlock
IndentRequires: false
IndentWidth: 4
IndentWrappedFunctionNames: true
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
LambdaBodyIndentation: Signature
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
# Taken from git's rules
PenaltyBreakAssignment: 10
PenaltyBreakBeforeFirstCallParameter: 30
PenaltyBreakComment: 10
PenaltyBreakFirstLessLess: 0
PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 10
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 100
PenaltyReturnTypeOnItsOwnLine: 60
PenaltyIndentedWhitespace: 0
PointerAlignment: Left
PPIndentWidth: -1
ReferenceAlignment: Pointer
ReflowComments: false
SortIncludes: false
RemoveBracesLLVM: false
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortIncludes: Never
SortJavaStaticImport: Before
SortUsingDeclarations: false
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: Never
SpaceBeforeParensOptions:
AfterControlStatements: false
AfterForeachMacros: false
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: false
AfterOverloadedOperator: false
BeforeNonEmptyParentheses: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp03
SpaceBeforeSquareBrackets: false
BitFieldColonSpacing: Both
Standard: c++03
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
UseCRLF: false
UseTab: Never
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
...

102
.github/CODEOWNERS vendored
View File

@ -2,82 +2,58 @@
* @skotopes @DrZlo13 @hedger
# Apps
/applications/about/ @skotopes @DrZlo13 @hedger
/applications/accessor/ @skotopes @DrZlo13 @hedger
/applications/archive/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/bad_usb/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/bt/ @skotopes @DrZlo13 @hedger @gornekich
/applications/cli/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/crypto/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug_tools/ @skotopes @DrZlo13 @hedger
/applications/desktop/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/dialogs/ @skotopes @DrZlo13 @hedger
/applications/dolphin/ @skotopes @DrZlo13 @hedger
/applications/gpio/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/gui/ @skotopes @DrZlo13 @hedger
/applications/ibutton/ @skotopes @DrZlo13 @hedger @gsurkov
/applications/infrared/ @skotopes @DrZlo13 @hedger @gsurkov
/applications/input/ @skotopes @DrZlo13 @hedger
/applications/lfrfid/ @skotopes @DrZlo13 @hedger
/applications/lfrfid_debug/ @skotopes @DrZlo13 @hedger
/applications/loader/ @skotopes @DrZlo13 @hedger
/applications/music_player/ @skotopes @DrZlo13 @hedger
/applications/nfc/ @skotopes @DrZlo13 @hedger @gornekich
/applications/notification/ @skotopes @DrZlo13 @hedger
/applications/power/ @skotopes @DrZlo13 @hedger
/applications/rpc/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/snake_game/ @skotopes @DrZlo13 @hedger
/applications/storage/ @skotopes @DrZlo13 @hedger
/applications/storage_settings/ @skotopes @DrZlo13 @hedger
/applications/subghz/ @skotopes @DrZlo13 @hedger @Skorpionm
/applications/system/ @skotopes @DrZlo13 @hedger
/applications/u2f/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/unit_tests/ @skotopes @DrZlo13 @hedger
/applications/updater/ @skotopes @DrZlo13 @hedger
/applications/debug/bt_debug_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/debug/accessor/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/battery_test_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/debug/bt_debug_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/debug/file_browser_test/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/lfrfid_debug/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/text_box_test/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/uart_echo/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/usb_mouse/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/usb_test/ @skotopes @DrZlo13 @hedger @nminaylov
# Assets
/assets/ @skotopes @DrZlo13 @hedger
/applications/main/archive/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/main/bad_usb/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/main/gpio/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/main/ibutton/ @skotopes @DrZlo13 @hedger @gsurkov
/applications/main/infrared/ @skotopes @DrZlo13 @hedger @gsurkov
/applications/main/nfc/ @skotopes @DrZlo13 @hedger @gornekich
/applications/main/subghz/ @skotopes @DrZlo13 @hedger @Skorpionm
/applications/main/u2f/ @skotopes @DrZlo13 @hedger @nminaylov
# Furi Core
/furi/ @skotopes @DrZlo13 @hedger
/applications/plugins/bt_hid_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/plugins/picopass/ @skotopes @DrZlo13 @hedger @gornekich
# Debug tools and plugins
/debug/ @skotopes @DrZlo13 @hedger
/applications/services/bt/ @skotopes @DrZlo13 @hedger @gornekich
/applications/services/cli/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/crypto/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/desktop/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/dolphin/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/power/ @skotopes @DrZlo13 @hedger @gornekich
/applications/services/rpc/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/bt_settings_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/services/desktop_settings/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/dolphin_passport/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/power_settings_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/system/storage_move_to_sd/ @skotopes @DrZlo13 @hedger @nminaylov
# Documentation
/documentation/ @skotopes @DrZlo13 @hedger @drunkbatya
# Firmware targets
/firmware/ @skotopes @DrZlo13 @hedger
/scripts/toolchain/ @skotopes @DrZlo13 @hedger @drunkbatya
# Lib
/lib/FreeRTOS-Kernel/ @skotopes @DrZlo13 @hedger
/lib/FreeRTOS-glue/ @skotopes @DrZlo13 @hedger
/lib/ST25RFAL002/ @skotopes @DrZlo13 @hedger @gornekich
/lib/STM32CubeWB/ @skotopes @DrZlo13 @hedger @gornekich
/lib/app-scened-template/ @skotopes @DrZlo13 @hedger
/lib/callback-connector/ @skotopes @DrZlo13 @hedger
/lib/digital_signal/ @skotopes @DrZlo13 @hedger @gornekich
/lib/drivers/ @skotopes @DrZlo13 @hedger
/lib/fatfs/ @skotopes @DrZlo13 @hedger
/lib/flipper_format/ @skotopes @DrZlo13 @hedger
/lib/fnv1a-hash/ @skotopes @DrZlo13 @hedger
/lib/heatshrink/ @skotopes @DrZlo13 @hedger
/lib/infrared/ @skotopes @DrZlo13 @hedger @gsurkov
/lib/lfrfid/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/libusb_stm32/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/littlefs/ @skotopes @DrZlo13 @hedger
/lib/lfs_config.h @skotopes @DrZlo13 @hedger
/lib/mbedtls/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/micro-ecc/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/microtar/ @skotopes @DrZlo13 @hedger
/lib/mlib/ @skotopes @DrZlo13 @hedger
/lib/nanopb/ @skotopes @DrZlo13 @hedger
/lib/nanopb/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/nfc/ @skotopes @DrZlo13 @hedger @gornekich
/lib/one_wire/ @skotopes @DrZlo13 @hedger
/lib/qrcode/ @skotopes @DrZlo13 @hedger
/lib/one_wire/ @skotopes @DrZlo13 @hedger @gsurkov
/lib/subghz/ @skotopes @DrZlo13 @hedger @Skorpionm
/lib/toolbox/ @skotopes @DrZlo13 @hedger
/lib/u8g2/ @skotopes @DrZlo13 @hedger
/lib/update_util/ @skotopes @DrZlo13 @hedger
# Helper scripts
/scripts/ @skotopes @DrZlo13 @hedger

3
.gitmodules vendored
View File

@ -28,3 +28,6 @@
[submodule "lib/mbedtls"]
path = lib/mbedtls
url = https://github.com/Mbed-TLS/mbedtls.git
[submodule "lib/cxxheaderparser"]
path = lib/cxxheaderparser
url = https://github.com/robotpy/cxxheaderparser.git

View File

@ -31,7 +31,10 @@
],
"postAttachCommands": [
// "attach 1",
"compare-sections",
// "compare-sections",
"source debug/flipperapps.py",
// "source debug/FreeRTOS/FreeRTOS.py",
// "svd_load debug/STM32WB55_CM4.svd"
]
// "showDevDebugOutput": "raw",
},
@ -50,7 +53,8 @@
"attach 1",
"set confirm off",
"set mem inaccessible-by-default off",
"compare-sections",
"source debug/flipperapps.py",
// "compare-sections",
]
// "showDevDebugOutput": "raw",
},
@ -65,6 +69,9 @@
"device": "STM32WB55RG",
"svdFile": "./debug/STM32WB55_CM4.svd",
"rtos": "FreeRTOS",
"postAttachCommands": [
"source debug/flipperapps.py",
]
// "showDevDebugOutput": "raw",
},
{
@ -73,7 +80,7 @@
"request": "launch",
"program": "./lib/scons/scripts/scons.py",
"args": [
"sdk"
"plugin_dist"
]
},
{

View File

@ -12,6 +12,9 @@
"cortex-debug.openocdPath.windows": "${workspaceFolder}/toolchain/i686-windows/openocd/bin/openocd.exe",
"cortex-debug.openocdPath.linux": "${workspaceFolder}/toolchain/x86_64-linux/openocd/bin/openocd",
"cortex-debug.openocdPath.osx": "${workspaceFolder}/toolchain/x86_64-darwin/openocd/bin/openocd",
"cortex-debug.gdbPath.windows": "${workspaceFolder}/toolchain/i686-windows/bin/arm-none-eabi-gdb-py.bat",
"cortex-debug.gdbPath.linux": "${workspaceFolder}/toolchain/x86_64-linux/bin/arm-none-eabi-gdb-py",
"cortex-debug.gdbPath.osx": "${workspaceFolder}/toolchain/x86_64-darwin/bin/arm-none-eabi-gdb-py",
"editor.formatOnSave": true,
"files.associations": {
"*.scons": "python",

View File

@ -93,11 +93,41 @@
"type": "shell",
"command": "./fbt FIRMWARE_APP_SET=unit_tests FORCE=1 flash_usb"
},
{
"label": "[Debug] Flash (USB, with resources)",
"group": "build",
"type": "shell",
"command": "./fbt FORCE=1 flash_usb_full"
},
{
"label": "[Release] Flash (USB, with resources)",
"group": "build",
"type": "shell",
"command": "./fbt COMPACT=1 DEBUG=0 FORCE=1 flash_usb_full"
},
{
"label": "[Debug] Build FAPs",
"group": "build",
"type": "shell",
"command": "./fbt plugin_dist"
},
{
"label": "[Release] Build FAPs",
"group": "build",
"type": "shell",
"command": "./fbt COMPACT=1 DEBUG=0 plugin_dist"
},
{
"label": "[Debug] Launch App on Flipper",
"group": "build",
"type": "shell",
"command": "./fbt launch_app APPSRC=${relativeFileDirname}"
},
{
"label": "[Release] Launch App on Flipper",
"group": "build",
"type": "shell",
"command": "./fbt COMPACT=1 DEBUG=0 launch_app APPSRC=${relativeFileDirname}"
}
]
}

View File

@ -14,6 +14,10 @@ You should clone with
$ git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git
```
# Read the Docs
Check out details on [how to build firmware](documentation/fbt.md), [write applications](documentation/AppsOnSDCard.md), [un-brick your device](documentation/KeyCombo.md) and more in `documentation` folder.
# Update firmware
[Get Latest Firmware from Update Server](https://update.flipperzero.one/)

View File

@ -9,9 +9,10 @@
import os
import subprocess
DefaultEnvironment(tools=[])
EnsurePythonVersion(3, 8)
DefaultEnvironment(tools=[])
# Progress(["OwO\r", "owo\r", "uwu\r", "owo\r"], interval=15)
@ -58,6 +59,8 @@ distenv = coreenv.Clone(
"-ex",
"source debug/FreeRTOS/FreeRTOS.py",
"-ex",
"source debug/flipperapps.py",
"-ex",
"source debug/PyCortexMDebug/PyCortexMDebug.py",
"-ex",
"svd_load ${SVD_FILE}",
@ -160,6 +163,28 @@ if GetOption("fullenv") or any(
basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"])
distenv.Default(basic_dist)
dist_dir = distenv.GetProjetDirName()
plugin_dist = [
distenv.Install(
f"#/dist/{dist_dir}/apps/debug_elf",
firmware_env["FW_EXTAPPS"]["debug"].values(),
),
*(
distenv.Install(f"#/dist/{dist_dir}/apps/{dist_entry[0]}", dist_entry[1])
for dist_entry in firmware_env["FW_EXTAPPS"]["dist"].values()
),
]
Depends(plugin_dist, firmware_env["FW_EXTAPPS"]["validators"].values())
Alias("plugin_dist", plugin_dist)
# distenv.Default(plugin_dist)
plugin_resources_dist = list(
distenv.Install(f"#/assets/resources/apps/{dist_entry[0]}", dist_entry[1])
for dist_entry in firmware_env["FW_EXTAPPS"]["dist"].values()
)
distenv.Depends(firmware_env["FW_RESOURCES"], plugin_resources_dist)
# Target for bundling core2 package for qFlipper
copro_dist = distenv.CoproBuilder(
distenv.Dir("assets/core2_firmware"),
@ -240,7 +265,6 @@ firmware_env.Append(
"site_scons",
"scripts",
# Extra files
"applications/extapps.scons",
"SConstruct",
"firmware.scons",
"fbt_options.py",

View File

@ -1,38 +1,89 @@
# Structure
- `about` - Small About application that shows flipper info
## debug
Applications for factory testing the Flipper.
- `accessor` - Wiegand server
- `battery_test_app` - Battery debug app
- `blink_test` - LED blinker
- `bt_debug_app` - BT test app. Requires full BT stack installed
- `display_test` - Various display tests & tweaks
- `file_browser_test` - Test UI for file picker
- `keypad_test` - Keypad test
- `lfrfid_debug` - LF RFID debug tool
- `text_box_test` - UI tests
- `uart_echo` - UART mode test
- `unit_tests` - Unit tests
- `usb_mouse` - USB HID test
- `usb_test` - Other USB tests
- `vibro_test` - Vibro test
## main
Applications for main Flipper menu.
- `archive` - Archive and file manager
- `bad_usb` - Bad USB application
- `fap_loader` - External applications loader
- `gpio` - GPIO application: includes USART bridge and GPIO control
- `ibutton` - iButton application, onewire keys and more
- `infrared` - Infrared application, controls your IR devices
- `lfrfid` - LF RFID application
- `nfc` - NFC application, HF rfid, EMV and etc
- `subghz` - SubGhz application, 433 fobs and etc
- `u2f` - U2F Application
## plugins
Extra apps for Plugins & App Loader menus.
- `bt_hid_app` - BT Remote controller
- `music_player` - Music player app (demo)
- `picopass` - Picopass tool
- `snake_game` - Snake game application
## services
Background services providing system APIs to applications.
- `applications.h` - Firmware application list header
- `bt` - BLE service and application
- `cli` - Console service and API
- `crypto` - Crypto cli tools
- `debug_tools` - Different tools that we use for debug
- `desktop` - Desktop service
- `dialogs` - Dialogs service: GUI Dialogs for your app
- `dolphin` - Dolphin service and supplementary apps
- `gpio` - GPIO application: includes USART bridge and GPIO control
- `gui` - GUI service and API
- `ibutton` - iButton application, onewire keys and more
- `input` - Input service
- `infrared` - Infrared application, controls your IR devices
- `lfrfid` - LF RFID application
- `lfrfid_debug` - LF RFID debug tool
- `loader` - Application loader service
- `music_player` - Music player app (demo)
- `nfc` - NFC application, HF rfid, EMV and etc
- `notification` - Notification service
- `power` - Power service
- `power_observer` - Power debug tool
- `rpc` - RPC service and API
- `scened_app_example` - C++ application example
- `snake_game` - Snake game application
- `storage` - Storage service, internal + sdcard
- `storage_settings` - Storage settings app
- `subghz` - SubGhz application, 433 fobs and etc
- `system` - System settings, tools and API
- `tests` - Unit tests and etc
- `u2f` - U2F Application
- `updater` - Update service & application
- `application.h` - Firmware application list header
## settings
Small applications providing configuration for basic firmware and its services.
- `about` - Small About application that shows flipper info
- `bt_settings_app` - Bluetooth options
- `desktop_settings` - Desktop configuration
- `dolphin_passport` - Dolphin passport app
- `notification_settings` - LCD brightness, sound volume, etc configuration
- `power_settings_app` - Basic power options
- `storage_settings` - Storage settings app
- `system` - System settings
## system
Utility apps not visible in other menus.
- `storage_move_to_sd` - Data migration tool for internal storage
- `updater` - Update service & application

View File

@ -1,66 +0,0 @@
App(
appid="bt",
name="BtSrv",
apptype=FlipperAppType.SERVICE,
entry_point="bt_srv",
cdefines=["SRV_BT"],
requires=[
"cli",
"dialogs",
],
provides=[
"bt_start",
"bt_settings",
"bt_debug",
],
stack_size=1 * 1024,
order=20,
)
App(
appid="bt_start",
apptype=FlipperAppType.STARTUP,
entry_point="bt_on_system_start",
order=70,
)
App(
appid="bt_settings",
name="Bluetooth",
apptype=FlipperAppType.SETTINGS,
entry_point="bt_settings_app",
stack_size=1 * 1024,
requires=[
"bt",
"gui",
],
order=10,
)
App(
appid="bt_debug",
name="Bluetooth Debug",
apptype=FlipperAppType.DEBUG,
entry_point="bt_debug_app",
stack_size=1 * 1024,
requires=[
"bt",
"gui",
"dialogs",
],
order=110,
)
App(
appid="bt_hid",
name="Bluetooth Remote",
apptype=FlipperAppType.PLUGIN,
entry_point="bt_hid_app",
stack_size=1 * 1024,
cdefines=["APP_BLE_HID"],
requires=[
"bt",
"gui",
],
order=10,
)

View File

@ -7,4 +7,5 @@ App(
requires=["gui"],
stack_size=4 * 1024,
order=40,
fap_category="Debug",
)

View File

@ -0,0 +1,16 @@
App(
appid="debug_apps",
name="Basic debug apps bundle",
apptype=FlipperAppType.METAPACKAGE,
provides=[
"blink_test",
"vibro_test",
"keypad_test",
"usb_test",
"usb_mouse",
"uart_echo",
"display_test",
"text_box_test",
"file_browser_test",
],
)

View File

@ -0,0 +1,14 @@
App(
appid="battery_test",
name="Battery Test",
apptype=FlipperAppType.DEBUG,
entry_point="battery_test_app",
cdefines=["APP_BATTERY_TEST"],
requires=[
"gui",
"power",
],
stack_size=1 * 1024,
order=130,
fap_category="Debug",
)

View File

@ -27,7 +27,7 @@ static void battery_test_battery_info_update_model(void* context) {
.charge = app->info.charge,
.health = app->info.health,
};
battery_info_set_data(app->batery_info, &battery_info_data);
battery_info_set_data(app->battery_info, &battery_info_data);
notification_message(app->notifications, &sequence_display_backlight_on);
}
@ -48,13 +48,13 @@ BatteryTestApp* battery_test_alloc() {
view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
// Views
app->batery_info = battery_info_alloc();
app->battery_info = battery_info_alloc();
view_set_previous_callback(
battery_info_get_view(app->batery_info), battery_test_exit_confirm_view);
battery_info_get_view(app->battery_info), battery_test_exit_confirm_view);
view_dispatcher_add_view(
app->view_dispatcher,
BatteryTestAppViewBatteryInfo,
battery_info_get_view(app->batery_info));
battery_info_get_view(app->battery_info));
app->dialog = dialog_ex_alloc();
dialog_ex_set_header(app->dialog, "Close Battery Test?", 64, 12, AlignCenter, AlignTop);
@ -76,7 +76,7 @@ void battery_test_free(BatteryTestApp* app) {
// Views
view_dispatcher_remove_view(app->view_dispatcher, BatteryTestAppViewBatteryInfo);
battery_info_free(app->batery_info);
battery_info_free(app->battery_info);
view_dispatcher_remove_view(app->view_dispatcher, BatteryTestAppViewExitDialog);
dialog_ex_free(app->dialog);
// View dispatcher

View File

@ -6,14 +6,15 @@
#include <notification/notification.h>
#include <gui/modules/dialog_ex.h>
#include <power/power_settings_app/views/battery_info.h>
// FIXME
#include "../settings/power_settings_app/views/battery_info.h"
typedef struct {
Power* power;
Gui* gui;
NotificationApp* notifications;
ViewDispatcher* view_dispatcher;
BatteryInfo* batery_info;
BatteryInfo* battery_info;
DialogEx* dialog;
PowerInfo info;
} BatteryTestApp;

View File

@ -0,0 +1,11 @@
App(
appid="blink_test",
name="Blink Test",
apptype=FlipperAppType.DEBUG,
entry_point="blink_test_app",
cdefines=["APP_BLINK"],
requires=["gui"],
stack_size=1 * 1024,
order=10,
fap_category="Debug",
)

View File

@ -0,0 +1,18 @@
App(
appid="bt_debug",
name="Bluetooth Debug",
apptype=FlipperAppType.DEBUG,
entry_point="bt_debug_app",
cdefines=["SRV_BT"],
requires=[
"bt",
"gui",
"dialogs",
],
provides=[
"bt_debug",
],
stack_size=1 * 1024,
order=110,
fap_category="Debug",
)

View File

@ -9,7 +9,7 @@
#include <gui/modules/submenu.h>
#include "views/bt_carrier_test.h"
#include "views/bt_packet_test.h"
#include "../bt_settings.h"
#include <bt/bt_settings.h>
typedef struct {
BtSettings settings;

View File

@ -0,0 +1,11 @@
App(
appid="display_test",
name="Display Test",
apptype=FlipperAppType.DEBUG,
entry_point="display_test_app",
cdefines=["APP_DISPLAY_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=120,
fap_category="Debug",
)

View File

@ -0,0 +1,11 @@
App(
appid="file_browser_test",
name="File Browser Test",
apptype=FlipperAppType.DEBUG,
entry_point="file_browser_app",
cdefines=["APP_FILE_BROWSER_TEST"],
requires=["gui"],
stack_size=2 * 1024,
order=150,
fap_category="Debug",
)

View File

@ -0,0 +1,11 @@
App(
appid="keypad_test",
name="Keypad Test",
apptype=FlipperAppType.DEBUG,
entry_point="keypad_test_app",
cdefines=["APP_KEYPAD_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=30,
fap_category="Debug",
)

View File

@ -5,8 +5,11 @@ App(
entry_point="lfrfid_debug_app",
requires=[
"gui",
"lfrfid",
],
provides=[
"lfrfid_debug",
],
stack_size=1 * 1024,
order=100,
fap_category="Debug",
)

View File

@ -0,0 +1,81 @@
#include "lfrfid_debug_i.h"
static bool lfrfid_debug_custom_event_callback(void* context, uint32_t event) {
furi_assert(context);
LfRfidDebug* app = context;
return scene_manager_handle_custom_event(app->scene_manager, event);
}
static bool lfrfid_debug_back_event_callback(void* context) {
furi_assert(context);
LfRfidDebug* app = context;
return scene_manager_handle_back_event(app->scene_manager);
}
static LfRfidDebug* lfrfid_debug_alloc() {
LfRfidDebug* app = malloc(sizeof(LfRfidDebug));
app->view_dispatcher = view_dispatcher_alloc();
app->scene_manager = scene_manager_alloc(&lfrfid_debug_scene_handlers, app);
view_dispatcher_enable_queue(app->view_dispatcher);
view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
view_dispatcher_set_custom_event_callback(
app->view_dispatcher, lfrfid_debug_custom_event_callback);
view_dispatcher_set_navigation_event_callback(
app->view_dispatcher, lfrfid_debug_back_event_callback);
// Open GUI record
app->gui = furi_record_open(RECORD_GUI);
view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
// Submenu
app->submenu = submenu_alloc();
view_dispatcher_add_view(
app->view_dispatcher, LfRfidDebugViewSubmenu, submenu_get_view(app->submenu));
// Tune view
app->tune_view = lfrfid_debug_view_tune_alloc();
view_dispatcher_add_view(
app->view_dispatcher,
LfRfidDebugViewTune,
lfrfid_debug_view_tune_get_view(app->tune_view));
return app;
}
static void lfrfid_debug_free(LfRfidDebug* app) {
furi_assert(app);
// Submenu
view_dispatcher_remove_view(app->view_dispatcher, LfRfidDebugViewSubmenu);
submenu_free(app->submenu);
// Tune view
view_dispatcher_remove_view(app->view_dispatcher, LfRfidDebugViewTune);
lfrfid_debug_view_tune_free(app->tune_view);
// View Dispatcher
view_dispatcher_free(app->view_dispatcher);
// Scene Manager
scene_manager_free(app->scene_manager);
// GUI
furi_record_close(RECORD_GUI);
app->gui = NULL;
free(app);
}
int32_t lfrfid_debug_app(void* p) {
UNUSED(p);
LfRfidDebug* app = lfrfid_debug_alloc();
scene_manager_next_scene(app->scene_manager, LfRfidDebugSceneStart);
view_dispatcher_run(app->view_dispatcher);
lfrfid_debug_free(app);
return 0;
}

View File

@ -0,0 +1,30 @@
#pragma once
#include <furi.h>
#include <furi_hal.h>
#include <gui/gui.h>
#include <gui/view.h>
#include <gui/view_dispatcher.h>
#include <gui/scene_manager.h>
#include <gui/modules/submenu.h>
#include "views/lfrfid_debug_view_tune.h"
#include "scenes/lfrfid_debug_scene.h"
typedef struct LfRfidDebug LfRfidDebug;
struct LfRfidDebug {
Gui* gui;
ViewDispatcher* view_dispatcher;
SceneManager* scene_manager;
// Common Views
Submenu* submenu;
LfRfidTuneView* tune_view;
};
typedef enum {
LfRfidDebugViewSubmenu,
LfRfidDebugViewTune,
} LfRfidDebugView;

View File

@ -0,0 +1,44 @@
#include "../lfrfid_debug_i.h"
typedef enum {
SubmenuIndexTune,
} SubmenuIndex;
static void lfrfid_debug_scene_start_submenu_callback(void* context, uint32_t index) {
LfRfidDebug* app = context;
view_dispatcher_send_custom_event(app->view_dispatcher, index);
}
void lfrfid_debug_scene_start_on_enter(void* context) {
LfRfidDebug* app = context;
Submenu* submenu = app->submenu;
submenu_add_item(
submenu, "Tune", SubmenuIndexTune, lfrfid_debug_scene_start_submenu_callback, app);
submenu_set_selected_item(
submenu, scene_manager_get_scene_state(app->scene_manager, LfRfidDebugSceneStart));
view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidDebugViewSubmenu);
}
bool lfrfid_debug_scene_start_on_event(void* context, SceneManagerEvent event) {
LfRfidDebug* app = context;
bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) {
if(event.event == SubmenuIndexTune) {
scene_manager_next_scene(app->scene_manager, LfRfidDebugSceneTune);
consumed = true;
}
}
return consumed;
}
void lfrfid_debug_scene_start_on_exit(void* context) {
LfRfidDebug* app = context;
submenu_reset(app->submenu);
}

View File

@ -1,4 +1,4 @@
#include "lfrfid_debug_app_scene_tune.h"
#include "../lfrfid_debug_i.h"
#include <furi_hal.h>
static void comparator_trigger_callback(bool level, void* comp_ctx) {
@ -6,32 +6,38 @@ static void comparator_trigger_callback(bool level, void* comp_ctx) {
furi_hal_gpio_write(&gpio_ext_pa7, !level);
}
void LfRfidDebugAppSceneTune::on_enter(LfRfidDebugApp* app, bool /* need_restore */) {
app->view_controller.switch_to<LfRfidViewTuneVM>();
void lfrfid_debug_scene_tune_on_enter(void* context) {
LfRfidDebug* app = context;
furi_hal_gpio_init_simple(&gpio_ext_pa7, GpioModeOutputPushPull);
furi_hal_rfid_comp_set_callback(comparator_trigger_callback, this);
furi_hal_rfid_comp_set_callback(comparator_trigger_callback, app);
furi_hal_rfid_comp_start();
furi_hal_rfid_pins_read();
furi_hal_rfid_tim_read(125000, 0.5);
furi_hal_rfid_tim_read_start();
view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidDebugViewTune);
}
bool LfRfidDebugAppSceneTune::on_event(LfRfidDebugApp* app, LfRfidDebugApp::Event* /* event */) {
bool lfrfid_debug_scene_tune_on_event(void* context, SceneManagerEvent event) {
UNUSED(event);
LfRfidDebug* app = context;
bool consumed = false;
LfRfidViewTuneVM* tune = app->view_controller;
if(tune->is_dirty()) {
furi_hal_rfid_set_read_period(tune->get_ARR());
furi_hal_rfid_set_read_pulse(tune->get_CCR());
if(lfrfid_debug_view_tune_is_dirty(app->tune_view)) {
furi_hal_rfid_set_read_period(lfrfid_debug_view_tune_get_arr(app->tune_view));
furi_hal_rfid_set_read_pulse(lfrfid_debug_view_tune_get_ccr(app->tune_view));
}
return consumed;
}
void LfRfidDebugAppSceneTune::on_exit(LfRfidDebugApp* /* app */) {
void lfrfid_debug_scene_tune_on_exit(void* context) {
UNUSED(context);
furi_hal_rfid_comp_stop();
furi_hal_rfid_comp_set_callback(NULL, NULL);

View File

@ -0,0 +1,30 @@
#include "lfrfid_debug_scene.h"
// Generate scene on_enter handlers array
#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter,
void (*const lfrfid_debug_on_enter_handlers[])(void*) = {
#include "lfrfid_debug_scene_config.h"
};
#undef ADD_SCENE
// Generate scene on_event handlers array
#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event,
bool (*const lfrfid_debug_on_event_handlers[])(void* context, SceneManagerEvent event) = {
#include "lfrfid_debug_scene_config.h"
};
#undef ADD_SCENE
// Generate scene on_exit handlers array
#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit,
void (*const lfrfid_debug_on_exit_handlers[])(void* context) = {
#include "lfrfid_debug_scene_config.h"
};
#undef ADD_SCENE
// Initialize scene handlers configuration structure
const SceneManagerHandlers lfrfid_debug_scene_handlers = {
.on_enter_handlers = lfrfid_debug_on_enter_handlers,
.on_event_handlers = lfrfid_debug_on_event_handlers,
.on_exit_handlers = lfrfid_debug_on_exit_handlers,
.scene_num = LfRfidDebugSceneNum,
};

View File

@ -0,0 +1,29 @@
#pragma once
#include <gui/scene_manager.h>
// Generate scene id and total number
#define ADD_SCENE(prefix, name, id) LfRfidDebugScene##id,
typedef enum {
#include "lfrfid_debug_scene_config.h"
LfRfidDebugSceneNum,
} LfRfidDebugScene;
#undef ADD_SCENE
extern const SceneManagerHandlers lfrfid_debug_scene_handlers;
// Generate scene on_enter handlers declaration
#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*);
#include "lfrfid_debug_scene_config.h"
#undef ADD_SCENE
// Generate scene on_event handlers declaration
#define ADD_SCENE(prefix, name, id) \
bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event);
#include "lfrfid_debug_scene_config.h"
#undef ADD_SCENE
// Generate scene on_exit handlers declaration
#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context);
#include "lfrfid_debug_scene_config.h"
#undef ADD_SCENE

View File

@ -0,0 +1,2 @@
ADD_SCENE(lfrfid_debug, start, Start)
ADD_SCENE(lfrfid_debug, tune, Tune)

View File

@ -0,0 +1,229 @@
#include "lfrfid_debug_view_tune.h"
#include <gui/elements.h>
#define TEMP_STR_LEN 128
struct LfRfidTuneView {
View* view;
};
typedef struct {
bool dirty;
bool fine;
uint32_t ARR;
uint32_t CCR;
int pos;
} LfRfidTuneViewModel;
static void lfrfid_debug_view_tune_draw_callback(Canvas* canvas, void* _model) {
LfRfidTuneViewModel* model = _model;
canvas_set_color(canvas, ColorBlack);
if(model->fine) {
canvas_draw_box(
canvas,
128 - canvas_string_width(canvas, "Fine") - 4,
0,
canvas_string_width(canvas, "Fine") + 4,
canvas_current_font_height(canvas) + 1);
canvas_set_color(canvas, ColorWhite);
}
canvas_draw_str_aligned(canvas, 128 - 2, 2, AlignRight, AlignTop, "Fine");
canvas_set_color(canvas, ColorBlack);
char buffer[TEMP_STR_LEN + 1];
double freq = ((float)SystemCoreClock / ((float)model->ARR + 1));
double duty = ((float)model->CCR + 1) / ((float)model->ARR + 1) * 100.0f;
snprintf(
buffer,
TEMP_STR_LEN,
"%sARR: %lu\n"
"freq = %.4f\n"
"%sCCR: %lu\n"
"duty = %.4f",
model->pos == 0 ? ">" : "",
model->ARR,
freq,
model->pos == 1 ? ">" : "",
model->CCR,
duty);
elements_multiline_text_aligned(canvas, 2, 2, AlignLeft, AlignTop, buffer);
}
static void lfrfid_debug_view_tune_button_up(LfRfidTuneView* tune_view) {
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
if(model->pos > 0) model->pos--;
return true;
});
}
static void lfrfid_debug_view_tune_button_down(LfRfidTuneView* tune_view) {
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
if(model->pos < 1) model->pos++;
return true;
});
}
static void lfrfid_debug_view_tune_button_left(LfRfidTuneView* tune_view) {
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
if(model->pos == 0) {
if(model->fine) {
model->ARR -= 1;
} else {
model->ARR -= 10;
}
} else if(model->pos == 1) {
if(model->fine) {
model->CCR -= 1;
} else {
model->CCR -= 10;
}
}
model->dirty = true;
return true;
});
}
static void lfrfid_debug_view_tune_button_right(LfRfidTuneView* tune_view) {
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
if(model->pos == 0) {
if(model->fine) {
model->ARR += 1;
} else {
model->ARR += 10;
}
} else if(model->pos == 1) {
if(model->fine) {
model->CCR += 1;
} else {
model->CCR += 10;
}
}
model->dirty = true;
return true;
});
}
static void lfrfid_debug_view_tune_button_ok(LfRfidTuneView* tune_view) {
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
model->fine = !model->fine;
return true;
});
}
static bool lfrfid_debug_view_tune_input_callback(InputEvent* event, void* context) {
LfRfidTuneView* tune_view = context;
bool consumed = false;
// Process key presses only
if(event->type == InputTypeShort || event->type == InputTypeRepeat) {
consumed = true;
switch(event->key) {
case InputKeyLeft:
lfrfid_debug_view_tune_button_left(tune_view);
break;
case InputKeyRight:
lfrfid_debug_view_tune_button_right(tune_view);
break;
case InputKeyUp:
lfrfid_debug_view_tune_button_up(tune_view);
break;
case InputKeyDown:
lfrfid_debug_view_tune_button_down(tune_view);
break;
case InputKeyOk:
lfrfid_debug_view_tune_button_ok(tune_view);
break;
default:
consumed = false;
break;
}
}
return consumed;
}
LfRfidTuneView* lfrfid_debug_view_tune_alloc() {
LfRfidTuneView* tune_view = malloc(sizeof(LfRfidTuneView));
tune_view->view = view_alloc();
view_set_context(tune_view->view, tune_view);
view_allocate_model(tune_view->view, ViewModelTypeLocking, sizeof(LfRfidTuneViewModel));
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
model->dirty = true;
model->fine = false;
model->ARR = 511;
model->CCR = 255;
model->pos = 0;
return true;
});
view_set_draw_callback(tune_view->view, lfrfid_debug_view_tune_draw_callback);
view_set_input_callback(tune_view->view, lfrfid_debug_view_tune_input_callback);
return tune_view;
}
void lfrfid_debug_view_tune_free(LfRfidTuneView* tune_view) {
view_free(tune_view->view);
free(tune_view);
}
View* lfrfid_debug_view_tune_get_view(LfRfidTuneView* tune_view) {
return tune_view->view;
}
void lfrfid_debug_view_tune_clean(LfRfidTuneView* tune_view) {
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
model->dirty = true;
model->fine = false;
model->ARR = 511;
model->CCR = 255;
model->pos = 0;
return true;
});
}
bool lfrfid_debug_view_tune_is_dirty(LfRfidTuneView* tune_view) {
bool result = false;
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
result = model->dirty;
model->dirty = false;
return false;
});
return result;
}
uint32_t lfrfid_debug_view_tune_get_arr(LfRfidTuneView* tune_view) {
uint32_t result = false;
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
result = model->ARR;
return false;
});
return result;
}
uint32_t lfrfid_debug_view_tune_get_ccr(LfRfidTuneView* tune_view) {
uint32_t result = false;
with_view_model(
tune_view->view, (LfRfidTuneViewModel * model) {
result = model->CCR;
return false;
});
return result;
}

View File

@ -0,0 +1,18 @@
#pragma once
#include <gui/view.h>
typedef struct LfRfidTuneView LfRfidTuneView;
LfRfidTuneView* lfrfid_debug_view_tune_alloc();
void lfrfid_debug_view_tune_free(LfRfidTuneView* tune_view);
View* lfrfid_debug_view_tune_get_view(LfRfidTuneView* tune_view);
void lfrfid_debug_view_tune_clean(LfRfidTuneView* tune_view);
bool lfrfid_debug_view_tune_is_dirty(LfRfidTuneView* tune_view);
uint32_t lfrfid_debug_view_tune_get_arr(LfRfidTuneView* tune_view);
uint32_t lfrfid_debug_view_tune_get_ccr(LfRfidTuneView* tune_view);

View File

@ -0,0 +1,11 @@
App(
appid="text_box_test",
name="Text Box Test",
apptype=FlipperAppType.DEBUG,
entry_point="text_box_test_app",
cdefines=["APP_TEXT_BOX_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=140,
fap_category="Debug",
)

View File

@ -0,0 +1,11 @@
App(
appid="uart_echo",
name="UART Echo",
apptype=FlipperAppType.DEBUG,
entry_point="uart_echo_app",
cdefines=["APP_UART_ECHO"],
requires=["gui"],
stack_size=2 * 1024,
order=70,
fap_category="Debug",
)

View File

@ -10,7 +10,7 @@ App(
App(
appid="delay_test",
name="Delay Test",
apptype=FlipperAppType.DEBUG,
apptype=FlipperAppType.SYSTEM,
entry_point="delay_test_app",
stack_size=1 * 1024,
requires=["unit_tests"],

View File

@ -1,6 +1,6 @@
#include <furi.h>
#include <furi_hal.h>
#include <applications/storage/storage.h>
#include <storage/storage.h>
#include <lib/flipper_format/flipper_format.h>
#include <lib/nfc/protocols/nfca.h>
#include <lib/digital_signal/digital_signal.h>

View File

@ -13,7 +13,7 @@
#define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo")
#define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s")
#define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub")
#define TEST_RANDOM_COUNT_PARSE 232
#define TEST_RANDOM_COUNT_PARSE 233
#define TEST_TIMEOUT 10000
static SubGhzEnvironment* environment_handler;
@ -434,6 +434,13 @@ MU_TEST(subghz_decoder_clemsa_test) {
"Test decoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n");
}
MU_TEST(subghz_decoder_oregon2_test) {
mu_assert(
subghz_decoder_test(
EXT_PATH("unit_tests/subghz/oregon2_raw.sub"), SUBGHZ_PROTOCOL_OREGON2_NAME),
"Test decoder " SUBGHZ_PROTOCOL_OREGON2_NAME " error\r\n");
}
//test encoders
MU_TEST(subghz_encoder_princeton_test) {
mu_assert(
@ -595,6 +602,7 @@ MU_TEST_SUITE(subghz) {
MU_RUN_TEST(subghz_decoder_magellen_test);
MU_RUN_TEST(subghz_decoder_intertechno_v3_test);
MU_RUN_TEST(subghz_decoder_clemsa_test);
MU_RUN_TEST(subghz_decoder_oregon2_test);
MU_RUN_TEST(subghz_encoder_princeton_test);
MU_RUN_TEST(subghz_encoder_came_test);

View File

@ -0,0 +1,11 @@
App(
appid="usb_mouse",
name="USB Mouse Demo",
apptype=FlipperAppType.DEBUG,
entry_point="usb_mouse_app",
cdefines=["APP_USB_MOUSE"],
requires=["gui"],
stack_size=1 * 1024,
order=60,
fap_category="Debug",
)

View File

@ -0,0 +1,11 @@
App(
appid="usb_test",
name="USB Test",
apptype=FlipperAppType.DEBUG,
entry_point="usb_test_app",
cdefines=["APP_USB_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=50,
fap_category="Debug",
)

View File

@ -0,0 +1,11 @@
App(
appid="vibro_test",
name="Vibro Test",
apptype=FlipperAppType.DEBUG,
entry_point="vibro_test_app",
cdefines=["APP_VIBRO_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=20,
fap_category="Debug",
)

View File

@ -1,115 +0,0 @@
App(
appid="debug_apps",
name="Basic debug apps bundle",
apptype=FlipperAppType.METAPACKAGE,
provides=[
"blink_test",
"vibro_test",
"keypad_test",
"usb_test",
"usb_mouse",
"uart_echo",
"display_test",
"text_box_test",
"file_browser_test",
],
)
App(
appid="blink_test",
name="Blink Test",
apptype=FlipperAppType.DEBUG,
entry_point="blink_test_app",
cdefines=["APP_BLINK"],
requires=["gui"],
stack_size=1 * 1024,
order=10,
)
App(
appid="vibro_test",
name="Vibro Test",
apptype=FlipperAppType.DEBUG,
entry_point="vibro_test_app",
cdefines=["APP_VIBRO_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=20,
)
App(
appid="keypad_test",
name="Keypad Test",
apptype=FlipperAppType.DEBUG,
entry_point="keypad_test_app",
cdefines=["APP_KEYPAD_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=30,
)
App(
appid="usb_test",
name="USB Test",
apptype=FlipperAppType.DEBUG,
entry_point="usb_test_app",
cdefines=["APP_USB_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=50,
)
App(
appid="usb_mouse",
name="USB Mouse Demo",
apptype=FlipperAppType.DEBUG,
entry_point="usb_mouse_app",
cdefines=["APP_USB_MOUSE"],
requires=["gui"],
stack_size=1 * 1024,
order=60,
)
App(
appid="uart_echo",
name="UART Echo",
apptype=FlipperAppType.DEBUG,
entry_point="uart_echo_app",
cdefines=["APP_UART_ECHO"],
requires=["gui"],
stack_size=2 * 1024,
order=70,
)
App(
appid="display_test",
name="Display Test",
apptype=FlipperAppType.DEBUG,
entry_point="display_test_app",
cdefines=["APP_DISPLAY_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=120,
)
App(
appid="text_box_test",
name="Text Box Test",
apptype=FlipperAppType.DEBUG,
entry_point="text_box_test_app",
cdefines=["APP_TEXT_BOX_TEST"],
requires=["gui"],
stack_size=1 * 1024,
order=140,
)
App(
appid="file_browser_test",
name="File Browser Test",
apptype=FlipperAppType.DEBUG,
entry_point="file_browser_app",
cdefines=["APP_FILE_BROWSER_TEST"],
requires=["gui"],
stack_size=2 * 1024,
order=150,
)

View File

@ -1,130 +0,0 @@
#include <furi.h>
#include <gui/elements.h>
#include "../desktop_i.h"
#include "desktop_view_lock_menu.h"
#define LOCK_MENU_ITEMS_NB 3
void desktop_lock_menu_set_callback(
DesktopLockMenuView* lock_menu,
DesktopLockMenuViewCallback callback,
void* context) {
furi_assert(lock_menu);
furi_assert(callback);
lock_menu->callback = callback;
lock_menu->context = context;
}
void desktop_lock_menu_pin_set(DesktopLockMenuView* lock_menu, bool pin_is_set) {
with_view_model(
lock_menu->view, (DesktopLockMenuViewModel * model) {
model->pin_set = pin_is_set;
return true;
});
}
void desktop_lock_menu_set_idx(DesktopLockMenuView* lock_menu, uint8_t idx) {
furi_assert(idx < LOCK_MENU_ITEMS_NB);
with_view_model(
lock_menu->view, (DesktopLockMenuViewModel * model) {
model->idx = idx;
return true;
});
}
static void lock_menu_callback(void* context, uint8_t index) {
furi_assert(context);
DesktopLockMenuView* lock_menu = context;
switch(index) {
case 0: // lock
lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context);
break;
case 1: // lock
lock_menu->callback(DesktopLockMenuEventPinLock, lock_menu->context);
break;
default: // wip message
with_view_model(
lock_menu->view, (DesktopLockMenuViewModel * model) {
model->hint_timeout = HINT_TIMEOUT;
return true;
});
break;
}
}
void desktop_lock_menu_render(Canvas* canvas, void* model) {
const char* Lockmenu_Items[LOCK_MENU_ITEMS_NB] = {"Lock", "Lock with PIN", "DUMB mode"};
DesktopLockMenuViewModel* m = model;
canvas_clear(canvas);
canvas_set_color(canvas, ColorBlack);
canvas_draw_icon(canvas, -57, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55);
canvas_draw_icon(canvas, 116, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55);
canvas_set_font(canvas, FontSecondary);
for(uint8_t i = 0; i < LOCK_MENU_ITEMS_NB; ++i) {
const char* str = Lockmenu_Items[i];
if(i == 1 && !m->pin_set) str = "Set PIN";
if(m->hint_timeout && m->idx == 2 && m->idx == i) str = "Not Implemented";
if(str != NULL)
canvas_draw_str_aligned(
canvas, 64, 9 + (i * 17) + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter, str);
if(m->idx == i) elements_frame(canvas, 15, 1 + (i * 17) + STATUS_BAR_Y_SHIFT, 98, 15);
}
}
View* desktop_lock_menu_get_view(DesktopLockMenuView* lock_menu) {
furi_assert(lock_menu);
return lock_menu->view;
}
bool desktop_lock_menu_input(InputEvent* event, void* context) {
furi_assert(event);
furi_assert(context);
DesktopLockMenuView* lock_menu = context;
uint8_t idx;
if(event->type != InputTypeShort) return false;
with_view_model(
lock_menu->view, (DesktopLockMenuViewModel * model) {
model->hint_timeout = 0; // clear hint timeout
if(event->key == InputKeyUp) {
model->idx = CLAMP(model->idx - 1, LOCK_MENU_ITEMS_NB - 1, 0);
} else if(event->key == InputKeyDown) {
model->idx = CLAMP(model->idx + 1, LOCK_MENU_ITEMS_NB - 1, 0);
}
idx = model->idx;
return true;
});
if(event->key == InputKeyBack) {
lock_menu->callback(DesktopLockMenuEventExit, lock_menu->context);
} else if(event->key == InputKeyOk) {
lock_menu_callback(lock_menu, idx);
}
return true;
}
DesktopLockMenuView* desktop_lock_menu_alloc() {
DesktopLockMenuView* lock_menu = malloc(sizeof(DesktopLockMenuView));
lock_menu->view = view_alloc();
view_allocate_model(lock_menu->view, ViewModelTypeLocking, sizeof(DesktopLockMenuViewModel));
view_set_context(lock_menu->view, lock_menu);
view_set_draw_callback(lock_menu->view, (ViewDrawCallback)desktop_lock_menu_render);
view_set_input_callback(lock_menu->view, desktop_lock_menu_input);
return lock_menu;
}
void desktop_lock_menu_free(DesktopLockMenuView* lock_menu_view) {
furi_assert(lock_menu_view);
view_free(lock_menu_view->view);
free(lock_menu_view);
}

View File

@ -1,58 +0,0 @@
Import("ENV")
from fbt.appmanifest import FlipperAppType
appenv = ENV.Clone(tools=["fbt_extapps"])
appenv.Replace(
LINKER_SCRIPT="application-ext",
STRIPFLAGS=[
"--strip-debug",
"--strip-unneeded",
"-d",
"-g",
"-S",
],
)
appenv.AppendUnique(
CCFLAGS=[
"-Os",
"-ggdb3",
"-mword-relocations",
"-mlong-calls",
"-fno-common",
"-nostdlib",
"-fvisibility=hidden",
],
LINKFLAGS=[
"-r",
"-s",
# "-Bsymbolic",
"-nostartfiles",
"-mlong-calls",
"-fno-common",
"-nostdlib",
"-Wl,--gc-sections",
"-Wl,--no-export-dynamic",
"-fvisibility=hidden",
"-Wl,-e${APP_ENTRY}",
"-Xlinker",
"-Map=${TARGET}.map",
],
)
extapps = []
for apptype in (FlipperAppType.PLUGIN, FlipperAppType.EXTERNAL):
for app in appenv["APPBUILD"].get_apps_of_type(apptype):
extapps.append(appenv.BuildAppElf(app))
# Ugly access to global option
if extra_app_list := GetOption("extra_ext_apps"):
for extra_app in extra_app_list.split(","):
extapps.append(appenv.BuildAppElf(appenv["APPMGR"].get(extra_app)))
Alias(appenv["FIRMWARE_BUILD_CFG"] + "_extapps", extapps)
Return("extapps")

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