BTS_Tests: f_est_dchan(): add support for CSD channel modes

Change-Id: I066657941dd751183aa5e937a6bfe9ab7837d46b
Related: OS#1572, OS#4396
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index a0d2cfe..8dcfb01 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -2542,24 +2542,35 @@
 		var uint8_t amr_start_codec := 0;
 		var BIT8 amr_codecs_bitmask := '00000000'B;
 
-		if (ischosen(g_pars.chan_mode.u.sign) and g_pars.chan_mode.u.sign == RSL_CMOD_NO_RESOURCE) {
-			tch_mode := L1CTL_CHAN_MODE_SIGN;
-		} else if (ischosen(g_pars.chan_mode.u.speech)) {
-			select (g_pars.chan_mode.u.speech) {
-			case (RSL_CMOD_SP_GSM1) { tch_mode := L1CTL_CHAN_MODE_SPEECH_V1; }
-			case (RSL_CMOD_SP_GSM2) { tch_mode := L1CTL_CHAN_MODE_SPEECH_V2; }
-			case (RSL_CMOD_SP_GSM3) { tch_mode := L1CTL_CHAN_MODE_SPEECH_V3;
-						  amr_codecs_bitmask := g_pars.mr_conf.codec_modes;
-						}
-			case else {
-				log("RSL channel mode := ", g_pars.chan_mode.u.speech,
-				    " is not supported by the L1, falling back to signalling");
-				tch_mode := L1CTL_CHAN_MODE_SIGN;
-				}
-			}
-		} else {
+		select (g_pars.chan_mode) {
+		case (tr_RSL_ChanMode_SIGN)
+			{ tch_mode := L1CTL_CHAN_MODE_SIGN; }
+		/* Speech modes */
+		case (tr_RSL_ChanMode((RSL_CHRT_TCH_F, RSL_CHRT_TCH_H), RSL_CMOD_SP_GSM1))
+			{ tch_mode := L1CTL_CHAN_MODE_SPEECH_V1; }
+		case (tr_RSL_ChanMode((RSL_CHRT_TCH_F, RSL_CHRT_TCH_H), RSL_CMOD_SP_GSM2))
+			{ tch_mode := L1CTL_CHAN_MODE_SPEECH_V2; }
+		case (tr_RSL_ChanMode((RSL_CHRT_TCH_F, RSL_CHRT_TCH_H), RSL_CMOD_SP_GSM3))
+			{ tch_mode := L1CTL_CHAN_MODE_SPEECH_V3;
+			  amr_codecs_bitmask := g_pars.mr_conf.codec_modes; }
+		/* Data modes */
+		case (tr_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, /* TCH/F14.4 */
+					   (RSL_CMOD_CSD_T_14k4, RSL_CMOD_CSD_NT_14k5)))
+			{ tch_mode := L1CTL_CHAN_MODE_DATA_14k5; }
+		case (tr_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, /* TCH/F9.6 */
+					   (RSL_CMOD_CSD_T_9k6, RSL_CMOD_CSD_NT_12k0)))
+			{ tch_mode := L1CTL_CHAN_MODE_DATA_12k0; }
+		case (tr_RSL_ChanMode_DATA((RSL_CHRT_TCH_F, RSL_CHRT_TCH_H), /* TCH/[FH]4.8 */
+					   (RSL_CMOD_CSD_T_4k8, RSL_CMOD_CSD_NT_6k0)))
+			{ tch_mode := L1CTL_CHAN_MODE_DATA_6k0; }
+		case (tr_RSL_ChanMode_DATA((RSL_CHRT_TCH_F, RSL_CHRT_TCH_H), /* TCH/[FH]2.4 */
+					   (RSL_CMOD_CSD_T_2k4, RSL_CMOD_CSD_T_1k2,
+					    RSL_CMOD_CSD_T_600, RSL_CMOD_CSD_T_1200_75)))
+			{ tch_mode := L1CTL_CHAN_MODE_DATA_3k6; }
+		case else {
 			log("RSL channel mode is not supported by the L1, falling back to signalling");
 			tch_mode := L1CTL_CHAN_MODE_SIGN;
+			}
 		}
 
 		f_L1CTL_TCH_MODE(L1CTL,
diff --git a/library/L1CTL_Types.ttcn b/library/L1CTL_Types.ttcn
index 192091e..fe56459 100644
--- a/library/L1CTL_Types.ttcn
+++ b/library/L1CTL_Types.ttcn
@@ -127,8 +127,11 @@
 		L1CTL_CHAN_MODE_SIGN		('00000000'B),	/* Signalling */
 		L1CTL_CHAN_MODE_SPEECH_V1	('00000001'B),	/* FR or HR codec */
 		L1CTL_CHAN_MODE_SPEECH_V2	('00100001'B),	/* EFR codec */
-		L1CTL_CHAN_MODE_SPEECH_V3	('01000001'B)	/* AMR codec */
-		/* Other modes are not supported for now */
+		L1CTL_CHAN_MODE_SPEECH_V3	('01000001'B),	/* AMR codec */
+		L1CTL_CHAN_MODE_DATA_14k5	('00001111'B),	/* CSD: TCH/F14.4 */
+		L1CTL_CHAN_MODE_DATA_12k0	('00000011'B),	/* CSD: TCH/F9.6 */
+		L1CTL_CHAN_MODE_DATA_6k0	('00001011'B),	/* CSD: TCH/{FH}4.8 */
+		L1CTL_CHAN_MODE_DATA_3k6	('00010011'B)	/* CSD: TCH/{FH}2.4 */
 	} with { variant "FIELDLENGTH(8)" };
 
 	type enumerated L1ctlLoopMode {