             case EV_TXSTART:
                 // this event tells us that a transmit is about to start.
                 // but printing here is bad for timing.
-                Serial.print(F(": ch "));
-                Serial.print(unsigned(e.txChnl));
+                printTxChnl(e.txChnl);
                 printRps(e.rps);
-                Serial.print(F(", datarate ")); Serial.print(unsigned(e.datarate));
+                printDatarate(e.datarate);
                 printOpmode(e.opmode);
                 printTxend(e.txend);
                 break;
 
             case EV_RXSTART:
-                Serial.print(F(": freq="));
                 printFreq(e.freq);
                 printRps(e.rps);
-                Serial.print(F(", datarate ")); Serial.print(unsigned(e.datarate));
+                printDatarate(e.datarate);
                 printOpmode(e.opmode);
                 printTxend(e.txend);
                 Serial.print(F(", delta ms ")); Serial.print(osticks2ms(e.time - e.txend));
                 break;
 
             case EV_JOIN_TXCOMPLETE:
-                Serial.print(F(": saveIrqFlags 0x"));
-                Serial.print(unsigned(e.saveIrqFlags), HEX);
+                printSaveIrqFlags(e.saveIrqFlags);
                 break;
 
             default:
                 break;
         }
     }
-    Serial.println("");
+    printNl();
 }
 
 /*

    while (! Serial)
        ;
    Serial.begin(115200);
    Serial.println(F("Starting"));

    // LMIC init using the computed target
    const auto pPinMap = Arduino_LMIC::GetPinmap_ThisBoard();

                break;

            case EV_TXCOMPLETE:
                printTxChnl(e.txChnl);
                printRps(e.rps);
                printTxrxflags(e.txrxFlags);
                break;
            case EV_LOST_TSYNC:
                break;
