diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2d3c464..ed4557f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,6 +61,8 @@ jobs: chip: esp32 - name: WEMOS-D1-R32-RA02 chip: esp32 + - name: WEMOS_S2_MINI_DIY_LoRa + chip: esp32s2 - name: esp32c3_DIY_1W_LoRa chip: esp32c3 - name: esp32c3_DIY_1W_LoRa_915 @@ -108,6 +110,17 @@ jobs: 0xe000 installer/firmware/boot_app0.bin \ 0x10000 installer/firmware/firmware.bin \ 0x3D0000 installer/firmware/spiffs.bin + elif [ "${{ matrix.target.chip }}" == "esp32s2" ]; then + python installer/bin/esptool/esptool.py --chip esp32s2 merge_bin \ + -o installer/web_factory.bin \ + --flash_mode dio \ + --flash_freq 40m \ + --flash_size 4MB \ + 0x1000 installer/firmware/bootloader.bin \ + 0x8000 installer/firmware/partitions.bin \ + 0xe000 installer/firmware/boot_app0.bin \ + 0x10000 installer/firmware/firmware.bin \ + 0x3D0000 installer/firmware/spiffs.bin elif [ "${{ matrix.target.chip }}" == "esp32s3" ]; then python installer/bin/esptool/esptool.py --chip esp32s3 merge_bin \ -o installer/web_factory.bin \ diff --git a/README.md b/README.md index 8fd43a9..510c252 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,8 @@ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this DIO0 #endif -#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WS) +#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WS) || defined(HELTEC_WP) #define RADIO_SCLK_PIN 9 // SX1262 SCK #define RADIO_MISO_PIN 11 // SX1262 MISO #define RADIO_MOSI_PIN 10 // SX1262 MOSI @@ -84,7 +84,7 @@ #define RADIO_TXEN 13 #endif -#ifdef HELTEC_HTCT62 +#if defined(HELTEC_HTCT62) #define RADIO_SCLK_PIN 10 // SX1262 SCK #define RADIO_MISO_PIN 6 // SX1262 MISO #define RADIO_MOSI_PIN 7 // SX1262 MOSI @@ -132,6 +132,15 @@ #define RADIO_TXEN 7 #endif +#ifdef WEMOS_S2_MINI_DIY_LoRa + #define RADIO_SCLK_PIN 36 + #define RADIO_MISO_PIN 37 + #define RADIO_MOSI_PIN 35 + #define RADIO_CS_PIN 34 + #define RADIO_BUSY_PIN 38 + #define RADIO_RST_PIN 33 +#endif + // OLED #if defined(TTGO_T_LORA32_V2_1) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) || defined(OE5HWN_MeshCom) || defined(ESP32_DIY_LoRa_A7670) || defined(TTGO_T_LORA32_V2_1_915) || defined(ESP32_DIY_LoRa_915) || defined(TTGO_T_Beam_V1_0_915) || defined(TTGO_T_Beam_V1_2_915) || defined(ESP32_DIY_LoRa_A7670_915) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_Mesh_V1_2) @@ -140,7 +149,7 @@ #define OLED_RST -1 // Reset pin # (or -1 if sharing Arduino reset pin) #endif -#ifdef HELTEC_V2 +#if defined(HELTEC_V2) #define OLED_SDA 4 #define OLED_SCL 15 #define OLED_RST 16 @@ -158,7 +167,7 @@ #define OLED_RST -1 #endif -#if !defined(HELTEC_HTCT62) && !defined(HELTEC_WSL_V3) && !defined(ESP32C3_DIY_1W_LoRa) && !defined(ESP32C3_DIY_1W_LoRa_915) +#if !defined(HELTEC_HTCT62) && !defined(HELTEC_WSL_V3) && !defined(ESP32C3_DIY_1W_LoRa) && !defined(ESP32C3_DIY_1W_LoRa_915) && !defined(WEMOS_S2_MINI_DIY_LoRa) #define HAS_DISPLAY #endif @@ -166,6 +175,9 @@ #ifdef HELTEC_HTCT62 #define BATTERY_PIN 1 #endif +#ifdef WEMOS_S2_MINI_DIY_LoRa + #define INTERNAL_LED_PIN 15 +#endif #if defined(TTGO_T_LORA32_V2_1) || defined(TTGO_T_LORA32_V2_1_915) #define INTERNAL_LED_PIN 25 // Green Led #define BATTERY_PIN 35 @@ -179,7 +191,7 @@ #define INTERNAL_LED_PIN 35 #define BATTERY_PIN 1 #define VEXT_CTRL 36 - #define ADC_CTRL 37 // Heltec WSL_V3 just like Heltec WT + #define ADC_CTRL 37 #define BOARD_I2C_SDA 41 #define BOARD_I2C_SCL 42 #ifdef HELTEC_WSL_V3_DISPLAY @@ -204,6 +216,21 @@ #define BOARD_I2C_SCL 6 #endif +#ifdef HELTEC_WP + #define INTERNAL_LED_PIN 18 + #define BATTERY_PIN 20 + #define ADC_CTRL 19 + #define VEXT_CTRL 45 + #define BOARD_I2C_SDA 37 + #define BOARD_I2C_SCL 36 + #define EPAPER_BUSY 7 + #define EPAPER_RST 6 + #define EPAPER_DC 5 + #define EPAPER_CS 4 + #define EPAPER_SCL 3 + #define EPAPER_SDA 2 +#endif + #ifdef ESP32_C3_DIY_LoRa // just testing! #define OLED_SDA 8 #define OLED_SCL 9 diff --git a/src/configuration.cpp b/src/configuration.cpp index 3714b3d..ce7520b 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -137,8 +137,8 @@ bool Configuration::readFile() { beacon.comment = data["beacon"]["comment"] | "LoRa APRS"; beacon.interval = data["beacon"]["interval"] | 15; beacon.overlay = data["beacon"]["overlay"] | "L"; - beacon.symbol = data["beacon"]["symbol"] | "a"; - beacon.path = data["beacon"]["path"] | "WIDE1-1"; + beacon.symbol = data["beacon"]["symbol"] | "a"; + beacon.path = data["beacon"]["path"] | "WIDE1-1"; beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false; beacon.sendViaRF = data["beacon"]["sendViaRF"] | false; @@ -150,7 +150,7 @@ bool Configuration::readFile() { aprs_is.messagesToRF = data["aprs_is"]["messagesToRF"] | false; aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false; - digi.mode = data["digi"]["mode"].as(); + digi.mode = data["digi"]["mode"] | 0; loramodule.txFreq = data["lora"]["txFreq"] | 433775000; loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000; diff --git a/src/display.cpp b/src/display.cpp index ce4270b..60b596c 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -16,15 +16,19 @@ #define lineSpacing 12 #endif #else - #include - #include - #if defined(HELTEC_V3) - #define OLED_DISPLAY_HAS_RST_PIN - #endif - #ifdef HELTEC_WSL_V3_DISPLAY - Adafruit_SSD1306 display(128, 64, &Wire1, OLED_RST); + #if HAS_EPAPER + // #else - Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST); + #include + #include + #if defined(HELTEC_V3) + #define OLED_DISPLAY_HAS_RST_PIN + #endif + #ifdef HELTEC_WSL_V3_DISPLAY + Adafruit_SSD1306 display(128, 64, &Wire1, OLED_RST); + #else + Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST); + #endif #endif #endif #endif @@ -52,32 +56,36 @@ void displaySetup() { } tft.setTextFont(0); tft.fillScreen(TFT_BLACK); - #else - #ifdef OLED_DISPLAY_HAS_RST_PIN - pinMode(OLED_RST, OUTPUT); - digitalWrite(OLED_RST, LOW); - delay(20); - digitalWrite(OLED_RST, HIGH); - #endif + #else + #if HAS_EPAPER + // + #else + #ifdef OLED_DISPLAY_HAS_RST_PIN + pinMode(OLED_RST, OUTPUT); + digitalWrite(OLED_RST, LOW); + delay(20); + digitalWrite(OLED_RST, HIGH); + #endif - #ifndef HELTEC_WSL_V3_DISPLAY - Wire.begin(OLED_SDA, OLED_SCL); - #endif + #if defined(HELTEC_WS) || defined(HELTEC_WSL_V3_DISPLAY) + Wire.begin(OLED_SDA, OLED_SCL); + #endif - if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { - Serial.println(F("SSD1306 allocation failed")); - for(;;); // Don't proceed, loop forever - } - if (Config.display.turn180) { - display.setRotation(2); - } - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(0, 0); - display.ssd1306_command(SSD1306_SETCONTRAST); - display.ssd1306_command(1); - display.display(); + if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { + Serial.println(F("SSD1306 allocation failed")); + for(;;); // Don't proceed, loop forever + } + if (Config.display.turn180) { + display.setRotation(2); + } + display.clearDisplay(); + display.setTextColor(WHITE); + display.setTextSize(1); + display.setCursor(0, 0); + display.ssd1306_command(SSD1306_SETCONTRAST); + display.ssd1306_command(1); + display.display(); + #endif #endif delay(1000); #endif @@ -89,13 +97,21 @@ void displayToggle(bool toggle) { #ifdef HAS_TFT digitalWrite(TFT_BL, HIGH); #else - display.ssd1306_command(SSD1306_DISPLAYON); + #if HAS_EPAPER + // ... to be continued + #else + display.ssd1306_command(SSD1306_DISPLAYON); + #endif #endif } else { #ifdef HAS_TFT digitalWrite(TFT_BL, LOW); #else - display.ssd1306_command(SSD1306_DISPLAYOFF); + #if HAS_EPAPER + // ... to be continued + #else + display.ssd1306_command(SSD1306_DISPLAYOFF); + #endif #endif } #endif @@ -145,18 +161,22 @@ void displayShow(const String& header, const String& line1, const String& line2, tft.print(*lines[i]); } #else - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(1); - display.setCursor(0, 0); - display.println(header); - for (int i = 0; i < 3; i++) { - display.setCursor(0, 8 + (8 * i)); - display.println(*lines[i]); - } - display.ssd1306_command(SSD1306_SETCONTRAST); - display.ssd1306_command(1); - display.display(); + #ifdef HAS_EPAPER + // ... to be continued + #else + display.clearDisplay(); + display.setTextColor(WHITE); + display.setTextSize(1); + display.setCursor(0, 0); + display.println(header); + for (int i = 0; i < 3; i++) { + display.setCursor(0, 8 + (8 * i)); + display.println(*lines[i]); + } + display.ssd1306_command(SSD1306_SETCONTRAST); + display.ssd1306_command(1); + display.display(); + #endif #endif delay(wait); #endif @@ -179,19 +199,23 @@ void displayShow(const String& header, const String& line1, const String& line2, tft.print(*lines[i]); } #else - display.clearDisplay(); - display.setTextColor(WHITE); - display.setTextSize(2); - display.setCursor(0, 0); - display.println(header); - display.setTextSize(1); - for (int i = 0; i < 6; i++) { - display.setCursor(0, 16 + (8 * i)); - display.println(*lines[i]); - } - display.ssd1306_command(SSD1306_SETCONTRAST); - display.ssd1306_command(1); - display.display(); + #ifdef HAS_EPAPER + // ... to be continued + #else + display.clearDisplay(); + display.setTextColor(WHITE); + display.setTextSize(2); + display.setCursor(0, 0); + display.println(header); + display.setTextSize(1); + for (int i = 0; i < 6; i++) { + display.setCursor(0, 16 + (8 * i)); + display.println(*lines[i]); + } + display.ssd1306_command(SSD1306_SETCONTRAST); + display.ssd1306_command(1); + display.display(); + #endif #endif delay(wait); #endif diff --git a/src/power_utils.cpp b/src/power_utils.cpp index 79f2b81..30ee7c8 100644 --- a/src/power_utils.cpp +++ b/src/power_utils.cpp @@ -154,17 +154,20 @@ namespace POWER_Utils { #ifndef HELTEC_WSL_V3 digitalWrite(VEXT_CTRL, HIGH); #endif + #ifdef HELTEC_WP + digitalWrite(VEXT_CTRL, LOW); + #endif #endif #ifdef ADC_CTRL pinMode(ADC_CTRL, OUTPUT); #endif - #ifdef HELTEC_WIRELESS_TRACKER + #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WP) Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL); #endif - #if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) + #if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP) || defined(HELTEC_WSL_V3_DISPLAY) Wire1.begin(BOARD_I2C_SDA, BOARD_I2C_SCL); #endif diff --git a/src/utils.cpp b/src/utils.cpp index 111a828..180cbc0 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -151,24 +151,26 @@ namespace Utils { } #endif - if (Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) { - float externalVoltage = BATTERY_Utils::checkExternalVoltage(); - String externalVoltageInfo = String(externalVoltage,2) + "V"; - if (Config.battery.sendExternalVoltage) { - beaconPacket += " Ext="; - beaconPacket += externalVoltageInfo; - secondaryBeaconPacket += " Ext="; - secondaryBeaconPacket += externalVoltageInfo; - sixthLine = " (Ext V="; - sixthLine += externalVoltageInfo; - sixthLine += ")"; + #ifndef HELTEC_WP + if (Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) { + float externalVoltage = BATTERY_Utils::checkExternalVoltage(); + String externalVoltageInfo = String(externalVoltage,2) + "V"; + if (Config.battery.sendExternalVoltage) { + beaconPacket += " Ext="; + beaconPacket += externalVoltageInfo; + secondaryBeaconPacket += " Ext="; + secondaryBeaconPacket += externalVoltageInfo; + sixthLine = " (Ext V="; + sixthLine += externalVoltageInfo; + sixthLine += ")"; + } + if (Config.battery.monitorExternalVoltage && externalVoltage < Config.battery.externalSleepVoltage) { + beaconPacket += " **ExtBatWarning:SLEEP**"; + secondaryBeaconPacket += " **ExtBatWarning:SLEEP**"; + shouldSleepLowVoltage = true; + } } - if (Config.battery.monitorExternalVoltage && externalVoltage < Config.battery.externalSleepVoltage) { - beaconPacket += " **ExtBatWarning:SLEEP**"; - secondaryBeaconPacket += " **ExtBatWarning:SLEEP**"; - shouldSleepLowVoltage = true; - } - } + #endif if (Config.aprs_is.active && Config.beacon.sendViaAPRSIS && !backUpDigiMode) { Utils::println("-- Sending Beacon to APRSIS --"); @@ -245,7 +247,7 @@ namespace Utils { } else if (packet[firstColonIndex + 1] == '>') { sixthLine += "> NEW STATUS"; seventhLine = seventhLineHelper; - } else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=') { + } else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=' || packet[firstColonIndex + 1] == '@') { sixthLine += "> GPS BEACON"; if (!Config.syslog.active) { GPS_Utils::getDistanceAndComment(packet); // to be checked!!!