Angelo Carrieri / Mbed 2 deprecated ATCommands

Dependencies:   mbed

main.cpp

Committer:
angelocarrieri
Date:
2018-05-09
Revision:
2:52b0e1971195
Parent:
1:7f5f80b47892
Child:
3:1df7773ae017

File content as of revision 2:52b0e1971195:

#include "mbed.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "Serial.h"
#include "ATCmdParser.h"
#include "UARTSerial.h"

// Dimensione massima dei vettori MRxB e ARxB
#define MRxBDIM 400
#define ARxBDIM 400

// Numero di byte da inviare per l'accensione del led tramite l'interfaccia SPI
#define NumByte 16

// Configurazione della porta seriale del computer
Serial pc(USBTX, USBRX);     

// Dichiarazione per il LED di diagnostica
DigitalOut led(LED2);

// Configurazione della porta seriale UART
UARTSerial serial = UARTSerial(PA_9, PA_10);
ATCmdParser at = ATCmdParser(&serial, "\r\n");

// Configurazione dei parametri della SPI
SPI myspi(PA_7, PA_6, PA_5, NC);
     
// Vettore che conterrà i byte ricevuti in risposta al comando AT inviato
char MRxB[MRxBDIM];

// Vettore che conterrà i byte ricevuti in risposta all'invio automatico della sequenza di comandi AT
char ARxB[ARxBDIM];

// Vettore che conterrà i byte da trasmettere al led tramite l'interfaccia SPI
uint8_t Vled[NumByte];

// Dichiarazione del parametro temporale t
Timer t;

// Dichiarazioni delle variabili locali
char c;
int i=0;
int j=0;
int E=0;
int R=0;
int ER=0;
int ERR=0;
int endlis=0;
volatile char input;

// Funzione per l'emissione di luce verde tramite l'interfaccia SPI
void LedGREEN();

// Funzione per l'emissione di luce rossa tramite l'interfaccia SPI
void LedRED();

// Funzione per lo spegnimento del led tramite l'interfaccia SPI
void LedOFF();

// Funzione per la ricerca della parola ERROR nel vettore ricevuto dal modem in risposta al comando digitato
void ERR1();

// Funzione per la ricerca della parola ERROR nel vettore ricevuto dal modem in risposta alla sequenza prestabilita di comandi
void ERR2();


int main()
{
   // FILE *flis;
    // Configurazione del baud rate per la comunicazione col computer
    pc.baud(9600);
    
    // Configurazione dei parametri per l'interfaccia SPI
    myspi.format(16, 0);
    myspi.frequency(3333333.3);
    
    printf("\r\n");
    printf("              PROGRAMMA PER L'INVIO DI COMANDI AT SU PORTA SERIALE\r\n");
    printf("________________________________________________________________________________\r\n");
    printf("\r\n");
    printf("  ----------------------------------------------------------------------------\r\n");
    printf(" | Premere il tasto 'm' per inserire un comando AT                            |\r\n");
    printf(" | Premere il tasto 'a' per l'invio automatico della sequenza di comandi AT   |\r\n");
    printf(" | Premere il tasto 'e' per uscire dal programma                              |\r\n");
    printf("  ----------------------------------------------------------------------------\r\n");
    printf("________________________________________________________________________________\r\n");
    printf("\r\n");
    
/*
    flis=fopen("lista.txt","r");
    if((flis=fopen("lista.txt","r"))==NULL)
    {
        printf("Impossibile aprire il file");
    }
    
    while(!feof(flis))
    {
        fgets(vett,1,flis);
        i++;
        printf("%c",vett[i]);
    }*/

    while(1)
    {
        
        // Reset vettore MRxB
        for(i=0;i<MRxBDIM;i++)
        {
            MRxB[i]='\0';
        }
    
        // Reset vettore ARxB
        for(j=0;j<ARxBDIM;j++)
        {
            ARxB[j]='\0';
        }
        
        input=pc.getc();
    
        if((input=='m')||(input=='M'))
        {
               
            printf("Inserire il comando:  ");
            
            while(1)
            { 
                char c = pc.getc();
                pc.putc(c);
            
                at.write(&c,1);
    
                if(c=='\r') 
                {
                    t.start();
                    goto esc;
                }
            }
        
            esc:
            
            printf("\r\n\r\nRisposta:\r\n");
 
            at.read(MRxB, MRxBDIM);   
            
            t.stop();
            
            for(i=0;i<MRxBDIM;i++)
            {   
                pc.printf("%c",MRxB[i]);
            }
            
            pc.printf("\n\rTempo trascorso dall'invio del comando: %f secondi\n\r", t.read());
            
            t.reset();  
              
            printf("______________________________________________________________________________\r\n");
            printf("\r\n");
            
            ERR1();
            
        } // End if
         
        if ((input=='a')||(input=='A'))
        {
            printf("...invio automatico della sequenza di comandi..."); 
            printf("\r\n");     
             
            at.send("AT");
            at.send("AT+CREG?");
     
            t.start();
            
            printf("\r\nRisposta:\r\n");
 
            at.read(ARxB, ARxBDIM);
            
            t.stop();
        
            for(i=0;i<ARxBDIM;i++)
            {
                pc.printf("%c",ARxB[i]);
            }
            
            pc.printf("\n\rTempo trascorso dall'invio della sequenza di comandi: %f secondi\n\r", t.read());
            
            t.reset();  
        
            printf("______________________________________________________________________________\r\n");
            printf("\r\n");
        
            ERR2();
        
         } // End if
         
         if ((input=='e')||(input=='E'))
         {
             printf("Il programma e' stato chiuso\n\r\n\r");
             LedOFF();
    
             exit(0);
         }
     
    } // End while

}    

