The program sends the current location over the cellular network.

Dependencies:   aconno_I2C ublox-at-cellular-interface gnss ublox-cellular-base Lis2dh12 ublox-cellular-base-n2xx ublox-at-cellular-interface-n2xx low-power-sleep

Fork of example-gnss by u-blox

Files at this revision

API Documentation at this revision

Comitter:
jurica238814
Date:
Wed Dec 19 15:12:25 2018 +0100
Parent:
8:2bf886335fd0
Commit message:
Stable version

Changed in this revision

UBloxSara/uBloxSara.cpp Show annotated file Show diff for this revision Revisions of this file
UBloxSara/uBloxSara.h Show annotated file Show diff for this revision Revisions of this file
aconnoConfig/aconnoConfig.h Show annotated file Show diff for this revision Revisions of this file
aconnoHelpers/aconnoHelpers.cpp Show annotated file Show diff for this revision Revisions of this file
aconnoHelpers/aconnoHelpers.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
tasks/tasks.cpp Show annotated file Show diff for this revision Revisions of this file
tasks/tasks.h Show annotated file Show diff for this revision Revisions of this file
--- a/UBloxSara/uBloxSara.cpp	Fri Nov 30 16:19:41 2018 +0100
+++ b/UBloxSara/uBloxSara.cpp	Wed Dec 19 15:12:25 2018 +0100
@@ -24,8 +24,14 @@
     /* Give modem a little time to settle down */
     wait_ms(250);
 
-    printf("Powering up the modem...\r\n");
-    //onboard_modem_power_up();
+    if(!CUSTOM_BOARD)
+    {
+        // DO NOT CALL THIS IF YOU WORK ON ACONNO CUSTOM MADE BOARD
+        // POWER UP PIN (PE_14) IS CONNECTED ON OC DIGITAL OUTPUT
+        // AND POWER UP PIN IS NOT CONNECTED ON SARA MODULE
+        onboard_modem_power_up();
+    }
+    
     wait_ms(5000);
 
     sendCommand("AT+CFUN=1");
@@ -122,26 +128,35 @@
 	sprintf(myCommandbuffer,"AT+NSOST=0,\"%s\",%d,%d,\"%s\"",
 		_udp._ip, _udp._port, msgSize, data);
 
-    msgSize += strlen(flags);
-    sprintf(myCommandbuffer,"AT+NSOST=0,\"%s\",%d,%d,\"%s%s\"",
-		_udp._ip, _udp._port, msgSize, flagsHex, data);
+    //msgSize += strlen(flags);
+    //sprintf(myCommandbuffer,"AT+NSOST=0,\"%s\",%d,%d,\"%s%s\"",
+	//	_udp._ip, _udp._port, msgSize, flagsHex, data);
 	sendCommand(myCommandbuffer);
 }
 
+#define SHORT_DELAY_MS      (1000)
 uint8_t UBloxSara::connectNB()
 {
 	sendCommand("at+NCONFIG=\"AUTOCONNECT\",\"FALSE\"");
+    wait_ms(SHORT_DELAY_MS);
     sendCommand("at+NCONFIG=\"CR_0354_0338_SCRAMBLING\",\"TRUE\"");
-
+    wait_ms(SHORT_DELAY_MS);
     sendCommand("at+NCONFIG=\"CR_0859_SI_AVOID\",\"TRUE\"");
+    wait_ms(SHORT_DELAY_MS);
     sendCommand("at+NCONFIG?");
+    wait_ms(SHORT_DELAY_MS);
     sendCommand("at+cfun=0");
+    wait_ms(SHORT_DELAY_MS);
     sendCommand("AT+CGDCONT=1, \"IP\",\"nb.inetd.gdsp\"");
+    wait_ms(SHORT_DELAY_MS);
     sendCommand("at+cfun=1");
+    wait_ms(SHORT_DELAY_MS);
 
     sendCommand("at+cimi");
+    wait_ms(SHORT_DELAY_MS);
 
     sendCommand("at+cgatt=1");
+    wait_ms(SHORT_DELAY_MS);
 
     sendCommand("at+cops=1,2,\"26202\"");
     wait_ms(5000);
@@ -152,9 +167,11 @@
     sendCommand("AT+COPS?");
     sendCommand("AT+NBAND?");
     sendCommand("AT+NBAND=20");
+    wait_ms(SHORT_DELAY_MS);
     sendCommand("AT+NUESTATS");
-
+    wait_ms(SHORT_DELAY_MS);
     sendCommand("AT+CGATT?");
     wait_ms(5000);
     sendCommand("AT+CGPADDR");
+    wait_ms(SHORT_DELAY_MS);
 }
