not finished RFM12 Libary
rfm12.cpp@0:a634c7e3ea44, 2011-02-18 (annotated)
- Committer:
- dominik
- Date:
- Fri Feb 18 20:07:12 2011 +0000
- Revision:
- 0:a634c7e3ea44
not finished
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dominik | 0:a634c7e3ea44 | 1 | #include "rfm12.h" |
dominik | 0:a634c7e3ea44 | 2 | |
dominik | 0:a634c7e3ea44 | 3 | char HammiEncode[16] = {0x15,0x02,0x49,0x5E,0x64,0x73,0x38,0x2F,0xD0,0xC7,0x8C,0x9B,0xA1,0xB6,0xFD,0xEA}; |
dominik | 0:a634c7e3ea44 | 4 | char HammiDecode[256] = |
dominik | 0:a634c7e3ea44 | 5 | { |
dominik | 0:a634c7e3ea44 | 6 | 0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x02,0x02,0x01,0x03,0x0A,0x02,0x03,0x07, |
dominik | 0:a634c7e3ea44 | 7 | 0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x00,0x06,0x02,0x03,0x0B,0x02,0x00,0x03,0x03, |
dominik | 0:a634c7e3ea44 | 8 | 0x04,0x0C,0x01,0x05,0x04,0x04,0x05,0x07,0x06,0x06,0x07,0x07,0x06,0x07,0x07,0x07, |
dominik | 0:a634c7e3ea44 | 9 | 0x06,0x04,0x05,0x05,0x04,0x00,0x0D,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x07, |
dominik | 0:a634c7e3ea44 | 10 | 0x00,0x02,0x01,0x01,0x04,0x00,0x01,0x09,0x02,0x02,0x03,0x02,0x02,0x02,0x03,0x03, |
dominik | 0:a634c7e3ea44 | 11 | 0x08,0x00,0x01,0x05,0x00,0x00,0x03,0x01,0x02,0x02,0x03,0x03,0x03,0x02,0x03,0x03, |
dominik | 0:a634c7e3ea44 | 12 | 0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x05,0x06,0x02,0x0F,0x07,0x04,0x06,0x07,0x07, |
dominik | 0:a634c7e3ea44 | 13 | 0x04,0x05,0x05,0x05,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x05,0x06,0x0E,0x03,0x07, |
dominik | 0:a634c7e3ea44 | 14 | 0x08,0x0C,0x01,0x09,0x0A,0x08,0x09,0x09,0x0A,0x0A,0x0B,0x0B,0x0A,0x0A,0x0A,0x0B, |
dominik | 0:a634c7e3ea44 | 15 | 0x08,0x08,0x09,0x0B,0x08,0x00,0x0D,0x09,0x0A,0x0B,0x0B,0x0B,0x0A,0x0A,0x0B,0x0B, |
dominik | 0:a634c7e3ea44 | 16 | 0x0C,0x0C,0x0D,0x0C,0x0C,0x0C,0x0D,0x0D,0x0E,0x0C,0x0F,0x0F,0x0A,0x0E,0x0F,0x07, |
dominik | 0:a634c7e3ea44 | 17 | 0x0C,0x0C,0x0D,0x0D,0x0D,0x0C,0x0D,0x0D,0x06,0x0E,0x0F,0x0B,0x0E,0x0E,0x0D,0x0F, |
dominik | 0:a634c7e3ea44 | 18 | 0x08,0x08,0x09,0x09,0x08,0x09,0x09,0x09,0x0A,0x02,0x0F,0x0B,0x0A,0x0A,0x0B,0x09, |
dominik | 0:a634c7e3ea44 | 19 | 0x08,0x08,0x08,0x09,0x08,0x08,0x09,0x09,0x08,0x0A,0x0B,0x0B,0x0A,0x0E,0x03,0x0B, |
dominik | 0:a634c7e3ea44 | 20 | 0x0C,0x0C,0x0F,0x0D,0x04,0x0C,0x0D,0x09,0x0F,0x0E,0x0F,0x0F,0x0E,0x0E,0x0F,0x0F, |
dominik | 0:a634c7e3ea44 | 21 | 0x08,0x0C,0x0D,0x05,0x0C,0x0E,0x0D,0x0D,0x0E,0x0E,0x0F,0x0F,0x0E,0x0E,0x0F,0x0E |
dominik | 0:a634c7e3ea44 | 22 | }; |
dominik | 0:a634c7e3ea44 | 23 | |
dominik | 0:a634c7e3ea44 | 24 | RFM12::RFM12(PinName irq, PinName sel, PinName sdi, PinName sdo, PinName sck) : _irq(irq), _sel(sel), _sdi(sdi), _sdo(sdo), _sck(sck) |
dominik | 0:a634c7e3ea44 | 25 | { |
dominik | 0:a634c7e3ea44 | 26 | _irq.mode(PullNone); |
dominik | 0:a634c7e3ea44 | 27 | _irq.fall(this, &RFM12::RF_PHY_Interrupt); |
dominik | 0:a634c7e3ea44 | 28 | |
dominik | 0:a634c7e3ea44 | 29 | _sel = 1; |
dominik | 0:a634c7e3ea44 | 30 | _sdi = 1; |
dominik | 0:a634c7e3ea44 | 31 | _sck = 0; |
dominik | 0:a634c7e3ea44 | 32 | |
dominik | 0:a634c7e3ea44 | 33 | //Initialisierung des Modules |
dominik | 0:a634c7e3ea44 | 34 | RF_PHY_Write(0x80D8); |
dominik | 0:a634c7e3ea44 | 35 | RF_PHY_Write(0x8201); |
dominik | 0:a634c7e3ea44 | 36 | RF_PHY_Write(0xA640); |
dominik | 0:a634c7e3ea44 | 37 | RF_PHY_Write(0xC647); |
dominik | 0:a634c7e3ea44 | 38 | RF_PHY_Write(0x94A0); |
dominik | 0:a634c7e3ea44 | 39 | RF_PHY_Write(0xC2AC); |
dominik | 0:a634c7e3ea44 | 40 | RF_PHY_Write(0xCA81); |
dominik | 0:a634c7e3ea44 | 41 | RF_PHY_Write(0xC483); |
dominik | 0:a634c7e3ea44 | 42 | RF_PHY_Write(0x9850); |
dominik | 0:a634c7e3ea44 | 43 | RF_PHY_Write(0xE000); |
dominik | 0:a634c7e3ea44 | 44 | RF_PHY_Write(0xC800); |
dominik | 0:a634c7e3ea44 | 45 | RF_PHY_Write(0xC040); |
dominik | 0:a634c7e3ea44 | 46 | |
dominik | 0:a634c7e3ea44 | 47 | //Auf Listen Modus schalten |
dominik | 0:a634c7e3ea44 | 48 | RF_PHY_Write(0x82C8); |
dominik | 0:a634c7e3ea44 | 49 | RF_PHY_Write(0xCA81); |
dominik | 0:a634c7e3ea44 | 50 | RF_PHY_Write(0xCA83); |
dominik | 0:a634c7e3ea44 | 51 | RF_PHY_Write(0x0000); |
dominik | 0:a634c7e3ea44 | 52 | RF_PHY_Write(0xB000); |
dominik | 0:a634c7e3ea44 | 53 | |
dominik | 0:a634c7e3ea44 | 54 | wait(0.001); |
dominik | 0:a634c7e3ea44 | 55 | |
dominik | 0:a634c7e3ea44 | 56 | status = LISTEN; |
dominik | 0:a634c7e3ea44 | 57 | } |
dominik | 0:a634c7e3ea44 | 58 | |
dominik | 0:a634c7e3ea44 | 59 | short RFM12::RF_PHY_Write(short b) |
dominik | 0:a634c7e3ea44 | 60 | { |
dominik | 0:a634c7e3ea44 | 61 | char i; |
dominik | 0:a634c7e3ea44 | 62 | short temp = 0; |
dominik | 0:a634c7e3ea44 | 63 | |
dominik | 0:a634c7e3ea44 | 64 | _sck = 0; |
dominik | 0:a634c7e3ea44 | 65 | _sel = 0; |
dominik | 0:a634c7e3ea44 | 66 | |
dominik | 0:a634c7e3ea44 | 67 | for(i = 0; i < 16; i++) |
dominik | 0:a634c7e3ea44 | 68 | { |
dominik | 0:a634c7e3ea44 | 69 | if(b & 0x8000) |
dominik | 0:a634c7e3ea44 | 70 | { |
dominik | 0:a634c7e3ea44 | 71 | _sdi = 1; |
dominik | 0:a634c7e3ea44 | 72 | } |
dominik | 0:a634c7e3ea44 | 73 | else |
dominik | 0:a634c7e3ea44 | 74 | { |
dominik | 0:a634c7e3ea44 | 75 | _sdi = 0; |
dominik | 0:a634c7e3ea44 | 76 | } |
dominik | 0:a634c7e3ea44 | 77 | |
dominik | 0:a634c7e3ea44 | 78 | _sck = 1; |
dominik | 0:a634c7e3ea44 | 79 | temp <<= 1; |
dominik | 0:a634c7e3ea44 | 80 | |
dominik | 0:a634c7e3ea44 | 81 | if(_sdo) |
dominik | 0:a634c7e3ea44 | 82 | { |
dominik | 0:a634c7e3ea44 | 83 | temp |= 0x0001; |
dominik | 0:a634c7e3ea44 | 84 | } |
dominik | 0:a634c7e3ea44 | 85 | |
dominik | 0:a634c7e3ea44 | 86 | _sck = 0; |
dominik | 0:a634c7e3ea44 | 87 | b <<= 1; |
dominik | 0:a634c7e3ea44 | 88 | } |
dominik | 0:a634c7e3ea44 | 89 | |
dominik | 0:a634c7e3ea44 | 90 | _sel = 1; |
dominik | 0:a634c7e3ea44 | 91 | |
dominik | 0:a634c7e3ea44 | 92 | return temp; |
dominik | 0:a634c7e3ea44 | 93 | } |
dominik | 0:a634c7e3ea44 | 94 | |
dominik | 0:a634c7e3ea44 | 95 | void RFM12::RF_PHY_Interrupt() |
dominik | 0:a634c7e3ea44 | 96 | { |
dominik | 0:a634c7e3ea44 | 97 | short stat = RF_PHY_Write(0x0000); |
dominik | 0:a634c7e3ea44 | 98 | if(stat & RF_STATUS_RGITFFIT) |
dominik | 0:a634c7e3ea44 | 99 | { |
dominik | 0:a634c7e3ea44 | 100 | switch(status) |
dominik | 0:a634c7e3ea44 | 101 | { |
dominik | 0:a634c7e3ea44 | 102 | case TX: |
dominik | 0:a634c7e3ea44 | 103 | if(sbufferi < sbufferlength) |
dominik | 0:a634c7e3ea44 | 104 | { |
dominik | 0:a634c7e3ea44 | 105 | RF_PHY_Send(sbuffer[sbufferi]); |
dominik | 0:a634c7e3ea44 | 106 | sbufferi++; |
dominik | 0:a634c7e3ea44 | 107 | } |
dominik | 0:a634c7e3ea44 | 108 | else |
dominik | 0:a634c7e3ea44 | 109 | { |
dominik | 0:a634c7e3ea44 | 110 | RF_PHY_Write(0x82C8); |
dominik | 0:a634c7e3ea44 | 111 | RF_PHY_Write(0xCA81); |
dominik | 0:a634c7e3ea44 | 112 | RF_PHY_Write(0xCA83); |
dominik | 0:a634c7e3ea44 | 113 | RF_PHY_Write(0x0000); |
dominik | 0:a634c7e3ea44 | 114 | RF_PHY_Write(0xB000); |
dominik | 0:a634c7e3ea44 | 115 | |
dominik | 0:a634c7e3ea44 | 116 | status = LISTEN; |
dominik | 0:a634c7e3ea44 | 117 | sbufferi = 0; |
dominik | 0:a634c7e3ea44 | 118 | sbufferlength = 0; |
dominik | 0:a634c7e3ea44 | 119 | |
dominik | 0:a634c7e3ea44 | 120 | delete [] sbuffer; |
dominik | 0:a634c7e3ea44 | 121 | } |
dominik | 0:a634c7e3ea44 | 122 | break; |
dominik | 0:a634c7e3ea44 | 123 | |
dominik | 0:a634c7e3ea44 | 124 | case LISTEN: |
dominik | 0:a634c7e3ea44 | 125 | short tmp; |
dominik | 0:a634c7e3ea44 | 126 | tmp = RF_PHY_Receive(); |
dominik | 0:a634c7e3ea44 | 127 | rbuffer = new char[tmp]; |
dominik | 0:a634c7e3ea44 | 128 | rbufferi = 0; |
dominik | 0:a634c7e3ea44 | 129 | rbufferlength = tmp; |
dominik | 0:a634c7e3ea44 | 130 | status = RX; |
dominik | 0:a634c7e3ea44 | 131 | break; |
dominik | 0:a634c7e3ea44 | 132 | |
dominik | 0:a634c7e3ea44 | 133 | case RX: |
dominik | 0:a634c7e3ea44 | 134 | if(rbufferi < rbufferlength) |
dominik | 0:a634c7e3ea44 | 135 | { |
dominik | 0:a634c7e3ea44 | 136 | rbuffer[rbufferi] = RF_PHY_Receive(); |
dominik | 0:a634c7e3ea44 | 137 | rbufferi++; |
dominik | 0:a634c7e3ea44 | 138 | } |
dominik | 0:a634c7e3ea44 | 139 | else |
dominik | 0:a634c7e3ea44 | 140 | { |
dominik | 0:a634c7e3ea44 | 141 | |
dominik | 0:a634c7e3ea44 | 142 | //Auf Listen Modus schalten |
dominik | 0:a634c7e3ea44 | 143 | RF_PHY_Write(0x82C8); |
dominik | 0:a634c7e3ea44 | 144 | RF_PHY_Write(0xCA81); |
dominik | 0:a634c7e3ea44 | 145 | RF_PHY_Write(0xCA83); |
dominik | 0:a634c7e3ea44 | 146 | RF_PHY_Write(0x0000); |
dominik | 0:a634c7e3ea44 | 147 | RF_PHY_Write(0xB000); |
dominik | 0:a634c7e3ea44 | 148 | |
dominik | 0:a634c7e3ea44 | 149 | status = LISTEN; |
dominik | 0:a634c7e3ea44 | 150 | |
dominik | 0:a634c7e3ea44 | 151 | //Weitergabe an Layer 3 |
dominik | 0:a634c7e3ea44 | 152 | RF_L3_Empfangen(rbuffer, rbufferlength); |
dominik | 0:a634c7e3ea44 | 153 | |
dominik | 0:a634c7e3ea44 | 154 | rbufferi = 0; |
dominik | 0:a634c7e3ea44 | 155 | rbufferlength = 0; |
dominik | 0:a634c7e3ea44 | 156 | } |
dominik | 0:a634c7e3ea44 | 157 | break; |
dominik | 0:a634c7e3ea44 | 158 | } |
dominik | 0:a634c7e3ea44 | 159 | } |
dominik | 0:a634c7e3ea44 | 160 | } |
dominik | 0:a634c7e3ea44 | 161 | |
dominik | 0:a634c7e3ea44 | 162 | void RFM12::RF_PHY_Send(char b) |
dominik | 0:a634c7e3ea44 | 163 | { |
dominik | 0:a634c7e3ea44 | 164 | RF_PHY_Write(0xB800 + b); |
dominik | 0:a634c7e3ea44 | 165 | } |
dominik | 0:a634c7e3ea44 | 166 | |
dominik | 0:a634c7e3ea44 | 167 | char RFM12::RF_PHY_Receive() |
dominik | 0:a634c7e3ea44 | 168 | { |
dominik | 0:a634c7e3ea44 | 169 | short tmp; |
dominik | 0:a634c7e3ea44 | 170 | tmp = RF_PHY_Write(0xB000); |
dominik | 0:a634c7e3ea44 | 171 | return (tmp & 0x00FF); |
dominik | 0:a634c7e3ea44 | 172 | } |
dominik | 0:a634c7e3ea44 | 173 | |
dominik | 0:a634c7e3ea44 | 174 | int RFM12::RF_PHY_Senden(char *buff, int length) |
dominik | 0:a634c7e3ea44 | 175 | { |
dominik | 0:a634c7e3ea44 | 176 | if(status != LISTEN) |
dominik | 0:a634c7e3ea44 | 177 | return -1; |
dominik | 0:a634c7e3ea44 | 178 | |
dominik | 0:a634c7e3ea44 | 179 | sbuffer = new char[length + 9]; |
dominik | 0:a634c7e3ea44 | 180 | |
dominik | 0:a634c7e3ea44 | 181 | sbuffer[0] = 0xAA; //Preamble |
dominik | 0:a634c7e3ea44 | 182 | sbuffer[1] = 0xAA; |
dominik | 0:a634c7e3ea44 | 183 | sbuffer[2] = 0xAA; |
dominik | 0:a634c7e3ea44 | 184 | sbuffer[3] = 0x2D; //Sync HI |
dominik | 0:a634c7e3ea44 | 185 | sbuffer[4] = 0xD4; //Sync LO |
dominik | 0:a634c7e3ea44 | 186 | |
dominik | 0:a634c7e3ea44 | 187 | sbuffer[5] = length; |
dominik | 0:a634c7e3ea44 | 188 | |
dominik | 0:a634c7e3ea44 | 189 | memcpy(sbuffer + 6, buff, length); |
dominik | 0:a634c7e3ea44 | 190 | |
dominik | 0:a634c7e3ea44 | 191 | delete [] sbufferl3; |
dominik | 0:a634c7e3ea44 | 192 | |
dominik | 0:a634c7e3ea44 | 193 | sbuffer[length + 6] = 0xAA; |
dominik | 0:a634c7e3ea44 | 194 | sbuffer[length + 7] = 0xAA; |
dominik | 0:a634c7e3ea44 | 195 | sbuffer[length + 8] = 0xAA; |
dominik | 0:a634c7e3ea44 | 196 | |
dominik | 0:a634c7e3ea44 | 197 | sbufferlength = length + 9; |
dominik | 0:a634c7e3ea44 | 198 | sbufferi = 0; |
dominik | 0:a634c7e3ea44 | 199 | status = TX; |
dominik | 0:a634c7e3ea44 | 200 | |
dominik | 0:a634c7e3ea44 | 201 | //In Sendemodus schalten... |
dominik | 0:a634c7e3ea44 | 202 | RF_PHY_Write(0x0000); |
dominik | 0:a634c7e3ea44 | 203 | RF_PHY_Write(0x8239); |
dominik | 0:a634c7e3ea44 | 204 | |
dominik | 0:a634c7e3ea44 | 205 | return 0; |
dominik | 0:a634c7e3ea44 | 206 | } |
dominik | 0:a634c7e3ea44 | 207 | |
dominik | 0:a634c7e3ea44 | 208 | int RFM12::RF_L3_Senden(char *buff, char length) |
dominik | 0:a634c7e3ea44 | 209 | { |
dominik | 0:a634c7e3ea44 | 210 | int i; |
dominik | 0:a634c7e3ea44 | 211 | short crc = 0; |
dominik | 0:a634c7e3ea44 | 212 | |
dominik | 0:a634c7e3ea44 | 213 | sbufferl3 = new char((length + 2)*2); |
dominik | 0:a634c7e3ea44 | 214 | |
dominik | 0:a634c7e3ea44 | 215 | for(i = 0; i < length; i++) |
dominik | 0:a634c7e3ea44 | 216 | { |
dominik | 0:a634c7e3ea44 | 217 | sbufferl3[i*2] = Hammi_EncodeHI(buff[i]); |
dominik | 0:a634c7e3ea44 | 218 | sbufferl3[i*2 + 1] = Hammi_EncodeLO(buff[i]); |
dominik | 0:a634c7e3ea44 | 219 | crc = crcadd(crc, buff[i]); |
dominik | 0:a634c7e3ea44 | 220 | } |
dominik | 0:a634c7e3ea44 | 221 | |
dominik | 0:a634c7e3ea44 | 222 | delete [] sbufferl4; |
dominik | 0:a634c7e3ea44 | 223 | |
dominik | 0:a634c7e3ea44 | 224 | sbufferl3[2*length] = Hammi_EncodeHI(crc >> 8); |
dominik | 0:a634c7e3ea44 | 225 | sbufferl3[2*length + 1] = Hammi_EncodeLO(crc >> 8); |
dominik | 0:a634c7e3ea44 | 226 | sbufferl3[2*length + 2] = Hammi_EncodeHI(crc & 0x00FF); |
dominik | 0:a634c7e3ea44 | 227 | sbufferl3[2*length + 3] = Hammi_EncodeLO(crc & 0x00FF); |
dominik | 0:a634c7e3ea44 | 228 | |
dominik | 0:a634c7e3ea44 | 229 | RF_PHY_Senden(sbufferl3, (length+2)*2); |
dominik | 0:a634c7e3ea44 | 230 | |
dominik | 0:a634c7e3ea44 | 231 | return 0; |
dominik | 0:a634c7e3ea44 | 232 | } |
dominik | 0:a634c7e3ea44 | 233 | |
dominik | 0:a634c7e3ea44 | 234 | int RFM12::RF_L3_Empfangen(char *buff, char length) |
dominik | 0:a634c7e3ea44 | 235 | { |
dominik | 0:a634c7e3ea44 | 236 | char i; |
dominik | 0:a634c7e3ea44 | 237 | short crc = 0; |
dominik | 0:a634c7e3ea44 | 238 | |
dominik | 0:a634c7e3ea44 | 239 | rbufferl3 = new char(length/2 - 2); |
dominik | 0:a634c7e3ea44 | 240 | |
dominik | 0:a634c7e3ea44 | 241 | for(i = 0; i < (length/2 - 2); i++) |
dominik | 0:a634c7e3ea44 | 242 | { |
dominik | 0:a634c7e3ea44 | 243 | rbufferl3[i] = Hammi_DecodeHILO(buff[i*2], buff[i*2+1]); |
dominik | 0:a634c7e3ea44 | 244 | crc = crcadd(crc, rbufferl3[i]); |
dominik | 0:a634c7e3ea44 | 245 | } |
dominik | 0:a634c7e3ea44 | 246 | |
dominik | 0:a634c7e3ea44 | 247 | crc = crcadd(crc, Hammi_DecodeHILO(buff[length - 4], buff[length - 3])); |
dominik | 0:a634c7e3ea44 | 248 | crc = crcadd(crc, Hammi_DecodeHILO(buff[length - 2], buff[length - 1])); |
dominik | 0:a634c7e3ea44 | 249 | |
dominik | 0:a634c7e3ea44 | 250 | delete [] rbuffer; |
dominik | 0:a634c7e3ea44 | 251 | |
dominik | 0:a634c7e3ea44 | 252 | if(crc == 0) |
dominik | 0:a634c7e3ea44 | 253 | { |
dominik | 0:a634c7e3ea44 | 254 | RF_L4_Empfangen(rbufferl3, (length/2 - 2)); |
dominik | 0:a634c7e3ea44 | 255 | |
dominik | 0:a634c7e3ea44 | 256 | return 0; |
dominik | 0:a634c7e3ea44 | 257 | } |
dominik | 0:a634c7e3ea44 | 258 | else //Paket verwerfen |
dominik | 0:a634c7e3ea44 | 259 | { |
dominik | 0:a634c7e3ea44 | 260 | delete [] rbufferl3; |
dominik | 0:a634c7e3ea44 | 261 | return -1; |
dominik | 0:a634c7e3ea44 | 262 | } |
dominik | 0:a634c7e3ea44 | 263 | } |
dominik | 0:a634c7e3ea44 | 264 | |
dominik | 0:a634c7e3ea44 | 265 | int RFM12::RF_L4_Senden(char *buff, header h, char length) |
dominik | 0:a634c7e3ea44 | 266 | { |
dominik | 0:a634c7e3ea44 | 267 | char i; |
dominik | 0:a634c7e3ea44 | 268 | |
dominik | 0:a634c7e3ea44 | 269 | sbufferl4 = new char(length + 2); |
dominik | 0:a634c7e3ea44 | 270 | |
dominik | 0:a634c7e3ea44 | 271 | sbufferl4[0] = h.Byte.HI; |
dominik | 0:a634c7e3ea44 | 272 | sbufferl4[1] = h.Byte.LO; |
dominik | 0:a634c7e3ea44 | 273 | |
dominik | 0:a634c7e3ea44 | 274 | for(i = 0; i < length; i++) |
dominik | 0:a634c7e3ea44 | 275 | { |
dominik | 0:a634c7e3ea44 | 276 | sbufferl4[i+2] = buff[i]; |
dominik | 0:a634c7e3ea44 | 277 | } |
dominik | 0:a634c7e3ea44 | 278 | |
dominik | 0:a634c7e3ea44 | 279 | RF_L3_Senden(sbufferl4, length + 2); |
dominik | 0:a634c7e3ea44 | 280 | |
dominik | 0:a634c7e3ea44 | 281 | return 0; |
dominik | 0:a634c7e3ea44 | 282 | } |
dominik | 0:a634c7e3ea44 | 283 | |
dominik | 0:a634c7e3ea44 | 284 | int RFM12::RF_L4_Empfangen(char *buff, char length) |
dominik | 0:a634c7e3ea44 | 285 | { |
dominik | 0:a634c7e3ea44 | 286 | uint8_t i; |
dominik | 0:a634c7e3ea44 | 287 | uint8_t valid = 0; |
dominik | 0:a634c7e3ea44 | 288 | header h; |
dominik | 0:a634c7e3ea44 | 289 | |
dominik | 0:a634c7e3ea44 | 290 | rbufferl4 = new char(length - 2); |
dominik | 0:a634c7e3ea44 | 291 | |
dominik | 0:a634c7e3ea44 | 292 | for(i = 0; i < length - 2; i++) |
dominik | 0:a634c7e3ea44 | 293 | { |
dominik | 0:a634c7e3ea44 | 294 | rbufferl4[i] = buff[i+2]; |
dominik | 0:a634c7e3ea44 | 295 | } |
dominik | 0:a634c7e3ea44 | 296 | |
dominik | 0:a634c7e3ea44 | 297 | h.Byte.HI = buff[0]; |
dominik | 0:a634c7e3ea44 | 298 | h.Byte.LO = buff[1]; |
dominik | 0:a634c7e3ea44 | 299 | |
dominik | 0:a634c7e3ea44 | 300 | delete [] rbufferl3; |
dominik | 0:a634c7e3ea44 | 301 | |
dominik | 0:a634c7e3ea44 | 302 | //Broadcast |
dominik | 0:a634c7e3ea44 | 303 | if(h.Bit.DestType == 0) |
dominik | 0:a634c7e3ea44 | 304 | { |
dominik | 0:a634c7e3ea44 | 305 | valid = 1; |
dominik | 0:a634c7e3ea44 | 306 | } |
dominik | 0:a634c7e3ea44 | 307 | if(h.Bit.DestType == 1) |
dominik | 0:a634c7e3ea44 | 308 | { |
dominik | 0:a634c7e3ea44 | 309 | if(h.Bit.Addresse == ADDR) |
dominik | 0:a634c7e3ea44 | 310 | { |
dominik | 0:a634c7e3ea44 | 311 | valid = 1; |
dominik | 0:a634c7e3ea44 | 312 | } |
dominik | 0:a634c7e3ea44 | 313 | } |
dominik | 0:a634c7e3ea44 | 314 | if(h.Bit.DestType == 2) |
dominik | 0:a634c7e3ea44 | 315 | { |
dominik | 0:a634c7e3ea44 | 316 | //TODO: Gruppennummern durchlaufen... |
dominik | 0:a634c7e3ea44 | 317 | //if(h.Bit.Addresse == 0x01) valid = 1; |
dominik | 0:a634c7e3ea44 | 318 | //if(h.Bit.Addresse == 0x02) valid = 1; |
dominik | 0:a634c7e3ea44 | 319 | } |
dominik | 0:a634c7e3ea44 | 320 | if(h.Bit.DestType == 3) |
dominik | 0:a634c7e3ea44 | 321 | { |
dominik | 0:a634c7e3ea44 | 322 | //TODO: Typen durchlaufen... |
dominik | 0:a634c7e3ea44 | 323 | } |
dominik | 0:a634c7e3ea44 | 324 | |
dominik | 0:a634c7e3ea44 | 325 | //Je nach Port richtige "Anwendung" aufrufen... |
dominik | 0:a634c7e3ea44 | 326 | if(valid) |
dominik | 0:a634c7e3ea44 | 327 | { |
dominik | 0:a634c7e3ea44 | 328 | if(h.Bit.Port == 1) |
dominik | 0:a634c7e3ea44 | 329 | { |
dominik | 0:a634c7e3ea44 | 330 | RF_P1_Empfangen(rbufferl4, length - 2); |
dominik | 0:a634c7e3ea44 | 331 | } |
dominik | 0:a634c7e3ea44 | 332 | } |
dominik | 0:a634c7e3ea44 | 333 | else //Paket verwerfen |
dominik | 0:a634c7e3ea44 | 334 | { |
dominik | 0:a634c7e3ea44 | 335 | delete [] rbufferl4; |
dominik | 0:a634c7e3ea44 | 336 | return -1; |
dominik | 0:a634c7e3ea44 | 337 | } |
dominik | 0:a634c7e3ea44 | 338 | |
dominik | 0:a634c7e3ea44 | 339 | return 0; |
dominik | 0:a634c7e3ea44 | 340 | } |
dominik | 0:a634c7e3ea44 | 341 | |
dominik | 0:a634c7e3ea44 | 342 | int RFM12::RF_P1_Empfangen(char *buff, char length) |
dominik | 0:a634c7e3ea44 | 343 | { |
dominik | 0:a634c7e3ea44 | 344 | delete [] rbufferl4; |
dominik | 0:a634c7e3ea44 | 345 | |
dominik | 0:a634c7e3ea44 | 346 | return 0; |
dominik | 0:a634c7e3ea44 | 347 | } |
dominik | 0:a634c7e3ea44 | 348 | |
dominik | 0:a634c7e3ea44 | 349 | short RFM12::crcadd(short crc, char b) |
dominik | 0:a634c7e3ea44 | 350 | { |
dominik | 0:a634c7e3ea44 | 351 | |
dominik | 0:a634c7e3ea44 | 352 | return update_crc16_1021(crc, b); |
dominik | 0:a634c7e3ea44 | 353 | } |
dominik | 0:a634c7e3ea44 | 354 | |
dominik | 0:a634c7e3ea44 | 355 | char RFM12::Hammi_EncodeHI(char b) |
dominik | 0:a634c7e3ea44 | 356 | { |
dominik | 0:a634c7e3ea44 | 357 | return HammiEncode[b>>4]; |
dominik | 0:a634c7e3ea44 | 358 | } |
dominik | 0:a634c7e3ea44 | 359 | |
dominik | 0:a634c7e3ea44 | 360 | char RFM12::Hammi_EncodeLO(char b) |
dominik | 0:a634c7e3ea44 | 361 | { |
dominik | 0:a634c7e3ea44 | 362 | return HammiEncode[b & 0x0F]; |
dominik | 0:a634c7e3ea44 | 363 | } |
dominik | 0:a634c7e3ea44 | 364 | |
dominik | 0:a634c7e3ea44 | 365 | char RFM12::Hammi_DecodeHILO(char hi, char lo) |
dominik | 0:a634c7e3ea44 | 366 | { |
dominik | 0:a634c7e3ea44 | 367 | char b; |
dominik | 0:a634c7e3ea44 | 368 | |
dominik | 0:a634c7e3ea44 | 369 | b = (HammiDecode[hi] << 4); |
dominik | 0:a634c7e3ea44 | 370 | b+= HammiDecode[lo]; |
dominik | 0:a634c7e3ea44 | 371 | |
dominik | 0:a634c7e3ea44 | 372 | return b; |
dominik | 0:a634c7e3ea44 | 373 | } |
dominik | 0:a634c7e3ea44 | 374 | |
dominik | 0:a634c7e3ea44 | 375 | /* |
dominik | 0:a634c7e3ea44 | 376 | int RFM12::RF_PHY_Senden(string str) |
dominik | 0:a634c7e3ea44 | 377 | { |
dominik | 0:a634c7e3ea44 | 378 | if(status != LISTEN) |
dominik | 0:a634c7e3ea44 | 379 | return -1; |
dominik | 0:a634c7e3ea44 | 380 | |
dominik | 0:a634c7e3ea44 | 381 | char *s; |
dominik | 0:a634c7e3ea44 | 382 | s = new char[str.size() + 1]; |
dominik | 0:a634c7e3ea44 | 383 | |
dominik | 0:a634c7e3ea44 | 384 | strcpy(s, str.c_str()); |
dominik | 0:a634c7e3ea44 | 385 | |
dominik | 0:a634c7e3ea44 | 386 | RF_PHY_Senden(s, (int)str.size()); |
dominik | 0:a634c7e3ea44 | 387 | |
dominik | 0:a634c7e3ea44 | 388 | delete [] s; |
dominik | 0:a634c7e3ea44 | 389 | |
dominik | 0:a634c7e3ea44 | 390 | return 0; |
dominik | 0:a634c7e3ea44 | 391 | } |
dominik | 0:a634c7e3ea44 | 392 | */ |