You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.0 KiB

  1. #include "channel_factory.hpp"
  2. #include <toml++/toml.hpp>
  3. using namespace iflytop;
  4. using namespace std;
  5. static IDataChannel::OnData_t s_ondata;
  6. static map<string, IDataChannel *> s_channelMap;
  7. static list<IDataChannel *> s_channelList;
  8. // [server]
  9. // cmdport=19004
  10. // wsport=19005
  11. // [[channels]]
  12. // type="zexcan"
  13. // name="zcan"
  14. // ifname="can0"
  15. // baudrate=500000
  16. // enable=true
  17. // [[channels]]
  18. // type="uart"
  19. // name="printer"
  20. // ifname="/dev/ttyS1"
  21. // baudrate=115200
  22. // enable=true
  23. // [[channels]]
  24. // type="inputkey"
  25. // name="emergency-key"
  26. // pinnum="GPIO2-A3"
  27. // enable=true
  28. // [[channels]]
  29. // type="uart"
  30. // name="lis"
  31. // ifname="/dev/ttyS2"
  32. // baudrate=115200
  33. // enable=true
  34. map<string, IDataChannel *> ChannelFactory::createChannels(toml::table &config) {
  35. auto logger = GET_LOGGER(ChannelFactory);
  36. try {
  37. if (auto channels = config["channels"].as_array()) {
  38. for (size_t i = 0; i < channels->size(); i++) {
  39. string type = config["channels"][i]["type"].value_or("");
  40. /**
  41. * @brief
  42. * Build zexcan channel
  43. */
  44. if (type == "zexcan") {
  45. string name = config["channels"][i]["name"].value_or("zcan");
  46. string ifname = config["channels"][i]["ifname"].value_or("can0");
  47. int baudrate = config["channels"][i]["baudrate"].value_or(500000);
  48. bool enable = config["channels"][i]["enable"].value_or(true);
  49. if (enable) {
  50. logger->info("==================create channel {}=================", name);
  51. logger->info("create channel: {}, type={}, ifname={}, baudrate={}", name, type, ifname, baudrate);
  52. ZExCanChannel *canChannel = new ZExCanChannel(type, ifname, baudrate);
  53. canChannel->initialize();
  54. canChannel->registerOnDataCallback([](IDataChannel *ch, const string &data) {
  55. if (s_ondata) s_ondata(ch, data);
  56. });
  57. s_channelMap[canChannel->getChannelName()] = canChannel;
  58. s_channelList.push_back(canChannel);
  59. logger->info("");
  60. } else {
  61. logger->warn("skip channel: {}, enable=false", name);
  62. }
  63. }
  64. //
  65. else if (type == "uart") {
  66. string name = config["channels"][i]["name"].value_or("uart");
  67. string ifname = config["channels"][i]["ifname"].value_or("/dev/ttyS1");
  68. int baudrate = config["channels"][i]["baudrate"].value_or(115200);
  69. bool enable = config["channels"][i]["enable"].value_or(true);
  70. if (enable) {
  71. logger->info("create channel: {}, type={}, ifname={}, baudrate={}", name, type, ifname, baudrate);
  72. } else {
  73. logger->warn("skip channel: {}, enable=false", name);
  74. }
  75. }
  76. }
  77. }
  78. } catch (const toml::parse_error &err) {
  79. logger->error("parse config error, {}", err);
  80. }
  81. return s_channelMap;
  82. }
  83. void ChannelFactory::regOnChannelData(IDataChannel::OnData_t ondata) { s_ondata = ondata; }
  84. list<IDataChannel *> ChannelFactory::getChannels() { return s_channelList; }