Skip to content

Commit debbfe3

Browse files
committed
Adding skeleton for GPS functionality.
1 parent e3bd6b8 commit debbfe3

File tree

2 files changed

+190
-6
lines changed

2 files changed

+190
-6
lines changed

src/SparkFun_LTE_Shield_Arduino_Library.cpp

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ const char LTE_SHIELD_LISTEN_SOCKET[] = "+USOLI"; // Listen for connection on s
6565
// ### SMS
6666
const char LTE_SHIELD_MESSAGE_FORMAT[] = "+CMGF"; // Set SMS message format
6767
const char LTE_SHIELD_SEND_TEXT[] = "+CMGS"; // Send SMS message
68+
// ### GPS
69+
const char LTE_SHIELD_GPS_POWER[] = "+UGPS";
70+
const char LTE_SHIELD_GPS_REQUEST_LOCATION[] = "+ULOC";
6871

6972
const char LTE_SHIELD_RESPONSE_OK[] = "OK\r\n";
7073

@@ -193,6 +196,18 @@ boolean LTE_Shield::poll(void)
193196
handled = true;
194197
}
195198
}
199+
{
200+
if (strstr(lteShieldRXBuffer, "+UULOC"))
201+
{
202+
// Found a Location string!
203+
Serial.println("Found location string!");
204+
Serial.println(lteShieldRXBuffer);
205+
}
206+
// Look for +UULOC
207+
// Either: +UULOC: DD/MM/YYYY,HH:MM:SS.sss,lat.lat,lon.lon,alt,uncertainty,
208+
// speed,direction,vertical_acc,sv_used,antenna_status,jamming_status
209+
// Or: DD/MM/YYYY,HH:MM:SS.sss,lat.lat,lon.lon,alt,uncertainty
210+
}
196211

197212
if ( (handled == false) && (strlen(lteShieldRXBuffer) > 2) )
198213
{
@@ -849,6 +864,109 @@ IPAddress LTE_Shield::lastRemoteIP(void)
849864
return _lastRemoteIP;
850865
}
851866

