1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
5 #include "aos_hal_wdg.h"
6 #include "py/builtin.h"
7 #include "py/mperrno.h"
8 #include "py/obj.h"
9 #include "py/runtime.h"
10 #include "ulog/ulog.h"
11 
12 #define LOG_TAG "DRIVER_WDT"
13 
14 extern const mp_obj_type_t driver_wdt_type;
15 
16 // this is the actual C-structure for our new object
17 typedef struct {
18     // base represents some basic information, like type
19     mp_obj_base_t Base;
20     // a member created by us
21     char *ModuleName;
22     wdg_dev_t wdg_dev;
23 } mp_wdg_obj_t;
24 
wdg_obj_print(const mp_print_t * print,mp_obj_t self_in,mp_print_kind_t kind)25 void wdg_obj_print(const mp_print_t *print, mp_obj_t self_in,
26                    mp_print_kind_t kind)
27 {
28     LOGD(LOG_TAG, "entern %s;\n", __func__);
29     mp_wdg_obj_t *self = MP_OBJ_TO_PTR(self_in);
30     mp_printf(print, "ModuleName(%s)", self->ModuleName);
31 }
32 
wdg_obj_make_new(const mp_obj_type_t * type,size_t n_args,size_t n_kw,const mp_obj_t * args)33 STATIC mp_obj_t wdg_obj_make_new(const mp_obj_type_t *type, size_t n_args,
34                                  size_t n_kw, const mp_obj_t *args)
35 {
36     LOGD(LOG_TAG, "entern  %s;\n", __func__);
37     mp_wdg_obj_t *driver_obj = m_new_obj(mp_wdg_obj_t);
38     if (!driver_obj) {
39         mp_raise_OSError(MP_EINVAL);
40     }
41 
42     driver_obj->Base.type = &driver_wdt_type;
43     driver_obj->ModuleName = "wdt";
44 
45     return MP_OBJ_FROM_PTR(driver_obj);
46 }
47 
obj_open(size_t n_args,const mp_obj_t * args)48 STATIC mp_obj_t obj_open(size_t n_args, const mp_obj_t *args)
49 {
50     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
51     int ret = -1;
52     if (n_args < 1) {
53         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
54              n_args);
55         return mp_const_none;
56     }
57     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
58     mp_wdg_obj_t *driver_obj = (mp_wdg_obj_t *)self;
59     if (driver_obj == NULL) {
60         LOGE(LOG_TAG, "driver_obj is NULL\n");
61         return mp_const_none;
62     }
63     LOGD(LOG_TAG, "%s:out\n", __func__);
64 
65     return mp_const_none;
66 }
67 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(wdg_obj_open, 1, obj_open);
68 
obj_close(size_t n_args,const mp_obj_t * args)69 STATIC mp_obj_t obj_close(size_t n_args, const mp_obj_t *args)
70 {
71     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
72     int ret = -1;
73     if (n_args < 1) {
74         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
75              n_args);
76         return mp_const_none;
77     }
78     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
79     mp_wdg_obj_t *driver_obj = (mp_wdg_obj_t *)self;
80     if (driver_obj == NULL) {
81         LOGE(LOG_TAG, "driver_obj is NULL\n");
82         return mp_const_none;
83     }
84     LOGD(LOG_TAG, "%s:out\n", __func__);
85 
86     return mp_const_none;
87 }
88 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(wdg_obj_close, 1, obj_close);
89 
obj_start(size_t n_args,const mp_obj_t * args)90 STATIC mp_obj_t obj_start(size_t n_args, const mp_obj_t *args)
91 {
92     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
93     int ret = -1;
94     int32_t timeout = 0;
95 
96     if (n_args < 2) {
97         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
98              n_args);
99         return mp_const_none;
100     }
101     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
102     mp_wdg_obj_t *driver_obj = (mp_wdg_obj_t *)self;
103     if (driver_obj == NULL) {
104         LOGE(LOG_TAG, "driver_obj is NULL\n");
105         return mp_const_none;
106     }
107 
108     timeout = (int32_t)mp_obj_get_int(args[1]);
109     wdg_dev_t *handle = (wdg_dev_t *)&(driver_obj->wdg_dev);
110 
111     LOGD(LOG_TAG, "%s:timeout = %d;\n", __func__, timeout);
112     handle->config.timeout = timeout;
113     ret = aos_hal_wdg_init(handle);
114     handle->config.timeout = (ret == 0) ? timeout : 0;
115     LOGD(LOG_TAG, "%s:out\n", __func__);
116 
117     return MP_ROM_INT(ret);
118 }
119 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(wdg_obj_start, 2, obj_start);
120 
obj_stop(size_t n_args,const mp_obj_t * args)121 STATIC mp_obj_t obj_stop(size_t n_args, const mp_obj_t *args)
122 {
123     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
124     int ret = -1;
125     if (n_args < 1) {
126         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
127              n_args);
128         return mp_const_none;
129     }
130     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
131     mp_wdg_obj_t *driver_obj = (mp_wdg_obj_t *)self;
132     if (driver_obj == NULL) {
133         LOGE(LOG_TAG, "driver_obj is NULL\n");
134         return mp_const_none;
135     }
136 
137     wdg_dev_t *handle = (wdg_dev_t *)&(driver_obj->wdg_dev);
138     aos_hal_wdg_reload(handle);
139 
140     LOGD(LOG_TAG, "%s:out\n", __func__);
141 
142     return mp_const_none;
143 }
144 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(wdg_obj_stop, 1, obj_stop);
145 
obj_feed(size_t n_args,const mp_obj_t * args)146 STATIC mp_obj_t obj_feed(size_t n_args, const mp_obj_t *args)
147 {
148     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
149     int ret = -1;
150     if (n_args < 1) {
151         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
152              n_args);
153         return mp_const_none;
154     }
155     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
156     mp_wdg_obj_t *driver_obj = (mp_wdg_obj_t *)self;
157     if (driver_obj == NULL) {
158         LOGE(LOG_TAG, "driver_obj is NULL\n");
159         return mp_const_none;
160     }
161 
162     wdg_dev_t *handle = (wdg_dev_t *)&(driver_obj->wdg_dev);
163     aos_hal_wdg_finalize(handle);
164     handle->config.timeout = 0;
165     LOGD(LOG_TAG, "%s:out\n", __func__);
166 
167     return mp_const_none;
168 }
169 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(wdg_obj_feed, 1, obj_feed);
170 
171 STATIC const mp_rom_map_elem_t wdg_locals_dict_table[] = {
172     { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_WDG) },
173     { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&wdg_obj_open) },
174     { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&wdg_obj_close) },
175     { MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&wdg_obj_start) },
176     { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&wdg_obj_stop) },
177     { MP_ROM_QSTR(MP_QSTR_feed), MP_ROM_PTR(&wdg_obj_feed) },
178 };
179 
180 STATIC MP_DEFINE_CONST_DICT(wdg_locals_dict, wdg_locals_dict_table);
181 
182 const mp_obj_type_t driver_wdt_type = {
183     .base = { &mp_type_type },
184     .name = MP_QSTR_WDT,
185     .print = wdg_obj_print,
186     .make_new = wdg_obj_make_new,
187     .locals_dict = (mp_obj_dict_t *)&wdg_locals_dict,
188 };
189