Program Listing for File SimOneIOStruct.h

Return to documentation for file ( api\Cpp_API_Reference\SimOneIOStruct.h )

// ==========================================================================
// Copyright (C) 2018 - 2021 Beijing 51WORLD Digital Twin Technology Co., Ltd.
// , and/or its licensors.  All rights reserved.
//
// The coded instructions, statements, computer programs, and/or related
// material (collectively the "Data") in these files contain unpublished
// information proprietary to Beijing 51WORLD Digital Twin Technology Co., Ltd.
// ("51WORLD") and/or its licensors,  which is protected by the People's
// Republic of China and/or other countries copyright law and by
// international treaties.
//
// The Data may not be disclosed or distributed to third parties or be
// copied or duplicated, in whole or in part, without the prior written
// consent of 51WORLD.
//
// The copyright notices in the Software and this entire statement,
// including the above license grant, this restriction and the following
// disclaimer, must be included in all copies of the Software, in whole
// or in part, and all derivative works of the Software, unless such copies
// or derivative works are solely in the form of machine-executable object
// code generated by a source language processor.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
// 51WORLD DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED
// WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF
// NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE,
// OR ARISING FROM A COURSE OF DEALING, USAGE, OR TRADE PRACTICE. IN NO
// EVENT WILL 51WORLD AND/OR ITS LICENSORS BE LIABLE FOR ANY LOST
// REVENUES, DATA, OR PROFITS, OR SPECIAL, DIRECT, INDIRECT, OR
// CONSEQUENTIAL DAMAGES, EVEN IF 51WORLD AND/OR ITS LICENSORS HAS
// BEEN ADVISED OF THE POSSIBILITY OR PROBABILITY OF SUCH DAMAGES.
// ==========================================================================
#pragma once
#include <vector>
#include <map>
#ifndef WITHOUT_HDMAP
#include "SSD/SimVector.h"
#endif
#include <time.h>
#pragma pack(push)
#pragma pack(1)

#define SimOne_Freq 60

struct SimOne_Data
{
    long long timestamp = 0;

    int frame = 0;

    int version = 0;
};

struct SimOne_Data_Vec3f
{
    float x;

    float y;

    float z;
};
// ----------------------------
// SimOne Map (SimOne Output)
// ----------------------------
#define SOSM_CASE_START_EVENT_LABEL "SOSM_CASE_EVENT_START"
#define SOSM_CASE_STOP_EVENT_LABEL "SOSM_CASE_EVENT_STOP"

#define SOSM_MAP_LABEL "SOSM_MAP"
#define SOSM_MAP_OD_LENGT 128
#define SOSM_MAP_ODURL_LENGT 256
#define SOSM_MAP_ODMD5_LENGT 128

#define SOSM_CASENAME_LENGTH 256
#define SOSM_CASEID_LENGT 256
#define SOSM_TASKID_LENGT 256
#define SOSM_ACTORNAME_LENGT 256

#define MAX_PREDICTION_TRAJECTORY_SIZE 20
struct SimOne_Data_Map
{
    char openDrive[SOSM_MAP_OD_LENGT];

    char openDriveUrl[SOSM_MAP_ODURL_LENGT];

    char opendriveMd5[SOSM_MAP_ODMD5_LENGT];
};
// ----------------------------
// SimOne MainVehicle WayPoints (SimOne Output)
// ----------------------------
#define SOSM_WAYPOINTS_LABEL "SOSM_WAYPOINTS"
#define SOSM_WAYPOINTS_SIZE_MAX 100
#define MAX_MAINVEHICLE_NAME_LEN 64
struct SimOne_Data_WayPoints_Entry
{
    int index;

    float posX;

    float posY;

    float heading_x;

    float heading_y;

    float heading_z;

    float heading_w;
};

struct SimOne_Data_WayPoints : public SimOne_Data
{
    char mainVehicleId[MAX_MAINVEHICLE_NAME_LEN];

    int wayPointsSize;

    SimOne_Data_WayPoints_Entry wayPoints[SOSM_WAYPOINTS_SIZE_MAX];
};
// ----------------------------
// Vehicle pose control data (SimOne Input)
// ----------------------------
#define SOSM_POSE_CONTROL_PREFIX "SOSM_POSE_CONTROL_"
struct SimOne_Data_Pose_Control : public SimOne_Data
{
    float posX;

    float posY;

    float posZ;

    float oriX;

    float oriY;

    float oriZ;

    bool autoZ = false;
};

// ----------------------------
// Vehicle control data (SimOne Input)
// ----------------------------
#define SOSM_CONTROL_PREFIX "SOSM_CONTROL_"

// Vehicle control data (SimOne Input)
// ----------------------------
#define SOSM_DRIVER_CONTROL_PREFIX "SOSM_DRIVER_CONTROL_"

enum ESimOne_Gear_Mode
{
    ESimOne_Gear_Mode_Neutral = 0,

    ESimOne_Gear_Mode_Drive = 1,

    ESimOne_Gear_Mode_Reverse = 2,

    ESimOne_Gear_Mode_Parking = 3,

    ESimOne_Gear_Mode_1 = 4,

    ESimOne_Gear_Mode_2 = 5,

    ESimOne_Gear_Mode_3 = 6,

    ESimOne_Gear_Mode_4 = 7,

    ESimOne_Gear_Mode_5 = 8,

    ESimOne_Gear_Mode_6 = 9,

    ESimOne_Gear_Mode_7 = 10,

    ESimOne_Gear_Mode_8 = 11
};


enum ESimOne_Throttle_Mode
{
    ESimOne_Throttle_Mode_Percent = 0,

    ESimOne_Throttle_Mode_Torque = 1,

    ESimOne_Throttle_Mode_Speed = 2,

    ESimOne_Throttle_Mode_Accel = 3,

    ESimOne_Throttle_Mode_EngineAV = 4,

    ESimOne_Throttle_Mode_WheelTorque = 5
};


enum ESimOne_Brake_Mode
{
    ESimOne_Brake_Mode_Percent = 0,

    ESimOne_Brake_Mode_MasterCylinderPressure = 1,

    ESimOne_Brake_Mode_PedalForce = 2,

    ESimOne_Brake_Mode_WheelCylinderPressure = 3,

    ESimOne_Brake_Mode_WheelTorque = 4
};

enum ESimOne_Steering_Mode
{
    ESimOne_Steering_Mode_Percent = 0,

    ESimOne_Steering_Mode_SteeringWheelAngle = 1,

    ESimOne_Steering_Mode_Torque = 2,

    ESimOne_Steering_Mode_AngularSpeed = 3,

    ESimOne_Steering_Mode_WheelAngle = 4,

    ESimOne_Steering_Mode_WheelAnglarSpeed = 5
};

enum ESimOne_LogLevel_Type
{
    ESimOne_LogLevel_Type_Debug = 0,

    ESimOne_LogLevel_Type_Information = 1,

    ESimOne_LogLevel_Type_Warning = 2,

