Trabajo, en el cual se envia un mensaje al celular, el cual actua como modem, y en el mensaje esta para activar una alarma segun el mensaje que se envie

Dependencies:   DebouncedIn mbed

Fork of CLASEDELGSM by Gustavo Ramirez

Revision:
2:44e88001ce29
Parent:
1:6b506dde0a6e
--- a/main.cpp	Tue Dec 02 03:41:43 2014 +0000
+++ b/main.cpp	Tue Nov 24 05:19:14 2015 +0000
@@ -18,13 +18,20 @@
 Serial pc(USBTX,USBRX);//Configura puerto USB a la consola serial del PC conectado.
 void Rx_interrupt();
 int position=0;
+int intentos=0;
 int lenpack=6;
+int ret=1;
 int longi=0;
 char tel[11];
 char DE[50];
 char buffer[100];
+char buffermsg[100];
+char buffer1[100];
 char datos[100];
-char NUMBER[13];    
+char NUMBER[13]; 
+char resp[6];  
+char CMT[]="+CMTI";
+char tam[2];
 int index;
 int count;
 int i = 0;
@@ -38,8 +45,8 @@
 //Flush serial para el buffer
 void FlushGSM(void) { 
 char1 = 0;
- while (GSM.readable()){
-     char1 = GSM.getc();}
+ while (GSM.readable()){  // lee lo que le entra por el puerto GSM
+     char1 = GSM.getc();} // y lo pone en la variable hcar1
      return;}
 
 void callback() {
@@ -47,22 +54,26 @@
     pc.printf("%c\n", GSM.getc());
     
 }
- 
+//****************************************************************************************************************
+//esta funcion de abajo lee todo un bufer hasta encontrar CR o LF y el resto lo rellena de
+//$, count es lo que va a leer.Lo leido lo mete en buffer que es una cadena previamente definida
+//incorpora medida de tiempo si se demora mas de tres segundos retorna fracaso con -1
+//**************************************************************************************************************** 
 int readBuffer(char *buffer,int count)
 {
     int i=0; 
     t.start();  // start timer
     while(1) {
-        while (GSM.readable()) {
-            char c = GSM.getc();
+        while (GSM.readable()) { // leelo que está entrando por el GSM
+            char c = GSM.getc(); //  asigna el valor que entra a c
             if (c == '\r' || c == '\n') c = '$';
-            buffer[i++] = c;
-            if(i > count)break;
+            buffer[i++] = c; // aumenta la posición del buffer y coloca c en ella
+            if(i > count)break; // si i es mayor que lo que lee para y sale del ciclo infinito
         }
-        if(i > count)break;
-        if(t.read() > 3) {
-            t.stop();
-            t.reset();
+        if(i > count)break; 
+        if(t.read() > 3) { // si se demora mas de 3 segundos 
+            t.stop();      // para el reloj y 
+            t.reset();     // lo resetea
             break;
         }
     }
@@ -72,9 +83,9 @@
     }
     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
+lo revisa elemento por elemento y le mete el caracter null que indica fin de cadena
 no retorna nada
 */
 //***************************************************************************************
@@ -85,12 +96,14 @@
     }
 }
 /* esta funcion de abajo envia un comando parametrizado como cadena
+puede ser un comando tipo AT
 */
 //***************************************************************************************
 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
