diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
index 1c1c4fc..6d9848e 100644
--- a/.settings/language.settings.xml
+++ b/.settings/language.settings.xml
@@ -5,7 +5,7 @@
-
+
@@ -16,7 +16,7 @@
-
+
diff --git a/sdk b/sdk
index 9668eec..22d7d68 160000
--- a/sdk
+++ b/sdk
@@ -1 +1 @@
-Subproject commit 9668eec9f1c1536ed57d72b5a760851455ac5042
+Subproject commit 22d7d685c4a5adaa0e3515a290fdb5c31d594b39
diff --git a/usrc/device.cpp b/usrc/device.cpp
index 6304ed1..2506472 100644
--- a/usrc/device.cpp
+++ b/usrc/device.cpp
@@ -203,18 +203,14 @@ int32_t preportional_valve_is_busy(int32_t *busy) {
int32_t valve1state = 0;
int32_t valve2state = 0;
int32_t err = 0;
- *busy = 0;
+ *busy = 1;
- err = m_PreportionalValveHost.getValveWorkState(1, &valve1state);
+ err = m_PreportionalValveHost.isBusy(1, &valve1state);
if (err != 0) return err;
- err = m_PreportionalValveHost.getValveWorkState(2, &valve2state);
+ err = m_PreportionalValveHost.isBusy(2, &valve2state);
if (err != 0) return err;
- if (valve1state == m_PreportionalValveHost.kstate_err_state || valve2state == m_PreportionalValveHost.kstate_err_state) {
- *busy = 0;
- return 1;
- }
- if (valve1state == m_PreportionalValveHost.kstate_stop && valve2state == m_PreportionalValveHost.kstate_stop) {
+ if (valve1state == 0 && valve2state == 0) {
*busy = 0;
} else {
*busy = 1;
diff --git a/usrc/device.hpp b/usrc/device.hpp
index 9c0caff..82651da 100644
--- a/usrc/device.hpp
+++ b/usrc/device.hpp
@@ -64,6 +64,7 @@ void air_compressor_valve1_set(int32_t val);
void air_compressor_valve2_set(int32_t val);
void air_compressor_read_pressure(int32_t *ack);
void triple_warning_light_ctl(uint8_t r, uint8_t g, uint8_t b, uint8_t warning);
+
int32_t preportional_valve_is_busy(int32_t *busy);
}; // namespace iflytop
diff --git a/usrc/driver/preportional_valve_ctrl.cpp b/usrc/driver/preportional_valve_ctrl.cpp
index 04d31a8..e6200b8 100644
--- a/usrc/driver/preportional_valve_ctrl.cpp
+++ b/usrc/driver/preportional_valve_ctrl.cpp
@@ -8,8 +8,24 @@ using namespace iflytop;
void PreportionalValveCtrl::initialize(UART_HandleTypeDef* huart) { m_modbusBlockHost.initialize(huart); }
int32_t PreportionalValveCtrl::setValvePos(int32_t valueid, int32_t pos) { //
+
+ /**
+ * @brief 发送失败重发3次
+ */
+ for (size_t i = 0; i < 3; i++) {
+ int32_t err = _setValvePos(valueid, pos);
+ if (err == 0) return 0;
+ }
+ return 1;
+}
+int32_t PreportionalValveCtrl::_setValvePos(int32_t valueid, int32_t pos) { //
+ if (valueid > 255 || valueid < 1) {
+ return 1;
+ }
bool ret = m_modbusBlockHost.writeReg06(valueid, CTRL_STATE_REG, pos, 30);
if (!ret) return 1;
+ m_last_set_valve_ticket = HAL_GetTick();
+ m_targetpos[valueid] = pos;
return 0;
}
int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) {
@@ -20,6 +36,65 @@ int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) {
if (!ret) return 1;
return 0;
}
+int32_t PreportionalValveCtrl::getValveOrderPos(int32_t valueid, int32_t* pos) {
+ uint16_t pos16 = 0;
+ bool ret = m_modbusBlockHost.readReg03(valueid, CTRL_STATE_REG, &pos16, 30);
+ *pos = pos16;
+ if (!ret) return 1;
+ return 0;
+}
+#define TAG "PreportionalValveCtrl"
+
+int32_t PreportionalValveCtrl::isBusy(int32_t valueid, int32_t* busy) {
+#if 1
+ int32_t orderpos = 0;
+ int32_t pos = 0;
+ int32_t err = 0;
+
+#if 0
+ err = getValveOrderPos(valueid, &orderpos);
+ if (err != 0) return err;
+#endif
+ orderpos = m_targetpos[valueid];
+
+ err = getValvePos(valueid, &pos);
+ if (err != 0) return err;
+
+ if (abs(m_targetpos[valueid] - pos) <= 11) {
+ *busy = 0;
+ } else {
+ *busy = 1;
+ }
+ return 0;
+#endif
+
+#if 0
+
+ /**
+ * @brief
+ * 比例阀当前状态的更新是有延迟的,例如下发指令控制比例阀开合到90%,下发执行后(收到指令的回执),
+ * 此时读取比例阀状态,比例阀的状态并非运动中,而是stop,需要等待一段时间后,再读取状态,状态才是运动中。
+ */
+ if (haspassedms(m_last_set_valve_ticket) < 300) {
+ *busy = 1;
+ return 0;
+ }
+ int32_t valve1state = 0;
+ int32_t err = 0;
+
+ err = getValveWorkState(1, &valve1state);
+ if (err != 0) return err;
+
+ if (valve1state == kstate_stop) {
+ *busy = 0;
+ } else {
+ *busy = 1;
+ }
+ return 0;
+
+#endif
+}
+
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);
diff --git a/usrc/driver/preportional_valve_ctrl.hpp b/usrc/driver/preportional_valve_ctrl.hpp
index 061fccd..3baf7d5 100644
--- a/usrc/driver/preportional_valve_ctrl.hpp
+++ b/usrc/driver/preportional_valve_ctrl.hpp
@@ -29,6 +29,9 @@ class PreportionalValveCtrl {
private:
/* data */
ModbusBlockHost m_modbusBlockHost;
+ int32_t val = 0;
+ uint32_t m_last_set_valve_ticket = 0;
+ uint16_t m_targetpos[255];
public:
PreportionalValveCtrl(){};
@@ -37,7 +40,12 @@ class 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 getValveOrderPos(int32_t valueid, int32_t* pos);
+ int32_t isBusy(int32_t valueid, int32_t* busy);
int32_t getValveWorkState(int32_t valueid, int32_t* state);
+
+ private:
+ int32_t _setValvePos(int32_t valueid, int32_t pos);
};
} // namespace iflytop
\ No newline at end of file
diff --git a/usrc/main.cpp b/usrc/main.cpp
index 8686adf..cde9b92 100644
--- a/usrc/main.cpp
+++ b/usrc/main.cpp
@@ -15,7 +15,7 @@ void umain(void) {
ZHALCORE::getInstance()->initialize(oscfg);
ZLOGI(TAG, "pipeline_disinfection_liquid_path_control:%s", VERSION);
-
+ device_init();
uart_debug_fn_reg();
can_cmd_reg_fn_reg();
ZLOGI(TAG, "init done");
diff --git a/usrc/uart_debug_fn_reg.cpp b/usrc/uart_debug_fn_reg.cpp
index cc127d5..2f7816c 100644
--- a/usrc/uart_debug_fn_reg.cpp
+++ b/usrc/uart_debug_fn_reg.cpp
@@ -53,8 +53,8 @@ void uart_debug_fn_reg() {
});
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]);
+ int32_t id = atoi(paraV[0]);
+ int32_t val = atoi(paraV[1]);
m_PreportionalValveHost.setValvePos(id, val);
ack->setNoneAck(0);
});