diff --git a/.cproject b/.cproject
index 317be43f..1acdb895 100644
--- a/.cproject
+++ b/.cproject
@@ -29,4 +29,4 @@
-
+
\ No newline at end of file
diff --git a/.project b/.project
index fb53512a..20702302 100644
--- a/.project
+++ b/.project
@@ -17,4 +17,4 @@
org.eclipse.cdt.core.ccnature
com.espressif.idf.core.idfNature
-
+
\ No newline at end of file
diff --git a/.settings/com.googlecode.cppcheclipse.core.prefs b/.settings/com.googlecode.cppcheclipse.core.prefs
deleted file mode 100644
index b21d0f0a..00000000
--- a/.settings/com.googlecode.cppcheclipse.core.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-suppressions=rO0ABXNyAAxqYXZhLmlvLkZpbGUELaRFDg3k/wMAAUwABHBhdGh0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAJWNvbXBvbmVudHNcd2lmaS1tYW5hZ2VyXGh0dHBfc2VydmVyLmN3AgBceA\=\=;comparePointers;395\!rO0ABXNyAAxqYXZhLmlvLkZpbGUELaRFDg3k/wMAAUwABHBhdGh0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAE21haW5cZXNwX2FwcF9tYWluLmN3AgBceA\=\=;comparePointers;176\!rO0ABXNyAAxqYXZhLmlvLkZpbGUELaRFDg3k/wMAAUwABHBhdGh0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAJ2NvbXBvbmVudHNcdGVsbmV0XGxpYnRlbG5ldFxsaWJ0ZWxuZXQuY3cCAFx4;va_list_usedBeforeStarted;2147483647\!
diff --git a/.settings/org.eclipse.cdt.codan.core.prefs b/.settings/org.eclipse.cdt.codan.core.prefs
deleted file mode 100644
index 9a577d2b..00000000
--- a/.settings/org.eclipse.cdt.codan.core.prefs
+++ /dev/null
@@ -1,89 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.cdt.codan.checkers.errnoreturn=Warning
-org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return\\")",implicit\=>false}
-org.eclipse.cdt.codan.checkers.errreturnvalue=Error
-org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused return value\\")"}
-org.eclipse.cdt.codan.checkers.nocommentinside=-Error
-org.eclipse.cdt.codan.checkers.nocommentinside.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Nesting comments\\")"}
-org.eclipse.cdt.codan.checkers.nolinecomment=-Error
-org.eclipse.cdt.codan.checkers.nolinecomment.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Line comments\\")"}
-org.eclipse.cdt.codan.checkers.noreturn=Error
-org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return value\\")",implicit\=>false}
-org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error
-org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Abstract class cannot be instantiated\\")"}
-org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error
-org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Ambiguous problem\\")"}
-org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment in condition\\")"}
-org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error
-org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment to itself\\")"}
-org.eclipse.cdt.codan.internal.checkers.CStyleCastProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.CStyleCastProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"C-Style cast instead of C++ cast\\")"}
-org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No break at end of case\\")",no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false,enable_fallthrough_quickfix_param\=>false}
-org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning
-org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Catching by reference is recommended\\")",unknown\=>false,exceptions\=>()}
-org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error
-org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Circular inheritance\\")"}
-org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning
-org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class members should be properly initialized\\")",skip\=>true}
-org.eclipse.cdt.codan.internal.checkers.CopyrightProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.CopyrightProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Lack of copyright information\\")",regex\=>".*Copyright.*"}
-org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem=Error
-org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid 'decltype(auto)' specifier\\")"}
-org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Field cannot be resolved\\")"}
-org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Function cannot be resolved\\")"}
-org.eclipse.cdt.codan.internal.checkers.GotoStatementProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.GotoStatementProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Goto statement used\\")"}
-org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error
-org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid arguments\\")"}
-org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error
-org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid template argument\\")"}
-org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error
-org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Label statement not found\\")"}
-org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error
-org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Member declaration not found\\")"}
-org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Method cannot be resolved\\")"}
-org.eclipse.cdt.codan.internal.checkers.MissCaseProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.MissCaseProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing cases in switch\\")"}
-org.eclipse.cdt.codan.internal.checkers.MissDefaultProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.MissDefaultProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing default in switch\\")",defaultWithAllEnums\=>false}
-org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info
-org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Name convention for function\\")",pattern\=>"^[a-z]",macro\=>true,exceptions\=>()}
-org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class has a virtual method and non-virtual destructor\\")"}
-org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error
-org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid overload\\")"}
-org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error
-org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redeclaration\\")"}
-org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redefinition\\")"}
-org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Return with parenthesis\\")"}
-org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Format String Vulnerability\\")"}
-org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Statement has no effect\\")",macro\=>true,exceptions\=>()}
-org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suggested parenthesis around expression\\")",paramNot\=>false}
-org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suspicious semicolon\\")",else\=>false,afterelse\=>false}
-org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Type cannot be resolved\\")"}
-org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused function declaration\\")",macro\=>true}
-org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused static function\\")",macro\=>true}
-org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning
-org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused variable declaration in file scope\\")",macro\=>true,exceptions\=>("@(\#)","$Id")}
-org.eclipse.cdt.codan.internal.checkers.UsingInHeaderProblem=-Warning
-org.eclipse.cdt.codan.internal.checkers.UsingInHeaderProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Using directive in header\\")"}
-org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error
-org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Symbol is not resolved\\")"}
-org.eclipse.cdt.codan.internal.checkers.VirtualMethodCallProblem=-Error
-org.eclipse.cdt.codan.internal.checkers.VirtualMethodCallProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Virtual method call in constructor/destructor\\")"}
-org.eclipse.cdt.qt.core.qtproblem=Warning
-org.eclipse.cdt.qt.core.qtproblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>true,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
diff --git a/components/platform_config/CMakeLists.txt b/components/platform_config/CMakeLists.txt
index 876257f4..117dbbff 100644
--- a/components/platform_config/CMakeLists.txt
+++ b/components/platform_config/CMakeLists.txt
@@ -1,7 +1,7 @@
idf_component_register( SRC_DIRS .
INCLUDE_DIRS .
- PRIV_REQUIRES json tools newlib console esp_common freertos
- REQUIRES nvs_flash
+ PRIV_REQUIRES tools newlib console esp_common freertos
+ REQUIRES nvs_flash json
)
diff --git a/components/platform_console/CMakeLists.txt b/components/platform_console/CMakeLists.txt
index 3272fb5c..8dc3e512 100644
--- a/components/platform_console/CMakeLists.txt
+++ b/components/platform_console/CMakeLists.txt
@@ -7,5 +7,6 @@ idf_component_register( SRCS
platform_console.c
INCLUDE_DIRS .
REQUIRES nvs_flash
- PRIV_REQUIRES console tools services spi_flash app_update platform_config vfs pthread wifi-manager platform_config codecs newlib )
-target_link_libraries(__idf_platform_console ${build_dir}/esp-idf/$/lib$.a )
+ PRIV_REQUIRES console tools services spi_flash app_update platform_config vfs pthread wifi-manager platform_config newlib telnet display)
+target_link_libraries(${COMPONENT_LIB} ${build_dir}/esp-idf/$/lib$.a )
+
diff --git a/components/platform_console/app_squeezelite/CMakeLists.txt b/components/platform_console/app_squeezelite/CMakeLists.txt
index 3af2ae78..738fd047 100644
--- a/components/platform_console/app_squeezelite/CMakeLists.txt
+++ b/components/platform_console/app_squeezelite/CMakeLists.txt
@@ -1,4 +1,6 @@
idf_component_register( SRC_DIRS .
INCLUDE_DIRS .
- PRIV_REQUIRES console squeezelite pthread tools platform_config)
+ PRIV_REQUIRES console codecs squeezelite newlib pthread tools platform_config)
+target_link_libraries(${COMPONENT_LIB} INTERFACE "-Wl,--undefined=feof")
+target_link_libraries(${COMPONENT_LIB} INTERFACE "-Wl,--undefined=fdopen")
diff --git a/components/platform_console/platform_console.c b/components/platform_console/platform_console.c
index b65f2474..73f9309e 100644
--- a/components/platform_console/platform_console.c
+++ b/components/platform_console/platform_console.c
@@ -35,7 +35,7 @@
#include "gds_text.h"
#include "gds_font.h"
#include "display.h"
-#include "cmd_squeezelite.h"
+
#include "config.h"
pthread_t thread_console;
static void * console_thread();
diff --git a/components/squeezelite-ota/CMakeLists.txt b/components/squeezelite-ota/CMakeLists.txt
index a0276051..2a847e22 100644
--- a/components/squeezelite-ota/CMakeLists.txt
+++ b/components/squeezelite-ota/CMakeLists.txt
@@ -1,7 +1,7 @@
idf_component_register(SRC_DIRS .
INCLUDE_DIRS .
REQUIRES app_update esp_https_ota
- PRIV_REQUIRES console tools platform_config spi_flash vfs console freertos platform_console
+ PRIV_REQUIRES console tools display services platform_config spi_flash vfs console freertos platform_console
)
diff --git a/components/squeezelite-ota/squeezelite-ota.c b/components/squeezelite-ota/squeezelite-ota.c
index ea7bd719..16e541ab 100644
--- a/components/squeezelite-ota/squeezelite-ota.c
+++ b/components/squeezelite-ota/squeezelite-ota.c
@@ -20,7 +20,7 @@
#include "esp_err.h"
#include "tcpip_adapter.h"
#include "squeezelite-ota.h"
-#include "config.h"
+#include "platform_config.h"
#include
#include
#include
@@ -35,6 +35,7 @@
#include "gds.h"
#include "gds_text.h"
#include "gds_draw.h"
+#include "platform_esp32.h"
extern const char * get_certificate();
@@ -782,9 +783,9 @@ esp_err_t process_recovery_ota(const char * bin_url, char * bin_buffer, uint32_t
esp_err_t start_ota(const char * bin_url, char * bin_buffer, uint32_t length)
{
-#if RECOVERY_APPLICATION
- return process_recovery_ota(bin_url,bin_buffer,length);
-#else
+ if(is_recovery_running){
+ return process_recovery_ota(bin_url,bin_buffer,length);
+ }
if(!bin_url){
ESP_LOGE(TAG,"missing URL parameter. Unable to start OTA");
return ESP_ERR_INVALID_ARG;
@@ -802,5 +803,5 @@ esp_err_t start_ota(const char * bin_url, char * bin_buffer, uint32_t length)
ESP_LOGW(TAG, "Rebooting to recovery to complete the installation");
return guided_factory();
return ESP_OK;
-#endif
+
}
diff --git a/components/squeezelite-ota/squeezelite-ota.h b/components/squeezelite-ota/squeezelite-ota.h
index c523d3cc..7a13959e 100644
--- a/components/squeezelite-ota/squeezelite-ota.h
+++ b/components/squeezelite-ota/squeezelite-ota.h
@@ -26,7 +26,7 @@
// tasks
#define OTA_TASK_PRIOTITY 6
-esp_err_t start_ota(const char * bin_url);
+
const char * ota_get_status();
uint8_t ota_get_pct_complete();
diff --git a/components/squeezelite/CMakeLists.txt b/components/squeezelite/CMakeLists.txt
index 07e8249e..0e58cef4 100644
--- a/components/squeezelite/CMakeLists.txt
+++ b/components/squeezelite/CMakeLists.txt
@@ -2,12 +2,14 @@
idf_component_register( SRC_DIRS . external a1s tas57xx
INCLUDE_DIRS . a1s
- PRIV_REQUIRES newlib
+ PRIV_REQUIRES
+ codecs
+ newlib
esp_common
esp-dsp
platform_config
bluetooth
- codecs
+
services
raop
display
diff --git a/components/wifi-manager/CMakeLists.txt b/components/wifi-manager/CMakeLists.txt
index a1645f27..1ffcd350 100644
--- a/components/wifi-manager/CMakeLists.txt
+++ b/components/wifi-manager/CMakeLists.txt
@@ -1,7 +1,8 @@
idf_component_register( SRC_DIRS .
- INCLUDE_DIRS .
+ INCLUDE_DIRS . ${IDF_PATH}/components/esp_http_server/src ${IDF_PATH}/components/esp_http_server/src/port/esp32 ${IDF_PATH}/components/esp_http_server/src/util ${IDF_PATH}/components/esp_http_server/src/
REQUIRES squeezelite-ota json mdns
- PRIV_REQUIRES tools services platform_config esp_common json newlib freertos spi_flash nvs_flash mdns pthread wpa_supplicant platform_console
+ PRIV_REQUIRES tools services platform_config esp_common json newlib freertos spi_flash nvs_flash mdns pthread wpa_supplicant platform_console esp_http_server
EMBED_FILES style.css code.js index.html bootstrap.min.css.gz jquery.min.js.gz popper.min.js.gz bootstrap.min.js.gz
+
)
diff --git a/components/wifi-manager/http_server_handlers.c b/components/wifi-manager/http_server_handlers.c
index 5e6f7b25..6607d912 100644
--- a/components/wifi-manager/http_server_handlers.c
+++ b/components/wifi-manager/http_server_handlers.c
@@ -45,7 +45,7 @@ function to process requests, decode URLs, serve files, etc. etc.
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
-#include "config.h"
+#include "platform_config.h"
#include "sys/param.h"
#include "esp_vfs.h"
#include "lwip/ip_addr.h"
@@ -663,11 +663,13 @@ esp_err_t config_post_handler(httpd_req_t *req){
cJSON_Delete(root);
if(bOTA) {
-#if RECOVERY_APPLICATION
- ESP_LOGW_LOC(TAG, "Starting process OTA for url %s",otaURL);
-#else
- ESP_LOGW_LOC(TAG, "Restarting system to process OTA for url %s",otaURL);
-#endif
+ if(is_recovery_running){
+ ESP_LOGW_LOC(TAG, "Starting process OTA for url %s",otaURL);
+ }
+ else {
+ ESP_LOGW_LOC(TAG, "Restarting system to process OTA for url %s",otaURL);
+ }
+
wifi_manager_reboot_ota(otaURL);
free(otaURL);
}
@@ -805,82 +807,83 @@ esp_err_t recovery_post_handler(httpd_req_t *req){
return ESP_OK;
}
-#if RECOVERY_APPLICATION
+
esp_err_t flash_post_handler(httpd_req_t *req){
- ESP_LOGD_LOC(TAG, "serving [%s]", req->uri);
- char success[]="File uploaded. Flashing started.";
- if(!is_user_authenticated(req)){
- // todo: redirect to login page
- // return ESP_OK;
- }
- esp_err_t err = httpd_resp_set_type(req, HTTPD_TYPE_TEXT);
- if(err != ESP_OK){
- return err;
- }
- char * binary_buffer = malloc(req->content_len);
- if(binary_buffer == NULL){
- ESP_LOGE(TAG, "File too large : %d bytes", req->content_len);
- /* Respond with 400 Bad Request */
- httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST,
- "Binary file too large. Unable to allocate memory!");
- return ESP_FAIL;
- }
- ESP_LOGI(TAG, "Receiving ota binary file");
- /* Retrieve the pointer to scratch buffer for temporary storage */
- char *buf = ((rest_server_context_t *)(req->user_ctx))->scratch;
+ esp_err_t err =ESP_OK;
+ if(is_recovery_running){
+ ESP_LOGD_LOC(TAG, "serving [%s]", req->uri);
+ char success[]="File uploaded. Flashing started.";
+ if(!is_user_authenticated(req)){
+ // todo: redirect to login page
+ // return ESP_OK;
+ }
+ err = httpd_resp_set_type(req, HTTPD_TYPE_TEXT);
+ if(err != ESP_OK){
+ return err;
+ }
+ char * binary_buffer = malloc(req->content_len);
+ if(binary_buffer == NULL){
+ ESP_LOGE(TAG, "File too large : %d bytes", req->content_len);
+ /* Respond with 400 Bad Request */
+ httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST,
+ "Binary file too large. Unable to allocate memory!");
+ return ESP_FAIL;
+ }
+ ESP_LOGI(TAG, "Receiving ota binary file");
+ /* Retrieve the pointer to scratch buffer for temporary storage */
+ char *buf = ((rest_server_context_t *)(req->user_ctx))->scratch;
- char *head=binary_buffer;
- int received;
+ char *head=binary_buffer;
+ int received;
- /* Content length of the request gives
- * the size of the file being uploaded */
- int remaining = req->content_len;
+ /* Content length of the request gives
+ * the size of the file being uploaded */
+ int remaining = req->content_len;
- while (remaining > 0) {
+ while (remaining > 0) {
- ESP_LOGI(TAG, "Remaining size : %d", remaining);
- /* Receive the file part by part into a buffer */
- if ((received = httpd_req_recv(req, buf, MIN(remaining, SCRATCH_BUFSIZE))) <= 0) {
- if (received == HTTPD_SOCK_ERR_TIMEOUT) {
- /* Retry if timeout occurred */
- continue;
+ ESP_LOGI(TAG, "Remaining size : %d", remaining);
+ /* Receive the file part by part into a buffer */
+ if ((received = httpd_req_recv(req, buf, MIN(remaining, SCRATCH_BUFSIZE))) <= 0) {
+ if (received == HTTPD_SOCK_ERR_TIMEOUT) {
+ /* Retry if timeout occurred */
+ continue;
+ }
+ FREE_RESET(binary_buffer);
+ ESP_LOGE(TAG, "File reception failed!");
+ /* Respond with 500 Internal Server Error */
+ httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Failed to receive file");
+ err = ESP_FAIL;
+ goto bail_out;
}
- FREE_RESET(binary_buffer);
- ESP_LOGE(TAG, "File reception failed!");
- /* Respond with 500 Internal Server Error */
- httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Failed to receive file");
- err = ESP_FAIL;
+
+ /* Write buffer content to file on storage */
+ if (received ) {
+ memcpy(head,buf,received );
+ head+=received;
+ }
+
+ /* Keep track of remaining size of
+ * the file left to be uploaded */
+ remaining -= received;
+ }
+
+ /* Close file upon upload completion */
+ ESP_LOGI(TAG, "File reception complete. Invoking OTA process.");
+ err = start_ota(NULL, binary_buffer, req->content_len);
+ if(err!=ESP_OK){
+ httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "OTA processing failed");
goto bail_out;
}
- /* Write buffer content to file on storage */
- if (received ) {
- memcpy(head,buf,received );
- head+=received;
- }
-
- /* Keep track of remaining size of
- * the file left to be uploaded */
- remaining -= received;
+ //todo: handle this in ajax. For now, just send the root page
+ httpd_resp_send(req, (const char *)success, strlen(success));
}
-
- /* Close file upon upload completion */
- ESP_LOGI(TAG, "File reception complete. Invoking OTA process.");
- err = start_ota(NULL, binary_buffer, req->content_len);
- if(err!=ESP_OK){
- httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "OTA processing failed");
- goto bail_out;
- }
-
- //todo: handle this in ajax. For now, just send the root page
- httpd_resp_send(req, (const char *)success, strlen(success));
-
bail_out:
return err;
}
-#endif
char * get_ap_ip_address(){
static char ap_ip_address[IP4ADDR_STRLEN_MAX]={};
diff --git a/components/wifi-manager/http_server_handlers.h b/components/wifi-manager/http_server_handlers.h
index 390394a1..fbaaabf5 100644
--- a/components/wifi-manager/http_server_handlers.h
+++ b/components/wifi-manager/http_server_handlers.h
@@ -88,9 +88,7 @@ esp_err_t connect_delete_handler(httpd_req_t *req);
esp_err_t reboot_ota_post_handler(httpd_req_t *req);
esp_err_t reboot_post_handler(httpd_req_t *req);
esp_err_t recovery_post_handler(httpd_req_t *req);
-#if RECOVERY_APPLICATION
esp_err_t flash_post_handler(httpd_req_t *req);
-#endif
esp_err_t status_get_handler(httpd_req_t *req);
esp_err_t messages_get_handler(httpd_req_t *req);
@@ -111,13 +109,13 @@ typedef struct rest_server_context {
* @brief RTOS task for the HTTP server. Do not start manually.
* @see void http_server_start()
*/
-void CODE_RAM_LOCATION http_server(void *pvParameters);
+void http_server(void *pvParameters);
/* @brief helper function that processes one HTTP request at a time */
-void CODE_RAM_LOCATION http_server_netconn_serve(struct netconn *conn);
+void http_server_netconn_serve(struct netconn *conn);
/* @brief create the task for the http server */
-esp_err_t CODE_RAM_LOCATION http_server_start();
+esp_err_t http_server_start();
/**
* @brief gets a char* pointer to the first occurence of header_name withing the complete http request request.
@@ -130,9 +128,9 @@ esp_err_t CODE_RAM_LOCATION http_server_start();
* @param len the size of the header value if found.
* @return pointer to the beginning of the header value.
*/
-char* CODE_RAM_LOCATION http_server_get_header(char *request, char *header_name, int *len);
+char* http_server_get_header(char *request, char *header_name, int *len);
-void CODE_RAM_LOCATION strreplace(char *src, char *str, char *rep);
+void strreplace(char *src, char *str, char *rep);
/* @brief lock the json config object */
bool http_server_lock_json_object(TickType_t xTicksToWait);
/* @brief unlock the json config object */
diff --git a/components/wifi-manager/wifi_manager.c b/components/wifi-manager/wifi_manager.c
index bee31721..090b4a7b 100644
--- a/components/wifi-manager/wifi_manager.c
+++ b/components/wifi-manager/wifi_manager.c
@@ -1440,7 +1440,7 @@ void wifi_manager( void * pvParameters ){
break;
case ORDER_RESTART_OTA_URL:
ESP_LOGD(TAG, "Calling start_ota.");
- start_ota(msg.param);
+ start_ota(msg.param, NULL, 0);
free(msg.param);
break;
diff --git a/components/wifi-manager/wifi_manager.h b/components/wifi-manager/wifi_manager.h
index 9aa12da6..4d61fead 100644
--- a/components/wifi-manager/wifi_manager.h
+++ b/components/wifi-manager/wifi_manager.h
@@ -42,17 +42,6 @@ extern "C" {
#include "squeezelite-ota.h"
#include "cJSON.h"
-#ifndef RECOVERY_APPLICATION
-#error "RECOVERY_APPLICATION not defined. Defaulting to squeezelite"
-#endif
-
-#if RECOVERY_APPLICATION==1
-#elif RECOVERY_APPLICATION==0
-#else
-#error "unknown configuration"
-#endif
-
-
/**
* @brief Defines the maximum size of a SSID name. 32 is IEEE standard.
diff --git a/components/wifi-manager/wifi_manager_http_server.c b/components/wifi-manager/wifi_manager_http_server.c
index deb91352..207283a8 100644
--- a/components/wifi-manager/wifi_manager_http_server.c
+++ b/components/wifi-manager/wifi_manager_http_server.c
@@ -31,6 +31,7 @@
#include "freertos/task.h"
#include "config.h"
#include "messaging.h"
+#include "platform_esp32.h"
static const char TAG[] = "http_server";
static httpd_handle_t _server = NULL;
@@ -74,13 +75,10 @@ void register_regular_handlers(httpd_handle_t server){
httpd_uri_t connect_delete = { .uri = "/connect.json", .method = HTTP_DELETE, .handler = connect_delete_handler, .user_ctx = rest_context };
httpd_register_uri_handler(server, &connect_delete);
-#if RECOVERY_APPLICATION
-
- httpd_uri_t flash_post = { .uri = "/flash.json", .method = HTTP_POST, .handler = flash_post_handler, .user_ctx = rest_context };
- httpd_register_uri_handler(server, &flash_post);
-#endif
-
-
+ if(is_recovery_running){
+ httpd_uri_t flash_post = { .uri = "/flash.json", .method = HTTP_POST, .handler = flash_post_handler, .user_ctx = rest_context };
+ httpd_register_uri_handler(server, &flash_post);
+ }
// from https://github.com/tripflex/wifi-captive-portal/blob/master/src/mgos_wifi_captive_portal.c
// https://unix.stackexchange.com/questions/432190/why-isnt-androids-captive-portal-detection-triggering-a-browser-window
// Known HTTP GET requests to check for Captive Portal
diff --git a/main/esp_app_main.c b/main/esp_app_main.c
index 54acbfac..fa6a8a04 100644
--- a/main/esp_app_main.c
+++ b/main/esp_app_main.c
@@ -76,18 +76,6 @@ const char * str_or_unknown(const char * str) { return (str?str:unknown_string_p
/* brief this is an exemple of a callback that you can setup in your own app to get notified of wifi manager event */
void cb_connection_got_ip(void *pvParameter){
- static ip4_addr_t ip;
- tcpip_adapter_ip_info_t ipInfo;
-
- tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);
- if (ip.addr && ipInfo.ip.addr != ip.addr) {
- ESP_LOGW(TAG, "IP change, need to reboot");
- if(!wait_for_commit()){
- ESP_LOGW(TAG,"Unable to commit configuration. ");
- }
- esp_restart();
- }
- ip.addr = ipInfo.ip.addr;
ESP_LOGI(TAG, "I have a connection!");
messaging_post_message(MESSAGING_INFO,MESSAGING_CLASS_SYSTEM,"Wifi connected");
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
@@ -442,7 +430,7 @@ void app_main()
taskYIELD();
}
ESP_LOGI(TAG,"Updating firmware from link: %s",fwurl);
- start_ota(fwurl);
+ start_ota(fwurl, NULL, 0);
}
else {
ESP_LOGE(TAG,"Restarted to application partition. We're not going to perform OTA!");
diff --git a/squeezelite.cmake b/squeezelite.cmake
index 2190d648..d93760e2 100644
--- a/squeezelite.cmake
+++ b/squeezelite.cmake
@@ -1,5 +1,7 @@
+#include($ENV{IDF_PATH}/components/esptool_py/project_include.cmake)
+
if(NOT SDKCONFIG OR NOT IDF_PATH OR NOT IDF_TARGET )
message(FATAL_ERROR "squeezelite should not be made outside of the main project !")
endif()