--- a/UBloxSara/uBloxSara.h	Fri Nov 30 16:19:41 2018 +0100
+++ b/UBloxSara/uBloxSara.h	Wed Dec 19 15:12:25 2018 +0100
@@ -10,6 +10,8 @@
 #include "mbed.h"
 #include "udp.h"
 
+#define CUSTOM_BOARD            (1)
+
 class UBloxSara
 {
 	public:
--- a/aconnoConfig/aconnoConfig.h	Fri Nov 30 16:19:41 2018 +0100
+++ b/aconnoConfig/aconnoConfig.h	Wed Dec 19 15:12:25 2018 +0100
@@ -22,12 +22,15 @@
 #define TARGET_STM				(1)
 #define UDP_MSG_SIZE_B			(50)
 
+// Max wait time to get new location [s]
+#define MAX_TIME_GNSS_WAIT_S    (10)
 #define START_ALARM_S           (1)
 #define STOP_ALARM_S            (5)
 #define BUTTON_PRESSED_SIGNAL   (0x12002300)
 #define ALARM_SIGNAL            (0x12341230)   
 #define ALARM_OFF_SIGNAL        (0x12341231)
 #define IDLE_SIGNAL             (0x12341232)
+#define LOCATION_SEARCH_DONE    (0x12341233)
 
 #define UPDATE_LOCATION_TIME_MS (5000)
 
--- a/aconnoHelpers/aconnoHelpers.cpp	Fri Nov 30 16:19:41 2018 +0100
+++ b/aconnoHelpers/aconnoHelpers.cpp	Wed Dec 19 15:12:25 2018 +0100
@@ -10,13 +10,24 @@
 #include "gnss.h"
 #include "aconnoConfig.h"
 
-bool getGPSData(char *location, GnssSerial *gnss)
+bool getGPSData(char *location, GnssSerial *gnss, uint32_t timeoutS)
 {
 	int gnssReturnCode;
-    int length;
-    char buffer[505];
+	int length;
+	char buffer[505];
 	bool gotLocationFlag = false;
-	
+	int begin;
+	int end;
+
+	if(!timeoutS)
+	{
+		// Max number of seconds
+		timeoutS -= 1;
+	}
+
+	Timer timeoutTimer;
+	timeoutTimer.start();
+	begin = timeoutTimer.read();
 	do
 	{
 		gnssReturnCode = gnss->getMessage(buffer, sizeof(buffer));
@@ -26,50 +37,32 @@
 			length = LENGTH(gnssReturnCode);
 			if ((PROTOCOL(gnssReturnCode) == GnssParser::NMEA) && (length > 6))
 			{
-				// Talker is $GA=Galileo $GB=Beidou $GL=Glonass $GN=Combined $GP=GNSS
+				// Talker is $GA=Galileo $GB=Beidou $GL=Glonass 
+				// $GN=Combined $GP=GNSS
 				if ((buffer[0] == '$') || buffer[1] == 'G')
 				{
-				  if (CHECK_TALKER("GLL"))
-				  {
-					  	
+					if (CHECK_TALKER("GLL"))
+					{
+
 						double latitude = 0, longitude = 0;
 						char ch;
 						if (gnss->getNmeaAngle(1, buffer, length, latitude) &&
 							gnss->getNmeaAngle(3, buffer, length, longitude) &&
-							gnss->getNmeaItem(6, buffer, length, ch) && (ch == 'A')) {
-							sprintf(location, "GNSS: location is %.5f %.5f.", latitude, longitude);
-							//printf("I am here: https://maps.google.com/?q=%.5f,%.5f\r\n\r\n",
-							//	   latitude, longitude);
+							gnss->getNmeaItem(6, buffer, length, ch) && 
+											 (ch == 'A'))
+						{
+							sprintf(location, "%.5f %.5f", latitude, longitude);
 							printf("Got location!\r\n");
 							gotLocationFlag = true;
 						}
 					}
-					else if (CHECK_TALKER("GGA"))
-					{
-						double altitude = 0;
-						const char *timeString = NULL;
-						// Altitude
-						if (gnss->getNmeaItem(9, buffer, length, altitude))
-						{
-							printf("\r\nGNSS: altitude is %.1f m.\r\n", altitude);
-						}
-						// Time
-						timeString = gnss->findNmeaItemPos(1, buffer, buffer + length);
-						if (timeString != NULL) {
-							printf("\r\nGNSS: time is %.6s.\r\n\r\n", timeString);
-						}
-					}
-					else if (CHECK_TALKER("VTG"))
-					{
-						double speed = 0;
-						// Speed
-						if (gnss->getNmeaItem(7, buffer, length, speed))
-						{
-							printf("\r\nGNSS: speed is %.1f km/h.\r\n\r\n", speed);
-						}
-					}
 				}
 			}
 		}
-	}while(!gotLocationFlag);
+		end = timeoutTimer.read();
+	} while (!gotLocationFlag && (end - begin) < timeoutS);
+	
+	printf("Location time: %d\r\n", (end - begin));
+	return gotLocationFlag;
 }
