///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2017 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
///////////////////////////////////////////////////////////////////////////////
//  File:               IFW_MQTT_Client_Functions.ttcn
//  Description:
//  Rev:                R1A
//  Prodnr:             LPA 108 661
//  Updated:            2017-09-01
//  Contact:            http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////
module IFW_MQTT_Client_Functions
{
    import from IFW_MQTT_Client_Definitions all;
	import from MQTT_v3_1_1_Types all;
	import from IPL4asp_Types all;
	import from IPL4asp_PortType all;
	import from IFW_Common all;
	import from MQTT_v3_1_1_IPL4SizeFunction all;

	modulepar
	{
		float tsp_MQTT_Client_maxResponseTime := 0.0;
    }

	function f_MQTT_Client_init() runs on IFW_MQTT_Client_CT
    {
		log(%definitionId, " started");
		var Result vl_result;
    
		log("Mapping started");
		map(self:IPL4_PCO,system:IPL4_PCO);
		var f_IPL4_getMsgLen vl_f := refers(f_GetMsgLengthMQTT);
		f_IPL4_setGetMsgLen(IPL4_PCO, -1, vl_f, {});
    
		log("Connecting the socket to the remote");
		vl_result := f_IPL4_connect(IPL4_PCO, ctx.remoteHost, ctx.remotePort, ctx.localHost, ctx.localPort, -1, {tcp := {}}, {{reuseAddress := {enable := true}}});
		f_checkResult(vl_result);
		ctx.connId := vl_result.connId;
		
		log(%definitionId, " finished");
	}
	
	function f_MQTT_Client_cleanUp() runs on IFW_MQTT_Client_CT
    {
		log(%definitionId, " started");
		var Result vl_result;
    
		log("Closing connection");
		if (ctx.connId >= 0)
		{
		  vl_result := f_IPL4_close(IPL4_PCO, ctx.connId, {tcp := {}});
		  //f_checkResult(vl_result);		  
		}
	
		log(%definitionId, " finished");
	}
	
	function f_MQTT_Client_getContext() runs on IFW_MQTT_Client_CT
	return MqttClientContext
	{
		return ctx;
	}
	
	function f_MQTT_Client_setContext(in MqttClientContext p_ctx) runs on IFW_MQTT_Client_CT
	{
	  ctx := p_ctx;
	}
	
	function f_MQTT_Client_setMessageToSend(in MQTT_v3_1_1_ReqResp p_msg) runs on IFW_MQTT_Client_CT
	{
	  msgToSend := p_msg;
	}	
	
    function f_MQTT_Client_send() runs on IFW_MQTT_Client_CT
	{
	  	var octetstring v_encoded;
	  	
	  	f_MQTT_v3_1_1_enc({ msg := msgToSend}, v_encoded);
	  
	  	var ASP_SendTo vl_send;

		vl_send.connId := ctx.connId;
		vl_send.remName := ctx.remoteHost;
		vl_send.remPort := ctx.remotePort;
		vl_send.proto := {tcp := {}}

		vl_send.msg := v_encoded;

		log("MQTT PDU: ", msgToSend);
		IPL4_PCO.send(vl_send);
	}
	
	function f_MQTT_Client_receive() runs on IFW_MQTT_Client_CT
	{
	  // Activate default
	  
	  timer t_Timeout := tsp_MQTT_Client_maxResponseTime;
	  if (tsp_MQTT_Client_maxResponseTime > 0.0) { t_Timeout.start; }
	  
	  var ASP_RecvFrom v_ipl4Recv;
	  var ASP_Event v_ipl4Event;
	  
	  alt
	  {
	    [] IPL4_PCO.receive(ASP_RecvFrom:?) -> value v_ipl4Recv
	    {
	      log("Received: ", v_ipl4Recv);
	      
	      var MQTT_v3_1_1_Message v_mqttMsg;
	      f_MQTT_v3_1_1_dec(v_ipl4Recv.msg, v_mqttMsg);
	      
	      if (ischosen(v_mqttMsg.msg)) {
            lastReceived := v_mqttMsg.msg;
            log("MQTT PDU: ", lastReceived);          
          }
          else {
            lastReceived := c_MQTTMessage_empty;
            log("MQTT PDU [raw]:",v_mqttMsg);
          }
	    }
	    [] IPL4_PCO.receive(ASP_Event:?) -> value v_ipl4Event
	    {
	      log("Received: ", v_ipl4Event);
	      repeat;
	    }
	    [] t_Timeout.timeout
	    {
	      lastReceived := c_MQTTMessage_empty;
	    }
	    
	    // Deactivate default
	  }
	}
	
	function f_MQTT_Client_check(in template MQTT_v3_1_1_ReqResp p_expected) runs on IFW_MQTT_Client_CT
	return ReturnBoolean
	{
	  if (not match(lastReceived, p_expected)) 
	  {
		  log("CHECK: last received is not matching with expected template");
		  return false;
	  }
		
		log("CHECK: return true");
		return true;
	}
}
