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) := {
	cmd := {
		verb := "FAKE_RSSI",
		params := { int2str(rssi) }
	}
}

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" }
