esp32/machine_wdt: Add timeout arg to select interval, make WDT panic.

The machine.WDT() now accepts the "timeout" keyword argument to select the
WDT interval.  And the WDT is changed to panic mode which means it will
reset the device if the interval expires (instead of just printing an error
message).
pull/1/head
Krono 2018-07-06 12:06:11 +02:00 committed by Damien George
parent 8031b7a25c
commit fbd4e61e57
1 changed files with 24 additions and 11 deletions

View File

@ -41,21 +41,34 @@ typedef struct _machine_wdt_obj_t {
STATIC machine_wdt_obj_t wdt_default = {{&machine_wdt_type}};
STATIC mp_obj_t machine_wdt_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false);
STATIC mp_obj_t machine_wdt_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
enum { ARG_id, ARG_timeout };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_id, MP_ARG_INT, {.u_int = 0} },
{ MP_QSTR_timeout, MP_ARG_INT, {.u_int = 5000} }
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
mp_int_t id = 0;
if (n_args > 0) {
id = mp_obj_get_int(args[0]);
if (args[ARG_id].u_int != 0) {
mp_raise_ValueError(NULL);
}
switch (id) {
case 0:
esp_task_wdt_add(NULL);
return &wdt_default;
default:
mp_raise_ValueError(NULL);
// Convert milliseconds to seconds (esp_task_wdt_init needs seconds)
args[ARG_timeout].u_int /= 1000;
if (args[ARG_timeout].u_int <= 0) {
mp_raise_ValueError("WDT timeout too short");
}
mp_int_t rs_code = esp_task_wdt_init(args[ARG_timeout].u_int, true);
if (rs_code != ESP_OK) {
mp_raise_OSError(rs_code);
}
esp_task_wdt_add(NULL);
return &wdt_default;
}
STATIC mp_obj_t machine_wdt_feed(mp_obj_t self_in) {