ideasx_interface.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "interface/ideasx_interface.h"
  2. static const char* TAG = "IdeasX";
  3. MQTT_Client mqttClient;
  4. static IdeasX_Config_t ideasX_config;
  5. static IdeasX_Health_t ideasX_health;
  6. static os_timer_t health_timer;
  7. static void ICACHE_FLASH_ATTR ideasX_publish_health(void)
  8. {
  9. uint8_t topic[40], payload[40];
  10. ideasX_health.vcell.value = Encoder_GetVoltage();
  11. ideasX_health.soc.value = Encoder_GetSOC();
  12. ideasX_health.rssi.value = wifi_station_get_rssi();
  13. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.vcell.topic);
  14. os_sprintf(payload, "%d", ideasX_health.vcell.value);
  15. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  16. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.soc.topic);
  17. os_sprintf(payload, "%d", ideasX_health.soc.value);
  18. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  19. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.rssi.topic);
  20. os_sprintf(payload, "%d", ideasX_health.rssi.value);
  21. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  22. }
  23. static void ICACHE_FLASH_ATTR ideasX_connected_cb(uint32_t *args)
  24. {
  25. struct station_config stationConfig;
  26. wifi_station_get_config(&stationConfig);
  27. uint8_t topic[40], payload[40];
  28. ESP_LOGI(TAG, "Connected to IdeasX");
  29. if (ideasX_config.success_cb != NULL)
  30. ideasX_config.success_cb();
  31. // publish static health information
  32. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.hw_ver.topic);
  33. os_sprintf(payload, "%d,%d", ideasX_health.hw_ver.major, ideasX_health.hw_ver.minor);
  34. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  35. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.fw_ver.topic);
  36. os_sprintf(payload, "%d,%d", ideasX_health.fw_ver.major, ideasX_health.fw_ver.minor);
  37. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  38. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.alive.topic);
  39. os_sprintf(payload, "%d", ideasX_health.alive.flag);
  40. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  41. os_sprintf(ideasX_health.ssid.value, "%s", stationConfig.ssid);
  42. os_sprintf(ideasX_health.bssid.value, MACSTR, MAC2STR(stationConfig.bssid));
  43. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.ssid.topic);
  44. os_sprintf(payload, "%s", ideasX_health.ssid.value);
  45. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  46. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.bssid.topic);
  47. os_sprintf(payload, "%s", ideasX_health.bssid.value);
  48. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  49. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.ota.topic);
  50. os_sprintf(payload, "%d", ideasX_health.ota.flag);
  51. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  52. ideasX_publish_health();
  53. // setup publish health timer
  54. os_timer_disarm(&ideasX_health.health_timer);
  55. os_timer_arm(&ideasX_health.health_timer, ideasX_health.health_report_rate*1000, true); // change to system task
  56. }
  57. static void ICACHE_FLASH_ATTR ideasX_disconnected_cb(uint32_t *args)
  58. {
  59. ESP_LOGI(TAG, "Disconnected from IdeasX");
  60. os_timer_disarm(&ideasX_health.health_timer);
  61. if (ideasX_config.fail_cb != NULL)
  62. ideasX_config.fail_cb();
  63. }
  64. static void ICACHE_FLASH_ATTR ideasX_published_cb(uint32_t *args)
  65. {
  66. // subscribe to command topics
  67. ESP_LOGD(TAG, "Published Messaged");
  68. }
  69. void ICACHE_FLASH_ATTR IdeasX_Connect(void)
  70. {
  71. MQTT_Connect(&mqttClient);
  72. }
  73. void ICACHE_FLASH_ATTR IdeasX_Disconnect(void)
  74. {
  75. MQTT_Disconnect(&mqttClient);
  76. }
  77. void ICACHE_FLASH_ATTR ideasX_system_config_init()
  78. {
  79. uint8_t mac_address[6];
  80. wifi_get_macaddr(STATION_MODE, mac_address);
  81. os_sprintf(ideasX_config.device_id, MACSTR, MAC2STR(mac_address));
  82. os_sprintf(ideasX_config.mqtt_client_id, MACSTR, MAC2STR(mac_address));
  83. os_sprintf(ideasX_config.command_topic, "encoder/%s/command/", ideasX_config.device_id);
  84. os_sprintf(ideasX_config.health_topic, "encoder/%s/health/", ideasX_config.device_id);
  85. os_sprintf(ideasX_config.mqtt_host, "%s", MQTT_HOST_DEFAULT);
  86. ideasX_config.mqtt_port = MQTT_PORT_DEFAULT;
  87. os_sprintf(ideasX_config.mqtt_user, "%s", "");
  88. os_sprintf(ideasX_config.mqtt_pass, "%s", "");
  89. #ifdef MQTT_USER_DEFAULT
  90. os_sprintf(ideasX_config.mqtt_user, "%s", MQTT_USER_DEFAULT);
  91. os_sprintf(ideasX_config.mqtt_pass, "%s", MQTT_PASS_DEFAULT);
  92. #endif
  93. ideasX_config.mqtt_keepalive = MQTT_KEEPALIVE_DEFAULT;
  94. ideasX_config.success_cb = NULL;
  95. ideasX_config.fail_cb = NULL;
  96. }
  97. void ICACHE_FLASH_ATTR ideasX_health_config_init()
  98. {
  99. // setup ideasX topics
  100. os_sprintf(ideasX_health.hw_ver.topic, "%s", HW_VERSION_HEALTH_TOPIC);
  101. os_sprintf(ideasX_health.fw_ver.topic, "%s", FW_VERSION_HEALTH_TOPIC);
  102. os_sprintf(ideasX_health.alive.topic, "%s", ALIVE_HEALTH_TOPIC);
  103. os_sprintf(ideasX_health.vcell.topic, "%s", VCELL_HEALTH_TOPIC);
  104. os_sprintf(ideasX_health.soc.topic, "%s", SOC_HEALTH_TOPIC);
  105. os_sprintf(ideasX_health.rom.topic, "%s", ROM_HEALTH_TOPIC);
  106. os_sprintf(ideasX_health.ota.topic, "%s", OTA_HEALTH_TOPIC);
  107. os_sprintf(ideasX_health.ssid.topic, "%s", SSID_HEALTH_TOPIC);
  108. os_sprintf(ideasX_health.bssid.topic, "%s", BSSID_HEALTH_TOPIC);
  109. os_sprintf(ideasX_health.rssi.topic, "%s", RSSI_HEALTH_TOPIC);
  110. ideasX_health.health_report_rate = HEALTH_REPORT_RATE_DEFAULT;
  111. // load default values for static items
  112. ideasX_health.hw_ver.minor = HW_VERSION_MINOR_DEFAULT;
  113. ideasX_health.hw_ver.major = HW_VERSION_MAJOR_DEFAULT;
  114. ideasX_health.fw_ver.minor = FW_VERSION_MINOR_DEFAULT;
  115. ideasX_health.fw_ver.major = FW_VERSION_MAJOR_DEFAULT;
  116. ideasX_health.alive.flag = true;
  117. ideasX_health.ota.flag = false;
  118. ideasX_health.health_timer = health_timer;
  119. os_timer_disarm(&ideasX_health.health_timer);
  120. os_timer_setfn(&ideasX_health.health_timer, (os_timer_func_t *)ideasX_publish_health, NULL);
  121. }
  122. void ICACHE_FLASH_ATTR IdeasX_UpdateBatteryStatus(uint16_t vcell, uint16_t soc)
  123. {
  124. ideasX_health.soc.value = soc;
  125. ideasX_health.vcell.value = vcell;
  126. }
  127. void ICACHE_FLASH_ATTR IdeasX_SetStatusCallbacks(ideasX_function_t success, ideasX_function_t fail)
  128. {
  129. ideasX_config.success_cb = success;
  130. ideasX_config.fail_cb = fail;
  131. }
  132. void ICACHE_FLASH_ATTR IdeasX_Init(void)
  133. {
  134. ideasX_system_config_init();
  135. ideasX_health_config_init();
  136. MQTT_InitConnection(&mqttClient, ideasX_config.mqtt_host, ideasX_config.mqtt_port, DEFAULT_SECURITY);
  137. MQTT_InitClient(&mqttClient, ideasX_config.mqtt_client_id, ideasX_config.mqtt_user, ideasX_config.mqtt_pass,
  138. ideasX_config.mqtt_keepalive, MQTT_CLEAN_SESSION);
  139. MQTT_InitLWT(&mqttClient, ideasX_health.alive.topic, "0", 0, 0);
  140. MQTT_OnConnected(&mqttClient, ideasX_connected_cb);
  141. MQTT_OnDisconnected(&mqttClient, ideasX_disconnected_cb);
  142. //MQTT_OnPublished(&mqttClient, mqttPublishedCb);
  143. //MQTT_OnData(&mqttClient, mqttDataCb);
  144. }