module TRXC_Types {

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" ) 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))'
			,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)" };

template (value) TrxcMessage ts_TRXC_FAKE_RSSI(uint8_t rssi, int16_t 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) }
	}
}


} with { encode "TEXT" }
