diff --git a/dep/iflytopcpp b/dep/iflytopcpp index 217a1d9..ff65e55 160000 --- a/dep/iflytopcpp +++ b/dep/iflytopcpp @@ -1 +1 @@ -Subproject commit 217a1d97abdaa252dd0daae0cf1c2e2d702833b9 +Subproject commit ff65e5549835f4187d8ef6be14528ed72ae5f632 diff --git a/src/service/device_io_service.cpp b/src/service/device_io_service.cpp index 21da360..387f48d 100644 --- a/src/service/device_io_service.cpp +++ b/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); } - +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); + } +} diff --git a/src/service/device_io_service.hpp b/src/service/device_io_service.hpp index 28d80ec..e766330 100644 --- a/src/service/device_io_service.hpp +++ b/src/service/device_io_service.hpp @@ -84,7 +84,7 @@ class DeviceIOService : public enable_shared_from_this { } typedef enum { - kRouterPower, + kRouterPower = 1, kTouchScreenPower, kUsbChargerPower, kCameraPower, @@ -120,7 +120,7 @@ class DeviceIOService : public enable_shared_from_this { /********************************************************************************************************************* * ===================================================继电器控制==================================================== * *********************************************************************************************************************/ - 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 { private: void inputStateMonitorLoop(); + void idcardreadLoop(); }; } // namespace iflytop \ No newline at end of file diff --git a/src/service/device_io_service_mock.cpp b/src/service/device_io_service_mock.cpp index d6fcd62..8dce404 100644 --- a/src/service/device_io_service_mock.cpp +++ b/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; diff --git a/src/service/device_io_service_mock.hpp b/src/service/device_io_service_mock.hpp index 35c2f88..0ecaa1c 100644 --- a/src/service/device_io_service_mock.hpp +++ b/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; diff --git a/src/service/main_control_service.cpp b/src/service/main_control_service.cpp index 754cf57..7a8093d 100644 --- a/src/service/main_control_service.cpp +++ b/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"]; - bool value = in["value"]; - m_deviceIOService->relayControl((DeviceIOService::relay_device_type_t)type, value); + uint32_t type = in["type"]; + bool value = in["value"]; + m_deviceIOService->relayControl(type, value); } else if (in["command"] == "fanSetState") { int id = in["id"]; float power = in["power"]; @@ -323,7 +323,8 @@ void MainControlService::processReceiveMessage(fromwhere_t fromwhere, const json receipt["state"]["cameraPower"] = relaystate.getState(DeviceIOService::kCameraPower); receipt["state"]["lightPower"] = relaystate.getState(DeviceIOService::kLightPower); } else if (in["command"] == "inputStateGet") { - auto inputdeviceState = m_deviceIOService->getinputState(); + 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); diff --git a/webapp/debug/device_test.html b/webapp/debug/device_test.html index 64a6ce2..4a38599 100644 --- a/webapp/debug/device_test.html +++ b/webapp/debug/device_test.html @@ -114,11 +114,23 @@ relayControl type value