@@ -98,20 +111,20 @@
 //***************************************************************************************
 int waitForResp(char *resp, int timeout)
 {
-    int len = strlen(resp);
+    int len = strlen(resp); // mide la longitud del string
     int sum=0;
     t.start();
 
     while(1) {
-        if(GSM.readable()) {
-            char c = GSM.getc();
+        if(GSM.readable()) { 
+            char c = GSM.getc();  // pone lo que le entra por GSM en la variable c
             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;
+            return -1;  // devuelve -1 como "fallo"
         }
     }
     t.stop();                 // stop timer  antes de retornar
@@ -150,7 +163,7 @@
     int count = 0;
     cleanBuffer(gprsBuffer,30);
     while(count < 3) {
-        sendCmd("AT+CPIN?\r\n");
+        sendCmd("AT+CPIN?\r\n"); // envia el comando AT para ver que le devuelve
         readBuffer(gprsBuffer,30);
         if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
             break;
@@ -158,14 +171,14 @@
         count++;
         wait(1);
     }
-
-    if(count == 3) {
+// si la simcard no responde envia -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
+y si todo sale bien retorna con el valor de señal util o un -1 si no es aceptable, en la programacion hay que validar
 con alguna expresion logica
 */
 //***************************************************************************************
@@ -173,47 +186,21 @@
 {
     char gprsBuffer[100];
     int index,count = 0;
-    cleanBuffer(gprsBuffer,100);
+    cleanBuffer(gprsBuffer,100); // siempre hacemos esto para garantizar que el buffer esté limpio y no haga nada raro
     while(count < 3) {
-        sendCmd("AT+CSQ\r\n");
-        readBuffer(gprsBuffer,25);
-        if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
+        sendCmd("AT+CSQ\r\n");  // envia un comando al odem y para verificar si la señal está buena
+        readBuffer(gprsBuffer,25); // lee lo que devuelve el modem desde el buffer
+        if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) { // verifica que el nivel de cobertura sea bueno
             break;
         }
         count++;
         wait(1);
     }
     if(count == 3) {
-        return -1;
+        return -1; // si no es lo esperado devuelve un erro con -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
@@ -226,20 +213,22 @@
 //***************************************************************************************
 int init()
 {
-    for(int i = 0; i < 3; i++){
-        sendCmdAndWaitForResp("AT\r\n", "OK", 1);
-        wait(0.5);
-    }
-    if(0 != checkSIMStatus()) {
+    if (0 != sendCmdAndWaitForResp("AT\r\n", "OK", 3)){
+        return -1;
+        }
+    if (0 != sendCmdAndWaitForResp("AT+CNMI=1,1\r\n", "OK", 3)){
+        return -1;
+        }
+    if (0 != sendCmdAndWaitForResp("AT+CMGF=0\r\n", "OK", 3)){
         return -1;
-    }
-    if(checkSignalStrength()<1) {
+        }
+    if (0 != sendCmdAndWaitForResp("AT+CBST=0,0,1\r\n", "OK", 3)){
         return -1;
-    }
-   
-    GSM.attach(&Rx_interrupt, Serial::RxIrq);
-    return 0;
-}
+        }
+        LedVerde=0;
+        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
@@ -277,104 +266,149 @@
     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'){
-     }
-     */
+//************************************************************************************
      
-
+//RUTINA PRINCIPAL*******************************************************************************************
 int main(void)
-       { 
-           
-       //NVIC_DisableIRQ(UART1_IRQn);       
+       {
+       //configuramos los puertos seriales    
+       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     
        //apagamos los 3 leds
        LedVerde=1;
        LedRojo=1;
        LedAzul=1;
+       //quito el eco del modem
+       GSM.printf("ATE0\r\n");
+       pc.printf("ATE0\r\n");
+       for(i=0;i<6;i++){
+          GSM.printf("AT+CMGD=%d\r\n",i);
+          wait(0.2);
+          }
+       //cleanBuffer(buffer,10);
+       //definicion de algunas variables
        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");
-       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);  
-       LedVerde=0;     
-      
-       //if(0!= init()){  //se configura y chequea el modem GSM 
-       // LedRojo=0;
-       //}
-       while(1){
-        if (button1.falling())
-        { LedVerde=1;
+       //Configuro el Modem, le doy solo 10 intentos si esos fracasan se bloquea y prende intermitente el led rojo
+inicio:if(init()<0){
+       intentos++;
+       if (intentos==10){goto loop1;}
+       goto inicio;
+       } 
+       //cleanBuffer(buffer,50);
+       //inicia el programa ciclico
+       //esperar señales de alarma por boton1
+       //se envia "Alarma1"
+       //al telefono que envio mensaje antes
+   
+//*********************************************************************************************************************
+while(1){ 
+         if (button1.falling())
+         { 
           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"
-       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;
+           {
+           //inicia el envio de un sms    
+           index=19;
+           GSM.printf("AT+CMGS=%d\r\n",index);
+           wait(0.2);
+           GSM.printf("0011000A91");
+           GSM.printf("%s",tel); 
+           GSM.printf("0000AA07417658DE0EC7");
+           GSM.printf("\r\n");
+           wait(0.2);
+           GSM.putc(0x1A); //el mensaje ya fue enviado con esto
+           for(i=0;i<6;i++){
+               LedVerde=1;
+               wait(0.5);
+               LedVerde=0;
+               wait(0.5);
+               }
+           }
+         }  
+      
+
+
+       //inicia la recepcion de un mensaje de texto
+       if (GSM.readable()) {
+            readBuffer(buffer,100);
+            pc.printf("%s\r\n",buffer);
+            for(i=0;i<5;i++)
+            {
+            resp[i]=buffer[i];
+            }  
+            
+             //el programa empieza a verificar que le llego el mensaje
+             //para que le llegue la cadena larga de caracteres, hay se detecta el numero telefonico
+             //ya que en la cadena nos envia caracteres "basura" que no necesitamos
+             
+            pc.printf("%s\r\n",resp);
+            if(strcmp("$$+CM",resp) == 0){  //COMPARA resp con "+CMTI"
+                pc.printf("llego MSG\r\n");
+                cleanBuffer(buffer,10);
+                wait(0.5);
+                GSM.printf("AT+CMGL=0\r\n");//envio comando para leer mensaje
+                pc.printf("AT+CMGL=0\r\n");
+                //if (GSM.readable()) {
+                GSM.printf("AT+CMGD=0\r\n");    
+                readBuffer(buffer,100);
+                pc.printf("%s\r\n",buffer);
+                wait(5);
+                   //leer telefono
+                for(i=0;i<10;i++){
+                       tel[i]=buffer[i+40];
+                       }
+                pc.printf("%s-\r\n",tel);        
+                //leer tamaño
+                   for(i=0;i<2;i++){
+                       tam[i]=buffer[i+68];
+                   }
+                   pc.printf("%s-\r\n",tam);        
+                   //leer mensaje
+                    for(i=0;i<14;i++){
+                       msg[i]=buffer[i+70];
+                   }
+                   
+                   //lee el resto del mensaje de los valores que necesitamos al final de la cadena para hacer el codigo
+                   
+                   pc.printf("%s-\r\n",msg);        
+                   //decodificar mensaje
+                   //comparar mensaje
+                   if(strcmp("417658DE0EC700",msg) == 0){  //COMPARA resp con "417658DE0EC700" que es Alarma1
+                   LedVerde=1;
+                   LedAzul=0;
+                   wait(15);
+                   LedAzul=1;
+                   LedVerde=0;
+                   }
+                   // cuando se le envia el mensaje conociendo lo anterior, y si el mensaje es prender la alarma, 
+                   // este preunde el led corresponiente indicando que se activo la alarma, con el mensaje que le llego al telefono
+                   if(strcmp("417658DE0ECB00",msg) == 0){  //COMPARA resp con "417658DE0ECB00" que es Alarma2
+                   LedVerde=1;
+                   LedRojo=0;
+                   wait(15);
+                   LedRojo=1;
+                   LedVerde=0;
+                   }
+                   
+                   
+                   //ejecurar orden  //ya se ejecuto
+                   //08-D6379B1E569763  esto es Voltaje1
+                   //finalmente limpa la memoria para que pueda recibir nuevos mensajes
+                   
+                   cleanBuffer(buffer,100);
+                               
+                }
             }
-            pc.puts(buffer);
-                  
-            
-            for(int i = 0; i < count; i++) {
-                buffer[i] = NULL;
-            }
-            
-            count = 0;
-            
-            }
-   
+               
+
+        }
+
+
+//**********************************************************************************************************************           
+loop1: LedRojo=0;
+       wait(0.3);
+       LedRojo=1;
+       wait(0.3);  
+       goto loop1;
+ 
 }
-} 
-
-// buffer[i] contiene lo que regresa
\ No newline at end of file