LMiC LoRa Semtech + Nucleo version sending every 10secs

Dependents:   LoRaWAN-test-10secs

Fork of LMiC by Alcatel-Lucent IoT Development

Revision:
9:c5820ce68bd6
Parent:
8:34cb24e0b061
--- a/lmic.cpp	Mon Feb 08 10:39:01 2016 +0000
+++ b/lmic.cpp	Tue Feb 23 08:41:36 2016 +0000
@@ -409,6 +409,7 @@
 
 
 static ostime_t calcRxWindow (u1_t secs, dr_t dr) {
+    //debug_str("calcRxWindow\r\n");                                      
     ostime_t rxoff, err;
     if( secs==0 ) {
         // aka 128 secs (next becaon)
@@ -429,6 +430,7 @@
 
 // Setup beacon RX parameters assuming we have an error of ms (aka +/-(ms/2))
 static void calcBcnRxWindowFromMillis (u1_t ms, bit_t ini) {
+    //debug_str("calcBcnRxWindowFromMillis\r\n");                                      
     if( ini ) {
         LMIC.drift = 0;
         LMIC.maxDriftDiff = 0;
@@ -443,6 +445,7 @@
 
 // Setup scheduled RX window (ping/multicast slot)
 static void rxschedInit (xref2rxsched_t rxsched) {
+    //debug_str("rxschedInit\r\n");                                      
     os_clearMem(AESkey,16);
     os_clearMem(LMIC.frame+8,8);
     os_wlsbf4(LMIC.frame, LMIC.bcninfo.time);
@@ -460,6 +463,7 @@
 
 
 static bit_t rxschedNext (xref2rxsched_t rxsched, ostime_t cando) {
+    //debug_str("rxschedNext\r\n");                                      
   again:
     if( rxsched->rxtime - cando >= 0 )
         return 1;
@@ -478,6 +482,7 @@
 
 
 static ostime_t rndDelay (u1_t secSpan) {
+    //debug_str("rndDelay\r\n");                                      
     u2_t r = os_getRndU2();
     ostime_t delay = r;
     if( delay > OSTICKS_PER_SEC )
@@ -489,6 +494,7 @@
 
 
 static void txDelay (ostime_t reftime, u1_t secSpan) {
+    //debug_str("txDelay\r\n");                                      
     reftime += rndDelay(secSpan);
     if( LMIC.globalDutyRate == 0  ||  (reftime - LMIC.globalDutyAvail) > 0 ) {
         LMIC.globalDutyAvail = reftime;
@@ -498,6 +504,7 @@
 
 
 static void setDrJoin (u1_t reason, u1_t dr) {
+    //debug_str("setDrJoin\r\n");                                      
     EV(drChange, INFO, (e_.reason    = reason,
                         e_.deveui    = MAIN::CDEV->getEui(),
                         e_.dr        = dr|DR_PAGE,
@@ -510,6 +517,7 @@
 
 
 static void setDrTxpow (u1_t reason, u1_t dr, s1_t pow) {
+    //debug_str("setDrTxpow\r\n");                                      
     EV(drChange, INFO, (e_.reason    = reason,
                         e_.deveui    = MAIN::CDEV->getEui(),
                         e_.dr        = dr|DR_PAGE,
@@ -528,11 +536,13 @@
 
 
 void LMIC_stopPingable (void) {
+    //debug_str("LMIC_stopPingable\r\n");                                      
     LMIC.opmode &= ~(OP_PINGABLE|OP_PINGINI);
 }
 
 
 void LMIC_setPingable (u1_t intvExp) {
+    //debug_str("LMIC_setPingable\r\n");                                      
     // Change setting
     LMIC.ping.intvExp = (intvExp & 0x7);
     LMIC.opmode |= OP_PINGABLE;
@@ -560,6 +570,7 @@
 };
 
 static void initDefaultChannels (bit_t join) {
+    //debug_str("initDefaultChannels\r\n");                                      
     os_clearMem(&LMIC.channelFreq, sizeof(LMIC.channelFreq));
     os_clearMem(&LMIC.channelDrMap, sizeof(LMIC.channelDrMap));
     os_clearMem(&LMIC.bands, sizeof(LMIC.bands));
@@ -585,11 +596,12 @@
     LMIC.bands[BAND_DECI ].txpow    = 27;
     LMIC.bands[BAND_CENTI].lastchnl = os_getRndU1() % MAX_CHANNELS;
     LMIC.bands[BAND_MILLI].avail = 
-    LMIC.bands[BAND_CENTI].avail =
+    LMIC.bands[BAND_CENTI].avail = 
     LMIC.bands[BAND_DECI ].avail = os_getTime();
 }
 
 bit_t LMIC_setupBand (u1_t bandidx, s1_t txpow, u2_t txcap) {
+    //debug_str("LMIC_setupBand\r\n");                                      
     if( bandidx > BAND_AUX ) return 0;
     band_t* b = &LMIC.bands[bandidx];
     b->txpow = txpow;
@@ -600,6 +612,7 @@
 }
 
 bit_t LMIC_setupChannel (u1_t chidx, u4_t freq, u2_t drmap, s1_t band) {
+    //debug_str("LMIC_setupChannel\r\n");                                      
     if( chidx >= MAX_CHANNELS )
         return 0;
     if( band == -1 ) {
@@ -621,12 +634,14 @@
 }
 
 void LMIC_disableChannel (u1_t channel) {
+    //debug_str("LMIC_disableChannel\r\n");                                      
     LMIC.channelFreq[channel] = 0;
     LMIC.channelDrMap[channel] = 0;
     LMIC.channelMap &= ~(1<<channel);
 }
 
 static u4_t convFreq (xref2u1_t ptr) {
+    //debug_str("convFreq\r\n");                                      
     u4_t freq = (os_rlsbf4(ptr-1) >> 8) * 100;
     if( freq < EU868_FREQ_MIN || freq > EU868_FREQ_MAX )
         freq = 0;
@@ -634,6 +649,7 @@
 }
 
 static u1_t mapChannels (u1_t chpage, u2_t chmap) {
+    //debug_str("mapChannels\r\n");                                      
     // Bad page, disable all channel, enable non-existent
     if( chpage != 0 || chmap==0 || (chmap & ~LMIC.channelMap) != 0 )
         return 0;  // illegal input
@@ -647,6 +663,7 @@
 
 
 static void updateTx (ostime_t txbeg) {
+    //debug_str("updateTx\r\n");                                      
     u4_t freq = LMIC.channelFreq[LMIC.txChnl];
     // Update global/band specific duty cycle stats
     ostime_t airtime = calcAirTime(LMIC.rps, LMIC.dataLen);
@@ -660,6 +677,7 @@
 }
 
 static ostime_t nextTx (ostime_t now) {
+    //debug_str("nextTx\r\n");                                      
     u1_t bmap=0xF;
     do {
         ostime_t mintime = now + /*10h*/36000*OSTICKS_PER_SEC;
@@ -676,12 +694,14 @@
             if( (LMIC.channelMap & (1<<chnl)) != 0  &&  // channel enabled
                 (LMIC.channelDrMap[chnl] & (1<<(LMIC.datarate&0xF))) != 0  &&
                 band == (LMIC.channelFreq[chnl] & 0x3) ) { // in selected band
+                //debug_str("channel enabled in selected band\r\n");
                 LMIC.txChnl = LMIC.bands[band].lastchnl = chnl;
                 return mintime;
             }
         }
         if( (bmap &= ~(1<<band)) == 0 ) {
             // No feasible channel  found!
+            //debug_str("No feasible channel  found!\r\n");
             return mintime;
         }
     } while(1);
@@ -689,6 +709,7 @@
 
 
 static void setBcnRxParams (void) {
+    //debug_str("setBcnRxParams\r\n");                                      
     LMIC.dataLen = 0;
     LMIC.freq = LMIC.channelFreq[LMIC.bcnChnl] & ~(u4_t)3;
     LMIC.rps  = setIh(setNocrc(dndr2rps((dr_t)DR_BCN),1),LEN_BCN);
@@ -697,6 +718,7 @@
 #define setRx1Params() /*LMIC.freq/rps remain unchanged*/
 
 static void initJoinLoop (void) {
+    //debug_str("initJoinLoop\r\n");                                      
     LMIC.txChnl = os_getRndU1() % 6;
     LMIC.adrTxPow = 14;
     setDrJoin(DRCHG_SET, DR_SF7);
@@ -707,6 +729,7 @@
 
 
 static ostime_t nextJoinState (void) {
+    //debug_str("nextJoinState\r\n");                                      
     u1_t failed = 0;
 
     // Try 869.x and then 864.x with same DR
@@ -750,12 +773,14 @@
 
 
 static void initDefaultChannels (void) {
+    //debug_str("initDefaultChannels\r\n");                                      
     for( u1_t i=0; i<4; i++ )
         LMIC.channelMap[i] = 0xFFFF;
     LMIC.channelMap[4] = 0x00FF;
 }
 
 static u4_t convFreq (xref2u1_t ptr) {
+    //debug_str("convFreq\r\n");                                      
     u4_t freq = (os_rlsbf4(ptr-1) >> 8) * 100;
     if( freq >= US915_FREQ_MIN && freq <= US915_FREQ_MAX )
         freq = 0;
@@ -763,6 +788,7 @@
 }
 
 bit_t LMIC_setupChannel (u1_t chidx, u4_t freq, u2_t drmap, s1_t band) {
+    //debug_str("LMIC_setupChannel\r\n");                                      
     if( chidx < 72 || chidx >= 72+MAX_XCHANNELS )
         return 0; // channels 0..71 are hardwired
     chidx -= 72;
@@ -773,11 +799,13 @@
 }
 
 void LMIC_disableChannel (u1_t channel) {
+    //debug_str("LMIC_disableChannel\r\n");                                      
     if( channel < 72+MAX_XCHANNELS )
         LMIC.channelMap[channel/4] &= ~(1<<(channel&0xF));
 }
 
 static u1_t mapChannels (u1_t chpage, u2_t chmap) {
+    //debug_str("mapChannels\r\n");                                      
     if( chpage == MCMD_LADR_CHP_125ON || chpage == MCMD_LADR_CHP_125OFF ) {
         u2_t en125 = chpage == MCMD_LADR_CHP_125ON ? 0xFFFF : 0x0000;
         for( u1_t u=0; u<4; u++ )
@@ -792,6 +820,7 @@
 }
 
 static void updateTx (ostime_t txbeg) {
+    //debug_str("updateTx\r\n");                                      
     u1_t chnl = LMIC.txChnl;
     if( chnl < 64 ) {
         LMIC.freq = US915_125kHz_UPFBASE + chnl*US915_125kHz_UPFSTEP;
@@ -816,6 +845,7 @@
 // US does not have duty cycling - return now as earliest TX time
 #define nextTx(now) (_nextTx(),(now))
 static void _nextTx (void) {
+    //debug_str("_nextTx\r\n");                                      
     if( LMIC.chRnd==0 )
         LMIC.chRnd = os_getRndU1() & 0x3F;
     if( LMIC.datarate >= DR_SF8C ) { // 500kHz
@@ -839,12 +869,14 @@
 }
 
 static void setBcnRxParams (void) {
+    //debug_str("setBcnRxParams\r\n");                                      
     LMIC.dataLen = 0;
     LMIC.freq = US915_500kHz_DNFBASE + LMIC.bcnChnl * US915_500kHz_DNFSTEP;
     LMIC.rps  = setIh(setNocrc(dndr2rps((dr_t)DR_BCN),1),LEN_BCN);
 }
 
 #define setRx1Params() {                                                \
+    //debug_str("setRx1Params\r\n");                                      \
     LMIC.freq = US915_500kHz_DNFBASE + (LMIC.txChnl & 0x7) * US915_500kHz_DNFSTEP; \
     if( /* TX datarate */LMIC.dndr < DR_SF8C )                          \
         LMIC.dndr += DR_SF10CR - DR_SF10;                               \
@@ -854,6 +886,7 @@
 }
 
 static void initJoinLoop (void) {
+    //debug_str("initJoinLoop\r\n");
     LMIC.chRnd = 0;
     LMIC.txChnl = 0;
     LMIC.adrTxPow = 20;
@@ -863,6 +896,7 @@
 }
 
 static ostime_t nextJoinState (void) {
+    //debug_str("nextJoinState\r\n");
     // Try the following:
     //   SF7/8/9/10  on a random channel 0..63
     //   SF8C        on a random channel 64..71
@@ -902,11 +936,13 @@
 
 
 static void runEngineUpdate (xref2osjob_t osjob) {
+    //debug_str("runEngineUpdate\r\n");
     engineUpdate();
 }
 
 
 static void reportEvent (ev_t ev) {
+    //debug_str("reportEvent\r\n");
     EV(devCond, INFO, (e_.reason = EV::devCond_t::LMIC_EV,
                        e_.eui    = MAIN::CDEV->getEui(),
                        e_.info   = ev));
@@ -916,6 +952,7 @@
 
 
 static void runReset (xref2osjob_t osjob) {
+    //debug_str("runReset\r\n");
     // Disable session
     LMIC_reset();
     LMIC_startJoining();
@@ -923,6 +960,7 @@
 }
 
 static void stateJustJoined (void) {
+    //debug_str("stateJustJoined\r\n");
     LMIC.seqnoDn     = LMIC.seqnoUp = 0;
     LMIC.rejoinCnt   = 0;
     LMIC.dnConf      = LMIC.adrChanged = LMIC.ladrAns = LMIC.devsAns = 0;
@@ -944,6 +982,7 @@
 
 // Decode beacon  - do not overwrite bcninfo unless we have a match!
 static int decodeBeacon (void) {
+    //debug_str("decodeBeacon\r\n");
     ASSERT(LMIC.dataLen == LEN_BCN); // implicit header RX guarantees this
     xref2u1_t d = LMIC.frame;
     if(
@@ -980,6 +1019,7 @@
 
 
 static bit_t decodeFrame (void) {
+    //debug_str("decodeFrame\r\n");
     //debug_str("decodeFrame: ");
     //debug_buf(LMIC.frame, LMIC.dataLen);
     xref2u1_t d = LMIC.frame;
@@ -1074,6 +1114,8 @@
         
         if (port != 3) LMIC.dnConf = (ftype == HDR_FTYPE_DCDN ? FCT_ACK : 0);
         else LMIC.dnConf = 0;
+        
+//        if (LMIC.dnConf != 0) debug_str("ACK IS ON!!\r\n");
     }
 
     if( LMIC.dnConf || (fct & FCT_MORE) )
@@ -1463,6 +1505,7 @@
 
 
 static void setupRx2 (void) {
+    //debug_str("setupRx2\r\n");
     LMIC.txrxFlags = TXRX_DNW2;
     LMIC.rps = dndr2rps(LMIC.dn2Dr);
     LMIC.freq = LMIC.dn2Freq;
@@ -1472,12 +1515,14 @@
 
 
 static void schedRx2 (ostime_t delay, osjobcb_t func) {
+    //debug_str("schedRx2\r\n");
     // Add 1.5 symbols we need 5 out of 8. Try to sync 1.5 symbols into the preamble.
     LMIC.rxtime = LMIC.txend + delay + (PAMBL_SYMS-MINRX_SYMS)*dr2hsym(LMIC.dn2Dr);
     os_setTimedCallback(&LMIC.osjob, LMIC.rxtime - RX_RAMPUP, func);
 }
 
 static void setupRx1 (osjobcb_t func) {
+    //debug_str("setupRx1\r\n");
     LMIC.txrxFlags = TXRX_DNW1;
     // Turn LMIC.rps from TX over to RX
     LMIC.rps = setNocrc(LMIC.rps,1);
@@ -1489,6 +1534,7 @@
 
 // Called by HAL once TX complete and delivers exact end of TX time stamp in LMIC.rxtime
 static void txDone (ostime_t delay, osjobcb_t func) {
+    //debug_str("txDone\r\n");
     if( (LMIC.opmode & (OP_TRACK|OP_PINGABLE|OP_PINGINI)) == (OP_TRACK|OP_PINGABLE) ) {
         rxschedInit(&LMIC.ping);    // note: reuses LMIC.frame buffer!
         LMIC.opmode |= OP_PINGINI;
@@ -1517,6 +1563,7 @@
 
 
 static void onJoinFailed (xref2osjob_t osjob) {
+    //debug_str("onJoinFailed\r\n");
     // Notify app - must call LMIC_reset() to stop joining
     // otherwise join procedure continues.
     reportEvent(EV_JOIN_FAILED);
@@ -1524,6 +1571,7 @@
 
 
 static bit_t processJoinAccept (void) {
+    //debug_str("processJoinAccept\r\n");
     ASSERT(LMIC.txrxFlags != TXRX_DNW1 || LMIC.dataLen != 0);
     ASSERT((LMIC.opmode & OP_TXRXPEND)!=0);
 
@@ -1622,6 +1670,7 @@
 
 
 static void processRx2Jacc (xref2osjob_t osjob) {
+    //debug_str("processRx2Jacc\r\n");
     if( LMIC.dataLen == 0 )
         LMIC.txrxFlags = 0;  // nothing in 1st/2nd DN slot
     processJoinAccept();
@@ -1629,23 +1678,27 @@
 
 
 static void setupRx2Jacc (xref2osjob_t osjob) {
+    //debug_str("setupRx2Jacc\r\n");
     LMIC.osjob.func = FUNC_ADDR(processRx2Jacc);
     setupRx2();
 }
 
 
 static void processRx1Jacc (xref2osjob_t osjob) {
+    //debug_str("processRx1Jacc\r\n");
     if( LMIC.dataLen == 0 || !processJoinAccept() )
         schedRx2(DELAY_JACC2_osticks, FUNC_ADDR(setupRx2Jacc));
 }
 
 
 static void setupRx1Jacc (xref2osjob_t osjob) {
+    //debug_str("setupRx1Jacc\r\n");
     setupRx1(FUNC_ADDR(processRx1Jacc));
 }
 
 
 static void jreqDone (xref2osjob_t osjob) {
+    //debug_str("jreqDone\r\n");
     txDone(DELAY_JACC1_osticks, FUNC_ADDR(setupRx1Jacc));
 }
 
@@ -1655,10 +1708,12 @@
 static bit_t processDnData(void);
 
 static void processRx2DnDataDelay (xref2osjob_t osjob) {
+    //debug_str("processDnData\r\n");
     processDnData();
 }
 
 static void processRx2DnData (xref2osjob_t osjob) {
+    //debug_str("processRx2DnData\r\n");
     if( LMIC.dataLen == 0 ) {
         LMIC.txrxFlags = 0;  // nothing in 1st/2nd DN slot
         // Delay callback processing to avoid up TX while gateway is txing our missed frame! 
@@ -1673,23 +1728,28 @@
 
 
 static void setupRx2DnData (xref2osjob_t osjob) {
+    //debug_str("setupRx2DnData\r\n");
     LMIC.osjob.func = FUNC_ADDR(processRx2DnData);
     setupRx2();
 }
 
 
 static void processRx1DnData (xref2osjob_t osjob) {
+    //debug_str("processRx1DnData\r\n");
     if( LMIC.dataLen == 0 || !processDnData() )
         schedRx2(DELAY_DNW2_osticks, FUNC_ADDR(setupRx2DnData));
 }
 
 
 static void setupRx1DnData (xref2osjob_t osjob) {
+    //debug_str("setupRx1DnData\r\n");
+
     setupRx1(FUNC_ADDR(processRx1DnData));
 }
 
 
 static void updataDone (xref2osjob_t osjob) {
+    //debug_str("updataDone\r\n");
     txDone(DELAY_DNW1_osticks, FUNC_ADDR(setupRx1DnData));
 }
 
@@ -1700,6 +1760,7 @@
     //debug_str("buildDataFrame\r\n");
     bit_t txdata = ((LMIC.opmode & (OP_TXDATA|OP_POLL)) != OP_POLL);
     u1_t dlen = txdata ? LMIC.pendTxLen : 0;
+    if (LMIC.dnConf != 0) debug_str("ACK IS ON!!\r\n");
 
     // Piggyback MAC options
     // Prioritize by importance
@@ -1817,6 +1878,7 @@
 
 // Callback from HAL during scan mode or when job timer expires.
 static void onBcnRx (xref2osjob_t job) {
+    //debug_str("onBcnRx\r\n");
     // If we arrive via job timer make sure to put radio to rest.
     os_radio(RADIO_RST);
     os_clearCallback(&LMIC.osjob);
@@ -1849,6 +1911,7 @@
 // Implicitely cancels any pending TX/RX transaction.
 // Also cancels an onpoing joining procedure.
 static void startScan (void) {
+    //debug_str("startScan\r\n");
     ASSERT(LMIC.devaddr!=0 && (LMIC.opmode & OP_JOINING)==0);
     if( (LMIC.opmode & OP_SHUTDOWN) != 0 )
         return;
@@ -1863,6 +1926,7 @@
 
 
 bit_t LMIC_enableTracking (u1_t tryBcnInfo) {
+    //debug_str("LMIC_enableTracking\r\n");
     if( (LMIC.opmode & (OP_SCAN|OP_TRACK|OP_SHUTDOWN)) != 0 )
         return 0;  // already in progress or failed to enable
     // If BCN info requested from NWK then app has to take are
@@ -1874,6 +1938,7 @@
 
 
 void LMIC_disableTracking (void) {
+    //debug_str("LMIC_disableTracking\r\n");
     LMIC.opmode &= ~(OP_SCAN|OP_TRACK);
     LMIC.bcninfoTries = 0;
     engineUpdate();
@@ -1887,6 +1952,7 @@
 // ================================================================================
 
 static void buildJoinRequest (u1_t ftype) {
+    //debug_str("buildJoinRequest\r\n");
     // Do not use pendTxData since we might have a pending
     // user level frame in there. Use RX holding area instead.
     xref2u1_t d = LMIC.frame;
@@ -1910,11 +1976,13 @@
 }
 
 static void startJoining (xref2osjob_t osjob) {
+    //debug_str("startJoining\r\n");
     reportEvent(EV_JOINING);
 }
 
 // Start join procedure if not already joined.
 bit_t LMIC_startJoining (void) {
+    //debug_str("LMIC_startJoining\r\n");
     if( LMIC.devaddr == 0 ) {
         // There should be no TX/RX going on
         ASSERT((LMIC.opmode & (OP_POLL|OP_TXRXPEND)) == 0);
@@ -1941,6 +2009,7 @@
 // ================================================================================
 
 static void processPingRx (xref2osjob_t osjob) {
+    //debug_str("processPingRx\r\n");
     if( LMIC.dataLen != 0 ) {
         LMIC.txrxFlags = TXRX_PING;
         if( decodeFrame() ) {
@@ -1954,6 +2023,7 @@
 
 
 static bit_t processDnData (void) {
+    //debug_str("processDnData\r\n");
     ASSERT((LMIC.opmode & OP_TXRXPEND)!=0);
 
     if( LMIC.dataLen == 0 ) {
@@ -2022,6 +2092,7 @@
 
 
 static void processBeacon (xref2osjob_t osjob) {
+    //debug_str("processBeacon\r\n");
     ostime_t lasttx = LMIC.bcninfo.txtime;   // save here - decodeBeacon might overwrite
     u1_t flags = LMIC.bcninfo.flags;
     ev_t ev;
@@ -2061,10 +2132,10 @@
         LMIC.bcninfo.time   += BCN_INTV_sec;
         LMIC.missedBcns++;
         // Delay any possible TX after surmised beacon - it's there although we missed it
-        debug_str("Delayed!! -- 2064"); 
+        //debug_str("Delayed!! -- 2064"); 
         debug_uint(LMIC.bcninfo.txtime + BCN_RESERVE_osticks);
-        debug_char( '\r' );
-        debug_char( '\n' );
+        //debug_char( '\r' );
+        //debug_char( '\n' );
         txDelay(LMIC.bcninfo.txtime + BCN_RESERVE_osticks, 4);
         if( LMIC.missedBcns > MAX_MISSED_BCNS )
             LMIC.opmode |= OP_REJOIN;  // try if we can roam to another network
@@ -2087,12 +2158,14 @@
 
 
 static void startRxBcn (xref2osjob_t osjob) {
+    //debug_str("startRxBcn\r\n");
     LMIC.osjob.func = FUNC_ADDR(processBeacon);
     os_radio(RADIO_RX);
 }
 
 
 static void startRxPing (xref2osjob_t osjob) {
+    //debug_str("startRxPing\r\n");
     LMIC.osjob.func = FUNC_ADDR(processPingRx);
     os_radio(RADIO_RX);
 }
@@ -2101,7 +2174,7 @@
 // Decide what to do next for the MAC layer of a device
 static void engineUpdate (void) {
     
-//    debug_str("Engine Update\r\n");
+    //debug_str("Engine Update\r\n");
     // Check for ongoing state: scan or TX/RX transaction
     if( (LMIC.opmode & (OP_SCAN|OP_TXRXPEND|OP_SHUTDOWN)) != 0 ) 
         return;
@@ -2150,7 +2223,7 @@
             goto checkrx;
         }
         // Earliest possible time vs overhead to setup radio
-        if( txbeg - (now + TX_RAMPUP) < 0 ) {
+        /*PANYif( txbeg - (now + TX_RAMPUP) < 0 ) {PANY*/
             // We could send right now!
             debug_str("We could send right now!"); 
             debug_char( '\r' );
@@ -2197,14 +2270,13 @@
             updateTx(txbeg);
             os_radio(RADIO_TX);
             return;
-        }
+        /*PANY}PANY*/
         // Cannot yet TX
         if( (LMIC.opmode & OP_TRACK) == 0 )
         {
-            debug_str("We don't track the beacon - nothing else to do - so wait for the time to TX!"); 
+            /*debug_str("We don't track the beacon - nothing else to do - so wait for the time to TX!"); 
             debug_char( '\r' );
-            debug_char( '\n' );
-            //return;
+            debug_char( '\n' );*/
             goto txdelay; // We don't track the beacon - nothing else to do - so wait for the time to TX
         }
         // Consider RX tasks
@@ -2250,35 +2322,41 @@
     return;
 
   txdelay:
-    debug_char( '\r' );
-    debug_char( '\n' );
-    debug_str("TX DELAY: Wait for ");
-    debug_uint(txbeg-TX_RAMPUP); 
-    debug_char( '\r' );
-    debug_char( '\n' );
+    //debug_char( '\r' );
+    //debug_char( '\n' );
+    debug_str("TX DELAY: Wait ...");
+    char buffer[10];
+    sprintf(buffer, "%d", (txbeg-TX_RAMPUP));
+    
+    debug_str(buffer); 
+    //debug_char( '\r' );
+    //debug_char( '\n' );
     debug_char( '\r' );
     debug_char( '\n' );
     EV(devCond, INFO, (e_.reason = EV::devCond_t::TX_DELAY,
                        e_.eui    = MAIN::CDEV->getEui(),
                        e_.info   = osticks2ms(txbeg-now),
                        e_.info2  = LMIC.seqnoUp-1));
-    os_setTimedCallback(&LMIC.osjob, txbeg-TX_RAMPUP, FUNC_ADDR(runEngineUpdate));
-    //os_setCallback(&LMIC.osjob, FUNC_ADDR(runEngineUpdate));
+    os_setTimedCallback(&LMIC.osjob, (txbeg-TX_RAMPUP), FUNC_ADDR(runEngineUpdate));
+    //debug_str("TX DELAY: Stop To Wait ...");
 }
 
 
 void LMIC_setAdrMode (bit_t enabled) {
+    //debug_str("LMIC_setAdrMode\r\n");
     LMIC.adrEnabled = enabled ? FCT_ADREN : 0;
 }
 
 
 //  Should we have/need an ext. API like this?
 void LMIC_setDrTxpow (dr_t dr, s1_t txpow) {
+    //debug_str("LMIC_setDrTxpow\r\n");
     setDrTxpow(DRCHG_SET, dr, txpow);
 }
 
 
 void LMIC_shutdown (void) {
+    //debug_str("LMIC_shutdown\r\n");
     os_clearCallback(&LMIC.osjob);
     os_radio(RADIO_RST);
     LMIC.opmode |= OP_SHUTDOWN;
@@ -2286,6 +2364,7 @@
 
 
 void LMIC_reset (void) {
+    //debug_str("LMIC_reset\r\n");
     EV(devCond, INFO, (e_.reason = EV::devCond_t::LMIC_EV,
                        e_.eui    = MAIN::CDEV->getEui(),
                        e_.info   = EV_RESET));
@@ -2317,11 +2396,13 @@
 
 
 void LMIC_init (void) {
+    //debug_str("LMIC_init\r\n");
     LMIC.opmode = OP_SHUTDOWN;
 }
 
 
 void LMIC_clrTxData (void) {
+    //debug_str("LMIC_clrTxData\r\n");
     LMIC.opmode &= ~(OP_TXDATA|OP_TXRXPEND|OP_POLL);
     LMIC.pendTxLen = 0;
     if( (LMIC.opmode & (OP_JOINING|OP_SCAN)) != 0 ) // do not interfere with JOINING
@@ -2333,6 +2414,7 @@
 
 
 void LMIC_setTxData (void) {
+    //debug_str("LMIC_setTxData\r\n");
     LMIC.opmode |= OP_TXDATA;
     if( (LMIC.opmode & OP_JOINING) == 0 )
     {
@@ -2344,6 +2426,7 @@
 
 //
 int LMIC_setTxData2 (u1_t port, xref2u1_t data, u1_t dlen, u1_t confirmed) {
+    //debug_str("LMIC_setTxData2\r\n");
 /*    debug_val("Data Length: ", dlen);
     debug_val("Data Length: ", SIZEOFEXPR(LMIC.pendTxData));*/
     if( dlen > SIZEOFEXPR(LMIC.pendTxData) )
@@ -2367,6 +2450,7 @@
 
 // Send a payload-less message to signal device is alive
 void LMIC_sendAlive (void) {
+    //debug_str("LMIC_sendAlive\r\n");
     LMIC.opmode |= OP_POLL;
     engineUpdate();
 }
@@ -2374,6 +2458,7 @@
 
 // Check if other networks are around.
 void LMIC_tryRejoin (void) {
+    //debug_str("LMIC_tryRejoin\r\n");
     LMIC.opmode |= OP_REJOIN;
     engineUpdate();
 }
@@ -2393,6 +2478,7 @@
 //! \param artKey  the 16 byte application router session key used for message confidentiality.
 //!     If NULL the caller has copied the key into `LMIC.artKey` before.
 void LMIC_setSession (u4_t netid, devaddr_t devaddr, xref2u1_t nwkKey, xref2u1_t artKey) {
+    //debug_str("LMIC_setSession\r\n");
     LMIC.netid = netid;
     LMIC.devaddr = devaddr;
     if( nwkKey != (xref2u1_t)0 )
@@ -2418,6 +2504,7 @@
 // nor is the datarate changed.
 // This must be called only if a session is established (e.g. after EV_JOINED)
 void LMIC_setLinkCheckMode (bit_t enabled) {
+    //debug_str("LMIC_setLinkCheckMode\r\n");
     LMIC.adrChanged = 0;
     LMIC.adrAckReq = enabled ? LINK_CHECK_INIT : LINK_CHECK_OFF;
 }