1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
5 #include "aos_hal_rtc.h"
6 #include "board_mgr.h"
7 #include "py/builtin.h"
8 #include "py/mperrno.h"
9 #include "py/obj.h"
10 #include "py/runtime.h"
11 #include "ulog/ulog.h"
12 
13 #define LOG_TAG "DRIVER_RTC"
14 
15 extern const mp_obj_type_t driver_rtc_type;
16 
17 //#define RTC_JSON_CONFIG_PATH "/data/python/config/rtc.json"
18 #define RTC_JSON_CONFIG_PATH "/sdcard/python/config/rtc.json"
19 
20 #define RTC_TIME_FORMAT                                                 \
21     "{\"year\":\"%d\",\"month\":\"%d\",\"day\":\"%d\",\"hour\":\"%d\"," \
22     "\"minute\":\"%d\",\"second\":\"%d\"}"
23 // this is the actual C-structure for our new object
24 typedef struct {
25     // base represents some basic information, like type
26     mp_obj_base_t Base;
27     // a member created by us
28     char *ModuleName;
29     rtc_dev_t rtc_dev;
30 } mp_rtc_obj_t;
31 
rtc_obj_print(const mp_print_t * print,mp_obj_t self_in,mp_print_kind_t kind)32 void rtc_obj_print(const mp_print_t *print, mp_obj_t self_in,
33                    mp_print_kind_t kind)
34 {
35     LOGD(LOG_TAG, "entern %s;\n", __func__);
36     mp_rtc_obj_t *self = MP_OBJ_TO_PTR(self_in);
37     mp_printf(print, "ModuleName(%s)", self->ModuleName);
38 }
39 
rtc_obj_make_new(const mp_obj_type_t * type,size_t n_args,size_t n_kw,const mp_obj_t * args)40 STATIC mp_obj_t rtc_obj_make_new(const mp_obj_type_t *type, size_t n_args,
41                                  size_t n_kw, const mp_obj_t *args)
42 {
43     LOGD(LOG_TAG, "entern  %s;\n", __func__);
44     mp_rtc_obj_t *driver_obj = m_new_obj(mp_rtc_obj_t);
45     if (!driver_obj) {
46         mp_raise_OSError(MP_EINVAL);
47     }
48 
49     driver_obj->Base.type = &driver_rtc_type;
50     driver_obj->ModuleName = "rtc";
51 
52     return MP_OBJ_FROM_PTR(driver_obj);
53 }
54 
obj_open(size_t n_args,const mp_obj_t * args)55 STATIC mp_obj_t obj_open(size_t n_args, const mp_obj_t *args)
56 {
57     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
58     int ret = -1;
59     void *instance = NULL;
60     if (n_args < 1) {
61         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
62              n_args);
63         return mp_const_none;
64     }
65     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
66     mp_rtc_obj_t *driver_obj = (mp_rtc_obj_t *)self;
67     if (driver_obj == NULL) {
68         LOGE(LOG_TAG, "driver_obj is NULL\n");
69         return mp_const_none;
70     }
71 
72     ret = aos_hal_rtc_init(&(driver_obj->rtc_dev));
73     LOGD(LOG_TAG, "%s:port: %d, format: %d;\n", __func__,
74          driver_obj->rtc_dev.port, driver_obj->rtc_dev.config.format);
75     if (ret != 0) {
76         LOGE(LOG_TAG, "aos_hal_rtc_init fail!");
77     }
78     LOGD(LOG_TAG, "%s:out\n", __func__);
79 
80     return MP_ROM_INT(ret);
81 }
82 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(rtc_obj_open, 1, obj_open);
83 
obj_close(size_t n_args,const mp_obj_t * args)84 STATIC mp_obj_t obj_close(size_t n_args, const mp_obj_t *args)
85 {
86     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
87     int ret = -1;
88     void *instance = NULL;
89     if (n_args < 1) {
90         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
91              n_args);
92         return mp_const_none;
93     }
94     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
95     mp_rtc_obj_t *driver_obj = (mp_rtc_obj_t *)self;
96     if (driver_obj == NULL) {
97         LOGE(LOG_TAG, "driver_obj is NULL\n");
98         return mp_const_none;
99     }
100 
101     ret = aos_hal_rtc_finalize(&(driver_obj->rtc_dev));
102     if (ret != 0) {
103         LOGE(LOG_TAG, "aos_hal_rtc_finalize fail!");
104     }
105     LOGD(LOG_TAG, "%s:out\n", __func__);
106 
107     return MP_ROM_INT(ret);
108 }
109 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(rtc_obj_close, 1, obj_close);
110 
obj_getTime(size_t n_args,const mp_obj_t * args)111 STATIC mp_obj_t obj_getTime(size_t n_args, const mp_obj_t *args)
112 {
113     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
114     int ret = -1;
115     rtc_time_t rtcTime;
116     if (n_args < 1) {
117         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
118              n_args);
119         return mp_const_none;
120     }
121     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
122     mp_rtc_obj_t *driver_obj = (mp_rtc_obj_t *)self;
123     if (driver_obj == NULL) {
124         LOGE(LOG_TAG, "driver_obj is NULL\n");
125         return mp_const_none;
126     }
127 
128     ret = aos_hal_rtc_get_time(&(driver_obj->rtc_dev), &rtcTime);
129     if (ret != 0) {
130         LOGE(LOG_TAG, "aos_hal_rtc_get_time failed\n");
131         return mp_const_none;
132     }
133 
134     LOGD(LOG_TAG, "year = %d; month = %d;data = %d;\n", (uint32_t)rtcTime.year,
135          (uint32_t)rtcTime.month, (uint32_t)rtcTime.date);
136     LOGD(LOG_TAG, "hr = %d; min = %d;sec = %d;\n", (uint32_t)rtcTime.hr,
137          (uint32_t)rtcTime.min, (uint32_t)rtcTime.sec);
138     mp_obj_t dict = mp_obj_new_dict(6);
139     mp_obj_dict_store(MP_OBJ_FROM_PTR(dict), mp_obj_new_str("year", 4),
140                       mp_obj_new_int((uint32_t)rtcTime.year));
141     mp_obj_dict_store(MP_OBJ_FROM_PTR(dict), mp_obj_new_str("month", 5),
142                       mp_obj_new_int((uint32_t)rtcTime.month));
143     mp_obj_dict_store(MP_OBJ_FROM_PTR(dict), mp_obj_new_str("date", 4),
144                       mp_obj_new_int((uint32_t)rtcTime.date));
145     mp_obj_dict_store(MP_OBJ_FROM_PTR(dict), mp_obj_new_str("hr", 2),
146                       mp_obj_new_int((uint32_t)rtcTime.hr));
147     mp_obj_dict_store(MP_OBJ_FROM_PTR(dict), mp_obj_new_str("min", 3),
148                       mp_obj_new_int((uint32_t)rtcTime.min));
149     mp_obj_dict_store(MP_OBJ_FROM_PTR(dict), mp_obj_new_str("sec", 3),
150                       mp_obj_new_int((uint32_t)rtcTime.sec));
151 
152     return dict;
153 }
154 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(rtc_obj_getTime, 1, obj_getTime);
155 
obj_setTime(size_t n_args,const mp_obj_t * args)156 STATIC mp_obj_t obj_setTime(size_t n_args, const mp_obj_t *args)
157 {
158     LOGD(LOG_TAG, "entern  %s; n_args = %d;\n", __func__, n_args);
159     int ret = -1;
160     rtc_time_t rtcTime;
161     if (n_args < 7) {
162         LOGE(LOG_TAG, "%s: args num is illegal :n_args = %d;\n", __func__,
163              n_args);
164         return mp_const_none;
165     }
166     mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(args[0]);
167     mp_rtc_obj_t *driver_obj = (mp_rtc_obj_t *)self;
168     if (driver_obj == NULL) {
169         LOGE(LOG_TAG, "driver_obj is NULL\n");
170         return mp_const_none;
171     }
172 
173     ret = aos_hal_rtc_get_time(&(driver_obj->rtc_dev), &rtcTime);
174     if (ret != 0) {
175         LOGE(LOG_TAG, "aos_hal_rtc_get_time failed\n");
176         return mp_const_none;
177     }
178 
179     rtcTime.year = (uint8_t)mp_obj_get_int(args[1]);
180     rtcTime.month = (uint8_t)mp_obj_get_int(args[2]);
181     rtcTime.date = (uint8_t)mp_obj_get_int(args[3]);
182     rtcTime.hr = (uint8_t)mp_obj_get_int(args[4]);
183     rtcTime.min = (uint8_t)mp_obj_get_int(args[5]);
184     rtcTime.sec = (uint8_t)mp_obj_get_int(args[6]);
185 
186     ret = aos_hal_rtc_set_time(&(driver_obj->rtc_dev), &rtcTime);
187     if (ret != 0) {
188         LOGE(LOG_TAG, "aos_hal_rtc_get_time failed\n");
189     }
190     LOGD(LOG_TAG, "%s:out\n", __func__);
191 
192     return MP_ROM_INT(ret);
193 }
194 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR(rtc_obj_setTime, 7, obj_setTime);
195 
196 STATIC const mp_rom_map_elem_t rtc_locals_dict_table[] = {
197     { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_RTC) },
198     { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&rtc_obj_open) },
199     { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&rtc_obj_close) },
200     { MP_ROM_QSTR(MP_QSTR_getTime), MP_ROM_PTR(&rtc_obj_getTime) },
201     { MP_ROM_QSTR(MP_QSTR_setTime), MP_ROM_PTR(&rtc_obj_setTime) },
202 };
203 
204 STATIC MP_DEFINE_CONST_DICT(rtc_locals_dict, rtc_locals_dict_table);
205 
206 const mp_obj_type_t driver_rtc_type = {
207     .base = { &mp_type_type },
208     .name = MP_QSTR_RTC,
209     .print = rtc_obj_print,
210     .make_new = rtc_obj_make_new,
211     .locals_dict = (mp_obj_dict_t *)&rtc_locals_dict,
212 };
213