void ERR1()
{
            
            endlis=0;
            
            E=0;
            R=0;
            ER=0;
            ERR=0;
            
            // Ciclo per la ricerca della parola ERROR nel vettore ricevuto dal modem in risposta al comando digitato
            for(i=0;i<MRxBDIM;i++)
            {
                if(ERR==0)
                { 
                    if((MRxB[i])==' ') {goto jump1;}
                
                    if(E==0)
                    { 
                        if ((MRxB[i])=='E')
                        {
                            endlis++;
                            E=1;
                            goto jump1;
                        }
                    }
                    if(ER==0)
                    {
                        if(E==1)
                        {
                            if((MRxB[i])=='R') 
                            {
                                endlis++;
                                R=1;
                                ER=1;
                                goto jump1;
                            }
                            else
                            {
                                E=0;
                                endlis=0;
                                goto jump1;
                            }
                        }
                    }
                    if(R==1)
                    {
                        if((MRxB[i])=='R')
                        {
                            endlis++;
                            ERR=1;
                            goto jump1;
                        }
                        else
                        {
                            endlis=0;
                            E=0;
                            R=0;
                            ER=0;
                        }
                    }
                
                } // End if(ERR==0)
                     
            jump1: 
            
            led=1;
                      
            } // End ciclo for
            
            if(endlis==3) 
            {
                LedRED();
            }
            else
            {
                LedGREEN();
            }

}

void ERR2()
{
            
            endlis=0;
            
            E=0;
            R=0;
            ER=0;
            ERR=0;
            
            // Ciclo per la ricerca della parola ERROR nel vettore ricevuto dal modem in risposta alla sequenza prestabilita di comandi
            for(i=0;i<ARxBDIM;i++)
            {
                if(ERR==0)
                { 
                    if((ARxB[i])==' ') {goto jump2;}
                
                    if(E==0)
                    { 
                        if ((ARxB[i])=='E')
                        {
                            endlis++;
                            E=1;
                            goto jump2;
                        }
                    }
                    if(ER==0)
                    {
                        if(E==1)
                        {
                            if((ARxB[i])=='R') 
                            {
                                endlis++;
                                R=1;
                                ER=1;
                                goto jump2;
                            }
                            else
                            {
                                E=0;
                                endlis=0;
                                goto jump2;
                            }
                        }
                    }
                    if(R==1)
                    {
                        if((ARxB[i])=='R')
                        {
                            endlis++;
                            ERR=1;
                            goto jump2;
                        }
                        else
                        {
                            endlis=0;
                            E=0;
                            R=0;
                            ER=0;
                        }
                    }
                
                } // End if(ERR==0)
                     
                jump2:
                
                led=1;
                              
            } // End ciclo for
            
            if(endlis==3) 
            {
                LedRED();
            }
            else
            {
                LedGREEN();
            }

}

void LedGREEN()
{
                       
          // Cicli per la configurazione del vettore Vled
          for(i = 0; i <= 3; i++)      
              Vled[i]=204; 
                 
          for(i = 4; i <= 7; i++)     
              Vled[i]=136;      
             
          for(i = 8; i <= 11; i++)    
              Vled[i]=136; 
                      
          for(i = 12; i <= NumByte-1; i++)     
              Vled[i]=136; 
    
          // Ciclo per l'invio dei frame al led   
          for(j = 0; j < NumByte; j++)  
              myspi.write(Vled[j]);      
              
}

void LedRED()
{
                 
          // Cicli per la configurazione del vettore Vled
          for(i = 0; i <= 3; i++)      
              Vled[i]=136; 
                 
          for(i = 4; i <= 7; i++)     
              Vled[i]=204;      
             
          for(i = 8; i <= 11; i++)    
              Vled[i]=136; 
                      
          for(i = 12; i <= NumByte-1; i++)     
              Vled[i]=136; 
    
          // Ciclo per l'invio dei frame al led   
          for(j = 0; j < NumByte; j++)  
              myspi.write(Vled[j]);      

}

void LedOFF()
{
         
          // Cicli per la configurazione del vettore Vled    
          for(i = 0; i <= 3; i++)      
              Vled[i]=136; 
                 
          for(i = 4; i <= 7; i++)     
              Vled[i]=136;      
             
          for(i = 8; i <= 11; i++)    
              Vled[i]=136; 
                      
          for(i = 12; i <= NumByte-1; i++)     
              Vled[i]=136; 
    
          // Ciclo per l'invio dei frame al led   
          for(j = 0; j < NumByte; j++)  
              myspi.write(Vled[j]);      

}