module BSC_MS_Simulation {

import from IPL4asp_Types all;

import from IPA_Emulation all;

import from SCCP_Types all;
import from SCCPasp_Types all;
import from SCCP_Emulation all;

import from BSSMAP_Emulation all;

import from BSC_MS_ConnectionHandler all;

type component BSC_CT {
	/* component references */
	var IPA_Emulation_CT vc_IPA;
	var SCCP_CT vc_SCCP;
	var BSSMAP_Emulation_CT vc_BSSMAP;
	/* test port to SCCP emulation */
	port SCCPasp_PT SCCP;

	var SCCP_PAR_Address g_sccp_addr_own;
	var SCCP_PAR_Address g_sccp_addr_remote;
}

function main(charstring remote_ip, PortNumber remote_port,
		charstring local_ip, PortNumber local_port,
		MSC_SCCP_MTP3_parameters sccp_pars,
		SCCP_PAR_Address sccp_addr_own,
		SCCP_PAR_Address sccp_addr_remote) runs on BSC_CT
{
	g_sccp_addr_own := sccp_addr_own;
	g_sccp_addr_remote := sccp_addr_remote;

	/* create components */
	vc_IPA := IPA_Emulation_CT.create;
	vc_SCCP := SCCP_CT.create;
	vc_BSSMAP := BSSMAP_Emulation_CT.create;

	map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);

	/* connect MTP3 service provider (IPA) to lower side of SCCP */
	connect(vc_IPA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);

	/* connect BSSMAP dispatcher to upper side of SCCP */
	connect(vc_BSSMAP:SCCP, vc_SCCP:SCCP_SP_PORT);

	/* connect BSSMAP dispatcher to IPA_Emulation MGCP */
	connect(vc_BSSMAP:MGCP, vc_IPA:IPA_MGCP_PORT);

	vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port));
	vc_SCCP.start(SCCPStart(sccp_pars));
	vc_BSSMAP.start(BSSMAP_Emulation.main(BSC_MS_BssmapOps));

	while (true) {
		timer T := 5.0;
		T.start;
		T.timeout;
		f_start_BSC_MS();
		//vc_IPA.MTP3_SP_PORT.send(t_ASP_MTP3_TRANSFERreq_sccp('83'O, 1, 2, 0, '012345'O));
	}

	vc_IPA.done;
	vc_BSSMAP.done;
	vc_SCCP.done
}

function f_start_BSC_MS() runs on BSC_CT {
	var BSC_MS_ConnHdlr vc_conn;

	/* start new component */
	vc_conn := BSC_MS_ConnHdlr.create;
	/* connect client BSSAP port to BSSAP dispatcher */
	connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
	/* start component */
	vc_conn.start(BSC_MS_ConnectionHandler.main(g_sccp_addr_own, g_sccp_addr_remote));
}

}