867+
LTE_Shield_error_t LTE_Shield::gpsPower(boolean enable, gnss_system_t gnss_sys)
868+
{
869+
LTE_Shield_error_t err;
870+
char * command;
871+
872+
command = lte_calloc_char(strlen(LTE_SHIELD_GPS_POWER) + 8);
873+
if (command == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
874+
if (enable)
875+
{
876+
sprintf(command, "%s=1,0,%d", LTE_SHIELD_GPS_POWER, gnss_sys);
877+
}
878+
else
879+
{
880+
sprintf(command, "%s=0", LTE_SHIELD_GPS_POWER);
881+
}
882+
883+
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, NULL, 10000);
884+
885+
free(command);
886+
return err;
887+
}
888+
889+
LTE_Shield_error_t LTE_Shield::gpsEnableClock(boolean enable)
890+
{
891+
// AT+UGZDA=<0,1>
892+
}
893+
894+
LTE_Shield_error_t LTE_Shield::gpsGetClock(struct ClockData * clock)
895+
{
896+
// AT+UGZDA?
897+
}
898+
899+
LTE_Shield_error_t LTE_Shield::gpsEnableFix(boolean enable)
900+
{
901+
// AT+UGGGA=<0,1>
902+
}
903+
904+
LTE_Shield_error_t LTE_Shield::gpsGetFix(struct PositionData * pos)
905+
{
906+
// AT+UGGGA?
907+
}
908+
909+
LTE_Shield_error_t LTE_Shield::gpsEnablePos(boolean enable)
910+
{
911+
// AT+UGGLL=<0,1>
912+
}
913+
LTE_Shield_error_t LTE_Shield::gpsGetPos(struct PositionData * pos)
914+
{
915+
// AT+UGGLL?
916+
}
917+
918+
LTE_Shield_error_t LTE_Shield::gpsEnableSat(boolean enable)
919+
{
920+
// AT+UGGSV=<0,1>
921+
}
922+
923+
LTE_Shield_error_t LTE_Shield::gpsGetSat(uint8_t * sats)
924+
{
925+
// AT+UGGSV?
926+
}
927+
928+
LTE_Shield_error_t LTE_Shield::gpsEnableRmc(boolean enable)
929+
{
930+
// AT+UGRMC=<0,1>
931+
}
932+
933+
LTE_Shield_error_t LTE_Shield::gpsGetRmc(struct PositionData * pos, struct SpeedData * speed,
934+
struct DateData * date, boolean * valid)
935+
{
936+
// AT+UGRMC?
937+
}
938+
939+
LTE_Shield_error_t LTE_Shield::gpsEnableSpeed(boolean enable)
940+
{
941+
// AT+UGVTG=<0,1>
942+
}
943+
944+
LTE_Shield_error_t LTE_Shield::gpsGetSpeed(struct SpeedData * speed)
945+
{
946+
// AT+UGVTG?
947+
}
948+
949+
LTE_Shield_error_t LTE_Shield::gpsRequest(unsigned int timeout, unsigned int accuracy,
950+
boolean detailed)
951+
{
952+
// AT+ULOC=2,<useCellLocate>,<detailed>,<timeout>,<accuracy>
953+
LTE_Shield_error_t err;
954+
char * command;
955+
956+
if (timeout > 999) timeout = 999;
957+
if (accuracy > 999999) accuracy = 999999;
958+
959+
command = lte_calloc_char(strlen(LTE_SHIELD_GPS_REQUEST_LOCATION) + 24);
960+
if (command == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
961+
sprintf(command, "%s=2,3,%d,%d,%d", LTE_SHIELD_GPS_REQUEST_LOCATION,
962+
detailed ? 1 : 0, timeout, accuracy);
963+
964+
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, NULL, 10000);
965+
966+
free(command);
967+
return err;
968+
}
969+
852970
/////////////
853971
// Private //
854972
/////////////
@@ -883,6 +1001,7 @@ LTE_Shield_error_t LTE_Shield::init(unsigned long baud,
8831001

8841002
_baud = baud;
8851003
setGpioMode(GPIO1, NETWORK_STATUS);
1004+
setGpioMode(GPIO2, GNSS_SUPPLY_ENABLE);
8861005
setSMSMessageFormat(LTE_SHIELD_MESSAGE_FORMAT_TEXT);
8871006
autoTimeZone(true);
8881007
for (int i = 0; i < LTE_SHIELD_NUM_SOCKETS; i++)

src/SparkFun_LTE_Shield_Arduino_Library.h

Lines changed: 71 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ typedef enum {
6666
} mobile_network_operator_t;
6767

6868
typedef enum {
69-
LTE_SHIELD_ERROR_INVALID = -1,
70-
LTE_SHIELD_ERROR_SUCCESS = 0,
71-
LTE_SHIELD_ERROR_OUT_OF_MEMORY,
72-
LTE_SHIELD_ERROR_TIMEOUT,
73-
LTE_SHIELD_ERROR_UNEXPECTED_PARAM,
74-
LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE,
69+
LTE_SHIELD_ERROR_INVALID = -1, // 1
70+
LTE_SHIELD_ERROR_SUCCESS = 0, // 2
71+
LTE_SHIELD_ERROR_OUT_OF_MEMORY, // 3
72+
LTE_SHIELD_ERROR_TIMEOUT, // 4
73+
LTE_SHIELD_ERROR_UNEXPECTED_PARAM, // 5
74+
LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE, // 6
7575
LTE_SHIELD_ERROR_NO_RESPONSE
7676
} LTE_Shield_error_t;
7777
#define LTE_SHIELD_SUCCESS LTE_SHIELD_ERROR_SUCCESS
@@ -90,6 +90,40 @@ typedef enum {
9090
LTE_SHIELD_REGISTRATION_ROAMING_CSFB_NOT_PREFERRED = 9
9191
} LTE_Shield_registration_status_t;
9292

93+
struct DateData {
94+
uint8_t day;
95+
uint8_t month;
96+
uint8_t year;
97+
};
98+
99+
struct TimeData {
100+
uint8_t hour;
101+
uint8_t minute;
102+
uint8_t second;
103+
uint8_t tzh;
104+
uint8_t tzm;
105+
};
106+
107+
struct ClockData {
108+
struct DateData date;
109+
struct TimeData time;
110+
};
111+
112+
struct PositionData {
113+
float utc;
114+
float lat;
115+
float latDir;
116+
float lon;
117+
float lonDir;
118+
float alt;
119+
};
120+
121+
struct SpeedData {
122+
float speed;
123+
float tack;
124+
float magVar;
125+
};
126+
93127
typedef enum {
94128
LTE_SHIELD_TCP = 6,
95129
LTE_SHIELD_UDP = 17
@@ -194,6 +228,36 @@ class LTE_Shield : public Print {
194228
LTE_Shield_error_t socketListen(int socket, unsigned int port);
195229
IPAddress lastRemoteIP(void);
196230

231+
// GPS
232+
typedef enum {
233+
GNSS_SYSTEM_GPS = 1,
234+
GNSS_SYSTEM_SBAS = 2,
235+
GNSS_SYSTEM_GALILEO = 4,
236+
GNSS_SYSTEM_BEIDOU = 8,
237+
GNSS_SYSTEM_IMES = 16,
238+
GNSS_SYSTEM_QZSS = 32,
239+
GNSS_SYSTEM_GLONASS = 64
240+
} gnss_system_t;
241+
LTE_Shield_error_t gpsPower(boolean enable = true,
242+
gnss_system_t gnss_sys = GNSS_SYSTEM_GPS);
243+
LTE_Shield_error_t gpsEnableClock(boolean enable = true);
244+
LTE_Shield_error_t gpsGetClock(struct ClockData * clock);
245+
LTE_Shield_error_t gpsEnableFix(boolean enable = true);
246+
LTE_Shield_error_t gpsGetFix(float * lat, float * lon,
247+
unsigned int * alt, uint8_t * quality, uint8_t * sat);
248+
LTE_Shield_error_t gpsGetFix(struct PositionData * pos);
249+
LTE_Shield_error_t gpsEnablePos(boolean enable = true);
250+
LTE_Shield_error_t gpsGetPos(struct PositionData * pos);
251+
LTE_Shield_error_t gpsEnableSat(boolean enable = true);
252+
LTE_Shield_error_t gpsGetSat(uint8_t * sats);
253+
LTE_Shield_error_t gpsEnableRmc(boolean enable = true);
254+
LTE_Shield_error_t gpsGetRmc(struct PositionData * pos, struct SpeedData * speed,
255+
struct DateData * date, boolean * valid);
256+
LTE_Shield_error_t gpsEnableSpeed(boolean enable = true);
257+
LTE_Shield_error_t gpsGetSpeed(struct SpeedData * speed);
258+
259+
LTE_Shield_error_t gpsRequest(unsigned int timeout, unsigned int accuracy, boolean detailed);
260+
197261
private:
198262

199263
HardwareSerial * _hardSerial;
@@ -209,6 +273,7 @@ class LTE_Shield : public Print {
209273

210274
void (*_socketReadCallback)(int, String);
211275
void (*_socketCloseCallback)(int);
276+
void (*_gpsRequestCallback)(ClockData time, PositionData gps, unsigned long uncertainty);
212277

213278
typedef enum {
214279
LTE_SHIELD_INIT_STANDARD,

0 commit comments

Comments
 (0)