Newer
Older
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
module MainModule {
import from TraceParserSystem all;
function f_obuBehaviour() runs on ObuType {
var address ts := 0;
var integer startTS := 0;
var template (present) LinkId v_linkId := ?;
var boolean v_receivedLinkId := false;
transactionOBUTimer.start;
alt {
[startTS==0] obuPort.receive(mw_obuBroadCastMsg) -> sender ts { // when the first broadcast message is received then take it's time stamp
transactionOBUTimer.stop;
startTS := ts;
transactionOBUTimer.start;
repeat;
}
[] compPort.receive(v_linkId) -> value v_linkId{
transactionOBUTimer.stop;
v_receivedLinkId := true;
transactionOBUTimer.start;
repeat;
}
[startTS!=0 and v_receivedLinkId == true] obuPort.receive(mw_releaseMsg(v_linkId)) -> sender ts {
// when the release message was received take it's time stamp and calculate the transaction time
// inform the rsu component
transactionOBUTimer.stop;
compPort.send(m_stop);
if (ts - startTS <= 100000) {
setverdict (pass, "Transaction finished in " & int2str(ts - startTS));
}
else {
setverdict (fail, "Transaction finished in more than 100ms (" & int2str(ts - startTS) & ")");
}
stop;
}
[startTS!=0 and v_receivedLinkId == true] obuPort.receive(mw_msg_withLinkId(v_linkId)){
transactionOBUTimer.stop;
transactionOBUTimer.start;
repeat;
}
[startTS!=0 and v_receivedLinkId == true] obuPort.receive(mw_obuBroadCastMsg){ //If another broadcast is received than ignore
transactionOBUTimer.stop;
transactionOBUTimer.start;
repeat;
}
[startTS!=0 and v_receivedLinkId == true] obuPort.receive {
transactionOBUTimer.stop;
setverdict(fail, "Unexpected message received");
compPort.send(m_stop);
stop;
}
[] transactionOBUTimer.timeout {
setverdict (inconc, "No message was received");
compPort.send(m_stop);
stop;
}
}
}
function f_rsuBehaviour() runs on RsuType {
var boolean v_sentLinkId := false;
var PayloadStructure v_msg;
var integer v_cntEmpty := 0;
var template (present) LinkId v_linkId := ?;
timer t_rsuTimer := 5.0;
t_rsuTimer.start;
alt{
[]rsuPort.receive(mw_msg_withLinkId(v_linkId)) -> value v_msg{
t_rsuTimer.stop;
if (v_sentLinkId == false) {
v_linkId := valueof(v_msg.linkMsg.linkId);
compPort.send(valueof(v_linkId));
}
v_sentLinkId := true;
t_rsuTimer.start;
repeat;
}
[]rsuPort.receive(mw_msg_empty){
t_rsuTimer.stop;
v_cntEmpty := v_cntEmpty +1;
t_rsuTimer.start;
repeat;
}
[]rsuPort.receive{
t_rsuTimer.stop;
setverdict (fail, "Unexpected message received.");
stop;
}
[]compPort.receive(m_stop) {
setverdict (pass, "Number of empty messages received: " & int2str(v_cntEmpty));
}
[]t_rsuTimer.timeout{
setverdict(inconc, "No RSU messaged received");
stop;
}
}
}
testcase TC_Initialization(inout integer p_nrOfTransactions) runs on MtcType system SystemType {
map(mtc:controlPort, system:controlPort);
controlPort.call(setTraceFile:{TRACE_PATH}, 5.0) {
[] controlPort.getreply(setTraceFile:{-} value true) {
setverdict (pass);
}
[] controlPort.getreply {
setverdict (fail, "Could not set trace file");
stop;
}
[] controlPort.catch(timeout) {
setverdict (fail, "Timeout while setting trace file");
stop;
}
};
controlPort.call(getTransactionCnt:{}, 5.0) {
[] controlPort.getreply(getTransactionCnt:{} value ?) -> value p_nrOfTransactions {
setverdict (pass);
}
[] controlPort.getreply {
setverdict (fail, "Unexpected reply");
stop;
}
[] controlPort.catch(timeout) {
setverdict (fail, "Timeout while caling getTransacationCnt");
stop;
}
};
}
testcase TC_AnalyzesTrace(inout integer p_traceIndex) runs on MtcType system SystemType {
var ObuType obuComponent := ObuType.create("OBU"); //DL
var RsuType rsuComponent := RsuType.create("RSU"); //UL
map(mtc:controlPort, system:controlPort);
map(obuComponent:obuPort, system:msgPort);
map(rsuComponent:rsuPort, system:msgPort);
connect(obuComponent:compPort, rsuComponent:compPort);
obuComponent.start(f_obuBehaviour());
rsuComponent.start(f_rsuBehaviour());
log ("Starting analysis of trace: ", p_traceIndex);
controlPort.call(startAnalyzeTrace:{p_traceIndex}, 5.0) {
[] controlPort.getreply(startAnalyzeTrace:{-} value true) {
setverdict (pass);
}
[] controlPort.getreply {
setverdict (fail, "Could not start analyzing trace");
stop;
}
[] controlPort.catch(timeout) {
setverdict (fail, "Timeout while start analyzing trace");
stop;
}
};
all component.done;
}
control {
var integer v_nrOfTransactions := 0;
execute(TC_Initialization(v_nrOfTransactions));
log("Number of traces: " , v_nrOfTransactions);
for(var integer i:=0; i<v_nrOfTransactions; i:=i + 1) {
execute(TC_AnalyzesTrace(i));
}
}
}