/*
 * 配置相关
 * 读写在FALSH上的信息
 */

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

#include "component\cmd.h"
#include "device\bmi088.h"
#include "device\can.h"
#include "device\ist8310.h"
#include "module\chassis.h"
#include "module\gimbal.h"
#include "module\shoot.h"

/* 机器人参数，保存后不会变化 */
typedef struct {
  CMD_RobotModel_t model;   /* 型号 */
  Chassis_Params_t chassis; /* 底盘 */
  Gimbal_Params_t gimbal;   /* 云台 */
  Shoot_Params_t shoot;     /* 射击 */
  CAN_Params_t can;         /* 电机CAN配置 */
} Config_RobotParam_t;

/* 操作员配置 */
typedef struct {
  CMD_Params_t param; /* 参数 */
} Config_PilotCfg_t;

/* 机器人配置，保存在Flash上的信息，根据机器人变化 */
typedef struct {
  char robot_param_name[20];
  char pilot_cfg_name[20];

  const Config_RobotParam_t *robot_param;
  const Config_PilotCfg_t *pilot_cfg;

  struct {
    IST8310_Cali_t ist8310;
    BMI088_Cali_t bmi088;
  } cali; /* 校准 */

  AHRS_Eulr_t mech_zero; /* 机械零点 */
  float gimbal_limit;    /* 云台pitch轴软件限位最高点 */

} Config_t;

/* 机器人参数和对应字符串的映射  */
typedef struct {
  const char *const name;
  const Config_RobotParam_t *param;
} Config_RobotParamMap_t;

/* 操作手配置和对应字符串的映射 */
typedef struct {
  const char *const name;
  const Config_PilotCfg_t *param;
} Config_PilotCfgMap_t;

/**
 * \brief 从Flash读取配置信息
 *
 * \param cfg 配置信息
 */
void Config_Get(Config_t *cfg);

/**
 * \brief 将配置信息写入Flash
 *
 * \param cfg 配置信息
 */
void Config_Set(Config_t *cfg);

/**
 * @brief 通过机器人参数名称获取机器人参数的指针
 *
 * @param robot_param_name 机器人参数名称
 * @return const Config_RobotParam_t* 机器人参数的指针
 */
const Config_RobotParam_t *Config_GetRobotParam(const char *robot_param_name);

/**
 * @brief 通过操作手配置名称获取操作手配置的指针
 *
 * @param pilot_cfg_name 操作手配置名称
 * @return const Config_PilotCfg_t* 操作手配置的指针
 */
const Config_PilotCfg_t *Config_GetPilotCfg(const char *pilot_cfg_name);
const Config_PilotCfgMap_t *Config_GetPilotNameMap(void);
const Config_RobotParamMap_t *Config_GetRobotNameMap(void);
#ifdef __cplusplus
}
#endif
