Browse Source

fix some device_io_service bug

master
zhaohe 2 years ago
parent
commit
e32288c344
  1. 2
      dep/iflytopcpp
  2. 140
      src/service/device_io_service.cpp
  3. 5
      src/service/device_io_service.hpp
  4. 4
      src/service/device_io_service_mock.cpp
  5. 2
      src/service/device_io_service_mock.hpp
  6. 5
      src/service/main_control_service.cpp
  7. 40
      webapp/debug/device_test.html

2
dep/iflytopcpp

@ -1 +1 @@
Subproject commit 217a1d97abdaa252dd0daae0cf1c2e2d702833b9
Subproject commit ff65e5549835f4187d8ef6be14528ed72ae5f632

140
src/service/device_io_service.cpp

@ -23,32 +23,13 @@ void DeviceIOService::initialize(string uartpath, int baudrate) {
if (!suc) {
logger->error("modbusMaster initializeTtyChannel fail");
}
thread.reset(new Thread("input_device_state_monitor", [this]() { inputStateMonitorLoop(); }));
#if 0
idcard_read_thread.reset(new Thread("idcard_read", [this]() {
ThisThread thisThread;
int loopperiod = 50;
while (!thisThread.getExitFlag()) {
try {
bool state;
string info;
idcardread(state, info);
if (state) {
logger->info("idcard read info:{}", info);
onidcard(info);
}
loopperiod = 50;
} catch (zexception& e) {
logger->error("idcard read fail:{}", e.what());
loopperiod = 10000;
}
thisThread.sleepForMs(loopperiod);
}
}));
thread.reset(new Thread("input_device_state_monitor", [this]() { inputStateMonitorLoop(); }));
idcard_read_thread.reset(new Thread("idcard_read", [this]() {idcardreadLoop();}));
#endif
}
void DeviceIOService::relayControl(relay_device_type_t type, bool value) {
void DeviceIOService::relayControl(uint32_t type, bool value) {
/**
* @brief
* 8(16Byte) | 0 ->15
@ -79,7 +60,7 @@ DeviceIOService::RelayDeviceState DeviceIOService::relayStateGet() {
DeviceIOService::RelayDeviceState state = {};
Modbus03Rx modbus03rx;
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 10, 2, modbus03rx, kovertime));
uint32_t regstate = uint32_t(modbus03rx.getReg(2)) | uint32_t(modbus03rx.getReg(3) << 16);
uint32_t regstate = uint32_t(modbus03rx.getReg(10)) | uint32_t(modbus03rx.getReg(11) << 16);
state.state = regstate;
return state;
}
@ -89,7 +70,6 @@ uint16_t DeviceIOService::getReg(int index) {
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, index, 1, modbus03rx, kovertime));
return modbus03rx.getReg(index);
}
DeviceIOService::InputDeviceState DeviceIOService::getinputState() {
#if 0
:
@ -100,47 +80,14 @@ Addr | 功能
DeviceIOService::InputDeviceState inputDeviceState;
Modbus03Rx modbus03rx;
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 12, 1, modbus03rx, kovertime));
uint32_t regstate = uint32_t(modbus03rx.getReg(4)) | uint32_t(modbus03rx.getReg(5) << 16);
uint32_t regstate = uint32_t(modbus03rx.getReg(12)) | 0;
inputDeviceState.state = regstate;
return inputDeviceState;
}
void DeviceIOService::inputStateMonitorLoop() {
ThisThread thisThread;
int loopperiod = 50;
while (!thisThread.getExitFlag()) {
try {
uint32_t newkeystate = getinputState().state;
for (size_t i = 0; i < 32; i++) {
bool state = (newkeystate & (1 << i)) != 0;
bool oldstate = (keystate & (1 << i)) != 0;
if (state != oldstate) {
logger->info("on {} state change, state={}", input_device_type2str(input_device_type_t(i)), state);
onInputStateChange((input_device_type_t)i, state);
}
}
keystate = newkeystate;
loopperiod = 50;
} catch (const std::exception& e) {
/**
* @brief 10
*/
logger->error("[:{}] catch exception, {}", __LINE__, e.what());
loopperiod = 10000;
} catch (...) {
logger->error("[:{}] catch exception, unknown error", __LINE__);
loopperiod = 10000;
}
thisThread.sleepForMs(loopperiod);
}
}
uint32_t DeviceIOService::getInterTemperature() { return getReg(16); }
DeviceIOService::env_sensor_state_t DeviceIOService::getEnvSensorState() {
Modbus03Rx modbus03rx;
env_sensor_state_t env_sensor_state = {0};
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 48, 11, modbus03rx, kovertime));
/**
48(16Byte) |
49(16Byte) |
@ -156,6 +103,7 @@ DeviceIOService::env_sensor_state_t DeviceIOService::getEnvSensorState() {
59(16Byte) | light_intensity H
60(16Byte) | light_intensity L
*/
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 48, 13, modbus03rx, kovertime));
env_sensor_state.wind_speed = modbus03rx.getReg(48);
env_sensor_state.wind_direction = modbus03rx.getReg(49);
env_sensor_state.temperature = modbus03rx.getReg(50);
@ -199,16 +147,6 @@ void DeviceIOService::fanGetState(int id, float& power, uint16_t& error) {
return;
}
float DeviceIOService::fanGetState(int id) {
float power = 0;
uint16_t error = 0;
fanGetState(id, power, error);
if (error != 0) {
return -1;
}
return power;
}
void DeviceIOService::fanSetState(int id, float power) {
logger->debug("fanSetState, id={},power={}", id, power);
int startindex = 0;
@ -260,3 +198,69 @@ void DeviceIOService::idcardread(bool& state, string& info) {
logger->debug("idcardread, state={},info={}", state, info);
return;
}
/*************************************************************************************
* *
* MODBUS直接调用接口 *
* *
*************************************************************************************/
float DeviceIOService::fanGetState(int id) {
float power = 0;
uint16_t error = 0;
fanGetState(id, power, error);
if (error != 0) {
return -1;
}
return power;
}
void DeviceIOService::inputStateMonitorLoop() {
ThisThread thisThread;
int loopperiod = 50;
while (!thisThread.getExitFlag()) {
try {
uint32_t newkeystate = getinputState().state;
for (size_t i = 0; i < 32; i++) {
bool state = (newkeystate & (1 << i)) != 0;
bool oldstate = (keystate & (1 << i)) != 0;
if (state != oldstate) {
logger->info("on {} state change, state={}", input_device_type2str(input_device_type_t(i)), state);
onInputStateChange((input_device_type_t)i, state);
}
}
keystate = newkeystate;
loopperiod = 50;
} catch (const std::exception& e) {
/**
* @brief 10
*/
logger->error("[:{}] catch exception, {}", __LINE__, e.what());
loopperiod = 10000;
} catch (...) {
logger->error("[:{}] catch exception, unknown error", __LINE__);
loopperiod = 10000;
}
thisThread.sleepForMs(loopperiod);
}
}
void DeviceIOService::idcardreadLoop() {
ThisThread thisThread;
int loopperiod = 50;
while (!thisThread.getExitFlag()) {
try {
bool state;
string info;
idcardread(state, info);
if (state) {
logger->info("idcard read info:{}", info);
onidcard(info);
}
loopperiod = 50;
} catch (zexception& e) {
logger->error("idcard read fail:{}", e.what());
loopperiod = 10000;
}
thisThread.sleepForMs(loopperiod);
}
}

5
src/service/device_io_service.hpp

@ -84,7 +84,7 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
}
typedef enum {
kRouterPower,
kRouterPower = 1,
kTouchScreenPower,
kUsbChargerPower,
kCameraPower,
@ -120,7 +120,7 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
/*********************************************************************************************************************
* ======================================================================================================= *
*********************************************************************************************************************/
virtual void relayControl(relay_device_type_t type, bool value);
virtual void relayControl(uint32_t type, bool value);
virtual RelayDeviceState relayStateGet();
/*********************************************************************************************************************
@ -186,5 +186,6 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
private:
void inputStateMonitorLoop();
void idcardreadLoop();
};
} // namespace iflytop

4
src/service/device_io_service_mock.cpp

@ -26,8 +26,8 @@ class DeviceIOServiceMock : public DeviceIOService {
void DeviceIOServiceMock::initialize(string uartpath, int baudrate) {}
uint16_t DeviceIOServiceMock::getReg(int index) { return 9973; }
void DeviceIOServiceMock::relayControl(relay_device_type_t type, bool value) {
logger->info("relayControl type:{}, value:{}", relay_device_type2str(type), value);
void DeviceIOServiceMock::relayControl(uint32_t type, bool value) {
logger->info("relayControl type:{}, value:{}", type, value);
}
DeviceIOServiceMock::RelayDeviceState DeviceIOServiceMock::relayStateGet() {
RelayDeviceState state;

2
src/service/device_io_service_mock.hpp

@ -39,7 +39,7 @@ class DeviceIOServiceMock : public DeviceIOService {
virtual void initialize(string uartpath, int baudrate) override;
virtual uint16_t getReg(int index) override;
virtual void relayControl(relay_device_type_t type, bool value) override;
virtual void relayControl(uint32_t type, bool value) override;
virtual RelayDeviceState relayStateGet() override;
virtual InputDeviceState getinputState() override;
virtual uint32_t getInterTemperature() override;

5
src/service/main_control_service.cpp

@ -307,9 +307,9 @@ void MainControlService::processReceiveMessage(fromwhere_t fromwhere, const json
SET_DEVICE_STATE("waterImmersionSensor", inputdeviceState.getState(DeviceIOService::kWaterImmersionSensor), "-");
SET_DEVICE_STATE("humanProximitySensor", inputdeviceState.getState(DeviceIOService::kHumanProximitySensor), "-");
} else if (in["command"] == "relayControl") {
int type = in["type"];
uint32_t type = in["type"];
bool value = in["value"];
m_deviceIOService->relayControl((DeviceIOService::relay_device_type_t)type, value);
m_deviceIOService->relayControl(type, value);
} else if (in["command"] == "fanSetState") {
int id = in["id"];
float power = in["power"];
@ -324,6 +324,7 @@ void MainControlService::processReceiveMessage(fromwhere_t fromwhere, const json
receipt["state"]["lightPower"] = relaystate.getState(DeviceIOService::kLightPower);
} else if (in["command"] == "inputStateGet") {
auto inputdeviceState = m_deviceIOService->getinputState();
// logger->info("{}", inputdeviceState.state);
receipt["state"]["rawState"] = StringUtils().bytet2Binary(inputdeviceState.state, 32, false);
receipt["state"]["emergency"] = inputdeviceState.getState(DeviceIOService::kEmergency);
receipt["state"]["waterImmersionSensor"] = inputdeviceState.getState(DeviceIOService::kWaterImmersionSensor);

40
webapp/debug/device_test.html

@ -114,11 +114,23 @@
<td>relayControl type value</td>
<td>
<select id="relayControl_type">
<option value=0>kRouterPower</option>
<option value=1>kTouchScreenPower</option>
<option value=2>kUsbChargerPower</option>
<option value=3>kCameraPower</option>
<option value=4>kLightPower</option>
<option value=0>0</option>
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
<option value=4>4</option>
<option value=5>5</option>
<option value=6>6</option>
<option value=7>7</option>
<option value=8>8</option>
<option value=9>9</option>
<option value=10>10</option>
<option value=11>11</option>
<option value=12>12</option>
<option value=13>13</option>
<option value=14>14</option>
<option value=15>15</option>
</select>
<select id="relayControl_value">
<option value=0>false</option>
@ -132,12 +144,19 @@
"command": "relayControl",
"need_receipt": true,
"type": Number($("#relayControl_type").val()),
"value": ($("#relayControl_value").val() == 'true'),
}, 4000);
"value": ($("#relayControl_value").val() == '1'),
}, 4000).then((data) => { alert(JSON.stringify(data, null, 2)) });
});
</script>
</tr>
<tr>
<td>relayStateGet</td>
<td>-</td>
<td><button
onclick='zcmd.send_message({"command": "relayStateGet"},1000).then((data) => {alert(JSON.stringify(data,null,2))})'>Trigger</button>
</td>
</tr>
<tr>
<td>fanSetState id value</td>
@ -176,13 +195,6 @@
</script>
</tr>
<tr>
<td>relayStateGet</td>
<td>-</td>
<td><button
onclick='zcmd.send_message({"command": "relayStateGet"},1000).then((data) => {alert(JSON.stringify(data,null,2))})'>Trigger</button>
</td>
</tr>
<tr>
<td>inputStateGet</td>

Loading…
Cancel
Save