@@ -93,6 +93,7 @@ public:
93
93
uint32_t datum;
94
94
ostime_t time;
95
95
ostime_t txend;
96
+ ostime_t globalDutyAvail;
96
97
u4_t freq;
97
98
u2_t opmode;
98
99
u2_t fcntDn;
@@ -122,8 +123,10 @@ public:
122
123
}
123
124
if (i != m_head) {
124
125
auto const pn = &m_queue[m_tail];
126
+ pn->job = LMIC.osjob ;
125
127
pn->time = os_getTime ();
126
128
pn->txend = LMIC.txend ;
129
+ pn->globalDutyAvail = LMIC.globalDutyAvail ;
127
130
pn->event = event;
128
131
pn->pMessage = pMessage;
129
132
pn->datum = datum;
@@ -173,17 +176,23 @@ hal_failure_handler_t log_assertion;
173
176
void log_assertion (const char *pMessage, uint16_t line) {
174
177
eventQueue.putEvent (ev_t (-3 ), pMessage, line);
175
178
eventPrintAll ();
176
- Serial.println (" ***HALTED BY ASSERT***" );
179
+ Serial.println (F ( " ***HALTED BY ASSERT***" ) );
177
180
while (true )
178
181
yield ();
179
182
}
180
183
181
- uint8_t lastTxChannel ;
182
- bool lastTxStart ;
184
+ bool lastWasTxStart ;
185
+ uint32_t lastTxStartTime ;
183
186
184
187
void myEventCb (void *pUserData, ev_t ev) {
185
188
eventQueue.putEvent (ev);
186
189
190
+ if (ev == EV_TXSTART) {
191
+ lastWasTxStart = true ;
192
+ lastTxStartTime = millis ();
193
+ } else if (ev == EV_RXSTART) {
194
+ lastWasTxStart = false ;
195
+ }
187
196
if (ev == EV_JOINING) {
188
197
setupForNetwork (true );
189
198
} else if (ev == EV_JOINED) {
@@ -193,7 +202,7 @@ void myEventCb(void *pUserData, ev_t ev) {
193
202
194
203
void eventPrint (cEventQueue::eventnode_t &e);
195
204
void printFcnts (cEventQueue::eventnode_t &e);
196
-
205
+ void printTxend (cEventQueue:: eventnode_t &e);
197
206
198
207
void eventPrintAll (void ) {
199
208
while (eventPrintOne ())
@@ -245,19 +254,23 @@ void printHex4(unsigned v) {
245
254
printHex2 (v);
246
255
}
247
256
257
+ void printSpace (void ) {
258
+ Serial.print (' ' );
259
+ }
260
+
248
261
void printFreq (u4_t freq) {
249
262
Serial.print (F (" : freq=" ));
250
263
Serial.print (freq / 1000000 );
251
- Serial.print (F ( " . " ) );
264
+ Serial.print (' . ' );
252
265
Serial.print ((freq % 1000000 ) / 100000 );
253
266
}
254
267
255
268
void printRps (rps_t rps) {
256
269
Serial.print (F (" rps=0x" )); printHex2 (rps);
257
270
Serial.print (F (" (" )); Serial.print (getSfName (rps));
258
- Serial. print ( F ( " " ) ); Serial.print (getBwName (rps));
259
- Serial. print ( F ( " " ) ); Serial.print (getCrName (rps));
260
- Serial. print ( F ( " " ) ); Serial.print (getCrcName (rps));
271
+ printSpace ( ); Serial.print (getBwName (rps));
272
+ printSpace ( ); Serial.print (getCrName (rps));
273
+ printSpace ( ); Serial.print (getCrcName (rps));
261
274
Serial.print (F (" IH=" )); Serial.print (unsigned (getIh (rps)));
262
275
Serial.print (' )' );
263
276
}
@@ -268,8 +281,9 @@ void printOpmode(uint16_t opmode, char sep = ',') {
268
281
Serial.print (F (" opmode=" )); Serial.print (opmode, HEX);
269
282
}
270
283
271
- void printTxend (ostime_t txend) {
272
- Serial.print (F (" , txend=" )); Serial.print (txend);
284
+ void printTxend (cEventQueue::eventnode_t &e) {
285
+ Serial.print (F (" , txend=" )); Serial.print (e.txend );
286
+ Serial.print (F (" , avail=" )); Serial.print (e.globalDutyAvail );
273
287
}
274
288
275
289
void printTxChnl (u1_t txChnl) {
@@ -299,6 +313,7 @@ void printFcnts(cEventQueue::eventnode_t &e) {
299
313
printHex4 (e.fcntDn );
300
314
}
301
315
316
+ #if LMIC_ENABLE_event_logging
302
317
// dump all the registers. Must have printf setup.
303
318
void printAllRegisters (void ) {
304
319
uint8_t regbuf[0x80 ];
@@ -324,6 +339,7 @@ void printAllRegisters(void) {
324
339
const uint8_t opmode = 0x88 ; // LoRa and sleep.
325
340
hal_spi_write (0x81 , &opmode, 1 );
326
341
}
342
+ #endif
327
343
328
344
void printNl (void ) {
329
345
Serial.println ();
@@ -347,13 +363,15 @@ void eventPrint(cEventQueue::eventnode_t &e) {
347
363
Serial.print (e.pMessage );
348
364
Serial.print (F (" , line " )); Serial.print (e.datum );
349
365
printFreq (e.freq );
350
- printTxend (e. txend );
366
+ printTxend (e);
351
367
printTxChnl (e.txChnl );
352
368
printRps (e.rps );
353
369
printOpmode (e.opmode );
354
370
printTxrxflags (e.txrxFlags );
355
371
printSaveIrqFlags (e.saveIrqFlags );
372
+ #if LMIC_ENABLE_event_logging
356
373
printAllRegisters ();
374
+ #endif
357
375
} else {
358
376
if (ev < sizeof (evNames) / sizeof (evNames[0 ])) {
359
377
Serial.print (evNames[ev]);
@@ -415,8 +433,9 @@ void eventPrint(cEventQueue::eventnode_t &e) {
415
433
printRps (e.rps );
416
434
printOpmode (e.opmode );
417
435
printf (" irqLevel %u" , hal_getIrqLevel ());
418
-
436
+ # if LMIC_ENABLE_event_logging
419
437
printAllRegisters ();
438
+ #endif
420
439
break ;
421
440
422
441
case EV_REJOIN_FAILED:
@@ -429,6 +448,7 @@ void eventPrint(cEventQueue::eventnode_t &e) {
429
448
printRps (e.rps );
430
449
printTxrxflags (e.txrxFlags );
431
450
printFcnts (e);
451
+ printTxend (e);
432
452
break ;
433
453
case EV_LOST_TSYNC:
434
454
break ;
@@ -455,15 +475,15 @@ void eventPrint(cEventQueue::eventnode_t &e) {
455
475
printRps (e.rps );
456
476
printDatarate (e.datarate );
457
477
printOpmode (e.opmode );
458
- printTxend (e. txend );
478
+ printTxend (e);
459
479
break ;
460
480
461
481
case EV_RXSTART:
462
482
printFreq (e.freq );
463
483
printRps (e.rps );
464
484
printDatarate (e.datarate );
465
485
printOpmode (e.opmode );
466
- printTxend (e. txend );
486
+ printTxend (e);
467
487
Serial.print (F (" , delta ms " )); Serial.print (osticks2ms (e.time - e.txend ));
468
488
break ;
469
489
@@ -701,9 +721,20 @@ void setupForNetwork(bool preJoin) {
701
721
702
722
void loop () {
703
723
os_runloop_once ();
724
+
725
+ if (lastWasTxStart && millis () - lastTxStartTime > 10000 ) {
726
+ /* ugh. TX timed out */
727
+ Serial.println (F (" Tx timed out" ));
728
+ #if LMIC_ENABLE_event_logging
729
+ printAllRegisters ();
730
+ #endif
731
+ LMIC_clrTxData ();
732
+ lastWasTxStart = false ;
733
+ }
734
+
704
735
if ((LMIC.opmode & OP_TXRXPEND) == 0 &&
705
736
!os_queryTimeCriticalJobs (ms2osticks (1000 ))) {
706
- eventPrintOne ();
737
+ eventPrintAll ();
707
738
}
708
739
}
709
740
0 commit comments