559 changed files with 358233 additions and 0 deletions
@ -0,0 +1,223 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
|
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> |
||||
|
<storageModule moduleId="org.eclipse.cdt.core.settings"> |
||||
|
<cconfiguration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1900810912"> |
||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1900810912" moduleId="org.eclipse.cdt.core.settings" name="Debug"> |
||||
|
<externalSettings/> |
||||
|
<extensions> |
||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
</extensions> |
||||
|
</storageModule> |
||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> |
||||
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1900810912" name="Debug" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug"> |
||||
|
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1900810912." name="/" resourcePath=""> |
||||
|
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.1999310814" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.555556475" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32H743VGTx" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1242211636" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.2000965024" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.227974202" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv5-d16" valueType="enumerated"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.381957633" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.768448908" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1099763806" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.5 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32H743VGTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/LwIP/src/include/netif/ppp | ../Middlewares/Third_Party/LwIP/src/include/lwip/priv | ../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/LwIP/src/include/compat/stdc | ../Middlewares/Third_Party/LwIP/src/include/lwip/prot | ../Middlewares/Third_Party/LwIP/src/include/lwip/apps | ../Middlewares/Third_Party/LwIP/src/include/compat/posix/sys | ../Middlewares/Third_Party/LwIP/system/arch | ../Middlewares/Third_Party/LwIP/src/include | ../LWIP/App | ../Middlewares/Third_Party/LwIP/src/include/compat/posix | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/CMSIS/Device/ST/STM32H7xx/Include | ../LWIP/Target | ../Middlewares/Third_Party/LwIP/src/include/lwip | ../Middlewares/Third_Party/LwIP/src/include/compat/posix/net | ../Middlewares/Third_Party/LwIP/src/include/compat/posix/arpa | ../Drivers/STM32H7xx_HAL_Driver/Inc | ../Middlewares/Third_Party/LwIP/system | ../Drivers/BSP/Components/lan8742 | ../Middlewares/Third_Party/LwIP/src/include/netif || || || USE_HAL_DRIVER | STM32H743xx || || LWIP | Drivers | Core/Startup | Middlewares | Core || || || ${workspace_loc:/${ProjName}/STM32H743VGTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.566417622" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="200" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.1144694120" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" useByScannerDiscovery="false" value="true" valueType="boolean"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.148962052" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" useByScannerDiscovery="false" value="true" valueType="boolean"/> |
||||
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.2019032613" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> |
||||
|
<builder buildPath="${workspace_loc:/BHBF_Robot_Detect}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1752705428" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.70866068" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.133108927" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/> |
||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols.2062091936" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols" valueType="definedSymbols"> |
||||
|
<listOptionValue builtIn="false" value="DEBUG"/> |
||||
|
</option> |
||||
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.1067181325" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> |
||||
|
</tool> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1206119803" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1004986992" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g3" valueType="enumerated"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.613764472" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false"/> |
||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1100922921" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols"> |
||||
|
<listOptionValue builtIn="false" value="DEBUG"/> |
||||
|
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/> |
||||
|
<listOptionValue builtIn="false" value="STM32H743xx"/> |
||||
|
</option> |
||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.1592849673" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath"> |
||||
|
<listOptionValue builtIn="false" value="../Core/Inc"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/STM32H7xx_HAL_Driver/Inc"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32H7xx/Include"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/> |
||||
|
<listOptionValue builtIn="false" value="../LWIP/App"/> |
||||
|
<listOptionValue builtIn="false" value="../LWIP/Target"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/system"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/BSP/Components/lan8742"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/netif/ppp"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/lwip"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/lwip/apps"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/lwip/priv"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/lwip/prot"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/netif"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/posix"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/posix/arpa"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/posix/net"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/posix/sys"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/stdc"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/system/arch"/> |
||||
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Core/Protobuf/PSource}""/> |
||||
|
<listOptionValue builtIn="false" value="../BASE/Inc/BSP"/> |
||||
|
<listOptionValue builtIn="false" value="../BASE/Inc/MSP"/> |
||||
|
<listOptionValue builtIn="false" value="../BASE/Inc/BSP/DLT"/> |
||||
|
<listOptionValue builtIn="false" value="../BASE/Inc/MSP/SteerEngine"/> |
||||
|
</option> |
||||
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1875395144" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/> |
||||
|
</tool> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.1331254744" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.1181398770" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g3" valueType="enumerated"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1136913521" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false"/> |
||||
|
</tool> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.781122670" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.975060295" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32H743VGTX_FLASH.ld}" valueType="string"/> |
||||
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.126109057" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input"> |
||||
|
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> |
||||
|
<additionalInput kind="additionalinput" paths="$(LIBS)"/> |
||||
|
</inputType> |
||||
|
</tool> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.618192742" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.1782033746" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.436382718" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.1980650523" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.1120618345" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.152900436" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.1601259826" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.1941358903" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.799850565" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/> |
||||
|
</toolChain> |
||||
|
</folderInfo> |
||||
|
<sourceEntries> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="BASE"/> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="LWIP"/> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/> |
||||
|
</sourceEntries> |
||||
|
</configuration> |
||||
|
</storageModule> |
||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> |
||||
|
</cconfiguration> |
||||
|
<cconfiguration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1322898427"> |
||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1322898427" moduleId="org.eclipse.cdt.core.settings" name="Release"> |
||||
|
<externalSettings/> |
||||
|
<extensions> |
||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> |
||||
|
</extensions> |
||||
|
</storageModule> |
||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> |
||||
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1322898427" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release"> |
||||
|
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1322898427." name="/" resourcePath=""> |
||||
|
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1547597857" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1410470689" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32H743VGTx" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.870155125" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.2018066716" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.992567197" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv5-d16" valueType="enumerated"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1144232392" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.194020544" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.2100472703" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.5 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32H743VGTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/LwIP/src/include/netif/ppp | ../Middlewares/Third_Party/LwIP/src/include/lwip/priv | ../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/LwIP/src/include/compat/stdc | ../Middlewares/Third_Party/LwIP/src/include/lwip/prot | ../Middlewares/Third_Party/LwIP/src/include/lwip/apps | ../Middlewares/Third_Party/LwIP/src/include/compat/posix/sys | ../Middlewares/Third_Party/LwIP/system/arch | ../Middlewares/Third_Party/LwIP/src/include | ../LWIP/App | ../Middlewares/Third_Party/LwIP/src/include/compat/posix | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/CMSIS/Device/ST/STM32H7xx/Include | ../LWIP/Target | ../Middlewares/Third_Party/LwIP/src/include/lwip | ../Middlewares/Third_Party/LwIP/src/include/compat/posix/net | ../Middlewares/Third_Party/LwIP/src/include/compat/posix/arpa | ../Drivers/STM32H7xx_HAL_Driver/Inc | ../Middlewares/Third_Party/LwIP/system | ../Drivers/BSP/Components/lan8742 | ../Middlewares/Third_Party/LwIP/src/include/netif || || || USE_HAL_DRIVER | STM32H743xx || || LWIP | Drivers | Core/Startup | Middlewares | Core || || || ${workspace_loc:/${ProjName}/STM32H743VGTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.349585402" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="200" valueType="string"/> |
||||
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.504050356" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> |
||||
|
<builder buildPath="${workspace_loc:/BHBF_Robot_Detect}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1435115632" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1473308058" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.1607051634" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/> |
||||
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.1586091832" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> |
||||
|
</tool> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.319656371" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.555485472" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1106343697" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/> |
||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1261730363" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols"> |
||||
|
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/> |
||||
|
<listOptionValue builtIn="false" value="STM32H743xx"/> |
||||
|
</option> |
||||
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.6601227" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath"> |
||||
|
<listOptionValue builtIn="false" value="../Core/Inc"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/STM32H7xx_HAL_Driver/Inc"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32H7xx/Include"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/> |
||||
|
<listOptionValue builtIn="false" value="../LWIP/App"/> |
||||
|
<listOptionValue builtIn="false" value="../LWIP/Target"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/system"/> |
||||
|
<listOptionValue builtIn="false" value="../Drivers/BSP/Components/lan8742"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/netif/ppp"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/lwip"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/lwip/apps"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/lwip/priv"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/lwip/prot"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/netif"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/posix"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/posix/arpa"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/posix/net"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/posix/sys"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/src/include/compat/stdc"/> |
||||
|
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/LwIP/system/arch"/> |
||||
|
</option> |
||||
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1819991972" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/> |
||||
|
</tool> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.1052291925" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.1211650127" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g0" valueType="enumerated"/> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.624188949" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/> |
||||
|
</tool> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.476422491" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker"> |
||||
|
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1905838036" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32H743VGTX_FLASH.ld}" valueType="string"/> |
||||
|
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1723740925" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input"> |
||||
|
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> |
||||
|
<additionalInput kind="additionalinput" paths="$(LIBS)"/> |
||||
|
</inputType> |
||||
|
</tool> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.1709704951" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.1745189211" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.802105533" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.830267809" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.1134210813" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.1134287782" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.1854232311" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.2088908787" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec"/> |
||||
|
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.800843731" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/> |
||||
|
</toolChain> |
||||
|
</folderInfo> |
||||
|
<sourceEntries> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="LWIP"/> |
||||
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/> |
||||
|
</sourceEntries> |
||||
|
</configuration> |
||||
|
</storageModule> |
||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> |
||||
|
</cconfiguration> |
||||
|
</storageModule> |
||||
|
<storageModule moduleId="org.eclipse.cdt.core.pathentry"/> |
||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> |
||||
|
<project id="BHBF_Robot_Detect.null.793203229" name="BHBF_Robot_Detect"/> |
||||
|
</storageModule> |
||||
|
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> |
||||
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> |
||||
|
<storageModule moduleId="scannerConfiguration"> |
||||
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> |
||||
|
<scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1322898427;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1322898427.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.319656371;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1819991972"> |
||||
|
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/> |
||||
|
</scannerConfigBuildInfo> |
||||
|
<scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1900810912;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1900810912.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1206119803;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1875395144"> |
||||
|
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/> |
||||
|
</scannerConfigBuildInfo> |
||||
|
</storageModule> |
||||
|
<storageModule moduleId="refreshScope"/> |
||||
|
</cproject> |
||||
@ -0,0 +1,2 @@ |
|||||
|
/Release/ |
||||
|
/Debug/ |
||||
@ -0,0 +1,18 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<Configuration status="info"> |
||||
|
<ThresholdFilter level="INFO"/> |
||||
|
<Appenders> |
||||
|
<RollingFile name="DEBUGFILE" fileName="E:/BingooWorkingSpace/BHBF_Robot_Detect/.metadata/.ide.log" filePattern="E:/BingooWorkingSpace/BHBF_Robot_Detect/.metadata/.ide.log-%d{yyyy-MM-dd}.log"> |
||||
|
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %c{1}:%L - %m%n" /> |
||||
|
<Policies> |
||||
|
<TimeBasedTriggeringPolicy interval="1" modulate="true" /> |
||||
|
<SizeBasedTriggeringPolicy size="50MB"/> |
||||
|
</Policies> |
||||
|
</RollingFile> |
||||
|
</Appenders> |
||||
|
<Loggers> |
||||
|
<Root level="ALL"> |
||||
|
<AppenderRef ref="DEBUGFILE" /> |
||||
|
</Root> |
||||
|
</Loggers> |
||||
|
</Configuration> |
||||
@ -0,0 +1 @@ |
|||||
|
|
||||
@ -0,0 +1 @@ |
|||||
|
|
||||
@ -0,0 +1,5 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<section name="Workbench"> |
||||
|
<section name="org.eclipse.cdt.internal.ui.MakeView"> |
||||
|
</section> |
||||
|
</section> |
||||
Binary file not shown.
@ -0,0 +1 @@ |
|||||
|
|
||||
@ -0,0 +1 @@ |
|||||
|
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
project_presentation/setHierarchicalMode=false |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
org.eclipse.cdt.debug.core.cDebug.default_source_containers=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<sourceLookupDirector>\r\n <sourceContainers duplicates\="false">\r\n <container memento\="AbsolutePath" typeId\="org.eclipse.cdt.debug.core.containerType.absolutePath"/>\r\n <container memento\="programRelativePath" typeId\="org.eclipse.cdt.debug.core.containerType.programRelativePath"/>\r\n <container memento\="<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>&\#13;&\#10;<project referencedProjects\="true"/>&\#13;&\#10;" typeId\="org.eclipse.cdt.debug.core.containerType.project"/>\r\n </sourceContainers>\r\n</sourceLookupDirector>\r\n |
||||
@ -0,0 +1,4 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
spelling_locale_initialized=true |
||||
|
useAnnotationsPrefPage=true |
||||
|
useQuickDiffPrefPage=true |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
version=1 |
||||
@ -0,0 +1,5 @@ |
|||||
|
//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.applicationLaunchType=org.eclipse.cdt.dsf.gdb.launch.localCLaunch,debug,;org.eclipse.cdt.cdi.launch.localCLaunch,run,; |
||||
|
//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; |
||||
|
//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; |
||||
|
//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.remoteApplicationLaunchType=org.eclipse.rse.remotecdt.dsf.debug,debug,; |
||||
|
eclipse.preferences.version=1 |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<launchPerspectives/>\r\n |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
org.eclipse.jsch.core.hasChangedDefaultWin32SshHome=true |
||||
@ -0,0 +1,4 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
platformState=1711943664369 |
||||
|
quickStart=false |
||||
|
tipsAndTricks=true |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
org.eclipse.ui.navigator.ProjectExplorer.filterActivation=\:org.eclipse.ui.navigator.resources.filters.startsWithDot\:org.eclipse.cdt.ui.navigator.filters.AnonymousStructFilter\:org.eclipse.cdt.ui.navigator.filters.AbsentTranslationUnitFilter\:org.eclipse.ui.navigator.resources.nested.HideTopLevelProjectIfNested\:org.eclipse.ui.navigator.resources.nested.HideFolderWhenProjectIsShownAsNested\:org.eclipse.cdt.ui.navigator.filters.ForwardDeclarationFilter\: |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
showIntro=false |
||||
@ -0,0 +1,9 @@ |
|||||
|
//org.eclipse.ui.commands/state/com.st.stm32cube.ide.mcu.buildanalyzer.showstate/org.eclipse.ui.commands.radioState=human |
||||
|
//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false |
||||
|
eclipse.preferences.version=1 |
||||
|
org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_BG_END=255,255,255 |
||||
|
org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_BG_START=255,255,255 |
||||
|
org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_TEXT_COLOR=16,16,16 |
||||
|
org.eclipse.ui.workbench.ACTIVE_TAB_BG_END=255,255,255 |
||||
|
org.eclipse.ui.workbench.ACTIVE_TAB_BG_START=255,255,255 |
||||
|
org.eclipse.ui.workbench.INACTIVE_TAB_BG_START=242,242,242 |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
processedSchemes=,eclipse+command,eclipse+mpc |
||||
File diff suppressed because it is too large
@ -0,0 +1,11 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<projectDescription> |
||||
|
<name>.org.eclipse.egit.core.cmp</name> |
||||
|
<comment></comment> |
||||
|
<projects> |
||||
|
</projects> |
||||
|
<buildSpec> |
||||
|
</buildSpec> |
||||
|
<natures> |
||||
|
</natures> |
||||
|
</projectDescription> |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
encoding/<project>=UTF-8 |
||||
@ -0,0 +1,6 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<section name="Workbench"> |
||||
|
<section name="ExternalProjectImportWizard"> |
||||
|
<item key="WizardProjectsImportPage.STORE_NESTED_PROJECTS" value="true"/> |
||||
|
</section> |
||||
|
</section> |
||||
@ -0,0 +1,4 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<workingSetManager> |
||||
|
<workingSet aggregate="true" factoryID="org.eclipse.ui.internal.WorkingSetFactory" id="1719473879738_0" label="Window Working Set" name="Aggregate for window 1719473879738"/> |
||||
|
</workingSetManager> |
||||
@ -0,0 +1,3 @@ |
|||||
|
#Thu Jun 27 15:38:50 CST 2024 |
||||
|
org.eclipse.core.runtime=2 |
||||
|
org.eclipse.platform=4.30.0.v20231201-0110 |
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,32 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<projectDescription> |
||||
|
<name>BHBF_NewFiveWheel3.0</name> |
||||
|
<comment></comment> |
||||
|
<projects> |
||||
|
</projects> |
||||
|
<buildSpec> |
||||
|
<buildCommand> |
||||
|
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> |
||||
|
<triggers>clean,full,incremental,</triggers> |
||||
|
<arguments> |
||||
|
</arguments> |
||||
|
</buildCommand> |
||||
|
<buildCommand> |
||||
|
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> |
||||
|
<triggers>full,incremental,</triggers> |
||||
|
<arguments> |
||||
|
</arguments> |
||||
|
</buildCommand> |
||||
|
</buildSpec> |
||||
|
<natures> |
||||
|
<nature>com.st.stm32cube.ide.mcu.MCUProjectNature</nature> |
||||
|
<nature>com.st.stm32cube.ide.mcu.MCUCubeProjectNature</nature> |
||||
|
<nature>org.eclipse.cdt.core.cnature</nature> |
||||
|
<nature>com.st.stm32cube.ide.mcu.MCUCubeIdeServicesRevAev2ProjectNature</nature> |
||||
|
<nature>com.st.stm32cube.ide.mcu.MCUAdvancedStructureProjectNature</nature> |
||||
|
<nature>com.st.stm32cube.ide.mcu.MCUSingleCpuProjectNature</nature> |
||||
|
<nature>com.st.stm32cube.ide.mcu.MCURootProjectNature</nature> |
||||
|
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> |
||||
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> |
||||
|
</natures> |
||||
|
</projectDescription> |
||||
@ -0,0 +1,3 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
svd_custom_file_path= |
||||
|
svd_file_path=platform\:/plugin/com.st.stm32cube.ide.mcu.productdb.debug/resources/cmsis/STMicroelectronics_CMSIS_SVD/STM32H743.svd |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
sfrviewstate={"fFavorites"\:{"fLists"\:{}},"fProperties"\:{"fNodeProperties"\:{}}} |
||||
@ -0,0 +1,26 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
|
<project> |
||||
|
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1900810912" name="Debug"> |
||||
|
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> |
||||
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> |
||||
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> |
||||
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> |
||||
|
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1716098405222817540" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> |
||||
|
<language-scope id="org.eclipse.cdt.core.gcc"/> |
||||
|
<language-scope id="org.eclipse.cdt.core.g++"/> |
||||
|
</provider> |
||||
|
</extension> |
||||
|
</configuration> |
||||
|
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1322898427" name="Release"> |
||||
|
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> |
||||
|
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> |
||||
|
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> |
||||
|
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> |
||||
|
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> |
||||
|
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1716098405222817540" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> |
||||
|
<language-scope id="org.eclipse.cdt.core.gcc"/> |
||||
|
<language-scope id="org.eclipse.cdt.core.g++"/> |
||||
|
</provider> |
||||
|
</extension> |
||||
|
</configuration> |
||||
|
</project> |
||||
@ -0,0 +1,76 @@ |
|||||
|
com.st.stm32cube.ide.mcu.ide.oss.source.checker.libnano.problem.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(\\"Float formatting support\\")"} |
||||
|
eclipse.preferences.version=1 |
||||
|
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.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.localvarreturn=-Warning |
||||
|
org.eclipse.cdt.codan.checkers.localvarreturn.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(\\"Returning the address of a local variable\\")"} |
||||
|
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.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.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.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.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.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.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.BlacklistProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.BlacklistProblem.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 or method is blacklisted\\")",blacklist\=>()} |
||||
|
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\\")",checkMacro\=>true} |
||||
|
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.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.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.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.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.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.FloatCompareProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.FloatCompareProblem.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(\\"Direct float comparison\\")"} |
||||
|
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.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.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.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.MagicNumberProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.MagicNumberProblem.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(\\"Avoid magic numbers\\")",checkArray\=>true,checkOperatorParen\=>true,exceptions\=>(1,0,-1,2,1.0,0.0,-1.0)} |
||||
|
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.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.MissReferenceProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.MissReferenceProblem.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 reference return value in assignment operator\\")"} |
||||
|
org.eclipse.cdt.codan.internal.checkers.MissSelfCheckProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.MissSelfCheckProblem.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 self check in assignment operator\\")"} |
||||
|
org.eclipse.cdt.codan.internal.checkers.MultipleDeclarationsProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.MultipleDeclarationsProblem.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(\\"Multiple variable declaration\\")"} |
||||
|
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.NoDiscardProblem=Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.NoDiscardProblem.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 value not evaluated\\")",macro\=>true} |
||||
|
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.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.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.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.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.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.ShallowCopyProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.ShallowCopyProblem.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(\\"Miss copy constructor or assignment operator\\")",onlynew\=>false} |
||||
|
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.StaticVariableInHeaderProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.StaticVariableInHeaderProblem.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(\\"Static variable in header file\\")"} |
||||
|
org.eclipse.cdt.codan.internal.checkers.StructuredBindingDeclarationProblem=Error |
||||
|
org.eclipse.cdt.codan.internal.checkers.StructuredBindingDeclarationProblem.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 structured binding declaration\\")"} |
||||
|
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.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.SymbolShadowingProblem=-Warning |
||||
|
org.eclipse.cdt.codan.internal.checkers.SymbolShadowingProblem.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 shadowing\\")",paramFuncParameters\=>true} |
||||
|
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.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.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.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.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\\")"} |
||||
@ -0,0 +1,194 @@ |
|||||
|
doxygen/doxygen_new_line_after_brief=true |
||||
|
doxygen/doxygen_use_brief_tag=false |
||||
|
doxygen/doxygen_use_javadoc_tags=true |
||||
|
doxygen/doxygen_use_pre_tag=false |
||||
|
doxygen/doxygen_use_structural_commands=false |
||||
|
eclipse.preferences.version=1 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_assignment=16 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_compact_if=16 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_lambda_expression=20 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_member_access=0 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 |
||||
|
org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 |
||||
|
org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=next_line |
||||
|
org.eclipse.cdt.core.formatter.brace_position_for_block=next_line |
||||
|
org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=next_line |
||||
|
org.eclipse.cdt.core.formatter.brace_position_for_linkage_declaration=next_line |
||||
|
org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line |
||||
|
org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=next_line |
||||
|
org.eclipse.cdt.core.formatter.brace_position_for_switch=next_line |
||||
|
org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=next_line |
||||
|
org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false |
||||
|
org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1 |
||||
|
org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true |
||||
|
org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true |
||||
|
org.eclipse.cdt.core.formatter.comment_formatter_off_tag=@formatter\:off |
||||
|
org.eclipse.cdt.core.formatter.comment_formatter_on_tag=@formatter\:on |
||||
|
org.eclipse.cdt.core.formatter.compact_else_if=true |
||||
|
org.eclipse.cdt.core.formatter.continuation_indentation=2 |
||||
|
org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2 |
||||
|
org.eclipse.cdt.core.formatter.format_block_comment=true |
||||
|
org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false |
||||
|
org.eclipse.cdt.core.formatter.format_header_comment=true |
||||
|
org.eclipse.cdt.core.formatter.format_line_comment=true |
||||
|
org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false |
||||
|
org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0 |
||||
|
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true |
||||
|
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_linkage=false |
||||
|
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false |
||||
|
org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true |
||||
|
org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false |
||||
|
org.eclipse.cdt.core.formatter.indent_empty_lines=false |
||||
|
org.eclipse.cdt.core.formatter.indent_label_compare_to_statements=true |
||||
|
org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true |
||||
|
org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true |
||||
|
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true |
||||
|
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=true |
||||
|
org.eclipse.cdt.core.formatter.indentation.size=4 |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_after_colon_in_constructor_initializer_list=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_after_label=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_structured_binding_name_list=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_lambda_return=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_opening_structured_binding_name_list=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_declarator_list=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_method_declaration=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_closing_structured_binding_name_list=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_structured_binding_name_list=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_lambda_return=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_linkage_declaration=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_opening_structured_binding_name_list=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_declarator_list=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_method_declaration=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_ref_qualifier_in_structured_binding=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert |
||||
|
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert |
||||
|
org.eclipse.cdt.core.formatter.join_wrapped_lines=true |
||||
|
org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false |
||||
|
org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false |
||||
|
org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false |
||||
|
org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false |
||||
|
org.eclipse.cdt.core.formatter.lineSplit=80 |
||||
|
org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 |
||||
|
org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true |
||||
|
org.eclipse.cdt.core.formatter.tabulation.char=mixed |
||||
|
org.eclipse.cdt.core.formatter.tabulation.size=4 |
||||
|
org.eclipse.cdt.core.formatter.use_comment_formatter_tag=true |
||||
|
org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false |
||||
@ -0,0 +1,3 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
formatter_profile=_K&R [built-in-3] |
||||
|
formatter_settings_version=1 |
||||
@ -0,0 +1,2 @@ |
|||||
|
eclipse.preferences.version=1 |
||||
|
org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false |
||||
@ -0,0 +1,6 @@ |
|||||
|
2F62501ED4689FB349E356AB974DBE57=1E2381E617183AADF4456CCD6D53D61D |
||||
|
635E684B79701B039C64EA45C3F84D30=4EFF5836660CD2DC8E70993B25E2A49D |
||||
|
66BE74F758C12D739921AEA421D593D3=1 |
||||
|
8DF89ED150041C4CBC7CB9A9CAA90856=1E2381E617183AADF4456CCD6D53D61D |
||||
|
DC22A860405A8BF2F2C095E5B6529F12=F08B3E54D888488C3B7E755B1A9A5DE6 |
||||
|
eclipse.preferences.version=1 |
||||
@ -0,0 +1,169 @@ |
|||||
|
/*
|
||||
|
* BHBF_ROBOT.h |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BHBF_ROBOT_H_ |
||||
|
#define INC_BHBF_ROBOT_H_ |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
|
||||
|
#include "bsp_PV.pb.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/MSP/msp_TI5MOTOR.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_UART.h" |
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <assert.h> |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/BHBF_ROBOT.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_mqtt.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/pb.h" |
||||
|
#include "../../BASE/Inc/MSP/msp_Force_Sensor.h" |
||||
|
#include "../../BASE/Inc/MSP/msp_Dynamometer_Sensor.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_decode.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_encode.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_EEPROM.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_pb_decode_encode.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
#include "../../BASE/Inc/MSP/msp_TL720D.h" |
||||
|
#include <stdio.h> |
||||
|
#include <stdbool.h> |
||||
|
#include <stdlib.h> |
||||
|
#include "../../BASE/Inc/BSP/DLT/DLTuc.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/MSP/msp_U7.h" |
||||
|
|
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_mqtt.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/pb.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_decode.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_encode.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_EEPROM.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_pb_decode_encode.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_DLT_Log.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_UDP.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_cpu_flash.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_qspi_w25q128.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_UpperComputer_Handler.h" |
||||
|
#include "../../BASE/Inc/MSP/msp_TTMotor_ZQ.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_Error_Detect.h" |
||||
|
#include "bsp_IV.pb.h" |
||||
|
#include "bsp_PV.pb.h" |
||||
|
//#include "msp_pressure_sensor.h"
|
||||
|
//#include "robot_state.h"
|
||||
|
//FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 896K
|
||||
|
//#define VECT_TAB_OFFSET 0x00020000U
|
||||
|
|
||||
|
//关键全局变量定义:GV、CV、PV
|
||||
|
//其他变量定义:X1_X2_X3_X4
|
||||
|
//X1:变量类型
|
||||
|
//X2:所属层级 GL、MSP、BSP
|
||||
|
//X3:所属模块
|
||||
|
//X4:名称
|
||||
|
|
||||
|
//全局变量定义 X1=V
|
||||
|
//宏定义 X1=DF
|
||||
|
//结构体类型声明 X1=SP
|
||||
|
//结构体定义 X1=ST
|
||||
|
//指针类型定义 X1=P
|
||||
|
//全局函数定义 X1=GF
|
||||
|
//内部函数定义 X1为空,不要下划线,X2开头
|
||||
|
//函数参数定义、函数局部变量定义 X1为空,下划线开头
|
||||
|
|
||||
|
|
||||
|
#define DLTViewer 1 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
extern GV_struct_define GV; |
||||
|
//extern PV_struct_define PV;
|
||||
|
extern IV_struct_define IV; |
||||
|
extern CV_struct_define CV; |
||||
|
|
||||
|
|
||||
|
void GF_Robot_Init(void); |
||||
|
void GF_Robot_MainLoop(void); |
||||
|
void GF_WatchDog_Loop(void); |
||||
|
void CV_GV_Init(); |
||||
|
|
||||
|
extern void SET_BIT_1(int32_t* num,int32_t k); |
||||
|
|
||||
|
extern void SET_BIT_0(int32_t* num,int32_t k); |
||||
|
extern int32_t Get_BIT(int32_t* num,int32_t k); |
||||
|
|
||||
|
//A &= ~(1 << bit)
|
||||
|
|
||||
|
|
||||
|
|
||||
|
extern MotorParameters *Motor[3]; |
||||
|
extern int32_t *Motor_ID_Errors[3]; |
||||
|
extern int32_t* SystemErrorCode; |
||||
|
extern ErrorData* SystemErrorData; |
||||
|
//Error Bit Define
|
||||
|
|
||||
|
#define AngleEncoderErrorBitFlag 0 |
||||
|
#define DAM_Relay_ErrorBitFlag 1 |
||||
|
#define DH_CAN_Remote_Controller_1E4 2 |
||||
|
#define DH_CAN_Remote_Controller_2E4 3 |
||||
|
#define DH_Remote 4 |
||||
|
#define force_sensor 5 |
||||
|
#define LeiSai_ISV2CAN 6 |
||||
|
#define mk32_sbus 7 |
||||
|
#define steering_engine 8 |
||||
|
#define Weld_seam_Tracking 9 |
||||
|
|
||||
|
#define Ti5_1 11 |
||||
|
#define Ti5_2 12 |
||||
|
#define Ti5_3 13 |
||||
|
#define Ti5_4 14 |
||||
|
#define Ti5_5 15 |
||||
|
#define Ti5_6 16 |
||||
|
|
||||
|
#define TL720D 17 |
||||
|
|
||||
|
|
||||
|
#define ZQ_CAN_ID1_LeftMotor 18 |
||||
|
#define ZQ_CAN_ID2_RightMotor 19 |
||||
|
#define ZQ_CAN_ID3_SwingMotor 20 |
||||
|
#define wire_sensor 21 |
||||
|
|
||||
|
#define DHRougheningController 22 |
||||
|
#define DAM040D_Relay_ErrorBitFlag 23 |
||||
|
|
||||
|
#define DMAKE_1 24 |
||||
|
#define DMAKE_2 25 |
||||
|
#define DMAKE_3 26 |
||||
|
#define pressure_sensor 27 |
||||
|
#define u7_sbus 28 |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
extern TT_MotorParameters* TT_Motor[4]; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#endif /* INC_BHBF_ROBOT_H_ */ |
||||
@ -0,0 +1,248 @@ |
|||||
|
/**
|
||||
|
* @file DLTuc.h |
||||
|
* @author teodor |
||||
|
* @date 1 Jul 2022 |
||||
|
* @brief This file is a part of DLTuc library |
||||
|
* |
||||
|
* In this header, you can find types, Api functions, which are provided by DLTuc library |
||||
|
* Usefull macros, for convience usage of DLTuc library in logging purposes |
||||
|
* |
||||
|
* Requirments: |
||||
|
* Around ~2kB of RAM |
||||
|
* Check Configuration file and defines: |
||||
|
* DLT_TRANSMIT_RING_BUFFER_SIZE, DLT_TRANSMIT_MAX_SINGLE_MESSAGE_SIZE |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_DLT_LOGS_MCU_H_ |
||||
|
#define INC_DLT_LOGS_MCU_H_ |
||||
|
|
||||
|
/*
|
||||
|
* ******************************************************************************************* |
||||
|
* Includes |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
|
||||
|
#include "stdint.h" |
||||
|
#include <stdarg.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/DLT/DLTucConfig.h" |
||||
|
|
||||
|
/*
|
||||
|
* ******************************************************************************************* |
||||
|
* Exported defines |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
|
||||
|
/*@brief
|
||||
|
* |
||||
|
* - convert the To strings to uint32_t |
||||
|
*/ |
||||
|
#define DLT_LOG_ECUID_VALUE ((uint32_t)((((uint32_t) ((uint8_t)DLT_LOG_ECUID[0])) << 24UL) | \ |
||||
|
(((uint32_t) ((uint8_t)DLT_LOG_ECUID[1])) << 16UL) | \ |
||||
|
(((uint32_t) ((uint8_t)DLT_LOG_ECUID[2])) << 8UL) | \ |
||||
|
((uint32_t)((uint8_t)DLT_LOG_ECUID[3])))) |
||||
|
|
||||
|
|
||||
|
#define DLT_LOG_APPID_VALUE ((uint32_t)((((uint32_t) ((uint8_t)DLT_LOG_APPID[0])) << 24UL) | \ |
||||
|
(((uint32_t) ((uint8_t)DLT_LOG_APPID[1])) << 16UL) | \ |
||||
|
(((uint32_t) ((uint8_t)DLT_LOG_APPID[2])) << 8UL) | \ |
||||
|
((uint32_t)((uint8_t)DLT_LOG_APPID[3])))) |
||||
|
|
||||
|
|
||||
|
#define DLT_LOG_CONTEX_VALUE ((uint32_t)((((uint32_t) ((uint8_t)DLT_LOG_CONTEX[0])) << 24UL) | \ |
||||
|
(((uint32_t) ((uint8_t)DLT_LOG_CONTEX[1])) << 16UL) | \ |
||||
|
(((uint32_t) ((uint8_t)DLT_LOG_CONTEX[2])) << 8UL) | \ |
||||
|
((uint32_t)((uint8_t)DLT_LOG_CONTEX[3])))) |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
* Definitions of DLT services. |
||||
|
*/ |
||||
|
#define DLT_SERVICE_ID_SET_LOG_LEVEL 0x01 /**< Service ID: Set log level */ |
||||
|
#define DLT_SERVICE_ID_SETRACE_STATUS 0x02 /**< Service ID: Set trace status */ |
||||
|
#define DLT_SERVICE_ID_GET_LOG_INFO 0x03 /**< Service ID: Get log info */ |
||||
|
#define DLT_SERVICE_ID_GET_DEFAULT_LOG_LEVEL 0x04 /**< Service ID: Get dafault log level */ |
||||
|
#define DLT_SERVICE_ID_STORE_CONFIG 0x05 /**< Service ID: Store configuration */ |
||||
|
#define DLT_SERVICE_ID_RESETO_FACTORY_DEFAULT 0x06 /**< Service ID: Reset to factory defaults */ |
||||
|
#define DLT_SERVICE_ID_SET_COM_INTERFACE_STATUS 0x07 /**< Service ID: Set communication interface status */ |
||||
|
#define DLT_SERVICE_ID_SET_COM_INTERFACE_MAX_BANDWIDTH 0x08 /**< Service ID: Set communication interface maximum bandwidth */ |
||||
|
#define DLT_SERVICE_ID_SET_VERBOSE_MODE 0x09 /**< Service ID: Set verbose mode */ |
||||
|
#define DLT_SERVICE_ID_SET_MESSAGE_FILTERING 0x0A /**< Service ID: Set message filtering */ |
||||
|
#define DLT_SERVICE_ID_SETIMING_PACKETS 0x0B /**< Service ID: Set timing packets */ |
||||
|
#define DLT_SERVICE_ID_GET_LOCALIME 0x0C /**< Service ID: Get local time */ |
||||
|
#define DLT_SERVICE_ID_USE_ECU_ID 0x0D /**< Service ID: Use ECU id */ |
||||
|
#define DLT_SERVICE_ID_USE_SESSION_ID 0x0E /**< Service ID: Use session id */ |
||||
|
#define DLT_SERVICE_ID_USEIMESTAMP 0x0F /**< Service ID: Use timestamp */ |
||||
|
#define DLT_SERVICE_ID_USE_EXTENDED_HEADER 0x10 /**< Service ID: Use extended header */ |
||||
|
#define DLT_SERVICE_ID_SET_DEFAULT_LOG_LEVEL 0x11 /**< Service ID: Set default log level */ |
||||
|
#define DLT_SERVICE_ID_SET_DEFAULTRACE_STATUS 0x12 /**< Service ID: Set default trace status */ |
||||
|
#define DLT_SERVICE_ID_GET_SOFTWARE_VERSION 0x13 /**< Service ID: Get software version */ |
||||
|
#define DLT_SERVICE_ID_MESSAGE_BUFFER_OVERFLOW 0x14 /**< Service ID: Message buffer overflow */ |
||||
|
#define DLT_SERVICE_ID_CALLSW_CINJECTION 0xFFF /**< Service ID: Message Injection (minimal ID) */ |
||||
|
|
||||
|
/*
|
||||
|
* ******************************************************************************************* |
||||
|
* Exported types |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
|
||||
|
/**!
|
||||
|
* \brief DltLogLevel_t |
||||
|
* \details Typdef used to identify the DLT log level |
||||
|
* */ |
||||
|
typedef enum |
||||
|
{ |
||||
|
DL_FATAL =1, |
||||
|
DL_ERROR =2, |
||||
|
DL_WARN =3, |
||||
|
DL_INFO =4, |
||||
|
DL_DEBUG =5, |
||||
|
DL_VERBOSE =6, |
||||
|
}DltLogLevel_t; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
* ******************************************************************************************* |
||||
|
* Exported function - API |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLTuc_RawDataReceiveDone |
||||
|
* \details OPTIONAL - Use only if you need handle data receive, like Injection messages |
||||
|
* Call the function to inform DLTuc that Raw data packet has been received |
||||
|
************************************************************************************************/ |
||||
|
void DLTuc_RawDataReceiveDone(uint16_t Size); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLTuc_RegisterReceiveSerialDataFunction |
||||
|
* \details OPTIONAL - Use only if you need handle data receive, like Injection messages. |
||||
|
* - Register callback function which will be used by DLTuc to start data receive process. |
||||
|
* The Callback function is basicly called only after registration and if data packet has been received, |
||||
|
* to start again receive data packet |
||||
|
* \param in LLSerialRecDataFunctionC ... |
||||
|
************************************************************************************************/ |
||||
|
void DLTuc_RegisterReceiveSerialDataFunction(void LLSerialRecDataFunctionC(uint8_t *DltLogData, uint16_t Size)); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLTuc_RegisterInjectionDataReceivedCb |
||||
|
* \details OPTIONAL - Use only if you need handle data receive, like Injection messages |
||||
|
* Register injection data received call back |
||||
|
* Use the function if you want register call back function to handle the Injection messages in your application |
||||
|
* \param in InjectionDataRcvd ... |
||||
|
************************************************************************************************/ |
||||
|
void DLTuc_RegisterInjectionDataReceivedCb |
||||
|
(void InjectionDataRcvd(uint32_t AppId, uint32_t ConId,uint32_t ServId,uint8_t *Data, uint16_t Size)); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLTuc_RegisterTransmitSerialDataFunction |
||||
|
* \details This simple stack/library must be initialized by "DLTuc_RegisterTransmitSerialDataFunction" |
||||
|
* As a parameter must be passed function which will transmit serial data |
||||
|
* \param in LLSerialTrDataFunctionC transmit function pointer |
||||
|
************************************************************************************************/ |
||||
|
void DLTuc_RegisterTransmitSerialDataFunction(void LLSerialTrDataFunctionC(uint8_t *DltLogData, uint8_t Size)); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLTuc_RegisterGetTimeStampMsCallback |
||||
|
* \details function to update time stamp in library |
||||
|
* \param in GetSysTime - pointer to function which allow to read system time in msec |
||||
|
*************************************************************************************************/ |
||||
|
void DLTuc_RegisterGetTimeStampMsCallback(uint32_t GetSysTime(void)); |
||||
|
|
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLTuc_MessageTransmitDone |
||||
|
* \details IMPORTANT!!!!! |
||||
|
* Call this function when the transsmision is end |
||||
|
* For example in "DMA transmission end callback" to inform the lib that the message is transmitted |
||||
|
************************************************************************************************ |
||||
|
* */ |
||||
|
void DLTuc_MessageTransmitDone(void); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLTuc_LogOutVarArgs |
||||
|
* \details default function to create DLT Log |
||||
|
* \param DltLogLevel_t Level - of Dlt log |
||||
|
* \param in AppId - size of the "DltLogData" (return value) |
||||
|
* \param in ContextId - pointer to the message stored in RingBuffer (return value) |
||||
|
* \param in Payload String to send as dlt log |
||||
|
* \param in ... parameters same as in printf function |
||||
|
*************************************************************************************************/ |
||||
|
void DLTuc_LogOutVarArgs(DltLogLevel_t Level, uint32_t AppId, uint32_t ContextId, uint8_t *Payload, ...); |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
* ******************************************************************************************* |
||||
|
* Additional macros to facilitate the use of the library |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
|
||||
|
#ifdef LOGS_ENABLE |
||||
|
|
||||
|
/**!
|
||||
|
* \brief LOGL(level, str, ...) |
||||
|
* \details Transmit DltLog using function DLTuc_LogOutVarArgs but user don't have to add |
||||
|
* log_level, DLT_LOG_APPID_VALUE and DLT_LOG_CONTEX_VALUE |
||||
|
* |
||||
|
* */ |
||||
|
#define LOG(str, ...)\ |
||||
|
if(DL_INFO <= DLT_LOG_ENABLE_LEVEL){\ |
||||
|
DLTuc_LogOutVarArgs(DL_INFO, DLT_LOG_APPID_VALUE, DLT_LOG_CONTEX_VALUE,(uint8_t *) str, ##__VA_ARGS__);\ |
||||
|
} |
||||
|
|
||||
|
/**!
|
||||
|
* \brief LOGL(level, str, ...) |
||||
|
* \details Transmit DltLog using function DLTuc_LogOutVarArgs but user don't have to add DLT_LOG_APPID_VALUE and DLT_LOG_CONTEX_VALUE |
||||
|
* |
||||
|
* */ |
||||
|
#define LOGL(log_level, str, ...)\ |
||||
|
if(log_level <= DLT_LOG_ENABLE_LEVEL){\ |
||||
|
DLTuc_LogOutVarArgs(log_level, DLT_LOG_APPID_VALUE, DLT_LOG_CONTEX_VALUE,(uint8_t *) str, ##__VA_ARGS__);\ |
||||
|
} |
||||
|
|
||||
|
/**!
|
||||
|
* @brief LOGF(log_level, str, ...) |
||||
|
* \details Transmit DltLog using function DLTuc_LogOutVarArgs but user don't have to add DLT_LOG_APPID_VALUE and DLT_LOG_CONTEX_VALUE |
||||
|
* Additionally add the name of the calling function |
||||
|
* |
||||
|
* |
||||
|
* */ |
||||
|
#define LOGF(log_level, str, ...)\ |
||||
|
if(log_level <= DLT_LOG_ENABLE_LEVEL){\ |
||||
|
DLTuc_LogOutVarArgs(log_level, DLT_LOG_APPID_VALUE, DLT_LOG_CONTEX_VALUE,(uint8_t *) "FUN:%s LOG: "str, __FUNCTION__,##__VA_ARGS__);\ |
||||
|
} |
||||
|
|
||||
|
/**!
|
||||
|
* \brief LOGFF(log_level, str, ...) |
||||
|
* \details Transmit DltLog using function DLTuc_LogOutVarArgs but user don't have to add DLT_LOG_APPID_VALUE and DLT_LOG_CONTEX_VALUE |
||||
|
* Additionally add the name of the calling function and file name |
||||
|
* |
||||
|
* |
||||
|
* */ |
||||
|
#define LOGFF(log_level, str, ...)\ |
||||
|
if(log_level <= DLT_LOG_ENABLE_LEVEL){\ |
||||
|
DLTuc_LogOutVarArgs(log_level, DLT_LOG_APPID_VALUE, DLT_LOG_CONTEX_VALUE,(uint8_t *)"FILE:%s LINE: %d FUN:%s LOG: "str,__FILE__,__LINE__,__FUNCTION__,##__VA_ARGS__);\ |
||||
|
} |
||||
|
|
||||
|
#else |
||||
|
LOG(str, ...) |
||||
|
LOGL(log_level, str, ...) |
||||
|
LOGF(log_level, str, ...) |
||||
|
LOGFF(log_level, str, ...) |
||||
|
#endif |
||||
|
|
||||
|
#endif /* INC_DLT_LOGS_MCU_H_ */ |
||||
@ -0,0 +1,74 @@ |
|||||
|
/**
|
||||
|
* @file DLTuc.c |
||||
|
* @author teodor |
||||
|
* @date 1 Jul 2022 |
||||
|
* @brief This file is a part of DLTuc library |
||||
|
* |
||||
|
* In this header file is placed DLTuc configuration template |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#if 1 /*Set it to "1" to enable content*/ |
||||
|
|
||||
|
#ifndef __DLT_CONFIG__ |
||||
|
|
||||
|
/*Comment this line to turn off all logs..*/ |
||||
|
#define LOGS_ENABLE |
||||
|
|
||||
|
/*Pass here the entry critical entry function for your RTOS or
|
||||
|
Interrupt block functions if you want use the library from diffrent context*/ |
||||
|
#define DLTuc_OS_CRITICAL_START() |
||||
|
#define DLTuc_OS_CRITICAL_END() |
||||
|
|
||||
|
|
||||
|
/*Default minimum log level to transmit the log*/ |
||||
|
//#ifndef DLT_LOG_ENABLE_LEVEL
|
||||
|
////#define DLT_LOG_ENABLE_LEVEL DL_VERBOSE
|
||||
|
// #define DLT_LOG_ENABLE_LEVEL 0
|
||||
|
//#endif
|
||||
|
|
||||
|
extern char DLT_LOG_ENABLE_LEVEL; |
||||
|
|
||||
|
|
||||
|
/**!
|
||||
|
* \brief DLT_LOG_CONTEX |
||||
|
* \details to define the minimum level log which will printed using the debug macros |
||||
|
* |
||||
|
*/ |
||||
|
#ifndef DLT_LOG_CONTEX |
||||
|
#define DLT_LOG_CONTEX "DFLT" |
||||
|
#endif |
||||
|
|
||||
|
/**!
|
||||
|
* \brief DLT_LOG_APPID |
||||
|
* \details to define the minimum level log which will printed using the debug macros |
||||
|
* |
||||
|
*/ |
||||
|
#ifndef DLT_LOG_APPID |
||||
|
#define DLT_LOG_APPID "0000" |
||||
|
#endif |
||||
|
|
||||
|
/**!
|
||||
|
* \brief DLT_LOG_ECUID |
||||
|
* \details you can define here you ECUID .. |
||||
|
* |
||||
|
*/ |
||||
|
#define DLT_LOG_ECUID "uCID" /*Electronic Controller Unit ID*/ |
||||
|
|
||||
|
#define DLT_ECU_SW_VER 0001 |
||||
|
|
||||
|
/*
|
||||
|
*@brief DLT_TRANSMIT_MAX_SINGLE_MESSAGE_SIZE & DLT_TRANSMIT_RING_BUFFER_SIZE |
||||
|
* these values define the size of the circular buffer and the maximum size of a single DLT message |
||||
|
* Size of out Circular DLT messages buffer is equal: DLT_TRANSMIT_MAX_SINGLE_MESSAGE_SIZE*DLT_TRANSMIT_RING_BUFFER_SIZE |
||||
|
*/ |
||||
|
#define DLT_TRANSMIT_MAX_SINGLE_MESSAGE_SIZE 255 |
||||
|
#define DLT_TRANSMIT_RING_BUFFER_SIZE 15 |
||||
|
|
||||
|
|
||||
|
#define DLT_REC_SINGLE_MESSAGE_MAX_SIZE 255 |
||||
|
#define DLT_RECEIVE_RING_BUFFER_SIZE 2 |
||||
|
|
||||
|
#endif //__DLT_CONFIG__
|
||||
|
|
||||
|
#endif //Content enable
|
||||
@ -0,0 +1,15 @@ |
|||||
|
/*
|
||||
|
* bsp_DLT_Log.h |
||||
|
* |
||||
|
* Created on: Aug 8, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_DLT_LOG_H_ |
||||
|
#define INC_BSP_BSP_DLT_LOG_H_ |
||||
|
#include "../../BASE/Inc/BSP/DLT/DLTuc.h" |
||||
|
#include "../../BASE/Inc/BSP/BHBF_ROBOT.h" |
||||
|
|
||||
|
|
||||
|
void dLT_Log_intialize(struct UARTHandler *Handler); |
||||
|
#endif /* INC_BSP_BSP_DLT_LOG_H_ */ |
||||
@ -0,0 +1,74 @@ |
|||||
|
/*
|
||||
|
* bsp_EEPROM.h |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_EEPROM_H_ |
||||
|
#define INC_BSP_EEPROM_H_ |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
#include "bsp_CV.pb.h" |
||||
|
#include "bsp_PV.pb.h" |
||||
|
#include "bsp_IAP.pb.h" |
||||
|
|
||||
|
|
||||
|
#define EEPROM_WP_Pin GPIO_PIN_11 |
||||
|
#define EEPROM_WP_GPIO_Port GPIOE |
||||
|
#define EEPROM_SCL_Pin GPIO_PIN_12 |
||||
|
#define EEPROM_SCL_GPIO_Port GPIOE |
||||
|
#define EEPROM_SDA_Pin GPIO_PIN_13 |
||||
|
#define EEPROM_SDA_GPIO_Port GPIOE |
||||
|
|
||||
|
#define AT24C512 |
||||
|
#ifdef AT24C512 |
||||
|
#define EE_MODEL_NAME "AT24C512" |
||||
|
#define EE_DEV_ADDR 0xA0 /* 设备地址 */ |
||||
|
#define EE_PAGE_SIZE 128 /* 页面大小(字节) */ |
||||
|
#define EE_SIZE (512*128) /* 总容量(字节) */ // not used in this progrm
|
||||
|
#define EE_ADDR_BYTES 2 /* 地址字节个数 */ |
||||
|
#endif |
||||
|
|
||||
|
#define I2C_WR 0 /* 写控制bit */ |
||||
|
#define I2C_RD 1 /* 读控制bit */ |
||||
|
|
||||
|
//////////////////////////////////////////////////////////////////
|
||||
|
//there are 12M eeprom in total, and the code download Address is App_Download_EEPROM_Addr
|
||||
|
//512 Pages x 128 Bytes = 65536 Bytes = 512 kbits
|
||||
|
|
||||
|
|
||||
|
#define GF_BSP_EEPROM_CV_struct_define_Start_Address 0 |
||||
|
#define IAP_struct_define_Start_Address 512 |
||||
|
|
||||
|
extern uint16_t App_Download_EEPROM_Addr; |
||||
|
|
||||
|
//返回值::1-正常;0-错误
|
||||
|
uint8_t GF_BSP_EEPROM_Init(void); |
||||
|
|
||||
|
uint8_t GF_BSP_EEPROM_CheckOK(void); |
||||
|
uint8_t GF_BSP_EEPROM_ReadBytes(uint8_t *_pReadBuf, uint16_t _usAddress, |
||||
|
uint16_t _usSize); |
||||
|
uint8_t GF_BSP_EEPROM_WriteBytes(uint8_t *_pWriteBuf, uint16_t _usAddress, |
||||
|
uint16_t _usSize); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
CV_struct_define GF_BSP_EEPROM_Get_CV(void); |
||||
|
uint8_t GF_BSP_EEPROM_Set_CV(CV_struct_define cv); |
||||
|
|
||||
|
IAP_struct_define GF_BSP_EEPROM_Get_IAP(void); |
||||
|
uint8_t GF_BSP_EEPROM_Set_IAP(IAP_struct_define iap); |
||||
|
|
||||
|
|
||||
|
|
||||
|
PV_struct_define GF_BSP_EEPROM_Get_PV(void); |
||||
|
|
||||
|
uint8_t GF_BSP_EEPROM_Set_PV(PV_struct_define pv); |
||||
|
|
||||
|
|
||||
|
#endif /* INC_BSP_EEPROM_H_ */ |
||||
@ -0,0 +1,25 @@ |
|||||
|
/*
|
||||
|
* bsp_Error_Detect.h |
||||
|
* |
||||
|
* Created on: Oct 23, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_ERROR_DETECT_H_ |
||||
|
#define INC_BSP_BSP_ERROR_DETECT_H_ |
||||
|
|
||||
|
|
||||
|
/* Includes ------------------------------------------------------------------*/ |
||||
|
#include "../../BASE/Inc/BSP/BHBF_ROBOT.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_com_helper.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
/* Exported types ------------------------------------------------------------*/ |
||||
|
/* Exported constants --------------------------------------------------------*/ |
||||
|
/* Exported macro ------------------------------------------------------------*/ |
||||
|
extern HardWareController *HardWareErrorController; |
||||
|
/* Exported functions ------------------------------------------------------- */ |
||||
|
|
||||
|
extern void Error_Detect_Intialzie(uint16_t DispacherPeriod); |
||||
|
|
||||
|
|
||||
|
#endif /* INC_BSP_BSP_ERROR_DETECT_H_ */ |
||||
@ -0,0 +1,84 @@ |
|||||
|
/*
|
||||
|
* bsp_FDCAN.h |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_FDCAN_H_ |
||||
|
#define INC_BSP_FDCAN_H_ |
||||
|
#include "bsp_Error.pb.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_com_helper.h" |
||||
|
uint8_t GF_BSP_FDCAN_Init(void); |
||||
|
|
||||
|
void GF_BSP_FDCAN_Senddata(uint8_t FDCAN_CH, uint32_t FrameID, |
||||
|
uint8_t DataLength, uint8_t *Txdata); |
||||
|
|
||||
|
extern uint8_t CAN_Buf[8]; |
||||
|
|
||||
|
extern uint8_t CAN_Buf[8]; |
||||
|
extern uint8_t CAN_Buf_2[8]; |
||||
|
typedef struct _CANSendHandler |
||||
|
{ |
||||
|
uint32_t CAN_ID; |
||||
|
uint32_t SendListTimePeriod; |
||||
|
uint8_t SendLength; |
||||
|
uint8_t Tx_Buf[8]; |
||||
|
void (*CAN_Decode)(uint32_t, uint8_t*, uint32_t); |
||||
|
struct _CANSendHandler *pNext; |
||||
|
} CANSendHandler; |
||||
|
|
||||
|
typedef struct _FDCANHandler |
||||
|
{ |
||||
|
|
||||
|
FDCAN_HandleTypeDef *canfd; //UART to use
|
||||
|
struct _DispacherController *dispacherController; |
||||
|
|
||||
|
|
||||
|
uint8_t timeSpan; |
||||
|
|
||||
|
uint8_t SendListExists; |
||||
|
uint32_t SendList_Period; //时间ms
|
||||
|
uint32_t SendList_time_Count; |
||||
|
|
||||
|
CANSendHandler *pCurrentCANSendHadler; //
|
||||
|
void (*AddCANSendList)(struct _FDCANHandler*, uint32_t, uint8_t, uint8_t*,uint32_t,//这里是修改等待时间
|
||||
|
void (*CAN_Decode)(uint32_t, uint8_t*, uint32_t)); |
||||
|
|
||||
|
void (*CAN_Decode)(uint32_t, uint8_t*, uint32_t); // decode can frame, received from other devices
|
||||
|
|
||||
|
void (*CAN_Send)(struct _FDCANHandler*, uint32_t, uint8_t, uint8_t*); |
||||
|
void (*CAN_Send_Data)(struct _FDCANHandler*); |
||||
|
//(uint8_t FDCAN_CH, uint32_t FrameID,uint8_t DataLength, uint8_t *Txdata)
|
||||
|
uint8_t Rx_Buf[128]; // 接收缓存,最大256字节
|
||||
|
uint8_t Tx_Buf[128]; //发送缓存 157,864
|
||||
|
uint32_t ReceivedLength; |
||||
|
uint32_t SendLength; |
||||
|
uint32_t ReceivedFrameID; |
||||
|
uint32_t SendFrameID; |
||||
|
|
||||
|
} FDCANHandler; |
||||
|
|
||||
|
extern FDCANHandler FD_CAN_1_Handler; |
||||
|
extern FDCANHandler FD_CAN_2_Handler; |
||||
|
void GF_BSP_CAN_Timer(); |
||||
|
void CAN_Send_t(struct _FDCANHandler *fd, uint32_t FrameID, uint8_t DataLength, |
||||
|
uint8_t *Txdata); |
||||
|
void CAN_Send_Data_t(struct _FDCANHandler *fd); |
||||
|
|
||||
|
void GF_CAN_Send_List_Send(FDCANHandler *handler); |
||||
|
void CANHandlerAddTxList(FDCANHandler *handler, uint32_t CAN_ID, |
||||
|
uint8_t SendLength, uint8_t *Tx_Buf,uint32_t sendListTimePeriod, |
||||
|
void (*CAN_Decode)(uint32_t, uint8_t*, uint32_t)); |
||||
|
void GF_BSP_CANHandler_Init(int can1_sendListPeriod, int can1_DispacherPeriod, |
||||
|
int can2_sendListPeriod, int can2_DispacherPeriod); |
||||
|
void GF_BSP_CANHandler_Init_CAN(FDCANHandler *handler, |
||||
|
FDCAN_HandleTypeDef *canfd, int sendListPeriod, int DispacherPeriod); |
||||
|
|
||||
|
void DecodeMotorCAN(uint32_t canID, uint8_t *buffer, uint32_t length); |
||||
|
|
||||
|
extern FDCANHandler FD_CAN_1_Handler; |
||||
|
extern FDCANHandler FD_CAN_2_Handler; |
||||
|
extern int32_t CAN_ID; |
||||
|
extern int32_t CAN_ID_2; |
||||
|
#endif /* INC_BSP_FDCAN_H_ */ |
||||
@ -0,0 +1,18 @@ |
|||||
|
/*
|
||||
|
* bsp_GPIO.h |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_GPIO_H_ |
||||
|
#define INC_BSP_GPIO_H_ |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
|
||||
|
uint8_t GF_BSP_GPIO_Init(void); |
||||
|
void GF_BSP_GPIO_SetIO(uint8_t IO_Index,uint8_t Level); |
||||
|
uint8_t GF_BSP_GPIO_ReadIO(uint8_t IO_Index); |
||||
|
uint8_t GF_BSP_GPIO_ToggleIO(uint8_t IO_Index); |
||||
|
|
||||
|
#endif /* INC_BSP_GPIO_H_ */ |
||||
@ -0,0 +1,50 @@ |
|||||
|
#ifndef __BSP_MB_HOST_H__ |
||||
|
#define __BSP_MB_HOST_H__ |
||||
|
|
||||
|
/* 包含头文件 ----------------------------------------------------------------*/ |
||||
|
|
||||
|
/* 类型定义 ------------------------------------------------------------------*/ |
||||
|
|
||||
|
/* 宏定义 --------------------------------------------------------------------*/ |
||||
|
#define MB_SLAVEADDR 0x0001 //从机地址
|
||||
|
#define MB_REG_ADDR 0 //寄存器地址(离散、线圈)
|
||||
|
#define HoldingReg 0 //保持寄存器
|
||||
|
#define InputRegReg 0x0020 //输入寄存器
|
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_UART.h" |
||||
|
|
||||
|
/* 扩展变量 ------------------------------------------------------------------*/ |
||||
|
typedef struct |
||||
|
{ |
||||
|
|
||||
|
uint16_t DATA_01H; |
||||
|
uint16_t DATA_02H; |
||||
|
uint16_t DATA_03H; |
||||
|
|
||||
|
uint16_t DATA_04H; |
||||
|
uint16_t DATA_05H; |
||||
|
uint16_t DATA_06H; |
||||
|
uint8_t DATA_10H[64]; |
||||
|
|
||||
|
}MB_REG_DATA; |
||||
|
|
||||
|
//;
|
||||
|
extern uint8_t MB_rx_flag; |
||||
|
extern uint16_t Read_Reg_Num; |
||||
|
|
||||
|
/* 函数声明 ------------------------------------------------------------------*/ |
||||
|
uint16_t MB_CRC16(uint8_t *pushMsg, uint16_t usDataLen); |
||||
|
void MB_ReadCoil(uint8_t* Tx_Buf,uint8_t* TxCount_t,uint8_t _addr, uint16_t _reg, uint16_t _num); |
||||
|
void MB_WriteCoil(uint8_t* Tx_Buf,uint8_t* TxCount_t,uint8_t _addr, uint16_t _reg, uint16_t _sta); |
||||
|
void MB_ReadInput(uint8_t* Tx_Buf,uint8_t* TxCount_t,uint8_t _addr, uint16_t _reg, uint16_t _num); |
||||
|
void MB_ReadHoldingReg(uint8_t* Tx_Buf,uint8_t* TxCount_t,uint8_t _addr, uint16_t _reg, uint16_t _num); |
||||
|
void MB_ReadInputReg(uint8_t* Tx_Buf,uint8_t* TxCount_t,uint8_t _addr, uint16_t _reg, uint16_t _num); |
||||
|
void MB_WriteHoldingReg(uint8_t* Tx_Buf,uint8_t* TxCount_t,uint8_t _addr, uint16_t _reg, uint16_t _data); |
||||
|
//void MB_WriteNumHoldingReg(uint8_t* Tx_Buf,uint8_t* TxCount_t,uint8_t _addr, uint16_t _reg, uint16_t _num,uint8_t *_databuf)
|
||||
|
void MB_WriteNumHoldingReg(uint8_t* Tx_Buf,uint8_t* TxCount_t,uint8_t _addr, uint16_t _reg, uint16_t _num,uint8_t *_databuf); |
||||
|
void MB_WriteNumCoil(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _num, uint8_t *_databuf); |
||||
|
|
||||
|
#endif /* __BSP_MB_HOST_H__ */ |
||||
|
|
||||
|
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/ |
||||
@ -0,0 +1,11 @@ |
|||||
|
/*
|
||||
|
* bsp_Motor_Helper.h |
||||
|
* |
||||
|
* Created on: Jul 30, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_MOTOR_HELPER_H_ |
||||
|
#define INC_BSP_BSP_MOTOR_HELPER_H_ |
||||
|
|
||||
|
#endif /* INC_BSP_BSP_MOTOR_HELPER_H_ */ |
||||
@ -0,0 +1,17 @@ |
|||||
|
/*
|
||||
|
* bsp_TIMER.h |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_TIMER_H_ |
||||
|
#define INC_BSP_TIMER_H_ |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
|
||||
|
uint8_t GF_BSP_TIMER_Init(void); |
||||
|
void GF_BSP_TIMER_DelayUS(uint32_t n); |
||||
|
|
||||
|
|
||||
|
#endif /* INC_BSP_TIMER_H_ */ |
||||
@ -0,0 +1,107 @@ |
|||||
|
|
||||
|
|
||||
|
#ifndef INC_BSP_UART_H_ |
||||
|
#define INC_BSP_UART_H_ |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
#include "main.h" |
||||
|
#include "bsp_Error.pb.h" |
||||
|
#define UART_Transmit_MAX_NUM 1024 |
||||
|
#define UART_Receive_MAX_NUM 100 |
||||
|
|
||||
|
extern struct UARTHandler RS_485_1_UART_Handler; |
||||
|
extern struct UARTHandler RS_485_2_UART_Handler; |
||||
|
extern struct UARTHandler RS_485_3_UART_Handler; |
||||
|
extern struct UARTHandler RS_485_4_UART_Handler; |
||||
|
extern struct UARTHandler InterCall_DEBUG_UART_Handler; |
||||
|
extern struct UARTHandler E28_SBUS_UART_Handler; |
||||
|
extern struct UARTHandler LTE_7S0_Serial_UART_Handler; |
||||
|
|
||||
|
|
||||
|
|
||||
|
#if defined (hlpuart1Exit) |
||||
|
extern struct UARTHandler LPUART1_UART_Handler; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
uint8_t GF_BSP_UART_Init(void); |
||||
|
|
||||
|
void GF_BSP_UARTHandlers_Intialize( |
||||
|
int32_t RS485_1_WaitTime, |
||||
|
int32_t RS485_2_WaitTime, |
||||
|
int32_t RS485_3_WaitTime, |
||||
|
int32_t RS485_4_WaitTime, |
||||
|
int32_t LTE_7S0_Serial_WaitTime, |
||||
|
int32_t InterCall_DEBUG_WaitTime, |
||||
|
int32_t E28_SBUS_WaitTime, |
||||
|
int32_t LPUART1_UART_WaitTime, |
||||
|
int32_t RS485_1_Dispacher_Time, |
||||
|
int32_t RS485_2_Dispacher_Time, |
||||
|
int32_t RS485_3_Dispacher_Time, |
||||
|
int32_t RS485_4_Dispacher_Time, |
||||
|
int32_t LTE_7S0_Serial_Dispacher_Time, |
||||
|
int32_t InterCall_DEBUG_Dispacher_Time, |
||||
|
int32_t E28_SBUS_Dispacher_Time, |
||||
|
int32_t LPUART1_UART_Dispacher_Time |
||||
|
); |
||||
|
|
||||
|
//串行发送完成后才能发送第二帧数据,没有做缓冲,如未发送完成,第二次发送无效,丢弃发送数据
|
||||
|
void GF_BSP_UART_Transmit(const uint8_t RS485_Index,const uint8_t *pData, uint16_t Size); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
typedef struct UARTSendHandler |
||||
|
{ |
||||
|
uint16_t SendLength; |
||||
|
uint16_t SendListTimePeriod; |
||||
|
uint8_t Tx_Buf[502]; |
||||
|
void (*UART_Decode)(uint8_t*, uint16_t); // 发送缓存
|
||||
|
struct UARTSendHandler* pNext; |
||||
|
}UARTSendHandler; |
||||
|
|
||||
|
|
||||
|
struct UARTHandler |
||||
|
{ |
||||
|
char startCountFlag; //indicate that to start counting
|
||||
|
char send_finished;//indicate decode finished or not
|
||||
|
char decode_finished;//indicate decode finished or not 解码完成
|
||||
|
uint8_t tmp_Rx_Buf[2]; // temporary data to store received data
|
||||
|
|
||||
|
uint32_t Wait_time; // the time to wait
|
||||
|
uint32_t Wait_Time_Count; |
||||
|
uint32_t SendList_time_Count; |
||||
|
|
||||
|
uint32_t SendList_Period; |
||||
|
uint8_t SendListExists; |
||||
|
|
||||
|
UART_HandleTypeDef* uart; //UART to use
|
||||
|
unsigned char timeSpan; // timer elapsed time
|
||||
|
uint8_t Rx_Buf[4096]; // 接收缓存,最大256字节
|
||||
|
uint8_t Tx_Buf[2048]; //发送缓存 157,864
|
||||
|
uint16_t TxCount; |
||||
|
uint16_t RxCount; |
||||
|
|
||||
|
//(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
|
||||
|
void (*UART_Tx)(struct UARTHandler*); //void UART_Tx(uint8_t *Tx_Buf,uint16_t TxCount);
|
||||
|
void (*UART_Rx)(struct UARTHandler*); |
||||
|
void (*UART_Decode)(uint8_t*, uint16_t); //Decode Rx_Buf
|
||||
|
UARTSendHandler *pCurrentUARTSendHadler; //
|
||||
|
void (*AddSendList)(struct UARTHandler*, uint8_t*, uint16_t,uint32_t,//这里是修改等待时间
|
||||
|
void (*UART_Decode)(uint8_t*, uint16_t)); |
||||
|
|
||||
|
|
||||
|
struct _DispacherController *dispacherController; |
||||
|
}; |
||||
|
|
||||
|
void UARTHandlerTx(struct UARTHandler *uartHandler); |
||||
|
void UARTHandlerRX(struct UARTHandler *uartHandler); |
||||
|
//void IntializeUARTHandler(struct UARTHandler *uartHandler, UART_HandleTypeDef uart,int32_t WaitTime,unsigned char timeSpan);
|
||||
|
void Counting(struct UARTHandler *uartHandler); |
||||
|
|
||||
|
|
||||
|
void IntializeUARTHandler(struct UARTHandler *uartHandler, |
||||
|
UART_HandleTypeDef *uart, int32_t WaitTime, unsigned char timeSpan,int32_t Dispacher_Time); |
||||
|
void GF_BSP_UART_Timer(); |
||||
|
|
||||
|
#endif /* INC_BSP_UART_H_ */ |
||||
@ -0,0 +1,17 @@ |
|||||
|
/*
|
||||
|
* bsp_UDP.h |
||||
|
* |
||||
|
* Created on: Aug 13, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_UDP_H_ |
||||
|
#define INC_BSP_BSP_UDP_H_ |
||||
|
|
||||
|
|
||||
|
void udp_printf_CmdBack(char *pData); |
||||
|
void udp_client_init(void); |
||||
|
void GF_UDP_Send(uint8_t *pData,uint16_t Size,uint16_t UDP_port); |
||||
|
void GF_UDP_long_Send_Server(void); |
||||
|
void GF_UpdataPos_Send(uint8_t *pData,uint32_t Size); |
||||
|
#endif /* INC_BSP_BSP_UDP_H_ */ |
||||
@ -0,0 +1,27 @@ |
|||||
|
/*
|
||||
|
* bsp_desulfurizer_handler.h |
||||
|
* |
||||
|
* Created on: Jul 29, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_UPPERCOMPUTER_HANDLER_H_ |
||||
|
#define INC_BSP_BSP_UPPERCOMPUTER_HANDLER_H_ |
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
#include "stdio.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_UART.h" |
||||
|
#include "usart.h" |
||||
|
#include "gpio.h" |
||||
|
|
||||
|
|
||||
|
extern struct UARTHandler *desulfurizer_message_UART_Handler; |
||||
|
void upper_Computer_UART_Handler_intialize(struct UARTHandler *Handler); |
||||
|
|
||||
|
void decode_command_from_computer(uint8_t *buffer, uint16_t length); |
||||
|
|
||||
|
|
||||
|
void send_data_to_upper_computer(double Angle, double WireLength, |
||||
|
double Thickness, char IsFittingPoint,char isMqtt,struct UARTHandler *send_UART_Handler); |
||||
|
#endif /* INC_BSP_BSP_UPPERCOMPUTER_HANDLER_H_ */ |
||||
@ -0,0 +1,16 @@ |
|||||
|
/*
|
||||
|
* bsp_adc.h |
||||
|
* |
||||
|
* Created on: Feb 21, 2025 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_ADC_H_ |
||||
|
#define INC_BSP_BSP_ADC_H_ |
||||
|
|
||||
|
|
||||
|
#include "main.h" |
||||
|
#include "../../BASE/Inc/BSP/DLT/DLTuc.h" |
||||
|
|
||||
|
int32_t read_temperature(); |
||||
|
#endif /* INC_BSP_BSP_ADC_H_ */ |
||||
@ -0,0 +1,13 @@ |
|||||
|
/*
|
||||
|
* bsp_pv_setting.h |
||||
|
* |
||||
|
* Created on: Jan 8, 2025 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_CLIENT_SETTING_H_ |
||||
|
#define INC_BSP_BSP_CLIENT_SETTING_H_ |
||||
|
#include "../../BASE/Inc/BSP/BHBF_ROBOT.h" |
||||
|
|
||||
|
void client_setting_intialize(struct UARTHandler *Handler); |
||||
|
#endif /* INC_BSP_BSP_CLIENT_SETTING_H_ */ |
||||
@ -0,0 +1,82 @@ |
|||||
|
/*
|
||||
|
* bsp_com_helper.h |
||||
|
* |
||||
|
* Created on: Oct 9, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_COM_HELPER_H_ |
||||
|
#define INC_BSP_BSP_COM_HELPER_H_ |
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
|
||||
|
|
||||
|
typedef struct _Dispatcher |
||||
|
{ |
||||
|
//uint8_t IsDeleted;
|
||||
|
void (*dispache)(void); |
||||
|
|
||||
|
//struct _Dispatcher* pBefore;
|
||||
|
struct _Dispatcher* pNext; |
||||
|
}Dispatcher; |
||||
|
|
||||
|
|
||||
|
//通讯链表节点结构体
|
||||
|
typedef struct _ComHardWare |
||||
|
{ |
||||
|
//void (*dispache)(void);
|
||||
|
char Name[50]; |
||||
|
char IsOnline; |
||||
|
uint32_t BitFlag; |
||||
|
struct _ComHardWare* pNext; |
||||
|
}ComHardWare; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
typedef struct _DispacherController |
||||
|
{ |
||||
|
Dispatcher *pHead; // = NULL; //环形链表中的数据头指针
|
||||
|
Dispatcher *pTail; // = NULL; //环形链表中的数据尾指针
|
||||
|
uint16_t DispacherNumber; // = 0;
|
||||
|
uint16_t DispacherCallTime; //
|
||||
|
uint16_t Dispacher_Counter; // = 0;
|
||||
|
uint16_t Dispacher_Enable; // = 0 disable 1 enable
|
||||
|
void (*Add_Dispatcher_List)(struct _DispacherController* , |
||||
|
void (*dispacher)(void)); //UART的调度程序 添加调度任务
|
||||
|
void (*Dispatcher_Run)(struct _DispacherController* ); //UART的调度程序 执行调度任务
|
||||
|
|
||||
|
}DispacherController; |
||||
|
|
||||
|
typedef struct _HardWareController |
||||
|
{ |
||||
|
struct _ComHardWare *pComHWHead; |
||||
|
struct _ComHardWare *pComHWTail; |
||||
|
uint16_t HardWare_Check_Counter; |
||||
|
uint16_t DispacherCallTime; //= 100; //2ms 一次,
|
||||
|
void (*Add_PCOMHardWare)(struct _HardWareController *, char* , char ,uint32_t); |
||||
|
void (*PCOMHardWare_Check)(struct _HardWareController *); |
||||
|
int (*Set_PCOMHardWare)(struct _HardWareController *, char* , char ); |
||||
|
|
||||
|
|
||||
|
} HardWareController; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
void Dispatch_t(DispacherController *uartHandler); |
||||
|
|
||||
|
void Dispatcher_List_Add_t(DispacherController *uartHandler,void (*dispache)(void)); |
||||
|
// void Dispatcher_List_Add_t(DispacherController *uartHandler,
|
||||
|
// void (*dispache)(void),void (*Decode)(uint8_t*, uint16_t));
|
||||
|
// void ComHardWare_List_Add_t(HardWareController *uartHandler, char *name,char value);
|
||||
|
|
||||
|
void PCOMHardWare_Check_t(HardWareController *uartHandler); |
||||
|
|
||||
|
int Set_PCOMHardWare_t(HardWareController *uartHandler, char *name, char value); |
||||
|
|
||||
|
void ComHardWare_List_Add_t(HardWareController *uartHandler, char *name, |
||||
|
char value,uint32_t bitFlag); |
||||
|
|
||||
|
|
||||
|
#endif /* INC_BSP_BSP_COM_HELPER_H_ */ |
||||
@ -0,0 +1,66 @@ |
|||||
|
/*
|
||||
|
* bsp_cpu_flash.h |
||||
|
* |
||||
|
* Created on: Aug 28, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef SRC_BSP_BSP_CPU_FLASH_H_ |
||||
|
#define SRC_BSP_BSP_CPU_FLASH_H_ |
||||
|
|
||||
|
#include "main.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_qspi_w25q128.h" |
||||
|
#include "quadspi.h" |
||||
|
|
||||
|
#define ENABLE_INT() __set_PRIMASK(0) /* 使能全局中断 */ |
||||
|
#define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中断 */ |
||||
|
|
||||
|
|
||||
|
#define CPU_FLASH_BASE_ADDR (uint32_t)(FLASH_BASE) /* 0x08000000 */ |
||||
|
#define CPU_FLASH_END_ADDR (uint32_t)(0x081FFFFF) |
||||
|
|
||||
|
#define CPU_FLASH_SIZE (2 * 1024 * 1024) /* FLASH总容量 */ |
||||
|
#define CPU_FLASH_SECTOR_SIZE (128 * 1024) /* 扇区大小,字节 */ |
||||
|
|
||||
|
/* Base address of the Flash sectors Bank 1 */ |
||||
|
#define ADDR_FLASH_SECTOR_0_BANK1 ((uint32_t)0x08000000) /* Base @ of Sector 0, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_1_BANK1 ((uint32_t)0x08020000) /* Base @ of Sector 1, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_2_BANK1 ((uint32_t)0x08040000) /* Base @ of Sector 2, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_3_BANK1 ((uint32_t)0x08060000) /* Base @ of Sector 3, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_4_BANK1 ((uint32_t)0x08080000) /* Base @ of Sector 4, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_5_BANK1 ((uint32_t)0x080A0000) /* Base @ of Sector 5, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_6_BANK1 ((uint32_t)0x080C0000) /* Base @ of Sector 6, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_7_BANK1 ((uint32_t)0x080E0000) /* Base @ of Sector 7, 128 Kbytes */ |
||||
|
|
||||
|
/* Base address of the Flash sectors Bank 2 */ |
||||
|
#define ADDR_FLASH_SECTOR_0_BANK2 ((uint32_t)0x08100000) /* Base @ of Sector 0, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_1_BANK2 ((uint32_t)0x08120000) /* Base @ of Sector 1, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_2_BANK2 ((uint32_t)0x08140000) /* Base @ of Sector 2, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_3_BANK2 ((uint32_t)0x08160000) /* Base @ of Sector 3, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_4_BANK2 ((uint32_t)0x08180000) /* Base @ of Sector 4, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_5_BANK2 ((uint32_t)0x081A0000) /* Base @ of Sector 5, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_6_BANK2 ((uint32_t)0x081C0000) /* Base @ of Sector 6, 128 Kbytes */ |
||||
|
#define ADDR_FLASH_SECTOR_7_BANK2 ((uint32_t)0x081E0000) /* Base @ of Sector 7, 128 Kbytes */ |
||||
|
|
||||
|
#define FLASH_IS_EQU 0 /* Flash内容和待写入的数据相等,不需要擦除和写操作 */ |
||||
|
#define FLASH_REQ_WRITE 1 /* Flash不需要擦除,直接写 */ |
||||
|
#define FLASH_REQ_ERASE 2 /* Flash需要先擦除,再写 */ |
||||
|
#define FLASH_PARAM_ERR 3 /* 函数参数错误 */ |
||||
|
|
||||
|
|
||||
|
#define App_Start_Addr 0x08000000 |
||||
|
#define App_Run_Addr 0x08020000 |
||||
|
#define App_Download_Addr 0x08080000 // ADDR_FLASH_SECTOR_4_BANK1
|
||||
|
|
||||
|
|
||||
|
|
||||
|
uint8_t bsp_ReadCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpDst, uint32_t _ulSize); |
||||
|
uint8_t bsp_WriteCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpSrc, uint32_t _ulSize); |
||||
|
uint8_t bsp_CmpCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpBuf, uint32_t _ulSize); |
||||
|
void JumpToApp(void); |
||||
|
void Copy_Peripheral_Download_Flash_to_App_Start(uint32_t totalBytes); |
||||
|
uint8_t bsp_EraseCpuFlash(uint32_t _ulFlashAddr); |
||||
|
void Erase_App_Download_Flash_Addr(); |
||||
|
void Copy_Download_Flash_to_Start(); |
||||
|
#endif /* SRC_BSP_BSP_CPU_FLASH_H_ */ |
||||
@ -0,0 +1,38 @@ |
|||||
|
/*
|
||||
|
* bsp_decode_command.h |
||||
|
* |
||||
|
* Created on: Sep 24, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_DECODE_COMMAND_H_ |
||||
|
#define INC_BSP_BSP_DECODE_COMMAND_H_ |
||||
|
#include "main.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/pb_decode.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_encode.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
#include "../../BASE/Inc/BSP/pb.h" |
||||
|
|
||||
|
#include "bsp_Cmd.pb.h" |
||||
|
#include <stdio.h> |
||||
|
#include <stdbool.h> |
||||
|
#include <stdlib.h> |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/BHBF_ROBOT.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_cpu_flash.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_qspi_w25q128.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_UpperComputer_Handler.h" |
||||
|
#include "bsp_ReCmd.pb.h" |
||||
|
#include "bsp_IV.pb.h" |
||||
|
|
||||
|
void send_received_data_to_upper_computer(uint8_t *buffer, uint16_t length); |
||||
|
void decode_command_and_feedback(uint8_t *buffer, uint16_t length, char isMqtt, |
||||
|
struct UARTHandler *send_Handler); |
||||
|
|
||||
|
void WrapInCmdAndSend(ReCmd send_Cmd, uint8_t *buf, char isMqtt,struct UARTHandler *send_Handler); |
||||
|
|
||||
|
|
||||
|
void WrapInCmdAndSendMessage(ReCmd send_Cmd,int8_t functionNum,char isSuccess, uint8_t *buf, char isMqtt, |
||||
|
struct UARTHandler *send_Handler); |
||||
|
#endif /* INC_BSP_BSP_DECODE_COMMAND_H_ */ |
||||
@ -0,0 +1,57 @@ |
|||||
|
/*
|
||||
|
* bsp_include.h |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_INCLUDE_H_ |
||||
|
#define INC_BSP_INCLUDE_H_ |
||||
|
|
||||
|
#include "main.h" |
||||
|
#include "dma.h" |
||||
|
#include "fdcan.h" |
||||
|
#include "i2c.h" |
||||
|
#include "tim.h" |
||||
|
#include "usart.h" |
||||
|
#include "gpio.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_EEPROM.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_GPIO.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_FDCAN.h" |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_TIMER.h" |
||||
|
#include "bsp_PV.pb.h" |
||||
|
|
||||
|
#include "bsp_GV.pb.h" |
||||
|
#include "bsp_CV.pb.h" |
||||
|
#include "../../BASE/Inc/BSP/pb.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_decode.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_common.h" |
||||
|
|
||||
|
//一个中断回调函数支持多少个回调函数链接
|
||||
|
#define DF_BSP_InterCall_Num 20 |
||||
|
|
||||
|
//一共支持多少种中断函数
|
||||
|
#define DF_BSP_InterCall_Type_Num 11 |
||||
|
|
||||
|
enum DF_BSP_InterCall_Type |
||||
|
{ |
||||
|
DF_BSP_InterCall_FDCAN1_RxFifo0Callback = 0, |
||||
|
DF_BSP_InterCall_FDCAN2_RxFifo0Callback, |
||||
|
DF_BSP_InterCall_RS485_1_RxCpltCallback, |
||||
|
DF_BSP_InterCall_RS485_2_RxCpltCallback, |
||||
|
DF_BSP_InterCall_RS485_3_RxCpltCallback, |
||||
|
DF_BSP_InterCall_RS485_4_RxCpltCallback, |
||||
|
DF_BSP_InterCall_DEBUG_RxCpltCallback, |
||||
|
DF_BSP_InterCall_E22_Serial_RxCpltCallback, |
||||
|
DF_BSP_InterCall_E28_SBUS_RxFifo0Callback, |
||||
|
DF_BSP_InterCall_TIM1_100ms_PeriodElapsedCallback, |
||||
|
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback |
||||
|
}; |
||||
|
|
||||
|
uint8_t GF_BSP_Interrupt_Add_CallBack(enum DF_BSP_InterCall_Type _type, |
||||
|
void (*_fn)(void)); |
||||
|
void GF_BSP_Interrupt_Run_CallBack(enum DF_BSP_InterCall_Type _type); |
||||
|
|
||||
|
#endif /* INC_BSP_INCLUDE_H_ */ |
||||
@ -0,0 +1,36 @@ |
|||||
|
|
||||
|
#ifndef __BSP_MQTT_H |
||||
|
#define __BSP_MQTT_H |
||||
|
|
||||
|
/*-----------------------------------------------------------
|
||||
|
* Includes files |
||||
|
*----------------------------------------------------------*/ |
||||
|
|
||||
|
/*-----------------------------------------------------------
|
||||
|
* Exported constants |
||||
|
*----------------------------------------------------------*/ |
||||
|
|
||||
|
|
||||
|
/*-----------------------------------------------------------
|
||||
|
* Exported macro |
||||
|
*----------------------------------------------------------*/ |
||||
|
|
||||
|
/*-----------------------------------------------------------
|
||||
|
* Exported function |
||||
|
*----------------------------------------------------------*/ |
||||
|
/*!
|
||||
|
* @brief 封装 MQTT 初始化接口 |
||||
|
* 执行条件:无 |
||||
|
* |
||||
|
* @retval: 无 |
||||
|
*/ |
||||
|
void bsp_mqtt_init(void); |
||||
|
void bsp_mqtt_test(void); |
||||
|
|
||||
|
|
||||
|
extern void bsp_mqtt_pub_send(char topic[],char buf[],size_t len); |
||||
|
|
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_pb_decode_encode.h" |
||||
|
|
||||
|
#endif /* __BSP_WOLFSSL_H */ |
||||
@ -0,0 +1,26 @@ |
|||||
|
/*
|
||||
|
* bsp_mqtt_pub.h |
||||
|
* |
||||
|
* Created on: Jul 9, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_MQTT_PUB_H_ |
||||
|
#define INC_BSP_BSP_MQTT_PUB_H_ |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_pb_decode_encode.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_decode.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_encode.h" |
||||
|
#include "bsp_CV.pb.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_pb_decode_encode.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_EEPROM.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
extern void log_info(char logger[], char message[]); |
||||
|
extern void log_debug(char logger[], char message[]); |
||||
|
extern void log_err(char logger[], char message[]); |
||||
|
|
||||
|
#endif /* INC_BSP_BSP_MQTT_PUB_H_ */ |
||||
@ -0,0 +1,51 @@ |
|||||
|
/*
|
||||
|
* bsp_pb_decode_encode.h |
||||
|
* |
||||
|
* Created on: Jul 5, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_BSP_BSP_PB_DECODE_ENCODE_H_ |
||||
|
#define INC_BSP_BSP_PB_DECODE_ENCODE_H_ |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <stdbool.h> |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/pb_decode.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_encode.h" |
||||
|
#include "../../BASE/Inc/BSP/pb.h" |
||||
|
#include "bsp_CV.pb.h" |
||||
|
#include "bsp_GV.pb.h" |
||||
|
|
||||
|
#include "msp_Motor.pb.h" |
||||
|
#include "bsp_PV.pb.h" |
||||
|
#include "bsp_CV.pb.h" |
||||
|
#include "bsp_CV.pb.h" |
||||
|
#include "../../BASE/Inc/BSP/pb_common.h" |
||||
|
|
||||
|
#include "bsp_IAP.pb.h" |
||||
|
IAP_struct_define pb_decode_IAP(uint8_t *buf, size_t length); |
||||
|
|
||||
|
typedef struct pb_buffer_arg |
||||
|
{ |
||||
|
/* Buffer to be written, or reference to read buffer */ |
||||
|
void const *buf; |
||||
|
/* Length of buf */ |
||||
|
size_t buf_len; |
||||
|
} pb_buffer_arg; |
||||
|
|
||||
|
|
||||
|
bool pb_encode_string_cb(pb_ostream_t *stream, const pb_field_t *field, void *const *arg); |
||||
|
bool pb_decode_string_cb(pb_istream_t *stream, const pb_field_t *field, void **arg); |
||||
|
|
||||
|
|
||||
|
extern CV_struct_define pb_decode_CV(char *buf, size_t length); |
||||
|
extern void Test_CV(); |
||||
|
|
||||
|
//extern void pb_encode_TraceMessage(char buf[], size_t buf_len,size_t* len,TraceLevel traceLevel, char logger[], char message[] );
|
||||
|
void pb_encode_TraceMessage(char buf[],size_t buf_len, size_t* len, |
||||
|
char traceLevel[], char logger[], char message[] ); |
||||
|
|
||||
|
#endif /* INC_BSP_BSP_PB_DECODE_ENCODE_H_ */ |
||||
@ -0,0 +1,107 @@ |
|||||
|
/*
|
||||
|
* bsp_quadspi_W25Q128.h |
||||
|
* |
||||
|
* Created on: Apr 21, 2021 |
||||
|
* Author: Administrator |
||||
|
* |
||||
|
* 该bsp用于华邦的w25q128JV,跟华邦的w25q128JV不一样 |
||||
|
* 坑爹的 |
||||
|
*/ |
||||
|
|
||||
|
#ifndef BSP_QSPI_W25Q128_H_ |
||||
|
#define BSP_QSPI_W25Q128_H_ |
||||
|
|
||||
|
|
||||
|
#include "quadspi.h" |
||||
|
#include "stdio.h" |
||||
|
|
||||
|
/* 宏定义 --------------------------------------------------------------------*/ |
||||
|
#define FLASH_BEGIN_ADDRESS 0x00000 |
||||
|
|
||||
|
#define CODE_DOWNLOAD_FLASH_BEGIN_ADDRESS 0x00000 |
||||
|
#define CODE_FLASH_STORAGE_SIZE 1024*1024 // 留下1M的空间存储数据
|
||||
|
|
||||
|
#define W25Q128FV_FLASH_SIZE 0x1000000 /* 128 MBits => 16MBytes */ |
||||
|
#define W25Q128FV_BLOCK_SIZE 0x10000 /* 256 Blocks of 64KBytes */ |
||||
|
#define W25Q128FV_HALF_BLOCK_SIZE 0x8000 /* 128 Blocks of 32KBytes */ |
||||
|
#define W25Q128FV_SECTOR_SIZE 0x1000 /* 4096 sectors of 4kBytes */ |
||||
|
#define W25Q128FV_PAGE_SIZE 0x100 /* 65536 pages of 256 bytes */ |
||||
|
|
||||
|
#define W25Q128FV_DUMMY_CYCLES_READ 4 |
||||
|
#define W25Q128FV_DUMMY_CYCLES_READ_QUAD 10 |
||||
|
|
||||
|
#define W25Q128FV_BULK_ERASE_MAX_TIME 250000//ms
|
||||
|
#define W25Q128FV_SECTOR_ERASE_MAX_TIME 3000 |
||||
|
#define W25Q128FV_SUBSECTOR_ERASE_MAX_TIME 800 |
||||
|
|
||||
|
#define W25Q128FV_FLASH_ID 0XEF4018 |
||||
|
/* W25Q128FV 指令 */ |
||||
|
/* 复位操作 */ |
||||
|
#define RESET_ENABLE_CMD 0x66 |
||||
|
#define RESET_MEMORY_CMD 0x99 |
||||
|
|
||||
|
#define ENTER_QPI_MODE_CMD 0x38 |
||||
|
#define EXIT_QPI_MODE_CMD 0xFF |
||||
|
|
||||
|
/* 读取ID指令 */ |
||||
|
#define READ_ID_CMD 0x90 |
||||
|
#define DUAL_READ_ID_CMD 0x92 |
||||
|
#define QUAD_READ_ID_CMD 0x94 |
||||
|
#define READ_JEDEC_ID_CMD 0x9F |
||||
|
|
||||
|
/* 读操作指令 */ |
||||
|
#define READ_CMD 0x03 |
||||
|
#define FAST_READ_CMD 0x0B |
||||
|
#define DUAL_OUT_FAST_READ_CMD 0x3B |
||||
|
#define DUAL_INOUT_FAST_READ_CMD 0xBB |
||||
|
#define QUAD_OUT_FAST_READ_CMD 0x6B |
||||
|
#define QUAD_INOUT_FAST_READ_CMD 0xEB |
||||
|
|
||||
|
/* 写使能操作指令 */ |
||||
|
#define WRITE_ENABLE_CMD 0x06 |
||||
|
#define WRITE_DISABLE_CMD 0x04 |
||||
|
|
||||
|
/* 读写状态寄存器操作指令 */ |
||||
|
#define READ_STATUS_REG1_CMD 0x05 |
||||
|
#define READ_STATUS_REG2_CMD 0x35 |
||||
|
#define READ_STATUS_REG3_CMD 0x15 |
||||
|
|
||||
|
#define WRITE_STATUS_REG1_CMD 0x01 |
||||
|
#define WRITE_STATUS_REG2_CMD 0x31 |
||||
|
#define WRITE_STATUS_REG3_CMD 0x11 |
||||
|
|
||||
|
/* 编程指令 */ |
||||
|
#define PAGE_PROG_CMD 0x02 |
||||
|
#define QUAD_INPUT_PAGE_PROG_CMD 0x32 |
||||
|
|
||||
|
/* 擦除Flash指令 */ |
||||
|
#define SECTOR_ERASE_CMD 0x20 |
||||
|
#define BLOCK_32KB_ERASE_CMD 0x52 |
||||
|
#define BLOCK_64KB_ERASE_CMD 0xD8 |
||||
|
#define CHIP_ERASE_CMD 0xC7 |
||||
|
|
||||
|
#define PROG_ERASE_RESUME_CMD 0x7A |
||||
|
#define PROG_ERASE_SUSPEND_CMD 0x75 |
||||
|
|
||||
|
/* 状态寄存器标志位 */ |
||||
|
#define W25Q128FV_FSR_BUSY ((uint8_t)0x01) /* busy */ |
||||
|
#define W25Q128FV_FSR_WREN ((uint8_t)0x02) /* write enable */ |
||||
|
#define W25Q128FV_FSR_QE ((uint8_t)0x02) /* quad enable */ |
||||
|
|
||||
|
/* Flash 状态码*/ |
||||
|
#define FLASH_OK ((uint8_t)0x00) |
||||
|
#define FLASH_ERROR ((uint8_t)0x01) |
||||
|
#define FLASH_BUSY ((uint8_t)0x02) |
||||
|
#define FLASH_NOT_SUPPORTED ((uint8_t)0x04) |
||||
|
#define FLASH_SUSPENDED ((uint8_t)0x08) |
||||
|
|
||||
|
|
||||
|
|
||||
|
uint32_t QSPI_W25Qx_ReadID(void); |
||||
|
void QSPI_W25Qx_Reset_Memory(); |
||||
|
void QSPI_W25Qx_EraseSector(uint32_t _SectorAddr); |
||||
|
uint8_t QSPI_W25Qx_Write_Buffer(uint8_t *_pBuf,uint32_t _write_Addr,uint16_t _write_Size); |
||||
|
void QSPI_W25Qx_Read_Buffer(uint8_t *_pBuf,uint32_t _read_Addr,uint32_t _read_Size); |
||||
|
void QSPI_W25Qx_EraseDownLoadFlash(); |
||||
|
void user_Assert(char *file,uint32_t line); |
||||
|
#endif /* BSP_QSPI_W25Q128_H_ */ |
||||
@ -0,0 +1,917 @@ |
|||||
|
/* Common parts of the nanopb library. Most of these are quite low-level
|
||||
|
* stuff. For the high-level interface, see pb_encode.h and pb_decode.h. |
||||
|
*/ |
||||
|
|
||||
|
#ifndef PB_H_INCLUDED |
||||
|
#define PB_H_INCLUDED |
||||
|
|
||||
|
/*****************************************************************
|
||||
|
* Nanopb compilation time options. You can change these here by * |
||||
|
* uncommenting the lines, or on the compiler command line. * |
||||
|
*****************************************************************/ |
||||
|
|
||||
|
/* Enable support for dynamically allocated fields */ |
||||
|
/* #define PB_ENABLE_MALLOC 1 */ |
||||
|
|
||||
|
/* Define this if your CPU / compiler combination does not support
|
||||
|
* unaligned memory access to packed structures. Note that packed |
||||
|
* structures are only used when requested in .proto options. */ |
||||
|
/* #define PB_NO_PACKED_STRUCTS 1 */ |
||||
|
|
||||
|
/* Increase the number of required fields that are tracked.
|
||||
|
* A compiler warning will tell if you need this. */ |
||||
|
/* #define PB_MAX_REQUIRED_FIELDS 256 */ |
||||
|
|
||||
|
/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */ |
||||
|
/* #define PB_FIELD_32BIT 1 */ |
||||
|
|
||||
|
/* Disable support for error messages in order to save some code space. */ |
||||
|
/* #define PB_NO_ERRMSG 1 */ |
||||
|
|
||||
|
/* Disable support for custom streams (support only memory buffers). */ |
||||
|
/* #define PB_BUFFER_ONLY 1 */ |
||||
|
|
||||
|
/* Disable support for 64-bit datatypes, for compilers without int64_t
|
||||
|
or to save some code space. */ |
||||
|
/* #define PB_WITHOUT_64BIT 1 */ |
||||
|
|
||||
|
/* Don't encode scalar arrays as packed. This is only to be used when
|
||||
|
* the decoder on the receiving side cannot process packed scalar arrays. |
||||
|
* Such example is older protobuf.js. */ |
||||
|
/* #define PB_ENCODE_ARRAYS_UNPACKED 1 */ |
||||
|
|
||||
|
/* Enable conversion of doubles to floats for platforms that do not
|
||||
|
* support 64-bit doubles. Most commonly AVR. */ |
||||
|
/* #define PB_CONVERT_DOUBLE_FLOAT 1 */ |
||||
|
|
||||
|
/* Check whether incoming strings are valid UTF-8 sequences. Slows down
|
||||
|
* the string processing slightly and slightly increases code size. */ |
||||
|
/* #define PB_VALIDATE_UTF8 1 */ |
||||
|
|
||||
|
/* This can be defined if the platform is little-endian and has 8-bit bytes.
|
||||
|
* Normally it is automatically detected based on __BYTE_ORDER__ macro. */ |
||||
|
/* #define PB_LITTLE_ENDIAN_8BIT 1 */ |
||||
|
|
||||
|
/* Configure static assert mechanism. Instead of changing these, set your
|
||||
|
* compiler to C11 standard mode if possible. */ |
||||
|
/* #define PB_C99_STATIC_ASSERT 1 */ |
||||
|
/* #define PB_NO_STATIC_ASSERT 1 */ |
||||
|
|
||||
|
/******************************************************************
|
||||
|
* You usually don't need to change anything below this line. * |
||||
|
* Feel free to look around and use the defined macros, though. * |
||||
|
******************************************************************/ |
||||
|
|
||||
|
|
||||
|
/* Version of the nanopb library. Just in case you want to check it in
|
||||
|
* your own program. */ |
||||
|
#define NANOPB_VERSION "nanopb-0.4.8-dev" |
||||
|
|
||||
|
/* Include all the system headers needed by nanopb. You will need the
|
||||
|
* definitions of the following: |
||||
|
* - strlen, memcpy, memset functions |
||||
|
* - [u]int_least8_t, uint_fast8_t, [u]int_least16_t, [u]int32_t, [u]int64_t |
||||
|
* - size_t |
||||
|
* - bool |
||||
|
* |
||||
|
* If you don't have the standard header files, you can instead provide |
||||
|
* a custom header that defines or includes all this. In that case, |
||||
|
* define PB_SYSTEM_HEADER to the path of this file. |
||||
|
*/ |
||||
|
#ifdef PB_SYSTEM_HEADER |
||||
|
#include PB_SYSTEM_HEADER |
||||
|
#else |
||||
|
#include <stdint.h> |
||||
|
#include <stddef.h> |
||||
|
#include <stdbool.h> |
||||
|
#include <string.h> |
||||
|
#include <limits.h> |
||||
|
|
||||
|
#ifdef PB_ENABLE_MALLOC |
||||
|
#include <stdlib.h> |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
extern "C" { |
||||
|
#endif |
||||
|
|
||||
|
/* Macro for defining packed structures (compiler dependent).
|
||||
|
* This just reduces memory requirements, but is not required. |
||||
|
*/ |
||||
|
#if defined(PB_NO_PACKED_STRUCTS) |
||||
|
/* Disable struct packing */ |
||||
|
# define PB_PACKED_STRUCT_START |
||||
|
# define PB_PACKED_STRUCT_END |
||||
|
# define pb_packed |
||||
|
#elif defined(__GNUC__) || defined(__clang__) |
||||
|
/* For GCC and clang */ |
||||
|
# define PB_PACKED_STRUCT_START |
||||
|
# define PB_PACKED_STRUCT_END |
||||
|
# define pb_packed __attribute__((packed)) |
||||
|
#elif defined(__ICCARM__) || defined(__CC_ARM) |
||||
|
/* For IAR ARM and Keil MDK-ARM compilers */ |
||||
|
# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)") |
||||
|
# define PB_PACKED_STRUCT_END _Pragma("pack(pop)") |
||||
|
# define pb_packed |
||||
|
#elif defined(_MSC_VER) && (_MSC_VER >= 1500) |
||||
|
/* For Microsoft Visual C++ */ |
||||
|
# define PB_PACKED_STRUCT_START __pragma(pack(push, 1)) |
||||
|
# define PB_PACKED_STRUCT_END __pragma(pack(pop)) |
||||
|
# define pb_packed |
||||
|
#else |
||||
|
/* Unknown compiler */ |
||||
|
# define PB_PACKED_STRUCT_START |
||||
|
# define PB_PACKED_STRUCT_END |
||||
|
# define pb_packed |
||||
|
#endif |
||||
|
|
||||
|
/* Detect endianness */ |
||||
|
#ifndef PB_LITTLE_ENDIAN_8BIT |
||||
|
#if ((defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN) || \ |
||||
|
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \ |
||||
|
defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || \ |
||||
|
defined(__THUMBEL__) || defined(__AARCH64EL__) || defined(_MIPSEL) || \ |
||||
|
defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM)) \ |
||||
|
&& CHAR_BIT == 8 |
||||
|
#define PB_LITTLE_ENDIAN_8BIT 1 |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
/* Handly macro for suppressing unreferenced-parameter compiler warnings. */ |
||||
|
#ifndef PB_UNUSED |
||||
|
#define PB_UNUSED(x) (void)(x) |
||||
|
#endif |
||||
|
|
||||
|
/* Harvard-architecture processors may need special attributes for storing
|
||||
|
* field information in program memory. */ |
||||
|
#ifndef PB_PROGMEM |
||||
|
#ifdef __AVR__ |
||||
|
#include <avr/pgmspace.h> |
||||
|
#define PB_PROGMEM PROGMEM |
||||
|
#define PB_PROGMEM_READU32(x) pgm_read_dword(&x) |
||||
|
#else |
||||
|
#define PB_PROGMEM |
||||
|
#define PB_PROGMEM_READU32(x) (x) |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
/* Compile-time assertion, used for checking compatible compilation options.
|
||||
|
* If this does not work properly on your compiler, use |
||||
|
* #define PB_NO_STATIC_ASSERT to disable it. |
||||
|
* |
||||
|
* But before doing that, check carefully the error message / place where it |
||||
|
* comes from to see if the error has a real cause. Unfortunately the error |
||||
|
* message is not always very clear to read, but you can see the reason better |
||||
|
* in the place where the PB_STATIC_ASSERT macro was called. |
||||
|
*/ |
||||
|
#ifndef PB_NO_STATIC_ASSERT |
||||
|
# ifndef PB_STATIC_ASSERT |
||||
|
# if defined(__ICCARM__) |
||||
|
/* IAR has static_assert keyword but no _Static_assert */ |
||||
|
# define PB_STATIC_ASSERT(COND,MSG) static_assert(COND,#MSG); |
||||
|
# elif defined(_MSC_VER) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112) |
||||
|
/* MSVC in C89 mode supports static_assert() keyword anyway */ |
||||
|
# define PB_STATIC_ASSERT(COND,MSG) static_assert(COND,#MSG); |
||||
|
# elif defined(PB_C99_STATIC_ASSERT) |
||||
|
/* Classic negative-size-array static assert mechanism */ |
||||
|
# define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1]; |
||||
|
# define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) |
||||
|
# define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##_##LINE##_##COUNTER |
||||
|
# elif defined(__cplusplus) |
||||
|
/* C++11 standard static_assert mechanism */ |
||||
|
# define PB_STATIC_ASSERT(COND,MSG) static_assert(COND,#MSG); |
||||
|
# else |
||||
|
/* C11 standard _Static_assert mechanism */ |
||||
|
# define PB_STATIC_ASSERT(COND,MSG) _Static_assert(COND,#MSG); |
||||
|
# endif |
||||
|
# endif |
||||
|
#else |
||||
|
/* Static asserts disabled by PB_NO_STATIC_ASSERT */ |
||||
|
# define PB_STATIC_ASSERT(COND,MSG) |
||||
|
#endif |
||||
|
|
||||
|
/* Test that PB_STATIC_ASSERT works
|
||||
|
* If you get errors here, you may need to do one of these: |
||||
|
* - Enable C11 standard support in your compiler |
||||
|
* - Define PB_C99_STATIC_ASSERT to enable C99 standard support |
||||
|
* - Define PB_NO_STATIC_ASSERT to disable static asserts altogether |
||||
|
*/ |
||||
|
PB_STATIC_ASSERT(1, STATIC_ASSERT_IS_NOT_WORKING) |
||||
|
|
||||
|
/* Number of required fields to keep track of. */ |
||||
|
#ifndef PB_MAX_REQUIRED_FIELDS |
||||
|
#define PB_MAX_REQUIRED_FIELDS 64 |
||||
|
#endif |
||||
|
|
||||
|
#if PB_MAX_REQUIRED_FIELDS < 64 |
||||
|
#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64). |
||||
|
#endif |
||||
|
|
||||
|
#ifdef PB_WITHOUT_64BIT |
||||
|
#ifdef PB_CONVERT_DOUBLE_FLOAT |
||||
|
/* Cannot use doubles without 64-bit types */ |
||||
|
#undef PB_CONVERT_DOUBLE_FLOAT |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
/* List of possible field types. These are used in the autogenerated code.
|
||||
|
* Least-significant 4 bits tell the scalar type |
||||
|
* Most-significant 4 bits specify repeated/required/packed etc. |
||||
|
*/ |
||||
|
|
||||
|
typedef uint_least8_t pb_type_t; |
||||
|
|
||||
|
/**** Field data types ****/ |
||||
|
|
||||
|
/* Numeric types */ |
||||
|
#define PB_LTYPE_BOOL 0x00U /* bool */ |
||||
|
#define PB_LTYPE_VARINT 0x01U /* int32, int64, enum, bool */ |
||||
|
#define PB_LTYPE_UVARINT 0x02U /* uint32, uint64 */ |
||||
|
#define PB_LTYPE_SVARINT 0x03U /* sint32, sint64 */ |
||||
|
#define PB_LTYPE_FIXED32 0x04U /* fixed32, sfixed32, float */ |
||||
|
#define PB_LTYPE_FIXED64 0x05U /* fixed64, sfixed64, double */ |
||||
|
|
||||
|
/* Marker for last packable field type. */ |
||||
|
#define PB_LTYPE_LAST_PACKABLE 0x05U |
||||
|
|
||||
|
/* Byte array with pre-allocated buffer.
|
||||
|
* data_size is the length of the allocated PB_BYTES_ARRAY structure. */ |
||||
|
#define PB_LTYPE_BYTES 0x06U |
||||
|
|
||||
|
/* String with pre-allocated buffer.
|
||||
|
* data_size is the maximum length. */ |
||||
|
#define PB_LTYPE_STRING 0x07U |
||||
|
|
||||
|
/* Submessage
|
||||
|
* submsg_fields is pointer to field descriptions */ |
||||
|
#define PB_LTYPE_SUBMESSAGE 0x08U |
||||
|
|
||||
|
/* Submessage with pre-decoding callback
|
||||
|
* The pre-decoding callback is stored as pb_callback_t right before pSize. |
||||
|
* submsg_fields is pointer to field descriptions */ |
||||
|
#define PB_LTYPE_SUBMSG_W_CB 0x09U |
||||
|
|
||||
|
/* Extension pseudo-field
|
||||
|
* The field contains a pointer to pb_extension_t */ |
||||
|
#define PB_LTYPE_EXTENSION 0x0AU |
||||
|
|
||||
|
/* Byte array with inline, pre-allocated byffer.
|
||||
|
* data_size is the length of the inline, allocated buffer. |
||||
|
* This differs from PB_LTYPE_BYTES by defining the element as |
||||
|
* pb_byte_t[data_size] rather than pb_bytes_array_t. */ |
||||
|
#define PB_LTYPE_FIXED_LENGTH_BYTES 0x0BU |
||||
|
|
||||
|
/* Number of declared LTYPES */ |
||||
|
#define PB_LTYPES_COUNT 0x0CU |
||||
|
#define PB_LTYPE_MASK 0x0FU |
||||
|
|
||||
|
/**** Field repetition rules ****/ |
||||
|
|
||||
|
#define PB_HTYPE_REQUIRED 0x00U |
||||
|
#define PB_HTYPE_OPTIONAL 0x10U |
||||
|
#define PB_HTYPE_SINGULAR 0x10U |
||||
|
#define PB_HTYPE_REPEATED 0x20U |
||||
|
#define PB_HTYPE_FIXARRAY 0x20U |
||||
|
#define PB_HTYPE_ONEOF 0x30U |
||||
|
#define PB_HTYPE_MASK 0x30U |
||||
|
|
||||
|
/**** Field allocation types ****/ |
||||
|
|
||||
|
#define PB_ATYPE_STATIC 0x00U |
||||
|
#define PB_ATYPE_POINTER 0x80U |
||||
|
#define PB_ATYPE_CALLBACK 0x40U |
||||
|
#define PB_ATYPE_MASK 0xC0U |
||||
|
|
||||
|
#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK) |
||||
|
#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK) |
||||
|
#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK) |
||||
|
#define PB_LTYPE_IS_SUBMSG(x) (PB_LTYPE(x) == PB_LTYPE_SUBMESSAGE || \ |
||||
|
PB_LTYPE(x) == PB_LTYPE_SUBMSG_W_CB) |
||||
|
|
||||
|
/* Data type used for storing sizes of struct fields
|
||||
|
* and array counts. |
||||
|
*/ |
||||
|
#if defined(PB_FIELD_32BIT) |
||||
|
typedef uint32_t pb_size_t; |
||||
|
typedef int32_t pb_ssize_t; |
||||
|
#else |
||||
|
typedef uint_least16_t pb_size_t; |
||||
|
typedef int_least16_t pb_ssize_t; |
||||
|
#endif |
||||
|
#define PB_SIZE_MAX ((pb_size_t)-1) |
||||
|
|
||||
|
/* Data type for storing encoded data and other byte streams.
|
||||
|
* This typedef exists to support platforms where uint8_t does not exist. |
||||
|
* You can regard it as equivalent on uint8_t on other platforms. |
||||
|
*/ |
||||
|
typedef uint_least8_t pb_byte_t; |
||||
|
|
||||
|
/* Forward declaration of struct types */ |
||||
|
typedef struct pb_istream_s pb_istream_t; |
||||
|
typedef struct pb_ostream_s pb_ostream_t; |
||||
|
typedef struct pb_field_iter_s pb_field_iter_t; |
||||
|
|
||||
|
/* This structure is used in auto-generated constants
|
||||
|
* to specify struct fields. |
||||
|
*/ |
||||
|
typedef struct pb_msgdesc_s pb_msgdesc_t; |
||||
|
struct pb_msgdesc_s { |
||||
|
const uint32_t *field_info; |
||||
|
const pb_msgdesc_t * const * submsg_info; |
||||
|
const pb_byte_t *default_value; |
||||
|
|
||||
|
bool (*field_callback)(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_iter_t *field); |
||||
|
|
||||
|
pb_size_t field_count; |
||||
|
pb_size_t required_field_count; |
||||
|
pb_size_t largest_tag; |
||||
|
}; |
||||
|
|
||||
|
/* Iterator for message descriptor */ |
||||
|
struct pb_field_iter_s { |
||||
|
const pb_msgdesc_t *descriptor; /* Pointer to message descriptor constant */ |
||||
|
void *message; /* Pointer to start of the structure */ |
||||
|
|
||||
|
pb_size_t index; /* Index of the field */ |
||||
|
pb_size_t field_info_index; /* Index to descriptor->field_info array */ |
||||
|
pb_size_t required_field_index; /* Index that counts only the required fields */ |
||||
|
pb_size_t submessage_index; /* Index that counts only submessages */ |
||||
|
|
||||
|
pb_size_t tag; /* Tag of current field */ |
||||
|
pb_size_t data_size; /* sizeof() of a single item */ |
||||
|
pb_size_t array_size; /* Number of array entries */ |
||||
|
pb_type_t type; /* Type of current field */ |
||||
|
|
||||
|
void *pField; /* Pointer to current field in struct */ |
||||
|
void *pData; /* Pointer to current data contents. Different than pField for arrays and pointers. */ |
||||
|
void *pSize; /* Pointer to count/has field */ |
||||
|
|
||||
|
const pb_msgdesc_t *submsg_desc; /* For submessage fields, pointer to field descriptor for the submessage. */ |
||||
|
}; |
||||
|
|
||||
|
/* For compatibility with legacy code */ |
||||
|
typedef pb_field_iter_t pb_field_t; |
||||
|
|
||||
|
/* Make sure that the standard integer types are of the expected sizes.
|
||||
|
* Otherwise fixed32/fixed64 fields can break. |
||||
|
* |
||||
|
* If you get errors here, it probably means that your stdint.h is not |
||||
|
* correct for your platform. |
||||
|
*/ |
||||
|
#ifndef PB_WITHOUT_64BIT |
||||
|
PB_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), INT64_T_WRONG_SIZE) |
||||
|
PB_STATIC_ASSERT(sizeof(uint64_t) == 2 * sizeof(uint32_t), UINT64_T_WRONG_SIZE) |
||||
|
#endif |
||||
|
|
||||
|
/* This structure is used for 'bytes' arrays.
|
||||
|
* It has the number of bytes in the beginning, and after that an array. |
||||
|
* Note that actual structs used will have a different length of bytes array. |
||||
|
*/ |
||||
|
#define PB_BYTES_ARRAY_T(n) struct { pb_size_t size; pb_byte_t bytes[n]; } |
||||
|
#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes)) |
||||
|
|
||||
|
struct pb_bytes_array_s { |
||||
|
pb_size_t size; |
||||
|
pb_byte_t bytes[1]; |
||||
|
}; |
||||
|
typedef struct pb_bytes_array_s pb_bytes_array_t; |
||||
|
|
||||
|
/* This structure is used for giving the callback function.
|
||||
|
* It is stored in the message structure and filled in by the method that |
||||
|
* calls pb_decode. |
||||
|
* |
||||
|
* The decoding callback will be given a limited-length stream |
||||
|
* If the wire type was string, the length is the length of the string. |
||||
|
* If the wire type was a varint/fixed32/fixed64, the length is the length |
||||
|
* of the actual value. |
||||
|
* The function may be called multiple times (especially for repeated types, |
||||
|
* but also otherwise if the message happens to contain the field multiple |
||||
|
* times.) |
||||
|
* |
||||
|
* The encoding callback will receive the actual output stream. |
||||
|
* It should write all the data in one call, including the field tag and |
||||
|
* wire type. It can write multiple fields. |
||||
|
* |
||||
|
* The callback can be null if you want to skip a field. |
||||
|
*/ |
||||
|
typedef struct pb_callback_s pb_callback_t; |
||||
|
struct pb_callback_s { |
||||
|
/* Callback functions receive a pointer to the arg field.
|
||||
|
* You can access the value of the field as *arg, and modify it if needed. |
||||
|
*/ |
||||
|
union { |
||||
|
bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg); |
||||
|
bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg); |
||||
|
} funcs; |
||||
|
|
||||
|
/* Free arg for use by callback */ |
||||
|
void *arg; |
||||
|
}; |
||||
|
|
||||
|
extern bool pb_default_field_callback(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_t *field); |
||||
|
|
||||
|
/* Wire types. Library user needs these only in encoder callbacks. */ |
||||
|
typedef enum { |
||||
|
PB_WT_VARINT = 0, |
||||
|
PB_WT_64BIT = 1, |
||||
|
PB_WT_STRING = 2, |
||||
|
PB_WT_32BIT = 5, |
||||
|
PB_WT_PACKED = 255 /* PB_WT_PACKED is internal marker for packed arrays. */ |
||||
|
} pb_wire_type_t; |
||||
|
|
||||
|
/* Structure for defining the handling of unknown/extension fields.
|
||||
|
* Usually the pb_extension_type_t structure is automatically generated, |
||||
|
* while the pb_extension_t structure is created by the user. However, |
||||
|
* if you want to catch all unknown fields, you can also create a custom |
||||
|
* pb_extension_type_t with your own callback. |
||||
|
*/ |
||||
|
typedef struct pb_extension_type_s pb_extension_type_t; |
||||
|
typedef struct pb_extension_s pb_extension_t; |
||||
|
struct pb_extension_type_s { |
||||
|
/* Called for each unknown field in the message.
|
||||
|
* If you handle the field, read off all of its data and return true. |
||||
|
* If you do not handle the field, do not read anything and return true. |
||||
|
* If you run into an error, return false. |
||||
|
* Set to NULL for default handler. |
||||
|
*/ |
||||
|
bool (*decode)(pb_istream_t *stream, pb_extension_t *extension, |
||||
|
uint32_t tag, pb_wire_type_t wire_type); |
||||
|
|
||||
|
/* Called once after all regular fields have been encoded.
|
||||
|
* If you have something to write, do so and return true. |
||||
|
* If you do not have anything to write, just return true. |
||||
|
* If you run into an error, return false. |
||||
|
* Set to NULL for default handler. |
||||
|
*/ |
||||
|
bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension); |
||||
|
|
||||
|
/* Free field for use by the callback. */ |
||||
|
const void *arg; |
||||
|
}; |
||||
|
|
||||
|
struct pb_extension_s { |
||||
|
/* Type describing the extension field. Usually you'll initialize
|
||||
|
* this to a pointer to the automatically generated structure. */ |
||||
|
const pb_extension_type_t *type; |
||||
|
|
||||
|
/* Destination for the decoded data. This must match the datatype
|
||||
|
* of the extension field. */ |
||||
|
void *dest; |
||||
|
|
||||
|
/* Pointer to the next extension handler, or NULL.
|
||||
|
* If this extension does not match a field, the next handler is |
||||
|
* automatically called. */ |
||||
|
pb_extension_t *next; |
||||
|
|
||||
|
/* The decoder sets this to true if the extension was found.
|
||||
|
* Ignored for encoding. */ |
||||
|
bool found; |
||||
|
}; |
||||
|
|
||||
|
#define pb_extension_init_zero {NULL,NULL,NULL,false} |
||||
|
|
||||
|
/* Memory allocation functions to use. You can define pb_realloc and
|
||||
|
* pb_free to custom functions if you want. */ |
||||
|
#ifdef PB_ENABLE_MALLOC |
||||
|
# ifndef pb_realloc |
||||
|
# define pb_realloc(ptr, size) realloc(ptr, size) |
||||
|
# endif |
||||
|
# ifndef pb_free |
||||
|
# define pb_free(ptr) free(ptr) |
||||
|
# endif |
||||
|
#endif |
||||
|
|
||||
|
/* This is used to inform about need to regenerate .pb.h/.pb.c files. */ |
||||
|
#define PB_PROTO_HEADER_VERSION 40 |
||||
|
|
||||
|
/* These macros are used to declare pb_field_t's in the constant array. */ |
||||
|
/* Size of a structure member, in bytes. */ |
||||
|
#define pb_membersize(st, m) (sizeof ((st*)0)->m) |
||||
|
/* Number of entries in an array. */ |
||||
|
#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0])) |
||||
|
/* Delta from start of one member to the start of another member. */ |
||||
|
#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2)) |
||||
|
|
||||
|
/* Force expansion of macro value */ |
||||
|
#define PB_EXPAND(x) x |
||||
|
|
||||
|
/* Binding of a message field set into a specific structure */ |
||||
|
#define PB_BIND(msgname, structname, width) \ |
||||
|
const uint32_t structname ## _field_info[] PB_PROGMEM = \ |
||||
|
{ \ |
||||
|
msgname ## _FIELDLIST(PB_GEN_FIELD_INFO_ ## width, structname) \ |
||||
|
0 \ |
||||
|
}; \ |
||||
|
const pb_msgdesc_t* const structname ## _submsg_info[] = \ |
||||
|
{ \ |
||||
|
msgname ## _FIELDLIST(PB_GEN_SUBMSG_INFO, structname) \ |
||||
|
NULL \ |
||||
|
}; \ |
||||
|
const pb_msgdesc_t structname ## _msg = \ |
||||
|
{ \ |
||||
|
structname ## _field_info, \ |
||||
|
structname ## _submsg_info, \ |
||||
|
msgname ## _DEFAULT, \ |
||||
|
msgname ## _CALLBACK, \ |
||||
|
0 msgname ## _FIELDLIST(PB_GEN_FIELD_COUNT, structname), \ |
||||
|
0 msgname ## _FIELDLIST(PB_GEN_REQ_FIELD_COUNT, structname), \ |
||||
|
0 msgname ## _FIELDLIST(PB_GEN_LARGEST_TAG, structname), \ |
||||
|
}; \ |
||||
|
msgname ## _FIELDLIST(PB_GEN_FIELD_INFO_ASSERT_ ## width, structname) |
||||
|
|
||||
|
#define PB_GEN_FIELD_COUNT(structname, atype, htype, ltype, fieldname, tag) +1 |
||||
|
#define PB_GEN_REQ_FIELD_COUNT(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
+ (PB_HTYPE_ ## htype == PB_HTYPE_REQUIRED) |
||||
|
#define PB_GEN_LARGEST_TAG(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
* 0 + tag |
||||
|
|
||||
|
/* X-macro for generating the entries in struct_field_info[] array. */ |
||||
|
#define PB_GEN_FIELD_INFO_1(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_1(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_GEN_FIELD_INFO_2(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_2(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_GEN_FIELD_INFO_4(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_4(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_GEN_FIELD_INFO_8(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_8(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_GEN_FIELD_INFO_AUTO(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_AUTO2(PB_FIELDINFO_WIDTH_AUTO(_PB_ATYPE_ ## atype, _PB_HTYPE_ ## htype, _PB_LTYPE_ ## ltype), \ |
||||
|
tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_FIELDINFO_AUTO2(width, tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_FIELDINFO_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) |
||||
|
|
||||
|
#define PB_FIELDINFO_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_FIELDINFO_ ## width(tag, type, data_offset, data_size, size_offset, array_size) |
||||
|
|
||||
|
/* X-macro for generating asserts that entries fit in struct_field_info[] array.
|
||||
|
* The structure of macros here must match the structure above in PB_GEN_FIELD_INFO_x(), |
||||
|
* but it is not easily reused because of how macro substitutions work. */ |
||||
|
#define PB_GEN_FIELD_INFO_ASSERT_1(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_ASSERT_1(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_GEN_FIELD_INFO_ASSERT_2(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_ASSERT_2(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_GEN_FIELD_INFO_ASSERT_4(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_ASSERT_4(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_GEN_FIELD_INFO_ASSERT_8(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_ASSERT_8(tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_GEN_FIELD_INFO_ASSERT_AUTO(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_FIELDINFO_ASSERT_AUTO2(PB_FIELDINFO_WIDTH_AUTO(_PB_ATYPE_ ## atype, _PB_HTYPE_ ## htype, _PB_LTYPE_ ## ltype), \ |
||||
|
tag, PB_ATYPE_ ## atype | PB_HTYPE_ ## htype | PB_LTYPE_MAP_ ## ltype, \ |
||||
|
PB_DATA_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_DATA_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_SIZE_OFFSET_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname), \ |
||||
|
PB_ARRAY_SIZE_ ## atype(_PB_HTYPE_ ## htype, structname, fieldname)) |
||||
|
|
||||
|
#define PB_FIELDINFO_ASSERT_AUTO2(width, tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_FIELDINFO_ASSERT_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) |
||||
|
|
||||
|
#define PB_FIELDINFO_ASSERT_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_FIELDINFO_ASSERT_ ## width(tag, type, data_offset, data_size, size_offset, array_size) |
||||
|
|
||||
|
#define PB_DATA_OFFSET_STATIC(htype, structname, fieldname) PB_DO ## htype(structname, fieldname) |
||||
|
#define PB_DATA_OFFSET_POINTER(htype, structname, fieldname) PB_DO ## htype(structname, fieldname) |
||||
|
#define PB_DATA_OFFSET_CALLBACK(htype, structname, fieldname) PB_DO ## htype(structname, fieldname) |
||||
|
#define PB_DO_PB_HTYPE_REQUIRED(structname, fieldname) offsetof(structname, fieldname) |
||||
|
#define PB_DO_PB_HTYPE_SINGULAR(structname, fieldname) offsetof(structname, fieldname) |
||||
|
#define PB_DO_PB_HTYPE_ONEOF(structname, fieldname) offsetof(structname, PB_ONEOF_NAME(FULL, fieldname)) |
||||
|
#define PB_DO_PB_HTYPE_OPTIONAL(structname, fieldname) offsetof(structname, fieldname) |
||||
|
#define PB_DO_PB_HTYPE_REPEATED(structname, fieldname) offsetof(structname, fieldname) |
||||
|
#define PB_DO_PB_HTYPE_FIXARRAY(structname, fieldname) offsetof(structname, fieldname) |
||||
|
|
||||
|
#define PB_SIZE_OFFSET_STATIC(htype, structname, fieldname) PB_SO ## htype(structname, fieldname) |
||||
|
#define PB_SIZE_OFFSET_POINTER(htype, structname, fieldname) PB_SO_PTR ## htype(structname, fieldname) |
||||
|
#define PB_SIZE_OFFSET_CALLBACK(htype, structname, fieldname) PB_SO_CB ## htype(structname, fieldname) |
||||
|
#define PB_SO_PB_HTYPE_REQUIRED(structname, fieldname) 0 |
||||
|
#define PB_SO_PB_HTYPE_SINGULAR(structname, fieldname) 0 |
||||
|
#define PB_SO_PB_HTYPE_ONEOF(structname, fieldname) PB_SO_PB_HTYPE_ONEOF2(structname, PB_ONEOF_NAME(FULL, fieldname), PB_ONEOF_NAME(UNION, fieldname)) |
||||
|
#define PB_SO_PB_HTYPE_ONEOF2(structname, fullname, unionname) PB_SO_PB_HTYPE_ONEOF3(structname, fullname, unionname) |
||||
|
#define PB_SO_PB_HTYPE_ONEOF3(structname, fullname, unionname) pb_delta(structname, fullname, which_ ## unionname) |
||||
|
#define PB_SO_PB_HTYPE_OPTIONAL(structname, fieldname) pb_delta(structname, fieldname, has_ ## fieldname) |
||||
|
#define PB_SO_PB_HTYPE_REPEATED(structname, fieldname) pb_delta(structname, fieldname, fieldname ## _count) |
||||
|
#define PB_SO_PB_HTYPE_FIXARRAY(structname, fieldname) 0 |
||||
|
#define PB_SO_PTR_PB_HTYPE_REQUIRED(structname, fieldname) 0 |
||||
|
#define PB_SO_PTR_PB_HTYPE_SINGULAR(structname, fieldname) 0 |
||||
|
#define PB_SO_PTR_PB_HTYPE_ONEOF(structname, fieldname) PB_SO_PB_HTYPE_ONEOF(structname, fieldname) |
||||
|
#define PB_SO_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) 0 |
||||
|
#define PB_SO_PTR_PB_HTYPE_REPEATED(structname, fieldname) PB_SO_PB_HTYPE_REPEATED(structname, fieldname) |
||||
|
#define PB_SO_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) 0 |
||||
|
#define PB_SO_CB_PB_HTYPE_REQUIRED(structname, fieldname) 0 |
||||
|
#define PB_SO_CB_PB_HTYPE_SINGULAR(structname, fieldname) 0 |
||||
|
#define PB_SO_CB_PB_HTYPE_ONEOF(structname, fieldname) PB_SO_PB_HTYPE_ONEOF(structname, fieldname) |
||||
|
#define PB_SO_CB_PB_HTYPE_OPTIONAL(structname, fieldname) 0 |
||||
|
#define PB_SO_CB_PB_HTYPE_REPEATED(structname, fieldname) 0 |
||||
|
#define PB_SO_CB_PB_HTYPE_FIXARRAY(structname, fieldname) 0 |
||||
|
|
||||
|
#define PB_ARRAY_SIZE_STATIC(htype, structname, fieldname) PB_AS ## htype(structname, fieldname) |
||||
|
#define PB_ARRAY_SIZE_POINTER(htype, structname, fieldname) PB_AS_PTR ## htype(structname, fieldname) |
||||
|
#define PB_ARRAY_SIZE_CALLBACK(htype, structname, fieldname) 1 |
||||
|
#define PB_AS_PB_HTYPE_REQUIRED(structname, fieldname) 1 |
||||
|
#define PB_AS_PB_HTYPE_SINGULAR(structname, fieldname) 1 |
||||
|
#define PB_AS_PB_HTYPE_OPTIONAL(structname, fieldname) 1 |
||||
|
#define PB_AS_PB_HTYPE_ONEOF(structname, fieldname) 1 |
||||
|
#define PB_AS_PB_HTYPE_REPEATED(structname, fieldname) pb_arraysize(structname, fieldname) |
||||
|
#define PB_AS_PB_HTYPE_FIXARRAY(structname, fieldname) pb_arraysize(structname, fieldname) |
||||
|
#define PB_AS_PTR_PB_HTYPE_REQUIRED(structname, fieldname) 1 |
||||
|
#define PB_AS_PTR_PB_HTYPE_SINGULAR(structname, fieldname) 1 |
||||
|
#define PB_AS_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) 1 |
||||
|
#define PB_AS_PTR_PB_HTYPE_ONEOF(structname, fieldname) 1 |
||||
|
#define PB_AS_PTR_PB_HTYPE_REPEATED(structname, fieldname) 1 |
||||
|
#define PB_AS_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) pb_arraysize(structname, fieldname[0]) |
||||
|
|
||||
|
#define PB_DATA_SIZE_STATIC(htype, structname, fieldname) PB_DS ## htype(structname, fieldname) |
||||
|
#define PB_DATA_SIZE_POINTER(htype, structname, fieldname) PB_DS_PTR ## htype(structname, fieldname) |
||||
|
#define PB_DATA_SIZE_CALLBACK(htype, structname, fieldname) PB_DS_CB ## htype(structname, fieldname) |
||||
|
#define PB_DS_PB_HTYPE_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname) |
||||
|
#define PB_DS_PB_HTYPE_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname) |
||||
|
#define PB_DS_PB_HTYPE_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname) |
||||
|
#define PB_DS_PB_HTYPE_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)) |
||||
|
#define PB_DS_PB_HTYPE_REPEATED(structname, fieldname) pb_membersize(structname, fieldname[0]) |
||||
|
#define PB_DS_PB_HTYPE_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname[0]) |
||||
|
#define PB_DS_PTR_PB_HTYPE_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname[0]) |
||||
|
#define PB_DS_PTR_PB_HTYPE_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname[0]) |
||||
|
#define PB_DS_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname[0]) |
||||
|
#define PB_DS_PTR_PB_HTYPE_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)[0]) |
||||
|
#define PB_DS_PTR_PB_HTYPE_REPEATED(structname, fieldname) pb_membersize(structname, fieldname[0]) |
||||
|
#define PB_DS_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname[0][0]) |
||||
|
#define PB_DS_CB_PB_HTYPE_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname) |
||||
|
#define PB_DS_CB_PB_HTYPE_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname) |
||||
|
#define PB_DS_CB_PB_HTYPE_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname) |
||||
|
#define PB_DS_CB_PB_HTYPE_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)) |
||||
|
#define PB_DS_CB_PB_HTYPE_REPEATED(structname, fieldname) pb_membersize(structname, fieldname) |
||||
|
#define PB_DS_CB_PB_HTYPE_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname) |
||||
|
|
||||
|
#define PB_ONEOF_NAME(type, tuple) PB_EXPAND(PB_ONEOF_NAME_ ## type tuple) |
||||
|
#define PB_ONEOF_NAME_UNION(unionname,membername,fullname) unionname |
||||
|
#define PB_ONEOF_NAME_MEMBER(unionname,membername,fullname) membername |
||||
|
#define PB_ONEOF_NAME_FULL(unionname,membername,fullname) fullname |
||||
|
|
||||
|
#define PB_GEN_SUBMSG_INFO(structname, atype, htype, ltype, fieldname, tag) \ |
||||
|
PB_SUBMSG_INFO_ ## htype(_PB_LTYPE_ ## ltype, structname, fieldname) |
||||
|
|
||||
|
#define PB_SUBMSG_INFO_REQUIRED(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) |
||||
|
#define PB_SUBMSG_INFO_SINGULAR(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) |
||||
|
#define PB_SUBMSG_INFO_OPTIONAL(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) |
||||
|
#define PB_SUBMSG_INFO_ONEOF(ltype, structname, fieldname) PB_SUBMSG_INFO_ONEOF2(ltype, structname, PB_ONEOF_NAME(UNION, fieldname), PB_ONEOF_NAME(MEMBER, fieldname)) |
||||
|
#define PB_SUBMSG_INFO_ONEOF2(ltype, structname, unionname, membername) PB_SUBMSG_INFO_ONEOF3(ltype, structname, unionname, membername) |
||||
|
#define PB_SUBMSG_INFO_ONEOF3(ltype, structname, unionname, membername) PB_SI ## ltype(structname ## _ ## unionname ## _ ## membername ## _MSGTYPE) |
||||
|
#define PB_SUBMSG_INFO_REPEATED(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) |
||||
|
#define PB_SUBMSG_INFO_FIXARRAY(ltype, structname, fieldname) PB_SI ## ltype(structname ## _ ## fieldname ## _MSGTYPE) |
||||
|
#define PB_SI_PB_LTYPE_BOOL(t) |
||||
|
#define PB_SI_PB_LTYPE_BYTES(t) |
||||
|
#define PB_SI_PB_LTYPE_DOUBLE(t) |
||||
|
#define PB_SI_PB_LTYPE_ENUM(t) |
||||
|
#define PB_SI_PB_LTYPE_UENUM(t) |
||||
|
#define PB_SI_PB_LTYPE_FIXED32(t) |
||||
|
#define PB_SI_PB_LTYPE_FIXED64(t) |
||||
|
#define PB_SI_PB_LTYPE_FLOAT(t) |
||||
|
#define PB_SI_PB_LTYPE_INT32(t) |
||||
|
#define PB_SI_PB_LTYPE_INT64(t) |
||||
|
#define PB_SI_PB_LTYPE_MESSAGE(t) PB_SUBMSG_DESCRIPTOR(t) |
||||
|
#define PB_SI_PB_LTYPE_MSG_W_CB(t) PB_SUBMSG_DESCRIPTOR(t) |
||||
|
#define PB_SI_PB_LTYPE_SFIXED32(t) |
||||
|
#define PB_SI_PB_LTYPE_SFIXED64(t) |
||||
|
#define PB_SI_PB_LTYPE_SINT32(t) |
||||
|
#define PB_SI_PB_LTYPE_SINT64(t) |
||||
|
#define PB_SI_PB_LTYPE_STRING(t) |
||||
|
#define PB_SI_PB_LTYPE_UINT32(t) |
||||
|
#define PB_SI_PB_LTYPE_UINT64(t) |
||||
|
#define PB_SI_PB_LTYPE_EXTENSION(t) |
||||
|
#define PB_SI_PB_LTYPE_FIXED_LENGTH_BYTES(t) |
||||
|
#define PB_SUBMSG_DESCRIPTOR(t) &(t ## _msg), |
||||
|
|
||||
|
/* The field descriptors use a variable width format, with width of either
|
||||
|
* 1, 2, 4 or 8 of 32-bit words. The two lowest bytes of the first byte always |
||||
|
* encode the descriptor size, 6 lowest bits of field tag number, and 8 bits |
||||
|
* of the field type. |
||||
|
* |
||||
|
* Descriptor size is encoded as 0 = 1 word, 1 = 2 words, 2 = 4 words, 3 = 8 words. |
||||
|
* |
||||
|
* Formats, listed starting with the least significant bit of the first word. |
||||
|
* 1 word: [2-bit len] [6-bit tag] [8-bit type] [8-bit data_offset] [4-bit size_offset] [4-bit data_size] |
||||
|
* |
||||
|
* 2 words: [2-bit len] [6-bit tag] [8-bit type] [12-bit array_size] [4-bit size_offset] |
||||
|
* [16-bit data_offset] [12-bit data_size] [4-bit tag>>6] |
||||
|
* |
||||
|
* 4 words: [2-bit len] [6-bit tag] [8-bit type] [16-bit array_size] |
||||
|
* [8-bit size_offset] [24-bit tag>>6] |
||||
|
* [32-bit data_offset] |
||||
|
* [32-bit data_size] |
||||
|
* |
||||
|
* 8 words: [2-bit len] [6-bit tag] [8-bit type] [16-bit reserved] |
||||
|
* [8-bit size_offset] [24-bit tag>>6] |
||||
|
* [32-bit data_offset] |
||||
|
* [32-bit data_size] |
||||
|
* [32-bit array_size] |
||||
|
* [32-bit reserved] |
||||
|
* [32-bit reserved] |
||||
|
* [32-bit reserved] |
||||
|
*/ |
||||
|
|
||||
|
#define PB_FIELDINFO_1(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
(0 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(data_offset) & 0xFF) << 16) | \ |
||||
|
(((uint32_t)(size_offset) & 0x0F) << 24) | (((uint32_t)(data_size) & 0x0F) << 28)), |
||||
|
|
||||
|
#define PB_FIELDINFO_2(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
(1 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(array_size) & 0xFFF) << 16) | (((uint32_t)(size_offset) & 0x0F) << 28)), \ |
||||
|
(((uint32_t)(data_offset) & 0xFFFF) | (((uint32_t)(data_size) & 0xFFF) << 16) | (((uint32_t)(tag) & 0x3c0) << 22)), |
||||
|
|
||||
|
#define PB_FIELDINFO_4(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
(2 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(array_size) & 0xFFFF) << 16)), \ |
||||
|
((uint32_t)(int_least8_t)(size_offset) | (((uint32_t)(tag) << 2) & 0xFFFFFF00)), \ |
||||
|
(data_offset), (data_size), |
||||
|
|
||||
|
#define PB_FIELDINFO_8(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
(3 | (((tag) << 2) & 0xFF) | ((type) << 8)), \ |
||||
|
((uint32_t)(int_least8_t)(size_offset) | (((uint32_t)(tag) << 2) & 0xFFFFFF00)), \ |
||||
|
(data_offset), (data_size), (array_size), 0, 0, 0, |
||||
|
|
||||
|
/* These assertions verify that the field information fits in the allocated space.
|
||||
|
* The generator tries to automatically determine the correct width that can fit all |
||||
|
* data associated with a message. These asserts will fail only if there has been a |
||||
|
* problem in the automatic logic - this may be worth reporting as a bug. As a workaround, |
||||
|
* you can increase the descriptor width by defining PB_FIELDINFO_WIDTH or by setting |
||||
|
* descriptorsize option in .options file. |
||||
|
*/ |
||||
|
#define PB_FITS(value,bits) ((uint32_t)(value) < ((uint32_t)1<<bits)) |
||||
|
#define PB_FIELDINFO_ASSERT_1(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_STATIC_ASSERT(PB_FITS(tag,6) && PB_FITS(data_offset,8) && PB_FITS(size_offset,4) && PB_FITS(data_size,4) && PB_FITS(array_size,1), FIELDINFO_DOES_NOT_FIT_width1_field ## tag) |
||||
|
|
||||
|
#define PB_FIELDINFO_ASSERT_2(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_STATIC_ASSERT(PB_FITS(tag,10) && PB_FITS(data_offset,16) && PB_FITS(size_offset,4) && PB_FITS(data_size,12) && PB_FITS(array_size,12), FIELDINFO_DOES_NOT_FIT_width2_field ## tag) |
||||
|
|
||||
|
#ifndef PB_FIELD_32BIT |
||||
|
/* Maximum field sizes are still 16-bit if pb_size_t is 16-bit */ |
||||
|
#define PB_FIELDINFO_ASSERT_4(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_STATIC_ASSERT(PB_FITS(tag,16) && PB_FITS(data_offset,16) && PB_FITS((int_least8_t)size_offset,8) && PB_FITS(data_size,16) && PB_FITS(array_size,16), FIELDINFO_DOES_NOT_FIT_width4_field ## tag) |
||||
|
|
||||
|
#define PB_FIELDINFO_ASSERT_8(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_STATIC_ASSERT(PB_FITS(tag,16) && PB_FITS(data_offset,16) && PB_FITS((int_least8_t)size_offset,8) && PB_FITS(data_size,16) && PB_FITS(array_size,16), FIELDINFO_DOES_NOT_FIT_width8_field ## tag) |
||||
|
#else |
||||
|
/* Up to 32-bit fields supported.
|
||||
|
* Note that the checks are against 31 bits to avoid compiler warnings about shift wider than type in the test. |
||||
|
* I expect that there is no reasonable use for >2GB messages with nanopb anyway. |
||||
|
*/ |
||||
|
#define PB_FIELDINFO_ASSERT_4(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_STATIC_ASSERT(PB_FITS(tag,30) && PB_FITS(data_offset,31) && PB_FITS(size_offset,8) && PB_FITS(data_size,31) && PB_FITS(array_size,16), FIELDINFO_DOES_NOT_FIT_width4_field ## tag) |
||||
|
|
||||
|
#define PB_FIELDINFO_ASSERT_8(tag, type, data_offset, data_size, size_offset, array_size) \ |
||||
|
PB_STATIC_ASSERT(PB_FITS(tag,30) && PB_FITS(data_offset,31) && PB_FITS(size_offset,8) && PB_FITS(data_size,31) && PB_FITS(array_size,31), FIELDINFO_DOES_NOT_FIT_width8_field ## tag) |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/* Automatic picking of FIELDINFO width:
|
||||
|
* Uses width 1 when possible, otherwise resorts to width 2. |
||||
|
* This is used when PB_BIND() is called with "AUTO" as the argument. |
||||
|
* The generator will give explicit size argument when it knows that a message |
||||
|
* structure grows beyond 1-word format limits. |
||||
|
*/ |
||||
|
#define PB_FIELDINFO_WIDTH_AUTO(atype, htype, ltype) PB_FI_WIDTH ## atype(htype, ltype) |
||||
|
#define PB_FI_WIDTH_PB_ATYPE_STATIC(htype, ltype) PB_FI_WIDTH ## htype(ltype) |
||||
|
#define PB_FI_WIDTH_PB_ATYPE_POINTER(htype, ltype) PB_FI_WIDTH ## htype(ltype) |
||||
|
#define PB_FI_WIDTH_PB_ATYPE_CALLBACK(htype, ltype) 2 |
||||
|
#define PB_FI_WIDTH_PB_HTYPE_REQUIRED(ltype) PB_FI_WIDTH ## ltype |
||||
|
#define PB_FI_WIDTH_PB_HTYPE_SINGULAR(ltype) PB_FI_WIDTH ## ltype |
||||
|
#define PB_FI_WIDTH_PB_HTYPE_OPTIONAL(ltype) PB_FI_WIDTH ## ltype |
||||
|
#define PB_FI_WIDTH_PB_HTYPE_ONEOF(ltype) PB_FI_WIDTH ## ltype |
||||
|
#define PB_FI_WIDTH_PB_HTYPE_REPEATED(ltype) 2 |
||||
|
#define PB_FI_WIDTH_PB_HTYPE_FIXARRAY(ltype) 2 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_BOOL 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_BYTES 2 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_DOUBLE 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_ENUM 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_UENUM 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_FIXED32 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_FIXED64 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_FLOAT 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_INT32 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_INT64 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_MESSAGE 2 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_MSG_W_CB 2 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_SFIXED32 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_SFIXED64 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_SINT32 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_SINT64 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_STRING 2 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_UINT32 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_UINT64 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_EXTENSION 1 |
||||
|
#define PB_FI_WIDTH_PB_LTYPE_FIXED_LENGTH_BYTES 2 |
||||
|
|
||||
|
/* The mapping from protobuf types to LTYPEs is done using these macros. */ |
||||
|
#define PB_LTYPE_MAP_BOOL PB_LTYPE_BOOL |
||||
|
#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES |
||||
|
#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64 |
||||
|
#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT |
||||
|
#define PB_LTYPE_MAP_UENUM PB_LTYPE_UVARINT |
||||
|
#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32 |
||||
|
#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64 |
||||
|
#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32 |
||||
|
#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT |
||||
|
#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT |
||||
|
#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE |
||||
|
#define PB_LTYPE_MAP_MSG_W_CB PB_LTYPE_SUBMSG_W_CB |
||||
|
#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32 |
||||
|
#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64 |
||||
|
#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT |
||||
|
#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT |
||||
|
#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING |
||||
|
#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT |
||||
|
#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT |
||||
|
#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION |
||||
|
#define PB_LTYPE_MAP_FIXED_LENGTH_BYTES PB_LTYPE_FIXED_LENGTH_BYTES |
||||
|
|
||||
|
/* These macros are used for giving out error messages.
|
||||
|
* They are mostly a debugging aid; the main error information |
||||
|
* is the true/false return value from functions. |
||||
|
* Some code space can be saved by disabling the error |
||||
|
* messages if not used. |
||||
|
* |
||||
|
* PB_SET_ERROR() sets the error message if none has been set yet. |
||||
|
* msg must be a constant string literal. |
||||
|
* PB_GET_ERROR() always returns a pointer to a string. |
||||
|
* PB_RETURN_ERROR() sets the error and returns false from current |
||||
|
* function. |
||||
|
*/ |
||||
|
#ifdef PB_NO_ERRMSG |
||||
|
#define PB_SET_ERROR(stream, msg) PB_UNUSED(stream) |
||||
|
#define PB_GET_ERROR(stream) "(errmsg disabled)" |
||||
|
#else |
||||
|
#define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg)) |
||||
|
#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)") |
||||
|
#endif |
||||
|
|
||||
|
#define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
} /* extern "C" */ |
||||
|
#endif |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
#if __cplusplus >= 201103L |
||||
|
#define PB_CONSTEXPR constexpr |
||||
|
#else // __cplusplus >= 201103L
|
||||
|
#define PB_CONSTEXPR |
||||
|
#endif // __cplusplus >= 201103L
|
||||
|
|
||||
|
#if __cplusplus >= 201703L |
||||
|
#define PB_INLINE_CONSTEXPR inline constexpr |
||||
|
#else // __cplusplus >= 201703L
|
||||
|
#define PB_INLINE_CONSTEXPR PB_CONSTEXPR |
||||
|
#endif // __cplusplus >= 201703L
|
||||
|
|
||||
|
extern "C++" |
||||
|
{ |
||||
|
namespace nanopb { |
||||
|
// Each type will be partially specialized by the generator.
|
||||
|
template <typename GenMessageT> struct MessageDescriptor; |
||||
|
} // namespace nanopb
|
||||
|
} |
||||
|
#endif /* __cplusplus */ |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,49 @@ |
|||||
|
/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c.
|
||||
|
* These functions are rarely needed by applications directly. |
||||
|
*/ |
||||
|
|
||||
|
#ifndef PB_COMMON_H_INCLUDED |
||||
|
#define PB_COMMON_H_INCLUDED |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/pb.h" |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
extern "C" { |
||||
|
#endif |
||||
|
|
||||
|
/* Initialize the field iterator structure to beginning.
|
||||
|
* Returns false if the message type is empty. */ |
||||
|
bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_msgdesc_t *desc, void *message); |
||||
|
|
||||
|
/* Get a field iterator for extension field. */ |
||||
|
bool pb_field_iter_begin_extension(pb_field_iter_t *iter, pb_extension_t *extension); |
||||
|
|
||||
|
/* Same as pb_field_iter_begin(), but for const message pointer.
|
||||
|
* Note that the pointers in pb_field_iter_t will be non-const but shouldn't |
||||
|
* be written to when using these functions. */ |
||||
|
bool pb_field_iter_begin_const(pb_field_iter_t *iter, const pb_msgdesc_t *desc, const void *message); |
||||
|
bool pb_field_iter_begin_extension_const(pb_field_iter_t *iter, const pb_extension_t *extension); |
||||
|
|
||||
|
/* Advance the iterator to the next field.
|
||||
|
* Returns false when the iterator wraps back to the first field. */ |
||||
|
bool pb_field_iter_next(pb_field_iter_t *iter); |
||||
|
|
||||
|
/* Advance the iterator until it points at a field with the given tag.
|
||||
|
* Returns false if no such field exists. */ |
||||
|
bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag); |
||||
|
|
||||
|
/* Find a field with type PB_LTYPE_EXTENSION, or return false if not found.
|
||||
|
* There can be only one extension range field per message. */ |
||||
|
bool pb_field_iter_find_extension(pb_field_iter_t *iter); |
||||
|
|
||||
|
#ifdef PB_VALIDATE_UTF8 |
||||
|
/* Validate UTF-8 text string */ |
||||
|
bool pb_validate_utf8(const char *s); |
||||
|
#endif |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
} /* extern "C" */ |
||||
|
#endif |
||||
|
|
||||
|
#endif |
||||
|
|
||||
@ -0,0 +1,193 @@ |
|||||
|
/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c.
|
||||
|
* The main function is pb_decode. You also need an input stream, and the |
||||
|
* field descriptions created by nanopb_generator.py. |
||||
|
*/ |
||||
|
|
||||
|
#ifndef PB_DECODE_H_INCLUDED |
||||
|
#define PB_DECODE_H_INCLUDED |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/pb.h" |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
extern "C" { |
||||
|
#endif |
||||
|
|
||||
|
/* Structure for defining custom input streams. You will need to provide
|
||||
|
* a callback function to read the bytes from your storage, which can be |
||||
|
* for example a file or a network socket. |
||||
|
* |
||||
|
* The callback must conform to these rules: |
||||
|
* |
||||
|
* 1) Return false on IO errors. This will cause decoding to abort. |
||||
|
* 2) You can use state to store your own data (e.g. buffer pointer), |
||||
|
* and rely on pb_read to verify that no-body reads past bytes_left. |
||||
|
* 3) Your callback may be used with substreams, in which case bytes_left |
||||
|
* is different than from the main stream. Don't use bytes_left to compute |
||||
|
* any pointers. |
||||
|
*/ |
||||
|
struct pb_istream_s |
||||
|
{ |
||||
|
#ifdef PB_BUFFER_ONLY |
||||
|
/* Callback pointer is not used in buffer-only configuration.
|
||||
|
* Having an int pointer here allows binary compatibility but |
||||
|
* gives an error if someone tries to assign callback function. |
||||
|
*/ |
||||
|
int *callback; |
||||
|
#else |
||||
|
bool (*callback)(pb_istream_t *stream, pb_byte_t *buf, size_t count); |
||||
|
#endif |
||||
|
|
||||
|
void *state; /* Free field for use by callback implementation */ |
||||
|
size_t bytes_left; |
||||
|
|
||||
|
#ifndef PB_NO_ERRMSG |
||||
|
const char *errmsg; |
||||
|
#endif |
||||
|
}; |
||||
|
|
||||
|
#ifndef PB_NO_ERRMSG |
||||
|
#define PB_ISTREAM_EMPTY {0,0,0,0} |
||||
|
#else |
||||
|
#define PB_ISTREAM_EMPTY {0,0,0} |
||||
|
#endif |
||||
|
|
||||
|
/***************************
|
||||
|
* Main decoding functions * |
||||
|
***************************/ |
||||
|
|
||||
|
/* Decode a single protocol buffers message from input stream into a C structure.
|
||||
|
* Returns true on success, false on any failure. |
||||
|
* The actual struct pointed to by dest must match the description in fields. |
||||
|
* Callback fields of the destination structure must be initialized by caller. |
||||
|
* All other fields will be initialized by this function. |
||||
|
* |
||||
|
* Example usage: |
||||
|
* MyMessage msg = {}; |
||||
|
* uint8_t buffer[64]; |
||||
|
* pb_istream_t stream; |
||||
|
* |
||||
|
* // ... read some data into buffer ...
|
||||
|
* |
||||
|
* stream = pb_istream_from_buffer(buffer, count); |
||||
|
* pb_decode(&stream, MyMessage_fields, &msg); |
||||
|
*/ |
||||
|
bool pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct); |
||||
|
|
||||
|
/* Extended version of pb_decode, with several options to control
|
||||
|
* the decoding process: |
||||
|
* |
||||
|
* PB_DECODE_NOINIT: Do not initialize the fields to default values. |
||||
|
* This is slightly faster if you do not need the default |
||||
|
* values and instead initialize the structure to 0 using |
||||
|
* e.g. memset(). This can also be used for merging two |
||||
|
* messages, i.e. combine already existing data with new |
||||
|
* values. |
||||
|
* |
||||
|
* PB_DECODE_DELIMITED: Input message starts with the message size as varint. |
||||
|
* Corresponds to parseDelimitedFrom() in Google's |
||||
|
* protobuf API. |
||||
|
* |
||||
|
* PB_DECODE_NULLTERMINATED: Stop reading when field tag is read as 0. This allows |
||||
|
* reading null terminated messages. |
||||
|
* NOTE: Until nanopb-0.4.0, pb_decode() also allows |
||||
|
* null-termination. This behaviour is not supported in |
||||
|
* most other protobuf implementations, so PB_DECODE_DELIMITED |
||||
|
* is a better option for compatibility. |
||||
|
* |
||||
|
* Multiple flags can be combined with bitwise or (| operator) |
||||
|
*/ |
||||
|
#define PB_DECODE_NOINIT 0x01U |
||||
|
#define PB_DECODE_DELIMITED 0x02U |
||||
|
#define PB_DECODE_NULLTERMINATED 0x04U |
||||
|
bool pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags); |
||||
|
|
||||
|
/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ |
||||
|
#define pb_decode_noinit(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_NOINIT) |
||||
|
#define pb_decode_delimited(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_DELIMITED) |
||||
|
#define pb_decode_delimited_noinit(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_DELIMITED | PB_DECODE_NOINIT) |
||||
|
#define pb_decode_nullterminated(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_NULLTERMINATED) |
||||
|
|
||||
|
/* Release any allocated pointer fields. If you use dynamic allocation, you should
|
||||
|
* call this for any successfully decoded message when you are done with it. If |
||||
|
* pb_decode() returns with an error, the message is already released. |
||||
|
*/ |
||||
|
void pb_release(const pb_msgdesc_t *fields, void *dest_struct); |
||||
|
|
||||
|
/**************************************
|
||||
|
* Functions for manipulating streams * |
||||
|
**************************************/ |
||||
|
|
||||
|
/* Create an input stream for reading from a memory buffer.
|
||||
|
* |
||||
|
* msglen should be the actual length of the message, not the full size of |
||||
|
* allocated buffer. |
||||
|
* |
||||
|
* Alternatively, you can use a custom stream that reads directly from e.g. |
||||
|
* a file or a network socket. |
||||
|
*/ |
||||
|
pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t msglen); |
||||
|
|
||||
|
/* Function to read from a pb_istream_t. You can use this if you need to
|
||||
|
* read some custom header data, or to read data in field callbacks. |
||||
|
*/ |
||||
|
bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count); |
||||
|
|
||||
|
|
||||
|
/************************************************
|
||||
|
* Helper functions for writing field callbacks * |
||||
|
************************************************/ |
||||
|
|
||||
|
/* Decode the tag for the next field in the stream. Gives the wire type and
|
||||
|
* field tag. At end of the message, returns false and sets eof to true. */ |
||||
|
bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof); |
||||
|
|
||||
|
/* Skip the field payload data, given the wire type. */ |
||||
|
bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type); |
||||
|
|
||||
|
/* Decode an integer in the varint format. This works for enum, int32,
|
||||
|
* int64, uint32 and uint64 field types. */ |
||||
|
#ifndef PB_WITHOUT_64BIT |
||||
|
bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest); |
||||
|
#else |
||||
|
#define pb_decode_varint pb_decode_varint32 |
||||
|
#endif |
||||
|
|
||||
|
/* Decode an integer in the varint format. This works for enum, int32,
|
||||
|
* and uint32 field types. */ |
||||
|
bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest); |
||||
|
|
||||
|
/* Decode a bool value in varint format. */ |
||||
|
bool pb_decode_bool(pb_istream_t *stream, bool *dest); |
||||
|
|
||||
|
/* Decode an integer in the zig-zagged svarint format. This works for sint32
|
||||
|
* and sint64. */ |
||||
|
#ifndef PB_WITHOUT_64BIT |
||||
|
bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest); |
||||
|
#else |
||||
|
bool pb_decode_svarint(pb_istream_t *stream, int32_t *dest); |
||||
|
#endif |
||||
|
|
||||
|
/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to
|
||||
|
* a 4-byte wide C variable. */ |
||||
|
bool pb_decode_fixed32(pb_istream_t *stream, void *dest); |
||||
|
|
||||
|
#ifndef PB_WITHOUT_64BIT |
||||
|
/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to
|
||||
|
* a 8-byte wide C variable. */ |
||||
|
bool pb_decode_fixed64(pb_istream_t *stream, void *dest); |
||||
|
#endif |
||||
|
|
||||
|
#ifdef PB_CONVERT_DOUBLE_FLOAT |
||||
|
/* Decode a double value into float variable. */ |
||||
|
bool pb_decode_double_as_float(pb_istream_t *stream, float *dest); |
||||
|
#endif |
||||
|
|
||||
|
/* Make a limited-length substream for reading a PB_WT_STRING field. */ |
||||
|
bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream); |
||||
|
bool pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream); |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
} /* extern "C" */ |
||||
|
#endif |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,185 @@ |
|||||
|
/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c.
|
||||
|
* The main function is pb_encode. You also need an output stream, and the |
||||
|
* field descriptions created by nanopb_generator.py. |
||||
|
*/ |
||||
|
|
||||
|
#ifndef PB_ENCODE_H_INCLUDED |
||||
|
#define PB_ENCODE_H_INCLUDED |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/pb.h" |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
extern "C" { |
||||
|
#endif |
||||
|
|
||||
|
/* Structure for defining custom output streams. You will need to provide
|
||||
|
* a callback function to write the bytes to your storage, which can be |
||||
|
* for example a file or a network socket. |
||||
|
* |
||||
|
* The callback must conform to these rules: |
||||
|
* |
||||
|
* 1) Return false on IO errors. This will cause encoding to abort. |
||||
|
* 2) You can use state to store your own data (e.g. buffer pointer). |
||||
|
* 3) pb_write will update bytes_written after your callback runs. |
||||
|
* 4) Substreams will modify max_size and bytes_written. Don't use them |
||||
|
* to calculate any pointers. |
||||
|
*/ |
||||
|
struct pb_ostream_s |
||||
|
{ |
||||
|
#ifdef PB_BUFFER_ONLY |
||||
|
/* Callback pointer is not used in buffer-only configuration.
|
||||
|
* Having an int pointer here allows binary compatibility but |
||||
|
* gives an error if someone tries to assign callback function. |
||||
|
* Also, NULL pointer marks a 'sizing stream' that does not |
||||
|
* write anything. |
||||
|
*/ |
||||
|
const int *callback; |
||||
|
#else |
||||
|
bool (*callback)(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); |
||||
|
#endif |
||||
|
void *state; /* Free field for use by callback implementation. */ |
||||
|
size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */ |
||||
|
size_t bytes_written; /* Number of bytes written so far. */ |
||||
|
|
||||
|
#ifndef PB_NO_ERRMSG |
||||
|
const char *errmsg; |
||||
|
#endif |
||||
|
}; |
||||
|
|
||||
|
/***************************
|
||||
|
* Main encoding functions * |
||||
|
***************************/ |
||||
|
|
||||
|
/* Encode a single protocol buffers message from C structure into a stream.
|
||||
|
* Returns true on success, false on any failure. |
||||
|
* The actual struct pointed to by src_struct must match the description in fields. |
||||
|
* All required fields in the struct are assumed to have been filled in. |
||||
|
* |
||||
|
* Example usage: |
||||
|
* MyMessage msg = {}; |
||||
|
* uint8_t buffer[64]; |
||||
|
* pb_ostream_t stream; |
||||
|
* |
||||
|
* msg.field1 = 42; |
||||
|
* stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); |
||||
|
* pb_encode(&stream, MyMessage_fields, &msg); |
||||
|
*/ |
||||
|
bool pb_encode(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct); |
||||
|
|
||||
|
/* Extended version of pb_encode, with several options to control the
|
||||
|
* encoding process: |
||||
|
* |
||||
|
* PB_ENCODE_DELIMITED: Prepend the length of message as a varint. |
||||
|
* Corresponds to writeDelimitedTo() in Google's |
||||
|
* protobuf API. |
||||
|
* |
||||
|
* PB_ENCODE_NULLTERMINATED: Append a null byte to the message for termination. |
||||
|
* NOTE: This behaviour is not supported in most other |
||||
|
* protobuf implementations, so PB_ENCODE_DELIMITED |
||||
|
* is a better option for compatibility. |
||||
|
*/ |
||||
|
#define PB_ENCODE_DELIMITED 0x02U |
||||
|
#define PB_ENCODE_NULLTERMINATED 0x04U |
||||
|
bool pb_encode_ex(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct, unsigned int flags); |
||||
|
|
||||
|
/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ |
||||
|
#define pb_encode_delimited(s,f,d) pb_encode_ex(s,f,d, PB_ENCODE_DELIMITED) |
||||
|
#define pb_encode_nullterminated(s,f,d) pb_encode_ex(s,f,d, PB_ENCODE_NULLTERMINATED) |
||||
|
|
||||
|
/* Encode the message to get the size of the encoded data, but do not store
|
||||
|
* the data. */ |
||||
|
bool pb_get_encoded_size(size_t *size, const pb_msgdesc_t *fields, const void *src_struct); |
||||
|
|
||||
|
/**************************************
|
||||
|
* Functions for manipulating streams * |
||||
|
**************************************/ |
||||
|
|
||||
|
/* Create an output stream for writing into a memory buffer.
|
||||
|
* The number of bytes written can be found in stream.bytes_written after |
||||
|
* encoding the message. |
||||
|
* |
||||
|
* Alternatively, you can use a custom stream that writes directly to e.g. |
||||
|
* a file or a network socket. |
||||
|
*/ |
||||
|
pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize); |
||||
|
|
||||
|
/* Pseudo-stream for measuring the size of a message without actually storing
|
||||
|
* the encoded data. |
||||
|
* |
||||
|
* Example usage: |
||||
|
* MyMessage msg = {}; |
||||
|
* pb_ostream_t stream = PB_OSTREAM_SIZING; |
||||
|
* pb_encode(&stream, MyMessage_fields, &msg); |
||||
|
* printf("Message size is %d\n", stream.bytes_written); |
||||
|
*/ |
||||
|
#ifndef PB_NO_ERRMSG |
||||
|
#define PB_OSTREAM_SIZING {0,0,0,0,0} |
||||
|
#else |
||||
|
#define PB_OSTREAM_SIZING {0,0,0,0} |
||||
|
#endif |
||||
|
|
||||
|
/* Function to write into a pb_ostream_t stream. You can use this if you need
|
||||
|
* to append or prepend some custom headers to the message. |
||||
|
*/ |
||||
|
bool pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); |
||||
|
|
||||
|
|
||||
|
/************************************************
|
||||
|
* Helper functions for writing field callbacks * |
||||
|
************************************************/ |
||||
|
|
||||
|
/* Encode field header based on type and field number defined in the field
|
||||
|
* structure. Call this from the callback before writing out field contents. */ |
||||
|
bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_iter_t *field); |
||||
|
|
||||
|
/* Encode field header by manually specifying wire type. You need to use this
|
||||
|
* if you want to write out packed arrays from a callback field. */ |
||||
|
bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number); |
||||
|
|
||||
|
/* Encode an integer in the varint format.
|
||||
|
* This works for bool, enum, int32, int64, uint32 and uint64 field types. */ |
||||
|
#ifndef PB_WITHOUT_64BIT |
||||
|
bool pb_encode_varint(pb_ostream_t *stream, uint64_t value); |
||||
|
#else |
||||
|
bool pb_encode_varint(pb_ostream_t *stream, uint32_t value); |
||||
|
#endif |
||||
|
|
||||
|
/* Encode an integer in the zig-zagged svarint format.
|
||||
|
* This works for sint32 and sint64. */ |
||||
|
#ifndef PB_WITHOUT_64BIT |
||||
|
bool pb_encode_svarint(pb_ostream_t *stream, int64_t value); |
||||
|
#else |
||||
|
bool pb_encode_svarint(pb_ostream_t *stream, int32_t value); |
||||
|
#endif |
||||
|
|
||||
|
/* Encode a string or bytes type field. For strings, pass strlen(s) as size. */ |
||||
|
bool pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size); |
||||
|
|
||||
|
/* Encode a fixed32, sfixed32 or float value.
|
||||
|
* You need to pass a pointer to a 4-byte wide C variable. */ |
||||
|
bool pb_encode_fixed32(pb_ostream_t *stream, const void *value); |
||||
|
|
||||
|
#ifndef PB_WITHOUT_64BIT |
||||
|
/* Encode a fixed64, sfixed64 or double value.
|
||||
|
* You need to pass a pointer to a 8-byte wide C variable. */ |
||||
|
bool pb_encode_fixed64(pb_ostream_t *stream, const void *value); |
||||
|
#endif |
||||
|
|
||||
|
#ifdef PB_CONVERT_DOUBLE_FLOAT |
||||
|
/* Encode a float value so that it appears like a double in the encoded
|
||||
|
* message. */ |
||||
|
bool pb_encode_float_as_double(pb_ostream_t *stream, float value); |
||||
|
#endif |
||||
|
|
||||
|
/* Encode a submessage field.
|
||||
|
* You need to pass the pb_field_t array and pointer to struct, just like |
||||
|
* with pb_encode(). This internally encodes the submessage twice, first to |
||||
|
* calculate message size and then to actually write it out. |
||||
|
*/ |
||||
|
bool pb_encode_submessage(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct); |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
} /* extern "C" */ |
||||
|
#endif |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,16 @@ |
|||||
|
/*
|
||||
|
* msp_CMCU.h |
||||
|
* |
||||
|
* Created on: Aug 28, 2025 |
||||
|
* Author: 111 |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_CMCU_H_ |
||||
|
#define INC_MSP_MSP_CMCU_H_ |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
|
||||
|
extern int32_t* CMCUValue_in; |
||||
|
extern void CMCU_sensor_intialize(struct UARTHandler *Handler); |
||||
|
|
||||
|
#endif /* INC_MSP_MSP_CMCU_H_ */ |
||||
@ -0,0 +1,13 @@ |
|||||
|
/*
|
||||
|
* msp_Dynamometer_Sensor.h |
||||
|
* |
||||
|
* Created on: Oct 8, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_DYNAMOMETER_SENSOR_H_ |
||||
|
#define INC_MSP_MSP_DYNAMOMETER_SENSOR_H_ |
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
extern void Dynamometer_sensor_intialize(struct UARTHandler *Handler); |
||||
|
extern int32_t* DynamometerValue_in; |
||||
|
#endif /* INC_MSP_MSP_DYNAMOMETER_SENSOR_H_ */ |
||||
@ -0,0 +1,13 @@ |
|||||
|
/*
|
||||
|
* msp_Force_Sensor.h |
||||
|
* |
||||
|
* Created on: Oct 8, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_FORCE_SENSOR_H_ |
||||
|
#define INC_MSP_MSP_FORCE_SENSOR_H_ |
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
extern void force_sensor_intialize(struct UARTHandler *Handler); |
||||
|
extern int32_t* ForceValue_in; |
||||
|
#endif /* INC_MSP_MSP_FORCE_SENSOR_H_ */ |
||||
@ -0,0 +1,27 @@ |
|||||
|
/*
|
||||
|
* msp_PID.h |
||||
|
* |
||||
|
* Created on: 2024年1月22日 |
||||
|
* Author: Administrator |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_PID_H_ |
||||
|
#define INC_MSP_MSP_PID_H_ |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
|
||||
|
void GF_MSP_Auto_Motion_adj(double Current_Angle, double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1); |
||||
|
void GF_MSP_Auto_adj_Unicycle(double Current_Angle_11,double Desire_Angle_11, double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1); |
||||
|
void GF_MSP_Auto_Motion_adj_Com(double Current_Angle, double Horizontal_Compen_Angle ,double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1); |
||||
|
|
||||
|
void GF_MSP_PID_Now_Der_adj_Com(double Current_Angle,double Desire_Angle_Input, double Auto_Speed, double Auto_Speed_Max, double System_time ,double *W_Speed_1); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
int Angle_Tune_PID(float CurrentAngle, float TargetAngle, int Position_KP, |
||||
|
int Position_KI, int Position_KD, int MaxValue); |
||||
|
|
||||
|
#endif /* INC_MSP_MSP_PID_H_ */ |
||||
@ -0,0 +1,18 @@ |
|||||
|
/*
|
||||
|
* msp_PaintThickness.h |
||||
|
* |
||||
|
* Created on: Jul 29, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
#ifndef INC_MSP_MSP_PAINTTHICKNESS_H_ |
||||
|
#define INC_MSP_MSP_PAINTTHICKNESS_H_ |
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
|
||||
|
extern void Paint_Thickness_intialize(struct UARTHandler *Handler); |
||||
|
extern void GF_PT_Inquiry(); |
||||
|
extern void decode_PaintThickness(uint8_t *buffer, uint16_t length); |
||||
|
|
||||
|
|
||||
|
#endif /* INC_MSP_MSP_PAINTTHICKNESS_H_ */ |
||||
@ -0,0 +1,62 @@ |
|||||
|
/*
|
||||
|
* msp_TI5MOTOR.h |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_TI5MOTOR_H_ |
||||
|
#define INC_MSP_MSP_TI5MOTOR_H_ |
||||
|
|
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
#include "msp_Motor.pb.h" |
||||
|
#define DF_MSP_Ti5Motor_PositionMode 44 |
||||
|
#define DF_MSP_Ti5Motor_SpeedMode 43 |
||||
|
#define DF_MSP_Ti5Motor_CurrentMode 42 |
||||
|
#define DF_MSP_Ti5Motor_State_Read 41 |
||||
|
|
||||
|
|
||||
|
void DecodeTi5MotorCAN(uint32_t canID, uint8_t *buffer, uint32_t length); |
||||
|
|
||||
|
extern int32_t Function_code; |
||||
|
//电机的ID必须是连续的,第一个电机ID需要在此定义
|
||||
|
#define DF_MSP_Ti5Motor_StartID 0 |
||||
|
//#define DF_MSP_Ti5Motor_StartID 1
|
||||
|
//需要将此函数放置到对应的CAN接收中断函数中
|
||||
|
void GF_MSP_Ti5Motor_CANRx_Callback(); |
||||
|
|
||||
|
//需要每间隔2ms执行一次
|
||||
|
void GF_MSP_Ti5Motor_Control_Timer(); |
||||
|
|
||||
|
//void GF_Tis_Control_Single();
|
||||
|
void GF_MSP_Ti5Motor_Error_Clean(); |
||||
|
|
||||
|
|
||||
|
//uint8_t Motor_Control_Motor_Index;
|
||||
|
//uint8_t Motor_Control_State;
|
||||
|
//
|
||||
|
|
||||
|
void FiveByteCommand(int8_t MotorID, uint8_t command, int32_t content,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
void OneByteCommand(int8_t MotorID, uint8_t command,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
|
||||
|
void Motor_Stop(uint8_t id,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
void Motor_ClearFault(uint8_t id,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
void Motor_SetVelocityModeAndTargetVelocity(uint8_t id, int32_t targetSpeed,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
void MotorSpeedSetup(); |
||||
|
void Motor_GetFaultState(uint8_t id,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
void GetCSPByCommand(uint8_t id,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
//void Ti5_Motor_Controller_intialize(FDCANHandler *Handler);
|
||||
|
|
||||
|
void SetMaximumAllowablePositiveVelocity(uint8_t id, int32_t maxSpeed,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
|
||||
|
void SetMinimumAllowableNegativeVelocity(uint8_t id, int32_t minmaxSpeed,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
|
||||
|
void SetMaximumPositivePosition(uint8_t id, int32_t position,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
/// <summary>
|
||||
|
/// 获取最小负向位置 减速机角度为:(返回值/65536/减速比)*360<
|
||||
|
/// </summary>
|
||||
|
void SetCurrentModeAndTargetCurent(uint8_t id, int32_t targetCurrent,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
void SetMinimumNegativePosition(uint8_t id, int32_t position,FDCANHandler *Ti5_Motor_Controller,int WaitTime); |
||||
|
|
||||
|
#endif /* INC_MSP_MSP_TI5MOTOR_H_ */ |
||||
@ -0,0 +1,21 @@ |
|||||
|
/*
|
||||
|
* msp_TL720D.h |
||||
|
* |
||||
|
* Created on: Jul 19, 2024 |
||||
|
* Author: bihon |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_TL720D_H_ |
||||
|
#define INC_MSP_MSP_TL720D_H_ |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
#include "stdio.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_UART.h" |
||||
|
#include "usart.h" |
||||
|
#include "gpio.h" |
||||
|
extern void TL720D_intialize(struct UARTHandler *Handler); |
||||
|
extern MSP_TL720DParameters* SP_MSP_RF_TL720D_Parameters_In; |
||||
|
extern int32_t *RobotAngle;//机器人角度
|
||||
|
#endif /* INC_MSP_MSP_TL720D_H_ */ |
||||
@ -0,0 +1,85 @@ |
|||||
|
/*
|
||||
|
* msp_TTMotor_ZQ.h |
||||
|
* |
||||
|
* Created on: Oct 10, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_TTMOTOR_ZQ_H_ |
||||
|
#define INC_MSP_MSP_TTMOTOR_ZQ_H_ |
||||
|
#include "../../BASE/Inc/BSP/bsp_include.h" |
||||
|
#include "../../BASE/Inc/BSP/bsp_FDCAN.h" |
||||
|
#include "fsm.h" |
||||
|
|
||||
|
#define DF_MSP_TT_Motor_PositionMode 01 |
||||
|
#define DF_MSP_TT_Motor_SpeedMode 02 |
||||
|
#define DF_MSP_TT_Motor_CurrentMode 03 |
||||
|
#define DF_MSP_TT_Motor_Posi_Now 04 |
||||
|
|
||||
|
#define TT_One_Deg_Count 11014///32768*121/360(减速比121)=11014
|
||||
|
|
||||
|
#define TT_Left_limt 84080 //-775000+75*11014
|
||||
|
#define TT_Right_limt -1568020 //-775000-75*11014
|
||||
|
//#define Sw_Rust_Mid_Posi -775000 //-775000-75*11014
|
||||
|
|
||||
|
//double Sw_Rust_Mid_Posi=-775000;//需检测修改
|
||||
|
#define DF_MSP_TT_Motor_StartID 2 |
||||
|
|
||||
|
void SwingMotorSetCheckTargetPositon(); |
||||
|
|
||||
|
void TT_Analytic_Fun(int32_t ID_A_T_A, char *buffer); |
||||
|
|
||||
|
extern int SwingMotorID; |
||||
|
extern int LeftMotorID; |
||||
|
extern int RightMotorID; |
||||
|
|
||||
|
extern void ActivateMotor(int MotorID, FDCANHandler *ZQ_Motor_Controller, |
||||
|
int32_t WaitTime) ; |
||||
|
|
||||
|
extern void CANSendMessageSDO_ADD_To_SendList(int MotorID, uint8_t Function, |
||||
|
uint16_t ControlWord, uint8_t subWord, int32_t ControlWordValue, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime); |
||||
|
|
||||
|
//位置速度模式
|
||||
|
extern void Postion_Velcocity_Run_SetParameter(int MotorID, int TargetPosition, |
||||
|
int TargetSpeed, int AccTime, int DecTime, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime); |
||||
|
extern void Postion_Velcocity_Set_Position(int MotorID, int TargetPosition, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime) ; |
||||
|
|
||||
|
extern void Driver_ReadError(int MotorID, FDCANHandler *ZQ_Motor_Controller, |
||||
|
int32_t WaitTime); |
||||
|
extern void SetMotorTargetPosition(int MotorID, int32_t TargetPosition, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime) ; |
||||
|
|
||||
|
extern void Postion_Velcocity_Stop(int MotorID, FDCANHandler *ZQ_Motor_Controller, |
||||
|
int32_t WaitTime) ; |
||||
|
|
||||
|
extern void SetCurrentPositionZero(int MotorID, FDCANHandler *ZQ_Motor_Controller, |
||||
|
int32_t WaitTime) ; |
||||
|
|
||||
|
|
||||
|
extern void Swing_Motor_Set_Target_Position() ; |
||||
|
|
||||
|
extern void Swing_Motor_Read_ReachedEnd() ; |
||||
|
extern void Set_Current_Positon_Zero(uint8_t MotorID, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime) ; |
||||
|
|
||||
|
extern void TT_Request_Position(uint32_t Motor_ID_1, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime) ; |
||||
|
extern void TT_Request_Velocity(uint32_t Motor_ID_1, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime) ; |
||||
|
|
||||
|
extern void TT_Request_Fault(uint32_t Motor_ID_1, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime) ; |
||||
|
|
||||
|
extern void TT_Request_Current(uint32_t Motor_ID_1, |
||||
|
FDCANHandler *ZQ_Motor_Controller, int32_t WaitTime); |
||||
|
|
||||
|
extern void TT_Analytic_Fun(int32_t ID_A_T_A, char *buffer); |
||||
|
|
||||
|
extern void SpeedModeSetup(int MotorID,FDCANHandler *ZQ_Motor_Controller,int32_t WaitTime,int32_t Acc, int32_t Dec, int32_t TargetVelocity); //设定速度模式,并更改相关速度
|
||||
|
|
||||
|
extern void TT_Analytic_Fun(int32_t ID_A_T_A, char *buffer); |
||||
|
extern void TT_SpeedMode_Set_TargetSpeed(uint32_t MotorID,FDCANHandler *ZQ_Motor_Controller,int32_t WaitTime,int32_t TargetSpeed); |
||||
|
#endif /* INC_MSP_MSP_TTMOTOR_ZQ_H_ */ |
||||
@ -0,0 +1,16 @@ |
|||||
|
/*
|
||||
|
* msp_U7.h |
||||
|
* |
||||
|
* Created on: Oct 8, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_U7_H_ |
||||
|
#define INC_MSP_MSP_U7_H_ |
||||
|
#include "../../BASE/Inc/BSP/bsp_UART.h" |
||||
|
#include "msp_U7.pb.h" |
||||
|
void Sbus_Data_Count_U7(uint8_t *buf, int32_t *But_Value); |
||||
|
extern SP_MSP_U7_Button *P_U7; |
||||
|
//
|
||||
|
extern void U7_Sbus_UART_Handler_intialize(struct UARTHandler* Handler); |
||||
|
#endif /* INC_MSP_MSP_U7_H_ */ |
||||
@ -0,0 +1,14 @@ |
|||||
|
/*
|
||||
|
* msp_Ultrasonic_Sensor.h |
||||
|
* |
||||
|
* Created on: Oct 8, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#ifndef INC_MSP_MSP_ULTRASONIC_SENSOR_H_ |
||||
|
#define INC_MSP_MSP_ULTRASONIC_SENSOR_H_ |
||||
|
#include "../../BASE/Inc/BSP/bsp_MB_host.h" |
||||
|
extern void Ultrasonic_sensor_intialize(struct UARTHandler *Handler); |
||||
|
extern int32_t* ForceValue_1; |
||||
|
extern int32_t* ForceValue_2; |
||||
|
#endif /* INC_MSP_MSP_ULTRASONIC_SENSOR_H_ */ |
||||
@ -0,0 +1,67 @@ |
|||||
|
/*
|
||||
|
* BHBF_ROBOT.c |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
#include "fsm.h" |
||||
|
#include "BHBF_ROBOT.h" |
||||
|
#include <string.h> |
||||
|
|
||||
|
|
||||
|
#include "bsp_FDCAN.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
//7 motors
|
||||
|
MotorParameters *Motor[3]; |
||||
|
//Motor Error
|
||||
|
int32_t *Motor_ID_Errors[3] = |
||||
|
{ 0 }; |
||||
|
//ComError
|
||||
|
|
||||
|
int32_t* SystemErrorCode; |
||||
|
ErrorData* SystemErrorData; |
||||
|
TT_MotorParameters* TT_Motor[4]; |
||||
|
|
||||
|
//Declare a CV and initialize CV
|
||||
|
CV_struct_define CV = |
||||
|
{ 0 }; |
||||
|
//Declare a GV and initialize CV
|
||||
|
GV_struct_define GV = |
||||
|
{ 0 }; |
||||
|
//Declare a PV and initialize CV
|
||||
|
|
||||
|
//PV_struct_define PV ={ 0 };
|
||||
|
|
||||
|
|
||||
|
IV_struct_define IV ={ 0 }; |
||||
|
|
||||
|
void GF_MainLoop_Jump(int32_t Next_Index_U, int32_t Next_Index_N); |
||||
|
|
||||
|
|
||||
|
void SET_BIT_1(int32_t* num,int32_t k) |
||||
|
{ |
||||
|
*num=((*num) | (1 << (k))); |
||||
|
} |
||||
|
void SET_BIT_0(int32_t* num,int32_t k) |
||||
|
{ |
||||
|
*num=((*num) & ~(1 << (k))); |
||||
|
} |
||||
|
int32_t Get_BIT(int32_t* num,int32_t k) |
||||
|
{ |
||||
|
// return (*num >> (k -1)) & 1;
|
||||
|
return (*num >> (k)) & 1; |
||||
|
} |
||||
|
|
||||
|
//100ms执行一次
|
||||
|
void GF_WatchDog_Loop() |
||||
|
{ |
||||
|
//硬件看门狗复位
|
||||
|
//HAL_GPIO_TogglePin(RST_WDI_GPIO_Port, RST_WDI_Pin); //Hardware Watchdog,kicking the dog
|
||||
|
|
||||
|
//硬件看门狗复位
|
||||
|
|
||||
|
} |
||||
|
|
||||
@ -0,0 +1,636 @@ |
|||||
|
/**
|
||||
|
* @file DLTuc.c |
||||
|
* @author Teodor Rosolowski |
||||
|
* @date 1 Jul 2022 |
||||
|
* @brief This file is a part of DLTuc library |
||||
|
* |
||||
|
* In this source file you will find entire implementation of the DLTuc lib. |
||||
|
* |
||||
|
* Requirments: |
||||
|
* Around ~2kB of RAM |
||||
|
* Check Configuration file and defines: |
||||
|
* DLT_TRANSMIT_RING_BUFFER_SIZE, DLT_TRANSMIT_MAX_SINGLE_MESSAGE_SIZE |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
/*
|
||||
|
* ******************************************************************************************* |
||||
|
* Includes |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
#include "DLT/DLTuc.h" |
||||
|
|
||||
|
#include "stdio.h" |
||||
|
#include "stdint.h" |
||||
|
|
||||
|
#include "stdbool.h" |
||||
|
#include <stdarg.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
/*
|
||||
|
* ******************************************************************************************* |
||||
|
* Local defines |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
|
||||
|
/**!
|
||||
|
* \brief DLT_ACT_HEADER_SIZE - actual DLT header size |
||||
|
* \details Standard Header + Extended + TypeInfo |
||||
|
* Don't modify it if you aren't sure what are you doing!!! |
||||
|
*/ |
||||
|
#define DLT_ACT_HEADER_SIZE 32 |
||||
|
|
||||
|
/**!
|
||||
|
* \brief DLT_MINIMUM_LOG_DROP_PERIOD |
||||
|
* \details minimum period between two drop info log |
||||
|
*/ |
||||
|
#define DLT_MINIMUM_LOG_DROP_PERIOD 200 |
||||
|
|
||||
|
/*
|
||||
|
* ******************************************************************************************* |
||||
|
* Local types |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
|
||||
|
/* Prototypes to improve readability.. */ |
||||
|
/*typedefs for future use..*/ |
||||
|
// typedef
|
||||
|
// {
|
||||
|
// uint32_t HeaderStart;
|
||||
|
// BaseHeaderConfig_t BaseHeaderConfig;
|
||||
|
// uint8_t MessageCounter;
|
||||
|
// uint16_t MessageLength;
|
||||
|
// uint32_t EcuId;
|
||||
|
// uint32_t TimeStamp;
|
||||
|
// }DLT_BaseHeader_t;
|
||||
|
|
||||
|
// typedef
|
||||
|
// {
|
||||
|
// DLT_DebugLevel_t DebugLevel;
|
||||
|
// uint8_t NumberOfArguments;
|
||||
|
// uint32_t AppId;
|
||||
|
// uint32_t ContexID;
|
||||
|
// TypeInfo_t TypeInfo;
|
||||
|
// uint16_t Argument1;
|
||||
|
// }DLT_ExtendedHeader_t;
|
||||
|
|
||||
|
|
||||
|
//char DLT_LOG_ENABLE_LEVEL= 7;
|
||||
|
char DLT_LOG_ENABLE_LEVEL= 0; |
||||
|
/**!
|
||||
|
* \brief RB_Status |
||||
|
* \details --- |
||||
|
* */ |
||||
|
typedef enum |
||||
|
{ |
||||
|
RB_OK = 0, |
||||
|
RB_ERROR = 1 |
||||
|
} RB_Status; |
||||
|
|
||||
|
/**!
|
||||
|
* \brief DltRingBufferTransmit_t |
||||
|
* \details --- |
||||
|
* */ |
||||
|
typedef struct DltRingBufferTransmit_Tag |
||||
|
{ |
||||
|
uint16_t Head; // Pointer to write
|
||||
|
uint16_t Tail; // Pointer to read
|
||||
|
bool readyToTransmit[DLT_TRANSMIT_RING_BUFFER_SIZE]; |
||||
|
uint8_t dataSize[DLT_TRANSMIT_RING_BUFFER_SIZE]; // Array to keep message size
|
||||
|
} DltRingBufferTransmit_t; |
||||
|
|
||||
|
/**!
|
||||
|
* \brief BluRingBufferReceive_t |
||||
|
* \details --- |
||||
|
* */ |
||||
|
typedef struct BluRingBufferReceive_Tag |
||||
|
{ |
||||
|
|
||||
|
uint16_t Head; // Pointer to write
|
||||
|
uint16_t Tail; // Pointer to read
|
||||
|
uint8_t MessageSize[DLT_RECEIVE_RING_BUFFER_SIZE]; // Array to keep message size
|
||||
|
bool ReadyToRead[DLT_RECEIVE_RING_BUFFER_SIZE]; |
||||
|
} BluRingBufferReceive_t; |
||||
|
|
||||
|
/**
|
||||
|
* ******************************************************************************************* |
||||
|
* Static variables |
||||
|
* ******************************************************************************************* |
||||
|
* */ |
||||
|
|
||||
|
/**!
|
||||
|
* \brief ExtSerialTrDataFunctionCb |
||||
|
* \details --- |
||||
|
* */ |
||||
|
static void (*ExtSerialTrDataFunctionCb)(uint8_t *DltLogData, uint8_t Size); |
||||
|
|
||||
|
static void (*ExtSerialRecDataFunctionCb)(uint8_t *RecDataBuff, uint16_t Size); |
||||
|
|
||||
|
static void (*ExtInfoInjectionDataRcvdCb)(uint32_t AppId, uint32_t ConId,uint32_t ServId,uint8_t *Data, uint16_t Size); |
||||
|
|
||||
|
static uint32_t (*GetSystemTimeMs)(void); |
||||
|
|
||||
|
/**!
|
||||
|
* \brief LogDroppedFlag |
||||
|
* \details --- |
||||
|
* */ |
||||
|
static bool LogDroppedFlag =false; |
||||
|
|
||||
|
static uint32_t PrevLogDropSendTime = 0u; |
||||
|
|
||||
|
static uint8_t DltLogDroppedInfo[] = "LOG DROPPED!!!"; |
||||
|
|
||||
|
static uint8_t DltLogDroppedInfoBuffer[60] = {0}; /* TODO: Remove magic number..*/ |
||||
|
|
||||
|
static uint8_t DLtLogDroppedSize = 0; |
||||
|
|
||||
|
static uint8_t ActDltMessageCounter =0; |
||||
|
|
||||
|
static DltRingBufferTransmit_t DltTrsmtRingBuffer = {.readyToTransmit[0]=true}; |
||||
|
|
||||
|
static uint8_t DltTrsmtMessagesTab[DLT_TRANSMIT_RING_BUFFER_SIZE][DLT_TRANSMIT_MAX_SINGLE_MESSAGE_SIZE]; |
||||
|
|
||||
|
static BluRingBufferReceive_t BleMainReceiveRingBuffer; |
||||
|
|
||||
|
static uint8_t BluMainReceiveMessagesTab[DLT_RECEIVE_RING_BUFFER_SIZE][DLT_REC_SINGLE_MESSAGE_MAX_SIZE]; |
||||
|
|
||||
|
static volatile uint8_t TransmitReadyStateFlag = true; /*TmpFromDma for example*/ |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************* |
||||
|
* Prototypes of static functions |
||||
|
******************************************************************************************** |
||||
|
*/ |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief PrepareDltHeader |
||||
|
* \details A very lazy implementation of DLT Header - but it works fine |
||||
|
* Please refer to: https://www.autosar.org/fileadmin/user_upload/standards/foundation/1-0/AUTOSAR_PRS_DiagnosticLogAndTraceProtocol.pdf
|
||||
|
************************************************************************************************/ |
||||
|
static void PrepareDltHeader(uint8_t Level, uint32_t AppId, uint32_t ContextId, uint16_t size,uint8_t *headerAddrStart); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLT_RB_TransmitRead Function to read data from ring buffer |
||||
|
* \details -- |
||||
|
* \param RingBuffer_t *Buf - pointer to Ring Buffer structure |
||||
|
* \param out MessageSize - size of the "DltLogData" (return value) |
||||
|
* \param out MessagePointer - pointer to the message stored in RingBuffer (return value) |
||||
|
* \return RB_OK if something read succesfully, otherwise RB_ERROR |
||||
|
* */ |
||||
|
static RB_Status DLT_RB_TransmitRead(DltRingBufferTransmit_t *Buf, uint8_t *MessageSize, uint8_t **MessagePointer); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLT_RB_GetNextWriteIndex |
||||
|
* \details -- |
||||
|
* \param in RingBuffer_t *Buf - pointer to Ring Buffer structure |
||||
|
* \param out writeIndex - next index where DLT data should be stored, can be used only if fun return "RB_OK" |
||||
|
* \return RB_OK if index available, otherwise RB_ERROR |
||||
|
************************************************************************************************/ |
||||
|
static RB_Status DLT_RB_GetNextWriteIndex(DltRingBufferTransmit_t *Buf,uint16_t *writeIndex); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLT_RB_Receive_GetNextMessageAddress |
||||
|
* \details Function used to work with DMA - direct write to ring buffer by DMA |
||||
|
* \param in Buf - |
||||
|
* \param in WriteAddress - |
||||
|
************************************************************************************************/ |
||||
|
static RB_Status DLT_RB_Receive_GetNextMessageAddress(BluRingBufferReceive_t *Buf, uint8_t **WriteAddress); |
||||
|
|
||||
|
/*!
|
||||
|
************************************************************************************************ |
||||
|
* \brief DLT_RB_Receive_Read Function to read data from ring buffer |
||||
|
* \details -- |
||||
|
* \param RingBuffer_t *Buf - pointer to Ring Buffer structure |
||||
|
* \param out MessageSize - size of the "BleLogData" (return value) |
||||
|
* \param out MessagePointer - pointer to the message stored in RingBuffer (return value) |
||||
|
* |
||||
|
* */ |
||||
|
static RB_Status DLT_RB_Receive_Read(BluRingBufferReceive_t *Buf, uint8_t *MessageSize, uint8_t **MessagePointer); |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************* |
||||
|
* Static functions implementation |
||||
|
******************************************************************************************** |
||||
|
*/ |
||||
|
|
||||
|
static RB_Status DLT_RB_Receive_GetNextMessageAddress(BluRingBufferReceive_t *Buf, uint8_t **WriteAddress) |
||||
|
{ |
||||
|
/* TODO: The implementation isn't optimal...*/ |
||||
|
static uint8_t DefaultBlindBuffer[DLT_REC_SINGLE_MESSAGE_MAX_SIZE]; |
||||
|
|
||||
|
/*Mark previous message as ready to read*/ |
||||
|
Buf->ReadyToRead[Buf->Head] = true; |
||||
|
|
||||
|
// Compute new Head pointer value of a ring buffer
|
||||
|
uint16_t HeadTmp = (Buf->Head + 1) % DLT_RECEIVE_RING_BUFFER_SIZE; |
||||
|
|
||||
|
// Check if there is one free space ahead the Head buffer
|
||||
|
if(HeadTmp == Buf->Tail) |
||||
|
{ |
||||
|
/*Even if buffer is full data must be received somewhere to don't crush application/ dma*/ |
||||
|
*WriteAddress = DefaultBlindBuffer; |
||||
|
// There is no space in the buffer - return an error
|
||||
|
return RB_ERROR; |
||||
|
} |
||||
|
|
||||
|
Buf->ReadyToRead[HeadTmp] = false; |
||||
|
Buf->MessageSize[HeadTmp] = DLT_RECEIVE_RING_BUFFER_SIZE; |
||||
|
Buf->Head = HeadTmp; |
||||
|
|
||||
|
*WriteAddress = &BluMainReceiveMessagesTab[HeadTmp][0]; |
||||
|
|
||||
|
// Everything is ok - return OK status
|
||||
|
return RB_OK; |
||||
|
} |
||||
|
|
||||
|
static RB_Status DLT_RB_Receive_Read(BluRingBufferReceive_t *Buf, uint8_t *MessageSize, uint8_t **MessagePointer) |
||||
|
{ |
||||
|
if(Buf->ReadyToRead[Buf->Tail] == false) |
||||
|
{ |
||||
|
/*Any message in ring buffer isn't ready to read*/ |
||||
|
return RB_ERROR; |
||||
|
} |
||||
|
/*Mark again as not ready to read*/ |
||||
|
Buf->ReadyToRead[Buf->Tail] = false; |
||||
|
|
||||
|
// Check if Tail hit Head
|
||||
|
if(Buf->Head == Buf->Tail) |
||||
|
{ |
||||
|
// If yes - there is nothing to read
|
||||
|
return RB_ERROR; |
||||
|
} |
||||
|
|
||||
|
// Write current value from buffer to pointer from argument
|
||||
|
*MessageSize = Buf->MessageSize[Buf->Tail]; |
||||
|
*MessagePointer = &BluMainReceiveMessagesTab[Buf->Tail][0]; |
||||
|
|
||||
|
// Calculate new Tail pointer
|
||||
|
Buf->Tail = (Buf->Tail + 1) % DLT_RECEIVE_RING_BUFFER_SIZE; |
||||
|
|
||||
|
// Everything is ok - return OK status
|
||||
|
return RB_OK; |
||||
|
} |
||||
|
|
||||
|
static RB_Status DLT_RB_TransmitRead(DltRingBufferTransmit_t *Buf, uint8_t *MessageSize, uint8_t **MessagePointer) |
||||
|
{ |
||||
|
// Check if Tail hit Head
|
||||
|
if(Buf->Head == Buf->Tail) |
||||
|
{ |
||||
|
// If yes - there is nothing to read
|
||||
|
return RB_ERROR; |
||||
|
} |
||||
|
else if(true == Buf->readyToTransmit[Buf->Tail]) |
||||
|
{ |
||||
|
// Write current value from buffer to pointer from argument
|
||||
|
*MessageSize = Buf->dataSize[Buf->Tail]; |
||||
|
*MessagePointer = &DltTrsmtMessagesTab[Buf->Tail][0]; |
||||
|
|
||||
|
// Calculate new Tail pointer
|
||||
|
Buf->Tail = (Buf->Tail + 1) % DLT_TRANSMIT_RING_BUFFER_SIZE; |
||||
|
// Everything is ok - return OK status
|
||||
|
return RB_OK; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* Message still not ready to transmit */ |
||||
|
return RB_ERROR; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
static RB_Status DLT_RB_GetNextWriteIndex(DltRingBufferTransmit_t *Buf,uint16_t *writeIndex) |
||||
|
{ |
||||
|
DLTuc_OS_CRITICAL_START(); |
||||
|
// Calculate new Head pointer value
|
||||
|
uint8_t HeadTmp = (Buf->Head + 1) % DLT_TRANSMIT_RING_BUFFER_SIZE; |
||||
|
|
||||
|
// Check if there is one free space ahead the Head buffer
|
||||
|
if(HeadTmp == Buf->Tail) |
||||
|
{ |
||||
|
DLTuc_OS_CRITICAL_END(); |
||||
|
// There is no space in the buffer - return an error
|
||||
|
return RB_ERROR; |
||||
|
} |
||||
|
Buf->Head = HeadTmp; |
||||
|
Buf->readyToTransmit[Buf->Head] = false; |
||||
|
*writeIndex = Buf->Head; |
||||
|
DLTuc_OS_CRITICAL_END(); |
||||
|
|
||||
|
return RB_OK; |
||||
|
} |
||||
|
|
||||
|
static void PrepareDltHeader(uint8_t Level, uint32_t AppId, uint32_t ContextId, uint16_t size,uint8_t *headerAddrStart) |
||||
|
{ |
||||
|
uint32_t ActualTime = 0; |
||||
|
|
||||
|
if(GetSystemTimeMs != NULL) |
||||
|
{ |
||||
|
ActualTime = GetSystemTimeMs() * 10U; |
||||
|
/*Multiply by 10 to get value in MS also in DLTViewer
|
||||
|
*Reson: Resolution in DLT Viewer is equal: 10^-4 |
||||
|
*/ |
||||
|
} |
||||
|
|
||||
|
if(size > ((UINT8_MAX -1) - DLT_ACT_HEADER_SIZE) ) |
||||
|
{ |
||||
|
/*Error to handle, or please develop this function to handle input size > UINT8_MAX */ |
||||
|
// while(1)
|
||||
|
// {
|
||||
|
// /*For development phase: lock the app*/
|
||||
|
// }
|
||||
|
size = size - DLT_ACT_HEADER_SIZE -1; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*START HEADER*/ |
||||
|
headerAddrStart[0] = 0x44; /*'D'*/ |
||||
|
headerAddrStart[1] = 0x4c; /*'L'*/ |
||||
|
headerAddrStart[2] = 0x53; /*'S'*/ |
||||
|
headerAddrStart[3] = 0x01; /*'0x01'*/ |
||||
|
|
||||
|
|
||||
|
headerAddrStart[4] = 0x35; /*'Dlt base header config
|
||||
|
* Use extended header - true |
||||
|
* MSBF - false |
||||
|
* With ECU ID - true |
||||
|
* With Seesion ID - false |
||||
|
* With time stamp - true |
||||
|
* version number -random |
||||
|
'*/ |
||||
|
|
||||
|
headerAddrStart[5] = ActDltMessageCounter++; /*'Message counter value '*/ |
||||
|
|
||||
|
/*TODO: - it must be fixed!!!! - Length*/ |
||||
|
headerAddrStart[6] = 0x00; /*Message length general*/ |
||||
|
// headerAddrStart[7] = 0x37; /*'Message length general '*/
|
||||
|
headerAddrStart[7]=28+size; /*General size */ |
||||
|
|
||||
|
|
||||
|
uint32_t TempEcuId = DLT_LOG_ECUID_VALUE; |
||||
|
/*ECU ID*/ |
||||
|
headerAddrStart[8]= ((uint8_t*)&TempEcuId)[3]; |
||||
|
headerAddrStart[9]= ((uint8_t*)&TempEcuId)[2]; |
||||
|
headerAddrStart[10]= ((uint8_t*)&TempEcuId)[1]; |
||||
|
headerAddrStart[11]= ((uint8_t*)&TempEcuId)[0]; |
||||
|
|
||||
|
/*Time stamp*/ |
||||
|
headerAddrStart[12]= ((uint8_t*)&ActualTime)[3]; |
||||
|
headerAddrStart[13]= ((uint8_t*)&ActualTime)[2]; |
||||
|
headerAddrStart[14]= ((uint8_t*)&ActualTime)[1]; |
||||
|
headerAddrStart[15]= ((uint8_t*)&ActualTime)[0]; |
||||
|
|
||||
|
/*Extended header --verbose | type serial*/ |
||||
|
// headerAddrStart[16]= 0x41; /**/
|
||||
|
headerAddrStart[16]= (Level << 4) | 1; |
||||
|
|
||||
|
/*Number of arguments*/ |
||||
|
headerAddrStart[17]= 0x01; /**/ |
||||
|
|
||||
|
/*App id */ |
||||
|
headerAddrStart[18]= ((uint8_t*)&AppId)[3]; |
||||
|
headerAddrStart[19]= ((uint8_t*)&AppId)[2]; |
||||
|
headerAddrStart[20]= ((uint8_t*)&AppId)[1]; |
||||
|
headerAddrStart[21]= ((uint8_t*)&AppId)[0]; |
||||
|
|
||||
|
/*Contex ID (4 bytes*/ |
||||
|
headerAddrStart[22]= ((uint8_t*)&ContextId)[3]; |
||||
|
headerAddrStart[23]= ((uint8_t*)&ContextId)[2]; |
||||
|
headerAddrStart[24]= ((uint8_t*)&ContextId)[1]; |
||||
|
headerAddrStart[25]= ((uint8_t*)&ContextId)[0]; |
||||
|
|
||||
|
/*Type info*/ |
||||
|
headerAddrStart[26]= 0x01; /**/ |
||||
|
headerAddrStart[27]= 0x82; /**/ |
||||
|
headerAddrStart[28]= 0x00; /**/ |
||||
|
headerAddrStart[29]= 0x00; /**/ |
||||
|
|
||||
|
/*Argument 1*/ |
||||
|
headerAddrStart[30]= size; |
||||
|
/* Size of the load in simplified form, please verify in documentation of DLT protcool documentation */ |
||||
|
headerAddrStart[31]= 0x00; /**/ |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
**************************************************************************************************** |
||||
|
* Exported functions implementation. |
||||
|
* Descriptions are added in header file |
||||
|
***************************************************************************************************** |
||||
|
*/ |
||||
|
|
||||
|
void DLTuc_RawDataReceiveDone(uint16_t Size) |
||||
|
{ |
||||
|
static uint8_t *MessageReceiveBufferAddress = NULL; |
||||
|
uint8_t *MessageToRead_p = NULL; |
||||
|
uint8_t MessageToReadSize= 0U; |
||||
|
|
||||
|
DLT_RB_Receive_GetNextMessageAddress(&BleMainReceiveRingBuffer,&MessageReceiveBufferAddress); |
||||
|
if(ExtSerialRecDataFunctionCb != NULL){ |
||||
|
ExtSerialRecDataFunctionCb(MessageReceiveBufferAddress,DLT_REC_SINGLE_MESSAGE_MAX_SIZE); |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
* The receive buffer isn't handled fully correctly, it require deeper investigation. |
||||
|
* However, it is possible to receive the Injection messages, and base commands if are transmitted with breakes.. |
||||
|
* Received DTL messages are divided by the "IDLE" irq for now.., not by the size and etc... |
||||
|
*/ |
||||
|
if(DLT_RB_Receive_Read(&BleMainReceiveRingBuffer, &MessageToReadSize,&MessageToRead_p) == RB_OK) |
||||
|
{ |
||||
|
if(MessageToRead_p[4] == 53) /**/ |
||||
|
{ |
||||
|
/*Use Extended, with EcuId, with Timestamp, end at[15]
|
||||
|
then Extended data as follow: |
||||
|
[16] ==22-? - non verbose, type: control, MSTP: fatal |
||||
|
[17] numOfArgs == 1 - TODO: Only 1 argument is for nowsupported!!! |
||||
|
[18-21] - AppId |
||||
|
[22-25] - ContexId |
||||
|
[26-29] - ServiceId |
||||
|
[30-33] - Size*/ |
||||
|
|
||||
|
uint32_t AppId = MessageToRead_p[21] << 24 |MessageToRead_p[20] << 16 | MessageToRead_p[19] << 8 | MessageToRead_p[18] << 0; |
||||
|
uint32_t RecContexId = MessageToRead_p[25] << 24 |MessageToRead_p[24] << 16 | MessageToRead_p[23] << 8 | MessageToRead_p[22] << 0; |
||||
|
uint32_t RecServiceId = MessageToRead_p[29] << 24 |MessageToRead_p[28] << 16 | MessageToRead_p[27] << 8 | MessageToRead_p[26] << 0; |
||||
|
|
||||
|
if(RecServiceId >= DLT_SERVICE_ID_CALLSW_CINJECTION) |
||||
|
{ |
||||
|
if(NULL != ExtInfoInjectionDataRcvdCb) |
||||
|
{ |
||||
|
/*MSB LSB, wtf..?, it is somehow mixed? */ |
||||
|
uint32_t DltDatSize = MessageToRead_p[33] << 24 | MessageToRead_p[32] << 16 | MessageToRead_p[31] << 8 | MessageToRead_p[30] << 0; |
||||
|
|
||||
|
ExtInfoInjectionDataRcvdCb(AppId,RecContexId,RecServiceId,&MessageToRead_p[34],(uint16_t)DltDatSize); |
||||
|
} |
||||
|
} |
||||
|
else if(RecServiceId == DLT_SERVICE_ID_SET_LOG_LEVEL) |
||||
|
{ |
||||
|
uint32_t NewLogLevel = MessageToRead_p[30]; |
||||
|
LOG("Set new log level request: %d How you triggered it?? , not supported", NewLogLevel); |
||||
|
/* It is handled correctly by DLT Viewer?? */ |
||||
|
} |
||||
|
else if(RecServiceId == DLT_SERVICE_ID_SET_DEFAULT_LOG_LEVEL) |
||||
|
{ |
||||
|
uint32_t NewLogLevel = MessageToRead_p[30]; |
||||
|
LOG("Set default log level request: %d", NewLogLevel); |
||||
|
|
||||
|
LOG("Not supported yet, I'm too lazy :)"); |
||||
|
} |
||||
|
else if(DLT_SERVICE_ID_GET_SOFTWARE_VERSION == RecServiceId) |
||||
|
{ |
||||
|
LOG("ECU_SW_VERSION: %d", DLT_ECU_SW_VER); |
||||
|
/*TODO: The lib should send here answer of control message... */ |
||||
|
} |
||||
|
else if(DLT_SERVICE_ID_GET_DEFAULT_LOG_LEVEL == RecServiceId) |
||||
|
{ |
||||
|
LOG("Default log level: %d", DLT_LOG_ENABLE_LEVEL); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void DLTuc_RegisterInjectionDataReceivedCb( |
||||
|
void InjectionDataRcvd(uint32_t AppId, uint32_t ConId,uint32_t ServId,uint8_t *Data, uint16_t Size)) |
||||
|
{ |
||||
|
ExtInfoInjectionDataRcvdCb = InjectionDataRcvd; |
||||
|
} |
||||
|
|
||||
|
void DLTuc_RegisterReceiveSerialDataFunction(void LLSerialRecDataFunctionC(uint8_t *DltLogData, uint16_t Size)) |
||||
|
{ |
||||
|
ExtSerialRecDataFunctionCb = LLSerialRecDataFunctionC; |
||||
|
|
||||
|
if(ExtSerialRecDataFunctionCb != NULL) |
||||
|
{ |
||||
|
ExtSerialRecDataFunctionCb(&BluMainReceiveMessagesTab[0][0],DLT_REC_SINGLE_MESSAGE_MAX_SIZE); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void DLTuc_RegisterTransmitSerialDataFunction(void LLSerialTrDataFunctionC(uint8_t *DltLogData, uint8_t Size)) |
||||
|
{ |
||||
|
ExtSerialTrDataFunctionCb = LLSerialTrDataFunctionC; |
||||
|
|
||||
|
/*Preapre LOG DROP Info Log*/ |
||||
|
/* 0x444C5443 - In Ascii code it is: DLTC. It is more convience to put magic numbers here :) */ |
||||
|
PrepareDltHeader(DL_ERROR,0x444C5443, 0x444C5443,sizeof(DltLogDroppedInfo),DltLogDroppedInfoBuffer); |
||||
|
for(int i=0; i<sizeof(DltLogDroppedInfo); i++) |
||||
|
{ |
||||
|
DltLogDroppedInfoBuffer[i+DLT_ACT_HEADER_SIZE] = DltLogDroppedInfo[i]; |
||||
|
} |
||||
|
|
||||
|
DLtLogDroppedSize = DLT_ACT_HEADER_SIZE + sizeof(DltLogDroppedInfo); |
||||
|
} |
||||
|
|
||||
|
void DLTuc_MessageTransmitDone(void) |
||||
|
{ |
||||
|
uint8_t TmpMessageSize=0; |
||||
|
uint8_t *TmpMessagePointer = NULL; |
||||
|
uint32_t ActualSysTime = 0u; |
||||
|
|
||||
|
if(GetSystemTimeMs != NULL) |
||||
|
{ |
||||
|
ActualSysTime = GetSystemTimeMs(); |
||||
|
} |
||||
|
|
||||
|
if(LogDroppedFlag == true && (ActualSysTime - PrevLogDropSendTime > DLT_MINIMUM_LOG_DROP_PERIOD) ) |
||||
|
{ |
||||
|
/* If DLTuc will always send the DROP Message info,
|
||||
|
* then will not read any message from RB..*/ |
||||
|
PrevLogDropSendTime = ActualSysTime; |
||||
|
LogDroppedFlag = false; |
||||
|
|
||||
|
if(ExtSerialTrDataFunctionCb != NULL) |
||||
|
{ |
||||
|
ExtSerialTrDataFunctionCb(DltLogDroppedInfoBuffer, DLtLogDroppedSize); |
||||
|
} |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
DLTuc_OS_CRITICAL_START(); |
||||
|
if(DLT_RB_TransmitRead(&DltTrsmtRingBuffer,&TmpMessageSize,&TmpMessagePointer) == RB_OK) |
||||
|
{ |
||||
|
if(ExtSerialTrDataFunctionCb != NULL) |
||||
|
{ |
||||
|
DLTuc_OS_CRITICAL_END(); |
||||
|
ExtSerialTrDataFunctionCb(TmpMessagePointer, TmpMessageSize); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
TransmitReadyStateFlag = true; |
||||
|
} |
||||
|
DLTuc_OS_CRITICAL_END(); |
||||
|
} |
||||
|
|
||||
|
void DLTuc_LogOutVarArgs(DltLogLevel_t Level, uint32_t AppId, uint32_t ContextId, uint8_t *Payload, ...) |
||||
|
{ |
||||
|
uint16_t Size; /* */ |
||||
|
uint8_t TmpMessageSize=0U; /* */ |
||||
|
uint8_t *TmpMessagePointer = NULL; /* */ |
||||
|
uint16_t writeIndex = 0U; /* */ |
||||
|
|
||||
|
if(DLT_RB_GetNextWriteIndex(&DltTrsmtRingBuffer,&writeIndex) != RB_OK) |
||||
|
{ |
||||
|
DLTuc_OS_CRITICAL_START(); |
||||
|
LogDroppedFlag = true; |
||||
|
DLTuc_OS_CRITICAL_END(); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* Put the DLT message data directly in ring buffer*/ |
||||
|
va_list ap; /* */ |
||||
|
va_start(ap, Payload); |
||||
|
Size = vsprintf((char *)&(DltTrsmtMessagesTab[writeIndex][DLT_ACT_HEADER_SIZE]), (char *)Payload,ap); |
||||
|
va_end(ap); |
||||
|
|
||||
|
Size += DLT_ACT_HEADER_SIZE; |
||||
|
/*Add additional zeros on the end of message - thanks to that it work stable */ |
||||
|
Size++; |
||||
|
DltTrsmtMessagesTab[writeIndex][Size] = 0U; |
||||
|
Size++; |
||||
|
DltTrsmtMessagesTab[writeIndex][Size] = 0U; |
||||
|
|
||||
|
PrepareDltHeader(Level,AppId,ContextId,Size,&(DltTrsmtMessagesTab[writeIndex][0])); |
||||
|
|
||||
|
Size = Size + DLT_ACT_HEADER_SIZE; |
||||
|
DltTrsmtRingBuffer.dataSize[writeIndex] = Size; |
||||
|
|
||||
|
DLTuc_OS_CRITICAL_START(); |
||||
|
DltTrsmtRingBuffer.readyToTransmit[writeIndex] = true; |
||||
|
DLTuc_OS_CRITICAL_END(); |
||||
|
} |
||||
|
|
||||
|
DLTuc_OS_CRITICAL_START(); |
||||
|
if(TransmitReadyStateFlag == true) |
||||
|
{ |
||||
|
if(DLT_RB_TransmitRead(&DltTrsmtRingBuffer,&TmpMessageSize,&TmpMessagePointer) == RB_OK) |
||||
|
{ |
||||
|
if(TmpMessageSize != 0U) |
||||
|
{ |
||||
|
TransmitReadyStateFlag = false; |
||||
|
DLTuc_OS_CRITICAL_END(); |
||||
|
/*Log transmission must be started in this contex...*/ |
||||
|
/***********************************************/ |
||||
|
/* It may be a bug in implementation - it must be investigated.. */ |
||||
|
/* It's important to be aware of this fact!!*/ |
||||
|
/***********************************************/ |
||||
|
if(ExtSerialTrDataFunctionCb != NULL) |
||||
|
{ |
||||
|
ExtSerialTrDataFunctionCb(TmpMessagePointer, TmpMessageSize); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// while(1); /*Please Register the callback...*/
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
DLTuc_OS_CRITICAL_END(); |
||||
|
} |
||||
|
|
||||
|
void DLTuc_RegisterGetTimeStampMsCallback(uint32_t GetSysTime(void)) |
||||
|
{ |
||||
|
GetSystemTimeMs = GetSysTime; |
||||
|
} |
||||
|
|
||||
|
|
||||
@ -0,0 +1,90 @@ |
|||||
|
/*
|
||||
|
* bsp_DLT_Log.c |
||||
|
* |
||||
|
* Created on: Aug 8, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#include "bsp_DLT_Log.h" |
||||
|
|
||||
|
|
||||
|
#define DLT_LOG_CONTEX "MAIN" |
||||
|
#define DLT_LOG_APPID "NUM1" |
||||
|
uint32_t GetSysTime(void); |
||||
|
void DltInjectDataRcvd(uint32_t AppId, uint32_t ConId, uint32_t ServId, |
||||
|
uint8_t *Data, uint16_t Size); |
||||
|
void DLT_LowLevelReceiveDmaToIdle(uint8_t *rxBuf, uint16_t size); |
||||
|
void DLT_DataReceiveEndCallback(uint8_t *rxBuf, uint16_t Size); |
||||
|
void DLT_DataTransmit(uint8_t *DltLogData, uint8_t Size); |
||||
|
|
||||
|
struct UARTHandler *dLT_Log_UART_Handler; |
||||
|
|
||||
|
|
||||
|
|
||||
|
void dLT_Log_intialize(struct UARTHandler *Handler) |
||||
|
{ |
||||
|
|
||||
|
dLT_Log_UART_Handler = Handler; |
||||
|
|
||||
|
//log_info("angle_encoder_intialize");
|
||||
|
dLT_Log_UART_Handler->UART_Decode = DLT_DataReceiveEndCallback; |
||||
|
/*Register Low Level Transmit/Receive functions for DLTuc Library*/ |
||||
|
DLTuc_RegisterTransmitSerialDataFunction(DLT_DataTransmit); |
||||
|
DLTuc_RegisterReceiveSerialDataFunction(DLT_LowLevelReceiveDmaToIdle); |
||||
|
|
||||
|
DLTuc_RegisterGetTimeStampMsCallback(GetSysTime); /*Register GetSysTime function*/ |
||||
|
/*The function "GetSysTime" must return the time in ms*/ |
||||
|
|
||||
|
DLTuc_RegisterInjectionDataReceivedCb(DltInjectDataRcvd); |
||||
|
} |
||||
|
|
||||
|
/*This CallBack was registered in main function using function: DLTuc_RegisterTransmitSerialDataFunction*/ |
||||
|
void DLT_DataTransmit(uint8_t *DltLogData, uint8_t Size) |
||||
|
{ |
||||
|
|
||||
|
dLT_Log_UART_Handler->AddSendList(dLT_Log_UART_Handler,DltLogData,Size,100,NULL); |
||||
|
|
||||
|
DLTuc_MessageTransmitDone(); |
||||
|
|
||||
|
} |
||||
|
/*CallBacks used by ucDltLibrary section end..*/ |
||||
|
|
||||
|
void DLT_DataReceiveEndCallback(uint8_t *rxBuf, uint16_t Size) |
||||
|
{ |
||||
|
if(Size==3) |
||||
|
{ |
||||
|
if(rxBuf[2]) |
||||
|
{ |
||||
|
DLT_LOG_ENABLE_LEVEL=7; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
DLT_LOG_ENABLE_LEVEL=0; |
||||
|
} |
||||
|
} |
||||
|
DLTuc_RawDataReceiveDone(Size); |
||||
|
/*
|
||||
|
*In case of STM32 HAL lib, you have to subsitute this function using: |
||||
|
*void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) |
||||
|
*/ |
||||
|
} |
||||
|
//HAL_UARTEx_RxEventCallback
|
||||
|
void DLT_LowLevelReceiveDmaToIdle(uint8_t *rxBuf, uint16_t Size) |
||||
|
{ |
||||
|
|
||||
|
memcpy(rxBuf, dLT_Log_UART_Handler->Rx_Buf, Size); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void DltInjectDataRcvd(uint32_t AppId, uint32_t ConId, uint32_t ServId, |
||||
|
uint8_t *Data, uint16_t Size) |
||||
|
{ |
||||
|
LOG("RecInjectionData: %s, ServId: %d Size: %d", Data, ServId, Size) |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
uint32_t GetSysTime(void) |
||||
|
{ |
||||
|
return HAL_GetTick(); |
||||
|
} |
||||
@ -0,0 +1,557 @@ |
|||||
|
/*
|
||||
|
* bsp_EEPROM.c |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
#include "bsp_EEPROM.h" |
||||
|
|
||||
|
void bsp_InitI2C(void); |
||||
|
void i2c_Start(void); |
||||
|
void i2c_Stop(void); |
||||
|
void i2c_SendByte(uint8_t _ucByte); |
||||
|
uint8_t i2c_ReadByte(void); |
||||
|
uint8_t i2c_WaitAck(void); |
||||
|
void i2c_Ack(void); |
||||
|
void i2c_NAck(void); |
||||
|
uint8_t i2c_CheckDevice(uint8_t _Address); |
||||
|
|
||||
|
uint16_t App_Download_EEPROM_Addr= 1024; |
||||
|
/* 定义读写SCL和SDA的宏 */ |
||||
|
#define I2C_SCL_GPIO EEPROM_SCL_GPIO_Port |
||||
|
#define I2C_SDA_GPIO EEPROM_SDA_GPIO_Port |
||||
|
#define I2C_SCL_PIN EEPROM_SCL_Pin |
||||
|
#define I2C_SDA_PIN EEPROM_SDA_Pin |
||||
|
|
||||
|
#define I2C_SCL_1() I2C_SCL_GPIO->BSRR = I2C_SCL_PIN /* SCL = 1 */ |
||||
|
#define I2C_SCL_0() I2C_SCL_GPIO->BSRR = ((uint32_t)I2C_SCL_PIN << 16U) /* SCL = 0 */ |
||||
|
|
||||
|
#define I2C_SDA_1() I2C_SDA_GPIO->BSRR = I2C_SDA_PIN /* SDA = 1 */ |
||||
|
#define I2C_SDA_0() I2C_SDA_GPIO->BSRR = ((uint32_t)I2C_SDA_PIN << 16U) /* SDA = 0 */ |
||||
|
|
||||
|
|
||||
|
#define I2C_SDA_READ() ((I2C_SDA_GPIO->IDR & I2C_SDA_PIN) != 0) /* 读SDA口线状态 */ |
||||
|
#define I2C_SCL_READ() ((I2C_SCL_GPIO->IDR & I2C_SCL_PIN) != 0) /* 读SCL口线状态 */ |
||||
|
|
||||
|
|
||||
|
|
||||
|
uint8_t GF_BSP_EEPROM_Init(void) |
||||
|
{ |
||||
|
bsp_InitI2C(); |
||||
|
return(GF_BSP_EEPROM_CheckOK()); |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: bsp_InitI2C |
||||
|
* 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
void bsp_InitI2C(void) |
||||
|
{ |
||||
|
GPIO_InitTypeDef gpio_init; |
||||
|
|
||||
|
|
||||
|
gpio_init.Mode = GPIO_MODE_OUTPUT_OD; /* 设置开漏输出 */ |
||||
|
gpio_init.Pull = GPIO_NOPULL; /* 上下拉电阻不使能 */ |
||||
|
gpio_init.Speed = GPIO_SPEED_FREQ_LOW; // GPIO_SPEED_FREQ_HIGH; /* GPIO速度等级 */
|
||||
|
|
||||
|
gpio_init.Pin = I2C_SCL_PIN; |
||||
|
HAL_GPIO_Init(I2C_SCL_GPIO, &gpio_init); |
||||
|
|
||||
|
gpio_init.Pin = I2C_SDA_PIN; |
||||
|
HAL_GPIO_Init(I2C_SDA_GPIO, &gpio_init); |
||||
|
|
||||
|
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */ |
||||
|
i2c_Stop(); |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_Delay |
||||
|
* 功能说明: I2C总线位延迟,最快400KHz |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
static void i2c_Delay(void) |
||||
|
{ |
||||
|
GF_BSP_TIMER_DelayUS(2); |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_Start |
||||
|
* 功能说明: CPU发起I2C总线启动信号 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
void i2c_Start(void) |
||||
|
{ |
||||
|
/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */ |
||||
|
I2C_SDA_1(); |
||||
|
I2C_SCL_1(); |
||||
|
i2c_Delay(); |
||||
|
I2C_SDA_0(); |
||||
|
i2c_Delay(); |
||||
|
|
||||
|
I2C_SCL_0(); |
||||
|
i2c_Delay(); |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_Start |
||||
|
* 功能说明: CPU发起I2C总线停止信号 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
void i2c_Stop(void) |
||||
|
{ |
||||
|
/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */ |
||||
|
I2C_SDA_0(); |
||||
|
i2c_Delay(); |
||||
|
I2C_SCL_1(); |
||||
|
i2c_Delay(); |
||||
|
I2C_SDA_1(); |
||||
|
i2c_Delay(); |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_SendByte |
||||
|
* 功能说明: CPU向I2C总线设备发送8bit数据 |
||||
|
* 形 参: _ucByte : 等待发送的字节 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
void i2c_SendByte(uint8_t _ucByte) |
||||
|
{ |
||||
|
uint8_t i; |
||||
|
|
||||
|
/* 先发送字节的高位bit7 */ |
||||
|
for (i = 0; i < 8; i++) |
||||
|
{ |
||||
|
if (_ucByte & 0x80) |
||||
|
{ |
||||
|
I2C_SDA_1(); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
I2C_SDA_0(); |
||||
|
} |
||||
|
i2c_Delay(); |
||||
|
I2C_SCL_1(); |
||||
|
i2c_Delay(); |
||||
|
I2C_SCL_0(); |
||||
|
I2C_SCL_0(); /* 2019-03-14 针对GT811电容触摸,添加一行,相当于延迟几十ns */ |
||||
|
if (i == 7) |
||||
|
{ |
||||
|
I2C_SDA_1(); // 释放总线
|
||||
|
} |
||||
|
_ucByte <<= 1; /* 左移一个bit */ |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_ReadByte |
||||
|
* 功能说明: CPU从I2C总线设备读取8bit数据 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 读到的数据 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t i2c_ReadByte(void) |
||||
|
{ |
||||
|
uint8_t i; |
||||
|
uint8_t value; |
||||
|
|
||||
|
/* 读到第1个bit为数据的bit7 */ |
||||
|
value = 0; |
||||
|
for (i = 0; i < 8; i++) |
||||
|
{ |
||||
|
value <<= 1; |
||||
|
I2C_SCL_1(); |
||||
|
i2c_Delay(); |
||||
|
if (I2C_SDA_READ()) |
||||
|
{ |
||||
|
value++; |
||||
|
} |
||||
|
I2C_SCL_0(); |
||||
|
i2c_Delay(); |
||||
|
} |
||||
|
return value; |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_WaitAck |
||||
|
* 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 返回0表示正确应答,1表示无器件响应 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t i2c_WaitAck(void) |
||||
|
{ |
||||
|
uint8_t re; |
||||
|
|
||||
|
I2C_SDA_1(); /* CPU释放SDA总线 */ |
||||
|
i2c_Delay(); |
||||
|
I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */ |
||||
|
i2c_Delay(); |
||||
|
if (I2C_SDA_READ()) /* CPU读取SDA口线状态 */ |
||||
|
{ |
||||
|
re = 1; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
re = 0; |
||||
|
} |
||||
|
I2C_SCL_0(); |
||||
|
i2c_Delay(); |
||||
|
return re; |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_Ack |
||||
|
* 功能说明: CPU产生一个ACK信号 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
void i2c_Ack(void) |
||||
|
{ |
||||
|
I2C_SDA_0(); /* CPU驱动SDA = 0 */ |
||||
|
i2c_Delay(); |
||||
|
I2C_SCL_1(); /* CPU产生1个时钟 */ |
||||
|
i2c_Delay(); |
||||
|
I2C_SCL_0(); |
||||
|
i2c_Delay(); |
||||
|
I2C_SDA_1(); /* CPU释放SDA总线 */ |
||||
|
|
||||
|
i2c_Delay(); |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_NAck |
||||
|
* 功能说明: CPU产生1个NACK信号 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
void i2c_NAck(void) |
||||
|
{ |
||||
|
I2C_SDA_1(); /* CPU驱动SDA = 1 */ |
||||
|
i2c_Delay(); |
||||
|
I2C_SCL_1(); /* CPU产生1个时钟 */ |
||||
|
i2c_Delay(); |
||||
|
I2C_SCL_0(); |
||||
|
i2c_Delay(); |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: i2c_CheckDevice |
||||
|
* 功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在 |
||||
|
* 形 参: _Address:设备的I2C总线地址 |
||||
|
* 返 回 值: 返回值 0 表示正确, 返回1表示未探测到 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t i2c_CheckDevice(uint8_t _Address) |
||||
|
{ |
||||
|
uint8_t ucAck; |
||||
|
|
||||
|
if (I2C_SDA_READ() && I2C_SCL_READ()) |
||||
|
{ |
||||
|
i2c_Start(); /* 发送启动信号 */ |
||||
|
|
||||
|
/* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */ |
||||
|
i2c_SendByte(_Address | I2C_WR); |
||||
|
ucAck = i2c_WaitAck(); /* 检测设备的ACK应答 */ |
||||
|
|
||||
|
i2c_Stop(); /* 发送停止信号 */ |
||||
|
|
||||
|
return ucAck; |
||||
|
} |
||||
|
return 1; /* I2C总线异常 */ |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: ee_CheckOk |
||||
|
* 功能说明: 判断串行EERPOM是否正常 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 1 表示正常, 0 表示不正常 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t GF_BSP_EEPROM_CheckOK(void) |
||||
|
{ |
||||
|
if (i2c_CheckDevice(EE_DEV_ADDR) == 0) |
||||
|
{ |
||||
|
return 1; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
/* 失败后,切记发送I2C总线停止信号 */ |
||||
|
i2c_Stop(); |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: GF_BSP_EEPROM_ReadBytes |
||||
|
* 功能说明: 从串行EEPROM指定地址处开始读取若干数据 |
||||
|
* 形 参: _usAddress : 起始地址 |
||||
|
* _usSize : 数据长度,单位为字节 |
||||
|
* _pReadBuf : 存放读到的数据的缓冲区指针 |
||||
|
* 返 回 值: 0 表示失败,1表示成功 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t GF_BSP_EEPROM_ReadBytes(uint8_t *_pReadBuf, uint16_t _usAddress, uint16_t _usSize) |
||||
|
{ |
||||
|
uint16_t i; |
||||
|
|
||||
|
/* 采用串行EEPROM随即读取指令序列,连续读取若干字节 */ |
||||
|
|
||||
|
/* 第1步:发起I2C总线启动信号 */ |
||||
|
i2c_Start(); |
||||
|
|
||||
|
/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ |
||||
|
i2c_SendByte(EE_DEV_ADDR | I2C_WR); /* 此处是写指令 */ |
||||
|
|
||||
|
/* 第3步:发送ACK */ |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
|
||||
|
/* 第4步:发送字节地址,24C02只有256字节,因此1个字节就够了,如果是24C04以上,那么此处需要连发多个地址 */ |
||||
|
if (EE_ADDR_BYTES == 1) |
||||
|
{ |
||||
|
i2c_SendByte((uint8_t)_usAddress); |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
i2c_SendByte(_usAddress >> 8); |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
|
||||
|
i2c_SendByte(_usAddress&0xff); |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 第6步:重新启动I2C总线。下面开始读取数据 */ |
||||
|
i2c_Start(); |
||||
|
|
||||
|
/* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ |
||||
|
i2c_SendByte(EE_DEV_ADDR | I2C_RD); /* 此处是读指令 */ |
||||
|
|
||||
|
/* 第8步:发送ACK */ |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
|
||||
|
/* 第9步:循环读取数据 */ |
||||
|
for (i = 0; i < _usSize; i++) |
||||
|
{ |
||||
|
_pReadBuf[i] = i2c_ReadByte(); /* 读1个字节 */ |
||||
|
|
||||
|
/* 每读完1个字节后,需要发送Ack, 最后一个字节不需要Ack,发Nack */ |
||||
|
if (i != _usSize - 1) |
||||
|
{ |
||||
|
i2c_Ack(); /* 中间字节读完后,CPU产生ACK信号(驱动SDA = 0) */ |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
i2c_NAck(); /* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */ |
||||
|
} |
||||
|
} |
||||
|
/* 发送I2C总线停止信号 */ |
||||
|
i2c_Stop(); |
||||
|
return 1; /* 执行成功 */ |
||||
|
|
||||
|
cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */ |
||||
|
/* 发送I2C总线停止信号 */ |
||||
|
i2c_Stop(); |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: GF_BSP_EEPROM_WriteBytes |
||||
|
* 功能说明: 向串行EEPROM指定地址写入若干数据,采用页写操作提高写入效率 |
||||
|
* 形 参: _usAddress : 起始地址 |
||||
|
* _usSize : 数据长度,单位为字节 |
||||
|
* _pWriteBuf : 存放读到的数据的缓冲区指针 |
||||
|
* 返 回 值: 0 表示失败,1表示成功 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t GF_BSP_EEPROM_WriteBytes(uint8_t *_pWriteBuf, uint16_t _usAddress, uint16_t _usSize) |
||||
|
{ |
||||
|
uint16_t i,m; |
||||
|
uint16_t usAddr; |
||||
|
|
||||
|
/*
|
||||
|
写串行EEPROM不像读操作可以连续读取很多字节,每次写操作只能在同一个page。 |
||||
|
对于24xx02,page size = 8 |
||||
|
简单的处理方法为:按字节写操作模式,每写1个字节,都发送地址 |
||||
|
为了提高连续写的效率: 本函数采用page wirte操作。 |
||||
|
*/ |
||||
|
|
||||
|
usAddr = _usAddress; |
||||
|
for (i = 0; i < _usSize; i++) |
||||
|
{ |
||||
|
/* 当发送第1个字节或是页面首地址时,需要重新发起启动信号和地址 */ |
||||
|
if ((i == 0) || (usAddr & (EE_PAGE_SIZE - 1)) == 0) |
||||
|
{ |
||||
|
/* 第0步:发停止信号,启动内部写操作 */ |
||||
|
i2c_Stop(); |
||||
|
|
||||
|
/* 通过检查器件应答的方式,判断内部写操作是否完成, 一般小于 10ms
|
||||
|
CLK频率为200KHz时,查询次数为30次左右 |
||||
|
*/ |
||||
|
for (m = 0; m < 1000; m++) |
||||
|
{ |
||||
|
/* 第1步:发起I2C总线启动信号 */ |
||||
|
i2c_Start(); |
||||
|
|
||||
|
/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ |
||||
|
i2c_SendByte(EE_DEV_ADDR | I2C_WR); /* 此处是写指令 */ |
||||
|
|
||||
|
/* 第3步:发送一个时钟,判断器件是否正确应答 */ |
||||
|
if (i2c_WaitAck() == 0) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
if (m == 1000) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件写超时 */ |
||||
|
} |
||||
|
|
||||
|
/* 第4步:发送字节地址,24C02只有256字节,因此1个字节就够了,如果是24C04以上,那么此处需要连发多个地址 */ |
||||
|
if (EE_ADDR_BYTES == 1) |
||||
|
{ |
||||
|
i2c_SendByte((uint8_t)usAddr); |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
i2c_SendByte(usAddr >> 8); |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
|
||||
|
i2c_SendByte(usAddr&0xff); |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 第6步:开始写入数据 */ |
||||
|
i2c_SendByte(_pWriteBuf[i]); |
||||
|
|
||||
|
/* 第7步:发送ACK */ |
||||
|
if (i2c_WaitAck() != 0) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件无应答 */ |
||||
|
} |
||||
|
|
||||
|
usAddr++; /* 地址增1 */ |
||||
|
} |
||||
|
|
||||
|
/* 命令执行成功,发送I2C总线停止信号 */ |
||||
|
i2c_Stop(); |
||||
|
|
||||
|
/* 通过检查器件应答的方式,判断内部写操作是否完成, 一般小于 10ms
|
||||
|
CLK频率为200KHz时,查询次数为30次左右 |
||||
|
*/ |
||||
|
for (m = 0; m < 1000; m++) |
||||
|
{ |
||||
|
/* 第1步:发起I2C总线启动信号 */ |
||||
|
i2c_Start(); |
||||
|
|
||||
|
/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */ |
||||
|
#if EE_ADDR_A8 == 1 |
||||
|
i2c_SendByte(EE_DEV_ADDR | I2C_WR | ((_usAddress >> 7) & 0x0E)); /* 此处是写指令 */ |
||||
|
#else |
||||
|
i2c_SendByte(EE_DEV_ADDR | I2C_WR); /* 此处是写指令 */ |
||||
|
#endif |
||||
|
|
||||
|
/* 第3步:发送一个时钟,判断器件是否正确应答 */ |
||||
|
if (i2c_WaitAck() == 0) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
if (m == 1000) |
||||
|
{ |
||||
|
goto cmd_fail; /* EEPROM器件写超时 */ |
||||
|
} |
||||
|
|
||||
|
/* 命令执行成功,发送I2C总线停止信号 */ |
||||
|
i2c_Stop(); |
||||
|
return 1; |
||||
|
|
||||
|
cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */ |
||||
|
/* 发送I2C总线停止信号 */ |
||||
|
i2c_Stop(); |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
CV_struct_define GF_BSP_EEPROM_Get_CV(void) |
||||
|
{ |
||||
|
CV_struct_define cv= {0}; |
||||
|
//char buffer[sizeof(CV_struct_define)];
|
||||
|
GF_BSP_EEPROM_ReadBytes(&cv, GF_BSP_EEPROM_CV_struct_define_Start_Address, sizeof(CV_struct_define)); |
||||
|
return cv; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
uint8_t GF_BSP_EEPROM_Set_CV(CV_struct_define cv) |
||||
|
{ |
||||
|
return GF_BSP_EEPROM_WriteBytes((uint8_t*)&cv,GF_BSP_EEPROM_CV_struct_define_Start_Address,sizeof(CV_struct_define)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
IAP_struct_define GF_BSP_EEPROM_Get_IAP(void) |
||||
|
{ |
||||
|
IAP_struct_define iap= {0}; |
||||
|
|
||||
|
GF_BSP_EEPROM_ReadBytes(&iap, IAP_struct_define_Start_Address, sizeof(IAP_struct_define)); |
||||
|
return iap; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
uint8_t GF_BSP_EEPROM_Set_IAP(IAP_struct_define iap) |
||||
|
{ |
||||
|
return GF_BSP_EEPROM_WriteBytes((uint8_t*)&iap,IAP_struct_define_Start_Address,sizeof(IAP_struct_define)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,26 @@ |
|||||
|
/*
|
||||
|
* bsp_Error_Detect.c |
||||
|
* |
||||
|
* Created on: Oct 23, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
#include "bsp_Error_Detect.h" |
||||
|
void ErrorDetect(); |
||||
|
HardWareController *HardWareErrorController; |
||||
|
void Error_Detect_Intialzie(uint16_t DispacherPeriod) |
||||
|
{ |
||||
|
HardWareErrorController = (HardWareController*) malloc( |
||||
|
sizeof(HardWareController)); |
||||
|
HardWareErrorController->pComHWHead = NULL; |
||||
|
HardWareErrorController->pComHWTail = NULL; |
||||
|
HardWareErrorController->Add_PCOMHardWare = ComHardWare_List_Add_t; |
||||
|
HardWareErrorController->Set_PCOMHardWare = Set_PCOMHardWare_t; |
||||
|
HardWareErrorController->PCOMHardWare_Check = PCOMHardWare_Check_t; |
||||
|
HardWareErrorController->DispacherCallTime = DispacherPeriod;//check the communicaton every 50ms
|
||||
|
GF_BSP_Interrupt_Add_CallBack( |
||||
|
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback, ErrorDetect); |
||||
|
} |
||||
|
void ErrorDetect() |
||||
|
{ |
||||
|
HardWareErrorController->PCOMHardWare_Check(HardWareErrorController); |
||||
|
} |
||||
@ -0,0 +1,356 @@ |
|||||
|
/*
|
||||
|
* bsp_FDCAN.c |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
#include "bsp_FDCAN.h" |
||||
|
#include "main.h" |
||||
|
#include <stdlib.h> |
||||
|
#include "bsp_Error.pb.h" |
||||
|
#include "msp_TI5MOTOR.h" |
||||
|
|
||||
|
FDCANHandler FD_CAN_1_Handler; //自定义结构体
|
||||
|
FDCANHandler FD_CAN_2_Handler; |
||||
|
|
||||
|
FDCAN_RxHeaderTypeDef CAN_RX_HDR; |
||||
|
uint8_t CAN_Buf[8]; |
||||
|
uint8_t CAN_Buf_2[8]; |
||||
|
|
||||
|
int32_t CAN_ID; |
||||
|
int32_t CAN_ID_2; |
||||
|
|
||||
|
uint8_t GF_BSP_FDCAN_Init(void) |
||||
|
{ |
||||
|
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, |
||||
|
0) != HAL_OK) |
||||
|
{ |
||||
|
Error_Handler(); |
||||
|
} |
||||
|
|
||||
|
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_BUS_OFF, 0) != HAL_OK) |
||||
|
{ |
||||
|
Error_Handler(); |
||||
|
} |
||||
|
|
||||
|
HAL_FDCAN_Start(&hfdcan1); |
||||
|
|
||||
|
if (HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, |
||||
|
0) != HAL_OK) |
||||
|
{ |
||||
|
Error_Handler(); |
||||
|
} |
||||
|
|
||||
|
if (HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_BUS_OFF, 0) != HAL_OK) |
||||
|
{ |
||||
|
Error_Handler(); |
||||
|
} |
||||
|
|
||||
|
HAL_FDCAN_Start(&hfdcan2); |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
void HAL_FDCAN_ErrorStatusCallback(FDCAN_HandleTypeDef *hfdcan, |
||||
|
uint32_t ErrorStatusITs) |
||||
|
{ |
||||
|
if (hfdcan->Instance == FDCAN1) |
||||
|
{ |
||||
|
MX_FDCAN1_Init(); |
||||
|
} |
||||
|
if (hfdcan->Instance == FDCAN2) |
||||
|
{ |
||||
|
MX_FDCAN2_Init(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) |
||||
|
{ |
||||
|
if (hfdcan->Instance == FDCAN1) |
||||
|
{ |
||||
|
if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &CAN_RX_HDR, CAN_Buf) |
||||
|
== HAL_OK) |
||||
|
{ |
||||
|
CAN_ID = FD_CAN_1_Handler.ReceivedFrameID = |
||||
|
(uint32_t) CAN_RX_HDR.Identifier; |
||||
|
|
||||
|
#if NewCANSendVersion |
||||
|
FD_CAN_1_Handler.ReceivedLength = (uint32_t) CAN_RX_HDR.DataLength; |
||||
|
#else |
||||
|
FD_CAN_1_Handler.ReceivedLength = (uint32_t) CAN_RX_HDR.DataLength>>16; |
||||
|
#endif |
||||
|
|
||||
|
if (FD_CAN_1_Handler.CAN_Decode != NULL ) |
||||
|
{ |
||||
|
FD_CAN_1_Handler.CAN_Decode(FD_CAN_1_Handler.ReceivedFrameID, |
||||
|
CAN_Buf, FD_CAN_1_Handler.ReceivedLength); |
||||
|
} |
||||
|
GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_FDCAN1_RxFifo0Callback); |
||||
|
} |
||||
|
|
||||
|
} else if (hfdcan->Instance == FDCAN2) |
||||
|
{ |
||||
|
if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &CAN_RX_HDR, |
||||
|
CAN_Buf_2) == HAL_OK) |
||||
|
{ |
||||
|
CAN_ID_2 = FD_CAN_2_Handler.ReceivedFrameID = |
||||
|
(uint32_t) CAN_RX_HDR.Identifier; |
||||
|
|
||||
|
#if NewCANSendVersion |
||||
|
FD_CAN_2_Handler.ReceivedLength = (uint32_t) CAN_RX_HDR.DataLength; |
||||
|
#else |
||||
|
FD_CAN_2_Handler.ReceivedLength = (uint32_t) CAN_RX_HDR.DataLength>>16; |
||||
|
#endif |
||||
|
|
||||
|
if (FD_CAN_2_Handler.CAN_Decode != NULL) |
||||
|
{ |
||||
|
FD_CAN_2_Handler.CAN_Decode(FD_CAN_2_Handler.ReceivedFrameID, |
||||
|
CAN_Buf_2, FD_CAN_2_Handler.ReceivedLength); |
||||
|
} |
||||
|
GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_FDCAN2_RxFifo0Callback); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
FDCAN_TxHeaderTypeDef TXHeader1; |
||||
|
FDCAN_TxHeaderTypeDef TXHeader2; |
||||
|
void GF_BSP_FDCAN_Senddata(uint8_t FDCAN_CH, uint32_t FrameID, |
||||
|
uint8_t DataLength, uint8_t *Txdata) |
||||
|
{ |
||||
|
if (DataLength > 8) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
if (FDCAN_CH == 1) |
||||
|
{ |
||||
|
|
||||
|
TXHeader1.BitRateSwitch = FDCAN_BRS_OFF; |
||||
|
#if NewCANSendVersion |
||||
|
TXHeader1.DataLength = (uint32_t) DataLength; |
||||
|
#else |
||||
|
TXHeader1.DataLength = (uint32_t) DataLength << 16; |
||||
|
#endif |
||||
|
// FDCAN_DLC_BYTES_8//数据长度大于8的话会有错误
|
||||
|
|
||||
|
// FDCAN_DLC_BYTES_8//数据长度大于8的话会有错误
|
||||
|
TXHeader1.FDFormat = FDCAN_CLASSIC_CAN; |
||||
|
TXHeader1.IdType = FDCAN_STANDARD_ID; |
||||
|
TXHeader1.Identifier = FrameID; |
||||
|
TXHeader1.TxFrameType = FDCAN_DATA_FRAME; |
||||
|
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TXHeader1, Txdata); |
||||
|
} else if (FDCAN_CH == 2) |
||||
|
{ |
||||
|
TXHeader2.BitRateSwitch = FDCAN_BRS_OFF; |
||||
|
|
||||
|
#if NewCANSendVersion |
||||
|
TXHeader2.DataLength = (uint32_t) DataLength; |
||||
|
#else |
||||
|
TXHeader2.DataLength = (uint32_t) DataLength << 16; |
||||
|
#endif |
||||
|
//TXHeader2.DataLength = (uint32_t) DataLength << 16; //数据长度大于8的话会有错误
|
||||
|
TXHeader2.FDFormat = FDCAN_CLASSIC_CAN; |
||||
|
TXHeader2.IdType = FDCAN_STANDARD_ID; |
||||
|
TXHeader2.Identifier = FrameID; |
||||
|
TXHeader2.TxFrameType = FDCAN_DATA_FRAME; |
||||
|
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TXHeader2, Txdata); |
||||
|
} |
||||
|
} |
||||
|
void GF_BSP_CANHandler_Init(int can1_sendListPeriod, int can1_DispacherPeriod, |
||||
|
int can2_sendListPeriod, int can2_DispacherPeriod) |
||||
|
{ |
||||
|
|
||||
|
|
||||
|
GF_BSP_CANHandler_Init_CAN(&FD_CAN_1_Handler, &hfdcan1, can1_sendListPeriod, |
||||
|
can1_DispacherPeriod); |
||||
|
GF_BSP_CANHandler_Init_CAN(&FD_CAN_2_Handler, &hfdcan2, can2_sendListPeriod, |
||||
|
can2_DispacherPeriod); |
||||
|
|
||||
|
GF_BSP_Interrupt_Add_CallBack( |
||||
|
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback, GF_BSP_CAN_Timer); |
||||
|
} |
||||
|
|
||||
|
void GF_BSP_CANHandler_Init_CAN(FDCANHandler *handler, |
||||
|
FDCAN_HandleTypeDef *canfd, int sendListPeriod, int DispacherPeriod) |
||||
|
{ |
||||
|
handler->canfd = canfd; |
||||
|
handler->dispacherController = (DispacherController*) malloc( |
||||
|
sizeof(DispacherController)); |
||||
|
|
||||
|
|
||||
|
handler->dispacherController->pHead = NULL; |
||||
|
handler->dispacherController->pTail = NULL; |
||||
|
handler->dispacherController->Dispacher_Enable = 1; |
||||
|
handler->dispacherController->DispacherCallTime = DispacherPeriod ; // call the function every 50 ms
|
||||
|
handler->dispacherController->Dispacher_Counter = 0; |
||||
|
handler->dispacherController->DispacherNumber = 0; |
||||
|
handler->dispacherController->Add_Dispatcher_List = Dispatcher_List_Add_t; |
||||
|
handler->dispacherController->Dispatcher_Run = Dispatch_t; |
||||
|
|
||||
|
handler->timeSpan = 2; |
||||
|
handler->SendList_time_Count = 0; |
||||
|
handler->AddCANSendList = CANHandlerAddTxList; |
||||
|
handler->SendList_Period = sendListPeriod; |
||||
|
|
||||
|
handler->CAN_Send = CAN_Send_t; |
||||
|
handler->CAN_Send_Data = CAN_Send_Data_t; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
DispacherController *can_dispacherController; |
||||
|
HardWareController *can_HardWareController; |
||||
|
void GF_BSP_CAN_Timer() //2ms一次
|
||||
|
{ |
||||
|
can_dispacherController = FD_CAN_1_Handler.dispacherController; |
||||
|
|
||||
|
if (FD_CAN_1_Handler.pCurrentCANSendHadler != NULL) |
||||
|
{ |
||||
|
GF_CAN_Send_List_Send(&FD_CAN_1_Handler); |
||||
|
|
||||
|
} else |
||||
|
{ |
||||
|
can_dispacherController = FD_CAN_1_Handler.dispacherController; |
||||
|
can_dispacherController->Dispatcher_Run(can_dispacherController); |
||||
|
} |
||||
|
if (FD_CAN_2_Handler.pCurrentCANSendHadler != NULL) |
||||
|
{ |
||||
|
GF_CAN_Send_List_Send(&FD_CAN_2_Handler); |
||||
|
} else |
||||
|
{ |
||||
|
|
||||
|
can_dispacherController = FD_CAN_2_Handler.dispacherController; |
||||
|
can_dispacherController->Dispatcher_Run(can_dispacherController); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void GF_CAN_Send_List_Send(FDCANHandler *handler) |
||||
|
{ |
||||
|
|
||||
|
handler->SendList_time_Count++; |
||||
|
if (handler->timeSpan * handler->SendList_time_Count |
||||
|
>= handler->SendList_Period) |
||||
|
{ |
||||
|
handler->SendList_time_Count = 0; |
||||
|
handler->SendListExists = 1; |
||||
|
if (handler->pCurrentCANSendHadler != NULL) |
||||
|
{ |
||||
|
//拷贝数据到相关的代码中,然后发送
|
||||
|
|
||||
|
handler->SendFrameID=handler->pCurrentCANSendHadler->CAN_ID; |
||||
|
//handler->CAN_Decode = handler->pCurrentCANSendHadler->CAN_Decode; //
|
||||
|
memcpy(handler->Tx_Buf, handler->pCurrentCANSendHadler->Tx_Buf, |
||||
|
handler->pCurrentCANSendHadler->SendLength); |
||||
|
handler->SendList_Period=handler->pCurrentCANSendHadler->SendListTimePeriod; |
||||
|
handler->SendLength = handler->pCurrentCANSendHadler->SendLength; |
||||
|
handler->CAN_Send_Data(handler); |
||||
|
|
||||
|
if (handler->pCurrentCANSendHadler->pNext != NULL) |
||||
|
{ |
||||
|
CANSendHandler *temp = handler->pCurrentCANSendHadler->pNext; |
||||
|
free(handler->pCurrentCANSendHadler); //清除内存
|
||||
|
handler->pCurrentCANSendHadler = temp; |
||||
|
} else |
||||
|
{ |
||||
|
free(handler->pCurrentCANSendHadler); //清除内存
|
||||
|
handler->pCurrentCANSendHadler = NULL; |
||||
|
} |
||||
|
|
||||
|
} else |
||||
|
{ |
||||
|
handler->SendListExists = 0; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void CAN_Send_t(struct _FDCANHandler *fd, uint32_t FrameID, uint8_t DataLength, |
||||
|
uint8_t *Txdata) |
||||
|
{ |
||||
|
|
||||
|
Function_code=Txdata[0]; |
||||
|
|
||||
|
if (DataLength > 8) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
if (fd->canfd == &hfdcan1) |
||||
|
{ |
||||
|
TXHeader1.BitRateSwitch = FDCAN_BRS_OFF; |
||||
|
|
||||
|
#if NewCANSendVersion |
||||
|
TXHeader1.DataLength = (uint32_t) DataLength ; |
||||
|
#else |
||||
|
TXHeader1.DataLength = (uint32_t) DataLength << 16; //数据长度大于8的话会有错误
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
TXHeader1.FDFormat = FDCAN_CLASSIC_CAN; |
||||
|
TXHeader1.IdType = FDCAN_STANDARD_ID; |
||||
|
TXHeader1.Identifier = FrameID; |
||||
|
TXHeader1.TxFrameType = FDCAN_DATA_FRAME; |
||||
|
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TXHeader1, Txdata); |
||||
|
} else if (fd->canfd == &hfdcan2) |
||||
|
{ |
||||
|
TXHeader2.BitRateSwitch = FDCAN_BRS_OFF; |
||||
|
|
||||
|
#if NewCANSendVersion |
||||
|
TXHeader2.DataLength = (uint32_t) DataLength ; |
||||
|
#else |
||||
|
TXHeader2.DataLength = (uint32_t) DataLength << 16; //数据长度大于8的话会有错误
|
||||
|
#endif |
||||
|
//TXHeader2.DataLength = (uint32_t) DataLength << 16; //数据长度大于8的话会有错误
|
||||
|
TXHeader2.FDFormat = FDCAN_CLASSIC_CAN; |
||||
|
TXHeader2.IdType = FDCAN_STANDARD_ID; |
||||
|
TXHeader2.Identifier = FrameID; |
||||
|
TXHeader2.TxFrameType = FDCAN_DATA_FRAME; |
||||
|
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TXHeader2, Txdata); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void CAN_Send_Data_t(struct _FDCANHandler *fd) |
||||
|
{ |
||||
|
CAN_Send_t(fd, fd->SendFrameID, fd->SendLength, fd->Tx_Buf); |
||||
|
} |
||||
|
|
||||
|
void CANHandlerAddTxList(FDCANHandler *handler, uint32_t CAN_ID, |
||||
|
uint8_t SendLength, uint8_t *Tx_Buf,uint32_t sendListTimePeriod, |
||||
|
void (*CAN_Decode)(uint32_t, uint8_t*, uint32_t)) |
||||
|
{ |
||||
|
|
||||
|
CANSendHandler *pTmp = NULL; //临时指针
|
||||
|
|
||||
|
//临时指针2用于逐个申请内存
|
||||
|
pTmp = (CANSendHandler*) malloc(sizeof(CANSendHandler)); |
||||
|
memcpy(pTmp->Tx_Buf, Tx_Buf, SendLength); |
||||
|
pTmp->pNext = NULL; |
||||
|
pTmp->CAN_ID=CAN_ID; |
||||
|
pTmp->SendLength = SendLength; |
||||
|
//pTmp->CAN_Decode = CAN_Decode;
|
||||
|
pTmp->SendListTimePeriod=sendListTimePeriod; |
||||
|
|
||||
|
|
||||
|
//if NULL, call intialize one
|
||||
|
if (handler->pCurrentCANSendHadler == NULL) |
||||
|
{ |
||||
|
handler->pCurrentCANSendHadler = pTmp; //空链表
|
||||
|
} else |
||||
|
{ |
||||
|
char i = 0; |
||||
|
//插到尾部
|
||||
|
CANSendHandler *phead = NULL; |
||||
|
phead = handler->pCurrentCANSendHadler; |
||||
|
while (phead->pNext != NULL) |
||||
|
{ |
||||
|
i++; |
||||
|
phead = phead->pNext; |
||||
|
} |
||||
|
phead->pNext = pTmp; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
@ -0,0 +1,100 @@ |
|||||
|
/*
|
||||
|
* bsp_GPIO.c |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
#include "bsp_GPIO.h" |
||||
|
|
||||
|
uint8_t GF_BSP_GPIO_Init() |
||||
|
{ |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
void GF_BSP_GPIO_SetIO(uint8_t IO_Index,uint8_t Level) |
||||
|
{ |
||||
|
GPIO_PinState PinState; |
||||
|
if(Level == 0) |
||||
|
PinState=GPIO_PIN_RESET; |
||||
|
else |
||||
|
PinState=GPIO_PIN_SET; |
||||
|
|
||||
|
switch(IO_Index) |
||||
|
{ |
||||
|
case 0: |
||||
|
HAL_GPIO_WritePin(OUT_0_GPIO_Port, OUT_0_Pin, PinState); |
||||
|
break; |
||||
|
case 1: |
||||
|
HAL_GPIO_WritePin(OUT_1_GPIO_Port, OUT_1_Pin, PinState); |
||||
|
break; |
||||
|
case 2: |
||||
|
HAL_GPIO_WritePin(OUT_2_GPIO_Port, OUT_2_Pin, PinState); |
||||
|
break; |
||||
|
case 3: |
||||
|
HAL_GPIO_WritePin(OUT_3_GPIO_Port, OUT_3_Pin, PinState); |
||||
|
break; |
||||
|
case 4: |
||||
|
HAL_GPIO_WritePin(OUT_4_GPIO_Port, OUT_4_Pin, PinState); |
||||
|
break; |
||||
|
case 5: |
||||
|
HAL_GPIO_WritePin(OUT_5_GPIO_Port, OUT_5_Pin, PinState); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
uint8_t GF_BSP_GPIO_ToggleIO(uint8_t IO_Index) |
||||
|
{ |
||||
|
|
||||
|
switch(IO_Index) |
||||
|
{ |
||||
|
case 0: |
||||
|
HAL_GPIO_TogglePin(OUT_0_GPIO_Port, OUT_0_Pin); |
||||
|
break; |
||||
|
case 1: |
||||
|
HAL_GPIO_TogglePin(OUT_1_GPIO_Port, OUT_1_Pin); |
||||
|
break; |
||||
|
case 2: |
||||
|
HAL_GPIO_TogglePin(OUT_2_GPIO_Port, OUT_2_Pin); |
||||
|
break; |
||||
|
case 3: |
||||
|
HAL_GPIO_TogglePin(OUT_3_GPIO_Port, OUT_3_Pin); |
||||
|
break; |
||||
|
case 4: |
||||
|
HAL_GPIO_TogglePin(OUT_4_GPIO_Port, OUT_4_Pin); |
||||
|
break; |
||||
|
case 5: |
||||
|
HAL_GPIO_TogglePin(OUT_5_GPIO_Port, OUT_5_Pin); |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
uint8_t GF_BSP_GPIO_ReadIO(uint8_t IO_Index) |
||||
|
{ |
||||
|
GPIO_PinState PinState; |
||||
|
switch(IO_Index) |
||||
|
{ |
||||
|
case 0: |
||||
|
PinState = HAL_GPIO_ReadPin(IN_0_GPIO_Port, IN_0_Pin); |
||||
|
break; |
||||
|
case 1: |
||||
|
PinState = HAL_GPIO_ReadPin(IN_1_GPIO_Port, IN_1_Pin); |
||||
|
break; |
||||
|
case 2: |
||||
|
PinState = HAL_GPIO_ReadPin(IN_2_GPIO_Port, IN_2_Pin); |
||||
|
break; |
||||
|
case 3: |
||||
|
PinState = HAL_GPIO_ReadPin(IN_3_GPIO_Port, IN_3_Pin); |
||||
|
break; |
||||
|
case 4: |
||||
|
PinState = HAL_GPIO_ReadPin(IN_4_GPIO_Port, IN_4_Pin); |
||||
|
break; |
||||
|
case 5: |
||||
|
PinState = HAL_GPIO_ReadPin(IN_5_GPIO_Port, IN_5_Pin); |
||||
|
break; |
||||
|
} |
||||
|
return((uint8_t)PinState); |
||||
|
} |
||||
@ -0,0 +1,41 @@ |
|||||
|
/*
|
||||
|
* bsp_INTERCALL.c |
||||
|
* |
||||
|
* Created on: 2023年11月8日 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
#include "bsp_include.h" |
||||
|
|
||||
|
typedef struct |
||||
|
{ |
||||
|
uint8_t num; //调用函数指针数量
|
||||
|
void(*fn[DF_BSP_InterCall_Num])(void); //被调用函数指针,最多20个回调函数
|
||||
|
}SD_BSP_InterCall; |
||||
|
|
||||
|
SD_BSP_InterCall V_BSP_InterCall_Array[DF_BSP_InterCall_Type_Num] = {0}; |
||||
|
|
||||
|
//给中断函数链接一个回调函数,直接添加空函数指针
|
||||
|
//返回值1表示添加成功,返回值0表示添加失败
|
||||
|
uint8_t GF_BSP_Interrupt_Add_CallBack(enum DF_BSP_InterCall_Type _type,void(*_fn)(void)) |
||||
|
{ |
||||
|
V_BSP_InterCall_Array[_type].num++; |
||||
|
if(V_BSP_InterCall_Array[_type].num>=DF_BSP_InterCall_Num) |
||||
|
{ |
||||
|
return 0; |
||||
|
} |
||||
|
V_BSP_InterCall_Array[_type].fn[V_BSP_InterCall_Array[_type].num-1]=_fn; |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
//放到中断函数中,运行相应的回调函数,有几个运行几个
|
||||
|
void GF_BSP_Interrupt_Run_CallBack(enum DF_BSP_InterCall_Type _type) |
||||
|
{ |
||||
|
uint8_t i=0; |
||||
|
if(V_BSP_InterCall_Array[_type].num>0) |
||||
|
{ |
||||
|
for(i=0;i<V_BSP_InterCall_Array[_type].num;i++) |
||||
|
{ |
||||
|
(*(V_BSP_InterCall_Array[_type].fn[i]))(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,372 @@ |
|||||
|
#include "bsp_MB_host.h" |
||||
|
#include "stdio.h" |
||||
|
#include "bsp_UART.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
//__IO uint8_t Rx_Buf[256]; // 接收缓存,最大256字节
|
||||
|
__IO uint8_t Tx_Buf[256]; // 发送缓存,最大256字节
|
||||
|
__IO uint8_t tmp_Rx_Buf; // 临时接收缓存
|
||||
|
__IO uint16_t RxCount = 0; // 接收字符计数
|
||||
|
|
||||
|
uint8_t MB_rx_flag = 0; |
||||
|
uint16_t Read_Reg_Num; |
||||
|
uint8_t Read_Slave_ID = 0; |
||||
|
|
||||
|
/* 私有类型定义 --------------------------------------------------------------*/ |
||||
|
/* 私有宏定义 ----------------------------------------------------------------*/ |
||||
|
/* 私有变量 ------------------------------------------------------------------*/ |
||||
|
|
||||
|
// CRC 高位字节值表
|
||||
|
static const uint8_t auchCRCHi[] = |
||||
|
{ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, |
||||
|
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, |
||||
|
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, |
||||
|
0xC1, 0x81, 0x40 }; |
||||
|
// CRC 低位字节值表
|
||||
|
static const uint8_t auchCRCLo[] = |
||||
|
{ 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, |
||||
|
0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, |
||||
|
0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, |
||||
|
0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, |
||||
|
0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, |
||||
|
0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, |
||||
|
0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, |
||||
|
0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, |
||||
|
0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, |
||||
|
0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, |
||||
|
0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, |
||||
|
0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, |
||||
|
0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, |
||||
|
0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, |
||||
|
0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, |
||||
|
0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, |
||||
|
0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, |
||||
|
0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, |
||||
|
0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, |
||||
|
0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, |
||||
|
0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, |
||||
|
0x81, 0x80, 0x40 }; |
||||
|
|
||||
|
/**
|
||||
|
* 函数功能: Modbus CRC16 校验计算函数 |
||||
|
* 输入参数: pushMsg:待计算的数据首地址,usDataLen:数据长度 |
||||
|
* 返 回 值: CRC16 计算结果 |
||||
|
* 说 明: 计算结果是高位在前,需要转换才能发送 |
||||
|
*/ |
||||
|
uint16_t MB_CRC16(uint8_t *pushMsg, uint16_t usDataLen) |
||||
|
{ |
||||
|
uint8_t uchCRCHi = 0xFF; |
||||
|
uint8_t uchCRCLo = 0xFF; |
||||
|
uint16_t uIndex; |
||||
|
while (usDataLen--) |
||||
|
{ |
||||
|
uIndex = uchCRCLo ^ *pushMsg++; |
||||
|
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex]; |
||||
|
uchCRCHi = auchCRCLo[uIndex]; |
||||
|
} |
||||
|
return (uchCRCHi << 8 | uchCRCLo); |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* 函数功能: 读N个线圈状态(CoilStatue) |
||||
|
* 输入参数: _addr:从站地址,_reg:寄存器地址,_num:待读取的数量 |
||||
|
* 返 回 值: 无 |
||||
|
* 说 明: 填充数据发送缓存区,然后发送 |
||||
|
*/ |
||||
|
void MB_ReadCoil(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _num) |
||||
|
{ |
||||
|
uint16_t TxCount = 0; |
||||
|
|
||||
|
uint16_t crc = 0; |
||||
|
Tx_Buf[TxCount++] = _addr; /* 从站地址 */ |
||||
|
Tx_Buf[TxCount++] = 0x01; /* 功能码 */ |
||||
|
Tx_Buf[TxCount++] = _reg >> 8; /* 寄存器地址 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _reg; /* 寄存器地址 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _num >> 8; /* 线圈(bit)个数 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _num; /* 线圈(bit)个数 低字节 */ |
||||
|
|
||||
|
crc = MB_CRC16(Tx_Buf, TxCount); |
||||
|
Tx_Buf[TxCount++] = crc; /* crc 低字节 */ |
||||
|
Tx_Buf[TxCount++] = crc >> 8; /* crc 高字节 */ |
||||
|
*TxCount_t = TxCount; |
||||
|
//uartHandler->UART_Tx(uartHandler,(uint8_t *)&Tx_Buf,TxCount);
|
||||
|
//UART_Tx((uint8_t *)&Tx_Buf,TxCount);
|
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* 函数功能: 写单个线圈状态(CoilStatue) |
||||
|
* 输入参数: _addr:从站地址,_reg:寄存器地址,_sta:待写入的线圈状态(0,1) |
||||
|
* 返 回 值: 无 |
||||
|
* 说 明: 填充数据发送缓存区,然后发送 |
||||
|
*/ |
||||
|
void MB_WriteCoil(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _sta) |
||||
|
{ |
||||
|
uint16_t TxCount = 0; |
||||
|
uint16_t crc = 0; |
||||
|
Tx_Buf[TxCount++] = _addr; /* 从站地址 */ |
||||
|
Tx_Buf[TxCount++] = 0x05; /* 功能码 */ |
||||
|
Tx_Buf[TxCount++] = _reg >> 8; /* 寄存器地址 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _reg; /* 寄存器地址 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _sta >> 8; /* 线圈(bit)个数 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _sta; /* 线圈(bit)个数 低字节 */ |
||||
|
|
||||
|
|
||||
|
|
||||
|
crc = MB_CRC16(Tx_Buf, TxCount); |
||||
|
Tx_Buf[TxCount++] = crc; /* crc 低字节 */ |
||||
|
Tx_Buf[TxCount++] = crc >> 8; /* crc 高字节 */ |
||||
|
*TxCount_t = TxCount; |
||||
|
|
||||
|
//UART_Tx((uint8_t *)&Tx_Buf,TxCount);
|
||||
|
|
||||
|
//uartHandler->UART_Tx(uartHandler,(uint8_t *)&Tx_Buf,TxCount);
|
||||
|
} |
||||
|
|
||||
|
void MB_WriteNumCoil(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _num, uint8_t *_databuf) |
||||
|
{ |
||||
|
|
||||
|
uint16_t i; |
||||
|
uint16_t TxCount = 0; |
||||
|
uint16_t crc = 0; |
||||
|
Tx_Buf[TxCount++] = _addr; /* 从站地址 */ |
||||
|
Tx_Buf[TxCount++] = 0x0F; /* 功能码 */ |
||||
|
Tx_Buf[TxCount++] = _reg >> 8; /* 寄存器地址 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _reg; /* 寄存器地址 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _num >> 8; /* 寄存器(16bits)个数 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _num; /* 低字节 */ |
||||
|
|
||||
|
if(_num%8==0) |
||||
|
{ |
||||
|
Tx_Buf[TxCount++] = _num / 8; |
||||
|
}else |
||||
|
{ |
||||
|
Tx_Buf[TxCount++] = _num / 8 + 1; |
||||
|
} |
||||
|
/* 数据个数 */ |
||||
|
uint16_t ij=TxCount++; |
||||
|
for (i = 0; i < _num; i++) |
||||
|
{ |
||||
|
Tx_Buf[ij]|= _databuf[i]<<i; /* 后面的数据长度 */ |
||||
|
} |
||||
|
crc = MB_CRC16(Tx_Buf, TxCount); |
||||
|
Tx_Buf[TxCount++] = crc; /* crc 低字节 */ |
||||
|
Tx_Buf[TxCount++] = crc >> 8; /* crc 高字节 */ |
||||
|
//UART_Tx((uint8_t *)&Tx_Buf,TxCount);
|
||||
|
*TxCount_t = TxCount; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/**
|
||||
|
* 函数功能: 读输入状态状态(InputStatue) |
||||
|
* 输入参数: _addr:从站地址,_reg:寄存器地址,_num:待读取的输入数量 |
||||
|
* 返 回 值: 无 |
||||
|
* 说 明: 填充数据发送缓存区,然后发送 |
||||
|
*/ |
||||
|
void MB_ReadInput(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _num) |
||||
|
{ |
||||
|
uint16_t TxCount = 0; |
||||
|
uint16_t crc = 0; |
||||
|
Tx_Buf[TxCount++] = _addr; /* 从站地址 */ |
||||
|
Tx_Buf[TxCount++] = 0x02; /* 功能码 */ |
||||
|
Tx_Buf[TxCount++] = _reg >> 8; /* 寄存器地址 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _reg; /* 寄存器地址 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _num >> 8; /* 开关(Input)个数 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _num; /* 开关(Input)个数 低字节 */ |
||||
|
|
||||
|
crc = MB_CRC16(Tx_Buf, TxCount); |
||||
|
Tx_Buf[TxCount++] = crc; /* crc 低字节 */ |
||||
|
Tx_Buf[TxCount++] = crc >> 8; /* crc 高字节 */ |
||||
|
*TxCount_t = TxCount; |
||||
|
//UART_Tx((uint8_t *)&Tx_Buf,TxCount);
|
||||
|
//uartHandler->UART_Tx(uartHandler,(uint8_t *)&Tx_Buf,TxCount);
|
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* 函数功能: 读保持寄存器(HoldingRegister) |
||||
|
* 输入参数: _addr:从站地址,_reg:寄存器地址,_num:待读取的寄存器数量 |
||||
|
* 返 回 值: 无 |
||||
|
* 说 明: 填充数据发送缓存区,然后发送 |
||||
|
*/ |
||||
|
void MB_ReadHoldingReg(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _num) |
||||
|
{ |
||||
|
MB_rx_flag = 2; |
||||
|
Read_Reg_Num = _num; |
||||
|
Read_Slave_ID = _addr; |
||||
|
|
||||
|
uint16_t TxCount = 0; |
||||
|
uint16_t crc = 0; |
||||
|
Tx_Buf[TxCount++] = _addr; /* 从站地址 */ |
||||
|
Tx_Buf[TxCount++] = 0x03; /* 功能码 */ |
||||
|
Tx_Buf[TxCount++] = _reg >> 8; /* 寄存器地址 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _reg; /* 寄存器地址 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _num >> 8; /* 寄存器(16bits)个数 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _num; /* 低字节 */ |
||||
|
|
||||
|
crc = MB_CRC16(Tx_Buf, TxCount); |
||||
|
Tx_Buf[TxCount++] = crc; /* crc 低字节 */ |
||||
|
Tx_Buf[TxCount++] = crc >> 8; /* crc 高字节 */ |
||||
|
|
||||
|
*TxCount_t = TxCount; |
||||
|
//UART_Tx((uint8_t *)&Tx_Buf,TxCount);
|
||||
|
//uartHandler->UART_Tx(uartHandler,(uint8_t *)&Tx_Buf,TxCount);
|
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* 函数功能: 读N个输入寄存器(InputRegister) |
||||
|
* 输入参数: _addr:从站地址,_reg:寄存器地址,_num:待读取的寄存器数量 |
||||
|
* 返 回 值: 无 |
||||
|
* 说 明: 填充数据发送缓存区,然后发送. |
||||
|
*/ |
||||
|
void MB_ReadInputReg(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _num) |
||||
|
{ |
||||
|
uint16_t TxCount = 0; |
||||
|
uint16_t crc = 0; |
||||
|
Tx_Buf[TxCount++] = _addr; /* 从站地址 */ |
||||
|
Tx_Buf[TxCount++] = 0x04; /* 功能码 */ |
||||
|
Tx_Buf[TxCount++] = _reg >> 8; /* 寄存器地址 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _reg; /* 寄存器地址 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _num >> 8; /* 寄存器(16bits)个数 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _num; /* 低字节 */ |
||||
|
|
||||
|
crc = MB_CRC16(Tx_Buf, TxCount); |
||||
|
Tx_Buf[TxCount++] = crc; /* crc 低字节 */ |
||||
|
Tx_Buf[TxCount++] = crc >> 8; /* crc 高字节 */ |
||||
|
*TxCount_t = TxCount; |
||||
|
//UART_Tx((uint8_t *)&Tx_Buf,TxCount);
|
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* 函数功能: 写单个保持寄存器(HoldingRegister) |
||||
|
* 输入参数: _addr:从站地址,_reg:寄存器地址,_data:待写入的寄存器数据 |
||||
|
* 返 回 值: 无 |
||||
|
* 说 明: 填充数据发送缓存区,然后发送 |
||||
|
*/ |
||||
|
void MB_WriteHoldingReg(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _data) |
||||
|
{ |
||||
|
uint16_t TxCount = 0; |
||||
|
uint16_t crc = 0; |
||||
|
Tx_Buf[TxCount++] = _addr; /* 从站地址 */ |
||||
|
Tx_Buf[TxCount++] = 0x06; /* 功能码 */ |
||||
|
Tx_Buf[TxCount++] = _reg >> 8; /* 寄存器地址 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _reg; /* 寄存器地址 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _data >> 8; /* 寄存器(16bits)个数 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _data; /* 低字节 */ |
||||
|
|
||||
|
crc = MB_CRC16(Tx_Buf, TxCount); |
||||
|
Tx_Buf[TxCount++] = crc; /* crc 低字节 */ |
||||
|
Tx_Buf[TxCount++] = crc >> 8; /* crc 高字节 */ |
||||
|
*TxCount_t = TxCount; |
||||
|
//UART_Tx((uint8_t *)&Tx_Buf,TxCount);
|
||||
|
//uartHandler->UART_Tx(uartHandler,(uint8_t *)&Tx_Buf,TxCount);
|
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* 函数功能: 写N个保持寄存器(HoldingRegister) |
||||
|
* 输入参数: _addr:从站地址,_reg:寄存器地址,_num:待写入的寄存器数量,_databuf:待写入的寄存器数据 |
||||
|
* 返 回 值: 无 |
||||
|
* 说 明: 填充数据发送缓存区,然后发送._databuf的长度需 >= _num*2 |
||||
|
*/ |
||||
|
void MB_WriteNumHoldingReg(uint8_t *Tx_Buf, uint8_t *TxCount_t, uint8_t _addr, |
||||
|
uint16_t _reg, uint16_t _num, uint8_t *_databuf) |
||||
|
{ |
||||
|
|
||||
|
uint16_t i; |
||||
|
uint16_t TxCount = 0; |
||||
|
uint16_t crc = 0; |
||||
|
Tx_Buf[TxCount++] = _addr; /* 从站地址 */ |
||||
|
Tx_Buf[TxCount++] = 0x10; /* 功能码 */ |
||||
|
Tx_Buf[TxCount++] = _reg >> 8; /* 寄存器地址 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _reg; /* 寄存器地址 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _num >> 8; /* 寄存器(16bits)个数 高字节 */ |
||||
|
Tx_Buf[TxCount++] = _num; /* 低字节 */ |
||||
|
Tx_Buf[TxCount++] = _num << 1; /* 数据个数 */ |
||||
|
|
||||
|
for (i = 0; i < 2 * _num; i++) |
||||
|
{ |
||||
|
Tx_Buf[TxCount++] = _databuf[i]; /* 后面的数据长度 */ |
||||
|
} |
||||
|
crc = MB_CRC16(Tx_Buf, TxCount); |
||||
|
Tx_Buf[TxCount++] = crc; /* crc 低字节 */ |
||||
|
Tx_Buf[TxCount++] = crc >> 8; /* crc 高字节 */ |
||||
|
//UART_Tx((uint8_t *)&Tx_Buf,TxCount);
|
||||
|
*TxCount_t = TxCount; |
||||
|
} |
||||
|
/**
|
||||
|
* 函数功能: 解析读取Read_Reg_Num个保持寄存器的值 (HoldingRegister) |
||||
|
* 输入参数: buffer:数据值,length:数据长度, Read_Reg_Num 读取几个保持寄存器, 将解析出来的数据存入 Decoded_Reg_Value 这个16进制的数据中 |
||||
|
* 返 回 值: 1 表示解析正确,0 表示解析错误 CRC验证错误 |
||||
|
* 说 明: |
||||
|
*/ |
||||
|
uint8_t MB_Decode_HoldingRegs(uint8_t buffer[], uint16_t length,uint16_t Read_Reg_Num,uint16_t* Decoded_Reg_Value) |
||||
|
{ |
||||
|
/* CRC 校验 */ |
||||
|
uint16_t crc_check = ((buffer[length - 1] << 8) | buffer[length - 2]); |
||||
|
/* CRC 校验正确 */ |
||||
|
if (crc_check == MB_CRC16(buffer, length - 2)) |
||||
|
{ |
||||
|
int i = 0; |
||||
|
for (i = 0; i < Read_Reg_Num; i++) |
||||
|
{ |
||||
|
|
||||
|
Decoded_Reg_Value[ i] = |
||||
|
(buffer[3 + 2 * i] << 8) + buffer[4 + 2 * i]; |
||||
|
} |
||||
|
return 1; //Decoded successfully
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
return 0; //Decode Error;
|
||||
|
} |
||||
|
} |
||||
|
uint8_t MB_Decode_InputRegs(uint8_t buffer[], uint16_t length,uint16_t Read_Reg_Num,uint16_t* Decoded_Reg_Value) |
||||
|
{ |
||||
|
/* CRC 校验 */ |
||||
|
uint16_t crc_check = ((buffer[length - 1] << 8) | buffer[length - 2]); |
||||
|
/* CRC 校验正确 */ |
||||
|
if (crc_check == MB_CRC16(buffer, length - 2)) |
||||
|
{ |
||||
|
int i = 0; |
||||
|
for (i = 0; i < Read_Reg_Num; i++) |
||||
|
{ |
||||
|
|
||||
|
Decoded_Reg_Value[ i] = |
||||
|
(buffer[3 + 2 * i] << 8) + buffer[4 + 2 * i]; |
||||
|
} |
||||
|
return 1; //Decoded successfully
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
|
||||
|
return 0; //Decode Error;
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
@ -0,0 +1,68 @@ |
|||||
|
/*
|
||||
|
* bsp_TIMER.c |
||||
|
* |
||||
|
* Created on: Oct 26, 2023 |
||||
|
* Author: shiya |
||||
|
*/ |
||||
|
#include "bsp_TIMER.h" |
||||
|
|
||||
|
#include "bsp_mqtt.h" |
||||
|
//返回值::1-正常;0-错误
|
||||
|
uint8_t GF_BSP_TIMER_Init() |
||||
|
{ |
||||
|
HAL_TIM_Base_Start_IT(&htim1); |
||||
|
HAL_TIM_Base_Start_IT(&htim8); |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
||||
|
{ |
||||
|
//100ms - WatchDog
|
||||
|
if(htim->Instance == TIM1)//APB2=200Mhz,htim1.Init.Prescaler = 2000-1;htim1.Init.Period = 10000-1; TIM1=100ms
|
||||
|
{ |
||||
|
GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_TIM1_100ms_PeriodElapsedCallback); |
||||
|
|
||||
|
} |
||||
|
//2ms - MainLoop
|
||||
|
if(htim->Instance == TIM8)//APB2=200Mhz,htim8.Init.Prescaler = 2000-1;htim8.Init.Period = 200-1; TIM8=2ms
|
||||
|
{ |
||||
|
GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback); |
||||
|
//bsp_mqtt_test();
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void GF_BSP_TIMER_DelayUS(uint32_t n) |
||||
|
{ |
||||
|
uint32_t ticks; |
||||
|
uint32_t told; |
||||
|
uint32_t tnow; |
||||
|
uint32_t tcnt = 0; |
||||
|
uint32_t reload; |
||||
|
|
||||
|
reload = SysTick->LOAD; |
||||
|
ticks = n * (SystemCoreClock / 1000000); |
||||
|
|
||||
|
tcnt = 0; |
||||
|
told = SysTick->VAL; |
||||
|
|
||||
|
while (1) |
||||
|
{ |
||||
|
tnow = SysTick->VAL; |
||||
|
if (tnow != told) |
||||
|
{ |
||||
|
if (tnow < told) |
||||
|
{ |
||||
|
tcnt += told - tnow; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
tcnt += reload - tnow + told; |
||||
|
} |
||||
|
told = tnow; |
||||
|
if (tcnt >= ticks) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,636 @@ |
|||||
|
#include "bsp_UART.h" |
||||
|
#include "main.h" |
||||
|
#include <stdlib.h> |
||||
|
#include "DLT/DLTuc.h" |
||||
|
void GF_UART_Send_List_Send(struct UARTHandler *handler); |
||||
|
void Dispatcher_List_Add(struct UARTHandler *uartHandler, |
||||
|
void (*dispache)(void)); |
||||
|
|
||||
|
|
||||
|
|
||||
|
void UARTHandlerAddTxList(struct UARTHandler *uartHandler, uint8_t *data, |
||||
|
uint16_t length, uint32_t txListTimePeriod, void (*UART_Decode)(uint8_t*, uint16_t)); |
||||
|
|
||||
|
//Store all the data in these buffer
|
||||
|
uint8_t RS485_1_RxMA_buf[UART_Receive_MAX_NUM]; |
||||
|
uint8_t RS485_2_RxDMA_buf[UART_Receive_MAX_NUM]; |
||||
|
uint8_t RS485_3_RxDMA_buf[UART_Receive_MAX_NUM]; |
||||
|
uint8_t RS485_4_RxDMA_buf[UART_Receive_MAX_NUM]; |
||||
|
uint8_t Debug_RxDMA_buf[UART_Receive_MAX_NUM]; |
||||
|
uint8_t ExternSerial_RxDMA_buf[UART_Receive_MAX_NUM]; |
||||
|
|
||||
|
uint8_t RS485_1_TxDMA_buf[UART_Transmit_MAX_NUM]; |
||||
|
uint8_t RS485_2_TxDMA_buf[UART_Transmit_MAX_NUM]; |
||||
|
uint8_t RS485_3_TxDMA_buf[UART_Transmit_MAX_NUM]; |
||||
|
uint8_t RS485_4_TxDMA_buf[UART_Transmit_MAX_NUM]; |
||||
|
uint8_t Debug_TxDMA_buf[UART_Transmit_MAX_NUM]; |
||||
|
uint8_t ExternSerial_TxDMA_buf[UART_Transmit_MAX_NUM]; |
||||
|
#define InterCall_DEBUG_UART huart4 |
||||
|
#define E28_SBUS_UART huart5 |
||||
|
#define RS485_4_UART huart7 |
||||
|
#define RS485_1_UART huart1 |
||||
|
#define LTE_7S0_Serial_UART huart2 |
||||
|
|
||||
|
|
||||
|
#define RS485_2_UART huart3 |
||||
|
#define RS485_3_UART huart6 |
||||
|
|
||||
|
|
||||
|
struct UARTHandler RS_485_1_UART_Handler; |
||||
|
struct UARTHandler RS_485_2_UART_Handler; |
||||
|
struct UARTHandler RS_485_3_UART_Handler; |
||||
|
struct UARTHandler RS_485_4_UART_Handler; |
||||
|
struct UARTHandler InterCall_DEBUG_UART_Handler; |
||||
|
struct UARTHandler E28_SBUS_UART_Handler; |
||||
|
struct UARTHandler LTE_7S0_Serial_UART_Handler; |
||||
|
|
||||
|
|
||||
|
|
||||
|
#if defined (hlpuart1Exit) |
||||
|
|
||||
|
#define LPUART1UART hlpuart1 |
||||
|
struct UARTHandler LPUART1_UART_Handler; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
void GF_BSP_UARTHandlers_Intialize( |
||||
|
int32_t RS485_1_WaitTime, |
||||
|
int32_t RS485_2_WaitTime, |
||||
|
int32_t RS485_3_WaitTime, |
||||
|
int32_t RS485_4_WaitTime, |
||||
|
int32_t LTE_7S0_Serial_WaitTime, |
||||
|
int32_t InterCall_DEBUG_WaitTime, |
||||
|
int32_t E28_SBUS_WaitTime, |
||||
|
int32_t LPUART1_UART_WaitTime, |
||||
|
int32_t RS485_1_Dispacher_Time, |
||||
|
int32_t RS485_2_Dispacher_Time, |
||||
|
int32_t RS485_3_Dispacher_Time, |
||||
|
int32_t RS485_4_Dispacher_Time, |
||||
|
int32_t LTE_7S0_Serial_Dispacher_Time, |
||||
|
int32_t InterCall_DEBUG_Dispacher_Time, |
||||
|
int32_t E28_SBUS_Dispacher_Time, |
||||
|
int32_t LPUART1_UART_Dispacher_Time |
||||
|
) |
||||
|
{ |
||||
|
|
||||
|
IntializeUARTHandler(&RS_485_1_UART_Handler, &RS485_1_UART, RS485_1_WaitTime, 2,RS485_1_Dispacher_Time); |
||||
|
IntializeUARTHandler(&RS_485_2_UART_Handler, &RS485_2_UART, RS485_2_WaitTime, 2,RS485_2_Dispacher_Time); |
||||
|
IntializeUARTHandler(&RS_485_3_UART_Handler, &RS485_3_UART, RS485_3_WaitTime, 2,RS485_3_Dispacher_Time); |
||||
|
IntializeUARTHandler(&RS_485_4_UART_Handler, &RS485_4_UART, RS485_4_WaitTime, 2,RS485_4_Dispacher_Time); |
||||
|
IntializeUARTHandler(<E_7S0_Serial_UART_Handler, <E_7S0_Serial_UART, LTE_7S0_Serial_WaitTime, 2,LTE_7S0_Serial_Dispacher_Time); |
||||
|
IntializeUARTHandler(&InterCall_DEBUG_UART_Handler, &InterCall_DEBUG_UART, InterCall_DEBUG_WaitTime, 2,InterCall_DEBUG_Dispacher_Time); |
||||
|
IntializeUARTHandler(&E28_SBUS_UART_Handler, &E28_SBUS_UART, E28_SBUS_WaitTime, 2,E28_SBUS_Dispacher_Time); |
||||
|
|
||||
|
|
||||
|
HAL_UART_Receive_IT((E28_SBUS_UART_Handler.uart), |
||||
|
(uint8_t*) &E28_SBUS_UART_Handler.tmp_Rx_Buf, 1); |
||||
|
|
||||
|
|
||||
|
HAL_UART_Receive_IT((InterCall_DEBUG_UART_Handler.uart), |
||||
|
(uint8_t*) &InterCall_DEBUG_UART_Handler.tmp_Rx_Buf, 1); |
||||
|
HAL_UART_Receive_IT((RS_485_1_UART_Handler.uart), |
||||
|
(uint8_t*) &RS_485_1_UART_Handler.tmp_Rx_Buf, 1); |
||||
|
|
||||
|
HAL_UART_Receive_IT((RS_485_2_UART_Handler.uart), |
||||
|
(uint8_t*) &RS_485_2_UART_Handler.tmp_Rx_Buf, 1); |
||||
|
|
||||
|
HAL_UART_Receive_IT((RS_485_3_UART_Handler.uart), |
||||
|
(uint8_t*) &RS_485_3_UART_Handler.tmp_Rx_Buf, 1); |
||||
|
|
||||
|
HAL_UART_Receive_IT((RS_485_4_UART_Handler.uart), |
||||
|
(uint8_t*) &RS_485_4_UART_Handler.tmp_Rx_Buf, 1); |
||||
|
|
||||
|
HAL_UART_Receive_IT((LTE_7S0_Serial_UART_Handler.uart), |
||||
|
(uint8_t*) <E_7S0_Serial_UART_Handler.tmp_Rx_Buf, 1); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#if defined (hlpuart1Exit) |
||||
|
IntializeUARTHandler(&LPUART1_UART_Handler, &LPUART1UART, LPUART1_UART_WaitTime, 2,LPUART1_UART_Dispacher_Time); //10ms 剩余2ms
|
||||
|
HAL_UART_Receive_IT((LPUART1_UART_Handler.uart), |
||||
|
(uint8_t*) &LPUART1_UART_Handler.tmp_Rx_Buf, 1); |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
GF_BSP_Interrupt_Add_CallBack( |
||||
|
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback, GF_BSP_UART_Timer); |
||||
|
|
||||
|
//RS_485_2_UART_Handler.send_finished=1;
|
||||
|
} |
||||
|
//Count Every 2 ms
|
||||
|
void GF_BSP_UART_Timer() |
||||
|
{ |
||||
|
Counting(&RS_485_1_UART_Handler); |
||||
|
Counting(&RS_485_2_UART_Handler); |
||||
|
Counting(&RS_485_3_UART_Handler); |
||||
|
Counting(&RS_485_4_UART_Handler); |
||||
|
Counting(<E_7S0_Serial_UART_Handler); |
||||
|
Counting(&InterCall_DEBUG_UART_Handler); |
||||
|
Counting(&E28_SBUS_UART_Handler); |
||||
|
|
||||
|
#if defined (hlpuart1Exit) |
||||
|
Counting(&LPUART1_UART_Handler); |
||||
|
#endif |
||||
|
|
||||
|
// RS_485_1_UART_Handler.Dispatcher_Run(&RS_485_1_UART_Handler);
|
||||
|
// RS_485_2_UART_Handler.Dispatcher_Run(&RS_485_2_UART_Handler);
|
||||
|
// RS_485_3_UART_Handler.Dispatcher_Run(&RS_485_3_UART_Handler);
|
||||
|
// RS_485_4_UART_Handler.Dispatcher_Run(&RS_485_4_UART_Handler);
|
||||
|
// E22_Serial_UART_Handler.Dispatcher_Run(&E22_Serial_UART_Handler);
|
||||
|
// InterCall_DEBUG_UART_Handler.Dispatcher_Run(&InterCall_DEBUG_UART_Handler);
|
||||
|
// InterCall_DEBUG_UART_Handler.Dispatcher_Run(&InterCall_DEBUG_UART_Handler);
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
void UARTHandlerAddTxList(struct UARTHandler *uartHandler, uint8_t *data, |
||||
|
uint16_t length, uint32_t txListTimePeriod, void (*UART_Decode)(uint8_t*, uint16_t)) |
||||
|
{ |
||||
|
|
||||
|
UARTSendHandler *pTmp = NULL; //临时指针
|
||||
|
//临时指针2用于逐个申请内存
|
||||
|
pTmp = (UARTSendHandler*) malloc(sizeof(UARTSendHandler)); |
||||
|
memcpy(pTmp->Tx_Buf, data, length); |
||||
|
pTmp->pNext = NULL; |
||||
|
pTmp->SendListTimePeriod=txListTimePeriod; |
||||
|
pTmp->SendLength = length; |
||||
|
pTmp->UART_Decode = UART_Decode; |
||||
|
|
||||
|
//if NULL, call intialize one
|
||||
|
if (uartHandler->pCurrentUARTSendHadler == NULL) |
||||
|
{ |
||||
|
uartHandler->pCurrentUARTSendHadler = pTmp; //空链表
|
||||
|
} else |
||||
|
{ |
||||
|
char i = 0; |
||||
|
//插到尾部
|
||||
|
UARTSendHandler *phead = NULL; |
||||
|
phead = uartHandler->pCurrentUARTSendHadler; |
||||
|
while (phead->pNext != NULL) |
||||
|
{ |
||||
|
i++; |
||||
|
phead = phead->pNext; |
||||
|
} |
||||
|
phead->pNext = pTmp; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void UARTHandlerTx(struct UARTHandler *uartHandler) |
||||
|
{ |
||||
|
|
||||
|
if (uartHandler->uart == NULL) |
||||
|
{ |
||||
|
LOGFF(DL_ERROR, |
||||
|
"the UART Hardware did not intialize,check the setting"); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
uartHandler->RxCount=0;//设定RxCount为0
|
||||
|
#if defined (hlpuart1Exit) |
||||
|
if(uartHandler->uart->Instance == LPUART1) |
||||
|
{ |
||||
|
|
||||
|
HAL_UART_Transmit(uartHandler->uart, uartHandler->Tx_Buf, |
||||
|
uartHandler->TxCount,100); |
||||
|
}else |
||||
|
{ |
||||
|
#endif |
||||
|
|
||||
|
if (uartHandler->uart->Instance == UART4) //**DEBUG
|
||||
|
{ |
||||
|
|
||||
|
} else if (uartHandler->uart->Instance == USART1) //**RS485_1
|
||||
|
{ |
||||
|
|
||||
|
HAL_GPIO_WritePin(RS485_1_DIR_GPIO_Port, RS485_1_DIR_Pin, GPIO_PIN_SET); |
||||
|
|
||||
|
} else if (uartHandler->uart->Instance == USART3) //**RS485_2
|
||||
|
{ |
||||
|
|
||||
|
HAL_GPIO_WritePin(RS485_2_DIR_GPIO_Port, RS485_2_DIR_Pin, GPIO_PIN_SET); |
||||
|
|
||||
|
} else if (uartHandler->uart->Instance == USART6) //**RS485_3
|
||||
|
{ |
||||
|
|
||||
|
HAL_GPIO_WritePin(RS485_3_DIR_GPIO_Port, RS485_3_DIR_Pin, GPIO_PIN_SET); |
||||
|
|
||||
|
} else if (uartHandler->uart->Instance == UART7) //**RS485_4
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_4_DIR_GPIO_Port, RS485_4_DIR_Pin, GPIO_PIN_SET); |
||||
|
|
||||
|
} else if (uartHandler->uart->Instance == USART2)//**E22 // External serial port
|
||||
|
{ |
||||
|
|
||||
|
} else if (uartHandler->uart->Instance == UART5) //**E28 // SBUS
|
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
SCB_CleanInvalidateDCache_by_Addr((uint32_t*) uartHandler->Tx_Buf, |
||||
|
uartHandler->TxCount); |
||||
|
|
||||
|
HAL_UART_Transmit_DMA(uartHandler->uart, uartHandler->Tx_Buf, |
||||
|
uartHandler->TxCount); |
||||
|
#if defined (hlpuart1Exit) |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
if (uartHandler->uart == UART4) //**DEBUG
|
||||
|
{ |
||||
|
|
||||
|
} else if (uartHandler->uart == USART1) //**RS485_1
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_1_DIR_GPIO_Port, RS485_1_DIR_Pin, |
||||
|
GPIO_PIN_RESET); |
||||
|
} else if (uartHandler->uart == USART3) //**RS485_2
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_2_DIR_GPIO_Port, RS485_2_DIR_Pin, |
||||
|
GPIO_PIN_RESET); |
||||
|
} else if (uartHandler->uart == USART6) //**RS485_3
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_3_DIR_GPIO_Port, |
||||
|
RS485_3_DIR_Pin, GPIO_PIN_RESET); |
||||
|
} else if (uartHandler->uart == UART7) //**RS485_4
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_4_DIR_GPIO_Port, |
||||
|
RS485_4_DIR_Pin, GPIO_PIN_RESET); |
||||
|
} else if (uartHandler->uart == USART2) //**E22 // External serial port
|
||||
|
{ |
||||
|
|
||||
|
} else if (uartHandler->uart == UART5) //**E28 // SBUS
|
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
void UARTHandlerRX(struct UARTHandler *uartHandler) |
||||
|
{ |
||||
|
//uartHandler->Wait_Time_Count = 0;
|
||||
|
if (uartHandler->startCountFlag == 0) |
||||
|
{ |
||||
|
uartHandler->startCountFlag = 1; |
||||
|
uartHandler->RxCount = 0; |
||||
|
} |
||||
|
|
||||
|
uartHandler->Rx_Buf[uartHandler->RxCount] = uartHandler->tmp_Rx_Buf[0]; |
||||
|
uartHandler->RxCount++; |
||||
|
|
||||
|
HAL_UART_Receive_IT(uartHandler->uart, uartHandler->tmp_Rx_Buf, 1); |
||||
|
|
||||
|
uartHandler->Wait_Time_Count = 0; |
||||
|
if(uartHandler->RxCount>=1024)//接收数据过多,直接抛弃
|
||||
|
{ |
||||
|
uartHandler->RxCount=0; |
||||
|
} |
||||
|
//HAL_UART_Receive_IT(uartHandler->uart, RS_485_2_UART_Handler.tmp_Rx_Buf, 1);
|
||||
|
} |
||||
|
|
||||
|
void IntializeUARTHandler(struct UARTHandler *uartHandler, |
||||
|
UART_HandleTypeDef *uart, int32_t WaitTime, unsigned char timeSpan,int32_t Dispacher_Time) |
||||
|
{ |
||||
|
uartHandler->Wait_Time_Count = 0; |
||||
|
uartHandler->Wait_time = WaitTime; |
||||
|
|
||||
|
uartHandler->uart = uart; |
||||
|
uartHandler->UART_Rx = UARTHandlerRX; |
||||
|
uartHandler->UART_Tx = UARTHandlerTx; |
||||
|
uartHandler->AddSendList = UARTHandlerAddTxList; |
||||
|
|
||||
|
uartHandler->dispacherController = (DispacherController*) malloc( |
||||
|
sizeof(DispacherController)); |
||||
|
|
||||
|
uartHandler->dispacherController->pHead = NULL; |
||||
|
uartHandler->dispacherController->pTail = NULL; |
||||
|
uartHandler->dispacherController->Dispacher_Enable = 0; |
||||
|
uartHandler->dispacherController->DispacherCallTime = Dispacher_Time ; // call the function every 50 ms
|
||||
|
uartHandler->dispacherController->Dispacher_Counter = 0; |
||||
|
uartHandler->dispacherController->DispacherNumber = 0; |
||||
|
uartHandler->dispacherController->Add_Dispatcher_List = Dispatcher_List_Add_t; |
||||
|
uartHandler->dispacherController->Dispatcher_Run = Dispatch_t; |
||||
|
|
||||
|
uartHandler->timeSpan = 2; |
||||
|
uartHandler->SendList_time_Count = 0; |
||||
|
uartHandler->SendList_Period = 100; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void Counting(struct UARTHandler *uartHandler) |
||||
|
{ |
||||
|
|
||||
|
if (uartHandler->UART_Decode == NULL) //不解析,直接返回true
|
||||
|
{ |
||||
|
uartHandler->decode_finished = 1; |
||||
|
} else |
||||
|
{ |
||||
|
if (uartHandler->startCountFlag == 1) |
||||
|
{ |
||||
|
uartHandler->Wait_Time_Count++; |
||||
|
if (uartHandler->timeSpan * uartHandler->Wait_Time_Count |
||||
|
>= uartHandler->Wait_time) |
||||
|
{ |
||||
|
uartHandler->Wait_Time_Count = 0; |
||||
|
uartHandler->startCountFlag = 0; |
||||
|
//启动解析函数
|
||||
|
if (uartHandler->RxCount >= 1) |
||||
|
{ |
||||
|
uartHandler->UART_Decode(uartHandler->Rx_Buf, |
||||
|
uartHandler->RxCount); |
||||
|
uartHandler->RxCount = 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (uartHandler->pCurrentUARTSendHadler != NULL) |
||||
|
{ |
||||
|
|
||||
|
GF_UART_Send_List_Send(uartHandler); |
||||
|
} else |
||||
|
{ |
||||
|
uartHandler->dispacherController->Dispatcher_Run( |
||||
|
uartHandler->dispacherController); |
||||
|
} |
||||
|
|
||||
|
// uartHandler->Send_Time_Count++;
|
||||
|
// if (uartHandler->timeSpan * uartHandler->Send_Time_Count
|
||||
|
// >= uartHandler->DispacherCallPeriod)
|
||||
|
// {
|
||||
|
// uartHandler->Send_Time_Count = 0;
|
||||
|
// if (uartHandler->pCurrentUARTSendHadler != NULL)
|
||||
|
// {
|
||||
|
// //拷贝数据到相关的代码中,然后发送
|
||||
|
// uartHandler->UART_Decode =
|
||||
|
// uartHandler->pCurrentUARTSendHadler->UART_Decode; //
|
||||
|
// memcpy(uartHandler->Tx_Buf,
|
||||
|
// uartHandler->pCurrentUARTSendHadler->Tx_Buf,
|
||||
|
// uartHandler->pCurrentUARTSendHadler->TxCount);
|
||||
|
//
|
||||
|
// uartHandler->TxCount = uartHandler->pCurrentUARTSendHadler->TxCount;
|
||||
|
// uartHandler->UART_Tx(uartHandler);
|
||||
|
//
|
||||
|
// if (uartHandler->pCurrentUARTSendHadler->pNext != NULL)
|
||||
|
// {
|
||||
|
// UARTSendHandler *temp =
|
||||
|
// uartHandler->pCurrentUARTSendHadler->pNext;
|
||||
|
// free(uartHandler->pCurrentUARTSendHadler); //清除内存
|
||||
|
// uartHandler->pCurrentUARTSendHadler = temp;
|
||||
|
// } else
|
||||
|
// {
|
||||
|
// free(uartHandler->pCurrentUARTSendHadler); //清除内存
|
||||
|
// uartHandler->pCurrentUARTSendHadler = NULL;
|
||||
|
// }
|
||||
|
//
|
||||
|
// }
|
||||
|
//
|
||||
|
// }
|
||||
|
|
||||
|
} |
||||
|
//_weak
|
||||
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) |
||||
|
{ |
||||
|
if (huart->Instance == UART4) //**DEBUG
|
||||
|
{ |
||||
|
UARTHandlerRX(&InterCall_DEBUG_UART_Handler); |
||||
|
|
||||
|
//GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_DEBUG_RxCpltCallback);
|
||||
|
|
||||
|
} else if (huart->Instance == USART1) //**RS485_1
|
||||
|
{ |
||||
|
//GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_RS485_1_RxCpltCallback);
|
||||
|
|
||||
|
UARTHandlerRX(&RS_485_1_UART_Handler); |
||||
|
} else if (huart->Instance == USART3) //**RS485_2
|
||||
|
{ |
||||
|
//GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_RS485_2_RxCpltCallback);
|
||||
|
UARTHandlerRX(&RS_485_2_UART_Handler); |
||||
|
} else if (huart->Instance == USART6) //**RS485_3
|
||||
|
{ |
||||
|
//GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_RS485_3_RxCpltCallback);
|
||||
|
UARTHandlerRX(&RS_485_3_UART_Handler); |
||||
|
} else if (huart->Instance == UART7) //**RS485_4
|
||||
|
{ |
||||
|
// UARTHandlerRX(&RS_485_4_UART_Handler);
|
||||
|
//GF_BSP_Interrupt_Run_CallBack(DF_BSP_InterCall_RS485_4_RxCpltCallback);
|
||||
|
UARTHandlerRX(&RS_485_4_UART_Handler); |
||||
|
|
||||
|
} else if (huart->Instance == USART2) //**E22 // External serial port
|
||||
|
{ |
||||
|
// GF_BSP_Interrupt_Run_CallBack(
|
||||
|
// DF_BSP_InterCall_E22_Serial_RxCpltCallback);
|
||||
|
UARTHandlerRX(<E_7S0_Serial_UART_Handler); |
||||
|
} else if (huart->Instance == UART5) //**E28 // SBUS
|
||||
|
{ |
||||
|
|
||||
|
// GF_BSP_Interrupt_Run_CallBack(
|
||||
|
// DF_BSP_InterCall_E28_SBUS_RxFifo0Callback);
|
||||
|
UARTHandlerRX(&E28_SBUS_UART_Handler); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#if defined (hlpuart1Exit) |
||||
|
else if (huart->Instance == LPUART1) //**E28 // SBUS
|
||||
|
{ |
||||
|
UARTHandlerRX(&LPUART1_UART_Handler); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#endif |
||||
|
} |
||||
|
|
||||
|
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) |
||||
|
{ |
||||
|
|
||||
|
if (huart->Instance == UART4) //**DEBUG
|
||||
|
{ |
||||
|
|
||||
|
} else if (huart->Instance == USART1) //**RS485_1
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_1_DIR_GPIO_Port, RS485_1_DIR_Pin, |
||||
|
GPIO_PIN_RESET); |
||||
|
} else if (huart->Instance == USART3) //**RS485_2
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_2_DIR_GPIO_Port, RS485_2_DIR_Pin, |
||||
|
GPIO_PIN_RESET); |
||||
|
} else if (huart->Instance == USART6) //**RS485_3
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_3_DIR_GPIO_Port, |
||||
|
RS485_3_DIR_Pin, GPIO_PIN_RESET); |
||||
|
} else if (huart->Instance == UART7) //**RS485_4
|
||||
|
{ |
||||
|
HAL_GPIO_WritePin(RS485_4_DIR_GPIO_Port, |
||||
|
RS485_4_DIR_Pin, GPIO_PIN_RESET); |
||||
|
} else if (huart->Instance == USART2) //**E22 // External serial port
|
||||
|
{ |
||||
|
|
||||
|
} else if (huart->Instance == UART5) //**E28 // SBUS
|
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//RS485_Index:1-4 RS485; 5 ExternSerial; 6 Debug;
|
||||
|
void GF_BSP_UART_Transmit(const uint8_t RS485_Index, const uint8_t *pData, |
||||
|
uint16_t Size) |
||||
|
{ |
||||
|
UART_HandleTypeDef *huart; |
||||
|
if (Size > UART_Transmit_MAX_NUM) |
||||
|
Size = UART_Transmit_MAX_NUM; |
||||
|
|
||||
|
switch (RS485_Index) |
||||
|
{ |
||||
|
case 1: |
||||
|
huart = &huart1; |
||||
|
HAL_GPIO_WritePin(RS485_1_DIR_GPIO_Port, RS485_1_DIR_Pin, |
||||
|
GPIO_PIN_SET); |
||||
|
memcpy(RS485_1_TxDMA_buf, pData, Size); |
||||
|
SCB_CleanInvalidateDCache_by_Addr((uint32_t*) RS485_1_TxDMA_buf, |
||||
|
Size); |
||||
|
HAL_UART_Transmit_DMA(huart, RS485_1_TxDMA_buf, Size); |
||||
|
//HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
|
||||
|
|
||||
|
break; |
||||
|
case 2: |
||||
|
huart = &huart3; |
||||
|
HAL_GPIO_WritePin(RS485_2_DIR_GPIO_Port, RS485_2_DIR_Pin, |
||||
|
GPIO_PIN_SET); |
||||
|
memcpy(RS485_2_TxDMA_buf, pData, Size); |
||||
|
SCB_CleanInvalidateDCache_by_Addr((uint32_t*) RS485_2_TxDMA_buf, |
||||
|
Size); |
||||
|
HAL_UART_Transmit_DMA(huart, RS485_2_TxDMA_buf, Size); |
||||
|
break; |
||||
|
case 3: |
||||
|
huart = &huart6; |
||||
|
HAL_GPIO_WritePin(RS485_3_DIR_GPIO_Port, RS485_3_DIR_Pin, |
||||
|
GPIO_PIN_SET); |
||||
|
memcpy(RS485_3_TxDMA_buf, pData, Size); |
||||
|
SCB_CleanInvalidateDCache_by_Addr((uint32_t*) RS485_3_TxDMA_buf, |
||||
|
Size); |
||||
|
HAL_UART_Transmit_DMA(huart, RS485_3_TxDMA_buf, Size); |
||||
|
break; |
||||
|
case 4: |
||||
|
huart = &huart7; |
||||
|
HAL_GPIO_WritePin(RS485_4_DIR_GPIO_Port, RS485_4_DIR_Pin, |
||||
|
GPIO_PIN_SET); |
||||
|
memcpy(RS485_4_TxDMA_buf, pData, Size); |
||||
|
SCB_CleanInvalidateDCache_by_Addr((uint32_t*) RS485_4_TxDMA_buf, |
||||
|
Size); |
||||
|
HAL_UART_Transmit_DMA(huart, RS485_4_TxDMA_buf, Size); |
||||
|
break; |
||||
|
case 5: |
||||
|
huart = &huart2; |
||||
|
memcpy(ExternSerial_TxDMA_buf, pData, Size); |
||||
|
SCB_CleanInvalidateDCache_by_Addr( |
||||
|
(uint32_t*) ExternSerial_TxDMA_buf, Size); |
||||
|
HAL_UART_Transmit_DMA(huart, ExternSerial_TxDMA_buf, Size); |
||||
|
break; |
||||
|
default: |
||||
|
huart = &huart4; |
||||
|
memcpy(Debug_TxDMA_buf, pData, Size); |
||||
|
SCB_CleanInvalidateDCache_by_Addr((uint32_t*) Debug_TxDMA_buf, |
||||
|
Size); |
||||
|
HAL_UART_Transmit_DMA(huart, Debug_TxDMA_buf, Size); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
//void USART_Dispatch(struct UARTHandler *uartHandler)
|
||||
|
//{
|
||||
|
////2ms
|
||||
|
// if (uartHandler->Dispacher_Enable == 1)
|
||||
|
// {
|
||||
|
// uartHandler->Dispacher_Counter++;
|
||||
|
// if (uartHandler->DispacherNumber > 0) //列表中有数据
|
||||
|
// {
|
||||
|
// if (uartHandler->Dispacher_Counter * uartHandler->timeSpan
|
||||
|
// >= uartHandler->DispacherCallPeriod
|
||||
|
// / uartHandler->DispacherNumber) //多长时间运行一次
|
||||
|
// {
|
||||
|
//
|
||||
|
// uartHandler->Dispacher_Counter = 0;
|
||||
|
// if (uartHandler->pHead != NULL
|
||||
|
// && uartHandler->pHead->pNext != NULL)
|
||||
|
// {
|
||||
|
// uartHandler->pHead->dispache();
|
||||
|
// uartHandler->pHead = uartHandler->pHead->pNext;
|
||||
|
// } else
|
||||
|
// {
|
||||
|
//
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
//
|
||||
|
// }
|
||||
|
//
|
||||
|
//}
|
||||
|
//
|
||||
|
//void Dispatcher_List_Add(struct UARTHandler *uartHandler,
|
||||
|
// void (*dispache)(void))
|
||||
|
//{
|
||||
|
// Dispatcher *pTmp = NULL; //临时指针2
|
||||
|
// if (uartHandler->pHead == NULL && uartHandler->pTail == NULL) //头尾部都为空
|
||||
|
// {
|
||||
|
// uartHandler->pHead = uartHandler->pTail = (Dispatcher*) malloc(
|
||||
|
// sizeof(Dispatcher));
|
||||
|
// uartHandler->pTail->dispache = dispache;
|
||||
|
// uartHandler->pTail->pNext = uartHandler->pHead;
|
||||
|
// uartHandler->DispacherNumber++;
|
||||
|
// } else
|
||||
|
// {
|
||||
|
// //临时指针2用于逐个申请内存
|
||||
|
// pTmp = (Dispatcher*) malloc(sizeof(Dispatcher));
|
||||
|
// pTmp->dispache = dispache;
|
||||
|
// pTmp->pNext = uartHandler->pHead; //set the new dispatcher .next to the header, thus make it a circle
|
||||
|
// //临时指针1的next指向刚分配内存的临时指针2
|
||||
|
// uartHandler->pTail->pNext = pTmp;
|
||||
|
//
|
||||
|
// uartHandler->pTail = pTmp; //set pTail the last node of this ring
|
||||
|
// uartHandler->DispacherNumber++;
|
||||
|
// }
|
||||
|
//}
|
||||
|
void GF_UART_Send_List_Send(struct UARTHandler *handler) |
||||
|
{ |
||||
|
|
||||
|
handler->SendList_time_Count++; |
||||
|
if (handler->timeSpan * handler->SendList_time_Count |
||||
|
>= handler->SendList_Period) |
||||
|
{ |
||||
|
handler->SendList_time_Count = 0; |
||||
|
handler->SendListExists = 1; |
||||
|
if (handler->pCurrentUARTSendHadler != NULL) |
||||
|
{ |
||||
|
//拷贝数据到相关的代码中,然后发送
|
||||
|
|
||||
|
//handler->CAN_Decode = handler->pCurrentCANSendHadler->CAN_Decode; //
|
||||
|
memcpy(handler->Tx_Buf, handler->pCurrentUARTSendHadler->Tx_Buf, |
||||
|
handler->pCurrentUARTSendHadler->SendLength); |
||||
|
handler->SendList_Period = |
||||
|
handler->pCurrentUARTSendHadler->SendListTimePeriod; |
||||
|
handler->TxCount = handler->pCurrentUARTSendHadler->SendLength; |
||||
|
handler->UART_Tx(handler); |
||||
|
|
||||
|
if (handler->pCurrentUARTSendHadler->pNext != NULL) |
||||
|
{ |
||||
|
UARTSendHandler *temp = handler->pCurrentUARTSendHadler->pNext; |
||||
|
free(handler->pCurrentUARTSendHadler); //清除内存
|
||||
|
handler->pCurrentUARTSendHadler = temp; |
||||
|
} else |
||||
|
{ |
||||
|
free(handler->pCurrentUARTSendHadler); //清除内存
|
||||
|
handler->pCurrentUARTSendHadler = NULL; |
||||
|
} |
||||
|
|
||||
|
} else |
||||
|
{ |
||||
|
handler->SendListExists = 0; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,157 @@ |
|||||
|
/*
|
||||
|
* bsp_UDP.c |
||||
|
* |
||||
|
* Created on: Aug 13, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#include "stm32h7xx_hal.h" |
||||
|
#include "lwip.h" |
||||
|
#include "udp.h" |
||||
|
#include "string.h" |
||||
|
#include "bsp_UDP.h" |
||||
|
|
||||
|
/* 定义端口号 */ |
||||
|
#define UDP_REMOTE_PORT 8881 /* 远端端口 */ |
||||
|
#define UDP_LOCAL_PORT 8880 /* 本地端口 */ |
||||
|
#define UDP_Send_LOCAL_PORT 9880 /* 本地端口 */ |
||||
|
|
||||
|
#define UDP_Printf_PORT 8881 |
||||
|
#define UDP_Long_PORT 8882 |
||||
|
#define UDP_UpdataPos_PORT 8883 |
||||
|
unsigned char received_data[1000]; |
||||
|
|
||||
|
/* udp控制块 */ |
||||
|
static struct udp_pcb *upcb; |
||||
|
static struct udp_pcb *upcb_send; |
||||
|
ip_addr_t serverIP; |
||||
|
/******************************************************************************
|
||||
|
* 描述 : 接收回调函数 |
||||
|
* 参数 : - |
||||
|
* 返回 : 无 |
||||
|
******************************************************************************/ |
||||
|
static void udp_receive_callback(void *arg, struct udp_pcb *upcb, |
||||
|
struct pbuf *p, const ip_addr_t *addr, u16_t port) |
||||
|
{ |
||||
|
|
||||
|
|
||||
|
if (p != NULL) |
||||
|
{ |
||||
|
memcpy(received_data, p->payload, p->len); |
||||
|
//err_t t = udp_sendto(upcb_send, p, &serverIP, 8000);
|
||||
|
pbuf_free(p); |
||||
|
} else |
||||
|
{ |
||||
|
pbuf_free(p); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//char UDPprintf[100];
|
||||
|
|
||||
|
void udp_printf_CmdBack(char *pData) |
||||
|
{ |
||||
|
struct pbuf *p; |
||||
|
|
||||
|
/* 分配缓冲区空间 */ |
||||
|
p = pbuf_alloc(PBUF_TRANSPORT, strlen(pData), PBUF_POOL); |
||||
|
|
||||
|
if (p != NULL) |
||||
|
{ |
||||
|
/* 填充缓冲区数据 */ |
||||
|
pbuf_take(p, pData, strlen(pData)); |
||||
|
|
||||
|
/* 发送udp数据 */ |
||||
|
|
||||
|
udp_send(upcb, p); |
||||
|
//err_t t = udp_sendto(upcb, p, &serverIP, UDP_Printf_PORT);
|
||||
|
/* 释放缓冲区空间 */ |
||||
|
pbuf_free(p); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void GF_UDP_Send(uint8_t *pData, uint16_t Size, uint16_t UDP_port) |
||||
|
{ |
||||
|
struct pbuf *p; |
||||
|
|
||||
|
/* 分配缓冲区空间 */ |
||||
|
p = pbuf_alloc(PBUF_TRANSPORT, Size, PBUF_POOL); |
||||
|
|
||||
|
if (p != NULL) |
||||
|
{ |
||||
|
/* 填充缓冲区数据 */ |
||||
|
pbuf_take(p, pData, Size); |
||||
|
|
||||
|
/* 发送udp数据 */ |
||||
|
//udp_send(upcb, p);
|
||||
|
err_t t = udp_sendto(upcb, p, &serverIP, UDP_port); |
||||
|
/* 释放缓冲区空间 */ |
||||
|
pbuf_free(p); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void GF_UpdataPos_Send(uint8_t *pData, uint32_t Size) |
||||
|
{ |
||||
|
GF_UDP_Send(pData, Size, UDP_UpdataPos_PORT); |
||||
|
} |
||||
|
|
||||
|
/******************************************************************************
|
||||
|
* 描述 : 创建udp客户端 |
||||
|
* 参数 : 无 |
||||
|
* 返回 : 无 |
||||
|
******************************************************************************/ |
||||
|
void udp_client_init(void) |
||||
|
{ |
||||
|
err_t err; |
||||
|
|
||||
|
IP4_ADDR(&serverIP, 192, 168, 1, 102); |
||||
|
/* 创建udp控制块 */ |
||||
|
upcb = udp_new(); |
||||
|
|
||||
|
if (upcb != NULL) |
||||
|
{ |
||||
|
/* 配置本地端口 */ |
||||
|
upcb->local_port = UDP_LOCAL_PORT; |
||||
|
|
||||
|
/* 配置服务器IP和端口 */ |
||||
|
err= udp_connect(upcb, &serverIP, UDP_REMOTE_PORT); |
||||
|
// err = udp_bind(upcb, IP_ADDR_ANY, UDP_LOCAL_PORT);
|
||||
|
upcb->so_options |= SOF_BROADCAST; |
||||
|
if (err == ERR_OK) |
||||
|
{ |
||||
|
/* 注册接收回调函数 */ |
||||
|
udp_recv(upcb, udp_receive_callback, NULL); |
||||
|
|
||||
|
/* 发送udp数据 */ |
||||
|
//printf("udp client connected\r\n");
|
||||
|
} else |
||||
|
{ |
||||
|
udp_remove(upcb); |
||||
|
|
||||
|
//printf("can not connect udp pcb\r\n");
|
||||
|
} |
||||
|
} |
||||
|
// upcb_send = udp_new();
|
||||
|
//
|
||||
|
// if (upcb_send != NULL)
|
||||
|
// {
|
||||
|
// /* 配置本地端口 */
|
||||
|
// upcb_send->local_port = UDP_Send_LOCAL_PORT;
|
||||
|
//
|
||||
|
// /* 配置服务器IP和端口 */
|
||||
|
// upcb_send->so_options |= SOF_BROADCAST;
|
||||
|
// err = udp_bind(upcb_send, IP_ADDR_ANY, UDP_Send_LOCAL_PORT);
|
||||
|
// if (err == ERR_OK)
|
||||
|
// {
|
||||
|
//
|
||||
|
// } else
|
||||
|
// {
|
||||
|
// udp_remove(upcb_send);
|
||||
|
//
|
||||
|
// }
|
||||
|
// }
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
/******************************** END OF FILE ********************************/ |
||||
|
|
||||
@ -0,0 +1,54 @@ |
|||||
|
/*
|
||||
|
* bsp_desulfurizer_handler.c |
||||
|
* |
||||
|
* Created on: Jul 29, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#include "pb_decode.h" |
||||
|
#include "pb_encode.h" |
||||
|
#include "bsp_include.h" |
||||
|
#include "pb.h" |
||||
|
|
||||
|
#include "bsp_Cmd.pb.h" |
||||
|
#include <stdio.h> |
||||
|
#include <stdbool.h> |
||||
|
#include <stdlib.h> |
||||
|
|
||||
|
#include "BHBF_ROBOT.h" |
||||
|
#include "bsp_cpu_flash.h" |
||||
|
#include <bsp_qspi_w25q128.h> |
||||
|
#include <bsp_UpperComputer_Handler.h> |
||||
|
|
||||
|
#include "bsp_decode_command.h" |
||||
|
void decode_command_from_computer(uint8_t *buffer, uint16_t length); |
||||
|
struct UARTHandler *desulfurizer_message_UART_Handler; |
||||
|
|
||||
|
void upper_Computer_UART_Handler_intialize(struct UARTHandler *Handler) |
||||
|
{ |
||||
|
//LOG("desulfurizer_message_UART_Handler_intialize");
|
||||
|
desulfurizer_message_UART_Handler = Handler; |
||||
|
desulfurizer_message_UART_Handler->UART_Decode = |
||||
|
decode_command_from_computer; //indicate that there is no need to listen
|
||||
|
//desulfurizer_message_UART_Handler->DispacherCallPeriod=200;
|
||||
|
|
||||
|
//desulfurizer_message_UART_Handler->Add_Dispatcher_List(desulfurizer_message_UART_Handler,steering_set_angle);
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
void decode_command_from_computer(uint8_t *buffer, uint16_t length) |
||||
|
{ |
||||
|
|
||||
|
if(*buffer==0x55 && *(buffer+1)==0x55 && length>=3) |
||||
|
{ |
||||
|
decode_command_and_feedback(buffer+2, length-2, 0, |
||||
|
desulfurizer_message_UART_Handler);//0代表非mqtt
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,70 @@ |
|||||
|
/*
|
||||
|
* bsp_adc.c |
||||
|
* |
||||
|
* Created on: Feb 21, 2025 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#include "bsp_adc.h" |
||||
|
#include "adc.h" |
||||
|
#include "stm32h7xx_hal_adc.h" |
||||
|
|
||||
|
#include <math.h> |
||||
|
|
||||
|
// 硬件相关参数配置
|
||||
|
#define ADC_MAX_VALUE 0xffff // 16位ADC最大值,若为10位ADC改为1023
|
||||
|
#define VREF 3.3f // ADC参考电压
|
||||
|
|
||||
|
// 热敏电阻参数 (需根据实际型号确认)
|
||||
|
#define R_REF 10000.0f // 分压电阻阻值(与热敏电阻串联)
|
||||
|
#define B_VALUE 3380.0f // B常数 (需确认具体型号参数)
|
||||
|
#define R0 10000.0f // 25°C时的标称阻值
|
||||
|
#define T0 298.15f // 25°C对应的开尔文温度(25 + 273.15)
|
||||
|
uint32_t adc_value; |
||||
|
|
||||
|
|
||||
|
int32_t read_temperature() |
||||
|
{ |
||||
|
|
||||
|
HAL_ADC_Start(&hadc2); //开启ADC1
|
||||
|
|
||||
|
if (HAL_ADC_PollForConversion(&hadc2, 100) == HAL_OK) |
||||
|
{ |
||||
|
//16 bit resolution
|
||||
|
adc_value = HAL_ADC_GetValue(&hadc2); |
||||
|
|
||||
|
HAL_ADC_Stop(&hadc2); |
||||
|
// 1. 计算热敏电阻两端电压
|
||||
|
float voltage = (adc_value / (float) ADC_MAX_VALUE) * VREF; |
||||
|
|
||||
|
// 2. 计算热敏电阻阻值(分压电路公式)
|
||||
|
float ntc_resistance = (voltage * R_REF) / (VREF - voltage); |
||||
|
//float ntc_resistance = (voltage * R_REF) / (VREF);
|
||||
|
// 3. 使用Steinhart-Hart方程计算温度
|
||||
|
float steinhart; |
||||
|
steinhart = ntc_resistance / R0; // (R/R0)
|
||||
|
steinhart = log(steinhart); // ln(R/R0)
|
||||
|
steinhart /= B_VALUE; // 1/B * ln(R/R0)
|
||||
|
steinhart += 1.0 / T0; // + (1/T0)
|
||||
|
steinhart = 1.0 / steinhart; // 取倒数得到开尔文温度
|
||||
|
|
||||
|
|
||||
|
// 4. 转换为摄氏度并返回
|
||||
|
return (int32_t)((steinhart - 273.15)*100); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
adc_value = 0; |
||||
|
HAL_ADC_Stop(&hadc2); |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
int32_t temperature; |
||||
|
|
||||
|
double GetTempature() |
||||
|
{ |
||||
|
|
||||
|
//return 0;
|
||||
|
} |
||||
@ -0,0 +1,118 @@ |
|||||
|
/*
|
||||
|
* bsp_pv_setting.c |
||||
|
* |
||||
|
* Created on: Jan 8, 2025 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
#include <bsp_client_setting.h> |
||||
|
#include "BHBF_ROBOT.h" |
||||
|
#include "bsp_decode_command.h" |
||||
|
#include "gpio.h" |
||||
|
|
||||
|
#include "bsp_UART.h" |
||||
|
|
||||
|
void UpdateIV(); |
||||
|
void decode_received_data_from_client(uint8_t *buffer, uint16_t length); |
||||
|
|
||||
|
struct UARTHandler *client_setting_Handler; //相当于当前行及下一行这两个结构体与绑定的共享地址
|
||||
|
DispacherController *client_setting_dispacher; |
||||
|
|
||||
|
void client_setting_intialize(struct UARTHandler *Handler) |
||||
|
{ |
||||
|
|
||||
|
client_setting_Handler = Handler; |
||||
|
client_setting_Handler->Wait_time = 30; // 最低不要低于4;
|
||||
|
|
||||
|
client_setting_dispacher=Handler->dispacherController; |
||||
|
client_setting_dispacher->Add_Dispatcher_List(client_setting_dispacher,UpdateIV); |
||||
|
client_setting_dispacher->DispacherCallTime=1000; |
||||
|
client_setting_dispacher->Dispacher_Enable = 1; |
||||
|
LOG("client_setting_intialize"); |
||||
|
|
||||
|
client_setting_Handler->UART_Decode = decode_received_data_from_client; //indicate that there is no need to listen
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
void UpdateIV()//往安卓发的
|
||||
|
{ |
||||
|
//根据提供的缓冲区和大小创建一个输出流对象
|
||||
|
pb_ostream_t IV_o_stream = pb_ostream_from_buffer( |
||||
|
&client_setting_Handler->Tx_Buf[2], |
||||
|
sizeof(client_setting_Handler->Tx_Buf) - 2); |
||||
|
|
||||
|
//将 IV 结构体中的数值按照 Protobuf 协议进行编码,并将编码后的字节流存储到 client_setting_Handler->Tx_Buf 数组(从第三个元素开始)
|
||||
|
pb_encode(&IV_o_stream, IV_struct_define_fields, &IV); |
||||
|
|
||||
|
client_setting_Handler->Tx_Buf[0] = 0x55; |
||||
|
client_setting_Handler->Tx_Buf[1] = 0x55; |
||||
|
client_setting_Handler->TxCount = IV_o_stream.bytes_written + 4; |
||||
|
|
||||
|
uint16_t crc=MB_CRC16(&(client_setting_Handler->Tx_Buf[0]), IV_o_stream.bytes_written + 2); |
||||
|
|
||||
|
client_setting_Handler->Tx_Buf[IV_o_stream.bytes_written + 2] = (crc>>8) &0xff; |
||||
|
client_setting_Handler->Tx_Buf[IV_o_stream.bytes_written + 3] = crc & 0xff;; |
||||
|
|
||||
|
|
||||
|
client_setting_Handler->UART_Tx(client_setting_Handler); |
||||
|
} |
||||
|
|
||||
|
void decode_received_data_from_client(uint8_t *buffer, uint16_t length) |
||||
|
{ |
||||
|
uint8_t data[2000]; |
||||
|
memcpy(data,buffer,length); |
||||
|
|
||||
|
//if (*buffer == 0x55 && *(buffer + 1) == 0x55 && length >= 4)
|
||||
|
if (buffer[0] == 0x55 && buffer[1] == 0x55 && length >= 4) |
||||
|
{ |
||||
|
uint16_t crc_check = ((buffer[length - 1] << 8) | buffer[length - 2]); |
||||
|
uint16_t crc_check1 = MB_CRC16(buffer, length - 2); |
||||
|
/* CRC 校验正确 */ |
||||
|
if (crc_check == MB_CRC16(buffer, length - 2)) |
||||
|
{ |
||||
|
//if (*(buffer + 2) == 0x01 && *(buffer + 3) == 0x01) //01 01 设置PV
|
||||
|
if (buffer[2] == 0x01 && buffer[3] == 0x01) //01 01 设置PV
|
||||
|
{ |
||||
|
PV_struct_define decoded_PV = PV_struct_define_init_default; |
||||
|
pb_istream_t i_pv_stream = |
||||
|
{ 0 }; |
||||
|
|
||||
|
i_pv_stream = pb_istream_from_buffer(&buffer[4], length - 4); |
||||
|
pb_decode(&i_pv_stream, PV_struct_define_fields, &decoded_PV); |
||||
|
//将CV写入EEPROM
|
||||
|
//CV_struct_define saved_cV = GF_BSP_EEPROM_Get_CV();
|
||||
|
GV.PV = decoded_PV; |
||||
|
GF_BSP_EEPROM_Set_CV(CV); |
||||
|
} |
||||
|
else if (*(buffer + 2) == 0x02 && *(buffer + 3) == 0x01) //设置PV
|
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
else if (*(buffer + 2) == 0x03 && *(buffer + 3) == 0x01) //返回IV
|
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
//Decode Error;
|
||||
|
//log_error("wire sensor decoding failed");
|
||||
|
LOGFF(DL_ERROR, "androidd decoding failed"); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
// client_setting_Handler->Tx_Buf[0]='1';
|
||||
|
// client_setting_Handler->Tx_Buf[1]=',';
|
||||
|
// //wh_LTE_7S0_Handler->Tx_Buf[2]='1';
|
||||
|
// client_setting_Handler->TxCount = 2;
|
||||
|
// client_setting_Handler->UART_Tx(client_setting_Handler);
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,188 @@ |
|||||
|
/*
|
||||
|
* bsp_com_helper.c |
||||
|
* |
||||
|
* Created on: Oct 9, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
#include "bsp_com_helper.h" |
||||
|
#include <stdlib.h> |
||||
|
#include "DLT/DLTuc.h" |
||||
|
#include "BHBF_ROBOT.h" |
||||
|
|
||||
|
void Dispatch_t(DispacherController *uartHandler) |
||||
|
{ |
||||
|
//2ms一次
|
||||
|
|
||||
|
if (uartHandler->Dispacher_Enable == 1) |
||||
|
{ |
||||
|
if (uartHandler->DispacherNumber > 0) //列表中有数据
|
||||
|
{ |
||||
|
uartHandler->Dispacher_Counter++; |
||||
|
|
||||
|
if (uartHandler->Dispacher_Counter |
||||
|
>= uartHandler->DispacherCallTime / 2 |
||||
|
/ (uartHandler->DispacherNumber)) //多长时间运行一次
|
||||
|
{ |
||||
|
uartHandler->Dispacher_Counter = 0; |
||||
|
if (uartHandler->pHead != NULL |
||||
|
&& uartHandler->pHead->pNext != NULL) |
||||
|
{ |
||||
|
|
||||
|
uartHandler->pHead->dispache(); |
||||
|
|
||||
|
uartHandler->pHead = uartHandler->pHead->pNext; |
||||
|
|
||||
|
} else |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Dispatcher_List_Add_t(DispacherController *uartHandler, |
||||
|
void (*dispache)(void)) //调度器添加列表
|
||||
|
{ |
||||
|
Dispatcher *pTmp = NULL; //临时指针2
|
||||
|
|
||||
|
if (uartHandler->pHead == NULL && uartHandler->pTail == NULL) //头尾部都为空
|
||||
|
{ |
||||
|
uartHandler->pHead = uartHandler->pTail = (Dispatcher*) malloc( |
||||
|
sizeof(Dispatcher)); |
||||
|
uartHandler->pHead->dispache = dispache; |
||||
|
uartHandler->pTail->dispache = dispache; |
||||
|
|
||||
|
|
||||
|
|
||||
|
uartHandler->pHead->pNext = uartHandler->pTail; |
||||
|
|
||||
|
uartHandler->pTail->pNext = uartHandler->pHead; |
||||
|
uartHandler->DispacherNumber++; |
||||
|
} else |
||||
|
{ |
||||
|
//临时指针2用于逐个申请内存
|
||||
|
pTmp = (Dispatcher*) malloc(sizeof(Dispatcher)); |
||||
|
pTmp->dispache = dispache; |
||||
|
|
||||
|
|
||||
|
pTmp->pNext = uartHandler->pHead; //set the new dispatcher .next to the header, thus make it a circle
|
||||
|
|
||||
|
//临时指针1的next指向刚分配内存的临时指针2
|
||||
|
uartHandler->pTail->pNext = pTmp; |
||||
|
|
||||
|
uartHandler->pTail = pTmp; //set pTail the last node of this ring
|
||||
|
uartHandler->DispacherNumber++; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void ComHardWare_List_Add_t(HardWareController *uartHandler, char *name, |
||||
|
char value,uint32_t bitFlag) |
||||
|
{ |
||||
|
|
||||
|
ComHardWare *pTmp = NULL; //临时指针2
|
||||
|
if (uartHandler->pComHWHead == NULL && uartHandler->pComHWTail == NULL) //头尾部都为空
|
||||
|
{ |
||||
|
uartHandler->pComHWHead = uartHandler->pComHWTail = |
||||
|
(ComHardWare*) malloc(sizeof(ComHardWare)); |
||||
|
|
||||
|
memset(uartHandler->pComHWHead->Name, '\0', |
||||
|
sizeof(uartHandler->pComHWHead->Name)); |
||||
|
memcpy(uartHandler->pComHWHead->Name, name, strlen(name)); |
||||
|
uartHandler->pComHWHead->IsOnline = value; |
||||
|
uartHandler->pComHWHead->BitFlag = bitFlag; |
||||
|
uartHandler->pComHWHead->pNext = NULL; |
||||
|
} else |
||||
|
{ |
||||
|
|
||||
|
pTmp = (ComHardWare*) malloc(sizeof(ComHardWare)); |
||||
|
memset(pTmp->Name, '\0', sizeof(pTmp->Name)); |
||||
|
memcpy(pTmp->Name, name, strlen(name)); |
||||
|
|
||||
|
pTmp->BitFlag = bitFlag; |
||||
|
pTmp->IsOnline = value; |
||||
|
pTmp->pNext = NULL; //set the new dispatcher .next to the header, thus make it a circle
|
||||
|
uartHandler->pComHWTail->pNext = pTmp; |
||||
|
uartHandler->pComHWTail = pTmp; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
char str1[50] = "\0"; |
||||
|
void PCOMHardWare_Check_t(HardWareController *uartHandler) |
||||
|
{ |
||||
|
uartHandler->HardWare_Check_Counter++; |
||||
|
// if (uartHandler->HardWare_Check_Counter*2
|
||||
|
// >= uartHandler->DispacherCallTime * 6) //make sure every
|
||||
|
if (uartHandler->HardWare_Check_Counter * 2 >= uartHandler->DispacherCallTime) //make sure every
|
||||
|
{ |
||||
|
ComHardWare *ptr = uartHandler->pComHWHead; |
||||
|
|
||||
|
if (!ptr) |
||||
|
{ |
||||
|
uartHandler->HardWare_Check_Counter = 0; |
||||
|
//printf("链表为空\n");
|
||||
|
return; |
||||
|
} |
||||
|
char IsAbnornalStatus = 0; |
||||
|
|
||||
|
//check invalid state
|
||||
|
while (ptr != NULL) |
||||
|
{ |
||||
|
if (ptr->IsOnline != 1) |
||||
|
{ |
||||
|
memset(str1, '\0', 50); |
||||
|
memcpy(str1, ptr->Name, strlen(ptr->Name)); |
||||
|
LOGFF(DL_ERROR, "connecting Error %s", ptr->Name); |
||||
|
SET_BIT_1(SystemErrorCode,ptr->BitFlag); |
||||
|
//*SystemErrorCode=*SystemErrorCode|(1<<ptr->BitFlag);
|
||||
|
IsAbnornalStatus = 1; |
||||
|
}else |
||||
|
{ |
||||
|
//*SystemErrorCode=*SystemErrorCode|(1<<ptr->BitFlag);
|
||||
|
SET_BIT_0(SystemErrorCode,ptr->BitFlag); |
||||
|
} |
||||
|
ptr = ptr->pNext; |
||||
|
} |
||||
|
|
||||
|
//set invalid state
|
||||
|
ptr = uartHandler->pComHWHead; |
||||
|
while (ptr != NULL) |
||||
|
{ |
||||
|
ptr->IsOnline = 0; |
||||
|
ptr = ptr->pNext; |
||||
|
} |
||||
|
uartHandler->HardWare_Check_Counter = 0;//perform the check of connection
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
int Set_PCOMHardWare_t(HardWareController *uartHandler, char *name, char value) |
||||
|
{ |
||||
|
|
||||
|
ComHardWare *ptr = uartHandler->pComHWHead; |
||||
|
char finddata = 0; |
||||
|
|
||||
|
if (ptr == NULL) |
||||
|
{ |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
while (ptr != NULL) |
||||
|
{ |
||||
|
if (strcmp(ptr->Name, name) == 0) |
||||
|
{ |
||||
|
ptr->IsOnline = value; |
||||
|
finddata = 1; |
||||
|
return finddata; |
||||
|
} else |
||||
|
{ |
||||
|
ptr = ptr->pNext; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
return finddata; |
||||
|
|
||||
|
} |
||||
|
|
||||
@ -0,0 +1,499 @@ |
|||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* |
||||
|
* 模块名称 : cpu内部falsh操作模块(for STM32H743 H750) |
||||
|
* 文件名称 : bsp_cpu_flash.c |
||||
|
* 版 本 : V1.1 |
||||
|
* 说 明 : 提供读写CPU内部Flash的函数 |
||||
|
* 修改记录 : |
||||
|
* 版本号 日期 作者 说明 |
||||
|
* V1.0 2019-09-20 armfly 正式发布 |
||||
|
* V1.1 2019-10-03 armfly 写flash函数,修正长度不是32字节整数倍的bug,末尾补0写入。 |
||||
|
* 解决HAL库函数的 HAL_FLASH_Program()的bug, |
||||
|
* 问题现象是大批量连续编程失败(报编程指令顺序错, PGSERR1、 PGSERR2) |
||||
|
* Copyright (C), 2019-2030, 安富莱电子 www.armfly.com |
||||
|
* |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
|
||||
|
#include "bsp_cpu_flash.h" |
||||
|
#include <string.h> |
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函数 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 宏定义 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
//0x08020000 - 0x08000000 = 128k;//bootload 128k // every sector 448k
|
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 变量 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
__IO uint32_t uwCRCValue; |
||||
|
__IO uint32_t uwExpectedCRCValue; |
||||
|
__IO uint32_t uwAppSize; |
||||
|
|
||||
|
uint8_t buf[1024]; |
||||
|
uint32_t RecCount = 0; |
||||
|
uint32_t RecCount0 = 0; |
||||
|
uint32_t RecSize = 0; |
||||
|
uint8_t RecCplt = 0; |
||||
|
uint32_t filesize = 0; |
||||
|
|
||||
|
uint32_t Bus_Error=0; |
||||
|
uint32_t update_index = 0; |
||||
|
uint32_t update_index_true = 0; |
||||
|
uint32_t update_sum = 0; |
||||
|
uint32_t update_sum_true = 0; |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: bsp_GetSector |
||||
|
* 功能说明: 根据地址计算扇区首地址 |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 扇区号(0-7) |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint32_t bsp_GetSector(uint32_t Address) |
||||
|
{ |
||||
|
uint32_t sector = 0; |
||||
|
|
||||
|
if (((Address < ADDR_FLASH_SECTOR_1_BANK1) && (Address >= ADDR_FLASH_SECTOR_0_BANK1)) || \ |
||||
|
((Address < ADDR_FLASH_SECTOR_1_BANK2) && (Address >= ADDR_FLASH_SECTOR_0_BANK2))) |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_0; |
||||
|
} |
||||
|
else if (((Address < ADDR_FLASH_SECTOR_2_BANK1) && (Address >= ADDR_FLASH_SECTOR_1_BANK1)) || \ |
||||
|
((Address < ADDR_FLASH_SECTOR_2_BANK2) && (Address >= ADDR_FLASH_SECTOR_1_BANK2))) |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_1; |
||||
|
} |
||||
|
else if (((Address < ADDR_FLASH_SECTOR_3_BANK1) && (Address >= ADDR_FLASH_SECTOR_2_BANK1)) || \ |
||||
|
((Address < ADDR_FLASH_SECTOR_3_BANK2) && (Address >= ADDR_FLASH_SECTOR_2_BANK2))) |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_2; |
||||
|
} |
||||
|
else if (((Address < ADDR_FLASH_SECTOR_4_BANK1) && (Address >= ADDR_FLASH_SECTOR_3_BANK1)) || \ |
||||
|
((Address < ADDR_FLASH_SECTOR_4_BANK2) && (Address >= ADDR_FLASH_SECTOR_3_BANK2))) |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_3; |
||||
|
} |
||||
|
else if (((Address < ADDR_FLASH_SECTOR_5_BANK1) && (Address >= ADDR_FLASH_SECTOR_4_BANK1)) || \ |
||||
|
((Address < ADDR_FLASH_SECTOR_5_BANK2) && (Address >= ADDR_FLASH_SECTOR_4_BANK2))) |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_4; |
||||
|
} |
||||
|
else if (((Address < ADDR_FLASH_SECTOR_6_BANK1) && (Address >= ADDR_FLASH_SECTOR_5_BANK1)) || \ |
||||
|
((Address < ADDR_FLASH_SECTOR_6_BANK2) && (Address >= ADDR_FLASH_SECTOR_5_BANK2))) |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_5; |
||||
|
} |
||||
|
else if (((Address < ADDR_FLASH_SECTOR_7_BANK1) && (Address >= ADDR_FLASH_SECTOR_6_BANK1)) || \ |
||||
|
((Address < ADDR_FLASH_SECTOR_7_BANK2) && (Address >= ADDR_FLASH_SECTOR_6_BANK2))) |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_6; |
||||
|
} |
||||
|
else if (((Address < ADDR_FLASH_SECTOR_0_BANK2) && (Address >= ADDR_FLASH_SECTOR_7_BANK1)) || \ |
||||
|
((Address < CPU_FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_7_BANK2))) |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_7; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
sector = FLASH_SECTOR_7; |
||||
|
} |
||||
|
|
||||
|
return sector; |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: bsp_ReadCpuFlash |
||||
|
* 功能说明: 读取CPU Flash的内容 |
||||
|
* 形 参: _ucpDst : 目标缓冲区 |
||||
|
* _ulFlashAddr : 起始地址 |
||||
|
* _ulSize : 数据大小(单位是字节) |
||||
|
* 返 回 值: 0=成功,1=失败 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t bsp_ReadCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpDst, uint32_t _ulSize) |
||||
|
{ |
||||
|
uint32_t i; |
||||
|
|
||||
|
if (_ulFlashAddr + _ulSize > CPU_FLASH_BASE_ADDR + CPU_FLASH_SIZE) |
||||
|
{ |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
/* 长度为0时不继续操作,否则起始地址为奇地址会出错 */ |
||||
|
if (_ulSize == 0) |
||||
|
{ |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
for (i = 0; i < _ulSize; i++) |
||||
|
{ |
||||
|
*_ucpDst++ = *(uint8_t *)_ulFlashAddr++; |
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: bsp_CmpCpuFlash |
||||
|
* 功能说明: 比较Flash指定地址的数据. |
||||
|
* 形 参: _ulFlashAddr : Flash地址 |
||||
|
* _ucpBuf : 数据缓冲区 |
||||
|
* _ulSize : 数据大小(单位是字节) |
||||
|
* 返 回 值: |
||||
|
* FLASH_IS_EQU 0 Flash内容和待写入的数据相等,不需要擦除和写操作 |
||||
|
* FLASH_REQ_WRITE 1 Flash不需要擦除,直接写 |
||||
|
* FLASH_REQ_ERASE 2 Flash需要先擦除,再写 |
||||
|
* FLASH_PARAM_ERR 3 函数参数错误 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t bsp_CmpCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpBuf, uint32_t _ulSize) |
||||
|
{ |
||||
|
uint32_t i; |
||||
|
uint8_t ucIsEqu; /* 相等标志 */ |
||||
|
uint8_t ucByte; |
||||
|
|
||||
|
/* 如果偏移地址超过芯片容量,则不改写输出缓冲区 */ |
||||
|
if (_ulFlashAddr + _ulSize > CPU_FLASH_BASE_ADDR + CPU_FLASH_SIZE) |
||||
|
{ |
||||
|
return FLASH_PARAM_ERR; /* 函数参数错误 */ |
||||
|
} |
||||
|
|
||||
|
/* 长度为0时返回正确 */ |
||||
|
if (_ulSize == 0) |
||||
|
{ |
||||
|
return FLASH_IS_EQU; /* Flash内容和待写入的数据相等 */ |
||||
|
} |
||||
|
|
||||
|
ucIsEqu = 1; /* 先假设所有字节和待写入的数据相等,如果遇到任何一个不相等,则设置为 0 */ |
||||
|
for (i = 0; i < _ulSize; i++) |
||||
|
{ |
||||
|
ucByte = *(uint8_t *)_ulFlashAddr; |
||||
|
|
||||
|
if (ucByte != *_ucpBuf) |
||||
|
{ |
||||
|
if (ucByte != 0xFF) |
||||
|
{ |
||||
|
return FLASH_REQ_ERASE; /* 需要擦除后再写 */ |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
ucIsEqu = 0; /* 不相等,需要写 */ |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
_ulFlashAddr++; |
||||
|
_ucpBuf++; |
||||
|
} |
||||
|
|
||||
|
if (ucIsEqu == 1) |
||||
|
{ |
||||
|
return FLASH_IS_EQU; /* Flash内容和待写入的数据相等,不需要擦除和写操作 */ |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
return FLASH_REQ_WRITE; /* Flash不需要擦除,直接写 */ |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: bsp_EraseCpuFlash |
||||
|
* 功能说明: 擦除CPU FLASH一个扇区 (128KB) |
||||
|
* 形 参: _ulFlashAddr : Flash地址 |
||||
|
* 返 回 值: 0 成功, 1 失败 |
||||
|
* HAL_OK = 0x00, |
||||
|
* HAL_ERROR = 0x01, |
||||
|
* HAL_BUSY = 0x02, |
||||
|
* HAL_TIMEOUT = 0x03 |
||||
|
* |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t bsp_EraseCpuFlash(uint32_t _ulFlashAddr) |
||||
|
{ |
||||
|
uint32_t FirstSector = 0, NbOfSectors = 0; |
||||
|
FLASH_EraseInitTypeDef EraseInitStruct; |
||||
|
uint32_t SECTORError = 0; |
||||
|
uint8_t re; |
||||
|
|
||||
|
/* 解锁 */ |
||||
|
HAL_FLASH_Unlock(); |
||||
|
|
||||
|
/* 获取此地址所在的扇区 */ |
||||
|
FirstSector = bsp_GetSector(_ulFlashAddr); |
||||
|
|
||||
|
/* 固定1个扇区 */ |
||||
|
NbOfSectors = 1; |
||||
|
|
||||
|
/* 擦除扇区配置 */ |
||||
|
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; |
||||
|
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; |
||||
|
|
||||
|
if (_ulFlashAddr >= ADDR_FLASH_SECTOR_0_BANK2) |
||||
|
{ |
||||
|
EraseInitStruct.Banks = FLASH_BANK_2; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
EraseInitStruct.Banks = FLASH_BANK_1; |
||||
|
} |
||||
|
|
||||
|
EraseInitStruct.Sector = FirstSector; |
||||
|
EraseInitStruct.NbSectors = NbOfSectors; |
||||
|
|
||||
|
/* 扇区擦除 */ |
||||
|
re = HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError); |
||||
|
|
||||
|
/* 擦除完毕后,上锁 */ |
||||
|
HAL_FLASH_Lock(); |
||||
|
|
||||
|
return re; |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: bsp_WriteCpuFlash |
||||
|
* 功能说明: 写数据到CPU 内部Flash。 必须按32字节整数倍写。不支持跨扇区。扇区大小128KB. \ |
||||
|
* 写之前需要擦除扇区. 长度不是32字节整数倍时,最后几个字节末尾补0写入. |
||||
|
* 形 参: _ulFlashAddr : Flash地址 |
||||
|
* _ucpSrc : 数据缓冲区 |
||||
|
* _ulSize : 数据大小(单位是字节, 必须是32字节整数倍) |
||||
|
* 返 回 值: 0-成功,1-数据长度或地址溢出,2-写Flash出错(估计Flash寿命到) |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
uint8_t bsp_WriteCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpSrc, uint32_t _ulSize) |
||||
|
{ |
||||
|
uint32_t i; |
||||
|
uint8_t ucRet; |
||||
|
|
||||
|
/* 如果偏移地址超过芯片容量,则不改写输出缓冲区 */ |
||||
|
if (_ulFlashAddr + _ulSize > CPU_FLASH_BASE_ADDR + CPU_FLASH_SIZE) |
||||
|
{ |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
/* 长度为0时不继续操作 */ |
||||
|
if (_ulSize == 0) |
||||
|
{ |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
ucRet = bsp_CmpCpuFlash(_ulFlashAddr, _ucpSrc, _ulSize); |
||||
|
|
||||
|
if (ucRet == FLASH_IS_EQU) |
||||
|
{ |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
__set_PRIMASK(1); /* 关中断 */ |
||||
|
|
||||
|
/* FLASH 解锁 */ |
||||
|
HAL_FLASH_Unlock(); |
||||
|
|
||||
|
for (i = 0; i < _ulSize / 32; i++) |
||||
|
{ |
||||
|
uint64_t FlashWord[4]; |
||||
|
|
||||
|
memcpy((char *)FlashWord, _ucpSrc, 32); |
||||
|
_ucpSrc += 32; |
||||
|
|
||||
|
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, _ulFlashAddr, (uint64_t)((uint32_t)FlashWord)) == HAL_OK) |
||||
|
{ |
||||
|
_ulFlashAddr = _ulFlashAddr + 32; /* 递增,操作下一个256bit */ |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
goto err; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 长度不是32字节整数倍 */ |
||||
|
if (_ulSize % 32) |
||||
|
{ |
||||
|
uint64_t FlashWord[4]; |
||||
|
|
||||
|
FlashWord[0] = 0; |
||||
|
FlashWord[1] = 0; |
||||
|
FlashWord[2] = 0; |
||||
|
FlashWord[3] = 0; |
||||
|
memcpy((char *)FlashWord, _ucpSrc, _ulSize % 32); |
||||
|
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, _ulFlashAddr, (uint64_t)((uint32_t)FlashWord)) == HAL_OK) |
||||
|
{ |
||||
|
; // _ulFlashAddr = _ulFlashAddr + 32;
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
goto err; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* Flash 加锁,禁止写Flash控制寄存器 */ |
||||
|
HAL_FLASH_Lock(); |
||||
|
|
||||
|
__set_PRIMASK(0); /* 开中断 */ |
||||
|
|
||||
|
return 0; |
||||
|
|
||||
|
err: |
||||
|
/* Flash 加锁,禁止写Flash控制寄存器 */ |
||||
|
HAL_FLASH_Lock(); |
||||
|
|
||||
|
__set_PRIMASK(0); /* 开中断 */ |
||||
|
|
||||
|
return 1; |
||||
|
} |
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: JumpToApp |
||||
|
* 功能说明: 跳转到应用JumpToApp |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
void JumpToApp(void) |
||||
|
{ |
||||
|
uint32_t i=0; |
||||
|
void (*AppJump)(void); /* 声明一个函数指针 */ |
||||
|
|
||||
|
/* 关闭全局中断 */ |
||||
|
DISABLE_INT(); |
||||
|
|
||||
|
/* 设置所有时钟到默认状态,使用HSI时钟 */ |
||||
|
|
||||
|
__HAL_RCC_GPIOH_CLK_DISABLE(); |
||||
|
__HAL_RCC_GPIOB_CLK_DISABLE(); |
||||
|
HAL_RCC_DeInit(); |
||||
|
|
||||
|
/* 关闭滴答定时器,复位到默认值 */ |
||||
|
SysTick->CTRL = 0; |
||||
|
SysTick->LOAD = 0; |
||||
|
SysTick->VAL = 0; |
||||
|
|
||||
|
/* 关闭所有中断,清除所有中断挂起标志 */ |
||||
|
for (i = 0; i < 8; i++) |
||||
|
{ |
||||
|
NVIC->ICER[i]=0xFFFFFFFF; |
||||
|
NVIC->ICPR[i]=0xFFFFFFFF; |
||||
|
} |
||||
|
|
||||
|
/* 使能全局中断 */ |
||||
|
ENABLE_INT(); |
||||
|
|
||||
|
/* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */ |
||||
|
AppJump = (void (*)(void)) (*((uint32_t *) (App_Run_Addr + 4))); |
||||
|
|
||||
|
/* 设置主堆栈指针 */ |
||||
|
__set_MSP(*(uint32_t *)App_Run_Addr); |
||||
|
|
||||
|
/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */ |
||||
|
__set_CONTROL(0); |
||||
|
|
||||
|
/* 跳转到系统BootLoader */ |
||||
|
AppJump(); |
||||
|
|
||||
|
/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */ |
||||
|
while (1) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*
|
||||
|
********************************************************************************************************* |
||||
|
* 函 数 名: JumpToApp |
||||
|
* 功能说明: 跳转到应用JumpToApp |
||||
|
* 形 参: 无 |
||||
|
* 返 回 值: 无 |
||||
|
********************************************************************************************************* |
||||
|
*/ |
||||
|
void Copy_Download_Flash_to_Start() |
||||
|
{ |
||||
|
|
||||
|
uint32_t startIndex=0; |
||||
|
|
||||
|
for(startIndex = 0; startIndex < 3; startIndex++) |
||||
|
{ |
||||
|
bsp_EraseCpuFlash((uint32_t)(App_Run_Addr + startIndex*128*1024));//Erase this function
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
uint8_t readData[32]; |
||||
|
uint32_t total=3*128*1024/sizeof(readData); |
||||
|
uint8_t retult=0; |
||||
|
for(startIndex=0;startIndex<total;startIndex++) |
||||
|
{ |
||||
|
//App_Download_Addr
|
||||
|
//Read 32 bytes
|
||||
|
bsp_ReadCpuFlash(App_Download_Addr+startIndex*sizeof(readData),readData,sizeof(readData)); |
||||
|
//ucState = bsp_WriteCpuFlash((uint32_t)(AppAddr + TotalSize), (uint8_t *)&g_Can2RxData[8], RecSize);
|
||||
|
retult=bsp_WriteCpuFlash(App_Run_Addr+startIndex*sizeof(readData),readData,sizeof(readData)); |
||||
|
//Read
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
void Copy_Peripheral_Download_Flash_to_App_Start(uint32_t totalBytes) |
||||
|
{ |
||||
|
|
||||
|
uint32_t startIndex=0; |
||||
|
// erase the all the flash from the App_Run_Addr
|
||||
|
for(startIndex = 0; startIndex < 7; startIndex++) |
||||
|
{ |
||||
|
bsp_EraseCpuFlash((uint32_t)(App_Run_Addr + startIndex*128*1024));//Erase this function
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
uint8_t readData[256]; |
||||
|
uint32_t total=totalBytes/sizeof(readData)+1; |
||||
|
uint8_t retult=0; |
||||
|
for(startIndex=0;startIndex<total;startIndex++) |
||||
|
{ |
||||
|
//App_Download_Addr
|
||||
|
//Read 32 bytes
|
||||
|
|
||||
|
QSPI_W25Qx_Read_Buffer(&readData,CODE_DOWNLOAD_FLASH_BEGIN_ADDRESS+startIndex*sizeof(readData),256); |
||||
|
HAL_Delay(10); |
||||
|
//retult= bsp_ReadCpuFlash(App_Download_Addr+startIndex*sizeof(readData),readData,sizeof(readData));
|
||||
|
//ucState = bsp_WriteCpuFlash((uint32_t)(AppAddr + TotalSize), (uint8_t *)&g_Can2RxData[8], RecSize);
|
||||
|
retult=bsp_WriteCpuFlash(App_Run_Addr+startIndex*sizeof(readData),readData,sizeof(readData)); |
||||
|
//Read
|
||||
|
HAL_Delay(10); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
void Erase_App_Download_Flash_Addr() |
||||
|
{ |
||||
|
uint32_t startIndex=0; |
||||
|
//清空bank0 的1-7 区域
|
||||
|
//there are 8 sectors in total, and
|
||||
|
for(startIndex = 0; startIndex < 4; startIndex++) |
||||
|
{ |
||||
|
bsp_EraseCpuFlash((uint32_t)(App_Download_Addr + startIndex*128*1024));//Erase this function
|
||||
|
} |
||||
|
//char data[1];
|
||||
|
//data[0]=20;
|
||||
|
// bsp_WriteCpuFlash(App_Download_Addr,
|
||||
|
// data, 1);
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,378 @@ |
|||||
|
/*
|
||||
|
* bsp_decode_command.c |
||||
|
* |
||||
|
* Created on: Sep 24, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
#include "bsp_decode_command.h" |
||||
|
#include "bsp_Error.pb.h" |
||||
|
#define success 1 |
||||
|
#define fail 0 |
||||
|
|
||||
|
Cmd decoded_Cmd = Cmd_init_default; |
||||
|
ReCmd send_Cmd = ReCmd_init_default; |
||||
|
pb_istream_t i_stream = |
||||
|
{ 0 }; |
||||
|
char StartDownLoadFlag = 0; |
||||
|
static uint32_t downloadCount = 0; |
||||
|
static uint8_t readData[1024]; |
||||
|
static uint8_t ReceivedData[1024]; |
||||
|
static uint16_t calbriation; |
||||
|
static uint16_t length_count; |
||||
|
|
||||
|
void decode_command_and_feedback(uint8_t *buffer, uint16_t length, char isMqtt, |
||||
|
struct UARTHandler *send_Handler) |
||||
|
{ |
||||
|
|
||||
|
// char array[1000];
|
||||
|
// memset(array, 0, sizeof(array));
|
||||
|
// memcpy(array, buffer, length);
|
||||
|
// length_count = length;
|
||||
|
// if (length_count != 42)
|
||||
|
// {
|
||||
|
// char a = 100;
|
||||
|
// }
|
||||
|
//if (length >= 0)
|
||||
|
if (length >= 1 ) |
||||
|
{ |
||||
|
|
||||
|
i_stream = pb_istream_from_buffer(buffer, length); |
||||
|
|
||||
|
pb_decode(&i_stream, Cmd_fields, &decoded_Cmd); |
||||
|
// int i=0;
|
||||
|
// for(i=0;i<decoded_Cmd.Buff_Data_Length;i++)
|
||||
|
// {
|
||||
|
// decoded_Cmd.Buff_Data[i]=buffer[length-decoded_Cmd.Buff_Data_Length+i];
|
||||
|
// }
|
||||
|
|
||||
|
memcpy(&decoded_Cmd.Buff_Data, |
||||
|
&buffer[length - decoded_Cmd.Buff_Data_Length], |
||||
|
decoded_Cmd.Buff_Data_Length); |
||||
|
|
||||
|
switch (decoded_Cmd.CommadNum) |
||||
|
{ |
||||
|
case 19: // 读取IV
|
||||
|
{ |
||||
|
|
||||
|
pb_ostream_t IV_o_stream = |
||||
|
{ 0 }; |
||||
|
// char buf1[30]={"9999"};
|
||||
|
// IV.Buff_Data_Length=strlen(buf1);
|
||||
|
// memcpy(IV.Buff_Data, buf1, IV.Buff_Data_Length);
|
||||
|
|
||||
|
char buf[1024]; |
||||
|
IV_o_stream = pb_ostream_from_buffer(buf, sizeof(buf)); |
||||
|
pb_encode(&IV_o_stream, IV_struct_define_fields, &IV); |
||||
|
|
||||
|
//将数据拷贝到Command中
|
||||
|
send_Cmd.CommadNum = 19; |
||||
|
send_Cmd.Buff_Data_Length = IV_o_stream.bytes_written; |
||||
|
|
||||
|
WrapInCmdAndSend(send_Cmd, buf, isMqtt, send_Handler); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
case 18: // 设置PV
|
||||
|
{ |
||||
|
|
||||
|
|
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
case 17: // 读取PV
|
||||
|
{ |
||||
|
|
||||
|
|
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
case 15: // 返回错误信息
|
||||
|
{ |
||||
|
|
||||
|
pb_ostream_t Error_o_stream = |
||||
|
{ 0 }; |
||||
|
char buf[1024]; |
||||
|
Error_o_stream = pb_ostream_from_buffer(buf, sizeof(buf)); |
||||
|
pb_encode(&Error_o_stream, ErrorData_fields, |
||||
|
&GV.SystemErrorData); |
||||
|
|
||||
|
//将数据拷贝到Command中
|
||||
|
send_Cmd.CommadNum = 16; |
||||
|
send_Cmd.Buff_Data_Length = Error_o_stream.bytes_written; |
||||
|
|
||||
|
WrapInCmdAndSend(send_Cmd, buf, isMqtt, send_Handler); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
case 14: // 去 使能 wh_LTE_7S0_Handler 周期性性发送数据
|
||||
|
{ |
||||
|
WrapInCmdAndSendMessage(send_Cmd, 14, success, |
||||
|
"disable send GV", isMqtt, send_Handler); |
||||
|
break; |
||||
|
} |
||||
|
case 13: // 使能 wh_LTE_7S0_Handler 周期性性发送数据
|
||||
|
{ |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
case 12: //重启系统,进入bootloader
|
||||
|
{ |
||||
|
|
||||
|
WrapInCmdAndSendMessage(send_Cmd, 12, success, "STM32 reboot", |
||||
|
isMqtt, send_Handler); |
||||
|
NVIC_SystemReset(); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
case 11: //配置无线网络模块,此处为透传指令
|
||||
|
{ |
||||
|
//decoded_Cmd.Parameter0是个数
|
||||
|
//将buffer data中的数据发走
|
||||
|
|
||||
|
Send_WH_LTE_7S0_Data(decoded_Cmd.Buff_Data, |
||||
|
decoded_Cmd.Parameter0); |
||||
|
//
|
||||
|
break; |
||||
|
} |
||||
|
case 10: //擦除flash
|
||||
|
{ |
||||
|
|
||||
|
//Erase_App_Download_Flash_Addr();
|
||||
|
QSPI_W25Qx_EraseDownLoadFlash(); |
||||
|
downloadCount = 0; |
||||
|
WrapInCmdAndSendMessage(send_Cmd, 10, success, |
||||
|
"erase flash success", isMqtt, send_Handler); |
||||
|
break; |
||||
|
} |
||||
|
case 9: //上位机下发保存软件代码指令
|
||||
|
{ |
||||
|
//写入flash 然后重启
|
||||
|
//if (iap.MB_CRC16 == MB_CRC16(iap.Buff_Data, 512))
|
||||
|
//{
|
||||
|
//将数据写入flash中
|
||||
|
// 一上电就清空download flash
|
||||
|
// if (StartDownLoadFlag == 0)
|
||||
|
// {
|
||||
|
// //Erase_App_Download_Flash_Addr();
|
||||
|
// StartDownLoadFlag = 1;
|
||||
|
// }
|
||||
|
|
||||
|
//AT24C512_Write_nBytes(&decoded_Cmd.Buff_Data, App_Download_EEPROM_Addr + downloadCount, decoded_Cmd.Buff_Data_Length);
|
||||
|
// GF_BSP_EEPROM_WriteBytes(&decoded_Cmd.Buff_Data,
|
||||
|
// App_Download_EEPROM_Addr + downloadCount,
|
||||
|
// decoded_Cmd.Buff_Data_Length);
|
||||
|
memcpy(ReceivedData, |
||||
|
&buffer[length - decoded_Cmd.Buff_Data_Length], |
||||
|
decoded_Cmd.Buff_Data_Length); |
||||
|
// calbriation = MB_CRC16(decoded_Cmd.Buff_Data,
|
||||
|
// decoded_Cmd.Buff_Data_Length);
|
||||
|
|
||||
|
calbriation = MB_CRC16(&ReceivedData, |
||||
|
decoded_Cmd.Buff_Data_Length); |
||||
|
|
||||
|
if (calbriation == decoded_Cmd.Parameter4) //Parameter4是校验
|
||||
|
{ |
||||
|
|
||||
|
if (downloadCount == decoded_Cmd.Parameter3) |
||||
|
{ |
||||
|
QSPI_W25Qx_Write_Buffer(&decoded_Cmd.Buff_Data, |
||||
|
CODE_DOWNLOAD_FLASH_BEGIN_ADDRESS |
||||
|
+ decoded_Cmd.Parameter3, |
||||
|
decoded_Cmd.Buff_Data_Length); |
||||
|
downloadCount += decoded_Cmd.Buff_Data_Length; |
||||
|
send_Cmd.Parameter3 = length; |
||||
|
WrapInCmdAndSendMessage(send_Cmd, 9, success, |
||||
|
"download success", isMqtt, send_Handler); |
||||
|
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
decoded_Cmd.Parameter2 = downloadCount; //返回download count;
|
||||
|
send_Cmd.Parameter3 = length; |
||||
|
WrapInCmdAndSendMessage(send_Cmd, 9, fail, |
||||
|
"downloadCount!=Parameter3", isMqtt, |
||||
|
send_Handler); |
||||
|
} |
||||
|
|
||||
|
// QSPI_W25Qx_Write_Buffer(&decoded_Cmd.Buff_Data,
|
||||
|
// CODE_DOWNLOAD_FLASH_BEGIN_ADDRESS + downloadCount,
|
||||
|
// decoded_Cmd.Buff_Data_Length);
|
||||
|
//HAL_Delay(100);
|
||||
|
|
||||
|
// bsp_WriteCpuFlash(App_Download_Addr + downloadCount,
|
||||
|
// decoded_Cmd.Buff_Data, decoded_Cmd.Buff_Data_Length);
|
||||
|
|
||||
|
//QSPI_W25Qx_Read_Buffer(&readData,CODE_DOWNLOAD_FLASH_BEGIN_ADDRESS ,decoded_Cmd.Buff_Data_Length);
|
||||
|
//HAL_Delay(50);
|
||||
|
//GF_BSP_EEPROM_ReadBytes(readData,App_Download_EEPROM_Addr ,decoded_Cmd.Buff_Data_Length);
|
||||
|
|
||||
|
if (decoded_Cmd.Parameter1 == 1) |
||||
|
{ |
||||
|
WrapInCmdAndSendMessage(send_Cmd, 9, success, |
||||
|
"download new software sucess", isMqtt, |
||||
|
send_Handler); |
||||
|
IAP_struct_define iap = GF_BSP_EEPROM_Get_IAP();//Get the version of the code
|
||||
|
iap.UpgradeSucceeded = 1; |
||||
|
iap.Total_Bytes = decoded_Cmd.Parameter2; |
||||
|
StartDownLoadFlag = 0; |
||||
|
downloadCount = 0; |
||||
|
GF_BSP_EEPROM_Set_IAP(iap); |
||||
|
|
||||
|
//重启系统,进入bootloader
|
||||
|
//NVIC_SystemReset();
|
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
|
||||
|
decoded_Cmd.Parameter2 = downloadCount; //返回download count;
|
||||
|
send_Cmd.Parameter3 = length; |
||||
|
WrapInCmdAndSendMessage(send_Cmd, 9, fail, |
||||
|
"MB CRC failed and the length ", isMqtt, |
||||
|
send_Handler); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//}
|
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
// 定义 7 上位机获取拟合点
|
||||
|
// 定义 8 上位机获取位置点 */
|
||||
|
case 8: |
||||
|
{ |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
case 7: |
||||
|
{ |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
//定义 6 上位机设定编码器角度值为0
|
||||
|
case 6: |
||||
|
{ |
||||
|
reset_current_value_0(); |
||||
|
break; |
||||
|
} |
||||
|
//定义 4 上位机设定Trace等级值,无返回
|
||||
|
case 4: |
||||
|
{ |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
//定义 3 上位机设定CV值
|
||||
|
case 3: |
||||
|
{ |
||||
|
CV_struct_define decoded_CV = CV_struct_define_init_default; |
||||
|
pb_istream_t i_cv_stream = |
||||
|
{ 0 }; |
||||
|
|
||||
|
i_cv_stream = pb_istream_from_buffer(decoded_Cmd.Buff_Data, |
||||
|
decoded_Cmd.Buff_Data_Length); |
||||
|
pb_decode(&i_cv_stream, CV_struct_define_fields, &decoded_CV); |
||||
|
//将CV写入EEPROM
|
||||
|
GF_BSP_EEPROM_Set_CV(decoded_CV); |
||||
|
|
||||
|
send_Cmd.Parameter3 = length; |
||||
|
WrapInCmdAndSendMessage(send_Cmd, 3, success, |
||||
|
"Set CV succeeded", isMqtt, send_Handler); |
||||
|
CV_GV_Init(); |
||||
|
break; |
||||
|
} |
||||
|
//定义 1 上位机获取默认CV值, 下位机返回CV的值,
|
||||
|
//定义 2 下位机返回CV值
|
||||
|
case 1: |
||||
|
{ |
||||
|
CV = GF_BSP_EEPROM_Get_CV(); |
||||
|
pb_ostream_t CV_o_stream = |
||||
|
{ 0 }; |
||||
|
char buf[1024]; |
||||
|
CV_o_stream = pb_ostream_from_buffer(buf, sizeof(buf)); |
||||
|
pb_encode(&CV_o_stream, CV_struct_define_fields, &CV); |
||||
|
|
||||
|
//将数据拷贝到Command中
|
||||
|
send_Cmd.CommadNum = 2; |
||||
|
send_Cmd.Buff_Data_Length = CV_o_stream.bytes_written; |
||||
|
|
||||
|
WrapInCmdAndSend(send_Cmd, buf, isMqtt, send_Handler); |
||||
|
|
||||
|
break; |
||||
|
} |
||||
|
default: |
||||
|
WrapInCmdAndSendMessage(send_Cmd, 0, fail, |
||||
|
"MB CRC failed and the length ", isMqtt, send_Handler); |
||||
|
break; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//LOG("desulfurizer_message_UART_Handler_ decoding succeeded");
|
||||
|
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
//LOG("desulfurizer_message_UART_Handler_ decoding failed");
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
void WrapInCmdAndSend(ReCmd send_Cmd, uint8_t *buf, char isMqtt, |
||||
|
struct UARTHandler *send_Handler) |
||||
|
{ |
||||
|
|
||||
|
memcpy(send_Cmd.Buff_Data, buf, send_Cmd.Buff_Data_Length); |
||||
|
pb_ostream_t ReCmd_out_stream = |
||||
|
{ 0 }; |
||||
|
|
||||
|
if (isMqtt == 1) |
||||
|
{ |
||||
|
ReCmd_out_stream = pb_ostream_from_buffer(&send_Handler->Tx_Buf[4], |
||||
|
sizeof(send_Handler->Tx_Buf) - 4); |
||||
|
pb_encode(&ReCmd_out_stream, ReCmd_fields, &send_Cmd); //encode to buffer
|
||||
|
|
||||
|
send_Handler->Tx_Buf[0] = '3'; |
||||
|
send_Handler->Tx_Buf[1] = ','; |
||||
|
send_Handler->Tx_Buf[2] = 0xfe; |
||||
|
send_Handler->Tx_Buf[3] = 0xfe; |
||||
|
send_Handler->TxCount = ReCmd_out_stream.bytes_written + 4; |
||||
|
send_Handler->UART_Tx(send_Handler); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
ReCmd_out_stream = pb_ostream_from_buffer(&send_Handler->Tx_Buf[2], |
||||
|
sizeof(send_Handler->Tx_Buf)-2); |
||||
|
pb_encode(&ReCmd_out_stream, ReCmd_fields, &send_Cmd); //encode to buffer
|
||||
|
send_Handler->Tx_Buf[0] = 0xfe; |
||||
|
send_Handler->Tx_Buf[1] = 0xfe; |
||||
|
//send_Handler->AddSendList(send_Handler,send_Handler->Tx_Buf,send_Handler->TxCount,NULL);
|
||||
|
send_Handler->TxCount = ReCmd_out_stream.bytes_written+2; |
||||
|
//send_Handler->TxCount = 200;
|
||||
|
send_Handler->UART_Tx(send_Handler); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//send_Cmd.CommadNum=0xff;//代表返回信息
|
||||
|
//send_Cmd.Parameter0 代表执行的指令,发过来的命令号;
|
||||
|
//send_Cmd.Parameter1 1 代表成功,0 代表失败;
|
||||
|
//send_Cmd.databuf 存的是相关信息,可以通过ACII转成string;
|
||||
|
|
||||
|
void WrapInCmdAndSendMessage(ReCmd send_Cmd, int8_t functionNum, char isSuccess, |
||||
|
uint8_t *buf, char isMqtt, struct UARTHandler *send_Handler) |
||||
|
{ |
||||
|
|
||||
|
send_Cmd.CommadNum = 0xff; //代表返回信息
|
||||
|
send_Cmd.Parameter0 = functionNum; //代表返回信息
|
||||
|
send_Cmd.Parameter1 = isSuccess; //1 代表成功,0 代表失败;
|
||||
|
send_Cmd.Buff_Data_Length = strlen(buf); |
||||
|
WrapInCmdAndSend(send_Cmd, buf, isMqtt, send_Handler); |
||||
|
} |
||||
|
|
||||
|
void send_received_data_to_upper_computer(uint8_t *buffer, uint16_t length) |
||||
|
{ |
||||
|
send_Cmd.CommadNum = 12; //定义12为设定Mqtt透传向上返回的数据
|
||||
|
send_Cmd.Buff_Data_Length = length; |
||||
|
|
||||
|
WrapInCmdAndSend(send_Cmd, buffer, 0, desulfurizer_message_UART_Handler); |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,649 @@ |
|||||
|
/*-----------------------------------------------------------
|
||||
|
* Includes files |
||||
|
*----------------------------------------------------------*/ |
||||
|
|
||||
|
/* lib includes. */ |
||||
|
#include <string.h> |
||||
|
#include "BHBF_ROBOT.h" |
||||
|
#include "bsp_EEPROM.h" |
||||
|
/* segger rtt includes. */ |
||||
|
|
||||
|
#include "bsp_cpu_flash.h" |
||||
|
#include <string.h> |
||||
|
//#include "bsp_mqtt.h"
|
||||
|
/* lwip includes. */ |
||||
|
#include "lwip/apps/mqtt.h" |
||||
|
#include "lwip/ip4_addr.h" |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <stdbool.h> |
||||
|
#include "bsp_mqtt.h" |
||||
|
|
||||
|
#include "pb_decode.h" |
||||
|
#include "pb_encode.h" |
||||
|
#include "bsp_CV.pb.h" |
||||
|
#include "bsp_pb_decode_encode.h" |
||||
|
#include "bsp_EEPROM.h" |
||||
|
#include "bsp_IAP.pb.h" |
||||
|
#include "bsp_cpu_flash.h" |
||||
|
#define USE_MQTT_MUTEX //使用发送数据的互斥锁,多个任务有发送才必须
|
||||
|
#ifdef USE_MQTT_MUTEX |
||||
|
//static SemaphoreHandle_t s__mqtt_publish_mutex = NULL;
|
||||
|
#endif /* USE_MQTT_MUTEX */ |
||||
|
|
||||
|
//typedef struct
|
||||
|
//{
|
||||
|
// int topic_id;
|
||||
|
// char *str;
|
||||
|
//} topic_string;
|
||||
|
|
||||
|
// topic_string receive_topic_dic[] =
|
||||
|
//{
|
||||
|
//
|
||||
|
// { re_CV_struct_define, "receive_CV_struct_define" },
|
||||
|
// { re_PV_struct_define, "re_PV_struct_define" },
|
||||
|
// { re_PV_struct_define, "re_PV_struct_define" },
|
||||
|
//
|
||||
|
//};
|
||||
|
|
||||
|
// topic_string publish_topic_dic[] = {
|
||||
|
//
|
||||
|
// { pb_CV_struct_define, "CV_struct_define" },
|
||||
|
// { pb_GV_struct_define, "GV_struct_define" },
|
||||
|
// { pb_PV_struct_define, "m-notification-ind" },
|
||||
|
//
|
||||
|
//};
|
||||
|
|
||||
|
//
|
||||
|
//char *receive_topic2String(unsigned char val, const topic_string *array, char *def)
|
||||
|
//{
|
||||
|
// int i = 0;
|
||||
|
//
|
||||
|
// while (array[i].str != NULL && array[i].topic_id != val)
|
||||
|
// {
|
||||
|
// i++;
|
||||
|
// }
|
||||
|
// if (array[i].str == NULL)
|
||||
|
// return def;
|
||||
|
//
|
||||
|
// return array[i].str;
|
||||
|
//}
|
||||
|
|
||||
|
#define topic_length 30 |
||||
|
|
||||
|
char *receivedtopic; |
||||
|
|
||||
|
// has to be paried one by one
|
||||
|
enum subscribe_topic_enum |
||||
|
{ |
||||
|
sb_CV_struct_define = 0, sb_GV_struct_define, sb_PV_struct_define |
||||
|
}; |
||||
|
enum publish_topic_enum |
||||
|
{ |
||||
|
pb_CV_struct_define = 0, pb_GV_struct_define, pb_PV_struct_define |
||||
|
}; |
||||
|
|
||||
|
char subscribe_topics[][topic_length] = |
||||
|
{ |
||||
|
{ "GetCVTopic" }, |
||||
|
{ "SetCVTopic" }, |
||||
|
{ "sb_PV_struct_define" }, |
||||
|
{ "IAP" }, //IAP upload
|
||||
|
}; |
||||
|
//in this array,
|
||||
|
char publish_topics[][topic_length] = |
||||
|
{ |
||||
|
{ "CV_struct_define" }, |
||||
|
{ "GV_struct_define" }, |
||||
|
{ "PV_struct_define" }, |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
static mqtt_client_t *s__mqtt_client_instance = NULL; //mqtt连接句柄,这里一定要设置全局变量,防止 lwip 底层重复申请空间
|
||||
|
|
||||
|
//MQTT 数据结构体
|
||||
|
struct mqtt_recv_buffer |
||||
|
{ |
||||
|
char recv_buffer[1024]; //储存接收的buffer
|
||||
|
uint16_t recv_len; //记录已接收多少个字节的数据,MQTT的数据分包来的
|
||||
|
uint16_t recv_total; //MQTT接收数据的回调函数会有个总的大小
|
||||
|
}; |
||||
|
|
||||
|
//结构体初始化
|
||||
|
struct mqtt_recv_buffer s__mqtt_recv_buffer_g = |
||||
|
{ .recv_len = 0, .recv_total = 0, }; |
||||
|
|
||||
|
static err_t bsp_mqtt_connect(void); |
||||
|
|
||||
|
static err_t bsp_mqtt_subscribe(mqtt_client_t *mqtt_client, char *sub_topic, |
||||
|
uint8_t qos); |
||||
|
|
||||
|
/* ===========================================
|
||||
|
接收回调函数 |
||||
|
============================================== */ |
||||
|
|
||||
|
/*!
|
||||
|
* @brief mqtt 接收数据处理函数接口,需要在应用层进行处理 |
||||
|
* 执行条件:mqtt连接成功 |
||||
|
* |
||||
|
* @param [in1] : 用户提供的回调参数指针 |
||||
|
* @param [in2] : 接收的数据指针 |
||||
|
* @param [in3] : 接收数据长度 |
||||
|
* @retval: 处理的结果 |
||||
|
*/ |
||||
|
__weak int mqtt_rec_data_process(void *arg, char *rec_buf, uint64_t buf_len) |
||||
|
{ |
||||
|
//print_log("recv_buffer = %s\n", rec_buf);
|
||||
|
|
||||
|
if (strcmp(receivedtopic, "GetCVTopic") == 0) |
||||
|
{ |
||||
|
//反序列化,得到GV
|
||||
|
//CV_struct_define CV= pb_decode_CV(rec_buf,buf_len);
|
||||
|
//read CV from EEPROM
|
||||
|
CV_struct_define CV = GF_BSP_EEPROM_Get_CV(); |
||||
|
// publish cv
|
||||
|
bsp_mqtt_test(); |
||||
|
// return CV topic
|
||||
|
//log_info("CAN", "specifications is for insects");
|
||||
|
//
|
||||
|
|
||||
|
} else if (strcmp(receivedtopic, "SetCVTopic") == 0) |
||||
|
{ |
||||
|
//反序列化,得到CV
|
||||
|
CV_struct_define CV = pb_decode_CV(rec_buf, buf_len); |
||||
|
GF_BSP_EEPROM_Set_CV(CV); |
||||
|
|
||||
|
} else if (strcmp(receivedtopic, "IAP") == 0) |
||||
|
{ |
||||
|
char data[2000]; |
||||
|
memcpy(data,rec_buf,buf_len); |
||||
|
//反序列化,得到GV
|
||||
|
IAP_struct_define iap = pb_decode_IAP(rec_buf, buf_len); |
||||
|
|
||||
|
//if (iap.MB_CRC16 == MB_CRC16(iap.Buff_Data, 512))
|
||||
|
//{
|
||||
|
//将数据写入flash中
|
||||
|
// 一上电就清空download flash
|
||||
|
// bsp_WriteCpuFlash(App_Download_Addr+iap.Buff_Data_Start_Count,iap.Buff_Data,512);
|
||||
|
//
|
||||
|
// if(iap.Is_Finished==1)
|
||||
|
// {
|
||||
|
// //CV= GF_BSP_EEPROM_Get_CV();//Get the version of the code
|
||||
|
// CV.UpgradeSucceeded=1;
|
||||
|
// GF_BSP_EEPROM_Set_CV(CV);
|
||||
|
// //重启系统,进入bootloader
|
||||
|
// NVIC_SystemReset();
|
||||
|
// }
|
||||
|
//}
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
/*!
|
||||
|
* @brief MQTT 接收到数据的回调函数 |
||||
|
* 执行条件:MQTT 连接成功 |
||||
|
* |
||||
|
* @param [in1] : 用户提供的回调参数指针 |
||||
|
* @param [in2] : MQTT 收到的分包数据指针 |
||||
|
* @param [in3] : MQTT 分包数据长度 |
||||
|
* @param [in4] : MQTT 数据包的标志位 |
||||
|
* @retval: None |
||||
|
*/ |
||||
|
static void bsp_mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, |
||||
|
u8_t flags) |
||||
|
{ |
||||
|
// u8_t recevieddata[100];
|
||||
|
// memset(recevieddata, 0,
|
||||
|
// sizeof(recevieddata));
|
||||
|
// memcpy(recevieddata,data,len);
|
||||
|
|
||||
|
if( (data == NULL) || (len == 0) ) |
||||
|
//if ((data == NULL))
|
||||
|
{ |
||||
|
//print_log("mqtt_client_incoming_data_cb: condition error @entry\n");
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if (s__mqtt_recv_buffer_g.recv_len + len |
||||
|
< sizeof(s__mqtt_recv_buffer_g.recv_buffer)) |
||||
|
{ |
||||
|
//
|
||||
|
snprintf( |
||||
|
&s__mqtt_recv_buffer_g.recv_buffer[s__mqtt_recv_buffer_g.recv_len], |
||||
|
len+1, "%s", data); |
||||
|
//source code is
|
||||
|
|
||||
|
// snprintf(
|
||||
|
// &s__mqtt_recv_buffer_g.recv_buffer[s__mqtt_recv_buffer_g.recv_len],
|
||||
|
// len, "%s", data);
|
||||
|
s__mqtt_recv_buffer_g.recv_len += len; |
||||
|
} |
||||
|
|
||||
|
if ((flags & MQTT_DATA_FLAG_LAST) == MQTT_DATA_FLAG_LAST) |
||||
|
{ |
||||
|
//处理数据
|
||||
|
mqtt_rec_data_process(arg, s__mqtt_recv_buffer_g.recv_buffer, |
||||
|
s__mqtt_recv_buffer_g.recv_len); |
||||
|
|
||||
|
//已接收字节计数归0
|
||||
|
s__mqtt_recv_buffer_g.recv_len = 0; |
||||
|
|
||||
|
//清空接收buffer
|
||||
|
memset(s__mqtt_recv_buffer_g.recv_buffer, 0, |
||||
|
sizeof(s__mqtt_recv_buffer_g.recv_buffer)); |
||||
|
} |
||||
|
|
||||
|
//print_log("mqtt_client_incoming_data_cb:reveiving incomming data.\n");
|
||||
|
} |
||||
|
|
||||
|
/*!
|
||||
|
* @brief MQTT 接收到数据的回调函数 |
||||
|
* 执行条件:MQTT 连接成功 |
||||
|
* |
||||
|
* @param [in] : 用户提供的回调参数指针 |
||||
|
* @param [in] : MQTT 收到数据的topic |
||||
|
* @param [in] : MQTT 收到数据的总长度 |
||||
|
* @retval: None |
||||
|
*/ |
||||
|
static void bsp_mqtt_incoming_publish_cb(void *arg, const char *topic, |
||||
|
u32_t tot_len) |
||||
|
{ |
||||
|
//if( (topic == NULL) || (tot_len == 0) )
|
||||
|
if ((topic == NULL)) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_incoming_publish_cb: condition error @entry\n");
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
memset(receivedtopic, '\0', sizeof(receivedtopic)); |
||||
|
|
||||
|
strcpy(receivedtopic, topic); |
||||
|
//print_log("bsp_mqtt_incoming_publish_cb: topic = %s.\n",topic);
|
||||
|
//print_log("bsp_mqtt_incoming_publish_cb: tot_len = %d.\n",tot_len);
|
||||
|
s__mqtt_recv_buffer_g.recv_total = tot_len; //需要接收的总字节
|
||||
|
s__mqtt_recv_buffer_g.recv_len = 0; //已接收字节计数归0
|
||||
|
|
||||
|
//清空接收buffer
|
||||
|
memset(s__mqtt_recv_buffer_g.recv_buffer, 0, |
||||
|
sizeof(s__mqtt_recv_buffer_g.recv_buffer)); |
||||
|
} |
||||
|
|
||||
|
/* ===========================================
|
||||
|
连接状态回调函数 |
||||
|
============================================== */ |
||||
|
|
||||
|
/*!
|
||||
|
* @brief MQTT 连接成功的处理函数,需要的话在应用层定义 |
||||
|
* |
||||
|
* @param [in1] : MQTT 连接句柄 |
||||
|
* @param [in2] : MQTT 连接参数指针 |
||||
|
* |
||||
|
* @retval: None |
||||
|
*/ |
||||
|
__weak void mqtt_conn_suc_proc(mqtt_client_t *client, void *arg) |
||||
|
{ |
||||
|
// char test_sub_topic[] = "/public/TEST/AidenHinGwenWong_sub";
|
||||
|
// bsp_mqtt_subscribe(client,"CV_struct_define",0);//subscribe for CVStruct
|
||||
|
// bsp_mqtt_subscribe(client,test_sub_topic,0);
|
||||
|
// bsp_mqtt_subscribe(client,test_sub_topic,0);
|
||||
|
int i = 0; |
||||
|
// int length=sizeof(subscribe_topics)/topic_length;
|
||||
|
for (i = 0; i < sizeof(subscribe_topics) / topic_length; i++) |
||||
|
{ |
||||
|
bsp_mqtt_subscribe(client, subscribe_topics[i], 0); //subscribe for CVStruct
|
||||
|
} |
||||
|
|
||||
|
//
|
||||
|
} |
||||
|
|
||||
|
/*!
|
||||
|
* @brief MQTT 处理失败调用的函数 |
||||
|
* |
||||
|
* @param [in1] : MQTT 连接句柄 |
||||
|
* @param [in2] : MQTT 连接参数指针 |
||||
|
* |
||||
|
* @retval: None |
||||
|
*/ |
||||
|
//__weak void mqtt_error_process_callback(mqtt_client_t * client, void *arg)
|
||||
|
__weak void mqtt_error_process_callback(mqtt_client_t *client, void *arg) |
||||
|
{ |
||||
|
//bsp_mqtt_connect();
|
||||
|
//bsp_mqtt_connect();
|
||||
|
bsp_mqtt_connect(); |
||||
|
} |
||||
|
|
||||
|
/*!
|
||||
|
* @brief MQTT 连接状态的回调函数 |
||||
|
* |
||||
|
* @param [in] : MQTT 连接句柄 |
||||
|
* @param [in] : 用户提供的回调参数指针 |
||||
|
* @param [in] : MQTT 连接状态 |
||||
|
* @retval: None |
||||
|
*/ |
||||
|
static void bsp_mqtt_connection_cb(mqtt_client_t *client, void *arg, |
||||
|
mqtt_connection_status_t status) |
||||
|
{ |
||||
|
if (client == NULL) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_connection_cb: condition error @entry\n");
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if (status == MQTT_CONNECT_ACCEPTED) //Successfully connected
|
||||
|
{ |
||||
|
//print_log("bsp_mqtt_connection_cb: Successfully connected\n");
|
||||
|
|
||||
|
// 注册接收数据的回调函数
|
||||
|
mqtt_set_inpub_callback(client, bsp_mqtt_incoming_publish_cb, |
||||
|
bsp_mqtt_incoming_data_cb, arg); |
||||
|
|
||||
|
//成功处理函数
|
||||
|
mqtt_conn_suc_proc(client, arg); |
||||
|
} else |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_connection_cb: Fail connected, status = %s\n", lwip_strerr(status) );
|
||||
|
//错误处理
|
||||
|
mqtt_error_process_callback(client, arg); |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*!
|
||||
|
* @brief 连接到 mqtt 服务器 |
||||
|
* 执行条件:无 |
||||
|
* |
||||
|
* @param [in] : None |
||||
|
* |
||||
|
* @retval: 连接状态,如果返回不是 ERR_OK 则需要重新连接 |
||||
|
*/ |
||||
|
static err_t bsp_mqtt_connect(void) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_connect: Enter!\n");
|
||||
|
err_t ret; |
||||
|
|
||||
|
struct mqtt_connect_client_info_t mqtt_connect_info = |
||||
|
{ "AidenHinGwenWong_MQTT_Test", /* 这里需要修改,以免在同一个服务器两个相同ID会发生冲突 */ |
||||
|
"admin", /* MQTT 服务器用户名 */ |
||||
|
"123456", /* MQTT 服务器密码 */ |
||||
|
60, /* 与 MQTT 服务器保持连接时间,时间超过未发送数据会断开 */ |
||||
|
"/public/TEST/AidenHinGwenWong_pub",/* MQTT遗嘱的消息发送topic */ |
||||
|
"Offline_pls_check", /* MQTT遗嘱的消息,断开服务器的时候会发送 */ |
||||
|
0, /* MQTT遗嘱的消息 Qos */ |
||||
|
0 /* MQTT遗嘱的消息 Retain */ |
||||
|
}; |
||||
|
|
||||
|
ip_addr_t server_ip; |
||||
|
ip4_addr_set_u32(&server_ip, ipaddr_addr("192.168.24.99")); //MQTT服务器IP
|
||||
|
|
||||
|
uint16_t server_port = 10086; //注意这里是 MQTT 的 TCP 连接方式的端口号!!!!
|
||||
|
|
||||
|
if (s__mqtt_client_instance == NULL) |
||||
|
{ |
||||
|
// 句柄==NULL 才申请空间,否则无需重复申请
|
||||
|
s__mqtt_client_instance = mqtt_client_new(); |
||||
|
} |
||||
|
|
||||
|
if (s__mqtt_client_instance == NULL) |
||||
|
{ |
||||
|
//防止申请失败
|
||||
|
//print_log("bsp_mqtt_connect: s__mqtt_client_instance malloc fail @@!!!\n");
|
||||
|
return ERR_MEM; |
||||
|
} |
||||
|
|
||||
|
//进行连接,注意:如果需要带入 arg ,arg必须是全局变量,局部变量指针会被回收,大坑!!!!!
|
||||
|
ret = mqtt_client_connect(s__mqtt_client_instance, &server_ip, server_port, |
||||
|
bsp_mqtt_connection_cb, NULL, &mqtt_connect_info); |
||||
|
|
||||
|
/******************
|
||||
|
小提示:连接错误不需要做任何操作,mqtt_client_connect 中注册的回调函数里面做判断并进行对应的操作 |
||||
|
*****************/ |
||||
|
|
||||
|
//print_log("bsp_mqtt_connect: connect to mqtt %s\n", lwip_strerr(ret));
|
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
/* ===========================================
|
||||
|
发送接口、回调函数 |
||||
|
============================================== */ |
||||
|
|
||||
|
/*!
|
||||
|
* @brief MQTT 发送数据的回调函数 |
||||
|
* 执行条件:MQTT 连接成功 |
||||
|
* |
||||
|
* @param [in] : 用户提供的回调参数指针 |
||||
|
* @param [in] : MQTT 发送的结果:成功或者可能的错误 |
||||
|
* @retval: None |
||||
|
*/ |
||||
|
static void mqtt_client_pub_request_cb(void *arg, err_t result) |
||||
|
{ |
||||
|
|
||||
|
mqtt_client_t *client = (mqtt_client_t*) arg; |
||||
|
if (result != ERR_OK) |
||||
|
{ |
||||
|
//print_log("mqtt_client_pub_request_cb: c002: Publish FAIL, result = %s\n", lwip_strerr(result));
|
||||
|
|
||||
|
//错误处理
|
||||
|
mqtt_error_process_callback(client, arg); |
||||
|
} else |
||||
|
{ |
||||
|
//print_log("mqtt_client_pub_request_cb: c005: Publish complete!\n");
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*!
|
||||
|
* @brief 发送消息到服务器 |
||||
|
* 执行条件:无 |
||||
|
* |
||||
|
* @param [in1] : mqtt 连接句柄 |
||||
|
* @param [in2] : mqtt 发送 topic 指针 |
||||
|
* @param [in3] : 发送数据包指针 |
||||
|
* @param [in4] : 数据包长度 |
||||
|
* @param [in5] : qos |
||||
|
* @param [in6] : retain |
||||
|
* @retval: 发送状态 |
||||
|
* @note: 有可能发送不成功但是现实返回值是 0 ,需要判断回调函数 mqtt_client_pub_request_cb 是否 result == ERR_OK |
||||
|
*/ |
||||
|
err_t bsp_mqtt_publish(mqtt_client_t *client, char *pub_topic, char *pub_buf, |
||||
|
uint16_t data_len, uint8_t qos, uint8_t retain) |
||||
|
{ |
||||
|
//if ( (client == NULL) || (pub_topic == NULL) || (pub_buf == NULL) || (data_len == 0) || (qos > 2) || (retain > 1) )
|
||||
|
if ((client == NULL) || (pub_topic == NULL) || (pub_buf == NULL) |
||||
|
|| (qos > 2) || (retain > 1)) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_publish: input error@@" );
|
||||
|
return ERR_VAL; |
||||
|
} |
||||
|
|
||||
|
//判断是否连接状态
|
||||
|
if (mqtt_client_is_connected(client) != 1) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_publish: client is not connected\n");
|
||||
|
return ERR_CONN; |
||||
|
} |
||||
|
|
||||
|
err_t err; |
||||
|
#ifdef USE_MQTT_MUTEX |
||||
|
|
||||
|
// 创建 mqtt 发送互斥锁
|
||||
|
//if (s__mqtt_publish_mutex == NULL)
|
||||
|
// {
|
||||
|
//print_log("bsp_mqtt_publish: create mqtt mutex ! \n" );
|
||||
|
// s__mqtt_publish_mutex = xSemaphoreCreateMutex();
|
||||
|
//}
|
||||
|
|
||||
|
// if (xSemaphoreTake(s__mqtt_publish_mutex, portMAX_DELAY) == pdPASS)
|
||||
|
#endif /* USE_MQTT_MUTEX */ |
||||
|
|
||||
|
{ |
||||
|
err = mqtt_publish(client, pub_topic, pub_buf, data_len, qos, retain, |
||||
|
mqtt_client_pub_request_cb, (void*) client); |
||||
|
//print_log("bsp_mqtt_publish: mqtt_publish err = %s\n", lwip_strerr(err) );
|
||||
|
|
||||
|
#ifdef USE_MQTT_MUTEX |
||||
|
//print_log("bsp_mqtt_publish: mqtt_publish xSemaphoreTake\n");
|
||||
|
// xSemaphoreGive(s__mqtt_publish_mutex);
|
||||
|
#endif /* USE_MQTT_MUTEX */ |
||||
|
|
||||
|
} |
||||
|
return err; |
||||
|
} |
||||
|
|
||||
|
/* ===========================================
|
||||
|
MQTT 订阅接口函数 |
||||
|
============================================== */ |
||||
|
|
||||
|
/*!
|
||||
|
* @brief MQTT 订阅的回调函数 |
||||
|
* 执行条件:MQTT 连接成功 |
||||
|
* |
||||
|
* @param [in] : 用户提供的回调参数指针 |
||||
|
* @param [in] : MQTT 订阅结果 |
||||
|
* @retval: None |
||||
|
*/ |
||||
|
static void bsp_mqtt_request_cb(void *arg, err_t err) |
||||
|
{ |
||||
|
if (arg == NULL) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_request_cb: input error@@\n");
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
mqtt_client_t *client = (mqtt_client_t*) arg; |
||||
|
|
||||
|
if (err != ERR_OK) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_request_cb: FAIL sub, sub again, err = %s\n", lwip_strerr(err));
|
||||
|
|
||||
|
//错误处理
|
||||
|
mqtt_error_process_callback(client, arg); |
||||
|
} else |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_request_cb: sub SUCCESS!\n");
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*!
|
||||
|
* @brief mqtt 订阅 |
||||
|
* 执行条件:连接成功 |
||||
|
* |
||||
|
* @param [in1] : mqtt 连接句柄 |
||||
|
* @param [in2] : mqtt 发送 topic 指针 |
||||
|
* @param [in5] : qos |
||||
|
* @retval: 订阅状态 |
||||
|
*/ |
||||
|
static err_t bsp_mqtt_subscribe(mqtt_client_t *mqtt_client, char *sub_topic, |
||||
|
uint8_t qos) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_subscribe: Enter\n");
|
||||
|
|
||||
|
if ((mqtt_client == NULL) || (sub_topic == NULL) || (qos > 2)) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_subscribe: input error@@\n");
|
||||
|
return ERR_VAL; |
||||
|
} |
||||
|
|
||||
|
if (mqtt_client_is_connected(mqtt_client) != 1) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_subscribe: mqtt is not connected, return ERR_CLSD.\n");
|
||||
|
return ERR_CLSD; |
||||
|
} |
||||
|
|
||||
|
err_t err; |
||||
|
err = mqtt_subscribe(mqtt_client, sub_topic, qos, bsp_mqtt_request_cb, |
||||
|
(void* )mqtt_client); // subscribe and call back.
|
||||
|
|
||||
|
if (err != ERR_OK) |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_subscribe: mqtt_subscribe Fail, return:%s \n", lwip_strerr(err));
|
||||
|
} else |
||||
|
{ |
||||
|
//print_log("bsp_mqtt_subscribe: mqtt_subscribe SUCCESS, reason: %s\n", lwip_strerr(err));
|
||||
|
} |
||||
|
|
||||
|
return err; |
||||
|
} |
||||
|
|
||||
|
/* ===========================================
|
||||
|
初始化接口函数 |
||||
|
============================================== */ |
||||
|
|
||||
|
/*!
|
||||
|
* @brief 封装 MQTT 初始化接口 |
||||
|
* 执行条件:无 |
||||
|
* |
||||
|
* @retval: 无 |
||||
|
*/ |
||||
|
void bsp_mqtt_init(void) |
||||
|
{ |
||||
|
//print_log("Mqtt init...");
|
||||
|
|
||||
|
// 连接服务器
|
||||
|
bsp_mqtt_connect(); |
||||
|
|
||||
|
// 发送消息到服务器
|
||||
|
char message_test[] = "Hello mqtt server"; |
||||
|
//for(int i = 0; i < 10; i++)
|
||||
|
//{
|
||||
|
bsp_mqtt_publish(s__mqtt_client_instance, |
||||
|
"/public/TEST/AidenHinGwenWong_pub", message_test, |
||||
|
sizeof(message_test), 1, 0); |
||||
|
|
||||
|
// HAL_Delay(1000);
|
||||
|
//}
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
void bsp_mqtt_test(void) |
||||
|
{ |
||||
|
// 发送消息到服务器
|
||||
|
//char message_test[] = "Hello mqtt server";
|
||||
|
//for(int i = 0; i < 10; i++)
|
||||
|
//{
|
||||
|
|
||||
|
uint8_t buf[64]; |
||||
|
size_t len; |
||||
|
CV_struct_define o = CV_struct_define_init_default; // CV_struct_define_init_default this defination can only be used when initialize the struct;
|
||||
|
CV_struct_define n = CV_struct_define_init_default; |
||||
|
|
||||
|
pb_ostream_t o_stream = |
||||
|
{ 0 }; |
||||
|
pb_istream_t i_stream = |
||||
|
{ 0 }; |
||||
|
|
||||
|
o_stream = pb_ostream_from_buffer(buf, sizeof(buf)); |
||||
|
pb_encode(&o_stream, CV_struct_define_fields, &o); |
||||
|
|
||||
|
len = o_stream.bytes_written; // send the [o_stream.bytes_written] bytes, startting from buf
|
||||
|
|
||||
|
err_enum_t status = bsp_mqtt_publish(s__mqtt_client_instance, |
||||
|
publish_topics[pb_CV_struct_define], buf, len, 1, 0); |
||||
|
|
||||
|
//err_enum_t status= bsp_mqtt_publish(s__mqtt_client_instance,"/public/TEST/AidenHinGwenWong_pub",message_test,sizeof(message_test),1,0);
|
||||
|
if (status == ERR_CONN) |
||||
|
{ |
||||
|
//发送错误
|
||||
|
//reconnect
|
||||
|
//
|
||||
|
bsp_mqtt_connect(); |
||||
|
} |
||||
|
// HAL_Delay(1000);
|
||||
|
//}
|
||||
|
} |
||||
|
void bsp_mqtt_pub_send(char topic[], char buf[], size_t len) |
||||
|
{ |
||||
|
|
||||
|
err_enum_t status = bsp_mqtt_publish(s__mqtt_client_instance, topic, buf, |
||||
|
len, 1, 0); |
||||
|
|
||||
|
//err_enum_t status= bsp_mqtt_publish(s__mqtt_client_instance,"/public/TEST/AidenHinGwenWong_pub",message_test,sizeof(message_test),1,0);
|
||||
|
if (status == ERR_CONN) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
@ -0,0 +1,36 @@ |
|||||
|
/*
|
||||
|
* bsp_mqtt_pub.c |
||||
|
* |
||||
|
* Created on: Jul 9, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
|
||||
|
#include "bsp_mqtt_pub.h" |
||||
|
|
||||
|
char sendbuf[1024]; |
||||
|
size_t length; |
||||
|
|
||||
|
void log_info(char logger[], char message[]) |
||||
|
{ |
||||
|
memset(sendbuf,'\0',sizeof(sendbuf)); |
||||
|
//char buf, size_t* len,TraceLevel traceLevel, char logger[], char message[]
|
||||
|
pb_encode_TraceMessage(sendbuf,sizeof(sendbuf), &length,"log",logger,message); |
||||
|
bsp_mqtt_pub_send("TraceMessage",sendbuf,length); |
||||
|
|
||||
|
} |
||||
|
void log_err(char logger[], char message[]) |
||||
|
{ |
||||
|
memset(sendbuf,'\0',sizeof(sendbuf)); |
||||
|
//char buf, size_t* len,TraceLevel traceLevel, char logger[], char message[]
|
||||
|
pb_encode_TraceMessage(sendbuf ,sizeof(sendbuf),&length,"err",logger,message); |
||||
|
bsp_mqtt_pub_send("TraceMessage",sendbuf,length); |
||||
|
|
||||
|
} |
||||
|
void log_debug(char logger[], char message[]) |
||||
|
{ |
||||
|
memset(sendbuf,'\0',sizeof(sendbuf)); |
||||
|
//char buf, size_t* len,TraceLevel traceLevel, char logger[], char message[]
|
||||
|
pb_encode_TraceMessage(sendbuf,sizeof(sendbuf), &length,"debug",logger,message); |
||||
|
bsp_mqtt_pub_send("TraceMessage",sendbuf,length); |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,126 @@ |
|||||
|
/*
|
||||
|
* bsp_pb_decode_encode.c |
||||
|
* |
||||
|
* Created on: Jul 5, 2024 |
||||
|
* Author: akeguo |
||||
|
*/ |
||||
|
#include "bsp_pb_decode_encode.h" |
||||
|
#include "bsp_CV.pb.h" |
||||
|
#include "bsp_IAP.pb.h" |
||||
|
|
||||
|
|
||||
|
bool pb_encode_string_cb(pb_ostream_t *stream, const pb_field_t *field, |
||||
|
void *const*arg) |
||||
|
{ |
||||
|
pb_buffer_arg *data = (pb_buffer_arg*) *arg; |
||||
|
if (pb_encode_tag_for_field(stream, field) |
||||
|
&& pb_encode_string(stream, data->buf, data->buf_len)) |
||||
|
return true; |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
bool pb_decode_string_cb(pb_istream_t *stream, const pb_field_t *field, |
||||
|
void **arg) |
||||
|
{ |
||||
|
pb_buffer_arg *data = (pb_buffer_arg*) *arg; |
||||
|
|
||||
|
data->buf_len = stream->bytes_left; |
||||
|
data->buf = stream->state; |
||||
|
return pb_read(stream, (pb_byte_t*) NULL, stream->bytes_left); |
||||
|
} |
||||
|
void Test_CV() |
||||
|
{ |
||||
|
uint8_t buf[64]; |
||||
|
size_t len; |
||||
|
CV_struct_define o = CV_struct_define_init_default; // CV_struct_define_init_default this defination can only be used when initialize the struct;
|
||||
|
CV_struct_define n = CV_struct_define_init_default; |
||||
|
|
||||
|
pb_ostream_t o_stream = |
||||
|
{ 0 }; |
||||
|
pb_istream_t i_stream = |
||||
|
{ 0 }; |
||||
|
|
||||
|
//strcat(o.Date_Time, "MikeJordan");
|
||||
|
// o.Speed[0] = 11;
|
||||
|
// o.Speed[1] = 22;
|
||||
|
// o.Speed[2] = 33;
|
||||
|
// encode
|
||||
|
// char const date_string[] = "2024-7-5 10:19 pm";
|
||||
|
// o.Date_Time.funcs.encode = pb_encode_string_cb;
|
||||
|
// o.Date_Time.arg = &((pb_buffer_arg )
|
||||
|
// { .buf = date_string, .buf_len = sizeof(date_string) } );
|
||||
|
//
|
||||
|
// char const id_string[] = "Robot-01-03-08";
|
||||
|
// o.Robot_ID.funcs.encode = pb_encode_string_cb;
|
||||
|
// o.Robot_ID.arg = &((pb_buffer_arg )
|
||||
|
// { .buf = id_string, .buf_len = sizeof(id_string) } );
|
||||
|
|
||||
|
o_stream = pb_ostream_from_buffer(buf, sizeof(buf)); |
||||
|
pb_encode(&o_stream, CV_struct_define_fields, &o); |
||||
|
|
||||
|
len = o_stream.bytes_written; // send the [o_stream.bytes_written] bytes, startting from buf
|
||||
|
|
||||
|
// decode example
|
||||
|
|
||||
|
// i_stream = pb_istream_from_buffer(buf, len);
|
||||
|
// //decode
|
||||
|
// pb_buffer_arg decode_datetime_string = { .buf = NULL, .buf_len = 0 };
|
||||
|
// n.Date_Time.arg = &decode_datetime_string;
|
||||
|
// n.Date_Time.funcs.decode = pb_decode_string_cb;
|
||||
|
//
|
||||
|
// pb_buffer_arg decode_id_string = { .buf = NULL, .buf_len = 0 };
|
||||
|
// n.Robot_ID.arg = &decode_id_string;
|
||||
|
// n.Robot_ID.funcs.decode = pb_decode_string_cb;
|
||||
|
|
||||
|
pb_decode(&i_stream, CV_struct_define_fields, &n); |
||||
|
|
||||
|
char decodestring[100]; |
||||
|
//strncpy(decodestring, decode_datetime_string.buf,
|
||||
|
// decode_datetime_string.buf_len);
|
||||
|
|
||||
|
decodestring[99] = 'a'; |
||||
|
// printf("decode_string:%s , buf_len:%zu\n",decode_datetime_string.buf, decode_datetime_string.buf_len);
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
CV_struct_define pb_decode_CV(char *buf, size_t length) |
||||
|
{ |
||||
|
CV_struct_define decoded_CV = CV_struct_define_init_default; |
||||
|
pb_istream_t i_stream = |
||||
|
{ 0 }; |
||||
|
|
||||
|
i_stream = pb_istream_from_buffer(buf, length); |
||||
|
pb_decode(&i_stream, CV_struct_define_fields, &decoded_CV); |
||||
|
return decoded_CV; |
||||
|
} |
||||
|
|
||||
|
IAP_struct_define pb_decode_IAP(uint8_t *buf, size_t length) |
||||
|
{ |
||||
|
|
||||
|
|
||||
|
IAP_struct_define decoded_IAP =IAP_struct_define_init_default; |
||||
|
pb_istream_t i_stream = |
||||
|
{ 0 }; |
||||
|
|
||||
|
i_stream = pb_istream_from_buffer(buf, length); |
||||
|
pb_decode(&i_stream, IAP_struct_define_fields, &decoded_IAP); |
||||
|
|
||||
|
|
||||
|
|
||||
|
return decoded_IAP; |
||||
|
} |
||||
|
|
||||
|
GV_struct_define* pb_decode_GV(char *buf, size_t length) |
||||
|
{ |
||||
|
GV_struct_define decoded_struct = GV_struct_define_init_default; |
||||
|
pb_istream_t i_stream = |
||||
|
{ 0 }; |
||||
|
|
||||
|
i_stream = pb_istream_from_buffer(buf, length); |
||||
|
|
||||
|
pb_decode(&i_stream, GV_struct_define_fields, &decoded_struct); |
||||
|
return &decoded_struct; |
||||
|
} |
||||
|
|
||||
|
|
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue