Browse Source

update

master
zhaohe 5 months ago
parent
commit
44b5a14c75
  1. 6
      .cproject
  2. 4
      .settings/language.settings.xml
  3. 4
      Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h
  4. 2
      a8000_protocol
  5. 2
      a8000_subboard.launch
  6. 2
      rst.bat
  7. 2
      sdk/components/tmc/ic/ztmc5130.cpp
  8. 24
      sdk/components/zcancmder/basic.cpp
  9. 17
      sdk/components/zcancmder/basic.hpp
  10. 29
      sdk/components/zcancmder/protocol_event_bus_sender.cpp
  11. 67
      sdk/components/zcancmder/zcan_protocol_parser.cpp
  12. 6
      sdk/components/zcancmder/zcan_protocol_parser.hpp
  13. 198
      sdk/components/zcancmder/zcanreceiver.cpp
  14. 15
      sdk/components/zcancmder/zcanreceiver.hpp
  15. 13
      usrc/public_service/stm32irq.c
  16. 18
      usrc/public_service/stm32irq.h
  17. 1
      usrc/subboards/subboard40_and_50_temperature_ctrl/subboard40_and_50_temperature_ctrl_board.c

6
.cproject

@ -40,7 +40,7 @@
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.546451949" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.782799112" 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.1115926827" 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.debuglevel.1115926827" 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.g1" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.390305872" 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.o0" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1156405800" 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"/>
@ -66,7 +66,7 @@
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.330299437" 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.344817877" 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.529642841" 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.debuglevel.529642841" 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.g1" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.345929657" 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.o1" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols.980152850" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="DEBUG"/>
@ -101,7 +101,7 @@
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.163881313" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.13625971" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.script.362679060" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.script" value="${workspace_loc:/${ProjName}/STM32F407VETX_FLASH.ld}" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.systemcalls.1895114880" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.systemcalls" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.systemcalls.value.none" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.systemcalls.1895114880" name="System calls" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.systemcalls" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.systemcalls.value.none" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.input.254649022" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>

4
.settings/language.settings.xml

@ -5,7 +5,7 @@
<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="275879641112183883" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="530787724166000187" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<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="348948591003739390" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="603856674057555694" 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 &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

4
Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h

