diff options
-rw-r--r-- | client/errcatch.c | 27 | ||||
-rw-r--r-- | client/errcatch.h | 8 | ||||
-rw-r--r-- | client/i18n/en_us.h | 2 | ||||
-rw-r--r-- | client/serial.c | 7 | ||||
-rw-r--r-- | client/setup.c | 4 | ||||
-rw-r--r-- | client/strings.c | 5 | ||||
-rw-r--r-- | client/ui.c | 4 | ||||
-rw-r--r-- | client/ui.h | 9 | ||||
-rw-r--r-- | client/ui_dirc.c | 1 | ||||
-rw-r--r-- | client/ui_errcatch.c | 27 | ||||
-rw-r--r-- | client/ui_start.c | 1 | ||||
-rw-r--r-- | client/ui_tabbar.c | 5 |
12 files changed, 75 insertions, 25 deletions
diff --git a/client/errcatch.c b/client/errcatch.c index 5e39b00..c39544c 100644 --- a/client/errcatch.c +++ b/client/errcatch.c @@ -1,18 +1,15 @@ -#include "../shared/errcatch.h" +#include <stdlib.h> -void w2_errcatch_handle_error(w2_s_error *error) { - // TODO: handle more error types - switch (error->code) { - case W2_E_WARN_UNCAUGHT_ERROR: { - break; - } - default: { - g_w2_error_uncaught = true; -#ifdef W2_SIM - simwarn("Uncaught/unhandled error found with code 0x%02x\n", error->code); -#endif - } - } +#include "errcatch.h" - return; +w2_s_error *g_w2_error_log[W2_ERRCATCH_LOG_SIZE] = {NULL}; +unsigned int g_w2_error_log_index = 0; + +void w2_errcatch_log_error(w2_s_error *error) { + if (g_w2_error_log[g_w2_error_log_index] != NULL) free(g_w2_error_log[g_w2_error_log_index]); + g_w2_error_log[g_w2_error_log_index] = + w2_alloc_error(error->code, error->message_length, error->message); + g_w2_error_log_index = (g_w2_error_log_index + 1) % W2_ERRCATCH_LOG_SIZE; } + +void w2_errcatch_handle_error(w2_s_error *error) { w2_errcatch_log_error(error); } diff --git a/client/errcatch.h b/client/errcatch.h new file mode 100644 index 0000000..71eb56d --- /dev/null +++ b/client/errcatch.h @@ -0,0 +1,8 @@ +#pragma once + +#include "../shared/errcatch.h" + +#define W2_ERRCATCH_LOG_SIZE 256 + +extern w2_s_error *g_w2_error_log[W2_ERRCATCH_LOG_SIZE]; +extern unsigned int g_w2_error_log_index; diff --git a/client/i18n/en_us.h b/client/i18n/en_us.h index ff3ae91..fccfaa3 100644 --- a/client/i18n/en_us.h +++ b/client/i18n/en_us.h @@ -30,7 +30,7 @@ "this application is functionally similar to a BIOS.\n" \ "here's a brief summary of keyboard commands:\n" \ "\n" \ - "<left>/<right>, <h>/<l> switch tabs\n" \ + "<tab> switch to next tab\n" \ "<up>/<down>, <j>/<k> select option\n" \ "<enter>, <i> edit option\n" \ "<home>, <g> scroll to top\n" \ diff --git a/client/serial.c b/client/serial.c index 112fd81..044b636 100644 --- a/client/serial.c +++ b/client/serial.c @@ -3,6 +3,7 @@ #include "../shared/protocol.h" #include "../shared/serial_parse.h" #include "commands.h" +#include "errcatch.h" #include "main.h" #include "serial.h" #include "time.h" @@ -26,7 +27,11 @@ void w2_cmd_ping_rx(w2_s_bin *data) { void w2_cmd_ping_tx(w2_s_bin *data) { w2_send_bin(data); } -void w2_cmd_expt_tx(w2_s_bin *data) {} +void w2_cmd_expt_tx(w2_s_bin *data) { + W2_CAST_BIN(w2_s_cmd_expt_tx, data, cast); + w2_errcatch_throw_msg(cast->error, cast->length, (char *)cast->message); +} + void w2_cmd_mode_tx(w2_s_bin *data) { W2_CAST_BIN(w2_s_cmd_mode_tx, data, cast); g_w2_state.mode = cast->mode; diff --git a/client/setup.c b/client/setup.c index e51965f..41a987d 100644 --- a/client/setup.c +++ b/client/setup.c @@ -10,6 +10,8 @@ #include "strings.h" #include "ui.h" +#include "errcatch.h" + // pointers for endianness check static const uint16_t _test = 1; static const uint8_t *_ptest = (uint8_t *)&_test; @@ -47,6 +49,8 @@ void w2_client_setup(int argc, char **argv) { g_w2_ui_pad_body = newpad(g_w2_ui_height - 5, g_w2_ui_width); scrollok(g_w2_ui_pad_body, true); + w2_errcatch_throw(W2_E_CRIT_COM_UNAVAILABLE); + // check endianness g_w2_endianness = *_ptest; } diff --git a/client/strings.c b/client/strings.c index 5dbb6bd..4dda1c8 100644 --- a/client/strings.c +++ b/client/strings.c @@ -14,8 +14,9 @@ void w2_strings_modes_init() { } void w2_strings_tabs_init() { - g_w2_tab_strings[W2_UI_TAB_START] = W2_UI_TAB_LABEL_START; - g_w2_tab_strings[W2_UI_TAB_DIRC] = W2_UI_TAB_LABEL_DIRC; + g_w2_tab_strings[W2_UI_TAB_START] = W2_UI_TAB_LABEL_START; + g_w2_tab_strings[W2_UI_TAB_ERRCATCH] = W2_UI_TAB_LABEL_ERRCATCH; + g_w2_tab_strings[W2_UI_TAB_DIRC] = W2_UI_TAB_LABEL_DIRC; } void w2_strings_init() { diff --git a/client/ui.c b/client/ui.c index 10e1814..41a392f 100644 --- a/client/ui.c +++ b/client/ui.c @@ -13,6 +13,7 @@ WINDOW *g_w2_ui_win; WINDOW *g_w2_ui_pad_tabbar; WINDOW *g_w2_ui_pad_body; +int g_w2_ui_pad_body_scroll = 0; unsigned int g_w2_ui_width = 0; unsigned int g_w2_ui_height = 0; w2_e_ui_tabs g_w2_ui_current_tab = W2_UI_TAB_START; @@ -43,7 +44,8 @@ void w2_ui_paint() { w2_timer_start(W2_TIMER_UPDATE); } prefresh(g_w2_ui_pad_tabbar, 0, 0, 2, 0, 2, g_w2_ui_width - 1); - prefresh(g_w2_ui_pad_body, 0, 0, 4, 0, g_w2_ui_height - 2, g_w2_ui_width - 1); + prefresh(g_w2_ui_pad_body, W2_MAX(0, g_w2_ui_pad_body_scroll), 0, + 4 - W2_MIN(0, g_w2_ui_pad_body_scroll), 0, g_w2_ui_height - 2, g_w2_ui_width - 1); // wrefresh(g_w2_ui_win); } diff --git a/client/ui.h b/client/ui.h index ccab75d..bc74144 100644 --- a/client/ui.h +++ b/client/ui.h @@ -5,15 +5,17 @@ #define W2_UI_UPDATE_FPS (60) -#define W2_UI_TAB_COUNT 2 +#define W2_UI_TAB_COUNT 3 typedef enum { - W2_UI_TAB_START = 0, - W2_UI_TAB_DIRC = 1, + W2_UI_TAB_START = 0, + W2_UI_TAB_ERRCATCH = 1, + W2_UI_TAB_DIRC = 2, } w2_e_ui_tabs; extern WINDOW *g_w2_ui_win; extern WINDOW *g_w2_ui_pad_tabbar; extern WINDOW *g_w2_ui_pad_body; +extern int g_w2_ui_pad_body_scroll; extern unsigned int g_w2_ui_width; extern unsigned int g_w2_ui_height; extern void (*g_w2_tab_ptrs[W2_UI_TAB_COUNT])(bool first); @@ -37,6 +39,7 @@ void w2_ui_tabbar_init(); void w2_ui_tab_dirc(bool first); void w2_ui_tab_start(bool first); +void w2_ui_tab_errcatch(bool first); void w2_wmvaddstr(WINDOW *win, unsigned int y, unsigned int x, char *str); void w2_wmvaddnstr(WINDOW *win, unsigned int y, unsigned int x, char *str, unsigned int len); diff --git a/client/ui_dirc.c b/client/ui_dirc.c index d394f8d..63adad1 100644 --- a/client/ui_dirc.c +++ b/client/ui_dirc.c @@ -87,6 +87,7 @@ void w2_ui_dirc_paint(int left, int right) { } void w2_ui_tab_dirc(bool first) { + g_w2_ui_pad_body_scroll = 0; if (first) w2_ui_dirc_init(); int ch = 0; unsigned int lb = 0; diff --git a/client/ui_errcatch.c b/client/ui_errcatch.c new file mode 100644 index 0000000..d2c32b2 --- /dev/null +++ b/client/ui_errcatch.c @@ -0,0 +1,27 @@ +#include <stdlib.h> + +#include "errcatch.h" +#include "ui.h" + +char *w2_err_format(w2_s_error *error) { + char *ret_str = malloc(32); + sprintf(ret_str, "hai, 0x%02x", error->code); + return ret_str; +} + +void w2_ui_tab_errcatch(bool first) { + g_w2_ui_pad_body_scroll = 5 - g_w2_ui_height; + unsigned int line = 0; + for (unsigned int x = 0; x < W2_ERRCATCH_LOG_SIZE; x++) { + unsigned int i = (x + g_w2_error_log_index) % W2_ERRCATCH_LOG_SIZE; + if (g_w2_error_log[i] == NULL) continue; + + wmove(g_w2_ui_pad_body, line, 0); + char *err_str = w2_err_format(g_w2_error_log[i]); + waddstr(g_w2_ui_pad_body, err_str); + free(err_str); + + line++; + } + g_w2_ui_pad_body_scroll += line; +} diff --git a/client/ui_start.c b/client/ui_start.c index 7608792..118bc01 100644 --- a/client/ui_start.c +++ b/client/ui_start.c @@ -2,6 +2,7 @@ #include "ui.h" void w2_ui_tab_start(bool first) { + g_w2_ui_pad_body_scroll = 0; refresh(); w2_wmvaddstr(g_w2_ui_pad_body, 0, 0, W2_UI_TAB_START_MESSAGE); } diff --git a/client/ui_tabbar.c b/client/ui_tabbar.c index 9f5707a..91d476f 100644 --- a/client/ui_tabbar.c +++ b/client/ui_tabbar.c @@ -9,8 +9,9 @@ unsigned int g_w2_ui_tabbar_lengths[W2_UI_TAB_COUNT]; void (*g_w2_tab_ptrs[W2_UI_TAB_COUNT])(bool first); void w2_ui_tabbar_init() { - g_w2_tab_ptrs[W2_UI_TAB_START] = &w2_ui_tab_start; - g_w2_tab_ptrs[W2_UI_TAB_DIRC] = &w2_ui_tab_dirc; + g_w2_tab_ptrs[W2_UI_TAB_START] = &w2_ui_tab_start; + g_w2_tab_ptrs[W2_UI_TAB_ERRCATCH] = &w2_ui_tab_errcatch; + g_w2_tab_ptrs[W2_UI_TAB_DIRC] = &w2_ui_tab_dirc; } void w2_ui_switch_tab(w2_e_ui_tabs next_tab) { |