<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<platformModule name="interactions">
  <interactionModule name="request_response">
    <contractModule name="api">
      <abstractDataType name="req_data_t"/>
      <abstractDataType name="resp_data_t"/>
      <integer kind="ulong" name="rr_id_t"/>
      <interface name="rrsync_intf">
        <comment>interface for request-response synchronous client and server</comment>
        <method name="request">
          <param dir="in" name="request" type="req_data_t"/>
          <param dir="out" name="response" type="resp_data_t"/>
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
      </interface>
      <interface name="rrasync_req_server_intf">
        <comment>interface for request-response asynchronous server (request)</comment>
        <method name="request">
          <param dir="in" name="request" type="req_data_t"/>
          <param dir="in" name="req_id" type="rr_id_t"/>
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
      </interface>
      <interface name="rrasync_resp_intf">
        <comment>interface for request-response asynchronous client and server (response)</comment>
        <method name="response">
          <param dir="in" name="response" type="resp_data_t"/>
          <param dir="in" name="resp_id" type="rr_id_t"/>
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
      </interface>
      <interface name="rrasync_req_client_intf">
        <comment>interface for request-response asynchronous client (request)</comment>
        <method name="request">
          <param dir="in" name="request" type="req_data_t"/>
          <param dir="out" name="req_id" type="rr_id_t"/>
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
      </interface>
    </contractModule>
    <pattern name="rr_intr_pat">
      <role max="-1" min="1" name="rr_client">
        <item name="req_data"/>
        <item name="resp_data"/>
      </role>
      <role max="1" min="1" name="rr_server">
        <item name="req_data"/>
        <item name="resp_data"/>
      </role>
      <item name="req_data" nature="data"/>
      <item name="resp_data" nature="data"/>
    </pattern>
    <portType name="rrs_cli_pt">
      <portElement interface="api::rrsync_intf" kind="required" name="cli_pe"/>
    </portType>
    <portType name="rrs_srvr_pt">
      <portElement interface="api::rrsync_intf" kind="provided" name="srvr_pe"/>
    </portType>
    <portType name="rra_cli_pt">
      <portElement interface="api::rrasync_req_client_intf" kind="required" name="cli_req_pe"/>
      <portElement interface="api::rrasync_resp_intf" kind="provided" name="cli_resp_pe"/>
    </portType>
    <portType name="rra_srvr_pt">
      <portElement interface="api::rrasync_req_server_intf" kind="provided" name="srvr_req_pe"/>
      <portElement interface="api::rrasync_resp_intf" kind="required" name="srvr_resp_pe"/>
    </portType>
    <connectorDef name="req_resp_cnt" pattern="rr_intr_pat">
      <port name="rr_sync_cli" role="rr_intr_pat.rr_client" type="rrs_cli_pt"/>
      <port name="rr_sync_srvr" role="rr_intr_pat.rr_server" type="rrs_srvr_pt"/>
      <port name="rr_async_cli" role="rr_intr_pat.rr_client" type="rra_cli_pt"/>
      <port name="rr_async_srvr" role="rr_intr_pat.rr_server" type="rra_srvr_pt"/>
      <itemBinding cItem="api::req_data_t" pItem="rr_intr_pat.req_data"/>
      <itemBinding cItem="api::resp_data_t" pItem="rr_intr_pat.resp_data"/>
    </connectorDef>
  </interactionModule>
  <interactionModule name="shared_data">
    <contractModule name="api">
      <abstractDataType name="shr_data_t"/>
      <interface name="data_reader">
        <method name="freeze_data">
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
        <method name="release_data">
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
        <method name="read_data">
          <param dir="out" name="data" type="shr_data_t"/>
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
      </interface>
      <interface name="data_notification">
        <method name="on_data_update">
          <comment>no error code for this method, since it is called by the connector</comment>
        </method>
      </interface>
      <interface name="data_writer">
        <method name="write_data">
          <param dir="in" name="data" type="shr_data_t"/>
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
        <method name="publish_data">
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
        <method name="cancel_data">
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
      </interface>
    </contractModule>
    <pattern name="sd_intr_pat">
      <role max="-1" min="1" name="data_writer">
        <item name="shr_data"/>
      </role>
      <role max="-1" min="1" name="data_reader">
        <item name="shr_data"/>
      </role>
      <item name="shr_data" nature="data"/>
    </pattern>
    <portType name="sd_writer_pt">
      <portElement interface="api::data_writer" kind="required" name="wrtr_pe"/>
    </portType>
    <portType name="sd_reader_pt">
      <portElement interface="api::data_reader" kind="required" name="rdr_pe"/>
      <portElement interface="api::data_notification" kind="provided" name="notif_pe"/>
    </portType>
    <connectorDef name="sd_cnt" pattern="sd_intr_pat">
      <port name="sd_reader" role="sd_intr_pat.data_reader" type="sd_reader_pt"/>
      <port name="sd_writer" role="sd_intr_pat.data_writer" type="sd_writer_pt"/>
      <itemBinding cItem="api::shr_data_t" pItem="sd_intr_pat.shr_data"/>
    </connectorDef>
  </interactionModule>
</platformModule>
