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).
@@ -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);
+
+ if (args[ARG_id].u_int != 0) {
+ mp_raise_ValueError(NULL);
+ }
+
+ // Convert milliseconds to seconds (esp_task_wdt_init needs seconds)
+ args[ARG_timeout].u_int /= 1000;
- mp_int_t id = 0;
- if (n_args > 0) {
- id = mp_obj_get_int(args[0]);
+ 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);
}
- switch (id) {
- case 0:
esp_task_wdt_add(NULL);
+
return &wdt_default;
- default:
- mp_raise_ValueError(NULL);
- }
}
STATIC mp_obj_t machine_wdt_feed(mp_obj_t self_in) {
