mirror of
https://github.com/eclipse-openvehicle-api/openvehicle-api.git
synced 2026-04-21 03:38:15 +00:00
211
examples/open_trunk_example/CMakeLists.txt
Normal file
211
examples/open_trunk_example/CMakeLists.txt
Normal file
@@ -0,0 +1,211 @@
|
||||
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 open trunk example.")
|
||||
execute_process(COMMAND "${SDV_VSS_UTIL}" "${PROJECT_SOURCE_DIR}/vss_open_trunk_example.csv" "-O${PROJECT_SOURCE_DIR}/generated/" --prefixtrunk --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_vehiclebodytrunk_vd_tx.idl")
|
||||
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclebodytrunk_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_vehiclebodytrunk_bs_tx.idl")
|
||||
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/generated/vss_files/vss_vehiclebodytrunk_bs_tx.idl" "-O${PROJECT_SOURCE_DIR}/generated/vss_files/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Igenerated/vss_files/ --ps_lib_nametrunk_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_nametrunk_proxystub)
|
||||
|
||||
|
||||
# Execute sdv_dbc_util to create data link code & FMU code.
|
||||
message("Create data link for open trunk example")
|
||||
execute_process(COMMAND ${SDV_DBC_UTIL} "${PROJECT_SOURCE_DIR}/open_trunk_example.dbc" "-O${PROJECT_SOURCE_DIR}/generated/" --nodestrunk --version1.0.0.1 --moduleTrunkExampleFMU --dl_lib_namecan_dl_trunk)
|
||||
|
||||
# Execute the IDL compiler for the complex service to digest interface code.
|
||||
message("Compiling trunkkit.idl")
|
||||
execute_process(COMMAND "${SDV_IDL_COMPILER}" "${PROJECT_SOURCE_DIR}/trunk_service/trunkkit.idl" "-O${PROJECT_SOURCE_DIR}/generated/trunk_service/" "-I${SDV_FRAMEWORK_DEV_INCLUDE}" -Itrunk_service/ --ps_lib_nametrunk_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_trunk")
|
||||
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: trunk 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_vehicletrunk)
|
||||
add_subdirectory(generated/vss_files/vd_vehiclespeed)
|
||||
|
||||
add_subdirectory(generated/vss_files/bs_vehicletrunk)
|
||||
add_subdirectory(generated/vss_files/bs_vehiclespeed)
|
||||
|
||||
######################################################################################################################################################################
|
||||
# complex service
|
||||
######################################################################################################################################################################
|
||||
|
||||
message("Include: proxy/stub for complex trunk service")
|
||||
include_directories(${CMAKE_CURRENT_LIST_DIR}/generated/trunk_service)
|
||||
add_subdirectory(generated/trunk_service/ps)
|
||||
|
||||
message("Include: example component trunk_complex_service")
|
||||
add_library(trunk_complex_service SHARED
|
||||
trunk_service/complex_service.h
|
||||
trunk_service/complex_service.cpp
|
||||
)
|
||||
set_target_properties(trunk_complex_service PROPERTIES OUTPUT_NAME "trunk_complex_service")
|
||||
set_target_properties(trunk_complex_service PROPERTIES PREFIX "")
|
||||
set_target_properties(trunk_complex_service PROPERTIES SUFFIX ".sdv")
|
||||
|
||||
######################################################################################################################################################################
|
||||
# basic_system trunk application
|
||||
######################################################################################################################################################################
|
||||
|
||||
# Define the executable
|
||||
add_executable(open_trunk_example
|
||||
open_trunk_app/trunk_example.cpp
|
||||
open_trunk_app/trunk_application.cpp
|
||||
open_trunk_app/trunk_application.h
|
||||
open_trunk_app/console.cpp
|
||||
open_trunk_app/console.h
|
||||
open_trunk_app/signal_names.h
|
||||
)
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
if (WIN32)
|
||||
target_link_libraries(open_trunk_example Ws2_32 Winmm Rpcrt4.lib)
|
||||
else()
|
||||
target_link_libraries(open_trunk_example ${CMAKE_DL_LIBS} rt ${CMAKE_THREAD_LIBS_INIT})
|
||||
endif()
|
||||
else()
|
||||
target_link_libraries(open_trunk_example Rpcrt4.lib)
|
||||
endif()
|
||||
#[[
|
||||
|
||||
######################################################################################################################################################################
|
||||
# open trunk application
|
||||
######################################################################################################################################################################
|
||||
|
||||
# Define the executable
|
||||
add_executable(system_trunk_example
|
||||
example_app/system_trunk_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_trunk_example Ws2_32 Winmm Rpcrt4.lib)
|
||||
else()
|
||||
target_link_libraries(system_trunk_example ${CMAKE_DL_LIBS} rt ${CMAKE_THREAD_LIBS_INIT})
|
||||
endif()
|
||||
else()
|
||||
target_link_libraries(system_trunk_example Rpcrt4.lib)
|
||||
endif()
|
||||
#]]
|
||||
# Copy the config files
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/config/can_com_simulation_trunk.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/config/complex_service_trunk.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/config/data_dispatch_trunk.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/config/data_link_trunk.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/config/task_timer_trunk.toml DESTINATION ${CMAKE_BINARY_DIR}/bin/config)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/config/trunk_vehicle_device_and_basic_service.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}/open_trunk_receiver.asc DESTINATION ${CMAKE_BINARY_DIR}/bin)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/open_trunk_receiver.asc DESTINATION ${CMAKE_BINARY_DIR}../../bin)
|
||||
|
||||
######################################################################################################################################################################
|
||||
# create instance 3005 of system trunk 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(trunk_interface_config
|
||||
ALL
|
||||
DEPENDS
|
||||
can_dl_trunk
|
||||
trunk_vd_vehiclespeed_rx
|
||||
trunk_vd_vehicletrunk_tx
|
||||
COMMAND "${SDV_PACKAGER}" DIRECT_INSTALL ExampleInterfaceComponents --instance3005 can_dl_trunk.sdv trunk_vd_vehiclespeed_rx.sdv trunk_vd_vehicletrunk_tx.sdv "-I${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" --interface_config --overwrite
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
add_custom_target(trunk_abstract_config
|
||||
ALL
|
||||
DEPENDS
|
||||
trunk_proxystub
|
||||
trunk_bs_vehiclespeed_rx
|
||||
trunk_bs_vehicletrunk_tx
|
||||
COMMAND "${SDV_PACKAGER}" DIRECT_INSTALL ExampleAbstractComponents --instance3005 trunk_proxystub.sdv trunk_bs_vehiclespeed_rx.sdv trunk_bs_vehicletrunk_tx.sdv "-I${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" --abstract_config --overwrite
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
add_custom_target(trunk_user_config
|
||||
ALL
|
||||
DEPENDS
|
||||
trunk_complex_service
|
||||
trunk_service_proxystub
|
||||
COMMAND "${SDV_PACKAGER}" DIRECT_INSTALL TrunkApplication --instance3005 trunk_complex_service.sdv trunk_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/trunk.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3005)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/platform.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3005)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/settings.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3005)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/vehicle_abstract.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3005)
|
||||
file (COPY ${PROJECT_SOURCE_DIR}/coreconfig/vehicle_ifc.toml DESTINATION ${SDV_FRAMEWORK_RUNTIME}/3005)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "can_com_sim.sdv"
|
||||
Class = "CAN_Com_Sim"
|
||||
Source="open_trunk_receiver.asc"
|
||||
Target="open_trunk_writer.asc"
|
||||
@@ -0,0 +1,6 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_complex_service.sdv"
|
||||
Class = "Open Trunk Service"
|
||||
@@ -0,0 +1,8 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "data_dispatch_service.sdv"
|
||||
Class = "DataDispatchService"
|
||||
|
||||
|
||||
6
examples/open_trunk_example/config/data_link_trunk.toml
Normal file
6
examples/open_trunk_example/config/data_link_trunk.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "can_dl_trunk.sdv"
|
||||
Class = "CAN_data_link"
|
||||
6
examples/open_trunk_example/config/task_timer_trunk.toml
Normal file
6
examples/open_trunk_example/config/task_timer_trunk.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "task_timer.sdv"
|
||||
Class = "TaskTimerService"
|
||||
@@ -0,0 +1,22 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_vd_vehiclespeed_rx.sdv"
|
||||
Class = "Vehicle.Speed_Device"
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_vd_vehicletrunk_tx.sdv"
|
||||
Class = "Vehicle.Body.Trunk_Device"
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_bs_vehiclespeed_rx.sdv"
|
||||
Class = "Vehicle.Speed_Service"
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_bs_vehicletrunk_tx.sdv"
|
||||
Class = "Vehicle.Body.Trunk_Service"
|
||||
|
||||
|
||||
|
||||
|
||||
8
examples/open_trunk_example/coreconfig/platform.toml
Normal file
8
examples/open_trunk_example/coreconfig/platform.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "can_com_sim.sdv"
|
||||
Class = "CAN_Com_Sim"
|
||||
Source="open_trunk_receiver.asc"
|
||||
Target="open_trunk_writer.asc"
|
||||
28
examples/open_trunk_example/coreconfig/settings.toml
Normal file
28
examples/open_trunk_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 = "trunk.toml"
|
||||
20
examples/open_trunk_example/coreconfig/trunk.toml
Normal file
20
examples/open_trunk_example/coreconfig/trunk.toml
Normal file
@@ -0,0 +1,20 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_complex_service.sdv"
|
||||
Class = "Open Trunk Service"
|
||||
Name = "Open Trunk Service"
|
||||
|
||||
[[Module]]
|
||||
Path = "trunk_service_proxystub.sdv"
|
||||
|
||||
[[Module.Component]]
|
||||
Class = "Proxy_13181601229896482092"
|
||||
Aliases = ["Proxy_ITrunkKitService"]
|
||||
Type = "Proxy"
|
||||
|
||||
[[Module.Component]]
|
||||
Class = "Stub_13181601229896482092"
|
||||
Aliases = ["Stub_ITrunkKitService"]
|
||||
Type = "Stub"
|
||||
19
examples/open_trunk_example/coreconfig/vehicle_abstract.toml
Normal file
19
examples/open_trunk_example/coreconfig/vehicle_abstract.toml
Normal file
@@ -0,0 +1,19 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_bs_vehiclespeed_rx.sdv"
|
||||
Class = "Vehicle.Speed_Service"
|
||||
Name = "Vehicle.Speed_Service"
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_bs_vehicletrunk_tx.sdv"
|
||||
Class = "Vehicle.Body.Trunk_Service"
|
||||
Name = "Vehicle.Body.Trunk_Service"
|
||||
|
||||
|
||||
[[Module]]
|
||||
Path = "trunk_proxystub.sdv"
|
||||
|
||||
|
||||
|
||||
19
examples/open_trunk_example/coreconfig/vehicle_ifc.toml
Normal file
19
examples/open_trunk_example/coreconfig/vehicle_ifc.toml
Normal file
@@ -0,0 +1,19 @@
|
||||
[Configuration]
|
||||
Version = 100
|
||||
|
||||
[[Component]]
|
||||
Path = "can_dl_trunk.sdv"
|
||||
Class = "CAN_data_link"
|
||||
Name = "DataLink"
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_vd_vehiclespeed_rx.sdv"
|
||||
Class = "Vehicle.Speed_Device"
|
||||
Name = "Vehicle.Speed_Device"
|
||||
|
||||
[[Component]]
|
||||
Path = "trunk_vd_vehicletrunk_tx.sdv"
|
||||
Class = "Vehicle.Body.Trunk_Device"
|
||||
Name = "Vehicle.Body.Trunk_Device"
|
||||
|
||||
|
||||
309
examples/open_trunk_example/open_trunk_app/console.cpp
Normal file
309
examples/open_trunk_example/open_trunk_app/console.cpp
Normal file
@@ -0,0 +1,309 @@
|
||||
#include "console.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <conio.h> // Needed for _kbhit
|
||||
#else
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
const CConsole::SConsolePos g_sTitle{ 1, 1 };
|
||||
const CConsole::SConsolePos g_sSubTitle{ 3, 1 };
|
||||
const CConsole::SConsolePos g_sSeparator1{ 5, 1 };
|
||||
const CConsole::SConsolePos g_sDataLink{ 7, 1 };
|
||||
const CConsole::SConsolePos g_sDataLinkSpeed{ 8, 1 };
|
||||
const CConsole::SConsolePos g_sSeparator2{ 10, 1 };
|
||||
const CConsole::SConsolePos g_sVehicleDevice{ 12, 1 };
|
||||
const CConsole::SConsolePos g_sVehicleDeviceSpeed{ 13, 1 };
|
||||
const CConsole::SConsolePos g_sSeparator3{ 15, 1 };
|
||||
const CConsole::SConsolePos g_sBasicService{ 17, 1 };
|
||||
const CConsole::SConsolePos g_sBasicServiceSpeed{ 18, 1 };
|
||||
const CConsole::SConsolePos g_sSeparator4{ 20, 1 };
|
||||
const CConsole::SConsolePos g_sComment1{ 22, 1 };
|
||||
const CConsole::SConsolePos g_sComment2{ 23, 1 };
|
||||
const CConsole::SConsolePos g_sComment3{ 24, 1 };
|
||||
const CConsole::SConsolePos g_sComment4{ 25, 1 };
|
||||
const CConsole::SConsolePos g_sComment5{ 26, 1 };
|
||||
const CConsole::SConsolePos g_sSeparator5{ 28, 1 };
|
||||
const CConsole::SConsolePos g_sComplexServcie1{ 30, 1 };
|
||||
const CConsole::SConsolePos g_sComplexServcie2{ 31, 1 };
|
||||
const CConsole::SConsolePos g_sSeparator6{ 33, 1 };
|
||||
const CConsole::SConsolePos g_sControlDescription{ 35, 1 };
|
||||
const CConsole::SConsolePos g_sCursor{ 36, 1 };
|
||||
|
||||
CConsole::CConsole()
|
||||
{
|
||||
#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(uint32_t uiInstance)
|
||||
{
|
||||
// Clear the screen...
|
||||
std::cout << "\x1b[2J";
|
||||
|
||||
std::string subTtitle = "Standalone application, this is not Mixed-Critical mode!";
|
||||
if (uiInstance != 0)
|
||||
{
|
||||
subTtitle = "Connected to core instance ";
|
||||
subTtitle.append(std::to_string(uiInstance));
|
||||
subTtitle.append(", this is NOT Mixed-Critical mode yet!");
|
||||
}
|
||||
// Print the titles
|
||||
PrintText(g_sTitle, "Open Trunk example: Open trunk when vehicle is not moving");
|
||||
PrintText(g_sSubTitle, subTtitle);
|
||||
PrintText(g_sSeparator1, "============================================================================");
|
||||
PrintText(g_sDataLink, "Data dispatch service:");
|
||||
PrintText(g_sDataLinkSpeed, "Data Link not available");
|
||||
PrintText(g_sSeparator2, "----------------------------------------------------------------------------");
|
||||
PrintText(g_sVehicleDevice, "Vehicle Device:");
|
||||
PrintText(g_sVehicleDeviceSpeed, "Vehicle Device Interface not available.");
|
||||
PrintText(g_sSeparator3, "----------------------------------------------------------------------------");
|
||||
PrintText(g_sBasicService, "Basic Service:");
|
||||
PrintText(g_sBasicServiceSpeed, "Basic Service Interface not available.");
|
||||
PrintText(g_sSeparator4, "============================================================================");
|
||||
PrintText(g_sComment1, "The complex service which checks the speed of the vehicle can be seen");
|
||||
PrintText(g_sComment2, "as an ASIL A/B component and will block the call from QM.");
|
||||
PrintText(g_sComment3, "The extern apllication can be seen as a QM function.");
|
||||
PrintText(g_sComment4, "If this example would run in a mixed critical environment the connection");
|
||||
PrintText(g_sComment5, "from QM to basic service interface would be forbidden.");
|
||||
PrintText(g_sSeparator5, "============================================================================");
|
||||
PrintText(g_sComplexServcie1, "Basic Service Interface not available.");
|
||||
PrintText(g_sComplexServcie2, "Complex Service Interface not available.");
|
||||
PrintText(g_sSeparator6, "----------------------------------------------------------------------------");
|
||||
PrintText(g_sControlDescription, "Press 'X' to quit; 'C' to clear screen, '1' or '2' to open trunk ");
|
||||
}
|
||||
|
||||
bool CConsole::PrepareDataConsumers()
|
||||
{
|
||||
// Subscribe for the speed and trunk signal
|
||||
sdv::core::CDispatchService dispatch;
|
||||
m_SignalSpeed = dispatch.Subscribe(trunk::dsVehicleSpeed, [&](sdv::any_t value) { CallbackSpeed(value); });
|
||||
if (m_SignalSpeed)
|
||||
PrintValue(g_sDataLinkSpeed, "Vehicle Speed RX", m_SpeedDL, "m/s");
|
||||
|
||||
// Registrate for the vehicle device & basic service of the speed.
|
||||
auto vehicleDevice = sdv::core::GetObject("Vehicle.Speed_Device").GetInterface<vss::Vehicle::SpeedDevice::IVSS_Speed>();
|
||||
if (vehicleDevice)
|
||||
{
|
||||
PrintValue(g_sVehicleDeviceSpeed, "Vehicle Speed RX", m_SpeedVD, "m/s");
|
||||
vehicleDevice->RegisterSpeedEvent(dynamic_cast<vss::Vehicle::SpeedDevice::IVSS_WriteSpeed_Event*> (this));
|
||||
}
|
||||
|
||||
auto basicService = sdv::core::GetObject("Vehicle.Speed_Service").GetInterface<vss::Vehicle::SpeedService::IVSS_GetSpeed>();
|
||||
if (basicService)
|
||||
{
|
||||
PrintValue(g_sBasicServiceSpeed, "Vehicle Speed RX", m_SpeedBS, "km/h");
|
||||
basicService->RegisterOnSignalChangeOfVehicleSpeed(dynamic_cast<vss::Vehicle::SpeedService::IVSS_SetSpeed_Event*> (this));
|
||||
}
|
||||
|
||||
// Request the basic service for opening the drunk.
|
||||
m_pTrunkSvc = sdv::core::GetObject("Vehicle.Body.Trunk_Service").GetInterface<vss::Vehicle::Body::TrunkService::IVSS_SetOpen>();
|
||||
if (m_pTrunkSvc)
|
||||
PrintText(g_sComplexServcie1, "Basic Service available");
|
||||
|
||||
m_pITrunkComplexService = sdv::core::GetObject("Open Trunk Service").GetInterface<ITrunkKitService>();
|
||||
if (m_pITrunkComplexService)
|
||||
PrintText(g_sComplexServcie2, "Complex Service available");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CConsole::ResetSignals()
|
||||
{
|
||||
// Set the cursor position at the end
|
||||
SetCursorPos(g_sCursor);
|
||||
|
||||
auto vehicleDevice = sdv::core::GetObject("Vehicle.Speed_Device").GetInterface<vss::Vehicle::SpeedDevice::IVSS_Speed>();
|
||||
if (vehicleDevice)
|
||||
vehicleDevice->UnregisterSpeedEvent(dynamic_cast<vss::Vehicle::SpeedDevice::IVSS_WriteSpeed_Event*> (this));
|
||||
|
||||
auto basicService = sdv::core::GetObject("Vehicle.Speed_Service").GetInterface<vss::Vehicle::SpeedService::IVSS_GetSpeed>();
|
||||
if (basicService)
|
||||
basicService->UnregisterOnSignalChangeOfVehicleSpeed(dynamic_cast<vss::Vehicle::SpeedService::IVSS_SetSpeed_Event*> (this));
|
||||
|
||||
// Unregister the data link signalss
|
||||
if (m_SignalSpeed)
|
||||
m_SignalSpeed.Reset();
|
||||
}
|
||||
|
||||
void CConsole::CallbackSpeed(sdv::any_t value)
|
||||
{
|
||||
if (m_SpeedDL != value.get<float>())
|
||||
{
|
||||
m_SpeedDL = value.get<float>();
|
||||
PrintValue(g_sDataLinkSpeed, "Vehicle Speed RX", m_SpeedDL, "m/s");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
auto text = rssText;
|
||||
while (text.length() < 76)
|
||||
text.append(" ");
|
||||
|
||||
std::lock_guard<std::mutex> lock(m_mtxPrintToConsole);
|
||||
SetCursorPos(sPos);
|
||||
std::cout << text;
|
||||
}
|
||||
|
||||
|
||||
void CConsole::WriteSpeed(float value)
|
||||
{
|
||||
if (m_SpeedVD != value)
|
||||
{
|
||||
m_SpeedVD = value;
|
||||
PrintValue(g_sVehicleDeviceSpeed, "Vehicle Speed RX", m_SpeedVD, "m/s");
|
||||
}
|
||||
}
|
||||
|
||||
void CConsole::SetSpeed(float value)
|
||||
{
|
||||
if (m_SpeedBS != value)
|
||||
{
|
||||
m_SpeedBS = value;
|
||||
PrintValue(g_sBasicServiceSpeed, "Vehicle Speed RX", m_SpeedBS * 3.6f, "km/h");
|
||||
}
|
||||
}
|
||||
|
||||
bool CConsole::KeyHit()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return _kbhit();
|
||||
#elif __unix__
|
||||
int ch = getchar();
|
||||
if (ch != EOF) {
|
||||
ungetc(ch, stdin);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
char CConsole::GetChar()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return static_cast<char>(_getch());
|
||||
#else
|
||||
return getchar();
|
||||
#endif
|
||||
}
|
||||
|
||||
void CConsole::RunUntilBreak()
|
||||
{
|
||||
bool bRunning = true;
|
||||
|
||||
while (bRunning)
|
||||
{
|
||||
// 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 'c':
|
||||
case 'C':
|
||||
PrintText(g_sComplexServcie1, " ");
|
||||
PrintText(g_sComplexServcie2, " ");
|
||||
break;
|
||||
case '1':
|
||||
if (m_pTrunkSvc)
|
||||
{
|
||||
if (m_pTrunkSvc->SetOpen(true))
|
||||
PrintText(g_sComplexServcie1, "Open trunk via basic service - will not be available in Mixed-Critical mode!");
|
||||
else
|
||||
PrintText(g_sComplexServcie1, "Open trunk via basic service failed.");
|
||||
}
|
||||
break;
|
||||
case '2':
|
||||
if (m_pITrunkComplexService)
|
||||
{
|
||||
if (m_pITrunkComplexService->PopTrunk())
|
||||
PrintText(g_sComplexServcie2, "Safety open trunk via complex service.");
|
||||
else
|
||||
PrintText(g_sComplexServcie2, "Safety open trunk via complex service failed, car is moving");
|
||||
}
|
||||
break;
|
||||
case 'x':
|
||||
case 'X':
|
||||
bRunning = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
190
examples/open_trunk_example/open_trunk_app/console.h
Normal file
190
examples/open_trunk_example/open_trunk_app/console.h
Normal file
@@ -0,0 +1,190 @@
|
||||
#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"
|
||||
#include <fcntl.h>
|
||||
#include "../generated/vss_files/vss_vehiclebodytrunk_bs_tx.h"
|
||||
#include "../generated/vss_files/vss_vehiclespeed_bs_rx.h"
|
||||
#include "../generated/vss_files/vss_vehiclespeed_vd_rx.h"
|
||||
|
||||
// Complex service trunk interface - located in ../generated/trunk_service
|
||||
#include "trunkkit.h"
|
||||
|
||||
#ifdef __unix__
|
||||
#include <termios.h> // Needed for tcgetattr and fcntl
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Console operation class.
|
||||
* @details This class retrieves RX data from the data dispatch service, vehicle device & basic service of speed on event change.
|
||||
* Furthermore, it shows TX value by polling the RX signals.
|
||||
*/
|
||||
class CConsole : public vss::Vehicle::SpeedDevice::IVSS_WriteSpeed_Event
|
||||
, public vss::Vehicle::SpeedService::IVSS_SetSpeed_Event
|
||||
{
|
||||
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
|
||||
*/
|
||||
CConsole();
|
||||
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~CConsole();
|
||||
|
||||
/**
|
||||
* @brief Print the header.
|
||||
* @param[in] uiInstance Instance number the application will connect to. 0 will start a standalone application
|
||||
*/
|
||||
void PrintHeader(uint32_t uiInstance);
|
||||
|
||||
/**
|
||||
* @brief Prepare the data consumers..
|
||||
* @return Returns whether the preparation of the data consumers was successful or not.
|
||||
*/
|
||||
bool PrepareDataConsumers();
|
||||
|
||||
/**
|
||||
* @brief Run loop as long as user input does not exit
|
||||
* Allow user to open/close trunk.
|
||||
*/
|
||||
void RunUntilBreak();
|
||||
|
||||
/**
|
||||
* @brief Write vehicleSpeed signal
|
||||
* @param[in] value vehicleSpeed
|
||||
*/
|
||||
virtual void WriteSpeed(float value) override;
|
||||
|
||||
/**
|
||||
* @brief Set vehicleSpeed signal
|
||||
* @param[in] value vehicleSpeed
|
||||
*/
|
||||
virtual void SetSpeed(float value) override;
|
||||
|
||||
/**
|
||||
* @brief For gracefully shutdown all signals need to be reset.
|
||||
*/
|
||||
void ResetSignals();
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief Callback function for speed.
|
||||
* @param[in] value The value of the signal to update.
|
||||
*/
|
||||
void CallbackSpeed(sdv::any_t value);
|
||||
|
||||
/**
|
||||
* @brief Key hit check. Windows uses the _kbhit function; POSIX emulates this.
|
||||
* @return Returns whether a key has been pressed.
|
||||
*/
|
||||
bool KeyHit();
|
||||
|
||||
/**
|
||||
* @brief Get the character from the keyboard buffer if pressed.
|
||||
* @return Returns the character from the keyboard buffer.
|
||||
*/
|
||||
char GetChar();
|
||||
|
||||
/**
|
||||
* @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] rssStatus Status, becuse we have signals of type bool
|
||||
*/
|
||||
template <typename TValue>
|
||||
void PrintValue(SConsolePos sPos, const std::string& rssName, TValue tValue, const std::string& rssStatus);
|
||||
|
||||
/**
|
||||
* @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_bRunning = false; ///< When set, the application is running.
|
||||
mutable std::mutex m_mPrintToConsole; ///< Mutex to print complete message
|
||||
|
||||
sdv::core::CSignal m_SignalSpeed; ///< Speed
|
||||
float m_SpeedDL = 0.0; ///< Speed Data Link
|
||||
float m_SpeedVD = 0.0; ///< Speed Data Link
|
||||
float m_SpeedBS = 0.0; ///< Speed Data Link
|
||||
|
||||
vss::Vehicle::Body::TrunkService::IVSS_SetOpen* m_pTrunkSvc = nullptr; ///< Front Left Door
|
||||
ITrunkKitService* m_pITrunkComplexService = nullptr; ///< Trunk 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 = 30;
|
||||
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_mPrintToConsole);
|
||||
SetCursorPos(sPos);
|
||||
std::cout << sstreamValueText.str();
|
||||
}
|
||||
|
||||
template <>
|
||||
inline void CConsole::PrintValue<bool>(SConsolePos sPos, const std::string& rssName, bool bValue, const std::string& rssStatus)
|
||||
{;
|
||||
PrintValue(sPos, rssName, bValue ? "" : "", rssStatus);
|
||||
}
|
||||
|
||||
#endif // !define CONSOLE_OUTPUT_H
|
||||
25
examples/open_trunk_example/open_trunk_app/signal_names.h
Normal file
25
examples/open_trunk_example/open_trunk_app/signal_names.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* namespace for the signal names
|
||||
* in case /interfaces/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("../interfaces/signal_identifier.h")
|
||||
#include "../interfaces/signal_identifier.h"
|
||||
#else
|
||||
|
||||
namespace trunk
|
||||
{
|
||||
// Data Dispatch Service signal names to dbc variable names C-type RX/TX vss name space
|
||||
static std::string dsVehicleSpeed = "CAN_Input.Speed"; ///< bool RX Vehicle.Speed
|
||||
static std::string dsTrunk = "CAN_Output.OpenTrunk"; ///< bool TX Vehicle.Body.Trunk
|
||||
} // trunk
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // SIGNAL_NAMES_H
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
#include "trunk_application.h"
|
||||
#include "signal_names.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <conio.h> // Needed for _kbhit
|
||||
#else
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
bool CTrunkControl::LoadConfigFile(const std::string& inputMsg, const std::string& configFileName)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
bool CTrunkControl::IsSDVFrameworkEnvironmentSet()
|
||||
{
|
||||
const char* envVariable = std::getenv("SDV_FRAMEWORK_RUNTIME");
|
||||
if (envVariable)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CTrunkControl::Initialize(uint32_t uiInstance)
|
||||
{
|
||||
if (m_bInitialized)
|
||||
return true;
|
||||
|
||||
if (!IsSDVFrameworkEnvironmentSet())
|
||||
{
|
||||
// if SDV_FRAMEWORK_RUNTIME environment variable is not set we need to set the Framework Runtime directory
|
||||
m_appcontrol.SetFrameworkRuntimeDirectory("../../bin");
|
||||
}
|
||||
|
||||
if (uiInstance != 0)
|
||||
{
|
||||
std::stringstream sstreamAppConfig;
|
||||
sstreamAppConfig << "[Application]" << std::endl;
|
||||
sstreamAppConfig << "Mode=\"External\"" << std::endl;
|
||||
sstreamAppConfig << "Instance=" << uiInstance << std::endl;
|
||||
sstreamAppConfig << "Retries=" << 6 << std::endl;
|
||||
sstreamAppConfig << "[Console]" << std::endl;
|
||||
sstreamAppConfig << "Report=\"Silent\"" << std::endl;
|
||||
if (!m_appcontrol.Startup(sstreamAppConfig.str()))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!m_appcontrol.Startup(""))
|
||||
return false;
|
||||
|
||||
// Switch to config mode.
|
||||
m_appcontrol.SetConfigMode();
|
||||
bool bResult = LoadConfigFile("Load dispatch service: ", "data_dispatch_trunk.toml");
|
||||
bResult &= LoadConfigFile("Load task_timer_trunk: ", "task_timer_trunk.toml");
|
||||
|
||||
bResult &= LoadConfigFile("Load can_com_simulation_trunk: ", "can_com_simulation_trunk.toml");
|
||||
bResult &= LoadConfigFile("Load data_link_trunk: ", "data_link_trunk.toml");
|
||||
|
||||
bResult &= LoadConfigFile("Load trunk_vehicle_device_and_basic_service: ", "trunk_vehicle_device_and_basic_service.toml");
|
||||
bResult &= LoadConfigFile("Load trunk service (complex service): ", "complex_service_trunk.toml");
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
SDV_LOG_ERROR("One or more configurations could not be loaded. Cannot continue.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
m_bInitialized = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CTrunkControl::Shutdown()
|
||||
{
|
||||
if (!m_bInitialized)
|
||||
m_appcontrol.Shutdown();
|
||||
m_bInitialized = false;
|
||||
}
|
||||
|
||||
void CTrunkControl::SetRunningMode()
|
||||
{
|
||||
m_appcontrol.SetRunningMode();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
#include <string>
|
||||
#include <support/app_control.h>
|
||||
#include <support/signal_support.h>
|
||||
#include "vss_vehiclespeed_bs_rx.h"
|
||||
|
||||
|
||||
/**
|
||||
* @brief Application Class of the open trunk example
|
||||
*/
|
||||
class CTrunkControl
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* @brief Start and initialize the application control and load vehicle devices and basic services
|
||||
* @param[in] uiInstance Instance number the application will connect to. 0 will start a standalone application
|
||||
* @return Return true on success otherwise false
|
||||
*/
|
||||
bool Initialize(uint32_t uiInstance);
|
||||
|
||||
/**
|
||||
* @brief After initialization/configuration the system mode needs to be set to running mode
|
||||
*/
|
||||
void SetRunningMode();
|
||||
|
||||
/**
|
||||
* @brief Shutdown the system.
|
||||
*/
|
||||
void Shutdown();
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* @brief check if SDV_FRAMEWORK_RUNTIME environment variable exists
|
||||
* @return Return true if environment variable is found otherwise false
|
||||
*/
|
||||
bool IsSDVFrameworkEnvironmentSet();
|
||||
|
||||
/**
|
||||
* @brief Loac config file and register vehicle device and basic service.
|
||||
* @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);
|
||||
|
||||
sdv::app::CAppControl m_appcontrol; ///< App-control of SDV V-API.
|
||||
bool m_bInitialized = false; ///< Set when initialized.
|
||||
};
|
||||
60
examples/open_trunk_example/open_trunk_app/trunk_example.cpp
Normal file
60
examples/open_trunk_example/open_trunk_app/trunk_example.cpp
Normal file
@@ -0,0 +1,60 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib> // for std::strtol
|
||||
#include "trunk_application.h"
|
||||
#include "console.h"
|
||||
|
||||
#if defined(_WIN32) && defined(_UNICODE)
|
||||
extern "C" int wmain(int argc, wchar_t* argv[])
|
||||
{
|
||||
uint32_t uiInstance = 0;
|
||||
if (argc < 2)
|
||||
{
|
||||
std::cout << "Missing instance number to connect to, '0' will run as standalone application" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
try
|
||||
{
|
||||
uiInstance = std::stoi(argv[1]);
|
||||
}
|
||||
catch (const std::exception& )
|
||||
{
|
||||
uiInstance = 0;
|
||||
}
|
||||
|
||||
#else
|
||||
extern "C" int main(int argc, char* argv[])
|
||||
{
|
||||
uint32_t uiInstance = 0;
|
||||
if (argc < 2)
|
||||
{
|
||||
std::cout << "Missing instance number to connect to, '0' will run as standalone application" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
try
|
||||
{
|
||||
uiInstance = std::stoi(argv[1]);
|
||||
}
|
||||
catch (const std::exception& )
|
||||
{
|
||||
uiInstance = 0;
|
||||
}
|
||||
#endif
|
||||
CTrunkControl appobj;
|
||||
if (!appobj.Initialize(uiInstance))
|
||||
{
|
||||
std::cout << "ERROR: Failed to initialize application control." << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
CConsole visual_obj;
|
||||
visual_obj.PrintHeader(uiInstance);
|
||||
visual_obj.PrepareDataConsumers();
|
||||
|
||||
appobj.SetRunningMode();
|
||||
visual_obj.RunUntilBreak();
|
||||
|
||||
visual_obj.ResetSignals();
|
||||
|
||||
appobj.Shutdown();
|
||||
return 0;
|
||||
}
|
||||
123
examples/open_trunk_example/open_trunk_example.dbc
Normal file
123
examples/open_trunk_example/open_trunk_example.dbc
Normal file
@@ -0,0 +1,123 @@
|
||||
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_: trunk
|
||||
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" trunk
|
||||
|
||||
BO_ 3 CAN_Output: 2 trunk
|
||||
SG_ OpenTrunk : 1|1@0+ (1,0) [0|1] "" Vector__XXX
|
||||
|
||||
|
||||
|
||||
CM_ SG_ 0 Speed "Vehicle speed longitudinal based on wheel speed sensors and longitudinal acceleration.";
|
||||
CM_ SG_ 3 OpenTrunk "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_ "ProtocolType" "CAN";
|
||||
BA_ "BusType" "CAN";
|
||||
BA_ "Baudrate" 500000;
|
||||
BA_ "DBName" "PrivateCAN";
|
||||
BA_ "GenMsgSendType" BO_ 0 0;
|
||||
BA_ "GenMsgCycleTime" BO_ 0 10;
|
||||
BA_ "GenMsgSendType" BO_ 3 0;
|
||||
BA_ "GenMsgCycleTime" BO_ 3 10;
|
||||
|
||||
733
examples/open_trunk_example/open_trunk_receiver.asc
Normal file
733
examples/open_trunk_example/open_trunk_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 00 00 32
|
||||
0.401499 1 0 Rx d 8 00 00 00 00 00 00 00 66
|
||||
0.602210 1 0 Rx d 8 00 00 00 00 00 00 00 98
|
||||
0.802858 1 0 Rx d 8 00 00 00 00 00 00 00 CC
|
||||
1.003648 1 0 Rx d 8 00 00 00 00 00 00 01 00
|
||||
1.204951 1 0 Rx d 8 00 00 00 00 00 00 01 32
|
||||
1.405930 1 0 Rx d 8 00 00 00 00 00 00 01 66
|
||||
1.607026 1 0 Rx d 8 00 00 00 00 00 00 01 98
|
||||
1.807489 1 0 Rx d 8 00 00 00 00 00 00 01 CC
|
||||
2.007739 1 0 Rx d 8 00 00 00 00 00 00 02 00
|
||||
2.208098 1 0 Rx d 8 00 00 00 00 00 00 02 32
|
||||
2.408547 1 0 Rx d 8 00 00 00 00 00 00 02 66
|
||||
2.609562 1 0 Rx d 8 00 00 00 00 00 00 02 98
|
||||
2.809847 1 0 Rx d 8 00 00 00 00 00 00 02 CC
|
||||
3.010645 1 0 Rx d 8 00 00 00 00 00 00 03 00
|
||||
3.211386 1 0 Rx d 8 00 00 00 00 00 00 03 32
|
||||
3.412526 1 0 Rx d 8 00 00 00 00 00 00 03 66
|
||||
3.613245 1 0 Rx d 8 00 00 00 00 00 00 03 98
|
||||
3.813713 1 0 Rx d 8 00 00 00 00 00 00 03 CC
|
||||
4.014112 1 0 Rx d 8 00 00 00 00 00 00 04 00
|
||||
4.214398 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
4.414982 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
4.615295 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
4.815465 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
5.016380 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
5.216542 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
5.417300 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
5.617988 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
5.818408 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
6.019516 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
6.220729 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
6.421086 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
6.621658 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
6.821893 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
7.023523 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
7.224499 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
7.424949 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
7.625353 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
7.825592 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
8.026488 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
8.227611 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
8.427815 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
8.628525 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
8.829077 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
9.029962 1 0 Rx d 8 00 00 00 00 00 00 08 FE
|
||||
9.230475 1 0 Rx d 8 00 00 00 00 00 00 09 32
|
||||
9.431706 1 0 Rx d 8 00 00 00 00 00 00 09 66
|
||||
9.632166 1 0 Rx d 8 00 00 00 00 00 00 09 98
|
||||
9.832447 1 0 Rx d 8 00 00 00 00 00 00 09 CC
|
||||
10.033648 1 0 Rx d 8 00 00 00 00 00 00 09 FE
|
||||
10.234917 1 0 Rx d 8 00 00 00 00 00 00 0A 32
|
||||
10.435382 1 0 Rx d 8 00 00 00 00 00 00 0A 66
|
||||
10.635758 1 0 Rx d 8 00 00 00 00 00 00 0A 98
|
||||
10.836600 1 0 Rx d 8 00 00 00 00 00 00 0A CC
|
||||
11.037378 1 0 Rx d 8 00 00 00 00 00 00 0A FE
|
||||
11.237882 1 0 Rx d 8 00 00 00 00 00 00 0B 32
|
||||
11.439001 1 0 Rx d 8 00 00 00 00 00 00 0B 66
|
||||
11.639635 1 0 Rx d 8 00 00 00 00 00 00 0B 98
|
||||
11.840391 1 0 Rx d 8 00 00 00 00 00 00 0B CC
|
||||
12.040855 1 0 Rx d 8 00 00 00 00 00 00 0B FE
|
||||
12.242131 1 0 Rx d 8 00 00 00 00 00 00 0C 32
|
||||
12.443152 1 0 Rx d 8 00 00 00 00 00 00 0C 66
|
||||
12.644236 1 0 Rx d 8 00 00 00 00 00 00 0C 98
|
||||
12.844648 1 0 Rx d 8 00 00 00 00 00 00 0C CC
|
||||
13.045033 1 0 Rx d 8 00 00 00 00 00 00 0C FE
|
||||
13.245501 1 0 Rx d 8 00 00 00 00 00 00 0D 32
|
||||
13.446980 1 0 Rx d 8 00 00 00 00 00 00 0D 66
|
||||
13.647729 1 0 Rx d 8 00 00 00 00 00 00 0D 98
|
||||
13.848694 1 0 Rx d 8 00 00 00 00 00 00 0D CC
|
||||
14.050383 1 0 Rx d 8 00 00 00 00 00 00 0D FE
|
||||
14.250963 1 0 Rx d 8 00 00 00 00 00 00 0E 32
|
||||
14.451368 1 0 Rx d 8 00 00 00 00 00 00 0E 66
|
||||
14.652121 1 0 Rx d 8 00 00 00 00 00 00 0E 98
|
||||
14.853783 1 0 Rx d 8 00 00 00 00 00 00 0E CC
|
||||
15.054832 1 0 Rx d 8 00 00 00 00 00 00 0E FE
|
||||
15.255178 1 0 Rx d 8 00 00 00 00 00 00 0F 32
|
||||
15.456191 1 0 Rx d 8 00 00 00 00 00 00 0F 66
|
||||
15.656966 1 0 Rx d 8 00 00 00 00 00 00 0F 98
|
||||
15.857494 1 0 Rx d 8 00 00 00 00 00 00 0F CC
|
||||
16.058330 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
16.259059 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
16.459296 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
16.659768 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
16.860430 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
17.060657 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
17.260999 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
17.461425 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
17.662180 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
17.862641 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
18.063737 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
18.264310 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
18.465286 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
18.666105 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
18.867149 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
19.067565 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
19.268397 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
19.468547 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
19.669109 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
19.869927 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
20.070496 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
20.271128 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
20.471522 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
20.672562 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
20.873219 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
21.073484 1 0 Rx d 8 00 00 00 00 00 00 15 00
|
||||
21.274192 1 0 Rx d 8 00 00 00 00 00 00 15 32
|
||||
21.474746 1 0 Rx d 8 00 00 00 00 00 00 15 66
|
||||
21.674944 1 0 Rx d 8 00 00 00 00 00 00 15 98
|
||||
21.875689 1 0 Rx d 8 00 00 00 00 00 00 15 CC
|
||||
22.076798 1 0 Rx d 8 00 00 00 00 00 00 16 00
|
||||
22.278040 1 0 Rx d 8 00 00 00 00 00 00 16 32
|
||||
22.479430 1 0 Rx d 8 00 00 00 00 00 00 16 66
|
||||
22.679827 1 0 Rx d 8 00 00 00 00 00 00 16 98
|
||||
22.880811 1 0 Rx d 8 00 00 00 00 00 00 16 CC
|
||||
23.081770 1 0 Rx d 8 00 00 00 00 00 00 17 00
|
||||
23.281961 1 0 Rx d 8 00 00 00 00 00 00 17 32
|
||||
23.482218 1 0 Rx d 8 00 00 00 00 00 00 17 66
|
||||
23.682829 1 0 Rx d 8 00 00 00 00 00 00 17 98
|
||||
23.883485 1 0 Rx d 8 00 00 00 00 00 00 17 CC
|
||||
24.084356 1 0 Rx d 8 00 00 00 00 00 00 18 00
|
||||
24.285369 1 0 Rx d 8 00 00 00 00 00 00 16 00
|
||||
24.485694 1 0 Rx d 8 00 00 00 00 00 00 14 00
|
||||
24.685859 1 0 Rx d 8 00 00 00 00 00 00 12 00
|
||||
24.886357 1 0 Rx d 8 00 00 00 00 00 00 10 00
|
||||
25.087476 1 0 Rx d 8 00 00 00 00 00 00 0E 00
|
||||
25.287822 1 0 Rx d 8 00 00 00 00 00 00 0C 00
|
||||
25.488562 1 0 Rx d 8 00 00 00 00 00 00 0A 00
|
||||
25.688999 1 0 Rx d 8 00 00 00 00 00 00 08 00
|
||||
25.889585 1 0 Rx d 8 00 00 00 00 00 00 06 00
|
||||
26.091147 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
26.292392 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
26.492961 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
26.693929 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
26.895003 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
27.095334 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
27.295680 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
27.497172 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
27.698339 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
27.898922 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
28.099435 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
28.299733 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
28.499895 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
28.700373 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
28.901284 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
29.102050 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
29.303311 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
29.503625 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
29.703906 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
29.904220 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
30.104471 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
30.305439 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
30.505755 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
30.706401 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
30.907561 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
31.107834 1 0 Rx d 8 00 00 00 00 00 00 04 98
|
||||
31.308727 1 0 Rx d 8 00 00 00 00 00 00 04 CC
|
||||
31.509748 1 0 Rx d 8 00 00 00 00 00 00 04 FE
|
||||
31.710425 1 0 Rx d 8 00 00 00 00 00 00 05 32
|
||||
31.910680 1 0 Rx d 8 00 00 00 00 00 00 05 66
|
||||
32.111808 1 0 Rx d 8 00 00 00 00 00 00 05 98
|
||||
32.312183 1 0 Rx d 8 00 00 00 00 00 00 05 CC
|
||||
32.512689 1 0 Rx d 8 00 00 00 00 00 00 05 FE
|
||||
32.713234 1 0 Rx d 8 00 00 00 00 00 00 06 32
|
||||
32.914537 1 0 Rx d 8 00 00 00 00 00 00 06 66
|
||||
33.114779 1 0 Rx d 8 00 00 00 00 00 00 06 98
|
||||
33.315177 1 0 Rx d 8 00 00 00 00 00 00 06 CC
|
||||
33.516145 1 0 Rx d 8 00 00 00 00 00 00 06 FE
|
||||
33.717179 1 0 Rx d 8 00 00 00 00 00 00 07 32
|
||||
33.918008 1 0 Rx d 8 00 00 00 00 00 00 07 66
|
||||
34.118478 1 0 Rx d 8 00 00 00 00 00 00 07 98
|
||||
34.319173 1 0 Rx d 8 00 00 00 00 00 00 07 CC
|
||||
34.519476 1 0 Rx d 8 00 00 00 00 00 00 07 FE
|
||||
34.720208 1 0 Rx d 8 00 00 00 00 00 00 08 32
|
||||
34.920661 1 0 Rx d 8 00 00 00 00 00 00 08 66
|
||||
35.121788 1 0 Rx d 8 00 00 00 00 00 00 08 98
|
||||
35.322204 1 0 Rx d 8 00 00 00 00 00 00 08 CC
|
||||
35.523025 1 0 Rx d 8 00 00 00 00 00 00 08 FE
|
||||
35.723694 1 0 Rx d 8 00 00 00 00 00 00 09 32
|
||||
35.924256 1 0 Rx d 8 00 00 00 00 00 00 09 66
|
||||
36.125166 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
36.325455 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
36.526130 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
36.726660 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
36.927031 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
37.128202 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
37.328463 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
37.529261 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
37.730042 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
37.930784 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
38.132083 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
38.332765 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
38.534007 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
38.735096 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
38.935972 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
39.136999 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
39.337463 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
39.537932 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
39.738646 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
39.939300 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
40.139463 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
40.339825 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
40.540892 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
40.742804 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
40.943116 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
41.143827 1 0 Rx d 8 00 00 00 00 00 00 0E 98
|
||||
41.344606 1 0 Rx d 8 00 00 00 00 00 00 0E CC
|
||||
41.545645 1 0 Rx d 8 00 00 00 00 00 00 0E FE
|
||||
41.746766 1 0 Rx d 8 00 00 00 00 00 00 0F 32
|
||||
41.947757 1 0 Rx d 8 00 00 00 00 00 00 0F 66
|
||||
42.148907 1 0 Rx d 8 00 00 00 00 00 00 0F 98
|
||||
42.350038 1 0 Rx d 8 00 00 00 00 00 00 0F CC
|
||||
42.550890 1 0 Rx d 8 00 00 00 00 00 00 0F FE
|
||||
42.752057 1 0 Rx d 8 00 00 00 00 00 00 10 32
|
||||
42.953446 1 0 Rx d 8 00 00 00 00 00 00 10 66
|
||||
43.153679 1 0 Rx d 8 00 00 00 00 00 00 10 98
|
||||
43.354061 1 0 Rx d 8 00 00 00 00 00 00 10 CC
|
||||
43.555097 1 0 Rx d 8 00 00 00 00 00 00 10 FE
|
||||
43.755339 1 0 Rx d 8 00 00 00 00 00 00 11 32
|
||||
43.955653 1 0 Rx d 8 00 00 00 00 00 00 11 66
|
||||
44.156515 1 0 Rx d 8 00 00 00 00 00 00 11 98
|
||||
44.357275 1 0 Rx d 8 00 00 00 00 00 00 11 CC
|
||||
44.557752 1 0 Rx d 8 00 00 00 00 00 00 11 FE
|
||||
44.758675 1 0 Rx d 8 00 00 00 00 00 00 12 32
|
||||
44.959208 1 0 Rx d 8 00 00 00 00 00 00 12 66
|
||||
45.159610 1 0 Rx d 8 00 00 00 00 00 00 12 98
|
||||
45.359903 1 0 Rx d 8 00 00 00 00 00 00 12 CC
|
||||
45.560465 1 0 Rx d 8 00 00 00 00 00 00 13 00
|
||||
45.761617 1 0 Rx d 8 00 00 00 00 00 00 13 32
|
||||
45.961932 1 0 Rx d 8 00 00 00 00 00 00 13 66
|
||||
46.162996 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
46.363493 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
46.564408 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
46.765361 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
46.965804 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
47.166504 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
47.367378 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
47.568797 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
47.769039 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
47.970066 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
48.170896 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
48.371996 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
48.572310 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
48.773330 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
48.975218 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
49.175780 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
49.376198 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
49.577079 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
49.778128 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
49.978540 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
50.179871 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
50.380088 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
50.580846 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
50.781325 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
50.982477 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
51.182651 1 0 Rx d 8 00 00 00 00 00 00 12 00
|
||||
51.383578 1 0 Rx d 8 00 00 00 00 00 00 10 00
|
||||
51.584095 1 0 Rx d 8 00 00 00 00 00 00 0E 00
|
||||
51.784794 1 0 Rx d 8 00 00 00 00 00 00 0C 00
|
||||
51.985412 1 0 Rx d 8 00 00 00 00 00 00 0A 00
|
||||
52.186861 1 0 Rx d 8 00 00 00 00 00 00 08 00
|
||||
52.387832 1 0 Rx d 8 00 00 00 00 00 00 06 00
|
||||
52.588288 1 0 Rx d 8 00 00 00 00 00 00 04 00
|
||||
52.789157 1 0 Rx d 8 00 00 00 00 00 00 02 00
|
||||
52.989942 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
53.190327 1 0 Rx d 8 00 00 00 00 00 00 00 32
|
||||
53.391588 1 0 Rx d 8 00 00 00 00 00 00 00 66
|
||||
53.592249 1 0 Rx d 8 00 00 00 00 00 00 00 98
|
||||
53.792386 1 0 Rx d 8 00 00 00 00 00 00 00 CC
|
||||
53.992968 1 0 Rx d 8 00 00 00 00 00 00 01 00
|
||||
54.193367 1 0 Rx d 8 00 00 00 00 00 00 01 32
|
||||
54.394716 1 0 Rx d 8 00 00 00 00 00 00 01 66
|
||||
54.595105 1 0 Rx d 8 00 00 00 00 00 00 01 98
|
||||
54.795731 1 0 Rx d 8 00 00 00 00 00 00 01 CC
|
||||
54.996284 1 0 Rx d 8 00 00 00 00 00 00 02 00
|
||||
55.197576 1 0 Rx d 8 00 00 00 00 00 00 02 32
|
||||
55.398054 1 0 Rx d 8 00 00 00 00 00 00 02 66
|
||||
55.598364 1 0 Rx d 8 00 00 00 00 00 00 02 98
|
||||
55.798965 1 0 Rx d 8 00 00 00 00 00 00 02 CC
|
||||
55.999265 1 0 Rx d 8 00 00 00 00 00 00 03 00
|
||||
56.199561 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
56.400268 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
56.601059 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
56.801284 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
57.002356 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
57.202816 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
57.404465 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
57.604978 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
57.805539 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
58.006555 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
58.207292 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
58.407613 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
58.607932 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
58.808839 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
59.009580 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
59.210003 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
59.410177 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
59.610613 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
59.811194 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
60.012120 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
60.212784 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
60.413841 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
60.614435 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
60.815231 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
61.015910 1 0 Rx d 8 00 00 00 00 00 00 07 FE
|
||||
61.216506 1 0 Rx d 8 00 00 00 00 00 00 08 32
|
||||
61.416722 1 0 Rx d 8 00 00 00 00 00 00 08 66
|
||||
61.617300 1 0 Rx d 8 00 00 00 00 00 00 08 98
|
||||
61.817810 1 0 Rx d 8 00 00 00 00 00 00 08 CC
|
||||
62.018343 1 0 Rx d 8 00 00 00 00 00 00 08 FE
|
||||
62.218622 1 0 Rx d 8 00 00 00 00 00 00 09 32
|
||||
62.419551 1 0 Rx d 8 00 00 00 00 00 00 09 66
|
||||
62.620102 1 0 Rx d 8 00 00 00 00 00 00 09 98
|
||||
62.821311 1 0 Rx d 8 00 00 00 00 00 00 09 CC
|
||||
63.021686 1 0 Rx d 8 00 00 00 00 00 00 09 FE
|
||||
63.222351 1 0 Rx d 8 00 00 00 00 00 00 0A 32
|
||||
63.422926 1 0 Rx d 8 00 00 00 00 00 00 0A 66
|
||||
63.623731 1 0 Rx d 8 00 00 00 00 00 00 0A 98
|
||||
63.824543 1 0 Rx d 8 00 00 00 00 00 00 0A CC
|
||||
64.025549 1 0 Rx d 8 00 00 00 00 00 00 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 00 00 0B 66
|
||||
64.628603 1 0 Rx d 8 00 00 00 00 00 00 0B 98
|
||||
64.829281 1 0 Rx d 8 00 00 00 00 00 00 0B CC
|
||||
65.029458 1 0 Rx d 8 00 00 00 00 00 00 0B FE
|
||||
65.230602 1 0 Rx d 8 00 00 00 00 00 00 0C 32
|
||||
65.431146 1 0 Rx d 8 00 00 00 00 00 00 0C 66
|
||||
65.631565 1 0 Rx d 8 00 00 00 00 00 00 0C 98
|
||||
65.832193 1 0 Rx d 8 00 00 00 00 00 00 0C CC
|
||||
66.033275 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
66.233478 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
66.433824 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
66.634036 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
66.834443 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
67.035303 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
67.235911 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
67.436246 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
67.636459 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
67.837559 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
68.038290 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
68.239218 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
68.439848 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
68.640949 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
68.841707 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
69.042367 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
69.242794 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
69.444186 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
69.645299 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
69.845907 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
70.046190 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
70.247387 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
70.448524 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
70.649526 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
70.850244 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
71.050608 1 0 Rx d 8 00 00 00 00 00 00 11 FE
|
||||
71.250850 1 0 Rx d 8 00 00 00 00 00 00 12 32
|
||||
71.451347 1 0 Rx d 8 00 00 00 00 00 00 12 66
|
||||
71.652633 1 0 Rx d 8 00 00 00 00 00 00 12 98
|
||||
71.853189 1 0 Rx d 8 00 00 00 00 00 00 12 CC
|
||||
72.053983 1 0 Rx d 8 00 00 00 00 00 00 13 00
|
||||
72.254639 1 0 Rx d 8 00 00 00 00 00 00 13 32
|
||||
72.455122 1 0 Rx d 8 00 00 00 00 00 00 13 66
|
||||
72.655692 1 0 Rx d 8 00 00 00 00 00 00 13 98
|
||||
72.856575 1 0 Rx d 8 00 00 00 00 00 00 13 CC
|
||||
73.057111 1 0 Rx d 8 00 00 00 00 00 00 14 00
|
||||
73.257433 1 0 Rx d 8 00 00 00 00 00 00 14 32
|
||||
73.458035 1 0 Rx d 8 00 00 00 00 00 00 14 66
|
||||
73.658563 1 0 Rx d 8 00 00 00 00 00 00 14 98
|
||||
73.858949 1 0 Rx d 8 00 00 00 00 00 00 14 CC
|
||||
74.059429 1 0 Rx d 8 00 00 00 00 00 00 15 00
|
||||
74.259956 1 0 Rx d 8 00 00 00 00 00 00 15 32
|
||||
74.460450 1 0 Rx d 8 00 00 00 00 00 00 15 66
|
||||
74.661020 1 0 Rx d 8 00 00 00 00 00 00 15 98
|
||||
74.861275 1 0 Rx d 8 00 00 00 00 00 00 15 CC
|
||||
75.061860 1 0 Rx d 8 00 00 00 00 00 00 16 00
|
||||
75.262959 1 0 Rx d 8 00 00 00 00 00 00 16 32
|
||||
75.463897 1 0 Rx d 8 00 00 00 00 00 00 16 66
|
||||
75.664448 1 0 Rx d 8 00 00 00 00 00 00 16 98
|
||||
75.864638 1 0 Rx d 8 00 00 00 00 00 00 16 CC
|
||||
76.065108 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
76.265941 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
76.466668 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
76.667414 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
76.867975 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
77.068637 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
77.269838 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
77.471315 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
77.672213 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
77.873438 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
78.073784 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
78.274128 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
78.474507 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
78.674821 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
78.876104 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
79.076896 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
79.277801 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
79.478570 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
79.679197 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
79.880361 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
80.080813 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
80.281318 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
80.482751 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
80.682954 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
80.883925 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
81.084430 1 0 Rx d 8 00 00 00 00 00 00 01 98
|
||||
81.285344 1 0 Rx d 8 00 00 00 00 00 00 01 CC
|
||||
81.485800 1 0 Rx d 8 00 00 00 00 00 00 02 00
|
||||
81.686289 1 0 Rx d 8 00 00 00 00 00 00 02 32
|
||||
81.887113 1 0 Rx d 8 00 00 00 00 00 00 02 66
|
||||
82.088359 1 0 Rx d 8 00 00 00 00 00 00 02 98
|
||||
82.288829 1 0 Rx d 8 00 00 00 00 00 00 02 CC
|
||||
82.490045 1 0 Rx d 8 00 00 00 00 00 00 03 00
|
||||
82.690540 1 0 Rx d 8 00 00 00 00 00 00 03 32
|
||||
82.890872 1 0 Rx d 8 00 00 00 00 00 00 03 66
|
||||
83.091725 1 0 Rx d 8 00 00 00 00 00 00 03 98
|
||||
83.292335 1 0 Rx d 8 00 00 00 00 00 00 03 CC
|
||||
83.493168 1 0 Rx d 8 00 00 00 00 00 00 04 00
|
||||
83.694457 1 0 Rx d 8 00 00 00 00 00 00 04 32
|
||||
83.894713 1 0 Rx d 8 00 00 00 00 00 00 04 66
|
||||
84.095654 1 0 Rx d 8 00 00 00 00 00 00 04 98
|
||||
84.296759 1 0 Rx d 8 00 00 00 00 00 00 04 CC
|
||||
84.497565 1 0 Rx d 8 00 00 00 00 00 00 04 FE
|
||||
84.697811 1 0 Rx d 8 00 00 00 00 00 00 05 32
|
||||
84.898319 1 0 Rx d 8 00 00 00 00 00 00 05 66
|
||||
85.099139 1 0 Rx d 8 00 00 00 00 00 00 05 98
|
||||
85.299414 1 0 Rx d 8 00 00 00 00 00 00 05 CC
|
||||
85.500064 1 0 Rx d 8 00 00 00 00 00 00 05 FE
|
||||
85.700760 1 0 Rx d 8 00 00 00 00 00 00 06 32
|
||||
85.901271 1 0 Rx d 8 00 00 00 00 00 00 06 66
|
||||
86.102122 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
86.303033 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
86.504461 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
86.705469 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
86.906178 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
87.106475 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
87.307347 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
87.507818 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
87.708986 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
87.909492 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
88.110633 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
88.311199 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
88.512430 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
88.713268 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
88.913936 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
89.115265 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
89.316255 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
89.516812 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
89.717160 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
89.918334 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
90.119362 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
90.319783 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
90.520010 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
90.720804 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
90.921045 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
91.122521 1 0 Rx d 8 00 00 00 00 00 00 0B 98
|
||||
91.323248 1 0 Rx d 8 00 00 00 00 00 00 0B CC
|
||||
91.523740 1 0 Rx d 8 00 00 00 00 00 00 0B FE
|
||||
91.724270 1 0 Rx d 8 00 00 00 00 00 00 0C 32
|
||||
91.924495 1 0 Rx d 8 00 00 00 00 00 00 0C 66
|
||||
92.125094 1 0 Rx d 8 00 00 00 00 00 00 0C 98
|
||||
92.325463 1 0 Rx d 8 00 00 00 00 00 00 0C CC
|
||||
92.526589 1 0 Rx d 8 00 00 00 00 00 00 0C FE
|
||||
92.727359 1 0 Rx d 8 00 00 00 00 00 00 0D 32
|
||||
92.927951 1 0 Rx d 8 00 00 00 00 00 00 0D 66
|
||||
93.128612 1 0 Rx d 8 00 00 00 00 00 00 0D 98
|
||||
93.329125 1 0 Rx d 8 00 00 00 00 00 00 0D CC
|
||||
93.529656 1 0 Rx d 8 00 00 00 00 00 00 0D FE
|
||||
93.729954 1 0 Rx d 8 00 00 00 00 00 00 0E 32
|
||||
93.930485 1 0 Rx d 8 00 00 00 00 00 00 0E 66
|
||||
94.131667 1 0 Rx d 8 00 00 00 00 00 00 0E 98
|
||||
94.332592 1 0 Rx d 8 00 00 00 00 00 00 0E CC
|
||||
94.534376 1 0 Rx d 8 00 00 00 00 00 00 0E FE
|
||||
94.735010 1 0 Rx d 8 00 00 00 00 00 00 0F 32
|
||||
94.935150 1 0 Rx d 8 00 00 00 00 00 00 0F 66
|
||||
95.136367 1 0 Rx d 8 00 00 00 00 00 00 0F 98
|
||||
95.336759 1 0 Rx d 8 00 00 00 00 00 00 0F CC
|
||||
95.538112 1 0 Rx d 8 00 00 00 00 00 00 0F FE
|
||||
95.738250 1 0 Rx d 8 00 00 00 00 00 00 10 32
|
||||
95.938448 1 0 Rx d 8 00 00 00 00 00 00 10 66
|
||||
96.138702 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
96.339017 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
96.539273 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
96.739667 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
96.940239 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
97.141181 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
97.341565 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
97.542252 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
97.743455 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
97.944065 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
98.144313 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
98.345247 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
98.545510 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
98.746514 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
98.946817 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
99.147276 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
99.348008 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
99.548748 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
99.749477 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
99.950542 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
100.150895 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
100.351372 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
100.551608 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
100.751884 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
100.953095 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
101.154105 1 0 Rx d 8 00 00 00 00 00 00 15 98
|
||||
101.355479 1 0 Rx d 8 00 00 00 00 00 00 15 CC
|
||||
101.556655 1 0 Rx d 8 00 00 00 00 00 00 16 00
|
||||
101.758337 1 0 Rx d 8 00 00 00 00 00 00 16 32
|
||||
101.959398 1 0 Rx d 8 00 00 00 00 00 00 16 66
|
||||
102.160166 1 0 Rx d 8 00 00 00 00 00 00 16 98
|
||||
102.361893 1 0 Rx d 8 00 00 00 00 00 00 16 CC
|
||||
102.562712 1 0 Rx d 8 00 00 00 00 00 00 17 00
|
||||
102.763470 1 0 Rx d 8 00 00 00 00 00 00 17 32
|
||||
102.964242 1 0 Rx d 8 00 00 00 00 00 00 17 66
|
||||
103.164462 1 0 Rx d 8 00 00 00 00 00 00 17 98
|
||||
103.365670 1 0 Rx d 8 00 00 00 00 00 00 17 CC
|
||||
103.566984 1 0 Rx d 8 00 00 00 00 00 00 18 00
|
||||
103.767491 1 0 Rx d 8 00 00 00 00 00 00 16 00
|
||||
103.968187 1 0 Rx d 8 00 00 00 00 00 00 14 00
|
||||
104.169019 1 0 Rx d 8 00 00 00 00 00 00 12 00
|
||||
104.369584 1 0 Rx d 8 00 00 00 00 00 00 10 00
|
||||
104.570622 1 0 Rx d 8 00 00 00 00 00 00 0E 00
|
||||
104.770875 1 0 Rx d 8 00 00 00 00 00 00 0C 00
|
||||
104.971893 1 0 Rx d 8 00 00 00 00 00 00 0A 00
|
||||
105.172481 1 0 Rx d 8 00 00 00 00 00 00 08 00
|
||||
105.373330 1 0 Rx d 8 00 00 00 00 00 00 06 00
|
||||
105.573806 1 0 Rx d 8 00 00 00 00 00 00 04 00
|
||||
105.774099 1 0 Rx d 8 00 00 00 00 00 00 02 00
|
||||
105.974447 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
106.175002 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
106.375492 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
106.576183 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
106.776593 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
106.977149 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
107.177741 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
107.378029 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
107.578972 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
107.779803 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
107.980027 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
108.180959 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
108.381257 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
108.581572 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
108.782674 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
108.983284 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
109.184365 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
109.385521 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
109.586636 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
109.787259 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
109.988178 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
110.189275 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
110.389596 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
110.590122 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
110.791196 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
110.991450 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
111.192134 1 0 Rx d 8 00 00 00 00 00 00 05 32
|
||||
111.392307 1 0 Rx d 8 00 00 00 00 00 00 05 66
|
||||
111.593039 1 0 Rx d 8 00 00 00 00 00 00 05 98
|
||||
111.793374 1 0 Rx d 8 00 00 00 00 00 00 05 CC
|
||||
111.994395 1 0 Rx d 8 00 00 00 00 00 00 05 FE
|
||||
112.194655 1 0 Rx d 8 00 00 00 00 00 00 06 32
|
||||
112.395403 1 0 Rx d 8 00 00 00 00 00 00 06 66
|
||||
112.596067 1 0 Rx d 8 00 00 00 00 00 00 06 98
|
||||
112.797115 1 0 Rx d 8 00 00 00 00 00 00 06 CC
|
||||
112.998086 1 0 Rx d 8 00 00 00 00 00 00 06 FE
|
||||
113.198865 1 0 Rx d 8 00 00 00 00 00 00 07 32
|
||||
113.400050 1 0 Rx d 8 00 00 00 00 00 00 07 66
|
||||
113.600803 1 0 Rx d 8 00 00 00 00 00 00 07 98
|
||||
113.801155 1 0 Rx d 8 00 00 00 00 00 00 07 CC
|
||||
114.001391 1 0 Rx d 8 00 00 00 00 00 00 07 FE
|
||||
114.201901 1 0 Rx d 8 00 00 00 00 00 00 08 32
|
||||
114.402790 1 0 Rx d 8 00 00 00 00 00 00 08 66
|
||||
114.603954 1 0 Rx d 8 00 00 00 00 00 00 08 98
|
||||
114.804511 1 0 Rx d 8 00 00 00 00 00 00 08 CC
|
||||
115.005461 1 0 Rx d 8 00 00 00 00 00 00 08 FE
|
||||
115.205821 1 0 Rx d 8 00 00 00 00 00 00 09 32
|
||||
115.406250 1 0 Rx d 8 00 00 00 00 00 00 09 66
|
||||
115.607421 1 0 Rx d 8 00 00 00 00 00 00 09 98
|
||||
115.808089 1 0 Rx d 8 00 00 00 00 00 00 09 CC
|
||||
116.009056 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
116.209651 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
116.410167 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
116.611063 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
116.811256 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
117.012597 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
117.213027 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
117.413256 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
117.614268 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
117.814815 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
118.015806 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
118.216912 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
118.418089 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
118.618550 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
118.818990 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
119.019524 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
119.220232 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
119.420674 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
119.621843 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
119.822228 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
120.022790 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
120.223192 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
120.423809 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
120.624120 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
120.824613 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
121.025275 1 0 Rx d 8 00 00 00 00 00 00 0E FE
|
||||
121.226319 1 0 Rx d 8 00 00 00 00 00 00 0F 32
|
||||
121.426558 1 0 Rx d 8 00 00 00 00 00 00 0F 66
|
||||
121.626928 1 0 Rx d 8 00 00 00 00 00 00 0F 98
|
||||
121.828060 1 0 Rx d 8 00 00 00 00 00 00 0F CC
|
||||
122.028432 1 0 Rx d 8 00 00 00 00 00 00 0F FE
|
||||
122.229625 1 0 Rx d 8 00 00 00 00 00 00 10 32
|
||||
122.430282 1 0 Rx d 8 00 00 00 00 00 00 10 66
|
||||
122.631873 1 0 Rx d 8 00 00 00 00 00 00 10 98
|
||||
122.832576 1 0 Rx d 8 00 00 00 00 00 00 10 CC
|
||||
123.033001 1 0 Rx d 8 00 00 00 00 00 00 10 FE
|
||||
123.234495 1 0 Rx d 8 00 00 00 00 00 00 11 32
|
||||
123.435161 1 0 Rx d 8 00 00 00 00 00 00 11 66
|
||||
123.635467 1 0 Rx d 8 00 00 00 00 00 00 11 98
|
||||
123.835958 1 0 Rx d 8 00 00 00 00 00 00 11 CC
|
||||
124.036727 1 0 Rx d 8 00 00 00 00 00 00 11 FE
|
||||
124.237496 1 0 Rx d 8 00 00 00 00 00 00 12 32
|
||||
124.438549 1 0 Rx d 8 00 00 00 00 00 00 12 66
|
||||
124.639374 1 0 Rx d 8 00 00 00 00 00 00 12 98
|
||||
124.840097 1 0 Rx d 8 00 00 00 00 00 00 12 CC
|
||||
125.041013 1 0 Rx d 8 00 00 00 00 00 00 13 00
|
||||
125.241904 1 0 Rx d 8 00 00 00 00 00 00 13 32
|
||||
125.442917 1 0 Rx d 8 00 00 00 00 00 00 13 66
|
||||
125.643483 1 0 Rx d 8 00 00 00 00 00 00 13 98
|
||||
125.843622 1 0 Rx d 8 00 00 00 00 00 00 13 CC
|
||||
126.044017 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
126.244416 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
126.445959 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
126.646576 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
126.847412 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
127.048014 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
127.248629 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
127.449846 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
127.650202 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
127.851016 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
128.051902 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
128.252600 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
128.453022 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
128.654185 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
128.854959 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
129.055530 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
129.256566 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
129.457080 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
129.657467 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
129.857955 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
130.059113 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
130.259252 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
130.459873 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
130.660599 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
130.861485 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
131.062073 1 0 Rx d 8 00 00 00 00 00 00 0E 00
|
||||
131.262526 1 0 Rx d 8 00 00 00 00 00 00 0C 00
|
||||
131.462733 1 0 Rx d 8 00 00 00 00 00 00 0A 00
|
||||
131.663177 1 0 Rx d 8 00 00 00 00 00 00 08 00
|
||||
131.863776 1 0 Rx d 8 00 00 00 00 00 00 06 00
|
||||
132.064142 1 0 Rx d 8 00 00 00 00 00 00 04 00
|
||||
132.264373 1 0 Rx d 8 00 00 00 00 00 00 02 00
|
||||
132.464682 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
132.665303 1 0 Rx d 8 00 00 00 00 00 00 00 32
|
||||
132.866158 1 0 Rx d 8 00 00 00 00 00 00 00 66
|
||||
133.067404 1 0 Rx d 8 00 00 00 00 00 00 00 98
|
||||
133.267706 1 0 Rx d 8 00 00 00 00 00 00 00 CC
|
||||
133.468282 1 0 Rx d 8 00 00 00 00 00 00 01 00
|
||||
133.668586 1 0 Rx d 8 00 00 00 00 00 00 01 32
|
||||
133.869893 1 0 Rx d 8 00 00 00 00 00 00 01 66
|
||||
134.071618 1 0 Rx d 8 00 00 00 00 00 00 01 98
|
||||
134.271874 1 0 Rx d 8 00 00 00 00 00 00 01 CC
|
||||
134.472741 1 0 Rx d 8 00 00 00 00 00 00 02 00
|
||||
134.673589 1 0 Rx d 8 00 00 00 00 00 00 02 32
|
||||
134.873876 1 0 Rx d 8 00 00 00 00 00 00 02 66
|
||||
135.074141 1 0 Rx d 8 00 00 00 00 00 00 02 98
|
||||
135.275159 1 0 Rx d 8 00 00 00 00 00 00 02 CC
|
||||
135.475463 1 0 Rx d 8 00 00 00 00 00 00 03 00
|
||||
135.676395 1 0 Rx d 8 00 00 00 00 00 00 03 32
|
||||
135.876701 1 0 Rx d 8 00 00 00 00 00 00 03 66
|
||||
136.077738 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
136.278293 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
136.479223 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
136.680161 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
136.881016 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
137.081840 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
137.282072 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
137.482806 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
137.683252 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
137.884308 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
138.085017 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
138.285723 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
138.486456 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
138.686668 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
138.887913 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
139.088562 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
139.289008 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
139.489823 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
139.690118 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
139.890810 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
140.091141 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
140.291975 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
140.492297 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
140.692478 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
140.892742 1 0 Rx d 8 00 00 00 00 00 00 00 00
|
||||
141.093225 1 0 Rx d 8 00 00 00 00 00 00 08 98
|
||||
141.293667 1 0 Rx d 8 00 00 00 00 00 00 08 CC
|
||||
141.494396 1 0 Rx d 8 00 00 00 00 00 00 08 FE
|
||||
141.695062 1 0 Rx d 8 00 00 00 00 00 00 09 32
|
||||
141.895284 1 0 Rx d 8 00 00 00 00 00 00 09 66
|
||||
142.095960 1 0 Rx d 8 00 00 00 00 00 00 09 98
|
||||
142.297025 1 0 Rx d 8 00 00 00 00 00 00 09 CC
|
||||
142.497415 1 0 Rx d 8 00 00 00 00 00 00 09 FE
|
||||
142.697700 1 0 Rx d 8 00 00 00 00 00 00 0A 32
|
||||
142.898924 1 0 Rx d 8 00 00 00 00 00 00 0A 66
|
||||
143.100212 1 0 Rx d 8 00 00 00 00 00 00 0A 98
|
||||
143.300484 1 0 Rx d 8 00 00 00 00 00 00 0A CC
|
||||
143.501588 1 0 Rx d 8 00 00 00 00 00 00 0A FE
|
||||
143.701901 1 0 Rx d 8 00 00 00 00 00 00 0B 32
|
||||
143.902828 1 0 Rx d 8 00 00 00 00 00 00 0B 66
|
||||
144.103297 1 0 Rx d 8 00 00 00 00 00 00 0B 98
|
||||
144.304179 1 0 Rx d 8 00 00 00 00 00 00 0B CC
|
||||
144.504702 1 0 Rx d 8 00 00 00 00 00 00 0B FE
|
||||
144.704983 1 0 Rx d 8 00 00 00 00 00 00 0C 32
|
||||
144.906176 1 0 Rx d 8 00 00 00 00 00 00 0C 66
|
||||
145.107253 1 0 Rx d 8 00 00 00 00 00 00 0C 98
|
||||
145.307433 1 0 Rx d 8 00 00 00 00 00 00 0C CC
|
||||
145.508039 1 0 Rx d 8 00 00 00 00 00 00 0C FE
|
||||
145.708326 1 0 Rx d 8 00 00 00 00 00 00 0D 32
|
||||
145.909264 1 0 Rx d 8 00 00 00 00 00 00 0D 66
|
||||
146.111036 1 0 Rx d 8 00 00 00 00 00 00 0D 98
|
||||
End TriggerBlock
|
||||
@@ -0,0 +1,62 @@
|
||||
#include <iostream>
|
||||
#include "complex_service.h"
|
||||
|
||||
|
||||
void CTrunkExampleService::Initialize(const sdv::u8string& /*ssObjectConfig*/)
|
||||
{
|
||||
m_eStatus = sdv::EObjectStatus::initializing;
|
||||
|
||||
// Request the basic service for speed.
|
||||
auto pSpeedSvc = sdv::core::GetObject("Vehicle.Speed_Service").GetInterface<vss::Vehicle::SpeedService::IVSS_GetSpeed>();
|
||||
if (pSpeedSvc)
|
||||
{
|
||||
// Register speed change event handler.
|
||||
pSpeedSvc->RegisterOnSignalChangeOfVehicleSpeed(static_cast<vss::Vehicle::SpeedService::IVSS_SetSpeed_Event*> (this));
|
||||
}
|
||||
|
||||
// Request the basic service for opening the trunk
|
||||
m_pTrunkSvc = sdv::core::GetObject("Vehicle.Body.Trunk_Service").GetInterface<vss::Vehicle::Body::TrunkService::IVSS_SetOpen>();
|
||||
|
||||
if ((!pSpeedSvc) || (!m_pTrunkSvc))
|
||||
{
|
||||
SDV_LOG_ERROR("Could not get interfaces : [CTrunkExampleService]");
|
||||
m_eStatus = sdv::EObjectStatus::initialization_failure;
|
||||
return;
|
||||
}
|
||||
|
||||
m_eStatus = sdv::EObjectStatus::initialized;
|
||||
}
|
||||
|
||||
sdv::EObjectStatus CTrunkExampleService::GetStatus() const
|
||||
{
|
||||
return m_eStatus;
|
||||
}
|
||||
|
||||
void CTrunkExampleService::SetOperationMode(sdv::EOperationMode /*eMode*/)
|
||||
{
|
||||
// Not applicable
|
||||
}
|
||||
|
||||
void CTrunkExampleService::Shutdown()
|
||||
{
|
||||
// Unregister trunk change event handler.
|
||||
auto pSpeedSvc = sdv::core::GetObject("Vehicle.Speed_Service").GetInterface<vss::Vehicle::SpeedService::IVSS_GetSpeed>();
|
||||
if (pSpeedSvc)
|
||||
pSpeedSvc->UnregisterOnSignalChangeOfVehicleSpeed(static_cast<vss::Vehicle::SpeedService::IVSS_SetSpeed_Event*> (this));
|
||||
}
|
||||
|
||||
void CTrunkExampleService::SetSpeed(float value)
|
||||
{
|
||||
m_Speed = value;
|
||||
}
|
||||
|
||||
bool CTrunkExampleService::PopTrunk()
|
||||
{
|
||||
if (m_Speed == 0.0)
|
||||
{
|
||||
return m_pTrunkSvc->SetOpen(true);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
98
examples/open_trunk_example/trunk_service/complex_service.h
Normal file
98
examples/open_trunk_example/trunk_service/complex_service.h
Normal file
@@ -0,0 +1,98 @@
|
||||
#ifndef TRUNK_COMPLEX_SERVICE_EXAMPLE_H
|
||||
#define TRUNK_COMPLEX_SERVICE_EXAMPLE_H
|
||||
|
||||
#include <iostream>
|
||||
|
||||
// SDV framework support
|
||||
#include <support/component_impl.h>
|
||||
#include <support/signal_support.h>
|
||||
|
||||
// VSS interfaces - located in ../interfaces
|
||||
#include "../generated/vss_files/vss_vehiclespeed_bs_rx.h"
|
||||
#include "../generated/vss_files/vss_vehiclebodytrunk_bs_tx.h"
|
||||
|
||||
// Complex service trunk interface - located in ../generated/trunk_service
|
||||
#include "trunkkit.h"
|
||||
|
||||
|
||||
/**
|
||||
* @brief Open trunk service: opens the trunk if vehicle is not moving
|
||||
*/
|
||||
class CTrunkExampleService : public sdv::CSdvObject
|
||||
, public sdv::IObjectControl
|
||||
, public vss::Vehicle::SpeedService::IVSS_SetSpeed_Event
|
||||
, public ITrunkKitService
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief Constructor
|
||||
*/
|
||||
CTrunkExampleService(){}
|
||||
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~CTrunkExampleService()
|
||||
{
|
||||
// Just in case...
|
||||
Shutdown();
|
||||
}
|
||||
|
||||
// Interface map
|
||||
BEGIN_SDV_INTERFACE_MAP()
|
||||
SDV_INTERFACE_ENTRY(sdv::IObjectControl)
|
||||
SDV_INTERFACE_ENTRY(vss::Vehicle::SpeedService::IVSS_SetSpeed_Event)
|
||||
SDV_INTERFACE_ENTRY(ITrunkKitService)
|
||||
END_SDV_INTERFACE_MAP()
|
||||
|
||||
// Object declarations
|
||||
DECLARE_OBJECT_CLASS_TYPE(sdv::EObjectType::ComplexService)
|
||||
DECLARE_OBJECT_CLASS_NAME("Open Trunk 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 vehicleSpeed signal
|
||||
* @param[in] value vehicleSpeed
|
||||
*/
|
||||
virtual void SetSpeed(float value) override;
|
||||
|
||||
/**
|
||||
* @brief Save call to open the trunk. Opening the trunk is onkly allowed when the vehicle is not moving
|
||||
* @return Returns whether the trunk could be opened or not.
|
||||
*/
|
||||
virtual bool PopTrunk() override;
|
||||
|
||||
private:
|
||||
|
||||
sdv::EObjectStatus m_eStatus = sdv::EObjectStatus::initialization_pending; ///< Current object status
|
||||
|
||||
float m_Speed = 0.0; ///< Speed
|
||||
vss::Vehicle::Body::TrunkService::IVSS_SetOpen* m_pTrunkSvc = nullptr; ///< Trunk
|
||||
};
|
||||
|
||||
DEFINE_SDV_OBJECT(CTrunkExampleService)
|
||||
|
||||
#endif // !define TRUNK_COMPLEX_SERVICE_EXAMPLE_H
|
||||
16
examples/open_trunk_example/trunk_service/trunkkit.idl
Normal file
16
examples/open_trunk_example/trunk_service/trunkkit.idl
Normal file
@@ -0,0 +1,16 @@
|
||||
/*******************************************************************************
|
||||
* @file trunkkit.idl
|
||||
* @details Service interface definition to open the trunk.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Service to open the trunk
|
||||
*/
|
||||
interface ITrunkKitService
|
||||
{
|
||||
/**
|
||||
* @brief Save call to open the trunk. Opening the trunk is onkly allowed when the vehicle is not moving
|
||||
* @return Returns whether the trunk could be opened or not.
|
||||
*/
|
||||
boolean PopTrunk();
|
||||
};
|
||||
6
examples/open_trunk_example/vss_open_trunk_example.csv
Normal file
6
examples/open_trunk_example/vss_open_trunk_example.csv
Normal file
@@ -0,0 +1,6 @@
|
||||
;Class name;Function name;Signal name;vss;Signal direction;type;DBC CAN name includes CAN message name
|
||||
;;;;;;;
|
||||
VD;VehicleSpeed;Speed;vehicleSpeed;Vehicle.Speed;RX;float;CAN_Input.Speed
|
||||
VD;VehicleTrunk;Open;trunk;Vehicle.Body.Trunk;TX;boolean;CAN_Output.OpenTrunk
|
||||
BS;VehicleSpeed;Speed;vehicleSpeed;Vehicle.Speed;RX;float;Vehicle.Speed
|
||||
BS;VehicleTrunk;Open;trunk;Vehicle.Body.Trunk;TX;boolean;Vehicle.Body.Trunk
|
||||
|
Reference in New Issue
Block a user