nicklaus lek
/
Alpha_copy
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; } } } }