Maniacbug's RF24 arduino library ported to mbed. Tested, it works for Nucleo F411
Dependents: RF24Network_Send RF24Network_Receive maple_chotobot_rf_motores Thesis_Verzender ... more
Sync.cpp@0:c3db0798d9aa, 2015-07-06 (annotated)
- Committer:
- akashvibhute
- Date:
- Mon Jul 06 05:11:06 2015 +0000
- Revision:
- 0:c3db0798d9aa
- Child:
- 4:75c5aa56411f
working RF24Network maniacbug library; tested on nucleo f411
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 | 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 |