From a8b06d4aa0db681c7691651daaf289dc9701a485 Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Thu, 11 Jun 2015 14:38:20 +0200 Subject: Add ignore screens when someone else starts a print WIP This is not 100% okay yet, but works as intended (the first time ;) Signed-off-by: Olliver Schinagl --- src/eulogium.c | 231 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 169 insertions(+), 62 deletions(-) diff --git a/src/eulogium.c b/src/eulogium.c index 9dc5a5b..6442d45 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -35,6 +35,7 @@ static void _on_print_abort_ret(void *data EINA_UNUSED, const Eldbus_Message *ms static void _cb_content_prev_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _print_abort_confirm_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _print_abort_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _print_ignore_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _on_blink_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); static void _but_material_change_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_material_settings_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); @@ -115,6 +116,16 @@ static struct button_def but_main_print = { .data = NULL, }; +static struct button_def but_print_ignore = { + .text = "IGNORE THIS JOB", + .cb = { + .func = &_print_ignore_cb, + .data = NULL, + .info = "print ignore button pressed", + }, + .data = NULL, +}; + static struct button_def but_print_local = { .text = "LOCAL", .cb = { @@ -1194,6 +1205,15 @@ static void _print_abort_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "abortPrint", _on_print_abort_ret, eulogium, -1, ""); } +static void _print_ignore_cb(void *data, Evas_Object *obj, void *event_info) +{ + struct eulogium_data *eulogium = data; + + eulogium->print.block = EINA_FALSE; + eulogium->print.block_active = EINA_FALSE; + _print_abort_cb(data, obj, event_info); +} + static void _but_system_maintenance_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { struct eulogium_data *eulogium = data; @@ -1346,7 +1366,6 @@ static void _cb_button_main_print(void *data, Evas_Object *object EINA_UNUSED, v } } - /* TODO Make macro for all the simple entries */ static void _but_settings_network_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -1667,6 +1686,65 @@ Evas_Object *eulogium_split_screen(Evas_Object *parent, Evas_Object *top, Evas_O return table; } +struct _status_msg { + enum printer_status i; + char *s; +}; + +static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _status_msg *status); + +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; + char *state; + struct _status_msg status; + + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); + 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, "FIRST_RUN_WIZZARD", 17)) { + status.i = FIRST_RUN_WIZZARD; + status.s = griffin_print_status[FIRST_RUN_WIZZARD]; + } else if (!strncmp(state, "IDLE", 4)) { + status.i = IDLE; + status.s = griffin_print_status[IDLE]; + } else if (!strncmp(state, "SLICING", 7)) { + status.i = SLICING; + status.s = griffin_print_status[SLICING]; + } else if (!strncmp(state, "HEATING", 7)) { + status.i = HEATING; + status.s = griffin_print_status[HEATING]; + } else if (!strncmp(state, "PRINTING", 8)) { + status.i = PRINTING; + status.s = griffin_print_status[PRINTING]; + } else if (!strncmp(state, "COOLING", 7)) { + status.i = COOLING; + status.s = griffin_print_status[COOLING]; + } 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, "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_get_progress_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { const char *errname, *errmsg; @@ -1766,6 +1844,76 @@ static Eina_Bool _timer_progress_data_update_cb(void *data) return ECORE_CALLBACK_RENEW; } +/* FIXME: bug here. If the user hits 'abort print' button, an abort is sent to the backend. This timer however + * still keeps going and requests the backend status afterwards. Because of this, the status change gets + * triggered in the menu state machine and if we're not idle, we jump to a progress screen. + * The issue seems minor however, but might not be. Slicing may take longer then 10 seconds and thus + * slicing can quickly be aborted, however we are then in the 'cooling' state, thus popping up the cooling + * window. + */ +static Eina_Bool _timer_print_unblock_cb(void *data) +{ + static uint_fast8_t timeout = 10; /* TODO, make it a configurable maybe in eulogium_data */ + struct eulogium_data *eulogium = data; + + timeout--; + elm_progressbar_value_set(eulogium->progress, timeout / 100.0); + if (timeout > 0) { + return ECORE_CALLBACK_RENEW; + } else { + eulogium->print.block_active = EINA_FALSE; + eulogium->print.block = EINA_FALSE; + /* XXX: Cleanup eulogium structures? Right now they get overwritten. */ + timeout = 10; /* TODO, use same configurable as above */ + eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getStatus", _on_get_status_ret, eulogium, -1, ""); + eulogium->progress_data_refresh = NULL; + return ECORE_CALLBACK_CANCEL; + } +} + +Evas_Object *eulogium_print_ignore(struct eulogium_data *eulogium) +{ + Evas_Object *_top, *_bottom; + + eulogium->progress_data_refresh = ecore_timer_add(1.0, _timer_print_unblock_cb, eulogium); + if (!eulogium->progress_data_refresh) { /* TODO: define here is probably nicer */ + EINA_LOG_CRIT("Unable to create progress update timer"); + return NULL; + } + + _top = elm_box_add(eulogium->navi); + evas_object_size_hint_weight_set(_top, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(_top, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_homogeneous_set(_top, EINA_FALSE); + evas_object_show(_top); + + eulogium->time = elm_label_add(_top); + elm_object_text_set(eulogium->time, _("Receiving print file
10 seconds to
ignore this job.")); + elm_label_slide_mode_set(eulogium->time, ELM_LABEL_SLIDE_MODE_NONE); + evas_object_size_hint_align_set(eulogium->time, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(eulogium->time); + elm_box_pack_end(_top, eulogium->time); + + eulogium->progress = elm_progressbar_add(_top); /* TODO: depending on i18n sig, change inverted */ + elm_progressbar_horizontal_set(eulogium->progress, EINA_TRUE); + elm_progressbar_pulse_set(eulogium->progress, EINA_FALSE); + elm_progressbar_pulse(eulogium->progress, EINA_FALSE); + elm_progressbar_value_set(eulogium->progress, 10 / 100.0); /* TODO, use timeout from above as define/configurabe */ + elm_progressbar_unit_format_set(eulogium->progress, "%1.0f"); /* Remove text alltogether? */ + evas_object_size_hint_align_set(eulogium->progress, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(eulogium->progress); + elm_box_pack_end(_top, eulogium->progress); + + _bottom = elm_button_add(eulogium->navi); + evas_object_size_hint_align_set(_bottom, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(_bottom, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(_bottom, "clicked", but_print_ignore.cb.func, but_print_ignore.cb.data); + elm_object_text_set(_bottom, _(but_print_ignore.text)); + evas_object_show(_bottom); + + return eulogium_split_screen(eulogium->navi, _top, _bottom); +} + Evas_Object *eulogium_print_progress(struct eulogium_data *eulogium) { Evas_Object *_top, *_bottom; @@ -1853,6 +2001,7 @@ Evas_Object *eulogium_generic_error(struct eulogium_data *eulogium, uint8_t eulo static void _on_start_print_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { + struct eulogium_data *eulogium = data; const char *errname, *errmsg; Eina_Bool print_started = EINA_FALSE; @@ -1864,10 +2013,12 @@ static void _on_start_print_ret(void *data EINA_UNUSED, const Eldbus_Message *ms EINA_LOG_ERR("Failed to start print."); return; } - if (print_started == EINA_TRUE) + if (print_started == EINA_TRUE) { EINA_LOG_INFO("Print has been successfully started"); - else + eulogium->print.block = EINA_FALSE; + } else { EINA_LOG_ERR("Unable to start print"); + } } static void _on_cleared_printer_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) @@ -2506,11 +2657,14 @@ static void eulogium_setup(struct eulogium_data *eulogium) eulogium->printer.status = DISCONNECTED; eulogium->printer.file_handlers = NULL; eulogium->footer = NULL; + eulogium->print.block = EINA_TRUE; + eulogium->print.block_active = EINA_FALSE; eulogium_button_cb_data_set(&but_return, eulogium); eulogium_button_cb_data_set(&but_print_abort_confirm, eulogium); eulogium_button_cb_data_set(&but_print_abort, eulogium); eulogium_button_cb_data_set(&but_print_progress_tune, eulogium); eulogium_button_cb_data_set(&but_main_print, eulogium); + eulogium_button_cb_data_set(&but_print_ignore, eulogium); eulogium_button_cb_data_set(&but_print_local, eulogium); eulogium_button_cb_data_set(&but_print_usb, eulogium); eulogium_button_cb_data_set(&but_main_mathot, eulogium); @@ -2573,11 +2727,6 @@ static void _on_get_print_name_ret(void *data, const Eldbus_Message *msg, Eldbus /* TODO Call generic error screen in case of trouble here? */ } -struct _status_msg { - enum printer_status i; - char *s; -}; - static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _status_msg *status) { Evas_Object *content = NULL; @@ -2609,7 +2758,15 @@ static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _ (eulogium->printer.status == PRINTING) || (eulogium->printer.status == COOLING))) { eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getPrintName", _on_get_print_name_ret, eulogium, -1, ""); - content = eulogium_print_progress(eulogium); + /* For griffin-0.1 this is technically a 'race' condition, as we may not have the name yet */ + if (!eulogium->print.block_active) { + if (eulogium->print.block) { + eulogium->print.block_active = EINA_TRUE; + content = eulogium_print_ignore(eulogium); + } else { + content = eulogium_print_progress(eulogium); + } + } } break; case (WAIT_FOR_REMOVAL): @@ -2624,6 +2781,7 @@ static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _ content = eulogium_generic_error(eulogium, 4); break; case (IDLE): + /* XXX BUG, when we abort a print, we may not want to pop to the IDLE screen!! */ /* 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? */ eulogium_print_data_clear(eulogium); item = elm_naviframe_bottom_item_get(eulogium->navi); @@ -2640,7 +2798,8 @@ static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _ //elm_naviframe_item_push(eulogium->navi, NULL, NULL, NULL, content, NULL); /* TODO: When status is printing for example, or waiting_for_Removal, pop to those screens immediatly? */ - eulogium->printer.status = status->i; + if (!eulogium->print.block_active) + eulogium->printer.status = status->i; } } @@ -2678,58 +2837,6 @@ static void _on_get_file_handlers_ret(void *data, const Eldbus_Message *msg, Eld eulogium->printer.file_handlers = file_handlers; } -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; - char *state; - struct _status_msg status; - - if (eldbus_message_error_get(msg, &errname, &errmsg)) { - EINA_LOG_ERR("%s %s", errname, errmsg); - 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, "FIRST_RUN_WIZZARD", 17)) { - status.i = FIRST_RUN_WIZZARD; - status.s = griffin_print_status[FIRST_RUN_WIZZARD]; - } else if (!strncmp(state, "IDLE", 4)) { - status.i = IDLE; - status.s = griffin_print_status[IDLE]; - } else if (!strncmp(state, "SLICING", 7)) { - status.i = SLICING; - status.s = griffin_print_status[SLICING]; - } else if (!strncmp(state, "HEATING", 7)) { - status.i = HEATING; - status.s = griffin_print_status[HEATING]; - } else if (!strncmp(state, "PRINTING", 8)) { - status.i = PRINTING; - status.s = griffin_print_status[PRINTING]; - } else if (!strncmp(state, "COOLING", 7)) { - status.i = COOLING; - status.s = griffin_print_status[COOLING]; - } 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, "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); -- cgit v0.12