diff --git a/RX_FSK/RX_FSK.ino.cpp b/RX_FSK/RX_FSK.ino.cpp new file mode 100644 index 0000000..78655e1 --- /dev/null +++ b/RX_FSK/RX_FSK.ino.cpp @@ -0,0 +1,3782 @@ +# 1 "C:\\Users\\heitt\\AppData\\Local\\Temp\\tmp2en1mq3q" +#include +# 1 "C:/Users/heitt/dev/rdz_ttgo_sonde/RX_FSK/RX_FSK.ino" +#include "features.h" +#include "version.h" + +#include "axp20x.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "esp_heap_caps.h" +#include "soc/rtc_wdt.h" + +#include "src/SX1278FSK.h" +#include "src/Sonde.h" + +#include "src\headless.h" +#include "src/Scanner.h" +#include "src/geteph.h" +#include "src/rs92gps.h" +#include "src/aprs.h" +#include "src/ShFreqImport.h" +#include "src/RS41.h" +#if FEATURE_CHASEMAPPER +#include "src/Chasemapper.h" +#endif + +#if FEATURE_MQTT +#include "src/mqtt.h" +#endif + + + + +enum MainState { ST_DECODER, ST_SPECTRUM, ST_WIFISCAN, ST_UPDATE, ST_TOUCHCALIB }; +static MainState mainState = ST_WIFISCAN; +const char *mainStateStr[5] = {"DECODER", "SPECTRUM", "WIFISCAN", "UPDATE", "TOUCHCALIB" }; + +AsyncWebServer server(80); + +AXP20X_Class axp; +#define PMU_IRQ 35 +SemaphoreHandle_t axpSemaphore; + +uint8_t pmu_irq = 0; + +const char *updateHost = "rdzsonde.mooo.com"; +int updatePort = 80; + +const char *updatePrefixM = "/master/"; +const char *updatePrefixD = "/devel/"; +const char *updatePrefix = updatePrefixM; + + +#define LOCALUDPPORT 9002 + +const char* ntpServer = "pool.ntp.org"; +const long gmtOffset_sec = 0; +const int daylightOffset_sec = 0; + +boolean connected = false; +WiFiUDP udp; +WiFiClient client; + + +const char *sondeTypeStrSH[NSondeTypes] = { "DFM", "RS41", "RS92", "Mxx" , "M10", "M20", "MRZ" }; +const char *dfmSubtypeStrSH[16] = { NULL, NULL, NULL, NULL, NULL, NULL, + "DFM06", + "PS15", + NULL, NULL, + "DFM09", + "DFM17", + "DFM09P", + "DFM17", + NULL, NULL + }; + + +#define APRS_STATION_UPDATE_TIME (10*60*1000) +#define APRS_MOBILE_STATION_UPDATE_TIME (20*1000) +unsigned long time_last_aprs_update = 0; + +#define EARTH_RADIUS (6371000.0F) + +#if FEATURE_SONDEHUB +#define SONDEHUB_STATION_UPDATE_TIME (60*60*1000) +#define SONDEHUB_MOBILE_STATION_UPDATE_TIME (30*1000) +WiFiClient shclient; +int shImportInterval = 0; +char shImport = 0; +unsigned long time_last_update = 0; +#endif + + + + + + + +enum { SH_LOC_OFF, SH_LOC_FIXED, SH_LOC_CHASE, SH_LOC_AUTO }; + +#define MIN_LOC_AUTO_DIST 200 +#define SH_LOC_AUTO_IS_CHASE ( gpsPos.valid && ( (isnan(sonde.config.rxlat) || isnan(sonde.config.rxlon) ) || \ + calcLatLonDist( gpsPos.lat, gpsPos.lon, sonde.config.rxlat, sonde.config.rxlon ) > MIN_LOC_AUTO_DIST ) ) + + +WiFiServer tncserver(14580); +WiFiClient tncclient; + +WiFiServer rdzserver(14570); +WiFiClient rdzclient; + +AsyncClient tcpclient; + +#if FEATURE_MQTT +unsigned long lastMqttUptime = 0; +boolean mqttEnabled; +MQTT mqttclient; +#endif +boolean forceReloadScreenConfig = false; + +enum KeyPress { KP_NONE = 0, KP_SHORT, KP_DOUBLE, KP_MID, KP_LONG }; + + +struct Button { + uint8_t pin; + uint32_t numberKeyPresses; + KeyPress pressed; + unsigned long keydownTime; + int8_t doublepress; + bool isTouched; +}; +Button button1 = {0, 0, KP_NONE, 0, -1, false}; +Button button2 = {0, 0, KP_NONE, 0, -1, false}; + + +static int lastDisplay = 1; +static int currentDisplay = 1; + + +static unsigned long specTimer; + +void enterMode(int mode); +void WiFiEvent(WiFiEvent_t event); + +char buffer[85]; +MicroNMEA nmea(buffer, sizeof(buffer)); +float calcLatLonDist(float lat1, float lon1, float lat2, float lon2); +String readLine(Stream &stream); +int readLine(Stream &stream, char *buffer, int maxlen); +String processor(const String& var); +const String sondeTypeSelect(int activeType); +void setupChannelList(); +void HTMLBODY(char *ptr, const char *which); +void HTMLBODYEND(char *ptr); +void HTMLSAVEBUTTON(char *ptr); +void setupWifiList(); +void addSondeStatus(char *ptr, int i); +void setupConfigData(); +void handleUpload(AsyncWebServerRequest * request, String filename, size_t index, uint8_t *data, size_t len, bool final); +int streamEditForm(int &state, File & file, String filename, char *buffer, size_t maxlen, size_t index); +void addSondeStatusKML(char *ptr, int i); +void SetupAsyncServer(); +int fetchWifiIndex(const char *id); +int64_t IRAM_ATTR divs10(int64_t n); +int64_t IRAM_ATTR divs1000(int64_t n); +void initTouch(); +template + +void unkHandler(T nmea); +void gpsTask(void *parameter); +void dumpGPS(); +void initGPS(); +void sx1278Task(void *parameter); +void IRAM_ATTR touchISR(); +void IRAM_ATTR touchISR2(); +void checkTouchButton(Button & button); +void ledOffCallback(); +void flashLed(int ms); +void IRAM_ATTR buttonISR(); +void IRAM_ATTR button2ISR(); +int getKeyPress(); +void handlePMUirq(); +int getKey2Press(); +int getKeyPressEvent(); +int scanI2Cdevice(void); +void heap_caps_alloc_failed_hook(size_t requested_size, uint32_t caps, const char *function_name); +void setup(); +void parseGpsJson(char *data); +void loopDecoder(); +void setCurrentDisplay(int value); +void loopSpectrum(); +void startSpectrumDisplay(); +String translateEncryptionType(wifi_auth_mode_t encryptionType); +void enableNetwork(bool enable); +void wifiConnect(int16_t res); +void loopWifiBackground(); +void startAP(); +void initialMode(); +void loopTouchCalib(); +void loopWifiScan(); +String getHeaderValue(String header, String headerName); +void execOTA(); +int fetchHTTPheader(int *validType); +void loop(); +void aprs_station_update(); +void sondehub_station_update(WiFiClient * client, struct st_sondehub * conf); +void sondehub_reply_handler(WiFiClient * client); +void sondehub_send_fimport(WiFiClient * client); +void sondehub_send_data(WiFiClient * client, SondeInfo * s, struct st_sondehub * conf); +void sondehub_finish_data(WiFiClient * client, SondeInfo * s, struct st_sondehub * conf); +void sondehub_send_header(WiFiClient * client, SondeInfo * s, struct st_sondehub * conf, struct tm * now); +void sondehub_send_next(WiFiClient * client, SondeInfo * s, struct st_sondehub * conf, char *chunk, int chunklen, int first); +void sondehub_send_last(WiFiClient * client, SondeInfo * s, struct st_sondehub * conf); +#line 154 "C:/Users/heitt/dev/rdz_ttgo_sonde/RX_FSK/RX_FSK.ino" +float calcLatLonDist(float lat1, float lon1, float lat2, float lon2) { + float x = radians(lon1-lon2) * cos( radians((lat1+lat2)/2) ); + float y = radians(lat2-lat1); + float d = sqrt(x*x+y*y)*EARTH_RADIUS; + return d; +} + + +String readLine(Stream &stream) { + String s = stream.readStringUntil('\n'); + int len = s.length(); + if (len == 0) return s; + if (s.charAt(len - 1) == '\r') s.remove(len - 1); + return s; +} + + + +int readLine(Stream &stream, char *buffer, int maxlen) { + int n = stream.readBytesUntil('\n', buffer, maxlen); + buffer[n] = 0; + if (n <= 0) return 0; + if (buffer[n - 1] == '\r') { + buffer[n - 1] = 0; + n--; + } + return n; +} + + + +String processor(const String& var) { + Serial.println(var); + if (var == "MAPCENTER") { + double lat, lon; + if (gpsPos.valid) { + lat = gpsPos.lat; + lon = gpsPos.lon; + } + else { + lat = sonde.config.rxlat; + lon = sonde.config.rxlon; + } + if ( !isnan(lat) && !isnan(lon) ) { + char p[40]; + snprintf(p, 40, "%g,%g", lat, lon); + return String(p); + } else { + return String("48,13"); + } + } + if (var == "VERSION_NAME") { + return String(version_name); + } + if (var == "VERSION_ID") { + return String(version_id); + } + if (var == "FULLNAMEID") { + char tmp[128]; + snprintf(tmp, 128, "%s-%c%d", version_id, SPIFFS_MAJOR + 'A' - 1, SPIFFS_MINOR); + return String(tmp); + } + if (var == "AUTODETECT_INFO") { + char tmpstr[128]; + const char *fpstr; + int i = 0; + while (fingerprintValue[i] != sonde.fingerprint && fingerprintValue[i] != -1) i++; + if (fingerprintValue[i] == -1) { + fpstr = "Unknown board"; + } else { + fpstr = fingerprintText[i]; + } + snprintf(tmpstr, 128, "Fingerprint %d (%s)", sonde.fingerprint, fpstr); + return String(tmpstr); + } + if (var == "EPHSTATE") { + return String(ephtxt[ephstate]); + } + return String(); +} + +const String sondeTypeSelect(int activeType) { + String sts = ""; + for (int i = 0; i < NSondeTypes; i++) { + sts += "