Type declarations examples
Example: an actor declaration
OSC2 code: actor declaration
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum veh_category: [car, truck, motorcycle]
enum track_kind: [single_track, multi_track]
actor my_vehicle:
category: veh_category
emergency_vehicle: bool
track_kind: track_kind
Example: unconditional inheritance
OSC2 code: unconditional inheritance
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum rv_category: [motorhome, campervan, caravan, fifth_wheel_trailer, popup_camper, truck_camper]
actor recreational_vehicle:
category: rv_category
has_kitchen: bool
actor truck_camper inherits recreational_vehicle:
keep(category==truck_camper)
keep(has_kitchen==false)
Example: conditional inheritance
OSC2 code: conditional inheritance
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum veh_category: [car, truck, motorcycle]
enum track_kind: [single_track, multi_track]
actor my_vehicle:
category: veh_category
emergency_vehicle: bool
track_kind: track_kind
actor my_truck inherits my_vehicle(category == truck):
num_of_trailers: uint with: keep(it in [0..2])
Example: scenario declaration example 1
OSC2 code: scenario declaration example 1
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
scenario top.something:
b: bool
# Declaration 1
actor x:
b: bool
scenario y:
do top.something()
Example: scenario declaration example 2
OSC2 code: scenario declaration example 2
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
scenario top.something:
b: bool
# Declaration 2
actor x:
b: bool
scenario x.y:
do top.something()
Example: extend a scenario of a parent actor
OSC2 code: extend a scenario of a parent actor
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
scenario top.something:
speed: speed
actor x:
b: bool
scenario y:
do something: top.something(speed: default 20kph)
actor z inherits x (b == true):
extend y:
keep(something.speed == 30kph)
Example: action/scenario difference
OSC2 code: action/scenario difference
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
actor flying_object inherits physical_object:
weight: mass
keep(weight < 10kg)
# action flying_object.fly:
scenario flying_object.fly:
pos: global_position
Example: enum declaration
OSC2 code: enum declaration
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum car_type: [sedan = 1, truck = 2, bus = 3]
# by default, aggressive = 0, normal = 1
enum my_driving_style: [aggressive, normal, timid]
Example: ambiguous constraint with enum
OSC2 code: ambiguous constraint with enum
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum my_enum: [a, b]
actor my_actor:
a: int
x: my_enum with:
keep(it == a)
Example: resolving ambiguity with 'as()'
OSC2 code: resolving ambiguity with 'as()'
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum my_enum: [a, b]
actor my_actor:
a: int
x: my_enum with:
keep(it == self.a.as(my_enum))
Example: explicit enum literals
OSC2 code: explicit enum literals
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum rgb_color: [red, green, blue]
enum cmyk_color: [cyan, magenta, yellow, black]
extend rgb_color: [black]
extend top.main:
# Example enumeration fields
my_cmyk_color: cmyk_color = black # Resolved to cmyk_color!black
my_new_rgb_color: rgb_color = black # Resolved to rgb_color!black
# Resolution in expressions
# field1: bool = (black == black) # Could be either type -> error issued
field2: bool = (rgb_color!black == rgb_color!black) # True
Example: extend enum
OSC2 code: extend enum
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum driving_style: [normal, aggressive]
extend driving_style: [erratic]
Example: extend struct
OSC2 code: extend struct
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
struct storm_data:
snow_depth: length
extend storm_data:
var wind_velocity: speed
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
Example: extend scenario
OSC2 code: extend scenario
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
set min_test_time = 0second
scenario top.scenario1:
flag: bool
do log("Scenario 1 is executing")
scenario top.scenario2:
do log("Scenario 2 is executing")
scenario top.scenario3:
do log("Scenario 3 is executing")
extend top.scenario3:
do scenario2()
extend top.main:
do serial:
scenario1()
scenario3()
Example: extend previous behavior
OSC2 code: extend previous behavior
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set min_test_time = 0sec
set map = "$FTX_PACKAGES/maps/hooder.xodr"
scenario top.scenario1:
flag: bool
do log("Scenario 1 is executing")
extend top.scenario1:
do serial:
previous_do()
log("Extending scenario 1 behavior")
extend top.main:
do serial:
scenario1()
Example: modifier
OSC2 code: modifier
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
modifier sut.curving_road:
gr: road_curvature with:
keep(it.min_radius == 6meter)
keep(it.max_radius == 11meter)
extend sut.curving_road:
keep(gr.direction == right_curve)
Example: constrain global parameter
OSC2 code: constrain global parameter
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
# global count2: uint = 0 # default constraint not supported yet
global count: uint with: keep(soft it == 0) # soft constraint allowed
struct keep_count:
# keep(soft count== 1) # constraining global parameter from dynamic struct not allowed
Example: constraint on local/global fields
OSC2 code: constraint on local/global fields
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
global count: uint with: keep(it == 0)
extend top.main:
count: uint
keep(count == 2)
Example: modifier declaration for a scenario
OSC2 code: modifier declaration for a scenario
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
scenario vehicle.to_side_on_curve
modifier vehicle.object_in_road of to_side_on_curve:
tc: traffic_cone
Example: modifier declaration for an actor
OSC2 code: modifier declaration for an actor
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
modifier sut.curving_road:
gr: road_curvature
keep(gr.min_radius == 6meter)
keep(gr.max_radius == 11meter)
Example: global modifier for the vehicle actor
OSC2 code: global modifier for the vehicle actor
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/straight_long_road.xodr"
extend issue_kind: [high_speed_at_end]
# Declaring a global modifier
global modifier vehicle.end_speed_info:
# Use 'actor' to reference the actor instance
cover(name: speed_at_end, expression: actor.state.speed, event: end, unit: kph)
# Simple check
on @end if actor.state.speed > 50kph:
other_error(high_speed_at_end, "speed too high at end")
# Disabling a global modifier for a specific actor:
extend top.main:
vehicle_1: vehicle
vehicle_2: vehicle
# Access the modifier field under the actor's end_speed_info
keep(vehicle_2.end_speed_info.enabled == false)
do parallel:
sut.car.drive() with: speed([30..60]kph)
vehicle_1.drive() with: speed([55..70]kph)
vehicle_2.drive() with: speed([25..50]kph)
with:
duration([3..7]s)
Example: scenario declaration
OSC2 code: scenario declaration
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
# A two-phase scenario
scenario traffic.two_phases: # Scenario name
# Define the truck with specific attributes
truck1: vehicle with:
keep(it.color == green)
keep(it.vehicle_category == box_truck)
# Define the behavior
do serial:
phase1: truck1.drive() with:
speed(speed: 0kph, at: start)
speed(speed: 10kph, at: end)
phase2: truck1.drive() with:
speed(speed: [10..15]kph)
Example: scenario inheritance in type declarations
OSC2 code: scenario inheritance
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum my_vehicle_category: [car, truck, motorcycle]
enum my_emergency_vehicle_kind: [fire, police, ambulance]
enum light_kind: [parking, low_beam, high_beam, emergency]
actor my_vehicle:
category: my_vehicle_category
emergency_vehicle: bool
actor my_emergency_vehicle inherits my_vehicle(emergency_vehicle == true):
vehicle_kind: my_emergency_vehicle_kind
scenario my_vehicle.maneuver:
lights: light_kind
scenario my_emergency_vehicle.maneuver_emergency inherits maneuver(lights == emergency):
siren: bool with: keep(it == true)
Example: struct declaration
OSC2 code: struct declaration
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
struct my_car_status:
var time: time
var current_speed: speed
Example: struct unconditional inheritance
OSC2 code: struct unconditional inheritance
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
struct my_collision_data inherits collision_data:
var other_vehicle_category: vehicle_category
Example: struct conditional inheritance
OSC2 code: struct conditional inheritance
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/hooder.xodr"
extend top.main:
do sut.car.drive(duration: 5s)
enum storm_type: [rain, ice, snow]
struct storm_data:
storm: storm_type
wind: speed
struct snow_storm_data inherits storm_data(storm == snow):
snow_depth: length
Example: watcher type for exceeded speed limit
OSC2 code: watcher type for exceeded speed limit
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/M77_FTX_highway_straight_long_road.xodr"
# define a watcher type that create intervals
# when the speed of a vehicle exceeds some speed limit
watcher modifier speed_above:
v: vehicle
limit: speed
on @top.w_clk:
if(data == null):
if(v.state.speed > limit):
start_interval()
else:
if(v.state.speed <= limit):
end_interval()
extend top.main:
watcher s is speed_above(sut.car, 30kph)
#on @top.clk:
# logger.log_info("$(sut.car.state.speed)")
do serial:
sut.car.drive(duration: [5sec..10sec]) with:
speed([20kph..25kph], at: start)
speed([35kph..40kph], at: end)
sut.car.drive(duration: [5sec..10sec]) with:
speed([20kph..25kph], at: end)
Example: watcher type for maximal speed
OSC2 code: watcher type for maximal speed
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/M77_FTX_highway_straight_long_road.xodr"
# Define watcher data that records a speed
struct speed_watcher_data inherits any_watcher_data:
var speed: speed
record(speed, unit: kph)
# Define a watcher type that create intervals
# when the speed of a vehicle exceeds some speed limit,
# and records the maximal exceeding speed
watcher modifier speed_above(speed_watcher_data):
v: vehicle
limit: speed
on @top.clk:
if(data == null):
if(v.state.speed > limit):
start_interval()
else:
if(v.state.speed <= limit):
end_interval()
on @i_clock:
if(data.speed < v.state.speed): data.speed = v.state.speed
extend top.main:
watcher s is speed_above(sut.car, 30kph)
#on @s.i_clock:
# logger.log_info("$(sut.car.state.speed)")
#on @s.i_end:
# logger.log_info("MAX: $(s.data.speed)")
do serial:
sut.car.drive(duration: [5sec..10sec]) with:
speed([20kph..25kph], at: start)
speed([35kph..40kph], at: end)
sut.car.drive(duration: [5sec..10sec]) with:
speed([20kph..25kph], at: end)
Example: watcher data type that records speed
OSC2 code: watcher data type that records speed
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/M77_FTX_highway_straight_long_road.xodr"
# Define watcher data that records a speed
struct speed_watcher_data inherits any_watcher_data:
speed: speed
record(speed, unit: kph)
# Define a watcher type that create intervals
# when the speed of a vehicle exceeds some speed limit,
# and records the average exceeding speed
watcher modifier speed_above(speed_watcher_data):
v: vehicle
limit: speed
var sum: speed # The accumulated speeds during the interval
var ticks: int # The number of clock cycles during the interval
on @top.w_clk:
if(data == null):
if(v.state.speed > limit):
sum = 0kph
ticks = 0
start_interval()
else:
if(v.state.speed <= limit):
data.speed = sum/ticks
end_interval()
on @i_clock:
sum = sum + v.state.speed
ticks = ticks + 1
extend top.main:
watcher s is speed_above(sut.car, 30kph)
#on @s.i_clock:
# logger.log_info("$(sut.car.state.speed), $(s.sum), $(s.ticks)")
#on @s.i_end:
# logger.log_info("AVERAGE: $(s.data.speed)")
do serial:
sut.car.drive(duration: [5sec..10sec]) with:
speed([20kph..25kph], at: start)
speed([35kph..40kph], at: end)
sut.car.drive(duration: [5sec..10sec]) with:
speed([20kph..25kph], at: end)
Example: a list of speed
OSC2 code: a list of speed
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/straight_long_road.xodr"
extend top.main:
slow_vehicle: vehicle
mid_vehicle: vehicle
fast_vehicle: vehicle
speeds: list of speed with:
keep(speeds.size() == 3)
keep(speeds[0] in [20..35]kph)
keep(speeds[1] in [40..55]kph)
keep(speeds[2] in [60..75]kph)
do parallel:
slow_vehicle.drive() with: speed(speeds[0])
mid_vehicle.drive() with: speed(speeds[1])
fast_vehicle.drive() with: speed(speeds[2])
Example: using a native method to modify a list
OSC2 code: using a native method to modify a list
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/straight_long_road.xodr"
extend top.main:
my_ints: list of int
def get_lowest(ints: list of int) -> int is:
return ints.sort(it)[0]
do serial:
sut.car.drive() with: duration([4..7]s)
call logger.log_info("Lowest integer is $(get_lowest(my_ints))")
Example: constraining range type fields
OSC2 code: constraining range type fields
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/straight_long_road.xodr"
struct ranges:
int_range: range of int
# constrain the range to a specific range
keep(int_range == [5..10])
speed_range: range of speed
# constrain the range to be within a specific range
keep(speed_range in [20..50]kph)
length_range: range of length
# constrain the range to a specific value
keep(length_range == 50m)
extend top.main:
ranges: ranges
in sut_drive with: speed(ranges.speed_range)
do sut_drive: sut.car.drive() with: duration([3..7]s)
Example: providing initial watcher data to start_interval
OSC2 code: providing initial watcher data to start_interval
import "$FTX_BASIC/exe_platforms/sumo_ssp/config/sumo_config.osc"
extend test_config:
set map = "$FTX_PACKAGES/maps/M77_FTX_highway_straight_long_road.xodr"
# Define watcher data that records acceleration
struct speed_watcher_data inherits any_watcher_data:
var acceleration_when_exceeded: acceleration
record(acceleration_when_exceeded, unit: mpsps)
# Define a watcher type that create intervals
# when the speed of a vehicle exceeds some speed limit,
# and records the acceleration at the start of the interval
watcher modifier speed_above(speed_watcher_data):
v: vehicle
limit: speed
on @top.clk:
if(data == null):
if(v.state.speed > limit):
var d := new_data()
d.acceleration_when_exceeded = v.state.road_acceleration.lon
start_interval(d)
else:
if(v.state.speed <= limit):
end_interval()
extend top.main:
watcher s is speed_above(sut.car, 30kph)
do serial:
sut.car.drive(duration: [5sec..10sec]) with:
speed([20kph..25kph], at: start)
speed([35kph..40kph], at: end)
sut.car.drive(duration: [5sec..10sec]) with:
speed([20kph..25kph], at: end)