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 | AccessModifierOffset: -4 | ||||||
| AlignAfterOpenBracket: AlwaysBreak | AlignAfterOpenBracket: AlwaysBreak | ||||||
| AlignConsecutiveAssignments: false | AlignArrayOfStructures: None | ||||||
| AlignConsecutiveDeclarations: false | AlignConsecutiveMacros: None | ||||||
|  | AlignConsecutiveAssignments: None | ||||||
|  | AlignConsecutiveBitFields: None | ||||||
|  | AlignConsecutiveDeclarations: None | ||||||
| AlignEscapedNewlines: Left | AlignEscapedNewlines: Left | ||||||
| AlignOperands: true | AlignOperands:   Align | ||||||
| AlignTrailingComments: false | AlignTrailingComments: false | ||||||
|  | AllowAllArgumentsOnNextLine: true | ||||||
| AllowAllParametersOfDeclarationOnNextLine: false | AllowAllParametersOfDeclarationOnNextLine: false | ||||||
|  | AllowShortEnumsOnASingleLine: true | ||||||
| AllowShortBlocksOnASingleLine: Never | AllowShortBlocksOnASingleLine: Never | ||||||
| AllowShortCaseLabelsOnASingleLine: false | AllowShortCaseLabelsOnASingleLine: false | ||||||
| AllowShortFunctionsOnASingleLine: None | AllowShortFunctionsOnASingleLine: None | ||||||
| AllowShortIfStatementsOnASingleLine: true | AllowShortLambdasOnASingleLine: All | ||||||
|  | AllowShortIfStatementsOnASingleLine: WithoutElse | ||||||
| AllowShortLoopsOnASingleLine: true | AllowShortLoopsOnASingleLine: true | ||||||
| AlwaysBreakAfterDefinitionReturnType: None | AlwaysBreakAfterDefinitionReturnType: None | ||||||
| AlwaysBreakAfterReturnType: None | AlwaysBreakAfterReturnType: None | ||||||
| AlwaysBreakBeforeMultilineStrings: false | AlwaysBreakBeforeMultilineStrings: false | ||||||
| AlwaysBreakTemplateDeclarations: false | AlwaysBreakTemplateDeclarations: Yes | ||||||
|  | AttributeMacros: | ||||||
|  |   - __capability | ||||||
| BinPackArguments: false | BinPackArguments: false | ||||||
| BinPackParameters: 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 | BreakBeforeBinaryOperators: None | ||||||
|  | BreakBeforeConceptDeclarations: true | ||||||
| BreakBeforeBraces: Attach | BreakBeforeBraces: Attach | ||||||
|  | BreakBeforeInheritanceComma: false | ||||||
|  | BreakInheritanceList: BeforeColon | ||||||
| BreakBeforeTernaryOperators: false | BreakBeforeTernaryOperators: false | ||||||
|  | BreakConstructorInitializersBeforeComma: false | ||||||
| BreakConstructorInitializers: BeforeComma | BreakConstructorInitializers: BeforeComma | ||||||
|  | BreakAfterJavaFieldAnnotations: false | ||||||
| BreakStringLiterals: false | BreakStringLiterals: false | ||||||
| ColumnLimit: 99 | ColumnLimit:     99 | ||||||
|  | CommentPragmas:  '^ IWYU pragma:' | ||||||
|  | QualifierAlignment: Leave | ||||||
| CompactNamespaces: false | CompactNamespaces: false | ||||||
| ConstructorInitializerAllOnOneLineOrOnePerLine: false |  | ||||||
| ConstructorInitializerIndentWidth: 4 | ConstructorInitializerIndentWidth: 4 | ||||||
| ContinuationIndentWidth: 4 | ContinuationIndentWidth: 4 | ||||||
| Cpp11BracedListStyle: true | Cpp11BracedListStyle: true | ||||||
|  | DeriveLineEnding: true | ||||||
| DerivePointerAlignment: false | DerivePointerAlignment: false | ||||||
| DisableFormat: false | DisableFormat:   false | ||||||
|  | EmptyLineAfterAccessModifier: Never | ||||||
|  | EmptyLineBeforeAccessModifier: LogicalBlock | ||||||
| ExperimentalAutoDetectBinPacking: false | ExperimentalAutoDetectBinPacking: false | ||||||
|  | PackConstructorInitializers: BinPack | ||||||
|  | BasedOnStyle:    '' | ||||||
|  | ConstructorInitializerAllOnOneLineOrOnePerLine: false | ||||||
|  | AllowAllConstructorInitializersOnNextLine: true | ||||||
| FixNamespaceComments: false | FixNamespaceComments: false | ||||||
| 
 | ForEachMacros: | ||||||
