Procesadores, 2016 - II. Tarea #4. Oswaldo Andrés Giraldo Giraldo, Héctor Andrés Hoyos Ceballos, Jose Fernando Montoya Vargas, María Fernanda Villa Tamayo. Programa para establecer la comunicación con el módem Siemens A56, la lectura de coordenadas de GPS que son transmitidas en una UART por medio de un Dongle USB y la conversión de datos en formato ASCII a PDU.

Dependencies:   GPS_G mbed

Fork of TareaGPS_Siemens by Gustavo Ramirez

main.cpp

Committer:
procesadores_FAC
Date:
2015-06-19
Revision:
0:b2a6aa7c0c8c
Child:
1:e2bd083802c0

File content as of revision 0:b2a6aa7c0c8c:

//programa para celular siemens que recibe un mensaje de texto t activa una salida en formato
//pdu hex
#include "mbed.h"
#include "DebouncedIn.h"
#include "stdio.h"
#include "string.h"
#include "GPS.h"




Timer t;
DigitalOut LedVerde(LED2);
DigitalOut LedRojo(LED1);
DigitalOut LedAzul(LED3);

///////////////////////////////////////////
 
Serial GSM(PTE0,PTE1);  //puertos del FRDM para el modem
Serial pc(USBTX,USBRX);
GPS gps(PTE22, PTE23);   // Puerto del FDRM para el gps 

////////////////////////////
//PARAMETROS
////////////////////////////////


short DE[255];
short DS[255];

char buffer[512];
char buffermsg[100];
char buffer1[13];
char mensaje[100];
int count;
int i,K,LENOUT,LENIN,C;

char Tel[15];
char cel[15];
char ojala[15]; // OJO

int c=0;
int cont=0;
unsigned char CtrlZ = 0x1A; 
bool Flag = false; 
char r[]=""; 
char msg[256];
char char1;

int index;

//////
//longitud  y latitud 
////


float lo,la;
char clo[255], cla[255];   //
int LENINlo,LENINla,LENINla_lo;
char la_lo[255];

char http2[255];
char http[] = "http://maps.google.com/maps?q=";



//////////////
// convercion oct sept 
////////////


int iht,Kht,ChtLENOUTht,LENINht;
int ioct,Koct,LENOUToct,LENINoct,Coct;
char DEoct[255];
char DSoct[255];
char buf[100];

/////////////////////////
//cocanteo rellenos y numero 
//////////////////////////

char relle1[]=  "0011000A91";
char relle2[]=  "10000AA";
char relle3[]=     "68";

/////////////////////////////////////////////
// funciones  
////////////////////////////////////////////
 
int readBuffer(char *buffer,int count)
{
    int i=0; 
    t.start(); 
    while(1) {
        while (GSM.readable()) {
            char c = GSM.getc();
            if (c == '\r' || c == '\n') c = '$';
            buffer[i++] = c;
            if(i > count)break;
        }
       if(i > count)break;     // ojooo
        if(t.read() > 3) {
            t.stop();
            t.reset();
            break;
        }
    }
    
    wait(0.5);
    while(GSM.readable()) {  
        char c = GSM.getc();
    }
    return 0;
}

///////////////////////////////////////////////
//Programass
///////////////////////////////////////////////
    
