syntax = "proto2";
package message;
import "message_base.proto";


//调度任务的类型
enum Dispatch_task_type
{
    DISPATCH_TASK_TYPE_UNKNOW               = 0;

    DISPATCH_PLAN_STORE                     = 101;  //总指令, 存车
    DISPATCH_PLAN_PICKUP                    = 102;  //总指令, 取车


    //机器手的动作
    ROBOT_CATCH_CAR_FROM_INLET              = 1;    //机器手去入口抓车(例如:机器手移动到2号入口上方,然后下降到一楼抓车,最后上升到最上方)
    ROBOT_PUT_CAR_TO_CARRIER                = 2;    //机器手把车放到中跑车上面(例如:机器手下降到中跑车上放车,最后上升到最上方)(通过目标点 指定放到哪一个中跑车上)
    ROBOT_CATCH_CAR_FROM_CARRIER            = 3;    //机器手去中跑车上抓车(例如:机器手移动到1号中跑车上方,然后下降到中跑车抓车,最后上升到最上方)
    ROBOT_PUT_CAR_TO_OUTLET                 = 4;    //机器手去出口放车(例如:机器手移动到3号出口上方,然后下降到一楼放车,最后上升到最上方)
    ROBOT_MOVE                              = 5;    //机器手的自由移动(例如:机器手移动到6号出入口的上方4楼处,给其他设备避让)(不进行抓车和放车的操作)

    //搬运器的动作(升降电梯 中跑车 小跑车 三合一为搬运器)
    CARRIER_RECEIVE_CAR_FROM_ROBOT          = 11;   //搬运器从机器手上接车(例如:搬运器移动到2号入口的上方,然后等待机器手把车放到中跑车上,小跑车保持松夹杆状态)
    CARRIER_STORE_CAR_TO_PARKINGSPACE       = 12;   //搬运器把车存到停车位上(例如:小跑车夹车后,搬运器移动到56号停车位,然后小跑车将车存入车位,之后搬运器退回至电梯井)
    CARRIER_STORE_CAR_TO_PARKINGSPACE_EX    = 122;   //搬运器把车存到停车位上(例如:小跑车夹车后,搬运器移动到56号停车位,然后小跑车将车存入车位,之后搬运器退回至56车位外面即可)

    CARRIER_PICKUP_CAR_FROM_PARKINGSPACE    = 13;   //搬运器从停车位上取车(例如:搬运器移动到56号停车位,然后小跑车将车从车位取出,之后搬运器退回至电梯井)
    CARRIER_PICKUP_CAR_FROM_PARKINGSPACE_EX = 133;   //搬运器从停车位上取车(例如:搬运器移动到56号停车位,然后小跑车将车从车位取出,之后搬运器退回至56车位外面即可)
    CARRIER_DELIVER_CAR_TO_ROBOT            = 14;   //搬运器把车交付给机器手(例如:搬运器移动到3号入口的上方,小跑车松夹杆,然后等待机器手把车从中跑车上取走)
    CARRIER_MOVE                            = 15;   //搬运器的自由移动(可以提前到2楼来准备接车,或者为了避让就退回至电梯井)(小跑车不进行取车和存车)

    //通道口的动作(1楼出入口的动作)
    PASSAGEWAY_OPEN_OUTSIDE_DOOR            = 21;   //通道口开外侧大门(0~7号出入口都有)
    PASSAGEWAY_CLOSE_OUTSIDE_DOOR           = 22;   //通道口关外侧大门(0~7号出入口都有)
    PASSAGEWAY_OPEN_INSIDE_DOOR             = 23;   //通道口开内侧大门(0号和7号出入口特有的指令)
    PASSAGEWAY_CLOSE_INSIDE_DOOR            = 24;   //通道口关内侧大门(0号和7号出入口特有的指令)
    PASSAGEWAY_ROTATE_TURNTABLE_TO_CARRIER  = 25;   //通道口旋转转盘到搬运器(对接小跑车)
    PASSAGEWAY_ROTATE_TURNTABLE_TO_OUTLET   = 26;   //通道口旋转转盘到出口

    //结束指令
    DISPATCH_FINISH                         = 30;   //整个调度流程完成, 正常完成(之后调度向总控汇报 正常完成任务)
    DISPATCH_CANCEL                         = 31;   //整个调度流程取消, 异常完成(之后调度向总控汇报 异常完成任务, 并把错误码往上报)
    DISPATCH_PAUSE                          = 40;   //调度暂停, 可以指定某一个设备暂时 停止动作,直接进入空闲状态(之后再次发送上面的正常指令,可以让其执行新的动作)
    DISPATCH_RESERVED                       = 50;   //预留

    //存车顺序  (1和15) ->11->2->12
    //1~6取车顺序  13-> (14和5) ->3->15->4
    //7取车顺序    13->12

    //3楼存车  (5和15) ->1->15 -> (5和11) ->2->12
    //3楼取车  (5和15) ->13->14->3-> (15和5) ->4->15

    //例如:机器手和3楼搬运器在2号入口上方, 执行存车指令 4号入口 -> 3楼27号车位.
    //同时抢占  搬运器和机器手的资源
    //5和15      机器手去1404  搬运器去1303
    //1         机器手去1104抓车, 并返回最高点
    //15        搬运器去1304
    //5和11     机器手去42    搬运器去27准备接车
    //2         机器手把车放到中跑车上27
    //12        搬运器把车存入27号车位
    //同时释放  搬运器和机器手的资源

    //例如:机器手和3楼搬运器在2号入口上方, 执行取车指令 3楼27号车位 -> 4号出口.
    //同时抢占  搬运器和机器手的资源
    //5和15      机器手去42  搬运器去27
    //13        搬运器去27号车位取车
    //14        搬运器去27号车位 把车交给机器手
    //3         机器手去27号 抓车
    //5和15      机器手去1404  搬运器去1305
    //4         机器手把车放到1104出口, 并返回最高点
    //15        搬运器去1304
    //同时释放  搬运器和机器手的资源
}



