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