82 lines
3.9 KiB
C
82 lines
3.9 KiB
C
#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));
|
||
} |