    ESimOne_LogLevel_Type_Error = 3,

    ESimOne_LogLevel_Type_Fatal = 4
};


#define SO_MAX_WHEEL_NUM  20
struct SimOne_Data_Control : public SimOne_Data
{
    ESimOne_Throttle_Mode throttleMode = ESimOne_Throttle_Mode_Percent;

    float throttle;

    ESimOne_Brake_Mode brakeMode = ESimOne_Brake_Mode_Percent;

    float brake;

    ESimOne_Steering_Mode steeringMode = ESimOne_Steering_Mode_Percent;

    float steering;

    bool handbrake = false;

    bool isManualGear = false;

    ESimOne_Gear_Mode gear;

    float clutch;

    float throttle_input_data[SO_MAX_WHEEL_NUM];

    float brake_input_data[SO_MAX_WHEEL_NUM];

    float steering_input_data[SO_MAX_WHEEL_NUM];
};

enum ESimOne_Drive_Mode
{
    ESimOne_Drive_Mode_API = 0,

    ESimOne_Drive_Mode_Driver = 1,

    ESimOne_Drive_Mode_API_Lateral = 2,

    ESimOne_Drive_Mode_API_Longitudinal = 3
};

struct SimOne_Trajectory_Point
{
    float posx;

    float posy;

    float speed;

    float accel;

    float theta;

    float kappa;

    float relative_time;

    float s;
};


#define SO_MAX_TRAJECTORY_POINT_NUM 500
struct SimOne_Data_Control_Trajectory : public SimOne_Data
{
    int point_num;

    SimOne_Trajectory_Point points[SO_MAX_TRAJECTORY_POINT_NUM];

    bool isReverse;
};

struct SimOne_Data_ESP_Control : public SimOne_Data
{
    int stopDistance;

    float velocityLimit;

    float steering;

    float steerTorque;

    float accel;

    float accelUpperLimit;

    float accelLowerLimit;

    float accelUpperComfLimit;

    float accelLowerComfLimit;

    bool standStill;

    bool driveOff;

    int brakeMode;

    int vlcShutdown;

    int gearMode;
};


// ----------------------------
// Vehicle Event Information data (SimOne Input)
// ----------------------------
#define SOSM_VEHICLE_EVENT_PREFIX "SOSM_VEHICLE_EVENT_"

enum ESimone_Vehicle_EventInfo_Type
{
    ESimOne_VehicleEventInfo_V2XWarningInfoType_FCW = 0,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_ICW = 1,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_LTA = 2,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_BSW_LCW = 3,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_DNPW = 4,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_EBW = 5,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_AVW = 6,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_CLW = 7,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_HLW = 8,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_SLW = 9,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_RLVW = 10,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_VRUCW = 11,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_GLOSA = 12,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_IVS = 13,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_TJW = 14,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_EVW = 15,

    ESimOne_VehicleEventInfo_V2XWarningInfoType_Unknown = 16
};


#define SO_MAX_WARNING_EVENT_NUM 1024
struct SimOne_Data_Vehicle_EventInfo : public SimOne_Data
{
    ESimone_Vehicle_EventInfo_Type type;

    char warningInfo[SO_MAX_WARNING_EVENT_NUM];
};



// ----------------------------
// Trajectory planning data (SimOne Input, for display)
// ----------------------------
#define SOSM_TRAJECTORY_PREFIX "SOSM_TRAJECTORY_"
#define SOSM_TRAJECTORY_SIZE_MAX 100
#define SO_MAX_TRAFFIC_EVENT_NUM 256
struct SimOne_Data_JudgeEvent {
    int hostVehicle;

    double time;

    char actualValue[SO_MAX_TRAFFIC_EVENT_NUM];

    char expectOp[SO_MAX_TRAFFIC_EVENT_NUM];

    char expectValue1[SO_MAX_TRAFFIC_EVENT_NUM];

    char expectValue2[SO_MAX_TRAFFIC_EVENT_NUM];

    char judgeId[SO_MAX_TRAFFIC_EVENT_NUM];

    char judgeType[SO_MAX_TRAFFIC_EVENT_NUM];

    char requireProperty[SO_MAX_TRAFFIC_EVENT_NUM];

    char taskId[SO_MAX_TRAFFIC_EVENT_NUM];

    char valueType[SO_MAX_TRAFFIC_EVENT_NUM];

    char version[SO_MAX_TRAFFIC_EVENT_NUM];
};

struct SimOne_Data_Trajectory_Entry
{
    float posX;

    float posY;

    float vel;
};

struct SimOne_Data_Trajectory : public SimOne_Data
{
    int trajectorySize;

    SimOne_Data_Trajectory_Entry trajectory[SOSM_TRAJECTORY_SIZE_MAX];
};

// ----------------------------
// MainVehicle body data(SimOne OutPut)
// ---------------------------
struct SimOne_Data_MainVehicle_Body
{
    char mainVehicleId[MAX_MAINVEHICLE_NAME_LEN];

    float axisDistance;

    //float axisHeight;     //vehicle axie height  unit: cm

    float cmFrontAxisOffset;

    float cmHeight;

    float cmYOffset;

    float chassisHeight;

    float chassisWidth;

    float frontLeftWheelOffset;

    float frontRightWheelOffset;

    float frontToFrontAxis;

    float rearAxisToRear;

    float RearLeftWheelOffset;

    float RearRightWheelOffset;

    char instanceId[SOSM_ACTORNAME_LENGT];

    char actorName[SOSM_ACTORNAME_LENGT];
};

// ----------------------------
// Trajectory planning data (SimOne Input, for display)
// ----------------------------
#define SOSM_TRAJECTORY_PREFIX "SOSM_TRAJECTORY_"
#define SOSM_TRAJECTORY_SIZE_MAX 100

// ----------------------------
// Graph Marker data (SimOne Input, for display)
// ----------------------------
#define SOSM_MARKER_PREFIX "SOSM_MARKER_"
#define SOSM_MARKER_SIZE_MAX 1024
#define SOSM_MARKER_STR_MAX 100
#define SOSM_MARKER_POINTS_MAX 3840

enum ESimone_Marker_Shape_Type
{
    ESimone_Marker_Shape_Type_ARROW = 0,

    ESimone_Marker_Shape_Type_CUBE = 1,

    ESimone_Marker_Shape_Type_SPHERE = 2,

    ESimone_Marker_Shape_Type_CYLINDER = 3,

    ESimone_Marker_Shape_Type_LINE_STRIP = 4,

    ESimone_Marker_Shape_Type_LINE_LIST = 5,

    ESimone_Marker_Shape_Type_CUBE_LIST = 6,

    ESimone_Marker_Shape_Type_SPHERE_LIST = 7,

    ESimone_Marker_Shape_Type_POINTS = 8,

    ESimone_Marker_Shape_Type_TEXT_VIEW_FACING = 9,

    ESimone_Marker_Shape_Type_MESH_RESOURCE = 10,

