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"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
3
.vscode/example/settings.json
vendored
3
.vscode/example/settings.json
vendored
@ -12,6 +12,9 @@
|
|||||||
"cortex-debug.openocdPath.windows": "${workspaceFolder}/toolchain/i686-windows/openocd/bin/openocd.exe",
|
"cortex-debug.openocdPath.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",
|
||||||
|
|||||||
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
|
||||||
|
|
||||||
|
Applications for factory testing the Flipper.
|
||||||
|
|
||||||
- `accessor` - Wiegand server
|
- `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