CXM_generic_protocol.anubis 3.18 KB
/*
 * 
 * User: David RENE
 * Date: 25/04/2007
 * Time: 16:20
 * (c) Calexium
 *
 */

read system/muscle.anubis
read system/data_io.anubis
read system/string.anubis
read tools/basis.anubis
read system/message_queue.anubis
read calexium_lib/CXM_message_constants.anubis

public define Int32 _CXM_OK         = 0.
public define Int32 _CXM_ERROR      = 1.
public define Int32 _CXM_UNKNOW_CMD = 2.

public type ProtocolResult:
  failure,
  timeout,
  unknow_cmd,
  error,
  ok,
  ok_msg(Message).
  
public define One
  send_ACK_error
  (
    MessageQueue  queue,
    Int32     cmd_id
  )=
  with err_msg = message(_CXM_ACK),
  forget(add_int32(err_msg, "CMD", cmd_id));
  forget(add_int32(err_msg, "STATUS", _CXM_ERROR));
  forget(queue.add_Message_to_send(err_msg)).
  
public define One
  send_ACK_ok
  (
    MessageQueue  queue,
    Int32         cmd_id
  )=
  with ok_msg = message(_CXM_ACK),
  forget(add_int32(ok_msg, "CMD", cmd_id));
  forget(add_int32(ok_msg, "STATUS", _CXM_OK));
  forget(queue.add_Message_to_send(ok_msg))
  .

public define One
  send_ACK_ok
  (
    MessageQueue  queue,
    Int32     cmd_id,
    Message   result
  )=
  with ok_msg = message(_CXM_ACK),
  forget(add_int32(ok_msg, "CMD", cmd_id));
  forget(add_int32(ok_msg, "STATUS", _CXM_OK));
  forget(add_message(ok_msg, "RESULT", result));
  forget(queue.add_Message_to_send(ok_msg))
  .
  
public define One
  send_result
  (
    MessageQueue    queue,
    Int32           cmd_id,
    Maybe(Message)  mb_msg
  )=
  if mb_msg is
  {
    failure       then send_ACK_error(queue, cmd_id),
    success(msg)  then send_ACK_ok(queue, cmd_id, msg)
  }.
  
public define One
  send_result
  (
    MessageQueue    queue,
    Int32           cmd_id,
    Bool            result
  )=
  if result then
    send_ACK_ok(queue, cmd_id)
  else
    send_ACK_error(queue, cmd_id).

public define ProtocolResult
  wait_for_reply
  (
    MessageQueue  mQ,
    Int32         wait_cmd,
    Int32         t_out
  ) =
  if mQ.get_next_received_Message(t_out) is
  {
    timeout   then  timeout,
    closed    then  failure, //println("wait_for_reply closed");
    
    msg(_msg) then  
      if *_msg.what = _CXM_ACK then
        if find_int32(_msg, "CMD") is
        {
          failure       then failure, //println("wait_for_reply CMD");
          success(cmd)  then
//          println("wait_for_reply CMD="+to_hexa(cmd));
          if find_int32(_msg, "STATUS") is
          {
            failure         then failure, //println("wait_for_reply STATUS");
            success(status) then
            if cmd = wait_cmd & status = _CXM_OK then
              if find_message(_msg, "RESULT") is
              {
                failure             then ok,
                success(ok_message) then ok_msg(ok_message)
              }
            else if cmd = wait_cmd & status = _CXM_ERROR then
              error
            else if cmd = wait_cmd & status = _CXM_UNKNOW_CMD then
              unknow_cmd
            else
              failure //println("wait_for_reply ");
           }
         }
      else
        failure //println("wait_for_reply not ACK");
    }.