diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 6da209b..ae9a892 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -85,10 +85,10 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - /*Configure GPIO pins : PA0 PA1 PA4 PA8 - PA15 */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_8 - |GPIO_PIN_15; + /*Configure GPIO pins : PA0 PA1 PA2 PA3 + PA4 PA8 PA15 */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_8|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); @@ -108,11 +108,11 @@ void MX_GPIO_Init(void) /*Configure GPIO pins : PD8 PD9 PD10 PD11 PD12 PD13 PD14 PD15 PD0 PD1 PD2 PD3 - PD4 PD5 PD6 PD7 */ + PD4 PD7 */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15 |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 - |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + |GPIO_PIN_4|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); diff --git a/Core/Src/usart.c b/Core/Src/usart.c index c1b9f3a..39eebda 100644 --- a/Core/Src/usart.c +++ b/Core/Src/usart.c @@ -70,7 +70,7 @@ void MX_USART2_UART_Init(void) /* USER CODE END USART2_Init 1 */ huart2.Instance = USART2; - huart2.Init.BaudRate = 115200; + huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; @@ -155,17 +155,17 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) /* USART2 clock enable */ __HAL_RCC_USART2_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); /**USART2 GPIO Configuration - PA2 ------> USART2_TX - PA3 ------> USART2_RX + PD5 ------> USART2_TX + PD6 ------> USART2_RX */ - GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* USART2 interrupt Init */ HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); @@ -235,10 +235,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) __HAL_RCC_USART2_CLK_DISABLE(); /**USART2 GPIO Configuration - PA2 ------> USART2_TX - PA3 ------> USART2_RX + PD5 ------> USART2_TX + PD6 ------> USART2_RX */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_5|GPIO_PIN_6); /* USART2 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART2_IRQn); diff --git a/pipeline_disinfection_liquid_path_control.ioc b/pipeline_disinfection_liquid_path_control.ioc index b1bd09a..e4fc9de 100644 --- a/pipeline_disinfection_liquid_path_control.ioc +++ b/pipeline_disinfection_liquid_path_control.ioc @@ -39,14 +39,14 @@ Mcu.Name=STM32F407V(E-G)Tx Mcu.Package=LQFP100 Mcu.Pin0=PH0-OSC_IN Mcu.Pin1=PH1-OSC_OUT -Mcu.Pin10=PB11 -Mcu.Pin11=PC9 -Mcu.Pin12=PA9 -Mcu.Pin13=PA10 -Mcu.Pin14=PA11 -Mcu.Pin15=PA12 -Mcu.Pin16=PA13 -Mcu.Pin17=PA14 +Mcu.Pin10=PA9 +Mcu.Pin11=PA10 +Mcu.Pin12=PA11 +Mcu.Pin13=PA12 +Mcu.Pin14=PA13 +Mcu.Pin15=PA14 +Mcu.Pin16=PD5 +Mcu.Pin17=PD6 Mcu.Pin18=VP_CRC_VS_CRC Mcu.Pin19=VP_RNG_VS_RNG Mcu.Pin2=PC0 @@ -55,13 +55,13 @@ Mcu.Pin21=VP_TIM1_VS_ClockSourceINT Mcu.Pin22=VP_TIM3_VS_ClockSourceINT Mcu.Pin23=VP_TIM6_VS_ClockSourceINT Mcu.Pin24=VP_TIM7_VS_ClockSourceINT -Mcu.Pin3=PA2 -Mcu.Pin4=PA3 -Mcu.Pin5=PA5 -Mcu.Pin6=PA6 -Mcu.Pin7=PA7 -Mcu.Pin8=PC4 -Mcu.Pin9=PB10 +Mcu.Pin3=PA5 +Mcu.Pin4=PA6 +Mcu.Pin5=PA7 +Mcu.Pin6=PC4 +Mcu.Pin7=PB10 +Mcu.Pin8=PB11 +Mcu.Pin9=PC9 Mcu.PinsNb=25 Mcu.ThirdPartyNb=0 Mcu.UserConstants= @@ -97,10 +97,6 @@ PA13.Mode=Serial_Wire PA13.Signal=SYS_JTMS-SWDIO PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK -PA2.Mode=Asynchronous -PA2.Signal=USART2_TX -PA3.Mode=Asynchronous -PA3.Signal=USART2_RX PA5.Locked=true PA5.Mode=Full_Duplex_Master PA5.Signal=SPI1_SCK @@ -124,6 +120,12 @@ PC4.Signal=GPXTI4 PC9.Locked=true PC9.Mode=Clock-out-2 PC9.Signal=RCC_MCO_2 +PD5.Locked=true +PD5.Mode=Asynchronous +PD5.Signal=USART2_TX +PD6.Locked=true +PD6.Mode=Asynchronous +PD6.Signal=USART2_RX PH0-OSC_IN.Mode=HSE-External-Oscillator PH0-OSC_IN.Signal=RCC_OSC_IN PH1-OSC_OUT.Mode=HSE-External-Oscillator @@ -222,7 +224,8 @@ TIM7.IPParameters=Prescaler TIM7.Prescaler=81 USART1.IPParameters=VirtualMode USART1.VirtualMode=VM_ASYNC -USART2.IPParameters=VirtualMode +USART2.BaudRate=9600 +USART2.IPParameters=VirtualMode,BaudRate USART2.VirtualMode=VM_ASYNC USART3.BaudRate=9600 USART3.IPParameters=VirtualMode,BaudRate diff --git a/sdk b/sdk index c261a13..3b3ff3d 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit c261a135309487a40c6c8c201a7ff979048e89aa +Subproject commit 3b3ff3d15cb860cf7638ef1cf7d23a9f72e91f1b diff --git a/usrc/main.cpp b/usrc/main.cpp index 0617740..e07fb71 100644 --- a/usrc/main.cpp +++ b/usrc/main.cpp @@ -6,7 +6,6 @@ #include "main.h" #include "project.hpp" // -#include "one_dimensional_code_laser_scanner.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" @@ -25,6 +24,7 @@ // #include +#include "preportional_valve_ctrl.hpp" #include "sdk\components\cmdscheduler\cmd_scheduler_v2.hpp" #include "sdk\hal\zuart.hpp" @@ -61,6 +61,8 @@ ZCanBasicOrderModule m_basicOrderModule; ZCanPumpCtrlModule m_pumpCtrlModule; ZCanTrigleWarningLightCtlModule m_warningLightCtlModule; HuachengPressureSensor m_huachengPressureSensor; +PreportionalValveCtrl m_PreportionalValveHost; +static CmdSchedulerV2 cmdScheduler; void setmotor(TMC5130 *motor, int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power) { int32_t ppm = rpm / 60.0 * 51200; @@ -89,6 +91,100 @@ void Main::onRceivePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) } printf("\n"); } +void Main::reg_debug_fn() { + /******************************************************************************* + * 调试方法初始化 * + *******************************************************************************/ + static ZUART uartreceiver; + static ZUART::cfg_t uartreceiver_cfg = { + .name = "uartreceiver", + .huart = &DEBUG_UART, + .rxbuffersize = 512, + .rxovertime_ms = 30, + }; + uartreceiver.initialize(&uartreceiver_cfg); + cmdScheduler.initialize(&uartreceiver); + cmdScheduler.regCMD("setmotor1", "(int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power)", 4, // + [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + int16_t acc_rpm2 = atoi(paraV[0]); + int16_t rpm = atoi(paraV[1]); + int16_t idlepower = atoi(paraV[2]); + int16_t power = atoi(paraV[3]); + setmotor(&m_motor1, acc_rpm2, rpm, idlepower, power); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("setmotor2", "(int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power)", 4, // + [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + int16_t acc_rpm2 = atoi(paraV[0]); + int16_t rpm = atoi(paraV[1]); + int16_t idlepower = atoi(paraV[2]); + int16_t power = atoi(paraV[3]); + setmotor(&m_motor2, acc_rpm2, rpm, idlepower, power); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("setlight", "(uint8_t r, uint8_t g, uint8_t b, uint8_t beep)", 4, // + [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + uint8_t r = atoi(paraV[0]); + uint8_t g = atoi(paraV[1]); + uint8_t b = atoi(paraV[2]); + uint8_t beep = atoi(paraV[3]); + triLight_R.setState(r != 0); + triLight_G.setState(g != 0); + triLight_B.setState(b != 0); + triLight_BEEP.setState(beep != 0); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("readio", "()", 0, // + [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + uint8_t sensorid = atoi(paraV[0]); + ZLOGI(TAG, "IO1:%d IO2:%d IO3:%d IO4:%d IO5:%d", // + m_input1.getState(), m_input2.getState(), m_input3.getState(), m_input4.getState(), m_input5.getState()); + ack->setNoneAck(0); + }); + + cmdScheduler.regCMD("air_compressor_ch_ctrl", "(id,val)", 2, // + [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + uint8_t val = atoi(paraV[0]); + output0.setState(val); + output1.setState(val); + ack->setNoneAck(0); + }); + + cmdScheduler.regCMD("set_proportional_valve", "(uint8_t id,uint8_t val)", 2, // + [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + uint8_t id = atoi(paraV[0]); + uint8_t val = atoi(paraV[1]); + m_PreportionalValveHost.setValvePos(id, val); + ack->setNoneAck(0); + }); +} +void Main::reg_cancmd_fn() { + // registerListener + m_canReceiver.registerListener([this](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (IS_CMD(cmdheader, kcmd_set_proportional_valve, 0)) { + int32_t valueid = CMD_GET_PARAM(cmdheader, 0); + int32_t value = CMD_GET_PARAM(cmdheader, 1); + if (valueid == 1) { + m_PreportionalValveHost.setValvePos(1, value); + m_canReceiver.sendAck(cmdheader, NULL, 0); + } else if (valueid == 2) { + m_PreportionalValveHost.setValvePos(2, value); + m_canReceiver.sendAck(cmdheader, NULL, 0); + } + } + }); + + m_canReceiver.registerListener([this](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (IS_CMD(cmdheader, kcmd_air_compressor_ch_ctrl, 0)) { + int32_t value = CMD_GET_PARAM(cmdheader, 0); + output0.setState(value != 0); + output1.setState(value != 0); + m_canReceiver.sendAck(cmdheader, NULL, 0); + } + }); +} void Main::run() { ZHALCORE::cfg_t oscfg = { @@ -115,7 +211,6 @@ void Main::run() { m_input3.initAsInput(PD12, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); m_input4.initAsInput(PD13, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); m_input5.initAsInput(PC6, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); - m_basicOrderModule.initialize(&m_canReceiver); m_basicOrderModule.regInputCtl([this](uint8_t id, bool &val) { if (id == 1) { @@ -141,31 +236,7 @@ void Main::run() { return false; }); - // output0.initAsOutput(PD14, ZGPIO::kMode_nopull, false, false); - // output1.initAsOutput(PD15, ZGPIO::kMode_nopull, false, false); - - m_basicOrderModule.regOutCtl([this](uint8_t id, bool val) { - if (id == 20) { - output0.setState(val); - return true; - } - if (id == 21) { - output1.setState(val); - return true; - } - - // output0 - // output1 - - return false; - }); - ZHAL_CORE_REG(3000, { - // ZLOGI(TAG, "IO1:%d IO2:%d", m_input1.getState(), m_input2.getState()); - // ZLOGI(TAG, "IO1:%d IO2:%d IO3:%d IO4:%d IO5:%d", m_input1.getState(), m_input2.getState(), m_input3.getState(), - // m_input4.getState(), m_input5.getState()); - - }); - + m_PreportionalValveHost.initialize(&huart2); /******************************************************************************* * 蠕动泵驱动 * *******************************************************************************/ @@ -213,10 +284,10 @@ void Main::run() { *******************************************************************************/ { - triLight_R.initAsOutput(PD8, ZGPIO::kMode_nopull, false, false); - triLight_G.initAsOutput(PD7, ZGPIO::kMode_nopull, false, false); - triLight_B.initAsOutput(PD9, ZGPIO::kMode_nopull, false, false); - triLight_BEEP.initAsOutput(PD10, ZGPIO::kMode_nopull, false, false); + triLight_R.initAsOutput(PD8, ZGPIO::kMode_nopull, true, false); + triLight_G.initAsOutput(PD7, ZGPIO::kMode_nopull, true, false); + triLight_B.initAsOutput(PD9, ZGPIO::kMode_nopull, true, false); + triLight_BEEP.initAsOutput(PD10, ZGPIO::kMode_nopull, true, false); m_warningLightCtlModule.initialize(&m_canReceiver); m_warningLightCtlModule.regSubmodule(1, [&](uint8_t r, uint8_t g, uint8_t b, uint8_t beep) { @@ -232,15 +303,6 @@ void Main::run() { * 压力传感器 * *******************************************************************************/ - // while (true) { - // static ModbusBlockHost modbusBlockHost; - // modbusBlockHost.initialize(&huart3); - // int16_t val[1] = {0}; - // bool suc = modbusBlockHost.readReg03Muti(1, 0x00, (uint16_t *)val, 1, 50); - // printf("suc:%d val:%d\n", suc, val[0]); - // chip_delay_ms(1000); - // } - { m_huachengPressureSensor.initialize(&m_canReceiver); m_huachengPressureSensor.regSubmodule(1, [this](DP600PressureSensor::sensor_data_t *data) { // @@ -264,88 +326,16 @@ void Main::run() { m_huachengPressureSensor.regSubmodule(4, &huart3, 4); } - /******************************************************************************* - * 调试方法初始化 * - *******************************************************************************/ - static ZUART uartreceiver; - static CmdSchedulerV2 cmdScheduler; - static ZUART::cfg_t uartreceiver_cfg = { - .name = "uartreceiver", - .huart = &DEBUG_UART, - .rxbuffersize = 512, - .rxovertime_ms = 30, - }; - uartreceiver.initialize(&uartreceiver_cfg); - cmdScheduler.initialize(&uartreceiver); + output0.initAsOutput(PD14, ZGPIO::kMode_nopull, true, false); + output1.initAsOutput(PD15, ZGPIO::kMode_nopull, true, false); - cmdScheduler.regCMD("setmotor1", "(int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power)", 4, // - [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - int16_t acc_rpm2 = atoi(paraV[0]); - int16_t rpm = atoi(paraV[1]); - int16_t idlepower = atoi(paraV[2]); - int16_t power = atoi(paraV[3]); - setmotor(&m_motor1, acc_rpm2, rpm, idlepower, power); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("setmotor2", "(int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power)", 4, // - [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - int16_t acc_rpm2 = atoi(paraV[0]); - int16_t rpm = atoi(paraV[1]); - int16_t idlepower = atoi(paraV[2]); - int16_t power = atoi(paraV[3]); - setmotor(&m_motor2, acc_rpm2, rpm, idlepower, power); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("setlight", "(uint8_t r, uint8_t g, uint8_t b, uint8_t beep)", 4, // - [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - uint8_t r = atoi(paraV[0]); - uint8_t g = atoi(paraV[1]); - uint8_t b = atoi(paraV[2]); - uint8_t beep = atoi(paraV[3]); - triLight_R.setState(r != 0); - triLight_G.setState(g != 0); - triLight_B.setState(b != 0); - triLight_BEEP.setState(beep != 0); - ack->setNoneAck(0); - }); - - cmdScheduler.regCMD("readio", "()", 0, // - [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - uint8_t sensorid = atoi(paraV[0]); - ZLOGI(TAG, "IO1:%d IO2:%d IO3:%d IO4:%d IO5:%d", // - m_input1.getState(), m_input2.getState(), m_input3.getState(), m_input4.getState(), m_input5.getState()); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("writeio", "(id,val)", 2, // - [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - uint8_t sensorid = atoi(paraV[0]); - uint8_t val = atoi(paraV[1]); - // output0 - // output1 - if (sensorid == 20) { - output0.setState(val); - } - if (sensorid == 21) { - output1.setState(val); - } - - ack->setNoneAck(0); - }); - - cmdScheduler.regCMD("pressure_sensor_read", "(uint8_t sensorid)", 1, // - [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - uint8_t sensorid = atoi(paraV[0]); - DP600PressureSensor::sensor_data_t data = m_huachengPressureSensor.readsensordata(sensorid); - ZLOGI(TAG, "precision:%d", data.precision); - ZLOGI(TAG, "pressure_unit:%d", data.pressure_unit); - ZLOGI(TAG, "value:%d", data.value); - ZLOGI(TAG, "zero_point:%d", data.zero_point); - ZLOGI(TAG, "range_full_point:%d", data.range_full_point); - ack->setNoneAck(0); - }); + reg_cancmd_fn(); + reg_debug_fn(); ZLOGI(TAG, "init done"); while (1) { cmdScheduler.schedule(); ZHALCORE::getInstance()->loop(); + // uint8_t txbuff[10] = {1,2,3,4,5}; + // m_canReceiver.sendPacket(txbuff,4); } } diff --git a/usrc/main.hpp b/usrc/main.hpp index 5767d46..5b41c0f 100644 --- a/usrc/main.hpp +++ b/usrc/main.hpp @@ -18,6 +18,9 @@ class Main : public ZCanRceiverListener { Main(/* args */){}; ~Main(){}; void run(); + + void reg_debug_fn(); + void reg_cancmd_fn(); }; extern Main gmain; } // namespace iflytop diff --git a/usrc/one_dimensional_code_laser_scanner.cpp b/usrc/one_dimensional_code_laser_scanner.cpp deleted file mode 100644 index 8c9d35a..0000000 --- a/usrc/one_dimensional_code_laser_scanner.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include "one_dimensional_code_laser_scanner.hpp" - -#include -using namespace iflytop; - -#define ONE_BIT_WIDTH ((int32_t)(51200 * 1.20003 / 8.0)) -#define MIN_POS ((int32_t)(102733)) - -#define TAG "OneDimensionalCodeLaserScanner" - -void OneDimensionalCodeLaserScanner::initialize(IflytopCanProtocolStackProcesser* protocolProcesser, int32_t regStartOff, cfg_t* cfg) { - m_protocolProcesser = protocolProcesser; - m_regStartOff = regStartOff; - m_cfg = *cfg; - - m_slave = m_protocolProcesser->createICPSSlaveModule("OneDimensionalCodeLaserScanner", this, m_regStartOff); - m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_ACT_CTRL, icps::kw, 0); - m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_ACT_CLEAR_EXCEPTION, icps::kw, 0); - m_statusReg = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_STAT_STATUS, icps::kr, 0); - m_errReg = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_STAT_ERROR, icps::kr, 0); - m_codeReg = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_CODE, icps::kr, 0); - m_item = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_ITEM, icps::kr, 0); - m_lot = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_LOT, icps::kr, 0); - - m_triggerGpio.initAsInput(m_cfg.triggerPin, ZGPIO::kMode_nopull, ZGPIO::kIRQ_risingAndFallingIrq, true /*mirror*/); - m_triggerGpio.regListener([this](ZGPIO* GPIO_Pin, ZGPIO::IrqTypeEvent_t irqevent) { onGpioIrq(GPIO_Pin, irqevent); }); - m_readder = m_cfg.readder; -} - -icps::error_t OneDimensionalCodeLaserScanner::onHostRegisterWriteEvent(icps::WriteEvent* writeEvent) { - int32_t regoff = writeEvent->reg->add - m_regStartOff; - switch (regoff) { - case REG_CODE_SCANER_ACT_CTRL: - if (writeEvent->newvalue == 1) { - startScan(); - } else if (writeEvent->newvalue == 0) { - stopScan(); - parseResult(); - } else { - return icps::kIllegalValue; - } - return icps::kSuccess; - case REG_CODE_SCANER_ACT_CLEAR_EXCEPTION: - return icps::kSuccess; - default: - break; - } - return icps::kRegNotFound; -} - -void OneDimensionalCodeLaserScanner::startScan() { - CriticalContext cc; - m_off = 0; - m_workflag = true; - m_idleLevel = m_triggerGpio.getState(); - m_startpos = m_readder(); - ZLOGI(TAG, "start scan startpos:%d", m_startpos); -} -void OneDimensionalCodeLaserScanner::stopScan() { - CriticalContext cc; - m_workflag = false; - m_endpos = m_readder(); - ZLOGI(TAG, "stop scan endpos:%d", m_endpos); -} - -bool OneDimensionalCodeLaserScanner::getPosLevel(int pos) { - bool level = m_idleLevel; - bool nowlevel = m_idleLevel; - - if (pos < m_posChache[0]) { - return m_idleLevel; - } - - for (int i = 0; i < m_off; i++) { - nowlevel = !nowlevel; - if (i + 1 < m_off) { - if (pos >= m_posChache[i] && pos < m_posChache[i + 1]) { - level = nowlevel; - break; - } - } else { - level = nowlevel; - } - } - - return level; -} - -int32_t OneDimensionalCodeLaserScanner::compute_point_num(int32_t startpos, int32_t endpos) { - int32_t len = endpos - startpos; - float len_mm = len / 51200.0 * 8.0; // 导程8mm - int32_t pointnum = len_mm * 10; // 1mm 分成10份 - return pointnum; -} - -void OneDimensionalCodeLaserScanner::dumpcodecache(code_cache_t* cache) { -#if 0 - ZLOGI(TAG, "startpos:%d,endpos:%d,pointnum:%d", cache->startpos, cache->endpos, cache->pointnum); - for (int i = 0; i < cache->pointnum; i++) { - printf("%d", cache->codecache[i]); - } - printf("\n"); -#endif -} - -#define BITVAL(code, off) ((code & (1 << off)) >> off) - -void OneDimensionalCodeLaserScanner::decode(uint32_t rawcode) { // - // Lot:3:6 - // bit3->bit3, bit4->bit2, bit5->bit1, bit6->bit0 - uint32_t lot = 0; - lot = BITVAL(rawcode, 3) << 3 | BITVAL(rawcode, 4) << 2 | BITVAL(rawcode, 5) << 1 | BITVAL(rawcode, 6) << 0; - - // =(bit1)*2^6+(bit2)*2^5+(bit11)*2^4+(bit10)*2^0+(bit9)*2^1+(bit8)*2^2+(bit7)*2^3 - uint32_t item = 0; - item = (BITVAL(rawcode, 1) << 6) // - | (BITVAL(rawcode, 2) << 5) // - | (BITVAL(rawcode, 11) << 4) // - | (BITVAL(rawcode, 10) << 0) // - | (BITVAL(rawcode, 9) << 1) // - | (BITVAL(rawcode, 8) << 2) // - | (BITVAL(rawcode, 7) << 3); - - ZLOGI(TAG, "item-lot: %d-%d\n", item, lot); - m_item->setValue(item); - m_lot->setValue(lot); -} - -void OneDimensionalCodeLaserScanner::parsecode(code_cache_t* cache) { // - // - - /** - * @brief - * 14:0 - * 100 XXXX XXXX XXX1 - * - * 解码思路 - * 1. 通过100标定起始位置 - * 2. 然后依据每一位长度为1.2mm计算出其他各个相对bit的坐标 - * - */ - - // 1. 找到100,1对应的坐标 - int bit14startpos = -1; - int bit14endpos = -1; - - for (int32_t i = cache->pointnum; i > 0; i--) { - if (bit14endpos == -1) { - if (cache->codecache[i]) { - bit14endpos = i; - } - - } else if (bit14startpos == -1) { - if (!cache->codecache[i]) { - bit14startpos = i; - } - } else { - break; - } - } - - if (bit14startpos == -1 || bit14endpos == -1) { - ZLOGE(TAG, "find bit14 failed"); - m_errReg->setValue(kerr_findbit14fail); - return; - } - - int bit14len = bit14endpos - bit14startpos; - int bit14off = bit14len / 2 + bit14startpos; - int bit0off = bit14off - 14 * 1.2 * 10.0; - - if (bit0off < 0) { - ZLOGE(TAG, "find bit0 failed"); - m_errReg->setValue(kerr_findbit0fail); - } - // - bool bits[15] = {0}; - for (int i = 0; i < 15; i++) { - bits[i] = cache->codecache[int32_t(bit0off + i * 1.2 * 10.0)]; - } - - int32_t code = 0; - for (int i = 0; i < 15; i++) { - code |= (bits[i] << i); - } - m_errReg->setValue(kerr_success); - m_codeReg->setValue(code); - printf("code:"); - for (int i = 0; i < 15; i++) { - printf("%d", bits[i]); - } - printf("\n"); - ZLOGI(TAG, "parse success,code:0x%0x", (uint32_t)code); - decode(code); - // return; -} - -void OneDimensionalCodeLaserScanner::parseResult() { // - m_codeReg->setValue(-1); - m_item->setValue(-1); - m_lot->setValue(-1); - - static code_cache_t rawcodecache = {0}; - memset(&rawcodecache, 0, sizeof(rawcodecache)); - - /** - * @brief 初步分析数据 - */ - int32_t len = m_endpos - m_startpos; - int32_t pointnum = compute_point_num(m_startpos, m_endpos); - - ZLOGI(TAG, "pointnum:%d", pointnum); - - if ((size_t)pointnum > sizeof(rawcodecache.codecache)) { - ZLOGE(TAG, "len too long"); - m_errReg->setVal(kerr_scanRangeTooLarge); - return; - } - - if (m_endpos <= m_cfg.codeendpos) { - ZLOGE(TAG, "stop too early"); - m_errReg->setVal(kerr_scanEndTooEarly); - return; - } - - if (m_startpos >= m_cfg.codestartpos) { - ZLOGE(TAG, "start too late"); - m_errReg->setVal(kerr_scanStartTooLate); - return; - } - - /** - * @brief 将位置信息转变成,1,0的形式,方便解析数据 - * - * 1111110000111111111100001111000 - * - */ - - int32_t sp = m_startpos; - int32_t ep = m_endpos; - - for (int i = 0; i < pointnum; i++) { - rawcodecache.codecache[i] = getPosLevel((int32_t)(sp + len / (pointnum * 1.0) * i)); - } - rawcodecache.startpos = sp; - rawcodecache.pointnum = pointnum; - rawcodecache.endpos = ep; - - dumpcodecache(&rawcodecache); - /** - * @brief 由于扫描的范围要比编码的范围大,所以需要将多余的数据去掉 - * - */ - { - int32_t after_cut_code_nums = compute_point_num(m_cfg.codestartpos, m_cfg.codeendpos); - - float distance = (m_cfg.codestartpos - rawcodecache.startpos) / 51200.0 * 8.0; - int startpointoff = distance * 10; - - rawcodecache.startpos = m_cfg.codestartpos; - rawcodecache.pointnum = after_cut_code_nums; - rawcodecache.endpos = m_cfg.codeendpos; - memmove(rawcodecache.codecache, rawcodecache.codecache + startpointoff, after_cut_code_nums); - ZLOGI(TAG, "after_cut: code_nums:%d,cutoff:%d", after_cut_code_nums, startpointoff); - } - - dumpcodecache(&rawcodecache); - - /** - * @brief 分析数据 - */ - - parsecode(&rawcodecache); -} -void OneDimensionalCodeLaserScanner::onGpioIrq(ZGPIO* GPIO_Pin, ZGPIO::IrqTypeEvent_t irqevent) { // - if (!m_workflag) { - return; - } - if (m_off >= 50) return; - m_posChache[m_off] = m_readder(); - m_off++; -} diff --git a/usrc/one_dimensional_code_laser_scanner.hpp b/usrc/one_dimensional_code_laser_scanner.hpp deleted file mode 100644 index 18684ab..0000000 --- a/usrc/one_dimensional_code_laser_scanner.hpp +++ /dev/null @@ -1,101 +0,0 @@ -#pragma once -#include -#include - -#include "sdk/hal/zhal.hpp" -#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" - -#define REG_CODE_SCANER_ACT_CTRL (0) // 扫码器控制 -#define REG_CODE_SCANER_ACT_CLEAR_EXCEPTION (1) // 清除异常 - -#define REG_CODE_SCANER_STAT_STATUS (5) // 设备状态 -#define REG_CODE_SCANER_STAT_ERROR (6) // 上次采集结果是否有误 -#define REG_CODE_SCANER_CODE (7) // 码存放的地方 -#define REG_CODE_SCANER_ITEM (8) // 码存放的地方 -#define REG_CODE_SCANER_LOT (9) // 码存放的地方 - -namespace iflytop { -using namespace std; - -#define POS_CACHE_SIZE 50 - -class OneDimensionalCodeLaserScanner : public ICPSListener { - public: - typedef struct { - bool codecache[500]; - int32_t pointnum; - int32_t startpos; - int32_t endpos; - } code_cache_t; - - typedef enum { - kidle, - kworking, - } code_scan_state_t; - - typedef enum { - kerr_success = 0, // - kerr_scanRangeTooLarge = 1, // - kerr_scanRangeTooSmall = 2, // - kerr_scanStartTooLate = 3, // - kerr_scanEndTooEarly = 4, // - kerr_findbit14fail = 5, // - kerr_findbit0fail = 6, // - } error_type_t; - - typedef function PosReadder_t; - - typedef struct { - Pin_t triggerPin; - PosReadder_t readder; - int32_t codestartpos; - int32_t codeendpos; - } cfg_t; - - private: - IflytopCanProtocolStackProcesser* m_protocolProcesser = NULL; - ICPSSlaveModule* m_slave = NULL; - int m_regStartOff = 0; - PosReadder_t m_readder; - - icps::Reg_t* m_statusReg = NULL; - icps::Reg_t* m_errReg = NULL; - icps::Reg_t* m_codeReg = NULL; - icps::Reg_t* m_item = NULL; - icps::Reg_t* m_lot = NULL; - - ZGPIO m_triggerGpio; - bool m_workflag = false; - - int32_t m_off = 0; - int32_t m_posChache[POS_CACHE_SIZE]; - int32_t m_endpos = 0; - int32_t m_startpos = 0; - bool m_idleLevel = true; - - cfg_t m_cfg; - - public: - OneDimensionalCodeLaserScanner(){}; - ~OneDimensionalCodeLaserScanner(){}; - - void initialize(IflytopCanProtocolStackProcesser* protocolProcesser, int32_t regStartOff, cfg_t* cfg); - - virtual icps::error_t onHostRegisterWriteEvent(icps::WriteEvent* event); - - void startScan(); - void stopScan(); - void parseResult(); - - private: - void parsecode(code_cache_t* cache); - void decode(uint32_t rawcode); - - int32_t compute_point_num(int32_t startpos, int32_t endpos); - - void dumpcodecache(code_cache_t* cache); - - void onGpioIrq(ZGPIO* GPIO_Pin, ZGPIO::IrqTypeEvent_t irqevent); - bool getPosLevel(int pos); -}; -} // namespace iflytop diff --git a/usrc/preportional_valve_ctrl.cpp b/usrc/preportional_valve_ctrl.cpp new file mode 100644 index 0000000..04d31a8 --- /dev/null +++ b/usrc/preportional_valve_ctrl.cpp @@ -0,0 +1,29 @@ +#include "preportional_valve_ctrl.hpp" +using namespace iflytop; + +#define WORK_STATE_REG 0x0000 +#define CTRL_STATE_REG 0x0001 +#define POS_STATE_REG 0x0013 + +void PreportionalValveCtrl::initialize(UART_HandleTypeDef* huart) { m_modbusBlockHost.initialize(huart); } + +int32_t PreportionalValveCtrl::setValvePos(int32_t valueid, int32_t pos) { // + bool ret = m_modbusBlockHost.writeReg06(valueid, CTRL_STATE_REG, pos, 30); + if (!ret) return 1; + return 0; +} +int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) { + // return m_modbusBlockHost.readReg03(valueid, POS_STATE_REG, pos, 30); + uint16_t pos16 = 0; + bool ret = m_modbusBlockHost.readReg03(valueid, POS_STATE_REG, &pos16, 30); + *pos = pos16; + if (!ret) return 1; + return 0; +} +int32_t PreportionalValveCtrl::getValveWorkState(int32_t valueid, int32_t* state) { + uint16_t state16 = 0; + bool ret = m_modbusBlockHost.readReg03(valueid, WORK_STATE_REG, &state16, 30); + *state = state16; + if (!ret) return 1; + return 0; +} \ No newline at end of file diff --git a/usrc/preportional_valve_ctrl.hpp b/usrc/preportional_valve_ctrl.hpp new file mode 100644 index 0000000..061fccd --- /dev/null +++ b/usrc/preportional_valve_ctrl.hpp @@ -0,0 +1,43 @@ +// +// Created by zwsd +// + +#pragma once +#include +#include + +#include "sdk/hal/zhal.hpp" +#include "sdk\components\modbus\modbus_block_host.hpp" + +/** + * @brief + * + * https://iflytop1.feishu.cn/wiki/GQwCwHMqFiaJRwks80ncwaYKnSe + */ + +namespace iflytop { +using namespace std; +class PreportionalValveCtrl { + public: + typedef enum { + kstate_stop = 0x0, + kstate_running_forward = 0xaa, + kstate_running_backward = 0xbb, + kstate_err_state = 0xea, + } work_state_t; + + private: + /* data */ + ModbusBlockHost m_modbusBlockHost; + + public: + PreportionalValveCtrl(){}; + ~PreportionalValveCtrl(){}; + + void initialize(UART_HandleTypeDef* huart); + int32_t setValvePos(int32_t valueid, int32_t pos); + int32_t getValvePos(int32_t valueid, int32_t* pos); + int32_t getValveWorkState(int32_t valueid, int32_t* state); +}; + +} // namespace iflytop \ No newline at end of file diff --git a/usrc/project.hpp b/usrc/project.hpp index 44880ff..074c2c0 100644 --- a/usrc/project.hpp +++ b/usrc/project.hpp @@ -1,6 +1,6 @@ #pragma once -#define VERSION "v1.1" +#define VERSION "v1.2" // 设备ID #define DEVICE_ID (2) // 调试串口