<p>pespin <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/14657">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  fixeria: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Transceiver: Support TRXD v1<br><br>Related: OS#4006<br>Change-Id: I53db2678458a7377c87875b58b58b76a1b900517<br>---<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/proto_trxd.c<br>M Transceiver52M/proto_trxd.h<br>3 files changed, 98 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index 080afd1..b73e698 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -618,6 +618,10 @@</span><br><span>   bi->toa = 0.0;</span><br><span>   bi->noise = 0.0;</span><br><span>   bi->idle = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->modulation = MODULATION_GMSK;</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->tss = 0; /* TODO: we only support tss 0 right now */</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->tsc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->ci = 0.0;</span><br><span> </span><br><span>   /* Select the diversity channel with highest energy */</span><br><span>   for (size_t i = 0; i < radio_burst->chans(); i++) {</span><br><span>@@ -665,13 +669,18 @@</span><br><span> </span><br><span>   type = (CorrType) rc;</span><br><span>   bi->toa = ebp.toa;</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->tsc = ebp.tsc;</span><br><span style="color: hsl(120, 100%, 40%);">+  bi->ci = ebp.ci;</span><br><span>   rxBurst = demodAnyBurst(*burst, mSPSRx, ebp.amp, ebp.toa, type);</span><br><span> </span><br><span>   /* EDGE demodulator returns 444 (gSlotLen * 3) bits */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (rxBurst->size() == EDGE_BURST_NBITS)</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rxBurst->size() == EDGE_BURST_NBITS) {</span><br><span style="color: hsl(120, 100%, 40%);">+    bi->modulation = MODULATION_8PSK;</span><br><span>     bi->nbits = EDGE_BURST_NBITS;</span><br><span style="color: hsl(0, 100%, 40%);">-  else /* size() here is actually gSlotLen + 8, due to guard periods */</span><br><span style="color: hsl(120, 100%, 40%);">+  } else { /* size() here is actually gSlotLen + 8, due to guard periods */</span><br><span style="color: hsl(120, 100%, 40%);">+    bi->modulation = MODULATION_GMSK;</span><br><span>     bi->nbits = gSlotLen;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>   // Convert -1..+1 soft bits to 0..1 soft bits</span><br><span>   vectorSlicer(bi->rx_burst, rxBurst->begin(), bi->nbits);</span><br><span>@@ -980,6 +989,7 @@</span><br><span>     << " noise: "  << std::setw(5) << std::setprecision(1) << (bi->noise - rssiOffset)</span><br><span>                    << "dBFS/" << std::setw(6) << -bi->noise << "dBm"</span><br><span>     << " TOA: "    << std::setw(5) << std::setprecision(2) << bi->toa</span><br><span style="color: hsl(120, 100%, 40%);">+    << " C/I: "    << std::setw(5) << std::setprecision(2) << bi->ci << "dB"</span><br><span>     << " bits: "   << os;</span><br><span> }</span><br><span> </span><br><span>@@ -996,6 +1006,9 @@</span><br><span>     case 0:</span><br><span>       trxd_send_burst_ind_v0(chan, mDataSockets[chan], &bi);</span><br><span>       break;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+      trxd_send_burst_ind_v1(chan, mDataSockets[chan], &bi);</span><br><span style="color: hsl(120, 100%, 40%);">+      break;</span><br><span>     default:</span><br><span>       OSMO_ASSERT(false);</span><br><span>   }</span><br><span>diff --git a/Transceiver52M/proto_trxd.c b/Transceiver52M/proto_trxd.c</span><br><span>index 5cf22e6..fff23da 100644</span><br><span>--- a/Transceiver52M/proto_trxd.c</span><br><span>+++ b/Transceiver52M/proto_trxd.c</span><br><span>@@ -43,6 +43,21 @@</span><br><span>        osmo_store16be(toa_int, &v0->toa);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void trxd_fill_v1_specific(struct trxd_hdr_v1_specific *v1, const struct trx_ul_burst_ind *bi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int16_t ci_int_cB;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* deciBels->centiBels, round to closest integer */</span><br><span style="color: hsl(120, 100%, 40%);">+        ci_int_cB = (int16_t)((bi->ci * 10) + 0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      v1->idle = !!bi->idle;</span><br><span style="color: hsl(120, 100%, 40%);">+  v1->modulation = (bi->modulation == MODULATION_GMSK) ?</span><br><span style="color: hsl(120, 100%, 40%);">+                                  TRXD_MODULATION_GMSK(bi->tss) :</span><br><span style="color: hsl(120, 100%, 40%);">+                                    TRXD_MODULATION_8PSK(bi->tss);</span><br><span style="color: hsl(120, 100%, 40%);">+     v1->tsc = bi->tsc;</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_store16be(ci_int_cB, &v1->ci);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void trxd_fill_burst_normalized255(uint8_t* soft_bits, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>     unsigned i;</span><br><span>@@ -75,3 +90,28 @@</span><br><span>     }</span><br><span>    return true;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool trxd_send_burst_ind_v1(size_t chan, int fd, const struct trx_ul_burst_ind *bi) {</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       size_t buf_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     buf_len = sizeof(struct trxd_hdr_v1);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bi->idle)</span><br><span style="color: hsl(120, 100%, 40%);">+             buf_len += bi->nbits;</span><br><span style="color: hsl(120, 100%, 40%);">+      char buf[buf_len];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  struct trxd_hdr_v1* pkt = (struct trxd_hdr_v1*)buf;</span><br><span style="color: hsl(120, 100%, 40%);">+   trxd_fill_common(&pkt->common, bi, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ trxd_fill_v0_specific(&pkt->v0, bi);</span><br><span style="color: hsl(120, 100%, 40%);">+   trxd_fill_v1_specific(&pkt->v1, bi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bi->idle)</span><br><span style="color: hsl(120, 100%, 40%);">+             trxd_fill_burst_normalized255(&pkt->soft_bits[0], bi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = write(fd, buf, buf_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             CLOGCHAN(chan, DMAIN, LOGL_NOTICE, "mDataSockets write(%d) failed: %d\n", fd, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+          return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/Transceiver52M/proto_trxd.h b/Transceiver52M/proto_trxd.h</span><br><span>index 2e5ad52..7eb5dac 100644</span><br><span>--- a/Transceiver52M/proto_trxd.h</span><br><span>+++ b/Transceiver52M/proto_trxd.h</span><br><span>@@ -11,6 +11,16 @@</span><br><span> </span><br><span> #define MAX_RX_BURST_BUF_SIZE 444 /* 444 = EDGE_BURST_NBITS */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum Modulation {</span><br><span style="color: hsl(120, 100%, 40%);">+    MODULATION_GMSK,</span><br><span style="color: hsl(120, 100%, 40%);">+      MODULATION_8PSK,</span><br><span style="color: hsl(120, 100%, 40%);">+/* Not supported yet:</span><br><span style="color: hsl(120, 100%, 40%);">+       MODULATION_AQPSK,</span><br><span style="color: hsl(120, 100%, 40%);">+     MODULATION_16QAM,</span><br><span style="color: hsl(120, 100%, 40%);">+     MODULATION_32QAM</span><br><span style="color: hsl(120, 100%, 40%);">+*/</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct trx_ul_burst_ind {</span><br><span>      float rx_burst[MAX_RX_BURST_BUF_SIZE]; /* soft bits normalized 0..1 */</span><br><span>       unsigned nbits; // number of symbols per slot in rxBurst, not counting guard periods</span><br><span>@@ -20,12 +30,17 @@</span><br><span>   double toa;  // in symbols</span><br><span>   double noise; // noise level in dBFS</span><br><span>         bool idle; // true if no valid burst is included</span><br><span style="color: hsl(120, 100%, 40%);">+      enum Modulation modulation; // modulation type</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t tss; // training sequence set</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t tsc; // training sequence code</span><br><span style="color: hsl(120, 100%, 40%);">+        float ci; // Carrier-to-Interference ratio, in dB</span><br><span> };</span><br><span> </span><br><span> bool trxd_send_burst_ind_v0(size_t chan, int fd, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+bool trxd_send_burst_ind_v1(size_t chan, int fd, const struct trx_ul_burst_ind *bi);</span><br><span> </span><br><span> /* The latest supported TRXD header format version */</span><br><span style="color: hsl(0, 100%, 40%);">-#define TRX_DATA_FORMAT_VER    0</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRX_DATA_FORMAT_VER    1</span><br><span> </span><br><span> struct trxd_hdr_common {</span><br><span> #if OSMO_IS_LITTLE_ENDIAN</span><br><span>@@ -50,3 +65,30 @@</span><br><span>   struct trxd_hdr_v0_specific v0;</span><br><span>      uint8_t soft_bits[0];</span><br><span> } __attribute__ ((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRXD_MODULATION_GMSK(ts_set) (0b0000 | (ts_set & 0b0011))</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRXD_MODULATION_8PSK(ts_set) (0b0100 | (ts_set & 0b0001))</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRXD_MODULATION_AQPSK(ts_set) (0b0110 | (ts_set & 0b0001))</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRXD_MODULATION_16QAM(ts_set) (0b1000 | (ts_set & 0b0001))</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRXD_MODULATION_32QAM(ts_set) (0b1010 | (ts_set & 0b0001))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct trxd_hdr_v1_specific {</span><br><span style="color: hsl(120, 100%, 40%);">+#if OSMO_IS_LITTLE_ENDIAN</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t tsc:3,</span><br><span style="color: hsl(120, 100%, 40%);">+                modulation:4,</span><br><span style="color: hsl(120, 100%, 40%);">+         idle:1;</span><br><span style="color: hsl(120, 100%, 40%);">+#elif OSMO_IS_BIG_ENDIAN</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t idle:1,</span><br><span style="color: hsl(120, 100%, 40%);">+               modulation:4,</span><br><span style="color: hsl(120, 100%, 40%);">+         tsc:3;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+        int16_t ci;  /* big endian, in centiBels */</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__ ((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct trxd_hdr_v1 {</span><br><span style="color: hsl(120, 100%, 40%);">+      struct trxd_hdr_common common;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct trxd_hdr_v0_specific v0;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct trxd_hdr_v1_specific v1;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t soft_bits[0];</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__ ((packed));</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/14657">change 14657</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-trx/+/14657"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I53db2678458a7377c87875b58b58b76a1b900517 </div>
<div style="display:none"> Gerrit-Change-Number: 14657 </div>
<div style="display:none"> Gerrit-PatchSet: 13 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>