Precommit (#1)

* first commit

* cleanup
This commit is contained in:
tompzf
2025-11-04 13:28:06 +01:00
committed by GitHub
parent dba45dc636
commit 6ed4b1534e
898 changed files with 256340 additions and 0 deletions

View File

@@ -0,0 +1,241 @@
project(SystemDemoExample)
# Use new policy for project version settings and default warning level
cmake_policy(SET CMP0048 NEW) # requires CMake 3.14
cmake_policy(SET CMP0092 NEW) # requires CMake 3.15
set(CMAKE_CXX_STANDARD 17)
# Libary symbols are hidden by default
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
# Include directory to the core framework
include_directories(${SDV_FRAMEWORK_DEV_INCLUDE})
######################################################################################################################################################################
# preparation
######################################################################################################################################################################
# REMARK: The code generation for the proxy/stub, interface definitions and serialization, the vehicle devices and the basic
# services are generated during the configuration phase of CMake. This is necessary, since CMakeFiles.txt files are generated and
# they have to be available during the configuration phase of CMake to be taken into the build process. Requisite for the code
# generation during the configuration time of CMake is the availability of the tools to do the generation. Hence the tools cannot be
# created during the build process, which is executed after the configuraiton process.
# Execute sdv_vss_util to create IDL files for devices and basic services.
message("Create interface code for devices and basic services of demo example.")
execute_process(COMMAND "${SDV_VSS_UTIL}" "${PROJECT_SOURCE_DIR}/vss_demo_example.csv" "-O${PROJECT_SOURCE_DIR}/generated/" --prefixdemo --version1.0.0.1 --enable_components)
# Execute the IDL compiler for the VSS interfaces to digest interface code. Compile with --no_ps as we do not need proxies and stubs as we do not like to expose these interfaces for complex services or applications
message("Compiling vss_vehiclechassisrearaxlerowwheel_vd_tx.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclechassisrearaxlerowwheel_vd_tx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --no_ps)
message("Compiling vss_vehiclechassissteeringwheelangle_vd_rx.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclechassissteeringwheelangle_vd_rx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --no_ps)
message("Compiling vss_vehiclesoftwareapplicationisactivecounter_vd_tx.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclesoftwareapplicationisactivecounter_vd_tx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --no_ps)
message("Compiling vss_vehiclespeed_vd_rx.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclespeed_vd_rx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --no_ps)
# We need proxies and stubs for basic services to give access to the interfaces for complex services ans applications: --ps_lib_namedemo_proxystub
message("Compiling vss_vehiclechassisrearaxlerowwheel_bs_tx.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclechassisrearaxlerowwheel_bs_tx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --ps_lib_namedemo_proxystub)
message("Compiling vss_vehiclechassissteeringwheelangle_bs_rx.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclechassissteeringwheelangle_bs_rx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --ps_lib_namedemo_proxystub)
message("Compiling vss_vehiclesoftwareapplicationisactivecounter_bs_tx.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclesoftwareapplicationisactivecounter_bs_tx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --ps_lib_namedemo_proxystub)
message("Compiling vss_vehiclespeed_bs_rx.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclespeed_bs_rx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --ps_lib_namedemo_proxystub)
# Execute sdv_dbc_util to create data link code & FMU code.
message("Create functional mockup unit (FMU) of demo example.")
execute_process(COMMAND ${SDV_DBC_UTIL} "${PROJECT_SOURCE_DIR}/datalink_demo_example.dbc" "-O${PROJECT_SOURCE_DIR}/generated/" --nodesdemo --version1.0.0.1 --moduleDemoExampleFMU --dl_lib_namecan_dl_example)
# Execute the IDL compiler for the complex service to digest interface code.
message("Compiling countersteering.idl")
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/example_service/countersteering.idl" "-O${PROJECT_SOURCE_DIR}/generated/example_service/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Iexample_service/ --ps_lib_nameexample_service_proxystub)
######################################################################################################################################################################
# data link component
######################################################################################################################################################################
# REMARK: CAN data link code was generated during the configuration phase of CMake. Following below is the build step to build the
# component that was generated.
message("Include: example component can_dl_example")
add_subdirectory(generated/can_dl)
#######################################################################################################################################################################
## vehicle devices and basic services
#######################################################################################################################################################################
# REMARK: Proxy/stub and vehicle device and basic service code was generated during the configuration phase of CMake. Following
# below are the build steps to build the components that were generated.
message("Include: demo proxy/stub for vehicle devices and basic services")
include_directories(${CMAKE_CURRENT_LIST_DIR}/generated/vss_files)
add_subdirectory(generated/vss_files/ps)
add_subdirectory(generated/vss_files/vd_isactivecounter)
add_subdirectory(generated/vss_files/vd_vehiclechassisaxle)
add_subdirectory(generated/vss_files/vd_steeringwheel)
add_subdirectory(generated/vss_files/vd_vehiclespeed)
add_subdirectory(generated/vss_files/bs_isactivecounter)
add_subdirectory(generated/vss_files/bs_vehiclechassisaxle)
add_subdirectory(generated/vss_files/bs_steeringwheel)
add_subdirectory(generated/vss_files/bs_vehiclespeed)
######################################################################################################################################################################
# complex service
######################################################################################################################################################################
message("Include: proxy/stub for complex example service")
include_directories(${CMAKE_CURRENT_LIST_DIR}/generated/example_service)
add_subdirectory(generated/example_service/ps)
message("Include: example component demo_complex_service")
add_library(demo_complex_service SHARED
example_service/complex_service.h
example_service/complex_service.cpp
)
set_target_properties(demo_complex_service PROPERTIES OUTPUT_NAME "demo_complex_service")
set_target_properties(demo_complex_service PROPERTIES PREFIX "")
set_target_properties(demo_complex_service PROPERTIES SUFFIX ".sdv")
######################################################################################################################################################################
# basic_system demo application
######################################################################################################################################################################
# Define the executable
add_executable(system_extern_example
example_app/system_extern_example.cpp
example_app/signal_names.h
)
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if (WIN32)
target_link_libraries(system_extern_example Ws2_32 Winmm Rpcrt4.lib)
else()
target_link_libraries(system_extern_example ${CMAKE_DL_LIBS} rt ${CMAKE_THREAD_LIBS_INIT})
endif()
else()
target_link_libraries(system_extern_example Rpcrt4.lib)
endif()
######################################################################################################################################################################
# system demo application
######################################################################################################################################################################
# Define the executable
add_executable(system_demo_example
example_app/system_demo_example.cpp
example_app/control.h
example_app/control.cpp
example_app/console.h
example_app/console.cpp
example_app/signal_names.h
)
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if (WIN32)
target_link_libraries(system_demo_example Ws2_32 Winmm Rpcrt4.lib)
else()
target_link_libraries(system_demo_example ${CMAKE_DL_LIBS} rt ${CMAKE_THREAD_LIBS_INIT})
endif()
else()
target_link_libraries(system_demo_example Rpcrt4.lib)
endif()
# Copy the config files
file (COPY ${PROJECT_SOURCE_DIR}/config/can_com_simulation.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
file (COPY ${PROJECT_SOURCE_DIR}/config/data_link_example.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
file (COPY ${PROJECT_SOURCE_DIR}/config/data_dispatch_example.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
file (COPY ${PROJECT_SOURCE_DIR}/config/task_timer_example.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
file (COPY ${PROJECT_SOURCE_DIR}/config/vehicle_devices_basic_services_example.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
file (COPY ${PROJECT_SOURCE_DIR}/config/complex_service_example.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
# Copy the ASC files used by can_com_sim.sdv which includes the CAN messages
# Required in both locations when running standalone or as instance
file (COPY ${PROJECT_SOURCE_DIR}/system_demo_receiver.asc DESTINATION ${CMAKE_BINARY_DIR}/bin)
file (COPY ${PROJECT_SOURCE_DIR}/system_demo_receiver.asc DESTINATION ${CMAKE_BINARY_DIR}../../bin)
######################################################################################################################################################################
# create instance 3001 of system demo application
######################################################################################################################################################################
# REMARK: Currently the "sdv_packager" tool takes the created component(s), creates a configuration and installation manifest and
# copies the package including manifest and configuration to the runtime installation directory (SDV_FRAMEWORK_RUNTIME
# environment variable with instance #3001). The copying into the target directory is not the wanted installation procedure and only
# a bypass feature of the packager. The proper installation would be creating a installation package with the packager, uploading
# the package to the target system and installing the package using the "sdv_control" tool. Since the creation and installation of
# packages is not available yet, the bypass solution is the only solution available at the moment.
add_custom_target(example_interface_config
ALL
DEPENDS
can_dl_example
demo_vd_isactivecounter_tx
demo_vd_steeringwheel_rx
demo_vd_vehiclechassisaxle_tx
demo_vd_vehiclespeed_rx
COMMAND "${SDV_PACKAGER}" DIRECT_INSTALL ExampleInterfaceComponents --instance3001 can_dl_example.sdv demo_vd_isactivecounter_tx.sdv demo_vd_steeringwheel_rx.sdv demo_vd_vehiclechassisaxle_tx.sdv demo_vd_vehiclespeed_rx.sdv "-I${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" --interface_config --overwrite
VERBATIM
)
add_custom_target(example_abstract_config
ALL
DEPENDS
demo_proxystub
demo_bs_isactivecounter_tx
demo_bs_steeringwheel_rx
demo_bs_vehiclechassisaxle_tx
demo_bs_vehiclespeed_rx
COMMAND "${SDV_PACKAGER}" DIRECT_INSTALL ExampleAbstractComponents --instance3001 demo_proxystub.sdv demo_bs_isactivecounter_tx.sdv demo_bs_steeringwheel_rx.sdv demo_bs_vehiclechassisaxle_tx.sdv demo_bs_vehiclespeed_rx.sdv "-I${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" --abstract_config --overwrite
VERBATIM
)
add_custom_target(example_user_config
ALL
DEPENDS
demo_complex_service
example_service_proxystub
COMMAND "${SDV_PACKAGER}" DIRECT_INSTALL DemoApplication --instance3001 demo_complex_service.sdv example_service_proxystub.sdv "-I${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" --user_config --overwrite
VERBATIM
)
######################################################################################################################################################################
# TODO: SDV_PACKAGER does not create the toml files, therefore we need to copy them
######################################################################################################################################################################
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/demo.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3001)
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/platform.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3001)
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/settings.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3001)
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/vehicle_abstract.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3001)
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/vehicle_ifc.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3001)
######################################################################################################################################################################
# system demo fmu for OpenXilEnv
######################################################################################################################################################################
# REMARK: The CMAKE created by sdv_dbc_util creates all files including the buildDescription.xml
#
# What cannot be created automatically is the method OpenAPILoad(const std::string& resources) in file model.cpp
# The method must load all required components
# Therfore here the file is copied and overwritten the auto generated file
#
# The required toml files need to be copied to the folder:
# generated/fmu_DemoExampleFMU/DemoExampleFMU/resources
message("Include: FMU DemoExampleFMU")
# Copy the config files
file (COPY ${PROJECT_SOURCE_DIR}/fmu/resources/fmu_vehicle_devices_basic_services.toml DESTINATION ${PROJECT_SOURCE_DIR}/generated/fmu_DemoExampleFMU/DemoExampleFMU/resources)
file (COPY ${PROJECT_SOURCE_DIR}/fmu/resources/fmu_complex_service.toml DESTINATION ${PROJECT_SOURCE_DIR}/generated/fmu_DemoExampleFMU/DemoExampleFMU/resources)
# Overwrite model.cpp with an identical file but loads all components in OpenAPILoad(const std::string& resources)
file (COPY ${PROJECT_SOURCE_DIR}/fmu/model.cpp DESTINATION ${PROJECT_SOURCE_DIR}/generated/fmu_DemoExampleFMU/DemoExampleFMU)
# Now the project can be build
add_subdirectory(generated/fmu_DemoExampleFMU)

View File

@@ -0,0 +1,8 @@
[Configuration]
Version = 100
[[Component]]
Path = "can_com_sim.sdv"
Class = "CAN_Com_Sim"
Source="system_demo_receiver.asc"
Target="system_demo_writer.asc"

View File

@@ -0,0 +1,6 @@
[Configuration]
Version = 100
[[Component]]
Path = "demo_complex_service.sdv"
Class = "Counter Steering Example Service"

View File

@@ -0,0 +1,8 @@
[Configuration]
Version = 100
[[Component]]
Path = "data_dispatch_service.sdv"
Class = "DataDispatchService"

View File

@@ -0,0 +1,6 @@
[Configuration]
Version = 100
[[Component]]
Path = "can_dl_example.sdv"
Class = "CAN_data_link"

View File

@@ -0,0 +1,6 @@
[Configuration]
Version = 100
[[Component]]
Path = "task_timer.sdv"
Class = "TaskTimerService"

View File

@@ -0,0 +1,37 @@
[Configuration]
Version = 100
[[Component]]
Path = "demo_vd_isactivecounter_tx.sdv"
Class = "Vehicle.Software.Application.IsActiveCounter_Device"
[[Component]]
Path = "demo_vd_steeringwheel_rx.sdv"
Class = "Vehicle.Chassis.SteeringWheel.Angle_Device"
[[Component]]
Path = "demo_vd_vehiclechassisaxle_tx.sdv"
Class = "Vehicle.Chassis.RearAxle.Row.Wheel_Device"
[[Component]]
Path = "demo_vd_vehiclespeed_rx.sdv"
Class = "Vehicle.Speed_Device"
[[Component]]
Path = "demo_bs_isactivecounter_tx.sdv"
Class = "Vehicle.Software.Application.IsActiveCounter_Service"
[[Component]]
Path = "demo_bs_steeringwheel_rx.sdv"
Class = "Vehicle.Chassis.SteeringWheel.Angle_Service"
[[Component]]
Path = "demo_bs_vehiclechassisaxle_tx.sdv"
Class = "Vehicle.Chassis.RearAxle.Row.Wheel_Service"
[[Component]]
Path = "demo_bs_vehiclespeed_rx.sdv"
Class = "Vehicle.Speed_Service"

View File

@@ -0,0 +1,11 @@
[Configuration]
Version = 100
[[Component]]
Path = "demo_complex_service.sdv"
Class = "Counter Steering Example Service"
Name = "Counter Steering Example Service"
[[Module]]
Path = "example_service_proxystub.sdv"

View File

@@ -0,0 +1,9 @@
[Configuration]
Version = 100
[[Component]]
Path = "can_com_sim.sdv"
Class = "CAN_Com_Sim"
Source="system_demo_receiver.asc"
Target="system_demo_writer.asc"

View File

@@ -0,0 +1,28 @@
# Settings file
[Settings]
Version = 100
# The system config array can contain zero or more configurations that are loaded at the time
# the system ist started. It is advisable to split the configurations in:
# platform config - containing all the components needed to interact with the OS,
# middleware, vehicle bus, Ethernet.
# vehicle interface - containing the vehicle bus interpretation components like data link
# based on DBC and devices for their abstraction.
# vehicle abstraction - containing the basic services
# Load the system configurations by providing the "SystemConfig" keyword as an array of strings.
# A relative path is relative to the installation directory (being "exe_location/instance_id").
#
# Example:
# SystemConfig = [ "platform.toml", "vehicle_ifc.toml", "vehicle_abstract.toml" ]
#
SystemConfig = [ "platform.toml", "vehicle_ifc.toml", "vehicle_abstract.toml" ]
# The application config contains the configuration file that can be updated when services and
# apps are being added to the system (or being removed from the system). Load the application
# config by providing the "AppConfig" keyword as a string value. A relative path is relative to
# the installation directory (being "exe_location/instance_id").
#
# Example
# AppConfig = "app_config.toml"
#
AppConfig = "Demo.toml"

View File

@@ -0,0 +1,26 @@
[Configuration]
Version = 100
[[Component]]
Path = "demo_bs_isactivecounter_tx.sdv"
Class = "Vehicle.Software.Application.IsActiveCounter_Service"
Name = "Vehicle.Software.Application.IsActiveCounter_Service"
[[Component]]
Path = "demo_bs_steeringwheel_rx.sdv"
Class = "Vehicle.Chassis.SteeringWheel.Angle_Service"
Name = "Vehicle.Chassis.SteeringWheel.Angle_Service"
[[Component]]
Path = "demo_bs_vehiclechassisaxle_tx.sdv"
Class = "Vehicle.Chassis.RearAxle.Row.Wheel_Service"
Name = "Vehicle.Chassis.RearAxle.Row.Wheel_Service"
[[Component]]
Path = "demo_bs_vehiclespeed_rx.sdv"
Class = "Vehicle.Speed_Service"
Name = "Vehicle.Speed_Service"
[[Module]]
Path = "demo_proxystub.sdv"

View File

@@ -0,0 +1,28 @@
[Configuration]
Version = 100
[[Component]]
Path = "can_dl_example.sdv"
Class = "CAN_data_link"
Name = "DataLink"
[[Component]]
Path = "demo_vd_isactivecounter_tx.sdv"
Class = "Vehicle.Software.Application.IsActiveCounter_Device"
Name = "Vehicle.Software.Application.IsActiveCounter_Device"
[[Component]]
Path = "demo_vd_steeringwheel_rx.sdv"
Class = "Vehicle.Chassis.SteeringWheel.Angle_Device"
Name = "Vehicle.Chassis.SteeringWheel.Angle_Device"
[[Component]]
Path = "demo_vd_vehiclechassisaxle_tx.sdv"
Class = "Vehicle.Chassis.RearAxle.Row.Wheel_Device"
Name = "Vehicle.Chassis.RearAxle.Row.Wheel_Device"
[[Component]]
Path = "demo_vd_vehiclespeed_rx.sdv"
Class = "Vehicle.Speed_Device"
Name = "Vehicle.Speed_Device"

View File

@@ -0,0 +1,127 @@
VERSION "PrivateCAN"
NS_ :
NS_DESC_
CM_
BA_DEF_
BA_
VAL_
CAT_DEF_
CAT_
FILTER
BA_DEF_DEF_
EV_DATA_
ENVVAR_DATA_
SGTYPE_
SGTYPE_VAL_
BA_DEF_SGTYPE_
BA_SGTYPE_
SIG_TYPE_REF_
VAL_TABLE_
SIG_GROUP_
SIG_VALTYPE_
SIGTYPE_VALTYPE_
BO_TX_BU_
BA_DEF_REL_
BA_REL_
BA_DEF_DEF_REL_
BU_SG_REL_
BU_EV_REL_
BU_BO_REL_
SG_MUL_VAL_
BS_:
BU_: demo
VAL_TABLE_ Fault_Codes 27 "UKWN" 26 "VEHSPDMAX_EXDD" 25 "STS_ALIVE" 24 "STEER_NOT_E2E_MODE" 23 "OTA_SPD" 22 "OTA_TIMER_DOWNLOAD_FAILED" 21 "OTA_MAX_TIME" 20 "CUBIXAD_STEERSTREQ_NOTACTV" 19 "CUBIXAD_DRVSTREQ_NOTACTV" 18 "SFTYDRV_INTV" 17 "LSDC_ALIVE" 16 "CUBIXAD_ALIVE" 15 "IBC_MAB_NO_PRIO" 14 "IBC_NOT_RDY" 13 "IBC_ALIVE" 12 "LSDC_GEAR" 11 "LSDC_SPD" 10 "LSDC_ACCL" 9 "IBC_NOT_MAB_MOD" 8 "GOLDBOX_ALIVE" 7 "CUBIXAD_GEAR" 6 "CUBIXAD_SPD_TESTTRACK" 5 "DRVREQCHG" 4 "RDY_TIMER" 3 "SFTY_CDN_FAILED" 2 "ACTVNCHK_SPD" 1 "ACTVNCHK_TIMR" 0 "NONE" ;
VAL_TABLE_ TestMapID 6 "E_TESTMAPID_UNDEFINED" 5 "E_TESTMAPID_TEST_DRIVE" 4 "E_TESTMAPID_AD_AREA" 3 "E_TESTMAPID_STUTT_ARENA" 2 "E_TESTMAPID_ZF_LASTMILE" 1 "E_TESTMAPID_ZF_TESTTRACK_2" 0 "E_TESTMAPID_NONE" ;
VAL_TABLE_ CtrlReqStates 7 "CtrlSts3b_RESERVED_4" 6 "CtrlSts3b_RESERVED_3" 5 "CtrlSts3b_RESERVED_2" 4 "CtrlSts3b_RESERVED_1" 3 "CtrlSts3b_ERROR" 2 "CtrlSts3b_CONTROL_REQUESTED" 1 "CtrlSts3b_CONTROL_NOT_REQUESTED" 0 "CtrlSts3b_INIT" ;
VAL_TABLE_ SteerActrReSts 7 "Diag" 6 "Inactive" 5 "Ramping" 4 "Yellow" 3 "Red" 2 "Normal" 1 "Pending" 0 "Initialisation" ;
VAL_TABLE_ SwtPark1 1 "SwtParkActv" 0 "SwtParkNotActv" ;
VAL_TABLE_ PE_State 2 "ERROR" 1 "INIT" 0 "NO_ERROR" ;
VAL_TABLE_ SSM_Req 7 "HMS_TAKEOVER" 6 "RESERVED" 5 "RELESE_VIA_RAMP" 4 "DRIVEOFF" 3 "HOLD_STANDBY" 2 "PARK" 1 "HOLD" 0 "NO_REQUEST" ;
VAL_TABLE_ IBC_StandStillMode 12 "SSM_ERROR" 11 "SSM_INIT" 10 "SSM_DRIVEOFF_STANDBY_ACTIVE" 9 "SSM_HOLD_STANDBY_ACTIVE" 8 "SSM_HILL_SLIPPOFF_DETECTED" 7 "SSM_RELEASE_REQ_FROM_DRIVER" 6 "SSM_RELEASE_REQ_ACTIVE" 5 "SSM_DRIVEOFF_ACTIVE" 4 "SSM_PARK_RETAINED_ACTIVE" 3 "SSM_PARK_ACTIVE" 2 "SSM_PARK_REQUESTED" 1 "SSM_HOLD_ACTIVE" 0 "SSM_NO_ACTIVE_FUNCTION" ;
VAL_TABLE_ AppTgtStDrv 3 "ACTIVE" 2 "READY" 1 "RESERVED" 0 "NOT_ACTIVE" ;
VAL_TABLE_ IBC_Status 4 "IBC_MAB_ERR_COMM" 3 "IBC_MAB_NO_PRIO" 2 "IBC_IN_MAB_MODE" 1 "IBC_READY" 0 "IBC_NOT_READY_FAILED" ;
VAL_TABLE_ GearLvrIndcn 7 "GearLvrIndcn2_Undefd" 6 "GearLvrIndcn2_Resd2" 5 "GearLvrIndcn2_Resd1" 4 "GearLvrIndcn2_ManModeIndcn" 3 "GearLvrIndcn2_DrvIndcn" 2 "GearLvrIndcn2_NeutIndcn" 1 "GearLvrIndcn2_RvsIndcn" 0 "GearLvrIndcn2_ParkIndcn" ;
VAL_TABLE_ LvlgAdjReq 7 "LvlgAdjReq_Resd2" 6 "LvlgAdjReq_Resd1" 5 "LvlgAdjReq_Ll2" 4 "LvlgAdjReq_Ll1" 3 "LvlgAdjReq_Nrh" 2 "LvlgAdjReq_Hl1" 1 "LvlgAdjReq_Hl2" 0 "LvlgAdjReq_Ukwn" ;
VAL_TABLE_ DrvModReq 15 "Err" 14 "Rock" 13 "Mud" 12 "Sand" 11 "Snow" 10 "Power" 9 "Hybrid" 8 "Pure_EV" 7 "Race" 6 "Adaptive" 5 "Offroad_CrossTerrain" 4 "Individual" 3 "Dynamic_Sport" 2 "Comfort_Normal" 1 "ECO" 0 "Undefd" ;
VAL_TABLE_ MAB_Info_Message 4 "DRV_GEARLVR_TO_P" 3 "DRV_P_TO_D" 2 "LSDC_DI_NOT_PSBL" 1 "LSDC_ENA_NOT_POSSIBLE" 0 "NONE" ;
VAL_TABLE_ MAB_OvrdTool_Sts 11 "HACKATHON" 10 "OTA" 9 "INIT" 8 "FINSHD" 7 "FLT" 6 "CUBIX_AD" 5 "SAVE_THE_SPOILER" 4 "LSDC" 3 "RDY" 2 "ACTVN_CHK" 1 "NO_MANIPULATION" 0 "NONE" ;
VAL_TABLE_ HMI_Drvr_Req 9 "FCT_DEACTVN_REQ" 8 "FCT_ACTVN_OTA_CFMD" 7 "FCT_ACTVN_OTA_REQ" 6 "FCT_ACTVN_SAVETHESPOILER_CFMD" 5 "FCT_ACTVN_SAVETHESPOILER_REQ" 4 "FCT_ACTVN_LSDC_CFMD" 3 "FCT_ACTVN_LSDC_REQ" 2 "FCT_ACTVN_CUBIXAD_CFMD" 1 "FCT_ACTVN_CUBIXAD_REQ" 0 "FCT_ACTVN_NONE" ;
VAL_TABLE_ Info_Message 4 "DRV_GEARLVR_TO_P" 3 "DRV_P_TO_D" 2 "LSDC_DI_NOT_PSBL" 1 "LSDC_ENA_NOT_POSSIBLE" 0 "NONE" ;
VAL_TABLE_ HMI_Fct_Req 8 "FCT_DEACTVN_REQ" 7 "FCT_ACTVN_OTA_REQ" 6 "FCT_ACTVN_SAVETHESPOILER_CFMD" 5 "FCT_ACTVN_SAVETHESPOILER_REQ" 4 "FCT_ACTVN_LSDC_CFMD" 3 "FCT_ACTVN_LSDC_REQ" 2 "FCT_ACTVN_AI4MTN_CFMD" 1 "FCT_ACTVN_AI4MTN_REQ" 0 "FCT_ACTVN_NONE" ;
VAL_TABLE_ SOVD_states 2 "SOVD_SHOWCASE_ACTIVE" 1 "SOVD_SHOWCASE_DEACTIVE" 0 "SOVD_NONE" ;
VAL_TABLE_ OTA_states 7 "OTA_DOWNLOAD_FAILED" 6 "OTA_INSTALL_FAILED" 5 "OTA_INSTALL_FINISHED" 4 "OTA_INSTALL_START" 3 "OTA_DOWNLOAD_START" 2 "OTA_SCHEDULED" 1 "OTA_STANDBY" 0 "OTA_NONE" ;
BO_ 0 CAN_Input: 8 Vector__XXX
SG_ Speed : 55|15@0+ (0.00391,0) [0|128.11897] "m/s" demo
SG_ SteeringWheel : 39|15@0- (0.0009765625,0) [-16|15.9990234375] "rad" demo
BO_ 3 CAN_Output: 2 demo
SG_ RearAngle : 7|10@0- (0.01,0) [-5.12|5.11] "deg" Vector__XXX
SG_ IsActiveCounter : 13|4@0+ (1,0) [0|15] "" Vector__XXX
CM_ SG_ 0 Speed "Vehicle speed longitudinal based on wheel speed sensors and longitudinal acceleration.";
CM_ SG_ 0 SteeringWheel "Actual steering wheel angle from the actual centre position of the steering wheel. ";
CM_ SG_ 3 RearAngle "Rear Steering angle request";
CM_ SG_ 3 IsActiveCounter "Simple counter runs up and start again with 0";
BA_DEF_ "Baudrate" INT 1000 1000000;
BA_DEF_ "BusType" STRING ;
BA_DEF_ "DBName" STRING ;
BA_DEF_ "ProtocolType" STRING ;
BA_DEF_ BU_ "NmAsrNode" ENUM "No","Yes";
BA_DEF_ BU_ "NmAsrNodeIdentifier" INT 0 255;
BA_DEF_ BO_ "GenMsgCycleTime" INT 0 65536;
BA_DEF_ BO_ "GenMsgCycleTimeFast" FLOAT 0 300000;
BA_DEF_ BO_ "GenMsgDelayTime" INT 0 65536;
BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100000;
BA_DEF_ BO_ "GenMsgSendType" ENUM "cyclic","spontaneous","not-used","not-used","not-used","cyclicAndSpontaneous","not-used","cyclicIfActive","NoMsgSendType";
BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 65536;
BA_DEF_ SG_ "GenSigSendType" ENUM "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType";
BA_DEF_ SG_ "GenSigStartValue" HEX 0 80000000;
BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes";
BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes";
BA_DEF_ "NmAsrBaseAddress" HEX 0 536870911;
BA_DEF_ "NmAsrMessageCount" INT 0 255;
BA_DEF_ BU_ "NodeLayerModules" STRING ;
BA_DEF_ BU_ "ILused" ENUM "No","Yes";
BA_DEF_ SG_ "GenSigFuncType" ENUM "NoFunction","n/a","n/a","n/a","n/a","n/a","n/a","n/a","n/a","n/a","n/a","n/a","n/a","n/a","n/a","CHK","CNTR","n/a","n/a","n/a","CNTR_AR_01","CRC_AR_01_BOTH","CRC_AR_01_ALT","CRC_AR_01_LOW","CRC_AR_01_NIBBLE","CNTR_AR_04","CRC_AR_04A","CNTR_AR_05","CRC_AR_05";
BA_DEF_ SG_ "GenSigDataID" STRING ;
BA_DEF_ SG_ "SigGroup" STRING ;
BA_DEF_DEF_ "Baudrate" 1000;
BA_DEF_DEF_ "BusType" "";
BA_DEF_DEF_ "DBName" "";
BA_DEF_DEF_ "ProtocolType" "";
BA_DEF_DEF_ "NmAsrNode" "No";
BA_DEF_DEF_ "NmAsrNodeIdentifier" 0;
BA_DEF_DEF_ "GenMsgCycleTime" 0;
BA_DEF_DEF_ "GenMsgCycleTimeFast" 0;
BA_DEF_DEF_ "GenMsgDelayTime" 0;
BA_DEF_DEF_ "GenMsgNrOfRepetition" 0;
BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType";
BA_DEF_DEF_ "GenMsgStartDelayTime" 0;
BA_DEF_DEF_ "GenSigSendType" "NoSigSendType";
BA_DEF_DEF_ "GenSigStartValue" 0;
BA_DEF_DEF_ "GenMsgILSupport" "Yes";
BA_DEF_DEF_ "NmAsrMessage" "No";
BA_DEF_DEF_ "NmAsrBaseAddress" 1280;
BA_DEF_DEF_ "NmAsrMessageCount" 64;
BA_DEF_DEF_ "NodeLayerModules" "CANoeILNLSPA.dll";
BA_DEF_DEF_ "ILused" "Yes";
BA_DEF_DEF_ "GenSigFuncType" "NoFunction";
BA_DEF_DEF_ "GenSigDataID" "";
BA_DEF_DEF_ "SigGroup" "";
BA_ "Baudrate" 500000;
BA_ "BusType" "CAN";
BA_ "ProtocolType" "CAN";
BA_ "DBName" "PrivateCAN";
BA_ "GenMsgCycleTime" BO_ 0 10;
BA_ "GenMsgSendType" BO_ 0 0;
BA_ "GenMsgCycleTime" BO_ 3 10;
BA_ "GenMsgSendType" BO_ 3 0;

View File

@@ -0,0 +1,334 @@
#include "console.h"
#ifdef _WIN32
#include <conio.h> // Needed for _kbhit
#else
#include <fcntl.h>
#endif
#include "vss_vehiclechassisrearaxlerowwheel_bs_tx.h"
#include "vss_vehiclechassissteeringwheelangle_bs_rx.h"
#include "vss_vehiclesoftwareapplicationisactivecounter_bs_tx.h"
#include "vss_vehiclespeed_bs_rx.h"
/**
* @brief Key hit check. Windows uses the _kbhit function; POSIX emulates this.
* @return Returns whether a key has been pressed.
*/
inline bool KeyHit()
{
#ifdef _WIN32
return _kbhit();
#elif __unix__
int ch = getchar();
if (ch != EOF) {
ungetc(ch, stdin);
return true;
}
return false;
#endif
}
/**
* @brief Get the character from the keyboard buffer if pressed.
* @return Returns the character from the keyboard buffer.
*/
char GetChar()
{
#ifdef _WIN32
return static_cast<char>(_getch());
#else
return getchar();
#endif
}
const CConsole::SConsolePos g_sTitle{ 1, 1 };
const CConsole::SConsolePos g_sSeparator1{ 2, 1 };
const CConsole::SConsolePos g_sDLDescription{ 4, 1 };
const CConsole::SConsolePos g_sDLSteeringWheel{ 6, 3 };
const CConsole::SConsolePos g_sDLVehicleSpeed{ 7, 3 };
const CConsole::SConsolePos g_sDLRearAxle{ 6, 41 };
const CConsole::SConsolePos g_sDLAliveCounter{ 7, 41 };
const CConsole::SConsolePos g_sSeparator2{ 9, 1 };
const CConsole::SConsolePos g_sBSDescription{ 11, 1 };
const CConsole::SConsolePos g_sBSSteeringWheel{ 13, 3 };
const CConsole::SConsolePos g_sBSVehicleSpeed{ 14, 3 };
const CConsole::SConsolePos g_sSeparator3{ 16, 1 };
const CConsole::SConsolePos g_sCSDescription{ 18, 1 };
const CConsole::SConsolePos g_sCSActivated{ 20, 3 };
const CConsole::SConsolePos g_sCSActive{ 21, 3 };
const CConsole::SConsolePos g_sCSRearAxle{ 20, 41 };
const CConsole::SConsolePos g_sSeparator4{ 23, 1 };
const CConsole::SConsolePos g_sControlDescription{ 25, 1 };
const CConsole::SConsolePos g_sCursor{ 26, 1 };
CConsole::CConsole(bool bMonitorDatalink) : m_bMonitorDatalink(bMonitorDatalink)
{
#ifdef _WIN32
// Enable ANSI escape codes
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdOut != INVALID_HANDLE_VALUE && GetConsoleMode(hStdOut, &m_dwConsoleOutMode))
SetConsoleMode(hStdOut, m_dwConsoleOutMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
if (hStdIn != INVALID_HANDLE_VALUE && GetConsoleMode(hStdIn, &m_dwConsoleInMode))
SetConsoleMode(hStdIn, m_dwConsoleInMode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT));
#elif defined __unix__
// Disable echo
tcgetattr(STDIN_FILENO, &m_sTermAttr);
struct termios sTermAttrTemp = m_sTermAttr;
sTermAttrTemp.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &sTermAttrTemp);
m_iFileStatus = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, m_iFileStatus | O_NONBLOCK);
#else
#error The OS is not supported!
#endif
}
CConsole::~CConsole()
{
SetCursorPos(g_sCursor);
#ifdef _WIN32
// Return to the stored console mode
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdOut != INVALID_HANDLE_VALUE)
SetConsoleMode(hStdOut, m_dwConsoleOutMode);
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
if (hStdIn != INVALID_HANDLE_VALUE)
SetConsoleMode(hStdIn, m_dwConsoleInMode);
#elif defined __unix__
// Return the previous file status flags.
fcntl(STDIN_FILENO, F_SETFL, m_iFileStatus);
// Return to previous terminal state
tcsetattr(STDIN_FILENO, TCSANOW, &m_sTermAttr);
#endif
}
void CConsole::PrintHeader(const bool bServer, const bool bSimulate)
{
// Clear the screen...
std::cout << "\x1b[2J";
// Create titles
std::string title = "System demo example";
std::string dataLinkTitle = "Data link signal values:";
if (bServer)
title.append(" - Connected to running server");
else
{
if (bSimulate)
{
title.append(" - run as standalone application, simulation mode");
dataLinkTitle = "Dispatch service signal values:";
}
else
{
title.append(" - run as standalone application including data link");
}
}
// Print the titles
PrintText(g_sTitle, title);
PrintText(g_sSeparator1, "============================================================================");
PrintText(g_sDLDescription, dataLinkTitle.c_str());
PrintText(g_sSeparator2, "----------------------------------------------------------------------------");
PrintText(g_sBSDescription, "Basic services event values:");
PrintText(g_sSeparator3, "----------------------------------------------------------------------------");
PrintText(g_sCSDescription, "Counter steering example service values:");
PrintText(g_sSeparator4, "============================================================================");
PrintText(g_sControlDescription, "Press 'X' to quit; 'T' to toggle the service activity...");
}
bool CConsole::PrepareDataConsumers()
{
//////////////////////////////////////
// DATA LINK
// Request the data link signals from the dispatch service. This only works for standalone applications, since the data dispatch
// service needs to be accessible from within the same process (no IPC marshalling is provided). For server based applications,
// the data link layer is inacessible by any application (and complex service), hence data cannot be received if connected to a
// server. The m_bMonitorDataLink flag determines whether data from the data link should can be received or not.
// NOTE: registering signals and timer for data link data can only occur during configuration time. During the execution, no new
// signals can be registered.
if (m_bMonitorDatalink)
{
sdv::core::CDispatchService dispatch;
m_signalRearAxleAngle = dispatch.RegisterTxSignal(demo::dsAxleAngle, 0);
m_signalCounter = dispatch.RegisterTxSignal(demo::dsLiveCounter, 0);
m_signalSteeringWheel = dispatch.Subscribe(demo::dsWheelAngle, [&](sdv::any_t value) { DataLinkCallbackSteeringWheelAngle(value); });
m_signalSpeed = dispatch.Subscribe(demo::dsVehicleSpeed, [&](sdv::any_t value) { DataLinkCallbackVehicleSpeed(value); });
if (!m_signalRearAxleAngle || !m_signalCounter || !m_signalSteeringWheel || !m_signalSpeed)
{
std::cerr << "Console ERROR: TX register and RX subscription failed" << std::endl;
return false;
}
}
//////////////////////////////////////
// BASIC SERVICES
// Request the basic service for the steering wheel.
auto pSteeringWheelSvc = sdv::core::GetObject("Vehicle.Chassis.SteeringWheel.Angle_Service").GetInterface<vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_GetSteeringWheel>();
if (!pSteeringWheelSvc)
{
std::cerr << "Console ERROR: Could not get basic service interface 'IVSS_SetSteeringAngle'" << std::endl;
return false;
}
// Request the basic service for the vehicle speed.
auto pVehSpeedSvc = sdv::core::GetObject("Vehicle.Speed_Service").GetInterface<vss::Vehicle::SpeedService::IVSS_GetSpeed>();
if (!pVehSpeedSvc)
{
std::cerr << "Console ERROR: Could not get basic service interface 'IVSS_SetSpeed'" << std::endl;
return false;
}
// Register steering wheel change event handler.
pSteeringWheelSvc->RegisterOnSignalChangeOfWheelAngle(static_cast<vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_SetSteeringWheel_Event*> (this));
// Register vehicle speed change event handler.
pVehSpeedSvc->RegisterOnSignalChangeOfVehicleSpeed(static_cast<vss::Vehicle::SpeedService::IVSS_SetSpeed_Event*> (this));
//////////////////////////////////////
// COMPLEX SERVICE
m_pCounterSteeringSvc = sdv::core::GetObject("Counter Steering Example Service").GetInterface<ICounterSteeringService>();
if (!m_pCounterSteeringSvc)
{
std::cerr << "Console ERROR: Could not get complex service interface 'ICounterSteeringService'" << std::endl;
return false;
}
return true;
}
void CConsole::RunUntilBreak()
{
// Run until break
bool bRunning = true;
while (bRunning)
{
// Update and display the data from data link, basic services and complex service.
UpdateData();
// Check for a key
if (!KeyHit())
{
std::this_thread::sleep_for(std::chrono::milliseconds(100));
continue;
}
// Get a keyboard value (if there is any).
char c = GetChar();
switch (c)
{
case 't':
case 'T':
if (m_pCounterSteeringSvc) m_pCounterSteeringSvc->ActivateService(!m_pCounterSteeringSvc->IsActivated());
break;
case 'x':
case 'X':
bRunning = false;
break;
default:
break;
}
}
// Set the cursor position at the end
SetCursorPos(g_sCursor);
// Unregister the data link signalss
if (m_signalSteeringWheel) m_signalSteeringWheel.Reset();
if (m_signalSpeed) m_signalSpeed.Reset();
if (m_signalRearAxleAngle) m_signalRearAxleAngle.Reset();
if (m_signalCounter) m_signalCounter.Reset();
}
void CConsole::DataLinkCallbackSteeringWheelAngle(sdv::any_t value)
{
m_fDLSteeringWheelAngle = value.get<float>();
}
void CConsole::DataLinkCallbackVehicleSpeed(sdv::any_t value)
{
m_fDLVehicleSpeed = value.get<float>();
}
void CConsole::UpdateData()
{
// Print data link data
if (m_bMonitorDatalink)
{
PrintValue(g_sDLSteeringWheel, "Steering Angle RX", m_fDLSteeringWheelAngle, "rad");
PrintValue(g_sDLVehicleSpeed, "Vehicle Speed RX", m_fDLVehicleSpeed, "m/s");
PrintValue(g_sDLRearAxle, "Rear axle angle TX", m_signalRearAxleAngle.Read().get<float>(), "deg");
PrintValue(g_sDLAliveCounter, "Alive counter TX", m_signalCounter.Read().get<float>(), "");
}
else
PrintText(g_sDLSteeringWheel, "Data link signals are unavailable!");
// Print basic service event values
PrintValue(g_sBSSteeringWheel, "Steering Angle", m_fSteeringWheelAngle * 57.296f , "deg");
PrintValue(g_sBSVehicleSpeed, "Vehicle Speed RX", m_fVehicleSpeed * 3.6f , "km/h");
// Get complex service information
if (m_pCounterSteeringSvc)
{
PrintValue(g_sCSActivated, "Service activated", m_pCounterSteeringSvc->IsActivated(), "");
PrintValue(g_sCSActive, "Counter steering active", m_pCounterSteeringSvc->CounterSteeringActive(), "");
PrintValue(g_sCSRearAxle, "Rear axle angle", m_pCounterSteeringSvc->RearAxleAngle(), "deg");
}
}
void CConsole::SetSteeringWheel(float value)
{
m_fSteeringWheelAngle = value;
}
void CConsole::SetSpeed(float value)
{
m_fVehicleSpeed = value;
}
CConsole::SConsolePos CConsole::GetCursorPos() const
{
SConsolePos sPos{};
std::cout << "\033[6n";
char buff[128];
int indx = 0;
for(;;) {
int cc = std::cin.get();
buff[indx] = (char)cc;
indx++;
if(cc == 'R') {
buff[indx + 1] = '\0';
break;
}
}
int iRow = 0, iCol = 0;
sscanf(buff, "\x1b[%d;%dR", &iRow, &iCol);
sPos.uiRow = static_cast<uint32_t>(iRow);
sPos.uiCol = static_cast<uint32_t>(iCol);
fseek(stdin, 0, SEEK_END);
return sPos;
}
void CConsole::SetCursorPos(SConsolePos sPos)
{
std::cout << "\033[" << sPos.uiRow << ";" << sPos.uiCol << "H";
}
void CConsole::PrintText(SConsolePos sPos, const std::string& rssText)
{
std::lock_guard<std::mutex> lock(m_mtxPrintToConsole);
SetCursorPos(sPos);
std::cout << rssText;
}

View File

@@ -0,0 +1,202 @@
#ifndef CONSOLE_OUTPUT_H
#define CONSOLE_OUTPUT_H
#include <iostream>
#include <string>
#include <functional>
#include <support/signal_support.h>
#include <support/app_control.h>
#include <support/component_impl.h>
#include <support/timer.h>
#include "signal_names.h"
#ifdef __unix__
#include <termios.h> // Needed for tcgetattr and fcntl
#include <unistd.h>
#endif
// VSS interfaces - located in ../generated/vss_files/include
#include "vss_vehiclechassisrearaxlerowwheel_bs_tx.h"
#include "vss_vehiclechassissteeringwheelangle_bs_rx.h"
#include "vss_vehiclesoftwareapplicationisactivecounter_bs_tx.h"
#include "vss_vehiclespeed_bs_rx.h"
// Complex service counter steering interface - located in ../generated/example_service
#include "countersteering.h"
/**
* @brief Console operation class.
* @details This class retrieves data from the data link, basix services and complex service and presents it in a regular interval.
* Furthermore, it runs in a loop and allows interaction with the complex service.
*/
class CConsole :
public vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_SetSteeringWheel_Event, // Basic service interface
public vss::Vehicle::SpeedService::IVSS_SetSpeed_Event // Basic service interface
{
public:
/**
* @brief Screen position structure
*/
struct SConsolePos
{
uint32_t uiRow; ///< Row position (starts at 1)
uint32_t uiCol; ///< Column position (starts at 1)
};
/**
* @brief Constructor
* @attention Monitoring the data link can only occur when running as standalone. When connecting to a server, the datalink is
* not accessible from the application due to safety and security reasons.
* @param[in] bMonitorDatalink When set, register the signals to monitor the datalink.
*/
CConsole(bool bMonitorDatalink);
/**
* @brief Destructor
*/
~CConsole();
/**
* @brief Print the header.
* @param[in] bServer if true onnected to a running server, otherwise the application is running standalone
* @param[in] bSimulate if true signals are simulated, otherwise the signal came from data link
*/
void PrintHeader(const bool bServer, const bool bSimulate);
/**
* @brief Prepare the data consumers..
* @details Normally the application communicates through the complex services. As an example of how it could work, three levels
* of data consumers are prepared (as an example of how this could work): data link (if the monitor-data-link flag is set),
* basic service and complex service.
* @return Returns whether the preparation of the data consumers was successful or not.
*/
bool PrepareDataConsumers();
/**
* @brief Block this thread until CTRL+C is pressed.
*/
void RunUntilBreak();
private:
/**
* @brief Callback function when steering wheel signal has changed in disptach service.
* @remarks Only called when m_bMonitorDatalink is enabled (when running as standalone).
* @param[in] value The value of the signal to update.
*/
void DataLinkCallbackSteeringWheelAngle(sdv::any_t value);
/**
* @brief Callback function when speed signal has changed in disptach service.
* @remarks Only called when m_bMonitorDatalink is enabled (when running as standalone).
* @param[in] value The value of the signal to update.
*/
void DataLinkCallbackVehicleSpeed(sdv::any_t value);
/**
* @brief Read the data link TX signals, the basic service event values and the complex service values and print them into the
* console.
* @remarks Data link data is only shown when m_bMonitorDatalink is enabled (when running as standalone).
*/
void UpdateData();
/**
* @brief Set steering angle event. Overload of
* vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_SetSteeringWheel_Event::SetSteeringWheel.
* @remarks This is an event function of the steering wheel basic service.
* @param[in] value Steering wheel angle in radials (-16...16 rad)
*/
virtual void SetSteeringWheel(float value) override;
/**
* @brief Speed event. Overload of vss::Vehicle::SpeedService::IVSS_SetSpeed_Event::SetSpeed.
* @remarks This is an event function of the vehicle speed service.
* @param[in] value Vehicle speed in m/s (0... 128 m/s)
*/
virtual void SetSpeed(float value) override;
/**
* @brief Get the cursor position of the console.
* @return The cursor position.
*/
SConsolePos GetCursorPos() const;
/**
* @brief Set the current cursor position for the console.
* @param[in] sPos Console position to place the current cursor at.
*/
void SetCursorPos(SConsolePos sPos);
/**
* @brief Print text at a specific location.
* @param[in] sPos The location to print text at.
* @param[in] rssText Reference to the text to print.
*/
void PrintText(SConsolePos sPos, const std::string& rssText);
/**
* @brief Print a value string at a specific location.
* @tparam TValue Type of value.
* @param[in] sPos The location to print the value at.
* @param[in] rssName Reference to the value.
* @param[in] tValue The value.
* @param[in] rssUnits Units the value is in.
*/
template <typename TValue>
void PrintValue(SConsolePos sPos, const std::string& rssName, TValue tValue, const std::string& rssUnits);
/**
* @brief Align string between name and value.
* @param[in] message Reference to the message to align.
* @param[in] desiredLength The desired length or 0 when no length is specified.
* @return The aligned string.
*/
std::string AlignString(const std::string& message, uint32_t desiredLength = 0);
mutable std::mutex m_mtxPrintToConsole; ///< Mutex to print complete message
bool m_bMonitorDatalink = false; ///< When set, the console output monitors datalink data.
sdv::core::CSignal m_signalSteeringWheel; ///< steering wheel angle (input) - datalink monitoring
sdv::core::CSignal m_signalSpeed; ///< speed (input) - datalink monitoring
sdv::core::CSignal m_signalRearAxleAngle; ///< rear angle (output) - datalink monitoring
sdv::core::CSignal m_signalCounter; ///< simple counter (output) - datalink monitoring
float m_fDLSteeringWheelAngle = 0.0f; ///< default value (input signal) - datalink monitoring
float m_fDLVehicleSpeed = 0.0f; ///< default value (input signal) - datalink monitoring
float m_fSteeringWheelAngle = 0.0f; ///< Steering wheel angle - basic service event value
float m_fVehicleSpeed = 0.0f; ///< Vehicle speed - basic service event value
ICounterSteeringService* m_pCounterSteeringSvc = nullptr; ///< Counter steering service interface pointer.
#ifdef _WIN32
DWORD m_dwConsoleOutMode = 0u; ///< The console mode before switching on ANSI support.
DWORD m_dwConsoleInMode = 0u; ///< The console mode before switching on ANSI support.
#elif defined __unix__
struct termios m_sTermAttr{}; ///< The terminal attributes before disabling echo.
int m_iFileStatus = 0; ///< The file status flags for STDIN.
#else
#error The OS is not supported!
#endif
};
template <typename TValue>
inline void CConsole::PrintValue(SConsolePos sPos, const std::string& rssName, TValue tValue, const std::string& rssUnits)
{
const size_t nValueNameLen = 26;
std::stringstream sstreamValueText;
sstreamValueText << rssName <<
std::string(nValueNameLen - std::min(rssName.size(), static_cast<size_t>(nValueNameLen - 1)) - 1, '.') <<
" " << std::fixed << std::setprecision(2) << tValue << " " << rssUnits << " ";
std::lock_guard<std::mutex> lock(m_mtxPrintToConsole);
SetCursorPos(sPos);
std::cout << sstreamValueText.str();
}
template <>
inline void CConsole::PrintValue<bool>(SConsolePos sPos, const std::string& rssName, bool bValue, const std::string& rssUnits)
{
PrintValue(sPos, rssName, bValue ? "yes" : "no", rssUnits);
}
#endif // !define CONSOLE_OUTPUT_H

View File

@@ -0,0 +1,222 @@
#include "control.h"
CExampleControl::~CExampleControl()
{
Shutdown();
}
bool CExampleControl::Initialize()
{
if (m_bInitialized) return true;
// Set the SDV V-API framework directory.
if (!m_pathFramework.empty())
m_appcontrol.SetFrameworkRuntimeDirectory(m_pathFramework);
// Start the framework
std::stringstream sstreamAppConfig;
sstreamAppConfig << "[Application]" << std::endl;
sstreamAppConfig << "Mode=\"" << (RunAsStandaloneApp() ? "Standalone" : "External") << "\"" << std::endl;
sstreamAppConfig << "Instance=" << m_uiInstance << std::endl;
sstreamAppConfig << "Retries=" << 6 << std::endl;
sstreamAppConfig << "[Console]" << std::endl;
sstreamAppConfig << "Report=";
switch (m_eReporting)
{
case EAppControlReporting::normal:
sstreamAppConfig << "\"Normal\"";
break;
case EAppControlReporting::verbose:
sstreamAppConfig << "\"Verbose\"";
break;
default:
sstreamAppConfig << "\"Silent\"";
break;
}
sstreamAppConfig << std::endl;
if (!m_appcontrol.Startup(sstreamAppConfig.str())) return false;
// Local configurations only when running as standalone.
if (RunAsStandaloneApp())
{
// Start in configuration mode.
m_appcontrol.SetConfigMode();
if (!m_appcontrol.AddConfigSearchDir("config"))
{
m_appcontrol.Shutdown();
return false;
}
}
m_bInitialized = true;
return true;
}
void CExampleControl::Shutdown()
{
if (!m_bInitialized)
m_appcontrol.Shutdown();
m_bInitialized = false;
}
bool CExampleControl::IsInitialized() const
{
return m_bInitialized;
}
bool CExampleControl::LoadConfigFile(const std::string& inputMsg, const std::string& configFileName)
{
if (!m_bInitialized && m_eRunAs == ERunAs::standalone) return false;
std::string msg = inputMsg;
if (m_appcontrol.LoadConfig(configFileName) == sdv::core::EConfigProcessResult::successful)
{
msg.append("ok\n");
std::cout << msg.c_str();
return true;
}
msg.append("FAILED.\n");
std::cout << msg.c_str();
return false;
}
void CExampleControl::StartTestRun()
{
if (!m_bInitialized) return;
// Switch to running mode.
m_appcontrol.SetRunningMode();
// Should the datalink be simulated?
if (m_eRunAs != ERunAs::standalone_simulated) return;
// Start the simulated datalink
m_bRunning = true;
m_threadSimulateDatalink = std::thread(&CExampleControl::SimulateDatalinkThreadFunc, this);
}
void CExampleControl::StopTestRun()
{
// Stop running and wait for any thread to finalize
m_bRunning = false;
if (m_threadSimulateDatalink.joinable())
m_threadSimulateDatalink.join();
}
bool CExampleControl::HasCommandLineError() const
{
return m_bCmdLnError;
}
bool CExampleControl::HasRequestedCommandLineHelp() const
{
return m_bCmdLnHelp;
}
CExampleControl::ERunAs CExampleControl::GetAppOperation() const
{
return m_eRunAs;
}
bool CExampleControl::IsSimulationMode() const
{
return m_eRunAs == ERunAs::standalone_simulated;
}
bool CExampleControl::RunAsStandaloneApp() const
{
return m_eRunAs == ERunAs::standalone || m_eRunAs == ERunAs::standalone_simulated;
}
bool CExampleControl::RunAsServerApp() const
{
return m_eRunAs == ERunAs::server_connect;
}
bool CExampleControl::RegisterSignalsSimDatalink()
{
if (!m_bInitialized) return false;
if (m_eRunAs != ERunAs::standalone_simulated) return true; // Nothing to do...
std::string msg = "Register all signals: ";
sdv::core::CDispatchService dispatch;
m_signalSteeringWheel = dispatch.RegisterRxSignal(demo::dsWheelAngle);
m_signalSpeed = dispatch.RegisterRxSignal(demo::dsVehicleSpeed);
m_signalRearAngle = dispatch.RegisterTxSignal(demo::dsAxleAngle, 0);
m_signalCounter = dispatch.RegisterTxSignal(demo::dsLiveCounter, 0);
if (m_signalSteeringWheel && m_signalSpeed && m_signalRearAngle && m_signalCounter)
std::cout << "Registration was successful\n";
else
std::cout << "ATTENTION! Registration failed\n";
auto allSignals = dispatch.GetRegisteredSignals();
msg.append("(number of signals == ");
msg.append(std::to_string(allSignals.size()));
msg.append(") ok\n");
std::cout << msg.c_str();
return true;
}
void CExampleControl::ResetSignalsSimDatalink()
{
if (m_eRunAs != ERunAs::standalone_simulated) return; // Nothing to do...
if (m_signalSteeringWheel)
m_signalSteeringWheel.Reset();
if (m_signalSpeed)
m_signalSpeed.Reset();
if (m_signalRearAngle)
m_signalRearAngle.Reset();
if (m_signalCounter)
m_signalCounter.Reset();
}
void CExampleControl::SimulateDatalinkThreadFunc()
{
if (m_eRunAs != ERunAs::standalone_simulated) return; // Nothing to do...
// Send fSteeringWheelAngle wheel angel from -16 to 16 radians and vice versa
// Send fVehicleSpeed from 0 to 12 m/s (43.2 km/h) and vice versa
float fSteeringWheelAngle = 0.0f;
float fVehicleSpeed = 0.0f;
m_signalSpeed.Write(fVehicleSpeed);
m_signalSteeringWheel.Write(fSteeringWheelAngle);
float fDeltaSteering = 0.1f;
float fDeltaSpeed = 0.1f;
while (m_bRunning)
{
fSteeringWheelAngle += fDeltaSteering;
if (fSteeringWheelAngle >= 15.999f)
{
fSteeringWheelAngle = 16.0f;
fDeltaSteering = -0.1f;
}
else if (fSteeringWheelAngle <= -16.0f)
{
fSteeringWheelAngle = -16.0f;
fDeltaSteering = 0.1f;
}
fVehicleSpeed += fDeltaSpeed;
if (fVehicleSpeed >= 12.0f)
{
fVehicleSpeed = 12.0f;
fDeltaSpeed = -1.0f;
}
else if (fVehicleSpeed <= 0.0f)
{
fVehicleSpeed = 0.0f;
fDeltaSpeed = 0.1f;
}
m_signalSteeringWheel.Write(fSteeringWheelAngle);
m_signalSpeed.Write(fVehicleSpeed);
std::this_thread::sleep_for(std::chrono::milliseconds(300));
}
}

View File

@@ -0,0 +1,330 @@
#ifndef EXMAPLE_UTILITY_H
#define EXMAPLE_UTILITY_H
#include <string>
#include <support/app_control.h>
#include <support/signal_support.h>
#ifdef _WIN32
#include <codecvt>
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4996)
#endif
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#endif
#include "signal_names.h"
/**
* @brief Utility handler for example demos
*/
class CExampleControl
{
public:
/**
* @brief Constructor with the command line arguments.
* @tparam TCharType Character type of the command line arguments.
* @param[in] iArgs Amount of arguments.
* @param[in] rgszArgs Array of argument strings. The first argument represents the application name.
*/
template <typename TCharType>
CExampleControl(int iArgs, const TCharType rgszArgs[]);
/**
* @brief Destructor.
*/
~CExampleControl();
/**
* @brief Initialize application control based on the command line arguments provided through the constructor.
* @return Return true on success; false when not.
*/
bool Initialize();
/**
* @brief Shutdown the system.
*/
void Shutdown();
/**
* @brief Is the control initialized?
* @return Returns whether control is initialized.
*/
bool IsInitialized() const;
/**
* @brief Register signals, required by the vehicle devices.
* @remarks Only valid for standalone applications.
* @pre Initialization must be done before.
* @param[in] inputMsg message string to be printed on console in case of success and failure
* @param[in] configFileName config toml file name
* @return Return true on success otherwise false
*/
bool LoadConfigFile(const std::string& inputMsg, const std::string& configFileName);
/**
* @brief Start the test run if not running before.
* @details Write the input signals. In case of data link the signals are written from a asc file by the can_com_sim.sdv component.
* Otherwise the signals are create and can be written directly.
*/
void StartTestRun();
/**
* @brief Stops a test run if currently running.
*/
void StopTestRun();
/**
* @brief Did a command line error occur?
* @return Returns whether a command line error occurred.
*/
bool HasCommandLineError() const;
/**
* @brief Was command line help requested?
* @return Returns whether a command line help was requested.
*/
bool HasRequestedCommandLineHelp() const;
/**
* @brief Application operation.
*/
enum class ERunAs
{
standalone, ///< This application runs as standalone using data link and can_com_sim.sdv which reads the CAN messages from an asc file.
standalone_simulated, ///< This application runs as standalone simulating data read/write without datalink.
server_connect, ///< Connect to a server and run as a client application.
};
/**
* @brief Get the current application operation (retrieved from command line).
* @return The application operation.
*/
ERunAs GetAppOperation() const;
/**
* @brief Is the simulation mode activated
* @return Returns whether simulation or data link is active.
*/
bool IsSimulationMode() const;
/**
* @brief Does the application run as a standalone application?
* @return Returns whether the application runs as a standalone application.
*/
bool RunAsStandaloneApp() const;
/**
* @brief Does the application connect to a server and run on the server?
* @return Returns whether the application runs on the server.
*/
bool RunAsServerApp() const;
/**
* @brief Register signals for datalink simulation; required by the vehicle devices.
* @return Returns 'true' on success; 'false' on failure.
*/
bool RegisterSignalsSimDatalink();
/**
* @brief Reset signals for datalink simulation; needed for a proper shutdown.
*/
void ResetSignalsSimDatalink();
private:
/**
* @brief Provide simulated signals until m_bRunning is disabled.
*/
void SimulateDatalinkThreadFunc();
/**
* @brief Reporting by the SDV V-API application control.
*/
enum class EAppControlReporting
{
silent, ///< No reporting by application control (default)
normal, ///< Normal reporting by application control
verbose, ///< Extensive reporting by application control
};
bool m_bInitialized = false; ///< Set when initialized.
bool m_bCmdLnError = false; ///< Command line error occurred.
bool m_bCmdLnHelp = false; ///< Command line help provided.
bool m_bRunning = false; ///< When set, the application is running.
ERunAs m_eRunAs = ERunAs::standalone; ///< Application operation.
EAppControlReporting m_eReporting = EAppControlReporting::silent; ///< Application control reporting.
uint32_t m_uiInstance = 1000u; ///< Server instance to connect to.
std::filesystem::path m_pathFramework; ///< Path to the SDV V-API framework.
sdv::app::CAppControl m_appcontrol; ///< App-control of SDV V-API.
std::thread m_threadSimulateDatalink; ///< Simulation datalink thread.
sdv::core::CSignal m_signalSteeringWheel; ///< Steering wheel angle signal (input) - simulated datalink
sdv::core::CSignal m_signalSpeed; ///< Speed signal (input) - simulated datalink
sdv::core::CSignal m_signalRearAngle; ///< Rear angle signal (output) - simulated datalink
sdv::core::CSignal m_signalCounter; ///< Simple counter signal (output) - simulated datalink
};
template <typename TCharType>
CExampleControl::CExampleControl(int iArgs, const TCharType rgszArgs[])
{
bool bStandalone = false;
bool bStandaloneSimulated = false;
bool bServerConnect = false;
bool bSilent = false;
bool bNormal = false;
bool bVerbose = false;
for (int i = 1; i < iArgs; i++)
{
#ifdef _WIN32
std::wstring wide_string = rgszArgs[i];
size_t size_needed = std::wcstombs(nullptr, wide_string.c_str(), 0);
std::string ssArg(size_needed, 0);
std::wcstombs(&ssArg[0], wide_string.c_str(), size_needed);
#else
std::string ssArg = rgszArgs[i];
#endif
#ifdef _WIN32
if (ssArg == "/?" || ssArg == "--help" || ssArg == "-?")
#else
if (ssArg == "--help" || ssArg == "-?")
#endif
{
m_bCmdLnHelp = true;
continue;
}
if (ssArg.substr(0, 10) == "--instance")
{
m_uiInstance = std::stoul(ssArg.substr(10));
continue;
}
#ifdef _WIN32
if (ssArg.substr(0, 2) == "/f" || ssArg.substr(0, 2) == "-f")
#else
if (ssArg.substr(0, 2) == "-f")
#endif
{
m_pathFramework = std::filesystem::u8path(ssArg.substr(2));
continue;
}
if (ssArg == "--standalone")
{
bStandalone = true;
continue;
}
if (ssArg == "--connect")
{
bServerConnect = true;
continue;
}
if (ssArg == "--simulate")
{
bStandaloneSimulated = true;
continue;
}
#ifdef _WIN32
if (ssArg == "/s" || ssArg == "-s" || ssArg == "--silent")
#else
if (ssArg == "-s" || ssArg == "--silent")
#endif
{
bSilent = true;
continue;
}
#ifdef _WIN32
if (ssArg == "/n" || ssArg == "-n" || ssArg == "--normal")
#else
if (ssArg == "-n" || ssArg == "--normal")
#endif
{
bSilent = true;
continue;
}
#ifdef _WIN32
if (ssArg == "/v" || ssArg == "-v" || ssArg == "--verbose")
#else
if (ssArg == "-v" || ssArg == "--verbose")
#endif
{
bVerbose = true;
continue;
}
// Argument not known
std::cerr << "ERROR: unknown argument '" << ssArg << "'" << std::endl;
m_bCmdLnError = true;
}
// Check for an invalid flag.
if (!m_bCmdLnError && (bStandalone || bStandaloneSimulated) && bServerConnect)
{
std::cerr << "ERROR: the application can run either as standalone application of connect to a server.";
m_bCmdLnError = true;
}
// Set to server connect if requested.
if (bServerConnect)
m_eRunAs = ERunAs::server_connect;
if (bStandaloneSimulated)
m_eRunAs = ERunAs::standalone_simulated;
// Check console output flags
if ((bSilent && bNormal) ||
(bSilent && bVerbose) ||
(bNormal && bSilent))
{
std::cerr << "ERROR: multiple settings for the SDV V-API application control console output.";
m_bCmdLnError = true;
}
// Set control app reporting mode if requested.
if (bNormal)
m_eReporting = EAppControlReporting::normal;
if (bVerbose)
m_eReporting = EAppControlReporting::verbose;
// Check for the framework runtime location
if (!m_bCmdLnError && m_pathFramework.empty())
{
const char* szSDVFramework = std::getenv("SDV_FRAMEWORK_RUNTIME");
if (szSDVFramework)
m_pathFramework = std::filesystem::u8path(szSDVFramework);
else
{
std::cerr << "ERROR: Missing path to SDV V-API framework. Use commandline argument -f or set "
"SDV_FRAMEWORK_RUNTIME environment variable." << std::endl;
m_bCmdLnError = true;
}
}
if (!m_bCmdLnError && !std::filesystem::is_directory(m_pathFramework) && !std::filesystem::exists(m_pathFramework / "core_services.sdv"))
{
std::cerr << "ERROR: Invalid path to SDV V-API framework." << std::endl;
m_bCmdLnError = true;
}
// Print help or error information
if (m_bCmdLnHelp || m_bCmdLnError)
{
std::cout << R"text(
Usage: system_demo_example <options>
--help, -? Show help
--instance<no> Set instance number for server connection (default = 1000).
-f<framework_location> Location of SDV V-API framework if SDV_FRAMEWORK_RUNTIME hasn't been set.
--standalone Run as standalone application (data link layer through can_com_sim.sdv which reads the CAN messages from an asc file).
--simulate Run as standalone application and simulate the data link layer.
--connect Connect to running server.
--silent, -s Start the SDV application control with console output in silent mode (default).
--normal, -n Start the SDV application control with console output in normal mode.
--verbose, -v Start the SDV application control with console output in verbose mode.
)text";
}}
#endif // ! defined EXMAPLE_UTILITY_H

View File

@@ -0,0 +1,25 @@
/**
* namespace for the signal names
* in case /generated/vss_files/signal_identifier.h
* exists, use the file, otherwise define the namespace
*/
#ifndef SIGNAL_NAMES_H
#define SIGNAL_NAMES_H
#ifdef __has_include
#if __has_include("../generated/vss_files/signal_identifier.h")
#include "../generated/vss_files/signal_identifier.h"
#else
namespace demo
{
static std::string dsWheelAngle = "CAN_Input.SteeringWheel"; ///< float RX Vehicle.Chassis.SteeringWheel.Angle
static std::string dsVehicleSpeed = "CAN_Input.Speed"; ///< float RX Vehicle.Speed
static std::string dsAxleAngle = "CAN_Output.RearAngle"; ///< float TX Vehicle.Chassis.RearAxle.Row.Wheel
static std::string dsLiveCounter = "CAN_Output.IsActiveCounter"; ///< uint8_t TX Vehicle.Software.Application.IsActiveCounter
} // demo
#endif
#endif
#endif // ! defined SIGNAL_NAMES_H

View File

@@ -0,0 +1,180 @@
#ifdef __unix__
#include <semaphore.h>
#include <time.h>
#include <fcntl.h>
#include <signal.h>
#endif
#include <iostream>
#include <string>
#include <filesystem>
#include <cstdlib>
#include "control.h"
#include "console.h"
#ifdef _WIN32
// Some old MinGW/CYGWIN distributions don't define this:
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
#endif
static HANDLE stdoutHandle, stdinHandle;
static DWORD outModeInit, inModeInit;
void setupConsole(void) {
DWORD outMode = 0, inMode = 0;
stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
stdinHandle = GetStdHandle(STD_INPUT_HANDLE);
if(stdoutHandle == INVALID_HANDLE_VALUE || stdinHandle == INVALID_HANDLE_VALUE) {
exit(GetLastError());
}
if(!GetConsoleMode(stdoutHandle, &outMode) || !GetConsoleMode(stdinHandle, &inMode)) {
exit(GetLastError());
}
outModeInit = outMode;
inModeInit = inMode;
// Enable ANSI escape codes
outMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
// Set stdin as no echo and unbuffered
inMode &= ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
if(!SetConsoleMode(stdoutHandle, outMode) || !SetConsoleMode(stdinHandle, inMode)) {
exit(GetLastError());
}
}
void restoreConsole(void) {
// Reset colors
printf("\x1b[0m");
// Reset console mode
if(!SetConsoleMode(stdoutHandle, outModeInit) || !SetConsoleMode(stdinHandle, inModeInit)) {
exit(GetLastError());
}
}
#else
static struct termios orig_term;
static struct termios new_term;
void setupConsole(void) {
tcgetattr(STDIN_FILENO, &orig_term);
new_term = orig_term;
new_term.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &new_term);
}
void restoreConsole(void) {
// Reset colors
printf("\x1b[0m");
// Reset console mode
tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
}
#endif
void getCursorPosition(int *row, int *col) {
printf("\x1b[6n");
char buff[128];
int indx = 0;
for(;;) {
int cc = getchar();
buff[indx] = (char)cc;
indx++;
if(cc == 'R') {
buff[indx + 1] = '\0';
break;
}
}
sscanf(buff, "\x1b[%d;%dR", row, col);
fseek(stdin, 0, SEEK_END);
}
#if defined(_WIN32) && defined(_UNICODE)
extern "C" int wmain(int argc, wchar_t* argv[])
{
#else
extern "C" int main(int argc, char* argv[])
{
#endif
std::cout << "System demo example" << std::endl;
std::cout << "----------------------------------------------------------------------------" << std::endl;
// Start application control
CExampleControl control(argc, argv);
if (control.HasCommandLineError()) return -1; // Command line error occurred; cannot continue.
if (control.HasRequestedCommandLineHelp()) return 0; // Command line help requested; job done.
if (!control.Initialize())
{
std::cerr << "ERROR: Failed to initialize application control." << std::endl;
return -2;
}
// The console provides output.
CConsole console(control.RunAsStandaloneApp());
// Load configuration files when running as standalone
if (control.RunAsStandaloneApp())
{
bool bResult = control.LoadConfigFile("Load dispatch example: ", "data_dispatch_example.toml");
bResult &= control.LoadConfigFile("Load task timer: ", "task_timer_example.toml");
if (control.GetAppOperation() == CExampleControl::ERunAs::standalone)
{
std::cout << "Datalink enabled, load CAN Simulation device and datalink component." << std::endl;
bResult &= control.LoadConfigFile("Load can_com_simulation: ", "can_com_simulation.toml");
bResult &= control.LoadConfigFile("Load data link: ", "data_link_example.toml");
}
else
{
std::cout << "Datalink disabled, register the required signals for a simulated datalink." << std::endl;
control.RegisterSignalsSimDatalink();
}
bResult &= control.LoadConfigFile("Load vehicle_devices_basic_services_example: ", "vehicle_devices_basic_services_example.toml");
bResult &= control.LoadConfigFile("Load complex_service_example: ", "complex_service_example.toml");
if (!bResult)
{
std::cerr << std::endl << "ERROR: One or more configurations were not able to load. Cannot continue." << std::endl;
control.Shutdown();
return -3;
}
}
// Print the application header
console.PrintHeader(control.RunAsServerApp(), control.IsSimulationMode());
// Prepare for data consumption.
if (!console.PrepareDataConsumers())
{
std::cerr << std::endl << "ERROR: Cannot instantiate the data consumers. Cannot continue." << std::endl;
control.Shutdown();
return -4;
}
// Start the test run
control.StartTestRun();
// Run until break.
console.RunUntilBreak();
// Finish test run
control.StopTestRun();
// Reset the signals for a simulated datalink
if (control.GetAppOperation() == CExampleControl::ERunAs::standalone_simulated)
control.ResetSignalsSimDatalink();
// Shutdown the example control
control.Shutdown();
return 0;
}

View File

@@ -0,0 +1,62 @@
#include <iostream>
#include <string>
#include <filesystem>
#include "control.h"
#include "countersteering.h"
/**
* @brief check if SDV_FRAMEWORK_RUNTIME environment variable exists
* @return Return true if environment variable is found otherwise false
*/
bool IsSDVFrameworkEnvironmentSet()
{
const char* envVariable = std::getenv("SDV_FRAMEWORK_RUNTIME");
if (envVariable)
{
return true;
}
return false;
}
#if defined(_WIN32) && defined(_UNICODE)
extern "C" int wmain()
#else
extern "C" int main()
#endif
{
uint32_t uiInstance = 3001;
sdv::app::CAppControl appcontrol;
if (!IsSDVFrameworkEnvironmentSet())
{
// if SDV_FRAMEWORK_RUNTIME environment variable is not set we need to set the Framework Runtime directory
appcontrol.SetFrameworkRuntimeDirectory("../../bin");
}
appcontrol.AddModuleSearchDir("../../bin");
std::stringstream sstreamAppConfig;
sstreamAppConfig << "[Application]" << std::endl;
sstreamAppConfig << "Mode=\"External\"" << std::endl;
sstreamAppConfig << "Instance=" << uiInstance << std::endl;
sstreamAppConfig << "Retries=" << 10 << std::endl;
sstreamAppConfig << "[Console]" << std::endl;
sstreamAppConfig << "Report=\"Verbose\"" << std::endl;
// Start the framework as external application, which wants to connect to instance 3001
if (!appcontrol.Startup(sstreamAppConfig.str()))
{
std::cout << "appcontrol.Startup() failed." << std::endl;
return false;
}
auto pCounterSteeringSvc = sdv::core::GetObject("Counter Steering Example Service").GetInterface<ICounterSteeringService>();
if (!pCounterSteeringSvc)
{
std::cout << "\nERROR: Could not get 'ICounterSteeringService', connection to " << std::to_string (uiInstance) << "probably failed.\n" << std::endl;
return false;
}
std::cout << "\nSUCCESS: Got 'ICounterSteeringService', could connect to instance." << std::to_string (uiInstance) << "\n" << std::endl;
return true;
}

View File

@@ -0,0 +1,176 @@
#include <iostream>
#include "complex_service.h"
const float g_fSpeedThreshold = 30.0f / 3.6f;
CCounterSteeringExampleService::CCounterSteeringExampleService()
{
}
CCounterSteeringExampleService::~CCounterSteeringExampleService()
{
// Just in case...
Shutdown();
}
void CCounterSteeringExampleService::Initialize(const sdv::u8string& /*ssObjectConfig*/)
{
m_eStatus = sdv::EObjectStatus::initializing;
// Request the basic service for monitoring the alive counter.
m_pAliveCounterSvc = sdv::core::GetObject("Vehicle.Software.Application.IsActiveCounter_Service").GetInterface<vss::Vehicle::Software::Application::IsActiveCounterService::IVSS_SetCounter>();
if (!m_pAliveCounterSvc)
{
SDV_LOG_ERROR("Could not get interface 'IVSS_SetCounter': [CCounterSteeringExampleService]");
m_eStatus = sdv::EObjectStatus::initialization_failure;
return;
}
// Request the basic service for the rear axle.
m_pRearAxleSvc = sdv::core::GetObject("Vehicle.Chassis.RearAxle.Row.Wheel_Service").GetInterface<vss::Vehicle::Chassis::RearAxle::Row::WheelService::IVSS_SetRearAxle>();
if (!m_pRearAxleSvc)
{
SDV_LOG_ERROR("Could not get interface 'IVSS_SetAngle': [CCounterSteeringExampleService]");
m_eStatus = sdv::EObjectStatus::initialization_failure;
return;
}
// Request the basic service for the steering wheel.
auto pSteeringWheelSvc = sdv::core::GetObject("Vehicle.Chassis.SteeringWheel.Angle_Service").GetInterface<vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_GetSteeringWheel>();
if (!pSteeringWheelSvc)
{
SDV_LOG_ERROR("Could not get interface 'IVSS_SetSteeringAngle': [CCounterSteeringExampleService]");
m_eStatus = sdv::EObjectStatus::initialization_failure;
return;
}
// Request the basic service for the vehicle speed.
auto pVehSpeedSvc = sdv::core::GetObject("Vehicle.Speed_Service").GetInterface<vss::Vehicle::SpeedService::IVSS_GetSpeed>();
if (!pVehSpeedSvc)
{
SDV_LOG_ERROR("Could not get interface 'IVSS_SetSpeed': [CCounterSteeringExampleService]");
m_eStatus = sdv::EObjectStatus::initialization_failure;
return;
}
// Register steering wheel change event handler.
pSteeringWheelSvc->RegisterOnSignalChangeOfWheelAngle(static_cast<vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_SetSteeringWheel_Event*> (this));
// Register vehicle speed change event handler.
pVehSpeedSvc->RegisterOnSignalChangeOfVehicleSpeed(static_cast<vss::Vehicle::SpeedService::IVSS_SetSpeed_Event*> (this));
// Start the alive timer with 10 ms period.
m_Timer = sdv::core::CTaskTimer(10, [&]() {TimerFunction(); });
if (!m_Timer)
{
SDV_LOG_ERROR("CCounterSteeringExampleService: tasktimer with 10 milliseconds could not be created.");
m_eStatus = sdv::EObjectStatus::initialization_failure;
return;
}
SDV_LOG_INFO("CCounterSteeringExampleService: tasktimer created with 10 milliseconds");
m_eStatus = sdv::EObjectStatus::initialized;
}
sdv::EObjectStatus CCounterSteeringExampleService::GetStatus() const
{
return m_eStatus;
}
void CCounterSteeringExampleService::SetOperationMode(sdv::EOperationMode /*eMode*/)
{
// Not applicable
}
void CCounterSteeringExampleService::Shutdown()
{
// Terminate the alive counter
m_Timer.Reset();
// Unregister the steering wheel event handler.
auto pSteeringWheelSvc = sdv::core::GetObject("Vehicle.Chassis.SteeringWheel.Angle_Service").GetInterface<vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_GetSteeringWheel>();
if (pSteeringWheelSvc)
pSteeringWheelSvc->UnregisterOnSignalChangeOfWheelAngle(static_cast<vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_SetSteeringWheel_Event*> (this));
// Unregister the vehicle speed event handler.
auto pVehSpeedSvc = sdv::core::GetObject("Vehicle.Speed_Service").GetInterface<vss::Vehicle::SpeedService::IVSS_GetSpeed>();
if (pVehSpeedSvc)
pVehSpeedSvc->UnregisterOnSignalChangeOfVehicleSpeed(static_cast<vss::Vehicle::SpeedService::IVSS_SetSpeed_Event*> (this));
}
void CCounterSteeringExampleService::SetSteeringWheel(float value)
{
if (m_fSteeringWheel == value) return;
m_fSteeringWheel = value;
UpdateRearAxleAngle();
}
void CCounterSteeringExampleService::SetSpeed(float value)
{
if (m_fVehSpeed == value) return;
m_fVehSpeed = value;
UpdateRearAxleAngle();
}
void CCounterSteeringExampleService::ActivateService(/*in*/ bool bActivate)
{
if (m_bActivated == bActivate) return;
m_bActivated = bActivate;
UpdateRearAxleAngle();
}
bool CCounterSteeringExampleService::IsActivated() const
{
return m_bActivated;
}
bool CCounterSteeringExampleService::CounterSteeringActive() const
{
return m_bActivated && m_fVehSpeed < g_fSpeedThreshold;
}
double CCounterSteeringExampleService::RearAxleAngle() const
{
return m_fRearAxleAngle;
}
void CCounterSteeringExampleService::UpdateRearAxleAngle()
{
float fRearAxleAngle = 0.0;
if (CounterSteeringActive())
{
// Get steering wheel angle percentage
// The steering wheel can have values from -16...16 rad.
float fSteeringWheelPercent = m_fSteeringWheel / 16.0f;
if (fSteeringWheelPercent > 1.0) fSteeringWheelPercent = 1.0;
if (fSteeringWheelPercent < -1.0) fSteeringWheelPercent = -1.0;
// Calculate the vehicle speed percentage up to 30 km/h
// The vehicle speed is calculated in m/s.
float fVehSpeedPercent = m_fVehSpeed / g_fSpeedThreshold;
if (fVehSpeedPercent > 1.0) fVehSpeedPercent = 1.0;
// Calculate the counter steering percentage (counter proportional to the vehicle speed - the quicker, the less counter
// steering).
// The rear axle angle can change between -5.12...5.11 deg.
fRearAxleAngle = 5.11f * -fSteeringWheelPercent * (1.0f - fVehSpeedPercent);
}
if (fRearAxleAngle == m_fRearAxleAngle) return;
// Inform the rear exle about the new steering position.
m_fRearAxleAngle = fRearAxleAngle;
if (m_pRearAxleSvc) m_pRearAxleSvc->SetRearAxle(fRearAxleAngle);
}
void CCounterSteeringExampleService::TimerFunction()
{
// Increase the counter (max 5 bits).
m_uiAliveCounter++;
if (m_uiAliveCounter > 31)
m_uiAliveCounter = 0;
// Inform the alive counter monitor service
if (m_pAliveCounterSvc)
m_pAliveCounterSvc->SetCounter(m_uiAliveCounter);
}

View File

@@ -0,0 +1,156 @@
#ifndef COMPLEX_SERVICE_EXAMPLE_H
#define COMPLEX_SERVICE_EXAMPLE_H
// C++ library
#include <iostream>
// SDV framework support
#include <support/component_impl.h>
#include <support/signal_support.h>
#include <support/timer.h>
// VSS interfaces - located in ../generated/vss_files/include
#include "vss_vehiclechassisrearaxlerowwheel_bs_tx.h"
#include "vss_vehiclechassissteeringwheelangle_bs_rx.h"
#include "vss_vehiclesoftwareapplicationisactivecounter_bs_tx.h"
#include "vss_vehiclespeed_bs_rx.h"
// Complex service counter steering interface - located in ../generated/example_service
#include "countersteering.h"
/**
* @brief Counter steering example service
* @details This complex service provides a simple counter steering example (rear axle steering to reduce the turning radius of the
* vehicle) that will be activated dependable on the speed. For a speed of 30 km/s or less, the steering wheel angle is
* counter-steering the rear axle. The amount of counter-steering is proportional to the speed (the lower the speed the more
* counter-steering takes place).
* Input events from basic service: steering wheel angle (-16...16 rad)
* vehicle speed (0...128 m/s)
* Output calls for basic service: rear axle angle (-5.12...5.11 deg)
* alive counter (increase every 10 ms)
* Input calls for applications: counter steering enabled (true/false)
* Output info for applications: rear axle angle (-5.12...5.11 deg)
* counter steering active (true/false)
* counter steering enabled (true/false)
*/
class CCounterSteeringExampleService :
public sdv::CSdvObject,
public sdv::IObjectControl,
public vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_SetSteeringWheel_Event,
public vss::Vehicle::SpeedService::IVSS_SetSpeed_Event,
public ICounterSteeringService
{
public:
/**
* @brief Constructor
*/
CCounterSteeringExampleService();
/**
* @brief Destructor
*/
~CCounterSteeringExampleService();
// Interface map
BEGIN_SDV_INTERFACE_MAP()
SDV_INTERFACE_ENTRY(sdv::IObjectControl)
SDV_INTERFACE_ENTRY(vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_SetSteeringWheel_Event)
SDV_INTERFACE_ENTRY(vss::Vehicle::SpeedService::IVSS_SetSpeed_Event)
SDV_INTERFACE_ENTRY(ICounterSteeringService)
END_SDV_INTERFACE_MAP()
// Object declarations
DECLARE_OBJECT_CLASS_TYPE(sdv::EObjectType::ComplexService)
DECLARE_OBJECT_CLASS_NAME("Counter Steering Example Service")
DECLARE_OBJECT_SINGLETON()
/**
* @brief Initialize the object. Overload of sdv::IObjectControl::Initialize.
* @param[in] ssObjectConfig Optional configuration string.
*/
void Initialize(const sdv::u8string& ssObjectConfig) override;
/**
* @brief Get the current status of the object. Overload of sdv::IObjectControl::GetStatus.
* @return Return the current status of the object.
*/
sdv::EObjectStatus GetStatus() const override;
/**
* @brief Set the component operation mode. Overload of sdv::IObjectControl::SetOperationMode.
* @param[in] eMode The operation mode, the component should run in.
*/
void SetOperationMode(sdv::EOperationMode eMode) override;
/**
* @brief Shutdown called before the object is destroyed. Overload of sdv::IObjectControl::Shutdown.
*/
void Shutdown() override;
/**
* @brief Set steering angle event. Overload of
* vss::Vehicle::Chassis::SteeringWheel::AngleService::IVSS_SetSteeringWheel_Event::SetSteeringWheel.
* @param[in] value Steering wheel angle in radials (-16...16 rad)
*/
virtual void SetSteeringWheel(float value) override;
/**
* @brief Speed event. Overload of vss::Vehicle::SpeedService::IVSS_SetSpeed_Event::SetSpeed.
* @param[in] value Vehicle speed in m/s (0... 128 m/s)
*/
virtual void SetSpeed(float value) override;
/**
* @brief Activate or deactivate the counter steering service. Overload of ICounterSteeringService::ActivateService.
* @param[in] bActivate When set, the service will be activated; otherwise deactivated.
*/
virtual void ActivateService(/*in*/ bool bActivate) override;
/**
* @brief Is the counter steering service currently activated? Overload of ICounterSteeringService::IsActivated.
* @return Returns whether the counter steering service is currently activated.
*/
virtual bool IsActivated() const override;
/**
* @brief Does counter steering currently take place (speed > 30 km/s)? Overload of
* ICounterSteeringService::CounterSteeringActive.
* @return Returns whether counter steering currently takes place.
*/
virtual bool CounterSteeringActive() const override;
/**
* @brief The calculated rear steering axle position. Overload of ICounterSteeringService::RearAxleAngle.
* @return Returns the rear steering axle position in degrees (or 0 when not active).
*/
virtual double RearAxleAngle() const override;
private:
/**
* @brief Update the rear axle angle baed on the stored input.
*/
void UpdateRearAxleAngle();
/**
* @brief Timer function, function will be called by the timer, default every 10 ms
*/
void TimerFunction();
sdv::EObjectStatus m_eStatus = sdv::EObjectStatus::initialization_pending; ///< Current object status
volatile float m_fSteeringWheel = 0.0; ///< Steering wheel angle
volatile float m_fVehSpeed = 0.0; ///< Vehicle speed
volatile float m_fRearAxleAngle = 0.0; ///< Output rear angle
uint8_t m_uiAliveCounter = 0u; ///< Output alive counter
bool m_bActivated = false; ///< Is the service activated?
sdv::core::CTaskTimer m_Timer; ///< Timer for alive counter (10 ms)
///< Alive counter interface.
vss::Vehicle::Software::Application::IsActiveCounterService::IVSS_SetCounter* m_pAliveCounterSvc = nullptr;
///< Rear axle interface.
vss::Vehicle::Chassis::RearAxle::Row::WheelService::IVSS_SetRearAxle* m_pRearAxleSvc = nullptr;
};
DEFINE_SDV_OBJECT(CCounterSteeringExampleService)
#endif // !define COMPLEX_SERVICE_EXAMPLE_H

View File

@@ -0,0 +1,35 @@
/*******************************************************************************
* @file countersteering.idl
* @details Counter steering example service interface definition.
*/
/**
* @brief Counter steering example service interface. The interface provides functions for the
* counter steering example complex service.
*/
interface ICounterSteeringService
{
/**
* @brief Activate or deactivate the counter steering service.
* @param[in] bActivate When set, the service will be activated; otherwise deactivated.
*/
void ActivateService(in boolean bActivate);
/**
* @brief Is the counter steering service currently activated?
* @return Returns whether the counter steering service is currently activated.
*/
boolean IsActivated() const;
/**
* @brief Does counter steering currently take place (speed > 30 km/s)?
* @return Returns whether counter steering currently takes place.
*/
boolean CounterSteeringActive() const;
/**
* @brief The calculated rear steering axle position.
* @return Returns the rear steering axle position in degrees (or 0 when not active).
*/
double RearAxleAngle() const;
};

View File

@@ -0,0 +1,321 @@
/**
* @file model.cpp
* @date 2025-04-16 09:03:47
* This file defines the data link object between CAN and the V-API devices.
* This file was generated by the DBC utility from:
* datalink_demo_example.dbc
* DBC file version: 1.0.0.1
*/
#include <memory>
#include <vector>
#include <iostream>
#include <fstream>
#include <support/timer.h>
#include "signal_identifier.h"
#include <support/signal_support.h>
#include <support/app_control.h>
// we need to activate the counter steering service through the complex service
#include "countersteering.h"
sdv::core::CSignal g_signalSpeed;
sdv::core::CSignal g_signalSteeringWheel;
sdv::core::CSignal g_signalRearAngle;
sdv::core::CSignal g_signalIsActiveCounter;
// in case the simulation timer should be used
sdv::core::ITimerSimulationStep* g_pTimerSimulationStep;
std::unique_ptr<sdv::app::CAppControl> g_appcontrol;
bool InitializeAppControl(const std::string& resource, const std::string& configFileName)
{
auto bResult = g_appcontrol->AddModuleSearchDir( resource );
bResult &= g_appcontrol->Startup("");
g_appcontrol->SetConfigMode();
bResult &= g_appcontrol->AddConfigSearchDir( resource );
if (!configFileName.empty())
{
bResult &= g_appcontrol->LoadConfig(configFileName.c_str()) == sdv::core::EConfigProcessResult::successful;
}
return bResult;
}
sdv::core::EConfigProcessResult RegisterAllSignals()
{
std::string msg = "register all signals: ";
sdv::core::CDispatchService dispatch;
g_signalSpeed = dispatch.RegisterRxSignal("CAN_Input.Speed");
g_signalSteeringWheel = dispatch.RegisterRxSignal("CAN_Input.SteeringWheel");
g_signalRearAngle = dispatch.RegisterTxSignal("CAN_Output.RearAngle",0);
g_signalIsActiveCounter = dispatch.RegisterTxSignal("CAN_Output.IsActiveCounter",0);
if (g_signalSpeed && g_signalSteeringWheel && g_signalRearAngle && g_signalIsActiveCounter)
{
return sdv::core::EConfigProcessResult::successful;
}
return sdv::core::EConfigProcessResult::failed;
}
bool ResetAllSignals()
{
sdv::core::CDispatchService dispatch;
if (g_signalSpeed)
{
g_signalSpeed.Reset();
}
if (g_signalSteeringWheel)
{
g_signalSteeringWheel.Reset();
}
if (g_signalRearAngle)
{
g_signalRearAngle.Reset();
}
if (g_signalIsActiveCounter)
{
g_signalIsActiveCounter.Reset();
}
SDV_LOG_INFO("Reset signals");
return true;
}
bool CreateCoreServiceTomlFile(const std::string& resources)
{
std::ofstream tomlFile("sdv_core_reloc.toml");
if (tomlFile.is_open())
{
tomlFile << "# Location of the SDV binaries and configuration files\ndirectory = \"";
tomlFile << resources;
tomlFile << "\"\n";
tomlFile.close();
return true;
}
return false;
}
bool OpenAPILoad(const std::string& resources)
{
bool success = CreateCoreServiceTomlFile(resources);
g_appcontrol = std::make_unique<sdv::app::CAppControl> ();
//
// TODO: Dispatch service must be loaded first, adjust the correct toml file
//
success &= InitializeAppControl(resources, "data_dispatch_config_file.toml");
if (!success)
{
SDV_LOG_ERROR("Failed InitializeAppControl");
return false;
}
success &= RegisterAllSignals() == sdv::core::EConfigProcessResult::successful;
if (!success)
{
SDV_LOG_ERROR("Signals could not be registered");
}
//
//
// TODO: Load all configurations files
//
//
//
// Get the simulation task timer service if the simulation timer should be used
success &= g_appcontrol->LoadConfig("simulation_task_timer_config_file.toml") == sdv::core::EConfigProcessResult::successful;
g_pTimerSimulationStep = sdv::core::GetObject<sdv::core::ITimerSimulationStep>("SimulationTaskTimerService");
if (!g_pTimerSimulationStep)
{
SDV_LOG_WARNING("Simulation timer step not available, use normal task timer ");
success &= g_appcontrol->LoadConfig("fmu_task_timer_example.toml") == sdv::core::EConfigProcessResult::successful;
}
success &= g_appcontrol->LoadConfig("fmu_vehicle_devices_basic_services.toml") == sdv::core::EConfigProcessResult::successful;
success &= g_appcontrol->LoadConfig("fmu_complex_service.toml") == sdv::core::EConfigProcessResult::successful;
g_appcontrol->SetRunningMode();
// we need to activate the counter steering service through the complex service
auto pCounterSteeringSvc = sdv::core::GetObject("Counter Steering Example Service").GetInterface<ICounterSteeringService>();
if (pCounterSteeringSvc)
{
pCounterSteeringSvc->ActivateService(true);
}
return success;
}
void OpenAPIShutdown()
{
ResetAllSignals();
}
#ifdef __cplusplus
extern "C" {
#endif
#include <float.h> // for DBL_EPSILON
#include <math.h> // for fabs()
#include "config.h"
#include "model.h"
Status cleanup(ModelInstance*)
{
SDV_LOG_INFO("Shutting down...");
OpenAPIShutdown();
return OK;
}
bool setStartValues(ModelInstance* comp)
{
std::string path(comp->resourceLocation);
std::string resourcePath = path.substr(8);
std::replace(resourcePath.begin(), resourcePath.end(), '\\', '/');
if (!OpenAPILoad(resourcePath))
{
logError(comp, "Could not initialze Core Instance: %s", resourcePath.c_str());
comp->terminateSimulation = true;
return false;
}
// TODO: move this to initialize()?
comp->nextEventTime = 0;
comp->nextEventTimeDefined = true;
return true;
}
//void reset(ModelInstance* comp)
//{
// OpenAPIShutdown();
// OpenAPILoad((std::string(comp->resourceLocation) + "repository_service.sdv").c_str());
//}
Status calculateValues(ModelInstance* comp)
{
UNUSED(comp);
// nothing to do
return OK;
}
Status getFloat64(ModelInstance* comp, [[maybe_unused]] ValueReference vr, [[maybe_unused]] double values[], [[maybe_unused]] size_t nValues, [[maybe_unused]] size_t* index)
{
ASSERT_NVALUES(1);
switch (vr)
{
case vr_Speed:
values[(*index)++] = M(Speed);
break;
case vr_SteeringWheel:
values[(*index)++] = M(SteeringWheel);
break;
case vr_RearAngle:
values[(*index)++] = M(RearAngle);
break;
default:
logError(comp, "Get Float64 is not allowed for value reference u.", vr);
return Error;
}
return OK;
}
Status getInt32(ModelInstance* comp, [[maybe_unused]] ValueReference vr, [[maybe_unused]] int32_t values[], [[maybe_unused]] size_t nValues, [[maybe_unused]] size_t* index)
{
ASSERT_NVALUES(1);
switch (vr)
{
case vr_IsActiveCounter:
values[(*index)++] = M(IsActiveCounter);
break;
default:
logError(comp, "Get Int32 is not allowed for value reference u.", vr);
return Error;
}
return OK;
}
Status setFloat64(ModelInstance* comp, [[maybe_unused]] ValueReference vr, [[maybe_unused]] const double values[], [[maybe_unused]] size_t nValues, [[maybe_unused]] size_t* index)
{
ASSERT_NVALUES(1);
switch (vr)
{
case vr_Speed:
M(Speed) = values[(*index)++];
break;
case vr_SteeringWheel:
M(SteeringWheel) = values[(*index)++];
break;
case vr_RearAngle:
M(RearAngle) = values[(*index)++];
break;
default:
logError(comp, "Set Float64 is not allowed for value reference u.", vr);
return Error;
}
return OK;
}
Status setInt32(ModelInstance* comp, [[maybe_unused]] ValueReference vr, [[maybe_unused]] const int32_t values[], [[maybe_unused]] size_t nValues, [[maybe_unused]] size_t* index)
{
ASSERT_NVALUES(1);
switch (vr)
{
case vr_IsActiveCounter:
M(IsActiveCounter) = values[(*index)++];
break;
default:
logError(comp, "Set Int32 is not allowed for value reference u.", vr);
return Error;
}
return OK;
}
void eventUpdate(ModelInstance* comp)
{
if (g_pTimerSimulationStep) // in case the simulation timer was used, maybe the step size has to be adjusted
{
g_pTimerSimulationStep->SimulationStep(1000);
}
g_signalSpeed.Write( M(Speed));
g_signalSteeringWheel.Write( M(SteeringWheel));
M(RearAngle) = g_signalRearAngle.Read().get<float>();
M(IsActiveCounter) = g_signalIsActiveCounter.Read().get<uint32_t>();
double epsilon = (1.0 + fabs(comp->time)) * DBL_EPSILON;
if (comp->nextEventTimeDefined && comp->time + epsilon >= comp->nextEventTime) {
comp->nextEventTime += FIXED_SOLVER_STEP;
}
comp->valuesOfContinuousStatesChanged = false;
comp->nominalsOfContinuousStatesChanged = false;
comp->terminateSimulation = false;
comp->nextEventTimeDefined = true;
}
#ifdef __cplusplus
} // end of extern "C"
#endif

View File

@@ -0,0 +1,7 @@
[Configuration]
Version = 100
[[Component]]
Path = "demo_complex_service.sdv"
Class = "Counter Steering Example Service"

View File

@@ -0,0 +1,8 @@
[Configuration]
Version = 100
[[Component]]
Path = "data_dispatch_service.sdv"
Class = "DataDispatchService"

View File

@@ -0,0 +1,6 @@
[Configuration]
Version = 100
[[Component]]
Path = "simulation_task_timer.sdv"
Class = "SimulationTaskTimerService"

View File

@@ -0,0 +1,6 @@
[Configuration]
Version = 100
[[Component]]
Path = "task_timer.sdv"
Class = "TaskTimerService"

View File

@@ -0,0 +1,37 @@
[Configuration]
Version = 100
[[Component]]
Path = "demo_vd_isactivecounter_tx.sdv"
Class = "Vehicle.Software.Application.IsActiveCounter_Device"
[[Component]]
Path = "demo_vd_steeringwheel_rx.sdv"
Class = "Vehicle.Chassis.SteeringWheel.Angle_Device"
[[Component]]
Path = "demo_vd_vehiclechassisaxle_tx.sdv"
Class = "Vehicle.Chassis.RearAxle.Row.Wheel_Device"
[[Component]]
Path = "demo_vd_vehiclespeed_rx.sdv"
Class = "Vehicle.Speed_Device"
[[Component]]
Path = "demo_bs_isactivecounter_tx.sdv"
Class = "Vehicle.Software.Application.IsActiveCounter_Service"
[[Component]]
Path = "demo_bs_steeringwheel_rx.sdv"
Class = "Vehicle.Chassis.SteeringWheel.Angle_Service"
[[Component]]
Path = "demo_bs_vehiclechassisaxle_tx.sdv"
Class = "Vehicle.Chassis.RearAxle.Row.Wheel_Service"
[[Component]]
Path = "demo_bs_vehiclespeed_rx.sdv"
Class = "Vehicle.Speed_Service"

View File

@@ -0,0 +1,57 @@
/* */
/* This script file uses the DemoExampleFMU.fmu to be run in OpenXilEnv */
/* */
ADD_BBVARI(IncreaseSpeed, DWORD)
ADD_BBVARI(IncreaseSteeringWheel, DWORD)
ADD_BBVARI(Loop, UDWORD)
SET_BBVARI(IncreaseSpeed = 2)
SET_BBVARI(IncreaseSteeringWheel= 1)
SET_BBVARI(Loop = 0)
SET_BBVARI(IsActiveCounter = 0)
SET_BBVARI(RearAngle = 0)
SET_BBVARI(Speed = 0)
SET_BBVARI(SteeringWheel = 0)
WHILE(Loop < 100)
SET_BBVARI(Speed = Speed + IncreaseSpeed)
SET_BBVARI(SteeringWheel = SteeringWheel + IncreaseSteeringWheel)
IF(SteeringWheel>20)
SET_BBVARI(IncreaseSteeringWheel = -1)
ENDIF
DELAY(100)
SET(Loop = Loop + 1)
ENDWHILE
/* */
/* This script file uses the DemoExampleFMU.fmu to be run in OpenXilEnv */
/* */
ADD_BBVARI(IncreaseSpeed, DWORD)
ADD_BBVARI(IncreaseSteeringWheel, DWORD)
ADD_BBVARI(Loop, UDWORD)
SET_BBVARI(IncreaseSpeed = 2)
SET_BBVARI(IncreaseSteeringWheel= 1)
SET_BBVARI(Loop = 0)
RESET_PROCESS(DemoExampleFMU.fmu)
WHILE(Loop < 100)
SET_BBVARI(Speed = Speed + IncreaseSpeed)
SET_BBVARI(SteeringWheel = SteeringWheel + IncreaseSteeringWheel)
IF(SteeringWheel>20)
SET_BBVARI(IncreaseSteeringWheel = -1)
ENDIF
DELAY(100)
SET(Loop = Loop + 1)
ENDWHILE

View File

@@ -0,0 +1,733 @@
date 08/28/25 19:10:31
base hex timestamps absolute
Begin Triggerblock 08/28/25 19:10:31
0.000000 Start of measurement
0.201165 1 0 Rx d 8 00 00 00 00 00 CC 00 32
0.401499 1 0 Rx d 8 00 00 00 00 01 98 00 66
0.602210 1 0 Rx d 8 00 00 00 00 02 66 00 98
0.802858 1 0 Rx d 8 00 00 00 00 03 32 00 CC
1.003648 1 0 Rx d 8 00 00 00 00 04 00 01 00
1.204951 1 0 Rx d 8 00 00 00 00 04 CC 01 32
1.405930 1 0 Rx d 8 00 00 00 00 05 98 01 66
1.607026 1 0 Rx d 8 00 00 00 00 06 66 01 98
1.807489 1 0 Rx d 8 00 00 00 00 07 32 01 CC
2.007739 1 0 Rx d 8 00 00 00 00 08 00 02 00
2.208098 1 0 Rx d 8 00 00 00 00 08 CC 02 32
2.408547 1 0 Rx d 8 00 00 00 00 09 98 02 66
2.609562 1 0 Rx d 8 00 00 00 00 0A 66 02 98
2.809847 1 0 Rx d 8 00 00 00 00 0B 32 02 CC
3.010645 1 0 Rx d 8 00 00 00 00 0C 00 03 00
3.211386 1 0 Rx d 8 00 00 00 00 0C CC 03 32
3.412526 1 0 Rx d 8 00 00 00 00 0D 98 03 66
3.613245 1 0 Rx d 8 00 00 00 00 0E 66 03 98
3.813713 1 0 Rx d 8 00 00 00 00 0F 32 03 CC
4.014112 1 0 Rx d 8 00 00 00 00 10 00 04 00
4.214398 1 0 Rx d 8 00 00 00 00 10 CC 04 32
4.414982 1 0 Rx d 8 00 00 00 00 11 98 04 66
4.615295 1 0 Rx d 8 00 00 00 00 12 66 04 98
4.815465 1 0 Rx d 8 00 00 00 00 13 32 04 CC
5.016380 1 0 Rx d 8 00 00 00 00 13 FE 04 FE
5.216542 1 0 Rx d 8 00 00 00 00 14 CC 05 32
5.417300 1 0 Rx d 8 00 00 00 00 15 98 05 66
5.617988 1 0 Rx d 8 00 00 00 00 16 66 05 98
5.818408 1 0 Rx d 8 00 00 00 00 17 32 05 CC
6.019516 1 0 Rx d 8 00 00 00 00 17 FE 05 FE
6.220729 1 0 Rx d 8 00 00 00 00 18 CC 06 32
6.421086 1 0 Rx d 8 00 00 00 00 19 98 06 66
6.621658 1 0 Rx d 8 00 00 00 00 1A 66 06 98
6.821893 1 0 Rx d 8 00 00 00 00 1B 32 06 CC
7.023523 1 0 Rx d 8 00 00 00 00 1B FE 06 FE
7.224499 1 0 Rx d 8 00 00 00 00 1C CC 07 32
7.424949 1 0 Rx d 8 00 00 00 00 1D 98 07 66
7.625353 1 0 Rx d 8 00 00 00 00 1E 66 07 98
7.825592 1 0 Rx d 8 00 00 00 00 1F 32 07 CC
8.026488 1 0 Rx d 8 00 00 00 00 1F FE 07 FE
8.227611 1 0 Rx d 8 00 00 00 00 20 CC 08 32
8.427815 1 0 Rx d 8 00 00 00 00 21 98 08 66
8.628525 1 0 Rx d 8 00 00 00 00 22 66 08 98
8.829077 1 0 Rx d 8 00 00 00 00 23 32 08 CC
9.029962 1 0 Rx d 8 00 00 00 00 23 FE 08 FE
9.230475 1 0 Rx d 8 00 00 00 00 24 CC 09 32
9.431706 1 0 Rx d 8 00 00 00 00 25 98 09 66
9.632166 1 0 Rx d 8 00 00 00 00 26 66 09 98
9.832447 1 0 Rx d 8 00 00 00 00 27 32 09 CC
10.033648 1 0 Rx d 8 00 00 00 00 27 FE 09 FE
10.234917 1 0 Rx d 8 00 00 00 00 28 CC 0A 32
10.435382 1 0 Rx d 8 00 00 00 00 29 98 0A 66
10.635758 1 0 Rx d 8 00 00 00 00 2A 66 0A 98
10.836600 1 0 Rx d 8 00 00 00 00 2B 32 0A CC
11.037378 1 0 Rx d 8 00 00 00 00 2B FE 0A FE
11.237882 1 0 Rx d 8 00 00 00 00 2C CC 0B 32
11.439001 1 0 Rx d 8 00 00 00 00 2D 98 0B 66
11.639635 1 0 Rx d 8 00 00 00 00 2E 66 0B 98
11.840391 1 0 Rx d 8 00 00 00 00 2F 32 0B CC
12.040855 1 0 Rx d 8 00 00 00 00 2F FE 0B FE
12.242131 1 0 Rx d 8 00 00 00 00 30 CC 0C 32
12.443152 1 0 Rx d 8 00 00 00 00 31 98 0C 66
12.644236 1 0 Rx d 8 00 00 00 00 32 66 0C 98
12.844648 1 0 Rx d 8 00 00 00 00 33 32 0C CC
13.045033 1 0 Rx d 8 00 00 00 00 33 FE 0C FE
13.245501 1 0 Rx d 8 00 00 00 00 34 CC 0D 32
13.446980 1 0 Rx d 8 00 00 00 00 35 98 0D 66
13.647729 1 0 Rx d 8 00 00 00 00 36 66 0D 98
13.848694 1 0 Rx d 8 00 00 00 00 37 32 0D CC
14.050383 1 0 Rx d 8 00 00 00 00 37 FE 0D FE
14.250963 1 0 Rx d 8 00 00 00 00 38 CC 0E 32
14.451368 1 0 Rx d 8 00 00 00 00 39 98 0E 66
14.652121 1 0 Rx d 8 00 00 00 00 3A 66 0E 98
14.853783 1 0 Rx d 8 00 00 00 00 3B 32 0E CC
15.054832 1 0 Rx d 8 00 00 00 00 3B FE 0E FE
15.255178 1 0 Rx d 8 00 00 00 00 3C CC 0F 32
15.456191 1 0 Rx d 8 00 00 00 00 3D 98 0F 66
15.656966 1 0 Rx d 8 00 00 00 00 3E 66 0F 98
15.857494 1 0 Rx d 8 00 00 00 00 3F 32 0F CC
16.058330 1 0 Rx d 8 00 00 00 00 3F FE 0F FE
16.259059 1 0 Rx d 8 00 00 00 00 40 CC 10 32
16.459296 1 0 Rx d 8 00 00 00 00 41 98 10 66
16.659768 1 0 Rx d 8 00 00 00 00 42 66 10 98
16.860430 1 0 Rx d 8 00 00 00 00 43 32 10 CC
17.060657 1 0 Rx d 8 00 00 00 00 43 FE 10 FE
17.260999 1 0 Rx d 8 00 00 00 00 44 CC 11 32
17.461425 1 0 Rx d 8 00 00 00 00 45 98 11 66
17.662180 1 0 Rx d 8 00 00 00 00 46 66 11 98
17.862641 1 0 Rx d 8 00 00 00 00 47 32 11 CC
18.063737 1 0 Rx d 8 00 00 00 00 47 FE 11 FE
18.264310 1 0 Rx d 8 00 00 00 00 48 CC 12 32
18.465286 1 0 Rx d 8 00 00 00 00 49 98 12 66
18.666105 1 0 Rx d 8 00 00 00 00 4A 66 12 98
18.867149 1 0 Rx d 8 00 00 00 00 4B 32 12 CC
19.067565 1 0 Rx d 8 00 00 00 00 4C 00 13 00
19.268397 1 0 Rx d 8 00 00 00 00 4C CC 13 32
19.468547 1 0 Rx d 8 00 00 00 00 4D 98 13 66
19.669109 1 0 Rx d 8 00 00 00 00 4E 66 13 98
19.869927 1 0 Rx d 8 00 00 00 00 4F 32 13 CC
20.070496 1 0 Rx d 8 00 00 00 00 50 00 14 00
20.271128 1 0 Rx d 8 00 00 00 00 50 CC 14 32
20.471522 1 0 Rx d 8 00 00 00 00 51 98 14 66
20.672562 1 0 Rx d 8 00 00 00 00 52 66 14 98
20.873219 1 0 Rx d 8 00 00 00 00 53 32 14 CC
21.073484 1 0 Rx d 8 00 00 00 00 54 00 15 00
21.274192 1 0 Rx d 8 00 00 00 00 54 CC 15 32
21.474746 1 0 Rx d 8 00 00 00 00 55 98 15 66
21.674944 1 0 Rx d 8 00 00 00 00 56 66 15 98
21.875689 1 0 Rx d 8 00 00 00 00 57 32 15 CC
22.076798 1 0 Rx d 8 00 00 00 00 58 00 16 00
22.278040 1 0 Rx d 8 00 00 00 00 58 CC 16 32
22.479430 1 0 Rx d 8 00 00 00 00 59 98 16 66
22.679827 1 0 Rx d 8 00 00 00 00 5A 66 16 98
22.880811 1 0 Rx d 8 00 00 00 00 5B 32 16 CC
23.081770 1 0 Rx d 8 00 00 00 00 5C 00 17 00
23.281961 1 0 Rx d 8 00 00 00 00 5C CC 17 32
23.482218 1 0 Rx d 8 00 00 00 00 5D 98 17 66
23.682829 1 0 Rx d 8 00 00 00 00 5E 66 17 98
23.883485 1 0 Rx d 8 00 00 00 00 5F 32 17 CC
24.084356 1 0 Rx d 8 00 00 00 00 60 00 18 00
24.285369 1 0 Rx d 8 00 00 00 00 60 CC 16 00
24.485694 1 0 Rx d 8 00 00 00 00 61 98 14 00
24.685859 1 0 Rx d 8 00 00 00 00 62 66 12 00
24.886357 1 0 Rx d 8 00 00 00 00 63 32 10 00
25.087476 1 0 Rx d 8 00 00 00 00 64 00 0E 00
25.287822 1 0 Rx d 8 00 00 00 00 64 CC 0C 00
25.488562 1 0 Rx d 8 00 00 00 00 65 98 0A 00
25.688999 1 0 Rx d 8 00 00 00 00 66 66 08 00
25.889585 1 0 Rx d 8 00 00 00 00 67 32 06 00
26.091147 1 0 Rx d 8 00 00 00 00 68 00 04 00
26.292392 1 0 Rx d 8 00 00 00 00 68 CC 02 00
26.492961 1 0 Rx d 8 00 00 00 00 69 98 00 00
26.693929 1 0 Rx d 8 00 00 00 00 6A 66 00 32
26.895003 1 0 Rx d 8 00 00 00 00 6B 32 00 66
27.095334 1 0 Rx d 8 00 00 00 00 6C 00 00 98
27.295680 1 0 Rx d 8 00 00 00 00 6C CC 00 CC
27.497172 1 0 Rx d 8 00 00 00 00 6D 98 01 00
27.698339 1 0 Rx d 8 00 00 00 00 6E 66 01 32
27.898922 1 0 Rx d 8 00 00 00 00 6F 32 01 66
28.099435 1 0 Rx d 8 00 00 00 00 70 00 01 98
28.299733 1 0 Rx d 8 00 00 00 00 70 CC 01 CC
28.499895 1 0 Rx d 8 00 00 00 00 71 98 02 00
28.700373 1 0 Rx d 8 00 00 00 00 72 66 02 32
28.901284 1 0 Rx d 8 00 00 00 00 73 32 02 66
29.102050 1 0 Rx d 8 00 00 00 00 74 00 02 98
29.303311 1 0 Rx d 8 00 00 00 00 74 CC 02 CC
29.503625 1 0 Rx d 8 00 00 00 00 75 98 03 00
29.703906 1 0 Rx d 8 00 00 00 00 76 66 03 32
29.904220 1 0 Rx d 8 00 00 00 00 77 32 03 66
30.104471 1 0 Rx d 8 00 00 00 00 78 00 03 98
30.305439 1 0 Rx d 8 00 00 00 00 78 CC 03 CC
30.505755 1 0 Rx d 8 00 00 00 00 79 98 04 00
30.706401 1 0 Rx d 8 00 00 00 00 7A 66 04 32
30.907561 1 0 Rx d 8 00 00 00 00 7B 32 04 66
31.107834 1 0 Rx d 8 00 00 00 00 7C 00 04 98
31.308727 1 0 Rx d 8 00 00 00 00 7C CC 04 CC
31.509748 1 0 Rx d 8 00 00 00 00 7D 98 04 FE
31.710425 1 0 Rx d 8 00 00 00 00 7E 66 05 32
31.910680 1 0 Rx d 8 00 00 00 00 7F 32 05 66
32.111808 1 0 Rx d 8 00 00 00 00 7F FE 05 98
32.312183 1 0 Rx d 8 00 00 00 00 7F 32 05 CC
32.512689 1 0 Rx d 8 00 00 00 00 7E 66 05 FE
32.713234 1 0 Rx d 8 00 00 00 00 7D 98 06 32
32.914537 1 0 Rx d 8 00 00 00 00 7C CC 06 66
33.114779 1 0 Rx d 8 00 00 00 00 7B FE 06 98
33.315177 1 0 Rx d 8 00 00 00 00 7B 32 06 CC
33.516145 1 0 Rx d 8 00 00 00 00 7A 66 06 FE
33.717179 1 0 Rx d 8 00 00 00 00 79 98 07 32
33.918008 1 0 Rx d 8 00 00 00 00 78 CC 07 66
34.118478 1 0 Rx d 8 00 00 00 00 77 FE 07 98
34.319173 1 0 Rx d 8 00 00 00 00 77 32 07 CC
34.519476 1 0 Rx d 8 00 00 00 00 76 66 07 FE
34.720208 1 0 Rx d 8 00 00 00 00 75 98 08 32
34.920661 1 0 Rx d 8 00 00 00 00 74 CC 08 66
35.121788 1 0 Rx d 8 00 00 00 00 73 FE 08 98
35.322204 1 0 Rx d 8 00 00 00 00 73 32 08 CC
35.523025 1 0 Rx d 8 00 00 00 00 72 66 08 FE
35.723694 1 0 Rx d 8 00 00 00 00 71 98 09 32
35.924256 1 0 Rx d 8 00 00 00 00 70 CC 09 66
36.125166 1 0 Rx d 8 00 00 00 00 6F FE 09 98
36.325455 1 0 Rx d 8 00 00 00 00 6F 32 09 CC
36.526130 1 0 Rx d 8 00 00 00 00 6E 66 09 FE
36.726660 1 0 Rx d 8 00 00 00 00 6D 98 0A 32
36.927031 1 0 Rx d 8 00 00 00 00 6C CC 0A 66
37.128202 1 0 Rx d 8 00 00 00 00 6B FE 0A 98
37.328463 1 0 Rx d 8 00 00 00 00 6B 32 0A CC
37.529261 1 0 Rx d 8 00 00 00 00 6A 66 0A FE
37.730042 1 0 Rx d 8 00 00 00 00 69 98 0B 32
37.930784 1 0 Rx d 8 00 00 00 00 68 CC 0B 66
38.132083 1 0 Rx d 8 00 00 00 00 67 FE 0B 98
38.332765 1 0 Rx d 8 00 00 00 00 67 32 0B CC
38.534007 1 0 Rx d 8 00 00 00 00 66 66 0B FE
38.735096 1 0 Rx d 8 00 00 00 00 65 98 0C 32
38.935972 1 0 Rx d 8 00 00 00 00 64 CC 0C 66
39.136999 1 0 Rx d 8 00 00 00 00 63 FE 0C 98
39.337463 1 0 Rx d 8 00 00 00 00 63 32 0C CC
39.537932 1 0 Rx d 8 00 00 00 00 62 66 0C FE
39.738646 1 0 Rx d 8 00 00 00 00 61 98 0D 32
39.939300 1 0 Rx d 8 00 00 00 00 60 CC 0D 66
40.139463 1 0 Rx d 8 00 00 00 00 5F FE 0D 98
40.339825 1 0 Rx d 8 00 00 00 00 5F 32 0D CC
40.540892 1 0 Rx d 8 00 00 00 00 5E 66 0D FE
40.742804 1 0 Rx d 8 00 00 00 00 5D 98 0E 32
40.943116 1 0 Rx d 8 00 00 00 00 5C CC 0E 66
41.143827 1 0 Rx d 8 00 00 00 00 5B FE 0E 98
41.344606 1 0 Rx d 8 00 00 00 00 5B 32 0E CC
41.545645 1 0 Rx d 8 00 00 00 00 5A 66 0E FE
41.746766 1 0 Rx d 8 00 00 00 00 59 98 0F 32
41.947757 1 0 Rx d 8 00 00 00 00 58 CC 0F 66
42.148907 1 0 Rx d 8 00 00 00 00 57 FE 0F 98
42.350038 1 0 Rx d 8 00 00 00 00 57 32 0F CC
42.550890 1 0 Rx d 8 00 00 00 00 56 66 0F FE
42.752057 1 0 Rx d 8 00 00 00 00 55 98 10 32
42.953446 1 0 Rx d 8 00 00 00 00 54 CC 10 66
43.153679 1 0 Rx d 8 00 00 00 00 53 FE 10 98
43.354061 1 0 Rx d 8 00 00 00 00 53 32 10 CC
43.555097 1 0 Rx d 8 00 00 00 00 52 66 10 FE
43.755339 1 0 Rx d 8 00 00 00 00 51 98 11 32
43.955653 1 0 Rx d 8 00 00 00 00 50 CC 11 66
44.156515 1 0 Rx d 8 00 00 00 00 4F FE 11 98
44.357275 1 0 Rx d 8 00 00 00 00 4F 32 11 CC
44.557752 1 0 Rx d 8 00 00 00 00 4E 66 11 FE
44.758675 1 0 Rx d 8 00 00 00 00 4D 98 12 32
44.959208 1 0 Rx d 8 00 00 00 00 4C CC 12 66
45.159610 1 0 Rx d 8 00 00 00 00 4B FE 12 98
45.359903 1 0 Rx d 8 00 00 00 00 4B 32 12 CC
45.560465 1 0 Rx d 8 00 00 00 00 4A 66 13 00
45.761617 1 0 Rx d 8 00 00 00 00 49 98 13 32
45.961932 1 0 Rx d 8 00 00 00 00 48 CC 13 66
46.162996 1 0 Rx d 8 00 00 00 00 47 FE 13 98
46.363493 1 0 Rx d 8 00 00 00 00 47 32 13 CC
46.564408 1 0 Rx d 8 00 00 00 00 46 66 14 00
46.765361 1 0 Rx d 8 00 00 00 00 45 98 14 32
46.965804 1 0 Rx d 8 00 00 00 00 44 CC 14 66
47.166504 1 0 Rx d 8 00 00 00 00 43 FE 14 98
47.367378 1 0 Rx d 8 00 00 00 00 43 32 14 CC
47.568797 1 0 Rx d 8 00 00 00 00 42 66 15 00
47.769039 1 0 Rx d 8 00 00 00 00 41 98 15 32
47.970066 1 0 Rx d 8 00 00 00 00 40 CC 15 66
48.170896 1 0 Rx d 8 00 00 00 00 3F FE 15 98
48.371996 1 0 Rx d 8 00 00 00 00 3F 32 15 CC
48.572310 1 0 Rx d 8 00 00 00 00 3E 66 16 00
48.773330 1 0 Rx d 8 00 00 00 00 3D 98 16 32
48.975218 1 0 Rx d 8 00 00 00 00 3C CC 16 66
49.175780 1 0 Rx d 8 00 00 00 00 3B FE 16 98
49.376198 1 0 Rx d 8 00 00 00 00 3B 32 16 CC
49.577079 1 0 Rx d 8 00 00 00 00 3A 66 17 00
49.778128 1 0 Rx d 8 00 00 00 00 39 98 17 32
49.978540 1 0 Rx d 8 00 00 00 00 38 CC 17 66
50.179871 1 0 Rx d 8 00 00 00 00 37 FE 17 98
50.380088 1 0 Rx d 8 00 00 00 00 37 32 17 CC
50.580846 1 0 Rx d 8 00 00 00 00 36 66 18 00
50.781325 1 0 Rx d 8 00 00 00 00 35 98 16 00
50.982477 1 0 Rx d 8 00 00 00 00 34 CC 14 00
51.182651 1 0 Rx d 8 00 00 00 00 33 FE 12 00
51.383578 1 0 Rx d 8 00 00 00 00 33 32 10 00
51.584095 1 0 Rx d 8 00 00 00 00 32 66 0E 00
51.784794 1 0 Rx d 8 00 00 00 00 31 98 0C 00
51.985412 1 0 Rx d 8 00 00 00 00 30 CC 0A 00
52.186861 1 0 Rx d 8 00 00 00 00 2F FE 08 00
52.387832 1 0 Rx d 8 00 00 00 00 2F 32 06 00
52.588288 1 0 Rx d 8 00 00 00 00 2E 66 04 00
52.789157 1 0 Rx d 8 00 00 00 00 2D 98 02 00
52.989942 1 0 Rx d 8 00 00 00 00 2C CC 00 00
53.190327 1 0 Rx d 8 00 00 00 00 2B FE 00 32
53.391588 1 0 Rx d 8 00 00 00 00 2B 32 00 66
53.592249 1 0 Rx d 8 00 00 00 00 2A 66 00 98
53.792386 1 0 Rx d 8 00 00 00 00 29 98 00 CC
53.992968 1 0 Rx d 8 00 00 00 00 28 CC 01 00
54.193367 1 0 Rx d 8 00 00 00 00 27 FE 01 32
54.394716 1 0 Rx d 8 00 00 00 00 27 32 01 66
54.595105 1 0 Rx d 8 00 00 00 00 26 66 01 98
54.795731 1 0 Rx d 8 00 00 00 00 25 98 01 CC
54.996284 1 0 Rx d 8 00 00 00 00 24 CC 02 00
55.197576 1 0 Rx d 8 00 00 00 00 23 FE 02 32
55.398054 1 0 Rx d 8 00 00 00 00 23 32 02 66
55.598364 1 0 Rx d 8 00 00 00 00 22 66 02 98
55.798965 1 0 Rx d 8 00 00 00 00 21 98 02 CC
55.999265 1 0 Rx d 8 00 00 00 00 20 CC 03 00
56.199561 1 0 Rx d 8 00 00 00 00 1F FE 03 32
56.400268 1 0 Rx d 8 00 00 00 00 1F 32 03 66
56.601059 1 0 Rx d 8 00 00 00 00 1E 66 03 98
56.801284 1 0 Rx d 8 00 00 00 00 1D 98 03 CC
57.002356 1 0 Rx d 8 00 00 00 00 1C CC 04 00
57.202816 1 0 Rx d 8 00 00 00 00 1B FE 04 32
57.404465 1 0 Rx d 8 00 00 00 00 1B 32 04 66
57.604978 1 0 Rx d 8 00 00 00 00 1A 66 04 98
57.805539 1 0 Rx d 8 00 00 00 00 19 98 04 CC
58.006555 1 0 Rx d 8 00 00 00 00 18 CC 04 FE
58.207292 1 0 Rx d 8 00 00 00 00 17 FE 05 32
58.407613 1 0 Rx d 8 00 00 00 00 17 32 05 66
58.607932 1 0 Rx d 8 00 00 00 00 16 66 05 98
58.808839 1 0 Rx d 8 00 00 00 00 15 98 05 CC
59.009580 1 0 Rx d 8 00 00 00 00 14 CC 05 FE
59.210003 1 0 Rx d 8 00 00 00 00 13 FE 06 32
59.410177 1 0 Rx d 8 00 00 00 00 13 32 06 66
59.610613 1 0 Rx d 8 00 00 00 00 12 66 06 98
59.811194 1 0 Rx d 8 00 00 00 00 11 98 06 CC
60.012120 1 0 Rx d 8 00 00 00 00 10 CC 06 FE
60.212784 1 0 Rx d 8 00 00 00 00 0F FE 07 32
60.413841 1 0 Rx d 8 00 00 00 00 0F 32 07 66
60.614435 1 0 Rx d 8 00 00 00 00 0E 66 07 98
60.815231 1 0 Rx d 8 00 00 00 00 0D 98 07 CC
61.015910 1 0 Rx d 8 00 00 00 00 0C CC 07 FE
61.216506 1 0 Rx d 8 00 00 00 00 0B FE 08 32
61.416722 1 0 Rx d 8 00 00 00 00 0B 32 08 66
61.617300 1 0 Rx d 8 00 00 00 00 0A 66 08 98
61.817810 1 0 Rx d 8 00 00 00 00 09 98 08 CC
62.018343 1 0 Rx d 8 00 00 00 00 08 CC 08 FE
62.218622 1 0 Rx d 8 00 00 00 00 07 FE 09 32
62.419551 1 0 Rx d 8 00 00 00 00 07 32 09 66
62.620102 1 0 Rx d 8 00 00 00 00 06 66 09 98
62.821311 1 0 Rx d 8 00 00 00 00 05 98 09 CC
63.021686 1 0 Rx d 8 00 00 00 00 04 CC 09 FE
63.222351 1 0 Rx d 8 00 00 00 00 03 FE 0A 32
63.422926 1 0 Rx d 8 00 00 00 00 03 32 0A 66
63.623731 1 0 Rx d 8 00 00 00 00 02 66 0A 98
63.824543 1 0 Rx d 8 00 00 00 00 01 98 0A CC
64.025549 1 0 Rx d 8 00 00 00 00 00 CC 0A FE
64.226680 1 0 Rx d 8 00 00 00 00 00 00 0B 32
64.427567 1 0 Rx d 8 00 00 00 00 FF 34 0B 66
64.628603 1 0 Rx d 8 00 00 00 00 FE 68 0B 98
64.829281 1 0 Rx d 8 00 00 00 00 FD 9A 0B CC
65.029458 1 0 Rx d 8 00 00 00 00 FC CE 0B FE
65.230602 1 0 Rx d 8 00 00 00 00 FC 00 0C 32
65.431146 1 0 Rx d 8 00 00 00 00 FB 34 0C 66
65.631565 1 0 Rx d 8 00 00 00 00 FA 68 0C 98
65.832193 1 0 Rx d 8 00 00 00 00 F9 9A 0C CC
66.033275 1 0 Rx d 8 00 00 00 00 F8 CE 0C FE
66.233478 1 0 Rx d 8 00 00 00 00 F8 00 0D 32
66.433824 1 0 Rx d 8 00 00 00 00 F7 34 0D 66
66.634036 1 0 Rx d 8 00 00 00 00 F6 68 0D 98
66.834443 1 0 Rx d 8 00 00 00 00 F5 9A 0D CC
67.035303 1 0 Rx d 8 00 00 00 00 F4 CE 0D FE
67.235911 1 0 Rx d 8 00 00 00 00 F4 00 0E 32
67.436246 1 0 Rx d 8 00 00 00 00 F3 34 0E 66
67.636459 1 0 Rx d 8 00 00 00 00 F2 68 0E 98
67.837559 1 0 Rx d 8 00 00 00 00 F1 9A 0E CC
68.038290 1 0 Rx d 8 00 00 00 00 F0 CE 0E FE
68.239218 1 0 Rx d 8 00 00 00 00 F0 00 0F 32
68.439848 1 0 Rx d 8 00 00 00 00 EF 34 0F 66
68.640949 1 0 Rx d 8 00 00 00 00 EE 68 0F 98
68.841707 1 0 Rx d 8 00 00 00 00 ED 9A 0F CC
69.042367 1 0 Rx d 8 00 00 00 00 EC CE 0F FE
69.242794 1 0 Rx d 8 00 00 00 00 EC 00 10 32
69.444186 1 0 Rx d 8 00 00 00 00 EB 34 10 66
69.645299 1 0 Rx d 8 00 00 00 00 EA 68 10 98
69.845907 1 0 Rx d 8 00 00 00 00 E9 9A 10 CC
70.046190 1 0 Rx d 8 00 00 00 00 E8 CE 10 FE
70.247387 1 0 Rx d 8 00 00 00 00 E8 00 11 32
70.448524 1 0 Rx d 8 00 00 00 00 E7 34 11 66
70.649526 1 0 Rx d 8 00 00 00 00 E6 68 11 98
70.850244 1 0 Rx d 8 00 00 00 00 E5 9A 11 CC
71.050608 1 0 Rx d 8 00 00 00 00 E4 CE 11 FE
71.250850 1 0 Rx d 8 00 00 00 00 E4 00 12 32
71.451347 1 0 Rx d 8 00 00 00 00 E3 34 12 66
71.652633 1 0 Rx d 8 00 00 00 00 E2 68 12 98
71.853189 1 0 Rx d 8 00 00 00 00 E1 9A 12 CC
72.053983 1 0 Rx d 8 00 00 00 00 E0 CE 13 00
72.254639 1 0 Rx d 8 00 00 00 00 E0 00 13 32
72.455122 1 0 Rx d 8 00 00 00 00 DF 34 13 66
72.655692 1 0 Rx d 8 00 00 00 00 DE 68 13 98
72.856575 1 0 Rx d 8 00 00 00 00 DD 9A 13 CC
73.057111 1 0 Rx d 8 00 00 00 00 DC CE 14 00
73.257433 1 0 Rx d 8 00 00 00 00 DC 00 14 32
73.458035 1 0 Rx d 8 00 00 00 00 DB 34 14 66
73.658563 1 0 Rx d 8 00 00 00 00 DA 68 14 98
73.858949 1 0 Rx d 8 00 00 00 00 D9 9A 14 CC
74.059429 1 0 Rx d 8 00 00 00 00 D8 CE 15 00
74.259956 1 0 Rx d 8 00 00 00 00 D8 00 15 32
74.460450 1 0 Rx d 8 00 00 00 00 D7 34 15 66
74.661020 1 0 Rx d 8 00 00 00 00 D6 68 15 98
74.861275 1 0 Rx d 8 00 00 00 00 D5 9A 15 CC
75.061860 1 0 Rx d 8 00 00 00 00 D4 CE 16 00
75.262959 1 0 Rx d 8 00 00 00 00 D4 00 16 32
75.463897 1 0 Rx d 8 00 00 00 00 D3 34 16 66
75.664448 1 0 Rx d 8 00 00 00 00 D2 68 16 98
75.864638 1 0 Rx d 8 00 00 00 00 D1 9A 16 CC
76.065108 1 0 Rx d 8 00 00 00 00 D0 CE 17 00
76.265941 1 0 Rx d 8 00 00 00 00 D0 00 17 32
76.466668 1 0 Rx d 8 00 00 00 00 CF 34 17 66
76.667414 1 0 Rx d 8 00 00 00 00 CE 68 17 98
76.867975 1 0 Rx d 8 00 00 00 00 CD 9A 17 CC
77.068637 1 0 Rx d 8 00 00 00 00 CC CE 18 00
77.269838 1 0 Rx d 8 00 00 00 00 CC 00 16 00
77.471315 1 0 Rx d 8 00 00 00 00 CB 34 14 00
77.672213 1 0 Rx d 8 00 00 00 00 CA 68 12 00
77.873438 1 0 Rx d 8 00 00 00 00 C9 9A 10 00
78.073784 1 0 Rx d 8 00 00 00 00 C8 CE 0E 00
78.274128 1 0 Rx d 8 00 00 00 00 C8 00 0C 00
78.474507 1 0 Rx d 8 00 00 00 00 C7 34 0A 00
78.674821 1 0 Rx d 8 00 00 00 00 C6 68 08 00
78.876104 1 0 Rx d 8 00 00 00 00 C5 9A 06 00
79.076896 1 0 Rx d 8 00 00 00 00 C4 CE 04 00
79.277801 1 0 Rx d 8 00 00 00 00 C4 00 02 00
79.478570 1 0 Rx d 8 00 00 00 00 C3 34 00 00
79.679197 1 0 Rx d 8 00 00 00 00 C2 68 00 32
79.880361 1 0 Rx d 8 00 00 00 00 C1 9A 00 66
80.080813 1 0 Rx d 8 00 00 00 00 C0 CE 00 98
80.281318 1 0 Rx d 8 00 00 00 00 C0 00 00 CC
80.482751 1 0 Rx d 8 00 00 00 00 BF 34 01 00
80.682954 1 0 Rx d 8 00 00 00 00 BE 68 01 32
80.883925 1 0 Rx d 8 00 00 00 00 BD 9A 01 66
81.084430 1 0 Rx d 8 00 00 00 00 BC CE 01 98
81.285344 1 0 Rx d 8 00 00 00 00 BC 00 01 CC
81.485800 1 0 Rx d 8 00 00 00 00 BB 34 02 00
81.686289 1 0 Rx d 8 00 00 00 00 BA 68 02 32
81.887113 1 0 Rx d 8 00 00 00 00 B9 9A 02 66
82.088359 1 0 Rx d 8 00 00 00 00 B8 CE 02 98
82.288829 1 0 Rx d 8 00 00 00 00 B8 00 02 CC
82.490045 1 0 Rx d 8 00 00 00 00 B7 34 03 00
82.690540 1 0 Rx d 8 00 00 00 00 B6 68 03 32
82.890872 1 0 Rx d 8 00 00 00 00 B5 9A 03 66
83.091725 1 0 Rx d 8 00 00 00 00 B4 CE 03 98
83.292335 1 0 Rx d 8 00 00 00 00 B4 00 03 CC
83.493168 1 0 Rx d 8 00 00 00 00 B3 34 04 00
83.694457 1 0 Rx d 8 00 00 00 00 B2 68 04 32
83.894713 1 0 Rx d 8 00 00 00 00 B1 9A 04 66
84.095654 1 0 Rx d 8 00 00 00 00 B0 CE 04 98
84.296759 1 0 Rx d 8 00 00 00 00 B0 00 04 CC
84.497565 1 0 Rx d 8 00 00 00 00 AF 34 04 FE
84.697811 1 0 Rx d 8 00 00 00 00 AE 68 05 32
84.898319 1 0 Rx d 8 00 00 00 00 AD 9A 05 66
85.099139 1 0 Rx d 8 00 00 00 00 AC CE 05 98
85.299414 1 0 Rx d 8 00 00 00 00 AC 00 05 CC
85.500064 1 0 Rx d 8 00 00 00 00 AB 34 05 FE
85.700760 1 0 Rx d 8 00 00 00 00 AA 68 06 32
85.901271 1 0 Rx d 8 00 00 00 00 A9 9A 06 66
86.102122 1 0 Rx d 8 00 00 00 00 A8 CE 06 98
86.303033 1 0 Rx d 8 00 00 00 00 A8 00 06 CC
86.504461 1 0 Rx d 8 00 00 00 00 A7 34 06 FE
86.705469 1 0 Rx d 8 00 00 00 00 A6 68 07 32
86.906178 1 0 Rx d 8 00 00 00 00 A5 9A 07 66
87.106475 1 0 Rx d 8 00 00 00 00 A4 CE 07 98
87.307347 1 0 Rx d 8 00 00 00 00 A4 00 07 CC
87.507818 1 0 Rx d 8 00 00 00 00 A3 34 07 FE
87.708986 1 0 Rx d 8 00 00 00 00 A2 68 08 32
87.909492 1 0 Rx d 8 00 00 00 00 A1 9A 08 66
88.110633 1 0 Rx d 8 00 00 00 00 A0 CE 08 98
88.311199 1 0 Rx d 8 00 00 00 00 A0 00 08 CC
88.512430 1 0 Rx d 8 00 00 00 00 9F 34 08 FE
88.713268 1 0 Rx d 8 00 00 00 00 9E 68 09 32
88.913936 1 0 Rx d 8 00 00 00 00 9D 9A 09 66
89.115265 1 0 Rx d 8 00 00 00 00 9C CE 09 98
89.316255 1 0 Rx d 8 00 00 00 00 9C 00 09 CC
89.516812 1 0 Rx d 8 00 00 00 00 9B 34 09 FE
89.717160 1 0 Rx d 8 00 00 00 00 9A 68 0A 32
89.918334 1 0 Rx d 8 00 00 00 00 99 9A 0A 66
90.119362 1 0 Rx d 8 00 00 00 00 98 CE 0A 98
90.319783 1 0 Rx d 8 00 00 00 00 98 00 0A CC
90.520010 1 0 Rx d 8 00 00 00 00 97 34 0A FE
90.720804 1 0 Rx d 8 00 00 00 00 96 68 0B 32
90.921045 1 0 Rx d 8 00 00 00 00 95 9A 0B 66
91.122521 1 0 Rx d 8 00 00 00 00 94 CE 0B 98
91.323248 1 0 Rx d 8 00 00 00 00 94 00 0B CC
91.523740 1 0 Rx d 8 00 00 00 00 93 34 0B FE
91.724270 1 0 Rx d 8 00 00 00 00 92 68 0C 32
91.924495 1 0 Rx d 8 00 00 00 00 91 9A 0C 66
92.125094 1 0 Rx d 8 00 00 00 00 90 CE 0C 98
92.325463 1 0 Rx d 8 00 00 00 00 90 00 0C CC
92.526589 1 0 Rx d 8 00 00 00 00 8F 34 0C FE
92.727359 1 0 Rx d 8 00 00 00 00 8E 68 0D 32
92.927951 1 0 Rx d 8 00 00 00 00 8D 9A 0D 66
93.128612 1 0 Rx d 8 00 00 00 00 8C CE 0D 98
93.329125 1 0 Rx d 8 00 00 00 00 8C 00 0D CC
93.529656 1 0 Rx d 8 00 00 00 00 8B 34 0D FE
93.729954 1 0 Rx d 8 00 00 00 00 8A 68 0E 32
93.930485 1 0 Rx d 8 00 00 00 00 89 9A 0E 66
94.131667 1 0 Rx d 8 00 00 00 00 88 CE 0E 98
94.332592 1 0 Rx d 8 00 00 00 00 88 00 0E CC
94.534376 1 0 Rx d 8 00 00 00 00 87 34 0E FE
94.735010 1 0 Rx d 8 00 00 00 00 86 68 0F 32
94.935150 1 0 Rx d 8 00 00 00 00 85 9A 0F 66
95.136367 1 0 Rx d 8 00 00 00 00 84 CE 0F 98
95.336759 1 0 Rx d 8 00 00 00 00 84 00 0F CC
95.538112 1 0 Rx d 8 00 00 00 00 83 34 0F FE
95.738250 1 0 Rx d 8 00 00 00 00 82 68 10 32
95.938448 1 0 Rx d 8 00 00 00 00 81 9A 10 66
96.138702 1 0 Rx d 8 00 00 00 00 80 CE 10 98
96.339017 1 0 Rx d 8 00 00 00 00 80 00 10 CC
96.539273 1 0 Rx d 8 00 00 00 00 80 CE 10 FE
96.739667 1 0 Rx d 8 00 00 00 00 81 9A 11 32
96.940239 1 0 Rx d 8 00 00 00 00 82 68 11 66
97.141181 1 0 Rx d 8 00 00 00 00 83 34 11 98
97.341565 1 0 Rx d 8 00 00 00 00 84 02 11 CC
97.542252 1 0 Rx d 8 00 00 00 00 84 CE 11 FE
97.743455 1 0 Rx d 8 00 00 00 00 85 9A 12 32
97.944065 1 0 Rx d 8 00 00 00 00 86 68 12 66
98.144313 1 0 Rx d 8 00 00 00 00 87 34 12 98
98.345247 1 0 Rx d 8 00 00 00 00 88 02 12 CC
98.545510 1 0 Rx d 8 00 00 00 00 88 CE 13 00
98.746514 1 0 Rx d 8 00 00 00 00 89 9A 13 32
98.946817 1 0 Rx d 8 00 00 00 00 8A 68 13 66
99.147276 1 0 Rx d 8 00 00 00 00 8B 34 13 98
99.348008 1 0 Rx d 8 00 00 00 00 8C 02 13 CC
99.548748 1 0 Rx d 8 00 00 00 00 8C CE 14 00
99.749477 1 0 Rx d 8 00 00 00 00 8D 9A 14 32
99.950542 1 0 Rx d 8 00 00 00 00 8E 68 14 66
100.150895 1 0 Rx d 8 00 00 00 00 8F 34 14 98
100.351372 1 0 Rx d 8 00 00 00 00 90 02 14 CC
100.551608 1 0 Rx d 8 00 00 00 00 90 CE 15 00
100.751884 1 0 Rx d 8 00 00 00 00 91 9A 15 32
100.953095 1 0 Rx d 8 00 00 00 00 92 68 15 66
101.154105 1 0 Rx d 8 00 00 00 00 93 34 15 98
101.355479 1 0 Rx d 8 00 00 00 00 94 02 15 CC
101.556655 1 0 Rx d 8 00 00 00 00 94 CE 16 00
101.758337 1 0 Rx d 8 00 00 00 00 95 9A 16 32
101.959398 1 0 Rx d 8 00 00 00 00 96 68 16 66
102.160166 1 0 Rx d 8 00 00 00 00 97 34 16 98
102.361893 1 0 Rx d 8 00 00 00 00 98 02 16 CC
102.562712 1 0 Rx d 8 00 00 00 00 98 CE 17 00
102.763470 1 0 Rx d 8 00 00 00 00 99 9A 17 32
102.964242 1 0 Rx d 8 00 00 00 00 9A 68 17 66
103.164462 1 0 Rx d 8 00 00 00 00 9B 34 17 98
103.365670 1 0 Rx d 8 00 00 00 00 9C 02 17 CC
103.566984 1 0 Rx d 8 00 00 00 00 9C CE 18 00
103.767491 1 0 Rx d 8 00 00 00 00 9D 9A 16 00
103.968187 1 0 Rx d 8 00 00 00 00 9E 68 14 00
104.169019 1 0 Rx d 8 00 00 00 00 9F 34 12 00
104.369584 1 0 Rx d 8 00 00 00 00 A0 02 10 00
104.570622 1 0 Rx d 8 00 00 00 00 A0 CE 0E 00
104.770875 1 0 Rx d 8 00 00 00 00 A1 9A 0C 00
104.971893 1 0 Rx d 8 00 00 00 00 A2 68 0A 00
105.172481 1 0 Rx d 8 00 00 00 00 A3 34 08 00
105.373330 1 0 Rx d 8 00 00 00 00 A4 02 06 00
105.573806 1 0 Rx d 8 00 00 00 00 A4 CE 04 00
105.774099 1 0 Rx d 8 00 00 00 00 A5 9A 02 00
105.974447 1 0 Rx d 8 00 00 00 00 A6 68 00 00
106.175002 1 0 Rx d 8 00 00 00 00 A7 34 00 32
106.375492 1 0 Rx d 8 00 00 00 00 A8 02 00 66
106.576183 1 0 Rx d 8 00 00 00 00 A8 CE 00 98
106.776593 1 0 Rx d 8 00 00 00 00 A9 9A 00 CC
106.977149 1 0 Rx d 8 00 00 00 00 AA 68 01 00
107.177741 1 0 Rx d 8 00 00 00 00 AB 34 01 32
107.378029 1 0 Rx d 8 00 00 00 00 AC 02 01 66
107.578972 1 0 Rx d 8 00 00 00 00 AC CE 01 98
107.779803 1 0 Rx d 8 00 00 00 00 AD 9A 01 CC
107.980027 1 0 Rx d 8 00 00 00 00 AE 68 02 00
108.180959 1 0 Rx d 8 00 00 00 00 AF 34 02 32
108.381257 1 0 Rx d 8 00 00 00 00 B0 02 02 66
108.581572 1 0 Rx d 8 00 00 00 00 B0 CE 02 98
108.782674 1 0 Rx d 8 00 00 00 00 B1 9A 02 CC
108.983284 1 0 Rx d 8 00 00 00 00 B2 68 03 00
109.184365 1 0 Rx d 8 00 00 00 00 B3 34 03 32
109.385521 1 0 Rx d 8 00 00 00 00 B4 02 03 66
109.586636 1 0 Rx d 8 00 00 00 00 B4 CE 03 98
109.787259 1 0 Rx d 8 00 00 00 00 B5 9A 03 CC
109.988178 1 0 Rx d 8 00 00 00 00 B6 68 04 00
110.189275 1 0 Rx d 8 00 00 00 00 B7 34 04 32
110.389596 1 0 Rx d 8 00 00 00 00 B8 02 04 66
110.590122 1 0 Rx d 8 00 00 00 00 B8 CE 04 98
110.791196 1 0 Rx d 8 00 00 00 00 B9 9A 04 CC
110.991450 1 0 Rx d 8 00 00 00 00 BA 68 04 FE
111.192134 1 0 Rx d 8 00 00 00 00 BB 34 05 32
111.392307 1 0 Rx d 8 00 00 00 00 BC 02 05 66
111.593039 1 0 Rx d 8 00 00 00 00 BC CE 05 98
111.793374 1 0 Rx d 8 00 00 00 00 BD 9A 05 CC
111.994395 1 0 Rx d 8 00 00 00 00 BE 68 05 FE
112.194655 1 0 Rx d 8 00 00 00 00 BF 34 06 32
112.395403 1 0 Rx d 8 00 00 00 00 C0 02 06 66
112.596067 1 0 Rx d 8 00 00 00 00 C0 CE 06 98
112.797115 1 0 Rx d 8 00 00 00 00 C1 9A 06 CC
112.998086 1 0 Rx d 8 00 00 00 00 C2 68 06 FE
113.198865 1 0 Rx d 8 00 00 00 00 C3 34 07 32
113.400050 1 0 Rx d 8 00 00 00 00 C4 02 07 66
113.600803 1 0 Rx d 8 00 00 00 00 C4 CE 07 98
113.801155 1 0 Rx d 8 00 00 00 00 C5 9A 07 CC
114.001391 1 0 Rx d 8 00 00 00 00 C6 68 07 FE
114.201901 1 0 Rx d 8 00 00 00 00 C7 34 08 32
114.402790 1 0 Rx d 8 00 00 00 00 C8 02 08 66
114.603954 1 0 Rx d 8 00 00 00 00 C8 CE 08 98
114.804511 1 0 Rx d 8 00 00 00 00 C9 9A 08 CC
115.005461 1 0 Rx d 8 00 00 00 00 CA 68 08 FE
115.205821 1 0 Rx d 8 00 00 00 00 CB 34 09 32
115.406250 1 0 Rx d 8 00 00 00 00 CC 02 09 66
115.607421 1 0 Rx d 8 00 00 00 00 CC CE 09 98
115.808089 1 0 Rx d 8 00 00 00 00 CD 9A 09 CC
116.009056 1 0 Rx d 8 00 00 00 00 CE 68 09 FE
116.209651 1 0 Rx d 8 00 00 00 00 CF 34 0A 32
116.410167 1 0 Rx d 8 00 00 00 00 D0 02 0A 66
116.611063 1 0 Rx d 8 00 00 00 00 D0 CE 0A 98
116.811256 1 0 Rx d 8 00 00 00 00 D1 9A 0A CC
117.012597 1 0 Rx d 8 00 00 00 00 D2 68 0A FE
117.213027 1 0 Rx d 8 00 00 00 00 D3 34 0B 32
117.413256 1 0 Rx d 8 00 00 00 00 D4 02 0B 66
117.614268 1 0 Rx d 8 00 00 00 00 D4 CE 0B 98
117.814815 1 0 Rx d 8 00 00 00 00 D5 9A 0B CC
118.015806 1 0 Rx d 8 00 00 00 00 D6 68 0B FE
118.216912 1 0 Rx d 8 00 00 00 00 D7 34 0C 32
118.418089 1 0 Rx d 8 00 00 00 00 D8 02 0C 66
118.618550 1 0 Rx d 8 00 00 00 00 D8 CE 0C 98
118.818990 1 0 Rx d 8 00 00 00 00 D9 9A 0C CC
119.019524 1 0 Rx d 8 00 00 00 00 DA 68 0C FE
119.220232 1 0 Rx d 8 00 00 00 00 DB 34 0D 32
119.420674 1 0 Rx d 8 00 00 00 00 DC 02 0D 66
119.621843 1 0 Rx d 8 00 00 00 00 DC CE 0D 98
119.822228 1 0 Rx d 8 00 00 00 00 DD 9A 0D CC
120.022790 1 0 Rx d 8 00 00 00 00 DE 68 0D FE
120.223192 1 0 Rx d 8 00 00 00 00 DF 34 0E 32
120.423809 1 0 Rx d 8 00 00 00 00 E0 02 0E 66
120.624120 1 0 Rx d 8 00 00 00 00 E0 CE 0E 98
120.824613 1 0 Rx d 8 00 00 00 00 E1 9A 0E CC
121.025275 1 0 Rx d 8 00 00 00 00 E2 68 0E FE
121.226319 1 0 Rx d 8 00 00 00 00 E3 34 0F 32
121.426558 1 0 Rx d 8 00 00 00 00 E4 02 0F 66
121.626928 1 0 Rx d 8 00 00 00 00 E4 CE 0F 98
121.828060 1 0 Rx d 8 00 00 00 00 E5 9A 0F CC
122.028432 1 0 Rx d 8 00 00 00 00 E6 68 0F FE
122.229625 1 0 Rx d 8 00 00 00 00 E7 34 10 32
122.430282 1 0 Rx d 8 00 00 00 00 E8 02 10 66
122.631873 1 0 Rx d 8 00 00 00 00 E8 CE 10 98
122.832576 1 0 Rx d 8 00 00 00 00 E9 9A 10 CC
123.033001 1 0 Rx d 8 00 00 00 00 EA 68 10 FE
123.234495 1 0 Rx d 8 00 00 00 00 EB 34 11 32
123.435161 1 0 Rx d 8 00 00 00 00 EC 02 11 66
123.635467 1 0 Rx d 8 00 00 00 00 EC CE 11 98
123.835958 1 0 Rx d 8 00 00 00 00 ED 9A 11 CC
124.036727 1 0 Rx d 8 00 00 00 00 EE 68 11 FE
124.237496 1 0 Rx d 8 00 00 00 00 EF 34 12 32
124.438549 1 0 Rx d 8 00 00 00 00 F0 02 12 66
124.639374 1 0 Rx d 8 00 00 00 00 F0 CE 12 98
124.840097 1 0 Rx d 8 00 00 00 00 F1 9A 12 CC
125.041013 1 0 Rx d 8 00 00 00 00 F2 68 13 00
125.241904 1 0 Rx d 8 00 00 00 00 F3 34 13 32
125.442917 1 0 Rx d 8 00 00 00 00 F4 02 13 66
125.643483 1 0 Rx d 8 00 00 00 00 F4 CE 13 98
125.843622 1 0 Rx d 8 00 00 00 00 F5 9A 13 CC
126.044017 1 0 Rx d 8 00 00 00 00 F6 68 14 00
126.244416 1 0 Rx d 8 00 00 00 00 F7 34 14 32
126.445959 1 0 Rx d 8 00 00 00 00 F8 02 14 66
126.646576 1 0 Rx d 8 00 00 00 00 F8 CE 14 98
126.847412 1 0 Rx d 8 00 00 00 00 F9 9A 14 CC
127.048014 1 0 Rx d 8 00 00 00 00 FA 68 15 00
127.248629 1 0 Rx d 8 00 00 00 00 FB 34 15 32
127.449846 1 0 Rx d 8 00 00 00 00 FC 02 15 66
127.650202 1 0 Rx d 8 00 00 00 00 FC CE 15 98
127.851016 1 0 Rx d 8 00 00 00 00 FD 9A 15 CC
128.051902 1 0 Rx d 8 00 00 00 00 FE 68 16 00
128.252600 1 0 Rx d 8 00 00 00 00 FF 34 16 32
128.453022 1 0 Rx d 8 00 00 00 00 00 00 16 66
128.654185 1 0 Rx d 8 00 00 00 00 00 CC 16 98
128.854959 1 0 Rx d 8 00 00 00 00 01 98 16 CC
129.055530 1 0 Rx d 8 00 00 00 00 02 66 17 00
129.256566 1 0 Rx d 8 00 00 00 00 03 32 17 32
129.457080 1 0 Rx d 8 00 00 00 00 04 00 17 66
129.657467 1 0 Rx d 8 00 00 00 00 04 CC 17 98
129.857955 1 0 Rx d 8 00 00 00 00 05 98 17 CC
130.059113 1 0 Rx d 8 00 00 00 00 06 66 18 00
130.259252 1 0 Rx d 8 00 00 00 00 07 32 16 00
130.459873 1 0 Rx d 8 00 00 00 00 08 00 14 00
130.660599 1 0 Rx d 8 00 00 00 00 08 CC 12 00
130.861485 1 0 Rx d 8 00 00 00 00 09 98 10 00
131.062073 1 0 Rx d 8 00 00 00 00 0A 66 0E 00
131.262526 1 0 Rx d 8 00 00 00 00 0B 32 0C 00
131.462733 1 0 Rx d 8 00 00 00 00 0C 00 0A 00
131.663177 1 0 Rx d 8 00 00 00 00 0C CC 08 00
131.863776 1 0 Rx d 8 00 00 00 00 0D 98 06 00
132.064142 1 0 Rx d 8 00 00 00 00 0E 66 04 00
132.264373 1 0 Rx d 8 00 00 00 00 0F 32 02 00
132.464682 1 0 Rx d 8 00 00 00 00 10 00 00 00
132.665303 1 0 Rx d 8 00 00 00 00 10 CC 00 32
132.866158 1 0 Rx d 8 00 00 00 00 11 98 00 66
133.067404 1 0 Rx d 8 00 00 00 00 12 66 00 98
133.267706 1 0 Rx d 8 00 00 00 00 13 32 00 CC
133.468282 1 0 Rx d 8 00 00 00 00 14 00 01 00
133.668586 1 0 Rx d 8 00 00 00 00 14 CC 01 32
133.869893 1 0 Rx d 8 00 00 00 00 15 98 01 66
134.071618 1 0 Rx d 8 00 00 00 00 16 66 01 98
134.271874 1 0 Rx d 8 00 00 00 00 17 32 01 CC
134.472741 1 0 Rx d 8 00 00 00 00 18 00 02 00
134.673589 1 0 Rx d 8 00 00 00 00 18 CC 02 32
134.873876 1 0 Rx d 8 00 00 00 00 19 98 02 66
135.074141 1 0 Rx d 8 00 00 00 00 1A 66 02 98
135.275159 1 0 Rx d 8 00 00 00 00 1B 32 02 CC
135.475463 1 0 Rx d 8 00 00 00 00 1C 00 03 00
135.676395 1 0 Rx d 8 00 00 00 00 1C CC 03 32
135.876701 1 0 Rx d 8 00 00 00 00 1D 98 03 66
136.077738 1 0 Rx d 8 00 00 00 00 1E 66 03 98
136.278293 1 0 Rx d 8 00 00 00 00 1F 32 03 CC
136.479223 1 0 Rx d 8 00 00 00 00 20 00 04 00
136.680161 1 0 Rx d 8 00 00 00 00 20 CC 04 32
136.881016 1 0 Rx d 8 00 00 00 00 21 98 04 66
137.081840 1 0 Rx d 8 00 00 00 00 22 66 04 98
137.282072 1 0 Rx d 8 00 00 00 00 23 32 04 CC
137.482806 1 0 Rx d 8 00 00 00 00 24 00 04 FE
137.683252 1 0 Rx d 8 00 00 00 00 24 CC 05 32
137.884308 1 0 Rx d 8 00 00 00 00 25 98 05 66
138.085017 1 0 Rx d 8 00 00 00 00 26 66 05 98
138.285723 1 0 Rx d 8 00 00 00 00 27 32 05 CC
138.486456 1 0 Rx d 8 00 00 00 00 28 00 05 FE
138.686668 1 0 Rx d 8 00 00 00 00 28 CC 06 32
138.887913 1 0 Rx d 8 00 00 00 00 29 98 06 66
139.088562 1 0 Rx d 8 00 00 00 00 2A 66 06 98
139.289008 1 0 Rx d 8 00 00 00 00 2B 32 06 CC
139.489823 1 0 Rx d 8 00 00 00 00 2C 00 06 FE
139.690118 1 0 Rx d 8 00 00 00 00 2C CC 07 32
139.890810 1 0 Rx d 8 00 00 00 00 2D 98 07 66
140.091141 1 0 Rx d 8 00 00 00 00 2E 66 07 98
140.291975 1 0 Rx d 8 00 00 00 00 2F 32 07 CC
140.492297 1 0 Rx d 8 00 00 00 00 30 00 07 FE
140.692478 1 0 Rx d 8 00 00 00 00 30 CC 08 32
140.892742 1 0 Rx d 8 00 00 00 00 31 98 08 66
141.093225 1 0 Rx d 8 00 00 00 00 32 66 08 98
141.293667 1 0 Rx d 8 00 00 00 00 33 32 08 CC
141.494396 1 0 Rx d 8 00 00 00 00 34 00 08 FE
141.695062 1 0 Rx d 8 00 00 00 00 34 CC 09 32
141.895284 1 0 Rx d 8 00 00 00 00 35 98 09 66
142.095960 1 0 Rx d 8 00 00 00 00 36 66 09 98
142.297025 1 0 Rx d 8 00 00 00 00 37 32 09 CC
142.497415 1 0 Rx d 8 00 00 00 00 38 00 09 FE
142.697700 1 0 Rx d 8 00 00 00 00 38 CC 0A 32
142.898924 1 0 Rx d 8 00 00 00 00 39 98 0A 66
143.100212 1 0 Rx d 8 00 00 00 00 3A 66 0A 98
143.300484 1 0 Rx d 8 00 00 00 00 3B 32 0A CC
143.501588 1 0 Rx d 8 00 00 00 00 3C 00 0A FE
143.701901 1 0 Rx d 8 00 00 00 00 3C CC 0B 32
143.902828 1 0 Rx d 8 00 00 00 00 3D 98 0B 66
144.103297 1 0 Rx d 8 00 00 00 00 3E 66 0B 98
144.304179 1 0 Rx d 8 00 00 00 00 3F 32 0B CC
144.504702 1 0 Rx d 8 00 00 00 00 40 00 0B FE
144.704983 1 0 Rx d 8 00 00 00 00 40 CC 0C 32
144.906176 1 0 Rx d 8 00 00 00 00 41 98 0C 66
145.107253 1 0 Rx d 8 00 00 00 00 42 66 0C 98
145.307433 1 0 Rx d 8 00 00 00 00 43 32 0C CC
145.508039 1 0 Rx d 8 00 00 00 00 44 00 0C FE
145.708326 1 0 Rx d 8 00 00 00 00 44 CC 0D 32
145.909264 1 0 Rx d 8 00 00 00 00 45 98 0D 66
146.111036 1 0 Rx d 8 00 00 00 00 46 66 0D 98
End TriggerBlock

View File

@@ -0,0 +1,10 @@
;Class name;Function name;Signal name;vss;Signal direction;type;DBC CAN name includes CAN message name
;;;;;;;
VD;SteeringWheel;SteeringWheel;wheelAngle;Vehicle.Chassis.SteeringWheel.Angle;RX;float;CAN_Input.SteeringWheel
VD;VehicleSpeed;Speed;vehicleSpeed;Vehicle.Speed;RX;float;CAN_Input.Speed
VD;VehicleChassisAxle;RearAxle;axleAngle;Vehicle.Chassis.RearAxle.Row.Wheel;TX;float;CAN_Output.RearAngle
VD;IsActiveCounter;Counter;liveCounter;Vehicle.Software.Application.IsActiveCounter;TX;uint8;CAN_Output.IsActiveCounter
BS;SteeringWheel;SteeringWheel;wheelAngle;Vehicle.Chassis.SteeringWheel.Angle;RX;float;Vehicle.Chassis.SteeringWheel.Angle
BS;VehicleSpeed;Speed;vehicleSpeed;Vehicle.Speed;RX;float;Vehicle.Speed
BS;VehicleChassisAxle;RearAxle;axleAngle;Vehicle.Chassis.RearAxle.Row.Wheel;TX;float;Vehicle.Chassis.RearAxle.Row.Wheel
BS;IsActiveCounter;Counter;liveCounter;Vehicle.Software.Application.IsActiveCounter;TX;uint8;Vehicle.Software.Application.IsActiveCounter
1 Class name Function name Signal name vss Signal direction type DBC CAN name includes CAN message name
2
3 VD SteeringWheel SteeringWheel wheelAngle Vehicle.Chassis.SteeringWheel.Angle RX float CAN_Input.SteeringWheel
4 VD VehicleSpeed Speed vehicleSpeed Vehicle.Speed RX float CAN_Input.Speed
5 VD VehicleChassisAxle RearAxle axleAngle Vehicle.Chassis.RearAxle.Row.Wheel TX float CAN_Output.RearAngle
6 VD IsActiveCounter Counter liveCounter Vehicle.Software.Application.IsActiveCounter TX uint8 CAN_Output.IsActiveCounter
7 BS SteeringWheel SteeringWheel wheelAngle Vehicle.Chassis.SteeringWheel.Angle RX float Vehicle.Chassis.SteeringWheel.Angle
8 BS VehicleSpeed Speed vehicleSpeed Vehicle.Speed RX float Vehicle.Speed
9 BS VehicleChassisAxle RearAxle axleAngle Vehicle.Chassis.RearAxle.Row.Wheel TX float Vehicle.Chassis.RearAxle.Row.Wheel
10 BS IsActiveCounter Counter liveCounter Vehicle.Software.Application.IsActiveCounter TX uint8 Vehicle.Software.Application.IsActiveCounter