Dependencies:   TextLCD mbed

main.cpp

Committer:
cicklaus
Date:
2012-06-01
Revision:
0:bdcfca60d8a6

File content as of revision 0:bdcfca60d8a6:

#include "mbed.h"
#include "MODSERIAL.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "lib_crc.h"

// Connect the TX of the GPS module to p10 RX input
Serial Computer(USBTX, USBRX);
MODSERIAL gsm(p13, p14);
DigitalOut Led(LED1);
DigitalOut Led1(LED2);
MODSERIAL RS485(p28,p27);
Serial LEDScreen(p9,p10);
DigitalOut ho(p26);
DigitalOut led(LED3);
Ticker flipper;

bool Pass = false;
int count1 =0;
int count2 =0;
char buf[18];
char Key[]="OK";
char Hi;
char * pch;
char Ext1[10];
char Ext2[10];
char Ext3[10];
int alert=0;
int Status=0, Status1=0, Status2=0, Status3=0, Status4=0, Status5=0,Status6=0, Status7=0,NumberStat = 0;
int Emer, Emer1, Emer2, Emer3;
char Emergency[]= "1", Emergency1[]="2",Emergency2[]= "3",Emergency3[]= "4";
char line= '\n';
char c;
char SMS1[] ="#Read Volt\r\n", SMS2[] ="#Read Current\r\n", SMS3[] ="#Read All\r\n", SMS4[] ="#Changenum\r\n", SMS5[] ="#Stop Log\r\n", SMS6[] ="#Hi\r\n", SMS7[] ="#Reset Emergerncy\r\n";
char SMS[15];
char Password[]= "1234";
char buffer1[32];
char str[9];
char str2[9];
char ctr= 0x1A;
char buf1[40];
char buf2[4];
char buf3[256];
char buf4[20];
float FinalVoltage=0;
bool newline_detected = false;
char NumberMan[20];
int PassChecker;
int voltcount = 0;
char modbusreply[9];
char modbusreply1[16];
char a[2];
int b;
int firsthex4;   //Modbus Hex4
int firsthex5;   //MOdbus Hex5
int Sechex4;     //Modbus Hex4
int Sechex5;     //Modbus Hex5
char hi= 0x48;
int count = 0;
//uint32_t EnergyGen;
//uint32_t Energyused;
int EnergyGen;
int Energyused;
char crc[10];
char crc1;
char buffer [10];
bool Dam = false;





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

void LEDSerialstart() {  //Starting code for LED Screen
    LEDScreen.putc(0x00);
    LEDScreen.putc(0xff);
    LEDScreen.putc(0xff);
    LEDScreen.putc(0x00);
    LEDScreen.putc(0x0b);
    LEDScreen.putc(0x00);
    LEDScreen.putc(0x01);
    LEDScreen.putc(0xff);
    LEDScreen.putc(0x01);
    LEDScreen.putc(0x01);
    LEDScreen.putc(0x03);
    LEDScreen.putc(0xef);
    LEDScreen.putc(0xb0);
    LEDScreen.putc(0xef);
    LEDScreen.putc(0xa2);
}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------

void New_Screen() {   //New Frame for LED screeen
    LEDScreen.putc(0xef);
    LEDScreen.putc(0xb1);
    LEDScreen.putc(0xef);
    LEDScreen.putc(0xa0);
    LEDScreen.putc(0xff);
    LEDScreen.putc(0xef);
    LEDScreen.putc(0xb0);
    LEDScreen.putc(0xef);
    LEDScreen.putc(0xa2);

}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------

void LEDSerial_end() {  //Ending code for LED screen
    LEDScreen.putc(0xff);
    LEDScreen.putc(0xff);
    LEDScreen.putc(0x00);
}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------

