Projekt

Allgemein

Profil

Aktionen

Retransmits » Historie » Revision 5

« Zurück | Revision 5/20 (diff) | Weiter »
Maximilian Seesslen, 02.04.2025 18:38


Modes

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.

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

Related

Retransmits

  • In starting phase there is an auto-tune which requires traffic
  • There are at least some CRC errors

Send package

  • ringTransmitted.canPush()?
  • store essage there
  • Send it via RFM69

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

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

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

State machine

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

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.

Von Maximilian Seesslen vor 10 Tagen aktualisiert · 5 Revisionen