    ESimone_Marker_Shape_Type_TRIANGLE_LIST = 11,

    ESimone_Marker_Shape_Type_OBSTACLES = 12
};

enum ESimOne_Marker_SubType
{
    ESimOne_Marker_SubType_Unused = 0,

    ESimOne_Marker_OBSTACLE_PEDESTRIAN = 3,

    ESimOne_Marker_OBSTACLE_CYCLIST = 4,

    ESimOne_Marker_OBSTACLE_CAR = 5,

    ESimOne_Marker_OBSTACLE_TRICYCLE = 6,

    ESimOne_Marker_OBSTACLE_BIKE = 7
};

enum ESimOne_Marker_Action
{
    ESimOne_Marker_ADDMODIFY = 0,

    ESimOne_Marker_DELETE = 2,

    ESimOne_Marker_DELETEALL = 3
};

struct SimOne_Marker_Quaternion
{
    float x;

    float y;

    float z;

    float w;
};

struct SimOne_Marker_Color
{
    float r;

    float g;

    float b;

    float a;
};

struct SimOne_Marker_Pose
{
    SimOne_Data_Vec3f position;

    SimOne_Marker_Quaternion orientation;
};

struct SimOne_Data_Marker_Entry
{
    char ns[SOSM_MARKER_STR_MAX];

    int32_t id;

    ESimone_Marker_Shape_Type type;

    // int32_t action;

    ESimOne_Marker_Action action;

    SimOne_Marker_Pose pose;

    SimOne_Data_Vec3f scale;

    SimOne_Marker_Color color;

    float lifetime;

    bool frame_locked;

    int points_num;

    SimOne_Data_Vec3f points[SOSM_MARKER_POINTS_MAX];

    int colors_num;

    SimOne_Marker_Color colors[SOSM_MARKER_POINTS_MAX];

    // char text[SOSM_MARKER_STR_MAX];

    char resource[SOSM_MARKER_STR_MAX];

    char mesh_resource[SOSM_MARKER_STR_MAX];

    bool mesh_use_embedded_materials;

    ESimOne_Marker_SubType sub_type;

    int obstacle_id;
};

struct SimOne_Data_Marker : public SimOne_Data
{
    int markerSize;

    SimOne_Data_Marker_Entry markers[SOSM_MARKER_SIZE_MAX];
};

// ----------------------------
//  MianVehicle data (SimOne Output)
// ----------------------------
#define SOSM_POSE_PREFIX "SOSM_POSE_"
#define SOSM_EXTRA_STATES_SIZE_MAX 256

struct SimOne_Data_IMU
{
    float accelX;

    float accelY;

    float accelZ;

    float velX;

    float velY;

    float velZ;

    float angVelX;

    float angVelY;

    float angVelZ;

    float rotX;

    float rotY;

    float rotZ;
};

struct SimOne_Data_Gps : public SimOne_Data
{
    float posX;

    float posY;

    float posZ;

    float oriX;

    float oriY;

    float oriZ;

    float velX;

    float velY;

    float velZ;

    float throttle;

    float brake;

    float steering;

    int gear;

    float accelX;

    float accelY;

    float accelZ;

    float angVelX;

    float angVelY;

    float angVelZ;

    float wheelSpeedFL;

    float wheelSpeedFR;

    float wheelSpeedRL;

    float wheelSpeedRR;

    float engineRpm;

    float odometer;

    int extraStateSize;

    float extraStates[SOSM_EXTRA_STATES_SIZE_MAX];

    bool isGPSLost;

    char mainCarName[SOSM_ACTORNAME_LENGT];

    SimOne_Data_IMU imuData;
};

struct SimOne_Vehicle_Init_State
{
    SimOne_Data_Vec3f initPos;

    SimOne_Data_Vec3f initRot;

    float initSpeed;
};
enum ESimOne_Data_Vehicle_State
{
    ESimOne_Data_Vehicle_State_SO_M_SW,
    ESimOne_Data_Vehicle_State_S0_Vx_SM,
    ESimOne_Data_Vehicle_State_S0_Vy_SM,
    ESimOne_Data_Vehicle_State_S0_Vz_SM,
    ESimOne_Data_Vehicle_State_SO_M_ENGOUT,
    ESimOne_Data_Vehicle_State_SO_My_DR_L1,
    ESimOne_Data_Vehicle_State_SO_My_DR_R1,
    ESimOne_Data_Vehicle_State_SO_My_DR_L2,
    ESimOne_Data_Vehicle_State_SO_My_DR_R2,
    ESimOne_Data_Vehicle_State_SO_My_DR_L3,
    ESimOne_Data_Vehicle_State_SO_My_DR_R3,

    ESimOne_Data_Vehicle_State_SO_F_Pedal,
    ESimOne_Data_Vehicle_State_SO_Pbk_Con,
    ESimOne_Data_Vehicle_State_SO_My_Bk_L3,
    ESimOne_Data_Vehicle_State_SO_My_Bk_R3,

    ESimOne_Data_Vehicle_State_SO_ClutchTr,

    ESimOne_Data_Vehicle_State_SO_X_L1,
    ESimOne_Data_Vehicle_State_SO_Y_L1,
    ESimOne_Data_Vehicle_State_SO_Z_L1,
    ESimOne_Data_Vehicle_State_SO_X_L2,
    ESimOne_Data_Vehicle_State_SO_Y_L2,
    ESimOne_Data_Vehicle_State_SO_Z_L2,
    ESimOne_Data_Vehicle_State_SO_X_R1,
    ESimOne_Data_Vehicle_State_SO_Y_R1,
    ESimOne_Data_Vehicle_State_SO_Z_R1,
    ESimOne_Data_Vehicle_State_SO_X_R2,
    ESimOne_Data_Vehicle_State_SO_Y_R2,
    ESimOne_Data_Vehicle_State_SO_Z_R2,
    ESimOne_Data_Vehicle_State_SO_X_L3,
    ESimOne_Data_Vehicle_State_SO_Y_L3,
    ESimOne_Data_Vehicle_State_SO_Z_L3,
    ESimOne_Data_Vehicle_State_SO_X_R3,
    ESimOne_Data_Vehicle_State_SO_Y_R3,
    ESimOne_Data_Vehicle_State_SO_Z_R3,

    ESimOne_Data_Vehicle_State_SO_Xctc_L1,
    ESimOne_Data_Vehicle_State_SO_Yctc_L1,
    ESimOne_Data_Vehicle_State_SO_Zctc_L1,
    ESimOne_Data_Vehicle_State_SO_Xctc_L2,
    ESimOne_Data_Vehicle_State_SO_Yctc_L2,
    ESimOne_Data_Vehicle_State_SO_Zctc_L2,
    ESimOne_Data_Vehicle_State_SO_Xctc_R1,
    ESimOne_Data_Vehicle_State_SO_Yctc_R1,
    ESimOne_Data_Vehicle_State_SO_Zctc_R1,
    ESimOne_Data_Vehicle_State_SO_Xctc_R2,
    ESimOne_Data_Vehicle_State_SO_Yctc_R2,
    ESimOne_Data_Vehicle_State_SO_Zctc_R2,

