ENVIA MENSAJE Y RESPONDE CON LINK DE GOOGLE MAPS, ENVIA ON PRENDE UN LED Y RESPONDE AL CELULAR Q SE ENCENDIO EL CARRO, ENVIA OFF APAGA LED Y RESPONDE ALCELULKAR QUE SE APAGO ELO CARRO

Dependencies:   DebouncedIn GPS7 mbed

Fork of CLASEDELGSM by Gustavo Ramirez

Revision:
2:ffcd0494ec92
Parent:
1:6b506dde0a6e
Child:
3:75c530fb1140
--- a/main.cpp	Tue Dec 02 03:41:43 2014 +0000
+++ b/main.cpp	Wed May 27 23:19:02 2015 +0000
@@ -1,7 +1,7 @@
 //  Programa para enviar desde la FRDMKL25Z un mensaje de texto en formatp PDU
 //   Como modem usa un celular SIEMENS a56i
 //   ENVIAR -----la palabra "ALARMA 1"
-//  
+//
 
 //   OJO CON ESTO
 //   conector del siemens cable verde es RX conectelo a PTE0  cable blanco es TX conectelo a PTE1
@@ -9,49 +9,52 @@
 #include "DebouncedIn.h"
 #include "stdio.h"
 #include "string.h"
+#include  "math.h"
+#include  "gprs.h"
+#include "GPS.h"
 Timer t;
-DigitalOut LedVerde(LED2);
-DigitalOut LedRojo(LED1);
-DigitalOut LedAzul(LED3);
-DebouncedIn button1(PTC12);  //señal que inicia el envio del mensaje
-Serial GSM(PTE0,PTE1); //Configura puerto UART de la FRDMKL25Z
-Serial pc(USBTX,USBRX);//Configura puerto USB a la consola serial del PC conectado.
+DigitalOut on_off(PTC17);  //señal que inicia el envio del mensaje
+Serial pc(USBTX,USBRX); //Configura puerto UART de la FRDMKL25Z
+GPS gps(PTE22, PTE23);
+//Serial GSM(USBTX,USBRX);
+//serial (PTA2,PTA1);/////////////////USBTX,USBRX  PTE0,PTE1
+Serial GSM(PTE0,PTE1);//Configura puerto USB a la consola serial del PC conectado.
+//void leer(void);
 void Rx_interrupt();
 int position=0;
 int lenpack=6;
 int longi=0;
+char lat1[9];
+char lon1[12];
 char tel[11];
-char DE[50];
 char buffer[100];
+char buffer1[13];
 char datos[100];
-char NUMBER[13];    
+char NUMBER[13];
 int index;
-int count;
+char buffermsg[100];
+int count1=0;
 int i = 0;
 int j = 0;
-int c=0;
+char c;
 unsigned char CtrlZ = 0x1A;  // comodin de emision controlZ
-bool Flag = false; // bandera 
+bool Flag = false; // bandera
 char r[]=""; //Cadena de recepcion de la trama PDU si se usa!!
 char msg[256];
+int z=0,g=0;
 char char1;
-//Flush serial para el buffer
-void FlushGSM(void) { 
-char1 = 0;
- while (GSM.readable()){
-     char1 = GSM.getc();}
-     return;}
+char DE[255]={"http://maps.google.com/maps?q="};
 
