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. 115
      src/service/device_io_service.cpp
  8. 6
      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. 12
      src/service/light_control_service.cpp

6
README.md

@ -6,6 +6,12 @@
## 编译RK3328 ## 编译RK3328
```bash ```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 ./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 set -e
DEVICE_ID="" DEVICE_ID=""
FTP_SERVER_ADDR="" FTP_SERVER_ADDR=""
@ -108,3 +152,8 @@ if [ "$FIX_MAC" == "true" ]; then
fi fi
generate_device_info 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_ch_number, 5) /*录音设备配置*/ \
marco(int /* */, recoder_sample_rate, 16000) /*录音设备配置*/ \ marco(int /* */, recoder_sample_rate, 16000) /*录音设备配置*/ \
marco(int /* */, recoder_period_time_ms, 50) /*录音设备配置*/ \ 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(string /* */, wakeup_chunk_length, "1600") /*唤醒词配置,对应50ms*/ \
marco(bool /* */, voice_logger_enable, true) /*是否记录语音配置*/ \ marco(bool /* */, voice_logger_enable, true) /*是否记录语音配置*/ \
marco(string /* */, aiui_appid, "5938b7c7") /*唤醒词配置,对应50ms*/ \ marco(string /* */, aiui_appid, "5938b7c7") /*唤醒词配置,对应50ms*/ \
marco(string /* */, aiui_appkey, "19c1f7becc78eedc7826b485aabe30de") /*唤醒词配置,对应50ms*/ \ marco(string /* */, aiui_appkey, "19c1f7becc78eedc7826b485aabe30de") /*唤醒词配置,对应50ms*/ \
marco(string /* */, aiui_auth_id, "") /*唤醒词配置,对应50ms*/ \ marco(string /* */, aiui_auth_id, "") /*唤醒词配置,对应50ms*/ \
marco(string /* */, aiui_scene, "main_box") /*唤醒词配置,对应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(string /* */, lightControlMode, "auto") /*照明灯控制模式 auto/manual*/ \
marco(int /* */, lightAutoOpenHour, 18) /**/ \ marco(int /* */, lightAutoOpenHour, 18) /**/ \
marco(int /* */, lightAutoOpenMin, 0) /**/ \ marco(int /* */, lightAutoOpenMin, 0) /**/ \

6
src/main.cpp

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

115
src/service/device_io_service.cpp

