///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2020 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//  File:               IFW_MQTT_Client_Functions.ttcn
//  Description:
//  Rev:                <RnXnn>
//  Prodnr:             CNL 113 910
//  Updated:            2020-02-06
//  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;

  ///////////////////////////////////////////////////////////
  //  Module parameter: tsp_MQTT_Client_maxResponseTime
  // 
  //  Purpose:
  //    Time the client is waiting for a response message (0.0->not set)
  //
  //  Type:
  //     *float*
  //
  //  Default value:
  //     *0.0*
  ///////////////////////////////////////////////////////////
	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;
	}
}
