Bluetooth Low Energy for Smart Plug
Dependencies: BLE_API mbed nRF51822
SPCommunication.cpp@3:aaa92c61931a, 2015-07-13 (annotated)
- Committer:
- Slepnir
- Date:
- Mon Jul 13 13:14:34 2015 +0000
- Revision:
- 3:aaa92c61931a
SPCommunication class Added
Who changed what in which revision?
User | Revision | Line number | New 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 | } |