fd

Dependents:   xtoff3 CYS_Receiver

Fork of RF24Network by Akash Vibhute

Committer:
pietor
Date:
Thu Sep 13 09:14:42 2018 +0000
Revision:
7:d72e1d8f5355
Parent:
0:c3db0798d9aa
Child:
4:75c5aa56411f

        

Who changed what in which revision?

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