21 changed files with 917 additions and 16 deletions
-
4chip/marco.h
-
67components/modbus/modbus_basic.cpp
-
28components/modbus/modbus_basic.hpp
-
108components/modbus/modbus_block_host.cpp
-
27components/modbus/modbus_block_host.hpp
-
4components/single_axis_motor_control_v2/i_iflytop_can_slave_module.cpp
-
79components/zcan_module/zcan_basic_order_module.cpp
-
43components/zcan_module/zcan_basic_order_module.hpp
-
105components/zcan_module/zcan_high_power_electrical_ctl_module.cpp
-
47components/zcan_module/zcan_high_power_electrical_ctl_module.hpp
-
0components/zcan_module/zcan_m211887_module_manager.cpp
-
45components/zcan_module/zcan_m211887_module_manager.hpp
-
57components/zcan_module/zcan_pressure_sensor_module.cpp
-
45components/zcan_module/zcan_pressure_sensor_module.hpp
-
63components/zcan_module/zcan_pump_ctrl_module.cpp
-
45components/zcan_module/zcan_pump_ctrl_module.hpp
-
68components/zcan_module/zcan_trigle_warning_light_ctl_module.cpp
-
45components/zcan_module/zcan_trigle_warning_light_ctl_module.hpp
-
29components/zcanreceiver/cmd.hpp
-
10components/zcanreceiver/zcanreceiver.cpp
-
14components/zcanreceiver/zcanreceiver.hpp
@ -0,0 +1,67 @@ |
|||
/**
|
|||
* Modbus |
|||
* | add(1byte) | functionCode(1byte) | ...data... | crc1(1byte) | crc2(2byte)| |
|||
* |
|||
* |
|||
* |
|||
* |
|||
*/ |
|||
#include "modbus_basic.hpp"
|
|||
|
|||
#include <stdint.h>
|
|||
// CRC_16高8位数据区
|
|||
#define ASSERT(con) \
|
|||
while (!(con)) { \ |
|||
} |
|||
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[] = { // CRC_16低8位数据区
|
|||
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}; |
|||
|
|||
/*CRC16查表计算函数*/ |
|||
|
|||
uint16_t modbus_gen_crc16(uint8_t *puckMsg, uint8_t usDataLen) { |
|||
volatile uint8_t uchCRCHi = 0xFF; // 高CRC字节初始化
|
|||
volatile uint8_t uchCRCLo = 0xFF; // 低CRC 字节初始化
|
|||
volatile uint32_t uIndex; // CRC循环中的索引
|
|||
// 传输消息缓冲区
|
|||
while (usDataLen--) { |
|||
// 计算CRC
|
|||
uIndex = uchCRCLo ^ *puckMsg++; |
|||
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex]; |
|||
uchCRCHi = auchCRCLo[uIndex]; |
|||
} |
|||
// 返回结果,高位在前
|
|||
return (uchCRCLo << 8 | uchCRCHi); |
|||
} |
|||
|
|||
void modbus_pack_crc_to_packet(uint8_t *puckMsg, uint8_t packetlen) { |
|||
uint16_t crc = modbus_gen_crc16(puckMsg, packetlen - 2); |
|||
puckMsg[packetlen - 2] = crc >> 8; |
|||
puckMsg[packetlen - 1] = crc; |
|||
} |
|||
|
|||
/*函数功能:用于校验接收到的信息是否有误
|
|||
输入参数:message是接收到的待校验消息,length是消息字节的长度 |
|||
函数输出:输出校验结果,没有错返回True,有错返回False |
|||
通过CRC校验校验接收的信息是否正确*/ |
|||
bool modbus_checkcrc16(uint8_t *message, uint8_t length) { return (modbus_gen_crc16(message, length) == 0x00) ? true : false; } |
@ -0,0 +1,28 @@ |
|||
#pragma ocne
|
|||
#include <stdbool.h>
|
|||
#include <stdint.h>
|
|||
|
|||
/**
|
|||
* @brief 生成CRC16校验码 |
|||
* |
|||
* @param puckMsg 数据指针 |
|||
* @param usDataLen 数据长度(不包含CRC16) |
|||
* @return uint16_t |
|||
*/ |
|||
uint16_t modbus_gen_crc16(uint8_t *puckMsg, uint8_t usDataLen); |
|||
/**
|
|||
* @brief 将CRC16校验码添加到数据包中 |
|||
* |
|||
* @param puckMsg 数据指针,数据中预留两个位置给CRC16 |
|||
* @param packetlen 数据长度 |
|||
*/ |
|||
void modbus_pack_crc_to_packet(uint8_t *puckMsg, uint8_t packetlen); |
|||
/**
|
|||
* @brief 检查CRC16校验码 |
|||
* |
|||
* @param message 数据指针 |
|||
* @param length 数据长度(包含CRC16) |
|||
* @return true 校验成功 |
|||
* @return false 校验失败 |
|||
*/ |
|||
bool modbus_checkcrc16(uint8_t *message, uint8_t length); |
@ -0,0 +1,108 @@ |
|||
#include "modbus_block_host.hpp"
|
|||
|
|||
#include "modbus_basic.hpp"
|
|||
using namespace iflytop; |
|||
#define DEBUG 1
|
|||
ModbusBlockHost::ModbusBlockHost() {} |
|||
ModbusBlockHost::~ModbusBlockHost() {} |
|||
|
|||
void ModbusBlockHost::initialize(UART_HandleTypeDef *huart) {} |
|||
void ModbusBlockHost::cleanRxBuff() { //
|
|||
HAL_StatusTypeDef status; |
|||
do { |
|||
status = HAL_UART_Receive(huart, rxbuff, 1, 1); |
|||
} while (status == HAL_OK); |
|||
} |
|||
|
|||
void ModbusBlockHost::uarttx(uint8_t *buff, size_t len) { |
|||
#if DEBUG
|
|||
printf("uarttx:\n"); |
|||
for (size_t i = 0; i < len; i++) { |
|||
printf("%02x ", buff[i]); |
|||
} |
|||
printf("\n"); |
|||
#endif
|
|||
HAL_UART_Transmit(huart, buff, len, 1000); |
|||
} |
|||
bool ModbusBlockHost::uartrx(uint8_t *buff, size_t len, int overtimems) { |
|||
HAL_StatusTypeDef status; |
|||
status = HAL_UART_Receive(huart, buff, len, overtimems); |
|||
#if DEBUG
|
|||
if (status == HAL_OK) { |
|||
printf("uartrx:"); |
|||
for (size_t i = 0; i < len; i++) { |
|||
printf("%02x ", buff[i]); |
|||
} |
|||
printf("\n"); |
|||
} |
|||
#endif
|
|||
return status == HAL_OK; |
|||
} |
|||
|
|||
bool ModbusBlockHost::readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int overtimems) { |
|||
txbuff[0] = slaveAddr; |
|||
txbuff[1] = 0x03; |
|||
txbuff[2] = regAddr >> 8; |
|||
txbuff[3] = regAddr & 0xff; |
|||
txbuff[4] = 0x00; |
|||
txbuff[5] = 0x01; |
|||
modbus_pack_crc_to_packet(txbuff, 6 + 2); |
|||
|
|||
cleanRxBuff(); |
|||
|
|||
uarttx(txbuff, 6 + 2); |
|||
|
|||
bool status; |
|||
status = uartrx(rxbuff, 7, overtimems); |
|||
|
|||
if (status && modbus_checkcrc16(rxbuff, 7)) { |
|||
*regVal = rxbuff[3] << 8 | rxbuff[4]; |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
bool ModbusBlockHost::writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems) { |
|||
txbuff[0] = slaveAddr; |
|||
txbuff[1] = 0x06; |
|||
txbuff[2] = regAddr >> 8; |
|||
txbuff[3] = regAddr & 0xff; |
|||
txbuff[4] = regVal >> 8; |
|||
txbuff[5] = regVal & 0xff; |
|||
modbus_pack_crc_to_packet(txbuff, 6 + 2); |
|||
|
|||
cleanRxBuff(); |
|||
|
|||
uarttx(txbuff, 6 + 2); |
|||
|
|||
bool status; |
|||
status = uartrx(rxbuff, 8, overtimems); |
|||
|
|||
if (status && modbus_checkcrc16(rxbuff, 8)) { |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
bool ModbusBlockHost::writeReg10(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems) { |
|||
txbuff[0] = slaveAddr; |
|||
txbuff[1] = 0x10; |
|||
txbuff[2] = regAddr >> 8; |
|||
txbuff[3] = regAddr & 0xff; |
|||
txbuff[4] = 0x00; |
|||
txbuff[5] = 0x01; |
|||
txbuff[6] = 0x02; // 字节数
|
|||
txbuff[7] = regVal >> 8; |
|||
txbuff[8] = regVal & 0xff; |
|||
modbus_pack_crc_to_packet(txbuff, 9 + 2); |
|||
|
|||
cleanRxBuff(); |
|||
|
|||
uarttx(txbuff, 9 + 2); |
|||
|
|||
bool status; |
|||
status = uartrx(rxbuff, 8, overtimems); |
|||
|
|||
if (status && modbus_checkcrc16(rxbuff, 8)) { |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
@ -0,0 +1,27 @@ |
|||
#pragma ocne
|
|||
#include "sdk/hal/zhal.hpp"
|
|||
//
|
|||
|
|||
namespace iflytop { |
|||
class ModbusBlockHost { |
|||
UART_HandleTypeDef *huart; |
|||
|
|||
uint8_t txbuff[32]; |
|||
uint8_t rxbuff[32]; |
|||
|
|||
public: |
|||
ModbusBlockHost(); |
|||
~ModbusBlockHost(); |
|||
|
|||
void initialize(UART_HandleTypeDef *huart); |
|||
|
|||
bool readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int overtimems); |
|||
bool writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems); |
|||
bool writeReg10(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems); |
|||
|
|||
private: |
|||
void cleanRxBuff(); |
|||
void uarttx(uint8_t *buff, size_t len); |
|||
bool uartrx(uint8_t *buff, size_t len, int overtimems); |
|||
}; |
|||
} // namespace iflytop
|
@ -0,0 +1,79 @@ |
|||
#include "zcan_basic_order_module.hpp"
|
|||
|
|||
#include <stdio.h>
|
|||
#include <string.h>
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
|
|||
using namespace iflytop; |
|||
using namespace zcr; |
|||
|
|||
void ZCanBasicOrderModule::initialize(ZCanReceiver* zcanReceiver) { |
|||
zcanReceiver->registerListener(this); |
|||
m_zcanReceiver = zcanReceiver; |
|||
} |
|||
|
|||
void ZCanBasicOrderModule::regInputCtl(readfn_t fn) { m_readfn = fn; } |
|||
void ZCanBasicOrderModule::regOutCtl(writefn_t fn) { m_writefn = fn; } |
|||
|
|||
void ZCanBasicOrderModule::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { //
|
|||
|
|||
Cmdheader_t* cmdheader = (Cmdheader_t*)packet; |
|||
if (cmdheader->cmdid == kcmd_ping && cmdheader->subcmdid == 0) { |
|||
/**
|
|||
* @brief |
|||
* cmd : b0:boardid |
|||
* ack : b0:boardid |
|||
* ack_datalen : 1 |
|||
*/ |
|||
if (cmdheader->data[0] == m_zcanReceiver->getDeviceId()) { |
|||
//
|
|||
Cmdheader_t* txheader = (Cmdheader_t*)txbuff; |
|||
memcpy(txheader, cmdheader, sizeof(Cmdheader_t)); |
|||
txheader->packetType = kpt_ack; |
|||
txheader->data[0] = cmdheader->data[0]; |
|||
m_zcanReceiver->sendPacket(txbuff, sizeof(Cmdheader_t) + 1); |
|||
return; |
|||
} |
|||
} else if (cmdheader->cmdid == kcmd_read_io && cmdheader->subcmdid == 0) { |
|||
/**
|
|||
* @brief |
|||
* cmd : b0:ioid |
|||
* ack : b0:ioid b1:ioval |
|||
* ack_datalen : 2 |
|||
*/ |
|||
uint8_t ioid = cmdheader->data[0]; |
|||
bool val = 0; |
|||
if (m_readfn && m_readfn(ioid, val)) { |
|||
//
|
|||
Cmdheader_t* txheader = (Cmdheader_t*)txbuff; |
|||
memcpy(txheader, cmdheader, sizeof(Cmdheader_t)); |
|||
txheader->packetType = kpt_ack; |
|||
txheader->data[0] = cmdheader->data[0]; |
|||
txheader->data[1] = val; |
|||
m_zcanReceiver->sendPacket(txbuff, sizeof(Cmdheader_t) + 2); |
|||
return; |
|||
} |
|||
} else if (cmdheader->cmdid == kcmd_set_io && cmdheader->subcmdid == 0) { |
|||
/**
|
|||
* @brief |
|||
* cmd : b0:ioid b1:ioval |
|||
* ack : b0:ioid b1:ioval |
|||
* ack_datalen : 2 |
|||
*/ |
|||
uint8_t ioid = cmdheader->data[0]; |
|||
bool val = cmdheader->data[1]; |
|||
if (m_writefn && m_writefn(ioid, val)) { |
|||
Cmdheader_t* txheader = (Cmdheader_t*)txbuff; |
|||
memcpy(txheader, cmdheader, sizeof(Cmdheader_t)); |
|||
txheader->packetType = kpt_ack; |
|||
txheader->data[0] = cmdheader->data[0]; |
|||
txheader->data[1] = cmdheader->data[1]; |
|||
m_zcanReceiver->sendPacket(txbuff, sizeof(Cmdheader_t) + 2); |
|||
return; |
|||
} |
|||
} |
|||
} |
|||
|
|||
void ZCanBasicOrderModule::loop() {} |
|||
|
|||
#endif
|
@ -0,0 +1,43 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk/hal/zhal.hpp"
|
|||
//
|
|||
#include "../zcanreceiver/zcanreceiver.hpp"
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
|
|||
namespace iflytop { |
|||
class ZCanBasicOrderModule : public ZCanRceiverListener { |
|||
public: |
|||
private: |
|||
ZCanReceiver* m_zcanReceiver; |
|||
|
|||
typedef function<bool(uint8_t id, bool& val)> readfn_t; |
|||
typedef function<bool(uint8_t id, bool val)> writefn_t; |
|||
|
|||
readfn_t m_readfn; |
|||
writefn_t m_writefn; |
|||
|
|||
uint8_t txbuff[32]; |
|||
|
|||
public: |
|||
ZCanBasicOrderModule(/* args */) {} |
|||
~ZCanBasicOrderModule() {} |
|||
|
|||
public: |
|||
void initialize(ZCanReceiver* zcanReceiver); |
|||
|
|||
void regInputCtl(readfn_t fn); |
|||
void regOutCtl(writefn_t fn); |
|||
|
|||
public: |
|||
virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len); |
|||
|
|||
private: |
|||
void loop(); |
|||
}; |
|||
} // namespace iflytop
|
|||
|
|||
#endif
|
@ -0,0 +1,105 @@ |
|||
#include "zcan_high_power_electrical_ctl_module.hpp"
|
|||
|
|||
#include <stdio.h>
|
|||
#include <string.h>
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
|
|||
using namespace iflytop; |
|||
using namespace zcr; |
|||
#define TAG "ZCanHighPowerElectricalCtlModule"
|
|||
|
|||
void ZCanHighPowerElectricalCtlModule::initialize(ZCanReceiver* zcanReceiver) { |
|||
zcanReceiver->registerListener(this); |
|||
m_zcanReceiver = zcanReceiver; |
|||
} |
|||
|
|||
void ZCanHighPowerElectricalCtlModule::pushElectricAppliance(int id, setswitchfn_t m_set_safe_switch, setswitchfn_t m_set_power_switch, |
|||
getcurrentfn_t m_get_current) { |
|||
ZASSERT(m_set_safe_switch != NULL); |
|||
ZASSERT(m_set_power_switch != NULL); |
|||
ZASSERT(m_get_current != NULL); |
|||
|
|||
ElectricAppliance* appliance = new ElectricAppliance(); |
|||
ZASSERT(appliance != NULL); |
|||
appliance->id = id; |
|||
appliance->m_set_safe_switch = m_set_safe_switch; |
|||
appliance->m_set_power_switch = m_set_power_switch; |
|||
appliance->m_get_current = m_get_current; |
|||
m_electricAppliances.push_back(appliance); |
|||
} |
|||
ZCanHighPowerElectricalCtlModule::ElectricAppliance* ZCanHighPowerElectricalCtlModule::find(int id) { |
|||
for (auto it = m_electricAppliances.begin(); it != m_electricAppliances.end(); it++) { |
|||
if ((*it)->id == id) { |
|||
return *it; |
|||
} |
|||
} |
|||
return NULL; |
|||
} |
|||
|
|||
void ZCanHighPowerElectricalCtlModule::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { //
|
|||
//
|
|||
|
|||
Cmdheader_t* cmdheader = (Cmdheader_t*)packet; |
|||
if (cmdheader->cmdid == kcmd_high_power_electrical_ctl && cmdheader->subcmdid == 0) { |
|||
/**
|
|||
* @brief 通断控制(0) |
|||
* cmd : b0:id b1:switchstatus |
|||
* ack : b0:boardid b1:switchstatus |
|||
* ack_datalen : 2 |
|||
*/ |
|||
uint8_t id = cmdheader->data[0]; |
|||
bool swicthval = cmdheader->data[1]; |
|||
ElectricAppliance* appliance = find(id); |
|||
if (appliance) { |
|||
appliance->m_set_power_switch(swicthval); |
|||
|
|||
uint8_t txbuff[2] = {id, swicthval}; |
|||
m_zcanReceiver->sendAck(cmdheader, txbuff, 2); |
|||
|
|||
ZLOGI(TAG, "set power switch %d %d", id, swicthval); |
|||
|
|||
return; |
|||
} |
|||
} |
|||
|
|||
if (cmdheader->cmdid == kcmd_high_power_electrical_ctl && cmdheader->subcmdid == 1) { |
|||
/**
|
|||
* @brief 设置安全继电器通断 |
|||
* cmd : b0:id b1:switchstatus |
|||
* ack : b0:boardid b1:switchstatus |
|||
* ack_datalen : 2 |
|||
*/ |
|||
uint8_t id = cmdheader->data[0]; |
|||
bool swicthval = cmdheader->data[1]; |
|||
ElectricAppliance* appliance = find(id); |
|||
if (appliance) { |
|||
appliance->m_set_power_switch(swicthval); |
|||
|
|||
uint8_t txbuff[2] = {id, swicthval}; |
|||
m_zcanReceiver->sendAck(cmdheader, txbuff, 2); |
|||
|
|||
ZLOGI(TAG, "set safe switch %d %d", id, swicthval); |
|||
return; |
|||
} |
|||
} |
|||
|
|||
if (cmdheader->cmdid == kcmd_high_power_electrical_ctl && cmdheader->subcmdid == 3) { |
|||
/**
|
|||
* @brief 读取电流 |
|||
* cmd : b0:id |
|||
* ack : b0:boardid b2-5 current |
|||
* ack_datalen : 2 |
|||
*/ |
|||
uint8_t id = cmdheader->data[0]; |
|||
ElectricAppliance* appliance = find(id); |
|||
if (appliance) { |
|||
uint8_t txbuff[2 + 4] = {0}; |
|||
txbuff[0] = id; |
|||
*(int32_t*)(&txbuff[2]) = appliance->m_get_current(); |
|||
m_zcanReceiver->sendAck(cmdheader, txbuff, sizeof(txbuff)); |
|||
return; |
|||
} |
|||
} |
|||
} |
|||
|
|||
#endif
|
@ -0,0 +1,47 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk/hal/zhal.hpp"
|
|||
//
|
|||
#include "../zcanreceiver/zcanreceiver.hpp"
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
namespace iflytop { |
|||
|
|||
class ZCanHighPowerElectricalCtlModule : public ZCanRceiverListener { |
|||
public: |
|||
typedef function<void(bool)> setswitchfn_t; |
|||
typedef function<int32_t()> getcurrentfn_t; // 读取工作电流 ma
|
|||
|
|||
class ElectricAppliance { |
|||
public: |
|||
int id; |
|||
setswitchfn_t m_set_safe_switch; |
|||
setswitchfn_t m_set_power_switch; |
|||
getcurrentfn_t m_get_current; // 0.1A
|
|||
}; |
|||
|
|||
private: |
|||
ZCanReceiver* m_zcanReceiver; |
|||
|
|||
list<ElectricAppliance*> m_electricAppliances; |
|||
|
|||
public: |
|||
ZCanHighPowerElectricalCtlModule(/* args */) {} |
|||
~ZCanHighPowerElectricalCtlModule() {} |
|||
|
|||
public: |
|||
void initialize(ZCanReceiver* zcanReceiver); |
|||
void pushElectricAppliance(int id, setswitchfn_t m_set_safe_switch, setswitchfn_t m_set_power_switch, getcurrentfn_t m_get_current); |
|||
|
|||
public: |
|||
virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len); |
|||
ElectricAppliance* find(int id); |
|||
|
|||
private: |
|||
void loop(); |
|||
}; |
|||
} // namespace iflytop
|
|||
|
|||
#endif
|
@ -0,0 +1,45 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk/hal/zhal.hpp"
|
|||
//
|
|||
#include "../zcanreceiver/zcanreceiver.hpp"
|
|||
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
namespace iflytop { |
|||
|
|||
class ZCanM211887ModuleManager : public ZCanRceiverListener { |
|||
public: |
|||
typedef function<void(uint8_t r, uint8_t g, uint8_t b, uint8_t beep)> WarningLightCtrlFn_t; |
|||
|
|||
class Submodule { |
|||
public: |
|||
int id; |
|||
WarningLightCtrlFn_t ctrl_fn; |
|||
}; |
|||
|
|||
private: |
|||
ZCanReceiver* m_zcanReceiver; |
|||
|
|||
list<Submodule*> m_submodules; |
|||
|
|||
public: |
|||
ZCanM211887ModuleManager(/* args */) {} |
|||
~ZCanM211887ModuleManager() {} |
|||
|
|||
public: |
|||
void initialize(ZCanReceiver* zcanReceiver); |
|||
void regSubmodule(int id, WarningLightCtrlFn_t fn); |
|||
|
|||
public: |
|||
virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len); |
|||
Submodule* find(int id); |
|||
|
|||
private: |
|||
void loop(); |
|||
}; |
|||
} // namespace iflytop
|
|||
|
|||
#endif
|
@ -0,0 +1,57 @@ |
|||
#include "zcan_pressure_sensor_module.hpp"
|
|||
|
|||
#include <stdio.h>
|
|||
#include <string.h>
|
|||
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
|
|||
using namespace iflytop; |
|||
using namespace zcr; |
|||
#define TAG "ZCanPressureSensorModule"
|
|||
|
|||
void ZCanPressureSensorModule::initialize(ZCanReceiver* zcanReceiver) { |
|||
zcanReceiver->registerListener(this); |
|||
m_zcanReceiver = zcanReceiver; |
|||
} |
|||
|
|||
void ZCanPressureSensorModule::regSubmodule(int id, readpresure_t fn) { |
|||
ZASSERT(fn != NULL); |
|||
|
|||
Submodule* submodule = new Submodule(); |
|||
ZASSERT(submodule != NULL); |
|||
submodule->id = id; |
|||
submodule->m_readpresure_fn = fn; |
|||
m_submodules.push_back(submodule); |
|||
} |
|||
|
|||
void ZCanPressureSensorModule::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { |
|||
Cmdheader_t* cmdheader = (Cmdheader_t*)packet; |
|||
if (cmdheader->cmdid == kcmd_read_presure_sensor && cmdheader->subcmdid == 0) { |
|||
/**
|
|||
* @brief 通断控制(0) |
|||
* cmd : b0:sensorid |
|||
* ack : b0:boardid b2:5:presure pa |
|||
* ack_datalen : 6 |
|||
*/ |
|||
uint8_t id = cmdheader->data[0]; |
|||
Submodule* subm = find(id); |
|||
if (subm) { |
|||
uint8_t txbuff[6] = {}; |
|||
txbuff[0] = id; |
|||
*(int32_t*)(&txbuff[2]) = subm->m_readpresure_fn(); |
|||
m_zcanReceiver->sendAck(cmdheader, txbuff, 6); |
|||
return; |
|||
} |
|||
} |
|||
} |
|||
|
|||
ZCanPressureSensorModule::Submodule* ZCanPressureSensorModule::find(int id) { |
|||
for (auto it = m_submodules.begin(); it != m_submodules.end(); it++) { |
|||
if ((*it)->id == id) { |
|||
return *it; |
|||
} |
|||
} |
|||
return NULL; |
|||
} |
|||
|
|||
#endif
|
@ -0,0 +1,45 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk/hal/zhal.hpp"
|
|||
//
|
|||
#include "../zcanreceiver/zcanreceiver.hpp"
|
|||
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
namespace iflytop { |
|||
|
|||
class ZCanPressureSensorModule : public ZCanRceiverListener { |
|||
public: |
|||
typedef function<int32_t()> readpresure_t; |
|||
|
|||
class Submodule { |
|||
public: |
|||
int id; |
|||
readpresure_t m_readpresure_fn; |
|||
}; |
|||
|
|||
private: |
|||
ZCanReceiver* m_zcanReceiver; |
|||
|
|||
list<Submodule*> m_submodules; |
|||
|
|||
public: |
|||
ZCanPressureSensorModule(/* args */) {} |
|||
~ZCanPressureSensorModule() {} |
|||
|
|||
public: |
|||
void initialize(ZCanReceiver* zcanReceiver); |
|||
void regSubmodule(int id, readpresure_t fn); |
|||
|
|||
public: |
|||
virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len); |
|||
Submodule* find(int id); |
|||
|
|||
private: |
|||
void loop(); |
|||
}; |
|||
} // namespace iflytop
|
|||
|
|||
#endif
|
@ -0,0 +1,63 @@ |
|||
#include "zcan_pump_ctrl_module.hpp"
|
|||
|
|||
#include <stdio.h>
|
|||
#include <string.h>
|
|||
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
|
|||
using namespace iflytop; |
|||
using namespace zcr; |
|||
#define TAG "ZCanPumpCtrlModule"
|
|||
|
|||
void ZCanPumpCtrlModule::initialize(ZCanReceiver* zcanReceiver) { |
|||
zcanReceiver->registerListener(this); |
|||
m_zcanReceiver = zcanReceiver; |
|||
} |
|||
|
|||
void ZCanPumpCtrlModule::regSubmodule(int id, pumprun_t fn) { |
|||
ZASSERT(fn != NULL); |
|||
|
|||
Submodule* submodule = new Submodule(); |
|||
ZASSERT(submodule != NULL); |
|||
submodule->id = id; |
|||
submodule->m_pumprun_fn = fn; |
|||
m_submodules.push_back(submodule); |
|||
} |
|||
|
|||
void ZCanPumpCtrlModule::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { |
|||
Cmdheader_t* cmdheader = (Cmdheader_t*)packet; |
|||
if (cmdheader->cmdid == kcmd_peristaltic_pump_ctl && cmdheader->subcmdid == 0) { |
|||
/**
|
|||
* @brief 通断控制(0) |
|||
* cmd: |
|||
* [0]:蠕动泵ID |
|||
* [2:3]:acc [4:5]:转速rpm |
|||
* ack : b0:pumpid |
|||
* ack_datalen : 1 |
|||
*/ |
|||
uint8_t id = cmdheader->data[0]; |
|||
Submodule* subm = find(id); |
|||
if (subm) { |
|||
int16_t acc = *(int16_t*)(&cmdheader->data[2]); |
|||
int16_t rpm = *(int16_t*)(&cmdheader->data[4]); |
|||
|
|||
subm->m_pumprun_fn(acc, rpm); |
|||
|
|||
uint8_t txbuff[1] = {}; |
|||
txbuff[0] = id; |
|||
m_zcanReceiver->sendAck(cmdheader, txbuff, sizeof(txbuff)); |
|||
return; |
|||
} |
|||
} |
|||
} |
|||
|
|||
ZCanPumpCtrlModule::Submodule* ZCanPumpCtrlModule::find(int id) { |
|||
for (auto it = m_submodules.begin(); it != m_submodules.end(); it++) { |
|||
if ((*it)->id == id) { |
|||
return *it; |
|||
} |
|||
} |
|||
return NULL; |
|||
} |
|||
|
|||
#endif
|
@ -0,0 +1,45 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk/hal/zhal.hpp"
|
|||
//
|
|||
#include "../zcanreceiver/zcanreceiver.hpp"
|
|||
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
namespace iflytop { |
|||
|
|||
class ZCanPumpCtrlModule : public ZCanRceiverListener { |
|||
public: |
|||
typedef function<void(int16_t acc, int16_t rpm)> pumprun_t; |
|||
|
|||
class Submodule { |
|||
public: |
|||
int id; |
|||
pumprun_t m_pumprun_fn; |
|||
}; |
|||
|
|||
private: |
|||
ZCanReceiver* m_zcanReceiver; |
|||
|
|||
list<Submodule*> m_submodules; |
|||
|
|||
public: |
|||
ZCanPumpCtrlModule(/* args */) {} |
|||
~ZCanPumpCtrlModule() {} |
|||
|
|||
public: |
|||
void initialize(ZCanReceiver* zcanReceiver); |
|||
void regSubmodule(int id, pumprun_t fn); |
|||
|
|||
public: |
|||
virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len); |
|||
Submodule* find(int id); |
|||
|
|||
private: |
|||
void loop(); |
|||
}; |
|||
} // namespace iflytop
|
|||
|
|||
#endif
|
@ -0,0 +1,68 @@ |
|||
#include "zcan_trigle_warning_light_ctl_module.hpp"
|
|||
|
|||
#include <stdio.h>
|
|||
#include <string.h>
|
|||
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
|
|||
using namespace iflytop; |
|||
using namespace zcr; |
|||
#define TAG "ZCanTrigleWarningLightCtlModule"
|
|||
|
|||
void ZCanTrigleWarningLightCtlModule::initialize(ZCanReceiver* zcanReceiver) { |
|||
zcanReceiver->registerListener(this); |
|||
m_zcanReceiver = zcanReceiver; |
|||
} |
|||
|
|||
void ZCanTrigleWarningLightCtlModule::regSubmodule(int id, WarningLightCtrlFn_t fn) { |
|||
ZASSERT(fn != NULL); |
|||
|
|||
Submodule* submodule = new Submodule(); |
|||
ZASSERT(submodule != NULL); |
|||
submodule->id = id; |
|||
submodule->ctrl_fn = fn; |
|||
m_submodules.push_back(submodule); |
|||
} |
|||
|
|||
void ZCanTrigleWarningLightCtlModule::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { |
|||
Cmdheader_t* cmdheader = (Cmdheader_t*)packet; |
|||
if (cmdheader->cmdid == kcmd_triple_warning_light_ctl && cmdheader->subcmdid == 0) { |
|||
/**
|
|||
* @brief 0:设置状态 |
|||
* cmd: |
|||
* [0]:SENSORID |
|||
* [2]:红色灯状态 |
|||
* [3]:黄色灯状态 |
|||
* [4]:绿色灯状态 |
|||
* [5]:蜂鸣器状态 |
|||
* ack : b0:id |
|||
* ack_datalen : 1 |
|||
*/ |
|||
uint8_t id = cmdheader->data[0]; |
|||
Submodule* subm = find(id); |
|||
if (subm) { |
|||
uint8_t r = cmdheader->data[2]; |
|||
uint8_t g = cmdheader->data[3]; |
|||
uint8_t b = cmdheader->data[4]; |
|||
uint8_t beep = cmdheader->data[5]; |
|||
|
|||
subm->ctrl_fn(r, g, b, beep); |
|||
|
|||
uint8_t txbuff[1] = {}; |
|||
txbuff[0] = id; |
|||
m_zcanReceiver->sendAck(cmdheader, txbuff, sizeof(txbuff)); |
|||
return; |
|||
} |
|||
} |
|||
} |
|||
|
|||
ZCanTrigleWarningLightCtlModule::Submodule* ZCanTrigleWarningLightCtlModule::find(int id) { |
|||
for (auto it = m_submodules.begin(); it != m_submodules.end(); it++) { |
|||
if ((*it)->id == id) { |
|||
return *it; |
|||
} |
|||
} |
|||
return NULL; |
|||
} |
|||
|
|||
#endif
|
@ -0,0 +1,45 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk/hal/zhal.hpp"
|
|||
//
|
|||
#include "../zcanreceiver/zcanreceiver.hpp"
|
|||
|
|||
#ifdef HAL_CAN_MODULE_ENABLED
|
|||
namespace iflytop { |
|||
|
|||
class ZCanTrigleWarningLightCtlModule : public ZCanRceiverListener { |
|||
public: |
|||
typedef function<void(uint8_t r, uint8_t g, uint8_t b, uint8_t beep)> WarningLightCtrlFn_t; |
|||
|
|||
class Submodule { |
|||
public: |
|||
int id; |
|||
WarningLightCtrlFn_t ctrl_fn; |
|||
}; |
|||
|
|||
private: |
|||
ZCanReceiver* m_zcanReceiver; |
|||
|
|||
list<Submodule*> m_submodules; |
|||
|
|||
public: |
|||
ZCanTrigleWarningLightCtlModule(/* args */) {} |
|||
~ZCanTrigleWarningLightCtlModule() {} |
|||
|
|||
public: |
|||
void initialize(ZCanReceiver* zcanReceiver); |
|||
void regSubmodule(int id, WarningLightCtrlFn_t fn); |
|||
|
|||
public: |
|||
virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len); |
|||
Submodule* find(int id); |
|||
|
|||
private: |
|||
void loop(); |
|||
}; |
|||
} // namespace iflytop
|
|||
|
|||
#endif
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue