syntax = "proto2";
package message;

//消息类型定义;每个在网络上传输的消息必须含有这个属性
enum Message_type
{
    eBase_msg=0x00;
    eCommand_msg=0x01;                      //指令消息


    eLocate_status_msg=0x11;                //定位模块状态消息
    eLocate_request_msg=0x12;               //定位请求消息
    eLocate_response_msg=0x13;              //定位反馈消息

    eLocate_sift_request_msg = 0x14;            //预测算法请求消息
    eLocate_sift_response_msg = 0x15;           //预测算法反馈消息

    eDispatch_status_msg=0x21;                //调度模块硬件状态消息
    eDispatch_request_msg=0x22;              //请求调度消息
    eDispatch_response_msg=0x23;             //调度结果反馈消息

    eParkspace_allocation_status_msg=0x31;  //车位分配模块状态消息，包括车位信息
    eParkspace_allocation_request_msg=0x32; //请求分配车位消息
    eParkspace_allocation_response_msg=0x33;//分配车位结果反馈消息
    eParkspace_search_request_msg = 0x34;		//查询车位请求消息
    eParkspace_search_response_msg = 0x35;		//查询车位反馈消息
    eParkspace_release_request_msg = 0x36;		//释放车位请求消息
    eParkspace_release_response_msg = 0x37;		//释放车位反馈消息
    eParkspace_force_update_request_msg = 0x38;	//手动修改车位消息
    eParkspace_force_update_response_msg = 0x39;//手动修改车位反馈消息
    eParkspace_confirm_alloc_request_msg = 0x3A;//确认分配车位请求消息
    eParkspace_confirm_alloc_response_msg = 0x3B;//确认分配车位反馈消息
    eParkspace_allocation_data_msg = 0x3C;     //车位分配模块车位数据消息
    eParkspace_allocation_data_response_msg =0x3D;//车位数据反馈消息
    eParkspace_manual_search_request_msg = 0x3E;	//手动查询车位请求消息
    eParkspace_manual_search_response_msg = 0x3F;//手动查询车位反馈消息

    eStore_command_request_msg=0x41;        //终端停车请求消息
    eStore_command_response_msg=0x42;       //停车请求反馈消息
    ePickup_command_request_msg=0x43;       //取车请求消息
    ePickup_command_response_msg=0x44;       //取车请求反馈消息

    eTerminal_status_msg = 0x50;	 //终端状态消息

    eStoring_process_statu_msg=0x90;        //停车指令进度条消息
    ePicking_process_statu_msg=0x91;        //取车指令进度消息


    eCentral_controller_statu_msg=0xa0;     //中控系统状态消息


    eEntrance_manual_operation_msg=0xb0;            //针对出入口状态操作的手动消息
    eProcess_manual_operation_msg=0xb1;             //针对流程的手动消息

    eNotify_request_msg=0xc0;               //取车等候区通知请求
    eNotify_response_msg=0xc1;              //等候区反馈
    eNotify_status_msg=0xc2;                //等候区通知节点状态

    eUnNormalized_module_statu_msg = 0xd0; //非标节点状态

    eDispatch_plan_request_msg          = 0xe0;     //调度总规划的请求(用于启动整个调度算法)(调度管理->调度算法)
    eDispatch_plan_response_msg         = 0xe1;     //调度总规划的答复(调度算法->调度管理)
    eDispatch_control_request_msg       = 0xe2;     //调度控制的任务请求(调度算法->调度管理)
    eDispatch_control_response_msg      = 0xe3;     //调度控制的任务答复(调度管理->调度算法)
    eDispatch_manager_status_msg        = 0xea;     //调度管理的设备状态消息(调度底下所有硬件设备状态的汇总)
    eDispatch_manager_data_msg          = 0xeb;     //调度管理的设备详细的数据信息


    eGround_detect_request_msg=0xf0;        //地面雷达测量请求消息
    eGround_detect_response_msg=0xf1;       //地面雷达测量反馈消息
    eGround_status_msg=0xf2;                //地面雷达状态消息

}

//通讯单元
enum Communicator
{
    eEmpty=0x0000;
    eMain=0x0001;    //主流程

