syntax = "proto2";
import "enum_type.proto";

/*测量信息*/
message measure_info {
    required float cx=1;                                 // 车辆中心坐标x
    required float cy=2;                                 // 车辆中心坐标y
    required float theta=3;                              // 车身偏转角度（相对于y轴，左正右负）
    required float length=4;                             // 车身长度（厦门四个雷达，含有该值，楚天两个雷达，该值为0）
    required float width=5;                              // 车身宽度（左右两侧轮子最大宽度）
    optional float height=6;                             // 车身高度
    required float wheelbase=7;                          // 车辆前后轴距
    required float front_theta=8;                        // 车辆前轮偏转角度
    required int32 border_statu=9;                       // 超界状态， 位运算
    required MeasureStatu ground_status=10;              // 测量状态，0=正常, 1=空, 2=测量失败, 3=超界, 4=终端超界， 5=雷达断连
    required int32 is_stop=11;                           // <是否可停> 1为可停，0为不可停
    required int32 motion_statu=12;                      // 运动状态，0=运动， 1=静止（只有三秒内都是静止才会写1，只要瞬间触发运动就会写0）
    required float move_distance=13;                     // 前进距离
}

message PlcOffsetInfo {
    optional float x = 1 [default = 0];
    optional float y = 2 [default = 0];
    optional float theta = 3 [default = 0];
    optional float width = 4 [default = 0];
    optional float wheelbase = 5 [default = 0];
}

message outOfRangeInfo {
  required float border_minx = 1; // 最小边界x，左超界提示
  required float border_maxx = 2; // 最大边界x，右超界提示
  required float plc_border_miny = 3;// plc后夹持y方向极限值
  required float plc_border_maxy = 4;// plc后夹持y方向极限值
  required float car_min_width = 5; // 最小车宽
  required float car_max_width = 6; // 最大车宽
  required float car_min_wheelbase = 7; // 最小轴距
  required float car_max_wheelbase = 8; // 最大轴距
  required float turnplate_angle_limit_min_clockwise = 9; // 转盘逆时针角度极限
  required float turnplate_angle_limit_max_clockwise = 10; // 转盘顺时针角度极限
}

message CommunicationManagerConfig {
    optional bool rabbitmq_enable = 1 [default = true];
    optional string rabbitmq_config_file = 2 [default = "/rabbitmq.prototxt"];   // 安装目录下的路径，并非绝对路径或者bin文件开始的相对路径
    optional bool grpc_enable = 3 [default = true];
    optional string grpc_server_ip = 4 [default = "127.0.0.1"];
    optional int32 grpc_server_port = 5 [default = 9876];
    optional bool mqtt_enable = 6 [default = true];
    optional string mqtt_config_file = 7 [default = "/mqtt.json"];   // 安装目录下的路径，并非绝对路径或者bin文件开始的相对路径
    optional PlcOffsetInfo offset = 8;
    optional outOfRangeInfo plc_out_info = 9;
    optional outOfRangeInfo display_out_info = 10;
}

/*分配的车位信息*/
message parkspace_info{
    required int32 id=1;
    required int32 serial_id=2;    //排序id
    required int32 table_id=3;     //标签id
    required int32 unit_id=4;      //单元号
    required int32 floor=5;        //楼层号
    required int32 room_id=6;      //同层编号
    required float height=7;       //车高档位
}

//任务表单状态
enum STATU{
    eNormal=0;        // 正常
    eWarning=1;       // 警告
    eError=2;         // 错误
    eCritical=3;      // 严重错误
}

//表单流程模式
enum Table_process_mode
{
    PROCESS_NORMAL = 0;             // 0：正常模式， 检查节点会向收费系统发送请求，收费系统的答复 通过后，再向调度发送请求
    PROCESS_ONLY_TO_DISPATCH = 1;   // 1：强制存取车，检查节点会向收费系统发送请求，忽略收费系统的答复，直接向调度发送请求。
    PROCESS_ONLY_TO_PAY = 2;        // 2：虚拟存取车， 检查节点会向收费系统发送请求，忽略收费系统的答复。
}

