Merge pull request #533 from tekka007/TransportUpdate

Fix compatibility issue with nRF clones, update documentation
This commit is contained in:
Henrik Ekblad
2016-08-01 23:58:57 +02:00
committed by GitHub
4 changed files with 101 additions and 122 deletions
-8
View File
@@ -483,14 +483,6 @@
#define MY_RF24_ADDR_WIDTH 5
#endif
/**
* @def MY_RF24_SANITY_CHECK
* @brief RF24 sanity check to verify functional RF module
*
* This reads back and compares configuration registers. Disable if using non-P modules
*/
#define MY_RF24_SANITY_CHECK
// Enable SOFTSPI for NRF24L01, useful for the W5100 Ethernet module
//#define MY_SOFTSPI
-8
View File
@@ -19,14 +19,6 @@
#include "MyTransport.h"
// debug
#if defined(MY_DEBUG)
#define TRANSPORT_DEBUG(x,...) debug(x, ##__VA_ARGS__)
#else
#define TRANSPORT_DEBUG(x,...)
#endif
// SM: transitions and update states
static transportState stInit = { stInitTransition, NULL };
static transportState stParent = { stParentTransition, stParentUpdate };
+92 -95
View File
@@ -26,115 +26,105 @@
*
* Transport-related log messages, format: [!]SYSTEM:[SUB SYSTEM:]MESSAGE
* - [!] Exclamation mark is prepended in case of error
* - SYSTEM:
* - TSM: messages emitted by the transport state machine
* - TSF: messages emitted by transport support functions
* - SYSTEM:
* - <b>TSM</b>: messages emitted by the transport state machine
* - <b>TSF</b>: messages emitted by transport support functions
* - SUB SYSTEMS:
* - Transport state machine (TSM)
* - Transport state machine (<b>TSM</b>)
* - TSM:INIT from <b>stInit</b> Initialize transport and radio
* - TSM:FPAR from <b>stParent</b> Find parent
* - TSM:ID from <b>stID</b> Check/request node ID, if dynamic node ID set
* - TSM:UPL from <b>stUplink</b> Verify uplink connection by pinging GW
* - TSM:READY from <b>stReady</b> Transport is ready and fully operational
* - TSM:FAILURE from <b>stFailure</b> Failure in transport link or transport HW
* - Transport support function (TSF)
* - TSF:CHKUPL from @ref transportCheckUplink(..), checks connection to GW
* - TSF:ASID from @ref transportAssignNodeID(..), assigns node ID
* - TSF:PING from @ref transportPingNode(..), pings a node
* - TSF:CRT from @ref transportClearRoutingTable(..), clears routing table stored in EEPROM
* - TSF:MSG from @ref transportProcessMessage(..), processes incoming message
* - TSF:SANCHK from @ref transportInvokeSanityCheck(..), calls transport-specific sanity check
* - TSF:ROUTE from @ref transportRouteMessage(..), sends message
* - TSF:SEND from @ref transportSendRoute(..), sends message if transport is ready (exposed)
* - Transport support function (<b>TSF</b>)
* - TSF:CHKUPL from @ref transportCheckUplink(), checks connection to GW
* - TSF:ASID from @ref transportAssignNodeID(), assigns node ID
* - TSF:PING from @ref transportPingNode(), pings a node
* - TSF:CRT from @ref transportClearRoutingTable(), clears routing table stored in EEPROM
* - TSF:MSG from @ref transportProcessMessage(), processes incoming message
* - TSF:SANCHK from @ref transportInvokeSanityCheck(), calls transport-specific sanity check
* - TSF:ROUTE from @ref transportRouteMessage(), sends message
* - TSF:SEND from @ref transportSendRoute(), sends message if transport is ready (exposed)
*
* TSM state <b>stInit</b> log status / errors
* - TSM:INIT Transition to stInit state
* - TSM:INIT:STATID,ID=x Node ID x is static
* - TSM:INIT:TSP OK Transport device configured and fully operational
* - TSM:INIT:GW MODE Node is set up as GW, thus omitting ID and findParent states
* - !TSM:INIT:TSP FAIL Transport device initialization failed
* Transport debug log messages:
*
* TSM state <b>stParent</b> log status / errors
* - TSM:FPAR Transition to stParent state
* - TSM:FPAR:STATP=x Static parent x set, skip finding parent
* - TSM:FPAR:OK Parent node identified
* - !TSM:FPAR:NO REPLY No potential parents replied to find parent request, retry
* - !TSM:FPAR:FAIL Finding parent failed, go to failure state
* |E| SYS | SUB | Message | Comment
* |-|------|-----------|-----------------------|---------------------------------------------------------------------
* | | TSM | INIT | | <b>Transition to stInit state</b>
* | | TSM | INIT | STATID,ID=%%d | Node ID is static
* | | TSM | INIT | TSP OK | Transport device configured and fully operational
* | | TSM | INIT | GW MODE | Node is set up as GW, thus omitting ID and findParent states
* |!| TSM | INIT | TSP FAIL | Transport device initialization failed
* | | TSM | FPAR | | <b>Transition to stParent state</b>
* | | TSM | FPAR | STATP=%%d | Static parent set, skip finding parent
* | | TSM | FPAR | OK | Parent node identified
* |!| TSM | FPAR | NO REPLY | No potential parents replied to find parent request
* |!| TSM | FPAR | FAIL | Finding parent failed
* | | TSM | ID | | <b>Transition to stID state</b>
* | | TSM | ID | OK,ID=%%d | Node ID is valid
* | | TSM | ID | REQ | Request node ID from controller
* |!| TSM | ID | FAIL,ID=%%d | ID verification failed, ID invalid
* | | TSM | UPL | | <b>Transition to stUplink state</b>
* | | TSM | UPL | OK | Uplink OK, GW returned ping
* |!| TSM | UPL | FAIL | Uplink check failed, i.e. GW could not be pinged
* | | TSM | READY | | <b>Transition to stReady</b>, i.e. transport is ready and fully operational
* |!| TSM | READY | UPL FAIL,SNP | Too many failed uplink transmissions, search new parent
* |!| TSM | READY | FAIL,STATP | Too many failed uplink transmissions, static parent enforced
* | | TSM | FAILURE | | <b>Transition to stFailure state</b>
* | | TSM | FAILURE | PDT | Power-down transport
* | | TSM | FAILURE | RE-INIT | Attempt to re-initialize transport
* | | TSF | CHKUPL | OK | Uplink OK
* | | TSF | CHKUPL | OK,FCTRL | Uplink OK, flood control prevents pinging GW in too short intervals
* | | TSF | CHKUPL | DGWC,O=%%d,N=%%d | Uplink check revealed changed network topology, old distance (O), new distance (N)
* | | TSF | CHKUPL | FAIL | No reply received when checking uplink
* | | TSF | ASID | OK,ID=%%d | Node ID assigned
* |!| TSF | ASID | FAIL,ID=%%d | Assigned ID is invalid
* | | TSF | PING | SEND,TO=%%d | Send ping to destination (TO)
* | | TSF | MSG | ACK REQ | ACK message requested
* | | TSF | MSG | ACK | ACK message, do not proceed but forward to callback
* | | TSF | MSG | FPAR RES,ID=%%d,D=%%d | Response to find parent received from node (ID) with distance (D) to GW
* | | TSF | MSG | FPAR PREF FOUND | Preferred parent found, i.e. parent defined via MY_PARENT_NODE_ID
* | | TSF | MSG | FPAR OK,ID=%%d,D=%%d | Find parent response from node (ID) is valid, distance (D) to GW
* | | TSF | MSG | FPAR INACTIVE | Find parent response received, but no find parent request active, skip response
* | | TSF | MSG | FPAR REQ,ID=%%d | Find parent request from node (ID)
* | | TSF | MSG | PINGED,ID=%%d,HP=%%d | Node pinged by node (ID) with (HP) hops
* | | TSF | MSG | PONG RECV,HP=%%d | Pinged node replied with (HP) hops
* | | TSF | MSG | BC | Broadcast message received
* | | TSF | MSG | GWL OK | Link to GW ok
* | | TSF | MSG | FWD BC MSG | Controlled broadcast message forwarding
* | | TSF | MSG | REL MSG | Relay message
* | | TSF | MSG | REL PxNG,HP=%%d | Relay PING/PONG message, increment hop counter (HP)
* |!| TSF | MSG | PVER,%%d!=%%d | Message protocol version mismatch
* |!| TSF | MSG | SIGN VERIFY FAIL | Signing verification failed
* |!| TSF | MSG | REL MSG,NORP | Node received a message for relaying, but node is not a repeater, message skipped
* |!| TSF | MSG | SIGN FAIL | Signing message failed
* |!| TSF | MSG | GWL FAIL | GW uplink failed
* | | TSF | SANCHK | OK | Sanity check passed
* |!| TSF | SANCHK | FAIL | Sanity check failed, attempt to re-initialize radio
* | | TSF | CRT | OK | Clearing routing table successful
* |!| TSF | ROUTE | FPAR ACTIVE | Finding parent active, message not sent
* |!| TSF | ROUTE | DST %%d UNKNOWN | Routing for destination (DST) unknown, send message to parent
* |!| TSF | SEND | TNR | Transport not ready, message cannot be sent
*
* TSM state <b>stID</b> log status / errors
* - TSM:ID Transition to stID state
* - TSM:ID:OK,ID=x Node ID x is valid
* - TSM:ID:REQ Request node ID from controller
* - !TSM:ID:FAIL,ID=x ID verification failed, ID x invalid
*
* TSM state <b>stUplink</b> log status / errors
* - TSM:UPL Transition to stUplink state
* - TSM:UPL:OK Uplink OK, GW returned ping
* - !TSM:UPL:FAIL Uplink check failed, i.e. GW could not be pinged
*
* TSM state <b>stReady</b> log status / errors
* - TSM:READY Transition to stReady, i.e. transport is ready and fully operational
* - !TSM:READY:UPL FAIL,SNP Too many failed uplink transmissions, search new parent
* - !TSM:READY:UPL FAIL,STATP Too many failed uplink transmissions, no SNP, static parent enforced
*
* TSM state <b>stFailure</b> information / status
* - TSM:FAILURE Transition to stFailure state
* - TSM:FAILURE:PDT Power-down transport
* - TSM:FAILURE:RE-INIT Attempt to re-initialize transport
*
* TSF information / status
* - TSF:CHKUPL:OK Uplink OK
* - TSF:CHKUPL:OK,FCTRL Uplink OK, flood control prevents pinging GW in too short intervals
* - TSF:CHKUPL:DGWC,O=x,N=y Checking uplink revealed a changed network topology, old distance x, new distance y
* - TSF:CHKUPL:FAIL No reply received when checking uplink
* - TSF:ASID:OK,ID=x Node ID x assigned
* - TSF:PING:SEND,TO=x Send ping to destination x
* - TSF:MSG:ACK REQ ACK message requested
* - TSF:MSG:ACK ACK message, do not proceed but forward to callback
* - TSF:MSG:FPAR RES,ID=x,D=y Response to find parent received from node x with distance y to GW
* - TSF:MSG:FPAR PREF FOUND Preferred parent found
* - TSF:MSG:FPAR OK,ID=x,D=y Find parent reponse from node x is valid, distance y to GW
* - TSF:MSG:FPAR INACTIVE Find parent response received, but no find parent request active, skip response
* - TSF:MSG:FPAR REQ,ID=x Find parent request from node x
* - TSF:MSG:PINGED,ID=x,HP=y Node pinged by node x with y hops
* - TSF:MSG:PONG RECV,HP=x Pinged node replied with x hops
* - TSF:MSG:BC Broadcast message received
* - TSF:MSG:GWL OK Link to GW ok
* - TSF:MSG:FWD BC MSG Controlled broadcast message forwarding
* - TSF:MSG:REL MSG Relay message
* - TSF:MSG:REL PxNG,HP=x Relay PING/PONG message, increment hop counter x
* - TSF:SANCHK:OK Sanity check passed. This ensures radio functionality and automatically attempts to re-initialize in case of failure
* - TSF:CRT:OK Clearing routing table successful
*
* Incoming / outgoing messages
* Incoming / outgoing messages:
*
* See <a href="https://www.mysensors.org/download/serial_api_20">here</a> for more detail on the format and definitons.
*
* Receiving a message
* - TSF:MSG:READ,sender-last-destination,s=%d,c=%d,t=%d,pt=%d,l=%d,sg=%d:%s
* Sending a message
* - [!]TSF:MSG:SEND,sender-last-next-destination,s=%d,c=%d,t=%d,pt=%d,l=%d,sg=%d,ft=%d,st=%s:%s
* - TSF:MSG:READ,sender-last-destination,s=%%d,c=%%d,t=%%d,pt=%%d,l=%%d,sg=%%d:%%s
*
* - Message fields:
* - s=sensor ID
* - c=command
* - t=msg type
* - pt=payload type
* - l=length
* - ft=failed uplink transmission counter
* - sg=signing flag
*
* TSF errors
* - !TSF:ASID:FAIL,ID=x Assigned ID x is invalid, e.g. 0 (GATEWAY)
* - !TSF:ROUTE:FPAR ACTIVE Finding parent active, message not sent
* - !TSF:ROUTE:DST x UNKNOWN Routing for destination x unkown, send message to parent
* - !TSF:SEND:TNR Transport not ready, message cannot be sent
* - !TSF:MSG:PVER,x!=y Message protocol version mismatch
* - !TSF:MSG:SIGN VERIFY FAIL Signing verficiation failed
* - !TSF:MSG:REL MSG,NORP Node received a message for relaying, but node is not a repeater, message skipped
* - !TSF:MSG:SIGN FAIL Signing message failed
* - !TSF:MSG:GWL FAIL GW uplink failed
* - !TSF:SANCHK:FAIL Sanity check failed, attempt to re-intialize radio
* Sending a message
* - [!]TSF:MSG:SEND,sender-last-next-destination,s=%%d,c=%%d,t=%%d,pt=%%d,l=%%d,sg=%%d,ft=%%d,st=%%s:%%s
*
* Message fields:
* - <b>s</b>=sensor ID
* - <b>c</b>=command
* - <b>t</b>=msg type
* - <b>pt</b>=payload type
* - <b>l</b>=length
* - <b>ft</b>=failed uplink transmission counter
* - <b>sg</b>=signing flag
*
* @brief API declaration for MyTransport
*
@@ -145,6 +135,13 @@
#include "MySensorsCore.h"
// debug
#if defined(MY_DEBUG)
#define TRANSPORT_DEBUG(x,...) debug(x, ##__VA_ARGS__) //!< debug
#else
#define TRANSPORT_DEBUG(x,...) //!< debug NULL
#endif
#if defined(MY_REPEATER_FEATURE)
#define TRANSMISSION_FAILURES 10 //!< search for a new parent node after this many transmission failures, higher threshold for repeating nodes
#else
@@ -350,7 +347,7 @@ uint32_t transportGetHeartbeat();
/**
* @brief Initialize transport HW
* @return true if initalization successful
* @return true if initialization successful
*/
bool transportInit();
/**
+9 -11
View File
@@ -134,7 +134,7 @@ LOCAL void RF24_setStatus(uint8_t status) {
RF24_writeByteRegister(RF24_STATUS, status);
}
LOCAL void RF24_enableFeatures(void) {
RF24_writeByteRegister(ACTIVATE, 0x73);
RF24_RAW_writeByteRegister(ACTIVATE, 0x73);
}
LOCAL void RF24_openWritingPipe(uint8_t recipient) {
@@ -247,7 +247,7 @@ LOCAL uint8_t RF24_getNodeID(void) {
}
LOCAL bool RF24_sanityCheck(void) {
// detect HW defect ot interrupted SPI line, CE disconnect cannot be detected
// detect HW defect, configuration errors or interrupted SPI line, CE disconnect cannot be detected
bool status = RF24_readByteRegister(RF_SETUP) == MY_RF24_RF_SETUP;
status &= RF24_readByteRegister(RF_CH) == MY_RF24_CHANNEL;
return status;
@@ -273,18 +273,16 @@ LOCAL bool RF24_initialize(void) {
RF24_setChannel(MY_RF24_CHANNEL);
// set data rate and pa level
RF24_setRFSetup(MY_RF24_RF_SETUP);
// sanity check
#if defined(MY_RF24_SANITY_CHECK)
if (!RF24_sanityCheck()) {
RF24_DEBUG(PSTR("RF24:Sanity check failed: configuration mismatch! Check wiring, replace module or non-P version\n"));
return false;
}
#endif
// toggle features (necessary on some clones)
// toggle features (necessary on some clones and non-P versions)
RF24_enableFeatures();
// enable ACK payload and dynamic payload
RF24_setFeature(MY_RF24_FEATURE);
// enable broadcasting pipe
// sanity check (this function is P/non-P independent)
if (!RF24_sanityCheck()) {
RF24_DEBUG(PSTR("!RF24:Sanity check failed: configuration mismatch! Check wiring or replace module\n"));
return false;
}
// enable broadcasting pipe
RF24_setPipe(_BV(ERX_P0 + BROADCAST_PIPE));
// disable AA on all pipes, activate when node pipe set
RF24_setAutoACK(0x00);