Ported Arduino RF24Network library.
Sync.cpp@1:b5836d9f8de5, 2015-03-09 (annotated)
- Committer:
- zcw607
- Date:
- Mon Mar 09 21:23:56 2015 +0000
- Revision:
- 1:b5836d9f8de5
- Parent:
- 0:df0a8886a0e9
Clean up errors
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:b5836d9f8de5 | 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 | 1:b5836d9f8de5 | 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 |