opt/1085-optimization-and-cleanup #37
@@ -327,19 +327,27 @@ void relay_chn_issue_cmd(relay_chn_ctl_t* chn_ctl, relay_chn_cmd_t cmd)
|
|||||||
// If the last run command is different from the current command, calculate the time passed
|
// If the last run command is different from the current command, calculate the time passed
|
||||||
// since the last run command stopped and decide whether to run the command immediately or wait
|
// since the last run command stopped and decide whether to run the command immediately or wait
|
||||||
uint32_t last_run_cmd_time_ms = relay_chn_run_info_get_last_run_cmd_time_ms(chn_ctl->run_info);
|
uint32_t last_run_cmd_time_ms = relay_chn_run_info_get_last_run_cmd_time_ms(chn_ctl->run_info);
|
||||||
uint32_t inertia_time_passed_ms = (uint32_t) (esp_timer_get_time() / 1000) - last_run_cmd_time_ms;
|
uint32_t current_time_ms = (uint32_t)(esp_timer_get_time() / 1000);
|
||||||
uint32_t inertia_time_ms = CONFIG_RELAY_CHN_OPPOSITE_INERTIA_MS - inertia_time_passed_ms;
|
if (current_time_ms < last_run_cmd_time_ms) { // Timer overflow
|
||||||
if (inertia_time_ms > 0) {
|
// If timer overflowed, it's been a long time. Run immediately.
|
||||||
chn_ctl->pending_cmd = cmd;
|
|
||||||
relay_chn_state_t new_state = cmd == RELAY_CHN_CMD_FORWARD
|
|
||||||
? RELAY_CHN_STATE_FORWARD_PENDING : RELAY_CHN_STATE_REVERSE_PENDING;
|
|
||||||
relay_chn_update_state(chn_ctl, new_state);
|
|
||||||
// If the time passed is less than the opposite inertia time, wait for the remaining time
|
|
||||||
relay_chn_start_esp_timer_once(chn_ctl->inertia_timer, inertia_time_ms);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// If the time passed is more than the opposite inertia time, run the command immediately
|
|
||||||
relay_chn_dispatch_cmd(chn_ctl, cmd);
|
relay_chn_dispatch_cmd(chn_ctl, cmd);
|
||||||
|
} else {
|
||||||
|
uint32_t inertia_time_passed_ms = current_time_ms - last_run_cmd_time_ms;
|
||||||
|
if (inertia_time_passed_ms < CONFIG_RELAY_CHN_OPPOSITE_INERTIA_MS) {
|
||||||
|
uint32_t inertia_time_ms = CONFIG_RELAY_CHN_OPPOSITE_INERTIA_MS - inertia_time_passed_ms;
|
||||||
|
chn_ctl->pending_cmd = cmd;
|
||||||
|
relay_chn_state_t new_state = cmd == RELAY_CHN_CMD_FORWARD
|
||||||
|
? RELAY_CHN_STATE_FORWARD_PENDING : RELAY_CHN_STATE_REVERSE_PENDING;
|
||||||
|
relay_chn_update_state(chn_ctl, new_state);
|
||||||
|
// If the time passed is less than the opposite inertia time, wait for the remaining time
|
||||||
|
if (relay_chn_start_esp_timer_once(chn_ctl->inertia_timer, inertia_time_ms) != ESP_OK) {
|
||||||
|
ESP_LOGE(TAG, "Failed to start inertia timer for ch %d", chn_ctl->id);
|
||||||
|
relay_chn_execute_idle(chn_ctl);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If the time passed is more than the opposite inertia time, run the command immediately
|
||||||
|
relay_chn_dispatch_cmd(chn_ctl, cmd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user