no modif
Sync.cpp@5:b1110d26a900, 2016-04-21 (annotated)
- Committer:
- akashvibhute
- Date:
- Thu Apr 21 04:10:31 2016 +0000
- Revision:
- 5:b1110d26a900
- Parent:
- 4:75c5aa56411f
Library re-ported with all the latest and greatest stuff from Manicbug; Synced with TMRh20's RF24 library on Apr/18/2015 from https://github.com/TMRh20
Who changed what in which revision?
User | Revision | Line number | New 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 | 4:75c5aa56411f | 8 | |
akashvibhute | 4:75c5aa56411f | 9 | /* |
akashvibhute | 4:75c5aa56411f | 10 | * Mbed support added by Akash Vibhute <akash.roboticist@gmail.com> |
akashvibhute | 4:75c5aa56411f | 11 | * Porting completed on Nov/05/2015 |
akashvibhute | 4:75c5aa56411f | 12 | * |
akashvibhute | 4:75c5aa56411f | 13 | * Updated 1: Synced with TMRh20's RF24 library on Nov/04/2015 from https://github.com/TMRh20 |
akashvibhute | 4:75c5aa56411f | 14 | * Updated 2: Synced with TMRh20's RF24 library on Apr/18/2015 from https://github.com/TMRh20 |
akashvibhute | 4:75c5aa56411f | 15 | * |
akashvibhute | 4:75c5aa56411f | 16 | */ |
akashvibhute | 4:75c5aa56411f | 17 | |
akashvibhute | 5:b1110d26a900 | 18 | |
akashvibhute | 0:c3db0798d9aa | 19 | // STL headers |
akashvibhute | 0:c3db0798d9aa | 20 | // C headers |
akashvibhute | 0:c3db0798d9aa | 21 | #include <stdlib.h> |
akashvibhute | 0:c3db0798d9aa | 22 | // Framework headers |
akashvibhute | 0:c3db0798d9aa | 23 | // Library headers |
akashvibhute | 0:c3db0798d9aa | 24 | #include <RF24Network.h> |
akashvibhute | 0:c3db0798d9aa | 25 | // Project headers |
akashvibhute | 0:c3db0798d9aa | 26 | // This component's header |
akashvibhute | 0:c3db0798d9aa | 27 | #include <Sync.h> |
akashvibhute | 0:c3db0798d9aa | 28 | |
akashvibhute | 0:c3db0798d9aa | 29 | /****************************************************************************/ |
akashvibhute | 0:c3db0798d9aa | 30 | |
akashvibhute | 0:c3db0798d9aa | 31 | void Sync::update(void) |
akashvibhute | 0:c3db0798d9aa | 32 | { |
akashvibhute | 0:c3db0798d9aa | 33 | // Pump the network |
akashvibhute | 0:c3db0798d9aa | 34 | network.update(); |
akashvibhute | 0:c3db0798d9aa | 35 | |
akashvibhute | 0:c3db0798d9aa | 36 | // Look for changes to the data |
akashvibhute | 0:c3db0798d9aa | 37 | uint8_t message[32]; |
akashvibhute | 0:c3db0798d9aa | 38 | uint8_t *mptr = message; |
akashvibhute | 0:c3db0798d9aa | 39 | unsigned at = 0; |
akashvibhute | 0:c3db0798d9aa | 40 | while ( at < len ) |
akashvibhute | 0:c3db0798d9aa | 41 | { |
akashvibhute | 0:c3db0798d9aa | 42 | if ( app_data && internal_data && app_data[at] != internal_data[at] ) |
akashvibhute | 0:c3db0798d9aa | 43 | { |
akashvibhute | 0:c3db0798d9aa | 44 | // Compose a message with the deltas |
akashvibhute | 0:c3db0798d9aa | 45 | *mptr++ = at + 1; |
akashvibhute | 0:c3db0798d9aa | 46 | *mptr++ = app_data[at]; |
akashvibhute | 0:c3db0798d9aa | 47 | |
akashvibhute | 0:c3db0798d9aa | 48 | // Update our internal view |
akashvibhute | 0:c3db0798d9aa | 49 | internal_data[at] = app_data[at]; |
akashvibhute | 0:c3db0798d9aa | 50 | } |
akashvibhute | 0:c3db0798d9aa | 51 | ++at; |
akashvibhute | 0:c3db0798d9aa | 52 | } |
akashvibhute | 0:c3db0798d9aa | 53 | // Zero out the remainder |
akashvibhute | 0:c3db0798d9aa | 54 | while ( at++ < sizeof(message) ) |
akashvibhute | 0:c3db0798d9aa | 55 | *mptr++ = 0; |
akashvibhute | 0:c3db0798d9aa | 56 | |
akashvibhute | 0:c3db0798d9aa | 57 | // If changes, send a message |
akashvibhute | 0:c3db0798d9aa | 58 | if ( *message ) |
akashvibhute | 0:c3db0798d9aa | 59 | { |
akashvibhute | 0:c3db0798d9aa | 60 | // TODO handle the case where this has to be broken into |
akashvibhute | 0:c3db0798d9aa | 61 | // multiple messages |
akashvibhute | 0:c3db0798d9aa | 62 | RF24NetworkHeader header(/*to node*/ to_node, /*type*/ 'S' /*Sync*/); |
akashvibhute | 0:c3db0798d9aa | 63 | network.write(header,message,sizeof(message)); |
akashvibhute | 0:c3db0798d9aa | 64 | } |
akashvibhute | 0:c3db0798d9aa | 65 | |
akashvibhute | 0:c3db0798d9aa | 66 | // Look for messages from the network |
akashvibhute | 0:c3db0798d9aa | 67 | // Is there anything ready for us? |
akashvibhute | 0:c3db0798d9aa | 68 | if ( network.available() ) |
akashvibhute | 0:c3db0798d9aa | 69 | { |
akashvibhute | 0:c3db0798d9aa | 70 | // If so, take a look at it |
akashvibhute | 0:c3db0798d9aa | 71 | RF24NetworkHeader header; |
akashvibhute | 0:c3db0798d9aa | 72 | network.peek(header); |
akashvibhute | 0:c3db0798d9aa | 73 | |
akashvibhute | 0:c3db0798d9aa | 74 | switch (header.type) |
akashvibhute | 0:c3db0798d9aa | 75 | { |
akashvibhute | 0:c3db0798d9aa | 76 | case 'S': |
akashvibhute | 0:c3db0798d9aa | 77 | //IF_SERIAL_DEBUG(printf_P(PSTR("%lu: SYN Received sync message\n\r"),millis())); |
akashvibhute | 4:75c5aa56411f | 78 | IF_SERIAL_DEBUG(printf_P(PSTR("SYN Received sync message\n\r"))); |
akashvibhute | 0:c3db0798d9aa | 79 | |
akashvibhute | 0:c3db0798d9aa | 80 | network.read(header,&message,sizeof(message)); |
akashvibhute | 0:c3db0798d9aa | 81 | // Parse the message and update the vars |
akashvibhute | 0:c3db0798d9aa | 82 | mptr = message; |
akashvibhute | 0:c3db0798d9aa | 83 | at = 0; |
akashvibhute | 0:c3db0798d9aa | 84 | while ( mptr < message + sizeof(message) ) |
akashvibhute | 0:c3db0798d9aa | 85 | { |
akashvibhute | 0:c3db0798d9aa | 86 | // A '0' in the first position means we are done |
akashvibhute | 0:c3db0798d9aa | 87 | if ( !*mptr ) |
akashvibhute | 0:c3db0798d9aa | 88 | break; |
akashvibhute | 0:c3db0798d9aa | 89 | uint8_t pos = (*mptr++) - 1; |
akashvibhute | 0:c3db0798d9aa | 90 | uint8_t val = *mptr++; |
akashvibhute | 0:c3db0798d9aa | 91 | |
akashvibhute | 0:c3db0798d9aa | 92 | //IF_SERIAL_DEBUG(printf_P(PSTR("%lu: SYN Updated position %u to value %u\n\r"),millis(),pos,val)); |
akashvibhute | 4:75c5aa56411f | 93 | IF_SERIAL_DEBUG(printf_P(PSTR("%SYN Updated position %u to value %u\n\r"),pos,val)); |
akashvibhute | 0:c3db0798d9aa | 94 | |
akashvibhute | 0:c3db0798d9aa | 95 | app_data[pos] = val; |
akashvibhute | 0:c3db0798d9aa | 96 | internal_data[pos] = val; |
akashvibhute | 0:c3db0798d9aa | 97 | } |
akashvibhute | 0:c3db0798d9aa | 98 | break; |
akashvibhute | 0:c3db0798d9aa | 99 | default: |
akashvibhute | 0:c3db0798d9aa | 100 | // Leave other messages for the app |
akashvibhute | 0:c3db0798d9aa | 101 | break; |
akashvibhute | 0:c3db0798d9aa | 102 | }; |
akashvibhute | 0:c3db0798d9aa | 103 | } |
akashvibhute | 0:c3db0798d9aa | 104 | } |
akashvibhute | 0:c3db0798d9aa | 105 | // vim:cin:ai:sts=2 sw=2 ft=cpp |
akashvibhute | 4:75c5aa56411f | 106 | |
akashvibhute | 4:75c5aa56411f | 107 |