diff --git a/fdrs_functions.h b/fdrs_functions.h index 7663539..1ff45a4 100644 --- a/fdrs_functions.h +++ b/fdrs_functions.h @@ -78,6 +78,11 @@ uint8_t LoRa2[] = {mac_prefix[3], mac_prefix[4], LORA2_PEER}; //uint8_t LoRaAddress[] = {0x42, 0x00}; #endif +#ifdef USE_SD_LOG +unsigned long last_millis = 0; +unsigned long seconds_since_reset = 0; +#endif + DataReading theData[256]; uint8_t ln; uint8_t newData = 0; @@ -113,6 +118,8 @@ CRGB leds[NUM_LEDS]; #endif #ifdef USE_WIFI PubSubClient client(espClient); +WiFiUDP ntpUDP; +NTPClient timeClient(ntpUDP); const char* ssid = FDRS_WIFI_SSID; const char* password = FDRS_WIFI_PASS; const char* mqtt_server = FDRS_MQTT_ADDR; @@ -126,6 +133,8 @@ const char* mqtt_user = NULL; const char* mqtt_pass = NULL; #endif + + // Set ESP-NOW send and receive callbacks for either ESP8266 or ESP32 #if defined(ESP8266) void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) { @@ -166,6 +175,56 @@ void getSerial() { } } +void sendSD(const char filename[32]) { + #ifdef USE_SD_LOG + DBG("Logging to SD card."); + File logfile = SD.open(filename, FILE_WRITE); + for (int i = 0; i < ln; i++) { + #ifdef USE_WIFI + logfile.print(timeClient.getEpochTime()); + #else + logfile.print(seconds_since_reset); + #endif + logfile.print(","); + logfile.print(theData[i].id); + logfile.print(","); + logfile.print(theData[i].t); + logfile.print(","); + logfile.println(theData[i].d); + } + logfile.close(); + #endif +} +void reconnect(int attempts, bool silent) { +#ifdef USE_WIFI + + if(!silent) DBG("Connecting MQTT..."); + + for (int i = 1; i<=attempts; i++) { + // Attempt to connect + if (client.connect("FDRS_GATEWAY", mqtt_user, mqtt_pass)) { + // Subscribe + client.subscribe(TOPIC_COMMAND); + if(!silent) DBG(" MQTT Connected"); + return; + } else { + if(!silent) { + char msg[15]; + sprintf(msg, " Attempt %d/%d",i,attempts); + DBG(msg); + } + if(attempts=!1){ + delay(3000); + } + } + } + + if(!silent) DBG(" Connecting MQTT failed."); +#endif +} +void reconnect(int attempts){ + reconnect(attempts, false); +} void mqtt_callback(char* topic, byte * message, unsigned int length) { String incomingString; DBG(topic); @@ -192,6 +251,14 @@ void mqtt_callback(char* topic, byte * message, unsigned int length) { } } +void mqtt_publish(const char* payload){ + #ifdef USE_WIFI + if(!client.publish(TOPIC_DATA, payload)){ + DBG(" Error on sending MQTT"); + sendSD(SD_FILENAME); + } + #endif +} void getLoRa() { #ifdef USE_LORA @@ -275,7 +342,7 @@ void sendMQTT() { } String outgoingString; serializeJson(doc, outgoingString); - client.publish(TOPIC_DATA, (char*) outgoingString.c_str()); + mqtt_publish((char*) outgoingString.c_str()); #endif } @@ -496,25 +563,10 @@ void releaseMQTT() { } String outgoingString; serializeJson(doc, outgoingString); - client.publish(TOPIC_DATA, (char*) outgoingString.c_str()); + mqtt_publish((char*) outgoingString.c_str()); lenMQTT = 0; #endif } -void reconnect() { -#ifdef USE_WIFI - // Loop until reconnected - while (!client.connected()) { - // Attempt to connect - if (client.connect("FDRS_GATEWAY", mqtt_user, mqtt_pass)) { - // Subscribe - client.subscribe(TOPIC_COMMAND); - } else { - DBG("Connecting MQTT."); - delay(5000); - } - } -#endif -} void begin_espnow() { DBG("Initializing ESP-NOW!"); WiFi.mode(WIFI_STA); @@ -570,3 +622,32 @@ void begin_espnow() { #endif DBG(" ESP-NOW Initialized."); } +void begin_lora(){ + #ifdef USE_LORA + DBG("Initializing LoRa!"); + #ifdef ESP32 + SPI.begin(SCK, MISO, MOSI); + #endif + LoRa.setPins(SS, RST, DIO0); + if (!LoRa.begin(FDRS_BAND)) { + DBG(" Initialization failed!"); + while (1); + } + LoRa.setSpreadingFactor(FDRS_SF); + DBG(" LoRa initialized."); + #endif +} +void begin_SD(){ + #ifdef USE_SD_LOG + DBG("Initializing SD card..."); + #ifdef ESP32 + SPI.begin(SCK, MISO, MOSI); + #endif + if (!SD.begin(SD_SS)) { + DBG(" Initialization failed!"); + while (1); + }else{ + DBG(" SD initialized."); + } + #endif +}