int main(void)
       { 
       
       LedVerde=1;
       LedRojo=1;
       LedAzul=1;
 
   
       GSM.baud(9600);
       GSM.format(8,Serial::None,1); 

       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);  
             
     
     while(1){ 
          
       if (GSM.readable()) {
            readBuffer(buffer,100);
            pc.printf("buffer= %s\n\r ",buffer);
            pc.printf("buffer= %c  %c\n\r ",buffer[10],buffer[11]);
                if(buffer[67]=='A'){for(i=0;i<86;i++)
                 {buffermsg[i]=buffer[i];}
                 pc.printf("mensaje= %s\n\r ",buffermsg); 
                 pc.printf("mensaje[72]= %c mensaje[73]=%c\n\r ",buffermsg[72],buffermsg[73]);        
                 buffer[67]='c';
                 
                 if (buffermsg[69] == '2'){    // PARA CUANDO LA CLAVE ES On
                        LENIN=2; //numero de caracteres de abajo son los octetos
                        DE[0]=0x47;
                        DE[1]=0x37;
                     }
                 if (buffermsg[69] == '3'&& buffermsg[70] == '4'){  // PARA CUANDO LA CLAVE ES Off
                        LENIN=3; //numero de caracteres de abajo son los octetos
                        DE[0]=0x4F;
                        DE[1]=0xB3;
                        DE[2]=0x19;
                    }
                  if (buffermsg[69] == '3'&& buffermsg[70] == 'C'){  // PARA CUANDO LA CLAVE ES Cor
                        LENIN=3; //numero de caracteres de abajo son los octetos
                        DE[0]=0xC3;
                        DE[1]=0xB7;
                        DE[2]=0x1C;
                    }
                 
                    LENOUT= LENIN*8/7;
                    K=7;
                    C=0;
                    DS[0]=DE[0] & 0x7F;  // la primera sola
                    pc.printf("%2X\n",DS[0]);
                   
                    for (i=1;i < LENOUT;i++){  // inicia el algoritmo
                        DS[i]=(DE[i-1-C]>>K | DE[i-C]<<(8-K))& 0x7F;  //valido para todos
                        pc.printf("%2X\n",DS[i]);
                        
                        if (K==0) {K=8;C++;}
                    K--;
                    }
                    
                    for (i=0 ;i<=9;i++)  
                    {
                     Tel[i] = buffermsg[40+i];
                    }   
                    pc.printf("\n");
                    pc.printf("%c%c%c%c%c%c%c%c%c%c",Tel[1],Tel[0],Tel[3],Tel[2],Tel[5],Tel[4],Tel[7],Tel[6],Tel[9],Tel[8]);
            
                 }
                      
        if(buffer[10]=='S'&& buffer[11]=='M'){
             for(i=0;i<5;i++)
             {buffer1[i]=buffer[2+i];}
             pc.printf("buffer1= %s\n\r ",buffer1);         
             buffer[10]='c';
             buffer[11]='c';
             }
        if(buffer1[3]=='T'){pc.printf("AT+CMGL=0\n\r");
            wait(0.5);
            GSM.printf("AT+CMGL=0\r\n");
            buffer1[3]='p';
            }
            
       
        if(DS[0]-67 == 0&& DS[1]-111==0)   // Cor en octetos es 436f72
        {
        pc.printf("\n");
        LedAzul=0;
        
        DS[0] = '\0';
        DS[1] = '\0';
           
           if(gps.sample())
            {
               lo =gps.longitude;
               la =gps.latitude;
               pc.printf("longitud_entera=%f, Latitud entera=%f\n", lo, la);
         
                  wait(0.5);         
            //LONGITUD/        
            sprintf (clo, "%f", lo); 
            pc.printf ( "\nlongitud = %s\n",clo);
            LENINlo=strlen(clo);  
            
            /*  for (ilo=0;ilo<LENINlo;ilo++){
                pc.printf("%c,",clo[ilo]);       
            } */        
            
           wait(0.5);
           //LATITUD/
           sprintf (cla, "%f", la); 
           pc.printf ( "\nlatitud = %s\n",cla);
           LENINla=strlen(cla); 
            
           /*for (ila1=0;ila1<LENINla1;ila1++){
                pc.printf("%c,",cla[ila1]);       
           }*/

          
        ///////////////////////////////////////////////////            
        // CONCATENO LONGITUD Y LATITUD
        ///////////////////////////////////////////////////

           strcpy(la_lo,cla);
           strcat(la_lo,",");
           strcat(la_lo,clo);
               
           pc.printf ( "\nla_lo: %s\n",la_lo);
           
           LENINla_lo=strlen(la_lo);

           /*for (j=0;j<LENINla_lo;j++){
                pc.printf("%c\n",la_lo[j]);       
           }*/    
           
         ////////////////////////////////////////////////////////      
        // CONCATENO LONGITUD, LATITUD Y EL http//:
        ////////////////////////////////////////////////////////
            strcpy(http2,http);
            strcat(http2,la_lo);         
            pc.printf ( "%s\n",http2);
            pc.printf ( "\n" );
           
           
        //////////////////////////////////////////////////////////////////////
        // convierto http2 de oct a sep
        ////////////////////////////////////////////////////////////////////////       
       
        LENINht=strlen(http2);
        pc.printf("%d\n",LENINht); 
        for (iht=0;iht<LENINht;iht++){
             pc.printf("%2X",http2[iht]);       
            } 
        pc.printf ( "\n" );
      
        /////////////////////////////////////

        LENINoct=strlen(http2);
        pc.printf("%d\n",LENINoct);
            for (ioct=0;ioct<LENINoct;ioct++)
          {
                DEoct[ioct]=http2[ioct];
                pc.printf("%2X,%d\n",DEoct[ioct],ioct);       
           }
        ////////////////////////////////////////        
       
         Koct=0;
         Coct=0;
        
         for (ioct=0;ioct < LENINoct;ioct++)
         {
                DSoct[ioct]=DEoct[ioct+Coct]>>Koct | DEoct[ioct+Coct+1]<<(7-Koct);
                if (DSoct[ioct]==0x00){
                    LENOUToct=ioct; 
                    pc.printf("\n");
                    pc.printf("%s",DEoct);
                    pc.printf("out =%d",LENOUToct);
                        for (ioct=0;ioct<LENOUToct;ioct++){
                            pc.printf("%2X,%d\r\n",DSoct[ioct]&0x000000FF,ioct);
                        }
                  }
       //             pc.printf("LENOUT:%d,LENIN:%d\r\n",LENOUToct,strlen(DEoct));
                  
                  //}
                 Koct++;
                if (Koct==7)
                {
                Koct=0;Coct++;
                } // se chequea que ya se acabaron los bits en un ciclo de conversion.
         }  
        
        /////////////////////////////////////////////////////////
        // CONCATENO LOS RELLENOS Y EL NUMERO DEL CELULAR 
        ////////////////////////////////////////////////////////
        
        
        
        
        wait(5);
        index=56;
        GSM.printf("AT+CMGS=%d\r\n",index);
        pc.printf("AT+CMGS=%d\r\n",index);
        pc.printf("0011000A91");
         GSM.printf("0011000A91");
             for (i=0 ;i<=9;i++)  
                    {
                    pc.printf("%c",Tel[i]);
                    GSM.printf("%c",Tel[i]);
                    }  
        pc.printf("10000AA");
        GSM.printf("0000AA");
         pc.printf("31");
        GSM.printf("31");
                 
           for (ioct=0;ioct<=((LENOUToct*7)/8);ioct++)
         {
           pc.printf("%02X",DSoct[ioct]);
           GSM.printf("%02X",DSoct[ioct]);
         }
         wait(0.5);
         GSM.putc((char)0x1A);
          GSM.scanf("%s",buf);
            GSM.scanf("%s",buf);
            GSM.scanf("%s",buf);
            //GSM.scanf("%s",buf);
            pc.printf(">%s\n",buf);
          pc.printf("\n");
          
           }  // if 
            
            
    
        }

        if(DS[0]-79==0 && DS[1]-102==0)     // Off en octetos es 4F6666
        {
               LedAzul=1; //apaga con Lgeverde
               LedVerde = 0;
               LedRojo=1;
        }   
        
        if(DS[0]-71==0 && DS[1]-110==0)  // On en octetos es 476E
        {
               LedAzul=1;  //apaga con Lgeverde
               LedRojo =0;
               LedVerde = 1;
        } 
     }           
}
}