From 038f1f9c6d3d46d02d2507fe6da9ba32b08c60eb Mon Sep 17 00:00:00 2001 From: "Hansi, dl9rdz" Date: Fri, 18 Oct 2019 15:22:43 +0200 Subject: [PATCH] Some cleanup, Power control for Heltec v2 board, hor.speed in m/s --- RX_FSK/RX_FSK.ino | 96 +++++++++++++++++----------------- RX_FSK/data/index.html | 6 +-- RX_FSK/data/style.css | 6 +++ RX_FSK/version.h | 2 +- libraries/SondeLib/Display.cpp | 86 ++++++++++++++++++++++++++++-- libraries/SondeLib/Display.h | 18 ++++++- libraries/SondeLib/Sonde.cpp | 7 +-- libraries/SondeLib/Sonde.h | 12 +++-- 8 files changed, 169 insertions(+), 64 deletions(-) diff --git a/RX_FSK/RX_FSK.ino b/RX_FSK/RX_FSK.ino index 3e931f4..0646a55 100644 --- a/RX_FSK/RX_FSK.ino +++ b/RX_FSK/RX_FSK.ino @@ -68,27 +68,12 @@ Button button2 = {0, 0, KP_NONE, 0, -1, false}; static int lastDisplay = 1; static int currentDisplay = 1; -// Set LED GPIO -int ledPin = 1; -// Stores LED state -String ledState; - // timestamp when spectrum display was activated static unsigned long specTimer; // Replaces placeholder with LED state value String processor(const String& var) { Serial.println(var); - if (var == "STATE") { - if (digitalRead(ledPin)) { - ledState = "ON"; - } - else { - ledState = "OFF"; - } - Serial.print(ledState); - return ledState; - } if (var == "VERSION_NAME") { return String(version_name); } @@ -398,25 +383,23 @@ struct st_configitems { struct st_configitems config_list[] = { /* General config settings */ + {"", "Software configuration", -5, NULL}, {"wifi", "Wifi mode (0/1/2/3)", 0, &sonde.config.wifi}, {"debug", "Debug mode (0/1)", 0, &sonde.config.debug}, {"maxsonde", "Maxsonde", 0, &sonde.config.maxsonde}, {"display", "Display mode (1/2/3)", 0, &sonde.config.display}, - {"---", "---", -1, NULL}, /* Spectrum display settings */ - {"spectrum", "ShowSpectrum (s)", 0, &sonde.config.spectrum}, + {"spectrum", "Show spectrum (-1=no, 0=forever, >0=seconds)", 0, &sonde.config.spectrum}, {"startfreq", "Startfreq (MHz)", 0, &sonde.config.startfreq}, {"channelbw", "Bandwidth (kHz)", 0, &sonde.config.channelbw}, - {"timer", "Spectrum Timer", 0, &sonde.config.timer}, {"marker", "Spectrum MHz marker", 0, &sonde.config.marker}, {"noisefloor", "Sepctrum noisefloor", 0, &sonde.config.noisefloor}, {"showafc", "Show AFC value", 0, &sonde.config.showafc}, {"freqofs", "RX frequency offset (Hz)", 0, &sonde.config.freqofs}, - {"---", "---", -1, NULL}, + {"", "Data feed configuration", -5, NULL}, /* APRS settings */ {"call", "Call", 8, sonde.config.call}, {"passcode", "Passcode", 8, sonde.config.passcode}, - {"---", "---", -1, NULL}, /* KISS tnc settings */ {"kisstnc", "KISS TNC (port 14590) (needs reboot)", 0, &sonde.config.kisstnc.active}, {"kisstnc.idformat", "DFM ID Format", -2, &sonde.config.kisstnc.idformat}, @@ -426,33 +409,33 @@ struct st_configitems config_list[] = { {"axudp.port", "AXUDP Port", 0, &sonde.config.udpfeed.port}, {"axudp.idformat", "DFM ID Format", -2, &sonde.config.udpfeed.idformat}, {"axudp.highrate", "Rate limit", 0, &sonde.config.udpfeed.highrate}, - {"---", "---", -1, NULL}, /* APRS TCP settings, current not used */ {"tcp.active", "APRS TCP active", -3, &sonde.config.tcpfeed.active}, {"tcp.host", "ARPS TCP Host", 63, sonde.config.tcpfeed.host}, {"tcp.port", "APRS TCP Port", 0, &sonde.config.tcpfeed.port}, {"tcp.idformat", "DFM ID Format", -2, &sonde.config.tcpfeed.idformat}, {"tcp.highrate", "Rate limit", 0, &sonde.config.tcpfeed.highrate}, - {"---", "---", -1, NULL}, /* decoder settings */ + {"", "Receiver configuration", -5, NULL}, {"rs41.agcbw", "RS41 AGC bandwidth", 0, &sonde.config.rs41.agcbw}, {"rs41.rxbw", "RS41 RX bandwidth", 0, &sonde.config.rs41.rxbw}, {"rs92.rxbw", "RS92 RX (and AGC) bandwidth", 0, &sonde.config.rs92.rxbw}, {"rs92.alt2d", "RS92 2D fix default altitude", 0, &sonde.config.rs92.alt2d}, {"dfm.agcbw", "DFM6/9 AGC bandwidth", 0, &sonde.config.dfm.agcbw}, {"dfm.rxbw", "DFM6/9 RX bandwidth", 0, &sonde.config.dfm.rxbw}, - {"---", "---", -1, NULL}, /* Hardware dependeing settings */ + {"", "Hardware configuration (requires reboot)", -5, NULL}, {"disptype", "Display type (0=OLED/SSD1306, 1=TFT/ILI9225, 2=OLED/SH1106)", 0, &sonde.config.disptype}, - {"oled_sda", "OLED/TFT SDA (needs reboot)", 0, &sonde.config.oled_sda}, - {"oled_scl", "OLED SCL/TFT CLK (needs reboot)", 0, &sonde.config.oled_scl}, - {"oled_rst", "OLED/TFT RST (needs reboot)", 0, &sonde.config.oled_rst}, - {"tft_rs", "TFT RS (needs reboot)", 0, &sonde.config.tft_rs}, - {"tft_cs", "TFT CS (needs reboot)", 0, &sonde.config.tft_cs}, - {"button_pin", "Button input port (needs reboot)", -4, &sonde.config.button_pin}, - {"button2_pin", "Button 2 input port (needs reboot)", -4, &sonde.config.button2_pin}, - {"touch_thresh", "Touch button threshold (needs reboot)", 0, &sonde.config.touch_thresh}, - {"led_pout", "LED output port (needs reboot)", 0, &sonde.config.led_pout}, + {"oled_sda", "OLED SDA/TFT SDA", 0, &sonde.config.oled_sda}, + {"oled_scl", "OLED SCL/TFT CLK", 0, &sonde.config.oled_scl}, + {"oled_rst", "OLED RST/TFT RST (needs reboot)", 0, &sonde.config.oled_rst}, + {"tft_rs", "TFT RS", 0, &sonde.config.tft_rs}, + {"tft_cs", "TFT CS", 0, &sonde.config.tft_cs}, + {"button_pin", "Button input port", -4, &sonde.config.button_pin}, + {"button2_pin", "Button 2 input port", -4, &sonde.config.button2_pin}, + {"touch_thresh", "Touch button threshold", 0, &sonde.config.touch_thresh}, + {"power_pout", "Power control port", 0, &sonde.config.power_pout}, + {"led_pout", "LED output port", 0, &sonde.config.led_pout}, {"gps_rxd", "GPS RXD pin (-1 to disable)", 0, &sonde.config.gps_rxd}, {"gps_txd", "GPS TXD pin (not really needed)", 0, &sonde.config.gps_txd}, }; @@ -480,12 +463,19 @@ void addConfigOnOffEntry(char *ptr, int idx, const char *label, int *value) { void addConfigSeparatorEntry(char *ptr) { strcat(ptr, "
\n"); } +void addConfigHeading(char *ptr, const char *label) { + strcat(ptr, ""); + strcat(ptr, label); + strcat(ptr, "\n"); +} const char *createConfigForm() { char *ptr = message; strcpy(ptr, "
"); for (int i = 0; i < N_CONFIG; i++) { switch (config_list[i].type) { + case -5: // Heading + addConfigHeading(ptr, config_list[i].label); case -3: // in/offt addConfigOnOffEntry(ptr, i, config_list[i].label, (int *)config_list[i].data); break; @@ -771,7 +761,6 @@ void SetupAsyncServer() { // Route to set GPIO to HIGH server.on("/test.php", HTTP_POST, [](AsyncWebServerRequest * request) { - //digitalWrite(ledPin, HIGH); request->send(SPIFFS, "/index.html", String(), false, processor); }); @@ -889,7 +878,19 @@ void initTouch() { char buffer[85]; MicroNMEA nmea(buffer, sizeof(buffer)); +void unkHandler(const MicroNMEA& nmea) { + if(strcmp(nmea.getMessageID(), "VTG")==0) { + const char *s = nmea.getSentence(); + while(*s && *s!=',') s++; + if(*s==',') s++; else return; + if(*s==',') return; /// no new course data + int course = nmea.parseFloat(s, 0, NULL); + Serial.printf("Course update: %d\n", course); + } +} void gpsTask(void *parameter) { + nmea.setUnknownSentenceHandler(unkHandler); + while (1) { while (Serial2.available()) { char c = Serial2.read(); @@ -1196,6 +1197,10 @@ void setup() sleep(500); } } + if(sonde.config.power_pout>=0) { // for a heltec v2, pull GPIO21 low for display power + pinMode(sonde.config.power_pout&127, OUTPUT); + digitalWrite(sonde.config.power_pout&127, sonde.config.power_pout&128?1:0); + } LORA_LED = sonde.config.led_pout; pinMode(LORA_LED, OUTPUT); @@ -1324,9 +1329,6 @@ void setup() sonde.setup(); initGPS(); - if (sonde.config.kisstnc.active) { - tncserver.begin(); - } WiFi.onEvent(WiFiEvent); getKeyPress(); // clear key buffer } @@ -1482,10 +1484,10 @@ void loopSpectrum() { itoa((sonde.config.startfreq + 6), buf, 10); disp.rdis->drawString(13, 1, buf); } - if (sonde.config.timer) { + if (sonde.config.spectrum>0) { int remaining = sonde.config.spectrum - (millis() - specTimer) / 1000; itoa(remaining, buf, 10); - Serial.printf("timer:%d config.spectrum:%d specTimer:%ld millis:%ld remaining:%d\n", sonde.config.timer, sonde.config.spectrum, specTimer, millis(), remaining); + Serial.printf("config.spectrum:%d specTimer:%ld millis:%ld remaining:%d\n", sonde.config.spectrum, specTimer, millis(), remaining); if (sonde.config.marker != 0) { marker = 1; } @@ -1531,7 +1533,7 @@ void enableNetwork(bool enable) { SetupAsyncServer(); udp.begin(WiFi.localIP(), LOCALUDPPORT); MDNS.addService("http", "tcp", 80); - tncserver.begin(); + if(sonde.config.kisstnc.active) { tncserver.begin(); } connected = true; } else { MDNS.end(); @@ -1639,7 +1641,7 @@ void WiFiEvent(WiFiEvent_t event) void wifiConnect(int16_t res) { - Serial.printf("WLAN scan result: found %d networks\n", res); + Serial.printf("WiFi scan result: found %d networks\n", res); // pick best network int bestEntry = -1; @@ -1684,13 +1686,13 @@ void loopWifiBackground() { if (wifi_state == WIFI_DISABLED) { // stopped => start can wifi_state = WIFI_SCAN; - Serial.println("WLAN start scan"); + Serial.println("WiFi start scan"); WiFi.scanNetworks(true); // scan in async mode } else if (wifi_state == WIFI_SCAN) { int16_t res = WiFi.scanComplete(); if (res == 0 || res == WIFI_SCAN_FAILED) { // retry - Serial.println("WLAN restart scan"); + Serial.println("WiFi restart scan"); WiFi.disconnect(true); wifi_state = WIFI_DISABLED; return; @@ -1739,9 +1741,8 @@ void startAP() { } void initialMode() { - if (sonde.config.spectrum != 0) { // enable Spectrum in config.txt: spectrum=number_of_seconds + if (sonde.config.spectrum != -1) { // enable Spectrum in config.txt: spectrum=number_of_seconds startSpectrumDisplay(); - //done in startSpectrumScan(): enterMode(ST_SPECTRUM); } else { currentDisplay = 0; enterMode(ST_DECODER); @@ -1860,14 +1861,15 @@ void loopWifiScan() { } enableNetwork(true); initialMode(); - - if (sonde.config.spectrum != 0) { // enable Spectrum in config.txt: spectrum=number_of_seconds - //startSpectrumDisplay(); +#if 0 + // done already in initialMode + if (sonde.config.spectrum != -1) { // enable Spectrum in config.txt: spectrum=number_of_seconds (0=forever) enterMode(ST_SPECTRUM); } else { currentDisplay = 0; enterMode(ST_DECODER); } +#endif } diff --git a/RX_FSK/data/index.html b/RX_FSK/data/index.html index a0bb412..1784bbb 100644 --- a/RX_FSK/data/index.html +++ b/RX_FSK/data/index.html @@ -16,7 +16,7 @@
- + @@ -29,8 +29,8 @@
-
-