| IncludeBlocks: Preserve |   - foreach | ||||||
|  |   - Q_FOREACH | ||||||
|  |   - BOOST_FOREACH | ||||||
|  | IfMacros: | ||||||
|  |   - KJ_IF_MAYBE | ||||||
|  | IncludeBlocks:   Preserve | ||||||
| IncludeCategories: | IncludeCategories: | ||||||
|   - Regex: '.*' |   - Regex:           '.*' | ||||||
|     Priority: 1 |     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)?$' | IncludeIsMainRegex: '(Test)?$' | ||||||
|  | IncludeIsMainSourceRegex: '' | ||||||
|  | IndentAccessModifiers: false | ||||||
| IndentCaseLabels: false | IndentCaseLabels: false | ||||||
|  | IndentCaseBlocks: false | ||||||
|  | IndentGotoLabels: true | ||||||
| IndentPPDirectives: None | IndentPPDirectives: None | ||||||
| IndentWidth: 4 | IndentExternBlock: AfterExternBlock | ||||||
|  | IndentRequires:  false | ||||||
|  | IndentWidth:     4 | ||||||
| IndentWrappedFunctionNames: true | IndentWrappedFunctionNames: true | ||||||
|  | InsertTrailingCommas: None | ||||||
| JavaScriptQuotes: Leave | JavaScriptQuotes: Leave | ||||||
| JavaScriptWrapImports: true | JavaScriptWrapImports: true | ||||||
| KeepEmptyLinesAtTheStartOfBlocks: false | KeepEmptyLinesAtTheStartOfBlocks: false | ||||||
|  | LambdaBodyIndentation: Signature | ||||||
| MacroBlockBegin: '' | MacroBlockBegin: '' | ||||||
| MacroBlockEnd: '' | MacroBlockEnd:   '' | ||||||
| MaxEmptyLinesToKeep: 1 | MaxEmptyLinesToKeep: 1 | ||||||
| NamespaceIndentation: None | NamespaceIndentation: None | ||||||
| ObjCBinPackProtocolList: Auto | ObjCBinPackProtocolList: Auto | ||||||
| ObjCBlockIndentWidth: 4 | ObjCBlockIndentWidth: 4 | ||||||
|  | ObjCBreakBeforeNestedBlockParam: true | ||||||
| ObjCSpaceAfterProperty: true | ObjCSpaceAfterProperty: true | ||||||
| ObjCSpaceBeforeProtocolList: true | ObjCSpaceBeforeProtocolList: true | ||||||
| 
 |  | ||||||
| # Taken from git's rules |  | ||||||
| PenaltyBreakAssignment: 10 | PenaltyBreakAssignment: 10 | ||||||
| PenaltyBreakBeforeFirstCallParameter: 30 | PenaltyBreakBeforeFirstCallParameter: 30 | ||||||
| PenaltyBreakComment: 10 | PenaltyBreakComment: 10 | ||||||
| PenaltyBreakFirstLessLess: 0 | PenaltyBreakFirstLessLess: 0 | ||||||
|  | PenaltyBreakOpenParenthesis: 0 | ||||||
| PenaltyBreakString: 10 | PenaltyBreakString: 10 | ||||||
|  | PenaltyBreakTemplateDeclaration: 10 | ||||||
| PenaltyExcessCharacter: 100 | PenaltyExcessCharacter: 100 | ||||||
| PenaltyReturnTypeOnItsOwnLine: 60 | PenaltyReturnTypeOnItsOwnLine: 60 | ||||||
| 
 | PenaltyIndentedWhitespace: 0 | ||||||
