Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions examples/companion_radio/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <helpers/SimpleMeshTables.h>
#include <helpers/IdentityStore.h>
#include <helpers/BaseSerialInterface.h>
#include <helpers/LocationProvider.h>
#include <RTClib.h>

/* ---------------------------------- CONFIGURATION ------------------------------------- */
Expand Down Expand Up @@ -63,6 +64,11 @@
#include <helpers/HeltecV3Board.h>
#include <helpers/CustomSX1262Wrapper.h>
static HeltecV3Board board;
#ifdef HAS_GPS
#include <helpers/MicroNMEALocationProvider.h>
HardwareSerial gps_serial = HardwareSerial(1);
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(gps_serial);
#endif
#elif defined(HELTEC_LORA_V2)
#include <helpers/HeltecV2Board.h>
#include <helpers/CustomSX1276Wrapper.h>
Expand All @@ -88,6 +94,9 @@
#include <helpers/nrf52/T1000eBoard.h>
#include <helpers/CustomLR1110Wrapper.h>
static T1000eBoard board;
#include <helpers/MicroNMEALocationProvider.h>
HardwareSerial& gps_serial = Serial1;
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(gps_serial);
#elif defined(HELTEC_T114)
#include <helpers/nrf52/T114Board.h>
#include <helpers/CustomSX1262Wrapper.h>
Expand Down Expand Up @@ -230,6 +239,10 @@ class MyMesh : public BaseChatMesh {
uint8_t app_target_ver;
uint8_t cmd_frame[MAX_FRAME_SIZE+1];
uint8_t out_frame[MAX_FRAME_SIZE+1];
#ifdef HAS_GPS
LocationProvider* _gps;
bool _time_sync_needed;
#endif

struct Frame {
uint8_t len;
Expand Down Expand Up @@ -699,6 +712,11 @@ class MyMesh : public BaseChatMesh {
_prefs.cr = LORA_CR;
_prefs.tx_power_dbm = LORA_TX_POWER;
//_prefs.rx_delay_base = 10.0f; enable once new algo fixed

#ifdef HAS_GPS
_gps = NULL;
_time_sync_needed = false;
#endif
}

void begin(FILESYSTEM& fs, mesh::RNG& trng) {
Expand Down Expand Up @@ -1254,6 +1272,32 @@ class MyMesh : public BaseChatMesh {
}
}

#ifdef HAS_GPS
void setLocationProvider(LocationProvider& lp) {
_gps = &lp;
_time_sync_needed = true;
}

void handleGps() {
static long next_gps_update = 0;
if (_gps != NULL) {
_gps->loop();

if (millisHasNowPassed(next_gps_update)) {
if (_gps->isValid()) {
_prefs.node_lat = ((double)_gps->getLatitude())/1000000.;
_prefs.node_lon = ((double)_gps->getLongitude())/1000000.;
if (_time_sync_needed) {
getRTCClock()->setCurrentTime(_gps->getTimestamp());
_time_sync_needed = false;
}
}
next_gps_update = futureMillis(5000);
}
}
}
#endif

void loop() {
BaseChatMesh::loop();

Expand Down Expand Up @@ -1281,6 +1325,10 @@ class MyMesh : public BaseChatMesh {
checkConnections();
}

#ifdef HAS_GPS
handleGps();
#endif

#ifdef DISPLAY_CLASS
ui_task.setHasConnection(_serial->isConnected());
ui_task.loop();
Expand Down Expand Up @@ -1408,6 +1456,15 @@ void setup() {
display.begin();
ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE, the_mesh.getBLEPin());
#endif

#ifdef HAS_GPS
#ifdef HELTEC_LORA_V3
gps_serial.setPins(GPS_RX_PIN, GPS_TX_PIN);
#endif
gps_serial.begin(GPS_BAUDRATE);
nmea.begin();
the_mesh.setLocationProvider(nmea);
#endif
}

void loop() {
Expand Down
15 changes: 15 additions & 0 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,19 @@ lib_deps =
${Heltec_lora32_v3.lib_deps}
densaugeo/base64 @ ~1.4.0

[env:Heltec_v3_companion_radio_ble_gps]
extends = env:Heltec_v3_companion_radio_ble
build_flags = ${env:Heltec_v3_companion_radio_ble.build_flags}
-D HAS_GPS
-D GPS_RX_PIN=34
-D GPS_TX_PIN=33
-D GPS_EN=47
-D GPS_RESET=48
-D GPS_BAUDRATE=9600
; -D GPS_NMEA_DEBUG
lib_deps = ${env:Heltec_v3_companion_radio_ble.lib_deps}
stevemarple/MicroNMEA @ ^2.0.6

[env:Heltec_v3_companion_radio_wifi]
extends = Heltec_lora32_v3
build_flags =
Expand Down Expand Up @@ -803,11 +816,13 @@ build_flags = ${t1000-e.build_flags}
-D BLE_DEBUG_LOGGING=1
-D MESH_PACKET_LOGGING=1
-D MESH_DEBUG=1
; -D GPS_NMEA_DEBUG=1 # print NMEA on the console
build_src_filter = ${t1000-e.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>
+<../examples/companion_radio/*.cpp>
lib_deps = ${t1000-e.lib_deps}
densaugeo/base64 @ ~1.4.0
stevemarple/MicroNMEA @ ^2.0.6

[nrf52840_t114]
extends = nrf52_base
Expand Down
16 changes: 16 additions & 0 deletions src/helpers/LocationProvider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#pragma once

#include "Mesh.h"


class LocationProvider {

public:
virtual long getLatitude() = 0;
virtual long getLongitude() = 0;
virtual bool isValid() = 0;
virtual long getTimestamp() = 0;
virtual void reset();
virtual void begin();
virtual void loop();
};
74 changes: 74 additions & 0 deletions src/helpers/MicroNMEALocationProvider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#pragma once

#include "LocationProvider.h"
#include <MicroNMEA.h>
#include <RTClib.h>

#ifndef GPS_EN
#define GPS_EN (-1)
#endif

#ifndef GPS_RESET
#define GPS_RESET (-1)
#endif

#ifndef GPS_RESET_FORCE
#define GPS_RESET_FORCE LOW
#endif

class MicroNMEALocationProvider : public LocationProvider {
char _nmeaBuffer[100];
MicroNMEA nmea;
Stream* _gps_serial;
int _pin_reset;
int _pin_en;

public :
MicroNMEALocationProvider(Stream& ser, int pin_reset = GPS_RESET, int pin_en = GPS_EN) :
_gps_serial(&ser), nmea(_nmeaBuffer, sizeof(_nmeaBuffer)), _pin_reset(pin_reset), _pin_en(pin_en) {
if (_pin_reset != -1) {
pinMode(_pin_reset, OUTPUT);
digitalWrite(_pin_reset, GPS_RESET_FORCE);
}
if (_pin_en != -1) {
pinMode(_pin_en, OUTPUT);
digitalWrite(_pin_en, LOW);
}
}

void begin() override {
if (_pin_reset != -1) {
digitalWrite(_pin_reset, !GPS_RESET_FORCE);
}
if (_pin_en != -1) {
digitalWrite(_pin_en, HIGH);
}
}

void reset() override {
if (_pin_reset != -1) {
digitalWrite(_pin_reset, GPS_RESET_FORCE);
delay(100);
digitalWrite(_pin_reset, !GPS_RESET_FORCE);
}
}

long getLatitude() override { return nmea.getLatitude(); }
long getLongitude() override { return nmea.getLongitude(); }
bool isValid() override { return nmea.isValid(); }

long getTimestamp() override {
DateTime dt(nmea.getYear(), nmea.getMonth(),nmea.getDay(),nmea.getHour(),nmea.getMinute(),nmea.getSecond());
return dt.unixtime();
}

void loop() override {
while (_gps_serial->available()) {
char c = _gps_serial->read();
#ifdef GPS_NMEA_DEBUG
Serial.print(c);
#endif
nmea.process(c);
}
}
};
2 changes: 2 additions & 0 deletions variants/t1000-e/variant.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@

#define GPS_EN (43) // P1.11
#define GPS_RESET (47) // P1.15
#define GPS_RESET_FORCE HIGH
#define GPS_BAUDRATE (115200)

#define GPS_VRTC_EN (8) // P0.8
#define GPS_SLEEP_INT (44) // P1.12
Expand Down