@ -26,7 +26,7 @@
*
*----------------------------------------------------------------------------
*
* Portions Copyright © 2016 STMicroelectronics International N.V. All rights reserved.
* Portions Copyright � 2016 STMicroelectronics International N.V. All rights reserved.
* Portions Copyright (c) 2013 ARM LIMITED
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
@ -278,7 +278,7 @@ typedef StaticQueue_t osStaticMessageQDef_t;
/// Thread Definition structure contains startup information of a thread.
/// \note CAN BE CHANGED: \b os_thread_def is implementation specific in every CMSIS-RTOS.
typedef struct os_thread_def {
char *name; ///< Thread name
const char *name; ///< Thread name
os_pthread pthread; ///< start address of thread function
osPriority tpriority; ///< initial thread priority
uint32_t instances; ///< maximum number of instances of that thread function

2
a8000_protocol

@ -1 +1 @@
Subproject commit 5d083e13b654460d9de05192ce9446c9b1d62069
Subproject commit 38aa5a4b096eee25b062a6f9f49dded87289cb5f

2
a8000_subboard.launch

@ -5,7 +5,7 @@
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_certif_path" value=""/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_check_enable" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_key_path" value=""/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_permission" value="debug_non_secure_L3"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.debug_auth_permission" value=""/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_live_expr" value="true"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_swv" value="false"/>
<intAttribute key="com.st.stm32cube.ide.mcu.debug.launch.formatVersion" value="2"/>

2
rst.bat

@ -0,0 +1,2 @@
C:\ST\STM32CubeIDE_1.15.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.1.200.202311302303\tools\bin\STM32_Programmer_CLI.exe ^
-c port=SWD -rst

2
sdk/components/tmc/ic/ztmc5130.cpp

@ -330,7 +330,7 @@ int32_t TMC51X0::to_user_vel(int32_t vel) { //
void TMC51X0::readMotorState(bool *stoped, int32_t *error) {
auto state = getGState();
auto devStatus = getDevStatus();
// auto devStatus = getDevStatus();
if (state.reset) {
*error = (int32_t)err::kstep_motor_subic_reset;
} else if (state.uv_cp) {

24
sdk/components/zcancmder/basic.cpp

@ -7,29 +7,29 @@ using namespace iflytop;
using namespace std;
uint16_t CanPacketRxBuffer::get_packetindex() {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->packetindex;
return cmdheader->index;
}
uint16_t CanPacketRxBuffer::get_cmdid() {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return CMDID(cmdheader->cmdMainId, cmdheader->cmdSubId);
}
uint8_t CanPacketRxBuffer::get_cmdSubId() {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->cmdSubId;
return cmdheader->cmdid;
}
uint8_t CanPacketRxBuffer::get_packetType() {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->packetType;
}
uint8_t *CanPacketRxBuffer::get_params() {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->data;
return (cmdheader->data);
}
uint16_t CanPacketRxBuffer::get_params_len() {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
return cmdheader->datalen;
}
uint16_t CanPacketRxBuffer::get_params_len() { return rxdataSize - sizeof(zcr_cmd_header_t); }
void CanPacketRxBuffer::clear() {
void CanPacketRxBuffer::clear() {
id = 0;
memset(&m_canPacket, 0, sizeof(m_canPacket)); //fix
memset(&m_canPacket, 0, sizeof(m_canPacket)); // fix
m_canPacketNum = 0;
m_npacket = 0;
memset(rxdata, 0, sizeof(rxdata));
@ -43,9 +43,7 @@ void CanPacketRxBuffer::clear() {
bool CanPacketRxBuffer::iscmd(int32_t id) {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;
uint16_t maincmdid = ((uint32_t)id >> 8) & 0xFFFF;
uint8_t cmdSubId = ((uint32_t)id) & 0xFF;
return cmdheader->cmdMainId == maincmdid && cmdheader->cmdSubId == cmdSubId;
return cmdheader->cmdid == id;
}
zcr_cmd_header_t *CanPacketRxBuffer::get_cmdheader() {
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)rxdata;

17
sdk/components/zcancmder/basic.hpp

@ -3,8 +3,8 @@
//
#pragma once
#include "sdk/os/zos.hpp"
#include "a8000_protocol\protocol.hpp"
#include "sdk/os/zos.hpp"
namespace iflytop {
namespace zcr {
@ -25,12 +25,12 @@ using namespace zcr;
class CanPacketRxBuffer {
public:
uint16_t id = 0;
CANPacket m_canPacket[100] = {0}; // 用于接收can消息
uint8_t m_canPacketNum = 0;
uint8_t m_npacket = 0;
uint8_t rxdata[1000] = {0};
int rxdataSize = 0;
uint16_t id = 0;
CANPacket m_canPacket[20] = {0}; // 用于接收can消息
uint8_t m_canPacketNum = 0;
uint8_t m_npacket = 0;
uint8_t rxdata[256] = {0};
int rxdataSize = 0;
bool dataIsReady = false;
bool isOnReceive = false;
@ -42,13 +42,12 @@ class CanPacketRxBuffer {
public:
uint16_t get_packetindex();
uint16_t get_cmdid();
uint8_t get_cmdSubId();
uint8_t get_packetType();
uint8_t *get_params();
uint16_t get_params_len();
void clear();
uint8_t* get_rx_raw();
uint8_t *get_rx_raw();
uint16_t get_rx_raw_len();
zcr_cmd_header_t *get_cmdheader();

29
sdk/components/zcancmder/protocol_event_bus_sender.cpp

@ -12,9 +12,8 @@ void ProtocolEventBusSender::push_reg_state_change_event(int32_t moduleid, int32
zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf;
int32_t* data = (int32_t*)cmd_header->data;
cmd_header->moduleid = moduleid;
cmd_header->cmdMainId = zcr::kevent_bus_reg_change_report >> 8;
cmd_header->cmdSubId = zcr::kevent_bus_reg_change_report & 0xff;
cmd_header->moduleId = moduleid;
cmd_header->cmdid = zcr::kevent_bus_reg_change_report;
data[0] = regindex;
data[1] = oldval;
@ -27,9 +26,9 @@ void ProtocolEventBusSender::report(int32_t moduleid, int32_t cmdindex) {
zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf;
int32_t* data = (int32_t*)cmd_header->data;
cmd_header->moduleid = moduleid;
cmd_header->cmdMainId = cmdindex >> 8;
cmd_header->cmdSubId = cmdindex & 0xff;
cmd_header->moduleId = moduleid;
cmd_header->cmdid = cmdindex;
m_zcanreceiver->triggerEvent(cmd_header, (uint8_t*)data, 0);
}
@ -39,9 +38,9 @@ void ProtocolEventBusSender::report(int32_t moduleid, int32_t cmdindex, int32_t
zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf;
int32_t* data = (int32_t*)cmd_header->data;
cmd_header->moduleid = moduleid;
cmd_header->cmdMainId = cmdindex >> 8;
cmd_header->cmdSubId = cmdindex & 0xff;
cmd_header->moduleId = moduleid;
cmd_header->cmdid = cmdindex;
data[0] = data0;
m_zcanreceiver->triggerEvent(cmd_header, (uint8_t*)data, 4 * 1);
@ -51,9 +50,9 @@ void ProtocolEventBusSender::report(int32_t moduleid, int32_t cmdindex, int32_t
zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf;
int32_t* data = (int32_t*)cmd_header->data;
cmd_header->moduleid = moduleid;
cmd_header->cmdMainId = cmdindex >> 8;
cmd_header->cmdSubId = cmdindex & 0xff;
cmd_header->moduleId = moduleid;
cmd_header->cmdid = cmdindex;
data[0] = data0;
data[1] = data1;
@ -64,9 +63,9 @@ void ProtocolEventBusSender::report(int32_t moduleid, int32_t cmdindex, int32_t
zcr_cmd_header_t* cmd_header = (zcr_cmd_header_t*)txbuf;
int32_t* data = (int32_t*)cmd_header->data;
cmd_header->moduleid = moduleid;
cmd_header->cmdMainId = cmdindex >> 8;
cmd_header->cmdSubId = cmdindex & 0xff;
cmd_header->moduleId = moduleid;
cmd_header->cmdid = cmdindex;
data[0] = data0;
data[1] = data1;

67
sdk/components/zcancmder/zcan_protocol_parser.cpp

@ -16,6 +16,15 @@ using namespace std;
#define REGFN(fn) regCmdFn(k##fn, fn);
static const char* hex2str(const char* hex, size_t len) {
static char buf[256];
memset(buf, 0, sizeof(buf));
for (size_t i = 0; i < len; i++) {
sprintf(buf + i * 2, "%02X", hex[i]);
}
return buf;
}
void ZCanProtocolParser::initialize(IZCanReceiver* cancmder) {
m_cancmder = cancmder;
m_cancmder->registerListener(this);
@ -167,17 +176,17 @@ void ZCanProtocolParser::registerModule(ZIModule* module) {
_registerModule(id, module);
}
void ZCanProtocolParser::onRceivePacket(zcr_cmd_header_t* rxcmd, uint8_t* data, int32_t len) {
// printf("onRceivePacket cmdid:%d moduleid:%d cmdSubId:%d\n", rxcmd->cmdMainId, rxcmd->moduleid, rxcmd->cmdSubId);
uint16_t moduleid = rxcmd->moduleid;
void ZCanProtocolParser::onRceivePacket(zcr_cmd_header_t* rxcmd, int32_t len) {
// printf("onRceivePacket cmdid:%d moduleid:%d\n", rxcmd->cmdid, rxcmd->moduleId);
uint16_t moduleid = rxcmd->moduleId;
auto it = m_modulers.find(moduleid);
if (it == m_modulers.end()) {
return;
}
ZIModule* module = it->second;
int32_t cmdid = CMDID(rxcmd->cmdMainId, rxcmd->cmdSubId);
_onRceivePacket(module, rxcmd, cmdid, rxcmd->data, len);
int32_t cmdid = rxcmd->cmdid;
_onRceivePacket(module, rxcmd, len);
}
void ZCanProtocolParser::regCmdFn(int32_t cmdid, cmdcb_t cb) {
@ -194,30 +203,58 @@ ZCanProtocolParser::cmdfn_t* ZCanProtocolParser::findcmdfn(int32_t cmdid) {
return nullptr;
}
void ZCanProtocolParser::_onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t cmdid, uint8_t* param, int32_t len) {
static bool checkpacket(const zcr_cmd_header_t* header, int len) {
if (len < sizeof(zcr_cmd_header_t)) {
return false;
}
if ((header->datalen + sizeof(zcr_cmd_header_t) + 1) != len) {
return false;
}
uint8_t* rawpacket = (uint8_t*)header;
uint8_t checksum = 0;
for (int i = 0; i < len - 1; i++) {
checksum += rawpacket[i];
}
if (checksum != rawpacket[len - 1]) {
return false;
}
return true;
}
void ZCanProtocolParser::_onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t len) {
int paramNum = (len) / sizeof(int32_t);
int32_t* ack = (int32_t*)&ackbuf[0];
cmdfn_t* fn = findcmdfn(cmdid);
cmdfn_t* fn = findcmdfn(rxcmd->cmdid);
if (!fn) {
ZLOGE(TAG, "cmd not support:%d,rx:%s", rxcmd->cmdid, hex2str((const char*)rxcmd, len));
m_cancmder->sendErrorAck(rxcmd, err::kcmd_not_support);
return;
}
if (!checkpacket(rxcmd, len)) {
ZLOGE(TAG, "check sum error,rx:%s(%d)", hex2str((const char*)rxcmd, len), len);
m_cancmder->sendErrorAck(rxcmd, err::kcheck_sum_error);
return;
}
cmdcontxt_t cxt = {0};
cxt.module = module;
cxt.rxcmd = rxcmd;
cxt.cmdid = cmdid;
cxt.params = (int32_t*)param;
cxt.paramRaw = param;
cxt.paramlen = len;
cxt.cmdid = rxcmd->cmdid;
cxt.params = (int32_t*)rxcmd->data;
cxt.paramRaw = rxcmd->data;
cxt.paramlen = rxcmd->datalen;
cxt.acklen = 0;
cxt.ackbuf = ackbuf;
memset(ackbuf, 0, sizeof(ackbuf));
int32_t ecode = module->bfcall(cmdid, param, len);
int32_t ecode = module->bfcall(cxt.cmdid, cxt.paramRaw, cxt.paramlen);
if (ecode == 0) ecode = fn->cb(&cxt);
module->aftercall(cmdid, param, len, cxt.ackbuf, cxt.acklen, ecode);
module->aftercall(cxt.cmdid, cxt.paramRaw, cxt.paramlen, cxt.ackbuf, cxt.acklen, ecode);
if (ecode != 0) {
m_cancmder->sendErrorAck(rxcmd, ecode);
@ -940,4 +977,4 @@ int32_t ZCanProtocolParser::pipette_lld_is_detect_liquid(cmdcontxt_t* cxt) {
return module->pipette_lld_is_detect_liquid(&ack[0]);
}
#undef MODULE_CLASS
#undef MODULE_CLASS

6
sdk/components/zcancmder/zcan_protocol_parser.hpp

@ -40,13 +40,13 @@ class ZCanProtocolParser : public IZCanReceiverListener {
public:
void initialize(IZCanReceiver* cancmder);
virtual void onRceivePacket(zcr_cmd_header_t* rxcmd, uint8_t* data, int32_t len);
virtual void onRceivePacket(zcr_cmd_header_t* rxcmd, int32_t len);
void registerModule(ZIModule* module);
ZIModule* getModule(int id) { return m_modulers[id]; }
private:
void _registerModule(uint16_t id, ZIModule* module);
void _onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t cmdid, uint8_t* param, int32_t len);
void _onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t len);
void regCmdFn(int32_t cmdid, cmdcb_t cb);
cmdfn_t* findcmdfn(int32_t cmdid);
@ -173,8 +173,6 @@ class ZCanProtocolParser : public IZCanReceiverListener {
CMDFN(pipette_zmotor_move_by);
CMDFN(pipette_zmotor_move_to);
CMDFN(liquid_operation_clear_params);
CMDFN(liquid_operation_set_gun_runparams);
CMDFN(liquid_operation_set_zmotor_runparams);

198
sdk/components/zcancmder/zcanreceiver.cpp

@ -11,6 +11,14 @@ using namespace zcr;
#define OVER_TIME_MS 5
static void assign_packet_checksum(uint8_t *packet, int len) {
uint8_t checksum = 0;
for (int i = 0; i < len - 1; i++) {
checksum += packet[i];
}
packet[len - 1] = checksum;
}
ZCanReceiver::CFG *ZCanReceiver::createCFG(uint8_t deviceId) {
CFG *cfg = new CFG();
ZASSERT(cfg != NULL);
@ -71,10 +79,6 @@ void ZCanReceiver::initialize(CFG *cfg) {
HAL_StatusTypeDef ZCanReceiver::initializeFilter() {
/**
* @brief ID区帧格式
* [ 27:0 ]
* [ STDID ] [ EXTID ]
* [11 :9] [8:6] [5:0] [17:16] [15:8] [7:0]
* ID ID
*/
HAL_StatusTypeDef HAL_Status;
CAN_FilterTypeDef sFilterConfig;
@ -118,23 +122,34 @@ void ZCanReceiver::registerListener(IZCanReceiverListener *listener) { m_listene
// }
// return buf;
// }
static const char* hex2str(const char* hex, size_t len) {
static char buf[256];
memset(buf, 0, sizeof(buf));
for (size_t i = 0; i < len; i++) {
sprintf(buf + i * 2, "%02X", hex[i]);
}
return buf;
}
void ZCanReceiver::sendPacket(uint8_t *packet, size_t len) {
ZLOGI(TAG, "sendPacket %s(%d)", hex2str((const char *)packet, len), len);
/**
* @brief
*/
int npacket = len / 8 + (len % 8 == 0 ? 0 : 1);
int npacket = len / 7 + (len % 7 == 0 ? 0 : 1);
if (npacket > 255) {
ZLOGE(TAG, "sendPacket fail, len:%d", len);
return;
}
int finalpacketlen = len % 8 == 0 ? 8 : len % 8;
int finalpacketlen = len % 7 == 0 ? 7 : len % 7;
for (uint8_t i = 0; i < npacket; i++) {
bool suc = false;
if (i == npacket - 1) {
suc = sendPacketSub(npacket, i, packet + i * 8, finalpacketlen, OVER_TIME_MS);
suc = sendPacketSub(npacket, i, packet + i * 7, finalpacketlen, OVER_TIME_MS);
} else {
suc = sendPacketSub(npacket, i, packet + i * 8, 8, OVER_TIME_MS);
suc = sendPacketSub(npacket, i, packet + i * 7, 7, OVER_TIME_MS);
}
if (!suc) {
ZLOGE(TAG, "sendPacket fail, packet(%d:%d)", npacket, i);
@ -142,93 +157,74 @@ void ZCanReceiver::sendPacket(uint8_t *packet, size_t len) {
}
}
}
#if 0
void ZCanReceiver::sendAck(zcr_cmd_header_t *cmdheader, uint8_t *data, size_t len) {
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, cmdheader, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_ack;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
}
void ZCanReceiver::sendErrorAck(zcr_cmd_header_t *cmdheader, uint16_t id, uint32_t errcode) {
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, cmdheader, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_error_ack;
zcanreceiver_error_ack_t *error_ack = (zcanreceiver_error_ack_t *)txheader->data;
error_ack->id = id;
error_ack->errorcode = errcode;
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + sizeof(zcanreceiver_error_ack_t));
}
void ZCanReceiver::sendExecStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len) {
zlock_guard l(m_lock);
int32_t ZCanReceiver::sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) {
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
int packetlen = sizeof(zcr_cmd_header_t) + len + 1;
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, rxcmdheader, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_cmd_exec_status_report;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
}
void ZCanReceiver::sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len) {
zlock_guard l(m_lock);
ZASSERT(sizeof(txbuff) > packetlen);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, rxcmdheader, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_report;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
}
#endif
int32_t ZCanReceiver::sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) {
zlock_guard l(m_lock);
ZASSERT(sizeof(txbuff) > sizeof(zcr_cmd_header_t) + len);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_ack;
txheader->datalen = len;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
assign_packet_checksum(txbuff, packetlen);
sendPacket(txbuff, packetlen);
return 0;
}
int32_t ZCanReceiver::triggerEvent(zcr_cmd_header_t *cmd_header, uint8_t *data, int32_t len) {
zlock_guard l(m_lock);
m_reportIndex++;
ZASSERT(sizeof(txbuff) > sizeof(zcr_cmd_header_t) + len);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
int packetlen = sizeof(zcr_cmd_header_t) + len + 1;
ZASSERT(sizeof(txbuff) > packetlen);
memcpy(txheader, cmd_header, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_event;
txheader->packetindex = m_reportIndex;
txheader->packetType = kptv2_event;
txheader->index = m_reportIndex;
txheader->datalen = len;
memcpy(txheader->data, data, len);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
assign_packet_checksum(txbuff, packetlen);
sendPacket(txbuff, packetlen);
m_reportIndex++;
return 0;
}
int32_t ZCanReceiver::sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) {
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
int packetlen = sizeof(zcr_cmd_header_t) + sizeof(int32_t) * nack + 1;
memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_ack;
int32_t *txackcache = (int32_t *)txheader->data;
int32_t *txackcache = (int32_t *)txheader->data;
txheader->datalen = nack * sizeof(int32_t);
for (int i = 0; i < nack; i++) {
txackcache[i] = ackvar[i];
}
assign_packet_checksum(txbuff, packetlen);
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + sizeof(int32_t) * nack);
sendPacket(txbuff, packetlen);
return 0;
}
int32_t ZCanReceiver::sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) {
zlock_guard l(m_lock);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
int32_t *txackcache = (int32_t *)txheader->data;
int packetlen = sizeof(zcr_cmd_header_t) + sizeof(int32_t) * 1 + 1;
memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_error_ack;
txheader->datalen = sizeof(int32_t);
txackcache[0] = errorcode;
int32_t *txackcache = (int32_t *)txheader->data;
txackcache[0] = errorcode;
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + sizeof(int32_t));
assign_packet_checksum(txbuff, packetlen);
sendPacket(txbuff, packetlen);
return 0;
}
@ -244,14 +240,15 @@ bool ZCanReceiver::sendPacketSub(int npacket, int packetIndex, uint8_t *packet,
memset(&pHeader, 0, sizeof(pHeader));
memset(aData, 0, sizeof(aData));
pHeader.StdId = 0x00;
pHeader.ExtId = (m_config->deviceId << 16) | (npacket << 8) | packetIndex;
pHeader.IDE = CAN_ID_EXT;
pHeader.StdId = m_config->deviceId;
pHeader.ExtId = 0;
pHeader.IDE = CAN_ID_STD;
pHeader.RTR = CAN_RTR_DATA;
pHeader.DLC = len;
pHeader.DLC = len + 1;
pHeader.TransmitGlobalTime = DISABLE;
memcpy(aData, packet, len);
aData[0] = (npacket << 4) | packetIndex;
memcpy(aData + 1, packet, len);
m_lastTransmitStatus = HAL_CAN_AddTxMessage(m_config->canHandle, &pHeader, aData, &txMailBox);
if (m_lastTransmitStatus != HAL_OK) {
@ -266,6 +263,7 @@ bool ZCanReceiver::sendPacketSub(int npacket, int packetIndex, uint8_t *packet,
return false;
}
// m_os->sleepMS(1);
osDelay(1);
}
if (txPacketInterval_ms > 0) {
osDelay(txPacketInterval_ms);
@ -294,7 +292,6 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl
* @brief
*/
// ZLOG_INFO("%s\n", __FUNCTION__);
// printf("------------------%s\n", __FUNCTION__);
if (canHandle != m_config->canHandle) {
return;
}
@ -302,45 +299,46 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl
* @brief can接收到消息
*/
CAN_RxHeaderTypeDef pHeader;
uint8_t aData[8] /*8byte table*/;
uint8_t aData[8] = {0};
CanPacketRxBuffer *rxbuf = &m_canPacketRxBuffer[0];
while (getRxMessage(&pHeader, aData)) {
/**
* @brief
*
* [2] [3bit] [8bit] [8bit] [8bit]
* , from frameNum frameId
*/
uint8_t from = (pHeader.ExtId >> 16 & 0xFF);
uint8_t nframe = (pHeader.ExtId & 0xFF00) >> 8;
uint8_t frameId = (pHeader.ExtId & 0x00FF);
CanPacketRxBuffer *rxbuf = &m_canPacketRxBuffer[0];
if (from != rxbuf->id) {
// 目前只接收来自主机的消息
continue;
}
// 过滤掉非标准帧和远程帧,和DLC为0的帧
if (pHeader.RTR != CAN_RTR_DATA || pHeader.IDE != CAN_ID_STD) continue;
if (pHeader.DLC == 0) continue;
// 上次接收到的消息还没有来的急处理
if (rxbuf->dataIsReady) continue;
if (rxbuf->dataIsReady) {
// 上次接收到的消息还没有来的急处理
continue;
}
/**
* @TODO:
* @brief
*/
if (frameId == 0) {
uint8_t from = (pHeader.StdId & 0xFF);
uint8_t nframe = (aData[0] & 0xF0) >> 4;
uint8_t frameoff = (aData[0] & 0x0F);
// 只接收来自主机的消息
if (from != rxbuf->id) continue;
// 当frameoff==0,重置接收缓存
if (frameoff == 0) {
rxbuf->m_canPacketNum = 0;
}
if (rxbuf->m_canPacketNum != frameId) {
// 当接收到非期望frameoff的数据时,说明发生了丢包,重置接收缓存
if (rxbuf->m_canPacketNum != frameoff) {
rxbuf->m_canPacketNum = 0;
continue;
}
// 接收到有效包
if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) {
rxbuf->m_canPacket[rxbuf->m_canPacketNum].dlc = pHeader.DLC;
memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8);
rxbuf->m_canPacketNum++;
}
if (nframe == frameId + 1) {
if (nframe == frameoff + 1) {
rxbuf->m_npacket = nframe;
rxbuf->dataIsReady = true;
}
@ -362,13 +360,15 @@ void ZCanReceiver::loop() {
} else {
int dataoff = 0;
for (size_t i = 0; i < rxbuf->m_canPacketNum; i++) {
memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].dlc);
dataoff += rxbuf->m_canPacket[i].dlc;
if (rxbuf->m_canPacket[i].dlc == 0) continue;
memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData + 1, rxbuf->m_canPacket[i].dlc - 1);
dataoff += rxbuf->m_canPacket[i].dlc - 1;
}
rxbuf->rxdataSize = dataoff;
// ZLOGI(TAG,"rx packet");
for (auto &var : m_listenerList) {
if (var) var->onRceivePacket(rxbuf->get_cmdheader(), rxbuf->get_params(), rxbuf->get_params_len());
if (var) var->onRceivePacket(rxbuf->get_cmdheader(), rxbuf->get_rx_raw_len());
}
}

15
sdk/components/zcancmder/zcanreceiver.hpp

@ -3,14 +3,13 @@
//
#pragma once
#include "a8000_protocol\protocol.hpp"
#include "basic.hpp"
#include "sdk/os/zos.hpp"
#include "a8000_protocol\protocol.hpp"
#ifdef HAL_CAN_MODULE_ENABLED
namespace iflytop {
using namespace zcr;
typedef function<void(CanPacketRxBuffer *rxcmd)> zcanreceiver_listener_t;
class ZCanReceiver : public ZCanIRQListener, public IZCanReceiver {
@ -28,7 +27,7 @@ class ZCanReceiver : public ZCanIRQListener, public IZCanReceiver {
int packetRxOvertime_ms; //
};
uint8_t txbuff[2100];
uint8_t txbuff[128];
public:
class LoopJobContext {
@ -43,24 +42,18 @@ class ZCanReceiver : public ZCanIRQListener, public IZCanReceiver {
HAL_StatusTypeDef m_lastTransmitStatus; // 上次调用can发送方法的返回值
list<IZCanReceiverListener *> m_listenerList;
CanPacketRxBuffer m_canPacketRxBuffer[1];
CanPacketRxBuffer m_canPacketRxBuffer[1];
int txPacketInterval_ms = 0;
zmutex m_lock;
int32_t m_reportIndex = 0;
int8_t m_reportIndex = 0;
public:
ZCanReceiver() {}
CFG *createCFG(uint8_t deviceId);
void initialize(CFG *cfg);
#if 0
void sendExecStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
void sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
void sendAck(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
void sendErrorAck(zcr_cmd_header_t *cmdheader, uint16_t id, uint32_t errcode);
#endif
uint8_t getDeviceId() { return m_config->deviceId; }
void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }

13
usrc/public_service/stm32irq.c

@ -3,13 +3,13 @@
#include "gins.h"
#include "main.h"
#include "stm32f4xx_it.h"
static stm32_irq_cb_t irqcb[100];
extern void SysMgr_on_NMI_Handler(void);
extern void SysMgr_on_HardFault_Handler(void);
extern void SysMgr_on_MemManage_Handler(void);
extern void SysMgr_on_BusFault_Handler(void);
extern void SysMgr_on_UsageFault_Handler(void);
static void callirqcb(stm32irq_type_t type) {
if (irqcb[type] != NULL) {
irqcb[type]();
}
}
void NMI_Handler(void) {
SysMgr_on_NMI_Handler();
while (1) {
@ -86,4 +86,3 @@ void UART4_IRQHandler(void) { HAL_UART_IRQHandler(&huart4); }
* EXT *
***********************************************************************************************************************/
void stm32irq_reg(stm32irq_type_t type, stm32_irq_cb_t cb) { irqcb[type] = cb; }

18
usrc/public_service/stm32irq.h

@ -3,21 +3,3 @@
// typedef
// void stm32irq_reg();
typedef void (*stm32_irq_cb_t)();
typedef enum {
kDMA1_Stream1_IRQ,
kDMA1_Stream3_IRQ,
kDMA2_Stream2_IRQ,
kCAN1_TX_IRQ,
kCAN1_RX0_IRQ,
kCAN1_RX1_IRQ,
kCAN1_SCE_IRQ,
kTIM1_TRG_COM_TIM11_IRQ,
kUSART1_IRQ,
kTIM6_DAC_IRQ,
kTIM7_IRQ,
} stm32irq_type_t;
void stm32irq_reg(stm32irq_type_t type, stm32_irq_cb_t cb);

1
usrc/subboards/subboard40_and_50_temperature_ctrl/subboard40_and_50_temperature_ctrl_board.c

@ -1,5 +1,6 @@
#include "main.h"
#include "public_service/public_service.h"
#include <stdio.h>
/* TIM2 init function */
void MX_TIM2_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();

Loading…
Cancel
Save