Dependencies:   PinDetect TextLCD mbed mRotaryEncoder

main.cpp

Committer:
cicklaus
Date:
2012-02-13
Revision:
0:afb2650fb49a

File content as of revision 0:afb2650fb49a:


#include <scmRTOS.h>
#include "mbed.h"
#include <iostream>
#include "TextLCD.h"
//#include "DebounceIn.h"
#include <math.h>
#include <string>
#define MESSAGE_BUFFER_SIZE 1024
#include "time.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MODSERIAL.h"
#include "stdint.h"
#include "DirHandle.h"
#include "SDCard.h"
#include "mRotaryEncoder.h"

SDCard Logger(p5, p6, p7, p8, "SDCard");
mRotaryEncoder  wheel(p16, p17, p15,PullUp,1500);
Serial Computer(USBTX, USBRX);
DigitalOut LED(LED1);
MODSERIAL gsm(p9,p10);

AnalogIn WindVoltage(p20);
TextLCD lcd(p22, p23, p24, p25, p26, p27); 



char Emergency[40];
char line= '\n';
char c;
char str[40];
char Hi;
struct tm t;
int timecount = 0;
char buffer1[32];
char buf[18];
char buf1[40];
char buf2[4];
char buf3[256];
char buf4[20];
char * pch;
char ctr= 0x1A;
char Key[]="OK";
int Status = 0;
int Status1=0;
int Status2=0;
int Status3=0;
int Status4=0;
int Status5=0;
int Status6=0;
int Status7=0;

float FinalVoltage=0;
char SMS1[] ="#Read Volt\r\n";
char SMS2[] ="#Read Current\r\n";
char SMS3[] ="#Read All\r\n";
char SMS4[] ="#Start Log\r\n";
char SMS5[] ="#Stop Log\r\n";
char SMS6[] ="#Change Emergency\r\n";
char SMS7[] ="#Reset Emergerncy\r\n";
char SMS[15];
int logging =0;
int logon = 0;
int logoff = 0;
int log_set =0;
int log_start = 0;

int counter=0;
int counter1=0;
bool enc_pressed;
bool enc_rotated;


// OS timer/interrupt
OS::TEventFlag GSM;
OS::TEventFlag GSM1;
OS::TEventFlag GSM2;
OS::TEventFlag GSM3;
OS::TEventFlag GSM4;
OS::TEventFlag GSMSTART;
OS::TEventFlag GSMSTOP;
OS::TEventFlag LOGSTOP;
OS::TEventFlag LOGSTART;
//---------------------------------------------------------------------------


void toggle()
{
switch (counter1) {

            default :
              //  wait(0.5);
              lcd.cls();
                lcd.locate(0,0);                    //Default State, Show time normally.
               lcd.printf("%s", buffer1);
                counter1 = 0;
                break;

            case 2 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Voltage");

                switch (counter) {
                    case 1 :
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("The Voltage is 3.00V");
                        wait(2);
                        counter=0;
                        break;

                }
                wait(0.5);
                break;


            case 4 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Current");

                switch (counter) {
                    case 1 :
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("The Current is 2.34A");
                        wait(2);
                        counter=0;
                        break;

                }
                wait(0.5);
                break;

            case 6 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("On log SD card");

                switch (counter) {
                    case 1 :
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("Logging commence");
                        wait(2);
                        counter=0;
                        break;

                }
                wait(0.5);
                break;


            case 8 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Off log SD card");

                switch (counter) {
                    case 1 :
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("Logging aborted");
                        wait(2);
                        counter=0;
                        break;

                }
                wait(0.5);
                break;

            case 10 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Reset SMS Alert");

                switch (counter) {
                    case 1 :
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("Do you want to reset?");
                        break;
                    case 2 :
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("Yes, reset done.");
                        counter=0;
                        break;

                }
                wait(0.5);
                break;

            case 12 :
                lcd.cls();
                lcd.locate(0,0);
                lcd.printf("Emergency number");

                switch (counter) {
                    case 1 :
                        lcd.cls();
                        lcd.locate(0,0);
                        lcd.printf("Number:999");
                        wait(5);
                        counter=0;
                        break;

                } 
                wait(0.5);
                break;




        }
}

void trigger_sw() {
    enc_pressed = true;               // just set the flag, rest is done outside isr
}

//interrup-Handler for rotary-encoder rotation
void trigger_rotated() {
    enc_rotated = true;               // just set the flag, rest is done outside isr
}
void Push() {
    if (enc_pressed==true) {
        enc_pressed=false;
        counter++;
    }

}

void Turn() {
    if (enc_rotated == true) {
        enc_rotated = false;

        counter1++;
    }

}

void TimeMessage()    //Get character (e.g. Printf the Words from serial)
    {
        strcpy (str,&Hi);
         do {
            c=Computer.getc();
           Computer.putc (c);
            strcat (str,&c);
            }while (c != ' '); 
    }

