9
9
// First byte is pair count followed by 8 byte pair addresses (device,dummy,5*addr,room)
10
10
#define EEPROMaddr -1
11
11
12
- static byte rx_nibble[] = {0xF6 ,0xEE ,0xED ,0xEB ,0xDE ,0xDD ,0xDB ,0xBE ,0xBD ,0xBB ,0xB7 ,0x7E ,0x7D ,0x7B ,0x77 ,0x6F };
12
+ static const byte rx_nibble[] = {0xF6 ,0xEE ,0xED ,0xEB ,0xDE ,0xDD ,0xDB ,0xBE ,0xBD ,0xBB ,0xB7 ,0x7E ,0x7D ,0x7B ,0x77 ,0x6F };
13
+ static const byte rx_cmd_off = 0xF6 ; // raw 0
14
+ static const byte rx_cmd_on = 0xEE ; // raw 1
15
+ static const byte rx_cmd_mood = 0xED ; // raw 2
16
+ static const byte rx_par0_alloff = 0x7D ; // param 192-255 all off (12 in msb)
17
+ static const byte rx_dev_15 = 0x6F ; // device 15
13
18
14
19
static int rx_pin = 2 ;
15
20
static const byte rx_msglen = 10 ; // expected length of rx message
@@ -124,19 +129,19 @@ void rx_process_bits() {
124
129
case 2 : // 0 160->500
125
130
// nothing to do wait for next positive edge but do stats
126
131
if (lwrx_stats_enable) {
127
- lwrx_stats[rx_stat_high_max] = max (lwrx_stats[rx_stat_high_max], dur);
128
- lwrx_stats[rx_stat_high_min] = min (lwrx_stats[rx_stat_high_min], dur);
129
- lwrx_stats[rx_stat_high_ave] = lwrx_stats[rx_stat_high_ave] - (lwrx_stats[rx_stat_high_ave] >> 4 ) + dur;
132
+ lwrx_stats[rx_stat_high_max] = max (lwrx_stats[rx_stat_high_max], dur);
133
+ lwrx_stats[rx_stat_high_min] = min (lwrx_stats[rx_stat_high_min], dur);
134
+ lwrx_stats[rx_stat_high_ave] = lwrx_stats[rx_stat_high_ave] - (lwrx_stats[rx_stat_high_ave] >> 4 ) + dur;
130
135
}
131
136
break ;
132
137
case 3 : // 1 160->500
133
138
// a single 1
134
139
rx_buf[rx_num_bytes] = rx_buf[rx_num_bytes] << 1 | 1 ;
135
140
rx_num_bits++;
136
141
if (lwrx_stats_enable) {
137
- lwrx_stats[rx_stat_low1_max] = max (lwrx_stats[rx_stat_low1_max], dur);
138
- lwrx_stats[rx_stat_low1_min] = min (lwrx_stats[rx_stat_low1_min], dur);
139
- lwrx_stats[rx_stat_low1_ave] = lwrx_stats[rx_stat_low1_ave] - (lwrx_stats[rx_stat_low1_ave] >> 4 ) + dur;
142
+ lwrx_stats[rx_stat_low1_max] = max (lwrx_stats[rx_stat_low1_max], dur);
143
+ lwrx_stats[rx_stat_low1_min] = min (lwrx_stats[rx_stat_low1_min], dur);
144
+ lwrx_stats[rx_stat_low1_ave] = lwrx_stats[rx_stat_low1_ave] - (lwrx_stats[rx_stat_low1_ave] >> 4 ) + dur;
140
145
}
141
146
break ;
142
147
case 5 : // 1 500->1500
@@ -145,9 +150,9 @@ void rx_process_bits() {
145
150
rx_num_bits++;
146
151
rx_num_bits++;
147
152
if (lwrx_stats_enable) {
148
- lwrx_stats[rx_stat_low0_max] = max (lwrx_stats[rx_stat_low0_max], dur);
149
- lwrx_stats[rx_stat_low0_min] = min (lwrx_stats[rx_stat_low0_min], dur);
150
- lwrx_stats[rx_stat_low0_ave] = lwrx_stats[rx_stat_low0_ave] - (lwrx_stats[rx_stat_low0_ave] >> 4 ) + dur;
153
+ lwrx_stats[rx_stat_low0_max] = max (lwrx_stats[rx_stat_low0_max], dur);
154
+ lwrx_stats[rx_stat_low0_min] = min (lwrx_stats[rx_stat_low0_min], dur);
155
+ lwrx_stats[rx_stat_low0_ave] = lwrx_stats[rx_stat_low0_ave] - (lwrx_stats[rx_stat_low0_ave] >> 4 ) + dur;
151
156
}
152
157
break ;
153
158
default :
@@ -185,14 +190,14 @@ void rx_process_bits() {
185
190
if (rx_repeats == 0 || rx_repeatcount == rx_repeats) {
186
191
if (rx_pairtimeout != 0 ) {
187
192
if ((currMillis - rx_pairstarttime) / 100 <= rx_pairtimeout) {
188
- if (rx_msg[3 ] == rx_nibble[ 1 ] ) {
193
+ if (rx_msg[3 ] == rx_cmd_on ) {
189
194
rx_addpairfrommsg ();
190
- } else if (rx_msg[3 ] == rx_nibble[ 0 ] ) {
195
+ } else if (rx_msg[3 ] == rx_cmd_off ) {
191
196
rx_removePair (&rx_msg[2 ]);
192
197
}
193
198
}
194
199
}
195
- if ((!rx_pairEnforce || rx_paircount > 0 ) && rx_checkPairs (&rx_msg[ 2 ]) != - 1 ) {
200
+ if (rx_reportMessage () ) {
196
201
rx_msgcomplete = true ;
197
202
}
198
203
rx_pairtimeout = 0 ;
@@ -355,16 +360,27 @@ void lwrx_setPairMode(boolean pairEnforce, boolean pairBaseOnly) {
355
360
**/
356
361
void lwrx_setup (int pin) {
357
362
restoreEEPROMPairing ();
358
- if (pin == 3 ) {
359
- rx_pin = pin;
360
- } else {
361
- rx_pin = 2 ;
362
- }
363
+ rx_pin = (pin == 3 ) ? 3 : 2 ;
363
364
pinMode (rx_pin,INPUT);
364
365
attachInterrupt (rx_pin - 2 , rx_process_bits, CHANGE);
365
366
memcpy (lwrx_stats, lwrx_statsdflt, sizeof (lwrx_statsdflt));
366
367
}
367
368
369
+ /* *
370
+ Check a message to see if it should be reported under pairing / mood / all off rules
371
+ returns -1 if none found
372
+ **/
373
+ boolean rx_reportMessage () {
374
+ if (rx_pairEnforce && rx_paircount == 0 ) {
375
+ return false ;
376
+ } else {
377
+ boolean allDevices;
378
+ // True if mood to device 15 or Off cmd with Allof paramater
379
+ allDevices = ((rx_msg[3 ] == rx_cmd_mood && rx_msg[2 ] == rx_dev_15) ||
380
+ (rx_msg[3 ] == rx_cmd_off && rx_msg[0 ] == rx_par0_alloff));
381
+ return (rx_checkPairs (&rx_msg[2 ], allDevices) != -1 );
382
+ }
383
+ }
368
384
/* *
369
385
Find nibble from byte
370
386
returns -1 if none found
@@ -392,7 +408,7 @@ void rx_addpairfrommsg() {
392
408
check and commit pair
393
409
**/
394
410
void rx_paircommit () {
395
- if (rx_paircount == 0 || rx_checkPairs (rx_pairs[rx_paircount]) < 0 ) {
411
+ if (rx_paircount == 0 || rx_checkPairs (rx_pairs[rx_paircount], false ) < 0 ) {
396
412
if (EEPROMaddr >= 0 ) {
397
413
for (byte i=0 ; i<8 ; i++) {
398
414
EEPROM.write (EEPROMaddr + 1 + 8 * rx_paircount + i, rx_pairs[rx_paircount][i]);
@@ -407,9 +423,11 @@ void rx_paircommit() {
407
423
408
424
/* *
409
425
Check to see if message matches one of the pairs
410
- Returns matching pair number, -1 if not found, -2 if no pairs
426
+ if mode is pairBase only then ignore device and room
427
+ if allDevices is true then ignore the device number
428
+ Returns matching pair number, -1 if not found, -2 if no pairs defined
411
429
**/
412
- int rx_checkPairs (byte *buf) {
430
+ int rx_checkPairs (byte *buf, boolean allDevices ) {
413
431
if (rx_paircount ==0 ) {
414
432
return -2 ;
415
433
} else {
@@ -421,9 +439,10 @@ int rx_checkPairs(byte *buf) {
421
439
jstart = 7 ;
422
440
jend = 2 ;
423
441
} else {
424
- // include all in comparison
442
+ // include room in comparison
425
443
jstart = 8 ;
426
- jend = 0 ;
444
+ // skip device comparison if allDevices true
445
+ jend = (allDevices) ? 2 : 0 ;
427
446
}
428
447
while (pair>0 && j<0 ) {
429
448
pair--;
@@ -437,19 +456,15 @@ int rx_checkPairs(byte *buf) {
437
456
}
438
457
}
439
458
}
440
- if (j >= 0 ) {
441
- return pair;
442
- } else {
443
- return -1 ;
444
- }
459
+ return (j >= 0 ) ? pair : -1 ;
445
460
}
446
461
}
447
462
448
463
/* *
449
464
Remove an existing pair matching the buffer
450
465
**/
451
466
void rx_removePair (byte *buf) {
452
- int pair = rx_checkPairs (buf);
467
+ int pair = rx_checkPairs (buf, false );
453
468
if (pair >= 0 ) {
454
469
while (pair < rx_paircount - 1 ) {
455
470
for (byte j=0 ; j<8 ;j++) {
@@ -467,7 +482,6 @@ void rx_removePair(byte *buf) {
467
482
}
468
483
}
469
484
470
-
471
485
/* *
472
486
Retrieve and set up pairing data from EEPROM if used
473
487
**/
0 commit comments