diff --git a/src/ButtonThread.h b/src/ButtonThread.h index 597a2bb9..3fc11bc3 100644 --- a/src/ButtonThread.h +++ b/src/ButtonThread.h @@ -78,10 +78,6 @@ class ButtonThread : public concurrency::OSThread #ifdef BUTTON_PIN_TOUCH userButtonTouch = OneButton(BUTTON_PIN_TOUCH, true, true); -#ifdef INPUT_PULLUP_SENSE - // Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did - pinMode(BUTTON_PIN_TOUCH, INPUT_PULLUP_SENSE); -#endif userButtonTouch.attachClick(touchPressed); wakeOnIrq(BUTTON_PIN_TOUCH, FALLING); #endif diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index b9346fa0..ee210e9a 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -22,6 +22,52 @@ GPS *gps; /// only init that port once. static bool didSerialInit; +bool GPS::getACK(uint8_t c, uint8_t i) { + uint8_t b; + uint8_t ack = 0; + const uint8_t ackP[2] = {c, i}; + uint8_t buf[250]; + unsigned long startTime = millis(); + + buf[0] = 0xB5; + buf[1] = 0x62; + buf[2] = 0x05; + buf[3] = 0x01; + buf[4] = 0x02; + buf[5] = 0x00; + buf[8] = 0x00; + buf[9] = 0x00; + + for (int j = 2; j < 6; j++) { + buf[8] += buf[j]; + buf[9] += buf[8]; + } + + for (int j = 0; j < 2; j++) { + buf[6 + j] = ackP[j]; + buf[8] += buf[6 + j]; + buf[9] += buf[8]; + } + + while (1) { + if (ack > 9) { + return true; + } + if (millis() - startTime > 2000) { + return false; + } + if (_serial_gps->available()) { + b = _serial_gps->read(); + if (b == buf[ack]) { + ack++; + } + else { + ack = 0; + } + } + } +} + bool GPS::setupGPS() { if (_serial_gps && !didSerialInit) { @@ -37,13 +83,17 @@ bool GPS::setupGPS() _serial_gps->setRxBufferSize(2048); // the default is 256 #endif #ifdef TTGO_T_ECHO - // Switch to 4800 baud, then close and reopen port - _serial_gps->write("$PCAS01,0*1C\r\n"); - delay(250); + // Switch to 9600 baud, then close and reopen port _serial_gps->end(); delay(250); _serial_gps->begin(4800); delay(250); + _serial_gps->write("$PCAS01,1*1D\r\n"); + delay(250); + _serial_gps->end(); + delay(250); + _serial_gps->begin(9600); + delay(250); // Initialize the L76K Chip, use GPS + GLONASS _serial_gps->write("$PCAS04,5*1C\r\n"); delay(250); @@ -60,37 +110,37 @@ bool GPS::setupGPS() byte _message_nmea[] = {0xB5, 0x62, 0x06, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x08, 0x00, 0x00, 0x80, 0x25, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0xAF}; _serial_gps->write(_message_nmea, sizeof(_message_nmea)); - delay(250); + if (!getACK(0x06, 0x00)) DEBUG_MSG("WARNING: Unable to set UART.\n"); // disable GGL byte _message_GGL[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x05, 0x3A}; _serial_gps->write(_message_GGL, sizeof(_message_GGL)); - delay(250); + if (!getACK(0x06, 0x01)) DEBUG_MSG("WARNING: Unable to disable NMEA GGL.\n"); // disable GSA byte _message_GSA[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x06, 0x41}; _serial_gps->write(_message_GSA, sizeof(_message_GSA)); - delay(250); + if (!getACK(0x06, 0x01)) DEBUG_MSG("WARNING: Unable to disable NMEA GSA.\n"); // disable GSV byte _message_GSV[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x03, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x07, 0x48}; _serial_gps->write(_message_GSV, sizeof(_message_GSV)); - delay(250); + if (!getACK(0x06, 0x01)) DEBUG_MSG("WARNING: Unable to disable NMEA GSV.\n"); // disable VTG byte _message_VTG[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x09, 0x56}; _serial_gps->write(_message_VTG, sizeof(_message_VTG)); - delay(250); + if (!getACK(0x06, 0x01)) DEBUG_MSG("WARNING: Unable to disable NMEA VTG.\n"); // enable RMC byte _message_RMC[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x09, 0x54}; _serial_gps->write(_message_RMC, sizeof(_message_RMC)); - delay(250); + if (!getACK(0x06, 0x01)) DEBUG_MSG("WARNING: Unable to enable NMEA RMC.\n"); // enable GGA byte _message_GGA[] = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x38}; _serial_gps->write(_message_GGA, sizeof(_message_GGA)); - delay(250); + if (!getACK(0x06, 0x01)) DEBUG_MSG("WARNING: Unable to enable NMEA GGA.\n"); #endif } diff --git a/src/gps/GPS.h b/src/gps/GPS.h index 999f88bf..dc7ab389 100644 --- a/src/gps/GPS.h +++ b/src/gps/GPS.h @@ -135,6 +135,8 @@ class GPS : private concurrency::OSThread */ uint32_t getSleepTime() const; + bool getACK(uint8_t c, uint8_t i); + /** * Tell users we have new GPS readings */