Commit c08f1aaa authored by Yann Garcia's avatar Yann Garcia
Browse files

Start validate AtsMapem

parent db871991
......@@ -224,9 +224,12 @@ void ConfigRsuSimulatorLayer::sendMsg(const LibItsMapemSpatem__TypesAndValues::U
if (send_par.ischosen(LibItsMapemSpatem__TypesAndValues::UtMapemSpatemResults::ALT_utMapemSpatemInitializeResult)) {
encoding_buffer.put_c(static_cast<const unsigned char>(uppertester_mapem_spatem_codec::c_utMapemSpatemInitializeResult));
encoding_buffer.put_c((unsigned char)static_cast<const boolean>(send_par.utMapemSpatemInitializeResult()));
} else if (send_par.ischosen(LibItsMapemSpatem__TypesAndValues::UtMapemSpatemResults::ALT_utMapemSpatemTriggerResult)) {
encoding_buffer.put_c(static_cast<const unsigned char>(uppertester_mapem_spatem_codec::c_utMapemSpatemTriggerResult));
encoding_buffer.put_c((unsigned char)static_cast<const boolean>(send_par.utMapemSpatemTriggerResult()));
} else {
loggers::get_instance().warning("ConfigRsuSimulatorLayer::sendMsg: Unsupported UtMapemSpatemResults variant");
return;
return;
}
OCTETSTRING os(encoding_buffer.get_len(), encoding_buffer.get_data());
......@@ -380,6 +383,8 @@ void ConfigRsuSimulatorLayer::receive_data(OCTETSTRING& data, params& params)
process_ut_denm_update(data, params);
} else if (id == uppertester_denm_codec::c_utDenmTermination) {
process_ut_denm_termination(data, params);
} else if (id == uppertester_mapem_spatem_codec::c_utMapemSpatemTrigger) {
process_ut_mapem_spatem_trigger(data, params);
} else if (id == uppertester_ivim_codec::c_utIvimTrigger) {
process_ut_ivim_trigger(data, params);
} else if (id == uppertester_ivim_codec::c_utIvimUpdate) {
......@@ -868,6 +873,47 @@ int ConfigRsuSimulatorLayer::process_ut_pki_trigger(const OCTETSTRING& data, par
return 0;
}
int ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger(const OCTETSTRING& data, params& params) {
loggers::get_instance().log_msg(">>> ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger", data);
params::const_iterator it = _params.find("ut");
if (it == _params.cend()) {
loggers::get_instance().warning("ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger: CF layer's ut parameter is missing");
return -1;
}
if (_params[std::string("ut")].compare("mapemspatem") == 0) {
unsigned char* p = (unsigned char*)static_cast<const unsigned char*>(data);
unsigned char msg_id = *p++;
loggers::get_instance().log("ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger: msg_id=%02x", msg_id);
LibItsMapemSpatem__TypesAndValues::UtMapemSpatemTrigger trigger; // See ETSI TR 103 34 099 Cause C.4.1 GenerateIvimEvent
// Decode Event
loggers::get_instance().log("ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger: event=%02x", *p);
trigger.event().int2enum(static_cast<int>(*p++));
// Decode IntersectionId
loggers::get_instance().log("ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger: intersectionID=%04x", (short)*p);
trigger.intersectionID() = static_cast<int>((*p << 8) | *(p + 1));
p += 2;
// Decode RegulatorySpeedLimit
loggers::get_instance().log("ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger: type__=%02x", *p);
trigger.regulatorySpeedLimit().type__().int2enum(static_cast<int>(*p++));
loggers::get_instance().log("ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger: speed=%04x", (short)*p);
trigger.regulatorySpeedLimit().speed() = static_cast<int>((*p << 8) | *(p + 1));
p += 2;
// FIXME Add flags
trigger.latitude().set_to_omit();
loggers::get_instance().log_msg("ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger: ", trigger);
// Pass it to the ports if any
to_all_upper_ports(trigger, params);
} else {
loggers::get_instance().warning("ConfigRsuSimulatorLayer::process_ut_mapem_spatem_trigger: Unsupported protocol");
return -1;
}
return 0;
}
int ConfigRsuSimulatorLayer::process_ut_ivim_trigger(const OCTETSTRING& data, params& params) {
loggers::get_instance().log_msg(">>> ConfigRsuSimulatorLayer::process_ut_ivim_trigger", data);
......
......@@ -72,7 +72,7 @@ private:
int process_ut_ivim_trigger(const OCTETSTRING& data, params& params);
int process_ut_ivim_update(const OCTETSTRING& data, params& params);
int process_ut_ivim_termination(const OCTETSTRING& data, params& params);
int process_ut_mapemspatem_trigger(const OCTETSTRING& data, params& params);
int process_ut_mapem_spatem_trigger(const OCTETSTRING& data, params& params);
int process_ut_srem_trigger(const OCTETSTRING& data, params& params);
int process_ut_srem_update(const OCTETSTRING& data, params& params);
int process_ut_srem_termination(const OCTETSTRING& data, params& params);
......
......@@ -10,6 +10,8 @@ mapem_spatem_layer::mapem_spatem_layer(const std::string & p_type, const std::st
loggers::get_instance().log(">>> mapem_spatem_layer::mapem_spatem_layer: %s, %s", to_string().c_str(), param.c_str());
// Setup parameters
params::convert(_params, param);
_params.insert(std::make_pair<std::string, std::string>("its_aid", "138")); // ETSI TS 102 965 V1.2.1 (2015-06)
_params.insert(std::make_pair<std::string, std::string>("payload_type", "2")); // MAPE message id - See ETSI TS 102 894
// Register this object for AdapterControlPort
loggers::get_instance().log("mapem_spatem_layer::mapem_spatem_layer: Register %s/%p", p_type.c_str(), this);
......@@ -52,7 +54,7 @@ void mapem_spatem_layer::receive_data(OCTETSTRING& data, params& params)
loggers::get_instance().log_msg(">>> mapem_spatem_layer::receive_data: ", data);
// Sanity check
if (*(static_cast<const unsigned char*>(data)+ 1) == 0x04) { // Check that received packet has MAPE message id
if (*(static_cast<const unsigned char*>(data)+ 1) == 0x05) { // Check that received packet has MAPE message id
// Decode the MAPEM payload
LibItsMapemSpatem__TestSystem::MapemInd p;
_mapem_codec.decode(data, p.msgIn());
......@@ -135,7 +137,7 @@ void mapem_spatem_layer::receive_data(OCTETSTRING& data, params& params)
// Pass it to the ports if any
to_all_upper_ports(p, params);
} else if (*(static_cast<const unsigned char*>(data)+ 1) == 0x05) { // Check that received packet has SPATE message id
} else if (*(static_cast<const unsigned char*>(data)+ 1) == 0x04) { // Check that received packet has SPATE message id
// Decode the SPATEM payload
LibItsMapemSpatem__TestSystem::SpatemInd p;
_spatem_codec.decode(data, p.msgIn());
......
......@@ -60,11 +60,19 @@ int uppertester_mapem_spatem_codec::encode_ (const Base_Type& type, const TTCN_T
} else {
std::string s(field_descriptor.name);
loggers::get_instance().log("uppertester_mapem_spatem_codec::encode_: field to process %s", s.c_str());
loggers::get_instance().log("uppertester_mapem_spatem_codec::encode_ (else): processing type %s/%s", type.get_descriptor()->name, field_descriptor.name);
loggers::get_instance().log("uppertester_mapem_spatem_codec::encode_ (else): processing type %s/%s", type.get_descriptor()->name, field_descriptor.name);
if (s.compare("@DSRC-REGION-noCircular.RegulatorySpeedLimit.type") == 0) {
const int t = dynamic_cast<const Enum_Type&>(type).as_int();
encoding_buffer.put_c((unsigned char)t);
} else if ((s.compare("@LibItsMapemSpatem_TypesAndValues.UtMapemSpatemTrigger.intersectionID") == 0) || (s.compare("@DSRC-REGION-noCircular.RegulatorySpeedLimit.speed") == 0)) {
const INTEGER& s = dynamic_cast<const INTEGER&>(type);
OCTETSTRING os = int2oct(s, 2);
encoding_buffer.put_s(os.lengthof(), static_cast<const unsigned char*>(os));
} else {
type.encode(field_descriptor, encoding_buffer, TTCN_EncDec::CT_RAW);
}
}
loggers::get_instance().log_to_hexa("<<<uppertester_mapem_spatem_codec::encode_: encoding_buffer=", encoding_buffer);
return 0;
}
......
......@@ -2371,13 +2371,8 @@ module ItsCam_TpFunctions {
function f_CAM_MSD_GFQ_TI_03() runs on ItsCam {
// Local variables
timer t_maxTransInterval_min := PICS_T_GENCAMMAX * 0.90;
timer t_maxTransInterval_max := PICS_T_GENCAMMAX * 1.10;
timer t_interval_1_measure := PX_TWAIT;
timer t_interval_1_min;
timer t_interval_1_max;
var float v_interval_1_min;
var float v_interval_1_max;
var float v_interval_1_measured := 0.0;
var float v_receiveTime;
var integer v_N_GenCam := 3;
var integer v_i;
......
......@@ -166,7 +166,7 @@ module ItsMapem_TestCases {
* then {
* the first node of the trajectory
* indicate the position related to the node of ingress lane
* and the first node of the trajectory
* and the last node of the trajectory
* indicate the position identical to the first node of the connected egress lane
* }
* }
......
......@@ -171,7 +171,7 @@ module ItsMapem_TpFunctions {
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
// Test Body
f_utTriggerEvent(m_utTriggerEvent(mapemNewContent));
f_utTriggerEvent(m_utTriggerEvent(mapemNewContent, v_mapem.msgIn.map_.intersections[0].id.id, v_mapem.msgIn.map_.intersections[0].speedLimits[0]));
tc_ac.start;
alt {
......
......@@ -220,7 +220,7 @@ module ItsSpatem_TestCases {
* @see ETSI TS 103 191-2 v1.2.5 TP_IS_TLM_GEN_MSGF_BV_05
* @reference CEN ISO/TS 19091 [4], clause 6.7.6
*/
testcase TC_IS_TLM_GEN_MSGF_BV_05 () runs on ItsMtc {
testcase TC_IS_TLM_GEN_MSGF_BV_05 () runs on ItsMapemSpatem system ItsMapemSpatemSystem {
f_IS_TLM_GEN_MSGF_BV_05();
......@@ -278,7 +278,7 @@ module ItsSpatem_TestCases {
* @see ETSI TS 103 191-2 v1.2.5 TP_IS_TLM_GEN_MSGF_BV_06
* @reference CEN ISO/TS 19091 [4], clauses 6.7.8
*/
testcase TC_IS_TLM_GEN_MSGF_BV_06 () runs on ItsMtc {
testcase TC_IS_TLM_GEN_MSGF_BV_06 () runs on ItsMapemSpatem system ItsMapemSpatemSystem {
f_IS_TLM_GEN_MSGF_BV_06();
......@@ -337,7 +337,7 @@ module ItsSpatem_TestCases {
* @see ETSI TS 103 191-2 v1.2.5 TP_IS_TLM_GEN_MSGF_BV_07
* @reference CEN ISO/TS 19091 [4], clauses 6.7.9
*/
testcase TC_IS_TLM_GEN_MSGF_BV_07 () runs on ItsMtc {
testcase TC_IS_TLM_GEN_MSGF_BV_07 () runs on ItsMapemSpatem system ItsMapemSpatemSystem {
f_IS_TLM_GEN_MSGF_BV_07();
......
......@@ -256,10 +256,9 @@ module ItsSpatem_TpFunctions {
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_05
*/
function f_IS_TLM_GEN_MSGF_BV_05 () runs on ItsMtc {
function f_IS_TLM_GEN_MSGF_BV_05 () runs on ItsMapemSpatem {
// Local variables
var ItsMapemSpatem v_mapem;
var ItsMapemSpatem v_spatem;
// Test control
if (not PICS_SPATEM_GENERATION) {
......@@ -267,74 +266,16 @@ module ItsSpatem_TpFunctions {
setverdict(inconc);
stop;
}
// Test component configuration
f_cf02Up();
// Preamble
// Start components
v_mapem := f_getComponent(c_compMap);
v_spatem := f_getComponent(c_compSpat);
v_mapem.start(f_IS_TLM_GEN_MSGF_BV_05_MAPEM());
v_spatem.start(f_IS_TLM_GEN_MSGF_BV_05_SPATEM());
// Synchronization
f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
// Cleanup
f_cf02Down();
} // End of function f_IS_TLM_GEN_MSGF_BV_05
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_05_SPATEM
*/
function f_IS_TLM_GEN_MSGF_BV_05_MAPEM () runs on ItsMapemSpatem {
// Local variables
var MapemInd v_mapem;
// Preamble
f_prInitialState();
f_awaitMapeMessage(
mw_mapemInd(
mw_mapemPdu(
mw_mapem(
{mw_intersectionGeometry(
-,
-,
-,
{mw_roadLane(
-,//laneID
-,//laneAttributes
-,//p_ingressApproach
-,//egressApproach
? //connectsTo
)}
)}
)
)),
v_mapem
);
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
} // End of function f_IS_TLM_GEN_MSGF_BV_05_MAPEM
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_05_SPATEM
*/
function f_IS_TLM_GEN_MSGF_BV_05_SPATEM () runs on ItsMapemSpatem {
// Local variables
// Test component configuration
f_cfUp();
// Preamble
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
f_prInitialState();
f_utTriggerEvent(m_utTriggerEvent(startTLMService));
// Wait for SPATEM sent
tc_ac.start(2.0);
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
// Test Body
tc_ac.start;
......@@ -347,7 +288,7 @@ module ItsSpatem_TpFunctions {
-, //IntersectionReferenceID p_id
-, //MsgCount p_revision
-, //IntersectionStatusObject p_status
{mw_movementState(?)} //MovementList p_states with signalGroup
{mw_movementState} //MovementList p_states
)}
)
)
......@@ -365,16 +306,16 @@ module ItsSpatem_TpFunctions {
// Postamble
f_utTriggerEvent(m_utTriggerEvent(stopTLMService));
f_poDefault();
f_cfDown();
} // End of function f_IS_TLM_GEN_MSGF_BV_05_SPATEM
} // End of function f_IS_TLM_GEN_MSGF_BV_05
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_06
*/
function f_IS_TLM_GEN_MSGF_BV_06 () runs on ItsMtc {
function f_IS_TLM_GEN_MSGF_BV_06 () runs on ItsMapemSpatem {
// Local variables
var ItsMapemSpatem v_mapem;
var ItsMapemSpatem v_spatem;
// Test control
if (not PICS_SPATEM_GENERATION) {
......@@ -382,74 +323,16 @@ module ItsSpatem_TpFunctions {
setverdict(inconc);
stop;
}
// Test component configuration
f_cf02Up();
// Preamble
// Start components
v_mapem := f_getComponent(c_compMap);
v_spatem := f_getComponent(c_compSpat);
v_mapem.start(f_IS_TLM_GEN_MSGF_BV_06_MAPEM());
v_spatem.start(f_IS_TLM_GEN_MSGF_BV_06_SPATEM());
// Synchronization
f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
// Cleanup
f_cf02Down();
} // End of function f_IS_TLM_GEN_MSGF_BV_06
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_06_SPATEM
*/
function f_IS_TLM_GEN_MSGF_BV_06_MAPEM () runs on ItsMapemSpatem {
// Local variables
var MapemInd v_mapem;
// Preamble
f_prInitialState();
f_awaitMapeMessage(
mw_mapemInd(
mw_mapemPdu(
mw_mapem(
{mw_intersectionGeometry(
-,
-,
-,
{mw_roadLane(
-,//laneID
?,//laneAttributes
-,//p_ingressApproach
-,//egressApproach
? //connectsTo
)}
)}
)
)),
v_mapem
);
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
} // End of function f_IS_TLM_GEN_MSGF_BV_06_MAPEM
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_06
*/
function f_IS_TLM_GEN_MSGF_BV_06_SPATEM () runs on ItsMapemSpatem {
// Local variables
// Test component configuration
f_cfUp();
// Preamble
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
f_prInitialState();
f_utTriggerEvent(m_utTriggerEvent(startTLMService));
// Wait for SPATEM sent
tc_ac.start(2.0);
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
// Test Body
tc_ac.start;
......@@ -483,127 +366,19 @@ module ItsSpatem_TpFunctions {
// Postamble
f_utTriggerEvent(m_utTriggerEvent(stopTLMService));
f_poDefault();
f_cfDown();
} // End of function f_IS_TLM_GEN_MSGF_BV_06_SPATEM
} // End of function f_IS_TLM_GEN_MSGF_BV_06
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_07
*/
function f_IS_TLM_GEN_MSGF_BV_07 () runs on ItsMtc {
// Local variables
var ItsMapemSpatem v_mapem;
var ItsMapemSpatem v_spatem;
function f_IS_TLM_GEN_MSGF_BV_07 () runs on ItsMapemSpatem {
// Test control
if (not (PICS_SPATEM_GENERATION and PICS_SPATEM_PEDESTRIAN_MANOEUVRES)) {
log("*** " & testcasename() & ": PICS_SPATEM_GENERATION AND PICS_SPATEM_PEDESTRIAN_MANOEUVRES required for executing the TC ***");
setverdict(inconc);
stop;
}
// Test component configuration
f_cf02Up();
// Preamble
// Start components
v_mapem := f_getComponent(c_compMap);
v_spatem := f_getComponent(c_compSpat);
v_mapem.start(f_IS_TLM_GEN_MSGF_BV_07_MAPEM());
v_spatem.start(f_IS_TLM_GEN_MSGF_BV_07_SPATEM());
// Synchronization
f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
// Cleanup
f_cf02Down();
// TODO
} // End of function f_IS_TLM_GEN_MSGF_BV_07
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_07_SPATEM
*/
function f_IS_TLM_GEN_MSGF_BV_07_MAPEM () runs on ItsMapemSpatem {
// Local variables
var MapemInd v_mapem;
// Preamble
f_prInitialState();
f_awaitMapeMessage(
mw_mapemInd(
mw_mapemPdu(
mw_mapem(
{mw_intersectionGeometry(
-,
-,
-,
{mw_roadLane(
-,//laneID
?,//laneAttributes
-,//p_ingressApproach
-,//egressApproach
? //connectsTo
)}
)}
)
)),
v_mapem
);
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
} // End of function f_IS_TLM_GEN_MSGF_BV_07_MAPEM
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_07_SPATEM
*/
function f_IS_TLM_GEN_MSGF_BV_07_SPATEM () runs on ItsMapemSpatem {
// Local variables
// Preamble
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
f_prInitialState();
f_utTriggerEvent(m_utTriggerEvent(startTLMService));
// Wait for SPATEM sent
tc_ac.start(2.0);
// Test Body
tc_ac.start;
alt {
[] mapemSpatemPort.receive(
mw_spatemInd(
mw_spatemPdu(
mw_spatem_intersections(
{mw_IntersectionState(
?, //IntersectionReferenceID p_id
-, //MsgCount p_revision
-, //IntersectionStatusObject p_status
{mw_movementState(
?,//SignalGroupID,
? //MovementEventList,
)} //MovementList p_states
)}
)
)
)) {
tc_ac.stop;
log("*** " & testcasename() & ": PASS: Successfully received SAPTEM PDU header. ***");
f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
}
[] tc_ac.timeout {
log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
}
}
// Postamble
f_utTriggerEvent(m_utTriggerEvent(stopTLMService));
f_poDefault();
} // End of function f_IS_TLM_GEN_MSGF_BV_07_SPATEM
/**
* @desc TP Function for TC_IS_TLM_GEN_MSGF_BV_08
*/
......
......@@ -48,8 +48,6 @@ module ItsRSUsSimulator_Functions {
// LibItsMapemSpatemm
import from LibItsIvim_TypesAndValues all;
import from LibItsIvim_Templates all;
// LibItsMapemSpatemm
import from LibItsMapemSpatem_TypesAndValues all;
import from LibItsMapemSpatem_Templates all;
......@@ -1712,7 +1710,7 @@ module ItsRSUsSimulator_Functions {
cfPort.send(UtIvimResults: { utIvimTerminationResult := true } );
repeat;
}
[vc_mapem] cfPort.receive(UtMapemSpatemInitialize:?) -> value v_utMapemSpatemInitialize {
[] cfPort.receive(UtMapemSpatemInitialize:?) -> value v_utMapemSpatemInitialize {
log("a_process_cf_ut_command: v_utMapemSpatemInitialize = ", v_utMapemSpatemInitialize);
if (oct2int(v_utMapemSpatemInitialize.hashedId8) != 0) {
var charstring v_certificate_id;
......@@ -1722,12 +1720,47 @@ module ItsRSUsSimulator_Functions {
log("a_process_cf_ut_command (pki): Change certificate to ", v_certificate_id);
f_acTriggerSecEvent(m_acEnableSecurity(v_certificate_id));
}
if (vc_mapem == false) {
vc_rsuMessagesValueList[vc_rsu_id].mapem := m_mapemParm(
PICS_RSU_PARAMS[vc_rsu_id].stationID,
m_mapem(
f_getMsgIssueRevision(),
c_PICS_ConfTest_ProfileId_0.intersections,
omit
));
// Update revision fields
vc_rsuMessagesValueList[vc_rsu_id].mapem.map_.intersections[0].revision := f_incMsgIssueRevision();
// TODO Add more?
}
log("a_process_cf_ut_command: MAPEM=", vc_rsuMessagesValueList[vc_rsu_id].mapem);
vc_mapem := true;
tc_mapem.start;
cfPort.send(UtMapemSpatemResults: { utMapemSpatemInitializeResult := true } );
repeat;
}
[vc_mapem == true] cfPort.receive(UtMapemSpatemTrigger:?) -> value v_utMapemSpatemTrigger {
log("a_process_cf_ut_command: v_utMapemSpatemTrigger: ", v_utMapemSpatemTrigger);
// TODO
if (v_utMapemSpatemTrigger.event == mapemNewContent) {
// TODO To be reviewd
/*vc_rsuMessagesValueList[vc_rsu_id].mapem := m_mapemParm(
PICS_RSU_PARAMS[vc_rsu_id].stationID,
m_mapem(
f_getMsgIssueRevision(),
c_PICS_ConfTest_ProfileId_0.intersections,
omit
));*/
}
if (v_utMapemSpatemTrigger.intersectionID != valueof(vc_rsuMessagesValueList[vc_rsu_id].mapem.map_.intersections[0].id.id)) {
// TODO
}
if (
not(ispresent(vc_rsuMessagesValueList[vc_rsu_id].mapem.map_.intersections[0].speedLimits)) or
(v_utMapemSpatemTrigger.regulatorySpeedLimit != valueof(vc_rsuMessagesValueList[vc_rsu_id].mapem.map_.intersections[0].speedLimits[0]))
) {
// Update field and increment revision
vc_rsuMessagesValueList[vc_rsu_id].mapem.map_.intersections[0].speedLimits[0] := v_utMapemSpatemTrigger.regulatorySpeedLimit;
vc_rsuMessagesValueList[vc_rsu_id].mapem.map_.intersections[0].revision := valueof(vc_rsuMessagesValueList[vc_rsu_id].mapem.map_.intersections[0].revision) + 1;
}