void GSM_CLEAR_SMS()      //Delete 1st SMS
{
    gsm.printf("AT+CMGD=0,1\r\n");
    wait(0.2);
}    



void GSM_GETCHAR()    //Get character (e.g. Printf the Words from serial)
{
    do {
    c=gsm.getc();
    Computer.putc (c);
       }while (c != line);
}

void GSM_GETCHAR1()    //Get character (e.g. Printf the Words from serial)
{  
  strcpy (str,&Hi);
    do {
    c=gsm.getc();
     Computer.putc (c);
    strcat (str,&c);
     
       }while (c != line);
        Computer.printf("%s\n\r",str);
    //   Status = strcmp (SMS1,str);
    //   pc.printf("%d\n\r", Status);
       
}

void Replyvolt()
{
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    gsm.printf("%s The Voltage is %.2f V  %c", buffer1, FinalVoltage,ctr);    
}

void Replycurent()
{
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    gsm.printf("%s The Current is %.2f V  %c", buffer1, FinalVoltage,ctr);    
}

void Replyall()
{
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    gsm.printf("%s Voltage: %.2f V, Current: %.2f A   %c", buffer1,FinalVoltage, FinalVoltage,ctr);    
}

void Replylogstart()
{
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    if(logging ==1)
    {
   
   gsm.printf(" Logging of SD CARD: Start  %c",ctr);  
     
   GSMSTART.Signal();
    }
    if(logging == 0)
    {
    gsm.printf("%s Logging of SD Card: Has Started since  %c", buffer1, FinalVoltage,ctr);  
    }
    
}

void Replylogstop()
{
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    if(logging ==0)
    {
     
    gsm.printf("Logging of SD CARD: Stopped  %c", ctr);  
    GSMSTOP.Signal();
    }
    if(logging == 1)
    {
    gsm.printf("%s Logging of SD Card: Has Stopped since  %c", buffer1,ctr);  
    }
    
}


void CheckSMSMSG()
{
Status1 = strcmp (SMS1,str);
Status2 = strcmp (SMS2,str);
Status3 = strcmp (SMS3,str);
Status4 = strcmp (SMS4,str);
Status5 = strcmp (SMS5,str);
Status6 = strcmp (SMS6,str);
Status7 = strcmp (SMS7,str);

if(Status1 == 0)
{
Replyvolt();
}

if(Status2 == 0)
{
Replycurent();
}

if(Status3 == 0)
{
Replyall();
}
if(Status4 == 0)
{
 GSM3.SignalISR();
}
if(Status5 == 0)
{
 GSM4.SignalISR();
}

if(Status6 == 0)
{
}

if(Status7 == 0)
{
}
else
{
 Computer.printf("Random SMS\n\r");}
}


void GSM_CHECK_MSG() //Check if msg is OK,Error.
{
 Status = strcmp (Key,buf1);
//pc.printf("%d\n\r", Status);            //See the error Number
}



void ExtractNum()  //Extract the number from the sender's sms
{
    pch = strtok (buf3," ,.-");
    pch = strtok (NULL, " ,.-");    
    //pc.printf ("pch is %s\n\r",pch);    //See Number extracted
    strcpy (buf4,pch);  
    Computer.printf("%s\n\r", buf4);                //Number extracted in "+6512345678" 
}



void ReceiveMessage()
{
     gsm.rxBufferFlush();      
     gsm.printf("AT+CMGR=\"1\"\n\r");      //Read Message.
     gsm.scanf("%s",buf);
 
     // pc.printf("%s\r\n",buf); 
     gsm.scanf("%s",buf1);
     //  pc.printf("%s\n\r",buf1);
      
     GSM_CHECK_MSG();                        //Check For reply. If Ok, no sms. if error, no sms.
}


void GSM_STARTUP()
{
 
    gsm.baud(9600); 
     Computer.baud(9600);
    gsm.format(8, Serial::None, 1);
    
    gsm.rxBufferFlush();
    Computer.printf("\n\rSetting Up GSM\n\r");
        Computer.printf("---------------\n\r\n\r");
    gsm.printf("AT+CMGF=\"1\"\r\n");
    gsm.scanf("%s",buf);
 //   pc.printf("buf1 is: %s\r\n",buf);
    
    gsm.scanf("%s",buf3);      //scanf OK
    Computer.printf("%s\r\n",buf3); 
    GSM_CLEAR_SMS();
    do
    { 
    Computer.printf("Enter Emergency Number[Space]: ");
     TimeMessage();
     Computer.printf("\n\r\n\r"); 
    Computer.printf("Is this your Number[y/n]: %s\n\r", str);
     strcpy (Emergency,str); 
       c=Computer.getc();
    Computer.printf("\n\r\n\r"); 
     }while(c !='y');
     Computer.printf("...GSM Setup Done\n\r\n\r\n\r");
      gsm.rxBufferFlush();
}
    
