Calibration_Stand/ui/Src/error.c

82 lines
3.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "../Inc/error.h"
#include "../Inc/widgets.h"
ErrorInfo error_list[ERROR_COUNT] = {
{0x01, "Нет данных от эталонного датчика"},
{0x02, "Недостаточное давление компрессора"},
{0x04, "Утечка давления (датчик травит)"},
{0x08, "Нет ответа от испытуемого датчика"}
};
void set_error_text_color(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) {
uint8_t error_code;
gtk_tree_model_get(model, iter, 0, &error_code, -1); // Получаем код ошибки из модели
const char *status;
gtk_tree_model_get(model, iter, 2, &status, -1); // Получаем состояние ошибки ("Произошла" или "Нет")
GdkRGBA color;
if (g_strcmp0(status, "Произошла") == 0) {
gdk_rgba_parse(&color, "red");
} else {
gdk_rgba_parse(&color, "black");
}
g_object_set(renderer, "foreground-rgba", &color, NULL); // Устанавливаем цвет текста
}
void initialize_error_table() {
// Создаём модель данных с тремя столбцами: Код, Описание, Состояние
widgets.ErrorListStore = gtk_list_store_new(3, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
// Создаём GtkTreeView и связываем его с моделью
widgets.ErrorTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(widgets.ErrorListStore));
// Добавляем колонку для кода ошибки
GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes("Код ошибки", renderer, "text", 0, NULL);
gtk_tree_view_column_set_cell_data_func(column, renderer, set_error_text_color, NULL, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(widgets.ErrorTreeView), column);
// Добавляем колонку для описания ошибки
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Описание ошибки", renderer, "text", 1, NULL);
gtk_tree_view_column_set_cell_data_func(column, renderer, set_error_text_color, NULL, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(widgets.ErrorTreeView), column);
// Добавляем колонку для состояния ошибки
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Состояние", renderer, "text", 2, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(widgets.ErrorTreeView), column);
// Устанавливаем функцию для изменения цвета текста
gtk_tree_view_column_set_cell_data_func(column, renderer, set_error_text_color, NULL, NULL);
// Добавляем GtkTreeView в основной контейнер
gtk_box_pack_start(GTK_BOX(widgets.GridBox), widgets.ErrorTreeView, TRUE, TRUE, 0);
// Обновляем отображение
gtk_widget_show_all(widgets.ErrorTreeView);
}
void update_error_table(uint8_t error_code) {
if (widgets.ErrorListStore == NULL) {
g_warning("ErrorListStore не инициализирован. Вызовите initialize_error_table() сначала.");
return;
}
gtk_list_store_clear(widgets.ErrorListStore);
GtkTreeIter iter;
for (int i = 0; i < ERROR_COUNT; i++) {
gtk_list_store_append(widgets.ErrorListStore, &iter);
const char *status = (error_code & error_list[i].code) ? "Произошла" : "Нет";
gtk_list_store_set(widgets.ErrorListStore, &iter,
0, error_list[i].code,
1, error_list[i].description,
2, status,
-1);
}
gtk_widget_queue_draw(GTK_WIDGET(widgets.ErrorTreeView));
}