    ESimOne_Data_Vehicle_State_SO_AVy_L1,
    ESimOne_Data_Vehicle_State_SO_Kappa_L1,
    ESimOne_Data_Vehicle_State_SO_Alpha_L1,
    ESimOne_Data_Vehicle_State_SO_Fz_L1,
    ESimOne_Data_Vehicle_State_SO_My_WC_L1,
    ESimOne_Data_Vehicle_State_SO_Fx_L1,
    ESimOne_Data_Vehicle_State_SO_Fy_L1,
    ESimOne_Data_Vehicle_State_SO_Jnc_L1,
    ESimOne_Data_Vehicle_State_SO_JncR_L1,
    ESimOne_Data_Vehicle_State_SO_Mz_L1,

    ESimOne_Data_Vehicle_State_SO_AVy_L2,
    ESimOne_Data_Vehicle_State_SO_Kappa_L2,
    ESimOne_Data_Vehicle_State_SO_Alpha_L2,
    ESimOne_Data_Vehicle_State_SO_Fz_L2,
    ESimOne_Data_Vehicle_State_SO_My_WC_L2,
    ESimOne_Data_Vehicle_State_SO_Fx_L2,
    ESimOne_Data_Vehicle_State_SO_Fy_L2,
    ESimOne_Data_Vehicle_State_SO_Jnc_L2,
    ESimOne_Data_Vehicle_State_SO_JncR_L2,
    ESimOne_Data_Vehicle_State_SO_Mz_L2,

    ESimOne_Data_Vehicle_State_SO_AVy_R1,
    ESimOne_Data_Vehicle_State_SO_Kappa_R1,
    ESimOne_Data_Vehicle_State_SO_Alpha_R1,
    ESimOne_Data_Vehicle_State_SO_Fz_R1,
    ESimOne_Data_Vehicle_State_SO_My_WC_R1,
    ESimOne_Data_Vehicle_State_SO_Fx_R1,
    ESimOne_Data_Vehicle_State_SO_Fy_R1,
    ESimOne_Data_Vehicle_State_SO_Jnc_R1,
    ESimOne_Data_Vehicle_State_SO_JncR_R1,
    ESimOne_Data_Vehicle_State_SO_Mz_R1,

    ESimOne_Data_Vehicle_State_SO_AVy_R2,
    ESimOne_Data_Vehicle_State_SO_Kappa_R2,
    ESimOne_Data_Vehicle_State_SO_Alpha_R2,
    ESimOne_Data_Vehicle_State_SO_Fz_R2,
    ESimOne_Data_Vehicle_State_SO_My_WC_R2,
    ESimOne_Data_Vehicle_State_SO_Fx_R2,
    ESimOne_Data_Vehicle_State_SO_Fy_R2,
    ESimOne_Data_Vehicle_State_SO_Jnc_R2,
    ESimOne_Data_Vehicle_State_SO_JncR_R2,
    ESimOne_Data_Vehicle_State_SO_Mz_R2,

    ESimOne_Data_Vehicle_State_SO_AVy_L3,
    ESimOne_Data_Vehicle_State_SO_Kappa_L3,
    ESimOne_Data_Vehicle_State_SO_Alpha_L3,
    ESimOne_Data_Vehicle_State_SO_Fz_L3,
    ESimOne_Data_Vehicle_State_SO_My_WC_L3,
    ESimOne_Data_Vehicle_State_SO_Fx_L3,
    ESimOne_Data_Vehicle_State_SO_Fy_L3,
    ESimOne_Data_Vehicle_State_SO_Jnc_L3,
    ESimOne_Data_Vehicle_State_SO_JncR_L3,
    ESimOne_Data_Vehicle_State_SO_Mz_L3,

    ESimOne_Data_Vehicle_State_SO_AVy_R3,
    ESimOne_Data_Vehicle_State_SO_Kappa_R3,
    ESimOne_Data_Vehicle_State_SO_Alpha_R3,
    ESimOne_Data_Vehicle_State_SO_Fz_R3,
    ESimOne_Data_Vehicle_State_SO_My_WC_R3,
    ESimOne_Data_Vehicle_State_SO_Fx_R3,
    ESimOne_Data_Vehicle_State_SO_Fy_R3,
    ESimOne_Data_Vehicle_State_SO_Jnc_R3,
    ESimOne_Data_Vehicle_State_SO_JncR_R3,
    ESimOne_Data_Vehicle_State_SO_Mz_R3,

    ESimOne_Data_Vehicle_State_SO_Steer_L3,
    ESimOne_Data_Vehicle_State_SO_Steer_R3,

    ESimOne_Data_Vehicle_State_SO_Steer_SW,

    ESimOne_Data_Vehicle_State_SO_TimePassed,

    ESimOne_Data_Vehicle_State_SO_ConverterTorqueIn,

    ESimOne_Data_Vehicle_State_SO_ConverterTorqueOut,

    ESimOne_Data_Vehicle_State_SO_CurrentGearRatio,

    ESimOne_Data_Vehicle_State_SO_GearBoxOutputSpeed,

    ESimOne_Data_Vehicle_State_SO_TransmissionInputSpeed,

    ESimOne_Data_Vehicle_State_SO_AntiTorquex_F,
    ESimOne_Data_Vehicle_State_SO_AntiTorquey_F,
    ESimOne_Data_Vehicle_State_SO_AntiTorquez_F,
    ESimOne_Data_Vehicle_State_SO_AntiTorquex_R,
    ESimOne_Data_Vehicle_State_SO_AntiTorquey_R,
    ESimOne_Data_Vehicle_State_SO_AntiTorquez_R,

    ESimOne_Data_Vehicle_State_SO_My_Bk_L1,

    ESimOne_Data_Vehicle_State_SO_WheelAngle_L1,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcex_L1,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcey_L1,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcez_L1,

    ESimOne_Data_Vehicle_State_SO_My_Bk_R1,

    ESimOne_Data_Vehicle_State_SO_WheelAngle_R1,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcex_R1,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcey_R1,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcez_R1,

    ESimOne_Data_Vehicle_State_SO_My_Bk_L2,

    ESimOne_Data_Vehicle_State_SO_WheelAngle_L2,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcex_L2,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcey_L2,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcez_L2,

    ESimOne_Data_Vehicle_State_SO_My_Bk_R2,

    ESimOne_Data_Vehicle_State_SO_WheelAngle_R2,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcex_R2,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcey_R2,

    ESimOne_Data_Vehicle_State_SO_SuspSpringForcez_R2
};

#define SOSM_VEHICLE_EXTRA_STATE_MAX_SIZE 600
struct SimOne_Data_Vehicle_Extra
{
    int dataSize;

    float extra_states[SOSM_VEHICLE_EXTRA_STATE_MAX_SIZE];
};

