Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Fork of SmartPlugBLE by Pavit Noinongyao

Committer:
Slepnir
Date:
Tue Jul 14 10:10:19 2015 +0000
Revision:
4:721ae30c92f8
Parent:
3:aaa92c61931a
For debugging

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