Fix a few bugs and implement flags command further
This commit is contained in:
		@@ -59,6 +59,7 @@ struct analog_mon {
 | 
			
		||||
	float max;
 | 
			
		||||
	float value;
 | 
			
		||||
	bool valid;
 | 
			
		||||
	uint64_t timestamp;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef COUNT_OF
 | 
			
		||||
@@ -91,7 +92,7 @@ static volatile struct error_flag flags[] = {
 | 
			
		||||
static volatile struct timing_mon timings[] = {
 | 
			
		||||
	TIM_MON_ENTRY(ERR_TIMING_PID, 2, 1000, ERR_FLAG_TIMING_PID),
 | 
			
		||||
	TIM_MON_ENTRY(ERR_TIMING_MEAS_ADC, 0, 50, ERR_FLAG_TIMING_MEAS_ADC),
 | 
			
		||||
	TIM_MON_ENTRY(ERR_TIMING_SAFETY_ADC, 10, SAFETY_CONTROLLER_ADC_DELAY_MS + 70, ERR_FLAG_SAFETY_ADC),
 | 
			
		||||
	TIM_MON_ENTRY(ERR_TIMING_SAFETY_ADC, 10, SAFETY_CONTROLLER_ADC_DELAY_MS + 500, ERR_FLAG_SAFETY_ADC),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static volatile struct analog_mon analog_mons[] = {
 | 
			
		||||
@@ -233,6 +234,7 @@ void safety_controller_report_analog_value(enum analog_value_monitor monitor, fl
 | 
			
		||||
	if (ana) {
 | 
			
		||||
		ana->valid = true;
 | 
			
		||||
		ana->value = value;
 | 
			
		||||
		ana->timestamp = systick_get_global_tick();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -442,7 +444,7 @@ bool safety_controller_get_flags_by_mask(enum safety_flag mask)
 | 
			
		||||
	bool ret = false;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < COUNT_OF(flags); i++) {
 | 
			
		||||
		if (flags[i].flag & mask) {
 | 
			
		||||
		if ((flags[i].flag & mask) && flags[i].error_state) {
 | 
			
		||||
			ret = true;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
@@ -456,6 +458,25 @@ uint32_t safety_controller_get_flag_count()
 | 
			
		||||
	return COUNT_OF(flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t safety_controller_get_analog_monitor_count()
 | 
			
		||||
{
 | 
			
		||||
	return COUNT_OF(analog_mons);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int safety_controller_get_analog_mon_name_by_index(uint32_t index, char *buffer, size_t buffsize)
 | 
			
		||||
{
 | 
			
		||||
	if (index >= COUNT_OF(analog_mons))
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	if (buffsize == 0 || !buffer)
 | 
			
		||||
		return -1000;
 | 
			
		||||
 | 
			
		||||
	strncpy(buffer, analog_mons[index].name, buffsize);
 | 
			
		||||
	buffer[buffsize - 1] = 0;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int safety_controller_get_flag_name_by_index(uint32_t index, char *buffer, size_t buffsize)
 | 
			
		||||
{
 | 
			
		||||
	if (index >= COUNT_OF(flags))
 | 
			
		||||
@@ -489,4 +510,37 @@ int safety_controller_get_flag_by_index(uint32_t index, bool *status, enum safet
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int safety_controller_get_analog_mon_by_index(uint32_t index, struct analog_monitor_info *info)
 | 
			
		||||
{
 | 
			
		||||
	volatile struct analog_mon *mon;
 | 
			
		||||
 | 
			
		||||
	if (!info)
 | 
			
		||||
		return -1002;
 | 
			
		||||
 | 
			
		||||
	if (index >= COUNT_OF(analog_mons)) {
 | 
			
		||||
		info->status = ANALOG_MONITOR_ERROR;
 | 
			
		||||
		return -1001;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mon = &analog_mons[index];
 | 
			
		||||
 | 
			
		||||
	info->max = mon->max;
 | 
			
		||||
	info->min = mon->min;
 | 
			
		||||
	info->value = mon->value;
 | 
			
		||||
	info->timestamp = mon->timestamp;
 | 
			
		||||
 | 
			
		||||
	if (!mon->valid) {
 | 
			
		||||
		info->status = ANALOG_MONITOR_INACTIVE;
 | 
			
		||||
	} else {
 | 
			
		||||
		if (mon->value > mon->max)
 | 
			
		||||
			info->status = ANALOG_MONITOR_OVER;
 | 
			
		||||
		else if (mon->value < mon->min)
 | 
			
		||||
			info->status = ANALOG_MONITOR_UNDER;
 | 
			
		||||
		else
 | 
			
		||||
			info->status = ANALOG_MONITOR_OK;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user