//调度设备的目标状态, 设备完成 调度控制的任务请求 之后 将设备状态改为这个
enum Dispatch_device_target_status
{
    E_TARGET_STATUS_UNKNOW               	= 0;    //未知
    E_TARGET_STATUS_IDLE                    = 1;    //空闲
    E_TARGET_STATUS_BUSY					= 2; 	//工作正忙
    E_TARGET_STATUS_READY               	= 3;    //准备就绪
    E_TARGET_STATUS_WAIT               	    = 4;    //等待
}

//调度设备的任务状态
enum Dispatch_device_task_status
{
        E_TASK_CREATED              = 0;      		//任务创建; 发送方

        E_TASK_ISSUE		        = 1; 			//任务下发; 发送方
        E_TASK_SIGNED               = 2;      		//已签收; 接收方
        E_TASK_WORKING              = 3;      		//处理中; 接收方
        E_TASK_OVER                 = 4;   			//已结束; 接收方
        E_TASK_STOP		            = 5; 			//任务暂停; 接收方

    	E_TASK_ERROR                = 11;			//任务错误; 接收方

    	E_TASK_CANCEL				= 21;			//任务取消; 发送方
    	E_TASK_DEAD                 = 22;           //任务死亡; 接收方

    	E_TASK_WITHDRAW		        = 31; 			//任务收回; 发送方
    	E_TASK_FREE			        = 32; 			//任务释放; 接收方


     //发送方 写 E_TASK_CREATED
     //接收方 收到之后 写 E_TASK_WORKING
     //接受方每隔1秒 周期性反馈消息
     //接受方完成任务后, 最后一次发送 E_TASK_OVER
}



//调度总规划的请求, 用于启动整个调度算法(调度管理->调度算法)
message Dispatch_plan_request_msg
{
    required Base_info                  base_info=1;                     //消息类型
    required string                     command_key=2;                   //指令唯一标识符id

    optional Dispatch_task_type         dispatch_task_type=3;            //调度任务的类型
    optional int32                      dispatch_source=4;               //调度的起点,源头(暂时不写)(留给以后使用)
    optional int32                      dispatch_destination=5;          //调度的终点,目的地(一般必须写, 特殊指令可以不写)

    optional Error_manager              error_manager = 6;               //错误码,也是任务的完成结果(如果为0,则表示成功完成任务,非0则任务失败)
}

//调度总规划的答复(调度算法->调度管理)
message Dispatch_plan_response_msg
{
    required Base_info                  base_info=1;                    //消息类型
    required string                     command_key=2;                   //指令唯一标识符id

    optional Dispatch_task_type         dispatch_task_type=3;            //调度任务的类型
    optional int32                      dispatch_source=4;               //调度的起点,源头(可以不写)
    optional int32                      dispatch_destination=5;          //调度的终点,目的地(必写,如果不写 任务就不会执行)

    optional Error_manager              error_manager = 6;               //错误码,也是任务的完成结果(如果为0,则表示成功完成任务,非0则任务失败)
}

//调度控制的任务请求(调度算法->调度管理)
message Dispatch_control_request_msg
{
    required Base_info                  base_info=1;                     //消息类型
    required string                     command_key=2;                   //指令唯一标识符id

    required Dispatch_task_type         dispatch_task_type=3;            //调度任务的类型
    optional Dispatch_device_type       dispatch_device_type=4;          //调度设备的类型
    optional int32                      dispatch_source=5;               //调度的起点,源头(暂时不写)(留给以后使用)
    optional int32                      dispatch_destination=6;          //调度的终点,目的地(一般必须写, 特殊指令可以不写)

    optional Error_manager              error_manager = 7;               //错误码,也是任务的完成结果(如果为0,则表示成功完成任务,非0则任务失败)

    optional Dispatch_device_target_status  dispatch_device_target_status = 8;  //调度设备的目标状态

    optional Dispatch_device_task_status    dispatch_device_task_status = 9;//调度设备的任务状态
}

//调度控制的任务答复(调度管理->调度算法)
message Dispatch_control_response_msg
{
    required Base_info                  base_info=1;                     //消息类型
    required string                     command_key=2;                   //指令唯一标识符id

    optional Dispatch_task_type         dispatch_task_type=3;            //调度任务的类型
    optional Dispatch_device_type       dispatch_device_type=4;          //调度设备
    optional int32                      dispatch_source=5;               //调度的起点,源头(可以不写)
    optional int32                      dispatch_destination=6;          //调度的终DISPATCH_FINISH点,目的地(必写,如果不写 任务就不会执行)

    optional Error_manager              error_manager = 7;               //错误码,也是任务的完成结果(如果为0,则表示成功完成任务,非0则任务失败)

    optional Dispatch_device_target_status  dispatch_device_target_status = 8;  //调度设备的目标状态
    optional Dispatch_device_task_status    dispatch_device_task_status = 9;//调度设备的任务状态

}


/*
        dispatch_source 和 dispatch_destination 的表示含义

        1~165           2楼~12楼的停车位

        1100            0号出口(在一楼)(目前没有)
        1101~1106       1~6号出入口 (在一楼)
        1107            7号出口(在一楼)
        1201~1206       1~6号出入口上方2楼处
        1301~1306       1~6号出入口上方3楼处
        1401~1406       1~6号出入口上方4楼处

        2101~2112       左侧电梯井(1楼~12楼)(一号搬运器的待机点)
        2201~2212       右侧电梯井(1楼~12楼)(二号搬运器的待机点)
*/

















