|
@@ -1,5 +1,6 @@
|
|
|
#include <Arduino.h>
|
|
#include <Arduino.h>
|
|
|
#include "target.h"
|
|
#include "target.h"
|
|
|
|
|
+#include <helpers/sensors/MicroNMEALocationProvider.h>
|
|
|
|
|
|
|
|
TBeamS3SupremeBoard board;
|
|
TBeamS3SupremeBoard board;
|
|
|
|
|
|
|
@@ -20,7 +21,8 @@ WRAPPER_CLASS radio_driver(radio, board);
|
|
|
|
|
|
|
|
ESP32RTCClock fallback_clock;
|
|
ESP32RTCClock fallback_clock;
|
|
|
AutoDiscoverRTCClock rtc_clock(fallback_clock);
|
|
AutoDiscoverRTCClock rtc_clock(fallback_clock);
|
|
|
-SensorManager sensors;
|
|
|
|
|
|
|
+MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1);
|
|
|
|
|
+TbeamSupSensorManager sensors = TbeamSupSensorManager(nmea);
|
|
|
|
|
|
|
|
static void setPMUIntFlag(){
|
|
static void setPMUIntFlag(){
|
|
|
pmuIntFlag = true;
|
|
pmuIntFlag = true;
|
|
@@ -74,9 +76,9 @@ bool TBeamS3SupremeBoard::power_init()
|
|
|
MESH_DEBUG_PRINTLN("Reset a-ldo1&2 and b-ldo1");
|
|
MESH_DEBUG_PRINTLN("Reset a-ldo1&2 and b-ldo1");
|
|
|
if (ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause())
|
|
if (ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause())
|
|
|
{
|
|
{
|
|
|
- PMU.enableALDO1();
|
|
|
|
|
- PMU.enableALDO2();
|
|
|
|
|
- PMU.enableBLDO1();
|
|
|
|
|
|
|
+ PMU.disableALDO1();
|
|
|
|
|
+ PMU.disableALDO2();
|
|
|
|
|
+ PMU.disableBLDO1();
|
|
|
delay(250);
|
|
delay(250);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -121,7 +123,7 @@ bool TBeamS3SupremeBoard::power_init()
|
|
|
|
|
|
|
|
// Set charge current to 300mA
|
|
// Set charge current to 300mA
|
|
|
MESH_DEBUG_PRINTLN("Setting battery charge current limit and voltage");
|
|
MESH_DEBUG_PRINTLN("Setting battery charge current limit and voltage");
|
|
|
- PMU.setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_300MA);
|
|
|
|
|
|
|
+ PMU.setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_500MA);
|
|
|
PMU.setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2);
|
|
PMU.setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2);
|
|
|
|
|
|
|
|
// enable battery voltage measurement
|
|
// enable battery voltage measurement
|
|
@@ -147,6 +149,59 @@ bool TBeamS3SupremeBoard::power_init()
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool l76kProbe()
|
|
|
|
|
+{
|
|
|
|
|
+ bool result = false;
|
|
|
|
|
+ uint32_t startTimeout ;
|
|
|
|
|
+ Serial1.write("$PCAS03,0,0,0,0,0,0,0,0,0,0,,,0,0*02\r\n");
|
|
|
|
|
+ delay(5);
|
|
|
|
|
+ // Get version information
|
|
|
|
|
+ startTimeout = millis() + 3000;
|
|
|
|
|
+ MESH_DEBUG_PRINTLN("Trying to init L76K GPS");
|
|
|
|
|
+ // Serial1.flush();
|
|
|
|
|
+ while (Serial1.available()) {
|
|
|
|
|
+ int c = Serial1.read();
|
|
|
|
|
+ // Serial.write(c);
|
|
|
|
|
+ // Serial.print(".");
|
|
|
|
|
+ // Serial.flush();
|
|
|
|
|
+ // Serial1.flush();
|
|
|
|
|
+ if (millis() > startTimeout) {
|
|
|
|
|
+ MESH_DEBUG_PRINTLN("L76K NMEA timeout!");
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+ Serial.println();
|
|
|
|
|
+ Serial1.flush();
|
|
|
|
|
+ delay(200);
|
|
|
|
|
+
|
|
|
|
|
+ Serial1.write("$PCAS06,0*1B\r\n");
|
|
|
|
|
+ startTimeout = millis() + 500;
|
|
|
|
|
+ String ver = "";
|
|
|
|
|
+ while (!Serial1.available()) {
|
|
|
|
|
+ if (millis() > startTimeout) {
|
|
|
|
|
+ MESH_DEBUG_PRINTLN("Get L76K timeout!");
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ Serial1.setTimeout(10);
|
|
|
|
|
+ ver = Serial1.readStringUntil('\n');
|
|
|
|
|
+ if (ver.startsWith("$GPTXT,01,01,02")) {
|
|
|
|
|
+ MESH_DEBUG_PRINTLN("L76K GNSS init succeeded, using L76K GNSS Module\n");
|
|
|
|
|
+ result = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ delay(500);
|
|
|
|
|
+
|
|
|
|
|
+ // Initialize the L76K Chip, use GPS + GLONASS
|
|
|
|
|
+ Serial1.write("$PCAS04,5*1C\r\n");
|
|
|
|
|
+ delay(250);
|
|
|
|
|
+ // only ask for RMC and GGA
|
|
|
|
|
+ Serial1.write("$PCAS03,1,0,0,0,1,0,0,0,0,0,,,0,0*02\r\n");
|
|
|
|
|
+ delay(250);
|
|
|
|
|
+ // Switch to Vehicle Mode, since SoftRF enables Aviation < 2g
|
|
|
|
|
+ Serial1.write("$PCAS11,3*1E\r\n");
|
|
|
|
|
+ return result;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
bool radio_init() {
|
|
bool radio_init() {
|
|
|
fallback_clock.begin();
|
|
fallback_clock.begin();
|
|
|
Wire1.begin(PIN_BOARD_SDA1,PIN_BOARD_SCL1);
|
|
Wire1.begin(PIN_BOARD_SDA1,PIN_BOARD_SCL1);
|
|
@@ -188,6 +243,82 @@ void radio_set_tx_power(uint8_t dbm) {
|
|
|
radio.setOutputPower(dbm);
|
|
radio.setOutputPower(dbm);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void TbeamSupSensorManager::start_gps()
|
|
|
|
|
+{
|
|
|
|
|
+ gps_active = true;
|
|
|
|
|
+ pinMode(P_GPS_WAKE, OUTPUT);
|
|
|
|
|
+ digitalWrite(P_GPS_WAKE, HIGH);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void TbeamSupSensorManager::sleep_gps() {
|
|
|
|
|
+ gps_active = false;
|
|
|
|
|
+ pinMode(P_GPS_WAKE, OUTPUT);
|
|
|
|
|
+ digitalWrite(P_GPS_WAKE, LOW);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool TbeamSupSensorManager::begin() {
|
|
|
|
|
+ // init GPS port
|
|
|
|
|
+
|
|
|
|
|
+ Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, P_GPS_RX, P_GPS_TX);
|
|
|
|
|
+
|
|
|
|
|
+ bool result = false;
|
|
|
|
|
+ for ( int i = 0; i < 3; ++i) {
|
|
|
|
|
+ result = l76kProbe();
|
|
|
|
|
+ if (result) {
|
|
|
|
|
+ gps_active = true;
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return result;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool TbeamSupSensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) {
|
|
|
|
|
+ if (requester_permissions & TELEM_PERM_LOCATION) { // does requester have permission?
|
|
|
|
|
+ telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, 0.0f);
|
|
|
|
|
+ }
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void TbeamSupSensorManager::loop() {
|
|
|
|
|
+ static long next_gps_update = 0;
|
|
|
|
|
+
|
|
|
|
|
+ _nmea->loop();
|
|
|
|
|
+
|
|
|
|
|
+ if (millis() > next_gps_update) {
|
|
|
|
|
+ if (_nmea->isValid()) {
|
|
|
|
|
+ node_lat = ((double)_nmea->getLatitude())/1000000.;
|
|
|
|
|
+ node_lon = ((double)_nmea->getLongitude())/1000000.;
|
|
|
|
|
+ //Serial.printf("lat %f lon %f\r\n", _lat, _lon);
|
|
|
|
|
+ }
|
|
|
|
|
+ next_gps_update = millis() + 1000;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+int TbeamSupSensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch)
|
|
|
|
|
+
|
|
|
|
|
+const char* TbeamSupSensorManager::getSettingName(int i) const {
|
|
|
|
|
+ return i == 0 ? "gps" : NULL;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const char* TbeamSupSensorManager::getSettingValue(int i) const {
|
|
|
|
|
+ if (i == 0) {
|
|
|
|
|
+ return gps_active ? "1" : "0";
|
|
|
|
|
+ }
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool TbeamSupSensorManager::setSettingValue(const char* name, const char* value) {
|
|
|
|
|
+ if (strcmp(name, "gps") == 0) {
|
|
|
|
|
+ if (strcmp(value, "0") == 0) {
|
|
|
|
|
+ sleep_gps();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ start_gps();
|
|
|
|
|
+ }
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return false; // not supported
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
mesh::LocalIdentity radio_new_identity() {
|
|
mesh::LocalIdentity radio_new_identity() {
|
|
|
RadioNoiseListener rng(radio);
|
|
RadioNoiseListener rng(radio);
|
|
|
return mesh::LocalIdentity(&rng); // create new random identity
|
|
return mesh::LocalIdentity(&rng); // create new random identity
|