ideasx_interface.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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 IdeasX_Command_t command_array[NUMBER_OF_COMMANDS];
  8. void ICACHE_FLASH_ATTR IdeasX_Publish_Buttons(uint32_t button_states)
  9. {
  10. ESP_LOGD(TAG, "publishing button states");
  11. uint8_t topic[40];
  12. uint8_t payload[4];
  13. // convert uint32_t to array of uint8_t for MQTT_Publish
  14. uint8_t * buttonp = (uint8_t *)&button_states;
  15. payload[0] = buttonp[0];
  16. payload[1] = buttonp[1];
  17. payload[2] = buttonp[2];
  18. payload[3] = buttonp[3];
  19. os_sprintf(topic, "%s%s", ideasX_config.data_topic, "button");
  20. MQTT_Publish(&mqttClient, topic, payload, sizeof(payload) , DATA_QOS, DATA_RETAIN);
  21. }
  22. static void ICACHE_FLASH_ATTR IdeasX_SetHealthInfo(uint16_t vcell, uint16_t soc, uint16_t rssi)
  23. {
  24. ideasX_health.vcell.value = vcell;
  25. ideasX_health.soc.value = soc;
  26. ideasX_health.rssi.value = rssi;
  27. }
  28. static void ICACHE_FLASH_ATTR ideasX_publish_health(void)
  29. {
  30. uint8_t topic[40], payload[40];
  31. Encoder_EnableIMUI2CInterface(true);
  32. ideasX_health.vcell.value = Encoder_GetVoltage();
  33. ideasX_health.soc.value = Encoder_GetSOC();
  34. ideasX_health.rssi.value = wifi_station_get_rssi();
  35. ESP_LOGI(TAG, "vcell: %d", Encoder_GetVoltage());
  36. ESP_LOGI(TAG, "soc: %d", Encoder_GetSOC());
  37. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.vcell.topic);
  38. os_sprintf(payload, "%d", ideasX_health.vcell.value);
  39. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  40. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.soc.topic);
  41. os_sprintf(payload, "%d", ideasX_health.soc.value);
  42. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  43. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.rssi.topic);
  44. os_sprintf(payload, "%d", ideasX_health.rssi.value);
  45. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  46. }
  47. static void ICACHE_FLASH_ATTR ideasX_connected_cb(uint32_t *args)
  48. {
  49. struct station_config stationConfig;
  50. wifi_station_get_config(&stationConfig);
  51. uint8_t topic[40], payload[40];
  52. ESP_LOGI(TAG, "Connected to IdeasX");
  53. if (ideasX_config.success_cb != NULL)
  54. ideasX_config.success_cb();
  55. // subscribe to command topic
  56. MQTT_Subscribe(&mqttClient, ideasX_config.command_topic, COMMAND_QOS);
  57. // publish static health information
  58. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.hw_ver.topic);
  59. os_sprintf(payload, "%d,%d", ideasX_health.hw_ver.major, ideasX_health.hw_ver.minor);
  60. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  61. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.fw_ver.topic);
  62. os_sprintf(payload, "%d,%d", ideasX_health.fw_ver.major, ideasX_health.fw_ver.minor);
  63. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  64. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.alive.topic);
  65. os_sprintf(payload, "%d", ideasX_health.alive.flag);
  66. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  67. os_sprintf(ideasX_health.ssid.value, "%s", stationConfig.ssid);
  68. os_sprintf(ideasX_health.bssid.value, MACSTR, MAC2STR(stationConfig.bssid));
  69. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.ssid.topic);
  70. os_sprintf(payload, "%s", ideasX_health.ssid.value);
  71. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  72. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.bssid.topic);
  73. os_sprintf(payload, "%s", ideasX_health.bssid.value);
  74. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  75. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.ota.topic);
  76. os_sprintf(payload, "%d", ideasX_health.ota.flag);
  77. MQTT_Publish(&mqttClient, topic, payload, os_strlen(payload), HEALTH_QOS, HEALTH_RETAIN);
  78. ideasX_publish_health();
  79. // setup publish health timer
  80. os_timer_disarm(&ideasX_health.health_timer);
  81. os_timer_arm(&ideasX_health.health_timer, ideasX_health.health_report_rate*1000, true); // change to system task
  82. }
  83. static void ICACHE_FLASH_ATTR ideasX_disconnected_cb(uint32_t *args)
  84. {
  85. ESP_LOGI(TAG, "Disconnected from IdeasX");
  86. os_timer_disarm(&ideasX_health.health_timer);
  87. if (ideasX_config.fail_cb != NULL)
  88. ideasX_config.fail_cb();
  89. }
  90. static void ICACHE_FLASH_ATTR ideasX_published_cb(uint32_t *args)
  91. {
  92. // subscribe to command topics
  93. ESP_LOGD(TAG, "Published Messaged");
  94. }
  95. void ICACHE_FLASH_ATTR IdeasX_Connect(void)
  96. {
  97. MQTT_Connect(&mqttClient);
  98. }
  99. void ICACHE_FLASH_ATTR IdeasX_Disconnect(void)
  100. {
  101. if (ideasX_config.fail_cb != NULL)
  102. ideasX_config.fail_cb();
  103. MQTT_Disconnect(&mqttClient);
  104. }
  105. void ICACHE_FLASH_ATTR ideasX_system_config_init(void)
  106. {
  107. uint8_t mac_address[6];
  108. wifi_get_macaddr(STATION_MODE, mac_address);
  109. os_sprintf(ideasX_config.device_id, MACSTR, MAC2STR(mac_address));
  110. os_sprintf(ideasX_config.mqtt_client_id, MACSTR, MAC2STR(mac_address));
  111. os_sprintf(ideasX_config.command_topic, "encoder/%s/command/#", ideasX_config.device_id);
  112. os_sprintf(ideasX_config.health_topic, "encoder/%s/health/", ideasX_config.device_id);
  113. os_sprintf(ideasX_config.data_topic, "encoder/%s/data/", ideasX_config.device_id);
  114. os_sprintf(ideasX_config.mqtt_host, "%s", MQTT_HOST_DEFAULT);
  115. ideasX_config.mqtt_port = MQTT_PORT_DEFAULT;
  116. os_sprintf(ideasX_config.mqtt_user, "%s", "");
  117. os_sprintf(ideasX_config.mqtt_pass, "%s", "");
  118. #ifdef MQTT_USER_DEFAULT
  119. os_sprintf(ideasX_config.mqtt_user, "%s", MQTT_USER_DEFAULT);
  120. os_sprintf(ideasX_config.mqtt_pass, "%s", MQTT_PASS_DEFAULT);
  121. #endif
  122. ideasX_config.mqtt_keepalive = MQTT_KEEPALIVE_DEFAULT;
  123. ideasX_config.success_cb = NULL;
  124. ideasX_config.fail_cb = NULL;
  125. }
  126. void ICACHE_FLASH_ATTR ideasX_command_array_init(void)
  127. {
  128. os_sprintf(command_array[SHUTDOWN_COMMAND_INDEX].topic, "%s", SHUTDOWN_COMMAND_TOPIC);
  129. os_sprintf(command_array[RESTART_COMMAND_INDEX].topic, "%s", RESTART_COMMAND_TOPIC);
  130. command_array[SHUTDOWN_COMMAND_INDEX].function = Encoder_Shutdown;
  131. command_array[RESTART_COMMAND_INDEX].function = Encoder_Restart;
  132. }
  133. static void ICACHE_FLASH_ATTR ideasX_data_cb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
  134. {
  135. uint8_t *topicBuf = (uint8_t*)os_zalloc(topic_len + 1),
  136. *dataBuf = (uint8_t*)os_zalloc(data_len + 1);
  137. MQTT_Client* client = (MQTT_Client*)args;
  138. os_memcpy(topicBuf, topic, topic_len);
  139. topicBuf[topic_len] = 0;
  140. os_memcpy(dataBuf, data, data_len);
  141. dataBuf[data_len] = 0;
  142. ESP_LOGI(TAG, "Receive topic: %s, data: %s \r\n", topicBuf, dataBuf);
  143. uint8_t len = os_strlen(ideasX_config.command_topic) - 1;
  144. uint8_t* command_topic = topicBuf + len;
  145. ESP_LOGD(TAG, "command topic: %s", command_topic);
  146. uint8_t i;
  147. for (i=0; i<NUMBER_OF_COMMANDS; i++)
  148. {
  149. if (!strcmp(command_array[i].topic, command_topic))
  150. {
  151. ESP_LOGD(TAG, "Found the command: %s", command_array[i].topic);
  152. command_array[i].function();
  153. }
  154. }
  155. os_free(topicBuf);
  156. os_free(dataBuf);
  157. }
  158. void ICACHE_FLASH_ATTR ideasX_health_config_init()
  159. {
  160. // setup ideasX topics
  161. os_sprintf(ideasX_health.hw_ver.topic, "%s", HW_VERSION_HEALTH_TOPIC);
  162. os_sprintf(ideasX_health.fw_ver.topic, "%s", FW_VERSION_HEALTH_TOPIC);
  163. os_sprintf(ideasX_health.alive.topic, "%s", ALIVE_HEALTH_TOPIC);
  164. os_sprintf(ideasX_health.vcell.topic, "%s", VCELL_HEALTH_TOPIC);
  165. os_sprintf(ideasX_health.soc.topic, "%s", SOC_HEALTH_TOPIC);
  166. os_sprintf(ideasX_health.rom.topic, "%s", ROM_HEALTH_TOPIC);
  167. os_sprintf(ideasX_health.ota.topic, "%s", OTA_HEALTH_TOPIC);
  168. os_sprintf(ideasX_health.ssid.topic, "%s", SSID_HEALTH_TOPIC);
  169. os_sprintf(ideasX_health.bssid.topic, "%s", BSSID_HEALTH_TOPIC);
  170. os_sprintf(ideasX_health.rssi.topic, "%s", RSSI_HEALTH_TOPIC);
  171. ideasX_health.health_report_rate = HEALTH_REPORT_RATE_DEFAULT;
  172. // load default values for static items
  173. ideasX_health.hw_ver.minor = HW_VERSION_MINOR_DEFAULT;
  174. ideasX_health.hw_ver.major = HW_VERSION_MAJOR_DEFAULT;
  175. ideasX_health.fw_ver.minor = FW_VERSION_MINOR_DEFAULT;
  176. ideasX_health.fw_ver.major = FW_VERSION_MAJOR_DEFAULT;
  177. ideasX_health.alive.flag = true;
  178. ideasX_health.ota.flag = false;
  179. ideasX_health.health_timer = health_timer;
  180. os_timer_disarm(&ideasX_health.health_timer);
  181. os_timer_setfn(&ideasX_health.health_timer, (os_timer_func_t *)ideasX_publish_health, NULL);
  182. }
  183. void ICACHE_FLASH_ATTR IdeasX_UpdateBatteryStatus(uint16_t vcell, uint16_t soc)
  184. {
  185. ideasX_health.soc.value = soc;
  186. ideasX_health.vcell.value = vcell;
  187. }
  188. void ICACHE_FLASH_ATTR IdeasX_SetStatusCallbacks(ideasX_function_t success, ideasX_function_t fail)
  189. {
  190. ideasX_config.success_cb = success;
  191. ideasX_config.fail_cb = fail;
  192. }
  193. void ICACHE_FLASH_ATTR IdeasX_Init(void)
  194. {
  195. uint8_t topic[40];
  196. ideasX_system_config_init();
  197. ideasX_health_config_init();
  198. ideasX_command_array_init();
  199. MQTT_InitConnection(&mqttClient, ideasX_config.mqtt_host, ideasX_config.mqtt_port, DEFAULT_SECURITY);
  200. MQTT_InitClient(&mqttClient, ideasX_config.mqtt_client_id, ideasX_config.mqtt_user, ideasX_config.mqtt_pass,
  201. ideasX_config.mqtt_keepalive, MQTT_CLEAN_SESSION);
  202. os_sprintf(topic, "%s%s", ideasX_config.health_topic, ideasX_health.alive.topic);
  203. MQTT_InitLWT(&mqttClient, topic, "0", HEALTH_QOS, HEALTH_RETAIN);
  204. MQTT_OnConnected(&mqttClient, ideasX_connected_cb);
  205. MQTT_OnDisconnected(&mqttClient, ideasX_disconnected_cb);
  206. //MQTT_OnPublished(&mqttClient, mqttPublishedCb);
  207. MQTT_OnData(&mqttClient, ideasX_data_cb);
  208. }