|
|
|
@ -4,6 +4,10 @@ |
|
|
|
|
|
|
|
TBeamS3SupremeBoard board; |
|
|
|
|
|
|
|
#ifdef DISPLAY_CLASS |
|
|
|
DISPLAY_CLASS display; |
|
|
|
#endif |
|
|
|
|
|
|
|
bool pmuIntFlag; |
|
|
|
|
|
|
|
#ifndef LORA_CR |
|
|
|
@ -46,7 +50,7 @@ void scanDevices(TwoWire *w) |
|
|
|
switch (addr) { |
|
|
|
case 0x77: |
|
|
|
case 0x76: |
|
|
|
Serial.println("\tFound BMX280 Sensor"); |
|
|
|
Serial.println("\tFound BME280 Sensor"); |
|
|
|
deviceOnline |= BME280_ONLINE; |
|
|
|
break; |
|
|
|
case 0x34: |
|
|
|
@ -107,6 +111,26 @@ void TBeamS3SupremeBoard::printPMU() |
|
|
|
|
|
|
|
Serial.println(); |
|
|
|
} |
|
|
|
void TbeamSupSensorManager::printBMEValues() { |
|
|
|
Serial.print("Temperature = "); |
|
|
|
Serial.print(bme.readTemperature()); |
|
|
|
Serial.println(" *C"); |
|
|
|
|
|
|
|
Serial.print("Pressure = "); |
|
|
|
|
|
|
|
Serial.print(bme.readPressure() / 100.0F); |
|
|
|
Serial.println(" hPa"); |
|
|
|
|
|
|
|
Serial.print("Approx. Altitude = "); |
|
|
|
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA)); |
|
|
|
Serial.println(" m"); |
|
|
|
|
|
|
|
Serial.print("Humidity = "); |
|
|
|
Serial.print(bme.readHumidity()); |
|
|
|
Serial.println(" %"); |
|
|
|
|
|
|
|
Serial.println(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
bool TBeamS3SupremeBoard::power_init() |
|
|
|
@ -119,9 +143,9 @@ bool TBeamS3SupremeBoard::power_init() |
|
|
|
PMU.setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG); |
|
|
|
|
|
|
|
// Set up PMU interrupts
|
|
|
|
// MESH_DEBUG_PRINTLN("Setting up PMU interrupts");
|
|
|
|
// pinMode(PIN_PMU_IRQ, INPUT_PULLUP);
|
|
|
|
// attachInterrupt(PIN_PMU_IRQ, setPMUIntFlag, FALLING);
|
|
|
|
MESH_DEBUG_PRINTLN("Setting up PMU interrupts"); |
|
|
|
pinMode(PIN_PMU_IRQ, INPUT_PULLUP); |
|
|
|
attachInterrupt(PIN_PMU_IRQ, setPMUIntFlag, FALLING); |
|
|
|
|
|
|
|
// GPS
|
|
|
|
MESH_DEBUG_PRINTLN("Setting and enabling a-ldo4 for GPS"); |
|
|
|
@ -164,22 +188,22 @@ bool TBeamS3SupremeBoard::power_init() |
|
|
|
PMU.enableBLDO1(); |
|
|
|
|
|
|
|
// Out to header pins
|
|
|
|
// MESH_DEBUG_PRINTLN("Setting and enabling b-ldo2 for output to header");
|
|
|
|
// PMU.setBLDO2Voltage(3300);
|
|
|
|
// PMU.enableBLDO2();
|
|
|
|
MESH_DEBUG_PRINTLN("Setting and enabling b-ldo2 for output to header"); |
|
|
|
PMU.setBLDO2Voltage(3300); |
|
|
|
PMU.enableBLDO2(); |
|
|
|
|
|
|
|
// MESH_DEBUG_PRINTLN("Setting and enabling dcdc4 for output to header");
|
|
|
|
// PMU.setDC4Voltage(XPOWERS_AXP2101_DCDC4_VOL2_MAX); // 1.8V
|
|
|
|
// PMU.enableDC4();
|
|
|
|
MESH_DEBUG_PRINTLN("Setting and enabling dcdc4 for output to header"); |
|
|
|
PMU.setDC4Voltage(XPOWERS_AXP2101_DCDC4_VOL2_MAX); // 1.8V
|
|
|
|
PMU.enableDC4(); |
|
|
|
|
|
|
|
// MESH_DEBUG_PRINTLN("Setting and enabling dcdc5 for output to header");
|
|
|
|
// PMU.setDC5Voltage(3300);
|
|
|
|
// PMU.enableDC5();
|
|
|
|
MESH_DEBUG_PRINTLN("Setting and enabling dcdc5 for output to header"); |
|
|
|
PMU.setDC5Voltage(3300); |
|
|
|
PMU.enableDC5(); |
|
|
|
|
|
|
|
// Unused power rails
|
|
|
|
MESH_DEBUG_PRINTLN("Disabling unused supplies dcdc2, dldo1 and dldo2"); |
|
|
|
MESH_DEBUG_PRINTLN("Disabling unused supplies dcdc2, dcdc5, dldo1 and dldo2"); |
|
|
|
PMU.disableDC2(); |
|
|
|
PMU.disableDC5(); |
|
|
|
//PMU.disableDC5();
|
|
|
|
PMU.disableDLDO1(); |
|
|
|
PMU.disableDLDO2(); |
|
|
|
|
|
|
|
@ -199,18 +223,18 @@ bool TBeamS3SupremeBoard::power_init() |
|
|
|
PMU.enableVbusVoltageMeasure(); |
|
|
|
|
|
|
|
// Reset and re-enable PMU interrupts
|
|
|
|
// MESH_DEBUG_PRINTLN("Re-enable interrupts");
|
|
|
|
// PMU.disableIRQ(XPOWERS_AXP2101_ALL_IRQ);
|
|
|
|
// PMU.clearIrqStatus();
|
|
|
|
// PMU.enableIRQ(
|
|
|
|
// XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | // Battery interrupts
|
|
|
|
// XPOWERS_AXP2101_VBUS_INSERT_IRQ | XPOWERS_AXP2101_VBUS_REMOVE_IRQ | // VBUS interrupts
|
|
|
|
// XPOWERS_AXP2101_PKEY_SHORT_IRQ | XPOWERS_AXP2101_PKEY_LONG_IRQ | // Power Key interrupts
|
|
|
|
// XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | XPOWERS_AXP2101_BAT_CHG_START_IRQ // Charging interrupts
|
|
|
|
// );
|
|
|
|
MESH_DEBUG_PRINTLN("Re-enable interrupts"); |
|
|
|
PMU.disableIRQ(XPOWERS_AXP2101_ALL_IRQ); |
|
|
|
PMU.clearIrqStatus(); |
|
|
|
PMU.enableIRQ( |
|
|
|
XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | // Battery interrupts
|
|
|
|
XPOWERS_AXP2101_VBUS_INSERT_IRQ | XPOWERS_AXP2101_VBUS_REMOVE_IRQ | // VBUS interrupts
|
|
|
|
XPOWERS_AXP2101_PKEY_SHORT_IRQ | XPOWERS_AXP2101_PKEY_LONG_IRQ | // Power Key interrupts
|
|
|
|
XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | XPOWERS_AXP2101_BAT_CHG_START_IRQ // Charging interrupts
|
|
|
|
); |
|
|
|
#ifdef MESH_DEBUG |
|
|
|
// scanDevices(&Wire);
|
|
|
|
// scanDevices(&Wire1);
|
|
|
|
scanDevices(&Wire); |
|
|
|
scanDevices(&Wire1); |
|
|
|
printPMU(); |
|
|
|
#endif |
|
|
|
|
|
|
|
@ -235,60 +259,14 @@ static bool readStringUntil(Stream& s, char dest[], size_t max_len, char term, u |
|
|
|
return millis() < timeout; // false, if timed out
|
|
|
|
} |
|
|
|
|
|
|
|
static 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; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
Serial1.flush(); |
|
|
|
delay(200); |
|
|
|
|
|
|
|
Serial1.write("$PCAS06,0*1B\r\n"); |
|
|
|
|
|
|
|
char ver[100]; |
|
|
|
if (!readStringUntil(Serial1, ver, sizeof(ver), '\n', 500)) { |
|
|
|
MESH_DEBUG_PRINTLN("Get L76K timeout!"); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
if (memcmp(ver, "$GPTXT,01,01,02", 15) == 0) { |
|
|
|
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() { |
|
|
|
fallback_clock.begin(); |
|
|
|
|
|
|
|
rtc_clock.begin(Wire1); |
|
|
|
|
|
|
|
// #ifdef MESH_DEBUG
|
|
|
|
// printBMEValues();
|
|
|
|
// #endif
|
|
|
|
|
|
|
|
#ifdef SX126X_DIO3_TCXO_VOLTAGE |
|
|
|
float tcxo = SX126X_DIO3_TCXO_VOLTAGE; |
|
|
|
@ -340,55 +318,95 @@ void TbeamSupSensorManager::sleep_gps() { |
|
|
|
} |
|
|
|
|
|
|
|
bool TbeamSupSensorManager::begin() { |
|
|
|
//init BME280
|
|
|
|
if (! bme.begin(0x77, &Wire)) { |
|
|
|
MESH_DEBUG_PRINTLN("Could not find a valid BME280 sensor"); |
|
|
|
bme_active = false; |
|
|
|
} |
|
|
|
else |
|
|
|
MESH_DEBUG_PRINTLN("BME280 found and init!"); |
|
|
|
bme_active = true; |
|
|
|
|
|
|
|
// 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; |
|
|
|
MESH_DEBUG_PRINTLN("Sleeping GPS for initial state"); |
|
|
|
sleep_gps(); |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
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, node_altitude); |
|
|
|
} |
|
|
|
if (requester_permissions & TELEM_PERM_ENVIRONMENT && bme_active) { // does requester have permission?
|
|
|
|
telemetry.addTemperature(TELEM_CHANNEL_SELF, node_temp); |
|
|
|
telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, node_hum); |
|
|
|
telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, node_pres); |
|
|
|
//telemetry.addAltitude(TELEM_CHANNEL_SELF, node_alt);
|
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
void TbeamSupSensorManager::loop() { |
|
|
|
static long next_gps_update = 0; |
|
|
|
static long next_update = 0; |
|
|
|
|
|
|
|
_nmea->loop(); |
|
|
|
|
|
|
|
if (millis() > next_gps_update) { |
|
|
|
if (_nmea->isValid()) { |
|
|
|
if (millis() > next_update) { |
|
|
|
if (_nmea->isValid() && gps_active) { |
|
|
|
node_lat = ((double)_nmea->getLatitude())/1000000.; |
|
|
|
node_lon = ((double)_nmea->getLongitude())/1000000.; |
|
|
|
node_altitude = ((double)_nmea->getAltitude()) / 1000.0; |
|
|
|
//Serial.printf("lat %f lon %f\r\n", _lat, _lon);
|
|
|
|
MESH_DEBUG_PRINT("lat %f lon %f alt %f\r\n", node_lat, node_lon, node_altitude); |
|
|
|
} |
|
|
|
|
|
|
|
//read BME280 values
|
|
|
|
if(bme_active){ |
|
|
|
//node_alt = bme.readAltitude(SEALEVELPRESSURE_HPA);
|
|
|
|
node_temp = bme.readTemperature(); |
|
|
|
node_hum = bme.readHumidity(); |
|
|
|
node_pres = (bme.readPressure() / 100.0F); |
|
|
|
|
|
|
|
#ifdef MESH_DEBUG |
|
|
|
// Serial.print("Temperature = ");
|
|
|
|
// Serial.print(node_temp);
|
|
|
|
// Serial.println(" *C");
|
|
|
|
|
|
|
|
// Serial.print("Humidity = ");
|
|
|
|
// Serial.print(node_hum);
|
|
|
|
// Serial.println(" %");
|
|
|
|
|
|
|
|
// Serial.print("Pressure = ");
|
|
|
|
// Serial.print(node_pres);
|
|
|
|
// Serial.println(" hPa");
|
|
|
|
|
|
|
|
// Serial.print("Approx. Altitude = ");
|
|
|
|
// Serial.print(node_alt);
|
|
|
|
// Serial.println(" m");
|
|
|
|
#endif |
|
|
|
} |
|
|
|
next_gps_update = millis() + 1000; |
|
|
|
|
|
|
|
next_update = millis() + 1000; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int TbeamSupSensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch)
|
|
|
|
int TbeamSupSensorManager::getNumSettings() const { |
|
|
|
return sensorNum; |
|
|
|
} |
|
|
|
|
|
|
|
const char* TbeamSupSensorManager::getSettingName(int i) const { |
|
|
|
return i == 0 ? "gps" : NULL; |
|
|
|
switch(i){ |
|
|
|
case 0: return "gps"; |
|
|
|
default: NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const char* TbeamSupSensorManager::getSettingValue(int i) const { |
|
|
|
if (i == 0) { |
|
|
|
return gps_active ? "1" : "0"; |
|
|
|
switch(i){ |
|
|
|
case 0: return gps_active == true ? "1" : "0"; |
|
|
|
default: NULL; |
|
|
|
} |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
bool TbeamSupSensorManager::setSettingValue(const char* name, const char* value) { |
|
|
|
|