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