//
// Created by huli on 2020/7/28.
//

#ifndef CAN_TEST_MOTOR_MANAGER_H
#define CAN_TEST_MOTOR_MANAGER_H

#include "../tool/singleton.h"
#include "../motor/motor_driver.h"
#include "../motor/motor_manager.pb.h"
#include <map>

//默认can通信的配置参数路径
#define MOTOR_PARAMETER_PATH "/home/youchen/extra_space/agv_200731/src/robot_control/src/can_card/setting/motor.prototxt"

//电机驱动器 的总管理
class Motor_manager:public Singleton<Motor_manager>
{
// 子类必须把父类设定为友元函数，这样父类才能使用子类的私有构造函数。
   friend class Singleton<Motor_manager>;

public:
	//雷达管理模块的工作状态
	enum Motor_manager_status
	{//default MOTOR_MANAGER_UNKNOW = 0
		MOTOR_MANAGER_UNKNOW               	= 0,    //未知
		MOTOR_MANAGER_READY               	= 1,    //准备，待机

		MOTOR_MANAGER_FAULT					= 10,	//故障
	};
private:
 // 父类的构造函数必须保护，子类的构造函数必须私有。
   Motor_manager();
public:
    //必须关闭拷贝构造和赋值构造，只能通过 get_instance 函数来进行操作唯一的实例。
    Motor_manager(const Motor_manager& other) = delete;
    Motor_manager& operator =(const Motor_manager& other) = delete;
    ~Motor_manager();
public://API functions
	//初始化 电机驱动器 的总管理 模块。如下三选一
	Error_manager motor_manager_init();
	//初始化 电机驱动器 的总管理模块。从文件读取
	Error_manager motor_manager_init_from_protobuf(std::string prototxt_path);
	//初始化 电机驱动器 的总管理 模块。从protobuf读取
	Error_manager motor_manager_init_from_protobuf(Motor_manager_proto::Motor_manager_parameter_all& motor_manager_parameter_all);
	//反初始化
	Error_manager motor_manager_uninit();

	//检查总状态
	Error_manager check_status();
	//检查消息是否有效, 判断这条消息是不是给我的.
	Error_manager check_msg(Can_message*  p_msg);
	//处理消息
	Error_manager execute_msg(Can_message* p_msg);
	//定时封装发送消息,
	Error_manager encapsulate_send_data();

	//
public://get or set member variable
	Error_manager		set_target_velocity(int motor_driver_id, float target_velocity);
	float 				get_actual_velocity(int motor_driver_id);
	//复位
	Error_manager 		motor_driver_reset(int motor_driver_id);
	//急停
	Error_manager 		motor_driver_stop(int motor_driver_id);
protected://member variable
	//电机驱动器 总管理的状态, 这个只是总状态, 不包括底下的驱动器设备, 这个状态只是表示, 这个模块是否初始化和通信可用.
	Motor_manager_status					m_motor_manager_status;

	int 									m_motor_number;				//电机驱动器的个数
	std::map<int, Motor_driver*>			m_motor_driver_map;			//电机驱动器的map, 索引为设备ID

private:

};


#endif //CAN_TEST_MOTOR_MANAGER_H
