#include "channel_factory.hpp" #include using namespace iflytop; using namespace std; static IDataChannel::OnData_t s_ondata; static map s_channelMap; static list s_channelList; // [server] // cmdport=19004 // wsport=19005 // [[channels]] // type="zexcan" // name="zcan" // ifname="can0" // baudrate=500000 // enable=true // [[channels]] // type="uart" // name="printer" // ifname="/dev/ttyS1" // baudrate=115200 // enable=true // [[channels]] // type="inputkey" // name="emergency-key" // pinnum="GPIO2-A3" // enable=true // [[channels]] // type="uart" // name="lis" // ifname="/dev/ttyS2" // baudrate=115200 // enable=true map ChannelFactory::createChannels(toml::table &config) { auto logger = GET_LOGGER(ChannelFactory); try { if (auto channels = config["channels"].as_array()) { for (size_t i = 0; i < channels->size(); i++) { string type = config["channels"][i]["type"].value_or(""); /** * @brief * Build zexcan channel */ if (type == "zexcan") { string name = config["channels"][i]["name"].value_or("zcan"); string ifname = config["channels"][i]["ifname"].value_or("can0"); int baudrate = config["channels"][i]["baudrate"].value_or(500000); bool enable = config["channels"][i]["enable"].value_or(true); if (enable) { logger->info("==================create channel {}=================", name); logger->info("create channel: {}, type={}, ifname={}, baudrate={}", name, type, ifname, baudrate); ZExCanChannel *canChannel = new ZExCanChannel(type, ifname, baudrate); canChannel->initialize(); canChannel->registerOnDataCallback([](IDataChannel *ch, const string &data) { if (s_ondata) s_ondata(ch, data); }); s_channelMap[canChannel->getChannelName()] = canChannel; s_channelList.push_back(canChannel); logger->info(""); } else { logger->warn("skip channel: {}, enable=false", name); } } // else if (type == "uart") { string name = config["channels"][i]["name"].value_or("uart"); string ifname = config["channels"][i]["ifname"].value_or("/dev/ttyS1"); int baudrate = config["channels"][i]["baudrate"].value_or(115200); bool enable = config["channels"][i]["enable"].value_or(true); if (enable) { logger->info("create channel: {}, type={}, ifname={}, baudrate={}", name, type, ifname, baudrate); } else { logger->warn("skip channel: {}, enable=false", name); } } } } } catch (const toml::parse_error &err) { logger->error("parse config error, {}", err); } return s_channelMap; } void ChannelFactory::regOnChannelData(IDataChannel::OnData_t ondata) { s_ondata = ondata; } list ChannelFactory::getChannels() { return s_channelList; }