/**
  *****************************************************************************
  * @file    sys_ufcs_hook.h
  * @author  Solution Team
  * @version V1.00
  * @date    28-February-2023
  * @brief   UFCS hook implimentation
  *****************************************************************************
  * @attention 
  *  Copyright (c) 2017 - 2023 Unicmicro Co., Ltd. 
  *  All Rights Reserved. 
  *****************************************************************************
  */
 
#ifndef __SYS_UFCS_HOOK_H_
#define __SYS_UFCS_HOOK_H_

#include "sys_defs.h"
#include "sys_gpio.h"
#include "ufcs.h"
#include "drv_timer.h"
#include "sys_ufcs_config.h"

#pragma pack(1)

typedef struct SYS_UFCS_INFO_s
{
    u32_t disconnected_tick;                /* 断开连接时tick值，tick计数为上电后每隔100毫秒计数一次 */
    u32_t no_current_start_tick;            /* 无电流时tick值，tick计数为上电后每隔100毫秒计数一次 */

    u32_t vbus_en:1,                        /* BUS上电开关 */
          discharge_en:1,                   /* BUS泄放电开关 */
          sys_initializing:1,               /* 系统初始中 */
          sys_obj_pos:4,                    /* 系统输出能力编号 */
          resv0:25;

    UFCS_DEV_t dev_ufcs_usbc;

} SYS_UFCS_INFO_t;

#pragma pack()

extern volatile SYS_UFCS_INFO_t g_sys_ufcs_info;

/**
 * @description:    设备去识别回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_unidentified_hook(u32_t dev_ptr);

/**
 * @description:    设备已识别回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_identified_hook(u32_t dev_ptr);

/**
 * @description:    设备切换新的输出能力回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @param pos       输出能力编号索引，取值范围：1~7
 * @return          返回0则切换成功，非零则切换失败
 */
status_t sys_ufcs_transit_to_new_power_hook(u32_t dev_ptr, u32_t pos);

/**
 * @description:    设备获取线路开关状态回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return          TRUE：打开，FALSE：关闭
 */
bool_t sys_ufcs_vbus_en_get(u32_t dev_ptr);

/**
 * @description:    设备打开线路开关状态回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @param flg       标志，TRUE：打开，FALSE：关闭
 * @return void
 */
void sys_ufcs_vbus_en_set(u32_t dev_ptr, bool_t flg);

/**
 * @description:    设备获取线路泄放开关状态回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return          TRUE：打开，FALSE：关闭
 */
bool_t sys_ufcs_vbus_discharge_en_get(u32_t dev_ptr);

/**
 * @description:    设备获取线路泄放开关状态回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @param flg       TRUE：打开，FALSE：关闭
 * @return void
 */
void sys_ufcs_vbus_discharge_en_set(u32_t dev_ptr, bool_t flg);

/**
 * @description:    设备获取供电线路电压值回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return          电压值，单位毫伏
 */
u32_t sys_ufcs_vbus_volt_get(u32_t dev_ptr);

/**
 * @description:    设备获取供电线路电流值回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return          电流值，单位毫安
 */
u32_t sys_ufcs_ibus_current_get(u32_t dev_ptr);

/**
 * @description:    设备输出能力改变请求回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_power_change_req_hook(u32_t dev_ptr);

/**
 * @description:    设备鉴权请求回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_verify_req_hook(u32_t dev_ptr);

/**
 * @description:    设备鉴权回应回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_verify_resp_hook(u32_t dev_ptr);

/**
 * @description:    UFCS设备空闲时回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_idle_loop_hook(u32_t dev_ptr);

/**
 * @description:    设备收到消息回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_prl_msg_received_hook(u32_t dev_ptr);

/**
 * @description:    设备发送消息回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_prl_msg_sent_hook(u32_t dev_ptr);

/**
 * @description:    设备发送或接收输出能力消息回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @param dir       消息的方向，发送或接收
 * @return void
 */
void sys_ufcs_msg_output_cap_hook(u32_t dev_ptr, UFCS_PRL_DIR_TYPE_t dir);

/**
 * @description:    设备发送或接收请求输出能力消息回调函数
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @param dir       消息的方向，发送或接收
 * @return void
 */
void sys_ufcs_msg_request_hook(u32_t dev_ptr, UFCS_PRL_DIR_TYPE_t dir);

/**
 * @description:    UFCS设备回调函数初始化
 * @param dev_ptr   UFCS设备指针（UFCS_DEV_t *）
 * @return void
 */
void sys_ufcs_hook_init();


#endif /* #ifndef __SYS_UFCS_HOOK_H_ */

