aboutsummaryrefslogtreecommitdiff
path: root/libraries
diff options
context:
space:
mode:
authorCristian Maglie <c.maglie@bug.st>2013-07-10 20:24:16 +0200
committerCristian Maglie <c.maglie@bug.st>2013-07-10 20:24:16 +0200
commitdec517181e596da42420807a50d61f4208cf4c49 (patch)
treeb700981dca9edcf17f980117c628005205bd1276 /libraries
parent3c39763ced9b42222ce54e35dee04ae4a9a0afe4 (diff)
Bridge: even more reliable startup
Diffstat (limited to 'libraries')
-rw-r--r--libraries/Bridge/Bridge.cpp76
-rw-r--r--libraries/Bridge/Bridge.h4
2 files changed, 53 insertions, 27 deletions
diff --git a/libraries/Bridge/Bridge.cpp b/libraries/Bridge/Bridge.cpp
index c929ed8..363dcd1 100644
--- a/libraries/Bridge/Bridge.cpp
+++ b/libraries/Bridge/Bridge.cpp
@@ -18,7 +18,8 @@
#include "Bridge.h"
-BridgeClass::BridgeClass(Stream &_stream) : index(0), stream(_stream), started(false) {
+BridgeClass::BridgeClass(Stream &_stream) :
+ index(0), stream(_stream), started(false), max_retries(0) {
// Empty
}
@@ -27,35 +28,52 @@ void BridgeClass::begin() {
return;
started = true;
- // Wait for Atheros bootloader to finish startup
+ // Wait for U-boot to finish startup
do {
dropAll();
- delay(1100);
+ delay(1000);
} while (stream.available()>0);
+
+ while (true) {
+ // Bridge interrupt:
+ // - Ask the bridge to close itself
+ uint8_t quit_cmd[] = {'X','X','X','X','X'};
+ max_retries = 1;
+ transfer(quit_cmd, 5);
+
+ // Bridge startup:
+ // - If the bridge is not running starts it safely
+ stream.print(CTRL_C);
+ delay(250);
+ stream.print(F("\n"));
+ delay(250);
+ stream.print(F("\n"));
+ delay(500);
+ // Wait for OpenWRT message
+ // "Press enter to activate console"
+ stream.print(F("run-bridge\n"));
+ delay(500);
+ dropAll();
- // Bridge startup:
- // - If the bridge is not running starts it safely
- stream.print(CTRL_C);
- delay(250);
- stream.print(F("\n"));
- delay(500);
- stream.print(F("\n"));
- delay(750);
- // Wait for OpenWRT message
- // "Press enter to activate console"
- stream.print(F("run-bridge\n"));
- delay(500);
- dropAll();
-
- // - If the bridge was already running previous commands
- // are ignored as "invalid packets".
-
- // Reset the brigde
- uint8_t cmd[] = {'X','X', '1','0','0'};
- uint8_t res[1];
- transfer(cmd, 5, res, 1);
- if (res[0] != 0)
- while (true);
+ // Reset the brigde to check if it is running
+ uint8_t cmd[] = {'X','X', '1','0','0'};
+ uint8_t res[1];
+ max_retries = 20;
+ uint16_t l = transfer(cmd, 5, res, 1);
+ if (l == TRANSFER_TIMEOUT) {
+ // Bridge didn't start...
+ // Maybe the board is starting-up?
+
+ // Wait and retry
+ delay(1000);
+ continue;
+ }
+ if (res[0] != 0)
+ while (true);
+
+ max_retries = 50;
+ return;
+ }
}
void BridgeClass::put(const char *key, const char *value) {
@@ -99,7 +117,8 @@ uint16_t BridgeClass::transfer(const uint8_t *buff1, uint16_t len1,
uint8_t *rxbuff, uint16_t rxlen)
{
uint16_t len = len1 + len2 + len3;
- for ( ; ; delay(100), dropAll() /* Delay for retransmission */) {
+ uint8_t retries = 0;
+ for ( ; retries<max_retries; retries++, delay(100), dropAll() /* Delay for retransmission */) {
// Send packet
crcReset();
stream.write((char)0xFF); // Start of packet (0xFF)
@@ -177,6 +196,9 @@ uint16_t BridgeClass::transfer(const uint8_t *buff1, uint16_t len1,
return rxlen;
return l;
}
+
+ // Max retries exceeded
+ return TRANSFER_TIMEOUT;
}
int BridgeClass::timedRead(unsigned int timeout) {
diff --git a/libraries/Bridge/Bridge.h b/libraries/Bridge/Bridge.h
index cfbbfa4..e4ed9f8 100644
--- a/libraries/Bridge/Bridge.h
+++ b/libraries/Bridge/Bridge.h
@@ -50,6 +50,9 @@ public:
const uint8_t *buff2, uint16_t len2,
uint8_t *rxbuff, uint16_t rxlen)
{ return transfer(buff1, len1, buff2, len2, NULL, 0, rxbuff, rxlen); }
+
+ static const int TRANSFER_TIMEOUT = 0xFFFF;
+
private:
uint8_t index;
int timedRead(unsigned int timeout);
@@ -66,6 +69,7 @@ private:
static const char CTRL_C = 3;
Stream &stream;
bool started;
+ uint8_t max_retries;
};
// This subclass uses a serial port Stream