Skip to content

Commit 1616480

Browse files
committed
Add initial SARA support
1 parent 0685cbc commit 1616480

File tree

8 files changed

+551
-24
lines changed

8 files changed

+551
-24
lines changed

Firmware/RTK_Surveyor/Begin.ino

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ void beginBoard()
8989
pin_powerFastOff = 27;
9090
pin_adc39 = 39;
9191

92+
pin_radio_rx = 33;
93+
pin_radio_tx = 32;
94+
pin_radio_rst = 15;
95+
pin_radio_pwr = 4;
96+
pin_radio_cts = 5;
97+
//pin_radio_rts = 255; //Not implemented
98+
9299
pinMode(pin_powerSenseAndControl, INPUT_PULLUP);
93100
pinMode(pin_powerFastOff, INPUT);
94101

@@ -102,6 +109,10 @@ void beginBoard()
102109

103110
setMuxport(settings.dataPortChannel); //Set mux to user's choice: NMEA, I2C, PPS, or DAC
104111

112+
//CTS is active low. ESP32 pin 5 has pullup at POR. We must drive it low.
113+
pinMode(pin_radio_cts, OUTPUT);
114+
digitalWrite(pin_radio_cts, LOW);
115+
105116
strcpy(platformFilePrefix, "SFE_Facet");
106117
strcpy(platformPrefix, "Facet");
107118
}
@@ -543,5 +554,54 @@ void beginExternalTriggers()
543554
i2cGNSS.setAutoTIMTM2callback(&eventTriggerReceived); //Enable automatic TIM TM2 messages with callback to eventTriggerReceived
544555
else
545556
i2cGNSS.setAutoTIMTM2callback(NULL);
557+
}
558+
559+
//Test and begin serial1 connection with SARA
560+
void beginSARA()
561+
{
562+
mySARA = new SARA_R5(pin_radio_pwr, pin_radio_rst, 3);
563+
564+
//mySARA->enableDebugging();
565+
566+
int radioBaud = 115200;
567+
Serial1.begin(radioBaud, SERIAL_8N1, pin_radio_tx, pin_radio_rx); //RX, TX
568+
569+
if (isRadioConnected() == false)
570+
{
571+
log_d("Radio not detected");
572+
resetSARA();
573+
}
574+
575+
if (mySARA->begin(Serial1, radioBaud) == true)
576+
{
577+
log_d("Cellular connected");
578+
online.cellular = true;
579+
}
580+
else
581+
{
582+
log_d("Cellular failed to connected");
583+
online.cellular = false;
584+
}
585+
}
586+
587+
//At POR SARA is at 115200
588+
//SARA does not respond to AT commands for ~2s after POR
589+
//Quick test at 115200. Should respond immediately if not at POR.
590+
bool isRadioConnected()
591+
{
592+
for (int x = 0 ; x < 5 ; x++)
593+
{
594+
Serial1.print("AT\r");
595+
delay(10);
596+
597+
if (Serial1.available())
598+
{
599+
log_d("Radio Responded");
600+
return (true);
601+
}
602+
delay(10);
603+
}
546604

605+
log_d("No radio response");
606+
return (false);
547607
}

Firmware/RTK_Surveyor/Form.ino

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -316,12 +316,17 @@ void createSettingsString(char* settingsCSV)
316316
stringRecord(settingsCSV, "fixedAltitude", settings.fixedAltitude, 4);
317317

318318
stringRecord(settingsCSV, "enableNtripServer", settings.enableNtripServer);
319-
stringRecord(settingsCSV, "wifiSSID", settings.wifiSSID);
320-
stringRecord(settingsCSV, "wifiPW", settings.wifiPW);
321319
stringRecord(settingsCSV, "casterHost", settings.casterHost);
322320
stringRecord(settingsCSV, "casterPort", settings.casterPort);
323-
stringRecord(settingsCSV, "mountPoint", settings.mountPoint);
324-
stringRecord(settingsCSV, "mountPointPW", settings.mountPointPW);
321+
stringRecord(settingsCSV, "casterUser", settings.casterUser);
322+
stringRecord(settingsCSV, "casterUserPW", settings.casterUserPW);
323+
stringRecord(settingsCSV, "mountPointUpload", settings.mountPointUpload);
324+
stringRecord(settingsCSV, "mountPointPWUpload", settings.mountPointPWUpload);
325+
stringRecord(settingsCSV, "mountPointDownload", settings.mountPointDownload);
326+
stringRecord(settingsCSV, "mountPointPWDownload", settings.mountPointPWDownload);
327+
stringRecord(settingsCSV, "casterTransmitGGA", settings.casterTransmitGGA);
328+
stringRecord(settingsCSV, "wifiSSID", settings.wifiSSID);
329+
stringRecord(settingsCSV, "wifiPW", settings.wifiPW);
325330

