Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TTCN-3 Libraries
LibIts
Commits
1d0ac5bc
Commit
1d0ac5bc
authored
Nov 16, 2017
by
garciay
Browse files
Review IVIM, MAPEM/SPATEM and SREM/SSEM
parent
2281dff3
Changes
13
Hide whitespace changes
Inline
Side-by-side
ttcn/IVIM/LibItsIvim_Functions.ttcn
View file @
1d0ac5bc
...
...
@@ -58,12 +58,12 @@ module LibItsIvim_Functions {
* @desc Requests to bring the IUT in an initial state
* @param p_init The initialisation to trigger.
*/
function
f_utInitializeIut
(
template
(
value
)
UtInitialize
p_init
)
runs
on
ItsIvim
{
function
f_utInitializeIut
(
template
(
value
)
UtI
vimI
nitialize
p_init
)
runs
on
ItsIvim
{
utPort
.
send
(
p_init
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtInitializeResult
:
true
)
{
[]
utPort
.
receive
(
UtI
vimResults
:
{
utIvimI
nitializeResult
:=
true
}
)
{
tc_wait
.
stop
;
log
(
"*** "
&
testcasename
()
&
": INFO: IUT initialized ***"
);
}
...
...
@@ -89,15 +89,15 @@ module LibItsIvim_Functions {
in
template
(
value
)
UtIvimTrigger
p_event
)
runs
on
ItsIvim
return
IviIdentificationNumber
{
var
IviIdentificationNumber
v_iviIdentificationNumber
;
var
UtIvim
Trigger
Result
v_result
;
var
UtIvimResult
s
v_result
;
utPort
.
send
(
p_event
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtIvimTriggerResult
:?
)
->
value
v_result
{
[]
utPort
.
receive
(
UtIvim
Results
:
{
utIvim
TriggerResult
:=
?
}
)
->
value
v_result
{
tc_wait
.
stop
;
v_iviIdentificationNumber
:=
v_result
.
iviIdentificationNumber
;
if
(
not
v_result
.
result
)
{
v_iviIdentificationNumber
:=
v_result
.
utIvimTriggerResult
.
iviIdentificationNumber
;
if
(
not
v_result
.
utIvimTriggerResult
.
result
)
{
f_selfOrClientSyncAndVerdict
(
"IVIM Trigger failed"
,
e_error
);
}
}
...
...
@@ -125,14 +125,17 @@ module LibItsIvim_Functions {
in
template
(
value
)
UtIvimUpdate
p_event
)
runs
on
ItsIvim
return
IviIdentificationNumber
{
var
IviIdentificationNumber
v_iviIdentificationNumber
;
var
UtIvim
Update
Result
v_result
;
var
UtIvimResult
s
v_result
;
utPort
.
send
(
p_event
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtIvimUpdateResult
:?
)
->
value
v_result
{
[]
utPort
.
receive
(
UtIvim
Results
:
{
utIvim
UpdateResult
:=
?
}
)
->
value
v_result
{
tc_wait
.
stop
;
v_iviIdentificationNumber
:=
v_result
.
iviIdentificationNumber
;
v_iviIdentificationNumber
:=
v_result
.
utIvimUpdateResult
.
iviIdentificationNumber
;
if
(
not
v_result
.
utIvimUpdateResult
.
result
)
{
f_selfOrClientSyncAndVerdict
(
"IVIM Update failed"
,
e_error
);
}
}
[]
a_utDefault
()
{
//empty on purpose
...
...
@@ -159,7 +162,7 @@ module LibItsIvim_Functions {
utPort
.
send
(
p_event
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtIvimTerminationResult
:?
)
{
[]
utPort
.
receive
(
UtIvim
Results
:
{
utIvim
TerminationResult
:=
?
}
)
{
tc_wait
.
stop
;
}
[]
tc_wait
.
timeout
{
...
...
@@ -449,4 +452,4 @@ module LibItsIvim_Functions {
}
// End of group miscellaneousFunctions
}
// End of module LibItsIvim_Functions
\ No newline at end of file
}
// End of module LibItsIvim_Functions
ttcn/IVIM/LibItsIvim_Templates.ttcn
View file @
1d0ac5bc
...
...
@@ -132,7 +132,7 @@ module LibItsIvim_Templates {
/**
* @desc Send template for Upper Tester event initialization
*/
template
(
value
)
UtInitialize
m_ivimStructureInitialize
:=
{
template
(
value
)
UtI
vimI
nitialize
m_ivimStructureInitialize
:=
{
hashedId8
:=
'0000000000000000'O
}
// End of template m_ivimStructureInitialize
...
...
@@ -419,7 +419,7 @@ module LibItsIvim_Templates {
*/
template
(
present
)
Provider
mw_provider
(
template
(
present
)
CountryCode
p_countryCode
:=
?
,
template
(
present
)
IssuerIdentifier
p_providerIdentifier
:=
?
template
(
present
)
AVIAEI
IssuerIdentifier
p_providerIdentifier
:=
?
)
:=
{
countryCode
:=
p_countryCode
,
providerIdentifier
:=
p_providerIdentifier
...
...
@@ -597,4 +597,4 @@ module LibItsIvim_Templates {
}
// End of group roadConfigurationContainerGroup
}
// End of module LibItsIvimTemplates
\ No newline at end of file
}
// End of module LibItsIvimTemplates
ttcn/IVIM/LibItsIvim_TestSystem.ttcn
View file @
1d0ac5bc
...
...
@@ -35,9 +35,9 @@ module LibItsIvim_TestSystem {
*/
type
port
AdapterControlPort
message
{
out
AcGnssPrimitive
,
AcSecPrimitive
;
AcSecPrimitive
;
in
A
cGnssResponse
,
AcGnssDistanceCovered
,
AcSecResponse
;
A
dapterControlResults
;
}
// end AdapterControlPort
/**
...
...
@@ -45,10 +45,9 @@ module LibItsIvim_TestSystem {
*/
type
port
UpperTesterPort
message
{
out
UtInitialize
,
UtIvimTrigger
,
UtIvimUpdate
,
UtIvimTermination
,
UtChangePosition
,
UtChangePseudonym
;
UtI
vimI
nitialize
,
UtIvimTrigger
,
UtIvimUpdate
,
UtIvimTermination
;
in
UtInitializeResult
,
UtIvimTriggerResult
,
UtIvimUpdateResult
,
UtIvimTerminationResult
,
UtChangePositionResult
,
UtChangePseudonymResult
,
UtIvimEventInd
;
UtIvimResults
,
UtIvimEventInd
;
}
// end UpperTesterPort
}
// end portDefinitions
...
...
ttcn/IVIM/LibItsIvim_TypesAndValues.ttcn
View file @
1d0ac5bc
...
...
@@ -11,6 +11,10 @@
*/
module
LibItsIvim_TypesAndValues
{
// LibCommon
import
from
LibCommon_DataStrings
all
;
import
from
LibCommon_BasicTypesAndValues
all
;
// LibIts
import
from
IVIM_PDU_Descriptions
language
"ASN.1:1997"
all
;
import
from
IVI
language
"ASN.1:1997"
all
;
...
...
@@ -53,6 +57,33 @@ module LibItsIvim_TypesAndValues {
group
utPrimitives
{
/**
* @desc Upper Tester message to initialize IUT
* @member hashedId8 In case of secured mode set, hashedId8 indicate which certificate the IUT shall use
*/
type
record
UtIvimInitialize
{
Oct8
hashedId8
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester results message of the IVIM IUT
* @member utIvimInitialize -
* @member utIvimTriggerResult -
* @member utIvimUpdateResult, -
* @member utIvimChangePositionResult -
* @member utIvimChangePseudonymResult -
*/
type
union
UtIvimResults
{
boolean
utIvimInitializeResult
,
UtIvimTriggerResult
utIvimTriggerResult
,
UtIvimUpdateResult
utIvimUpdateResult
,
UtIvimTermination
utIvimTerminationResult
}
with
{
variant
""
}
// End of type UtIvimResults
/**
* @desc Upper Tester message to request triggering of an event at IUT
*/
...
...
@@ -62,7 +93,9 @@ module LibItsIvim_TypesAndValues {
TimestampIts
repetitionInterval
optional
/*,
IVIManagementContainer.connectedIviStructures connectedIviStructures optional,
IviStructure.optional_ optional_ optional*/
}
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester result message of request of triggering of an event at IUT
...
...
@@ -70,7 +103,9 @@ module LibItsIvim_TypesAndValues {
type
record
UtIvimTriggerResult
{
boolean
result
,
IviIdentificationNumber
iviIdentificationNumber
}
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester message to update an event at IUT
...
...
@@ -82,7 +117,9 @@ module LibItsIvim_TypesAndValues {
TimestampIts
validTo
optional
,
IVIManagementContainer
.
connectedIviStructures
connectedIviStructures
optional
,
IviStructure
.
optional_
optional_
optional
}
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester result message of an update request of an event on Ivim IUT
...
...
@@ -90,19 +127,43 @@ module LibItsIvim_TypesAndValues {
type
record
UtIvimUpdateResult
{
boolean
result
,
IviIdentificationNumber
iviIdentificationNumber
}
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester message to request the termination of an event at IUT
*/
type
record
UtIvimTermination
{
IviIdentificationNumber
iviIdentificationNumber
}
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester result message of termination of an event on Ivim IUT
*/
type
boolean
UtIvimTerminationResult
;
/**
* @desc Upper Tester message to change the position of IUT. Values a relatives
*/
type
record
UtIvimChangePosition
{
Int32
latitude
,
Int32
longitude
,
Int32
elevation
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester message to change the pseudonym of the DENM IUT
*/
type
record
UtIvimChangePseudonym
{
// empty on purpose
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester message to check event/status on Ivim IUT
...
...
@@ -126,6 +187,7 @@ module LibItsIvim_TypesAndValues {
}
with
{
encode
"UpperTester"
variant
""
}
}
with
{
...
...
ttcn/MapemSpatem/LibItsMapemSpatem_Functions.ttcn
View file @
1d0ac5bc
...
...
@@ -39,12 +39,12 @@ module LibItsMapemSpatem_Functions {
* @desc Requests to bring the IUT in an initial state
* @param p_init The initialisation to trigger.
*/
function
f_utInitializeIut
(
template
(
value
)
UtInitialize
p_init
)
runs
on
ItsMapemSpatem
{
function
f_utInitializeIut
(
template
(
value
)
Ut
MapemSpatem
Initialize
p_init
)
runs
on
ItsMapemSpatem
{
utPort
.
send
(
p_init
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtInitializeResult
:
true
)
{
[]
utPort
.
receive
(
Ut
MapemSpatemResults
:
{
utMapemSpatem
InitializeResult
:=
true
}
)
{
tc_wait
.
stop
;
log
(
"*** "
&
testcasename
()
&
": INFO: IUT initialized ***"
);
}
...
...
@@ -71,7 +71,7 @@ module LibItsMapemSpatem_Functions {
utPort
.
send
(
p_event
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtMapemSpatemTriggerResult
:
?
)
->
value
v_result
{
[]
utPort
.
receive
(
UtMapemSpatem
Results
:
{
utMapemSpatem
TriggerResult
:=
?
}
)
->
value
v_result
{
tc_wait
.
stop
;
if
(
not
v_result
)
{
f_selfOrClientSyncAndVerdict
(
"MapSpat Trigger failed"
,
e_error
);
...
...
@@ -334,4 +334,4 @@ module LibItsMapemSpatem_Functions {
}
// End of group receiveFunctions
}
// End of module LibItsMapemSpatem_Functions
\ No newline at end of file
}
// End of module LibItsMapemSpatem_Functions
ttcn/MapemSpatem/LibItsMapemSpatem_Pixits.ttcn
View file @
1d0ac5bc
...
...
@@ -17,6 +17,7 @@ module LibItsMapemSpatem_Pixits {
// LibIts
import
from
DSRC
language
"ASN.1:1997"
all
;
import
from
DSRC_REGION_noCircular
language
"ASN.1:1997"
all
;
// LibItsMapemSpatem
import
from
LibItsMapemSpatem_TypesAndValues
all
;
...
...
ttcn/MapemSpatem/LibItsMapemSpatem_Templates.ttcn
View file @
1d0ac5bc
...
...
@@ -20,6 +20,7 @@ module LibItsMapemSpatem_Templates {
import
from
MAPEM_PDU_Descriptions
language
"ASN.1:1997"
all
;
import
from
SPATEM_PDU_Descriptions
language
"ASN.1:1997"
all
;
import
from
DSRC
language
"ASN.1:1997"
all
;
import
from
DSRC_REGION_noCircular
language
"ASN.1:1997"
all
;
// LibItsCommon
import
from
LibItsCommon_Functions
all
;
...
...
@@ -212,7 +213,7 @@ module LibItsMapemSpatem_Templates {
* @desc Send template for Upper Tester event initialization
* @member hashedId8 In case of secured mode set, hashedId8 indicate which certificate the IUT shall use
*/
template
(
value
)
UtInitialize
m_mapemSpatemInitialize
:=
{
template
(
value
)
Ut
MapemSpatem
Initialize
m_mapemSpatemInitialize
:=
{
hashedId8
:=
'0000000000000000'O
}
...
...
ttcn/MapemSpatem/LibItsMapemSpatem_TestSystem.ttcn
View file @
1d0ac5bc
...
...
@@ -47,9 +47,9 @@ module LibItsMapemSpatem_TestSystem {
*/
type
port
UpperTesterPort
message
{
out
UtInitialize
,
UtMapemSpatemTrigger
;
Ut
MapemSpatem
Initialize
,
UtMapemSpatemTrigger
;
in
UtInitializeResult
,
UtMapemSpatem
Trigger
Result
,
UtMapemEventInd
,
UtSpatemEventInd
;
UtMapemSpatemResult
s
,
UtMapemEventInd
,
UtSpatemEventInd
;
}
// end UpperTesterPort
}
// end portDefinitions
...
...
ttcn/MapemSpatem/LibItsMapemSpatem_TypesAndValues.ttcn
View file @
1d0ac5bc
...
...
@@ -30,12 +30,40 @@ module LibItsMapemSpatem_TypesAndValues {
group
utPrimitives
{
/**
* @desc Upper Tester message to initialize IUT
* @member hashedId8 In case of secured mode set, hashedId8 indicate which certificate the IUT shall use
*/
type
record
UtMapemSpatemInitialize
{
Oct8
hashedId8
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester results message of the MAPEM/SPATEM IUT
* @member utMapemSpatemInitialize -
* @member utMapemSpatemTriggerResult -
* @member utMapemSpatemUpdateResult, -
* @member utMapemSpatemChangePositionResult -
* @member utMapemSpatemChangePseudonymResult -
*/
type
union
UtMapemSpatemResults
{
boolean
utMapemSpatemInitializeResult
,
boolean
utMapemSpatemTriggerResult
}
with
{
variant
""
}
// End of type UtMapemSpatemResults
/**
* @desc Upper Tester message to request triggering of an event at IUT
*/
type
record
UtMapemSpatemTrigger
{
Event
event
}
with
{
variant
"FIELDORDER(msb)"
}
type
enumerated
Event
{
startTLMService
(
0
),
stopTLMService
(
1
),
...
...
@@ -45,18 +73,14 @@ module LibItsMapemSpatem_TypesAndValues {
mapemRepL10s
(
5
),
mapemRepG10s
(
6
)
}
/**
* @desc Upper Tester result message of request of triggering of an event at IUT
*/
type
boolean
UtMapemSpatemTriggerResult
;
/**
* @desc Upper Tester message to check event/status at IUT
*/
type
record
UtMapemEventInd
{
MAPEM
mapeMsg
}
with
{
encode
(
mapeMsg
)
"LibItsMapemSpatem_asn1"
MAPEM
mapeMsg
}
with
{
encode
(
mapeMsg
)
"LibItsMapemSpatem_asn1"
}
/**
...
...
@@ -79,6 +103,8 @@ module LibItsMapemSpatem_TypesAndValues {
type
record
of
UtSpatemEventInd
UtSpatemEventIndList
;
}
with
{
encode
"UpperTester"
variant
""
}
}
// End of module LibItsMapemSpatem_TypesAndValues
\ No newline at end of file
}
with
{
encode
"LibItsMapemSpatem"
}
// End of module LibItsMapemSpatem_TypesAndValues
ttcn/SremSsem/LibItsSremSsem_Functions.ttcn
View file @
1d0ac5bc
...
...
@@ -39,12 +39,12 @@ module LibItsSremSsem_Functions {
* @desc Requests to bring the IUT in an initial state
* @param p_init The initialisation to trigger.
*/
function
f_utInitializeIut
(
template
(
value
)
UtInitialize
p_init
)
runs
on
ItsSremSsem
{
function
f_utInitializeIut
(
template
(
value
)
Ut
Srem
Initialize
p_init
)
runs
on
ItsSremSsem
{
utPort
.
send
(
p_init
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtInitializeResult
:
true
)
{
[]
utPort
.
receive
(
Ut
SremResults
:
{
utSrem
InitializeResult
:=
true
}
)
{
tc_wait
.
stop
;
log
(
"*** "
&
testcasename
()
&
": INFO: IUT initialized ***"
);
}
...
...
@@ -66,17 +66,16 @@ module LibItsSremSsem_Functions {
function
f_utTriggerEvent
(
in
template
(
value
)
UtSremTrigger
p_event
)
runs
on
ItsSremSsem
{
var
UtSremTriggerResult
v_result
;
utPort
.
send
(
p_event
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtSremTriggerResult
:?
)
->
value
v_result
{
[]
utPort
.
receive
(
UtSremResults
:
{
utSremTriggerResult
:=
true
})
{
tc_wait
.
stop
;
}
[]
utPort
.
receive
(
UtSremResults
:
{
utSremTriggerResult
:=
false
})
{
tc_wait
.
stop
;
if
(
not
v_result
)
{
f_selfOrClientSyncAndVerdict
(
"SREM Trigger failed"
,
e_error
);
}
f_selfOrClientSyncAndVerdict
(
"SREM Trigger failed"
,
e_error
);
}
[]
tc_wait
.
timeout
{
log
(
"*** "
&
testcasename
()
&
": INFO: Could not receive expected UT message from IUT in time ***"
);
...
...
@@ -98,17 +97,16 @@ module LibItsSremSsem_Functions {
function
f_utUpdateEvent
(
in
template
(
value
)
UtSremUpdate
p_event
)
runs
on
ItsSremSsem
{
var
UtSremUpdateResult
v_result
;
utPort
.
send
(
p_event
);
tc_wait
.
start
;
alt
{
[]
utPort
.
receive
(
UtSrem
UpdateResult
:?
)
->
value
v_result
{
[]
utPort
.
receive
(
UtSrem
Results
:
{
utSremUpdateResult
:=
true
})
{
tc_wait
.
stop
;
if
(
not
v_result
)
{
f_selfOrClientSyncAndVerdict
(
"SREM Update failed"
,
e_error
);
}
}
[]
utPort
.
receive
(
UtSremResults
:
{
utSremUpdateResult
:=
false
})
{
tc_wait
.
stop
;
f_selfOrClientSyncAndVerdict
(
"SREM Update failed"
,
e_error
);
}
[]
tc_wait
.
timeout
{
log
(
"*** "
&
testcasename
()
&
": INFO: Could not receive expected UT message from IUT in time ***"
);
...
...
@@ -391,4 +389,4 @@ module LibItsSremSsem_Functions {
}
// End of group miscellaneousFunctions
}
// End of module LibItsSremSsem_Functions
\ No newline at end of file
}
// End of module LibItsSremSsem_Functions
ttcn/SremSsem/LibItsSremSsem_Templates.ttcn
View file @
1d0ac5bc
...
...
@@ -210,7 +210,7 @@ module LibItsSremSsem_Templates {
* @desc Send template for Upper Tester event initialization
* @member hashedId8 In case of secured mode set, hashedId8 indicate which certificate the IUT shall use
*/
template
(
value
)
UtInitialize
m_sremSsemInitialize
:=
{
template
(
value
)
Ut
Srem
Initialize
m_sremSsemInitialize
:=
{
hashedId8
:=
'0000000000000000'O
}
...
...
ttcn/SremSsem/LibItsSremSsem_TestSystem.ttcn
View file @
1d0ac5bc
...
...
@@ -39,7 +39,7 @@ module LibItsSremSsem_TestSystem {
out
AcSecPrimitive
;
in
A
cSecResponse
;
A
dapterControlResults
;
}
// end AdapterControlPort
/**
...
...
@@ -47,9 +47,9 @@ module LibItsSremSsem_TestSystem {
*/
type
port
UpperTesterPort
message
{
out
UtInitialize
,
UtSremTrigger
,
UtSremUpdate
;
Ut
Srem
Initialize
,
UtSremTrigger
,
UtSremUpdate
;
in
Ut
InitializeResult
,
UtSremTriggerResult
,
UtSremUpdateResult
,
UtSremEventInd
,
UtSsemEventInd
;
Ut
SremResults
,
UtSremEventInd
,
UtSsemEventInd
;
}
// end UpperTesterPort
}
// end portDefinitions
...
...
ttcn/SremSsem/LibItsSremSsem_TypesAndValues.ttcn
View file @
1d0ac5bc
...
...
@@ -30,19 +30,42 @@ module LibItsSremSsem_TypesAndValues {
group
utPrimitives
{
/**
* @desc Upper Tester mes`sage to initialize IUT
* @member hashedId8 In case of secured mode set, hashedId8 indicate which certificate the IUT shall use
*/
type
record
UtSremInitialize
{
Oct8
hashedId8
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester results message of the Srem/Ssem IUT
* @member utSremInitialize -
* @member utSremTriggerResult -
* @member utAutoInteropTriggerResult -
* @member utSremChangePositionResult -
*/
type
union
UtSremResults
{
boolean
utSremInitializeResult
,
boolean
utSremTriggerResult
,
boolean
utSremUpdateResult
}
with
{
variant
""
}
// End of type UtSremResults
/**
* @desc Upper Tester message to request triggering of an event at IUT
*/
type
record
UtSremTrigger
{
BasicVehicleRole
basicVehicleRole
,
RequestImportanceLevel
requestImportanceLevel
}
}
with
{
variant
"FIELDORDER(msb)"
}
type
record
of
UtSremTrigger
UtSremTriggerList
;
/**
* @desc Upper Tester result message of request of triggering of an event at IUT
*/
type
boolean
UtSremTriggerResult
;
/**
* @desc Upper Tester message to request updating of an event at IUT
...
...
@@ -51,11 +74,9 @@ module LibItsSremSsem_TypesAndValues {
RequestID
requestID
,
BasicVehicleRole
basicVehicleRole
,
RequestImportanceLevel
requestImportanceLevel
}
/**
* @desc Upper Tester result message of request of triggering of an event at IUT
*/
type
boolean
UtSremUpdateResult
;
}
with
{
variant
"FIELDORDER(msb)"
}
/**
* @desc Upper Tester message to check event/status at IUT
...
...
@@ -89,6 +110,9 @@ module LibItsSremSsem_TypesAndValues {
}
with
{
encode
"UpperTester"
variant
""
}
}
// End of module LibItsSremSsem_TypesAndValues
\ No newline at end of file
}
with
{
encode
"LibItsSremSsem"
}
// End of module LibItsSremSsem_TypesAndValues
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment