/*
 * 电容模组
 */

/* Includes ----------------------------------------------------------------- */
#include "cap.h"

#include "component\capacity.h"
#include "component\limiter.h"
#include "device\can.h"
#include "device\referee.h"

/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
#define CAP_CUTOFF_VOLT 12.0f

/* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */
/* Private function  -------------------------------------------------------- */

/**
 * @brief 运行电容控制逻辑
 *
 * @param cap 电容数据结构体
 * @param referee 裁判系统数据
 * @param cap_out 电容输出结构体
 */
void Cap_Control(CAN_Capacitor_t *cap, const Referee_ForCap_t *referee,
                 CAN_CapOutput_t *cap_out) {
  if (referee->ref_status != REF_STATUS_RUNNING) {
    /* 当裁判系统离线时,依然使用裁判系统进程传来的数据 */
    cap_out->power_limit = referee->chassis_power_limit;
  } else {
    /* 当裁判系统在线时,使用算法控制裁判系统输出(即电容输入) */
    cap_out->power_limit =
        PowerLimit_CapInput(referee->chassis_watt, referee->chassis_power_limit,
                            referee->chassis_pwr_buff);
  }
  /* 更新电容状态和百分比 */
  cap->cap_status = CAN_CAP_STATUS_RUNNING;
  cap->percentage = Capacity_GetCapacitorRemain(cap->cap_feedback.cap_volt,
                                                cap->cap_feedback.input_volt,
                                                CAP_CUTOFF_VOLT);
}

/**
 * @brief 导出电容数据
 *
 * @param cap 电容数据
 * @param ui 结构体
 */
void Cap_DumpUI(const CAN_Capacitor_t *cap, Referee_CapUI_t *ui) {
  ui->percentage = cap->percentage;
  ui->status = cap->cap_status;
}