Retransmits » Historie » Revision 5
Revision 4 (Maximilian Seesslen, 02.04.2025 17:05) → Revision 5/20 (Maximilian Seesslen, 02.04.2025 18:38)
h1. Modes
h2. Unrelated
* Send CAN messages as Broadcast messages; fire and forget
* Good enough for sensor values
* Robust code, not much that can fail
* Not good enough for e.g. Flashing firmware on remote device or even scanning nodes.
h2. Related
* Each package need an acknowledge
* Retransmitts are send if acknowledge is missing
* Heavy traffic if nodes are blocking each other.
* Complex code, but ok
* Order may not be guearanteed / optional
h1. Related
h2. Retransmits
* In starting phase there is an auto-tune which requires traffic
* There are at least some CRC errors
h2. Send package
* ringTransmitted.canPush()?
* store essage there
* Send it via RFM69
h2. Receive package
* If type is "Acknowledge"
** find corresponding message
** mark slot as acked/nacked
* If regular message/resend
** If resend: is the package older than the last?, drop it
** is it not last+1? send NACK via RFM69
** fill it in the receive buffer
** directly send acknowledge via RFM69
h2. Loop
* iterate Slots
* If WAITing: is message is older than ??ms, perform an resend
* If ACKed, pop it from the ring. Not the first non-ACKed? Error
* If NACKed, resend it, if there is no WAITing before
h2. Open points
* Acknowledge gets lost; retransmit started
** last-id for every net. Drop message if it matches
* RFM-Class receives messages in ISR as fast as possible. Sending acknowledge is done in the loop.
** Order should be preserved.
** Makes things super slow
h2. State machine
h3. Sender event loop
* Each node sends a heartbeat every 5 seconds with the current message counter.
* A node has a list of (expected) package counter of other devices
* When a node received a message via can, it sends it as broadcast and sets the open-ack-mask to the node-mask
* If there was no ACK after 10ms, send retransmit to each Ack-missing node.
* If there was no ACK after 10 Seconds, remove remaing nodes from Node-List.
* If there is no Heartbeat from a Node for 1 Minute, remove node from
h3. Receiver Event loop
* When receiving a message via radio with correct order, an acknowledge is send immediately. Process and drop the message.
* When receiving a message via radio with to low order, send an acknowledge again and drop the message.
* When receiving a message via radio with too high order, act like in (1), but warn becuase of lost message.
h2. Unrelated
* Send CAN messages as Broadcast messages; fire and forget
* Good enough for sensor values
* Robust code, not much that can fail
* Not good enough for e.g. Flashing firmware on remote device or even scanning nodes.
h2. Related
* Each package need an acknowledge
* Retransmitts are send if acknowledge is missing
* Heavy traffic if nodes are blocking each other.
* Complex code, but ok
* Order may not be guearanteed / optional
h1. Related
h2. Retransmits
* In starting phase there is an auto-tune which requires traffic
* There are at least some CRC errors
h2. Send package
* ringTransmitted.canPush()?
* store essage there
* Send it via RFM69
h2. Receive package
* If type is "Acknowledge"
** find corresponding message
** mark slot as acked/nacked
* If regular message/resend
** If resend: is the package older than the last?, drop it
** is it not last+1? send NACK via RFM69
** fill it in the receive buffer
** directly send acknowledge via RFM69
h2. Loop
* iterate Slots
* If WAITing: is message is older than ??ms, perform an resend
* If ACKed, pop it from the ring. Not the first non-ACKed? Error
* If NACKed, resend it, if there is no WAITing before
h2. Open points
* Acknowledge gets lost; retransmit started
** last-id for every net. Drop message if it matches
* RFM-Class receives messages in ISR as fast as possible. Sending acknowledge is done in the loop.
** Order should be preserved.
** Makes things super slow
h2. State machine
h3. Sender event loop
* Each node sends a heartbeat every 5 seconds with the current message counter.
* A node has a list of (expected) package counter of other devices
* When a node received a message via can, it sends it as broadcast and sets the open-ack-mask to the node-mask
* If there was no ACK after 10ms, send retransmit to each Ack-missing node.
* If there was no ACK after 10 Seconds, remove remaing nodes from Node-List.
* If there is no Heartbeat from a Node for 1 Minute, remove node from
h3. Receiver Event loop
* When receiving a message via radio with correct order, an acknowledge is send immediately. Process and drop the message.
* When receiving a message via radio with to low order, send an acknowledge again and drop the message.
* When receiving a message via radio with too high order, act like in (1), but warn becuase of lost message.