WLAN - Settings

+
+

WiFi - Settings

diff --git a/RX_FSK/data/style.css b/RX_FSK/data/style.css index 57ee6d1..63e9b6b 100644 --- a/RX_FSK/data/style.css +++ b/RX_FSK/data/style.css @@ -10,6 +10,12 @@ table, th, td { background-color: #ddd } +td#caption { + text-align: center; + background-color: #aaa; + font-weight: bold; +} + td#sfreq { background-color: #ccc; } diff --git a/RX_FSK/version.h b/RX_FSK/version.h index 70c77d6..40ebdae 100644 --- a/RX_FSK/version.h +++ b/RX_FSK/version.h @@ -1,2 +1,2 @@ const char *version_name = "rdzTTGOsonde"; -const char *version_id = "devel20191016"; +const char *version_id = "devel20191018"; diff --git a/libraries/SondeLib/Display.cpp b/libraries/SondeLib/Display.cpp index 0aae5cd..7c6ddb9 100644 --- a/libraries/SondeLib/Display.cpp +++ b/libraries/SondeLib/Display.cpp @@ -240,6 +240,11 @@ void U8x8Display::drawString(uint8_t x, uint8_t y, const char *s, int16_t width, void U8x8Display::drawTile(uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) { u8x8->drawTile(x, y, cnt, tile_ptr); } + +void U8x8Display::drawBitmap(uint16_t x1, uint16_t y1, const uint16_t* bitmap, int16_t w, int16_t h) { + // not supported +} + void U8x8Display::welcome() { u8x8->clear(); setFont(FONT_LARGE); @@ -401,6 +406,10 @@ void ILI9225Display::drawTile(uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_p #endif } +void ILI9225Display::drawBitmap(uint16_t x1, uint16_t y1, const uint16_t* bitmap, int16_t w, int16_t h) { + tft->drawBitmap(x1, y1, bitmap, w, h); +} + void ILI9225Display::welcome() { tft->clear(); setFont(6); @@ -577,7 +586,19 @@ void Display::parseDispElement(char *text, DispEntry *de) de->func = disp.drawSite; break; case 'g': de->func = disp.drawGPS; - de->extra = strdup(text+1); + if(text[1]=='0') { + // extended configuration for arrow... + struct CircleInfo *circinfo = (struct CircleInfo *)malloc(sizeof(struct CircleInfo)); + circinfo->type = '0'; + circinfo->radius = atoi(text+2); + circinfo->brad = 3; + circinfo->bcol = 0xffff; + circinfo->acol = 0xffff; + circinfo->awidth = 4; + de->extra = (char *)circinfo; + } else { + de->extra = strdup(text+1); + } Serial.printf("parsing 'g' entry: extra is '%s'\n", de->extra); break; case 'r': @@ -724,6 +745,42 @@ void Display::initFromFile() { setLayout(0); } +void Display::circ(uint16_t *bm, int16_t size, int16_t x0, int16_t y0, int16_t r, uint16_t fg, boolean fill, uint16_t bg) { + // draw circle + int x = 0; + int y = r; + int ddF_x = 1; + int ddF_y = -2 * r; + int f = 1-r; + bm[x0 + (y0+r)*size] = fg; + bm[x0 + (y0-r)*size] = fg; + bm[x0+r + y0*size] = fg; + bm[x0-r + y0*size] = fg; + if(fill) { for(int yy=-y+1; yy=0) { y--; ddF_y += 2; f += ddF_y; newy = true; } + x++; ddF_x += 2; f += ddF_x; + bm[ (x0+x) + (y0+y)*size ] = fg; + bm[ (x0-x) + (y0+y)*size ] = fg; + bm[ (x0+x) + (y0-y)*size ] = fg; + bm[ (x0-x) + (y0-y)*size ] = fg; + bm[ (x0+y) + (y0+x)*size ] = fg; + bm[ (x0-y) + (y0+x)*size ] = fg; + bm[ (x0+y) + (y0-x)*size ] = fg; + bm[ (x0-y) + (y0-x)*size ] = fg; + if(fill) { + if(newy) { + for(int xx = -x+1; xxextra && de->extra[0]=='m')?true:false; // m/s or km/h + float hs = sonde.si()->hs; + if(is_ms) hs = hs / 3.6; + boolean has_extra = (de->extra && de->extra[1]!=0)? true: false; snprintf(buf, 16, sonde.si()->hs>99?" %3.0f":" %2.1f", sonde.si()->hs); - if(de->extra) { strcat(buf, de->extra); } - drawString(de,buf+strlen(buf)-4- (de->extra?strlen(de->extra):0) ); - if(!de->extra) rdis->drawTile(de->x+4,de->y,2,kmh_tiles); + if(has_extra) { strcat(buf, de->extra+1); } + drawString(de,buf+strlen(buf)-4- (has_extra?strlen(de->extra+1):0) ); + if(!has_extra) rdis->drawTile(de->x+4,de->y,2,is_ms?ms_tiles:kmh_tiles); } void Display::drawVS(DispEntry *de) { rdis->setFont(de->fmt); @@ -985,6 +1046,23 @@ void Display::drawGPS(DispEntry *de) { rdis->drawTile(de->x+3, de->y, 1, deg_tile); } break; + case '0': + // diagram + { + struct CircleInfo *circinfo = (struct CircleInfo *)de->extra; + int size = 1 + 2*circinfo->radius + 2*circinfo->brad; + uint16_t *bitmap = (uint16_t *)malloc(sizeof(uint16_t) * size * size); + Serial.printf("Drawing circle with size %d at %d,%d\n",size,de->x, de->y); + for(int i=0; iradius, de->fg, true, de->bg); + circ(bitmap, size, x0+circinfo->radius, y0, circinfo->brad, 0xff00, true, 0xff00); + rdis->drawBitmap(de->x, de->y, bitmap, size, size); + free(bitmap); + } + break; case 'E': // elevation break; diff --git a/libraries/SondeLib/Display.h b/libraries/SondeLib/Display.h index af0d83b..ba05c9a 100644 --- a/libraries/SondeLib/Display.h +++ b/libraries/SondeLib/Display.h @@ -11,8 +11,8 @@ #define WIDTH_AUTO 9999 struct DispEntry { - int8_t y; - int8_t x; + int16_t y; + int16_t x; int16_t fmt, width; uint16_t fg,bg; void (*func)(DispEntry *de); @@ -25,6 +25,15 @@ struct DispInfo { int16_t *timeouts; }; +struct CircleInfo { + char type; + uint8_t radius; + uint8_t brad; + uint16_t bcol; + uint8_t awidth; + uint16_t acol; +}; + // Now starting towards supporting different Display types / libraries class RawDisplay { public: @@ -34,8 +43,10 @@ public: virtual void getDispSize(uint8_t *height, uint8_t *width, uint8_t *lineskip, uint8_t *colskip) = 0; virtual void drawString(uint8_t x, uint8_t y, const char *s, int16_t width=WIDTH_AUTO, uint16_t fg=0xffff, uint16_t bg=0 ) = 0; virtual void drawTile(uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) = 0; + virtual void drawBitmap(uint16_t x1, uint16_t y1, const uint16_t* bitmap, int16_t w, int16_t h) = 0; virtual void welcome() = 0; virtual void drawIP(uint8_t x, uint8_t y, int16_t width=WIDTH_AUTO, uint16_t fg=0xffff, uint16_t bg=0 ) = 0; + }; class U8x8Display : public RawDisplay { @@ -53,6 +64,7 @@ public: void getDispSize(uint8_t *height, uint8_t *width, uint8_t *lineskip, uint8_t *colskip); void drawString(uint8_t x, uint8_t y, const char *s, int16_t width=WIDTH_AUTO, uint16_t fg=0xffff, uint16_t bg=0); void drawTile(uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); + void drawBitmap(uint16_t x1, uint16_t y1, const uint16_t* bitmap, int16_t w, int16_t h); void welcome(); void drawIP(uint8_t x, uint8_t y, int16_t width=WIDTH_AUTO, uint16_t fg=0xffff, uint16_t bg=0); }; @@ -78,6 +90,7 @@ public: void getDispSize(uint8_t *height, uint8_t *width, uint8_t *lineskip, uint8_t *colskip); void drawString(uint8_t x, uint8_t y, const char *s, int16_t width=WIDTH_AUTO, uint16_t fg=0xffff, uint16_t bg=0); void drawTile(uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr); + void drawBitmap(uint16_t x1, uint16_t y1, const uint16_t* bitmap, int16_t w, int16_t h); void welcome(); void drawIP(uint8_t x, uint8_t y, int16_t width=WIDTH_AUTO, uint16_t fg=0xffff, uint16_t bg=0); }; @@ -90,6 +103,7 @@ private: int xscale=13, yscale=22; int fontsma=0, fontlar=1; uint16_t colfg, colbg; + static void circ(uint16_t *bm, int16_t w, int16_t x0, int16_t y0, int16_t r, uint16_t fg, boolean fill, uint16_t bg); public: void initFromFile(); diff --git a/libraries/SondeLib/Sonde.cpp b/libraries/SondeLib/Sonde.cpp index 45219b8..9e0bb84 100644 --- a/libraries/SondeLib/Sonde.cpp +++ b/libraries/SondeLib/Sonde.cpp @@ -68,6 +68,7 @@ void Sonde::defaultConfig() { memset(sondeList, 0, (MAXSONDE+1)*sizeof(SondeInfo)); config.touch_thresh = 70; config.led_pout = 9; + config.power_pout = -1; // Try autodetecting board type // Seems like on startup, GPIO4 is 1 on v1 boards, 0 on v2.1 boards? config.gps_rxd = -1; @@ -79,6 +80,7 @@ void Sonde::defaultConfig() { config.oled_scl = 15; config.button_pin = 0; config.button2_pin = T4 + 128; // T4 == GPIO13 + config.power_pout = 21; // for Heltec v2 Serial.println("Autoconfig: looks like TTGO v1 / Heltec v1/V2 board"); } else { config.oled_sda = 21; @@ -146,7 +148,6 @@ void Sonde::defaultConfig() { config.startfreq=400; config.channelbw=10; config.spectrum=10; - config.timer=0; config.marker=0; config.showafc=0; config.freqofs=0; @@ -196,6 +197,8 @@ void Sonde::setConfig(const char *cfg) { config.touch_thresh = atoi(val); } else if(strcmp(cfg,"led_pout")==0) { config.led_pout = atoi(val); + } else if(strcmp(cfg,"power_pout")==0) { + config.power_pout = atoi(val); } else if(strcmp(cfg,"disptype")==0) { config.disptype = atoi(val); } else if(strcmp(cfg,"oled_sda")==0) { @@ -230,8 +233,6 @@ void Sonde::setConfig(const char *cfg) { config.channelbw = atoi(val); } else if(strcmp(cfg,"spectrum")==0) { config.spectrum = atoi(val); - } else if(strcmp(cfg,"timer")==0) { - config.timer = atoi(val); } else if(strcmp(cfg,"marker")==0) { config.marker = atoi(val); } else if(strcmp(cfg,"showafc")==0) { diff --git a/libraries/SondeLib/Sonde.h b/libraries/SondeLib/Sonde.h index 430f0f5..b535593 100644 --- a/libraries/SondeLib/Sonde.h +++ b/libraries/SondeLib/Sonde.h @@ -81,10 +81,12 @@ struct st_dfmconfig { }; typedef struct st_rdzconfig { + // hardware configuration int button_pin; // PIN port number menu button (+128 for touch mode) int button2_pin; // PIN port number menu button (+128 for touch mode) int touch_thresh; // Threshold value (0..100) for touch input button int led_pout; // POUT port number of LED (used as serial monitor) + int power_pout; // Power control pin (for Heltec v2) int disptype; // 0=OLED; 1=ILI9225 int oled_sda; // OLED/TFT data pin int oled_scl; // OLED/TFT clock pin @@ -93,26 +95,28 @@ typedef struct st_rdzconfig { int tft_cs; // TFT CS pin int gps_rxd; // GPS module RXD pin. We expect 9600 baud NMEA data. int gps_txd; // GPS module TXD pin + // software configuration int debug; // show port and config options after reboot int wifi; // connect to known WLAN 0=skip int wifiap; // enable/disable WiFi AccessPoint mode 0=disable int display; // select display mode (0=default, 1=default, 2=fieldmode) int startfreq; // spectrum display start freq (400, 401, ...) int channelbw; // spectrum channel bandwidth (valid: 5, 10, 20, 25, 50, 100 kHz) - int spectrum; // show freq spectrum for n seconds 0=disable - int timer; // show remaining time in spectrum 0=disable + int spectrum; // show freq spectrum for n seconds -1=disable; 0=forever int marker; // show freq marker in spectrum 0=disable int maxsonde; // number of max sonde in scan (range=1-99) int norx_timeout; // Time after which rx mode switches to scan mode (without rx signal) int noisefloor; // for spectrum display + // receiver configuration int showafc; // show afc value in rx screen int freqofs; // frequency offset (tuner config = rx frequency + freqofs) in Hz - char call[9]; // APRS callsign - char passcode[9]; // APRS passcode struct st_rs41config rs41; // configuration options specific for RS41 receiver struct st_rs92config rs92; struct st_dfmconfig dfm; + // data feed configuration // for now, one feed for each type is enough, but might get extended to more? + char call[9]; // APRS callsign + char passcode[9]; // APRS passcode struct st_feedinfo udpfeed; // target for AXUDP messages struct st_feedinfo tcpfeed; // target for APRS-IS TCP connections struct st_kisstnc kisstnc; // target for KISS TNC (via TCP, mainly for APRSdroid)
OptionValue