Calibration_Stand/ui/Src/error.c

82 lines
3.9 KiB
C
Raw Normal View History

2024-11-26 10:17:15 +07:00
#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));
}