Bluetooth Low Energy for Smart Plug
Dependencies: BLE_API mbed nRF51822
Fork of SmartPlugBLE by
SPCommunication.cpp
- Committer:
- Slepnir
- Date:
- 2015-07-14
- Revision:
- 4:721ae30c92f8
- Parent:
- 3:aaa92c61931a
File content as of revision 4:721ae30c92f8:
#include "SPCommunication.h" SPCommunication::SPCommunication():SPUart(p9,p11) { SPUart.baud(115200); SPUart.attach(this,&SPCommunication::Rxint,Serial::RxIrq); size=0; r = 0; w = 0; for (int i=0;i<128;i++) RxBuffer[i]=0; } SPCommunication::SPCommunication(PinName tx,PinName rx,uint32_t bRate): SPUart(tx,rx){ SPUart.baud(bRate); SPUart.attach(this,&SPCommunication::Rxint,Serial::RxIrq); size=0; r = 0; w = 0; for (int i=0;i<128;i++) RxBuffer[i]=0; } void SPCommunication::Rxint() { SPUart.printf("\r\n Por %02X",SPUart.getc()); //while (SPUart.readable()){ //uint8_t temp = SPUart.getc(); //buff.addData(temp); //RxBuffer[w] = temp; if (++w >= 128) w = 0; //} } //Get crc remainder from table uint8_t SPCommunication::getCRC(uint8_t val) { return crc8_table[val]; } // print all data store in ArrData in class void SPCommunication::printData(){ //SPUart.printf("szie is %02X ",size); for(int i=0;i<size;i++) SPUart.printf("%02X ",DataArr[i]); } uint8_t* SPCommunication::RequestData(uint8_t* data) { int i=0; do // Send request Data { SPUart.printf("%c",data[i]); i++; } while(data[i]!='\0'); wait(2); SPUart.printf("\r\n data store in buffer %d",w); uint8_t temp = readData(); SPUart.printf("\r\n Req data %02x",temp); if((uint8_t) temp == 0x7E){ uint8_t err = handleData(); if(err) handleData(); } SPUart.printf("return"); return 0; } uint8_t SPCommunication::handleData(){ delete[] DataArr; uint8_t message; uint8_t crccheck; size=readData(); //size/=2; // SPUart.printf("\r\n Size is %02X",size); DataArr = new uint8_t[size]; uint8_t test[size+1]; test[0]=size; for (uint8_t i=0;i<size;i++) { message = readData(); test[i+1]=(uint8_t) message; DataArr[i] = (uint8_t) message; // SPUart.printf("\r\n bool Data is %d value in table %d value in ctc check %d" ,message,crc8_table[message],crccheck ); } printf("arr Data"); for (int i=0;i<size;i++) printf("%02X ",DataArr[i]); crccheck=DataArr[size-1]; //printf( "\r\n val crc in arr is %02X recall fn val ",crccheck ); if( crccheck == (uint8_t) crc8Compute(test,size) ) { //SPUart.printf("hi"); SPUart.printf("\r\nComplete"); // SPUart.printf("\r\nin crc fask condition %02X add to arrData",DataArr[i]); // sum+=DataArr[i]; } else { SPUart.printf("\r\nfail"); return 1; } return 0; } //*********************************************************************************************************************************** //Getter method for request information abour uart //*********************************************************************************************************************************** uint32_t SPCommunication::getVoltage() { uint8_t com[2]={0x02,0x56}; uint8_t command[4] = {0x7E,0x02,0x56,(uint8_t) crc8Compute(com,2)}; RequestData(command); uint32_t Recv ; //crc8Compute(com,2); //memcpy(&Recv,DataArr+1,32); return 0; //printData(); } uint32_t SPCommunication::getEnergy() { uint8_t com[2]={ 0x02,'E'}; uint8_t command[4] = {0x7E,0x02,'E',(uint8_t) crc8Compute(com,2)}; } uint32_t SPCommunication:: getCurrent() { uint8_t com[2]={ 0x02,'I'}; uint8_t command[4] = {0x7E,0x02,'I',(uint8_t) crc8Compute(com,2)}; RequestData(command); uint32_t Recv ; //crc8Compute(com,2); memcpy(&Recv,DataArr+1,32); return Recv; } uint32_t SPCommunication::getPower() { uint8_t com[2]={ 0x02,'P'}; uint8_t command[4] = {0x7E,0x02,'P',(uint8_t) crc8Compute(com,2)} ; RequestData(command); uint32_t Recv ; //crc8Compute(com,2); memcpy(&Recv,DataArr+1,32); return Recv; } uint32_t SPCommunication::getPowerFactor() { uint8_t com[2]={ 0x02,'C'}; uint8_t command[4] = {0x7E,0x02,'C',(uint8_t) crc8Compute(com,2) }; RequestData(command); uint32_t Recv ; //crc8Compute(com,2); memcpy(&Recv,DataArr+1,32); return Recv; } bool SPCommunication::getStateRelay() { uint8_t com[2]={ 0x02,'S'}; uint8_t command[4] = {0x7E,0x02,'S',(uint8_t) crc8Compute(com,2) }; RequestData(command); return DataArr[1]; } bool SPCommunication::setStateRelay(uint8_t st) { uint8_t* command; if (st ==1){ uint8_t com[3]={ 0x03,'S',0x01}; uint8_t temp[] = {0x7E,0x03,'S',0x01,(uint8_t) crc8Compute(com,2) }; command=temp; } else{ uint8_t com[3]={ 0x03,'S',0x00}; uint8_t temp[] = {0x7E,0x03,'S',0x00,(uint8_t) crc8Compute(com,2) }; command=temp; } RequestData(command); if(DataArr[0] == command[2] && DataArr[1] == command[3] ) return true; return false; } uint8_t SPCommunication::readData() { uint8_t temp=RxBuffer[r]; // if (temp == 0) // return 0; r++; if(r>=128) r=0; return temp; }