Bluetooth Low Energy for Smart Plug
Dependencies: BLE_API mbed nRF51822
Fork of SmartPlugBLE by
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 }
Generated on Fri Jul 22 2022 14:22:22 by 1.7.2