BayEOSArduino Library
RF24Relais.h
1 #include <BayEOSBuffer.h>
2 #include <BayEOSBufferRAM.h>
3 #include <BayEOS.h>
4 #include <BayEOSCommands.h>
5 #include <RF24.h>
6 #include <BayRF24.h>
7 
8 #ifdef __AVR_ATmega168P__
9 uint8_t buffer[100];
10 #else
11 uint8_t buffer[1000];
12 #endif
13 BayEOSBufferRAM myBuffer(buffer);
14 BayRF24 client = BayRF24(9, 10, 0); //Without Power down
15 
16 #ifndef WITH_SERIAL
17 #define WITH_SERIAL 0
18 #endif
19 
20 #if WITH_SERIAL
21 #include <BaySerial.h>
22 bool serial_update=false;
23 BaySerial serial_client(Serial,100,9600);
24 #endif
25 
26 #define R1_PIN 8
27 
28 uint8_t r1 = 0;
29 uint8_t command, channel;
30 uint16_t arg;
31 uint8_t pipe_num, len;
32 uint8_t nrf_payload[32];
33 uint16_t rx_count, rx_error;
34 unsigned long last_buffer, last_data;
35 unsigned long last_command, ontime;
36 
37 void sendCommand(uint8_t command, uint8_t channel = 0x01, uint8_t arg = 0) {
38  client.startFrame(BayEOS_ChecksumFrame);
39  client.addToPayload((uint8_t) BayEOS_Command);
40  client.addToPayload((uint8_t) BayEOS_SwitchCommand);
41  client.addToPayload(command);
42  client.addToPayload(channel);
43  client.addToPayload(arg);
44  client.addChecksum();
45  client.sendPayload();
46 }
47 
48 #if WITHINT0SWITCH
49 uint8_t int0;
50 void int0SwitchHandler(void);
51 #endif
52 
53 #if WITHINT1SWITCH
54 uint8_t int1;
55 void int1SwitchHandler(void);
56 #endif
57 
58 void commandHandler(void);
59 
60 void initBoard() {
61  pinMode(R1_PIN, OUTPUT);
62  pinMode(LED_BUILTIN, OUTPUT);
63  client.init(RF24ADDRESS, RF24CHANNEL);
64  client.setRetries(15, 15);
65  for (uint8_t i = 0; i < 6; i++) {
66  client.openReadingPipe(i, pipes[i]);
67  }
68  client.startListening();
69  client.setBuffer(myBuffer);
70  digitalWrite(LED_BUILTIN, HIGH);
71 
72 #if WITHINT0SWITCH
73  digitalWrite(2, HIGH);
74  int0 = digitalRead(2);
75 #endif
76 
77 #if WITHINT1SWITCH
78  digitalWrite(3, HIGH);
79  int1 = digitalRead(3);
80 #endif
81 
82 #if WITH_SERIAL
83  serial_client.setBuffer(myBuffer);
84  serial_client.begin(9600);
85 #endif
86  ontime = MAXONTIME;
87 }
88 
89 void runBoard(void) {
90 
91  if (r1 && (millis() - last_command) > ontime) {
92  command = SWITCH_OFF;
93  channel = 0x3;
94  pipe_num = 0;
95  }
96 
97 
98  //Send from Buffer
99  if ((millis() - last_buffer) > 2000) {
100  last_buffer = millis();
101 #if WITH_SERIAL
102  serial_client.sendFromBuffer();
103 #else
104  client.sendFromBuffer();
105 #endif
106  }
107 
108 #if WITH_SERIAL
109  if ((millis() - last_data) > 15000 || serial_update) {
110  last_data = millis();
111  serial_update=false;
112  serial_client.startDataFrame(BayEOS_LabelledChannelFloat32le);
113  serial_client.addChannelValue(r1,"Relais");
114  serial_client.addChannelValue((r1?(float)(ontime-(millis()-last_command))/60000:0), "Time");
115  serial_client.addChannelValue(rx_count,"RX");
116  serial_client.addChannelValue(rx_error,"RX-Error");
117  serial_client.sendOrBuffer();
118  rx_count = 0;
119  rx_error = 0;
120  }
121 #else
122 
123  if ((millis() - last_data) > 600000) {
124  last_data = millis();
125  client.startDataFrameWithOrigin(BayEOS_Int16le, STATUS_NAME, 1);
126  client.addChannelValue(r1 * 100);
127  client.addChannelValue(rx_count);
128  client.addChannelValue(rx_error);
129  client.addChecksum();
130  client.sendOrBuffer();
131  rx_count = 0;
132  rx_error = 0;
133  }
134 #endif
135 
136  uint8_t scount;
137 #if WITHINT0SWITCH
138  scount = 0;
139  while (scount < 20 && int0 != digitalRead(2)) {
140  scount++;
141  delay(10);
142  }
143 
144  if (scount == 20 && int0 != digitalRead(2)) {
145  int0 = digitalRead(2);
146  int0SwitchHandler();
147  }
148 #endif
149 
150 #if WITHINT1SWITCH
151  scount = 0;
152  while (scount < 20 && int1 != digitalRead(3)) {
153  scount++;
154  delay(10);
155  }
156 
157  if (scount == 20 && int1 != digitalRead(3)) {
158  int1 = digitalRead(3);
159  int1SwitchHandler();
160  }
161 #endif
162 
163 #if WITH_SERIAL
164  if(Serial.available()){
165  if (! serial_client.readIntoPayload()) {
166  if (serial_client.getPayload(0) == BayEOS_Command
167  && serial_client.getPayload(1) == BayEOS_SwitchCommand) {
168  command = serial_client.getPayload(2);
169  channel = serial_client.getPayload(3);
170  arg=serial_client.getPayload(4);
171  if(serial_client.getPayloadLength()>4) arg+=256*serial_client.getPayload(5);
172  serial_update=true;
173  }
174  }
175  }
176 #endif
177 
178 
179  while (client.i_available(&pipe_num)) {
180  len = client.getDynamicPayloadSize();
181  if (!len) {
182  delay(5);
183  continue;
184  }
185  client.read(nrf_payload, len);
186  client.startFrame(nrf_payload[0]);
187  for (uint8_t i = 1; i < len; i++) {
188  client.addToPayload(nrf_payload[i]);
189  }
190  if (client.validateChecksum() == 0) {
191  rx_count++;
192 
193  if (nrf_payload[1] == BayEOS_Command
194  && nrf_payload[2] == BayEOS_SwitchCommand) {
195  command = nrf_payload[3];
196  channel = nrf_payload[4];
197  arg = nrf_payload[5];
198 #ifdef RF24FORWARD
199  if (pipe_num == 2) {
200  client.setTXAddr(RF24FORWARD);
201  client.sendPayload();
202  client.setTXAddr(RF24ADDRESS);
203  command = 0;
204  }
205 #endif
206  } else if (nrf_payload[1] == BayEOS_OriginFrame) {
207 #if WITH_SERIAL
208  serial_client.startFrame(client.getPayload(0));
209  serial_client.addToPayload(client.getPayload()+1,client.getPacketLength()-1);
210  serial_client.sendOrBuffer();
211 #else
212  client.sendOrBuffer();
213 #endif
214  }
215  } else
216  rx_error++;
217  }
218  commandHandler();
219  delay(5);
220 }
Definition: BayEOSBufferRAM.h:13
uint8_t getPacketLength(void) const
Definition: BayEOS.cpp:431
void startDataFrameWithOrigin(uint8_t subtype, const char *o, uint8_t checksum=0, uint8_t routed=0)
Definition: BayEOS.cpp:27
void setBuffer(BayEOSBuffer &buffer, uint16_t max_skip=0)
Definition: BayEOS.h:452
uint8_t addChannelValue(float v, uint8_t channel_number=0)
Definition: BayEOS.cpp:61
uint8_t sendFromBuffer(void)
Definition: BayEOS.cpp:394
void startFrame(void)
Definition: BayEOS.cpp:8
uint8_t addToPayload(uint8_t b)
Definition: BayEOS.h:469
const uint8_t * getPayload(void) const
Definition: BayEOS.cpp:435
uint8_t sendOrBuffer(void)
Definition: BayEOS.cpp:369
Definition: BayRF24.h:7
uint8_t sendPayload(void)
Definition: BayRF24.cpp:15
Definition: BaySerial.h:106