module Osmocom_CTRL_Adapter {

/* Module that test suites can 'inherit' in order to have a CTRL connection to the IUT which they're testing */

import from IPL4asp_Types all;

import from IPA_Emulation all;
import from IPA_Types all;

import from Osmocom_CTRL_Functions all;
import from Osmocom_CTRL_Types all;


type component CTRL_Adapter_CT {
	var IPA_Emulation_CT vc_CTRL_IPA;
	/* test port for the CTRL interface of the BSC */
	port IPA_CTRL_PT IPA_CTRL;
}


/*! Start the CTRL connection to the specified BSC IP+Port */
function f_ipa_ctrl_start(charstring bsc_host, PortNumber bsc_port)
runs on CTRL_Adapter_CT {
	var charstring id := "IPA-CTRL"
	timer T := 10.0;

	vc_CTRL_IPA := IPA_Emulation_CT.create(id & "-IPA");

	map(vc_CTRL_IPA:IPA_PORT, system:IPA_CODEC_PT);
	connect(vc_CTRL_IPA:IPA_CTRL_PORT, self:IPA_CTRL);

	vc_CTRL_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", -1));

	/* wait for IPA CTRL link to connect and send UP */
	T.start;
	alt {
	[] IPA_CTRL.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }
	[] T.timeout {
		setverdict(fail, "Timeout CTRL waiting for ASP_IPA_EVENT_UP");
		self.stop;
		}
	}
}




/* BSC specific CTRL helper functions */
function f_ctrl_get_bts(IPA_CTRL_PT pt, integer bts_nr, charstring suffix) return CtrlValue {
	return f_ctrl_get(pt, "bts." & int2str(bts_nr) & "." & suffix);
}

template charstring ts_bts(integer bts_nr) := "bts." & int2str(bts_nr) & ".";
template charstring ts_bts_trx(integer bts_nr, integer trx_nr ) :=
	valueof(ts_bts(bts_nr)) & "trx." & int2str(trx_nr) & ".";

function f_ctrl_get_exp_bts(IPA_CTRL_PT pt, integer bts_nr, CtrlVariable suffix, template CtrlValue exp) {
	f_ctrl_get_exp(pt, valueof(ts_bts(bts_nr)) & suffix, exp);
}

function f_ctrl_get_exp_trx(IPA_CTRL_PT pt, integer bts_nr, integer trx_nr, CtrlVariable suffix,
			    template CtrlValue exp)
{
	f_ctrl_get_exp(pt, valueof(ts_bts_trx(bts_nr, trx_nr)) & suffix, exp);
}


}