// ----------------------------
// Obstacle GroundTruth data (SimOne Output)
// ----------------------------
#define SOSM_OBSTACLE_PREFIX "SOSM_OBSTACLE_"
#define SOSM_OBSTACLE_SIZE_MAX 255

enum ESimOne_Obstacle_Type
{
    ESimOne_Obstacle_Type_Unknown = 0,

    ESimOne_Obstacle_Type_Pedestrian = 4,

    ESimOne_Obstacle_Type_Pole = 5,

    ESimOne_Obstacle_Type_Car = 6,

    ESimOne_Obstacle_Type_Static = 7,

    ESimOne_Obstacle_Type_Bicycle = 8,

    ESimOne_Obstacle_Type_Fence = 9,

    ESimOne_Obstacle_Type_RoadMark = 12,

    ESimOne_Obstacle_Type_TrafficSign = 13,

    ESimOne_Obstacle_Type_TrafficLight = 15,

    ESimOne_Obstacle_Type_Rider = 17,

    ESimOne_Obstacle_Type_Truck = 18,

    ESimOne_Obstacle_Type_Bus = 19,

    ESimOne_Obstacle_Type_SpecialVehicle = 20,

    ESimOne_Obstacle_Type_Motorcycle = 21,

    ESimOne_Obstacle_Type_Dynamic = 22,

    ESimOne_Obstacle_Type_GuardRail = 23,

    ESimOne_Obstacle_Type_SpeedLimitSign = 26,

    ESimOne_Obstacle_Type_BicycleStatic = 27,

    ESimOne_Obstacle_Type_RoadObstacle = 29
};

struct Rotation
{
    float yaw;      // Obstacle Rotation Z on Opendrive (by radian)

    float pitch;    // Obstacle Rotation Y on Opendrive (by radian)

    float roll;     // Obstacle Rotation X on Opendrive (by radian)
};

struct Prediction
{
    uint32_t trajectorySize; // point number of prediction trajectory

    float trajectoryInterval; // time interval between two adjacent points of prediction trajectory. unit is second.

    SimOne_Data_Vec3f trajectory[MAX_PREDICTION_TRAJECTORY_SIZE]; // Obstacle prediction trajectory. Positions on Opendrive (by meter)

    float speed[MAX_PREDICTION_TRAJECTORY_SIZE]; // point speed of prediction trajectory

    Rotation rotation[MAX_PREDICTION_TRAJECTORY_SIZE]; // Obstacle prediction trajectory. Rotation on Opendrive
};

struct SimOne_Data_Obstacle_Entry
{
    int id; // Obstacle global unique ID

    int viewId; // Obstacle view ID in Sim-One observer.

    ESimOne_Obstacle_Type type; // Obstacle Type

    float theta; // [deprecated] Please use oriZ for obstacle heading angle instead

    float posX; // Obstacle Position X on Opendrive (by meter), this point is the centroid of the obstacle.

    float posY; // Obstacle Position Y on Opendrive (by meter), this point is the centroid of the obstacle.

    float posZ; // Obstacle Position Z on Opendrive (by meter), this point is the centroid of the obstacle.

    float oriX; // Obstacle Rotation X on Opendrive (by radian)

    float oriY; // Obstacle Rotation Y on Opendrive (by radian)

    float oriZ; // Obstacle Rotation Z on Opendrive (by radian)

    float velX; // Obstacle Velocity X on Opendrive (by meter)

    float velY; // Obstacle Velocity Y on Opendrive (by meter)

    float velZ; // Obstacle Velocity Z on Opendrive (by meter)

    float length; // Obstacle length

    float width; // Obstacle width

    float height; // Obstacle height

    float accelX; // Obstacle Acceleration X on Opendrive (by meter)

    float accelY; // Obstacle Acceleration Y on Opendrive (by meter)

    float accelZ; // Obstacle Acceleration Z on Opendrive (by meter)

    Prediction prediction;

    char actorCarName[SOSM_ACTORNAME_LENGT];   // encoding: utf-8
};

struct SimOne_Data_Obstacle : public SimOne_Data
{
    int obstacleSize; // Obstacle size

    SimOne_Data_Obstacle_Entry obstacle[SOSM_OBSTACLE_SIZE_MAX]; // Obstacle, 255 max
};

struct SimOne_Data_CaseInfo
{
    char caseName[SOSM_CASENAME_LENGTH]; // Case name

    char caseId[SOSM_CASEID_LENGT]; // Case ID

    char taskId[SOSM_TASKID_LENGT]; // Task ID
};

enum ESimOne_Case_Status
{
    ESimOne_Case_Status_Unknown = 0,

    ESimOne_Case_Status_Stop = 1,

    ESimOne_Case_Status_Running = 2,

    ESimOne_Case_Status_Pause = 3
};

#define SOSM_SIGNAL_LIGHTS_PREFIX "SOSM_SIGNAL_LIGHTS_"
enum ESimOne_Signal_Light
{
    ESimOne_Signal_Light_None = 0,

    ESimOne_Signal_Light_RightBlinker = 1,

    ESimOne_Signal_Light_LeftBlinker = (1 << 1),

    ESimOne_Signal_Light_DoubleFlash = (1 << 2),

    ESimOne_Signal_Light_BrakeLight = (1 << 3),

    ESimOne_Signal_Light_FrontLight = (1 << 4),

    ESimOne_Signal_Light_HighBeam = (1 << 5),

    ESimOne_Signal_Light_BackDrive = (1 << 6)
};

struct SimOne_Data_Signal_Lights : public SimOne_Data
{
    uint32_t signalLights = 0;
};

#define SOSM_ENVIRONMENT "SOSM_ENVIRONMENT"
struct SimOne_Data_Environment
{
    float timeOfDay = 1200;

    // Simulate Reality

    bool simulateReality = true;

    float longitude = 121.4737;

    float latitude = 31.2304;

    int timeZone = 8;

    int date = 20230921;

    // Sun

    float sunIntensity = 5;

    float sunAzimuth = 0;

    float sunInclination = 30;

    float sunSize = 1;

    // Moon

    float moonIntensity = 0.12;

    float moonAzimuth = 15;

    float moonInclination = 35;

    float moonSize = 0.7;

    float moonPhase = 0;

    float moonColorA = 0.87;

    int moonColorR = 178;

    int moonColorG = 197;

    int moonColorB = 239;

    // Weather

    // Cloud

    float cloudDensity = 3;

    float cloudHeight = 1;

    float cloudThickness = 1;

    // Fog Wind

    float fogDensity = 3;

    float windDensity = 3;

    float windDirection = 180;

    // Rain

    float rainDensity = 3;

    float raindropDensity = 2000;

    float raindropParticle = 1;

    // Snow

    float snowDensity = 3;

    float snowflakeDensity = 2000;

    float snowflakeParticle = 1;

    // Thunder

    float thunderLightning = 0;

    float thunderInterval = 7;

    float thunderBrightness = 14;

