Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Fork of SmartPlugBLE by Pavit Noinongyao

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SPCommunication.cpp Source File

SPCommunication.cpp

00001 #include "SPCommunication.h"
00002 
00003 SPCommunication::SPCommunication():SPUart(p9,p11)
00004 {
00005     SPUart.baud(115200);
00006     SPUart.attach(this,&SPCommunication::Rxint,Serial::RxIrq);
00007     size=0;
00008     r = 0;
00009     w = 0;
00010     for (int i=0;i<128;i++) RxBuffer[i]=0;
00011 }    
00012 SPCommunication::SPCommunication(PinName tx,PinName rx,uint32_t bRate): SPUart(tx,rx){
00013 
00014     SPUart.baud(bRate);
00015      SPUart.attach(this,&SPCommunication::Rxint,Serial::RxIrq);
00016     size=0;
00017     r = 0;
00018     w = 0;
00019     for (int i=0;i<128;i++) RxBuffer[i]=0;
00020     
00021 }
00022 void SPCommunication::Rxint()
00023 {
00024      SPUart.printf("\r\n Por %02X",SPUart.getc());
00025  
00026     //while (SPUart.readable()){
00027     //uint8_t temp = SPUart.getc();
00028     
00029     //buff.addData(temp);
00030    //RxBuffer[w] = temp;
00031     if (++w >= 128) 
00032         w = 0;
00033    //}
00034 }
00035 //Get crc remainder from table
00036 uint8_t SPCommunication::getCRC(uint8_t val)
00037 { 
00038     return crc8_table[val];   
00039 }
00040 
00041 // print all data store in ArrData in class
00042 void SPCommunication::printData(){
00043     //SPUart.printf("szie is %02X ",size);
00044     for(int i=0;i<size;i++)
00045         SPUart.printf("%02X ",DataArr[i]);
00046     }
00047 
00048 
00049 uint8_t* SPCommunication::RequestData(uint8_t* data)
00050 {
00051  
00052  int i=0;
00053     do // Send request Data
00054     {
00055     SPUart.printf("%c",data[i]);  
00056     i++; 
00057     }
00058     while(data[i]!='\0');
00059     wait(2);
00060     
00061     SPUart.printf("\r\n data store in buffer %d",w);
00062     uint8_t temp = readData();
00063     SPUart.printf("\r\n Req data %02x",temp);
00064     
00065     if((uint8_t) temp == 0x7E){
00066        uint8_t err = handleData();
00067        if(err)
00068             handleData();
00069     }
00070     SPUart.printf("return");
00071   return 0;
00072     
00073 }
00074 
00075 
00076 uint8_t SPCommunication::handleData(){
00077     delete[] DataArr;
00078     
00079     uint8_t message;
00080     uint8_t crccheck;
00081     
00082     size=readData();
00083     //size/=2;
00084  //   SPUart.printf("\r\n Size is  %02X",size);
00085     DataArr = new uint8_t[size];
00086     uint8_t test[size+1];
00087     test[0]=size;
00088     for (uint8_t i=0;i<size;i++)
00089     {
00090            
00091             message = readData();
00092              test[i+1]=(uint8_t) message;
00093              DataArr[i] = (uint8_t) message;
00094             
00095    //         SPUart.printf("\r\n bool Data is %d value in table %d value in ctc check %d" ,message,crc8_table[message],crccheck  );
00096             
00097     }
00098     printf("arr Data");
00099     for (int i=0;i<size;i++)
00100         printf("%02X ",DataArr[i]);
00101     
00102     crccheck=DataArr[size-1];
00103 
00104     //printf( "\r\n val crc in arr is %02X recall fn val  ",crccheck );
00105     if( crccheck == (uint8_t) crc8Compute(test,size) )
00106         {
00107                 //SPUart.printf("hi");
00108                SPUart.printf("\r\nComplete");
00109                 
00110      //         SPUart.printf("\r\nin crc fask condition %02X add to arrData",DataArr[i]);
00111                // sum+=DataArr[i];
00112         }
00113     else
00114         {
00115             SPUart.printf("\r\nfail");
00116                 return 1;    
00117                 
00118         }   
00119     
00120     return 0;
00121 }
00122 
00123 //***********************************************************************************************************************************
00124     //Getter method for request information abour uart
00125 //***********************************************************************************************************************************
00126 
00127 uint32_t SPCommunication::getVoltage()
00128 {
00129     uint8_t com[2]={0x02,0x56};
00130     uint8_t command[4] = {0x7E,0x02,0x56,(uint8_t) crc8Compute(com,2)};
00131     RequestData(command);
00132      uint32_t Recv ;
00133     //crc8Compute(com,2);
00134     //memcpy(&Recv,DataArr+1,32);
00135     
00136     
00137     return 0;
00138     //printData();
00139 
00140 }
00141 uint32_t SPCommunication::getEnergy()
00142 {  
00143     uint8_t com[2]={ 0x02,'E'};
00144     uint8_t command[4] = {0x7E,0x02,'E',(uint8_t) crc8Compute(com,2)};
00145     
00146 }
00147 uint32_t SPCommunication:: getCurrent()
00148 {
00149     uint8_t com[2]={ 0x02,'I'};
00150     uint8_t command[4] = {0x7E,0x02,'I',(uint8_t) crc8Compute(com,2)};
00151     RequestData(command);
00152      uint32_t Recv ;
00153     //crc8Compute(com,2);
00154     memcpy(&Recv,DataArr+1,32);
00155     return Recv;
00156 }
00157 
00158 
00159 uint32_t  SPCommunication::getPower()
00160 {
00161     uint8_t com[2]={ 0x02,'P'};
00162     uint8_t command[4] = {0x7E,0x02,'P',(uint8_t) crc8Compute(com,2)} ;
00163     RequestData(command);
00164     
00165      uint32_t Recv ;
00166     //crc8Compute(com,2);
00167     memcpy(&Recv,DataArr+1,32);
00168     return Recv;
00169 }
00170 
00171 uint32_t  SPCommunication::getPowerFactor()
00172 {
00173     uint8_t com[2]={ 0x02,'C'};
00174     uint8_t command[4] = {0x7E,0x02,'C',(uint8_t) crc8Compute(com,2) };
00175     RequestData(command);
00176      uint32_t Recv ;
00177     //crc8Compute(com,2);
00178     memcpy(&Recv,DataArr+1,32);
00179     return Recv;
00180     
00181 }
00182 
00183 bool SPCommunication::getStateRelay()
00184 {
00185     uint8_t com[2]={ 0x02,'S'};
00186     uint8_t command[4] = {0x7E,0x02,'S',(uint8_t) crc8Compute(com,2) };
00187     RequestData(command);
00188     
00189     return DataArr[1];
00190 }
00191 
00192 bool SPCommunication::setStateRelay(uint8_t st)
00193 {
00194     uint8_t* command;
00195     if (st ==1){
00196     uint8_t com[3]={ 0x03,'S',0x01};
00197 
00198      uint8_t temp[] = {0x7E,0x03,'S',0x01,(uint8_t) crc8Compute(com,2) };
00199      command=temp;
00200     }
00201     else{
00202     uint8_t com[3]={ 0x03,'S',0x00};
00203      uint8_t temp[] = {0x7E,0x03,'S',0x00,(uint8_t) crc8Compute(com,2) };
00204      command=temp;
00205     }
00206     RequestData(command);
00207     if(DataArr[0] == command[2] && DataArr[1] == command[3] )
00208         return true;
00209     
00210     return false;
00211         
00212 }
00213 uint8_t SPCommunication::readData()
00214 {
00215     
00216     uint8_t temp=RxBuffer[r];
00217 //    if (temp == 0)
00218 //        return 0;
00219     r++;
00220     if(r>=128)
00221         r=0;
00222     return temp;
00223     
00224 }