///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2018 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:     ISUP_Mapping.ttcn
//  Rev:      R8A
//  Prodnr:   CNL 113 365
//  Updated:  2006-05-10
//  Contact:  http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////
module ISUP_Mapping
{
 import from MTP3asp_PortType all;
 import from MTP3asp_Types all;
 import from ISUP_Types all;

group Types
{
  type record MSC_ISUP_MTP3_parameters
    {
     MTP3_Field_sio    sio,
     integer           opc,
     integer           dpc,
     integer           sls
    }

group PortTypes
{
  //*************************************************************************
  //*                      ISUP port types                                  *
  //*************************************************************************
  type port MTP3asp_ISUP_PT message
    {
     inout    PDU_ISUP;
    } with {extension "internal"}

  type port MTC_ISUP_PT message    //  Coordination message
    {
     inout    charstring;
     inout    octetstring;
    } with {extension "internal"}
}//end group PortTypes


group ComponentTypes
{
  //*************************************************************************
  //*                       ISUP Component types                            *
  //*************************************************************************
  type component ISUP_CT
    {
    //========================Component constants===========================

    //========================Component variables===========================
     var PDU_ISUP           v_PDU_ISUP;

    //========================Component Timers-=============================

    //========================Component Port Declarations====================
     port MTC_ISUP_PT       MTC_ISUP_PORT;      //up
     port MTP3asp_ISUP_PT   MTP3_ISUP_PORT;     //down
    } // end component type definition

  //*************************************************************************
  //*                       ISUP EncDec component                           *
  //*************************************************************************
  type component ISUP_EncDec_CT
    {
    //========================Component Port Declarations====================
     port MTP3asp_ISUP_PT   MTP3_ISUP_PORT;  //<= SP_PT=_PT
     port MTP3asp_PT        MTP3_PORT;
    } // end component type definition
}//end group ComponentTypes

}//end group Types


//*************************************************************************
//*                       ISUP EncDec component behaviour                 *
//*************************************************************************
function f_ISUP_EncDecComp_Behaviour
     ( MSC_ISUP_MTP3_parameters pl_address_ISUP )  runs on ISUP_EncDec_CT
  {
  var  ASP_MTP3_TRANSFERind   vl_ASP_MTP3_TRANSFERind;
  var  PDU_ISUP               vl_PDU_ISUP;
  pl_address_ISUP.sio.si := '0101'B;

  while (true)
    {
    alt
      {
      [] MTP3_ISUP_PORT.receive ( PDU_ISUP : ?) -> value vl_PDU_ISUP
        {
        MTP3_PORT.send (t_ASP_MTP3_TRANSFERreq
                        (pl_address_ISUP.sio,
                         pl_address_ISUP.opc,
                         pl_address_ISUP.dpc,
                         pl_address_ISUP.sls,
                         enc_PDU_ISUP(vl_PDU_ISUP)));
        repeat;
        }

      // receive message from below (to be decoded)
      [] MTP3_PORT.receive (tr_ASP_MTP3_TRANSFERind_sio
                            (pl_address_ISUP.sio.ni,
                             ?,          //priority: no filtering
                             pl_address_ISUP.sio.si,
                             ?,
                             ?,
                             ?,
                             ? )) -> value  vl_ASP_MTP3_TRANSFERind
        {
        MTP3_ISUP_PORT.send (dec_PDU_ISUP(vl_ASP_MTP3_TRANSFERind.data));
        repeat;
        }

      [] MTP3_PORT.receive (t_ASP_MTP3_TRANSFERind( ?, ?, ?, ?, ? ))
        { log("Invalid SIO:  MESSAGE dropped!!!"); }
      }   //end of alt
    } // end while
  }  // end of f_ISUP_EncDecComp_Behaviour
}