    // Dust

    float dustDensity = 0;

    float dustDensityCoefficient = 300;

    float dustParticle = 0;

    // Material

    // Coverage

    float wetness = 0;

    float snowCoverage = 0;

    float dustCoverage = 0;

    // Damage & Dirty

    float roadDirtyLevel = 0;

    float lineDamageLevel = 0;

    float signDirtyLevel = 0;

    float signDamageLevel = 0;
};

enum ESimOneCaseControl_State
{
    ESimOneCaseControl_State_None = 0,

    ESimOneCaseControl_State_Play = 1,

    ESimOneCaseControl_State_Pause = 2,

    ESimOneCaseControl_State_Stop = 3,

    ESimOneCaseControl_State_SkipAndPause = 4,

    ESimOneCaseControl_State_SkipAndPlay = 5,
};

struct SimOneCaseControl {
    ESimOneCaseControl_State caseControlState;

    int skipStep;
};
// ----------------------------
// Sensor Configuration API.
// ----------------------------

enum ESimOne_Node_Type
{
    ESimOne_Node_Type_Vehicle = 0,

    ESimOne_Node_Type_Camera = 1,

    ESimOne_Node_Type_LiDAR = 2,

    ESimOne_Node_Type_MMWRadar = 3,

    ESimOne_Node_Type_UltrasonicRadar = 4,

    ESimOne_Node_Type_AllUltrasonicRadar = 5,

    ESimOne_Node_Type_GNSSINS = 6,

    ESimOne_Node_Type_PerfectPerception = 7,

    ESimOne_Node_Type_V2X = 8,

    ESimOne_Node_Type_SensorFusion = 9
};

enum ESimOne_Sensor_Data_Type
{
    ESimOne_Sensor_Data_Type_ImageWithGroundTruth = 0,

    ESimOne_Sensor_Data_Type_PointCloudWithGroundTruth = 1,

    ESimOne_Sensor_Data_Type_RadarDetections = 2,

    ESimOne_Sensor_Data_Type_UltrasonicRadar = 3,

    ESimOne_Sensor_Data_Type_ObstacleDetection = 4,

    ESimOne_Sensor_Data_Type_GroundTruth = 5,

    ESimOne_Sensor_Data_Type_V2X = 6,

    ESimOne_Sensor_Data_Type_V2XNFS = 7
};

enum ESimOne_V2X_MessageFrame_PR {
    ESimOne_V2X_MessageFrame_PR_NOTHING,

    ESimOne_V2X_MessageFrame_PR_bsmFrame,

    ESimOne_V2X_MessageFrame_PR_mapFrame,

    ESimOne_V2X_MessageFrame_PR_rsmFrame,

    ESimOne_V2X_MessageFrame_PR_spatFrame,

    ESimOne_V2X_MessageFrame_PR_rsiFrame,

    ESimOne_V2X_MessageFrame_PR_ipprFrame,

    ESimOne_V2X_MessageFrame_PR_rsvFrame,

    ESimOne_V2X_MessageFrame_PR_bsiFrame

    /* Extensions may appear below */
};


#define SENSOR_IDTYPE_MAX 64
struct SimOne_Data_SensorConfiguration
{
    int id;

    char mainVehicleId[SENSOR_IDTYPE_MAX];

    char sensorId[SENSOR_IDTYPE_MAX];

    char sensorType[SENSOR_IDTYPE_MAX];

    float x;

    float y;

    float z;

    float roll;

    float pitch;

    float yaw;

    int hz;
};


#define SOSM_SENSOR_CONFIGURATION_LABEL "SOSM_SENSOR_CONFIGURATION"
#define SOSM_SENSOR_CONFIGURATION_SIZE_MAX 100
struct SimOne_Data_SensorConfigurations
{
    int dataSize;

    SimOne_Data_SensorConfiguration data[SOSM_SENSOR_CONFIGURATION_SIZE_MAX];
};

// ----------------------------
// Sensor Detections data (SimOne Output)
// ----------------------------
#define SOSM_SENSOR_DETECTIONS_PREFIX "SOSM_SENSOR_DETECTIONS_"
#define SOSM_SENSOR_DETECTIONS_OBJECT_SIZE_MAX 256
#define SOSM_SENSOR_LANE_OBJECT_SIZE_MAX 256
#define SOSM_SENSOR_Boundary_OBJECT_SIZE_MAX 250
#define SOSM_SENSOR_DETECTIONS_CORNERPOINT_SIZE_MAX 8
struct SimOne_Data_SensorDetections_Entry
{
    int id;

    ESimOne_Obstacle_Type type;

    float posX;

    float posY;

    float posZ;

    float oriX;

    float oriY;

    float oriZ;

    float length;

    float width;

    float height;

    float range;

    float velX;

    float velY;

    float velZ;

    float accelX;

    float accelY;

    float accelZ;

    float probability;

    float relativePosX;

    float relativePosY;

    float relativePosZ;

    float relativeRotX;

    float relativeRotY;

    float relativeRotZ;

    float relativeVelX;

    float relativeVelY;

    float relativeVelZ;

    float bbox2dMinX = 0;

    float bbox2dMinY = 0;

    float bbox2dMaxX = 0;

    float bbox2dMaxY = 0;

    int cornerPointSize = 0;

    SimOne_Data_Vec3f cornerPoints[SOSM_SENSOR_DETECTIONS_CORNERPOINT_SIZE_MAX];

    char name[SOSM_ACTORNAME_LENGT];
};

struct SimOne_Data_SensorDetections : public SimOne_Data
{
    int objectSize = 0; // Detection Object size

    SimOne_Data_SensorDetections_Entry objects[SOSM_SENSOR_DETECTIONS_OBJECT_SIZE_MAX]; // Detection Objects, 256 max
};

struct SimOne_Data_SensorFusionObstacles : public SimOne_Data
{
    int obstacleSize; // Detected obstacle size

    SimOne_Data_SensorDetections_Entry obstacle[SOSM_SENSOR_DETECTIONS_OBJECT_SIZE_MAX]; // Detected obstacles, 256 max
};

enum ESimOne_Lane_Type {
    ESimOne_Lane_Type_none = 0,

    ESimOne_Lane_Type_driving = 1,

    ESimOne_Lane_Type_stop = 2,

    ESimOne_Lane_Type_shoulder = 3,

    ESimOne_Lane_Type_biking = 4,

    ESimOne_Lane_Type_sidewalk = 5,

    ESimOne_Lane_Type_border = 6,

    ESimOne_Lane_Type_restricted = 7,

    ESimOne_Lane_Type_parking = 8,

    ESimOne_Lane_Type_bidirectional = 9,

    ESimOne_Lane_Type_median = 10,

    ESimOne_Lane_Type_special1 = 11,

    ESimOne_Lane_Type_special2 = 12,

    ESimOne_Lane_Type_special3 = 13,

    ESimOne_Lane_Type_roadWorks = 14,

    ESimOne_Lane_Type_tram = 15,