/*void MasterRequest1() {  //Request accumulative Kwh from Modbus 1
    ho= 1;
    wait(0.1);
    RS485.putc(0x01);
    RS485.putc(0x03);
    RS485.putc(0x00);
    RS485.putc(0x04);
    RS485.putc(0x00);
    RS485.putc(0x02);
    RS485.putc(0x85);
    RS485.putc(0xca);
    wait(0.009);
}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------

void SlaveReply1() {  //Reply from Modbus1

    ho= 0;
    wait(0.0025);
    while (RS485.readable()) {
        RS485.getc();
    }
    for (int count = 0; count!=6; count++) {
        b= RS485.getc();
         Computer.putc(c);
        modbusreply[count] = b;
    }
    RS485.getc();
    a[0]= RS485.getc();
    a[1]= RS485.getc();
    int nValue = a[0] + (a[1] << 8);   // combining 2 bytes into an int then convert to 2 byte hex

    if (calculate_crc16_Modbus(modbusreply, 7)== nValue) {
        firsthex4 = modbusreply[3];
        firsthex5 = modbusreply[4];
        EnergyGen =((firsthex4*256) + firsthex5);
        printf("Energy Generate: %d kWh\n\r",EnergyGen);
        
    }
}*/

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

void MasterRequest2() { //Request accumulative Kwh from Modbus 2     (ERROR)
    ho= 1;
    wait(0.1);
    RS485.putc(0x02);
    RS485.putc(0x03);
    RS485.putc(0x00);
    RS485.putc(0x0a);
    RS485.putc(0x00);
    RS485.putc(0x02);
    RS485.putc(0xe4);
    RS485.putc(0x3a);
    wait(0.009);
}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------

void SlaveReply2() {  //Reply from Modbus1             (ERROR)

    ho= 0;
   // wait(0.0025);
    wait(0.005);
         RS485.getc();
 
 do{
 b = RS485.getc();
// Computer.putc(b);
 }while(b == 0x00);
   //  b = RS485.getc();
    Computer.putc(b);
   modbusreply1[0] = b;
   
    for (int count2 = 1; count2!=7; count2++) {

         // modbusreply1[count2] = b;
        b= RS485.getc();
         Computer.putc(b);
       modbusreply1[count2] = b;
    }
    RS485.getc();
  
    a[1]= RS485.getc();
    a[0]= RS485.getc();
    int nValue = a[0] + (a[1] << 8);   // combining 2 bytes into an int then convert to 2 byte hex

   // if (calculate_crc16_Modbus(modbusreply1, 7)== nValue) {
        Sechex4 = modbusreply1[3];
        Sechex5 = modbusreply1[4];
        Energyused =((Sechex4*256) + Sechex5);
   //     printf("Energy Used: %d kWh\n\r",Energyused);
   //      printf("E: %04X kWh\n\r",calculate_crc16_Modbus(modbusreply1, 7));
   //        printf("W: %04X kWh\n\r",nValue);
    //}
}
//------------------------------------------------------------------------------------------------------------------

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

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


}
//------------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------------------------
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);


}
//------------------------------------------------------------------------------------------------------------------
void Checkit() { //Clear Extra character from GSM

    wait(1);
    while (gsm.readable()) {
        gsm.getc();
    }
}

//------------------------------------------------------------------------------------------------------------------
void SMS_Alert() {    //Alert User abt error  (NOT COMPLETED.What type of error to trigger SMS)
    if (voltcount==10) {
        if (alert == 0) {
            gsm.rxBufferFlush();
            gsm.printf("AT+CMGS=%s\r\n",Emergency);        //Send SMS
            GSM_GETCHAR();
            gsm.printf("Alert: Voltage has been 0V for the pass 1 hour  %c",ctr);
            wait(0.3);
            gsm.printf("%c", ctr);
            alert = 1;

        }
    }
}
//------------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------------------------
void Replyvolt() {  //Reply energy generated
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    gsm.printf("The Power is %s W  %c", buffer,ctr);
    wait(0.3);
    gsm.printf("%c", ctr);
//    wait(1.5);
    gsm.rxBufferFlush();
}
//------------------------------------------------------------------------------------------------------------------


