diff --git a/components/vaisala_sensor/HPP272-使用说明书.pdf b/components/vaisala_sensor/HPP272-使用说明书.pdf new file mode 100644 index 0000000..8efceaf Binary files /dev/null and b/components/vaisala_sensor/HPP272-使用说明书.pdf differ diff --git a/components/vaisala_sensor/hpp272.cpp b/components/vaisala_sensor/hpp272.cpp new file mode 100644 index 0000000..5ea29b4 --- /dev/null +++ b/components/vaisala_sensor/hpp272.cpp @@ -0,0 +1,26 @@ +#include "hpp272.hpp" + +using namespace iflytop; + +HPP272::HPP272(/* args */) {} +HPP272::~HPP272() {} +void HPP272::initialize(UART_HandleTypeDef *huart, uint8_t id) { + modbusBlockHost.initialize(huart); + this->id = id; +} +bool HPP272::readVal(sensor_data_t *data) { + int16_t val[5] = {0}; + + bool suc = modbusBlockHost.readReg03Muti(id, 0x02, (uint16_t *)val, 5, 50); + if (!suc) { + return false; + } + + data->precision = val[1]; + data->pressure_unit = val[0]; + data->value = val[2]; + data->zero_point = val[3]; + data->range_full_point = val[4]; + + return true; +} \ No newline at end of file diff --git a/components/vaisala_sensor/hpp272.hpp b/components/vaisala_sensor/hpp272.hpp new file mode 100644 index 0000000..22c3d69 --- /dev/null +++ b/components/vaisala_sensor/hpp272.hpp @@ -0,0 +1,53 @@ +// +// Created by zwsd +// + +#pragma once +#include "sdk\components\modbus\modbus_block_host.hpp" +#include "sdk\hal\zhal.hpp" + +/** + * @brief + * + * service: M3078 + * + * 监听事件: + * 依赖状态: + * 依赖服务: + * 作用: + * + * 推荐配置: + * 1. 识读模式:按键保持 + * 2. 波特率:9600 + * 3. 单次扫码时长:无限时 + * + */ +namespace iflytop { +using namespace std; + +class HPP272 { + public: + typedef struct { + uint8_t precision; + uint8_t pressure_unit; + int16_t value; + int16_t zero_point; + int16_t range_full_point; + } sensor_data_t; + + private: + /* data */ + + ModbusBlockHost modbusBlockHost; + uint8_t id; + + + public: + HPP272(/* args */); + ~HPP272(); + + void initialize(UART_HandleTypeDef *huart, uint8_t id); + bool readVal(sensor_data_t *data); +}; + +} // namespace iflytop \ No newline at end of file diff --git a/components/zcan_module/zcan_m211887_module_manager.cpp b/components/zcan_module/zcan_m211887_module_manager.cpp index e69de29..6469669 100644 --- a/components/zcan_module/zcan_m211887_module_manager.cpp +++ b/components/zcan_module/zcan_m211887_module_manager.cpp @@ -0,0 +1,90 @@ +#include "zcan_m211887_module_manager.hpp" + +#include +#include + +#ifdef HAL_CAN_MODULE_ENABLED + +using namespace iflytop; +using namespace zcr; +#define TAG "ZCanM211887ModuleManager" + +void ZCanM211887ModuleManager::initialize(ZCanReceiver* zcanReceiver) { + zcanReceiver->registerListener(this); + m_zcanReceiver = zcanReceiver; +} + +void ZCanM211887ModuleManager::regSubmodule(int id, UART_HandleTypeDef* huart, uint8_t modbusid) { + ZASSERT(huart != NULL); + + Submodule* submodule = new Submodule(); + ZASSERT(submodule != NULL); + submodule->id = id; + submodule->sensor.initialize(huart, modbusid); + m_submodules.push_back(submodule); +} + +void ZCanM211887ModuleManager::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { + Cmdheader_t* cmdheader = (Cmdheader_t*)packet; + if (cmdheader->cmdid == kcmd_read_huacheng_pressure_sensor && cmdheader->subcmdid == 0) { + /** + * @brief 通断控制(0) + * cmd : b0:sensorid + * ack : b0:boardid b2:5:presure pa + * ack_datalen : 6 + */ +#if 0 + [0]:传感器ID +[2] 精度 + 0,1,2,3 +[3] 单位 + 0-Mpa + 1-Kpa + 2-Pa + 3-Bar + 4-Mbar + 5-kg/cm2 + 6-psi + 7-mh2o + 8-mmh2o +[4:5] 数值 +[6:7] 零点 +[8:9] 满量程 +#endif + uint8_t id = cmdheader->data[0]; + Submodule* subm = find(id); + if (subm) { + uint8_t txbuff[10] = {}; + txbuff[0] = id; + HPP272::sensor_data_t data; + bool suc = subm->sensor.readVal(&data); + + if (suc) { + txbuff[0] = id; + txbuff[1] = 0; + txbuff[2] = data.precision; + txbuff[3] = data.pressure_unit; + memcpy(txbuff + 4, &data.value, 2); + memcpy(txbuff + 6, &data.zero_point, 2); + memcpy(txbuff + 8, &data.range_full_point, 2); + m_zcanReceiver->sendAck(cmdheader, txbuff, sizeof(txbuff)); + } else { + int16_t errcode = 1002; // 设备不在线 + m_zcanReceiver->sendErrorAck(cmdheader, errcode); + } + + return; + } + } +} + +ZCanM211887ModuleManager::Submodule* ZCanM211887ModuleManager::find(int id) { + for (auto it = m_submodules.begin(); it != m_submodules.end(); it++) { + if ((*it)->id == id) { + return *it; + } + } + return NULL; +} + +#endif \ No newline at end of file diff --git a/components/zcan_module/zcan_m211887_module_manager.hpp b/components/zcan_module/zcan_m211887_module_manager.hpp index a216ecd..eeea282 100644 --- a/components/zcan_module/zcan_m211887_module_manager.hpp +++ b/components/zcan_module/zcan_m211887_module_manager.hpp @@ -5,6 +5,7 @@ #pragma once #include "sdk/hal/zhal.hpp" // +#include "../vaisala_sensor/hpp272.hpp" #include "../zcanreceiver/zcanreceiver.hpp" #ifdef HAL_CAN_MODULE_ENABLED @@ -16,8 +17,8 @@ class ZCanM211887ModuleManager : public ZCanRceiverListener { class Submodule { public: - int id; - WarningLightCtrlFn_t ctrl_fn; + int id; + HPP272 sensor; }; private: @@ -31,7 +32,7 @@ class ZCanM211887ModuleManager : public ZCanRceiverListener { public: void initialize(ZCanReceiver* zcanReceiver); - void regSubmodule(int id, WarningLightCtrlFn_t fn); + void regSubmodule(int id, UART_HandleTypeDef* huart, uint8_t modbusid); public: virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len);