/*
表单执行状态
 */
message table_statu{
    required STATU execute_statu=1;                    // 执行状态
    required string statu_description=2;               // 状态描述
    required Table_process_mode table_process_mod=3;   // 表单流程模式
}
/*
号牌信息
 */
message plate_number_info
{
    required string plate_number = 1;        // 号牌
    required string plate_color = 2;         // 号牌颜色
    required string plate_type = 3;          // 号牌类型, 车辆类型
    required int32  plate_confidence = 4;    // 号牌可信度, 1-100 值越高可信度越高
    required string recognition_time = 5;    // 识别时间点, yyyyMMddHHmmss
    required string plate_full_image = 6;    // 号牌全景图, base64编码
    required string plate_clip_image = 7;    // 号牌特写图, base64编码
}
/*
停车表单
 */
message park_table{
    required table_statu statu=1;                      //表单状态
    required int32 queue_id=2;                         //指令排队编号

    required string car_number=3;
    required int32 unit_id=4;
    required int32 terminal_id=5;
    required string primary_key=6;

    required measure_buffer entrance_measure_info=7;     // 入口测量信息
    required parkspace_info allocated_space_info=8;    // 分配的车位信息
    required measure_buffer actually_measure_info=9;     // 实际测量信息或者叫二次测量信息
    required parkspace_info actually_space_info=10;    // 实际停放的车位
    required int32 import_id =11;                      // 入口id, 1~2

    required plate_number_info car_number_info = 12;   // 车牌号信息
}

/*
取车表单
 */
message pick_table{
    required table_statu statu=1;      // 表单状态
    required int32 queue_id=2;         // 指令排队编号

    required string car_number=3;
    required int32 unit_id=4;
    required int32 terminal_id=5;
    required string primary_key=6;

    required parkspace_info actually_space_info=7;     // 实际停放的车位信息

    required measure_buffer actually_measure_info=8;     // 存车时的实际测量信息（轴距）

    required int32 export_id=9;                        // 出口id, 3~4
    required bool  is_leaved=10;                       // 是否离开
    required plate_number_info car_number_info = 11;   // 车牌号信息
}

/*
以下是状态消息
 */

/*
单片机节点状态
 */
message out_mcpu_statu{     //数值+1后
    required int32 door_statu=1;       //外门状态       0无效, 1无效, 2开到位, 3 关到位, 4开关中, 5 故障
    required int32 outside_safety=2;    //是否有车      0无效, 1无车, 2有车
}

message in_mcpu_statu{      //数值+1后
    required int32 door_statu=1;       //外门状态       0无效, 1无效, 2开到位, 3 关到位, 4开关中, 5 故障
    required int32 back_io=2;          //后超界       0无效, 1后超界, 2正常
    required int32 is_occupy=3;        //是否有车      0无效, 1无车, 2有车
    required int32 heighth=4;          //车高状态      0无效, 1无效, 2小车, 3中车, 4大车, 5故障, 6故障
}
/*
测量节点状态
 */
message measure_buffer{
    required measure_info measure_info_to_plc_forward=1;     //雷达数据给plc，正向
    required measure_info measure_info_to_plc_reverse=2;     //雷达数据给plc，反向
    required measure_info measure_info_to_terminal=3;        //雷达数据给终端，边界较小
}

//搬运器状态枚举
enum CarrierStatu{
    eIdle=0;
    eBusy=1;
    eFault=2;
}

