新增其他协议切换PD时先进行一次完整的断开线处理,包含D+D-,CC线,GND,VBUS,然后再发送复位,待复位后再重新设置

1.  apps/chrg/applications/thread/chrg_north.h:调整北向调试宏默认配置
2.  apps/chrg/applications/utils/chrg_source.h:新增Source全复位与初始化等待状态枚举
3.  apps/chrg/applications/bsp/chrg_gpio.h:补充北向继电器引脚注释,明确功能对应关系
4.  apps/chrg/applications/thread/chrg_comm.c:优化Source复位触发条件,仅非PD转PD执行全复位
5.  apps/chrg/applications/utils/chrg_eload.c/h:新增南向板版本读取与解析接口,新增版本就绪校验逻辑
6.  apps/boot/application/main.c:完善boot跳转APP逻辑,注释原循环运行代码
7.  apps/chrg/applications/thread/chrg_roll_nor.c:新增INIT_WAIT状态处理,调整复位后流程与sub推进逻辑
8.  apps/chrg/applications/thread/chrg_roll_sou.c:新增南向版本就绪标记,上电先读取版本再启动常规采集
9.  apps/chrg/applications/utils/chrg_source.c:实现全复位流程与初始化等待状态处理函数
This commit is contained in:
wrh
2026-08-25 16:41:34 +08:00
parent 792e201d1e
commit c7db1d8176
10 changed files with 300 additions and 21 deletions
+53 -2
View File
@@ -166,6 +166,56 @@ void MX_USART_DeInit (void)
HAL_UART_DeInit(&huart2);
}
static void boot_JumpToAPP (void)
{
static uint32_t _stack_addr; /* APP 栈顶地址 */
static uint32_t _reset_handler; /* APP reset handler 地址 */
typedef void(*APP_MAIN_FUNC)(void);
APP_MAIN_FUNC APP_Main;
_stack_addr = *(volatile uint32_t *)BASE_APPLICATION;
_reset_handler = *(volatile uint32_t *)(BASE_APPLICATION + 4);
/* 设置所有时钟到默认状态,使用HSI时钟 */
HAL_RCC_DeInit();
/* 关闭全局中断 */
__disable_irq();
/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/* 关闭所有中断,清除所有中断挂起标志 */
for (uint8_t i = 0; i < 8; i++) {
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
/* 外设 deinit */
HAL_DeInit();
MX_USART_DeInit();
MX_DMA_DeInit();
/* 设置主堆栈指针 */
__set_MSP(_stack_addr);
/* 在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针 */
__set_CONTROL(0);
/* 设置中断向量表 */
SCB->VTOR = BASE_APPLICATION;
/* 跳转到 APP ,首地址是 MSP ,地址 +4 是复位中断服务程序地址 */
APP_Main = (APP_MAIN_FUNC)_reset_handler;
APP_Main();
/* 复位或跳转成功的话,不会执行到这里 */
while (1) {
}
}
int main (void)
{
@@ -190,9 +240,10 @@ int main (void)
VERSION_MAIN, VERSION_SUB, VERSION_FIX, BUILD_TIMESTAMP);
#endif
APP_Init();
boot_JumpToAPP();
while (1) {
APP_Running();
//APP_Running();
}
return -1;
+6 -6
View File
@@ -32,18 +32,18 @@
#define GPO_PIN_CH1_P2 GET_PIN(C, 1) // P2 connect K5 for GND/PGND
// 北向继电器2组
#define GPO_PIN_CH2_P0 GET_PIN(A, 5) // P0
#define GPO_PIN_CH2_P1 GET_PIN(A, 4) // P1
#define GPO_PIN_CH2_P0 GET_PIN(A, 5) // P0 //SINK D+D- CC
#define GPO_PIN_CH2_P1 GET_PIN(A, 4) // P1 //SOURCE D+D- CC
#define GPO_PIN_CH2_P2 GET_PIN(A, 1) // P2
// 北向继电器3组
#define GPO_PIN_CH3_P0 GET_PIN(C, 5) // P0
#define GPO_PIN_CH3_P1 GET_PIN(C, 4) // P1
#define GPO_PIN_CH3_P0 GET_PIN(C, 5) // P0 //SINK D+D- CC
#define GPO_PIN_CH3_P1 GET_PIN(C, 4) // P1 //SOURCE D+D- CC
#define GPO_PIN_CH3_P2 GET_PIN(A, 7) // P2
// 北向继电器4组
#define GPO_PIN_CH4_P0 GET_PIN(B, 15) // P0
#define GPO_PIN_CH4_P1 GET_PIN(B, 14) // P1
#define GPO_PIN_CH4_P0 GET_PIN(B, 15) // P0 //SINK D+D- CC
#define GPO_PIN_CH4_P1 GET_PIN(B, 14) // P1 //SOURCE D+D- CC
#define GPO_PIN_CH4_P2 GET_PIN(B, 13) // P2
// 北向通信口选通 U14
+7 -3
View File
@@ -2563,6 +2563,7 @@ static eMBException chrg_comm_apply_source_effect(rt_uint8_t ch,
rt_bool_t protocol_switch_requested;
rt_bool_t need_source_reset;
rt_uint8_t new_pd_state;
rt_uint8_t old_pd_state;
struct vc_pd_t old_pd_set;
eSRC_PRO old_protocol = pReal->source.protocol;
rt_uint8_t old_cc_set = pReal->source.CC_Set;
@@ -2589,8 +2590,10 @@ static eMBException chrg_comm_apply_source_effect(rt_uint8_t ch,
protocol_switch_requested = north_config_changed;
new_pd_state = chrg_comm_source_pd_state(
(rt_uint8_t)pShadow->source.protocol);
need_source_reset = (last_pd_pro[ch] != SOURCE_PD_STATE_UNKNOWN) &&
(last_pd_pro[ch] != new_pd_state);
/* 只有已知的非PD -> PD切换执行完整硬件复位。 */
old_pd_state = chrg_comm_source_pd_state((rt_uint8_t)old_protocol);
need_source_reset = (old_pd_state == SOURCE_PD_STATE_NON_PD) &&
(new_pd_state == SOURCE_PD_STATE_PD);
target_curr = pShadow->source.pd_set.mm.max_cur;
/* 影子区只拥有COM配置;北向解析产生的运行目标和回读数据继续由pReal持有。 */
@@ -2637,7 +2640,8 @@ static eMBException chrg_comm_apply_source_effect(rt_uint8_t ch,
* sub已在上方确定,北向轮询线程执行本状态并清零成功后,继续
* CC_CLOSE或协议设置,不需要COM直接发送任何清零命令。
*/
pReal->source.work_mode = SOURCE_WORK_PROTOCOL_SWITCH;
pReal->source.work_mode = need_source_reset ?
SOURCE_WORK_FULL_RESET : SOURCE_WORK_PROTOCOL_SWITCH;
}
if (pReal->source.protocol != PRO_NONE) {
+2 -2
View File
@@ -22,8 +22,8 @@
#define LEN_FRAME_HEAD (4) // [帧长, 0x00, id, 命令]
#define MIN_FRAME_LENGTH (5) // 帧最短5字节
#define WORK_MIN_VOLT 3000 // 工作电压下限,单位mV
#define NORTH_FRAME_DEBUG 0x01 // 北向UART原始收发帧
#define NORTH_SOURCE_DEBUG 0x00 // Source协议解析及组帧
#define NORTH_FRAME_DEBUG 0x00 // 北向UART原始收发帧
#define NORTH_SOURCE_DEBUG 0x01 // Source协议解析及组帧
#define NORTH_SINK_DEBUG 0x00 // Sink协议解析及组帧
#define SOUTH_FRAME_DEBUG 0x00 // 南向UART原始收发帧
#define SOUTH_COMMAND_DEBUG 0x01 // 南向寄存器写命令
+16 -3
View File
@@ -157,6 +157,10 @@ static rt_bool_t chrg_roll_nor_source_wait_process(rt_uint8_t ch,
chrg_roll_nor_source_switch_reset(ch);
return RT_FALSE;
}
if (pSW->source.work_mode == SOURCE_WORK_INIT_WAIT) {
/* 南向初始化批次未完成时,禁止发送北向协议命令。 */
return RT_TRUE;
}
if (pSW->sub == IDX_WAIT_SOURCE_PROTOCOL) {
if ((g_source_protocol_wait_mask & bit) == 0U) {
@@ -795,6 +799,7 @@ static int chrg_roll_nor_auto_request(rt_uint8_t idx,
struct chrg_switch_t *pSW, struct chrg_thread_t *pTHR,
struct chrg_thread_t *pTN, struct chrg_north_t *pNOR)
{
rt_bool_t advance_sub = RT_TRUE;
rt_uint8_t attempt; // 当前发送序号:0为首次,1~2为重发
rt_uint8_t request_sub = 0; // 本次请求实际使用的sub快照
rt_uint8_t next_sub = 0; // 正确回码后准备提交的候选sub
@@ -868,7 +873,10 @@ static int chrg_roll_nor_auto_request(rt_uint8_t idx,
/* ID、命令、CRC和配置版本均确认有效后,才正式推进实时sub。 */
if ((expected_id == ID_SOURCE) &&
(request_sub == IDX_SET_SOURCE_RESET)) {
/* 参与通道全部收到0x17=3应答后,共享一次300ms保护等待。 */
/* 复位回码后重新执行Source INIT,初始化完成后再推进到PD。 */
pSW->source.work_mode = SOURCE_WORK_INIT;
advance_sub = RT_FALSE;
/* INIT完成前保持当前sub,禁止通用逻辑提前推进到PD。 */
} else if ((expected_id == ID_SOURCE) &&
(request_sub == IDX_SET_SOURCE_PD)) {
/* 0xD0应答后每通道独立等待100ms,再连接目标CC。 */
@@ -887,7 +895,7 @@ static int chrg_roll_nor_auto_request(rt_uint8_t idx,
}
/* 业务解析可能主动切换sub,例如掉电恢复后要求重新设置协议。
* 只有sub仍属于本次请求时,才应用请求函数计算出的next_sub。 */
if (pSW->sub == request_sub) {
if (advance_sub && (pSW->sub == request_sub)) {
pSW->sub = next_sub;
}
rt_mutex_release(pTHR->mutex);
@@ -960,7 +968,12 @@ void chrg_roll_nor_thread_entry (void *data)
if ((pSW->id == ID_SOURCE) &&
((pSW->source.work_mode == SOURCE_WORK_INIT) ||
(pSW->source.work_mode == SOURCE_WORK_STOP) ||
(pSW->source.work_mode == SOURCE_WORK_PROTOCOL_SWITCH))) {
(pSW->source.work_mode == SOURCE_WORK_PROTOCOL_SWITCH) ||
(pSW->source.work_mode == SOURCE_WORK_FULL_RESET) ||
(pSW->source.work_mode == SOURCE_WORK_FULL_RESET_WAIT) ||
(pSW->source.work_mode == SOURCE_WORK_FULL_RESET_RELAY) ||
(pSW->source.work_mode == SOURCE_WORK_FULL_RESET_RELAY_WAIT) ||
(pSW->source.work_mode == SOURCE_WORK_INIT_WAIT))) {
state_work_ret = chrg_source_work_state(idx, pSW);
} else if ((pSW->id == ID_SINK) &&
((pSW->sink.work_mode == SINK_WORK_INIT) ||
+30 -3
View File
@@ -35,6 +35,11 @@ chrg_rollsou_com_t g_sou_com_batch = {0};
static rt_uint8_t g_sou_measure_once_pending_mask = 0U;
static rt_uint8_t g_sou_measure_once_active_mask = 0U;
/* A channel enters normal measurement polling only after its version probe
* receives a valid response. A failed probe remains pending for the next
* round, which also covers the south board's slower power-up time. */
static rt_uint8_t g_sou_version_ready[TOTAL_SOU_CHS] = {0U};
/* COM批量命令按通道轮询发送。一次写命令收到匹配回码后才移动游标;
* 回码错误或超时时游标保持不变,使同一条命令优先完成重发,避免破坏
* 本通道批次内的寄存器执行顺序。 */
@@ -770,6 +775,7 @@ void chrg_roll_sou_thread_entry (void *data)
rt_uint16_t single_value = 0;
rt_bool_t command_valid = RT_FALSE;
rt_bool_t measure_once = RT_FALSE;
rt_bool_t version_probe = RT_FALSE;
rt_uint8_t response_part = MB_R_PART1;
rt_err_t ret = RT_EOK;
struct chrg_rollsou_t *pROLL = &chrgrollsou;
@@ -785,6 +791,7 @@ void chrg_roll_sou_thread_entry (void *data)
rt_mutex_release(pTHR->mutex);
command_valid = RT_FALSE;
measure_once = RT_FALSE;
version_probe = RT_FALSE;
response_part = MB_R_PART1;
if ((run != RUN_COM) && (run != RUN_UPDATA)) {
retry_count = 0;
@@ -802,7 +809,12 @@ void chrg_roll_sou_thread_entry (void *data)
pROLL->idx = (eIDX_SOU_CH)idx;
chrg_south_switch((eIDX_SOU_CH)idx);
}
chrg_eload_refresh(ID_ELOAD, MB_R_PART1);
if (g_sou_version_ready[idx] == 0U) {
version_probe = RT_TRUE;
chrg_eload_read_version(ID_ELOAD);
} else {
chrg_eload_refresh(ID_ELOAD, MB_R_PART1);
}
break;
}
idx = index%(TOTAL_SOU_CHS); // [0, 3]
@@ -818,7 +830,12 @@ void chrg_roll_sou_thread_entry (void *data)
chrg_south_switch((eIDX_SOU_CH)idx);
pROLL->part = MB_R_PART1;
}
chrg_eload_refresh(ID_ELOAD, pROLL->part);
if (g_sou_version_ready[idx] == 0U) {
version_probe = RT_TRUE;
chrg_eload_read_version(ID_ELOAD);
} else {
chrg_eload_refresh(ID_ELOAD, pROLL->part);
}
if (pROLL->part < TOTAL_MB_R) {
index++;
}
@@ -843,6 +860,7 @@ void chrg_roll_sou_thread_entry (void *data)
batch_ch = command_ch;
command_valid = RT_TRUE;
chrg_south_switch((eIDX_SOU_CH)command_ch);
rt_kprintf("ch=%d",command_ch);
chrg_eload_write_reg(ID_ELOAD, command_reg, command_value);
}
break;
@@ -907,7 +925,16 @@ void chrg_roll_sou_thread_entry (void *data)
} else if (run != RUN_AUTO) {
sou_single_command_finish(run);
} else {
chrg_eload_parse(idx, response_part, pMB_R->payload, pMB_R->length);
if (version_probe) {
if (chrg_eload_parse_version(idx, pMB_R->payload,
pMB_R->length) == 0) {
g_sou_version_ready[idx] = 1U;
pROLL->part = MB_R_PART1;
}
} else {
chrg_eload_parse(idx, response_part, pMB_R->payload,
pMB_R->length);
}
}
} else if (run == RUN_COM) {
sou_com_command_failed(batch_ch, command_reg, command_value,
+26
View File
@@ -179,6 +179,14 @@ int chrg_eload_read_regs (rt_uint8_t addr, rt_uint16_t reg, rt_uint16_t len)
return chrg_south_send(buf, 8);
}
/* Read the version first so a newly powered south board is not queried with
* the long measurement frame before its Modbus interface is ready. */
int chrg_eload_read_version (rt_uint8_t addr)
{
return chrg_eload_read_regs(addr, MODBUSRTU_SW_VERSION_REG,
MODBUSRTU_SW_VERSION_LEN);
}
/*****************************************************************
函数名称: chrg_eload_send_ymodem_data
函数描述: 向南向发送ymodem协议升级数据
@@ -292,6 +300,24 @@ int chrg_eload_refresh (rt_uint8_t addr, rt_uint8_t part)
return ret;
}
int chrg_eload_parse_version (rt_uint8_t idx, rt_uint8_t *data, rt_uint16_t len)
{
rt_uint16_t version;
/* A one-register Modbus 0x03 response is 7 bytes including CRC16. */
if ((idx >= TOTAL_SOU_CHS) || (data == RT_NULL) ||
(len != (MODBUSRTU_SW_VERSION_LEN * 2U + 5U)) ||
(data[0] != ID_ELOAD) || (data[1] != MB_REGISTER_RD) ||
(data[2] != 2U) || (mb_crc16(data, len) != 0U)) {
return -1;
}
version = u8v_to_u16(&data[3]);
/* HOLD_REG_CH0_VERSION is the per-channel south board version register. */
usRegHoldBuf[HOLD_REG_CH0_VERSION + idx * TOTAL_HOLD_CH_REGS] = version;
return 0;
}
/*****************************************************************
函数名称: chrg_eload_parse
函数描述: 解析源载返回数据
+22
View File
@@ -164,6 +164,10 @@ typedef enum {
TOTAL_MB_R
} eIDX_MB_PART;
/* South board firmware version register: one 16-bit register at 0x0301. */
#define MODBUSRTU_SW_VERSION_REG 0x0301U
#define MODBUSRTU_SW_VERSION_LEN 1U
#define SIZE_P1_RD 19 // 读19个寄存器
#define SIZE_P2_RD 28 // 读28个寄存器
@@ -239,6 +243,15 @@ struct chrg_eload_t {
*****************************************************************/
extern int chrg_eload_read_regs (rt_uint8_t addr, rt_uint16_t reg, rt_uint16_t len);
/*****************************************************************
Function: chrg_eload_read_version
Description: Request the south board firmware version register.
Input: addr: south board address
Output: -
Return: <0: error, >0: sent length
*****************************************************************/
extern int chrg_eload_read_version (rt_uint8_t addr);
/*****************************************************************
函数名称: chrg_eload_write_reg
函数描述: 向南向发送写单个寄存器
@@ -268,6 +281,15 @@ extern int chrg_eload_refresh (rt_uint8_t addr, rt_uint8_t part);
其它说明: -
*****************************************************************/
extern int chrg_eload_parse (rt_uint8_t idx, rt_uint8_t pt, rt_uint8_t *data, rt_uint16_t len);
/*****************************************************************
Function: chrg_eload_parse_version
Description: Parse and store a valid south board firmware version.
Input: idx: channel, data: Modbus response, len: response length
Output: firmware version is stored at the channel version register
Return: 0: valid, <0: invalid response
*****************************************************************/
extern int chrg_eload_parse_version (rt_uint8_t idx, rt_uint8_t *data, rt_uint16_t len);
/*****************************************************************
函数名称: chrg_eload_get_sample_seq
函数描述: 获取指定南向通道P1量测数据的更新序号
+133 -2
View File
@@ -21,6 +21,16 @@
static int chrg_source_work_running(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW);
static int chrg_source_work_full_reset(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW);
static int chrg_source_work_full_reset_wait(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW);
static int chrg_source_work_full_reset_relay(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW);
static int chrg_source_work_full_reset_relay_wait(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW);
static int chrg_source_work_init_wait(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW);
/*****************************************************************
函数名称: chrg_source_init_submit
@@ -39,7 +49,7 @@ int chrg_source_init_submit(rt_uint8_t idx, struct chrg_switch_t *pSW)
rt_uint16_t regs[5] = {
REG_ELOAD,
REG_MODE,
0x01,
REG_REL_ON,
REG_CURRENT_OUT + 1,
REG_WORK
};
@@ -88,8 +98,38 @@ static int chrg_source_work_init(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
pNOR->enable[idx] = 1;
pSOU->online[idx] = 1;
chrg_nor_sw_rel((eIDX_NOR_CH)idx, ID_SOURCE);
/* 初始化批次必须全部收到南向回码后,才能继续协议设置或输出控制。 */
pSW->source.work_mode = SOURCE_WORK_INIT_WAIT;
return 0;
}
static int chrg_source_work_init_wait(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW)
{
int result;
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
return -1;
}
if (chrg_sou_com_batch_is_pending(idx)) {
return 1;
}
result = chrg_sou_com_batch_get_result(idx);
if (result <= 0) {
/* 南向初始化失败时,保持北向协议不变并重发完整初始化批次。 */
pSW->source.work_mode = SOURCE_WORK_INIT;
return 1;
}
if (pSW->sub == IDX_SET_SOURCE_RESET) {
/* 复位后的初始化完成,才允许进入PD协议设置。 */
pSW->sub = IDX_SET_SOURCE_PD;
pSW->source.work_mode = SOURCE_WORK_WAIT;
return 0;
}
if (pSW->source.protocol == PRO_NONE) {
/* 标准协议没有协商回码,INIT成功后立即由RUNING统一写入电压。 */
/* 标准协议不等待协商,初始化完成后直接写入目标电压。 */
pSW->source.work_mode = SOURCE_WORK_RUNING;
return chrg_source_work_running(idx, pSW);
}
@@ -173,6 +213,87 @@ static int chrg_source_work_protocol_switch(eIDX_SOU_CH idx,
return 0;
}
static int chrg_source_work_full_reset(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW)
{
rt_uint16_t reg = REG_WORK;
rt_uint16_t value = WORK_STOP;
/* Cancel stale south commands so the reset sequence starts from a known state. */
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
return -1;
}
if (chrg_sou_com_batch_cancel(idx) != 0) {
return -1;
}
if (chrg_sou_com_batch_submit(idx, &reg, &value, 1) != 0) {
return -1;
}
pSW->source.set_volt = 0;
pSW->source.work_mode = SOURCE_WORK_FULL_RESET_WAIT;
return 1;
}
static int chrg_source_work_full_reset_wait(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW)
{
int result;
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
return -1;
}
if (chrg_sou_com_batch_is_pending(idx)) {
return 1;
}
result = chrg_sou_com_batch_get_result(idx);
if (result <= 0) {
pSW->source.work_mode = SOURCE_WORK_FULL_RESET;
return 1;
}
pSW->source.work_mode = SOURCE_WORK_FULL_RESET_RELAY;
return 1;
}
static int chrg_source_work_full_reset_relay(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW)
{
rt_uint16_t reg = REG_REL_ON;
rt_uint16_t value = ALL_REL_OFF;
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
return -1;
}
if (chrg_sou_com_batch_submit(idx, &reg, &value, 1) != 0) {
return -1;
}
pSW->source.work_mode = SOURCE_WORK_FULL_RESET_RELAY_WAIT;
return 1;
}
static int chrg_source_work_full_reset_relay_wait(eIDX_SOU_CH idx,
struct chrg_switch_t *pSW)
{
int result;
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
return -1;
}
if (chrg_sou_com_batch_is_pending(idx)) {
return 1;
}
result = chrg_sou_com_batch_get_result(idx);
if (result <= 0) {
pSW->source.work_mode = SOURCE_WORK_FULL_RESET_RELAY;
return 1;
}
/* South relays are off; now disconnect D+/D- and CC before SOURCE_RESET. */
chrg_nor_sw_rel((eIDX_NOR_CH)idx, 0);
pSW->sub = IDX_SET_SOURCE_RESET;
pSW->source.work_mode = SOURCE_WORK_WAIT;
return 1;
}
/*****************************************************************
函数名称: chrg_source_work_stop
函数描述: 执行电源主动关机流程
@@ -266,6 +387,16 @@ int chrg_source_work_state(rt_uint8_t idx, struct chrg_switch_t *pSW)
return chrg_source_work_switch(idx, pSW);
case SOURCE_WORK_PROTOCOL_SWITCH:
return chrg_source_work_protocol_switch(idx, pSW);
case SOURCE_WORK_FULL_RESET:
return chrg_source_work_full_reset(idx, pSW);
case SOURCE_WORK_FULL_RESET_WAIT:
return chrg_source_work_full_reset_wait(idx, pSW);
case SOURCE_WORK_FULL_RESET_RELAY:
return chrg_source_work_full_reset_relay(idx, pSW);
case SOURCE_WORK_FULL_RESET_RELAY_WAIT:
return chrg_source_work_full_reset_relay_wait(idx, pSW);
case SOURCE_WORK_INIT_WAIT:
return chrg_source_work_init_wait(idx, pSW);
default:
return -1;
}
@@ -169,6 +169,11 @@ enum {
SOURCE_WORK_STOP, // 主动停止并关闭通道
SOURCE_WORK_SWITCH, // 停止旧负载后进入电源INIT
SOURCE_WORK_PROTOCOL_SWITCH, // 协议/CC切换前清零功率板输出
SOURCE_WORK_FULL_RESET, // Submit output clear and stop commands
SOURCE_WORK_FULL_RESET_WAIT, // Wait for output clear and stop
SOURCE_WORK_FULL_RESET_RELAY, // Submit south relay-off command
SOURCE_WORK_FULL_RESET_RELAY_WAIT,// Wait before disconnecting north relay
SOURCE_WORK_INIT_WAIT, // Wait for Source init batch completion
SOURCE_WORK_ON_TEST_DYNA,
SOURCE_WORK_ON_TEST_SHORT,
};