Skip to content

Commit 711cf02

Browse files
author
Robert Tidey
committed
Add support for receiving mood and All-Off messages where
room but not device are part of the address
1 parent 71c8ec3 commit 711cf02

File tree

3 files changed

+47
-31
lines changed

3 files changed

+47
-31
lines changed

LightwaveRF433.pdf

858 Bytes
Binary file not shown.

libraries/LwRx/LwRx.cpp

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
//First byte is pair count followed by 8 byte pair addresses (device,dummy,5*addr,room)
1010
#define EEPROMaddr -1
1111

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
1318

1419
static int rx_pin = 2;
1520
static const byte rx_msglen = 10; // expected length of rx message
@@ -124,19 +129,19 @@ void rx_process_bits() {
124129
case 2: //0 160->500
125130
//nothing to do wait for next positive edge but do stats
126131
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;
130135
}
131136
break;
132137
case 3: //1 160->500
133138
// a single 1
134139
rx_buf[rx_num_bytes] = rx_buf[rx_num_bytes] << 1 | 1;
135140
rx_num_bits++;
136141
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;
140145
}
141146
break;
142147
case 5: //1 500->1500
@@ -145,9 +150,9 @@ void rx_process_bits() {
145150
rx_num_bits++;
146151
rx_num_bits++;
147152
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;
151156
}
152157
break;
153158
default:
@@ -185,14 +190,14 @@ void rx_process_bits() {
185190
if(rx_repeats == 0 || rx_repeatcount == rx_repeats) {
186191
if(rx_pairtimeout != 0) {
187192
if((currMillis - rx_pairstarttime) / 100 <= rx_pairtimeout) {
188-
if(rx_msg[3] == rx_nibble[1]) {
193+
if(rx_msg[3] == rx_cmd_on) {
189194
rx_addpairfrommsg();
190-
} else if(rx_msg[3] == rx_nibble[0]) {
195+
} else if(rx_msg[3] == rx_cmd_off) {
191196
rx_removePair(&rx_msg[2]);
192197
}
193198
}
194199
}
195-
if((!rx_pairEnforce || rx_paircount > 0) && rx_checkPairs(&rx_msg[2]) != -1) {
200+
if(rx_reportMessage()) {
196201
rx_msgcomplete = true;
197202
}
198203
rx_pairtimeout = 0;
@@ -355,16 +360,27 @@ void lwrx_setPairMode(boolean pairEnforce, boolean pairBaseOnly) {
355360
**/
356361
void lwrx_setup(int pin) {
357362
restoreEEPROMPairing();
358-
if(pin == 3) {
359-
rx_pin = pin;
360-
} else {
361-
rx_pin = 2;
362-
}
363+
rx_pin = (pin == 3) ? 3 : 2;
363364
pinMode(rx_pin,INPUT);
364365
attachInterrupt(rx_pin - 2, rx_process_bits, CHANGE);
365366
memcpy(lwrx_stats, lwrx_statsdflt, sizeof(lwrx_statsdflt));
366367
}
367368

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+
}
368384
/**
369385
Find nibble from byte
370386
returns -1 if none found
@@ -392,7 +408,7 @@ void rx_addpairfrommsg() {
392408
check and commit pair
393409
**/
394410
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) {
396412
if(EEPROMaddr >= 0) {
397413
for(byte i=0; i<8; i++) {
398414
EEPROM.write(EEPROMaddr + 1 + 8 * rx_paircount + i, rx_pairs[rx_paircount][i]);
@@ -407,9 +423,11 @@ void rx_paircommit() {
407423

408424
/**
409425
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
411429
**/
412-
int rx_checkPairs(byte *buf) {
430+
int rx_checkPairs(byte *buf, boolean allDevices ) {
413431
if(rx_paircount ==0) {
414432
return -2;
415433
} else {
@@ -421,9 +439,10 @@ int rx_checkPairs(byte *buf) {
421439
jstart = 7;
422440
jend = 2;
423441
} else {
424-
//include all in comparison
442+
//include room in comparison
425443
jstart = 8;
426-
jend = 0;
444+
//skip device comparison if allDevices true
445+
jend = (allDevices) ? 2 : 0;
427446
}
428447
while (pair>0 && j<0) {
429448
pair--;
@@ -437,19 +456,15 @@ int rx_checkPairs(byte *buf) {
437456
}
438457
}
439458
}
440-
if(j >= 0) {
441-
return pair;
442-
} else {
443-
return -1;
444-
}
459+
return (j >= 0) ? pair : -1;
445460
}
446461
}
447462

448463
/**
449464
Remove an existing pair matching the buffer
450465
**/
451466
void rx_removePair(byte *buf) {
452-
int pair = rx_checkPairs(buf);
467+
int pair = rx_checkPairs(buf, false);
453468
if(pair >= 0) {
454469
while (pair < rx_paircount - 1) {
455470
for(byte j=0; j<8;j++) {
@@ -467,7 +482,6 @@ void rx_removePair(byte *buf) {
467482
}
468483
}
469484

470-
471485
/**
472486
Retrieve and set up pairing data from EEPROM if used
473487
**/

libraries/LwRx/LwRx.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,11 @@ extern boolean lwrx_getstats(unsigned int* stats);
6262
//Enable collection of stats on pulse timings
6363
extern void lwrx_setstatsenable(boolean rx_stats_enable);
6464

65+
//internal support functions
66+
boolean rx_reportMessage();
6567
int rx_findNibble(byte data);
6668
void rx_addpairfrommsg();
6769
void rx_paircommit();
6870
void rx_removePair(byte *buf);
69-
int rx_checkPairs(byte *buf);
71+
int rx_checkPairs(byte *buf, boolean allDevices);
7072
void restoreEEPROMPairing();

0 commit comments

Comments
 (0)