1 /*
2  * Copyright (C) 2015-2019 Alibaba Group Holding Limited
3  */
4 
5 #define LOG_NDEBUG 0
6 #include <stdint.h>
7 
8 #include "amp_config.h"
9 #include "amp_defines.h"
10 #include "aos_hal_rtc.h"
11 #include "board_mgr.h"
12 #include "be_inl.h"
13 
14 #define MOD_STR "RTC"
15 
16 #define RTC_YEAR "year"
17 #define RTC_MONTH "month"
18 #define RTC_DAY "day"
19 #define RTC_HOUR "hour"
20 #define RTC_MINUTE "minute"
21 #define RTC_SECOND "second"
22 
23 #define RTC_TIME_FORMAT                                                 \
24     "{\"year\":\"%d\",\"month\":\"%d\",\"day\":\"%d\",\"hour\":\"%d\"," \
25     "\"minute\":\"%d\",\"second\":\"%d\"}"
26 
27 static rtc_dev_t rtc_dev;
28 
native_rtc_open(duk_context * ctx)29 static duk_ret_t native_rtc_open(duk_context *ctx)
30 {
31     int ret = aos_hal_rtc_init(&rtc_dev);
32     amp_debug(MOD_STR, "port: %d, format: %d\n", rtc_dev.port, rtc_dev.config.format);
33     if (0 != ret) {
34         amp_error(MOD_STR, "aos_hal_rtc_init fail!\n");
35     }
36     duk_push_int(ctx, ret);
37     return 1;
38 }
39 
native_rtc_close(duk_context * ctx)40 static duk_ret_t native_rtc_close(duk_context *ctx)
41 {
42     int ret = aos_hal_rtc_finalize(&rtc_dev);
43     if (0 != ret) {
44         amp_error(MOD_STR, "aos_hal_rtc_finalize fail!\n");
45     }
46     duk_push_int(ctx, ret);
47     return 1;
48 }
49 
native_rtc_get_time(duk_context * ctx)50 static duk_ret_t native_rtc_get_time(duk_context *ctx)
51 {
52     int8_t ret = -1;
53     rtc_time_t rtcTime;
54 
55     ret = aos_hal_rtc_get_time(&rtc_dev, &rtcTime);
56     if (0 != ret) {
57         amp_error(MOD_STR, "aos_hal_rtc_get_time fail!\n");
58         duk_push_null(ctx);
59     } else {
60         char buf[128] = {0x00};
61         aos_snprintf(buf, sizeof(buf), RTC_TIME_FORMAT, (uint32_t)rtcTime.year, rtcTime.month,
62                  rtcTime.date, rtcTime.hr, rtcTime.min, rtcTime.sec);
63         duk_push_string(ctx, buf);
64         amp_debug(MOD_STR,
65             "year: %d, month: %d, day: %d, hour: %d, minute: %d, second: %d\n",
66             rtcTime.year, rtcTime.month, rtcTime.date, rtcTime.hr, rtcTime.min,
67             rtcTime.sec);
68         duk_json_decode(ctx, -1);
69     }
70     return 1;
71 }
72 
native_rtc_set_time(duk_context * ctx)73 static duk_ret_t native_rtc_set_time(duk_context *ctx)
74 {
75     int8_t ret = -1;
76     rtc_time_t rtcTime;
77 
78     if (!duk_is_object(ctx, 0)) {
79         amp_warn(MOD_STR, "parameter must be object");
80         goto out;
81     }
82 
83     ret = aos_hal_rtc_get_time(&rtc_dev, &rtcTime);
84     if (ret < 0) {
85         amp_error(MOD_STR, "aos_hal_rtc_get_time fail!\n");
86         goto out;
87     }
88 
89     duk_get_prop_string(ctx, 0, RTC_YEAR);
90     if (duk_is_number(ctx, -1)) rtcTime.year = (uint8_t)(duk_get_int(ctx, -1));
91     duk_pop(ctx);
92 
93     duk_get_prop_string(ctx, 0, RTC_MONTH);
94     if (duk_is_number(ctx, -1)) rtcTime.month = duk_get_int(ctx, -1);
95     duk_pop(ctx);
96 
97     duk_get_prop_string(ctx, 0, RTC_DAY);
98     if (duk_is_number(ctx, -1)) rtcTime.date = duk_get_int(ctx, -1);
99     duk_pop(ctx);
100 
101     duk_get_prop_string(ctx, 0, RTC_HOUR);
102     if (duk_is_number(ctx, -1)) rtcTime.hr = duk_get_int(ctx, -1);
103     duk_pop(ctx);
104 
105     duk_get_prop_string(ctx, 0, RTC_MINUTE);
106     if (duk_is_number(ctx, -1)) rtcTime.min = duk_get_int(ctx, -1);
107     duk_pop(ctx);
108 
109     duk_get_prop_string(ctx, 0, RTC_SECOND);
110     if (duk_is_number(ctx, -1)) rtcTime.sec = duk_get_int(ctx, -1);
111     duk_pop(ctx);
112 
113     amp_debug(MOD_STR,
114         "year: %d, month: %d, day: %d, hour: %d, minute: %d, second: %d\n",
115         rtcTime.year, rtcTime.month, rtcTime.date, rtcTime.hr, rtcTime.min,
116         rtcTime.sec);
117     ret = aos_hal_rtc_set_time(&rtc_dev, &rtcTime);
118 out:
119     duk_push_int(ctx, ret);
120     return 1;
121 }
122 
module_rtc_register(void)123 void module_rtc_register(void)
124 {
125     duk_context *ctx = be_get_context();
126 
127     duk_push_object(ctx);
128 
129     AMP_ADD_FUNCTION("open",    native_rtc_open, 0);
130     AMP_ADD_FUNCTION("close",   native_rtc_close, 0);
131     AMP_ADD_FUNCTION("getTime", native_rtc_get_time, 0);
132     AMP_ADD_FUNCTION("setTime", native_rtc_set_time, 1);
133 
134     duk_put_prop_string(ctx, -2, "RTC");
135 }
136