mirror of
https://github.com/digistump/DigistumpArduino.git
synced 2025-04-28 15:49:02 -07:00
130 lines
3.1 KiB
C++
130 lines
3.1 KiB
C++
![]() |
/*
|
||
|
Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
|
||
|
|
||
|
This program is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU General Public License
|
||
|
version 2 as published by the Free Software Foundation.
|
||
|
*/
|
||
|
|
||
|
// STL headers
|
||
|
// C headers
|
||
|
// Framework headers
|
||
|
// Library headers
|
||
|
#include "RF24Network.h"
|
||
|
|
||
|
// Project headers
|
||
|
// This component's header
|
||
|
#include <Finder.h>
|
||
|
|
||
|
extern RF24Network network;
|
||
|
|
||
|
// Message buffer space
|
||
|
static uint8_t message[32];
|
||
|
|
||
|
/****************************************************************************/
|
||
|
|
||
|
Finder::Finder(void): this_node(0), state(state_waiting),
|
||
|
last_sent(millis()-interval), child_increment(-1)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/****************************************************************************/
|
||
|
|
||
|
void Finder::begin(uint16_t _this_node)
|
||
|
{
|
||
|
this_node = _this_node;
|
||
|
|
||
|
if ( ! ( this_node & 07000 ) )
|
||
|
{
|
||
|
// Figure out the address of the first child. e.g. if our node is 045, our
|
||
|
// first child is 0145. So we need to shift 01 up enough places to be the
|
||
|
// highest digit
|
||
|
child_increment = 01;
|
||
|
uint16_t temp = this_node;
|
||
|
while ( temp )
|
||
|
{
|
||
|
child_increment <<= 3;
|
||
|
temp >>= 3;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf_P(PSTR("%lu: Node %o increment %o\r\n"),millis(),this_node,child_increment);
|
||
|
}
|
||
|
|
||
|
/****************************************************************************/
|
||
|
|
||
|
void Finder::update(void)
|
||
|
{
|
||
|
// Check the network for traffic
|
||
|
|
||
|
// If we got a new finder request, launch!
|
||
|
if ( network.available() )
|
||
|
{
|
||
|
RF24NetworkHeader header;
|
||
|
network.peek(header);
|
||
|
if ( header.type == 'F' )
|
||
|
{
|
||
|
network.read(header,message,sizeof(message));
|
||
|
uint16_t from = header.from_node;
|
||
|
printf_P(PSTR("%lu: APP Received FINDER request from %o\r\n"),millis(),from);
|
||
|
|
||
|
if ( state == state_sending )
|
||
|
{
|
||
|
printf_P(PSTR("%lu: APP ERROR, already sending a finder request\r\n"),millis());
|
||
|
}
|
||
|
else if ( child_increment == 0xffff )
|
||
|
{
|
||
|
printf_P(PSTR("%lu: APP This app has no children, done.\r\n"),millis());
|
||
|
last_sent = millis() - interval;
|
||
|
state = state_done;
|
||
|
goto finish;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
last_sent = millis() - interval;
|
||
|
to_node = this_node + child_increment;
|
||
|
state = state_sending;
|
||
|
goto finish;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If we're working but not ready, continue
|
||
|
if ( state != state_waiting && millis() - last_sent <= interval )
|
||
|
return;
|
||
|
|
||
|
// If we're working, send!
|
||
|
if ( state == state_sending )
|
||
|
{
|
||
|
RF24NetworkHeader header(to_node,'F');
|
||
|
/*bool ok = */ network.write(header,message,sizeof(message));
|
||
|
last_sent = millis();
|
||
|
|
||
|
to_node += child_increment;
|
||
|
|
||
|
// Done?
|
||
|
if ( to_node > this_node + 5 * child_increment )
|
||
|
{
|
||
|
state = state_done;
|
||
|
goto finish;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If we're now done, send the final 'E' back
|
||
|
if ( state == state_done )
|
||
|
{
|
||
|
// Send an 'E' Echo response back to the BASE
|
||
|
RF24NetworkHeader header(00,'E');
|
||
|
network.write(header,message,sizeof(message));
|
||
|
|
||
|
state = state_waiting;
|
||
|
goto finish;
|
||
|
}
|
||
|
finish:
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/****************************************************************************/
|
||
|
|
||
|
// vim:cin:ai:sts=2 sw=2 ft=cpp
|