@@ -2744,9 +2744,20 @@ void LMIC_init (void) {
2744
2744
2745
2745
2746
2746
void LMIC_clrTxData (void ) {
2747
- bit_t const txActive = LMIC .opmode & OP_TXDATA ;
2748
- LMIC .opmode &= ~(OP_TXDATA |OP_TXRXPEND |OP_POLL );
2747
+ u2_t opmode = LMIC .opmode ;
2748
+ bit_t const txActive = opmode & OP_TXDATA ;
2749
+ if (! txActive ) {
2750
+ return ;
2751
+ }
2749
2752
LMIC .pendTxLen = 0 ;
2753
+ opmode &= ~(OP_TXDATA | OP_POLL );
2754
+ if (! (opmode & OP_JOINING )) {
2755
+ // in this case, we are joining, and the TX data
2756
+ // is just pending.
2757
+ opmode &= ~(OP_TXRXPEND );
2758
+ }
2759
+
2760
+ LMIC .opmode = opmode ;
2750
2761
2751
2762
if (txActive )
2752
2763
reportEventNoUpdate (EV_TXCANCELED );
@@ -2787,15 +2798,23 @@ dr_t LMIC_feasibleDataRateForFrame(dr_t dr, u1_t payloadSize) {
2787
2798
return dr ;
2788
2799
}
2789
2800
2790
- static void adjustDrForFrame (u1_t len ) {
2801
+ static bit_t isTxPathBusy (void ) {
2802
+ return (LMIC .opmode & (OP_TXDATA |OP_JOINING )) != 0 ;
2803
+ }
2804
+
2805
+ static bit_t adjustDrForFrameIfNotBusy (u1_t len ) {
2806
+ if (isTxPathBusy ()) {
2807
+ return 0 ;
2808
+ }
2791
2809
dr_t newDr = LMIC_feasibleDataRateForFrame (LMIC .datarate , len );
2792
2810
if (newDr != LMIC .datarate ) {
2793
2811
setDrTxpow (DRCHG_FRAMESIZE , newDr , KEEP_TXPOW );
2794
2812
}
2813
+ return 1 ;
2795
2814
}
2796
2815
2797
2816
void LMIC_setTxData (void ) {
2798
- adjustDrForFrame (LMIC .pendTxLen );
2817
+ adjustDrForFrameIfNotBusy (LMIC .pendTxLen );
2799
2818
LMIC_setTxData_strict ();
2800
2819
}
2801
2820
@@ -2812,7 +2831,7 @@ void LMIC_setTxData_strict (void) {
2812
2831
2813
2832
// send a message, attempting to adjust TX data rate
2814
2833
lmic_tx_error_t LMIC_setTxData2 (u1_t port , xref2u1_t data , u1_t dlen , u1_t confirmed ) {
2815
- adjustDrForFrame (dlen );
2834
+ adjustDrForFrameIfNotBusy (dlen );
2816
2835
return LMIC_setTxData2_strict (port , data , dlen , confirmed );
2817
2836
}
2818
2837
@@ -2846,7 +2865,7 @@ lmic_tx_error_t LMIC_sendWithCallback (
2846
2865
u1_t port , xref2u1_t data , u1_t dlen , u1_t confirmed ,
2847
2866
lmic_txmessage_cb_t * pCb , void * pUserData
2848
2867
) {
2849
- adjustDrForFrame (dlen );
2868
+ adjustDrForFrameIfNotBusy (dlen );
2850
2869
return LMIC_sendWithCallback_strict (port , data , dlen , confirmed , pCb , pUserData );
2851
2870
}
2852
2871
0 commit comments