Browse Source

修复指令串口BUG

master
zhaohe 2 years ago
parent
commit
e1ec1032b5
  1. 6
      README.md
  2. 2
      buildtools
  3. 2
      dep/iflytopcpp
  4. 49
      sh/boardinit.sh
  5. 6
      src/configs/zconfig.hpp
  6. 6
      src/main.cpp
  7. 171
      src/service/device_io_service.cpp
  8. 20
      src/service/device_io_service.hpp
  9. 2
      src/service/device_io_service_mock.cpp
  10. 2
      src/service/device_io_service_mock.hpp
  11. 36
      src/service/light_control_service.cpp

6
README.md

@ -6,6 +6,12 @@
## 编译RK3328
```bash
# 板子环境初始化
./sh/boardinit.sh --deviceId <deviceId> --ftpserver 47.92.195.73 --fixmac true --ip <ip>
# demo
./sh/boardinit.sh --deviceId intelligent_light_pole01 --ftpserver 47.92.195.73 --fixmac true --ip 192.168.1.192
# 初始化环境
./sh/iflytool.sh envsetup

2
buildtools

@ -1 +1 @@
Subproject commit 45b06ce5325ab6528de930d9b579ae447e12c26f
Subproject commit a1cb2710c928ec2fb36fc944f592303b0118e227

2
dep/iflytopcpp

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

49
sh/boardinit.sh

@ -51,6 +51,50 @@ function generate_device_info() {
}
function update_frpc_config() {
#
# 当前这版本的FRPC的配置文件有问题,重新生成配置文件
#
# [common]
# server_addr = {{ .Envs.FRP_SERVER_ADDR }}
# server_port = 7000
# log_file = /var/log/frpc.log
# log_level = debug
# log_max_days = 3
# login_fail_exit = false
# user = {{ .Envs.DEVICE_ID }}
#
# [ssh]
# type = tcp
# local_ip = 127.0.0.1
# local_port = 22
# remote_port = 0
echo "[common]" >/etc/frpc.ini
echo "server_addr = ${FTP_SERVER_ADDR}" >>/etc/frpc.ini
echo "server_port = 7000" >>/etc/frpc.ini
echo "log_file = /var/log/frpc.log" >>/etc/frpc.ini
echo "log_level = debug" >>/etc/frpc.ini
echo "log_max_days = 3" >>/etc/frpc.ini
echo "login_fail_exit = false" >>/etc/frpc.ini
echo "user = ${DEVICE_ID}" >>/etc/frpc.ini
echo "" >>/etc/frpc.ini
echo "[ssh]" >>/etc/frpc.ini
echo "type = tcp" >>/etc/frpc.ini
echo "local_ip = 127.0.0.1" >>/etc/frpc.ini
echo "local_port = 22" >>/etc/frpc.ini
echo "remote_port = 0" >>/etc/frpc.ini
echo "+++++++++ create /etc/frpc.ini +++++++++"
cat /etc/frpc.ini
echo ""
systemctl enable frpc.service
systemctl start frpc
}
set -e
DEVICE_ID=""
FTP_SERVER_ADDR=""
@ -108,3 +152,8 @@ if [ "$FIX_MAC" == "true" ]; then
fi
generate_device_info
# 翻转屏幕
ff_rotate right
update_frpc_config

6
src/configs/zconfig.hpp

@ -20,14 +20,16 @@
marco(int /* */, recoder_ch_number, 5) /*录音设备配置*/ \
marco(int /* */, recoder_sample_rate, 16000) /*录音设备配置*/ \
marco(int /* */, recoder_period_time_ms, 50) /*录音设备配置*/ \
marco(string /* */, wakeup_module_path, "./precise/precise-engine") /*唤醒词配置*/ \
marco(string /* */, wakeup_lib_module, "xiaomaoxiaomao/xiaomaoxiaomao.pb") /*唤醒词配置*/ \
marco(string /* */, wakeup_module_path, "xiaomaoxiaomao/xiaomaoxiaomao.pb") /*唤醒词配置*/ \
marco(string /* */, wakeup_lib_module, "./precise/precise-engine") /*唤醒词配置*/ \
marco(string /* */, wakeup_chunk_length, "1600") /*唤醒词配置,对应50ms*/ \
marco(bool /* */, voice_logger_enable, true) /*是否记录语音配置*/ \
marco(string /* */, aiui_appid, "5938b7c7") /*唤醒词配置,对应50ms*/ \
marco(string /* */, aiui_appkey, "19c1f7becc78eedc7826b485aabe30de") /*唤醒词配置,对应50ms*/ \
marco(string /* */, aiui_auth_id, "") /*唤醒词配置,对应50ms*/ \
marco(string /* */, aiui_scene, "main_box") /*唤醒词配置,对应50ms*/ \
marco(string /* */, device_io_uart_path, "/dev/ttyUSB1") /*唤醒词配置,对应50ms*/ \
marco(int /* */, device_io_uart_baundrate, 115200) /*唤醒词配置,对应50ms*/ \
marco(string /* */, lightControlMode, "auto") /*照明灯控制模式 auto/manual*/ \
marco(int /* */, lightAutoOpenHour, 18) /**/ \
marco(int /* */, lightAutoOpenMin, 0) /**/ \

6
src/main.cpp

@ -119,12 +119,14 @@ void Main::buildDeviceIOService() {
/**
* @brief DeviceIOService初始化
*/
#if 0
auto config = GET_SERVICE(ZConfig);
#if 1
BUILD_AND_REG_SERRVICE(DeviceIOService);
#else
BUILD_AND_REG_MOCK_SERRVICE(DeviceIOService, DeviceIOServiceMock);
#endif
GET_SERVICE(DeviceIOService)->initialize();
GET_SERVICE(DeviceIOService)->initialize(config->get_device_io_uart_path(), config->get_device_io_uart_baundrate());
}
void Main::buildVoiceProcessService() {

171
src/service/device_io_service.cpp

@ -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;

20
src/service/device_io_service.hpp

@ -42,7 +42,7 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
ENABLE_LOGGER(DeviceIOService);
shared_ptr<ModbusMaster> modbusMaster;
uint32_t keystate;
uint32_t keystate = 0;
unique_ptr<Thread> thread;
unique_ptr<Thread> idcard_read_thread;
@ -67,7 +67,7 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
class InputDeviceState {
public:
uint32_t state;
bool getState(input_device_type_t inputtype) { return (state & (1 << inputtype)) != 0; }
bool getState(input_device_type_t inputtype) { return (state & (1 << inputtype)) != 0; }
};
string input_device_type2str(input_device_type_t type) {
@ -79,7 +79,7 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
case kHumanProximitySensor:
return "kHumanProximitySensor";
default:
return "unknow";
return fmt::format("unknow({})", (int)type);
}
}
@ -111,23 +111,23 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
class RelayDeviceState {
public:
uint32_t state;
bool getState(relay_device_type_t inputtype) { return (state & (1 << inputtype)) != 0; }
bool getState(relay_device_type_t inputtype) { return (state & (1 << inputtype)) != 0; }
};
public:
DeviceIOService(){};
virtual void initialize();
virtual void initialize(string uartpath, int baudrate);
/*********************************************************************************************************************
* ======================================================================================================= *
*********************************************************************************************************************/
virtual void relayControl(relay_device_type_t type, bool value);
virtual void relayControl(relay_device_type_t type, bool value);
virtual RelayDeviceState relayStateGet();
/*********************************************************************************************************************
* =================================================IO输入状态================================================== *
*********************************************************************************************************************/
nod::signal<void(input_device_type_t inputtype, bool value)> onInputStateChange;
virtual InputDeviceState getinputState();
virtual InputDeviceState getinputState();
/*********************************************************************************************************************
* ======================================================================================================= *
@ -173,16 +173,16 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
/*********************************************************************************************************************
* ===================================================================================================== *
*********************************************************************************************************************/
virtual void fanGetState(int id, float& power, uint16_t& error);
virtual void fanGetState(int id, float& power, uint16_t& error);
virtual float fanGetState(int id);
virtual void fanSetState(int id, float power);
virtual void fanSetState(int id, float power);
/*********************************************************************************************************************
* ========================================================================================================= *
*********************************************************************************************************************/
nod::signal<void(string cardinfo)> onidcard;
virtual void idcardread(bool& state, string& info);
virtual void idcardread(bool& state, string& info);
private:
void inputStateMonitorLoop();

2
src/service/device_io_service_mock.cpp

@ -24,7 +24,7 @@ class DeviceIOServiceMock : public DeviceIOService {
};
#endif
void DeviceIOServiceMock::initialize() {}
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);

2
src/service/device_io_service_mock.hpp

@ -37,7 +37,7 @@ class DeviceIOServiceMock : public DeviceIOService {
DeviceIOServiceMock() : DeviceIOService(){};
virtual ~DeviceIOServiceMock() {}
virtual void initialize() override;
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 RelayDeviceState relayStateGet() override;

36
src/service/light_control_service.cpp

@ -16,8 +16,8 @@ void LightControlService::start() {
ThisThread thisThread;
// 获得当前从1970到现在的绝对天数
int day = time(nullptr) / 86400;
bool triggerOpen = false;
int day = time(nullptr) / 86400;
bool triggerOpen = false;
bool triggerClose = false;
while (!thisThread.getExitFlag()) {
@ -27,32 +27,40 @@ void LightControlService::start() {
// 更新当前绝对天数
int nowDay = time(nullptr) / 86400;
if (nowDay != day) {
day = nowDay;
triggerOpen = false;
day = nowDay;
triggerOpen = false;
triggerClose = false;
}
if (!triggerClose && config->get_lightControlMode() == "auto") {
// 判断是否到达开启时间
time_t now = time(nullptr);
struct tm *tm = localtime(&now);
time_t now = time(nullptr);
struct tm *tm = localtime(&now);
if (tm->tm_hour >= config->get_lightAutoCloseHour() ||
(tm->tm_hour == config->get_lightAutoCloseHour() && tm->tm_min >= config->get_lightAutoCloseMin())) {
logger->info("LightControlService triggerClose");
triggerClose = true;
deviceIoService->relayControl(DeviceIOService::kLightPower, false);
try {
logger->info("LightControlService triggerClose");
deviceIoService->relayControl(DeviceIOService::kLightPower, false);
triggerClose = true;
} catch (const std::exception &e) {
logger->error("LightControlService triggerClose error: {}", e.what());
}
}
}
//
if (!triggerOpen && config->get_lightControlMode() == "auto") {
// 判断是否到达开启时间
time_t now = time(nullptr);
struct tm *tm = localtime(&now);
time_t now = time(nullptr);
struct tm *tm = localtime(&now);
if (tm->tm_hour >= config->get_lightAutoOpenHour() ||
(tm->tm_hour == config->get_lightAutoOpenHour() && tm->tm_min >= config->get_lightAutoOpenMin())) {
logger->info("LightControlService triggerOpen");
triggerOpen = true;
deviceIoService->relayControl(DeviceIOService::kLightPower, true);
try {
logger->info("LightControlService triggerOpen");
deviceIoService->relayControl(DeviceIOService::kLightPower, true);
triggerOpen = true;
} catch (const std::exception &e) {
logger->error("LightControlService triggerOpen error: {}", e.what());
}
}
}

Loading…
Cancel
Save