diff --git a/.gitmodules b/.gitmodules index ee2589e..f67f3bb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "sdk"] path = sdk - url = zwsd@192.168.1.3:manufacturer_stm32/iflytop_sdk.git + url = zwsd@192.168.1.3:p_transmit_disinfection/transmit_disinfection_iflytop_sdk_v1.git +[submodule "transmit_disinfection_protocol_v1"] + path = transmit_disinfection_protocol_v1 + url = zwsd@192.168.1.3:p_transmit_disinfection/transmit_disinfection_protocol_v1.git diff --git a/.vscode/settings.json b/.vscode/settings.json index 592efd8..058d126 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -64,6 +64,9 @@ "cstdarg": "cpp", "cinttypes": "cpp", "modbus_basic.h": "c", - "*.bak": "cpp" + "*.bak": "cpp", + "xhash": "cpp", + "xmemory": "cpp", + "xstring": "cpp" } } \ No newline at end of file diff --git a/sdk b/sdk index f6f7900..b20f4cc 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit f6f7900b876e6a4a6b2c5ebe6bd26b5f1b1fbe0a +Subproject commit b20f4cc2e42244d6dd21566dd1a4b1a48ddc64a9 diff --git a/transmit_disinfection_protocol_v1 b/transmit_disinfection_protocol_v1 new file mode 160000 index 0000000..c39bd36 --- /dev/null +++ b/transmit_disinfection_protocol_v1 @@ -0,0 +1 @@ +Subproject commit c39bd364d809a9a6ad965c83fd3ea28c67514317 diff --git a/usrc/h2o2_sensor.cpp b/usrc/h2o2_sensor.cpp new file mode 100644 index 0000000..b59e54d --- /dev/null +++ b/usrc/h2o2_sensor.cpp @@ -0,0 +1,152 @@ +#include "h2o2_sensor.hpp" + +#include +#include + +#include "adc.h" + +#ifdef HAL_CAN_MODULE_ENABLED + +using namespace iflytop; +using namespace zcr; +#define TAG "H2O2Sensor" + +void H2O2Sensor::initialize() { +} + +void H2O2Sensor::regSubmodule(int id, UART_HandleTypeDef* huart, uint8_t modbusid) { + ZASSERT(huart != NULL); + m_sensorId = id; + m_modbusid = modbusid; + modbusBlockHost.initialize(huart); + + readSensorData(); +} + +uint32_t H2O2Sensor::readAvgAdcVal() { + // 读取15次,取中间十个数取平均值 + + uint32_t adcv[15] = {0}; // 15次采样 + for (int i = 0; i < 15; i++) { + adcv[i] = readAdcVal(); + } + + // 冒泡排序 + for (int i = 0; i < 15; i++) { + for (int j = 0; j < 15 - i - 1; j++) { + if (adcv[j] > adcv[j + 1]) { + uint32_t temp = adcv[j]; + adcv[j] = adcv[j + 1]; + adcv[j + 1] = temp; + } + } + } + + uint32_t sum = 0; + for (int i = 2; i < 12; i++) { + sum += adcv[i]; + } + return sum / 10; +} + +uint32_t H2O2Sensor::readAdcVal() { + ADC_ChannelConfTypeDef sConfig; // 通道初始化 + + uint8_t id; + + sConfig.Channel = ADC_CHANNEL_9; + sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; // 采用周期239.5周期 + sConfig.Rank = 1; + HAL_ADC_ConfigChannel(&hadc1, &sConfig); + + uint32_t adcv = 0; // + HAL_ADC_Start(&hadc1); // 启动转换 + HAL_ADC_PollForConversion(&hadc1, 30); // 等待转化结束 + adcv = HAL_ADC_GetValue(&hadc1); // 求和 + HAL_ADC_Stop(&hadc1); // 停止转换 + return adcv; // 返回平均值 +} + +typedef struct { + int16_t rh; // Relative humidity %RH * 10 + int16_t temp; // Temperature °C * 10 + int16_t df_ptemp; // Dew/frost point temperature °C * 10 + int16_t ah; // Absolute humidity g/m3 * 10 + int16_t mr; // Mixing ratio g/kg * 10 + int16_t wet_bulb_temp; // Wet-bulb temperature °C * 10 + int16_t enthalpy; // Enthalpy kJ/kg * 10 +} hmp110_sensordata_t; + +hpp272_data_t* H2O2Sensor::readSensorData() { + sensordatacache.hydrogen_peroxide_volume = 0; + sensordatacache.h2o_h2o2_rs = 0; + sensordatacache.temperature1 = 20 * 100; + sensordatacache.relative_humidity = 0; + + static uint16_t rxbuf[128]; + static hmp110_sensordata_t sensordata; + + memset(rxbuf, 0, sizeof(rxbuf)); + bool suc = modbusBlockHost.readReg03Muti(1, 0x0100, rxbuf, 7, 300); + if (suc) { + sensordata.rh = rxbuf[0]; + sensordata.temp = rxbuf[1]; + sensordata.df_ptemp = rxbuf[2]; + sensordata.ah = rxbuf[3]; + sensordata.mr = rxbuf[4]; + sensordata.wet_bulb_temp = rxbuf[5]; + sensordata.enthalpy = rxbuf[6]; + + sensordatacache.temperature1 = sensordata.temp * 10; + sensordatacache.relative_humidity = sensordata.rh * 10; + } else { + ZLOGI(TAG, "readSensorData fail"); + sensordatacache.temperature1 = 0; + sensordatacache.relative_humidity = 0; + } + + uint32_t adcv = readAvgAdcVal(); + float mv = adcv / 4095.0 * 3.3 * 1000; + float ma = mv / 150.0; + float ppm = (ma - 4) / (20 - 4) * 2000; + if (ppm < 0) ppm = 0; + + ZLOGI(TAG, " i:%f ppm:%f temp:%d rh:%d", ma, ppm, sensordatacache.temperature1, sensordatacache.relative_humidity); + + sensordatacache.hydrogen_peroxide_volume = ppm; + if (sensordatacache.hydrogen_peroxide_volume < 10) { + sensordatacache.hydrogen_peroxide_volume = 0; + } + // sensordatacache.hydrogen_peroxide_volume = 9973; + + return &sensordatacache; +} + +void H2O2Sensor::onRceivePacket(Cmdheader_t* cmdheader, int sensorId) { + if (sensorId != m_sensorId) { + return; + } + + // hpp272_data_t* sensordata = readSensorData(); + // if (sensordata) { + // txbuff[0] = sensorId; + // txbuff[1] = 0; + // memcpy(txbuff + 2, sensordata, sizeof(hpp272_data_t)); + // m_zcanReceiver->sendAck(cmdheader, txbuff, sizeof(hpp272_data_t) + 2); + // } else { + // ZLOGE(TAG, "hpp272 is null"); + // int16_t errcode = 1002; // 设备不在线 + // m_zcanReceiver->sendErrorAck(cmdheader, errcode); + // } + // return; +} + +void H2O2Sensor::onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len) { + Cmdheader_t* cmdheader = (Cmdheader_t*)packet; + if (cmdheader->cmdid == kcmd_m211887_operation && cmdheader->subcmdid == 0) { + uint8_t id = cmdheader->data[0]; + onRceivePacket(cmdheader, id); + } +} + +#endif \ No newline at end of file diff --git a/usrc/h2o2_sensor.hpp b/usrc/h2o2_sensor.hpp new file mode 100644 index 0000000..906be5a --- /dev/null +++ b/usrc/h2o2_sensor.hpp @@ -0,0 +1,44 @@ +// +// Created by zwsd +// + +#pragma once +#include "sdk/hal/zhal.hpp" +// +#include "sdk\components\vaisala_sensor\hpp272.hpp" +#include "sdk\components\zcanreceiver\zcanreceiver.hpp" + +#ifdef HAL_CAN_MODULE_ENABLED +namespace iflytop { + +class H2O2Sensor : public ZCanRceiverListener { + private: + uint8_t txbuff[sizeof(hpp272_data_t) + 10]; + int32_t m_sensorId = -1; + int32_t m_modbusid = -1; + + hpp272_data_t sensordatacache; + + ModbusBlockHost modbusBlockHost; + + public: + H2O2Sensor(/* args */) {} + ~H2O2Sensor() {} + + public: + void initialize(); + void regSubmodule(int id, UART_HandleTypeDef* huart, uint8_t modbusid); + virtual hpp272_data_t* readSensorData(); + + public: + virtual void onRceivePacket(CanPacketRxBuffer* rxbuf, uint8_t* packet, size_t len); + virtual void onRceivePacket(Cmdheader_t* cmdheader, int sensorId); + + private: + void loop(); + uint32_t readAdcVal(); + uint32_t readAvgAdcVal(); +}; +} // namespace iflytop + +#endif \ No newline at end of file diff --git a/usrc/hardware.cpp b/usrc/hardware.cpp index c34f05d..ceeccd5 100644 --- a/usrc/hardware.cpp +++ b/usrc/hardware.cpp @@ -2,19 +2,18 @@ #include #include +#include #include "adc.h" #include "main.h" #include "project.hpp" // // #include "sdk/components/single_axis_motor_control_v2/single_axis_motor_control_v2.hpp" -#include "sdk/components/iflytop_can_slave_modules/idcard_reader_service.hpp" -#include "sdk/components/single_axis_motor_control/single_axis_motor_control.hpp" + #include "sdk/hal/zhal.hpp" -#include "sdk\components\iflytop_can_slave_modules\io_control_service.hpp" -#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" #include "sdk\components\m3078\m3078_code_scaner.hpp" // +#include "h2o2_sensor.hpp" #include "sdk\components\huacheng_sensor\dp600_pressure_sensor.hpp" #include "sdk\components\vaisala_sensor\hpp272.hpp" #include "sdk\components\zcan_module\huacheng_pressure_sensor.hpp" @@ -33,7 +32,8 @@ ZGPIO AirBlowerCtrl2; ZGPIO HeatingStripCtrl1; ZGPIO HeatingStripCtrl2; -HPP272 hpp272; // 维萨拉传感器 +// HPP272 hpp272; // 维萨拉传感器 +H2O2Sensor m_h2o2_sensor; uint32_t ADC_Get_Average(uint8_t ch, uint8_t times) { ADC_ChannelConfTypeDef sConfig; // 通道初始化 @@ -112,7 +112,10 @@ void Hardware::initialize(int deviceId) { HeatingStripCtrl1.initAsOutput(PC6, ZGPIO::kMode_nopull, true, false); HeatingStripCtrl2.initAsOutput(PC7, ZGPIO::kMode_nopull, true, false); - hpp272.initialize(&huart3, 0xf0); + // hpp272.initialize(&huart3, 0xf0); + + m_h2o2_sensor.initialize(); + m_h2o2_sensor.regSubmodule(1, &huart3, 0x01); } int32_t Hardware::process_rx_packet(from_where_t fromwhere, uint8_t *packet, int32_t len, uint8_t *receipt, int32_t &receiptsize, bool &matching) { @@ -229,7 +232,8 @@ int32_t Hardware::process_rx_packet(from_where_t fromwhere, uint8_t *packet, int static hpp272_data_t fake_hpp272data; PROCESS_CMD(kcmd_m211887_operation, 0, 1) { - hpp272_data_t *hpp272data = hpp272.readVal(); + // hpp272_data_t *hpp272data = hpp272.readVal(); + hpp272_data_t *hpp272data = m_h2o2_sensor.readSensorData(); #if 0 data.h2o2 = m_hpp272_data_1.hydrogen_peroxide_volume; diff --git a/usrc/main.cpp b/usrc/main.cpp index 41c5549..b624825 100644 --- a/usrc/main.cpp +++ b/usrc/main.cpp @@ -7,11 +7,9 @@ #include "project.hpp" // // #include "sdk/components/single_axis_motor_control_v2/single_axis_motor_control_v2.hpp" -#include "sdk/components/iflytop_can_slave_modules/idcard_reader_service.hpp" -#include "sdk/components/single_axis_motor_control/single_axis_motor_control.hpp" + #include "sdk/hal/zhal.hpp" -#include "sdk\components\iflytop_can_slave_modules\io_control_service.hpp" -#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" +#include #include "sdk\components\m3078\m3078_code_scaner.hpp" #include "sdk\components\tmc\ic\ztmc4361A.hpp" #include "sdk\components\tmc\ic\ztmc5130.hpp" @@ -42,7 +40,7 @@ void dumphexdata(uint8_t *data, int32_t len) { * GLOBAL * *******************************************************************************/ -IflytopCanProtocolStackProcesser m_protocolStack; + Hardware m_hardware; ZGPIO debuglight; ZCanReceiver m_canReceiver; diff --git a/usrc/main.hpp b/usrc/main.hpp index 5767d46..1854fa9 100644 --- a/usrc/main.hpp +++ b/usrc/main.hpp @@ -4,8 +4,6 @@ #include -#include "sdk\components\iflytop_can_slave_modules\device_base_control_service.hpp" -#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" #include "sdk\components\zcanreceiver\zcanreceiver.hpp" namespace iflytop { using namespace std;