+
--- a/aconnoHelpers/aconnoHelpers.h	Fri Nov 30 16:19:41 2018 +0100
+++ b/aconnoHelpers/aconnoHelpers.h	Wed Dec 19 15:12:25 2018 +0100
@@ -25,6 +25,6 @@
  */
 void reverse(char *str);
 
-bool getGPSData(char *location, GnssSerial *gnss);
+bool getGPSData(char *location, GnssSerial *gnss, uint32_t timeoutS = 0);
 
 #endif	//
--- a/main.cpp	Fri Nov 30 16:19:41 2018 +0100
+++ b/main.cpp	Wed Dec 19 15:12:25 2018 +0100
@@ -18,8 +18,10 @@
 #define RED_LED_PIN			(PE_3)
 #define GREEN_LED_PIN		(PE_4)
 #define BLUE_LED_PIN		(PE_1)
+#define ALARM_OFF           (0)
+#define ALARM_ON            (1)
 
-MainStates state = STATE_IDLE;
+volatile MainStates state = STATE_IDLE;
 
 /* File handler */
 FileHandle *fh;
@@ -30,12 +32,12 @@
 char locationGlobal[UDP_MSG_SIZE_B];
 bool gotGnssFlag = false;
 DigitalIn userButton(USER_BUTTON);
-DigitalOut gnssPower(PE_0, 1);
+DigitalOut gnssPower(PE_0, 0);
 
 DigitalOut redLed(RED_LED_PIN);
 DigitalOut blueLed(BLUE_LED_PIN);
 DigitalOut greenLed(GREEN_LED_PIN);
-DigitalOut alarm(PE_14);
+DigitalOut alarm(PE_14, 0);
 InterruptIn buttonInt(USER_BUTTON);
 
 static bool wasAccInt = false;
@@ -47,7 +49,6 @@
 Thread alarmState; 
 Thread alarmOffState; 
 Thread movementState; 
-Thread ledState;
 Thread gnssLocation;
 
 void my_bsp_init()
@@ -55,7 +56,7 @@
     redLed = 1;
     greenLed = 1;
     blueLed = 1;
-    alarm = 0;
+    alarm = ALARM_OFF;
 }
 
 void buttonRiseHandler(void)
@@ -95,24 +96,13 @@
     }
 }
 