//------------------------------------------------------------------------------------------------------------------
void Replycurent() {  //Reply energy used
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    gsm.printf("The Current is %.2f V  %c",FinalVoltage,ctr);
    wait(0.3);
    gsm.printf("%c", ctr);
    //   wait(2.5);
    gsm.rxBufferFlush();

}
//------------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------------------------
void Replyall() {  //Reply Energy gen and used
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    gsm.printf("Voltage: %.2f V, Current: %.2f A   %c", FinalVoltage, FinalVoltage,ctr);
    wait(0.3);
    gsm.printf("%c", ctr);
    wait(2.5);
    gsm.rxBufferFlush();
}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
void Change_Number() {   //Change Emergency Number
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
    GSM_GETCHAR();
    gsm.printf("Plese sms back the following in order: Password, Current Number, New Number %c",ctr);
    wait(0.3);
    gsm.printf("%c", ctr);
    strcpy (NumberMan,buf4);
    wait(2.5);
    gsm.rxBufferFlush();


}

//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
void CheckSMSMSG() {  //Check MSG receive from Sender
    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();
        Checkit();
    }
    if (Status2 == 0) {
        Replycurent();
        Checkit();
    }

    if (Status3 == 0) {
        Replyall();
        Checkit();
    }
    if (Status4 == 0) {
        Change_Number();
        Checkit();
    }
    if (Status5 == 0) {

    }
    if (Status1!=0 && Status2!=0 &&Status3!=0 &&Status4!=0 &&Status5!=0) {
        Computer.printf("Random SMS\n\r");
    }
}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
void CheckPassword() {  //Change Password Function
    PassChecker = strcmp (Password,Ext1);  //Check if Password is correct
    if (PassChecker != 0) {                //If password is incorrect. Reply Invalid Password
        gsm.rxBufferFlush();
        gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
        GSM_GETCHAR();
        gsm.printf("Invalid Password %c",ctr);
        strcpy (NumberMan,&Hi);
        gsm.printf("%c", ctr);
        wait(2.5);
        gsm.rxBufferFlush();
        Checkit();
    } else {                        //Otherwise, Pass is true. ....go to funtion "Old_Number"
        Pass = true;
    }
    //   Checkit();

}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
void Old_Number() {     //trigger if password is true
    if (Pass== true) {
        Emer = strcmp (Emergency,Ext2);  //Check if Number is emergency 1
        Emer1 = strcmp (Emergency1,Ext2); //Check if Number is emergency 2
        Emer2 = strcmp (Emergency2,Ext2);  //Check if Number is emergency 3
        Emer3 = strcmp (Emergency3,Ext2);   //Check if Number is emergency 4
        if (Emer == 0) {
            strcpy (Emergency,Ext3);
            gsm.rxBufferFlush();
            gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
            GSM_GETCHAR();
            gsm.printf("Emergency Number \"%s\" is set %c",Emergency, ctr);
            strcpy (NumberMan,&Hi);
            gsm.printf("%c", ctr);
            wait(2.5);
            gsm.rxBufferFlush();
            Checkit();
        }
        if (Emer1 == 0) {
            strcpy (Emergency1,Ext3);
            gsm.rxBufferFlush();
            gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
            GSM_GETCHAR();
            gsm.printf("Emergency Number \"%s\" is set %c",Emergency1, ctr);
            strcpy (NumberMan,&Hi);
            gsm.printf("%c", ctr);
            wait(2.5);
            gsm.rxBufferFlush();
            Checkit();
        }
        if (Emer2 == 0) {
            strcpy (Emergency2,Ext3);
            gsm.rxBufferFlush();
            gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
            GSM_GETCHAR();
            gsm.printf("Emergency Number \"%s\" is set %c",Emergency2, ctr);
            strcpy (NumberMan,&Hi);
            gsm.printf("%c", ctr);
            wait(2.5);
            gsm.rxBufferFlush();
            Checkit();
        }
        if (Emer3 == 0) {
            strcpy (Emergency3,Ext3);
            gsm.rxBufferFlush();
            gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
            GSM_GETCHAR();
            gsm.printf("Emergency Number \"%s\" is set %c",Emergency3, ctr);
            strcpy (NumberMan,&Hi);
            gsm.printf("%c", ctr);
            wait(2.5);
            gsm.rxBufferFlush();
            Checkit();
        }
        if (Emer != 0 && Emer1 != 0 && Emer2 != 0 && Emer3 != 0) {
            gsm.rxBufferFlush();
            gsm.printf("AT+CMGS=%s\r\n",buf4);        //Send SMS
            GSM_GETCHAR();
            gsm.printf("No such Number %c",Emergency3, ctr);
            strcpy (NumberMan,&Hi);
            gsm.printf("%c", ctr);
            wait(2.5);
            gsm.rxBufferFlush();
            Checkit();
        }
    }


}


