|
|
@ -8,29 +8,29 @@ using namespace core; |
|
|
|
using namespace std; |
|
|
|
|
|
|
|
const static int ksubboarddeviceid = 0x01; |
|
|
|
const int kovertime = 33; |
|
|
|
const int kovertime = 33; |
|
|
|
|
|
|
|
#define EXEC_MODBUS(exptr) \
|
|
|
|
int ret = exptr; \ |
|
|
|
if (ret != 0) { \ |
|
|
|
throw zexception( \ |
|
|
|
fmt::format("[{}:{}] do {} fail, ret={},{}", __FUNCTION__, __LINE__, exptr, ret, modbusStatusToStr(ret))); \ |
|
|
|
#define EXEC_MODBUS(exptr) \
|
|
|
|
int ret = exptr; \ |
|
|
|
if (ret != 0) { \ |
|
|
|
throw zexception( \ |
|
|
|
fmt::format("[{}:{}] do {} fail, ret={},{}", __FUNCTION__, __LINE__, #exptr, ret, modbusStatusToStr(ret))); \ |
|
|
|
} |
|
|
|
|
|
|
|
void DeviceIOService::initialize() { |
|
|
|
void DeviceIOService::initialize(string uartpath, int baudrate) { |
|
|
|
modbusMaster = shared_ptr<ModbusMaster>(new ModbusMaster()); |
|
|
|
bool suc = modbusMaster->initializeTtyChannel("/dev/ttyUSB0", 115200); |
|
|
|
bool suc = modbusMaster->initializeTtyChannel(uartpath.c_str(), 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; |
|
|
|
bool state; |
|
|
|
string info; |
|
|
|
|
|
|
|
idcardread(state, info); |
|
|
@ -38,28 +38,26 @@ void DeviceIOService::initialize() { |
|
|
|
logger->info("idcard read info:{}", info); |
|
|
|
onidcard(info); |
|
|
|
} |
|
|
|
|
|
|
|
loopperiod = 50; |
|
|
|
} catch (zexception& e) { |
|
|
|
static tp_steady lastlogticket; |
|
|
|
if (tu_steady().elapsedTimeS(lastlogticket) > 5) { |
|
|
|
logger->error("idcard read fail:{}", e.what()); |
|
|
|
lastlogticket = tu_steady().now(); |
|
|
|
} |
|
|
|
logger->error("idcard read fail:{}", e.what()); |
|
|
|
loopperiod = 10000; |
|
|
|
} |
|
|
|
thisThread.sleepForMs(100); |
|
|
|
thisThread.sleepForMs(loopperiod); |
|
|
|
} |
|
|
|
})); |
|
|
|
#endif
|
|
|
|
} |
|
|
|
void DeviceIOService::relayControl(relay_device_type_t type, bool value) { |
|
|
|
/**
|
|
|
|
* @brief |
|
|
|
* 0(16Byte) | 继电器0 ->继电器15 掩码 |
|
|
|
* 1(16Byte) | 继电器16->继电器31 掩码 |
|
|
|
* 2(16Byte) | 继电器0 ->继电器15 继电器状态 |
|
|
|
* 3(16Byte) | 继电器16->继电器31 继电器状态 |
|
|
|
* 8(16Byte) | 继电器0 ->继电器15 掩码 |
|
|
|
* 9(16Byte) | 继电器16->继电器31 掩码 |
|
|
|
* 10(16Byte) | 继电器0 ->继电器15 继电器状态 |
|
|
|
* 11(16Byte) | 继电器16->继电器31 继电器状态 |
|
|
|
*/ |
|
|
|
uint32_t off = (uint32_t)type; |
|
|
|
uint32_t mask = 1 << off; |
|
|
|
uint32_t off = (uint32_t)type; |
|
|
|
uint32_t mask = 1 << off; |
|
|
|
uint32_t status = value ? mask : 0; |
|
|
|
|
|
|
|
uint16_t reg[4]; |
|
|
@ -68,21 +66,21 @@ void DeviceIOService::relayControl(relay_device_type_t type, bool value) { |
|
|
|
MODBUS_SET_REG(reg[2], uint16_t(status)); |
|
|
|
MODBUS_SET_REG(reg[3], uint16_t(status >> 16)); |
|
|
|
|
|
|
|
EXEC_MODBUS(modbusMaster->modbus10(ksubboarddeviceid, 0, 4, reg, kovertime)); |
|
|
|
EXEC_MODBUS(modbusMaster->modbus10(ksubboarddeviceid, 8, 4, reg, kovertime)); |
|
|
|
} |
|
|
|
DeviceIOService::RelayDeviceState DeviceIOService::relayStateGet() { |
|
|
|
/**
|
|
|
|
* @brief |
|
|
|
* 0(16Byte) | 继电器0 ->继电器15 掩码 |
|
|
|
* 1(16Byte) | 继电器16->继电器31 掩码 |
|
|
|
* 2(16Byte) | 继电器0 ->继电器15 继电器状态 |
|
|
|
* 3(16Byte) | 继电器16->继电器31 继电器状态 |
|
|
|
* 8(16Byte) | 继电器0 ->继电器15 掩码 |
|
|
|
* 9(16Byte) | 继电器16->继电器31 掩码 |
|
|
|
* 10(16Byte) | 继电器0 ->继电器15 继电器状态 |
|
|
|
* 11(16Byte) | 继电器16->继电器31 继电器状态 |
|
|
|
*/ |
|
|
|
DeviceIOService::RelayDeviceState state = {}; |
|
|
|
Modbus03Rx modbus03rx; |
|
|
|
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 2, 2, modbus03rx, kovertime)); |
|
|
|
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); |
|
|
|
state.state = regstate; |
|
|
|
state.state = regstate; |
|
|
|
return state; |
|
|
|
} |
|
|
|
|
|
|
@ -91,93 +89,56 @@ uint16_t DeviceIOService::getReg(int index) { |
|
|
|
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, index, 1, modbus03rx, kovertime)); |
|
|
|
return modbus03rx.getReg(index); |
|
|
|
} |
|
|
|
#if 0
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* ==================================================路由器电源控制=================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
bool DeviceIOService::routerGetPowerState() { return relayStateGet(0); } |
|
|
|
void DeviceIOService::routerSetPowerState(bool routepower) { |
|
|
|
logger->debug("routerSetPowerState {}", routepower); |
|
|
|
relayControl(0, true); |
|
|
|
} |
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* ==================================================触控屏供电控制=================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
bool DeviceIOService::touchScreenGetPowerState() { return relayStateGet(1); } |
|
|
|
void DeviceIOService::touchScreenSetPowerState(bool touchpower) { |
|
|
|
logger->debug("touchScreenSetPowerState {}", touchpower); |
|
|
|
relayControl(1, touchpower); |
|
|
|
} |
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* ==================================================USB充电器供电=================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
bool DeviceIOService::usbChargerGetPowerState() { return relayStateGet(2); } |
|
|
|
void DeviceIOService::usbChargerSetPowerState(bool usbpower) { |
|
|
|
logger->debug("usbChargerSetPowerState {}", usbpower); |
|
|
|
relayControl(2, usbpower); |
|
|
|
} |
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* ==================================================摄像头供电=================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
bool DeviceIOService::cameraGetPowerState() { return relayStateGet(3); } |
|
|
|
void DeviceIOService::cameraSetPowerState(bool camerapower) { |
|
|
|
logger->debug("cameraSetPowerState {}", camerapower); |
|
|
|
relayControl(3, camerapower); |
|
|
|
} |
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* ==================================================照明控制=================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
bool DeviceIOService::lightGetPowerState() { return relayStateGet(4); } |
|
|
|
void DeviceIOService::lightSetPowerState(bool lightpower) { |
|
|
|
logger->debug("lightSetPowerState {}", lightpower); |
|
|
|
relayControl(4, lightpower); |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
DeviceIOService::InputDeviceState DeviceIOService::getinputState() { |
|
|
|
#if 0
|
|
|
|
寄存器: |
|
|
|
Addr | 功能 |
|
|
|
------------|------------------------------- |
|
|
|
12(16Byte) | 所有限位输入状态 |
|
|
|
#endif
|
|
|
|
DeviceIOService::InputDeviceState inputDeviceState; |
|
|
|
Modbus03Rx modbus03rx; |
|
|
|
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 4, 2, modbus03rx, kovertime)); |
|
|
|
uint32_t regstate = uint32_t(modbus03rx.getReg(4)) | uint32_t(modbus03rx.getReg(5) << 16); |
|
|
|
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); |
|
|
|
inputDeviceState.state = regstate; |
|
|
|
return inputDeviceState; |
|
|
|
} |
|
|
|
|
|
|
|
void DeviceIOService::inputStateMonitorLoop() { |
|
|
|
ThisThread thisThread; |
|
|
|
int loopperiod = 50; |
|
|
|
while (!thisThread.getExitFlag()) { |
|
|
|
try { |
|
|
|
uint32_t regstate = getinputState().state; |
|
|
|
uint32_t newkeystate = getinputState().state; |
|
|
|
for (size_t i = 0; i < 32; i++) { |
|
|
|
bool state = (regstate & (1 << i)) != 0; |
|
|
|
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 如果出现异常,则每隔5秒打印一次日志 |
|
|
|
* @brief 如果出现异常,那么就延时10秒,然后再次尝试 |
|
|
|
*/ |
|
|
|
static tp_steady lastlogticket; |
|
|
|
if (tu_steady().elapsedTimeS(lastlogticket) > 5) { |
|
|
|
logger->error("inputStateMonitorLoop fail, {}", e.what()); |
|
|
|
lastlogticket = tu_steady().now(); |
|
|
|
} |
|
|
|
logger->error("[:{}] catch exception, {}", __LINE__, e.what()); |
|
|
|
loopperiod = 10000; |
|
|
|
} catch (...) { |
|
|
|
logger->error("[:{}] catch exception, unknown error", __LINE__); |
|
|
|
loopperiod = 10000; |
|
|
|
} |
|
|
|
thisThread.sleepForMs(50); |
|
|
|
thisThread.sleepForMs(loopperiod); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
uint32_t DeviceIOService::getInterTemperature() { return getReg(16); } |
|
|
|
|
|
|
|
DeviceIOService::env_sensor_state_t DeviceIOService::getEnvSensorState() { |
|
|
|
Modbus03Rx modbus03rx; |
|
|
|
Modbus03Rx modbus03rx; |
|
|
|
env_sensor_state_t env_sensor_state = {0}; |
|
|
|
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 48, 11, modbus03rx, kovertime)); |
|
|
|
/**
|
|
|
@ -195,18 +156,18 @@ DeviceIOService::env_sensor_state_t DeviceIOService::getEnvSensorState() { |
|
|
|
59(16Byte) | light_intensity H |
|
|
|
60(16Byte) | light_intensity L |
|
|
|
*/ |
|
|
|
env_sensor_state.wind_speed = modbus03rx.getReg(48); |
|
|
|
env_sensor_state.wind_direction = modbus03rx.getReg(49); |
|
|
|
env_sensor_state.temperature = modbus03rx.getReg(50); |
|
|
|
env_sensor_state.humidity = modbus03rx.getReg(51); |
|
|
|
env_sensor_state.noise = modbus03rx.getReg(52); |
|
|
|
env_sensor_state.pm2_5 = modbus03rx.getReg(53); |
|
|
|
env_sensor_state.pm10 = modbus03rx.getReg(54); |
|
|
|
env_sensor_state.co2 = modbus03rx.getReg(55); |
|
|
|
env_sensor_state.wind_speed = modbus03rx.getReg(48); |
|
|
|
env_sensor_state.wind_direction = modbus03rx.getReg(49); |
|
|
|
env_sensor_state.temperature = modbus03rx.getReg(50); |
|
|
|
env_sensor_state.humidity = modbus03rx.getReg(51); |
|
|
|
env_sensor_state.noise = modbus03rx.getReg(52); |
|
|
|
env_sensor_state.pm2_5 = modbus03rx.getReg(53); |
|
|
|
env_sensor_state.pm10 = modbus03rx.getReg(54); |
|
|
|
env_sensor_state.co2 = modbus03rx.getReg(55); |
|
|
|
env_sensor_state.atmospheric_pressure = modbus03rx.getReg(56); |
|
|
|
env_sensor_state.tvoc = modbus03rx.getReg(57); |
|
|
|
env_sensor_state.hcho = modbus03rx.getReg(58); |
|
|
|
env_sensor_state.light_intensity = uint32_t(modbus03rx.getReg(59)) << 16 | uint32_t(modbus03rx.getReg(60)); |
|
|
|
env_sensor_state.tvoc = modbus03rx.getReg(57); |
|
|
|
env_sensor_state.hcho = modbus03rx.getReg(58); |
|
|
|
env_sensor_state.light_intensity = uint32_t(modbus03rx.getReg(59)) << 16 | uint32_t(modbus03rx.getReg(60)); |
|
|
|
|
|
|
|
logger->debug( |
|
|
|
"getEnvSensorState, " |
|
|
@ -239,7 +200,7 @@ void DeviceIOService::fanGetState(int id, float& power, uint16_t& error) { |
|
|
|
} |
|
|
|
|
|
|
|
float DeviceIOService::fanGetState(int id) { |
|
|
|
float power = 0; |
|
|
|
float power = 0; |
|
|
|
uint16_t error = 0; |
|
|
|
fanGetState(id, power, error); |
|
|
|
if (error != 0) { |
|
|
@ -275,8 +236,8 @@ void DeviceIOService::idcardread(bool& state, string& info) { |
|
|
|
* ..(16Byte) | |
|
|
|
* 127(16Byte) | |
|
|
|
*/ |
|
|
|
state = false; |
|
|
|
info = ""; |
|
|
|
state = false; |
|
|
|
info = ""; |
|
|
|
int datalen = 0; |
|
|
|
{ |
|
|
|
Modbus03Rx modbus03rx; |
|
|
|