/*void TimeMessage()    //Get character (e.g. Printf the Words from serial)
    {
        strcpy (str,&Hi);
         do {
            c=pc.getc();
            pc.putc (c);
            strcat (str,&c);
            }while (c != ' '); 
    }*/

void time_setup() {
      Computer.baud(9600);
   
    Computer.printf("\n\rSetting Up Time\n\r");
        Computer.printf("---------------\n\r\n\r");

    // get the current time from the terminal

    do{
   Computer.printf("Enter current date and time:\n\r");
   Computer.printf("YYYY MM DD HH MM SS\n\r");    
    
    TimeMessage();
    t.tm_year = atoi (str);
    TimeMessage();
    t.tm_mon = atoi (str);
    TimeMessage();
    t.tm_mday= atoi (str);
    TimeMessage();
    t.tm_hour = atoi (str);
    TimeMessage();
    t.tm_min = atoi (str);
    TimeMessage();
    t.tm_sec = atoi (str);
    
    Computer.printf("\n\r\n\r");
    Computer.printf("Is the time correct [y/n]\n\r");
    c=Computer.getc();
    Computer.printf("\n\r");    
    }while(c !='y');
  
    // adjust for tm structure required values
    t.tm_year = t.tm_year - 1900;
    t.tm_mon = t.tm_mon - 1;
    
    // set the time
    set_time(mktime(&t));
    
    Computer.printf("...Time Setting Done\n\r\n\r");
     
}

void message()    //Get character (e.g. Printf the Words from serial)
{

    do {
    c=Computer.getc();
    Computer.putc (c);
     strcat (str,&c);
     
    }while (c != '.');
    Computer.printf("\n\r\n\r");
    
    
}

void Sending()
{
      if(Status==36)
        {  
        time_t seconds = time(NULL);
        gsm.scanf("%s",buf2);
        gsm.scanf("%s",buf3);                     //Scan ["READ","+6512345678",,"12/01/18,23:54:25+32"]
        ExtractNum();                             //to extract number
    
        Computer.printf("The Message is:\n\r");
        GSM_GETCHAR();  
  
        GSM_GETCHAR1();                           //Compare sms(e.g.SMSing "#ReadVolt" will give u voltage reading)
        GSM_GETCHAR();
               
        GSM_CLEAR_SMS();                         //Delete 1st Message
         gsm.rxBufferFlush();
     
        gsm.rxBufferFlush();
        }
        }
void View_TIME()
{
        do{
        time_t seconds = time(NULL);
        strftime(buffer1, 32, "%a %d/%m/%Y %I:%M:%S %p", localtime(&seconds));
        lcd.printf("%s\n", buffer1);
         wait(1);
         timecount = timecount + 1;
         lcd.cls();
         }while(timecount !=3);
         timecount = 0;
}         
     
void View_Voltage()
{
     do{
       FinalVoltage = WindVoltage * 3.3* 2.926;
        lcd.printf("Voltage: %.2f V", FinalVoltage );  
         wait(1);
         timecount = timecount + 1;
         lcd.cls();  
         }while(timecount != 3);
        timecount = 0;         
}

void SD_card_setup()
{
Computer.printf("\n\rDo you want to start Logging[y/n]:\n\r");
do{
c=Computer.getc();
    if(c=='y')
    {
    logging = 0;
    log_set= 1;
    log_start = 1;
    }
    if(c=='n')
    {
    logging = 1;
    log_set = 1;
    }
  }while(log_set != 1);
}

void SD_CARD()
{     
    if(logging == 0)
    {
   //  Logger.SelectCRCMode(1);
     FILE *fp = fopen("/SDCard/myfile.csv", "a+");
     if(log_start == 1)
      {fprintf(fp,"%s, Logging Start\n\r",buffer1);
      log_start = 0;}
      if(log_start == 2)
      {   fprintf(fp,"%s, Logging Stopped \n\r",buffer1);
      log_start = 0;
      logging = 1;
      }
      else
      {
     fprintf(fp,"%s, Voltage:, %.2f V\n\r",buffer1,FinalVoltage );}
     fclose(fp);
     printf("logging\n\r");
      }
      
}
// process types
typedef OS::process<OS::pr0, 800> TProc1;
typedef OS::process<OS::pr1, 1000> TProc2;
typedef OS::process<OS::pr2, 1500> TProc3;
typedef OS::process<OS::pr3, 1000> TProc4;
typedef OS::process<OS::pr4, 1000> TProc5;
typedef OS::process<OS::pr5, 1000> TProc6;
typedef OS::process<OS::pr6, 1000> TProc7;
typedef OS::process<OS::pr7, 1000> TProc8;
typedef OS::process<OS::pr8, 1000> TProc9;
typedef OS::process<OS::pr9, 1000> TProc10;
typedef OS::process<OS::pr10, 1000> TProc11;
typedef OS::process<OS::pr11, 1000> TProc12;
typedef OS::process<OS::pr12, 1000> TProc13;
typedef OS::process<OS::pr13, 3000> TProc14;