| PointerAlignment: Left | PointerAlignment: Left | ||||||
| ReflowComments: false | PPIndentWidth:   -1 | ||||||
| SortIncludes: false | ReferenceAlignment: Pointer | ||||||
|  | ReflowComments:  false | ||||||
|  | RemoveBracesLLVM: false | ||||||
|  | SeparateDefinitionBlocks: Leave | ||||||
|  | ShortNamespaceLines: 1 | ||||||
|  | SortIncludes:    Never | ||||||
|  | SortJavaStaticImport: Before | ||||||
| SortUsingDeclarations: false | SortUsingDeclarations: false | ||||||
| SpaceAfterCStyleCast: false | SpaceAfterCStyleCast: false | ||||||
|  | SpaceAfterLogicalNot: false | ||||||
| SpaceAfterTemplateKeyword: true | SpaceAfterTemplateKeyword: true | ||||||
| SpaceBeforeAssignmentOperators: true | SpaceBeforeAssignmentOperators: true | ||||||
|  | SpaceBeforeCaseColon: false | ||||||
|  | SpaceBeforeCpp11BracedList: false | ||||||
| SpaceBeforeCtorInitializerColon: true | SpaceBeforeCtorInitializerColon: true | ||||||
| SpaceBeforeInheritanceColon: true | SpaceBeforeInheritanceColon: true | ||||||
| SpaceBeforeParens: Never | SpaceBeforeParens: Never | ||||||
|  | SpaceBeforeParensOptions: | ||||||
|  |   AfterControlStatements: false | ||||||
|  |   AfterForeachMacros: false | ||||||
|  |   AfterFunctionDefinitionName: false | ||||||
|  |   AfterFunctionDeclarationName: false | ||||||
|  |   AfterIfMacros:   false | ||||||
|  |   AfterOverloadedOperator: false | ||||||
|  |   BeforeNonEmptyParentheses: false | ||||||
|  | SpaceAroundPointerQualifiers: Default | ||||||
| SpaceBeforeRangeBasedForLoopColon: true | SpaceBeforeRangeBasedForLoopColon: true | ||||||
|  | SpaceInEmptyBlock: false | ||||||
| SpaceInEmptyParentheses: false | SpaceInEmptyParentheses: false | ||||||
| SpacesBeforeTrailingComments: 1 | SpacesBeforeTrailingComments: 1 | ||||||
| SpacesInAngles: false | SpacesInAngles:  Never | ||||||
|  | SpacesInConditionalStatement: false | ||||||
| SpacesInContainerLiterals: false | SpacesInContainerLiterals: false | ||||||
| SpacesInCStyleCastParentheses: false | SpacesInCStyleCastParentheses: false | ||||||
|  | SpacesInLineCommentPrefix: | ||||||
|  |   Minimum:         1 | ||||||
|  |   Maximum:         -1 | ||||||
| SpacesInParentheses: false | SpacesInParentheses: false | ||||||
| SpacesInSquareBrackets: false | SpacesInSquareBrackets: false | ||||||
| Standard: Cpp03 | SpaceBeforeSquareBrackets: false | ||||||
| TabWidth: 4 | BitFieldColonSpacing: Both | ||||||
| UseTab: Never | 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 | * @skotopes @DrZlo13 @hedger | ||||||
| 
 | 
 | ||||||
