Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Fork of SmartPlugBLE by Pavit Noinongyao

Committer:
Slepnir
Date:
Mon Jul 13 13:14:34 2015 +0000
Revision:
3:aaa92c61931a
Child:
4:721ae30c92f8
SPCommunication class Added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Slepnir 3:aaa92c61931a 1 #include "SPCommunication.h"
Slepnir 3:aaa92c61931a 2
Slepnir 3:aaa92c61931a 3 SPCommunication::SPCommunication():SPUart(p9,p11)
Slepnir 3:aaa92c61931a 4 {
Slepnir 3:aaa92c61931a 5 SPUart.baud(115200);
Slepnir 3:aaa92c61931a 6 SPUart.attach(this,&SPCommunication::Rxint,Serial::RxIrq);
Slepnir 3:aaa92c61931a 7 size=0;
Slepnir 3:aaa92c61931a 8 r = 0;
Slepnir 3:aaa92c61931a 9 w = 0;
Slepnir 3:aaa92c61931a 10 for (int i=0;i<128;i++) RxBuffer[i]=0;
Slepnir 3:aaa92c61931a 11 }
Slepnir 3:aaa92c61931a 12 SPCommunication::SPCommunication(PinName tx,PinName rx,uint32_t bRate): SPUart(tx,rx){
Slepnir 3:aaa92c61931a 13
Slepnir 3:aaa92c61931a 14 SPUart.baud(bRate);
Slepnir 3:aaa92c61931a 15 SPUart.attach(this,&SPCommunication::Rxint,Serial::RxIrq);
Slepnir 3:aaa92c61931a 16 size=0;
Slepnir 3:aaa92c61931a 17 r = 0;
Slepnir 3:aaa92c61931a 18 w = 0;
Slepnir 3:aaa92c61931a 19 for (int i=0;i<128;i++) RxBuffer[i]=0;
Slepnir 3:aaa92c61931a 20
Slepnir 3:aaa92c61931a 21 }
Slepnir 3:aaa92c61931a 22 void SPCommunication::Rxint()
Slepnir 3:aaa92c61931a 23 {
Slepnir 3:aaa92c61931a 24 // SPUart.putc(SPUart.getc());
Slepnir 3:aaa92c61931a 25
Slepnir 3:aaa92c61931a 26 while (SPUart.readable()){
Slepnir 3:aaa92c61931a 27 uint8_t temp = SPUart.getc();
Slepnir 3:aaa92c61931a 28 //buff.addData(temp);
Slepnir 3:aaa92c61931a 29 RxBuffer[w] = temp;
Slepnir 3:aaa92c61931a 30 if (++w >= 128)
Slepnir 3:aaa92c61931a 31 w = 0;
Slepnir 3:aaa92c61931a 32 }
Slepnir 3:aaa92c61931a 33 }
Slepnir 3:aaa92c61931a 34 //Get crc remainder from table
Slepnir 3:aaa92c61931a 35 uint8_t SPCommunication::getCRC(uint8_t val)
Slepnir 3:aaa92c61931a 36 {
Slepnir 3:aaa92c61931a 37 return crc8_table[val];
Slepnir 3:aaa92c61931a 38 }
Slepnir 3:aaa92c61931a 39
Slepnir 3:aaa92c61931a 40 // print all data store in ArrData in class
Slepnir 3:aaa92c61931a 41 void SPCommunication::printData(){
Slepnir 3:aaa92c61931a 42 //SPUart.printf("szie is %02X ",size);
Slepnir 3:aaa92c61931a 43 for(int i=0;i<size;i++)
Slepnir 3:aaa92c61931a 44 SPUart.printf("%02X ",DataArr[i]);
Slepnir 3:aaa92c61931a 45 }
Slepnir 3:aaa92c61931a 46
Slepnir 3:aaa92c61931a 47
Slepnir 3:aaa92c61931a 48 uint8_t* SPCommunication::RequestData(uint8_t* data)
Slepnir 3:aaa92c61931a 49 {
Slepnir 3:aaa92c61931a 50
Slepnir 3:aaa92c61931a 51 int i=0;
Slepnir 3:aaa92c61931a 52 do // Send request Data
Slepnir 3:aaa92c61931a 53 {
Slepnir 3:aaa92c61931a 54 SPUart.printf("%c",data[i]);
Slepnir 3:aaa92c61931a 55 i++;
Slepnir 3:aaa92c61931a 56 }
Slepnir 3:aaa92c61931a 57 while(data[i]!='\0');
Slepnir 3:aaa92c61931a 58 wait(1);
Slepnir 3:aaa92c61931a 59 uint8_t temp = readData();
Slepnir 3:aaa92c61931a 60 //SPUart.printf("\r\n in int %02x",temp);
Slepnir 3:aaa92c61931a 61
Slepnir 3:aaa92c61931a 62 if((uint8_t) temp == 0x7E){
Slepnir 3:aaa92c61931a 63 uint8_t err = handleData();
Slepnir 3:aaa92c61931a 64 if(err)
Slepnir 3:aaa92c61931a 65 handleData();
Slepnir 3:aaa92c61931a 66 }
Slepnir 3:aaa92c61931a 67
Slepnir 3:aaa92c61931a 68 return 0;
Slepnir 3:aaa92c61931a 69
Slepnir 3:aaa92c61931a 70 }
Slepnir 3:aaa92c61931a 71
Slepnir 3:aaa92c61931a 72
Slepnir 3:aaa92c61931a 73 uint8_t SPCommunication::handleData(){
Slepnir 3:aaa92c61931a 74 delete[] DataArr;
Slepnir 3:aaa92c61931a 75
Slepnir 3:aaa92c61931a 76 uint8_t message;
Slepnir 3:aaa92c61931a 77 uint8_t crccheck;
Slepnir 3:aaa92c61931a 78
Slepnir 3:aaa92c61931a 79 size=readData();
Slepnir 3:aaa92c61931a 80 //size/=2;
Slepnir 3:aaa92c61931a 81 // SPUart.printf("\r\n Size is %02X",size);
Slepnir 3:aaa92c61931a 82 DataArr = new uint8_t[size];
Slepnir 3:aaa92c61931a 83 uint8_t test[size+1];
Slepnir 3:aaa92c61931a 84 test[0]=size;
Slepnir 3:aaa92c61931a 85 for (uint8_t i=0;i<size;i++)
Slepnir 3:aaa92c61931a 86 {
Slepnir 3:aaa92c61931a 87
Slepnir 3:aaa92c61931a 88 message = readData();
Slepnir 3:aaa92c61931a 89 test[i+1]=(uint8_t) message;
Slepnir 3:aaa92c61931a 90 DataArr[i] = (uint8_t) message;
Slepnir 3:aaa92c61931a 91
Slepnir 3:aaa92c61931a 92 // SPUart.printf("\r\n bool Data is %d value in table %d value in ctc check %d" ,message,crc8_table[message],crccheck );
Slepnir 3:aaa92c61931a 93
Slepnir 3:aaa92c61931a 94 }
Slepnir 3:aaa92c61931a 95 // printf("arr Data");
Slepnir 3:aaa92c61931a 96 // for (int i=0;i<size;i++)
Slepnir 3:aaa92c61931a 97 // printf("%02X ",DataArr[i]);
Slepnir 3:aaa92c61931a 98
Slepnir 3:aaa92c61931a 99 crccheck=DataArr[size-1];
Slepnir 3:aaa92c61931a 100
Slepnir 3:aaa92c61931a 101 //printf( "\r\n val crc in arr is %02X recall fn val ",crccheck );
Slepnir 3:aaa92c61931a 102 if( crccheck == (uint8_t) crc8Compute(test,size) )
Slepnir 3:aaa92c61931a 103 {
Slepnir 3:aaa92c61931a 104 //SPUart.printf("hi");
Slepnir 3:aaa92c61931a 105 SPUart.printf("\r\nComplete");
Slepnir 3:aaa92c61931a 106
Slepnir 3:aaa92c61931a 107 // SPUart.printf("\r\nin crc fask condition %02X add to arrData",DataArr[i]);
Slepnir 3:aaa92c61931a 108 // sum+=DataArr[i];
Slepnir 3:aaa92c61931a 109 }
Slepnir 3:aaa92c61931a 110 else
Slepnir 3:aaa92c61931a 111 {
Slepnir 3:aaa92c61931a 112 SPUart.printf("\r\nfail");
Slepnir 3:aaa92c61931a 113 return 1;
Slepnir 3:aaa92c61931a 114
Slepnir 3:aaa92c61931a 115 }
Slepnir 3:aaa92c61931a 116
Slepnir 3:aaa92c61931a 117 return 0;
Slepnir 3:aaa92c61931a 118 }
Slepnir 3:aaa92c61931a 119
Slepnir 3:aaa92c61931a 120 //***********************************************************************************************************************************
Slepnir 3:aaa92c61931a 121 //Getter method for request information abour uart
Slepnir 3:aaa92c61931a 122 //***********************************************************************************************************************************
Slepnir 3:aaa92c61931a 123
Slepnir 3:aaa92c61931a 124 uint32_t SPCommunication::getVoltage()
Slepnir 3:aaa92c61931a 125 {
Slepnir 3:aaa92c61931a 126 uint8_t com[2]={0x02,0x56};
Slepnir 3:aaa92c61931a 127 uint8_t command[4] = {0x7E,0x02,0x56,(uint8_t) crc8Compute(com,2)};
Slepnir 3:aaa92c61931a 128 RequestData(command);
Slepnir 3:aaa92c61931a 129 uint32_t Recv ;
Slepnir 3:aaa92c61931a 130 //crc8Compute(com,2);
Slepnir 3:aaa92c61931a 131 memcpy(&Recv,DataArr,32);
Slepnir 3:aaa92c61931a 132
Slepnir 3:aaa92c61931a 133
Slepnir 3:aaa92c61931a 134 return Recv;
Slepnir 3:aaa92c61931a 135 //printData();
Slepnir 3:aaa92c61931a 136
Slepnir 3:aaa92c61931a 137 }
Slepnir 3:aaa92c61931a 138 uint32_t SPCommunication::getEnergy()
Slepnir 3:aaa92c61931a 139 {
Slepnir 3:aaa92c61931a 140 uint8_t com[2]={ 0x02,'E'};
Slepnir 3:aaa92c61931a 141 uint8_t command[4] = {0x7E,0x02,'E',(uint8_t) crc8Compute(com,2)};
Slepnir 3:aaa92c61931a 142
Slepnir 3:aaa92c61931a 143 }
Slepnir 3:aaa92c61931a 144 uint32_t SPCommunication:: getCurrent()
Slepnir 3:aaa92c61931a 145 {
Slepnir 3:aaa92c61931a 146 uint8_t com[2]={ 0x02,'I'};
Slepnir 3:aaa92c61931a 147 uint8_t command[4] = {0x7E,0x02,'I',(uint8_t) crc8Compute(com,2)};
Slepnir 3:aaa92c61931a 148 RequestData(command);
Slepnir 3:aaa92c61931a 149 uint32_t Recv ;
Slepnir 3:aaa92c61931a 150 //crc8Compute(com,2);
Slepnir 3:aaa92c61931a 151 memcpy(&Recv,DataArr+1,32);
Slepnir 3:aaa92c61931a 152 return Recv;
Slepnir 3:aaa92c61931a 153 }
Slepnir 3:aaa92c61931a 154
Slepnir 3:aaa92c61931a 155
Slepnir 3:aaa92c61931a 156 uint32_t SPCommunication::getPower()
Slepnir 3:aaa92c61931a 157 {
Slepnir 3:aaa92c61931a 158 uint8_t com[2]={ 0x02,'P'};
Slepnir 3:aaa92c61931a 159 uint8_t command[4] = {0x7E,0x02,'P',(uint8_t) crc8Compute(com,2)} ;
Slepnir 3:aaa92c61931a 160 RequestData(command);
Slepnir 3:aaa92c61931a 161
Slepnir 3:aaa92c61931a 162 uint32_t Recv ;
Slepnir 3:aaa92c61931a 163 //crc8Compute(com,2);
Slepnir 3:aaa92c61931a 164 memcpy(&Recv,DataArr+1,32);
Slepnir 3:aaa92c61931a 165 return Recv;
Slepnir 3:aaa92c61931a 166 }
Slepnir 3:aaa92c61931a 167
Slepnir 3:aaa92c61931a 168 uint32_t SPCommunication::getPowerFactor()
Slepnir 3:aaa92c61931a 169 {
Slepnir 3:aaa92c61931a 170 uint8_t com[2]={ 0x02,'C'};
Slepnir 3:aaa92c61931a 171 uint8_t command[4] = {0x7E,0x02,'C',(uint8_t) crc8Compute(com,2) };
Slepnir 3:aaa92c61931a 172 RequestData(command);
Slepnir 3:aaa92c61931a 173 uint32_t Recv ;
Slepnir 3:aaa92c61931a 174 //crc8Compute(com,2);
Slepnir 3:aaa92c61931a 175 memcpy(&Recv,DataArr+1,32);
Slepnir 3:aaa92c61931a 176 return Recv;
Slepnir 3:aaa92c61931a 177
Slepnir 3:aaa92c61931a 178 }
Slepnir 3:aaa92c61931a 179
Slepnir 3:aaa92c61931a 180 bool SPCommunication::getStateRelay()
Slepnir 3:aaa92c61931a 181 {
Slepnir 3:aaa92c61931a 182 uint8_t com[2]={ 0x02,'S'};
Slepnir 3:aaa92c61931a 183 uint8_t command[4] = {0x7E,0x02,'S',(uint8_t) crc8Compute(com,2) };
Slepnir 3:aaa92c61931a 184 RequestData(command);
Slepnir 3:aaa92c61931a 185
Slepnir 3:aaa92c61931a 186 return DataArr[1];
Slepnir 3:aaa92c61931a 187 }
Slepnir 3:aaa92c61931a 188
Slepnir 3:aaa92c61931a 189 bool SPCommunication::setStateRelay(uint8_t st)
Slepnir 3:aaa92c61931a 190 {
Slepnir 3:aaa92c61931a 191 uint8_t* command;
Slepnir 3:aaa92c61931a 192 if (st ==1){
Slepnir 3:aaa92c61931a 193 uint8_t com[3]={ 0x03,'S',0x01};
Slepnir 3:aaa92c61931a 194
Slepnir 3:aaa92c61931a 195 uint8_t temp[] = {0x7E,0x03,'S',0x01,(uint8_t) crc8Compute(com,2) };
Slepnir 3:aaa92c61931a 196 command=temp;
Slepnir 3:aaa92c61931a 197 }
Slepnir 3:aaa92c61931a 198 else{
Slepnir 3:aaa92c61931a 199 uint8_t com[3]={ 0x03,'S',0x00};
Slepnir 3:aaa92c61931a 200 uint8_t temp[] = {0x7E,0x03,'S',0x00,(uint8_t) crc8Compute(com,2) };
Slepnir 3:aaa92c61931a 201 command=temp;
Slepnir 3:aaa92c61931a 202 }
Slepnir 3:aaa92c61931a 203 RequestData(command);
Slepnir 3:aaa92c61931a 204 if(DataArr[0] == command[2] && DataArr[1] == command[3] )
Slepnir 3:aaa92c61931a 205 return true;
Slepnir 3:aaa92c61931a 206
Slepnir 3:aaa92c61931a 207 return false;
Slepnir 3:aaa92c61931a 208
Slepnir 3:aaa92c61931a 209 }
Slepnir 3:aaa92c61931a 210 uint8_t SPCommunication::readData()
Slepnir 3:aaa92c61931a 211 {
Slepnir 3:aaa92c61931a 212
Slepnir 3:aaa92c61931a 213 uint8_t temp=RxBuffer[r];
Slepnir 3:aaa92c61931a 214 // if (temp == 0)
Slepnir 3:aaa92c61931a 215 // return 0;
Slepnir 3:aaa92c61931a 216 r++;
Slepnir 3:aaa92c61931a 217 if(r>=128)
Slepnir 3:aaa92c61931a 218 r=0;
Slepnir 3:aaa92c61931a 219 return temp;
Slepnir 3:aaa92c61931a 220
Slepnir 3:aaa92c61931a 221 }