mirror of
https://github.com/eclipse-openvehicle-api/openvehicle-api.git
synced 2026-02-05 15:18:45 +00:00
241
examples/system_demo_example/CMakeLists.txt
Normal file
241
examples/system_demo_example/CMakeLists.txt
Normal 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)
|
||||
@@ -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"
|
||||
@@ -0,0 +1,6 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "demo_complex_service.sdv"
|
||||
Class = "Counter Steering Example Service"
|
||||
@@ -0,0 +1,8 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "data_dispatch_service.sdv"
|
||||
Class = "DataDispatchService"
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "can_dl_example.sdv"
|
||||
Class = "CAN_data_link"
|
||||
@@ -0,0 +1,6 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "task_timer.sdv"
|
||||
Class = "TaskTimerService"
|
||||
@@ -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"
|
||||
|
||||
|
||||
|
||||
11
examples/system_demo_example/coreconfig/demo.toml
Normal file
11
examples/system_demo_example/coreconfig/demo.toml
Normal 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"
|
||||
|
||||
9
examples/system_demo_example/coreconfig/platform.toml
Normal file
9
examples/system_demo_example/coreconfig/platform.toml
Normal 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"
|
||||
|
||||
28
examples/system_demo_example/coreconfig/settings.toml
Normal file
28
examples/system_demo_example/coreconfig/settings.toml
Normal 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"
|
||||
@@ -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"
|
||||
|
||||
28
examples/system_demo_example/coreconfig/vehicle_ifc.toml
Normal file
28
examples/system_demo_example/coreconfig/vehicle_ifc.toml
Normal 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"
|
||||
|
||||
127
examples/system_demo_example/datalink_demo_example.dbc
Normal file
127
examples/system_demo_example/datalink_demo_example.dbc
Normal 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;
|
||||
|
||||
334
examples/system_demo_example/example_app/console.cpp
Normal file
334
examples/system_demo_example/example_app/console.cpp
Normal 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;
|
||||
}
|
||||
202
examples/system_demo_example/example_app/console.h
Normal file
202
examples/system_demo_example/example_app/console.h
Normal 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
|
||||
222
examples/system_demo_example/example_app/control.cpp
Normal file
222
examples/system_demo_example/example_app/control.cpp
Normal 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));
|
||||
}
|
||||
}
|
||||
330
examples/system_demo_example/example_app/control.h
Normal file
330
examples/system_demo_example/example_app/control.h
Normal 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
|
||||
25
examples/system_demo_example/example_app/signal_names.h
Normal file
25
examples/system_demo_example/example_app/signal_names.h
Normal 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
|
||||
|
||||
180
examples/system_demo_example/example_app/system_demo_example.cpp
Normal file
180
examples/system_demo_example/example_app/system_demo_example.cpp
Normal 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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
176
examples/system_demo_example/example_service/complex_service.cpp
Normal file
176
examples/system_demo_example/example_service/complex_service.cpp
Normal 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);
|
||||
}
|
||||
156
examples/system_demo_example/example_service/complex_service.h
Normal file
156
examples/system_demo_example/example_service/complex_service.h
Normal 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
|
||||
@@ -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;
|
||||
};
|
||||
321
examples/system_demo_example/fmu/model.cpp
Normal file
321
examples/system_demo_example/fmu/model.cpp
Normal 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
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "demo_complex_service.sdv"
|
||||
Class = "Counter Steering Example Service"
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "data_dispatch_service.sdv"
|
||||
Class = "DataDispatchService"
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "simulation_task_timer.sdv"
|
||||
Class = "SimulationTaskTimerService"
|
||||
@@ -0,0 +1,6 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "task_timer.sdv"
|
||||
Class = "TaskTimerService"
|
||||
@@ -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"
|
||||
|
||||
|
||||
|
||||
57
examples/system_demo_example/fmu/vapi_system_demo.scr
Normal file
57
examples/system_demo_example/fmu/vapi_system_demo.scr
Normal 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
|
||||
|
||||
|
||||
733
examples/system_demo_example/system_demo_receiver.asc
Normal file
733
examples/system_demo_example/system_demo_receiver.asc
Normal 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
|
||||
10
examples/system_demo_example/vss_demo_example.csv
Normal file
10
examples/system_demo_example/vss_demo_example.csv
Normal 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
|
||||
|
Reference in New Issue
Block a user