Initialize
LMIC_init()
Idle

LMIC has code for class A, and class B devices. But nobody uses class B

LMIC_sendWithCallback() &&

deviceAddr != 0
Normal Class A
Transmit
RX1
RX2
Prepare to send
Wait for RX1
Wait for RX2
TX complete
Prepare frame
Prepare

MAC frame
Post RX
If valid application message, deliver to app
LMIC_reset()
Internally driven based

on when it's OK to send.
No downlink received
No Retrans;

txDone()
no downlink

received
Downlink received
Downlink received
txDone()
MAC downlink needs

reply; txDone()
Retransmit

needed
Join
Prepare Join Request
Prepare to send
Transmit
Wait for Join RX1
RX1
Wait for Join RX2
RX2
Process Join Accept
JOIN TX Complete
JOIN Failed
LMIC_reset()