module BTS_Simulation {

/* Start an IPA client and bind the RSL Emulation on top; we assume that OML
 * is handled elsewhere! */

import from IPL4asp_Types all;
import from IPA_Emulation all;
import from RSL_Emulation all;
import from RSL_Tests all;

type component BTS_CT {
	var IPA_Emulation_CT vc_IPA;
	var RSL_Emulation_CT vc_RSL;
	var IPA_CCM_Parameters ccm_pars;
}

function main(charstring bsc_host, PortNumber bsc_port, charstring id) runs on BTS_CT
{
	vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
	vc_RSL := RSL_Emulation_CT.create(id & "-RSL");
	ccm_pars := c_IPA_default_ccm_pars;
	ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";
	ccm_pars.unit_id := "1234/0/0";

	map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
	connect(vc_IPA:IPA_RSL_PORT, vc_RSL:IPA_PT);

	vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", -1, ccm_pars));
	vc_RSL.start(RSL_Emulation.main());

	var RSL_Tests_CT vc_DCHAN;
	vc_DCHAN := RSL_Tests_CT.create(id & "-DCHAN");
	connect(vc_DCHAN:RSL, vc_RSL:CLIENT_PT);
	vc_DCHAN.start(RSL_Tests.test_mahlzeit('901700123456789'H));


	/* wait until termination of respective component */
	vc_RSL.done;
	vc_IPA.done;
}



}
