module TRXC_Types {

/* TRX Control protocol type definitions in TTCN-3
 * (C) 2018 Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

import from Osmocom_Types all;

type charstring TrxcType ("CMD", "RSP", "IND") with {
	variant "TEXT_CODING(,convert=upper_case,'((CMD)|(RSP)|(IND))',case_insensitive)"
}

type charstring TrxcVerb ("POWERON", "POWEROFF", "CLOCK",
			  "RXTUNE", "TXTUNE", "SETSLOT", "SETTSC", "SETBSIC", "SETPOWER",
			  "SETMAXDLY", "SETMAXDLYNB", "SETSLOT", "HANDOVER", "NOHANDOVER",
			  "MEASURE", "FAKE_RSSI", "FAKE_TOA", "FAKE_CI", "FAKE_TRXC_DELAY") with {
	variant "TEXT_CODING(,convert=upper_case,
			'((POWERON)|(POWEROFF)|(CLOCK)|(RXTUNE)|(TXTUNE)|(SETSLOT)|(SETTSC)|(SETBSIC)|(SETPOWER)|(SETMAXDLY)|(SETMAXDLYNB)|(HANDOVER)|(NOHANDOVER)|(MEASURE)|(FAKE_RSSI)|(FAKE_TOA)|(FAKE_CI)|(FAKE_TRXC_DELAY))'
			,case_insensitive)"
}

type integer TrxcStatus;
type charstring TrxcParam;
type record of TrxcParam TrxcParams with {
	variant "SEPARATOR(' ', ' ')"
}

type record TrxcCommand {
	TrxcVerb	verb,
	TrxcParams	params optional
} with {
	variant "SEPARATOR(' ', ' ')"
}

type record TrxcResponse {
	TrxcVerb	verb,
	TrxcStatus	status,
	TrxcParams	params optional
} with {
	variant "SEPARATOR(' ', ' ')"
}

type record TrxcIndication {
	TrxcVerb	verb,
	TrxcParams	params optional
} with {
	variant "SEPARATOR(' ', ' ')"
}

type union TrxcMessage {
	TrxcCommand	cmd,
	TrxcResponse	rsp,
	TrxcIndication	ind
} with {
	variant (cmd) "BEGIN('CMD ')"
	variant (rsp) "BEGIN('RSP ')"
	variant (ind) "BEGIN('IND ')"
}

external function enc_TrxcMessage(in TrxcMessage id) return charstring
	with { extension "prototype(convert) encode(TEXT)" };
external function dec_TrxcMessage(in charstring id) return TrxcMessage
	with { extension "prototype(convert) decode(TEXT)" };

/* rxlev2dbm(0..63) gives us [-110..-47], plus -10 dbm for noise */
type integer TRXC_RSSI		(-120..-47);
type integer TRXC_RSSI_THRESH	(-120..120);

template (value) TrxcMessage ts_TRXC_FAKE_RSSI(TRXC_RSSI rssi, TRXC_RSSI_THRESH thresh := 0) := {
	cmd := {
		verb := "FAKE_RSSI",
		params := { int2str(rssi), int2str(thresh) }
	}
}

template (value) TrxcMessage ts_TRXC_FAKE_TIMING(int16_t timing, int16_t thresh := 0) := {
	cmd := {
		verb := "FAKE_TOA",
		params := { int2str(timing), int2str(thresh) }
	}
}

template (value) TrxcMessage ts_TRXC_FAKE_CI(int16_t ci, int16_t thresh := 0) := {
	cmd := {
		verb := "FAKE_CI",
		params := { int2str(ci), int2str(thresh) }
	}
}

template (value) TrxcMessage ts_TRXC_FAKE_TRXC_DELAY(integer delay_ms := 0) := {
	cmd := {
		verb := "FAKE_TRXC_DELAY",
		params := { int2str(delay_ms) }
	}
}


} with { encode "TEXT" }