| # Apps | # Apps | ||||||
| /applications/about/ @skotopes @DrZlo13 @hedger | /applications/debug/bt_debug_app/ @skotopes @DrZlo13 @hedger @gornekich | ||||||
| /applications/accessor/ @skotopes @DrZlo13 @hedger | /applications/debug/accessor/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /applications/archive/ @skotopes @DrZlo13 @hedger @nminaylov | /applications/debug/battery_test_app/ @skotopes @DrZlo13 @hedger @gornekich | ||||||
| /applications/bad_usb/ @skotopes @DrZlo13 @hedger @nminaylov | /applications/debug/bt_debug_app/ @skotopes @DrZlo13 @hedger @gornekich | ||||||
| /applications/bt/ @skotopes @DrZlo13 @hedger @gornekich | /applications/debug/file_browser_test/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /applications/cli/ @skotopes @DrZlo13 @hedger @nminaylov | /applications/debug/lfrfid_debug/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /applications/crypto/ @skotopes @DrZlo13 @hedger @nminaylov | /applications/debug/text_box_test/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /applications/debug_tools/ @skotopes @DrZlo13 @hedger | /applications/debug/uart_echo/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /applications/desktop/ @skotopes @DrZlo13 @hedger @nminaylov | /applications/debug/usb_mouse/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /applications/dialogs/ @skotopes @DrZlo13 @hedger | /applications/debug/usb_test/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /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 |  | ||||||
| 
 | 
 | ||||||
| # Assets | /applications/main/archive/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /assets/ @skotopes @DrZlo13 @hedger | /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 | /applications/plugins/bt_hid_app/ @skotopes @DrZlo13 @hedger @gornekich | ||||||
| /furi/ @skotopes @DrZlo13 @hedger | /applications/plugins/picopass/ @skotopes @DrZlo13 @hedger @gornekich | ||||||
| 
 | 
 | ||||||
| # Debug tools and plugins | /applications/services/bt/ @skotopes @DrZlo13 @hedger @gornekich | ||||||
| /debug/ @skotopes @DrZlo13 @hedger | /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 | ||||||
| /documentation/ @skotopes @DrZlo13 @hedger @drunkbatya | /documentation/ @skotopes @DrZlo13 @hedger @drunkbatya | ||||||
| 
 | /scripts/toolchain/ @skotopes @DrZlo13 @hedger @drunkbatya | ||||||
| # Firmware targets |  | ||||||
| /firmware/ @skotopes @DrZlo13 @hedger |  | ||||||
| 
 | 
 | ||||||
