summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlliver Schinagl <o.schinagl@ultimaker.com>2015-06-11 12:38:20 (GMT)
committerOlliver Schinagl <o.schinagl@ultimaker.com>2015-06-12 05:30:16 (GMT)
commita8b06d4aa0db681c7691651daaf289dc9701a485 (patch)
tree41d892f194ab890a9e5a7aa92591cdf4ce4f219a
parent045aca52d80834c38384d1562b36a62e62c82c2e (diff)
downloadeulogium-a8b06d4aa0db681c7691651daaf289dc9701a485.zip
eulogium-a8b06d4aa0db681c7691651daaf289dc9701a485.tar.gz
eulogium-a8b06d4aa0db681c7691651daaf289dc9701a485.tar.bz2
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 <o.schinagl@ultimaker.com>
-rw-r--r--src/eulogium.c231
1 files 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<br>10 seconds to<br>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);