Ported Arduino RF24Network library.

Committer:
zcw607
Date:
Mon Mar 09 20:49:13 2015 +0000
Revision:
0:df0a8886a0e9
Child:
1:b5836d9f8de5
ported Arduino RF24Network

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zcw607 0:df0a8886a0e9 1 /*
zcw607 0:df0a8886a0e9 2 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
zcw607 0:df0a8886a0e9 3
zcw607 0:df0a8886a0e9 4 This program is free software; you can redistribute it and/or
zcw607 0:df0a8886a0e9 5 modify it under the terms of the GNU General Public License
zcw607 0:df0a8886a0e9 6 version 2 as published by the Free Software Foundation.
zcw607 0:df0a8886a0e9 7 */
zcw607 0:df0a8886a0e9 8
zcw607 0:df0a8886a0e9 9 // STL headers
zcw607 0:df0a8886a0e9 10 // C headers
zcw607 0:df0a8886a0e9 11 #include <stdlib.h>
zcw607 0:df0a8886a0e9 12 // Framework headers
zcw607 0:df0a8886a0e9 13 // Library headers
zcw607 0:df0a8886a0e9 14 #include <RF24Network.h>
zcw607 0:df0a8886a0e9 15 // Project headers
zcw607 0:df0a8886a0e9 16 // This component's header
zcw607 0:df0a8886a0e9 17 #include <Sync.h>
zcw607 0:df0a8886a0e9 18
zcw607 0:df0a8886a0e9 19 /****************************************************************************/
zcw607 0:df0a8886a0e9 20
zcw607 0:df0a8886a0e9 21 void Sync::update(void)
zcw607 0:df0a8886a0e9 22 {
zcw607 0:df0a8886a0e9 23 // Pump the network
zcw607 0:df0a8886a0e9 24 network.update();
zcw607 0:df0a8886a0e9 25
zcw607 0:df0a8886a0e9 26 // Look for changes to the data
zcw607 0:df0a8886a0e9 27 uint8_t message[32];
zcw607 0:df0a8886a0e9 28 uint8_t *mptr = message;
zcw607 0:df0a8886a0e9 29 unsigned at = 0;
zcw607 0:df0a8886a0e9 30 while ( at < len )
zcw607 0:df0a8886a0e9 31 {
zcw607 0:df0a8886a0e9 32 if ( app_data && internal_data && app_data[at] != internal_data[at] )
zcw607 0:df0a8886a0e9 33 {
zcw607 0:df0a8886a0e9 34 // Compose a message with the deltas
zcw607 0:df0a8886a0e9 35 *mptr++ = at + 1;
zcw607 0:df0a8886a0e9 36 *mptr++ = app_data[at];
zcw607 0:df0a8886a0e9 37
zcw607 0:df0a8886a0e9 38 // Update our internal view
zcw607 0:df0a8886a0e9 39 internal_data[at] = app_data[at];
zcw607 0:df0a8886a0e9 40 }
zcw607 0:df0a8886a0e9 41 ++at;
zcw607 0:df0a8886a0e9 42 }
zcw607 0:df0a8886a0e9 43 // Zero out the remainder
zcw607 0:df0a8886a0e9 44 while ( at++ < sizeof(message) )
zcw607 0:df0a8886a0e9 45 *mptr++ = 0;
zcw607 0:df0a8886a0e9 46
zcw607 0:df0a8886a0e9 47 // If changes, send a message
zcw607 0:df0a8886a0e9 48 if ( *message )
zcw607 0:df0a8886a0e9 49 {
zcw607 0:df0a8886a0e9 50 // TODO handle the case where this has to be broken into
zcw607 0:df0a8886a0e9 51 // multiple messages
zcw607 0:df0a8886a0e9 52 RF24NetworkHeader header(/*to node*/ to_node, /*type*/ 'S' /*Sync*/);
zcw607 0:df0a8886a0e9 53 network.write(header,message,sizeof(message));
zcw607 0:df0a8886a0e9 54 }
zcw607 0:df0a8886a0e9 55
zcw607 0:df0a8886a0e9 56 // Look for messages from the network
zcw607 0:df0a8886a0e9 57 // Is there anything ready for us?
zcw607 0:df0a8886a0e9 58 if ( network.available() )
zcw607 0:df0a8886a0e9 59 {
zcw607 0:df0a8886a0e9 60 // If so, take a look at it
zcw607 0:df0a8886a0e9 61 RF24NetworkHeader header;
zcw607 0:df0a8886a0e9 62 network.peek(header);
zcw607 0:df0a8886a0e9 63
zcw607 0:df0a8886a0e9 64 switch (header.type)
zcw607 0:df0a8886a0e9 65 {
zcw607 0:df0a8886a0e9 66 case 'S':
zcw607 0:df0a8886a0e9 67 IF_SERIAL_DEBUG(printf_P(PSTR("%lu: SYN Received sync message\n\r"),millis()));
zcw607 0:df0a8886a0e9 68
zcw607 0:df0a8886a0e9 69 network.read(header,&message,sizeof(message));
zcw607 0:df0a8886a0e9 70 // Parse the message and update the vars
zcw607 0:df0a8886a0e9 71 mptr = message;
zcw607 0:df0a8886a0e9 72 at = 0;
zcw607 0:df0a8886a0e9 73 while ( mptr < message + sizeof(message) )
zcw607 0:df0a8886a0e9 74 {
zcw607 0:df0a8886a0e9 75 // A '0' in the first position means we are done
zcw607 0:df0a8886a0e9 76 if ( !*mptr )
zcw607 0:df0a8886a0e9 77 break;
zcw607 0:df0a8886a0e9 78 uint8_t pos = (*mptr++) - 1;
zcw607 0:df0a8886a0e9 79 uint8_t val = *mptr++;
zcw607 0:df0a8886a0e9 80
zcw607 0:df0a8886a0e9 81 IF_SERIAL_DEBUG(printf_P(PSTR("%lu: SYN Updated position %u to value %u\n\r"),millis(),pos,val));
zcw607 0:df0a8886a0e9 82
zcw607 0:df0a8886a0e9 83 app_data[pos] = val;
zcw607 0:df0a8886a0e9 84 internal_data[pos] = val;
zcw607 0:df0a8886a0e9 85 }
zcw607 0:df0a8886a0e9 86 break;
zcw607 0:df0a8886a0e9 87 default:
zcw607 0:df0a8886a0e9 88 // Leave other messages for the app
zcw607 0:df0a8886a0e9 89 break;
zcw607 0:df0a8886a0e9 90 };
zcw607 0:df0a8886a0e9 91 }
zcw607 0:df0a8886a0e9 92 }
zcw607 0:df0a8886a0e9 93 // vim:cin:ai:sts=2 sw=2 ft=cpp