Browse Source

update

master
zhaohe 2 years ago
parent
commit
68504fbde2
  1. 2
      dep/zlinuxcomponents
  2. 9
      src/configs/project_setting.hpp
  3. 16
      src/main.cpp
  4. 12
      src/service/can_service.cpp
  5. 2
      src/service/can_service.hpp
  6. 15
      src/service/iflytop_hardware_ws_service.cpp
  7. 189
      src/service/main_control_service.cpp
  8. 22
      src/service/main_control_service.hpp

2
dep/zlinuxcomponents

@ -1 +1 @@
Subproject commit 3be3c3ef0f52649cbc6e1b7d5fab7668d6b17edc
Subproject commit c0d81c03b27786308a632063f146ecb34f1f2aee

9
src/configs/project_setting.hpp

@ -0,0 +1,9 @@
#pragma once
#define LINUX_HARDWARE_ID (0x02)
/*******************************************************************************
* LINUX_HARDWARE_REG *
*******************************************************************************/
#define REG_REBOOT_FLAG 0x0000 // 重启标识
#define REG_EXCEPTION_FLAG 0x0100 // 异常标志位

16
src/main.cpp

@ -1,4 +1,8 @@
#include "main.hpp"
#include "service/can_service.hpp"
#include "service/iflytop_hardware_ws_service.hpp"
using namespace iflytop;
using namespace core;
using namespace std;
@ -64,10 +68,16 @@ int Main::main(int argc, char *argv[]) {
if (!device_id.empty()) GET_SERVICE(GConfig)->set_deviceId(device_id);
updateRootfs();
/**
* @brief DeviceIOService初始化
*/
auto config = GET_SERVICE(GConfig);
// 构造iflytophardwarews
BUILD_AND_REG_SERRVICE(IflytopWSService);
GET_SERVICE(IflytopWSService)->initialize();
// 构造CanService
BUILD_AND_REG_SERRVICE(CanService);
GET_SERVICE(CanService)->initialize();
// 构造MainControlService
BUILD_AND_REG_SERRVICE(MainControlService);
GET_SERVICE(MainControlService)->initialize();

12
src/service/can_service.cpp

@ -50,14 +50,14 @@ void CanService::processIflytopRxPacket(shared_ptr<SocketCanFrame> frame) {
onIflytopCanSubDevicePacket(icps_packet);
}
void CanService::sendPacketToIflytopCanSubDevice(shared_ptr<icps::Packet> icps_packet) {
SocketCan::SocketCanError_t CanService::sendPacketToIflytopCanSubDevice(shared_ptr<icps::Packet> icps_packet, int overtime_ms) {
auto frame = m_iflytopCanProtocolStack->createSocketCanFrame(icps_packet);
if (!frame) {
logger->error("createSocketCanFrame fail,{}", icps_packet->toString());
return;
}
SocketCan::SocketCanError_t erro = m_socketCan->sendFrame(frame);
if (erro != SocketCan::SocketCanError_t::kSuccess) {
logger->error("sendFrame fail,{}", SocketCan::SocketCanError_t2Str(erro));
return SocketCan::kErrorFrameFormat;
}
return m_socketCan->sendFrame(frame, overtime_ms);
// if (erro != SocketCan::SocketCanError_t::kSuccess) {
// logger->error("sendFrame fail,{}", SocketCan::SocketCanError_t2Str(erro));
// }
}

2
src/service/can_service.hpp

@ -48,7 +48,7 @@ class CanService : public enable_shared_from_this<CanService> {
void initialize();
void startListen();
void sendPacketToIflytopCanSubDevice(shared_ptr<icps::Packet> packet);
SocketCan::SocketCanError_t sendPacketToIflytopCanSubDevice(shared_ptr<icps::Packet> icps_packet, int overtime_ms);
private:
void processRx(shared_ptr<SocketCanFrame> frame);

15
src/service/iflytop_hardware_ws_service.cpp

@ -29,10 +29,19 @@ void IflytopWSService::initialize() {
m_server->start();
m_server->wait();
}
void IflytopWSService::sendMessage(const string& message) {}
void IflytopWSService::sendMessage(const string& message) {
/**
* @brief 广
*/
auto clients = m_server->getClients();
for (auto& each : clients) {
if (each) {
each->sendText(message);
}
}
}
void IflytopWSService::onMessageCallback(weak_ptr<WebSocket> webSocket, shared_ptr<ConnectionState> connectionState,
const ix::WebSocketMessagePtr& msg) {
void IflytopWSService::onMessageCallback(weak_ptr<WebSocket> webSocket, shared_ptr<ConnectionState> connectionState, const ix::WebSocketMessagePtr& msg) {
if (msg->type == ix::WebSocketMessageType::Open) {
logger->info("New connection");
logger->info("id : {}", connectionState->getId());

189
src/service/main_control_service.cpp

@ -1,5 +1,6 @@
#include "main_control_service.hpp"
#include "configs/project_setting.hpp"
#include "iflytopcpp/core/components/stringutils.hpp"
#include "version.hpp"
using namespace iflytop;
@ -23,11 +24,193 @@ class Trace {
* ============================================================================================================= *
*********************************************************************************************************************/
bool MainControlService::createIflytopHardwareWSPacket(shared_ptr<icps::Packet> packetin, json& jout) {
if (!packetin) return false;
#if 0
{
"channel":"can0",
"protocol":"iflytopCanProtocolStackV1",
"message": {
"attribute": "normal/gbroadcast/subbroadcast",
"priority": 4, //0->7,0最高
"type": "w/r/receipt/report/set_auto_report/heart_packet",
"targetId": 128, // 128->255
"sourceId": 1, // 默认为1
"seq": 0, //0-65535,
"regAdd": 0, //0-65535
"regValue": 100 // -2^31->2^31-1
}
}
#endif
if (packetin->getSourceId() == LINUX_HARDWARE_ID) {
jout["channel"] = "local";
} else {
jout["channel"] = "can0";
}
jout["protocol"] = "iflytopCanProtocolStackV1";
jout["message"]["attribute"] = packetin->getAttributeStr();
jout["message"]["priority"] = packetin->getPriority();
jout["message"]["type"] = packetin->getTypeStr();
jout["message"]["targetId"] = packetin->getTargetId();
jout["message"]["sourceId"] = packetin->getSourceId();
jout["message"]["seq"] = packetin->getSeq();
jout["message"]["regAdd"] = packetin->getRegAdd();
jout["message"]["regValue"] = packetin->getRegValue();
return true;
}
bool MainControlService::createICPSPacket(json jin, shared_ptr<icps::Packet>& packetin) { //
shared_ptr<icps::Packet> packetout(new icps::Packet());
if (jin["protocol"] != "iflytopCanProtocolStackV1") {
logger->error("create ICPSPacket failed, protocol not match,protocol:{}", jin["protocol"].get<string>());
return false;
}
packetin->setAttributeByStr(jin["message"]["attribute"]);
packetin->setPriority(jin["message"]["priority"]);
packetin->setTypeByStr(jin["message"]["type"]);
packetin->setTargetId(jin["message"]["targetId"]);
packetin->setSourceId(jin["message"]["sourceId"]);
packetin->setSeq(jin["message"]["seq"]);
packetin->setRegAdd(jin["message"]["regAdd"]);
packetin->setRegValue(jin["message"]["regValue"]);
return true;
}
void MainControlService::initialize() {
GET_TO_SERVICE(m_zconfig);
// GET_TO_SERVICE(m_commonVoiceProcesser);
GET_TO_SERVICE(m_iflytopWSService);
GET_TO_SERVICE(m_canService);
localVirtualCanSlaveInitialize();
websocketServerInitialize();
/*******************************************************************************
* CAN设备衔接 *
*******************************************************************************/
m_canService->onIflytopCanSubDevicePacket.connect([this](shared_ptr<icps::Packet> packet) { //
processCanMessageFromCanService(packet);
});
};
void MainControlService::processReceiveMessage(fromwhere_t fromwhere, const json& in, json& receipt) {
logger->info("process receive message from {},{}", fromwhere2str(fromwhere), in.dump());
void MainControlService::websocketServerInitialize() {
/**
* @brief
*
*/
m_iflytopWSService->onMessage.connect([this](weak_ptr<WebSocket> webSocket, const ix::WebSocketMessagePtr& msg) {
if (msg->binary) {
logger->warn("receive binary message,ignore");
return;
}
string msgtext = msg->str;
try {
json message = json::parse(msgtext);
processIflytopWSMsg(message);
} catch (const std::exception& e) {
}
});
}
void MainControlService::localVirtualCanSlaveInitialize() {
m_localVirtualCanSlave.reset(new IflytopVirtualCanSlave());
m_localVirtualCanSlave->initialize(LINUX_HARDWARE_ID);
m_localVirtualCanSlave->activeReg(REG_REBOOT_FLAG, icps::kw | icps::kr, 0);
m_localVirtualCanSlave->activeReg(REG_EXCEPTION_FLAG, icps::kw | icps::kr, 0);
m_localVirtualCanSlave->setOnHostRegisterReadEvent( //
[this](icps::Reg_t& reg, int32_t& value) { //
return icps::kSuccess;
});
m_localVirtualCanSlave->setOnHostRegisterWriteEvent( //
[this](icps::Reg_t& reg, int32_t oldvalue, int32_t& newvalue) { //
return icps::kSuccess;
});
m_localVirtualCanSlave->setOnRegisterValueAutoReportEvent( //
[this](icps::Reg_t& reg, int32_t& value) { //
return;
});
m_localVirtualCanSlave->IflytopVirtualCanIF_setUpstream( //
[this](shared_ptr<icps::Packet> packet) { //
/**
* @brief
* can上报消息给Websocket
*/
processCanMessageFromLocalCanService(packet);
return;
});
}
/*******************************************************************************
* *
*******************************************************************************/
/**
* @brief CanService接收到的上行消息
*
* @param packet
*/
void MainControlService::processCanMessageFromCanService(shared_ptr<icps::Packet> packet) {
/**
* @brief can收到的消息
*/
json uppacket;
bool suc = createIflytopHardwareWSPacket(packet, uppacket);
if (!suc) {
logger->error("{}|createIflytopHardwareWSPacket failed,packet:{}", __LINE__, packet->toString());
return;
}
m_iflytopWSService->sendMessage(uppacket.dump());
}
/**
* @brief can的上行消息
*
* @param packet
*/
void MainControlService::processCanMessageFromLocalCanService(shared_ptr<icps::Packet> packet) {
json uppacket;
bool suc = createIflytopHardwareWSPacket(packet, uppacket);
if (!suc) {
logger->error("{}|createIflytopHardwareWSPacket failed,packet:{}", __LINE__, packet->toString());
return;
}
m_iflytopWSService->sendMessage(uppacket.dump());
}
/*******************************************************************************
* *
*******************************************************************************/
void MainControlService::processIflytopWSMsg(const json& in) {
/**
* @brief
* CANLocal
*
* 1. json转换成packet
* 2. CANLocal
*/
shared_ptr<icps::Packet> packet;
createICPSPacket(in, packet);
if (packet == nullptr) {
logger->error("create ICPSPacket failed");
return;
}
if (packet->getTargetId() == LINUX_HARDWARE_ID) {
/**
* @brief
* can设备
*/
m_localVirtualCanSlave->IflytopVirtualCanIF_feedPacket(packet);
} else {
/**
* @brief
* can设备
*/
SocketCan::SocketCanError_t error = m_canService->sendPacketToIflytopCanSubDevice(packet, 10);
if (error != SocketCan::SocketCanError_t::kSuccess) {
logger->error("sendPacketToIflytopCanSubDevice failed, error:{},({})", //
SocketCan::SocketCanError_t2Str(error), error);
IflytopCanProtocolStack().createErrorPacket(packet, icps::kOvertime);
}
}
}

22
src/service/main_control_service.hpp

@ -18,13 +18,15 @@
//
#include "configs/gconfig.hpp"
#include "zservice_container/zservice_container.hpp"
#include "zwebservice/zwebservice.hpp"
//
#include "configs/gconfig.hpp"
#include "iflytopcpp/core/components/jobs/work_queue.hpp"
#include "iflytopcpp/core/components/timer/simple_timer.hpp"
#include "service/can_service.hpp"
#include "service/iflytop_hardware_ws_service.hpp"
#include "zlinuxcomponents/alsaplayer/smart_soundbox_player.hpp"
#include "zlinuxcomponents/iflytop_can_protocol_stack/iflytop_virtual_can_slave.hpp"
/**
* @brief
@ -44,7 +46,11 @@ using namespace core;
class MainControlService : public enable_shared_from_this<MainControlService> {
ENABLE_LOGGER(MainControlService);
shared_ptr<GConfig> m_zconfig;
shared_ptr<GConfig> m_zconfig;
shared_ptr<IflytopWSService> m_iflytopWSService;
shared_ptr<CanService> m_canService;
shared_ptr<IflytopVirtualCanSlave> m_localVirtualCanSlave;
typedef enum {
kzwebService,
@ -57,7 +63,13 @@ class MainControlService : public enable_shared_from_this<MainControlService> {
}
private:
void processReceiveMessage(fromwhere_t fromwhere, const json& in, json& receipt);
void localVirtualCanSlaveInitialize();
void websocketServerInitialize();
void processIflytopWSMsg(const json& in);
void processCanMessageFromCanService(shared_ptr<icps::Packet> packet);
void processCanMessageFromLocalCanService(shared_ptr<icps::Packet> packet);
public:
MainControlService(){};
@ -73,5 +85,9 @@ class MainControlService : public enable_shared_from_this<MainControlService> {
* @brief ASR结果后
*/
void triggerProcessConversationSession();
private:
bool createIflytopHardwareWSPacket(shared_ptr<icps::Packet> packetin, json& jout);
bool createICPSPacket(json jin, shared_ptr<icps::Packet>& packetin);
};
} // namespace iflytop
Loading…
Cancel
Save