//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
void Check_Number() {
    pch = strtok (str," ,.-");
    strcpy (Ext1,pch);
    pch = strtok (NULL, " ,.-");
    strcpy (Ext2,pch);
    pch = strtok (NULL, " ,.-");
    strcpy (Ext3,pch);
}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
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 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();                           //Extract sms(e.g.SMSing "#ReadVolt" will give u voltage reading)
        GSM_GETCHAR();

        GSM_CLEAR_SMS();                         //Delete 1st Message
        gsm.rxBufferFlush();

        gsm.rxBufferFlush();
    }
}
//------------------------------------------------------------------------------------------------------------------

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

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 ReceiveMessage() {
    gsm.rxBufferFlush();
    gsm.printf("AT+CMGR=\"1\"\n\r");      //Read Message.
    gsm.scanf("%s",buf);
    gsm.scanf("%s",buf1);

    GSM_CHECK_MSG();                        //Check For reply. If Ok, no sms. if error, no sms.
}
//------------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------------------------
void rxCallback(MODSERIAL_IRQ_INFO *q) {   //Interrupt trigger
    MODSERIAL *serial = q->serial;

    if ( serial->rxGetLastChar() == '\n') {
        newline_detected = true;
        Led1= 1;
    }
}
//------------------------------------------------------------------------------------------------------------------

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

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

//------------------------------------------------------------------------------------------------------------------
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.rxBufferFlush();
    GSM_CLEAR_SMS();
    Computer.printf("...GSM Setup Done\n\r\n\r\n\r");
    gsm.rxBufferFlush();
}
//------------------------------------------------------------------------------------------------------------------

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

void Mainly() {  //Getting Data and putting on LED Screen
    Computer.baud(9600);
//    MasterRequest1();
 //   SlaveReply1();
    wait(5);
  MasterRequest2();
    SlaveReply2();
    count = 0;
     count1= 0;
    sprintf (buffer, "%d",EnergyGen);
    sprintf (buffer1, "%d",Energyused);
    wait(1);
    Computer.baud(2400);
    wait(1);
    LEDSerialstart();
    LEDScreen.printf("Energy Generated: %s Kwh",buffer);
    New_Screen();
    LEDScreen.printf("Energy Used: %s Kwh",buffer1);
    LEDSerial_end();
    wait(0.5);
    Computer.baud(9600);
    wait(1);

}
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------

void Trigger() { // trigger  for gathering data
    Dam = true;
}
//------------------------------------------------------------------------------------------------------------------

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


int main() {
    GSM_STARTUP();
    gsm.attach(&rxCallback, MODSERIAL::RxIrq);
    RS485.baud(9600);
    LEDScreen.baud(2400);
    flipper.attach(&Trigger, 10.0);


    // Wait here until we detect the \n going into the buffer.
    while (! newline_detected ) {

        Led = !Led;
        wait(1);


        if (Dam == true) {
            Mainly();
            Dam =false;
        }

        if (newline_detected == true)   {
            printf("%d\n\r",count1);
            ReceiveMessage();
            Sending();
            NumberStat = strcmp (NumberMan,buf4);

            switch (NumberStat) {

                case 0:
                    Check_Number();
                    CheckPassword();
                    Old_Number();
                    strcpy (NumberMan,&Hi);
                    Pass = false;
                    Computer.printf("Hi\n\r");
                    newline_detected = false;
                    Led1= 0;
                    break;

                default:
                    CheckSMSMSG();
                    gsm.rxBufferFlush();
                    Computer.printf("the buffer %d",gsm.rxBufferGetCount());
                    newline_detected = false;
                    strcpy (buf4,&Hi);
                    Led1= 0;

            }

        }

    }


}