| # Lib | # Lib | ||||||
| /lib/FreeRTOS-Kernel/ @skotopes @DrZlo13 @hedger |  | ||||||
| /lib/FreeRTOS-glue/ @skotopes @DrZlo13 @hedger |  | ||||||
| /lib/ST25RFAL002/ @skotopes @DrZlo13 @hedger @gornekich | /lib/ST25RFAL002/ @skotopes @DrZlo13 @hedger @gornekich | ||||||
| /lib/STM32CubeWB/ @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/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/infrared/ @skotopes @DrZlo13 @hedger @gsurkov | ||||||
|  | /lib/lfrfid/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /lib/libusb_stm32/ @skotopes @DrZlo13 @hedger @nminaylov | /lib/libusb_stm32/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /lib/littlefs/ @skotopes @DrZlo13 @hedger | /lib/mbedtls/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /lib/lfs_config.h @skotopes @DrZlo13 @hedger |  | ||||||
| /lib/micro-ecc/ @skotopes @DrZlo13 @hedger @nminaylov | /lib/micro-ecc/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /lib/microtar/ @skotopes @DrZlo13 @hedger | /lib/nanopb/ @skotopes @DrZlo13 @hedger @nminaylov | ||||||
| /lib/mlib/ @skotopes @DrZlo13 @hedger |  | ||||||
| /lib/nanopb/ @skotopes @DrZlo13 @hedger |  | ||||||
| /lib/nfc/ @skotopes @DrZlo13 @hedger @gornekich | /lib/nfc/ @skotopes @DrZlo13 @hedger @gornekich | ||||||
| /lib/one_wire/ @skotopes @DrZlo13 @hedger | /lib/one_wire/ @skotopes @DrZlo13 @hedger @gsurkov | ||||||
| /lib/qrcode/ @skotopes @DrZlo13 @hedger |  | ||||||
| /lib/subghz/ @skotopes @DrZlo13 @hedger @Skorpionm | /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"] | [submodule "lib/mbedtls"] | ||||||
| 	path = lib/mbedtls | 	path = lib/mbedtls | ||||||
| 	url = https://github.com/Mbed-TLS/mbedtls.git | 	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": [ |             "postAttachCommands": [ | ||||||
|                 // "attach 1", |                 // "attach 1", | ||||||
|                 "compare-sections", |                 // "compare-sections", | ||||||
|  |                 "source debug/flipperapps.py", | ||||||
|  |                 // "source debug/FreeRTOS/FreeRTOS.py", | ||||||
|  |                 // "svd_load debug/STM32WB55_CM4.svd" | ||||||
|             ] |             ] | ||||||
|             // "showDevDebugOutput": "raw", |             // "showDevDebugOutput": "raw", | ||||||
|         }, |         }, | ||||||
| @ -50,7 +53,8 @@ | |||||||
|                 "attach 1", |                 "attach 1", | ||||||
|                 "set confirm off", |                 "set confirm off", | ||||||
|                 "set mem inaccessible-by-default off", |                 "set mem inaccessible-by-default off", | ||||||
|                 "compare-sections", |                 "source debug/flipperapps.py", | ||||||
|  |                 // "compare-sections", | ||||||
|             ] |             ] | ||||||
|             // "showDevDebugOutput": "raw", |             // "showDevDebugOutput": "raw", | ||||||
|         }, |         }, | ||||||
| @ -65,6 +69,9 @@ | |||||||
|             "device": "STM32WB55RG", |             "device": "STM32WB55RG", | ||||||
|             "svdFile": "./debug/STM32WB55_CM4.svd", |             "svdFile": "./debug/STM32WB55_CM4.svd", | ||||||
|             "rtos": "FreeRTOS", |             "rtos": "FreeRTOS", | ||||||
|  |             "postAttachCommands": [ | ||||||
|  |                 "source debug/flipperapps.py", | ||||||
|  |             ] | ||||||
|             // "showDevDebugOutput": "raw", |             // "showDevDebugOutput": "raw", | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
| @ -73,7 +80,7 @@ | |||||||
|             "request": "launch", |             "request": "launch", | ||||||
|             "program": "./lib/scons/scripts/scons.py", |             "program": "./lib/scons/scripts/scons.py", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "sdk" |                 "plugin_dist" | ||||||
|             ] |             ] | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								.vscode/example/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.vscode/example/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -12,6 +12,9 @@ | |||||||
|     "cortex-debug.openocdPath.windows": "${workspaceFolder}/toolchain/i686-windows/openocd/bin/openocd.exe", |     "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.linux": "${workspaceFolder}/toolchain/x86_64-linux/openocd/bin/openocd", | ||||||
|     "cortex-debug.openocdPath.osx": "${workspaceFolder}/toolchain/x86_64-darwin/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, |     "editor.formatOnSave": true, | ||||||
|     "files.associations": { |     "files.associations": { | ||||||
|         "*.scons": "python", |         "*.scons": "python", | ||||||
| @ -19,4 +22,4 @@ | |||||||
|         "SConstruct": "python", |         "SConstruct": "python", | ||||||
|         "*.fam": "python", |         "*.fam": "python", | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										30
									
								
								.vscode/example/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.vscode/example/tasks.json
									
									
									
									
										vendored
									
									
								
							| @ -93,11 +93,41 @@ | |||||||
|             "type": "shell", |             "type": "shell", | ||||||
|             "command": "./fbt FIRMWARE_APP_SET=unit_tests FORCE=1 flash_usb" |             "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)", |             "label": "[Release] Flash (USB, with resources)", | ||||||
|             "group": "build", |             "group": "build", | ||||||
|             "type": "shell", |             "type": "shell", | ||||||
|             "command": "./fbt COMPACT=1 DEBUG=0 FORCE=1 flash_usb_full" |             "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 | $ 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 | # Update firmware | ||||||
| 
 | 
 | ||||||
| [Get Latest Firmware from Update Server](https://update.flipperzero.one/) | [Get Latest Firmware from Update Server](https://update.flipperzero.one/) | ||||||
|  | |||||||
							
								
								
									
										28
									
								
								SConstruct
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								SConstruct
									
									
									
									
									
								
							| @ -9,9 +9,10 @@ | |||||||
| import os | import os | ||||||
| import subprocess | import subprocess | ||||||
| 
 | 
 | ||||||
|  | DefaultEnvironment(tools=[]) | ||||||
|  | 
 | ||||||
| EnsurePythonVersion(3, 8) | EnsurePythonVersion(3, 8) | ||||||
| 
 | 
 | ||||||
| DefaultEnvironment(tools=[]) |  | ||||||
| # Progress(["OwO\r", "owo\r", "uwu\r", "owo\r"], interval=15) | # Progress(["OwO\r", "owo\r", "uwu\r", "owo\r"], interval=15) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -58,6 +59,8 @@ distenv = coreenv.Clone( | |||||||
|         "-ex", |         "-ex", | ||||||
|         "source debug/FreeRTOS/FreeRTOS.py", |         "source debug/FreeRTOS/FreeRTOS.py", | ||||||
|         "-ex", |         "-ex", | ||||||
|  |         "source debug/flipperapps.py", | ||||||
|  |         "-ex", | ||||||
|         "source debug/PyCortexMDebug/PyCortexMDebug.py", |         "source debug/PyCortexMDebug/PyCortexMDebug.py", | ||||||
|         "-ex", |         "-ex", | ||||||
|         "svd_load ${SVD_FILE}", |         "svd_load ${SVD_FILE}", | ||||||
| @ -160,6 +163,28 @@ if GetOption("fullenv") or any( | |||||||
| basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"]) | basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"]) | ||||||
| distenv.Default(basic_dist) | 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 | # Target for bundling core2 package for qFlipper | ||||||
| copro_dist = distenv.CoproBuilder( | copro_dist = distenv.CoproBuilder( | ||||||
|     distenv.Dir("assets/core2_firmware"), |     distenv.Dir("assets/core2_firmware"), | ||||||
| @ -240,7 +265,6 @@ firmware_env.Append( | |||||||
|         "site_scons", |         "site_scons", | ||||||
|         "scripts", |         "scripts", | ||||||
|         # Extra files |         # Extra files | ||||||
|         "applications/extapps.scons", |  | ||||||
|         "SConstruct", |         "SConstruct", | ||||||
|         "firmware.scons", |         "firmware.scons", | ||||||
|         "fbt_options.py", |         "fbt_options.py", | ||||||
|  | |||||||
| @ -1,38 +1,89 @@ | |||||||
| # Structure | # Structure | ||||||
| 
 | 
 | ||||||
| - `about`               - Small About application that shows flipper info | ## debug  | ||||||
| - `accessor`            - Wiegand server | 
 | ||||||
|  | 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  | - `archive`             - Archive and file manager  | ||||||
| - `bad_usb`             - Bad USB application | - `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 | - `bt`                  - BLE service and application | ||||||
| - `cli`                 - Console service and API | - `cli`                 - Console service and API | ||||||
| - `crypto`              - Crypto cli tools | - `crypto`              - Crypto cli tools | ||||||
| - `debug_tools`         - Different tools that we use for debug |  | ||||||
| - `desktop`             - Desktop service | - `desktop`             - Desktop service | ||||||
| - `dialogs`             - Dialogs service: GUI Dialogs for your app | - `dialogs`             - Dialogs service: GUI Dialogs for your app | ||||||
| - `dolphin`             - Dolphin service and supplementary apps | - `dolphin`             - Dolphin service and supplementary apps | ||||||
| - `gpio`                - GPIO application: includes USART bridge and GPIO control |  | ||||||
| - `gui`                 - GUI service and API | - `gui`                 - GUI service and API | ||||||
| - `ibutton`             - iButton application, onewire keys and more |  | ||||||
| - `input`               - Input service | - `input`               - Input service | ||||||
| - `infrared`            - Infrared application, controls your IR devices |  | ||||||
| - `lfrfid`              - LF RFID application |  | ||||||
| - `lfrfid_debug`        - LF RFID debug tool |  | ||||||
| - `loader`              - Application loader service | - `loader`              - Application loader service | ||||||
| - `music_player`        - Music player app (demo) |  | ||||||
| - `nfc`                 - NFC application, HF rfid, EMV and etc |  | ||||||
| - `notification`        - Notification service  | - `notification`        - Notification service  | ||||||
| - `power`               - Power service | - `power`               - Power service | ||||||
| - `power_observer`      - Power debug tool |  | ||||||
| - `rpc`                 - RPC service and API | - `rpc`                 - RPC service and API | ||||||
| - `scened_app_example`  - C++ application example |  | ||||||
| - `snake_game`          - Snake game application |  | ||||||
| - `storage`             - Storage service, internal + sdcard | - `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"], |     requires=["gui"], | ||||||
|     stack_size=4 * 1024, |     stack_size=4 * 1024, | ||||||
|     order=40, |     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, |         .charge = app->info.charge, | ||||||
|         .health = app->info.health, |         .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); |     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); |     view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); | ||||||
| 
 | 
 | ||||||
|     // Views
 |     // Views
 | ||||||
|     app->batery_info = battery_info_alloc(); |     app->battery_info = battery_info_alloc(); | ||||||
|     view_set_previous_callback( |     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( |     view_dispatcher_add_view( | ||||||
|         app->view_dispatcher, |         app->view_dispatcher, | ||||||
|         BatteryTestAppViewBatteryInfo, |         BatteryTestAppViewBatteryInfo, | ||||||
|         battery_info_get_view(app->batery_info)); |         battery_info_get_view(app->battery_info)); | ||||||
| 
 | 
 | ||||||
|     app->dialog = dialog_ex_alloc(); |     app->dialog = dialog_ex_alloc(); | ||||||
|     dialog_ex_set_header(app->dialog, "Close Battery Test?", 64, 12, AlignCenter, AlignTop); |     dialog_ex_set_header(app->dialog, "Close Battery Test?", 64, 12, AlignCenter, AlignTop); | ||||||
| @ -76,7 +76,7 @@ void battery_test_free(BatteryTestApp* app) { | |||||||
| 
 | 
 | ||||||
|     // Views
 |     // Views
 | ||||||
|     view_dispatcher_remove_view(app->view_dispatcher, BatteryTestAppViewBatteryInfo); |     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); |     view_dispatcher_remove_view(app->view_dispatcher, BatteryTestAppViewExitDialog); | ||||||
|     dialog_ex_free(app->dialog); |     dialog_ex_free(app->dialog); | ||||||
|     // View dispatcher
 |     // View dispatcher
 | ||||||
| @ -6,14 +6,15 @@ | |||||||
| #include <notification/notification.h> | #include <notification/notification.h> | ||||||
| 
 | 
 | ||||||
| #include <gui/modules/dialog_ex.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 { | typedef struct { | ||||||
|     Power* power; |     Power* power; | ||||||
|     Gui* gui; |     Gui* gui; | ||||||
|     NotificationApp* notifications; |     NotificationApp* notifications; | ||||||
|     ViewDispatcher* view_dispatcher; |     ViewDispatcher* view_dispatcher; | ||||||
|     BatteryInfo* batery_info; |     BatteryInfo* battery_info; | ||||||
|     DialogEx* dialog; |     DialogEx* dialog; | ||||||
|     PowerInfo info; |     PowerInfo info; | ||||||
| } BatteryTestApp; | } 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 <gui/modules/submenu.h> | ||||||
| #include "views/bt_carrier_test.h" | #include "views/bt_carrier_test.h" | ||||||
| #include "views/bt_packet_test.h" | #include "views/bt_packet_test.h" | ||||||
| #include "../bt_settings.h" | #include <bt/bt_settings.h> | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     BtSettings settings; |     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", |     entry_point="lfrfid_debug_app", | ||||||
|     requires=[ |     requires=[ | ||||||
|         "gui", |         "gui", | ||||||
|         "lfrfid", |     ], | ||||||
|  |     provides=[ | ||||||
|  |         "lfrfid_debug", | ||||||
|     ], |     ], | ||||||
|     stack_size=1 * 1024, |     stack_size=1 * 1024, | ||||||
|     order=100, |     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> | #include <furi_hal.h> | ||||||
| 
 | 
 | ||||||
| static void comparator_trigger_callback(bool level, void* comp_ctx) { | 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); |     furi_hal_gpio_write(&gpio_ext_pa7, !level); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void LfRfidDebugAppSceneTune::on_enter(LfRfidDebugApp* app, bool /* need_restore */) { | void lfrfid_debug_scene_tune_on_enter(void* context) { | ||||||
|     app->view_controller.switch_to<LfRfidViewTuneVM>(); |     LfRfidDebug* app = context; | ||||||
|  | 
 | ||||||
|     furi_hal_gpio_init_simple(&gpio_ext_pa7, GpioModeOutputPushPull); |     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_comp_start(); | ||||||
| 
 | 
 | ||||||
|     furi_hal_rfid_pins_read(); |     furi_hal_rfid_pins_read(); | ||||||
|     furi_hal_rfid_tim_read(125000, 0.5); |     furi_hal_rfid_tim_read(125000, 0.5); | ||||||
|     furi_hal_rfid_tim_read_start(); |     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; |     bool consumed = false; | ||||||
| 
 | 
 | ||||||
|     LfRfidViewTuneVM* tune = app->view_controller; |     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)); | ||||||
|     if(tune->is_dirty()) { |         furi_hal_rfid_set_read_pulse(lfrfid_debug_view_tune_get_ccr(app->tune_view)); | ||||||
|         furi_hal_rfid_set_read_period(tune->get_ARR()); |  | ||||||
|         furi_hal_rfid_set_read_pulse(tune->get_CCR()); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return consumed; |     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_stop(); | ||||||
|     furi_hal_rfid_comp_set_callback(NULL, NULL); |     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( | App( | ||||||
|     appid="delay_test", |     appid="delay_test", | ||||||
|     name="Delay Test", |     name="Delay Test", | ||||||
|     apptype=FlipperAppType.DEBUG, |     apptype=FlipperAppType.SYSTEM, | ||||||
|     entry_point="delay_test_app", |     entry_point="delay_test_app", | ||||||
|     stack_size=1 * 1024, |     stack_size=1 * 1024, | ||||||
|     requires=["unit_tests"], |     requires=["unit_tests"], | ||||||
| @ -1,6 +1,6 @@ | |||||||
| #include <furi.h> | #include <furi.h> | ||||||
| #include <furi_hal.h> | #include <furi_hal.h> | ||||||
| #include <applications/storage/storage.h> | #include <storage/storage.h> | ||||||
| #include <lib/flipper_format/flipper_format.h> | #include <lib/flipper_format/flipper_format.h> | ||||||
| #include <lib/nfc/protocols/nfca.h> | #include <lib/nfc/protocols/nfca.h> | ||||||
| #include <lib/digital_signal/digital_signal.h> | #include <lib/digital_signal/digital_signal.h> | ||||||
| @ -13,7 +13,7 @@ | |||||||
| #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") | #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 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_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 | #define TEST_TIMEOUT 10000 | ||||||
| 
 | 
 | ||||||
| static SubGhzEnvironment* environment_handler; | static SubGhzEnvironment* environment_handler; | ||||||
| @ -434,6 +434,13 @@ MU_TEST(subghz_decoder_clemsa_test) { | |||||||
|         "Test decoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n"); |         "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
 | //test encoders
 | ||||||
| MU_TEST(subghz_encoder_princeton_test) { | MU_TEST(subghz_encoder_princeton_test) { | ||||||
|     mu_assert( |     mu_assert( | ||||||
| @ -595,6 +602,7 @@ MU_TEST_SUITE(subghz) { | |||||||
|     MU_RUN_TEST(subghz_decoder_magellen_test); |     MU_RUN_TEST(subghz_decoder_magellen_test); | ||||||
|     MU_RUN_TEST(subghz_decoder_intertechno_v3_test); |     MU_RUN_TEST(subghz_decoder_intertechno_v3_test); | ||||||
|     MU_RUN_TEST(subghz_decoder_clemsa_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_princeton_test); | ||||||
|     MU_RUN_TEST(subghz_encoder_came_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