Merge remote-tracking branch 'origin/dev' into release-candidate
This commit is contained in:
		
						commit
						7e86f634ba
					
				
							
								
								
									
										151
									
								
								.clang-format
									
									
									
									
									
								
							
							
						
						
									
										151
									
								
								.clang-format
									
									
									
									
									
								
							| @ -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 | ||||
| ColumnLimit:     99 | ||||
| CommentPragmas:  '^ IWYU pragma:' | ||||
| QualifierAlignment: Leave | ||||
| CompactNamespaces: false | ||||
| ConstructorInitializerAllOnOneLineOrOnePerLine: false | ||||
| ConstructorInitializerIndentWidth: 4 | ||||
| ContinuationIndentWidth: 4 | ||||
| Cpp11BracedListStyle: true | ||||
| DeriveLineEnding: true | ||||
| DerivePointerAlignment: false | ||||
| DisableFormat: false | ||||
| DisableFormat:   false | ||||
| EmptyLineAfterAccessModifier: Never | ||||
| EmptyLineBeforeAccessModifier: LogicalBlock | ||||
| ExperimentalAutoDetectBinPacking: false | ||||
| PackConstructorInitializers: BinPack | ||||
| BasedOnStyle:    '' | ||||
| ConstructorInitializerAllOnOneLineOrOnePerLine: false | ||||
| AllowAllConstructorInitializersOnNextLine: true | ||||
| FixNamespaceComments: false | ||||
| 
 | ||||
| IncludeBlocks: Preserve | ||||
| ForEachMacros: | ||||
|   - foreach | ||||
|   - Q_FOREACH | ||||
|   - BOOST_FOREACH | ||||
| IfMacros: | ||||
|   - KJ_IF_MAYBE | ||||
| IncludeBlocks:   Preserve | ||||
| IncludeCategories: | ||||
|   - Regex: '.*' | ||||
|     Priority: 1 | ||||
|   - 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 | ||||
| IndentWidth: 4 | ||||
| IndentExternBlock: AfterExternBlock | ||||
| IndentRequires:  false | ||||
| IndentWidth:     4 | ||||
| IndentWrappedFunctionNames: true | ||||
| InsertTrailingCommas: None | ||||
| JavaScriptQuotes: Leave | ||||
| JavaScriptWrapImports: true | ||||
| KeepEmptyLinesAtTheStartOfBlocks: false | ||||
| LambdaBodyIndentation: Signature | ||||
| MacroBlockBegin: '' | ||||
| MacroBlockEnd: '' | ||||
| 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 | ||||
| ReflowComments: false | ||||
| SortIncludes: false | ||||
| PPIndentWidth:   -1 | ||||
| ReferenceAlignment: Pointer | ||||
| ReflowComments:  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 | ||||
| TabWidth: 4 | ||||
| UseTab: Never | ||||
| 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
									
									
								
							
							
						
						
									
										102
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							| @ -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
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @ -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 | ||||
|  | ||||
							
								
								
									
										13
									
								
								.vscode/example/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.vscode/example/launch.json
									
									
									
									
										vendored
									
									
								
							| @ -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" | ||||
|             ] | ||||
|         }, | ||||
|         { | ||||
|  | ||||
							
								
								
									
										3
									
								
								.vscode/example/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.vscode/example/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -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", | ||||
|  | ||||
							
								
								
									
										30
									
								
								.vscode/example/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.vscode/example/tasks.json
									
									
									
									
										vendored
									
									
								
							| @ -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}" | ||||
|         } | ||||
|     ] | ||||
| } | ||||
| @ -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/) | ||||
|  | ||||
							
								
								
									
										28
									
								
								SConstruct
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								SConstruct
									
									
									
									
									
								
							| @ -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", | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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, | ||||
| ) | ||||
| @ -7,4 +7,5 @@ App( | ||||
|     requires=["gui"], | ||||
|     stack_size=4 * 1024, | ||||
|     order=40, | ||||
|     fap_category="Debug", | ||||
| ) | ||||
							
								
								
									
										16
									
								
								applications/debug/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								applications/debug/application.fam
									
									
									
									
									
										Normal 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", | ||||
|     ], | ||||
| ) | ||||
							
								
								
									
										14
									
								
								applications/debug/battery_test_app/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								applications/debug/battery_test_app/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
| @ -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
 | ||||
| @ -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; | ||||
							
								
								
									
										11
									
								
								applications/debug/blink_test/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/blink_test/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
							
								
								
									
										18
									
								
								applications/debug/bt_debug_app/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								applications/debug/bt_debug_app/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
| @ -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; | ||||
							
								
								
									
										11
									
								
								applications/debug/display_test/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/display_test/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
							
								
								
									
										11
									
								
								applications/debug/file_browser_test/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/file_browser_test/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
							
								
								
									
										11
									
								
								applications/debug/keypad_test/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/keypad_test/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
| @ -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", | ||||
| ) | ||||
							
								
								
									
										81
									
								
								applications/debug/lfrfid_debug/lfrfid_debug.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								applications/debug/lfrfid_debug/lfrfid_debug.c
									
									
									
									
									
										Normal 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; | ||||
| } | ||||
							
								
								
									
										30
									
								
								applications/debug/lfrfid_debug/lfrfid_debug_i.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								applications/debug/lfrfid_debug/lfrfid_debug_i.h
									
									
									
									
									
										Normal 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; | ||||
| @ -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); | ||||
| } | ||||
| @ -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); | ||||
| 
 | ||||
							
								
								
									
										30
									
								
								applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.c
									
									
									
									
									
										Normal 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, | ||||
| }; | ||||
							
								
								
									
										29
									
								
								applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.h
									
									
									
									
									
										Normal 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 | ||||
| @ -0,0 +1,2 @@ | ||||
| ADD_SCENE(lfrfid_debug, start, Start) | ||||
| ADD_SCENE(lfrfid_debug, tune, Tune) | ||||
							
								
								
									
										229
									
								
								applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c
									
									
									
									
									
										Normal 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; | ||||
| } | ||||
| @ -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); | ||||
							
								
								
									
										11
									
								
								applications/debug/text_box_test/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/text_box_test/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
							
								
								
									
										11
									
								
								applications/debug/uart_echo/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/uart_echo/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
| @ -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"], | ||||
| @ -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> | ||||
| @ -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); | ||||
							
								
								
									
										11
									
								
								applications/debug/usb_mouse/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/usb_mouse/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
							
								
								
									
										11
									
								
								applications/debug/usb_test/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/usb_test/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
							
								
								
									
										11
									
								
								applications/debug/vibro_test/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/vibro_test/application.fam
									
									
									
									
									
										Normal 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", | ||||
| ) | ||||
| @ -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, | ||||
| ) | ||||
| @ -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); | ||||
| } | ||||
| @ -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
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Aleksandr Kutuzov
						Aleksandr Kutuzov