@startuml
title 终端指令执行模块

class Terminor_Command_Executor
{
    + * 构造函数()
    + * parameter:该终端指令配置参数(待定)
    +Terminor_Command_Executor(Terminal::Terminor_parameter parameter);
    +~Terminor_Command_Executor();
 
    + * 获取终端进度状态()
    +TerminorStatu get_terminor_statu();
  
    + * 执行扫描,测量任务,阻塞知道任务完成或超时(单位秒)()
    + * 函数体只检测指令是否能执行,并启动线程执行指令,不等待指令完成.()
    + *lasers:需要启动的雷达()
    + * wj_lidar:万集雷达测量模块()
    + * plc:上传结果工具()
    + * locater:测量算法对象()
    + * verify_tool:结果检验工具,当该参数为NULL时,测量结果不作检验()
    + * 返回指令是否启动成功()
    +Error_manager execute_command(std::vector<Laser_base*> lasers,Fence_controller* wj_lidar,Plc_Communicator* plc,Locater* locater,Verify_result* verify_tool,float timeout=15);
    
    + * 强制正在执行的中断指令()
    +Error_manager force_stop_command();
 
    + * 设置保存文件的root路径()
    + * 执行指令时会在此路径下,生成日期文件夹,格式为:/root_path/year/month/day/YYYYMMDD-HHMMSS文件夹()
    +void set_save_root_path(std::string root);

    -static void thread_command_working(Terminor_Command_Executor* terminor);

    - * 执行指令流程函数()
    - * 扫描()
    - * 测量,保存测量结果到成员变量()
    -Error_manager scanning_measuring();
    
    - * 执行上传plc任务()
    - * plc终端编号从1开始()
    
    -Error_manager post_measure_information();
    
    - * 根据长宽,角度,生成cv::RotateRect()
    -static cv::RotatedRect create_rotate_rect(float length,float width,float angle,float x,float y);
    
    -TerminorStatu               m_terminor_statu;
    -//指令流程线程
    -std::thread*                mp_command_thread;
    -//
    -std::mutex                  m_mutex_lock;
    -//保存输入进来的雷达指针
    -std::vector<Laser_base*>    mp_laser_vector;
    -//万集雷达测量模块
    -Fence_controller*           mp_wj_lidar;
    -//plc
    -Plc_Communicator*           mp_plc;
    -//locater*
    -Locater*                    mp_locater;
    -//配置参数
    -Terminal::Terminor_parameter    m_terminor_parameter;
    -//本次指令超时时间 单位秒
    -float                       m_timeout_second;
    -//强制退出标示
    -bool                        mb_force_quit;
    -//保存当前指令测量结果
    -Locate_information          m_measure_information;
    -//保存文件的root目录
    -std::string                 m_save_root_path;
    -//检验结果工具
    -Verify_result*              mp_verify_tool;

}
note left of Terminor_Command_Executor
    * 终端指令执行类,
    * 执行指令,
    * 监控指令执行进度
    * 输入雷达数组,plc对象,测量算法对象,执行扫描测量任务
    * 检验测量结果合法性
end note


class Terminor_parameter
{
    +获取配置参数()
    +从文件流获取配置()
}
note bottom of Terminor_parameter
    * 终端配置类,protobuf格式
    * 
end note


note bottom of Fence_controller
    * 电子围栏雷达测量模块
    * 详见 wj_lidar 模块
end note

note bottom of Locater
    * 摆扫/大疆 雷达测量模块
    * 详见 locate 模块
end note

note bottom of Plc_Communicator
    * plc 通讯模块
    * 详见 plc 模块
end note

note bottom of Verify_result
    * verify : 测量结果检验模块
    * 详见 verify 模块
end note

Terminor_Command_Executor <-- Terminor_parameter
Terminor_Command_Executor <-- Fence_controller
Terminor_Command_Executor <-- Locater
Terminor_Command_Executor <-- Plc_Communicator
Terminor_Command_Executor <-- Verify_result


@enduml