Files
MeshCore/variants/heltec_v4/platformio.ini

942 lines
30 KiB
INI

[Heltec_lora32_v4]
extends = esp32_base
board = heltec_v4
build_flags =
${esp32_base.build_flags}
${sensor_base.build_flags}
-I variants/heltec_v4
-D HELTEC_LORA_V4
-D USE_SX1262
-D ARDUINO_USB_MODE=1 ; ARDUINO_USB_MODE in heltec_v4.json has no effect
-D ESP32_CPU_FREQ=80
-D RADIO_CLASS=CustomSX1262
-D WRAPPER_CLASS=CustomSX1262Wrapper
-D P_LORA_TX_LED=35
-D P_LORA_DIO_1=14
-D P_LORA_NSS=8
-D P_LORA_RESET=12
-D P_LORA_BUSY=13
-D P_LORA_SCLK=9
-D P_LORA_MISO=11
-D P_LORA_MOSI=10
-D P_LORA_PA_POWER=7 ; // VFEM_Ctrl -LDO power enable
-D P_LORA_GC1109_PA_EN=2 ; // CSD - GC1109 chip enable (HIGH=on)
-D P_LORA_GC1109_PA_TX_EN=46 ;// CPS - GC1109 PA mode (HIGH=full PA, LOW=bypass)
-D P_LORA_KCT8103L_PA_CSD=2
-D P_LORA_KCT8103L_PA_CTX=5
-D PIN_USER_BTN=0
-D MOMENTARY_BUTTON_WAKE_FROM_SLEEP=1
-D PIN_VEXT_EN=36
-D PIN_VEXT_EN_ACTIVE=HIGH
-D LORA_TX_POWER=22 ; Default to maximum SX1262 drive
-D MAX_LORA_TX_POWER=22 ; Max SX1262 output
-D SX126X_REGISTER_PATCH=1 ; Patch register 0x8B5 for improved RX
-D SX126X_DIO2_AS_RF_SWITCH=true ; GC1109 CTX is controlled by SX1262 DIO2
-D SX126X_DIO3_TCXO_VOLTAGE=1.8
-D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1 ; In some cases, commenting this out will improve RX
-D PIN_GPS_RX=38
-D PIN_GPS_TX=39
-D PIN_GPS_RESET=42
-D PIN_GPS_RESET_ACTIVE=LOW
-D PIN_GPS_EN=34
-D PIN_GPS_EN_ACTIVE=LOW
-D ENV_INCLUDE_GPS=1
-D PIN_ADC_CTRL=37
-D PIN_VBAT_READ=1
build_src_filter = ${esp32_base.build_src_filter}
+<../variants/heltec_v4>
+<helpers/sensors>
lib_deps =
${esp32_base.lib_deps}
${sensor_base.lib_deps}
[heltec_v4_oled]
extends = Heltec_lora32_v4
build_flags =
${Heltec_lora32_v4.build_flags}
-D HELTEC_LORA_V4_OLED
-D PIN_BOARD_SDA=17
-D PIN_BOARD_SCL=18
; The OLED uses Wire above; the expansion/general sensor connector is 4/3.
-D ENV_PIN_SDA=4
-D ENV_PIN_SCL=3
-D PIN_OLED_RESET=21
build_src_filter= ${Heltec_lora32_v4.build_src_filter}
lib_deps = ${Heltec_lora32_v4.lib_deps}
[heltec_v4_tft]
extends = Heltec_lora32_v4
build_flags =
${Heltec_lora32_v4.build_flags}
-D HELTEC_LORA_V4_TFT
-D PIN_BOARD_SDA=4
-D PIN_BOARD_SCL=3
-D PIN_TFT_RST=18
-D PIN_TFT_VDD_CTL=-1
-D PIN_TFT_LEDA_CTL=21
-D PIN_TFT_LEDA_CTL_ACTIVE=HIGH
-D PIN_TFT_CS=15
-D PIN_TFT_DC=16
-D PIN_TFT_SCL=17
-D PIN_TFT_SDA=33
build_src_filter= ${Heltec_lora32_v4.build_src_filter}
lib_deps =
${Heltec_lora32_v4.lib_deps}
adafruit/Adafruit ST7735 and ST7789 Library @ ^1.11.0
[env:heltec_v4_repeater]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"Heltec Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_repeater>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
bakercp/CRC32 @ ^2.0.0
[env:heltec_v4_repeater_legacy_partition_test]
; Deliberately retains Arduino's 1.25 MiB OTA slots for validating the
; Wi-Fi-only partition migration bridge on disposable hardware.
extends = heltec_v4_oled
board_build.partitions = default.csv
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"Heltec Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_repeater>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
bakercp/CRC32 @ ^2.0.0
[env:heltec_v4_expansionkit_repeater]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"Heltec Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
-D ENV_PIN_SDA=4
-D ENV_PIN_SCL=3
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_repeater>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
bakercp/CRC32 @ ^2.0.0
[env:heltec_v4_repeater_bridge_espnow]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"ESPNow Bridge"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D WITH_ESPNOW_BRIDGE=1
; -D BRIDGE_DEBUG=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/bridges/ESPNowBridge.cpp>
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_repeater>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
[env:heltec_v4_repeater_observer_mqtt]
extends = heltec_v4_oled
extra_scripts =
${esp32_base.extra_scripts}
pre:scripts/generate_cert_bundle.py
board_ssl_cert_source = adafruit-full
board_build.embed_files = src/certs/x509_crt_bundle.bin
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"MQTT Observer"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D WITH_MQTT_BRIDGE=1
-D MQTT_MAX_PACKET_SIZE=1024
-D MQTT_DEBUG=1
; -D MQTT_MEMORY_DEBUG=1
; Keep default observer profile less verbose to reduce runtime contention.
; Use heltec_v4_repeater_observer_mqtt_debug for deep troubleshooting.
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
-D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
-D ESP32_CPU_FREQ=160
-D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm
-D WITH_SNMP=1
# -D WIFI_SSID='"ssid"'
# -D WIFI_PWD='"password"'
# -D MQTT_SERVER='"your-mqtt-broker.com"'
# -D MQTT_PORT=1883
# -D MQTT_USERNAME='"your-username"'
# -D MQTT_PASSWORD='"your-password"'
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/bridges/MQTTBridge.cpp>
+<helpers/MQTTMessageBuilder.cpp>
+<helpers/JWTHelper.cpp>
+<helpers/SNMPAgent.cpp>
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_repeater>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
elims/PsychicMqttClient@^0.2.4
bblanchon/ArduinoJson @ 7.4.3
arduino-libraries/NTPClient
JChristensen/Timezone
paulstoffregen/Time@1.6.1
0neblock/SNMP_Agent
[env:heltec_v4_expansionkit_repeater_observer_mqtt]
extends = heltec_v4_oled
extra_scripts =
${esp32_base.extra_scripts}
pre:scripts/generate_cert_bundle.py
board_ssl_cert_source = adafruit-full
board_build.embed_files = src/certs/x509_crt_bundle.bin
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"MQTT Observer"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D WITH_MQTT_BRIDGE=1
-D MQTT_MAX_PACKET_SIZE=1024
-D MQTT_DEBUG=1
; -D MQTT_MEMORY_DEBUG=1
; Keep default observer profile less verbose to reduce runtime contention.
; Use heltec_v4_repeater_observer_mqtt_debug for deep troubleshooting.
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
-D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
-D ESP32_CPU_FREQ=160
-D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm
-D WITH_SNMP=1
-D ENV_PIN_SDA=4
-D ENV_PIN_SCL=3
# -D WIFI_SSID='"ssid"'
# -D WIFI_PWD='"password"'
# -D MQTT_SERVER='"your-mqtt-broker.com"'
# -D MQTT_PORT=1883
# -D MQTT_USERNAME='"your-username"'
# -D MQTT_PASSWORD='"your-password"'
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/bridges/MQTTBridge.cpp>
+<helpers/MQTTMessageBuilder.cpp>
+<helpers/JWTHelper.cpp>
+<helpers/SNMPAgent.cpp>
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_repeater>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
elims/PsychicMqttClient@^0.2.4
bblanchon/ArduinoJson @ 7.4.3
arduino-libraries/NTPClient
JChristensen/Timezone
paulstoffregen/Time@1.6.1
0neblock/SNMP_Agent
#[env:heltec_v4_repeater_observer_mqtt_debug]
#extends = heltec_v4_oled
#extra_scripts =
# ${esp32_base.extra_scripts}
# pre:scripts/generate_cert_bundle.py
#board_ssl_cert_source = adafruit-full
#board_build.embed_files = src/certs/x509_crt_bundle.bin
#build_flags =
# ${env:heltec_v4_repeater_observer_mqtt.build_flags}
# -D MQTT_MEMORY_DEBUG=1
# -D MESH_PACKET_LOGGING=1
# -D MESH_DEBUG=1
#build_src_filter = ${env:heltec_v4_repeater_observer_mqtt.build_src_filter}
#lib_deps =
# ${env:heltec_v4_repeater_observer_mqtt.lib_deps}
#[env:heltec_v4_repeater_observer_mqtt_quiet]
#extends = heltec_v4_oled
#extra_scripts =
# ${esp32_base.extra_scripts}
# pre:scripts/generate_cert_bundle.py
#board_ssl_cert_source = adafruit-full
#board_build.embed_files = src/certs/x509_crt_bundle.bin
#build_flags =
# ${env:heltec_v4_repeater_observer_mqtt.build_flags}
#build_unflags =
# -D MQTT_DEBUG=1
# -D MQTT_MEMORY_DEBUG=1
#build_src_filter = ${env:heltec_v4_repeater_observer_mqtt.build_src_filter}
#lib_deps =
# ${env:heltec_v4_repeater_observer_mqtt.lib_deps}
#[env:heltec_v4_repeater_observer_mqtt_quiet_keepalive45]
#extends = heltec_v4_oled
#extra_scripts =
# ${esp32_base.extra_scripts}
# pre:scripts/generate_cert_bundle.py
#board_ssl_cert_source = adafruit-full
#board_build.embed_files = src/certs/x509_crt_bundle.bin
#build_flags =
# ${env:heltec_v4_repeater_observer_mqtt.build_flags}
# -D MQTT_FORCE_KEEPALIVE_45=1
#build_unflags =
# -D MQTT_DEBUG=1
# -D MQTT_MEMORY_DEBUG=1
#build_src_filter = ${env:heltec_v4_repeater_observer_mqtt.build_src_filter}
#lib_deps =
# ${env:heltec_v4_repeater_observer_mqtt.lib_deps}
[env:heltec_v4_room_server_observer_mqtt]
extends = heltec_v4_oled
extra_scripts =
${esp32_base.extra_scripts}
pre:scripts/generate_cert_bundle.py
board_ssl_cert_source = adafruit-full
board_build.embed_files = src/certs/x509_crt_bundle.bin
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"Heltec Room Observer"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D ROOM_PASSWORD='"hello"'
-D WITH_MQTT_BRIDGE=1
-D MAX_NEIGHBOURS=50
-D MQTT_MAX_PACKET_SIZE=1024
-D MQTT_DEBUG=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
-D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
-D ESP32_CPU_FREQ=160
-D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm
-D WITH_SNMP=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/bridges/MQTTBridge.cpp>
+<helpers/MQTTMessageBuilder.cpp>
+<helpers/JWTHelper.cpp>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/SNMPAgent.cpp>
+<../examples/simple_room_server>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
elims/PsychicMqttClient@^0.2.4
bblanchon/ArduinoJson @ 7.4.3
arduino-libraries/NTPClient
JChristensen/Timezone
paulstoffregen/Time@1.6.1
0neblock/SNMP_Agent
[env:heltec_v4_expansionkit_room_server_observer_mqtt]
extends = heltec_v4_oled
extra_scripts =
${esp32_base.extra_scripts}
pre:scripts/generate_cert_bundle.py
board_ssl_cert_source = adafruit-full
board_build.embed_files = src/certs/x509_crt_bundle.bin
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"Heltec Room Observer"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D ROOM_PASSWORD='"hello"'
-D WITH_MQTT_BRIDGE=1
-D MAX_NEIGHBOURS=50
-D MQTT_MAX_PACKET_SIZE=1024
-D MQTT_DEBUG=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
-D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
-D ESP32_CPU_FREQ=160
-D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm
-D ENV_PIN_SDA=4
-D ENV_PIN_SCL=3
-D WITH_SNMP=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/bridges/MQTTBridge.cpp>
+<helpers/MQTTMessageBuilder.cpp>
+<helpers/JWTHelper.cpp>
+<helpers/ui/SSD1306Display.cpp>
+<helpers/SNMPAgent.cpp>
+<../examples/simple_room_server>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
elims/PsychicMqttClient@^0.2.4
bblanchon/ArduinoJson @ 7.4.3
arduino-libraries/NTPClient
JChristensen/Timezone
paulstoffregen/Time@1.6.1
0neblock/SNMP_Agent
[env:heltec_v4_room_server]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"Heltec Room"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D ROOM_PASSWORD='"hello"'
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_room_server>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
[env:heltec_v4_terminal_chat]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<../examples/simple_secure_chat/main.cpp>
lib_deps =
${heltec_v4_oled.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:heltec_v4_companion_radio_usb_femon]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-I examples/companion_radio/ui-new
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D DISPLAY_CLASS=SSD1306Display
-D ENABLE_USB_INTERFACE
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${heltec_v4_oled.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:heltec_v4_3_companion_radio_usb_femoff]
extends = env:heltec_v4_companion_radio_usb_femon
build_flags =
${env:heltec_v4_companion_radio_usb_femon.build_flags}
-D RADIO_FEM_RXGAIN=0 ; undefined (default on), 1=on, 0=off
[env:heltec_v4_companion_radio_usb]
extends = env:heltec_v4_companion_radio_usb_femon
[env:heltec_v4_companion_radio_usb_ps_femon]
extends = env:heltec_v4_companion_radio_usb_femon
[env:heltec_v4_companion_radio_usb_ps_femoff]
extends = env:heltec_v4_3_companion_radio_usb_femoff
[env:heltec_v4_companion_radio_ble_femon]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-I examples/companion_radio/ui-new
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D DISPLAY_CLASS=SSD1306Display
-D BLE_PIN_CODE=123456 ; dynamic, random PIN
-D AUTO_SHUTDOWN_MILLIVOLTS=3400
-D BLE_DEBUG_LOGGING=1
-D OFFLINE_QUEUE_SIZE=512
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<helpers/esp32/*.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${heltec_v4_oled.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:heltec_v4_3_companion_radio_ble_femoff]
extends = env:heltec_v4_companion_radio_ble_femon
build_flags =
${env:heltec_v4_companion_radio_ble_femon.build_flags}
-D RADIO_FEM_RXGAIN=0 ; undefined (default on), 1=on, 0=off
[env:heltec_v4_companion_radio_ble]
extends = env:heltec_v4_companion_radio_ble_femon
[env:heltec_v4_companion_radio_ble_ps_femon]
extends = env:heltec_v4_companion_radio_ble_femon
[env:heltec_v4_3_companion_radio_ble_ps_femoff]
extends = env:heltec_v4_3_companion_radio_ble_femoff
[env:heltec_v4_companion_radio_wifi_femon]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-I examples/companion_radio/ui-new
-D ENABLE_WIFI_INTERFACE
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D DISPLAY_CLASS=SSD1306Display
-D WIFI_DEBUG_LOGGING=1
-D WIFI_SSID='"myssid"'
-D WIFI_PWD='"mypwd"'
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<helpers/esp32/*.cpp>
+<helpers/wifi/*.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${heltec_v4_oled.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:heltec_v4_3_companion_radio_wifi_femoff]
extends = env:heltec_v4_companion_radio_wifi_femon
build_flags =
${env:heltec_v4_companion_radio_wifi_femon.build_flags}
-D RADIO_FEM_RXGAIN=0 ; undefined (default on), 1=on, 0=off
[env:heltec_v4_companion_radio_wifi_mqtt_femon]
extends = env:heltec_v4_companion_radio_wifi_femon
extra_scripts =
${esp32_base.extra_scripts}
pre:scripts/generate_cert_bundle.py
board_ssl_cert_source = adafruit-full
board_build.embed_files = src/certs/x509_crt_bundle.bin
build_flags =
${env:heltec_v4_companion_radio_wifi_femon.build_flags}
-D WITH_MQTT_BRIDGE=1
-D MQTT_RUNTIME_SLOT_COUNT=1
-D CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
-D ESP32_CPU_FREQ=160
-D MQTT_WIFI_TX_POWER=WIFI_POWER_11dBm
build_src_filter = ${env:heltec_v4_companion_radio_wifi_femon.build_src_filter}
+<helpers/bridges/MQTTBridge.cpp>
+<helpers/MQTTMessageBuilder.cpp>
+<helpers/JWTHelper.cpp>
lib_deps =
${env:heltec_v4_companion_radio_wifi_femon.lib_deps}
${esp32_ota.lib_deps}
elims/PsychicMqttClient@^0.2.4
bblanchon/ArduinoJson @ 7.4.3
arduino-libraries/NTPClient
JChristensen/Timezone
paulstoffregen/Time@1.6.1
[env:heltec_v4_3_companion_radio_wifi_mqtt_femoff]
extends = env:heltec_v4_companion_radio_wifi_mqtt_femon
build_flags =
${env:heltec_v4_companion_radio_wifi_mqtt_femon.build_flags}
-D RADIO_FEM_RXGAIN=0 ; undefined (default on), 1=on, 0=off
; Full Companion subsumes the former direct-MQTT Companion so this is the one
; canonical V4 OLED image. Arduino-ESP32 2.x exposes one USB TTY; enabling USB
; logging gives that TTY exclusively to the plaintext CLI/logging stream until
; logging is disabled again.
[env:heltec_v4_2_v4_3_companion_radio_full_femon]
extends = env:heltec_v4_companion_radio_wifi_mqtt_femon
; Marking the merged image QIO makes this V4 reset in the ROM before the
; software bootloader can start. Keep the Full image on the shared DIO policy.
board_build.flash_mode = ${esp32_s3_full.board_build.flash_mode}
build_flags =
${env:heltec_v4_companion_radio_wifi_mqtt_femon.build_flags}
-D MESHCORE_REQUIRES_COMPANION_RADIO_FULL=1
-D UI_WIFI_SETUP_HOME_PAGE=1
[env:heltec_v4_3_companion_radio_full_femoff]
extends = env:heltec_v4_3_companion_radio_wifi_mqtt_femoff
board_build.flash_mode = ${esp32_s3_full.board_build.flash_mode}
build_flags =
${env:heltec_v4_3_companion_radio_wifi_mqtt_femoff.build_flags}
-D MESHCORE_REQUIRES_COMPANION_RADIO_FULL=1
-D UI_WIFI_SETUP_HOME_PAGE=1
[env:heltec_v4_sensor]
extends = heltec_v4_oled
build_flags =
${heltec_v4_oled.build_flags}
-D ADVERT_NAME='"Heltec v4 Sensor"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D DISPLAY_CLASS=SSD1306Display
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_oled.build_src_filter}
+<helpers/ui/SSD1306Display.cpp>
+<../examples/simple_sensor>
lib_deps =
${heltec_v4_oled.lib_deps}
${esp32_ota.lib_deps}
[env:heltec_v4_tft_repeater]
extends = heltec_v4_tft
build_flags =
${heltec_v4_tft.build_flags}
-D DISPLAY_CLASS=ST7789LCDDisplay
-D ADVERT_NAME='"Heltec Repeater"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_tft.build_src_filter}
+<helpers/ui/ST7789LCDDisplay.cpp>
+<../examples/simple_repeater>
lib_deps =
${heltec_v4_tft.lib_deps}
${esp32_ota.lib_deps}
bakercp/CRC32 @ ^2.0.0
[env:heltec_v4_tft_repeater_bridge_espnow]
extends = heltec_v4_tft
build_flags =
${heltec_v4_tft.build_flags}
-D DISPLAY_CLASS=ST7789LCDDisplay
-D ADVERT_NAME='"ESPNow Bridge"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D MAX_NEIGHBOURS=50
-D WITH_ESPNOW_BRIDGE=1
; -D BRIDGE_DEBUG=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_tft.build_src_filter}
+<helpers/bridges/ESPNowBridge.cpp>
+<helpers/ui/ST7789LCDDisplay.cpp>
+<../examples/simple_repeater>
lib_deps =
${heltec_v4_tft.lib_deps}
${esp32_ota.lib_deps}
[env:heltec_v4_tft_room_server]
extends = heltec_v4_tft
build_flags =
${heltec_v4_tft.build_flags}
-D DISPLAY_CLASS=ST7789LCDDisplay
-D ADVERT_NAME='"Heltec Room"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
-D ROOM_PASSWORD='"hello"'
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_tft.build_src_filter}
+<helpers/ui/ST7789LCDDisplay.cpp>
+<../examples/simple_room_server>
lib_deps =
${heltec_v4_tft.lib_deps}
${esp32_ota.lib_deps}
[env:heltec_v4_tft_terminal_chat]
extends = heltec_v4_tft
build_flags =
${heltec_v4_tft.build_flags}
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_tft.build_src_filter}
+<../examples/simple_secure_chat/main.cpp>
lib_deps =
${heltec_v4_tft.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:heltec_v4_tft_companion_radio_usb_femon]
extends = heltec_v4_tft
build_flags =
${heltec_v4_tft.build_flags}
-I examples/companion_radio/ui-new
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D DISPLAY_CLASS=ST7789LCDDisplay
-D ENABLE_USB_INTERFACE
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_tft.build_src_filter}
+<helpers/ui/ST7789LCDDisplay.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${heltec_v4_tft.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:heltec_v4_3_tft_companion_radio_usb_femoff]
extends = env:heltec_v4_tft_companion_radio_usb_femon
build_flags =
${env:heltec_v4_tft_companion_radio_usb_femon.build_flags}
-D RADIO_FEM_RXGAIN=0 ; undefined (default on), 1=on, 0=off
[env:heltec_v4_tft_companion_radio_ble_femon]
extends = heltec_v4_tft
build_flags =
${heltec_v4_tft.build_flags}
-I examples/companion_radio/ui-new
-D DISPLAY_CLASS=ST7789LCDDisplay
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D BLE_PIN_CODE=123456 ; dynamic, random PIN
-D AUTO_SHUTDOWN_MILLIVOLTS=3400
-D BLE_DEBUG_LOGGING=1
-D OFFLINE_QUEUE_SIZE=512
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_tft.build_src_filter}
+<helpers/ui/ST7789LCDDisplay.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<helpers/esp32/*.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${heltec_v4_tft.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:heltec_v4_3_tft_companion_radio_ble_femoff]
extends = env:heltec_v4_tft_companion_radio_ble_femon
build_flags =
${env:heltec_v4_tft_companion_radio_ble_femon.build_flags}
-D RADIO_FEM_RXGAIN=0 ; undefined (default on), 1=on, 0=off
[env:heltec_v4_expansionkit_tft_companion_radio_ble_femon]
extends = env:heltec_v4_tft_companion_radio_ble_femon
build_flags =
${env:heltec_v4_tft_companion_radio_ble_femon.build_flags}
; The TFT profile already uses Wire at the expansion I2C pins, GPIO4/3.
[env:heltec_v4_3_expansionkit_tft_companion_radio_ble_femoff]
extends = env:heltec_v4_expansionkit_tft_companion_radio_ble_femon
build_flags =
${env:heltec_v4_expansionkit_tft_companion_radio_ble_femon.build_flags}
-D RADIO_FEM_RXGAIN=0 ; undefined (default on), 1=on, 0=off
[env:heltec_v4_expansionkit_tft_companion_radio_ble_ps]
extends = env:heltec_v4_expansionkit_tft_companion_radio_ble_femon
; The expansion-kit layout has different I2C ownership from the base TFT. Its
; Full image retains that exact hardware recipe while using the common
; Arduino-ESP32 2.x single-TTY policy.
[env:heltec_v4_expansionkit_tft_companion_radio_full_femon]
extends = env:heltec_v4_expansionkit_tft_companion_radio_ble_femon
board_build.flash_mode = ${esp32_s3_full.board_build.flash_mode}
build_flags =
${env:heltec_v4_expansionkit_tft_companion_radio_ble_femon.build_flags}
-D MESHCORE_REQUIRES_COMPANION_RADIO_FULL=1
[env:heltec_v4_tft_companion_radio_wifi_femon]
extends = heltec_v4_tft
build_flags =
${heltec_v4_tft.build_flags}
-I examples/companion_radio/ui-new
-D ENABLE_WIFI_INTERFACE
-D MAX_CONTACTS=350
-D MAX_GROUP_CHANNELS=40
-D OFFLINE_QUEUE_SIZE=512
-D DISPLAY_CLASS=ST7789LCDDisplay
-D WIFI_DEBUG_LOGGING=1
-D WIFI_SSID='"myssid"'
-D WIFI_PWD='"mypwd"'
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_tft.build_src_filter}
+<helpers/ui/ST7789LCDDisplay.cpp>
+<helpers/ui/MomentaryButton.cpp>
+<helpers/esp32/*.cpp>
+<helpers/wifi/*.cpp>
+<../examples/companion_radio/*.cpp>
+<../examples/companion_radio/ui-new/*.cpp>
lib_deps =
${heltec_v4_tft.lib_deps}
densaugeo/base64 @ ~1.4.0
[env:heltec_v4_3_tft_companion_radio_wifi_femoff]
extends = env:heltec_v4_tft_companion_radio_wifi_femon
build_flags =
${env:heltec_v4_tft_companion_radio_wifi_femon.build_flags}
-D RADIO_FEM_RXGAIN=0 ; undefined (default on), 1=on, 0=off
[env:heltec_v4_tft_companion_radio_full_femon]
extends = env:heltec_v4_tft_companion_radio_wifi_femon
board_build.flash_mode = ${esp32_s3_full.board_build.flash_mode}
build_flags =
${env:heltec_v4_tft_companion_radio_wifi_femon.build_flags}
-D MESHCORE_REQUIRES_COMPANION_RADIO_FULL=1
[env:heltec_v4_3_tft_companion_radio_full_femoff]
extends = env:heltec_v4_3_tft_companion_radio_wifi_femoff
board_build.flash_mode = ${esp32_s3_full.board_build.flash_mode}
build_flags =
${env:heltec_v4_3_tft_companion_radio_wifi_femoff.build_flags}
-D MESHCORE_REQUIRES_COMPANION_RADIO_FULL=1
[env:heltec_v4_tft_sensor]
extends = heltec_v4_tft
build_flags =
${heltec_v4_tft.build_flags}
-D ADVERT_NAME='"Heltec v4 Sensor"'
-D ADVERT_LAT=0.0
-D ADVERT_LON=0.0
-D ADMIN_PASSWORD='"password"'
; Environmental sensors use the TFT profile's Wire bus at GPIO4/3.
-D DISPLAY_CLASS=ST7789LCDDisplay
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${heltec_v4_tft.build_src_filter}
+<helpers/ui/ST7789LCDDisplay.cpp>
+<../examples/simple_sensor>
lib_deps =
${heltec_v4_tft.lib_deps}
${esp32_ota.lib_deps}
[env:heltec_v4_kiss_modem]
extends = Heltec_lora32_v4
build_unflags =
-DARDUINO_USB_MODE=0
build_flags =
${Heltec_lora32_v4.build_flags}
-DARDUINO_USB_MODE=1
; KISS radio2 scanning stays on the board. This narrowly opts this target
; into the guarded SX1262 RX-to-RX fast path and buffered 8 MHz SPI. The
; host-powered modem also uses the established V4 160 MHz role override;
; normal V4 images retain their lower-power 80 MHz policy.
-D MC_SX1262_FAST_PROFILE_SWITCH=1
-D MC_SX1262_FAST_FS=1
-D MC_SX1262_FAST_PACKET_CACHE=1
-D MC_SX1262_BUFFERED_RADIO_HAL=1
-D MC_SX1262_SPI_HZ=8000000
-D ESP32_CPU_FREQ=160
build_src_filter = ${Heltec_lora32_v4.build_src_filter}
+<../examples/kiss_modem/>
; Self-hosted partition migration receiver for a legacy V4 1.25 MiB slot.
; This role keeps Wi-Fi recovery and receives the exact Full repeater over LoRa.
[env:heltec_v4_partition_expander]
extends = Heltec_lora32_v4
board = heltec_v4_migrator
board_build.partitions = default.csv
board_build.flash_mode = dio
board_upload.maximum_size = 1310720
build_src_filter = ${Heltec_lora32_v4.build_src_filter}
+<../examples/partition_expander/*.cpp>
build_flags = ${Heltec_lora32_v4.build_flags}
-D MESH_MIN_RUNTIME_HEAP=100352
-D MOTA_MIGRATION_TARGET_ID=0xe792a051
; Pipeline verified OTA blocks across one request turn. The adaptive window
; starts at one and grows only after clean flights, then shrinks on loss.
-D OTA_FETCH_PIPELINE=4
lib_deps = ${Heltec_lora32_v4.lib_deps}
${esp32_ota.lib_deps}
; One-time Wi-Fi-only migration bridge for legacy Heltec V4/V4.3 OLED
; repeaters that still use Arduino's 1.25 MiB OTA slots. It is linked against
; default.csv so the existing browser updater can install it.
[env:heltec_v4_partition_migrator]
platform = platformio/espressif32@6.11.0
board = heltec_v4_migrator
framework = arduino
board_build.partitions = default.csv
; The V4's ROM/bootloader chain is reliable with DIO. The final Full image
; uses the same setting, so there is no flash-mode transition after migration.
board_build.flash_mode = dio
; The partition-table erase disables the flash cache. Native USB CDC can still
; raise a flash-backed event ISR during that interval, even after Serial.end().
; The Wi-Fi-only bridge therefore keeps CDC disabled; the final regular
; repeater build restores its normal USB serial setting.
; This standalone image runs its own Wi-Fi OTA server. Reserve the generic
; ESP32 baseline plus its always-on Wi-Fi budget in the linked-image proof.
extra_scripts =
pre:scripts/esp32_wifi_scan_fix.py
post:scripts/check_firmware_ram.py
build_flags =
-D ESP32_PLATFORM
-D MESH_MIN_RUNTIME_HEAP=100352
-I variants/heltec_v4
build_src_filter =
-<*>
+<../examples/esp32_partition_migrator>
lib_deps =
ESP32Async/AsyncTCP @ 3.5.0
ESP32Async/ESPAsyncWebServer @ 3.12.0
file://arch/esp32/AsyncElegantOTA
; LoRa-delivered first stage for an OTA-enabled heltec_v4_repeater. It keeps
; that exact old application bootable after the table change, restores its
; private identity, and returns to it for the expanded-slot LoRa update.
[env:heltec_v4_partition_migrator_lora_repeater]
extends = env:heltec_v4_partition_migrator
build_flags =
${env:heltec_v4_partition_migrator.build_flags}
-D MESHCORE_MIGRATION_RESUME_OTA=1
; Disposable-hardware harness: leaves a ten-minute Wi-Fi OTA window for
; installing the production bridge into legacy slot B. This is not a release
; profile.
[env:heltec_v4_partition_migrator_test_hold]
extends = env:heltec_v4_partition_migrator
build_flags =
${env:heltec_v4_partition_migrator.build_flags}
-D MESHCORE_MIGRATION_DELAY_MS=600000
-D MESHCORE_MIGRATION_RESTART_DELAY_MS=0
; Harness-only diagnostic: USB CDC is restored so a failed AP startup can be
; distinguished from a board which never left its bootloader. It retains
; the same ten-minute no-write window as test_hold.
[env:heltec_v4_partition_migrator_test_usb_diagnostic]
extends = env:heltec_v4_partition_migrator_test_hold
build_flags =
${env:heltec_v4_partition_migrator_test_hold.build_flags}
-DARDUINO_USB_CDC_ON_BOOT=1