summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/i18n/en_us.h43
-rw-r--r--client/setup.c2
-rw-r--r--client/strings.c52
-rw-r--r--client/strings.h3
-rw-r--r--client/ui_errcatch.c37
5 files changed, 129 insertions, 8 deletions
diff --git a/client/i18n/en_us.h b/client/i18n/en_us.h
index fccfaa3..47debd7 100644
--- a/client/i18n/en_us.h
+++ b/client/i18n/en_us.h
@@ -9,6 +9,7 @@
#define W2_UI_BATT_STAT_BATTERY "battery"
#define W2_UI_EXPT_STAT_WARNINGS "warning(s)"
#define W2_UI_EXPT_STAT_ERRORS "error(s)"
+
#define W2_UI_MODE_CHRG "charging station"
#define W2_UI_MODE_DIRC "direct control"
#define W2_UI_MODE_GRID "grid"
@@ -17,12 +18,14 @@
#define W2_UI_MODE_MAZE "maze"
#define W2_UI_MODE_SCAL "sensor calibration"
#define W2_UI_MODE_SPIN "wet floor simulation"
+
#define W2_UI_TAB_LABEL_START "info"
#define W2_UI_TAB_LABEL_DIRC "direct control"
#define W2_UI_TAB_LABEL_ERRCATCH "logs"
#define W2_UI_TAB_LABEL_MCFG "map"
#define W2_UI_TAB_LABEL_ORDERS "orders"
#define W2_UI_TAB_LABEL_MODE "set mode"
+
#define W2_UI_TAB_START_MESSAGE "" \
"welcome to the wall-e2 console application!\n" \
"this is client version " W2_BUILD_STR "\n" \
@@ -43,3 +46,43 @@
"<S> logs <M> set mode\n" \
"<d> direct control <m> map\n"
+#define W2_UI_ERROR_SEVERITY_CRIT "CRIT"
+#define W2_UI_ERROR_SEVERITY_WARN "WARN"
+#define W2_UI_ERROR_SEVERITY_INFO "INFO"
+#define W2_UI_ERROR_SEVERITY_VERB "VERB"
+
+#define W2_UI_ERROR_INT_W2_E_UNKNOWN "W2_E_UNKNOWN"
+#define W2_UI_ERROR_INT_W2_E_CRIT_CONN_LOST "W2_E_CRIT_CONN_LOST"
+#define W2_UI_ERROR_INT_W2_E_CRIT_COM_UNAVAILABLE "W2_E_CRIT_COM_UNAVAILABLE"
+#define W2_UI_ERROR_INT_W2_E_CRIT_LINE_LOST "W2_E_CRIT_LINE_LOST"
+#define W2_UI_ERROR_INT_W2_E_CRIT_OBSTACLE_STUCK "W2_E_CRIT_OBSTACLE_STUCK"
+#define W2_UI_ERROR_INT_W2_E_CRIT_VERSION_INCOMPATIBLE "W2_E_CRIT_VERSION_INCOMPATIBLE"
+#define W2_UI_ERROR_INT_W2_E_WARN_BATTERY_LOW "W2_E_WARN_BATTERY_LOW"
+#define W2_UI_ERROR_INT_W2_E_WARN_OBSTACLE_DETECTED "W2_E_WARN_OBSTACLE_DETECTED"
+#define W2_UI_ERROR_INT_W2_E_WARN_CYCLE_EXPIRED "W2_E_WARN_CYCLE_EXPIRED"
+#define W2_UI_ERROR_INT_W2_E_WARN_UNCAUGHT_ERROR "W2_E_WARN_UNCAUGHT_ERROR"
+#define W2_UI_ERROR_INT_W2_E_WARN_ERR_BUFFER_FULL "W2_E_WARN_ERR_BUFFER_FULL"
+#define W2_UI_ERROR_INT_W2_E_WARN_LINE_LOST "W2_E_WARN_LINE_LOST"
+#define W2_UI_ERROR_INT_W2_E_WARN_SERCOMM_BUFFER_FULL "W2_E_WARN_SERCOMM_BUFFER_FULL"
+#define W2_UI_ERROR_INT_W2_E_WARN_VERSION_INCOMPATIBLE "W2_E_WARN_VERSION_INCOMPATIBLE"
+#define W2_UI_ERROR_INT_W2_E_WARN_SERIAL_NOISY "W2_E_WARN_SERIAL_NOISY"
+#define W2_UI_ERROR_INT_W2_E_WARN_MODE_HISTORY_BUFFER_IOB "W2_E_WARN_MODE_HISTORY_BUFFER_IOB"
+#define W2_UI_ERROR_INT_W2_E_WARN_PING_TIMEOUT "W2_E_WARN_PING_TIMEOUT"
+
+#define W2_UI_ERROR_USR_W2_E_UNKNOWN "unknown error code"
+#define W2_UI_ERROR_USR_W2_E_CRIT_CONN_LOST "connection to robot lost"
+#define W2_UI_ERROR_USR_W2_E_CRIT_COM_UNAVAILABLE "COM-port unavailable"
+#define W2_UI_ERROR_USR_W2_E_CRIT_LINE_LOST "line lost and unable to be found automatically"
+#define W2_UI_ERROR_USR_W2_E_CRIT_OBSTACLE_STUCK "obstacle detected, robot stuck"
+#define W2_UI_ERROR_USR_W2_E_CRIT_VERSION_INCOMPATIBLE "major version mismatch detected, please update robot"
+#define W2_UI_ERROR_USR_W2_E_WARN_BATTERY_LOW "battery low, going to charging station"
+#define W2_UI_ERROR_USR_W2_E_WARN_OBSTACLE_DETECTED "obstacle detected, waiting"
+#define W2_UI_ERROR_USR_W2_E_WARN_CYCLE_EXPIRED "maximum logic module cycle time exceeded"
+#define W2_UI_ERROR_USR_W2_E_WARN_UNCAUGHT_ERROR "uncaught error occurred"
+#define W2_UI_ERROR_USR_W2_E_WARN_ERR_BUFFER_FULL "error buffer full"
+#define W2_UI_ERROR_USR_W2_E_WARN_LINE_LOST "line lost, trying to find line automatically"
+#define W2_UI_ERROR_USR_W2_E_WARN_SERCOMM_BUFFER_FULL "serial communication buffer full"
+#define W2_UI_ERROR_USR_W2_E_WARN_VERSION_INCOMPATIBLE "minor version mismatch detected, this might cause problems"
+#define W2_UI_ERROR_USR_W2_E_WARN_SERIAL_NOISY "invalid serial data received (noisy channel / check connection?)"
+#define W2_UI_ERROR_USR_W2_E_WARN_MODE_HISTORY_BUFFER_IOB "mode history buffer index out of bounds"
+#define W2_UI_ERROR_USR_W2_E_WARN_PING_TIMEOUT "ping timed out"
diff --git a/client/setup.c b/client/setup.c
index 41a987d..0f2b0f7 100644
--- a/client/setup.c
+++ b/client/setup.c
@@ -49,8 +49,6 @@ 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 4dda1c8..c89cbbf 100644
--- a/client/strings.c
+++ b/client/strings.c
@@ -1,7 +1,11 @@
+#include "../shared/errcatch.h"
#include "strings.h"
char *g_w2_mode_strings[W2_MODE_COUNT];
char *g_w2_tab_strings[W2_UI_TAB_COUNT];
+char *g_w2_error_type_strings[4];
+char *g_w2_error_internal_strings[0x100];
+char *g_w2_error_user_strings[0x100];
void w2_strings_modes_init() {
g_w2_mode_strings[W2_M_CHRG] = W2_UI_MODE_CHRG;
@@ -19,7 +23,55 @@ void w2_strings_tabs_init() {
g_w2_tab_strings[W2_UI_TAB_DIRC] = W2_UI_TAB_LABEL_DIRC;
}
+void w2_strings_errors_types() {
+ g_w2_error_type_strings[0b00] = W2_UI_ERROR_SEVERITY_CRIT;
+ g_w2_error_type_strings[0b01] = W2_UI_ERROR_SEVERITY_WARN;
+ g_w2_error_type_strings[0b10] = W2_UI_ERROR_SEVERITY_INFO;
+ g_w2_error_type_strings[0b11] = W2_UI_ERROR_SEVERITY_VERB;
+}
+
+void w2_strings_errors_internal() {
+ g_w2_error_internal_strings[W2_E_CRIT_CONN_LOST] = W2_UI_ERROR_INT_W2_E_CRIT_CONN_LOST;
+ g_w2_error_internal_strings[W2_E_CRIT_COM_UNAVAILABLE] = W2_UI_ERROR_INT_W2_E_CRIT_COM_UNAVAILABLE;
+ g_w2_error_internal_strings[W2_E_CRIT_LINE_LOST] = W2_UI_ERROR_INT_W2_E_CRIT_LINE_LOST;
+ g_w2_error_internal_strings[W2_E_CRIT_OBSTACLE_STUCK] = W2_UI_ERROR_INT_W2_E_CRIT_OBSTACLE_STUCK;
+ g_w2_error_internal_strings[W2_E_CRIT_VERSION_INCOMPATIBLE] = W2_UI_ERROR_INT_W2_E_CRIT_VERSION_INCOMPATIBLE;
+ g_w2_error_internal_strings[W2_E_WARN_BATTERY_LOW] = W2_UI_ERROR_INT_W2_E_WARN_BATTERY_LOW;
+ g_w2_error_internal_strings[W2_E_WARN_OBSTACLE_DETECTED] = W2_UI_ERROR_INT_W2_E_WARN_OBSTACLE_DETECTED;
+ g_w2_error_internal_strings[W2_E_WARN_CYCLE_EXPIRED] = W2_UI_ERROR_INT_W2_E_WARN_CYCLE_EXPIRED;
+ g_w2_error_internal_strings[W2_E_WARN_UNCAUGHT_ERROR] = W2_UI_ERROR_INT_W2_E_WARN_UNCAUGHT_ERROR;
+ g_w2_error_internal_strings[W2_E_WARN_ERR_BUFFER_FULL] = W2_UI_ERROR_INT_W2_E_WARN_ERR_BUFFER_FULL;
+ g_w2_error_internal_strings[W2_E_WARN_LINE_LOST] = W2_UI_ERROR_INT_W2_E_WARN_LINE_LOST;
+ g_w2_error_internal_strings[W2_E_WARN_SERCOMM_BUFFER_FULL] = W2_UI_ERROR_INT_W2_E_WARN_SERCOMM_BUFFER_FULL;
+ g_w2_error_internal_strings[W2_E_WARN_VERSION_INCOMPATIBLE] = W2_UI_ERROR_INT_W2_E_WARN_VERSION_INCOMPATIBLE;
+ g_w2_error_internal_strings[W2_E_WARN_SERIAL_NOISY] = W2_UI_ERROR_INT_W2_E_WARN_SERIAL_NOISY;
+ g_w2_error_internal_strings[W2_E_WARN_MODE_HISTORY_BUFFER_IOB] = W2_UI_ERROR_INT_W2_E_WARN_MODE_HISTORY_BUFFER_IOB;
+ g_w2_error_internal_strings[W2_E_WARN_PING_TIMEOUT] = W2_UI_ERROR_INT_W2_E_WARN_PING_TIMEOUT;
+}
+
+void w2_strings_errors_user() {
+ g_w2_error_user_strings[W2_E_CRIT_CONN_LOST] = W2_UI_ERROR_USR_W2_E_CRIT_CONN_LOST;
+ g_w2_error_user_strings[W2_E_CRIT_COM_UNAVAILABLE] = W2_UI_ERROR_USR_W2_E_CRIT_COM_UNAVAILABLE;
+ g_w2_error_user_strings[W2_E_CRIT_LINE_LOST] = W2_UI_ERROR_USR_W2_E_CRIT_LINE_LOST;
+ g_w2_error_user_strings[W2_E_CRIT_OBSTACLE_STUCK] = W2_UI_ERROR_USR_W2_E_CRIT_OBSTACLE_STUCK;
+ g_w2_error_user_strings[W2_E_CRIT_VERSION_INCOMPATIBLE] = W2_UI_ERROR_USR_W2_E_CRIT_VERSION_INCOMPATIBLE;
+ g_w2_error_user_strings[W2_E_WARN_BATTERY_LOW] = W2_UI_ERROR_USR_W2_E_WARN_BATTERY_LOW;
+ g_w2_error_user_strings[W2_E_WARN_OBSTACLE_DETECTED] = W2_UI_ERROR_USR_W2_E_WARN_OBSTACLE_DETECTED;
+ g_w2_error_user_strings[W2_E_WARN_CYCLE_EXPIRED] = W2_UI_ERROR_USR_W2_E_WARN_CYCLE_EXPIRED;
+ g_w2_error_user_strings[W2_E_WARN_UNCAUGHT_ERROR] = W2_UI_ERROR_USR_W2_E_WARN_UNCAUGHT_ERROR;
+ g_w2_error_user_strings[W2_E_WARN_ERR_BUFFER_FULL] = W2_UI_ERROR_USR_W2_E_WARN_ERR_BUFFER_FULL;
+ g_w2_error_user_strings[W2_E_WARN_LINE_LOST] = W2_UI_ERROR_USR_W2_E_WARN_LINE_LOST;
+ g_w2_error_user_strings[W2_E_WARN_SERCOMM_BUFFER_FULL] = W2_UI_ERROR_USR_W2_E_WARN_SERCOMM_BUFFER_FULL;
+ g_w2_error_user_strings[W2_E_WARN_VERSION_INCOMPATIBLE] = W2_UI_ERROR_USR_W2_E_WARN_VERSION_INCOMPATIBLE;
+ g_w2_error_user_strings[W2_E_WARN_SERIAL_NOISY] = W2_UI_ERROR_USR_W2_E_WARN_SERIAL_NOISY;
+ g_w2_error_user_strings[W2_E_WARN_MODE_HISTORY_BUFFER_IOB] = W2_UI_ERROR_USR_W2_E_WARN_MODE_HISTORY_BUFFER_IOB;
+ g_w2_error_user_strings[W2_E_WARN_PING_TIMEOUT] = W2_UI_ERROR_USR_W2_E_WARN_PING_TIMEOUT;
+}
+
void w2_strings_init() {
+ w2_strings_errors_types();
+ w2_strings_errors_internal();
+ w2_strings_errors_user();
w2_strings_modes_init();
w2_strings_tabs_init();
}
diff --git a/client/strings.h b/client/strings.h
index ec1f415..5d20b8e 100644
--- a/client/strings.h
+++ b/client/strings.h
@@ -6,5 +6,8 @@
extern char *g_w2_mode_strings[W2_MODE_COUNT];
extern char *g_w2_tab_strings[W2_UI_TAB_COUNT];
+extern char *g_w2_error_type_strings[4];
+extern char *g_w2_error_internal_strings[0x100];
+extern char *g_w2_error_user_strings[0x100];
void w2_strings_init();
diff --git a/client/ui_errcatch.c b/client/ui_errcatch.c
index d2c32b2..e1fd71b 100644
--- a/client/ui_errcatch.c
+++ b/client/ui_errcatch.c
@@ -1,27 +1,52 @@
#include <stdlib.h>
+#include <string.h>
+#include "i18n.h"
+#include "strings.h"
#include "errcatch.h"
#include "ui.h"
+unsigned int g_w2_errcatch_log_line = 0;
+
+unsigned int w2_newline_count(char* str, unsigned int len) {
+ unsigned int newlines = 0;
+ for (unsigned int i = 0; i < len; i++)
+ if (str[i] == '\n') newlines++;
+ return newlines;
+}
+
char *w2_err_format(w2_s_error *error) {
- char *ret_str = malloc(32);
- sprintf(ret_str, "hai, 0x%02x", error->code);
+ const char* type = g_w2_error_type_strings[error->code >> 6];
+ const char* internal = g_w2_error_internal_strings[error->code];
+ const char* user = g_w2_error_user_strings[error->code];
+ if (internal == NULL || user == NULL) {
+ internal = W2_UI_ERROR_INT_W2_E_UNKNOWN;
+ user = W2_UI_ERROR_USR_W2_E_UNKNOWN;
+ }
+ size_t errdesc_len = strlen(type) + strlen(internal) + strlen(user) + 8;
+ size_t msg_indent = strlen(type) + 3;
+ char *ret_str = malloc(errdesc_len + (error->message_length > 0 ? error->message_length + msg_indent : 0) + 1);
+ sprintf(ret_str, "[%s] %02x#%s: %s", type, error->code, internal, user);
+ if (error->message_length > 0) {
+ sprintf(ret_str + errdesc_len, "\n%*c%s", (int) msg_indent, ' ', error->message);
+ g_w2_errcatch_log_line += 1 + w2_newline_count(error->message, error->message_length);
+ }
return ret_str;
}
void w2_ui_tab_errcatch(bool first) {
+ g_w2_errcatch_log_line = 0;
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);
+ wmove(g_w2_ui_pad_body, g_w2_errcatch_log_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_errcatch_log_line++;
}
- g_w2_ui_pad_body_scroll += line;
+ g_w2_ui_pad_body_scroll += g_w2_errcatch_log_line;
}