Browse Source

update

master
zhaohe 2 years ago
parent
commit
7135515620
  1. 12
      Core/Src/gpio.c
  2. 18
      Core/Src/usart.c
  3. 43
      pipeline_disinfection_liquid_path_control.ioc
  4. 2
      sdk
  5. 226
      usrc/main.cpp
  6. 3
      usrc/main.hpp
  7. 282
      usrc/one_dimensional_code_laser_scanner.cpp
  8. 101
      usrc/one_dimensional_code_laser_scanner.hpp
  9. 29
      usrc/preportional_valve_ctrl.cpp
  10. 43
      usrc/preportional_valve_ctrl.hpp
  11. 2
      usrc/project.hpp

12
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);

18
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);

43
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

2
sdk

@ -1 +1 @@
Subproject commit c261a135309487a40c6c8c201a7ff979048e89aa
Subproject commit 3b3ff3d15cb860cf7638ef1cf7d23a9f72e91f1b

226
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 <stdint.h>
#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);
}
}

3
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

282
usrc/one_dimensional_code_laser_scanner.cpp

@ -1,282 +0,0 @@
#include "one_dimensional_code_laser_scanner.hpp"
#include <string.h>
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++;
}

101
usrc/one_dimensional_code_laser_scanner.hpp

@ -1,101 +0,0 @@
#pragma once
#include <stdint.h>
#include <stdio.h>
#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<int32_t()> 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

29
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;
}

43
usrc/preportional_valve_ctrl.hpp

@ -0,0 +1,43 @@
//
// Created by zwsd
//
#pragma once
#include <stdint.h>
#include <stdio.h>
#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

2
usrc/project.hpp

@ -1,6 +1,6 @@
#pragma once
#define VERSION "v1.1"
#define VERSION "v1.2"
// 设备ID
#define DEVICE_ID (2)
// 调试串口

Loading…
Cancel
Save