From 5a1a6d7d5a3545e6ce8bad2ae92b33128813ee58 Mon Sep 17 00:00:00 2001 From: Thomas Osterried Date: Sat, 15 Jul 2023 12:04:47 +0200 Subject: [PATCH] Now with axp1201 support (T-BEAM V1.2) - Support for T-BEAM V1.2 (axp1201 power chip), T-BEAM V1.1 and V.0 used the axp192. Unfortunately, this new chip is not able to read current load. In the case of telemetry, we do not drop the current readings (but set it to 0). This notation may change in future. - Feature for needed in SP: enable TX on main and secondary frequency as user. Signed-off-by: Thomas Osterried --- data_embed/index.html | 3 +- platformio.ini | 14 ++ src/TTGO_T-Beam_LoRa_APRS.ino | 271 ++++++++++++++++++++++++---------- src/taskGPS.cpp | 2 +- src/taskWebServer.cpp | 28 +++- 5 files changed, 234 insertions(+), 84 deletions(-) diff --git a/data_embed/index.html b/data_embed/index.html index c101eb3..c042d73 100644 --- a/data_embed/index.html +++ b/data_embed/index.html @@ -464,6 +464,7 @@ III: Values above are referring to latitude; distance between two latitudes is a + @@ -575,7 +576,7 @@ III: Values above are referring to latitude; distance between two latitudes is a
- +
diff --git a/platformio.ini b/platformio.ini index deb71ac..dfed001 100644 --- a/platformio.ini +++ b/platformio.ini @@ -73,6 +73,20 @@ build_flags = -D ENABLE_SYSLOG -D ENABLE_BLUETOOTH +[env:ttgo-t-beam-v1_2] +platform = espressif32 @ 3.5.0 +board = ttgo-t-beam +build_flags = + ${env.build_flags} + -D T_BEAM_V1_2 + -D ENABLE_WIFI + -D ENABLE_SYSLOG + -D ENABLE_BLUETOOTH +lib_deps = + ${env.lib_deps} + https://github.com/lewisxhe/XPowersLib + + [env:ttgo-t-beam-v0_7] platform = espressif32 @ 3.5.0 board = ttgo-t-beam diff --git a/src/TTGO_T-Beam_LoRa_APRS.ino b/src/TTGO_T-Beam_LoRa_APRS.ino index f03a1d9..c30f95e 100644 --- a/src/TTGO_T-Beam_LoRa_APRS.ino +++ b/src/TTGO_T-Beam_LoRa_APRS.ino @@ -19,7 +19,12 @@ #include #include #include +#ifdef T_BEAM_V1_2 +#define XPOWERS_CHIP_AXP2101 +#include +#else #include +#endif #include #include #include "taskGPS.h" @@ -60,7 +65,7 @@ String wifi_info; // saving wifi info (CLI|AP|dis) for Oled. If W #define SPI_ss 18 // IO config -#ifdef T_BEAM_V1_0 +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) #define I2C_SDA 21 #define I2C_SCL 22 #define BUTTON 38 //pin number for Button on TTGO T-Beam @@ -141,7 +146,7 @@ String aprsis_callsign = ""; String aprsis_password = "-1"; uint8_t aprsis_data_allow_inet_to_rf = 0; // 0: disable (default). 1: gate to main qrg. 2: gate to secondary qrg. 3: gate to both frequencies extern void do_send_status_message_about_reboot_to_aprsis(); -#ifdef T_BEAM_V1_0 +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) extern void do_send_status_message_about_shutdown_to_aprsis(); #endif #endif @@ -186,7 +191,7 @@ int position_ambiguity = 0; // 0: default, compressed. -1: uncompressed. -2: unc String aprsPresetShown = "P"; //double lastTxdistance = 0; -#if defined(T_BEAM_V1_0) || defined(T_BEAM_V0_7) +#if defined(T_BEAM_V1_2) || defined(T_BEAM_V1_0) || defined(T_BEAM_V0_7) boolean gps_state = true; #else boolean gps_state = false; @@ -435,7 +440,7 @@ uint8_t lora_cross_digipeating_mode = 0; // 0: disable cross freq digipeating. 1 #define FLAG_ADD_SNR_RSSI_FOR_APRSIS__ONLY_IF_HEARD_DIRECT 32 uint8_t lora_add_snr_rssi_to_path = (FLAG_ADD_SNR_RSSI_FOR_KISS | FLAG_ADD_SNR_RSSI_FOR_APRSIS__ONLY_IF_HEARD_DIRECT); // Add snr+rssi to path. May become default, after it proves it behaves good to our network boolean kiss_add_snr_rssi_to_path_at_position_without_digippeated_flag = 1; // Add snr+rssi at last digipeater, without digipeated flag, at last position in path. Set to 1, if you pass data to aprs-is. Set to 0 if you pass data to your favourite digipeater software. We need this hack because our rssi-encoded data should not be interpreted as "(last ==) direct heard station" in the aprs-is net. -int tx_own_beacon_from_this_device_or_fromKiss__to_frequencies = 1; // TX own beacon generated from this device or our beacon from from-kiss on following frequencies. Only if lora_digipeating_mode > 1 (we are a WIDE1 or WIDE2 digi). 1: main freq. 2: cross_digi_freq. 3: both frequencies +int tx_own_beacon_from_this_device_or_fromKiss__to_frequencies = 1; // TX own beacon generated from this device or our beacon from from-kiss on following frequencies. Only if lora_digipeating_mode > 1 (we are a WIDE1 or WIDE2 digi). 1: main freq. 2: cross_digi_freq. 3: both frequencies. 4: special case for SP (allow sending on both frequencies, even if wie are not a WIDE digi; not recommended) boolean tx_own_beacon_from_this_device_or_fromKiss__to_aprsis = true; // TX own beacon generated from this device or our beacon from from-kiss to aprs-is. int rx_on_frequencies = 1; // RX freq. Only if lora_digipeating_mode < 2 (we are a user) 1: main freq. 2: cross_digi_freq. 3: both frequencies @@ -486,6 +491,8 @@ static const adc_atten_t atten = ADC_ATTEN_DB_6; static const adc_unit_t unit = ADC_UNIT_1; #ifdef T_BEAM_V1_0 AXP20X_Class axp; +#elif T_BEAM_V1_2 + XPowersAXP2101 axp; #endif @@ -914,7 +921,7 @@ void sendpacket(uint8_t sp_flags){ if (lora_tx_enabled && tx_own_beacon_from_this_device_or_fromKiss__to_frequencies) { if (tx_own_beacon_from_this_device_or_fromKiss__to_frequencies % 2) loraSend(txPower, lora_freq, lora_speed, (sp_flags & SP_ENFORCE_COURSE) ? LORA_FLAGS_NODELAY : 0, outString); //send the packet, data is in TXbuff from lora_TXStart to lora_TXEnd - if (tx_own_beacon_from_this_device_or_fromKiss__to_frequencies > 1 && lora_digipeating_mode > 1 && lora_freq_cross_digi > 1.0 && lora_freq_cross_digi != lora_freq) + if (((tx_own_beacon_from_this_device_or_fromKiss__to_frequencies > 1 && lora_digipeating_mode > 1) || tx_own_beacon_from_this_device_or_fromKiss__to_frequencies == 4) && lora_freq_cross_digi > 1.0 && lora_freq_cross_digi != lora_freq) loraSend(txPower_cross_digi, lora_freq_cross_digi, lora_speed_cross_digi, (sp_flags & SP_ENFORCE_COURSE) ? LORA_FLAGS_NODELAY : 0, outString); //send the packet, data is in TXbuff from lora_TXStart to lora_TXEnd } lastTX = millis(); @@ -990,6 +997,9 @@ void loraSend(byte lora_LTXPower, float lora_FREQ, ulong lora_SPEED, uint8_t fla esp_task_wdt_reset(); #ifdef T_BEAM_V1_0 axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); // switch LoRa chip on +#elif T_BEAM_V1_2 + axp.setALDO2Voltage(3300); + axp.enableALDO2(); // switch LoRa chip on #endif //byte array @@ -1017,7 +1027,7 @@ void loraSend(byte lora_LTXPower, float lora_FREQ, ulong lora_SPEED, uint8_t fla } if (lora_SPEED != lora_speed_rx_curr) lora_set_speed(lora_speed_rx_curr); -#ifdef T_BEAM_V1_0 +#if (T_BEAM_V1_0) || defined(T_BEAM_V1_2) // if lora_rx is disabled, but ONLY if lora_digipeating_mode == 0 AND no SerialBT.hasClient is connected, // we can savely go to sleep if (! (lora_rx_enabled || lora_digipeating_mode > 0 @@ -1025,8 +1035,13 @@ void loraSend(byte lora_LTXPower, float lora_FREQ, ulong lora_SPEED, uint8_t fla || (enable_bluetooth && SerialBT.hasClient()) #endif ) ) - axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); // switch LoRa chip off + #ifdef T_BEAM_V1_0 + axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); // switch LoRa chip off + #else + axp.disableALDO2(); // switch LoRa chip off + #endif #endif + esp_task_wdt_reset(); // release lock #ifdef IF_SEMAS_WOULD_WORK xSemaphoreGive(sema_lora_chip); @@ -1038,9 +1053,9 @@ void loraSend(byte lora_LTXPower, float lora_FREQ, ulong lora_SPEED, uint8_t fla void batt_read(){ -#ifdef T_BEAM_V1_0 - BattVolts = axp.getBattVoltage()/1000; - InpVolts = axp.getVbusVoltage()/1000; +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) + BattVolts = ((float ) axp.getBattVoltage())/1000.0; + InpVolts = ((float ) axp.getVbusVoltage())/1000.0; #elif T_BEAM_V0_7 InpVolts = (((float)analogRead(35) / 8192.0) * 2.0 * 3.3 * (1100.0 / 1000.0))+0.41; // fixed thanks to Luca IU2FRL //InpVolts = adc1_get_raw(ADC1_CHANNEL_7)/1000; @@ -1073,19 +1088,24 @@ void writedisplaytext(String HeaderTxt, String Line1, String Line2, String Line3 #ifdef notdef if (InpVolts < 1.0) { if (BattVolts < 3.5 && BattVolts > 3.3){ - #ifdef T_BEAM_V1_0 - #ifdef ENABLE_LED_SIGNALING + #ifdef ENABLE_LED_SIGNALING + #ifdef T_BEAM_V1_0 axp.setChgLEDMode(AXP20X_LED_BLINK_4HZ); - #endif + #elif T_BEAM_V1_2 + axp.setChargingLedMode(XPOWERS_CHG_LED_BLINK_4HZ); + #endif #endif } else if (BattVolts <= 3.3) { #ifdef T_BEAM_V1_0 axp.setChgLEDMode(AXP20X_LED_OFF); - //axp.shutdown(); <-we need fix this + #elif T_BEAM_V1_2 + axp.setChargingLedMode(XPOWERS_CHG_LED_OFF); + #endif + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) #ifdef ENABLE_WIFI do_send_status_message_about_shutdown_to_aprsis(); #endif - axp.shutdown(); + //axp.shutdown(); <-we need fix this #endif } } @@ -1311,19 +1331,23 @@ String getSatAndBatInfo() { } else { line5 = line5 + " B:" + String(BattVolts, 2) + "V"; } -#else - line5 = line5 + " P:" + String(InpVolts, 2) + "V"; -#endif -#ifdef T_BEAM_V1_0 String charge = ""; if (b_c_out > 0) { charge = "-" + String(b_c_out); } else if (b_c_in > 0) { charge = String(b_c_in); } else { - charge = "-" + String((int ) axp.getVbusCurrent()); + charge = String((int ) axp.getVbusCurrent()); } line5 = line5 + "/" + charge + "mA"; +#elif T_BEAM_V1_2 + if (InpVolts > 1.0) { + line5 = line5 + " P:" + String(InpVolts, 2) + "V"; + } else { + line5 = line5 + " B:" + String(BattVolts, 2) + "V"; + } +#else + line5 = line5 + " P:" + String(InpVolts, 2) + "V"; #endif #if defined(ENABLE_BLUETOOTH) && defined(KISS_PROTOCOL) if (line5.length() < 21-3 && enable_bluetooth && SerialBT.hasClient()) { @@ -1429,11 +1453,15 @@ void fillDisplayLines3to5(int force) { if (oled_line3and4_format == 0) { if (show_locator) { OledLine3 = aprsLatLonAsMaidenheadGridLocator + " " + aprsPresetShown; - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) // field for extended use, i.e. temp, pressure, humidity if (aprsLatLonAsMaidenheadGridLocator.length() + 1 + 1 + + 12 <= 21) { + #ifdef T_BEAM_V1_0 + float t_AXP = axp.getTemp(); + #elif T_BEAM_V1_2 + float t_AXP = axp.getTemperature(); + #endif char sensor_data[13] = { 0 } ; // room for 12 + \0 == 13 - float t_AXP = axp.getTemp(); if (t_AXP < -9.9) t_AXP = -9.9; else if (t_AXP > 99.9) t_AXP = 99.9; sprintf(sensor_data, " tAXP:%.1f%cC", t_AXP, '\xF7'); OledLine3 = OledLine3 + String(sensor_data); @@ -1501,8 +1529,12 @@ void fillDisplayLines3to5(int force) { if (show_locator) { // field for extended use, i.e. temp, pressure, humidity char sensor_data[12] = { 0 } ; // room for 11 + \0 == 12 - #ifdef T_BEAM_V1_0 - float t_AXP = axp.getTemp(); + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) + #ifdef T_BEAM_V1_0 + float t_AXP = axp.getTemp(); + #elif T_BEAM_V1_2 + float t_AXP = axp.getTemperature(); + #endif if (t_AXP < -9.9) t_AXP = -9.9; else if (t_AXP > 99.9) t_AXP = 99.9; sprintf(sensor_data, "tAXP:%.1f%cC", t_AXP, '\xF7'); #endif @@ -1708,7 +1740,12 @@ uint32_t next_time_to_send_telemetry_EqnsParmUnitBITS = 0L; // We may add axp temperature either if we have no battery (B V, B C out, B C in 0), // or if no USB is plugeed in (B C in will be 0). -> We could use the position // of B C in. We decided this on boot and remember, - boolean may_add_temperature = (!axp.isVBUSPlug() || axp.getBattVoltage() < 1); + boolean may_add_temperature = (!axp.isVBUSPlug() || (float ) axp.getBattVoltage() < 1000.0); +#elif T_BEAM_V1_2 + //boolean may_add_temperature = (!axp.isVbusInsertOnSource() || (float ) axp.getBattVoltage() < 1000.0); + // until we can't get current load (axp.xxxCurrent() is not available by the 2101 driver), + // we always have a free field for adding a temperature measurement + boolean may_add_temperature = true; #endif #define ALSO_SEND_Telemetry_BITS 0 // Set this to 1 if you need to send also the "digital BITS packet" @@ -1750,7 +1787,7 @@ void sendTelemetryFrame() { s = String("EQNS."); //s = s + "0,5.1,3000"; s = s + "0,33.8,0"; - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) //s = s + ",0,10,0" + ",0,10,0" + ",0,28,3000" + ",0,10,0"; s = s + ",0,10,0" + ",0,16.9,0" + ",0,10,0"; if (may_add_temperature) @@ -1766,7 +1803,7 @@ void sendTelemetryFrame() { s = String("PARM."); //s = s + "B Volt"; s = s + "P V"; - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) //s = s + ",B In" + ",B Out" + ",AC V" + ",AC C"; s = s + ",P C" + ",B V" + ",BCout"; if (may_add_temperature) @@ -1783,7 +1820,7 @@ void sendTelemetryFrame() { // Item lengths are strict. Look at spec! s = String("UNIT."); s = s + "mV"; - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) //s = s + ",mA" + ",mA" + ",mV" + ",mA"; s = s + ",mA" + ",mV" + ",mA"; if (may_add_temperature) @@ -1927,20 +1964,27 @@ void sendTelemetryFrame() { // min(): because we obviously measured 4.3.11. Result is 257 and sent value 2. // Working with uint8_t is a good decision, because due to spec, the value must not // be greater than 255, because it's the numeric representation of an 8 bit value. - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) // No, batteries or external power may not be present -> do not start at 3000 mW - //uint8_t dc_volt = min((int ) (((axp.getVbusVoltage() - 3000) / 28), 255); - uint8_t dc_volt = min((int ) (axp.getVbusVoltage() / 33.8), 255); - uint8_t dc_c = min((int ) (axp.getVbusCurrent() / 10), 255); - //uint8_t b_volt = min((int ) (((axp.getBattVoltage() - 3000) / 5.1), 255); - uint8_t b_volt = min((int ) (axp.getBattVoltage() / 16.9), 255); - uint8_t b_c_out = min((int ) (axp.getBattDischargeCurrent() / 10), 255); - uint8_t b_c_in = may_add_temperature ? 0 : min((int ) (axp.getBattChargeCurrent() / 10), 255); - uint8_t axp_temperature = may_add_temperature ? max(min((int ) ((axp.getTemp() + 5) / 0.25), 255), 0) : 0; + //uint8_t dc_volt = max(0, min((int ) (((((float ) axp.getVbusVoltage()) - 3000.0) / 28), 255))); + uint8_t dc_volt = max(0, min((int ) (((float ) axp.getVbusVoltage()) / 33.8), 255)); + //uint8_t b_volt = max(0, min((int ) (((((float ) axp.getBattVoltage()) - 3000.0) / 5.1), 255))); + uint8_t b_volt = max(0, min((int ) (((float ) axp.getBattVoltage()) / 16.9), 255)); + #ifdef T_BEAM_V1_0 + uint8_t dc_c = max(0, min((int ) (axp.getVbusCurrent() / 10), 255)); + uint8_t b_c_out = max(0, min((int ) (axp.getBattDischargeCurrent() / 10), 255)); + uint8_t b_c_in = may_add_temperature ? 0 : min((int ) (axp.getBattChargeCurrent() / 10), 255); + uint8_t axp_temperature = may_add_temperature ? max(min((int ) ((axp.getTemp() + 5) / 0.25), 255), 0) : 0; + #elif T_BEAM_V1_2 + uint8_t dc_c = 0; + uint8_t b_c_out = 0; + uint8_t b_c_in = 0; + uint8_t axp_temperature = max(min((int ) ((axp.getTemperature() + 5) / 0.25), 255), 0); + #endif #else batt_read(); - //uint8_t b_volt = min((int ) ((InpVolts * 1000) - 3000 / 5.1), 255); - uint8_t dc_volt = min((int ) (InpVolts * 1000 / 33.8), 255); + //uint8_t b_volt = max(0, min((int ) ((InpVolts * 1000) - 3000 / 5.1), 255)); + uint8_t dc_volt = max(0, min((int ) (InpVolts * 1000 / 33.8), 255)); #endif @@ -1951,7 +1995,7 @@ void sendTelemetryFrame() { // We break with this standard here, because we don't like waste bandwith char buf[5]; // ",000" + \0 == 5 sprintf(buf, ",%03u", dc_volt); telemetryData += String(buf); - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) sprintf(buf, ",%03u", dc_c); telemetryData += String(buf); sprintf(buf, ",%03u", b_volt); telemetryData += String(buf); sprintf(buf, ",%03u", b_c_out); telemetryData += String(buf); @@ -3252,18 +3296,40 @@ void setup_phase2_soft_reconfiguration(boolean runtime_reconfiguration) { Serial.printf("APRS Callsign: %s\r\n", Tcall.c_str()); } - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) // switch LoRa chip on or off - axp.setPowerOutPut(AXP192_LDO2, (lora_rx_enabled || lora_digipeating_mode > 0) ? AXP202_ON : AXP202_OFF); + #ifdef T_BEAM_V1_0 + axp.setPowerOutPut(AXP192_LDO2, (lora_rx_enabled || lora_digipeating_mode > 0) ? AXP202_ON : AXP202_OFF); + #elif T_BEAM_V1_2 + if (lora_rx_enabled || lora_digipeating_mode > 0) { + axp.setALDO2Voltage(3300); + axp.enableALDO2(); // switch LoRa chip on + } else { + axp.disableALDO2(); // switch LoRa chip off + } + #endif if (gps_state){ - axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); // switch on GPS + #ifdef T_BEAM_V1_0 + axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); // switch on GPS + #elif T_BEAM_V1_2 + axp.setALDO3Voltage(3300); + axp.enableALDO3(); // switch on GPS + #endif } else { - axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); // switch off GPS + #ifdef T_BEAM_V1_0 + axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); // switch off GPS + #elif T_BEAM_V1_2 + axp.disableALDO3(); // switch off GPS + #endif } Serial.printf("GPS powered %s\r\n", gps_state ? "on" : "off"); - //axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON); // switch this on if you need it + //#ifdef T_BEAM_V1_0 + // axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON); // switch this on if you need it + //#elif T_BEAM_V1_2 + // axp.enableXXX(); // switch this on if you need it + //#endif #else gps_state = false; #endif @@ -3434,7 +3500,7 @@ void setup() #endif // ENABLE_PEFERENCES pinMode(TXLED, OUTPUT); - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) pinMode(BUTTON, INPUT); #elif T_BEAM_V0_7 pinMode(BUTTON, INPUT); @@ -3445,6 +3511,7 @@ void setup() #ifdef T_BEAM_V1_0 if (!axp.begin(Wire, AXP192_SLAVE_ADDRESS)) { + ; } axp.setLowTemp(0xFF); //SP6VWX Set low charging temperature axp.setPowerOutPut(AXP192_DCDC2, AXP202_ON); @@ -3456,6 +3523,25 @@ void setup() axp.adc2Enable(0x80, true); axp.setChgLEDMode(AXP20X_LED_OFF); axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON); // oled do not turn off + #elif T_BEAM_V1_2 + if (!axp.begin(Wire, AXP2101_SLAVE_ADDRESS, I2C_SDA, I2C_SCL)) { + ; + } + axp.setDC1Voltage(3300); + axp.enableDC1(); // oled do not turn off + axp.setDC2Voltage(3300); + axp.enableDC2(); + // Enable ADC to measure battery current, USB voltage etc. + axp.enableGeneralAdcChannel(); + axp.enableTemperatureMeasure(); + axp.enableBattDetection(); + axp.enableSystemVoltageMeasure(); + axp.enableVbusVoltageMeasure(); + axp.enableBattVoltageMeasure(); + axp.enableTSPinMeasure(); + axp.setChargingLedMode(XPOWERS_CHG_LED_OFF); + axp.setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2); + axp.setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_500MA); #endif // can reduce cpu power consumtion up to 20 % @@ -3470,7 +3556,7 @@ void setup() #ifdef ENABLE_PREFERENCES if (clear_preferences == 2){ - //#ifdef T_BEAM_V1_0 + //#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) if(digitalRead(BUTTON)==LOW){ clear_preferences = 3; preferences.clear(); @@ -3496,7 +3582,7 @@ void setup() //adc1_config_width(ADC_WIDTH_BIT_12); //adc1_config_channel_atten(ADC1_CHANNEL_7,ADC_ATTEN_DB_11); #endif - #ifndef T_BEAM_V1_0 + #if !defined(T_BEAM_V1_0) && !defined(T_BEAM_V1_2) adc1_config_width(ADC_WIDTH_BIT_12); adc1_config_channel_atten(ADC1_CHANNEL_7,ADC_ATTEN_DB_6); #endif @@ -4549,7 +4635,7 @@ void handle_usb_serial_input(void) { #endif Serial.println(" trace "); Serial.println(" reboot"); -#ifdef T_BEAM_V1_0 +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) Serial.println(" shutdown"); #endif #ifdef ENABLE_WIFI @@ -4566,7 +4652,7 @@ void handle_usb_serial_input(void) { #endif delay(100); ESP.restart(); -#ifdef T_BEAM_V1_0 +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) } else if (cmd == "shutdown") { Serial.println("*** shutdown: halting!"); #if defined(ENABLE_SYSLOG) && defined(ENABLE_WIFI) @@ -4719,7 +4805,7 @@ void handle_usb_serial_input(void) { loraSend(txPower, lora_freq, lora_speed, 0, inputBuf); //send the packet, data is in TXbuff from lora_TXStart to lora_TXEnd esp_task_wdt_reset(); } - if (tx_own_beacon_from_this_device_or_fromKiss__to_frequencies > 1 && lora_digipeating_mode > 1 && lora_freq_cross_digi > 1.0 && lora_freq_cross_digi != lora_freq) { + if (((tx_own_beacon_from_this_device_or_fromKiss__to_frequencies > 1 && lora_digipeating_mode > 1) || tx_own_beacon_from_this_device_or_fromKiss__to_frequencies == 4) && lora_freq_cross_digi > 1.0 && lora_freq_cross_digi != lora_freq) { loraSend(txPower_cross_digi, lora_freq_cross_digi, lora_speed_cross_digi, 0, inputBuf); //send the packet, data is in TXbuff from lora_TXStart to lora_TXEnd esp_task_wdt_reset(); } @@ -5078,9 +5164,15 @@ debug_bestHdop = bestHdop; // ^kiss client has not recently sent a position gain (sb_max_interval plus 10 seconds grace) and kiss client sent no other data ((time_last_frame_via_kiss_received + sb_max_interval * 2 + 10*1000L) < millis())) { // ^ kiss client sent no positions and stoped sending other data for 2*sb_max_interval (plus 10 seconds grace) -#ifdef T_BEAM_V1_0 - if (!gps_state && gps_state_before_autochange) - axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) + if (!gps_state && gps_state_before_autochange) { + #ifdef T_BEAM_V1_0 + axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); + #elif T_BEAM_V1_2 + axp.setALDO3Voltage(3300); + axp.enableALDO3(); + #endif + } #endif gps_state = gps_state_before_autochange; dont_send_own_position_packets = false; @@ -5107,7 +5199,7 @@ debug_bestHdop = bestHdop; next_fixed_beacon = millis() + fix_beacon_interval; } - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) if(shutdown_active){ if(InpVolts> 4){ shutdown_usb_status_bef = true; @@ -5122,7 +5214,11 @@ debug_bestHdop = bestHdop; if(shutdown_countdown_timer_enable){ if(millis() >= shutdown_countdown_timer){ - axp.setChgLEDMode(AXP20X_LED_OFF); + #ifdef T_BEAM_V1_0 + axp.setChgLEDMode(AXP20X_LED_OFF); + #elif T_BEAM_V1_2 + axp.setChargingLedMode(XPOWERS_CHG_LED_OFF); + #endif #ifdef ENABLE_WIFI do_send_status_message_about_shutdown_to_aprsis(); #endif @@ -5156,10 +5252,15 @@ debug_bestHdop = bestHdop; if (!dont_send_own_position_packets) { gps_state_before_autochange = gps_state; if (gps_allow_sleep_while_kiss) { -#ifdef T_BEAM_V1_0 - if (gps_state) - axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); // switch off GPS -#endif + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) + if (gps_state) { + #ifdef T_BEAM_V1_0 + axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); // switch off GPS + #elif T_BEAM_V1_2 + axp.disableALDO3(); + #endif + } + #endif gps_state = false; } dont_send_own_position_packets = true; @@ -5247,7 +5348,7 @@ debug_bestHdop = bestHdop; if (lora_tx_enabled) { if (tx_own_beacon_from_this_device_or_fromKiss__to_frequencies % 2) loraSend(txPower, lora_freq, lora_speed, 0, String(data)); //send the packet, data is in TXbuff from lora_TXStart to lora_TXEnd - if (tx_own_beacon_from_this_device_or_fromKiss__to_frequencies > 1 && lora_digipeating_mode > 1 && lora_freq_cross_digi > 1.0 && lora_freq_cross_digi != lora_freq) + if (((tx_own_beacon_from_this_device_or_fromKiss__to_frequencies > 1 && lora_digipeating_mode > 1) || tx_own_beacon_from_this_device_or_fromKiss__to_frequencies == 4) && lora_freq_cross_digi > 1.0 && lora_freq_cross_digi != lora_freq) loraSend(txPower_cross_digi, lora_freq_cross_digi, lora_speed_cross_digi, 0, String(data)); //send the packet, data is in TXbuff from lora_TXStart to lora_TXEnd enableOled(); // enable OLED writedisplaytext("((KISSTX))","",String(data),"","",""); @@ -5268,9 +5369,11 @@ out: sema_lora_chip = true; #endif if (rf95.waitAvailableTimeout(100)) { - #ifdef T_BEAM_V1_0 - #ifdef ENABLE_LED_SIGNALING + #ifdef ENABLE_LED_SIGNALING + #ifdef T_BEAM_V1_0 axp.setChgLEDMode(AXP20X_LED_LOW_LEVEL); + #elif T_BEAM_V1_2 + axp.setChargingLedMode(XPOWERS_CHG_LED_BLINK_1HZ); #endif #endif #ifdef BUZZER @@ -5484,18 +5587,22 @@ out: } call_invalid_or_blacklisted: invalid_packet: - #ifdef T_BEAM_V1_0 - #ifdef ENABLE_LED_SIGNALING + #ifdef ENABLE_LED_SIGNALING + #ifdef T_BEAM_V1_0 axp.setChgLEDMode(AXP20X_LED_OFF); + #elif T_BEAM_V1_2 + axp.setChargingLedMode(XPOWERS_CHG_LED_OFF); + #else + ; // make compiler happy #endif #else ; // make compiler happy #endif } else { #ifdef IF_SEMAS_WOULD_WORK - xSemaphoreGive(sema_lora_chip); + xSemaphoreGive(sema_lora_chip); #else - sema_lora_chip = false; + sema_lora_chip = false; #endif } } @@ -5725,20 +5832,32 @@ behind_position_tx: if (millis() - last_debug_send_time > 1000*5) { last_debug_send_time = millis(); String debug_message = ""; - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) debug_message += "Bat V: " + String(axp.getBattVoltage()); debug_message += ", "; - debug_message += "Bat IN A: " + String(axp.getBattChargeCurrent()); - debug_message += ", "; - debug_message += "Bat OUT A: " + String(axp.getBattDischargeCurrent()); - debug_message += ", "; - debug_message += "USB Plugged: " + String(axp.isVBUSPlug()); + #ifdef T_BEAM_V1_0 + debug_message += "Bat IN A: " + String(axp.getBattChargeCurrent()); + debug_message += ", "; + debug_message += "Bat OUT A: " + String(axp.getBattDischargeCurrent()); + debug_message += ", "; + #endif + #ifdef T_BEAM_V1_0 + debug_message += "USB Plugged: " + String(axp.isVBUSPlug()); + #elif T_BEAM_V1_2 + debug_message += "USB Plugged: " + String(axp.isVbusInsertOnSource()); + #endif debug_message += ", "; debug_message += "USB V: " + String(axp.getVbusVoltage()); debug_message += ", "; - debug_message += "USB A: " + String(axp.getVbusCurrent()); - debug_message += ", "; - debug_message += "Temp C: " + String(axp.getTemp()); + #ifdef T_BEAM_V1_0 + debug_message += "USB A: " + String(axp.getVbusCurrent()); + debug_message += ", "; + #endif + #ifdef T_BEAM_V1_0 + debug_message += "Temp C: " + String(axp.getTemp()); + #elif T_BEAM_V1_2 + debug_message += "Temp C: " + String(axp.getTemperature()); + #endif #else debug_message += "USB V: " + String(InpVolts); #endif diff --git a/src/taskGPS.cpp b/src/taskGPS.cpp index 135b600..6bc229b 100644 --- a/src/taskGPS.cpp +++ b/src/taskGPS.cpp @@ -13,7 +13,7 @@ SFE_UBLOX_GPS myGPS; #endif // Pins for GPS -#ifdef T_BEAM_V1_0 +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) static const int RXPin = 12, TXPin = 34; #else static const int RXPin = 15, TXPin = 12; diff --git a/src/taskWebServer.cpp b/src/taskWebServer.cpp index 113fdb5..ca32a10 100644 --- a/src/taskWebServer.cpp +++ b/src/taskWebServer.cpp @@ -105,7 +105,7 @@ String aprsis_status = "Disconnected"; // aprsis 3rd party traffic encoding String generate_third_party_packet(String, String); void do_send_status_message_about_reboot_to_aprsis(); -#ifdef T_BEAM_V1_0 +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) void do_send_status_message_about_shutdown_to_aprsis(); #endif #ifdef KISS_PROTOCOL @@ -156,7 +156,11 @@ WiFiClient aprsis_client; Syslog syslog(udpClient, SYSLOG_PROTO_IETF); #endif -#ifdef T_BEAM_V1_0 +#ifdef T_BEAM_V1_2 +#define XPOWERS_CHIP_AXP2101 + #include + extern XPowersAXP2101 axp; +#elif T_BEAM_V1_0 #include extern AXP20X_Class axp; #endif @@ -367,14 +371,18 @@ void handle_Beacon() { } void handle_Shutdown() { - #ifdef T_BEAM_V1_0 + #if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) #if defined(ENABLE_SYSLOG) syslog_log(LOG_WARNING, String("WebServer: Shutdown Request -> Shutdown...")); #endif Serial.println("WebServer: Shutdown Request -> Shutdown..."); server.send(200,"text/html", "Shutdown"); do_send_status_message_about_shutdown_to_aprsis(); - axp.setChgLEDMode(AXP20X_LED_OFF); + #ifdef T_BEAM_V1_0 + axp.setChgLEDMode(AXP20X_LED_OFF); + #elif T_BEAM_V1_2 + axp.setChargingLedMode(XPOWERS_CHG_LED_OFF); + #endif axp.shutdown(); #else #if defined(ENABLE_SYSLOG) @@ -1435,7 +1443,7 @@ void do_send_status_message_about_reboot_to_aprsis() { do_send_status_message_about_shutdown_or_reboot_to_aprsis(SSMASTA_REBOOT); } -#ifdef T_BEAM_V1_0 +#if defined(T_BEAM_V1_0) || defined(T_BEAM_V1_2) void do_send_status_message_about_shutdown_to_aprsis() { do_send_status_message_about_shutdown_or_reboot_to_aprsis(SSMASTA_SHUTDOWN); @@ -1490,7 +1498,7 @@ void do_send_status_message_about_connect_to_aprsis(void) { esp_task_wdt_reset(); loraSend(txPower, lora_freq, lora_speed, 0, outString); //send the packet, data is in TXbuff from lora_TXStart to lora_TXEnd } - if (tx_own_beacon_from_this_device_or_fromKiss__to_frequencies > 1 && lora_digipeating_mode > 1 && lora_freq_cross_digi > 1.0 && lora_freq_cross_digi != lora_freq) { + if (((tx_own_beacon_from_this_device_or_fromKiss__to_frequencies > 1 && lora_digipeating_mode > 1) || tx_own_beacon_from_this_device_or_fromKiss__to_frequencies == 4) && lora_freq_cross_digi > 1.0 && lora_freq_cross_digi != lora_freq) { esp_task_wdt_reset(); loraSend(txPower_cross_digi, lora_freq_cross_digi, lora_speed_cross_digi, 0, outString); //send the packet, data is in TXbuff from lora_TXStart to lora_TXEnd } @@ -1908,6 +1916,8 @@ void send_to_aprsis() // switch LORA chip off during firmware upload #ifdef T_BEAM_V1_0 axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); + #elif T_BEAM_V1_2 + axp.disableALDO2(); #endif Serial.printf("Firmware: Update: %s\r\n", upload.filename.c_str()); if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size @@ -1925,6 +1935,9 @@ void send_to_aprsis() Update.printError(Serial); #ifdef T_BEAM_V1_0 axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); + #elif T_BEAM_V1_2 + axp.setALDO2Voltage(3300); + axp.enableALDO2(); #endif } } else if (upload.status == UPLOAD_FILE_END) { @@ -1940,6 +1953,9 @@ void send_to_aprsis() Update.printError(Serial); #ifdef T_BEAM_V1_0 axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); + #elif T_BEAM_V1_2 + axp.setALDO2Voltage(3300); + axp.enableALDO2(); #endif } }