CXM_generic_protocol.anubis
3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
*
* 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 Word32 _CXM_OK = 0.
public define Word32 _CXM_ERROR = 1.
public define Word32 _CXM_UNKNOW_CMD = 2.
public define Word32 _CXM_UNKNOW_SERVICE = 3.
public define Word32 _CXM_MISSING_REQUIRED_FIELD = 4.
public define Word32 _CXM_FORBIDDEN = 5.
public type ProtocolResult:
failure,
timeout,
unknow_cmd,
error,
ok,
ok_msg(Message).
public define One
send_ACK_error
(
MessageQueue queue,
Word32 cmd_id,
Word32 error_code,
String error_string,
)=
with err_msg = message(_CXM_ACK),
forget(add_int32(err_msg, "CMD", cmd_id));
forget(add_int32(err_msg, "STATUS", error_code));
(if error_string /= "" then forget(add_string(err_msg, "STATUS_MSG", error_string))
else unique);
forget(queue.add_Message_to_send(err_msg)).
public define One
send_ACK_error
(
MessageQueue queue,
Word32 cmd_id
)=
send_ACK_error(queue, cmd_id, _CXM_ERROR, "").
public define One
send_ACK_ok
(
MessageQueue queue,
Word32 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,
Word32 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,
Word32 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,
Word32 cmd_id,
Result((Word32, String), Message) mb_msg
)=
if mb_msg is
{
error(err) then
if err is (err_code, err_string) then
send_ACK_error(queue, cmd_id, err_code, err_string),
ok(msg) then send_ACK_ok(queue, cmd_id, msg)
}.
public define One
send_result
(
MessageQueue queue,
Word32 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,
Word32 wait_cmd,
Int 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");
}.