    eTerminor=0x0100;
    //车位表
    eParkspace=0x0200;
    //测量单元
    eMeasurer=0x0300;
    //测量单元的服务器
    eMeasurer_sift_server=0x0301;
    //调度机构
    eDispatch_manager=0x0400;
    //调度机构
    eDispatch_control=0x0401;
    //...
  //取车等候区通知节点
    eNotify=0x0501;

    //地面测量单元
	eGround_measurer=0x0f00;
}
////base message 用于解析未知类型的消息
message Base_info
{
    required Message_type               msg_type=1[default = eBase_msg];
    optional int32                      timeout_ms=2[default = 0];
    required Communicator               sender=3[default = eEmpty];                       //发送者
    required Communicator               receiver=4[default = eEmpty];                     //接收者
}

// 事件,停车或者取车
enum Process_type
{
    eStoring=1;
    ePicking=2;
}


message Base_msg
{
    required Base_info                  base_info=1;
}

//错误等级，用来做故障处理
enum Error_level
{
    NORMAL                = 0;      //    正常，没有错误，默认值0

    NEGLIGIBLE_ERROR      = 1;      //    轻微故障;可忽略的故障，NEGLIGIBLE_ERROR

    MINOR_ERROR           = 2;      //    一般故障，MINOR_ERROR

    MAJOR_ERROR           = 3;      //    严重故障，MAJOR_ERROR

    CRITICAL_ERROR        = 4;      //    致命故障，CRITICAL_ERROR

}

message Error_manager
{
    required int32                      error_code = 1[default = 0];
    optional Error_level                error_level = 2[default = NORMAL];
    optional string                     error_description = 3[default = ""];
}

//测量结果结构体
message Locate_information
{
    optional float locate_x = 1[default = 0];				//整车的中心点x值; 四轮的中心
    optional float locate_y = 2[default = 0];				//整车的中心点y值; 四轮的中心
    optional float locate_angle = 3[default = 0];			//整车的旋转角; 四轮的旋转角
    optional float locate_length = 4[default = 0];		    //整车的长度; 用于规避碰撞
    optional float locate_width = 5[default = 0];			//整车的宽度; 用于规避碰撞
    optional float locate_height = 6[default = 0];		    //整车的高度; 用于规避碰撞
    optional float locate_wheel_base = 7[default = 0];	    //整车的轮距; 前后轮的距离; 用于机器人或agv的抓车
    optional float locate_wheel_width = 8[default = 0];	    //整车的轮距; 左右轮的距离; 用于机器人或agv的抓车
    optional bool locate_correct = 9[default = false];		    //整车的校准标记位

    optional float locate_front_theta = 10[default = 0];	    //整车的前轮的旋转角
    
    optional float uniformed_car_x = 11;        //转角复位后,车辆中心点x
    optional float uniformed_car_y = 12;        //转角复位后,车辆中心点y
}

//车辆基本信息
message Car_info
{
    optional float                      car_length=1[default = 0];           //车长
    optional float                      car_width=2[default = 0];            //车宽
    optional float                      car_height=3[default = 0];           //车高
    optional string                     license=4[default = ""];             //车辆凭证号（车牌号+唯一码）
    optional string                     car_numberPlate = 5[default = ""];   //车牌号
    optional float                      car_wheel_base = 6[default = 0];	 //整车的轮距; 前后轮的距离; 用于机器人或agv的抓车
    optional float                      car_wheel_width = 7[default = 0];	 //整车的轮距; 左右轮的距离; 用于机器人或agv的抓车
}

//车位状态枚举
enum Parkspace_status
{
    eParkspace_status_unknow    = 0;
    eParkspace_empty            = 1;         //空闲，可分配
    eParkspace_occupied         = 2;         //被占用，不可分配
    eParkspace_reserved         = 3;         //被预约，预约车辆可分配
    eParkspace_locked           = 4;         //临时锁定，不可分配
    eParkspace_error            = 5;         //车位机械结构或硬件故障
}

//车位朝向, 小号朝前朝南, 大号朝后朝北
enum Direction
{
    eDirection_unknow = 0;
    eForward = 1;                   //小号朝前朝南
    eBackward = 2;                  //大号朝后朝北
}

//车位分配路线（根据中跑车的路线来定）
enum Parkspace_path
{
	UNKNOW_PATH = 0;
    OPTIMAL_PATH = 1;
    LEFT_PATH = 2;
    RIGHT_PATH = 3;
    TEMPORARY_CACHE_PATH = 4;
}

