summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIhorNehrutsa <Ihor.Nehrutsa@gmail.com>2023-02-28 23:15:31 +0200
committerDamien George <damien@micropython.org>2023-09-18 11:26:43 +1000
commit00930b213e55f4396c1e255092f09bdb8dd8c16f (patch)
tree2348f607ad26859bd342e3e45e36edb0512805f5
parentb0e03b3e07f4077d1686da0a2dcee3686e4a5f9e (diff)
esp32/mphalport: Add function/line/file info to check_esp_err exception.
Currently, check_esp_err() raises an exception without a location in the source code, eg: Traceback (most recent call last): File "<stdin>", line 8, in <module> OSError: (-258, 'ESP_ERR_INVALID_ARG') This commit allows additional error reporting (function, line and file) to be enabled via detailed exceptions. Change the error reporting config to #define MICROPY_ERROR_REPORTING (MICROPY_ERROR_REPORTING_DETAILED) and then exception messages from IDF errors look like: Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: (-258, "0x0102 ESP_ERR_INVALID_ARG in function 'set_duty_u16' at line 342 in file './machine_pwm.c'") Signed-off-by: Ihor Nehrutsa <IhorNehrutsa@gmail.com>
-rw-r--r--ports/esp32/mphalport.c16
-rw-r--r--ports/esp32/mphalport.h8
2 files changed, 22 insertions, 2 deletions
diff --git a/ports/esp32/mphalport.c b/ports/esp32/mphalport.c
index d7003a143..538b3e405 100644
--- a/ports/esp32/mphalport.c
+++ b/ports/esp32/mphalport.c
@@ -53,7 +53,12 @@ STATIC uint8_t stdin_ringbuf_array[260];
ringbuf_t stdin_ringbuf = {stdin_ringbuf_array, sizeof(stdin_ringbuf_array), 0, 0};
// Check the ESP-IDF error code and raise an OSError if it's not ESP_OK.
-void check_esp_err(esp_err_t code) {
+#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_NORMAL
+void check_esp_err_(esp_err_t code)
+#else
+void check_esp_err_(esp_err_t code, const char *func, const int line, const char *file)
+#endif
+{
if (code != ESP_OK) {
// map esp-idf error code to posix error code
uint32_t pcode = -code;
@@ -75,7 +80,16 @@ void check_esp_err(esp_err_t code) {
return;
}
o_str->base.type = &mp_type_str;
+ #if MICROPY_ERROR_REPORTING > MICROPY_ERROR_REPORTING_NORMAL
+ char err_msg[64];
+ esp_err_to_name_r(code, err_msg, sizeof(err_msg));
+ vstr_t vstr;
+ vstr_init(&vstr, 80);
+ vstr_printf(&vstr, "0x%04X %s in function '%s' at line %d in file '%s'", code, err_msg, func, line, file);
+ o_str->data = (const byte *)vstr_null_terminated_str(&vstr);
+ #else
o_str->data = (const byte *)esp_err_to_name(code); // esp_err_to_name ret's ptr to const str
+ #endif
o_str->len = strlen((char *)o_str->data);
o_str->hash = qstr_compute_hash(o_str->data, o_str->len);
// raise
diff --git a/ports/esp32/mphalport.h b/ports/esp32/mphalport.h
index 566d6609f..5e54c24bf 100644
--- a/ports/esp32/mphalport.h
+++ b/ports/esp32/mphalport.h
@@ -55,7 +55,13 @@ extern TaskHandle_t mp_main_task_handle;
extern ringbuf_t stdin_ringbuf;
// Check the ESP-IDF error code and raise an OSError if it's not ESP_OK.
-void check_esp_err(esp_err_t code);
+#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_NORMAL
+#define check_esp_err(code) check_esp_err_(code)
+void check_esp_err_(esp_err_t code);
+#else
+#define check_esp_err(code) check_esp_err_(code, __FUNCTION__, __LINE__, __FILE__)
+void check_esp_err_(esp_err_t code, const char *func, const int line, const char *file);
+#endif
uint32_t mp_hal_ticks_us(void);
__attribute__((always_inline)) static inline uint32_t mp_hal_ticks_cpu(void) {