-void callback() {
-    // Note: you need to actually read from the serial to clear the RX interrupt
-    pc.printf("%c\n", GSM.getc());
-    
-}
- 
+char DS[255];
+int K,C,LENOUT,LENIN;
+int frac_long, frac_lat,ent_long,ent_lat;
+
+
+
 int readBuffer(char *buffer,int count)
 {
     int i=0; 
-    t.start();  // start timer
+    t.start(); 
     while(1) {
         while (GSM.readable()) {
             char c = GSM.getc();
@@ -67,261 +70,116 @@
         }
     }
     wait(0.5);
-    while(GSM.readable()) {  // display the other thing..
+    while(GSM.readable()) {  
         char c = GSM.getc();
     }
     return 0;
 }
 
-/* esta funcion de abajo limpia o borra todo un "buffer" de tamaño "count"
-lo revisa uno por un elemento y le mete el caracter null que indica fin de cadena
-no retorna nada
-*/
-//***************************************************************************************
-void cleanBuffer(char *buffer, int count)
-{
-    for(int i=0; i < count; i++) {
-        buffer[i] = '\0';
-    }
-}
-/* esta funcion de abajo envia un comando parametrizado como cadena
-*/
-//***************************************************************************************
-void sendCmd(char *cmd)
-{
-    GSM.puts(cmd);
-}
-/* esta funcion de abajo espera la respuesta de un comando que debe ser identica a la cadena "resp" y un tiempo timeout"
-si todo sale bien retorna un cero que en la programacion hay que validar
-si algo sale mal ( no se parece o se demora mucho )retorna -1 que debera validarse con alguna expresion logica
-*/
-//***************************************************************************************
-int waitForResp(char *resp, int timeout)
-{
-    int len = strlen(resp);
-    int sum=0;
-    t.start();
-
-    while(1) {
-        if(GSM.readable()) {
-            char c = GSM.getc();
-            sum = (c==resp[sum]) ? sum+1 : 0;// esta linea de C# sum se incrementa o se hace cero segun c
-            if(sum == len)break;  //ya acabo se sale
-        }
-        if(t.read() > timeout) {  // time out chequea el tiempo minimo antes de salir perdiendo
-            t.stop();
-            t.reset();
-            return -1;
-        }
-    }
-    t.stop();                 // stop timer  antes de retornar
-    t.reset();                    // clear timer
-    while(GSM.readable()) {      // display the other thing..
-        char c = GSM.getc();
-    }
-
-    return 0;
-}
-/* esta funcion de abajo es muy completa e util se encarga de enviar el comando y esperar la respuesta
-si todo sale bien retorna un cero(herencia de las funciones contenedoras) que en la programacion hay que validar
-con alguna expresion logica
-*/
-//***************************************************************************************
-int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout)
-{
-    sendCmd(cmd);
-    return waitForResp(resp,timeout);
-}
-/* esta funcion de abajo chequea que el modem este vivo  envia AT y le contesta con OK y espera 2 segundos
-*/
-//***************************************************************************************
-int powerCheck(void)// este comando se manda para verificar si el modem esta vivo o conectado
-{
-    return sendCmdAndWaitForResp("AT\r\n", "OK", 2);    
-}
-/* esta funcion de abajo chequea el estado de la sim card
-y si todo sale bien retorna un cero que en la programacion hay que validar
-con alguna expresion logica
-*/
-//***************************************************************************************
-int checkSIMStatus(void)
-{
-    char gprsBuffer[30];
-    int count = 0;
-    cleanBuffer(gprsBuffer,30);
-    while(count < 3) {
-        sendCmd("AT+CPIN?\r\n");
-        readBuffer(gprsBuffer,30);
-        if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
-            break;
-        }
-        count++;
-        wait(1);
-    }
-
-    if(count == 3) {
-        return -1;
-    }
-    return 0;
-}
-/* esta funcion de abajo chequea la calidad de la señal
-y si todo sale bien retorna cun el valor de señal util o un -1 si nop es aceptable, en la programacion hay que validar
-con alguna expresion logica
-*/
-//***************************************************************************************
-int checkSignalStrength(void)
-{
-    char gprsBuffer[100];
-    int index,count = 0;
-    cleanBuffer(gprsBuffer,100);
-    while(count < 3) {
-        sendCmd("AT+CSQ\r\n");
-        readBuffer(gprsBuffer,25);
-        if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
-            break;
-        }
-        count++;
-        wait(1);
-    }
-    if(count == 3) {
-        return -1;
-    }
-    return index;
-}
-/* esta funcion de abajo configura el modem de forma inicial con comandas AT
-y si todo sale bien retorna un cero que en la programacion hay que validar
-con alguna expresion logica pero si algo sale mal retorna un -1
-*/
-//***************************************************************************************
-/*int settingSMS() //esta funcion se invoca para configurar el modem al principio
-{
-    if(0 != sendCmdAndWaitForResp("AT\r\n", "OK", 1)) {
-        return -1;
-    }
-    if(0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 1)) {
-        return -1;
-    }
-    if(0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 1)) {
-        return -1;
-    }
-    if(0 != sendCmdAndWaitForResp("ATE\r\n", "OK", 1)) {
-        return -1;
-    }
-    if(0 != sendCmdAndWaitForResp("CBST=0,0,1\r\n", "OK", 1)) {
-        return -1;
-    }
-    return 0;
-}
-*/
-
-
-/* esta funcion de abajo inicaliza el modem se compone de un grupo de subfunciones ya definidas previamente
-primero chequea que este vivo
-segundo chequea el estado de la simcard
-tercero chequea la intencidad de señal celular
-cuarto aplica la configuracion
-y si todo sale bien retorna un cero que en la programacion hay que validar
-con alguna expresion logica
-*/
-//***************************************************************************************
-int init()
-{
-    for(int i = 0; i < 3; i++){
-        sendCmdAndWaitForResp("AT\r\n", "OK", 1);
-        wait(0.5);
-    }
-    if(0 != checkSIMStatus()) {
-        return -1;
-    }
-    if(checkSignalStrength()<1) {
-        return -1;
-    }
-   
-    GSM.attach(&Rx_interrupt, Serial::RxIrq);
-    return 0;
-}
-/* esta funcion de abajo intenta leer un mensaje de texto en formato PDU o HEX
-y si todo sale bien retorna un cero que en la programacion hay que validar
-con alguna expresion logica
-*/
-//***************************************************************************************
-int readSMSpdu(char *message, int index)
-{
-    int i = 0;
-    char gprsBuffer[100];
-    char *p,*s;
-    GSM.printf("AT+CMGR=%d\r\n",index);
-    cleanBuffer(gprsBuffer,100);
-    readBuffer(gprsBuffer,100);
-    if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
-        return -1;
-    }
-    if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
-        p = s + 6;
-        while((*p != '$')&&(i < 5)) {
-            message[i++] = *(p++);
-        }
-        message[i] = '\0';
-    }
-    return 0;
-}
-/* esta funcion de abajo borra mensajes SMS del modem
-y si todo sale bien retorna un cero que en la programacion hay que validar
-con alguna expresion logica
-*/
-//***************************************************************************************
-int deleteSMS(int index)
-{
-    char cmd[32];
-    snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index);
-    sendCmd(cmd);
-    return 0;
-}
-//***0*********************************************************************************
-
-// Interupt Routine to read in data from serial port
-void Rx_interrupt(){
-     }
-     /*
-     readBuffer(buffer,6);
-     if(strncmp(buffer, "+CMTI", 5)){
-     wait(1);
-     GSM.printf("AT+CMGL=%d\r\n",0);
-     readBuffer(buffer,100);}
-     if(strncmp(buffer, "+CMGL:", 5)){  
-     for (i=0;i<31;i++){
-     buffer[5+i]=c;  // 32 de basura
-     }
-     }
-     for (i=0;i<10;i++){
-     buffer[36+i]=tel[i];  // numero telefonico
-     }
-     for (i=0;i<18;i++){
-     buffer[46+i]=c;  // 18 de basura
-     }
-     for (i=0;i<2;i++){
-     buffer[64+i]=tel[i];  // tamaño de septetos
-     }
-     for (i=0;i<30;i++){
-     buffer[66+i]=DE[i];  // datos en octetos hex
-     if (buffer[i]=='\0'){
-     }
-     */
-     
 
 int main(void)