//车位类型
enum Parkspace_type
{
    UNKNOW_PARKSPACE_TYPE = 0;
    MIN_PARKINGSPACE = 1;//小车位
    MID_PARKINGSPACE = 2;//中车位
    BIG_PARKINGSPACE = 3;//大车位
}

//汽车类型
enum Car_type
{
    UNKNOW_CAR_TYPE = 0;
    MIN_CAR = 1;//小车
    MID_CAR = 2;//中车
    BIG_CAR = 3;//大车
}

//单个车位基本信息与状态信息,车位信息以及车位上的车辆信息
message Parkspace_info
{
    optional int32              parkingspace_index_id = 1;            //车位ID
    optional Parkspace_type     parkingspace_type = 2;                //车位类型
    optional int32              parkingspace_unit_id = 3;            //车位单元号
    optional int32              parkingspace_label_id = 4;            //车位单元内部ID
    optional int32              parkingspace_room_id = 5;             //同层编号
    optional Direction          parkingspace_direction = 6;           //前后
    optional int32              parkingspace_floor_id = 7;            //楼层
    optional float              parkingspace_width = 8;               //车位宽
    optional float              parkingspace_height = 9;              //车位高
    optional Parkspace_status   parkingspace_status = 10;              //车位当前状态
    optional Car_info           car_info = 11;                        //车辆信息
    optional string             entry_time = 12;                      //入场时间
    optional string             leave_time = 13;                      //离场时间


    optional Parkspace_path     parkspace_path = 14;            // 车位分配路线
    optional float              path_estimate_time = 15;        //车位分配路线 time(s)
    optional Parkspace_status   parkspace_status_target = 16;     //车位目标状态

    optional Car_type           car_type = 17;                        //车辆类型


}

/*
*流程中的步骤类型, 例如:停车流程包含5个步骤 , 分配车位-测量-检验结果-搬运-更新车位表
*/
enum Step_type
{
    eAlloc_step=0;
    eMeasure_step=1;
    eCompare_step=2;
    eDispatch_step=3;
    eConfirm_step=4;

    eSearch_step=5;        //查询数据库
    eWait_step=6;             //等待车辆离开
    eRelease_step=7;          //释放车位

    eComplete=8;              //完成

    eBackConfirm_step=9;
    eBack_compare_step=10;
    eBackMeasure_step=11;
    eBackAlloc_step=12;

    eBackWait_step=13;
    eBackDispatch_step=14;
    eBackSearch_step=15;

    eBackComplete=16;
}
//步骤状态,每个步骤有四中可能状态 ,等待中-执行中-完成或者错误  四个状态
enum Step_statu
{
    eWaiting=0;               //完成/空闲
    eWorking=1;
    eError=2;
    eFinished=3;
}

//调度设备的类型
enum Dispatch_device_type
{
    ROBOT_1                                 = 101;      //一号出口的专用机器手(只能负责1号出口的取车)(目前没有安装,暂时不考虑)
    ROBOT_2                                 = 102;      //中间的大型机器手   (可以负责1~6号出入口的停车和取车)

    CARRIER_1                               = 200;      //左侧0号电梯井的搬运器(升降电梯 中跑车 小跑车 三合一为搬运器)
    CARRIER_2                               = 207;      //右侧7号电梯井的搬运器(升降电梯 中跑车 小跑车 三合一为搬运器)
    CARRIER_3                               = 203;      //中间3楼的搬运器(中跑车 小跑车 二合一为搬运器)(没有电梯, 只能在3楼活动)

    PASSAGEWAY_0                            = 300;      //0号出口(在左侧电梯井, 只能取车)(暂时不存在)
    PASSAGEWAY_1                            = 301;      //1号出入口
    PASSAGEWAY_2                            = 302;      //2号出入口
    PASSAGEWAY_3                            = 303;      //3号出入口
    PASSAGEWAY_4                            = 304;      //4号出入口
    PASSAGEWAY_5                            = 305;      //5号出入口
    PASSAGEWAY_6                            = 306;      //6号出入口
    PASSAGEWAY_7                            = 307;      //7号出口(在右侧电梯井, 只能取车)
}

message Id_struct
{
    optional int32 terminal_id=1;   //终端ID
    optional int32 unit_id=2;       //单元号
}