Skip to content

ESP32: New feature: EspError exception #6638

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed

Conversation

IhorNehrutsa
Copy link
Contributor

@IhorNehrutsa IhorNehrutsa commented Nov 20, 2020

EspError exception handles native ESP-IDF error codes.
It designed to use in ESP32 port C code to catch ESP-IDF functions error codes like

// Example how to raise ESP exception from C code

#include "esp_error.h"

ESP_EXCEPTIONS(pcnt_event_disable(self->unit, evt_type))

// is equivalent to

esp_err_t err = pcnt_event_disable(self->unit, evt_type);
if (err != ESP_OK)
    mp_raise_EspError(err);

See Error Codes and Helper Functions
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/esp_err.html

Wrapped around
https://github.com/espressif/esp-idf/blob/master/components/esp_common/include/esp_err.h

Test is

#print('dir(EspError) =', dir(EspError))
print('1. help(EspError) =', help(EspError))
print('')
print('2. EspError.ESP_ERR_INVALID_ARG =', EspError.ESP_ERR_INVALID_ARG)
print('')
print('3. EspError.err_to_name(EspError(), EspError.ESP_FAIL) =', EspError.err_to_name(EspError(), EspError.ESP_FAIL))
print('')
print('4. EspError.err_to_name(e, 0x1205) =', EspError.err_to_name(EspError(), 0x1205))
print('')

#raise EspError()
#raise EspError(EspError.ESP_ERR_INVALID_SIZE)
#raise EspError(EspError.ESP_ERR_INVALID_ARG, '0x%X - ESP_ERR_INVALID_ARG' % EspError.ESP_ERR_INVALID_ARG)

try:
    raise EspError(EspError.ESP_ERR_INVALID_RESPONSE)

except EspError as e:
    print('5. EspError.err_to_name(e, e.args[0])=', EspError.err_to_name(e, e.args[0]))

output is

>>> %Run -c $EDITOR_CONTENT -f esp_err
object <class 'EspError'> is of type type
  ESP_ERR_INVALID_ARG -- 258
  ESP_ERR_INVALID_CRC -- 265
  ESP_ERR_INVALID_MAC -- 267
  ESP_ERR_INVALID_RESPONSE -- 264
  ESP_ERR_INVALID_SIZE -- 260
  ESP_ERR_INVALID_STATE -- 259
  ESP_ERR_INVALID_VERSION -- 266
  ESP_ERR_MESH_BASE -- 16384
  ESP_ERR_NOT_FOUND -- 261
  ESP_ERR_NOT_SUPPORTED -- 262
  ESP_ERR_NO_MEM -- 257
  ESP_ERR_TIMEOUT -- 263
  ESP_ERR_WIFI_BASE -- 12288
  ESP_FAIL -- -1
  ESP_OK -- 0
  err_to_name -- <function>
1. help(EspError) = None

2. EspError.ESP_ERR_INVALID_ARG = 258

3. EspError.err_to_name(EspError(), EspError.ESP_FAIL) = ESP_FAIL

4. EspError.err_to_name(e, 0x1205) = ESP_ERR_ULP_BRANCH_OUT_OF_RANGE

5. EspError.err_to_name(e, e.args[0])= ESP_ERR_INVALID_RESPONSE
>>> 

This PR overwrite the first part of PR #6626

Comment on lines +103 to +117
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_INVALID_ARG), MP_ROM_INT(ESP_ERR_INVALID_ARG) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_INVALID_CRC), MP_ROM_INT(ESP_ERR_INVALID_CRC) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_INVALID_MAC), MP_ROM_INT(ESP_ERR_INVALID_MAC) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_INVALID_RESPONSE), MP_ROM_INT(ESP_ERR_INVALID_RESPONSE) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_INVALID_SIZE), MP_ROM_INT(ESP_ERR_INVALID_SIZE) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_INVALID_STATE), MP_ROM_INT(ESP_ERR_INVALID_STATE) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_INVALID_VERSION), MP_ROM_INT(ESP_ERR_INVALID_VERSION) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_MESH_BASE), MP_ROM_INT(ESP_ERR_MESH_BASE) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_NOT_FOUND), MP_ROM_INT(ESP_ERR_NOT_FOUND) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_NOT_SUPPORTED), MP_ROM_INT(ESP_ERR_NOT_SUPPORTED) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_NO_MEM), MP_ROM_INT(ESP_ERR_NO_MEM) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_TIMEOUT), MP_ROM_INT(ESP_ERR_TIMEOUT) },
{ MP_ROM_QSTR(MP_QSTR_ESP_ERR_WIFI_BASE), MP_ROM_INT(ESP_ERR_WIFI_BASE) },
{ MP_ROM_QSTR(MP_QSTR_ESP_FAIL), MP_ROM_INT(ESP_FAIL) },
{ MP_ROM_QSTR(MP_QSTR_ESP_OK), MP_ROM_INT(ESP_OK) },
Copy link
Contributor Author

@IhorNehrutsa IhorNehrutsa Nov 20, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if all(or part) ESP-IDF codes should be pulled(Q-stringed) as constants into MicroPython.
The complete list is very long and not in the "micro" paradigm.

Error Codes Reference
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/error-codes.html

@dpgeorge
Copy link
Member

Thanks for the contribution, but I don't think this is the right approach. Mainly because it diverges from the standard approach of using OSError which is portable and works across all ports/systems that run MicroPython. If esp32 has custom errors then it makes it a lot harder to write code that runs on esp32 and other systems.

@IhorNehrutsa IhorNehrutsa deleted the feature/esp_error branch December 29, 2021 11:41
tannewt added a commit to tannewt/circuitpython that referenced this pull request Jul 25, 2022
Refine web workflow access control and http responses
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants