Commit 83b0e5ea authored by schneider's avatar schneider
Browse files

feat(micropython): Print exceptions to the screen

parent b0e3d24c
Pipeline #5288 passed with stages
in 1 minute and 48 seconds
......@@ -17,6 +17,7 @@
#include "py/mpprint.h"
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
......@@ -86,6 +87,41 @@ void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len)
epic_uart_write_str(str, len);
}
static char exception_lines[2][80];
static bool exception;
static size_t exception_line_index;
static void exception_feed(char c)
{
if (c == '\n') {
exception_lines[1][exception_line_index] = 0;
if (exception_lines[1][0] == ' ') {
memcpy(exception_lines[0],
exception_lines[1],
sizeof(exception_lines[0]));
exception_line_index = 0;
} else {
exception = false;
epic_disp_open();
epic_disp_clear(0);
epic_disp_print_adv(
1, 0, 0, "Exception:", 0xF800, 0x0000
);
epic_disp_print_adv(
1, 0, 12, exception_lines[0], 0xFFFF, 0x0000
);
epic_disp_print_adv(
1, 0, 40, exception_lines[1], 0xF800, 0x0000
);
epic_disp_update();
}
} else {
if (exception_line_index < sizeof(exception_lines[0]) - 1) {
exception_lines[1][exception_line_index++] = c;
}
}
}
/* Send a string, but replace \n with \n\r */
void mp_hal_stdout_tx_strn_cooked(const char *str, size_t len)
{
......@@ -93,6 +129,16 @@ void mp_hal_stdout_tx_strn_cooked(const char *str, size_t len)
* Only print one line at a time. Insert `\r` between lines so
* they are properly displayed on the serial console.
*/
if (strncmp(str, "Traceback (most recent call last):\n", len) == 0) {
exception = true;
exception_line_index = 0;
} else if (exception) {
for (size_t i = 0; i < len; i++) {
exception_feed(str[i]);
}
}
size_t i, last = 0;
for (i = 0; i < len; i++) {
if (str[i] == '\n') {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment