usbh_status_enum host_state_polling_fun (usb_core_handle_struct *pudev,
usbh_host_struct *puhost,
void *pustate)
{
usbh_state_handle_struct *p_state = (usbh_state_handle_struct *)pustate;
scd_begin(p_state, HOST_FSM_ID);
if (-1 == p_state->usbh_current_state_stack_top) {
uint8_t cur_state = p_state->usbh_current_state;
if ((0U == hcd_is_device_connected(pudev)) && (HOST_IDLE != cur_state)) {
if (HOST_DEV_DETACHED != cur_state) {
p_state->usbh_current_state = HOST_DEV_DETACHED;
cur_state = HOST_DEV_DETACHED;
}
}
host_state_handle[cur_state](pudev, puhost, p_state);
} else {
uint8_t stack0_state = p_state->stack[0].state;
if ((0U == hcd_is_device_connected(pudev)) && (HOST_IDLE != stack0_state)) {
if (HOST_DEV_DETACHED != stack0_state) {
p_state->stack[0].state = HOST_DEV_DETACHED;
stack0_state = HOST_DEV_DETACHED;
p_state->usbh_current_state = HOST_DEV_DETACHED;
}
}
host_state_handle[stack0_state](pudev, puhost, p_state);
}
return USBH_OK;
}
|