Transceiver: Move out TRXD socket send code to prepare for TRXDv1

Only old v0 is supported so far. TRXD protocol related data/logic is
moved to its own file out of Transceiver class. Code is refactored so it
can be re-used later by TRXDv1.

Related: OS#4006
Change-Id: I5786dd44b076202c6f1a6e82405670e8605797ed
diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp
index 5c5707b..6bbf3a3 100644
--- a/Transceiver52M/Transceiver.cpp
+++ b/Transceiver52M/Transceiver.cpp
@@ -31,7 +31,7 @@
 #include "osmo_signal.h"
 #include "proto_trxd.h"
 
-#include <osmocom/core/bits.h>
+#include <osmocom/core/utils.h>
 #include <osmocom/core/socket.h>
 }
 
@@ -125,7 +125,7 @@
     rssiOffset(wRssiOffset), stackSize(wStackSize),
     mSPSTx(tx_sps), mSPSRx(rx_sps), mChans(chans), mEdge(false), mOn(false), mForceClockInterface(false),
     mTxFreq(0.0), mRxFreq(0.0), mTSC(0), mMaxExpectedDelayAB(0), mMaxExpectedDelayNB(0),
-    mWriteBurstToDiskMask(0)
+    mWriteBurstToDiskMask(0), mVersionTRXD(0)
 {
   txFullScale = mRadioInterface->fullScaleInputValue();
   rxFullScale = mRadioInterface->fullScaleOutputValue();
@@ -971,36 +971,20 @@
 
 void Transceiver::driveReceiveFIFO(size_t chan)
 {
-  int msgLen;
-  int TOAint;  // in 1/256 symbols
-
   struct trx_ul_burst_ind bi;
 
-  if (!pullRadioVector(chan, &bi) || bi.idle)
+  if (!pullRadioVector(chan, &bi))
         return;
+  if (!bi.idle)
+       logRxBurst(chan, &bi);
 
-  logRxBurst(chan, &bi);
-
-  TOAint = (int) (bi.toa * 256.0 + 0.5); // round to closest integer
-
-  char burstString[sizeof(struct trxd_hdr_v0) + bi.nbits + 2];
-  struct trxd_hdr_v0* pkt = (struct trxd_hdr_v0*)burstString;
-  pkt->common.version = 0;
-  pkt->common.reserved = 0;
-  pkt->common.tn = bi.tn;
-  osmo_store32be(bi.fn, &pkt->common.fn);
-  pkt->v0.rssi = bi.rssi;
-  osmo_store16be(TOAint, &pkt->v0.toa);
-
-  for (unsigned i = 0; i < bi.nbits; i++)
-    pkt->soft_bits[i] = (char) round(bi.rx_burst[i] * 255.0);
-
-  /* +1: Historical reason. There's an uninitizalied byte in there: pkt->soft_bits[bi.nbits] */
-  pkt->soft_bits[bi.nbits + 1] = '\0';
-
-  msgLen = write(mDataSockets[chan], burstString, sizeof(struct trxd_hdr_v0) + bi.nbits + 2);
-  if (msgLen <= 0)
-    LOGCHAN(chan, DTRXCTRL, WARNING) << "mDataSockets write(" << mCtrlSockets[chan] << ") failed: " << msgLen;
+  switch (mVersionTRXD) {
+    case 0:
+      trxd_send_burst_ind_v0(chan, mDataSockets[chan], &bi);
+      break;
+    default:
+      OSMO_ASSERT(false);
+  }
 }
 
 void Transceiver::driveTxFIFO()