// process objects
TProc1 Proc1;
TProc2 Proc2;
TProc3 Proc3;
TProc4 Proc4;
TProc5 Proc5;
TProc6 Proc6;
TProc7 Proc7;
TProc8 Proc8;
TProc9 Proc9;
TProc10 Proc10;
TProc11 Proc11;
TProc12 Proc12;
TProc13 Proc13;
TProc14 Proc14;



//---------------------------------------------------------------------------


long long count = 0;

int main() {
 Logger.SelectCRCMode(1);
    Computer.baud(9600);
    printf("\nInitialising ...\n");
     gsm.baud(9600);
     
     time_setup();
     GSM_STARTUP();
     SD_card_setup();
     printf("\n\rSAMS Settup Done\n\r");
     wait(0.5);
     printf("\n\rRunning Program\n\r");
      wheel.attachSW(&trigger_sw);
        wheel.attachROT(&trigger_rotated);

   
    OS::Run();
}

//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc1::Exec() {
    for (;;) {
    
    toggle();
    
  //  if(counter == 1)
 //   {
//    printf("Hi\n\r");
 //   }
  Sleep(2000);
      
    }
}

//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc2::Exec() {
    for (;;) {
    GSM.Wait();
      ReceiveMessage();  
   GSM1.SignalISR();
      Sleep(2000);
      
    }
}

//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc3::Exec() {
    for (;;) {
        GSM1.Wait();
          Sending();
           gsm.rxBufferFlush();
           GSM2.SignalISR();
      Sleep(2000);
      
      
    }
}
//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc4::Exec() {
    for (;;) {
    if(Status==36){
        GSM2.Wait();
        CheckSMSMSG();                         //Reply SMS
        Computer.printf("Sent SMS\n\r");
        gsm.rxBufferFlush();
         gsm.rxBufferFlush();
          GSM_CLEAR_SMS();
           gsm.rxBufferFlush();}
          
          
      Sleep(2000);
      
      
    }
}
//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc5::Exec() {
    for (;;) {
    
        GSM3.Wait();
         Replylogstart();
       
        Sleep(2000);
      
      
    }
}

//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc6::Exec() {
    for (;;) {
       
       
        GSM4.Wait();
         Replylogstop();
        Sleep(2000);
      
      
    }
}
//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc7::Exec() {
    for (;;) {
       
       
        GSMSTART.Wait();
        logging = 0;
      //  logon = 1;
        log_start = 1;
        printf("start\n\r");
     //   LOGSTART.Signal();
        Sleep(2000);
      
      
    }
}
//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc8::Exec() {
    for (;;) {
       
       
         GSMSTOP.Wait();
     //   logging = 1;
        log_start = 2;
      //  logon = 1;
        Sleep(2000);
      
      
    }
}
//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc9::Exec() {
    for (;;) {

      LOGSTART.Wait();
      lcd.printf("Logging of SD CARD: Start\n");
    


      Sleep(2000);
    }
    
}




//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc10::Exec() {
    for (;;) {
       
      Sleep(2000);
      
    }
}


//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc11::Exec() {
    for (;;) {
        FinalVoltage = WindVoltage * 3.3* 2.926;
        printf("p2\n\r");
      Sleep(2000);
      
    }
}

//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc12::Exec() {
    for (;;) {
        
       //Sleep(2000);
     //  lcd.cls();
     //   lcd.printf("Voltage: %.2f\n", FinalVoltage);
     //   printf("[2] %lld\n\r", count);
        Sleep(2000);
      
    }
}

//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc13::Exec() {
    for (;;) {
 //   LOGSTART.Wait();
 //   SD_CARD();
   // Sleep(1500);
      Sleep(2000);
      
    }
}

//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc14::Exec() {
    for (;;) {
      printf("SDCARD\n\r");
      SD_CARD();
    Sleep(1500);
      
    }
}
//---------------------------------------------------------------------------
void OS::SystemTimerUserHook() {
  count++;
   if(gsm.rxBufferGetCount() != 0)
    
    { GSM.Signal();}
      time_t seconds = time(NULL);
        strftime(buffer1, 32, "%a %d/%m/%Y %I:%M:%S %p", localtime(&seconds));
        Push();
        Turn();
  wheel.attachSW(&trigger_sw);
    wheel.attachROT(&trigger_rotated);

  
      
     
}

//---------------------------------------------------------------------------
void OS::IdleProcessUserHook() {
    __WFI();
}