diff --git a/.gitignore b/.gitignore index 59d21dc..3b8da3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,2 @@ -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app -*.log +.pio +.vscode \ No newline at end of file diff --git a/README.md b/README.md index c41bc6a..ee9487f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ESP32 LoRa APRS Modem -![Modes of operation](images/diagram.png) +![Modes of operation](extras/images/diagram.png) This project is amateur radio ESP32 based LoRa **KISS Bluetooth/BLE/USB/TCPIP** modem + LoRa **APRS-IS RX/TX iGate** server over WiFI + LoRa **APRS digipeater** + **Codec2 DV modem** (with Codec2 Talkie Android application). @@ -22,18 +22,12 @@ Modules, which are used by users and known to work - RA-02 (SX1276) - TTGO T-Beam (SX1276) -# Dependencies -Install via board manager: -- Arduino ESP32 (search for esp32): https://github.com/espressif/arduino-esp32 - - Use latest 2.0.5+ version, if board manager does not list it then update "Additional boards manager URL" to https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json - -Install via libraries: -- RadioLib library: https://github.com/jgromes/RadioLib -- Arduino Timer library: https://github.com/contrem/arduino-timer -- CircularBuffer library: https://github.com/rlogiacco/CircularBuffer -- DebugLog library: https://github.com/hideakitai/DebugLog +# Building +- Update `include/config.h` +- Build for client/tracker mode `pio run -e esp32dev` +- Build for iGate `pio run -e esp32dev_igate` # Development board -Development board schematics, case and antenna models are available under `cad` and `schematics`. +Development board schematics, case and antenna models are available under `extras/cad` and `extras/schematics`. -![Modes of operation](images/device.png) +![Modes of operation](extras/images/device.png) diff --git a/cad/README.md b/extras/cad/README.md similarity index 100% rename from cad/README.md rename to extras/cad/README.md diff --git a/cad/antenna_base.FCStd b/extras/cad/antenna_base.FCStd similarity index 100% rename from cad/antenna_base.FCStd rename to extras/cad/antenna_base.FCStd diff --git a/cad/antenna_base.stl b/extras/cad/antenna_base.stl similarity index 100% rename from cad/antenna_base.stl rename to extras/cad/antenna_base.stl diff --git a/cad/antenna_cover_short.FCStd b/extras/cad/antenna_cover_short.FCStd similarity index 100% rename from cad/antenna_cover_short.FCStd rename to extras/cad/antenna_cover_short.FCStd diff --git a/cad/antenna_cover_short.stl b/extras/cad/antenna_cover_short.stl similarity index 100% rename from cad/antenna_cover_short.stl rename to extras/cad/antenna_cover_short.stl diff --git a/cad/aprs_tracker_e22_cover_v2.FCStd b/extras/cad/aprs_tracker_e22_cover_v2.FCStd similarity index 100% rename from cad/aprs_tracker_e22_cover_v2.FCStd rename to extras/cad/aprs_tracker_e22_cover_v2.FCStd diff --git a/cad/aprs_tracker_e22_cover_v2.stl b/extras/cad/aprs_tracker_e22_cover_v2.stl similarity index 100% rename from cad/aprs_tracker_e22_cover_v2.stl rename to extras/cad/aprs_tracker_e22_cover_v2.stl diff --git a/cad/aprs_tracker_e22_v2.FCStd b/extras/cad/aprs_tracker_e22_v2.FCStd similarity index 100% rename from cad/aprs_tracker_e22_v2.FCStd rename to extras/cad/aprs_tracker_e22_v2.FCStd diff --git a/cad/aprs_tracker_e22_v2.stl b/extras/cad/aprs_tracker_e22_v2.stl similarity index 100% rename from cad/aprs_tracker_e22_v2.stl rename to extras/cad/aprs_tracker_e22_v2.stl diff --git a/images/amp.png b/extras/images/amp.png similarity index 100% rename from images/amp.png rename to extras/images/amp.png diff --git a/images/aprs_compressed.png b/extras/images/aprs_compressed.png similarity index 100% rename from images/aprs_compressed.png rename to extras/images/aprs_compressed.png diff --git a/images/aprs_information.png b/extras/images/aprs_information.png similarity index 100% rename from images/aprs_information.png rename to extras/images/aprs_information.png diff --git a/images/aprs_position.png b/extras/images/aprs_position.png similarity index 100% rename from images/aprs_position.png rename to extras/images/aprs_position.png diff --git a/images/aprsdroid.png b/extras/images/aprsdroid.png similarity index 100% rename from images/aprsdroid.png rename to extras/images/aprsdroid.png diff --git a/images/aprsdroid_tnc2.png b/extras/images/aprsdroid_tnc2.png similarity index 100% rename from images/aprsdroid_tnc2.png rename to extras/images/aprsdroid_tnc2.png diff --git a/images/ax25.png b/extras/images/ax25.png similarity index 100% rename from images/ax25.png rename to extras/images/ax25.png diff --git a/images/bandwidth_vs_sf.jpg b/extras/images/bandwidth_vs_sf.jpg similarity index 100% rename from images/bandwidth_vs_sf.jpg rename to extras/images/bandwidth_vs_sf.jpg diff --git a/images/board.png b/extras/images/board.png similarity index 100% rename from images/board.png rename to extras/images/board.png diff --git a/images/codecmode.png b/extras/images/codecmode.png similarity index 100% rename from images/codecmode.png rename to extras/images/codecmode.png diff --git a/images/csma.graphml b/extras/images/csma.graphml similarity index 100% rename from images/csma.graphml rename to extras/images/csma.graphml diff --git a/images/csma.png b/extras/images/csma.png similarity index 100% rename from images/csma.png rename to extras/images/csma.png diff --git a/images/device.png b/extras/images/device.png similarity index 100% rename from images/device.png rename to extras/images/device.png diff --git a/images/diagram.graphml b/extras/images/diagram.graphml similarity index 100% rename from images/diagram.graphml rename to extras/images/diagram.graphml diff --git a/images/diagram.png b/extras/images/diagram.png similarity index 100% rename from images/diagram.png rename to extras/images/diagram.png diff --git a/images/enable_extensions.png b/extras/images/enable_extensions.png similarity index 100% rename from images/enable_extensions.png rename to extras/images/enable_extensions.png diff --git a/images/esp32_38pin.jpg b/extras/images/esp32_38pin.jpg similarity index 100% rename from images/esp32_38pin.jpg rename to extras/images/esp32_38pin.jpg diff --git a/images/lora_settings.png b/extras/images/lora_settings.png similarity index 100% rename from images/lora_settings.png rename to extras/images/lora_settings.png diff --git a/images/pinouts.png b/extras/images/pinouts.png similarity index 100% rename from images/pinouts.png rename to extras/images/pinouts.png diff --git a/images/radio_control.png b/extras/images/radio_control.png similarity index 100% rename from images/radio_control.png rename to extras/images/radio_control.png diff --git a/images/rf_vs_c2.png b/extras/images/rf_vs_c2.png similarity index 100% rename from images/rf_vs_c2.png rename to extras/images/rf_vs_c2.png diff --git a/images/s_meter.png b/extras/images/s_meter.png similarity index 100% rename from images/s_meter.png rename to extras/images/s_meter.png diff --git a/images/setup.png b/extras/images/setup.png similarity index 100% rename from images/setup.png rename to extras/images/setup.png diff --git a/images/solder_pads_38pin.jpg b/extras/images/solder_pads_38pin.jpg similarity index 100% rename from images/solder_pads_38pin.jpg rename to extras/images/solder_pads_38pin.jpg diff --git a/images/sx1268.jpg b/extras/images/sx1268.jpg similarity index 100% rename from images/sx1268.jpg rename to extras/images/sx1268.jpg diff --git a/images/talkie.png b/extras/images/talkie.png similarity index 100% rename from images/talkie.png rename to extras/images/talkie.png diff --git a/images/tracker.jpg b/extras/images/tracker.jpg similarity index 100% rename from images/tracker.jpg rename to extras/images/tracker.jpg diff --git a/schematics/LICENSE b/extras/schematics/LICENSE similarity index 100% rename from schematics/LICENSE rename to extras/schematics/LICENSE diff --git a/schematics/README.md b/extras/schematics/README.md similarity index 100% rename from schematics/README.md rename to extras/schematics/README.md diff --git a/schematics/fp-lib-table b/extras/schematics/fp-lib-table similarity index 100% rename from schematics/fp-lib-table rename to extras/schematics/fp-lib-table diff --git a/schematics/gerber/lora_tracker-B.Cu.gbl b/extras/schematics/gerber/lora_tracker-B.Cu.gbl similarity index 100% rename from schematics/gerber/lora_tracker-B.Cu.gbl rename to extras/schematics/gerber/lora_tracker-B.Cu.gbl diff --git a/schematics/gerber/lora_tracker-B.Mask.gbs b/extras/schematics/gerber/lora_tracker-B.Mask.gbs similarity index 100% rename from schematics/gerber/lora_tracker-B.Mask.gbs rename to extras/schematics/gerber/lora_tracker-B.Mask.gbs diff --git a/schematics/gerber/lora_tracker-B.SilkS.gbo b/extras/schematics/gerber/lora_tracker-B.SilkS.gbo similarity index 100% rename from schematics/gerber/lora_tracker-B.SilkS.gbo rename to extras/schematics/gerber/lora_tracker-B.SilkS.gbo diff --git a/schematics/gerber/lora_tracker-Edge.Cuts.gm1 b/extras/schematics/gerber/lora_tracker-Edge.Cuts.gm1 similarity index 100% rename from schematics/gerber/lora_tracker-Edge.Cuts.gm1 rename to extras/schematics/gerber/lora_tracker-Edge.Cuts.gm1 diff --git a/schematics/gerber/lora_tracker-F.Cu.gtl b/extras/schematics/gerber/lora_tracker-F.Cu.gtl similarity index 100% rename from schematics/gerber/lora_tracker-F.Cu.gtl rename to extras/schematics/gerber/lora_tracker-F.Cu.gtl diff --git a/schematics/gerber/lora_tracker-F.Mask.gts b/extras/schematics/gerber/lora_tracker-F.Mask.gts similarity index 100% rename from schematics/gerber/lora_tracker-F.Mask.gts rename to extras/schematics/gerber/lora_tracker-F.Mask.gts diff --git a/schematics/gerber/lora_tracker-F.SilkS.gto b/extras/schematics/gerber/lora_tracker-F.SilkS.gto similarity index 100% rename from schematics/gerber/lora_tracker-F.SilkS.gto rename to extras/schematics/gerber/lora_tracker-F.SilkS.gto diff --git a/schematics/gerber/lora_tracker-NPTH.drl b/extras/schematics/gerber/lora_tracker-NPTH.drl similarity index 100% rename from schematics/gerber/lora_tracker-NPTH.drl rename to extras/schematics/gerber/lora_tracker-NPTH.drl diff --git a/schematics/gerber/lora_tracker-PTH.drl b/extras/schematics/gerber/lora_tracker-PTH.drl similarity index 100% rename from schematics/gerber/lora_tracker-PTH.drl rename to extras/schematics/gerber/lora_tracker-PTH.drl diff --git a/schematics/lora_tracker.kicad_pcb b/extras/schematics/lora_tracker.kicad_pcb similarity index 100% rename from schematics/lora_tracker.kicad_pcb rename to extras/schematics/lora_tracker.kicad_pcb diff --git a/schematics/lora_tracker.kicad_pcb-bak b/extras/schematics/lora_tracker.kicad_pcb-bak similarity index 100% rename from schematics/lora_tracker.kicad_pcb-bak rename to extras/schematics/lora_tracker.kicad_pcb-bak diff --git a/schematics/lora_tracker.net b/extras/schematics/lora_tracker.net similarity index 100% rename from schematics/lora_tracker.net rename to extras/schematics/lora_tracker.net diff --git a/schematics/lora_tracker.pretty/E22-400M30S.kicad_mod b/extras/schematics/lora_tracker.pretty/E22-400M30S.kicad_mod similarity index 100% rename from schematics/lora_tracker.pretty/E22-400M30S.kicad_mod rename to extras/schematics/lora_tracker.pretty/E22-400M30S.kicad_mod diff --git a/schematics/lora_tracker.pretty/esp32 devkit.kicad_mod b/extras/schematics/lora_tracker.pretty/esp32 devkit.kicad_mod similarity index 100% rename from schematics/lora_tracker.pretty/esp32 devkit.kicad_mod rename to extras/schematics/lora_tracker.pretty/esp32 devkit.kicad_mod diff --git a/schematics/lora_tracker.pretty/esp32 devkit2.kicad_mod b/extras/schematics/lora_tracker.pretty/esp32 devkit2.kicad_mod similarity index 100% rename from schematics/lora_tracker.pretty/esp32 devkit2.kicad_mod rename to extras/schematics/lora_tracker.pretty/esp32 devkit2.kicad_mod diff --git a/schematics/lora_tracker.pro b/extras/schematics/lora_tracker.pro similarity index 100% rename from schematics/lora_tracker.pro rename to extras/schematics/lora_tracker.pro diff --git a/schematics/lora_tracker.sch b/extras/schematics/lora_tracker.sch similarity index 100% rename from schematics/lora_tracker.sch rename to extras/schematics/lora_tracker.sch diff --git a/schematics/sym-lib-table b/extras/schematics/sym-lib-table similarity index 100% rename from schematics/sym-lib-table rename to extras/schematics/sym-lib-table diff --git a/ax25_callsign.h b/include/ax25_callsign.h similarity index 100% rename from ax25_callsign.h rename to include/ax25_callsign.h diff --git a/ax25_payload.h b/include/ax25_payload.h similarity index 100% rename from ax25_payload.h rename to include/ax25_payload.h diff --git a/ble_serial.h b/include/ble_serial.h similarity index 100% rename from ble_serial.h rename to include/ble_serial.h diff --git a/config.h b/include/config.h similarity index 99% rename from config.h rename to include/config.h index 7c9649b..2414dc8 100644 --- a/config.h +++ b/include/config.h @@ -18,7 +18,9 @@ #define CFG_LOG_LEVEL DebugLogLevel::LVL_INFO // select between client mode and APRS-IS gate mode +#ifndef CFG_IS_CLIENT_MODE #define CFG_IS_CLIENT_MODE true // false - server mode (APRS-IS gate mode) +#endif // change pinouts if not defined through native board LORA_* definitions #ifndef LORA_RST diff --git a/kiss_processor.h b/include/kiss_processor.h similarity index 98% rename from kiss_processor.h rename to include/kiss_processor.h index 3d9ba01..10d46aa 100644 --- a/kiss_processor.h +++ b/include/kiss_processor.h @@ -46,7 +46,8 @@ protected: enum DataType { Raw = 0, Control, - Reboot + Reboot, + None = 0x80 }; static const int CfgSerialToRigQueueSize = 4096; diff --git a/loraprs_config.h b/include/loraprs_config.h similarity index 100% rename from loraprs_config.h rename to include/loraprs_config.h diff --git a/loraprs_service.h b/include/loraprs_service.h similarity index 98% rename from loraprs_service.h rename to include/loraprs_service.h index 72609c3..536d296 100644 --- a/loraprs_service.h +++ b/include/loraprs_service.h @@ -125,7 +125,7 @@ private: const int CfgConnRetryMs = 500; // connection retry delay, e.g. wifi const int CfgPollDelayMs = 20; // main loop delay const int CfgConnRetryMaxTimes = 10; // number of connection retries - const int CfgTelemetryPeriodMs = 30000; // how often to send telemetry event + const int CfgTelemetryPeriodMs = 60000; // how often to send telemetry event static const int CfgMaxPacketSize = 256; // maximum packet size static const int CfgRadioQueueSize = 1024; // radio queue size diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..a4c0cd1 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,36 @@ +[platformio] +description = ESP32 LoRA APRS modem +default_envs = esp32dev + +[env] +platform = espressif32 @ 5.2.0 +framework = arduino +monitor_speed = 115200 +board_build.partitions = min_spiffs.csv +board_build.f_cpu = 80000000L +upload_protocol = esptool +lib_deps = + hideakitai/DebugLog @ 0.6.6 + contrem/arduino-timer @ 2.3.1 + jgromes/RadioLib @ 5.5.0 + rlogiacco/CircularBuffer @ 1.3.3 +check_tool = cppcheck +check_flags = + cppcheck: --suppress=*:*.pio\* --inline-suppr -DCPPCHECK +check_skip_packages = yes + +[env:esp32dev] +board = esp32dev +build_flags = + '-D CFG_IS_CLIENT_MODE=true' + +[env:esp32dev_igate] +board = esp32dev +board_build.f_cpu = 240000000L +build_flags = + '-D CFG_IS_CLIENT_MODE=false' + +[env:ttgo-lora32-v1] +board = ttgo-lora32-v1 +build_flags = + '-D CFG_IS_CLIENT_MODE=true' diff --git a/ax25_callsign.cpp b/src/ax25_callsign.cpp similarity index 100% rename from ax25_callsign.cpp rename to src/ax25_callsign.cpp diff --git a/ax25_payload.cpp b/src/ax25_payload.cpp similarity index 100% rename from ax25_payload.cpp rename to src/ax25_payload.cpp diff --git a/ble_serial.cpp b/src/ble_serial.cpp similarity index 99% rename from ble_serial.cpp rename to src/ble_serial.cpp index eb9b4a9..b11e764 100644 --- a/ble_serial.cpp +++ b/src/ble_serial.cpp @@ -43,6 +43,8 @@ class BLESerialCharacteristicCallbacks: public BLECharacteristicCallbacks { // Constructor BLESerial::BLESerial() + : pService(NULL) + , pTxCharacteristic(NULL) { // create instance receiveBuffer = ""; diff --git a/kiss_processor.cpp b/src/kiss_processor.cpp similarity index 99% rename from kiss_processor.cpp rename to src/kiss_processor.cpp index d3aed67..e66c346 100644 --- a/kiss_processor.cpp +++ b/src/kiss_processor.cpp @@ -7,6 +7,7 @@ Processor::Processor() , usePrefix3_(false) , isRawIdle_(true) , state_(State::GetStart) + , dataType_(DataType::None) { } diff --git a/loraprs_service.cpp b/src/loraprs_service.cpp similarity index 99% rename from loraprs_service.cpp rename to src/loraprs_service.cpp index 96475bf..09e48d6 100644 --- a/loraprs_service.cpp +++ b/src/loraprs_service.cpp @@ -8,11 +8,14 @@ volatile bool Service::rigIsRxIsrEnabled_ = true; Service::Service() : Kiss::Processor() + , config_() , csmaP_(CfgCsmaPersistence) , csmaSlotTime_(CfgCsmaSlotTimeMs) , csmaSlotTimePrev_(0) + , beaconLastTimestampMs_(0) , rigCurrentTxPacketSize_(0) , isIsrInstalled_(false) + , rigIsImplicitMode_(false) , serialBt_() , serialBLE_() , kissServer_(new WiFiServer(CfgKissPort)) @@ -89,7 +92,7 @@ void Service::setup(const Config &conf) } // telemetry event - if (config_.TlmEnable) { + if (config_.TlmEnable && config_.IsClientMode) { LOG_INFO("Telemetry event is enabled"); telemetryTimer_.every(CfgTelemetryPeriodMs, sendModemTelemetryTimer, this); } diff --git a/esp32_loraprs.ino b/src/main.cpp similarity index 100% rename from esp32_loraprs.ino rename to src/main.cpp index b8da02f..a01b365 100644 --- a/esp32_loraprs.ino +++ b/src/main.cpp @@ -105,6 +105,11 @@ LoraPrs::Service loraPrsService; auto watchdogLedTimer = timer_create_default(); +bool toggleWatchdogLed(void *) { + digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED)); + return true; +} + void setup() { pinMode(BUILTIN_LED, OUTPUT); digitalWrite(BUILTIN_LED, 1); @@ -124,8 +129,3 @@ void loop() { loraPrsService.loop(); watchdogLedTimer.tick(); } - -bool toggleWatchdogLed(void *) { - digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED)); - return true; -}