not finished RFM12 Libary
Diff: rfm12.cpp
- Revision:
- 0:a634c7e3ea44
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rfm12.cpp Fri Feb 18 20:07:12 2011 +0000 @@ -0,0 +1,392 @@ +#include "rfm12.h" + +char HammiEncode[16] = {0x15,0x02,0x49,0x5E,0x64,0x73,0x38,0x2F,0xD0,0xC7,0x8C,0x9B,0xA1,0xB6,0xFD,0xEA}; +char HammiDecode[256] = +{ + 0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x02,0x02,0x01,0x03,0x0A,0x02,0x03,0x07, + 0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x06,0x02,0x03,0x0B,0x02,0x00,0x03,0x03, + 0x04,0x0C,0x01,0x05,0x04,0x04,0x05,0x07,0x06,0x06,0x07,0x07,0x06,0x07,0x07,0x07, + 0x06,0x04,0x05,0x05,0x04,0x00,0x0D,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x07, + 0x00,0x02,0x01,0x01,0x04,0x00,0x01,0x09,0x02,0x02,0x03,0x02,0x02,0x02,0x03,0x03, + 0x08,0x00,0x01,0x05,0x00,0x00,0x03,0x01,0x02,0x02,0x03,0x03,0x03,0x02,0x03,0x03, + 0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x05,0x06,0x02,0x0F,0x07,0x04,0x06,0x07,0x07, + 0x04,0x05,0x05,0x05,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x05,0x06,0x0E,0x03,0x07, + 0x08,0x0C,0x01,0x09,0x0A,0x08,0x09,0x09,0x0A,0x0A,0x0B,0x0B,0x0A,0x0A,0x0A,0x0B, + 0x08,0x08,0x09,0x0B,0x08,0x00,0x0D,0x09,0x0A,0x0B,0x0B,0x0B,0x0A,0x0A,0x0B,0x0B, + 0x0C,0x0C,0x0D,0x0C,0x0C,0x0C,0x0D,0x0D,0x0E,0x0C,0x0F,0x0F,0x0A,0x0E,0x0F,0x07, + 0x0C,0x0C,0x0D,0x0D,0x0D,0x0C,0x0D,0x0D,0x06,0x0E,0x0F,0x0B,0x0E,0x0E,0x0D,0x0F, + 0x08,0x08,0x09,0x09,0x08,0x09,0x09,0x09,0x0A,0x02,0x0F,0x0B,0x0A,0x0A,0x0B,0x09, + 0x08,0x08,0x08,0x09,0x08,0x08,0x09,0x09,0x08,0x0A,0x0B,0x0B,0x0A,0x0E,0x03,0x0B, + 0x0C,0x0C,0x0F,0x0D,0x04,0x0C,0x0D,0x09,0x0F,0x0E,0x0F,0x0F,0x0E,0x0E,0x0F,0x0F, + 0x08,0x0C,0x0D,0x05,0x0C,0x0E,0x0D,0x0D,0x0E,0x0E,0x0F,0x0F,0x0E,0x0E,0x0F,0x0E +}; + +RFM12::RFM12(PinName irq, PinName sel, PinName sdi, PinName sdo, PinName sck) : _irq(irq), _sel(sel), _sdi(sdi), _sdo(sdo), _sck(sck) +{ + _irq.mode(PullNone); + _irq.fall(this, &RFM12::RF_PHY_Interrupt); + + _sel = 1; + _sdi = 1; + _sck = 0; + + //Initialisierung des Modules + RF_PHY_Write(0x80D8); + RF_PHY_Write(0x8201); + RF_PHY_Write(0xA640); + RF_PHY_Write(0xC647); + RF_PHY_Write(0x94A0); + RF_PHY_Write(0xC2AC); + RF_PHY_Write(0xCA81); + RF_PHY_Write(0xC483); + RF_PHY_Write(0x9850); + RF_PHY_Write(0xE000); + RF_PHY_Write(0xC800); + RF_PHY_Write(0xC040); + + //Auf Listen Modus schalten + RF_PHY_Write(0x82C8); + RF_PHY_Write(0xCA81); + RF_PHY_Write(0xCA83); + RF_PHY_Write(0x0000); + RF_PHY_Write(0xB000); + + wait(0.001); + + status = LISTEN; +} + +short RFM12::RF_PHY_Write(short b) +{ + char i; + short temp = 0; + + _sck = 0; + _sel = 0; + + for(i = 0; i < 16; i++) + { + if(b & 0x8000) + { + _sdi = 1; + } + else + { + _sdi = 0; + } + + _sck = 1; + temp <<= 1; + + if(_sdo) + { + temp |= 0x0001; + } + + _sck = 0; + b <<= 1; + } + + _sel = 1; + + return temp; +} + +void RFM12::RF_PHY_Interrupt() +{ + short stat = RF_PHY_Write(0x0000); + if(stat & RF_STATUS_RGITFFIT) + { + switch(status) + { + case TX: + if(sbufferi < sbufferlength) + { + RF_PHY_Send(sbuffer[sbufferi]); + sbufferi++; + } + else + { + RF_PHY_Write(0x82C8); + RF_PHY_Write(0xCA81); + RF_PHY_Write(0xCA83); + RF_PHY_Write(0x0000); + RF_PHY_Write(0xB000); + + status = LISTEN; + sbufferi = 0; + sbufferlength = 0; + + delete [] sbuffer; + } + break; + + case LISTEN: + short tmp; + tmp = RF_PHY_Receive(); + rbuffer = new char[tmp]; + rbufferi = 0; + rbufferlength = tmp; + status = RX; + break; + + case RX: + if(rbufferi < rbufferlength) + { + rbuffer[rbufferi] = RF_PHY_Receive(); + rbufferi++; + } + else + { + + //Auf Listen Modus schalten + RF_PHY_Write(0x82C8); + RF_PHY_Write(0xCA81); + RF_PHY_Write(0xCA83); + RF_PHY_Write(0x0000); + RF_PHY_Write(0xB000); + + status = LISTEN; + + //Weitergabe an Layer 3 + RF_L3_Empfangen(rbuffer, rbufferlength); + + rbufferi = 0; + rbufferlength = 0; + } + break; + } + } +} + +void RFM12::RF_PHY_Send(char b) +{ + RF_PHY_Write(0xB800 + b); +} + +char RFM12::RF_PHY_Receive() +{ + short tmp; + tmp = RF_PHY_Write(0xB000); + return (tmp & 0x00FF); +} + +int RFM12::RF_PHY_Senden(char *buff, int length) +{ + if(status != LISTEN) + return -1; + + sbuffer = new char[length + 9]; + + sbuffer[0] = 0xAA; //Preamble + sbuffer[1] = 0xAA; + sbuffer[2] = 0xAA; + sbuffer[3] = 0x2D; //Sync HI + sbuffer[4] = 0xD4; //Sync LO + + sbuffer[5] = length; + + memcpy(sbuffer + 6, buff, length); + + delete [] sbufferl3; + + sbuffer[length + 6] = 0xAA; + sbuffer[length + 7] = 0xAA; + sbuffer[length + 8] = 0xAA; + + sbufferlength = length + 9; + sbufferi = 0; + status = TX; + + //In Sendemodus schalten... + RF_PHY_Write(0x0000); + RF_PHY_Write(0x8239); + + return 0; +} + +int RFM12::RF_L3_Senden(char *buff, char length) +{ + int i; + short crc = 0; + + sbufferl3 = new char((length + 2)*2); + + for(i = 0; i < length; i++) + { + sbufferl3[i*2] = Hammi_EncodeHI(buff[i]); + sbufferl3[i*2 + 1] = Hammi_EncodeLO(buff[i]); + crc = crcadd(crc, buff[i]); + } + + delete [] sbufferl4; + + sbufferl3[2*length] = Hammi_EncodeHI(crc >> 8); + sbufferl3[2*length + 1] = Hammi_EncodeLO(crc >> 8); + sbufferl3[2*length + 2] = Hammi_EncodeHI(crc & 0x00FF); + sbufferl3[2*length + 3] = Hammi_EncodeLO(crc & 0x00FF); + + RF_PHY_Senden(sbufferl3, (length+2)*2); + + return 0; +} + +int RFM12::RF_L3_Empfangen(char *buff, char length) +{ + char i; + short crc = 0; + + rbufferl3 = new char(length/2 - 2); + + for(i = 0; i < (length/2 - 2); i++) + { + rbufferl3[i] = Hammi_DecodeHILO(buff[i*2], buff[i*2+1]); + crc = crcadd(crc, rbufferl3[i]); + } + + crc = crcadd(crc, Hammi_DecodeHILO(buff[length - 4], buff[length - 3])); + crc = crcadd(crc, Hammi_DecodeHILO(buff[length - 2], buff[length - 1])); + + delete [] rbuffer; + + if(crc == 0) + { + RF_L4_Empfangen(rbufferl3, (length/2 - 2)); + + return 0; + } + else //Paket verwerfen + { + delete [] rbufferl3; + return -1; + } +} + +int RFM12::RF_L4_Senden(char *buff, header h, char length) +{ + char i; + + sbufferl4 = new char(length + 2); + + sbufferl4[0] = h.Byte.HI; + sbufferl4[1] = h.Byte.LO; + + for(i = 0; i < length; i++) + { + sbufferl4[i+2] = buff[i]; + } + + RF_L3_Senden(sbufferl4, length + 2); + + return 0; +} + +int RFM12::RF_L4_Empfangen(char *buff, char length) +{ + uint8_t i; + uint8_t valid = 0; + header h; + + rbufferl4 = new char(length - 2); + + for(i = 0; i < length - 2; i++) + { + rbufferl4[i] = buff[i+2]; + } + + h.Byte.HI = buff[0]; + h.Byte.LO = buff[1]; + + delete [] rbufferl3; + + //Broadcast + if(h.Bit.DestType == 0) + { + valid = 1; + } + if(h.Bit.DestType == 1) + { + if(h.Bit.Addresse == ADDR) + { + valid = 1; + } + } + if(h.Bit.DestType == 2) + { + //TODO: Gruppennummern durchlaufen... + //if(h.Bit.Addresse == 0x01) valid = 1; + //if(h.Bit.Addresse == 0x02) valid = 1; + } + if(h.Bit.DestType == 3) + { + //TODO: Typen durchlaufen... + } + + //Je nach Port richtige "Anwendung" aufrufen... + if(valid) + { + if(h.Bit.Port == 1) + { + RF_P1_Empfangen(rbufferl4, length - 2); + } + } + else //Paket verwerfen + { + delete [] rbufferl4; + return -1; + } + + return 0; +} + +int RFM12::RF_P1_Empfangen(char *buff, char length) +{ + delete [] rbufferl4; + + return 0; +} + +short RFM12::crcadd(short crc, char b) +{ + + return update_crc16_1021(crc, b); +} + +char RFM12::Hammi_EncodeHI(char b) +{ + return HammiEncode[b>>4]; +} + +char RFM12::Hammi_EncodeLO(char b) +{ + return HammiEncode[b & 0x0F]; +} + +char RFM12::Hammi_DecodeHILO(char hi, char lo) +{ + char b; + + b = (HammiDecode[hi] << 4); + b+= HammiDecode[lo]; + + return b; +} + +/* +int RFM12::RF_PHY_Senden(string str) +{ + if(status != LISTEN) + return -1; + + char *s; + s = new char[str.size() + 1]; + + strcpy(s, str.c_str()); + + RF_PHY_Senden(s, (int)str.size()); + + delete [] s; + + return 0; +} +*/ \ No newline at end of file