    ESimOne_Lane_Type_rail = 16,

    ESimOne_Lane_Type_entry = 17,

    ESimOne_Lane_Type_exit = 18,

    ESimOne_Lane_Type_offRamp = 19,

    ESimOne_Lane_Type_onRamp = 20,

    ESimOne_Lane_Type_mwyEntry = 21,

    ESimOne_Lane_Type_mwyExit = 22
};

enum ESimOne_Boundary_Type {
    ESimOne_Boundary_Type_none = 0,

    ESimOne_Boundary_Type_solid = 1,

    ESimOne_Boundary_Type_broken = 2,

    ESimOne_Boundary_Type_solid_solid = 3,

    ESimOne_Boundary_Type_solid_broken = 4,

    ESimOne_Boundary_Type_broken_solid = 5,

    ESimOne_Boundary_Type_broken_broken = 6,

    ESimOne_Boundary_Type_botts_dots = 7,

    ESimOne_Boundary_Type_grass = 8,

    ESimOne_Boundary_Type_curb = 9
};

enum ESimOne_Boundary_Color {
    ESimOne_Boundary_Color_standard = 0,

    ESimOne_Boundary_Color_blue = 1,

    ESimOne_Boundary_Color_green = 2,

    ESimOne_Boundary_Color_red = 3,

    ESimOne_Boundary_Color_white = 4,

    ESimOne_Boundary_Color_yellow = 5
};

struct SimOne_LineCurve_Parameter{
    float C0;

    float C1;

    float C2;

    float C3;

    SimOne_Data_Vec3f firstPoints;

    SimOne_Data_Vec3f endPoints;

    int length = 0;
};

struct SimOne_Data_LaneLineInfo
{
    int lineID = 0;

    ESimOne_Boundary_Type lineType = ESimOne_Boundary_Type_none;

    ESimOne_Boundary_Color lineColor = ESimOne_Boundary_Color_standard;

    float linewidth;

    SimOne_Data_Vec3f linePoints[SOSM_SENSOR_Boundary_OBJECT_SIZE_MAX];

    SimOne_LineCurve_Parameter linecurveParameter;
};

struct SimOne_Data_LaneInfo : public SimOne_Data
{
    int id = 0;

    ESimOne_Lane_Type laneType = ESimOne_Lane_Type_none;

    int laneLeftID = 0;

    int laneRightID = 0;

    int lanePredecessorID[SOSM_SENSOR_LANE_OBJECT_SIZE_MAX];

    int laneSuccessorID[SOSM_SENSOR_LANE_OBJECT_SIZE_MAX];

    SimOne_Data_LaneLineInfo l_Line;

    SimOne_Data_LaneLineInfo c_Line;

    SimOne_Data_LaneLineInfo r_Line;

    SimOne_Data_LaneLineInfo ll_Line;

    SimOne_Data_LaneLineInfo rr_Line;
};

enum SimOne_RoadMark_Type {
    RoadMarkType_UnKnown = 0,

    RoadMarkType_Graphics = 1,

    RoadMarkType_StopLine = 2,

    RoadMarkType_CrossWalk = 3
};

enum SimOne_RoadMark_SubType {
    MarkSubType__UnKnown = 0,

    RoadMarkType_StraightAheadArrow = 1,

    RoadMarkType_LeftOrRightTurnArrow = 2,

    RoadMarkType_LeftOrUTurnArrow = 3,

    RoadMarkType_LeftTurnArrow = 4,

    RoadMarkType_LeftChangeArrow = 5,

    RoadMarkType_RightChangeArrow = 6,

    RoadMarkType_RightTurnArrow = 7,

    RoadMarkType_StraightOrLeftTurnArrow = 8,

    RoadMarkType_StraightOrLeftOrRightTurnArrow = 9,

    RoadMarkType_StraightOrRightTurnArrow = 10,

    RoadMarkType_StraightOrUTurnArrow = 11,

    RoadMarkType_UTurnArrow = 12
};

// ----------------------------
// Millimeter-wave Radar data (SimOne Output)
// ----------------------------
#define SOSM_ROADMARK_SIZE_MAX 256
#define SOSM_PIX_SIZE_MAX 64

struct RoadMark_Entry {
    int id;

    SimOne_RoadMark_Type type;

    SimOne_RoadMark_SubType subtype;

    SimOne_Data_Vec3f center;

    SimOne_Data_Vec3f rotation;

    SimOne_Data_Vec3f size;

    int pointSize;

    SimOne_Data_Vec3f bbox3d[SOSM_PIX_SIZE_MAX];

    SimOne_Data_Vec3f pixs2d[SOSM_PIX_SIZE_MAX];
};

struct SimOne_Data_RoadMarkInfo : public SimOne_Data
{
    int detectNum;

    RoadMark_Entry roadMarks[SOSM_ROADMARK_SIZE_MAX];
};


enum ESimOne_Client_Type {
    ESimOne_Client_Type_None = 0,

    ESimOne_Client_Type_Web = 1,

    ESimOne_Client_Type_TrafficProvider = 2,

    ESimOne_Client_Type_VehicleDynamic = 3,

    ESimOne_Client_Type_BridgeIO = 4,

    ESimOne_Client_Type_SimOneDLL = 5,

    ESimOne_Client_Type_Observer = 6,

    ESimOne_Client_Type_Sensor = 7,

    ESimOne_Client_Type_Traffic = 8
};

// ----------------------------
// Image data (SimOne Output)
// ----------------------------
#define SOSM_IMAGE_PREFIX "SOSM_IMAGE_"
//#define SOSM_IMAGE_WIDTH_MAX 1920
//#define SOSM_IMAGE_HEIGHT_MAX 1200
#define SOSM_SIMONE_IMAGE_WIDTH_MAX 3840
#define SOSM_SIMONE_IMAGE_HEIGHT_MAX 2160
#define SOSM_SIMONE_IMAGE_DATA_SIZE_MAX SOSM_SIMONE_IMAGE_WIDTH_MAX*SOSM_SIMONE_IMAGE_HEIGHT_MAX*3
enum ESimOne_Image_Format
{
    ESimOne_Image_Format_RGB = 0
};

struct SimOne_Data_Image : public SimOne_Data
{
    int width;

    int height;

    ESimOne_Image_Format format;

    int imageDataSize;

    char imageData[SOSM_SIMONE_IMAGE_DATA_SIZE_MAX];
};


// ----------------------------
// Point cloud data (SimOne Output)
// ----------------------------
struct SimOne_Data_Point_XYZI
{
    float x;

    float y;

    float z;

    float intensity;
};

#define SOSM_POINT_CLOUD_PREFIX "SOSM_POINT_CLOUD_"
#define SOSM_SIMONE_POINT_DATA_SIZE_MAX 3686400 // Max Memory Size
struct SimOne_Data_Point_Cloud : public SimOne_Data
{
    int width;

    int height;

    int pointStep;

    int pointCloudDataSize;

