Class to communicate with ELV(R) MAX! wireless devices with RFM22B-Modules. Based on Library RF22. Initial version unable to send! Only receive! See http://mbed.org/users/charly/notebook/reading-a-max-wireless-window-sensor-with-rfm22-an/

Dependents:   RF22_MAX_test_Send

Committer:
charly
Date:
Tue Oct 22 19:41:52 2013 +0000
Revision:
2:f75e51ce001b
Parent:
0:565a81d6f278
Changes for Sending Messages

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charly 2:f75e51ce001b 1 //show debug output on Serial pc
charly 2:f75e51ce001b 2 #define DEBUG
charly 2:f75e51ce001b 3
charly 0:565a81d6f278 4 #include "mbed.h"
charly 0:565a81d6f278 5 #include <RF22Max.h>
charly 0:565a81d6f278 6
charly 0:565a81d6f278 7
charly 0:565a81d6f278 8 RF22Max::RF22Max(PinName slaveSelectPin, PinName mosi, PinName miso, PinName sclk, PinName interrupt)
charly 0:565a81d6f278 9 : RF22(slaveSelectPin , mosi, miso, sclk, interrupt )
charly 0:565a81d6f278 10 {
charly 0:565a81d6f278 11 }
charly 0:565a81d6f278 12
charly 0:565a81d6f278 13 static const RF22::ModemConfig max_config = { // for MAX! protocol
charly 2:f75e51ce001b 14 .reg_1c = 0x01, //POR-Value : 75KHzBW?
charly 2:f75e51ce001b 15 .reg_1f = 0x03, //POR-Value:
charly 2:f75e51ce001b 16 .reg_20 = 0x90, //?? Oversampling Rate
charly 0:565a81d6f278 17 .reg_21 = 0x20,
charly 0:565a81d6f278 18 .reg_22 = 0x51,
charly 0:565a81d6f278 19 .reg_23 = 0xea,
charly 0:565a81d6f278 20 .reg_24 = 0x00,
charly 0:565a81d6f278 21 .reg_25 = 0x58,
charly 0:565a81d6f278 22 // 2c - 2e are only for OOK
charly 0:565a81d6f278 23 .reg_2c = 0x00,
charly 0:565a81d6f278 24 .reg_2d = 0x00,
charly 0:565a81d6f278 25 .reg_2e = 0x00,
charly 0:565a81d6f278 26 .reg_58 = 0x80, // Copied from RF22 defaults
charly 0:565a81d6f278 27 .reg_69 = 0x60, // Copied from RF22 defaults
charly 2:f75e51ce001b 28 //.reg_6e = 0x08, // TX Data Rate 1
charly 2:f75e51ce001b 29 //.reg_6f = 0x31, // TX Data Rate 0
charly 2:f75e51ce001b 30 .reg_6e = 0x51, // TX Data Rate 1
charly 2:f75e51ce001b 31 .reg_6f = 0xDC, // TX Data Rate 0
charly 2:f75e51ce001b 32 .reg_70 = 0x20, //<30kps,no manchaster, no dewithening
charly 2:f75e51ce001b 33 .reg_71 = RF22_DTMOD_FIFO | RF22_MODTYP_FSK, //=0x22
charly 0:565a81d6f278 34 .reg_72 = 0x1e,
charly 0:565a81d6f278 35 };
charly 0:565a81d6f278 36
charly 0:565a81d6f278 37
charly 0:565a81d6f278 38 /* Sync words to send / check for. Don't forget to update RF22_SYNCLEN
charly 0:565a81d6f278 39 * below if changing the length of this array. */
charly 0:565a81d6f278 40
charly 0:565a81d6f278 41 const uint8_t max_sync_words[] = {
charly 0:565a81d6f278 42 0xc6,
charly 0:565a81d6f278 43 0x26,
charly 0:565a81d6f278 44 0xc6,
charly 0:565a81d6f278 45 0x26,
charly 0:565a81d6f278 46 };
charly 0:565a81d6f278 47
charly 0:565a81d6f278 48
charly 0:565a81d6f278 49 enum modes {MODE_AUTO, MODE_MANUAL, MODE_TEMPORARY, MODE_BOOST};
charly 0:565a81d6f278 50
charly 0:565a81d6f278 51 const char *mode_str[] = {
charly 0:565a81d6f278 52 [MODE_AUTO] = "auto",
charly 0:565a81d6f278 53 [MODE_MANUAL] = "manual",
charly 0:565a81d6f278 54 [MODE_TEMPORARY] = "temporary",
charly 0:565a81d6f278 55 [MODE_BOOST] = "boost"
charly 0:565a81d6f278 56 };
charly 0:565a81d6f278 57
charly 0:565a81d6f278 58 char *type_str(uint8_t type)
charly 0:565a81d6f278 59 {
charly 0:565a81d6f278 60 switch(type) {
charly 0:565a81d6f278 61 case 0x00:
charly 0:565a81d6f278 62 return "PairPing";
charly 0:565a81d6f278 63 case 0x01:
charly 0:565a81d6f278 64 return "PairPong";
charly 0:565a81d6f278 65 case 0x02:
charly 0:565a81d6f278 66 return "Ack";
charly 0:565a81d6f278 67 case 0x03:
charly 0:565a81d6f278 68 return "TimeInformation";
charly 0:565a81d6f278 69 case 0x10:
charly 0:565a81d6f278 70 return "ConfigWeekProfile";
charly 0:565a81d6f278 71 case 0x11:
charly 0:565a81d6f278 72 return "ConfigTemperatures";
charly 0:565a81d6f278 73 case 0x12:
charly 0:565a81d6f278 74 return "ConfigValve";
charly 0:565a81d6f278 75 case 0x20:
charly 0:565a81d6f278 76 return "AddLinkPartner";
charly 0:565a81d6f278 77 case 0x21:
charly 0:565a81d6f278 78 return "RemoveLinkPartner";
charly 0:565a81d6f278 79 case 0x22:
charly 0:565a81d6f278 80 return "SetGroupId";
charly 0:565a81d6f278 81 case 0x23:
charly 0:565a81d6f278 82 return "RemoveGroupId";
charly 0:565a81d6f278 83 case 0x30:
charly 0:565a81d6f278 84 return "ShutterContactState";
charly 0:565a81d6f278 85 case 0x40:
charly 0:565a81d6f278 86 return "SetTemperature";
charly 0:565a81d6f278 87 case 0x42:
charly 0:565a81d6f278 88 return "WallThermostatState";
charly 0:565a81d6f278 89 case 0x43:
charly 0:565a81d6f278 90 return "SetComfortTemperature";
charly 0:565a81d6f278 91 case 0x44:
charly 0:565a81d6f278 92 return "SetEcoTemperature";
charly 0:565a81d6f278 93 case 0x50:
charly 0:565a81d6f278 94 return "PushButtonState";
charly 0:565a81d6f278 95 case 0x60:
charly 0:565a81d6f278 96 return "ThermostatState";
charly 0:565a81d6f278 97 case 0x82:
charly 0:565a81d6f278 98 return "SetDisplayActualTemperature";
charly 0:565a81d6f278 99 case 0xF1:
charly 0:565a81d6f278 100 return "WakeUp";
charly 0:565a81d6f278 101 case 0xF0:
charly 0:565a81d6f278 102 return "Reset";
charly 0:565a81d6f278 103 }
charly 0:565a81d6f278 104 return "Unknown";
charly 0:565a81d6f278 105 };
charly 0:565a81d6f278 106
charly 0:565a81d6f278 107
charly 0:565a81d6f278 108 /* First 255 bytes of PN9 sequence used for data whitening by the CC1101
charly 0:565a81d6f278 109 chip. The RF22 chip is documented to support the same data whitening
charly 0:565a81d6f278 110 algorithm, but in practice seems to use a different sequence.
charly 0:565a81d6f278 111
charly 0:565a81d6f278 112 Data was generated using the following python snippet:
charly 0:565a81d6f278 113
charly 0:565a81d6f278 114 import itertools
charly 0:565a81d6f278 115 def pn9(state):
charly 0:565a81d6f278 116 while True:
charly 0:565a81d6f278 117 yield hex(state & 0xff)
charly 0:565a81d6f278 118 # The pn9 generator is clocked 8 times while shifting in the
charly 0:565a81d6f278 119 # next data byte
charly 0:565a81d6f278 120 for i in range(8):
charly 0:565a81d6f278 121 state = (state >> 1) + (((state & 1) ^ (state >> 5) & 1) << 8)
charly 0:565a81d6f278 122 print(list(itertools.islice(pn9(0x1ff), 255)))
charly 0:565a81d6f278 123 */
charly 0:565a81d6f278 124
charly 0:565a81d6f278 125 const uint8_t pn9[] = {
charly 0:565a81d6f278 126 0xff, 0xe1, 0x1d, 0x9a, 0xed, 0x85, 0x33, 0x24,
charly 0:565a81d6f278 127 0xea, 0x7a, 0xd2, 0x39, 0x70, 0x97, 0x57, 0x0a,
charly 0:565a81d6f278 128 0x54, 0x7d, 0x2d, 0xd8, 0x6d, 0x0d, 0xba, 0x8f,
charly 0:565a81d6f278 129 0x67, 0x59, 0xc7, 0xa2, 0xbf, 0x34, 0xca, 0x18,
charly 0:565a81d6f278 130 0x30, 0x53, 0x93, 0xdf, 0x92, 0xec, 0xa7, 0x15,
charly 0:565a81d6f278 131 0x8a, 0xdc, 0xf4, 0x86, 0x55, 0x4e, 0x18, 0x21,
charly 0:565a81d6f278 132 0x40, 0xc4, 0xc4, 0xd5, 0xc6, 0x91, 0x8a, 0xcd,
charly 0:565a81d6f278 133 0xe7, 0xd1, 0x4e, 0x09, 0x32, 0x17, 0xdf, 0x83,
charly 0:565a81d6f278 134 0xff, 0xf0, 0x0e, 0xcd, 0xf6, 0xc2, 0x19, 0x12,
charly 0:565a81d6f278 135 0x75, 0x3d, 0xe9, 0x1c, 0xb8, 0xcb, 0x2b, 0x05,
charly 0:565a81d6f278 136 0xaa, 0xbe, 0x16, 0xec, 0xb6, 0x06, 0xdd, 0xc7,
charly 0:565a81d6f278 137 0xb3, 0xac, 0x63, 0xd1, 0x5f, 0x1a, 0x65, 0x0c,
charly 0:565a81d6f278 138 0x98, 0xa9, 0xc9, 0x6f, 0x49, 0xf6, 0xd3, 0x0a,
charly 0:565a81d6f278 139 0x45, 0x6e, 0x7a, 0xc3, 0x2a, 0x27, 0x8c, 0x10,
charly 0:565a81d6f278 140 0x20, 0x62, 0xe2, 0x6a, 0xe3, 0x48, 0xc5, 0xe6,
charly 0:565a81d6f278 141 0xf3, 0x68, 0xa7, 0x04, 0x99, 0x8b, 0xef, 0xc1,
charly 0:565a81d6f278 142 0x7f, 0x78, 0x87, 0x66, 0x7b, 0xe1, 0x0c, 0x89,
charly 0:565a81d6f278 143 0xba, 0x9e, 0x74, 0x0e, 0xdc, 0xe5, 0x95, 0x02,
charly 0:565a81d6f278 144 0x55, 0x5f, 0x0b, 0x76, 0x5b, 0x83, 0xee, 0xe3,
charly 0:565a81d6f278 145 0x59, 0xd6, 0xb1, 0xe8, 0x2f, 0x8d, 0x32, 0x06,
charly 0:565a81d6f278 146 0xcc, 0xd4, 0xe4, 0xb7, 0x24, 0xfb, 0x69, 0x85,
charly 0:565a81d6f278 147 0x22, 0x37, 0xbd, 0x61, 0x95, 0x13, 0x46, 0x08,
charly 0:565a81d6f278 148 0x10, 0x31, 0x71, 0xb5, 0x71, 0xa4, 0x62, 0xf3,
charly 0:565a81d6f278 149 0x79, 0xb4, 0x53, 0x82, 0xcc, 0xc5, 0xf7, 0xe0,
charly 0:565a81d6f278 150 0x3f, 0xbc, 0x43, 0xb3, 0xbd, 0x70, 0x86, 0x44,
charly 0:565a81d6f278 151 0x5d, 0x4f, 0x3a, 0x07, 0xee, 0xf2, 0x4a, 0x81,
charly 0:565a81d6f278 152 0xaa, 0xaf, 0x05, 0xbb, 0xad, 0x41, 0xf7, 0xf1,
charly 0:565a81d6f278 153 0x2c, 0xeb, 0x58, 0xf4, 0x97, 0x46, 0x19, 0x03,
charly 0:565a81d6f278 154 0x66, 0x6a, 0xf2, 0x5b, 0x92, 0xfd, 0xb4, 0x42,
charly 0:565a81d6f278 155 0x91, 0x9b, 0xde, 0xb0, 0xca, 0x09, 0x23, 0x04,
charly 0:565a81d6f278 156 0x88, 0x98, 0xb8, 0xda, 0x38, 0x52, 0xb1, 0xf9,
charly 0:565a81d6f278 157 0x3c, 0xda, 0x29, 0x41, 0xe6, 0xe2, 0x7b
charly 0:565a81d6f278 158 };
charly 0:565a81d6f278 159
charly 0:565a81d6f278 160 #ifdef DEBUG
charly 0:565a81d6f278 161 void RF22Max::printHex(uint8_t *buf, size_t len, bool nl)
charly 0:565a81d6f278 162 {
charly 0:565a81d6f278 163 for (size_t i = 0; i < len; i++) {
charly 0:565a81d6f278 164 pc.printf("%02X ",buf[i]);
charly 0:565a81d6f278 165 }
charly 0:565a81d6f278 166 if (nl)
charly 0:565a81d6f278 167 pc.printf("\n\r");
charly 0:565a81d6f278 168 }
charly 0:565a81d6f278 169 #endif
charly 0:565a81d6f278 170
charly 0:565a81d6f278 171 boolean RF22Max::init()
charly 0:565a81d6f278 172 {
charly 0:565a81d6f278 173 boolean ret = this->RF22::init();
charly 0:565a81d6f278 174 if (ret) {
charly 0:565a81d6f278 175 //Max! specific settings
charly 0:565a81d6f278 176 this->RF22::setModemRegisters(&max_config);
charly 2:f75e51ce001b 177 this->RF22::setFrequency(868.299866, 0.035);
charly 0:565a81d6f278 178 /* Disable TX packet control, since the RF22 doesn't do proper
charly 0:565a81d6f278 179 * whitening so can't read the length header or CRC. We need RX packet
charly 0:565a81d6f278 180 * control so the RF22 actually sends pkvalid interrupts when the
charly 0:565a81d6f278 181 * manually set packet length is reached. */
charly 0:565a81d6f278 182 this->RF22::spiWrite(RF22_REG_30_DATA_ACCESS_CONTROL, RF22_MSBFRST | RF22_ENPACRX);
charly 0:565a81d6f278 183 /* No packet headers, 4 sync words, fixed packet length */
charly 0:565a81d6f278 184 this->RF22::spiWrite(RF22_REG_32_HEADER_CONTROL1, RF22_BCEN_NONE | RF22_HDCH_NONE);
charly 0:565a81d6f278 185 this->RF22::spiWrite(RF22_REG_33_HEADER_CONTROL2, RF22_HDLEN_0 | RF22_FIXPKLEN | RF22_SYNCLEN_4);
charly 0:565a81d6f278 186 this->RF22::setSyncWords(max_sync_words, lengthof(max_sync_words));
charly 0:565a81d6f278 187 /* Detect preamble after 4 nibbles */
charly 0:565a81d6f278 188 this->RF22::spiWrite(RF22_REG_35_PREAMBLE_DETECTION_CONTROL1, (0x4 << 3));
charly 2:f75e51ce001b 189 /* Send 4 nibbles of preamble */
charly 2:f75e51ce001b 190 this->RF22::setPreambleLength(4); // in nibbles
charly 0:565a81d6f278 191 this->RF22::spiWrite(RF22_REG_3E_PACKET_LENGTH, 30); // maximum length of a MAX!-packet
charly 0:565a81d6f278 192 }
charly 0:565a81d6f278 193 return ret;
charly 0:565a81d6f278 194 }
charly 0:565a81d6f278 195
charly 0:565a81d6f278 196 /*
charly 0:565a81d6f278 197 CRC code based on example from Texas Instruments DN502, matches
charly 0:565a81d6f278 198 CC1101 implementation
charly 0:565a81d6f278 199 */
charly 0:565a81d6f278 200 #define CRC16_POLY 0x8005
charly 0:565a81d6f278 201 uint16_t RF22Max::calc_crc_step(uint8_t crcData, uint16_t crcReg)
charly 0:565a81d6f278 202 {
charly 0:565a81d6f278 203 uint8_t i;
charly 0:565a81d6f278 204 for (i = 0; i < 8; i++) {
charly 0:565a81d6f278 205 if (((crcReg & 0x8000) >> 8) ^ (crcData & 0x80))
charly 0:565a81d6f278 206 crcReg = (crcReg << 1) ^ CRC16_POLY;
charly 0:565a81d6f278 207 else
charly 0:565a81d6f278 208 crcReg = (crcReg << 1);
charly 0:565a81d6f278 209 crcData <<= 1;
charly 0:565a81d6f278 210 }
charly 0:565a81d6f278 211 return crcReg;
charly 0:565a81d6f278 212 } // culCalcCRC
charly 0:565a81d6f278 213
charly 0:565a81d6f278 214 #define CRC_INIT 0xFFFF
charly 0:565a81d6f278 215 uint16_t RF22Max::calc_crc(uint8_t *buf, size_t len)
charly 0:565a81d6f278 216 {
charly 0:565a81d6f278 217 uint16_t checksum;
charly 0:565a81d6f278 218 checksum = CRC_INIT;
charly 0:565a81d6f278 219 // Init value for CRC calculation
charly 0:565a81d6f278 220 for (size_t i = 0; i < len; i++)
charly 0:565a81d6f278 221 checksum = calc_crc_step(buf[i], checksum);
charly 0:565a81d6f278 222 return checksum;
charly 0:565a81d6f278 223 }
charly 0:565a81d6f278 224
charly 0:565a81d6f278 225
charly 0:565a81d6f278 226 boolean RF22Max::recv(uint8_t* buf, uint8_t* len)
charly 0:565a81d6f278 227 {
charly 0:565a81d6f278 228
charly 0:565a81d6f278 229 if (RF22::recv(buf, len)) {
charly 0:565a81d6f278 230 *len = 50; // limit message to 50 Bytes as device receives all 255 Bytes
charly 0:565a81d6f278 231
charly 0:565a81d6f278 232 /* Dewhiten data */
charly 0:565a81d6f278 233 for (int i = 0; i < *len; i++)
charly 0:565a81d6f278 234 buf[i] ^= pn9[i];
charly 0:565a81d6f278 235
charly 0:565a81d6f278 236 // now read the real length
charly 0:565a81d6f278 237 *len = buf[0]+3; // 1 length-Byte + 2 CRC
charly 0:565a81d6f278 238
charly 0:565a81d6f278 239 if (*len < 3 || *len > lengthof(pn9)) {
charly 0:565a81d6f278 240 #ifdef DEBUG
charly 0:565a81d6f278 241 printHex(buf, *len, true);
charly 0:565a81d6f278 242 #endif
charly 0:565a81d6f278 243 return false;
charly 0:565a81d6f278 244 }
charly 0:565a81d6f278 245 #ifdef DEBUG
charly 0:565a81d6f278 246 printHex(buf, *len, true);
charly 0:565a81d6f278 247 #endif
charly 0:565a81d6f278 248 return true;
charly 0:565a81d6f278 249 } else
charly 0:565a81d6f278 250 return false;
charly 0:565a81d6f278 251 }
charly 0:565a81d6f278 252
charly 0:565a81d6f278 253 boolean RF22Max::recv_max(RF22Max::max_message* message)
charly 0:565a81d6f278 254 {
charly 0:565a81d6f278 255 uint8_t buf[RF22_MAX_MESSAGE_LEN];
charly 0:565a81d6f278 256
charly 0:565a81d6f278 257 uint8_t len = sizeof(buf);
charly 0:565a81d6f278 258
charly 0:565a81d6f278 259 message->len = 0;
charly 0:565a81d6f278 260
charly 0:565a81d6f278 261 if (recv(buf,&len)) {
charly 0:565a81d6f278 262
charly 0:565a81d6f278 263 /* Calculate CRC (but don't include the CRC itself) */
charly 0:565a81d6f278 264 uint16_t crc = calc_crc(buf, len - 2);
charly 0:565a81d6f278 265 if (buf[len - 1] != (crc & 0xff) || buf[len - 2] != (crc >> 8)) {
charly 0:565a81d6f278 266
charly 0:565a81d6f278 267 return false;
charly 0:565a81d6f278 268 }
charly 0:565a81d6f278 269
charly 0:565a81d6f278 270 /* Don't use the CRC as data */
charly 0:565a81d6f278 271 len -= 2;
charly 0:565a81d6f278 272
charly 0:565a81d6f278 273 message->len = len; //message-length
charly 0:565a81d6f278 274 message->cnt = buf[1]; //message-counter
charly 0:565a81d6f278 275 message->flags = buf[2];
charly 0:565a81d6f278 276 message->type = buf[3];
charly 0:565a81d6f278 277 strcpy(message->type_str,type_str(message->type));
charly 0:565a81d6f278 278 message->frm_adr = buf[4]<<16 | buf[5]<<8| buf[6]; // unique address of device
charly 0:565a81d6f278 279 message->to_adr = buf[7]<<16 | buf[8]<<8| buf[9]; ; // unique address of device
charly 0:565a81d6f278 280 message->groupid = buf[10]; //groupid
charly 0:565a81d6f278 281 memcpy( (void *) message->payload, (void *) buf[11],len-11); // data
charly 0:565a81d6f278 282 message->crc = buf[len-2]<<8 | buf[len-1]; // crc for the message
charly 0:565a81d6f278 283
charly 0:565a81d6f278 284 if (message->type == 0x30 && len >= 11) { //ShutterContactState
charly 0:565a81d6f278 285 bool baterry_low = (buf[11] >> 7) & 0x1;
charly 0:565a81d6f278 286 bool state = (buf[11]>>1) & 0x1;
charly 0:565a81d6f278 287
charly 0:565a81d6f278 288 if (state) {
charly 0:565a81d6f278 289 strcpy(message->state,"open");
charly 0:565a81d6f278 290 } else {
charly 0:565a81d6f278 291 strcpy(message->state,"closed");
charly 0:565a81d6f278 292 }
charly 0:565a81d6f278 293
charly 0:565a81d6f278 294 if (baterry_low) {
charly 0:565a81d6f278 295 strcpy(message->battery_state,"low");
charly 0:565a81d6f278 296 } else {
charly 0:565a81d6f278 297 strcpy(message->battery_state,"good");
charly 0:565a81d6f278 298 }
charly 0:565a81d6f278 299 }
charly 0:565a81d6f278 300
charly 0:565a81d6f278 301 if (message->type == 0x50 && len >= 11) { //PushButtonState
charly 0:565a81d6f278 302 bool baterry_low = (buf[11] >> 7) & 0x1; // to validate!!!
charly 0:565a81d6f278 303 bool state = (buf[12]) & 0x1;
charly 0:565a81d6f278 304
charly 0:565a81d6f278 305 if (state) {
charly 0:565a81d6f278 306 strcpy(message->state,"auto");
charly 0:565a81d6f278 307 } else {
charly 0:565a81d6f278 308 strcpy(message->state,"eco");
charly 0:565a81d6f278 309 }
charly 0:565a81d6f278 310
charly 0:565a81d6f278 311 if (baterry_low) {
charly 0:565a81d6f278 312 strcpy(message->battery_state,"low");
charly 0:565a81d6f278 313 } else {
charly 0:565a81d6f278 314 strcpy(message->battery_state,"good");
charly 0:565a81d6f278 315 }
charly 0:565a81d6f278 316
charly 0:565a81d6f278 317 }
charly 2:f75e51ce001b 318 #if 0
charly 2:f75e51ce001b 319 if (message->type == 0x00 && len >= 11) { //PairPing
charly 2:f75e51ce001b 320 char serial[20]="";
charly 2:f75e51ce001b 321 uint8_t sbuf[RF22_MAX_MESSAGE_LEN];
charly 2:f75e51ce001b 322 uint8_t slen =0;
charly 2:f75e51ce001b 323
charly 2:f75e51ce001b 324 strncpy(serial,(char*)buf+14,10); //10 Characters for Seial Number
charly 2:f75e51ce001b 325 serial[11] = '\0';
charly 2:f75e51ce001b 326 #ifdef DEBUG
charly 2:f75e51ce001b 327 pc.printf("Serial: %s\n\r",serial);
charly 2:f75e51ce001b 328 #endif
charly 2:f75e51ce001b 329
charly 2:f75e51ce001b 330 // try to send PairPong
charly 2:f75e51ce001b 331 // wait some time
charly 2:f75e51ce001b 332 wait_ms(20); // seen at moritz-code
charly 2:f75e51ce001b 333 sbuf[0] = 11; // MsgLen
charly 2:f75e51ce001b 334 sbuf[1] = buf[1]+1 &0xFF; // MsgCount ??
charly 2:f75e51ce001b 335 sbuf[2] = 0x00; // Flag
charly 2:f75e51ce001b 336 sbuf[3] = 0x01; // Type = Cmd = PairPong
charly 2:f75e51ce001b 337 sbuf[4] = 0x11; // From Fake Address
charly 2:f75e51ce001b 338 sbuf[5] = 0x11; // From
charly 2:f75e51ce001b 339 sbuf[6] = 0x11; // From
charly 2:f75e51ce001b 340 sbuf[7] = buf[4] ; // To Address = From address of Windowcontact
charly 2:f75e51ce001b 341 sbuf[8] = buf[5] ;
charly 2:f75e51ce001b 342 sbuf[9] = buf[6] ;
charly 2:f75e51ce001b 343 sbuf[10] = 0x00; // GroupId
charly 2:f75e51ce001b 344 sbuf[11] = 0x00; //Payload is 0x00 for pairpong?
charly 2:f75e51ce001b 345 slen = 12+2; //+2Byte CRC????
charly 2:f75e51ce001b 346 /* Calculate CRC */
charly 2:f75e51ce001b 347 uint16_t scrc = calc_crc(sbuf, slen - 2);
charly 2:f75e51ce001b 348 sbuf[12] = crc >> 8;
charly 2:f75e51ce001b 349 sbuf[13] = crc & 0xff;
charly 2:f75e51ce001b 350
charly 2:f75e51ce001b 351
charly 2:f75e51ce001b 352 if (RF22::send(sbuf,slen)) {
charly 2:f75e51ce001b 353 #ifdef DEBUG
charly 2:f75e51ce001b 354 pc.printf("Send PairPong OK\n\r");
charly 2:f75e51ce001b 355 #endif
charly 2:f75e51ce001b 356 } else {
charly 2:f75e51ce001b 357 #ifdef DEBUG
charly 2:f75e51ce001b 358 pc.printf("Send PairPong NOT OK\n\r");
charly 2:f75e51ce001b 359 #endif
charly 2:f75e51ce001b 360 }
charly 2:f75e51ce001b 361
charly 2:f75e51ce001b 362 }
charly 2:f75e51ce001b 363 #endif
charly 0:565a81d6f278 364 return true;
charly 0:565a81d6f278 365 } else
charly 0:565a81d6f278 366 return false;
charly 0:565a81d6f278 367 }