Projectlab Elektronica-ICT KULeuven
Dependencies: EthernetInterface TMP102 TextLCD mbed-rtos mbed
Frame.cpp@2:1243006bb879, 2014-03-16 (annotated)
- Committer:
- seppeduwe
- Date:
- Sun Mar 16 16:52:27 2014 +0000
- Revision:
- 2:1243006bb879
- Parent:
- 1:635e76c52151
- Child:
- 3:344115c04cd0
Einde opendeurdag
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
seppeduwe | 0:ae3af7d18c4a | 1 | #include "mbed.h" |
seppeduwe | 0:ae3af7d18c4a | 2 | #include "Frame.h" |
seppeduwe | 0:ae3af7d18c4a | 3 | #include "lib_crc.h" |
seppeduwe | 0:ae3af7d18c4a | 4 | //SOF LEN IDD TMP PWM ID0 ID1 … IDn CRC EOF |
seppeduwe | 0:ae3af7d18c4a | 5 | //SOF (16bit): start of frame (0xAA 0xBB) |
seppeduwe | 0:ae3af7d18c4a | 6 | //LEN (8bit): lengte van frame in bytes (volledige frame!) |
seppeduwe | 0:ae3af7d18c4a | 7 | //IDD (8bit): ID destinationmbed(1-15) |
seppeduwe | 0:ae3af7d18c4a | 8 | //TMP (16bit): 0b0000XXXX 0bXXXXXXXX Temperature(0 –4095) (-25°tot 85°) |
seppeduwe | 0:ae3af7d18c4a | 9 | //PWM (8bit): PWM dutycycle(0 –255) (0% –100%) |
seppeduwe | 0:ae3af7d18c4a | 10 | //TUN (8bit): Select tune & delay (1 –15) zie tabel 1 |
seppeduwe | 0:ae3af7d18c4a | 11 | //ID0–IDn(n x 8bit): lijst van reeds bezochte mbeds |
seppeduwe | 0:ae3af7d18c4a | 12 | //CRC (16bit): CRC16 checksum(x16+ x15+ x2+ 1) checksumop “LEN IDD TMP PWM ID0…IDn” |
seppeduwe | 0:ae3af7d18c4a | 13 | //EOF (16bit): end of frame (0xCC 0xDD) |
seppeduwe | 1:635e76c52151 | 14 | Frame::Frame() |
seppeduwe | 0:ae3af7d18c4a | 15 | { |
seppeduwe | 1:635e76c52151 | 16 | IdDestinationMbed=0; |
seppeduwe | 1:635e76c52151 | 17 | temperature=0; |
seppeduwe | 1:635e76c52151 | 18 | pWMDutycycle=0; |
seppeduwe | 1:635e76c52151 | 19 | tune=0; |
seppeduwe | 1:635e76c52151 | 20 | lengthIDs=0; |
seppeduwe | 1:635e76c52151 | 21 | IDs= new char[0]; |
seppeduwe | 1:635e76c52151 | 22 | } |
seppeduwe | 1:635e76c52151 | 23 | Frame::Frame( int IdDestinationMbed, |
seppeduwe | 1:635e76c52151 | 24 | int temperature, |
seppeduwe | 1:635e76c52151 | 25 | int pWMDutycycle, |
seppeduwe | 1:635e76c52151 | 26 | int tune, |
seppeduwe | 1:635e76c52151 | 27 | int lengthIDs, |
seppeduwe | 1:635e76c52151 | 28 | char* IDs) |
seppeduwe | 1:635e76c52151 | 29 | { |
seppeduwe | 1:635e76c52151 | 30 | this->IdDestinationMbed=IdDestinationMbed; |
seppeduwe | 1:635e76c52151 | 31 | this->temperature=temperature; |
seppeduwe | 1:635e76c52151 | 32 | this->pWMDutycycle=pWMDutycycle; |
seppeduwe | 1:635e76c52151 | 33 | this->tune=tune; |
seppeduwe | 1:635e76c52151 | 34 | this->lengthIDs=lengthIDs; |
seppeduwe | 1:635e76c52151 | 35 | this->IDs=IDs; |
seppeduwe | 1:635e76c52151 | 36 | } |
seppeduwe | 0:ae3af7d18c4a | 37 | |
seppeduwe | 1:635e76c52151 | 38 | int Frame::Decode(char* frame) |
seppeduwe | 1:635e76c52151 | 39 | { |
seppeduwe | 1:635e76c52151 | 40 | int length = (int)frame[2]; |
seppeduwe | 1:635e76c52151 | 41 | lengthIDs = length- 12; |
seppeduwe | 1:635e76c52151 | 42 | IDs = new char[lengthIDs]; |
seppeduwe | 0:ae3af7d18c4a | 43 | |
seppeduwe | 0:ae3af7d18c4a | 44 | if ( frame[0]==0xAA && frame[1]==0xBB && frame[length-2]==0xCC && frame[length-1]==0xDD) { |
seppeduwe | 0:ae3af7d18c4a | 45 | |
seppeduwe | 0:ae3af7d18c4a | 46 | IdDestinationMbed = (int) frame[3]; |
seppeduwe | 1:635e76c52151 | 47 | //temperature = (int) (0.026862*((frame[4]<<8) | frame[5])-25) ; |
seppeduwe | 1:635e76c52151 | 48 | temperature = (int) ((frame[4]<<8) | frame[5]) ; |
seppeduwe | 0:ae3af7d18c4a | 49 | pWMDutycycle = (int)frame[6]; |
seppeduwe | 0:ae3af7d18c4a | 50 | tune = (int) frame [7]; |
seppeduwe | 1:635e76c52151 | 51 | crc= (int) ((frame[length-4]<<8) | frame[length-3]); |
seppeduwe | 1:635e76c52151 | 52 | for (int i=0; i<lengthIDs; i++) { |
seppeduwe | 1:635e76c52151 | 53 | IDs[i]=frame[i+8]; |
seppeduwe | 1:635e76c52151 | 54 | } |
seppeduwe | 0:ae3af7d18c4a | 55 | |
seppeduwe | 0:ae3af7d18c4a | 56 | printf("Decode length: %d IdDestinationMbed: %d temperature: %d \n\r",length,IdDestinationMbed,temperature); |
seppeduwe | 0:ae3af7d18c4a | 57 | printf("pWMDutycycle: %d tune: %d \n\r",pWMDutycycle,tune); |
seppeduwe | 1:635e76c52151 | 58 | for(int i=0; i<lengthIDs; i++) { |
seppeduwe | 1:635e76c52151 | 59 | printf("IDs %d \n\r",IDs[i]); |
seppeduwe | 1:635e76c52151 | 60 | } |
seppeduwe | 0:ae3af7d18c4a | 61 | } |
seppeduwe | 1:635e76c52151 | 62 | return CheckCRC(frame); |
seppeduwe | 0:ae3af7d18c4a | 63 | } |
seppeduwe | 0:ae3af7d18c4a | 64 | |
seppeduwe | 1:635e76c52151 | 65 | int Frame::Encode(char* encode) |
seppeduwe | 0:ae3af7d18c4a | 66 | { |
seppeduwe | 1:635e76c52151 | 67 | memset(encode, 0, 255); |
seppeduwe | 0:ae3af7d18c4a | 68 | int length = 12+lengthIDs; |
seppeduwe | 0:ae3af7d18c4a | 69 | |
seppeduwe | 0:ae3af7d18c4a | 70 | encode[0]=0xAA; |
seppeduwe | 0:ae3af7d18c4a | 71 | encode[1]=0xBB; |
seppeduwe | 0:ae3af7d18c4a | 72 | encode[2]= (char) length; |
seppeduwe | 0:ae3af7d18c4a | 73 | encode[3]= (char) IdDestinationMbed; |
seppeduwe | 1:635e76c52151 | 74 | encode[4]= (char) (((int)(37.227*temperature+930.68))>>8); |
seppeduwe | 1:635e76c52151 | 75 | encode[5]= (int) (37.227*temperature+930.68); |
seppeduwe | 2:1243006bb879 | 76 | encode[6]= (char) pWMDutycycle*2.55; |
seppeduwe | 0:ae3af7d18c4a | 77 | encode[7]= (char) tune; |
seppeduwe | 0:ae3af7d18c4a | 78 | |
seppeduwe | 0:ae3af7d18c4a | 79 | for (int i=0; i<lengthIDs; i++) { |
seppeduwe | 0:ae3af7d18c4a | 80 | encode[8+i]=IDs[i]; |
seppeduwe | 0:ae3af7d18c4a | 81 | } |
seppeduwe | 0:ae3af7d18c4a | 82 | |
seppeduwe | 0:ae3af7d18c4a | 83 | // Calculate CRC |
seppeduwe | 0:ae3af7d18c4a | 84 | int CRCint = MakeCRC(encode[2],encode[3],encode[4],encode[5],encode[6],IDs,lengthIDs); |
seppeduwe | 0:ae3af7d18c4a | 85 | |
seppeduwe | 0:ae3af7d18c4a | 86 | encode[length-4]= ( char)(CRCint>>8); |
seppeduwe | 0:ae3af7d18c4a | 87 | encode[length-3]=( char)(CRCint); |
seppeduwe | 0:ae3af7d18c4a | 88 | |
seppeduwe | 0:ae3af7d18c4a | 89 | encode[length-2]=0xCC; |
seppeduwe | 0:ae3af7d18c4a | 90 | encode[length-1]=0xDD; |
seppeduwe | 0:ae3af7d18c4a | 91 | return length; |
seppeduwe | 0:ae3af7d18c4a | 92 | } |
seppeduwe | 0:ae3af7d18c4a | 93 | |
seppeduwe | 1:635e76c52151 | 94 | int Frame::MakeCRC( |
seppeduwe | 0:ae3af7d18c4a | 95 | char LEN, //lenght of frame |
seppeduwe | 0:ae3af7d18c4a | 96 | char IDD, //Destination ID |
seppeduwe | 0:ae3af7d18c4a | 97 | char TMP0,//first tmp char |
seppeduwe | 0:ae3af7d18c4a | 98 | char TMP1,//second tmp char |
seppeduwe | 0:ae3af7d18c4a | 99 | char PWM, //pwm tune |
seppeduwe | 0:ae3af7d18c4a | 100 | char* data, //data frame |
seppeduwe | 0:ae3af7d18c4a | 101 | int lenghtData //lenght of the data |
seppeduwe | 0:ae3af7d18c4a | 102 | ) |
seppeduwe | 0:ae3af7d18c4a | 103 | { |
seppeduwe | 0:ae3af7d18c4a | 104 | //char* crcData = new char[5+lenghtData] ; |
seppeduwe | 0:ae3af7d18c4a | 105 | char crcData[5+lenghtData] ; |
seppeduwe | 0:ae3af7d18c4a | 106 | |
seppeduwe | 0:ae3af7d18c4a | 107 | crcData[0] = LEN; //lenght of frame |
seppeduwe | 0:ae3af7d18c4a | 108 | crcData[1] = IDD; //Destination ID |
seppeduwe | 0:ae3af7d18c4a | 109 | crcData[2] = TMP0;//first tmp char |
seppeduwe | 0:ae3af7d18c4a | 110 | crcData[3] = TMP1;//second tmp char |
seppeduwe | 0:ae3af7d18c4a | 111 | crcData[4] = PWM; //pwm tune |
seppeduwe | 0:ae3af7d18c4a | 112 | |
seppeduwe | 0:ae3af7d18c4a | 113 | // add the data to the crcData |
seppeduwe | 0:ae3af7d18c4a | 114 | for (int i=0; i<lenghtData; i++) { |
seppeduwe | 0:ae3af7d18c4a | 115 | crcData[i+5]= data[i]; |
seppeduwe | 0:ae3af7d18c4a | 116 | } |
seppeduwe | 0:ae3af7d18c4a | 117 | return calculate_crc16(crcData, lenghtData+5); |
seppeduwe | 1:635e76c52151 | 118 | } |
seppeduwe | 1:635e76c52151 | 119 | |
seppeduwe | 1:635e76c52151 | 120 | void Frame::testEncode(char* frame) |
seppeduwe | 1:635e76c52151 | 121 | { |
seppeduwe | 1:635e76c52151 | 122 | printf("testEncode\n\r"); |
seppeduwe | 1:635e76c52151 | 123 | char controle[]= {0xAA,0xBB,0x0F,0x0B,0x0F,0xA0,0x02,0x05,0x08,0x09,0x0A,0x4B,0x7C,0xCC,0xDD}; |
seppeduwe | 1:635e76c52151 | 124 | // SOF SOF LEN IDD TMP TMP PWM TUN ID0 ID1 ID2 CRC CRC EOF EOF |
seppeduwe | 1:635e76c52151 | 125 | for (int i=0; i<15; i++) { |
seppeduwe | 1:635e76c52151 | 126 | // loop all chars and check if there right |
seppeduwe | 1:635e76c52151 | 127 | if(controle[i]!=frame[i]) { |
seppeduwe | 1:635e76c52151 | 128 | printf("ERROR in frame %d : %X != %X\n\r",i,(unsigned char) controle[i],(unsigned char)frame[i] ); |
seppeduwe | 1:635e76c52151 | 129 | } |
seppeduwe | 1:635e76c52151 | 130 | } |
seppeduwe | 1:635e76c52151 | 131 | printf("End testEncode\n\r"); |
seppeduwe | 1:635e76c52151 | 132 | } |
seppeduwe | 1:635e76c52151 | 133 | int Frame::CheckCRC(char* frame) |
seppeduwe | 1:635e76c52151 | 134 | { |
seppeduwe | 1:635e76c52151 | 135 | if(crc == MakeCRC((char)(12+lengthIDs),(char)IdDestinationMbed,(char)(temperature>>8),(char)temperature,(char)pWMDutycycle,(char* )IDs,lengthIDs)) |
seppeduwe | 1:635e76c52151 | 136 | return 1; |
seppeduwe | 1:635e76c52151 | 137 | else return 0; |
seppeduwe | 1:635e76c52151 | 138 | } |
seppeduwe | 1:635e76c52151 | 139 | void Frame::AddID(int id) |
seppeduwe | 1:635e76c52151 | 140 | { |
seppeduwe | 1:635e76c52151 | 141 | lengthIDs++; |
seppeduwe | 1:635e76c52151 | 142 | char* IDs2 = new char[lengthIDs]; |
seppeduwe | 1:635e76c52151 | 143 | for(int i=0; i<lengthIDs; i++) { |
seppeduwe | 1:635e76c52151 | 144 | IDs2[i] = IDs[i]; |
seppeduwe | 1:635e76c52151 | 145 | } |
seppeduwe | 1:635e76c52151 | 146 | IDs2[lengthIDs-1]=id; |
seppeduwe | 1:635e76c52151 | 147 | |
seppeduwe | 1:635e76c52151 | 148 | char* tempIDs=IDs; |
seppeduwe | 1:635e76c52151 | 149 | IDs=IDs2; |
seppeduwe | 1:635e76c52151 | 150 | delete tempIDs; |
seppeduwe | 1:635e76c52151 | 151 | } |
seppeduwe | 1:635e76c52151 | 152 | |
seppeduwe | 1:635e76c52151 | 153 | int Frame::CheckMyID(int id) |
seppeduwe | 1:635e76c52151 | 154 | { |
seppeduwe | 1:635e76c52151 | 155 | for(int i=0; i<lengthIDs; i++) { |
seppeduwe | 1:635e76c52151 | 156 | if(id == IDs[i]) |
seppeduwe | 1:635e76c52151 | 157 | return 1; |
seppeduwe | 1:635e76c52151 | 158 | } |
seppeduwe | 1:635e76c52151 | 159 | return 0; |
seppeduwe | 1:635e76c52151 | 160 | } |
seppeduwe | 1:635e76c52151 | 161 | |
seppeduwe | 1:635e76c52151 | 162 | void Frame::setIdDestinationMbed(int IdDestinationMbed) |
seppeduwe | 1:635e76c52151 | 163 | { |
seppeduwe | 1:635e76c52151 | 164 | this->IdDestinationMbed=IdDestinationMbed; |
seppeduwe | 1:635e76c52151 | 165 | } |
seppeduwe | 1:635e76c52151 | 166 | int Frame::getIdDestinationMbed(void) |
seppeduwe | 1:635e76c52151 | 167 | { |
seppeduwe | 1:635e76c52151 | 168 | return IdDestinationMbed; |
seppeduwe | 1:635e76c52151 | 169 | } |
seppeduwe | 1:635e76c52151 | 170 | void Frame::setTemperature(int temperature) |
seppeduwe | 1:635e76c52151 | 171 | { |
seppeduwe | 1:635e76c52151 | 172 | this->temperature=temperature; |
seppeduwe | 1:635e76c52151 | 173 | } |
seppeduwe | 1:635e76c52151 | 174 | int Frame::getTemperature(void) |
seppeduwe | 1:635e76c52151 | 175 | { |
seppeduwe | 1:635e76c52151 | 176 | return temperature; |
seppeduwe | 1:635e76c52151 | 177 | } |
seppeduwe | 1:635e76c52151 | 178 | void Frame::setPWMDutycycle(int pWMDutycycle) |
seppeduwe | 1:635e76c52151 | 179 | { |
seppeduwe | 1:635e76c52151 | 180 | this->pWMDutycycle=pWMDutycycle; |
seppeduwe | 1:635e76c52151 | 181 | } |
seppeduwe | 1:635e76c52151 | 182 | void Frame::setTune(int tune) |
seppeduwe | 1:635e76c52151 | 183 | { |
seppeduwe | 1:635e76c52151 | 184 | this->tune=tune; |
seppeduwe | 1:635e76c52151 | 185 | } |
seppeduwe | 1:635e76c52151 | 186 | int Frame::getTune(void) |
seppeduwe | 1:635e76c52151 | 187 | { |
seppeduwe | 1:635e76c52151 | 188 | return tune; |
seppeduwe | 1:635e76c52151 | 189 | } |
seppeduwe | 1:635e76c52151 | 190 | void Frame::setLengthIDs(int lengthIDs) |
seppeduwe | 1:635e76c52151 | 191 | { |
seppeduwe | 1:635e76c52151 | 192 | this->lengthIDs=lengthIDs; |
seppeduwe | 1:635e76c52151 | 193 | } |
seppeduwe | 1:635e76c52151 | 194 | void Frame::setIDs(char* IDs) |
seppeduwe | 1:635e76c52151 | 195 | { |
seppeduwe | 1:635e76c52151 | 196 | this->IDs=IDs; |
seppeduwe | 0:ae3af7d18c4a | 197 | } |