@ -14,20 +14,20 @@ const int kovertime = 33;
int ret = exptr; \ int ret = exptr; \
if (ret != 0) { \ if (ret != 0) { \
throw zexception( \ throw zexception( \
fmt::format("[{}:{}] do {} fail, ret={},{}", __FUNCTION__, __LINE__, exptr, ret, modbusStatusToStr(ret))); \
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()); modbusMaster = shared_ptr<ModbusMaster>(new ModbusMaster());
bool suc = modbusMaster->initializeTtyChannel("/dev/ttyUSB0", 115200);
bool suc = modbusMaster->initializeTtyChannel(uartpath.c_str(), baudrate);
if (!suc) { if (!suc) {
logger->error("modbusMaster initializeTtyChannel fail"); logger->error("modbusMaster initializeTtyChannel fail");
} }
thread.reset(new Thread("input_device_state_monitor", [this]() { inputStateMonitorLoop(); })); thread.reset(new Thread("input_device_state_monitor", [this]() { inputStateMonitorLoop(); }));
#if 0
idcard_read_thread.reset(new Thread("idcard_read", [this]() { idcard_read_thread.reset(new Thread("idcard_read", [this]() {
ThisThread thisThread; ThisThread thisThread;
int loopperiod = 50;
while (!thisThread.getExitFlag()) { while (!thisThread.getExitFlag()) {
try { try {
bool state; bool state;
@ -38,25 +38,23 @@ void DeviceIOService::initialize() {
logger->info("idcard read info:{}", info); logger->info("idcard read info:{}", info);
onidcard(info); onidcard(info);
} }
loopperiod = 50;
} catch (zexception& e) { } catch (zexception& e) {
static tp_steady lastlogticket;
if (tu_steady().elapsedTimeS(lastlogticket) > 5) {
logger->error("idcard read fail:{}", e.what()); logger->error("idcard read fail:{}", e.what());
lastlogticket = tu_steady().now();
}
loopperiod = 10000;
} }
thisThread.sleepForMs(100);
thisThread.sleepForMs(loopperiod);
} }
})); }));
#endif
} }
void DeviceIOService::relayControl(relay_device_type_t type, bool value) { void DeviceIOService::relayControl(relay_device_type_t type, bool value) {
/** /**
* @brief * @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 off = (uint32_t)type;
uint32_t mask = 1 << off; uint32_t mask = 1 << off;
@ -68,19 +66,19 @@ void DeviceIOService::relayControl(relay_device_type_t type, bool value) {
MODBUS_SET_REG(reg[2], uint16_t(status)); MODBUS_SET_REG(reg[2], uint16_t(status));
MODBUS_SET_REG(reg[3], uint16_t(status >> 16)); 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() { DeviceIOService::RelayDeviceState DeviceIOService::relayStateGet() {
/** /**
* @brief * @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 = {}; DeviceIOService::RelayDeviceState state = {};
Modbus03Rx modbus03rx; Modbus03Rx modbus03rx;
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 2, 2, modbus03rx, kovertime));
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(2)) | uint32_t(modbus03rx.getReg(3) << 16);
state.state = regstate; state.state = regstate;
return state; return state;
@ -91,57 +89,17 @@ uint16_t DeviceIOService::getReg(int index) {
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, index, 1, modbus03rx, kovertime)); EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, index, 1, modbus03rx, kovertime));
return modbus03rx.getReg(index); 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() { DeviceIOService::InputDeviceState DeviceIOService::getinputState() {
#if 0
:
Addr |
------------|-------------------------------
12(16Byte) |
#endif
DeviceIOService::InputDeviceState inputDeviceState; DeviceIOService::InputDeviceState inputDeviceState;
Modbus03Rx modbus03rx; Modbus03Rx modbus03rx;
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 4, 2, modbus03rx, kovertime));
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(4)) | uint32_t(modbus03rx.getReg(5) << 16);
inputDeviceState.state = regstate; inputDeviceState.state = regstate;
return inputDeviceState; return inputDeviceState;
@ -149,28 +107,31 @@ DeviceIOService::InputDeviceState DeviceIOService::getinputState() {
void DeviceIOService::inputStateMonitorLoop() { void DeviceIOService::inputStateMonitorLoop() {
ThisThread thisThread; ThisThread thisThread;
int loopperiod = 50;
while (!thisThread.getExitFlag()) { while (!thisThread.getExitFlag()) {
try { try {
uint32_t regstate = getinputState().state;
uint32_t newkeystate = getinputState().state;
for (size_t i = 0; i < 32; i++) { 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; bool oldstate = (keystate & (1 << i)) != 0;
if (state != oldstate) { if (state != oldstate) {
logger->info("on {} state change, state={}", input_device_type2str(input_device_type_t(i)), state); logger->info("on {} state change, state={}", input_device_type2str(input_device_type_t(i)), state);
onInputStateChange((input_device_type_t)i, state); onInputStateChange((input_device_type_t)i, state);
} }
} }
keystate = newkeystate;
loopperiod = 50;
} catch (const std::exception& e) { } 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);
} }
} }

6
src/service/device_io_service.hpp

@ -42,7 +42,7 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
ENABLE_LOGGER(DeviceIOService); ENABLE_LOGGER(DeviceIOService);
shared_ptr<ModbusMaster> modbusMaster; shared_ptr<ModbusMaster> modbusMaster;
uint32_t keystate;
uint32_t keystate = 0;
unique_ptr<Thread> thread; unique_ptr<Thread> thread;
unique_ptr<Thread> idcard_read_thread; unique_ptr<Thread> idcard_read_thread;
@ -79,7 +79,7 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
case kHumanProximitySensor: case kHumanProximitySensor:
return "kHumanProximitySensor"; return "kHumanProximitySensor";
default: default:
return "unknow";
return fmt::format("unknow({})", (int)type);
} }
} }
@ -116,7 +116,7 @@ class DeviceIOService : public enable_shared_from_this<DeviceIOService> {
public: public:
DeviceIOService(){}; DeviceIOService(){};
virtual void initialize();
virtual void initialize(string uartpath, int baudrate);
/********************************************************************************************************************* /*********************************************************************************************************************
* ======================================================================================================= * * ======================================================================================================= *
*********************************************************************************************************************/ *********************************************************************************************************************/

2
src/service/device_io_service_mock.cpp

@ -24,7 +24,7 @@ class DeviceIOServiceMock : public DeviceIOService {
}; };
#endif #endif
void DeviceIOServiceMock::initialize() {}
void DeviceIOServiceMock::initialize(string uartpath, int baudrate) {}
uint16_t DeviceIOServiceMock::getReg(int index) { return 9973; } uint16_t DeviceIOServiceMock::getReg(int index) { return 9973; }
void DeviceIOServiceMock::relayControl(relay_device_type_t type, bool value) { void DeviceIOServiceMock::relayControl(relay_device_type_t type, bool value) {
logger->info("relayControl type:{}, value:{}", relay_device_type2str(type), 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(){}; DeviceIOServiceMock() : DeviceIOService(){};
virtual ~DeviceIOServiceMock() {} virtual ~DeviceIOServiceMock() {}
virtual void initialize() override;
virtual void initialize(string uartpath, int baudrate) override;
virtual uint16_t getReg(int index) override; virtual uint16_t getReg(int index) override;
virtual void relayControl(relay_device_type_t type, bool value) override; virtual void relayControl(relay_device_type_t type, bool value) override;
virtual RelayDeviceState relayStateGet() override; virtual RelayDeviceState relayStateGet() override;

12
src/service/light_control_service.cpp

@ -38,9 +38,13 @@ void LightControlService::start() {
struct tm *tm = localtime(&now); struct tm *tm = localtime(&now);
if (tm->tm_hour >= config->get_lightAutoCloseHour() || if (tm->tm_hour >= config->get_lightAutoCloseHour() ||
(tm->tm_hour == config->get_lightAutoCloseHour() && tm->tm_min >= config->get_lightAutoCloseMin())) { (tm->tm_hour == config->get_lightAutoCloseHour() && tm->tm_min >= config->get_lightAutoCloseMin())) {
try {
logger->info("LightControlService triggerClose"); logger->info("LightControlService triggerClose");
triggerClose = true;
deviceIoService->relayControl(DeviceIOService::kLightPower, false); deviceIoService->relayControl(DeviceIOService::kLightPower, false);
triggerClose = true;
} catch (const std::exception &e) {
logger->error("LightControlService triggerClose error: {}", e.what());
}
} }
} }
// //
@ -50,9 +54,13 @@ void LightControlService::start() {
struct tm *tm = localtime(&now); struct tm *tm = localtime(&now);
if (tm->tm_hour >= config->get_lightAutoOpenHour() || if (tm->tm_hour >= config->get_lightAutoOpenHour() ||
(tm->tm_hour == config->get_lightAutoOpenHour() && tm->tm_min >= config->get_lightAutoOpenMin())) { (tm->tm_hour == config->get_lightAutoOpenHour() && tm->tm_min >= config->get_lightAutoOpenMin())) {
try {
logger->info("LightControlService triggerOpen"); logger->info("LightControlService triggerOpen");
triggerOpen = true;
deviceIoService->relayControl(DeviceIOService::kLightPower, true); deviceIoService->relayControl(DeviceIOService::kLightPower, true);
triggerOpen = true;
} catch (const std::exception &e) {
logger->error("LightControlService triggerOpen error: {}", e.what());
}
} }
} }

Loading…
Cancel
Save