gps init via file; M5Stack core gray support (untested); mute LED/buzzer via button

This commit is contained in:
Hansi, dl9rdz 2024-09-05 01:09:33 +00:00
parent 7e6c7262d2
commit 4401406a5f
8 changed files with 225 additions and 45 deletions

View File

@ -629,6 +629,7 @@ struct st_configitems config_list[] = {
{"rxlat", -7, &sonde.config.rxlat}, {"rxlat", -7, &sonde.config.rxlat},
{"rxlon", -7, &sonde.config.rxlon}, {"rxlon", -7, &sonde.config.rxlon},
{"rxalt", -7, &sonde.config.rxalt}, {"rxalt", -7, &sonde.config.rxalt},
{"b2mute", 0, &sonde.config.b2mute},
{"screenfile", 0, &sonde.config.screenfile}, {"screenfile", 0, &sonde.config.screenfile},
{"display", -6, sonde.config.display}, {"display", -6, sonde.config.display},
{"dispsaver", 0, &sonde.config.dispsaver}, {"dispsaver", 0, &sonde.config.dispsaver},
@ -1514,6 +1515,7 @@ void initTouch() {
timerAlarmWrite(timer, 300000, true); timerAlarmWrite(timer, 300000, true);
timerAlarmEnable(timer); timerAlarmEnable(timer);
*/ */
if ( IS_TOUCH(sonde.config.button_pin) ) { if ( IS_TOUCH(sonde.config.button_pin) ) {
touchAttachInterrupt(sonde.config.button_pin & 0x7f, touchISR, sonde.config.touch_thresh); touchAttachInterrupt(sonde.config.button_pin & 0x7f, touchISR, sonde.config.touch_thresh);
Serial.printf("Initializing touch 1 on pin %d\n", sonde.config.button_pin & 0x7f); Serial.printf("Initializing touch 1 on pin %d\n", sonde.config.button_pin & 0x7f);
@ -1611,11 +1613,21 @@ static void checkTouchButton(Button & button) {
} }
} }
static unsigned long t_muted = (unsigned long)-1;
void ledOffCallback() { void ledOffCallback() {
digitalWrite(sonde.config.led_pout, LOW); digitalWrite(sonde.config.led_pout, LOW);
} }
void flashLed(int ms) { void flashLed(int ms) {
if (sonde.config.led_pout >= 0) { if (sonde.config.led_pout >= 0) {
if(t_muted != -1) {
Serial.printf("Muted at %d\n", t_muted);
// t_muted was set by key press to mute LED / buzzer
if(millis()-t_muted < sonde.config.b2mute * 60000L) return;
else t_muted = -1;
Serial.printf("Unmuted\n");
}
Serial.println("Not muted");
digitalWrite(sonde.config.led_pout, HIGH); digitalWrite(sonde.config.led_pout, HIGH);
ledFlasher.once_ms(ms, ledOffCallback); ledFlasher.once_ms(ms, ledOffCallback);
} }
@ -1740,6 +1752,10 @@ int getKeyPressEvent() {
if (p == KP_NONE) if (p == KP_NONE)
return EVT_NONE; return EVT_NONE;
Serial.printf("Key 2 was pressed [%d]\n", p + 4); Serial.printf("Key 2 was pressed [%d]\n", p + 4);
// maybe not the best place, but easy to do: check for B2 medium keypress to mute LED
if(p == KP_MID && sonde.config.b2mute > 0) {
if(t_muted==-1) t_muted = millis(); else t_muted = -1;
}
return p + 4; return p + 4;
} }
Serial.printf("Key 1 was pressed [%d]\n", p); Serial.printf("Key 1 was pressed [%d]\n", p);
@ -1973,6 +1989,14 @@ void setup()
if (sonde.config.type == TYPE_M5_CORE2) { if (sonde.config.type == TYPE_M5_CORE2) {
// Core2 uses Pin 38 for MISO // Core2 uses Pin 38 for MISO
SPI.begin(18, 38, 23, -1); SPI.begin(18, 38, 23, -1);
} else if (sonde.config.type == TYPE_M5_CORE) {
SPI.begin(18, 19, 23, -1);
// GPIO26 is reset
pinMode(26, OUTPUT);
digitalWrite(26, 0);
delay(5);
digitalWrite(26, 1);
delay(5);
} else { } else {
SPI.begin(); SPI.begin();
} }

View File

@ -8,6 +8,7 @@ var cfgs = [
[ "rxlat", "Receiver fixed latitude"], [ "rxlat", "Receiver fixed latitude"],
[ "rxlon", "Receiver fixed longitude"], [ "rxlon", "Receiver fixed longitude"],
[ "rxalt", "Receiver fixed altitude"], [ "rxalt", "Receiver fixed altitude"],
[ "b2mute", "Button 2/medium press mutes LED/Buzzer (minutes)"],
[ "", "OLED/TFT display configuration", "https://github.com/dl9rdz/rdz_ttgo_sonde/wiki/Display-configuration" ], [ "", "OLED/TFT display configuration", "https://github.com/dl9rdz/rdz_ttgo_sonde/wiki/Display-configuration" ],
[ "screenfile", "Screen config (0=automatic; 1-5=predefined; other=custom)" ], [ "screenfile", "Screen config (0=automatic; 1-5=predefined; other=custom)" ],
[ "display", "Display screens (scan, default, ...)" ], [ "display", "Display screens (scan, default, ...)" ],

41
RX_FSK/data/gpsinit.txt Normal file
View File

@ -0,0 +1,41 @@
# gps initialization commmands sent at startup
# '#' lines are ignored (comments)
# bnnnnn sets baud rate to nnnn
# s"blabla" sends text blabla via serial. \xnn is a hex charater with code nn; \\ \" \r \n also supported
# su"blabla" same as s, but prepend ubx sync\append ubx crc at the end
# wnnnnn waits nnnn milliseconds before continung
# wnnnnn,a waits nnnn milliseconds, jumps to label nnn if valid NMEA sentences was received in that time interval
# :x label x
# there should be a wait between sending something and changing baud as the port is asynchronus and there maybe something in the buffer...
#
# no reset requested: jump to label a
na
# wait 1 seconds\if NMEA is received jump to label a
#b9600
#w1000,a
# factory reset code\as was implemented in firmware before (hard-coded)
# try different baud rates and send command to switch to 9600 baud
b115200
su"\x06\x00\x14\x00\x01\x00\x00\x00\xC0\x08\x00\x00\x80\x25\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00"
w200
b38400
su"\x06\x00\x14\x00\x01\x00\x00\x00\xC0\x08\x00\x00\x80\x25\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00"
w200
b19200
su"\x06\x00\x14\x00\x01\x00\x00\x00\xC0\x08\x00\x00\x80\x25\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00"
w200
b9600
w800
# now, send factory reset command and wait 3 seconds
su"\x06\x09\x0d\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff"
w3000
:a
b9600
# enable GPGST sentences to get horizontal accuracy (used by app)
su"\x06\x01\x03\x00\xF0\x07\x02"
w200
# set 38400 baud
su"\x06\x00\x14\x00\x01\x00\x00\x00\xC0\x08\x00\x00\x00\x96\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00"
w200
b38400

View File

@ -509,9 +509,13 @@ void ILI9225Display::begin() {
calc_gfx_offsets(); calc_gfx_offsets();
// On the M5, the display and the Lora chip are on the same SPI interface (VSPI default pins), // On the M5, the display and the Lora chip are on the same SPI interface (VSPI default pins),
// we must use the same SPI bus with correct locking // we must use the same SPI bus with correct locking
// TODO: Check why there is a hard-coded 38 in here!?!?!?
if(sonde.config.type == TYPE_M5_CORE2) { if(sonde.config.type == TYPE_M5_CORE2) {
bus = new Arduino_ESP32SPI( sonde.config.tft_rs, sonde.config.tft_cs, bus = new Arduino_ESP32SPI( sonde.config.tft_rs, sonde.config.tft_cs,
sonde.config.oled_scl, sonde.config.oled_sda, 38, VSPI); sonde.config.oled_scl, sonde.config.oled_sda, 38, VSPI);
} else if(sonde.config.type == TYPE_M5_CORE2 || sonde.config.type == TYPE_M5_CORE) {
bus = new Arduino_ESP32SPI( sonde.config.tft_rs, sonde.config.tft_cs,
sonde.config.oled_scl, sonde.config.oled_sda, 19, VSPI);
} else { } else {
bus = new Arduino_ESP32SPI( sonde.config.tft_rs, sonde.config.tft_cs, bus = new Arduino_ESP32SPI( sonde.config.tft_rs, sonde.config.tft_cs,
sonde.config.oled_scl, sonde.config.oled_sda, -1, HSPI); sonde.config.oled_scl, sonde.config.oled_sda, -1, HSPI);
@ -529,7 +533,7 @@ void ILI9225Display::begin() {
tft->fillScreen(BLACK); tft->fillScreen(BLACK);
tft->setRotation(sonde.config.tft_orient); tft->setRotation(sonde.config.tft_orient);
tft->setTextWrap(false); tft->setTextWrap(false);
if(sonde.config.type == TYPE_M5_CORE2) if(sonde.config.type == TYPE_M5_CORE2||sonde.config.type==TYPE_M5_CORE)
tft->invertDisplay(true); tft->invertDisplay(true);
} }

View File

@ -101,6 +101,7 @@ void Sonde::defaultConfig() {
config.led_pout = -1; config.led_pout = -1;
config.power_pout = -1; config.power_pout = -1;
config.spectrum=10; config.spectrum=10;
config.b2mute = 360;
// Try autodetecting board type // Try autodetecting board type
config.type = TYPE_TTGO; config.type = TYPE_TTGO;
// Seems like on startup, GPIO4 is 1 on v1 boards, 0 on v2.1 boards? // Seems like on startup, GPIO4 is 1 on v1 boards, 0 on v2.1 boards?
@ -128,6 +129,7 @@ void Sonde::defaultConfig() {
config.tft_rs = -1; config.tft_rs = -1;
config.tft_cs = -1; config.tft_cs = -1;
if(initlevels[16]==0) { if(initlevels[16]==0) {
// TODO: Plain M5 Core Gray ends up here (without Lora/GPS board attached)
config.oled_sda = 4; config.oled_sda = 4;
config.oled_scl = 15; config.oled_scl = 15;
config.oled_rst = 16; config.oled_rst = 16;
@ -233,6 +235,39 @@ void Sonde::defaultConfig() {
} }
} }
} else { } else {
Serial.println("Looks like a TTGO V2.1_1.6, could also be a M5 Core");
// M5 core has I2C devices 0x16 0x68 0x75
Wire.begin(21, 22);
#define BMM150 0x10
Wire.beginTransmission(BMM150);
byte err = Wire.endTransmission();
if(err) { // try again
delay(400);
Wire.beginTransmission(BMM150);
err = Wire.endTransmission();
}
if(err==0) {
LOG_I(TAG, "M5stack Core Gray board detected\n");
config.type = TYPE_M5_CORE;
config.button_pin = 39;
config.button2_pin = 38;
config.button2_axp = 0;
config.disptype = 4; // ILI9342
config.oled_sda = 23;
config.oled_scl = 18;
config.oled_rst = 33;
config.tft_rs = 27;
config.tft_cs = 14;
config.power_pout = 32+128;
// gpio32 is backlight of tft
config.screenfile = 4;
config.gps_rxd = 16;
config.gps_txd = -1; // 17
config.sx1278_ss = 5;
config.sx1278_miso = 19;
config.sx1278_mosi = 23; //MOSI;
config.sx1278_sck = 18; // SCK;
} else {
// Likely a TTGO V2.1_1.6 // Likely a TTGO V2.1_1.6
config.button_pin = 2 + 128; // GPIO2 / T2 config.button_pin = 2 + 128; // GPIO2 / T2
config.button2_pin = 14 + 128; // GPIO14 / T6 config.button2_pin = 14 + 128; // GPIO14 / T6
@ -242,6 +277,7 @@ void Sonde::defaultConfig() {
config.sd.miso = 2; config.sd.miso = 2;
config.sd.mosi = 15; config.sd.mosi = 15;
config.sd.clk = 14; config.sd.clk = 14;
}
} }
} }
// //

View File

@ -243,7 +243,7 @@ struct st_sdcard {
}; };
// to be extended // to be extended
enum { TYPE_TTGO, TYPE_M5_CORE2 }; enum { TYPE_TTGO, TYPE_M5_CORE2, TYPE_M5_CORE };
typedef struct st_rdzconfig { typedef struct st_rdzconfig {
int type; // autodetected type, TTGO or M5_CORE2 int type; // autodetected type, TTGO or M5_CORE2
@ -275,6 +275,7 @@ typedef struct st_rdzconfig {
double rxlon; double rxlon;
double rxalt; double rxalt;
int wifi; // connect to known WLAN 0=skip int wifi; // connect to known WLAN 0=skip
uint16_t b2mute; // mute LED/Buzzer for x minutes, 0=0ff
int screenfile; int screenfile;
int8_t display[30]; // list of display mode (0:scanner, 1:default, 2,... additional modes) int8_t display[30]; // list of display mode (0:scanner, 1:default, 2,... additional modes)
int dispsaver; // Turn display on/off (0=always on, 10*n+1: off after n seconds, int dispsaver; // Turn display on/off (0=always on, 10*n+1: off after n seconds,

View File

@ -4,6 +4,8 @@
#include <LittleFS.h> #include <LittleFS.h>
#include <MicroNMEA.h> #include <MicroNMEA.h>
#define TAG "GPS"
#include "logger.h"
// Sation position obtained from GPS (if available) // Sation position obtained from GPS (if available)
struct StationPos gpsPos; struct StationPos gpsPos;
@ -45,6 +47,12 @@ void fixedToPosInfo() {
static char buffer[85]; static char buffer[85];
static MicroNMEA nmea(buffer, sizeof(buffer)); static MicroNMEA nmea(buffer, sizeof(buffer));
static int badNMEA = 0, totalNMEA = 0;
template<typename T>
void badChecksumHandler(T nmea) {
badNMEA++;
}
/// Arrg. MicroNMEA changes type definition... so lets auto-infer type /// Arrg. MicroNMEA changes type definition... so lets auto-infer type
template<typename T> template<typename T>
@ -94,7 +102,7 @@ void unkHandler(T nmea) {
// 1 deg = aprox. 100 km ==> approx. 200m // 1 deg = aprox. 100 km ==> approx. 200m
#define AUTO_CHASE_THRESHOLD 0.002 #define AUTO_CHASE_THRESHOLD 0.002
#define DEBUG_GPS //#define DEBUG_GPS
static bool gpsCourseOld; static bool gpsCourseOld;
static int lastCourse; static int lastCourse;
static char lastnmea[101]; static char lastnmea[101];
@ -105,9 +113,15 @@ void gpsTask(void *parameter) {
while (Serial2.available()) { while (Serial2.available()) {
if(gotNMEA == 0) gotNMEA = -1; // at least we got *something* if(gotNMEA == 0) gotNMEA = -1; // at least we got *something*
char c = Serial2.read(); char c = Serial2.read();
#if DEBUG_GPS
Serial.print(c); Serial.print(c);
#endif
if (nmea.process(c)) { if (nmea.process(c)) {
const char *nmeastring = nmea.getSentence(); const char *nmeastring = nmea.getSentence();
if(nmeastring[0]=='$') { // looks like a nmea string
totalNMEA++;
gotNMEA = 1;
}
if(strncmp(nmeastring+3, "GGA", 3)==0 || strncmp(nmeastring+3, "RMC", 3)==0) { if(strncmp(nmeastring+3, "GGA", 3)==0 || strncmp(nmeastring+3, "RMC", 3)==0) {
strncpy(lastnmea, nmeastring, 100); strncpy(lastnmea, nmeastring, 100);
Serial.printf("GPS: last position nmea: %s\n", lastnmea); Serial.printf("GPS: last position nmea: %s\n", lastnmea);
@ -115,7 +129,6 @@ void gpsTask(void *parameter) {
else { else {
Serial.printf("GPS: last nmea: %s\n", nmeastring); Serial.printf("GPS: last nmea: %s\n", nmeastring);
} }
gotNMEA = 1;
gpsPos.valid = nmea.isValid(); gpsPos.valid = nmea.isValid();
if (gpsPos.valid) { if (gpsPos.valid) {
gpsPos.lon = nmea.getLongitude() * 0.000001; gpsPos.lon = nmea.getLongitude() * 0.000001;
@ -180,61 +193,118 @@ uint8_t ubx_enable_gpgst[] = {UBX_SYNCH_1, UBX_SYNCH_2, 0x06, 0x01, 3, 0, 0xF0,
void dumpGPS() { void dumpGPS() {
while (Serial2.available()) { while (Serial2.available()) {
char c = Serial2.read(); char c = Serial2.read();
Serial.printf("%02x ", (uint8_t)c); char d = (c&127)<20 ? '?' : c;
Serial.printf("%02x[%c] ", (uint8_t)c, d);
} }
} }
static char h2i(char c) {
if(c>='0'&&c<='9') return c-'0';
else if (c>='a'&&c<='f') return c-'a'+10;
else if (c>='A'&&c<='F') return c-'A'+10;
else return 0;
}
static uint8_t cs1, cs2;
static void sendChar(char c) {
cs1 += c;
cs2 += cs1;
char d = (c&127)<20 ? '?' : c;
Serial.printf("%02x[%c] ", (uint8_t)c, d);
Serial2.write(c);
}
static void sendString(const char *p) {
bool ubx = false;
if(p[0]=='u') { ubx=true; p++; }
p++; // skip "
if(ubx) { sendChar(UBX_SYNCH_1); sendChar(UBX_SYNCH_2); }
cs1 = cs2 = 0;
while(*p && *p!='"') {
if(*p=='\\') {
p++;
if(*p=='x') { sendChar( (unsigned char)( 16*h2i(p[1]) + h2i(p[2]) ) ); p+=2; }
else if(*p=='n') sendChar('\n');
else if (*p=='r') sendChar('\r');
else sendChar(*p);
}
else sendChar(*p);
p++;
}
if(ubx) {
uint8_t _cs1 = cs1, _cs2 = cs2;
sendChar(_cs1); sendChar(_cs2);
}
}
static int initGPSfromFile(bool reset) {
File initgps = LittleFS.open("/gpsinit.txt", FILE_READ);
if(!initgps) { LOG_W(TAG, "no gpsinit.txt found, skipping GPS init\n"); return -1; }
uint16_t lines[100]; // max. 100 lines... (hard coded)
uint8_t labels[10]; // max 10 labels (hard coded)
char jumpto = 0;
while(initgps.available()) {
String l = initgps.readStringUntil('\n');
const char *p = l.c_str();
Serial.printf("\nGPSINIT string '%s'\n", p);
if(jumpto > 0) {
Serial.printf("is jumpto? %d, %d vs %d\n", p[0], p[1], jumpto);
if(*p==':' && p[1] == jumpto) jumpto = 0;
continue;
}
switch(p[0]) {
case 'n': // conditional jump if no reset
{
if(!reset) {
jumpto = p[1];
Serial.printf("Jumping to %c\n", jumpto);
}
break;
}
case 'w': // wait
{
int t = atoi(p+1);
Serial.printf("Waiting %d ms\n", t);
delay(t);
dumpGPS();
break;
// TODO: JUMP
}
case 'b': // set baud
{
int baud = atoi(p+1);
Serial.printf("Setting baud to %d\n", baud);
Serial2.begin(baud, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd);
break;
}
case 's': // send string
{
Serial.printf("Sending string to GPS: ");
sendString(p+1);
break;
}}
}
return 0;
}
void initGPS() { void initGPS() {
if (sonde.config.gps_rxd < 0) return; // GPS disabled if (sonde.config.gps_rxd < 0) return; // GPS disabled
if (sonde.config.gps_txd >= 0) { // TX enable, thus try setting baud to 9600 and do a factory reset if (sonde.config.gps_txd >= 0) { // TX enable, thus try setting baud to 9600 and do a factory reset
File testfile = LittleFS.open("/GPSRESET", FILE_READ); File testfile = LittleFS.open("/GPSRESET", FILE_READ);
bool reset = false;
if (testfile && !testfile.isDirectory()) { if (testfile && !testfile.isDirectory()) {
reset = true;
testfile.close(); testfile.close();
Serial.println("GPS resetting baud to 9k6...");
/* TODO: debug:
Sometimes I have seen the Serial2.begin to cause a reset
Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1)
Backtrace: 0x40081d2f:0x3ffc11b0 0x40087969:0x3ffc11e0 0x4000bfed:0x3ffb1db0 0x4008b7dd:0x3ffb1dc0 0x4017afee:0x3ffb1de0 0x4017b04b:0x3ffb1e20 0x4010722b:0x3ffb1e50 0x40107303:0x3ffb1e70 0x4010782d:0x3ffb1e90 0x40103814:0x3ffb1ed0 0x400d8772:0x3ffb1f10 0x400d9057:0x3ffb1f60 0x40107aca:0x3ffb1fb0 0x4008a63e:0x3ffb1fd0
#0 0x40081d2f:0x3ffc11b0 in _uart_isr at /Users/hansi/.platformio/packages/framework-arduinoespressif32/cores/esp32/esp32-hal-uart.c:464
#1 0x40087969:0x3ffc11e0 in _xt_lowint1 at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/xtensa_vectors.S:1154
#2 0x4000bfed:0x3ffb1db0 in ?? ??:0
#3 0x4008b7dd:0x3ffb1dc0 in vTaskExitCritical at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/tasks.c:3507
#4 0x4017afee:0x3ffb1de0 in esp_intr_alloc_intrstatus at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/intr_alloc.c:784
#5 0x4017b04b:0x3ffb1e20 in esp_intr_alloc at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/intr_alloc.c:784
#6 0x4010722b:0x3ffb1e50 in uartEnableInterrupt at /Users/hansi/.platformio/packages/framework-arduinoespressif32/cores/esp32/esp32-hal-uart.c:464
#7 0x40107303:0x3ffb1e70 in uartAttachRx at /Users/hansi/.platformio/packages/framework-arduinoespressif32/cores/esp32/esp32-hal-uart.c:464
#8 0x4010782d:0x3ffb1e90 in uartBegin at /Users/hansi/.platformio/packages/framework-arduinoespressif32/cores/esp32/esp32-hal-uart.c:464
#9 0x40103814:0x3ffb1ed0 in HardwareSerial::begin(unsigned long, unsigned int, signed char, signed char, bool, unsigned long) at /Users/hansi/.platformio/packages/framework-arduinoespressif32/cores/esp32/HardwareSerial.cpp:190
*/
Serial2.begin(115200, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd);
Serial2.write(ubx_set9k6, sizeof(ubx_set9k6));
delay(200);
Serial2.begin(38400, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd);
Serial2.write(ubx_set9k6, sizeof(ubx_set9k6));
delay(200);
Serial2.begin(19200, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd);
Serial2.write(ubx_set9k6, sizeof(ubx_set9k6));
Serial2.begin(9600, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd);
delay(1000);
dumpGPS();
Serial.println("GPS factory reset...");
Serial2.write(ubx_factorydef, sizeof(ubx_factorydef));
delay(1000);
dumpGPS();
delay(1000);
dumpGPS();
delay(1000);
dumpGPS();
LittleFS.remove("/GPSRESET"); LittleFS.remove("/GPSRESET");
} else { } else {
Serial.println("GPS reset file: not found/isdir"); Serial.println("GPS reset file: not found/isdir");
testfile.close(); if(testfile) testfile.close();
}
if(initGPSfromFile(reset)<0) { // failed, just set to 9k6
Serial2.begin(9600, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd); Serial2.begin(9600, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd);
} }
// Enable GPGST messages
Serial2.write(ubx_enable_gpgst, sizeof(ubx_enable_gpgst));
} else { } else {
//TOOD: Also use last baud statement from gps init file...
Serial2.begin(9600, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd); Serial2.begin(9600, SERIAL_8N1, sonde.config.gps_rxd, sonde.config.gps_txd);
} }
xTaskCreate( gpsTask, "gpsTask", xTaskCreate( gpsTask, "gpsTask",
@ -312,7 +382,10 @@ String ConnGPS::getStatus() {
if(sonde.config.gps_rxd==-1) strlcat(status, "disabled<br>", 256); if(sonde.config.gps_rxd==-1) strlcat(status, "disabled<br>", 256);
else if(gotNMEA==0) strlcat(status, "no data<br>", 256); else if(gotNMEA==0) strlcat(status, "no data<br>", 256);
else if(gotNMEA<0) strlcat(status, "no NMEA data<br>", 256); else if(gotNMEA<0) strlcat(status, "no NMEA data<br>", 256);
else strlcat(status, "ok<br>", 256); else {
int l = strlen(status);
snprintf(status+l, 256-l, "ok (%d NMEA, %d bad)<br>", totalNMEA, badNMEA);
}
int pos = strlen(status); int pos = strlen(status);
snprintf(status + pos, 256-pos, "GPS: valid=%d lat=%.6f lon=%.6f alt=%d<br>", gpsPos.valid, gpsPos.lat, gpsPos.lon, gpsPos.alt); snprintf(status + pos, 256-pos, "GPS: valid=%d lat=%.6f lon=%.6f alt=%d<br>", gpsPos.valid, gpsPos.lat, gpsPos.lon, gpsPos.alt);
pos = strlen(status); pos = strlen(status);

View File

@ -1,4 +1,4 @@
const char *version_name = "rdzTTGOsonde"; const char *version_name = "rdzTTGOsonde";
const char *version_id = "dev20240903"; const char *version_id = "dev20240904";
const int SPIFFS_MAJOR=3; const int SPIFFS_MAJOR=3;
const int SPIFFS_MINOR=3; const int SPIFFS_MINOR=3;