Make Safety ADC use sequnece feature of ADC and use DMA to write data
This commit is contained in:
@@ -536,46 +536,29 @@ static void safety_controller_check_stack()
|
||||
|
||||
static void safety_controller_handle_safety_adc()
|
||||
{
|
||||
static enum safety_adc_meas_channel current_channel = SAFETY_ADC_MEAS_TEMP;
|
||||
static uint64_t last_result_timestamp = 0;
|
||||
const uint16_t *channels;
|
||||
int poll_result;
|
||||
uint16_t result;
|
||||
float analog_value;
|
||||
|
||||
poll_result = safety_adc_poll_result(&result);
|
||||
if (!systick_ticks_have_passed(last_result_timestamp, SAFETY_CONTROLLER_ADC_DELAY_MS) && poll_result != 1)
|
||||
return;
|
||||
poll_result = safety_adc_poll_result();
|
||||
|
||||
if (poll_result) {
|
||||
if (poll_result == -1) {
|
||||
switch (current_channel) {
|
||||
case SAFETY_ADC_MEAS_TEMP:
|
||||
current_channel = SAFETY_ADC_MEAS_VREF;
|
||||
break;
|
||||
case SAFETY_ADC_MEAS_VREF:
|
||||
/* Expected fallthru */
|
||||
default:
|
||||
current_channel = SAFETY_ADC_MEAS_TEMP;
|
||||
break;
|
||||
}
|
||||
safety_adc_trigger_meas(current_channel);
|
||||
} else if (poll_result == 1) {
|
||||
last_result_timestamp = systick_get_global_tick();
|
||||
analog_value = safety_adc_convert_channel(current_channel, result);
|
||||
safety_controller_report_timing(ERR_TIMING_SAFETY_ADC);
|
||||
switch (current_channel) {
|
||||
case SAFETY_ADC_MEAS_TEMP:
|
||||
safety_controller_report_analog_value(ERR_AMON_UC_TEMP, analog_value);
|
||||
break;
|
||||
case SAFETY_ADC_MEAS_VREF:
|
||||
safety_controller_report_analog_value(ERR_AMON_VREF, analog_value);
|
||||
break;
|
||||
default:
|
||||
safety_controller_report_error(ERR_FLAG_SAFETY_ADC);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (poll_result == 1) {
|
||||
/* Data available */
|
||||
channels = safety_adc_get_values();
|
||||
analog_value = safety_adc_convert_channel(SAFETY_ADC_MEAS_TEMP, channels[0]);
|
||||
safety_controller_report_analog_value(ERR_AMON_UC_TEMP, analog_value);
|
||||
analog_value = safety_adc_convert_channel(SAFETY_ADC_MEAS_VREF, channels[1]);
|
||||
safety_controller_report_analog_value(ERR_AMON_VREF, analog_value);
|
||||
last_result_timestamp = systick_get_global_tick();
|
||||
safety_controller_report_timing(ERR_TIMING_SAFETY_ADC);
|
||||
}
|
||||
|
||||
if (systick_ticks_have_passed(last_result_timestamp, SAFETY_CONTROLLER_ADC_DELAY_MS)) {
|
||||
if (poll_result != 1 && poll_result != 0)
|
||||
safety_adc_trigger_meas();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user