//plc出入口状态结构体
message dispatch_plc_passway_status
{
    required int32			car_height = 1;			            //车高 0=无车 1=小车 2=中车 3=大车 4=超高车
    required int32			outside_door_status = 2;	        //外门状态 0=无状态 1=开到位 2=关到位
    required int32			inside_door_status = 3;	            //内门状态 0=无状态 1=开到位 2=关到位
    required int32			comb_body_status = 4;	            //梳体状态 0=无状态 1=上到位 2=下到位, AB特有
    required float			turnplate_angle_min = 5;	        //转盘角度最小值, C特有, 负值, 例如 -5度
    required float			turnplate_angle_max = 6;	        //转盘角度最大值, C特有, 正值, 例如 +5度
    required int32			sensor_1 = 7;				        //传感器状态的集合1
                                                        //0 bit, 地感 0=无车 1=有车
                                                        //1 bit, 移动检测 0=运动 1=静止
                                                        //2 bit, 动态超限 0=遮挡 1=正常
                                                        //3 bit, 后超界 0=遮挡 1=正常
                                                        //4 bit, 前超界 0=遮挡 1=正常
                                                        //5 bit, 左超界 0=遮挡 1=正常
                                                        //6 bit, 右超界 0=遮挡 1=正常
                                                        //7 bit, 车高小车， 0=遮挡 1=正常，AB单元为1480， C单元为1780，
    required int32			sensor_2 = 8;				        //传感器状态的集合1
                                                        //0 bit, 车高中车， 0=遮挡 1=正常，AB单元为1500， C单元为1800，
                                                        //1 bit, 车高大车， 0=遮挡 1=正常，AB单元为2050， C单元为2050，
                                                        //2 bit, 有车检测 0=无车 1=有车
                                                        //3 bit, 车轮1检测 0=无车 1=有车, AB特有
                                                        //4 bit, 车轮2检测 0=无车 1=有车, AB特有
                                                        //5 bit, 预留
                                                        //6 bit, 预留
                                                        //7 bit, 预留
    required int32           plc_passway_enable=9;               //出入口 0=不可进车, 1=可进车, 2=维护不可进车, 3=维护可进车
}

//厦门搬运器状态消息
message dispatch_node_statu{
    required CarrierStatu                            statu=1;
    required int32                                   idle_stop_floor=2;          //空闲时停留位置
    required park_table                              running_pack_info=3;        //正在执行的停车表单
    required pick_table                              running_pick_info=4;        //正在执行的取车表单
    required int32                                   unit_id = 5;                //单元号, 1~3

    required int32                                   plc_heartbeat = 6;                      //plc心跳信息
    required int32                                   plc_mode_status = 7;                    //plc状态的集合
                                                                                    //0 bit, 手动模式, 维修模式
                                                                                    //1 bit, 自动模式
                                                                                    //2 bit, 自动运行中
                                                                                    //3 bit, 复位
                                                                                    //4 bit, 预留
                                                                                    //5 bit, 预留
                                                                                    //6 bit, 预留
                                                                                    //7 bit, 预留
    required int32                                   plc_passway_status = 8;                 //plc 出入口状态
                                                                                    //0 bit, 入口1 可进车
                                                                                    //1 bit, 入口1 维护
                                                                                    //2 bit, 入口2 可进车
                                                                                    //3 bit, 入口2 维护
                                                                                    //4 bit, 出口1 可出车
                                                                                    //5 bit, 出口1 维护
                                                                                    //6 bit, 出口2 可出车
                                                                                    //7 bit, 出口2 维护
    required int32                                   plc_carrier_status = 9;                 //搬运器状态 0=故障 1=存车 2=取车 3=空闲 4=维护
    required int32                                   plc_inlet_1_status = 10;                //入口1 0=不可进车, 1=可进车, 2=维护不可进车, 3=维护可进车
    required int32                                   plc_inlet_2_status = 11;                //入口2 0=不可进车, 1=可进车, 2=维护不可进车, 3=维护可进车
    required int32                                   plc_outlet_3_status = 12;               //出口3 0=不可进车, 1=可进车, 2=维护不可进车, 3=维护可进车
    required int32                                   plc_outlet_4_status = 13;               //出口4 0=不可进车, 1=可进车, 2=维护不可进车, 3=维护可进车

    repeated dispatch_plc_passway_status    dispatch_plc_passway_status_vector = 14; //plc出入口状态结构体,  数组下标0~1是入口, 数组下标2~3是出口

}

message terminal_node_statu{
    required int32 terminal_id = 1;
    required int32 import_id = 2;
    required string car_number = 3;
}