Projectlab Elektronica-ICT KULeuven
Dependencies: EthernetInterface TMP102 TextLCD mbed-rtos mbed
Diff: Frame.cpp
- Revision:
- 0:ae3af7d18c4a
- Child:
- 1:635e76c52151
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Frame.cpp Fri Mar 14 19:41:14 2014 +0000 @@ -0,0 +1,117 @@ +#include "mbed.h" +#include "Frame.h" +#include "lib_crc.h" +//SOF LEN IDD TMP PWM ID0 ID1 … IDn CRC EOF +//SOF (16bit): start of frame (0xAA 0xBB) +//LEN (8bit): lengte van frame in bytes (volledige frame!) +//IDD (8bit): ID destinationmbed(1-15) +//TMP (16bit): 0b0000XXXX 0bXXXXXXXX Temperature(0 –4095) (-25°tot 85°) +//PWM (8bit): PWM dutycycle(0 –255) (0% –100%) +//TUN (8bit): Select tune & delay (1 –15) zie tabel 1 +//ID0–IDn(n x 8bit): lijst van reeds bezochte mbeds +//CRC (16bit): CRC16 checksum(x16+ x15+ x2+ 1) checksumop “LEN IDD TMP PWM ID0…IDn” +//EOF (16bit): end of frame (0xCC 0xDD) + +//char buf[]={0xAA,0xBB,0x0F,0x0B,0x0F,0xA0,0x02,0x05,0x08,0x09,0x0A,0xF2,0xE4,0xCC,0xDD}; //BB 0E A0 0F 32 02 05 08 09 F2 E4 CCDD"; +// SOF SOF LEN IDD TMP TMP PWM TUN ID0 ID1 ID2 CRC CRC EOF EOF + +void decode(char* frame) +{ + int length; + int IdDestinationMbed; + int temperature; + int pWMDutycycle; + int tune; + char* IDs; + char* CRC; + int numberOfFrames; + + length = (int)frame[2]; + numberOfFrames = length- 12; + IDs = new char[numberOfFrames]; + + if ( frame[0]==0xAA && frame[1]==0xBB && frame[length-2]==0xCC && frame[length-1]==0xDD) { + + IdDestinationMbed = (int) frame[3]; + temperature = (int) ((frame[4]<<8) | frame[5]); + pWMDutycycle = (int)frame[6]; + tune = (int) frame [7]; + + for (int i=0; i<numberOfFrames; i++) { + IDs[i]=frame[i+numberOfFrames]; + } + printf("Decode length: %d IdDestinationMbed: %d temperature: %d \n\r",length,IdDestinationMbed,temperature); + printf("pWMDutycycle: %d tune: %d \n\r",pWMDutycycle,tune); + + } +} + +int encode( + int IdDestinationMbed, + int temperature, + int pWMDutycycle, + int tune, + int lengthIDs, + char* IDs, + char* encode +) +{ + int length = 12+lengthIDs; + //encode = new char[length]; + + encode[0]=0xAA; + encode[1]=0xBB; + + encode[2]= (char) length; + encode[3]= (char) IdDestinationMbed; + encode[4]= (char) (temperature>>8); + encode[5]= (char) temperature; + encode[6]= (char) pWMDutycycle; + encode[7]= (char) tune; + + for (int i=0; i<lengthIDs; i++) { + encode[8+i]=IDs[i]; + } + + //copy over static fields + /* for (int i=2; i<7; i++) { + CRC[i-2]= encode[i]; + }*/ + + + // Calculate CRC + int CRCint = MakeCRC(encode[2],encode[3],encode[4],encode[5],encode[6],IDs,lengthIDs); + + encode[length-4]= ( char)(CRCint>>8); + encode[length-3]=( char)(CRCint); + + encode[length-2]=0xCC; + encode[length-1]=0xDD; + return length; +} + +int MakeCRC( + char LEN, //lenght of frame + char IDD, //Destination ID + char TMP0,//first tmp char + char TMP1,//second tmp char + char PWM, //pwm tune + char* data, //data frame + int lenghtData //lenght of the data +) +{ + //char* crcData = new char[5+lenghtData] ; + char crcData[5+lenghtData] ; + + crcData[0] = LEN; //lenght of frame + crcData[1] = IDD; //Destination ID + crcData[2] = TMP0;//first tmp char + crcData[3] = TMP1;//second tmp char + crcData[4] = PWM; //pwm tune + + // add the data to the crcData + for (int i=0; i<lenghtData; i++) { + crcData[i+5]= data[i]; + } + return calculate_crc16(crcData, lenghtData+5); +} \ No newline at end of file