-void ledBlinky()
-{
-    while(!gotGnssFlag)
-    {
-        redLed = !redLed;
-        greenLed = !greenLed;
-        Thread::wait(1000);
-    }
-}
-
 int main()
 {
     bool success = false;
     MainStates nextState = STATE_IDLE;
-
-    my_bsp_init();
     
     buttonInt.rise(buttonRiseHandler);
+    my_bsp_init();
 
     printf("Initialising UART for modem communication: ");
     fh = new UARTSerial(MDMTXD, MDMRXD, 9600);
@@ -124,7 +114,7 @@
     printf("...done\r\n");
 
 	gnssPower = 1;
-    ledState.start(ledBlinky);
+    wait_ms(500);
 
     if(gnss.init())
 	{
@@ -132,7 +122,6 @@
         getGPSData(locationGlobal, &gnss);
         printf("I have the location.\r\n");
         gotGnssFlag = true;
-        ledState.terminate();
         // Turn green led only
         greenLed = 0;
         redLed = 1;
@@ -142,16 +131,16 @@
         printf("Unable to initialise GNSS.\r\n");
     }
 
-    greenLed = 1; 
-    blueLed = 0;
-
     Udp udp("52.215.10.12", 3334);
     UBloxSara sara(at, udp);
     printf("Initializing the modem: \r\n");
 	sara.setup();
+    sara.connectNB();
     printf("done...\r\n");
-    sara.connectNB();
 
+    alarm = ALARM_OFF;
+    greenLed = 1; 
+    blueLed = 0;
     myParams_t myParams;
     myParams.gnss = &gnss;
     myParams.sara = &sara;
@@ -195,13 +184,13 @@
                 }
                 else
                 {
-                    alarm = 1;
+                    alarm = ALARM_ON;
                 }
             	break;
             case STATE_ALARM_OFF:
                 nextState = STATE_IDLE;
                 idleState.signal_set(IDLE_SIGNAL);
-                alarm = 0;
+                alarm = ALARM_OFF;
                 blueLed = 0;
 				break;
             case STATE_LIS_DETECTION:
--- a/tasks/tasks.cpp	Fri Nov 30 16:19:41 2018 +0100
+++ b/tasks/tasks.cpp	Wed Dec 19 15:12:25 2018 +0100
@@ -10,8 +10,10 @@
 #include "gnss.h"
 #include "aconnoConfig.h"
 
-extern MainStates state;
-extern char locationGlobal[UDP_MSG_SIZE_B];
+extern volatile MainStates state;
+extern char locationGlobal[5*UDP_MSG_SIZE_B];
+extern Thread alarmState;
+locationFlag_t locationFlagGlobal = OLD;
 
 void idleCallback()
 {
@@ -29,17 +31,25 @@
 
 void alarmCallback(myParams_t *myParams)
 {
-    //char udpMsg[UDP_MSG_SIZE_B];
+    char udpMsg[UDP_MSG_SIZE_B];
     
     while(1)
     {
-        Thread::signal_wait(ALARM_SIGNAL);
-        Thread::signal_clr(ALARM_SIGNAL);
-        printf("Alarm thread.\r\n");
         while(state == STATE_ALARM)
         {
+            Thread::signal_wait(LOCATION_SEARCH_DONE);
+            Thread::signal_clr(LOCATION_SEARCH_DONE);
+            if(locationFlagGlobal)
+            {
+                sprintf(udpMsg, "$location_flag:%s;$type:NEW;",locationGlobal);
+            }
+            else
+            {
+                sprintf(udpMsg, "$location_flag:%s;$type:OLD;",locationGlobal);
+            }
             printf("Sending location on server...\r\n");
-            myParams->sara->sendUdpMsg(locationGlobal);
+            printf("%s\r\n", udpMsg);
+            myParams->sara->sendUdpMsg(udpMsg);
             wait_ms(5000);
         }
     }
@@ -77,7 +87,17 @@
     {
         while(state == STATE_ALARM)
         {
-            getGPSData(locationGlobal, gnss);
+            if(getGPSData(locationGlobal, gnss, MAX_TIME_GNSS_WAIT_S))
+            {
+                printf("New location.\r\n");
+                locationFlagGlobal = NEW;
+            }
+            else
+            {
+                printf("Old location.\r\n");
+                locationFlagGlobal = OLD;
+            }
+            alarmState.signal_set(LOCATION_SEARCH_DONE);
             Thread::wait(UPDATE_LOCATION_TIME_MS);
         }
     }
--- a/tasks/tasks.h	Fri Nov 30 16:19:41 2018 +0100
+++ b/tasks/tasks.h	Wed Dec 19 15:12:25 2018 +0100
@@ -19,6 +19,12 @@
     UBloxSara *sara;
 };
 
+enum locationFlag_t
+{
+    OLD,
+    NEW
+};
+
 enum MainStates
 {
     STATE_IDLE,