@ -143,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 " ) ;
@ -188,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, d ldo1 and dldo2 " ) ;
PMU . disableDC2 ( ) ;
PMU . disableDC5 ( ) ;
//PMU.disableDC5();
PMU . disableDLDO1 ( ) ;
PMU . disableDLDO2 ( ) ;
@ -223,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
@ -259,56 +259,6 @@ 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 ( ) ;
@ -380,25 +330,16 @@ bool TbeamSupSensorManager::begin() {
// init GPS port
Serial1 . begin ( GPS_BAUD_RATE , SERIAL_8N1 , P_GPS_RX , P_GPS_TX ) ;
bool gps_alive = false ;
for ( int i = 0 ; i < 3 ; + + i ) {
gps_alive = l76kProbe ( ) ;
if ( gps_alive ) {
MESH_DEBUG_PRINTLN ( " GPS is init and active. Shutting down for initial state. " ) ;
sleep_gps ( ) ;
return gps_alive ;
}
}
gps_active = gps_alive ;
MESH_DEBUG_PRINTLN ( " GPS init failed and GPS is not active " ) ;
return gps_alive ;
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 ) { // does requester have permission?
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 ) ;
@ -413,20 +354,21 @@ void TbeamSupSensorManager::loop() {
_nmea - > loop ( ) ;
if ( millis ( ) > next_update ) {
if ( _nmea - > isValid ( ) ) {
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
//node_alt = bme.readAltitude(SEALEVELPRESSURE_HPA);
node_temp = bme . readTemperature ( ) ;
node_hum = bme . readHumidity ( ) ;
node_pres = ( bme . readPressure ( ) / 100.0F ) ;
# ifdef MESH_DEBUG
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");
@ -442,7 +384,8 @@ void TbeamSupSensorManager::loop() {
// Serial.print("Approx. Altitude = ");
// Serial.print(node_alt);
// Serial.println(" m");
# endif
# endif
}
next_update = millis ( ) + 1000 ;
}
@ -455,7 +398,6 @@ int TbeamSupSensorManager::getNumSettings() const {
const char * TbeamSupSensorManager : : getSettingName ( int i ) const {
switch ( i ) {
case 0 : return " gps " ;
case 1 : return " bme280 " ;
default : NULL ;
}
}
@ -463,7 +405,6 @@ const char* TbeamSupSensorManager::getSettingName(int i) const {
const char * TbeamSupSensorManager : : getSettingValue ( int i ) const {
switch ( i ) {
case 0 : return gps_active = = true ? " 1 " : " 0 " ;
case 1 : return bme_active = = true ? " 1 " : " 0 " ;
default : NULL ;
}
}