    char pointCloudData[SOSM_SIMONE_POINT_DATA_SIZE_MAX];
};


// ----------------------------
// Millimeter-wave Radar data (SimOne Output)
// ----------------------------
#define SOSM_RADAR_PREFIX "SOSM_RADAR_"
#define SOSM_RADAR_SIZE_MAX 256

struct SimOne_Data_RadarDetection_Entry {
    int id;

    int subId;

    ESimOne_Obstacle_Type type;

    float posX;

    float posY;

    float posZ;

    float velX;

    float velY;

    float velZ;

    float accelX;

    float accelY;

    float accelZ;

    float oriX;

    float oriY;

    float oriZ;

    float length;

    float width;

    float height;

    float range;

    float rangeRate;

    float azimuth;

    float vertical;

    float snrdb;

    float rcsdb;

    float probability;

    char name[SOSM_ACTORNAME_LENGT];
};

struct SimOne_Data_RadarDetection : public SimOne_Data
{
    int detectNum;

    SimOne_Data_RadarDetection_Entry detections[SOSM_RADAR_SIZE_MAX];
};


// ----------------------------
// Ultrasonic Radar data (SimOne Output)
// ----------------------------
#define SOSM_MUCHULTRASONICRADAR_PREFIX "SOSM_MUCHULTRASONICRADAR_"
#define SOSM_OSIULTRASONICRADAR_PREFIX "SOSM_OSIULTRASONICRADAR_"
#define SOSM_ULTRASONICRADAR_SIZE_MAX 100


struct SimOne_Data_UltrasonicRadarDetection_Entry {
    float obstacleRanges = 0;

    float x = 0;

    float y = 0;

    float z = 0;
};
struct SimOne_Data_UltrasonicRadar : public SimOne_Data {
    char sensorId[SENSOR_IDTYPE_MAX];

    int obstacleNum;

    SimOne_Data_UltrasonicRadarDetection_Entry obstacleDetections[SOSM_OBSTACLE_SIZE_MAX];
};


struct SimOne_Data_UltrasonicRadars : public SimOne_Data
{
    int ultrasonicRadarNum;

    SimOne_Data_UltrasonicRadar ultrasonicRadars[SOSM_ULTRASONICRADAR_SIZE_MAX];
};


#ifndef WITHOUT_HDMAP
#define SOSM_V2X_MSGFRAME_SIZE_MAX 20000 // Max Memory Size

struct SimOne_Data_V2XNFS : public SimOne_Data
{
    int V2XMsgFrameSize;

    char MsgFrameData[SOSM_V2X_MSGFRAME_SIZE_MAX];
};
#endif

// ----------------------------
// HDMap data
// ----------------------------

// ----------------------------
// Prediction data (SimOne Output)
// ----------------------------
#define SOSM_PREDICTION_PREFIX "SOSM_PREDICTION_"
struct SimOne_Data_Traffic_Info
{
    int id;

    float x;

    float y;

    float speed;

    float orientation;
};

struct SimOne_Data_Position_Info : public SimOne_Data
{
    float mean_x;

    float mean_y;

    float var_x;

    float var_y;

    float covar_xy;
};

struct SimOne_Data_Prediction : public SimOne_Data
{
    std::map<int, SSD::SimVector<SimOne_Data_Position_Info>> ped_predictions;

    std::map<int, SSD::SimVector<SimOne_Data_Position_Info>> veh_predictions;

    float ped_delta_t;

    float veh_delta_t;
};

#define MAX_MAINVEHICLE_NUM 10
struct SimOne_Data_MainVehicle_Info
{
    int size;

    char id_list[MAX_MAINVEHICLE_NUM][MAX_MAINVEHICLE_NAME_LEN];

    char type_list[MAX_MAINVEHICLE_NUM][MAX_MAINVEHICLE_NAME_LEN];
};

struct SimOne_Data_MainVehicle_Status
{
    char mainVehicleId[MAX_MAINVEHICLE_NAME_LEN];

    int mainVehicleStatus;
};


// ----------------------------
// TrafficLight data (SimOne Output)
// ----------------------------
#define SOSM_TRAFFICLIGHT_PREFIX "SOSM_TRAFFICLIGHT_"
#define SOSM_TRAFFICLIGHT_SIZE_MAX 100

enum ESimOne_TrafficLight_Status
{
    ESimOne_TrafficLight_Status_Invalid = 0,

    ESimOne_TrafficLight_Status_Red = 1,

    ESimOne_TrafficLight_Status_Green = 2,

    ESimOne_TrafficLight_Status_Yellow = 3,

    ESimOne_TrafficLight_Status_RedBlink = 4,

    ESimOne_TrafficLight_Status_GreenBlink = 5,

    ESimOne_TrafficLight_Status_YellowBlink = 6,

    ESimOne_TrafficLight_Status_Black = 7
};

struct SimOne_Data_TrafficLight
{
    bool isMainVehicleNextTrafficLight = false;

    int opendriveLightId = 0;

    int countDown = 0;

    ESimOne_TrafficLight_Status status = ESimOne_TrafficLight_Status_Invalid;
};

struct SimOne_Data_TrafficLights : public SimOne_Data
{
    int trafficlightNum = 0;

    SimOne_Data_TrafficLight trafficlights[SOSM_TRAFFICLIGHT_SIZE_MAX];
};

// ----------------------------
// SimOneDriver status data (SimOne Output)
// ----------------------------
#define SOSM_DRIVER_PREFIX "SOSM_DRIVER_"
enum ESimOne_Driver_Status
{
    ESimOne_Driver_Status_Unknown = 0,

    ESimOne_Driver_Status_Controlling = 1,

    ESimOne_Driver_Status_Disabled = 2
};

struct SimOne_Data_Driver_Status : public SimOne_Data
{
    ESimOne_Driver_Status driverStatus;
};


// ----------------------------
// Vehicle control mode (SimOne Output)
// ----------------------------
#define SOSM_CONTROLMODE_PREFIX "SOSM_CONTROLMODE_"

enum SimOne_Control_Mode
{
    ESimOne_Control_Mode_Unknown = 0,

    ESimOne_Control_Mode_Manual = 1,

    ESimOne_Control_Mode_API = 2,

    ESimOne_Control_Mode_Auto = 3
};

struct SimOne_Data_Control_Mode : public SimOne_Data
{
    SimOne_Control_Mode controlMode;
};


// ----------------------------
// Scenario event
// ----------------------------
#define ENABLE_SCENARIO_EVENT
#define SCENARIO_EVENT_PREFIX "SCENARIO_EVENT_"

struct SimOne_Data_ScenarioEvent_ReaderStatus
{
    int readerState = 0;
};

struct SimOne_Data_ScenarioEvent_WriterStatus
{
    int writeState = 0;
};

struct SimOne_Data_ScenarioEvent : public SimOne_Data_ScenarioEvent_WriterStatus
{
    char event[64];

    char data[64];
};
#pragma pack(pop)