<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<platformModule name="core">
  <interactionModule name="messages">
    <contractModule name="api">
      <abstractDataType name="message_type_t"/>
      <interface name="message_intf">
        <method name="push">
          <param dir="in" name="message" type="message_type_t"/>
          <param dir="return" name="ecode" type="::core::return_codes::comm_ecode"/>
        </method>
      </interface>
    </contractModule>
    <pattern name="msg_intr_pat">
      <role max="-1" min="1" name="emitter">
        <item name="message_item"/>
      </role>
      <role max="-1" min="1" name="receiver">
        <item name="message_item"/>
      </role>
      <item name="message_item" nature="data"/>
    </pattern>
    <portType name="msg_emtr_pt">
      <portElement interface="api::message_intf" kind="required" name="emtr_pe"/>
    </portType>
    <portType name="msg_rcvr_pt">
      <portElement interface="api::message_intf" kind="provided" name="rcvr_pe"/>
    </portType>
    <connectorDef name="simple_msg_cnt" pattern="msg_intr_pat">
      <port name="emitter" role="msg_intr_pat.emitter" type="msg_emtr_pt"/>
      <port name="receiver" role="msg_intr_pat.receiver" type="msg_rcvr_pt"/>
      <itemBinding cItem="api::message_type_t" pItem="msg_intr_pat.message_item"/>
    </connectorDef>
  </interactionModule>
  <interactionModule name="services">
    <contractModule name="api">
      <abstractInterface name="service_intf_t"/>
    </contractModule>
    <pattern name="svc_intr_pat">
      <role max="-1" min="1" name="client">
        <item name="service_item"/>
      </role>
      <role max="1" min="1" name="server">
        <item name="service_item"/>
      </role>
      <item name="service_item" nature="interface"/>
    </pattern>
    <portType name="svc_srvr_pt">
      <portElement interface="api::service_intf_t" kind="provided" name="srvr_pe"/>
    </portType>
    <portType name="svc_cli_pt">
      <portElement interface="api::service_intf_t" kind="required" name="cli_pe"/>
    </portType>
    <connectorDef name="simple_svc_cnt" pattern="svc_intr_pat">
      <port name="client" role="svc_intr_pat.client" type="svc_cli_pt"/>
      <port name="server" role="svc_intr_pat.server" type="svc_srvr_pt"/>
      <itemBinding cItem="api::service_intf_t" pItem="svc_intr_pat.service_item"/>
    </connectorDef>
  </interactionModule>
  <policyModule name="comp_exec">
    <contractModule name="api">
      <interface name="comp_exec_intf">
        <method name="run"/>
      </interface>
    </contractModule>
    <policyDef applicability="on_component_only" aspect="comp_trig_asp" name="self_exec_comp">
      <comment>self-executing component</comment>
      <portElement interface="api::comp_exec_intf" kind="provided" name="activation"/>
    </policyDef>
    <policyDef applicability="on_all_ports" aspect="comp_exec_asp" name="unpr_pasv_comp">
      <comment>unprotected passive component</comment>
    </policyDef>
    <policyDef applicability="on_all_ports" aspect="comp_exec_asp" name="prot_pasv_comp">
      <comment>protected passive component</comment>
    </policyDef>
    <policyDef applicability="on_all_ports" aspect="comp_exec_asp" name="prot_actv_comp">
      <comment>protected active component</comment>
    </policyDef>
    <technicalAspect constraint="any_number" name="comp_exec_asp"/>
    <technicalAspect constraint="any_number" name="comp_trig_asp"/>
  </policyModule>
  <policyModule name="basic_svc">
    <policyModule name="clock">
      <contractModule name="api">
        <struct name="ucm_timeval_t">
          <comment>inspired from the libC definitions</comment>
          <field name="utv_sec" type="ucm_time_t"/>
          <field name="ucm_usec" type="ucm_usecond_t"/>
        </struct>
        <integer kind="ulong" name="ucm_time_t"/>
        <integer kind="long" name="ucm_usecond_t"/>
        <interface name="clk_intf">
          <method name="get_local_time">
            <param dir="out" name="local_time" type="ucm_timeval_t"/>
          </method>
          <method name="get_synchronized_time">
            <param dir="out" name="synchronized_time" type="ucm_timeval_t"/>
          </method>
        </interface>
      </contractModule>
      <policyDef applicability="on_component_only" aspect="clock_asp" name="clock">
        <portElement interface="api::clk_intf" kind="required" name="clock"/>
      </policyDef>
      <technicalAspect constraint="any_number" name="clock_asp"/>
    </policyModule>
    <policyModule name="trace">
      <contractModule name="api">
        <string base="char8" name="method_name_t"/>
        <enum indexType="ulong" name="log_severity_t">
          <value index="0" name="TRACE"/>
          <value index="1" name="DEBUG"/>
          <value index="2" name="INFO"/>
          <value index="3" name="WARNING"/>
          <value index="4" name="ERROR"/>
          <value index="5" name="CRITICAL"/>
        </enum>
        <string base="wchar" name="log_message_t"/>
        <interface name="trace_intf">
          <method name="log">
            <param dir="in" name="severity" type="log_severity_t"/>
            <param dir="in" name="message" type="log_message_t"/>
          </method>
        </interface>
      </contractModule>
      <policyDef applicability="on_component_only" aspect="trace_asp" name="comp_trace">
        <portElement interface="api::trace_intf" kind="required" name="trace"/>
      </policyDef>
      <policyDef applicability="on_some_ports" aspect="trace_asp" name="port_trace">
        <configParam name="methods_to_trace" type="api::method_name_t"/>
        <configParam name="log_severity" type="api::log_severity_t"/>
      </policyDef>
      <technicalAspect constraint="any_number" name="trace_asp"/>
    </policyModule>
  </policyModule>
  <contractModule name="return_codes">
    <enum indexType="short" name="comm_ecode">
      <value index="0" name="ok"/>
      <value index="1" name="internal_error"/>
      <value index="2" name="comm_error"/>
    </enum>
  </contractModule>
</platformModule>