-       { 
-           
-       //NVIC_DisableIRQ(UART1_IRQn);       
-       //apagamos los 3 leds
-       LedVerde=1;
-       LedRojo=1;
-       LedAzul=1;
-       lenpack=6;  //tamaño de "ALARMA"
-       GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600
-       GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
-       //configuro modem GSM
-       GSM.printf("AT\r\n");
+{
+
+    GSM.baud(9600);//configura los baudios de la FRDMKL25Z en 9600
+    GSM.format(8,Serial::None,1); //configura el formato de los datos de la UART
+   
+    while(1) {
+        //wait(2);
+        
+        
+        
+            if (GSM.readable()) {
+            readBuffer(buffer,100);
+            
+            if(buffer[10]=='S'&& buffer[11]=='M'){
+             pc.printf("Llego mensaje\n\r ");         
+             buffer[10]=' ';
+             buffer[11]=' ';
+             GSM.printf("AT+CMGR=%c\r\n",buffer[14]);
+             pc.printf("AT+CMGR=%c\r\n",buffer[14]);
+             }
+             
+             if(buffer[68]=='C'&& buffer[69]=='3'&&buffer[70]=='B'&& buffer[71]=='7'&&buffer[72]=='1'&& buffer[73]=='C')//recibe mensaje Cor
+             {
+                 
+             pc.printf("El mensaje es Cor\n");
+             buffer[68]=' ';
+             buffer[69]=' ';
+             buffer[70]=' ';
+             buffer[71]=' ';
+             buffer[72]=' ';
+             buffer[73]=' ';
+             
+                
+                     if(gps.sample()) {
+            frac_long=(int)abs(1000000*gps.longitude-(int)gps.longitude);
+            ent_long=(int)gps.longitude;
+            frac_lat=(int)abs(1000000*gps.latitude-(int)gps.latitude);
+            ent_lat=(int)gps.latitude;
+           // pc.printf("%d.%d,%d.%d\n",ent_long,frac_long,ent_lat,frac_lat);
+            
+            lat1[0]=ent_lat+48;
+            lat1[1]='.';
+            
+            for(z=6;z>=0;z--)
+            {
+            g= pow(10,0.0+z);   
+            lat1[8-z]=(frac_lat/g)+48;
+            frac_lat=frac_lat%g;
+            }
+            
+            
+            lon1[0]='-';
+            ent_long=ent_long*-1;
+            lon1[1]=(ent_long/10)+48;
+            lon1[2]=(ent_long%10)+48;
+            lon1[3]='.';
+            for(z=7;z>=0;z--)
+            {
+            g= pow(10,0.0+z); 
+            lon1[11-z]=(frac_long/g)+48;
+            frac_long=frac_long%g;
+            }
+            
+       
+            
+            
+        }
+         
+         
+         LENIN=30;
+         
+              for(i=LENIN;i<(LENIN+9);i++)
+                {
+                    DE[i]=lat1[i-LENIN];
+                }
+             
+         LENIN=LENIN+9;
+         
+             DE[i]=',';
+             
+             LENIN=LENIN+1;
+             
+             for(i=LENIN;i<(LENIN+12);i++)
+         {
+             DE[i]=lon1[i-LENIN];
+         }
+         LENIN=LENIN+12;
+          
+         
+         
+         K=0;C=0;
+         for (i=0;i < LENIN;i++){
+         DS[i]=DE[i+C]>>K | DE[i+C+1]<<(7-K);
+         if (DS[i]==0x00) {LENOUT=i; goto salir;}
+         K++;
+         if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
+         }
+
+         //--------------------------------------------------------------
+salir: 
+        
+                   GSM.printf("AT\r\n");//envia link con coordenadas
        wait(0.5);
        GSM.printf("AT+CNMI=1,1\r\n");
        wait(0.5);
@@ -331,50 +189,108 @@
        wait(0.5);
        GSM.printf("CBST=0,0,1\r\n");
        wait(0.5);  
-       LedVerde=0;     
-      
-       //if(0!= init()){  //se configura y chequea el modem GSM 
-       // LedRojo=0;
-       //}
-       while(1){
-        if (button1.falling())
-        { LedVerde=1;
-          wait(2);
-           if (!button1)
-           {LedVerde=0;
-           index=20;
-       //GSM.printf("AT+CNMI=1,1\r\n"); //configuracion inicial del MODEM!
-       GSM.printf("AT+CMGS=%d\r\n",index);
-       wait(0.2);
-       GSM.printf("0011000A9113223717370000AA08416650DA0C8262"); //esto es "ALARMA 1"
+       GSM.printf("at+cmgs=%d\r\n",13+LENIN);
+        pc.printf("at+cmgs=%d\r\n",13+LENIN);
+             wait(0.5);
+           GSM.printf("0011000A9113315442760000AA"); //12 octetos + los octetos del mensaje
+           pc.printf("0011000A9113315442760000AA"); //12 octetos + los octetos del mensaje
+           //3113452467
+           if(LENIN<=15)
+           {
+                pc.printf("0");
+                GSM.printf("0");
+                 pc.printf("%X",LENIN);
+                GSM.printf("%X",LENIN);
+               }
+               else{    
+         pc.printf("%2X",LENIN);
+         GSM.printf("%2X",LENIN);
+         }
+           
+           for (i=0;i < LENIN;i++){
+           if(DS[i]<=15)
+           {
+                pc.printf("0");
+                GSM.printf("0");
+                 pc.printf("%X",DS[i]);
+                GSM.printf("%X",DS[i]);
+               }
+               else{    
+         pc.printf("%2X",DS[i]&0x000000FF);
+         GSM.printf("%2X",DS[i]&0x000000FF);
+         }
+         }
+           //GSM.printf("%X",68); //12 octetos + los octetos del mensaje
+           //GSM.printf("9");//GSM.printf("%u",30);
+             wait(0.5);
+           GSM.putc(0x1A);  
+  
+                  }
+             
+             
+        }
+    
+     if(buffer[68]=='4'&& buffer[69]=='F'&&buffer[70]=='3'&& buffer[71]=='7')//recibe mensaje On
+             {
+             on_off=1;
+             pc.printf("El mensaje es On\n");
+             buffer[68]=' ';
+             buffer[69]=' ';
+             buffer[70]=' ';
+             buffer[71]=' ';
+             GSM.printf("AT\r\n");//proto0colo  envio de mensaje
+       wait(0.5);
+       GSM.printf("AT+CNMI=1,1\r\n");
        wait(0.5);
-       GSM.putc((char)0x1A); //esto es controlZ   
-       LedVerde=1;
-       LedRojo=0;  //lo prendo
-       wait(3);
-       LedRojo=1;  //lo apago
-       LedVerde=0;          
-       }
-    
-}      
-       if(GSM.readable()) {       //USE ESTE FRAGMENTO DE CODIGO PARA LEER LO QUE EL CELULAR RESPONDE
-            while(GSM.readable()) {
-                char c = GSM.getc();
-                buffer[count++] = c;
-                if(count == 64) break;
-            }
-            pc.puts(buffer);
-                  
-            
-            for(int i = 0; i < count; i++) {
-                buffer[i] = NULL;
-            }
-            
-            count = 0;
-            
-            }
-   
+       GSM.printf("AT+CMGF=0\r\n");
+       wait(0.5);
+       GSM.printf("ATE\r\n");
+       wait(0.5);
+       GSM.printf("CBST=0,0,1\r\n");
+       wait(0.5);  
+       GSM.printf("at+cmgs=%d\r\n",21);
+        pc.printf("at+cmgs=%d\r\n",21);
+             wait(0.5);
+           GSM.printf("0011000A9113315442760000AA0945F7B8EC26A7C96F"); //12 octetos + los octetos del mensaje---devuelve mensaje encendido enciende un led que esta en PTC17
+           pc.printf("0011000A9113315442760000AA0945F7B8EC26A7C96F"); 
+             wait(0.5);
+           GSM.putc(0x1A); 
+             
+             }
+             
+              if(buffer[68]=='4'&& buffer[69]=='F'&&buffer[70]=='B'&& buffer[71]=='3'&&buffer[72]=='1'&& buffer[73]=='9')//recibe mensaje Off
+             {
+             on_off=0;
+             pc.printf("El mensaje es Off\n");// se borra el mensaje
+             buffer[68]=' ';
+             buffer[69]=' ';
+             buffer[70]=' ';
+             buffer[71]=' ';
+             buffer[72]=' ';
+             buffer[73]=' ';
+             GSM.printf("AT\r\n");//protocolo de envio de mensaje  
+       wait(0.5);
+       GSM.printf("AT+CNMI=1,1\r\n");
+       wait(0.5);
+       GSM.printf("AT+CMGF=0\r\n");
+       wait(0.5);
+       GSM.printf("ATE\r\n");
+       wait(0.5);
+       GSM.printf("CBST=0,0,1\r\n");
+       wait(0.5);  
+       GSM.printf("at+cmgs=%d\r\n",20);
+        pc.printf("at+cmgs=%d\r\n",20);
+             wait(0.5);
+           GSM.printf("0011000A9113315442760000AA074178F81C26BF01"); //12 octetos + los octetos del mensaje----devuelve mensaje apagado--apaga el led  de PTC17
+           pc.printf("0011000A9113315442760000AA074178F81C26BF01"); 
+             wait(0.5);
+           GSM.putc(0x1A); 
+           
+             }
+             
+
 }
-} 
+
 
+}
 // buffer[i] contiene lo que regresa
\ No newline at end of file