Projectlab Elektronica-ICT KULeuven

Dependencies:   EthernetInterface TMP102 TextLCD mbed-rtos mbed

werking.pdf

Committer:
seppeduwe
Date:
Sun Mar 16 18:56:08 2014 +0000
Revision:
3:344115c04cd0
Parent:
2:1243006bb879
Child:
4:466d859bfb13
Range Temp en PWM

Who changed what in which revision?

UserRevisionLine numberNew 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) ((frame[4]<<8) | frame[5]) ;
seppeduwe 0:ae3af7d18c4a 48 pWMDutycycle = (int)frame[6];
seppeduwe 0:ae3af7d18c4a 49 tune = (int) frame [7];
seppeduwe 1:635e76c52151 50 crc= (int) ((frame[length-4]<<8) | frame[length-3]);
seppeduwe 1:635e76c52151 51 for (int i=0; i<lengthIDs; i++) {
seppeduwe 1:635e76c52151 52 IDs[i]=frame[i+8];
seppeduwe 1:635e76c52151 53 }
seppeduwe 0:ae3af7d18c4a 54
seppeduwe 0:ae3af7d18c4a 55 printf("Decode length: %d IdDestinationMbed: %d temperature: %d \n\r",length,IdDestinationMbed,temperature);
seppeduwe 0:ae3af7d18c4a 56 printf("pWMDutycycle: %d tune: %d \n\r",pWMDutycycle,tune);
seppeduwe 1:635e76c52151 57 for(int i=0; i<lengthIDs; i++) {
seppeduwe 1:635e76c52151 58 printf("IDs %d \n\r",IDs[i]);
seppeduwe 1:635e76c52151 59 }
seppeduwe 0:ae3af7d18c4a 60 }
seppeduwe 1:635e76c52151 61 return CheckCRC(frame);
seppeduwe 0:ae3af7d18c4a 62 }
seppeduwe 0:ae3af7d18c4a 63
seppeduwe 1:635e76c52151 64 int Frame::Encode(char* encode)
seppeduwe 0:ae3af7d18c4a 65 {
seppeduwe 1:635e76c52151 66 memset(encode, 0, 255);
seppeduwe 0:ae3af7d18c4a 67 int length = 12+lengthIDs;
seppeduwe 0:ae3af7d18c4a 68
seppeduwe 0:ae3af7d18c4a 69 encode[0]=0xAA;
seppeduwe 0:ae3af7d18c4a 70 encode[1]=0xBB;
seppeduwe 0:ae3af7d18c4a 71 encode[2]= (char) length;
seppeduwe 0:ae3af7d18c4a 72 encode[3]= (char) IdDestinationMbed;
seppeduwe 3:344115c04cd0 73 encode[4]= (char) (temperature>>8);
seppeduwe 3:344115c04cd0 74 encode[5]= (char) temperature;
seppeduwe 3:344115c04cd0 75 encode[6]= (char) pWMDutycycle;
seppeduwe 0:ae3af7d18c4a 76 encode[7]= (char) tune;
seppeduwe 0:ae3af7d18c4a 77
seppeduwe 0:ae3af7d18c4a 78 for (int i=0; i<lengthIDs; i++) {
seppeduwe 0:ae3af7d18c4a 79 encode[8+i]=IDs[i];
seppeduwe 0:ae3af7d18c4a 80 }
seppeduwe 0:ae3af7d18c4a 81
seppeduwe 0:ae3af7d18c4a 82 // Calculate CRC
seppeduwe 0:ae3af7d18c4a 83 int CRCint = MakeCRC(encode[2],encode[3],encode[4],encode[5],encode[6],IDs,lengthIDs);
seppeduwe 0:ae3af7d18c4a 84
seppeduwe 0:ae3af7d18c4a 85 encode[length-4]= ( char)(CRCint>>8);
seppeduwe 0:ae3af7d18c4a 86 encode[length-3]=( char)(CRCint);
seppeduwe 0:ae3af7d18c4a 87
seppeduwe 0:ae3af7d18c4a 88 encode[length-2]=0xCC;
seppeduwe 0:ae3af7d18c4a 89 encode[length-1]=0xDD;
seppeduwe 0:ae3af7d18c4a 90 return length;
seppeduwe 0:ae3af7d18c4a 91 }
seppeduwe 0:ae3af7d18c4a 92
seppeduwe 1:635e76c52151 93 int Frame::MakeCRC(
seppeduwe 0:ae3af7d18c4a 94 char LEN, //lenght of frame
seppeduwe 0:ae3af7d18c4a 95 char IDD, //Destination ID
seppeduwe 0:ae3af7d18c4a 96 char TMP0,//first tmp char
seppeduwe 0:ae3af7d18c4a 97 char TMP1,//second tmp char
seppeduwe 0:ae3af7d18c4a 98 char PWM, //pwm tune
seppeduwe 0:ae3af7d18c4a 99 char* data, //data frame
seppeduwe 0:ae3af7d18c4a 100 int lenghtData //lenght of the data
seppeduwe 0:ae3af7d18c4a 101 )
seppeduwe 0:ae3af7d18c4a 102 {
seppeduwe 0:ae3af7d18c4a 103 //char* crcData = new char[5+lenghtData] ;
seppeduwe 0:ae3af7d18c4a 104 char crcData[5+lenghtData] ;
seppeduwe 0:ae3af7d18c4a 105
seppeduwe 0:ae3af7d18c4a 106 crcData[0] = LEN; //lenght of frame
seppeduwe 0:ae3af7d18c4a 107 crcData[1] = IDD; //Destination ID
seppeduwe 0:ae3af7d18c4a 108 crcData[2] = TMP0;//first tmp char
seppeduwe 0:ae3af7d18c4a 109 crcData[3] = TMP1;//second tmp char
seppeduwe 0:ae3af7d18c4a 110 crcData[4] = PWM; //pwm tune
seppeduwe 0:ae3af7d18c4a 111
seppeduwe 0:ae3af7d18c4a 112 // add the data to the crcData
seppeduwe 0:ae3af7d18c4a 113 for (int i=0; i<lenghtData; i++) {
seppeduwe 0:ae3af7d18c4a 114 crcData[i+5]= data[i];
seppeduwe 0:ae3af7d18c4a 115 }
seppeduwe 0:ae3af7d18c4a 116 return calculate_crc16(crcData, lenghtData+5);
seppeduwe 1:635e76c52151 117 }
seppeduwe 1:635e76c52151 118
seppeduwe 1:635e76c52151 119 void Frame::testEncode(char* frame)
seppeduwe 1:635e76c52151 120 {
seppeduwe 1:635e76c52151 121 printf("testEncode\n\r");
seppeduwe 1:635e76c52151 122 char controle[]= {0xAA,0xBB,0x0F,0x0B,0x0F,0xA0,0x02,0x05,0x08,0x09,0x0A,0x4B,0x7C,0xCC,0xDD};
seppeduwe 1:635e76c52151 123 // SOF SOF LEN IDD TMP TMP PWM TUN ID0 ID1 ID2 CRC CRC EOF EOF
seppeduwe 1:635e76c52151 124 for (int i=0; i<15; i++) {
seppeduwe 1:635e76c52151 125 // loop all chars and check if there right
seppeduwe 1:635e76c52151 126 if(controle[i]!=frame[i]) {
seppeduwe 1:635e76c52151 127 printf("ERROR in frame %d : %X != %X\n\r",i,(unsigned char) controle[i],(unsigned char)frame[i] );
seppeduwe 1:635e76c52151 128 }
seppeduwe 1:635e76c52151 129 }
seppeduwe 1:635e76c52151 130 printf("End testEncode\n\r");
seppeduwe 1:635e76c52151 131 }
seppeduwe 1:635e76c52151 132 int Frame::CheckCRC(char* frame)
seppeduwe 1:635e76c52151 133 {
seppeduwe 1:635e76c52151 134 if(crc == MakeCRC((char)(12+lengthIDs),(char)IdDestinationMbed,(char)(temperature>>8),(char)temperature,(char)pWMDutycycle,(char* )IDs,lengthIDs))
seppeduwe 1:635e76c52151 135 return 1;
seppeduwe 1:635e76c52151 136 else return 0;
seppeduwe 1:635e76c52151 137 }
seppeduwe 1:635e76c52151 138 void Frame::AddID(int id)
seppeduwe 1:635e76c52151 139 {
seppeduwe 1:635e76c52151 140 lengthIDs++;
seppeduwe 1:635e76c52151 141 char* IDs2 = new char[lengthIDs];
seppeduwe 1:635e76c52151 142 for(int i=0; i<lengthIDs; i++) {
seppeduwe 1:635e76c52151 143 IDs2[i] = IDs[i];
seppeduwe 1:635e76c52151 144 }
seppeduwe 1:635e76c52151 145 IDs2[lengthIDs-1]=id;
seppeduwe 1:635e76c52151 146
seppeduwe 1:635e76c52151 147 char* tempIDs=IDs;
seppeduwe 1:635e76c52151 148 IDs=IDs2;
seppeduwe 1:635e76c52151 149 delete tempIDs;
seppeduwe 1:635e76c52151 150 }
seppeduwe 1:635e76c52151 151
seppeduwe 1:635e76c52151 152 int Frame::CheckMyID(int id)
seppeduwe 1:635e76c52151 153 {
seppeduwe 1:635e76c52151 154 for(int i=0; i<lengthIDs; i++) {
seppeduwe 1:635e76c52151 155 if(id == IDs[i])
seppeduwe 1:635e76c52151 156 return 1;
seppeduwe 1:635e76c52151 157 }
seppeduwe 1:635e76c52151 158 return 0;
seppeduwe 1:635e76c52151 159 }
seppeduwe 1:635e76c52151 160
seppeduwe 1:635e76c52151 161 void Frame::setIdDestinationMbed(int IdDestinationMbed)
seppeduwe 1:635e76c52151 162 {
seppeduwe 1:635e76c52151 163 this->IdDestinationMbed=IdDestinationMbed;
seppeduwe 1:635e76c52151 164 }
seppeduwe 1:635e76c52151 165 int Frame::getIdDestinationMbed(void)
seppeduwe 1:635e76c52151 166 {
seppeduwe 1:635e76c52151 167 return IdDestinationMbed;
seppeduwe 1:635e76c52151 168 }
seppeduwe 3:344115c04cd0 169 void Frame::setTemperature(float temperature)
seppeduwe 1:635e76c52151 170 {
seppeduwe 3:344115c04cd0 171 this->temperature=(int) (37.227*(temperature+25));
seppeduwe 1:635e76c52151 172 }
seppeduwe 1:635e76c52151 173 int Frame::getTemperature(void)
seppeduwe 1:635e76c52151 174 {
seppeduwe 3:344115c04cd0 175 return (int) (0.026862*temperature-25);
seppeduwe 1:635e76c52151 176 }
seppeduwe 1:635e76c52151 177 void Frame::setPWMDutycycle(int pWMDutycycle)
seppeduwe 1:635e76c52151 178 {
seppeduwe 1:635e76c52151 179 this->pWMDutycycle=pWMDutycycle;
seppeduwe 1:635e76c52151 180 }
seppeduwe 1:635e76c52151 181 void Frame::setTune(int tune)
seppeduwe 1:635e76c52151 182 {
seppeduwe 1:635e76c52151 183 this->tune=tune;
seppeduwe 1:635e76c52151 184 }
seppeduwe 1:635e76c52151 185 int Frame::getTune(void)
seppeduwe 1:635e76c52151 186 {
seppeduwe 1:635e76c52151 187 return tune;
seppeduwe 1:635e76c52151 188 }
seppeduwe 1:635e76c52151 189 void Frame::setLengthIDs(int lengthIDs)
seppeduwe 1:635e76c52151 190 {
seppeduwe 1:635e76c52151 191 this->lengthIDs=lengthIDs;
seppeduwe 1:635e76c52151 192 }
seppeduwe 1:635e76c52151 193 void Frame::setIDs(char* IDs)
seppeduwe 1:635e76c52151 194 {
seppeduwe 1:635e76c52151 195 this->IDs=IDs;
seppeduwe 0:ae3af7d18c4a 196 }