From b3bbb7f360c866e7ba6536488b86a970fc9043cd Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Fri, 8 May 2015 15:26:45 +0200 Subject: fix build by adding _on_status_changed_ret and friends. Also the struct (ns) based messaging protocol is gone and replaced with a string parser Signed-off-by: Olliver Schinagl --- src/eulogium.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 82 insertions(+), 15 deletions(-) diff --git a/src/eulogium.c b/src/eulogium.c index 60c465a..53bb4bb 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -1234,17 +1234,61 @@ static void _on_get_print_name_ret(void *data, const Eldbus_Message *msg, Eldbus } struct _status_msg { - int16_t i; + enum printer_status i; char *s; }; static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _status_msg *status) { - EINA_LOG_INFO("Printer status: %s", status->s); - eulogium->printer.status = status->i; + Evas_Object *content = NULL; + + EINA_LOG_WARN("Printer status: %s", status->s); - if (eulogium->printer.status == ERROR) + switch (status->i) { + Elm_Object_Item *item; + /* Cases missing: First run wizard, heating, cooling */ +#if 0 + case (FIRST_RUN_WIZARD): + content = eulogium_multi_screen_menu(eulogium, eulogium->navi, &screen_data, 0, EINA_TRUE); + if (content) + elm_naviframe_item_simple_push(eulogium->navi, content); + break; +#endif + case (PAUSED): /* fall through TODO: make pause screen with resume/other button */ + case (PRINTING): + eldbus_proxy_call(eulogium->dbus.proxy[HARMA], "getPrintName", _on_get_print_name_ret, eulogium, -1, ""); + content = eulogium_print_progress(eulogium); + break; + case (WAIT_FOR_REMOVAL): + if (eulogium->printer.status != status->i) { + eulogium_print_data_clear(eulogium); + content = eulogium_clear_print_bed(eulogium); + } + break; + case (DISCONNECTED): /* fall through */ + case (ERROR): eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getError", _on_get_error_ret, eulogium, -1, ""); + content = eulogium_generic_error(eulogium, 4); + break; + case (IDLE): + /* Pop to the bottom of the stack. TODO: evaluate if a) we want this in a seperate function, b) popping to the bottom may not be the right frame to pop too? */ + if (eulogium->printer.status != status->i) { + eulogium_print_data_clear(eulogium); + item = elm_naviframe_bottom_item_get(eulogium->navi); + if (item) + elm_naviframe_item_pop_to(item); /* XXX what to do else? | XXX stack corrupted after this? (see error log) */ + else + EINA_LOG_CRIT("There is no bottom of the stack!"); + } + break; + default: + break; + } + if (content) + elm_naviframe_item_simple_push(eulogium->navi, content); + /* TODO: When status is printing for example, or waiting_for_Removal, pop to those screens immediatly? */ + + eulogium->printer.status = status->i; } static void _on_get_file_handlers_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) @@ -1271,28 +1315,51 @@ static void _on_get_file_handlers_ret(void *data EINA_UNUSED, const Eldbus_Messa free(file_handlers); /* TODO: Return filehandlers via data, free array after use there. Cache results during runtime prob. */ } -static void _on_status_changed_ret(void *data, const Eldbus_Message *msg) +static void _on_get_status_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { const char *errname, *errmsg; struct eulogium_data *eulogium = data; - Eldbus_Message_Iter *iter; + char *state; struct _status_msg status; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); - return; - } - if (!eldbus_message_arguments_get(msg, "(ns)", &iter)) { - EINA_LOG_ERR("Printer status signal failed."); - return; - } - if (!eldbus_message_iter_arguments_get(iter, "ns", &status.i, &status.s)) { - EINA_LOG_ERR("Signal content does not match expected \"ns\" signature."); - return; + status.i = ERROR; + status.s = griffin_print_status[ERROR]; + } else if (!eldbus_message_arguments_get(msg, "s", &state)) { + EINA_LOG_ERR("Message content does not match expected \"s\" signature."); + status.i = ERROR; + status.s = griffin_print_status[ERROR]; + } else if (!strncmp(state, "DISCONNECTED", 12)) { /* XXX replace this with something better and maintainable, function, LUT etc */ + status.i = DISCONNECTED; + status.s = griffin_print_status[DISCONNECTED]; + } else if (!strncmp(state, "ERROR", 5)) { + status.i = ERROR; + status.s = griffin_print_status[ERROR]; + } else if (!strncmp(state, "IDLE", 4)) { + status.i = IDLE; + status.s = griffin_print_status[IDLE]; + } else if (!strncmp(state, "WAIT_FOR_REMOVAL", 16)) { + status.i = WAIT_FOR_REMOVAL; + status.s = griffin_print_status[WAIT_FOR_REMOVAL]; + } else if (!strncmp(state, "PRINTING", 8)) { + status.i = PRINTING; + status.s = griffin_print_status[PRINTING]; + } else if (!strncmp(state, "PAUSED", 6)) { + status.i = PAUSED; + status.s = griffin_print_status[PAUSED]; + } else { + status.i = UNKNOWN; + status.s = griffin_print_status[UNKNOWN]; } eulogium_printer_status_set(eulogium, &status); } +static void _on_status_changed_ret(void *data, const Eldbus_Message *msg) +{ + _on_get_status_ret(data, msg, NULL); +} + static int eulogium_dbus_init(struct eulogium_data *eulogium) { Eldbus_Object *obj; -- cgit v0.12