326331
//Sensor Fusion Config
327332
stringRecord(settingsCSV, "enableSensorFusion", settings.enableSensorFusion);
@@ -404,10 +409,20 @@ void updateSettingWithValue(const char *settingName, const char* settingValueStr
404409
strcpy(settings.casterHost, settingValueStr);
405410
else if (strcmp(settingName, "casterPort") == 0)
406411
settings.casterPort = settingValue;
407-
else if (strcmp(settingName, "mountPoint") == 0)
408-
strcpy(settings.mountPoint, settingValueStr);
409-
else if (strcmp(settingName, "mountPointPW") == 0)
410-
strcpy(settings.mountPointPW, settingValueStr);
412+
else if (strcmp(settingName, "casterUser") == 0)
413+
strcpy(settings.casterUser, settingValueStr);
414+
else if (strcmp(settingName, "casterUserPW") == 0)
415+
strcpy(settings.casterUserPW, settingValueStr);
416+
else if (strcmp(settingName, "mountPointUpload") == 0)
417+
strcpy(settings.mountPointUpload, settingValueStr);
418+
else if (strcmp(settingName, "mountPointPWUpload") == 0)
419+
strcpy(settings.mountPointPWUpload, settingValueStr);
420+
else if (strcmp(settingName, "mountPointDownload") == 0)
421+
strcpy(settings.mountPointDownload, settingValueStr);
422+
else if (strcmp(settingName, "mountPointPWDownload") == 0)
423+
strcpy(settings.mountPointPWDownload, settingValueStr);
424+
else if (strcmp(settingName, "casterTransmitGGA") == 0)
425+
settings.casterTransmitGGA = settingValueBool;
411426
else if (strcmp(settingName, "wifiSSID") == 0)
412427
strcpy(settings.wifiSSID, settingValueStr);
413428
else if (strcmp(settingName, "wifiPW") == 0)

Firmware/RTK_Surveyor/NVM.ino

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,13 @@ void recordSystemSettingsToFile()
152152
settingsFile.println("enableNtripServer=" + (String)settings.enableNtripServer);
153153
settingsFile.println("casterHost=" + (String)settings.casterHost);
154154
settingsFile.println("casterPort=" + (String)settings.casterPort);
155-
settingsFile.println("mountPoint=" + (String)settings.mountPoint);
156-
settingsFile.println("mountPointPW=" + (String)settings.mountPointPW);
155+
settingsFile.println("casterUser=" + (String)settings.casterUser);
156+
settingsFile.println("casterUserPW=" + (String)settings.casterUserPW);
157+
settingsFile.println("mountPointUpload=" + (String)settings.mountPointUpload);
158+
settingsFile.println("mountPointPWUpload=" + (String)settings.mountPointPWUpload);
159+
settingsFile.println("mountPointDownload=" + (String)settings.mountPointDownload);
160+
settingsFile.println("mountPointPWDownload=" + (String)settings.mountPointPWDownload);
161+
settingsFile.println("casterTransmitGGA=" + (String)settings.casterTransmitGGA);
157162
settingsFile.println("wifiSSID=" + (String)settings.wifiSSID);
158163
settingsFile.println("wifiPW=" + (String)settings.wifiPW);
159164
settingsFile.println("surveyInStartingAccuracy=" + (String)settings.surveyInStartingAccuracy);
@@ -392,10 +397,21 @@ bool parseLine(char* str) {
392397
strcpy(settings.casterHost, settingValue);
393398
else if (strcmp(settingName, "casterPort") == 0)
394399
settings.casterPort = d;
395-
else if (strcmp(settingName, "mountPoint") == 0)
396-
strcpy(settings.mountPoint, settingValue);
397-
else if (strcmp(settingName, "mountPointPW") == 0)
398-
strcpy(settings.mountPointPW, settingValue);
400+
401+
else if (strcmp(settingName, "casterUser") == 0)
402+
strcpy(settings.casterUser, settingValue);
403+
else if (strcmp(settingName, "casterUserPW") == 0)
404+
strcpy(settings.casterUserPW, settingValue);
405+
else if (strcmp(settingName, "mountPointUpload") == 0)
406+
strcpy(settings.mountPointUpload, settingValue);
407+
else if (strcmp(settingName, "mountPointPWUpload") == 0)
408+
strcpy(settings.mountPointPWUpload, settingValue);
409+
else if (strcmp(settingName, "mountPointDownload") == 0)
410+
strcpy(settings.mountPointDownload, settingValue);
411+
else if (strcmp(settingName, "mountPointPWDownload") == 0)
412+
strcpy(settings.mountPointPWDownload, settingValue);
413+
else if (strcmp(settingName, "casterTransmitGGA") == 0)
414+
settings.casterTransmitGGA = d;
399415
else if (strcmp(settingName, "wifiSSID") == 0)
400416
strcpy(settings.wifiSSID, settingValue);
401417
else if (strcmp(settingName, "wifiPW") == 0)

Firmware/RTK_Surveyor/RTK_Surveyor.ino

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,18 @@
3939
(Done) Firmware upgrade menu
4040
Enable various debug outputs sent over BT
4141
42+
TODO:
43+
Change AP to 'mountPointUpload' and PW upload
44+
Add mountPointDownload and PWDownload to AP config
45+
Add casterTransmitGGA to AP config
46+
Add casterUser/PW to AP ocnfig
47+
4248
*/
4349

4450
const int FIRMWARE_VERSION_MAJOR = 1;
4551
const int FIRMWARE_VERSION_MINOR = 10;
4652

47-
//#define COMPILE_WIFI //Comment out to remove all WiFi functionality
53+
#define COMPILE_WIFI //Comment out to remove all WiFi functionality
4854
//#define COMPILE_BT //Comment out to disable all Bluetooth
4955
#define ENABLE_DEVELOPER //Uncomment this line to enable special developer modes (don't check power button at startup)
5056

@@ -82,6 +88,14 @@ int pin_powerFastOff;
8288
int pin_dac26;
8389
int pin_adc39;
8490
int pin_peripheralPowerControl;
91+
92+
int pin_radio_rx;
93+
int pin_radio_tx;
94+
int pin_radio_rst;
95+
int pin_radio_pwr;
96+
int pin_radio_cts;
97+
int pin_radio_rts;
98+
8599
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
86100

87101
//I2C for GNSS, battery gauge, display, accelerometer
@@ -298,6 +312,16 @@ int incomingSettingsSpot = 0;
298312
unsigned long timeSinceLastIncomingSetting = 0;
299313
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
300314

315+
//Cellular Radio
316+
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
317+
#include <SparkFun_u-blox_SARA-R5_Arduino_Library.h> //Click here to get the library: http://librarymanager/All#SparkFun_u-blox_SARA-R5_Arduino_Library
318+
SARA_R5 *mySARA = NULL; //We can't instantiate here because we don't yet know what pin numbers to use
319+
320+
#include "base64.h" //Built-in ESP32 library. Needed for Caster credentials.
321+
322+
int socketNumber = -1;
323+
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
324+
301325
//Global variables
302326
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
303327
uint8_t unitMACAddress[6]; //Use MAC address in BT broadcast and display
@@ -358,6 +382,19 @@ bool newEventToRecord = false; //Goes true when INT pin goes high
358382
uint32_t triggerCount = 0; //Global copy - TM2 event counter
359383
uint32_t towMsR = 0; //Global copy - Time Of Week of rising edge (ms)
360384
uint32_t towSubMsR = 0; //Global copy - Millisecond fraction of Time Of Week of rising edge in nanoseconds
385+
386+
long lastReceivedRTCM_ms = 0; //5 RTCM messages take approximately ~300ms to arrive at 115200bps
387+
int timeBetweenGGAUpdate_ms = 10000; //GGA is required for Rev2 NTRIP casters. Don't transmit but once every 10 seconds
388+
long lastTransmittedGGA_ms = 0;
389+
390+
//Used for GGA sentence parsing from incoming NMEA
391+
bool ggaSentenceStarted = false;
392+
bool ggaSentenceComplete = false;
393+
bool ggaTransmitComplete = false; //Goes true once we transmit GGA to the caster
394+
char ggaSentence[128] = {0};
395+
byte ggaSentenceSpot = 0;
396+
int ggaSentenceEndSpot = 0;
397+
361398
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
362399

363400
void setup()
@@ -391,6 +428,8 @@ void setup()
391428

392429
beginAccelerometer();
393430

431+
//beginSARA();
432+
394433
beginExternalTriggers(); //Configure the time pulse output and TM2 input
395434

396435
beginSystemState(); //Determine initial system state. Start task for button monitoring.

0 commit comments

Comments
 (0)