Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed BufferedSerial
Revision 1:16fdeb024e42, committed 2020-05-09
- Comitter:
- toanatron
- Date:
- Sat May 09 20:09:37 2020 +0000
- Parent:
- 0:c9d0008613d6
- Commit message:
- update;
Changed in this revision
| BufferedSerial.lib | Show annotated file Show diff for this revision Revisions of this file |
| GSMProgramAutomation.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BufferedSerial.lib Sat May 09 20:09:37 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/sam_grove/code/BufferedSerial/#7e5e866edd3d
--- a/GSMProgramAutomation.cpp Sat Feb 01 17:53:46 2020 +0000
+++ b/GSMProgramAutomation.cpp Sat May 09 20:09:37 2020 +0000
@@ -1,65 +1,166 @@
#include "mbed.h"
+#include <iostream>
+#include <string.h>
+#include <stdio.h>
+#include <sstream>
+#include <vector>
+#include "BufferedSerial.h"
#define CTRL_Z 26 //Attach at the end of this message string
+Timer mytime;
-Serial pc(USBTX, USBRX);
-Serial SIM800L(P3_1, P3_0);
-DigitalOut led1(LED1);
-
-char phone[14] = "\"17039739276\"";
-char buf[40];
-char buf1[40];
+DigitalOut led1(P4_4);
+DigitalOut rescueLED(P4_4); // Offboard GREEN LED
long GSMBAUD = 9600;
-long PCBAUD = 9600;
+
+/*
+ * Function: read_message
+ * ------------------------------------------------------------------------------------------------------
+ * Decipher any message inside the SIM800L buffer (UART2) to see what is sent back after sending commands
+ * Typical response are "OK" "ERROR" ">" and "$RECEIVED"
+ * "$RECEIVED" is an automated response sent from TWILIO server
+ * Each SIM800L command depends on a special response before continuing to the next command
+ * @param response - the string that is back from the SIM800L
+ * @param responseCheck - a flag used to determine if the message sent back was read
+ * @papram SIM800L - the buffered serial used between uC and SIM800L P(3_0) and P(3_1)
+ * @return (void) - none
+ * ------------------------------------------------------------------------------------------------------
+ */
+void read_message(char *response, int *responseCheck, BufferedSerial *SIM800L, int blockSymbol, int request){
+ char buff[20];
+ int loop = 1;
+ int checkMsg = 1;
+ uint32_t timeSaved = mytime.read_ms();
+ int flagc = 0;
+ memset(buff, 0, sizeof(buff));
+ while(loop){
+ if(mytime.read_ms() - timeSaved > 13000){
+ strcpy(buff,"ERROR");
+ checkMsg = 0;
+ break;
+ }
+ if(SIM800L->readable() > 0){
+ char tmp = SIM800L->getc();
+ if(request && tmp != '$')continue;
+ if(tmp == 'O' || tmp == '$' || tmp == 'E' || tmp == '>'){
+ if(blockSymbol && tmp =='>')continue;
+ flagc = 1;
+ if(tmp == '>'){
+ strncat(buff, &tmp, sizeof(tmp));
+ break;
+ }
+ while(tmp != '\n'){
+ if(flagc && tmp != ' ' && tmp != '\r'){
+ strncat(buff, &tmp, sizeof(tmp));
+ flagc = 0;
+ }
+ if(SIM800L->readable() > 0){
+ tmp = SIM800L->getc();
+ flagc = 1;
+ }
+ }
+ loop = 0;
+ }
+ }
+ }
+ /*
+ * Update flag used to check if message was good
+ * Copy response into a buffer to be determined what message was sent
+ * clear memory used
+ */
+ if(!checkMsg){
+ *responseCheck = 0;
+ }else{
+ *responseCheck = 1;
+ }
+ strcpy(response, buff);
+ memset(buff, 0, sizeof(buff));
+}
+
+
+/*
+ * Function: sendEmergencyLocation
+ * ------------------------------------------------------------------------------------------------------
+ * Send the location of the user to the TWILIO server to ask for assistance
+ * Send a sequency of command to the GSM module (SIM800L)
+ * A received message is also checked to make sure TWILIO had received the message, if not resend the message
+ * A green LED is also turned on when the message was deemed to be received by TWILIO
+ * @param loc - the current location of the user
+ * @param bpm - the heart rate of the user in beats per min
+ * @ return (void) - none
+ */
+void sendEmergencyLocation(char *loc, int bpm){
+ BufferedSerial *SIM800L = new BufferedSerial(P3_1, P3_0);
+ SIM800L->baud(9600);
+ char buff[100];
+ int checkResponse = 0; // Check if the response of the GSM module was valid
+ int blockSymbol = 0; // Block the symbol ">" from being read when processing
+ int checkProcess = 1; // condition used to determine if the TWILIO had received the SOS message and if all the commands worked properly
+ int request = 0;
+ /*
+ * Each command sent has an expected message sent back in response
+ * These messages are checked before continuing
+ * After all commands are sent and $RECEIVED is sent back from TWILIO clear serial buffer and turn on GREEN LED
+ */
+ while(checkProcess){
+ int request = 0;
+ SIM800L->printf("AT\r\n"); // handshake with GSM module
+ read_message(buff, &checkResponse,SIM800L, blockSymbol, request);
+ if(!checkResponse)continue;
+ if(!strcmp(buff,"OK")){ // expected message
+ wait(0.1f);
+ }else continue;
+
+ SIM800L->printf("AT+CMGF=1\r\n"); // Set the text mode of the GSM
+ read_message(buff, &checkResponse,SIM800L, blockSymbol, request);
+ if(!checkResponse)continue;
+ if(!strcmp("OK", buff)){
+ wait(0.1f);
+ }else continue;
+
+ blockSymbol = 0;
+ SIM800L->printf("AT+CNMI=1,2,0,0,0\r\n"); // Set the receiving mode of the GSM module
+ read_message(buff, &checkResponse,SIM800L, blockSymbol, request);
+ if(!checkResponse)continue;
+ if(!strcmp("OK", buff)){ // expected message
+ wait(0.1f);
+ }else continue;
+
+ SIM800L->printf("AT+CMGS=\"1##########\"\r\n"); // communicate to SIM800L to respond OK
+ read_message(buff, &checkResponse,SIM800L, blockSymbol, request);
+ if(!checkResponse)continue;
+ if(strcmp(">", buff) == 0){ // expected message
+ wait(0.1f);
+ }else continue;
+
+ blockSymbol = 1;
+ SIM800L->printf("%s BPM:%d %c\r\n",loc,bpm,CTRL_Z); // communicate to SIM800L to respond OK
+ read_message(buff, &checkResponse,SIM800L, blockSymbol, request);
+ if(!checkResponse)continue;
+ if(!strcmp("OK", buff)){ // expected message
+ wait(0.1f);
+ }else continue;
+
+ blockSymbol = 0;
+ request = 1;
+ read_message(buff, &checkResponse,SIM800L, blockSymbol, request);
+ if(!checkResponse)continue;
+ if(strcmp("$RECEIVED", buff) == 0){ // expected message
+ wait(0.1f);
+ rescueLED = 0;
+ checkProcess = 0;
+ }else continue;
+ SIM800L->printf("AT+CMGF=0\r\n"); // set to the default mode on the SIM800L
+ wait(0.1f);
+ }
+ delete SIM800L;
+}
int main(){
- pc.baud(PCBAUD);
- SIM800L.baud(GSMBAUD);
-
- //wait(0.1f);
- SIM800L.puts("AT\r\n");
- SIM800L.scanf("%s", buf);
- SIM800L.scanf("%s", buf1);
- pc.printf("%s\n", buf);
- pc.printf("%s\n", buf1);
-
- //wait(0.01f);
-
- SIM800L.puts("AT+CMGF=1\r\n");
- SIM800L.scanf("%s", buf);
- SIM800L.scanf("%s", buf1);
- pc.printf("%s\n", buf);
- pc.printf("%s\n", buf1);
-
- //wait(0.01f);
- SIM800L.puts("AT+CMGS=\"17039739276\"\r\n");
- //SIM800L.puts("\r\n");
-
-// SIM800L.scanf("%s", buf);
-// SIM800L.scanf("%s", buf1);
-// pc.printf("%s\n", buf);
-// pc.printf("%s\n", buf1);
-
- wait(0.1f);
-
- SIM800L.printf("This is the automatted program SMS from SIM800L. :D %c\r\n", CTRL_Z);
- //wait(4);
- //SIM800L.puts("26\r\n");
-
- //wait(0.1f);
- SIM800L.scanf("%s", buf);
- SIM800L.scanf("%s", buf1);
- pc.printf("%s\n", buf);
- pc.printf("%s\n", buf1);
-
- wait(1);
-
- //pc.printf("Yike");
- SIM800L.puts("AT+CMGF=0\r\n");
- SIM800L.scanf("%s", buf);
- SIM800L.scanf("%s", buf1);
- pc.printf("%s\n", buf);
- pc.printf("%s\n", buf1);
+char loc[50] = "https://www.google.com/maps/place/38 47\'26.16\"N+77 27'44.91\"W";
+int bpm = 100;
+// Send a dummy location/bpm to a phone number
+sendEmergencyLocation(loc,bpm);
}