Transceiver: Support TRXD v1

Related: OS#4006
Change-Id: I53db2678458a7377c87875b58b58b76a1b900517
diff --git a/Transceiver52M/proto_trxd.c b/Transceiver52M/proto_trxd.c
index 5cf22e6..fff23da 100644
--- a/Transceiver52M/proto_trxd.c
+++ b/Transceiver52M/proto_trxd.c
@@ -43,6 +43,21 @@
 	osmo_store16be(toa_int, &v0->toa);
 }
 
+static void trxd_fill_v1_specific(struct trxd_hdr_v1_specific *v1, const struct trx_ul_burst_ind *bi)
+{
+	int16_t ci_int_cB;
+
+	/* deciBels->centiBels, round to closest integer */
+	ci_int_cB = (int16_t)((bi->ci * 10) + 0.5);
+
+	v1->idle = !!bi->idle;
+	v1->modulation = (bi->modulation == MODULATION_GMSK) ?
+					TRXD_MODULATION_GMSK(bi->tss) :
+					TRXD_MODULATION_8PSK(bi->tss);
+	v1->tsc = bi->tsc;
+	osmo_store16be(ci_int_cB, &v1->ci);
+}
+
 static void trxd_fill_burst_normalized255(uint8_t* soft_bits, const struct trx_ul_burst_ind *bi)
 {
 	unsigned i;
@@ -75,3 +90,28 @@
 	}
 	return true;
 }
+
+bool trxd_send_burst_ind_v1(size_t chan, int fd, const struct trx_ul_burst_ind *bi) {
+	int rc;
+	size_t buf_len;
+
+	buf_len = sizeof(struct trxd_hdr_v1);
+	if (!bi->idle)
+		buf_len += bi->nbits;
+	char buf[buf_len];
+
+	struct trxd_hdr_v1* pkt = (struct trxd_hdr_v1*)buf;
+	trxd_fill_common(&pkt->common, bi, 1);
+	trxd_fill_v0_specific(&pkt->v0, bi);
+	trxd_fill_v1_specific(&pkt->v1, bi);
+
+	if (!bi->idle)
+		trxd_fill_burst_normalized255(&pkt->soft_bits[0], bi);
+
+	rc = write(fd, buf, buf_len);
+	if (rc <= 0) {
+		CLOGCHAN(chan, DMAIN, LOGL_NOTICE, "mDataSockets write(%d) failed: %d\n", fd, rc);
+		return false;
+	}
+	return true;
+}