1 /*
2  * Copyright (C) 2015-2019 Alibaba Group Holding Limited
3  */
4 
5 #include <stdint.h>
6 
7 #include "amp_config.h"
8 #include "amp_defines.h"
9 #include "aos_hal_dac.h"
10 #include "board_mgr.h"
11 #include "be_inl.h"
12 
13 #define MOD_STR "DAC"
14 
native_dac_open(duk_context * ctx)15 static duk_ret_t native_dac_open(duk_context *ctx)
16 {
17     int8_t ret = -1;
18     item_handle_t dac_handle;
19     dac_handle.handle     = NULL;
20     dac_dev_t *dac_device = NULL;
21 
22     if (!duk_is_string(ctx, 0)) {
23         amp_warn(MOD_STR, "parameter must be string");
24         goto out;
25     }
26     const char *id = duk_get_string(ctx, 0);
27     ret            = board_attach_item(MODULE_DAC, id, &dac_handle);
28     if (0 != ret) {
29         amp_error(MOD_STR, "board_attach_item fail!\n");
30         goto out;
31     }
32     amp_debug(MOD_STR, "dac handle:%u\n", dac_handle.handle);
33     dac_device = board_get_node_by_handle(MODULE_DAC, &dac_handle);
34     if (NULL == dac_device) {
35         amp_error(MOD_STR, "board_get_node_by_handle fail!\n");
36         goto out;
37     }
38     ret = aos_hal_dac_init(dac_device);
39     if (0 != ret) {
40         amp_error(MOD_STR, "aos_hal_dac_init fail!\n");
41         goto out;
42     }
43     ret = aos_hal_dac_start(dac_device, dac_device->port);
44     if (0 != ret) {
45         amp_error(MOD_STR, "hal_dac_start fail!\n");
46     }
47 out:
48     if (0 != ret) {
49         duk_push_pointer(ctx, NULL);
50         board_disattach_item(MODULE_DAC, &dac_handle);
51     } else {
52         duk_push_pointer(ctx, (void *)dac_handle.handle);
53     }
54     return 1;
55 }
56 
native_dac_setVol(duk_context * ctx)57 static duk_ret_t native_dac_setVol(duk_context *ctx)
58 {
59     int8_t ret       = -1;
60     uint32_t voltage = 0;
61     item_handle_t dac_handle;
62     dac_dev_t *dac_device = NULL;
63 
64     if (!duk_is_pointer(ctx, 0) || !duk_is_number(ctx, 1)) {
65         amp_warn(MOD_STR, "parameter must be handle and number");
66         goto out;
67     }
68     dac_handle.handle = duk_get_pointer(ctx, 0);
69     dac_device        = board_get_node_by_handle(MODULE_DAC, &dac_handle);
70     if (NULL == dac_device) {
71         amp_error(MOD_STR, "board_get_node_by_handle fail!\n");
72         goto out;
73     }
74     voltage = duk_get_int(ctx, 1);
75     ret     = aos_hal_dac_set_value(dac_device, dac_device->port, voltage);
76 out:
77     duk_push_int(ctx, ret);
78     return 1;
79 }
80 
native_dac_getVol(duk_context * ctx)81 static duk_ret_t native_dac_getVol(duk_context *ctx)
82 {
83     int32_t ret = -1;
84     item_handle_t dac_handle;
85     dac_dev_t *dac_device = NULL;
86 
87     if (!duk_is_pointer(ctx, 0)) {
88         amp_warn(MOD_STR, "parameter must be handle");
89         goto out;
90     }
91     dac_handle.handle = duk_get_pointer(ctx, 0);
92     dac_device        = board_get_node_by_handle(MODULE_DAC, &dac_handle);
93     if (NULL == dac_device) {
94         amp_error(MOD_STR, "board_get_node_by_handle fail!\n");
95         goto out;
96     }
97     ret = (int)aos_hal_dac_get_value(dac_device, dac_device->port);
98 out:
99     duk_push_int(ctx, ret);
100     return 1;
101 }
102 
native_dac_close(duk_context * ctx)103 static duk_ret_t native_dac_close(duk_context *ctx)
104 {
105     int8_t ret = -1;
106     item_handle_t dac_handle;
107     dac_dev_t *dac_device = NULL;
108 
109     if (!duk_is_pointer(ctx, 0)) {
110         amp_warn(MOD_STR, "parameter must be handle");
111         goto out;
112     }
113     dac_handle.handle = duk_get_pointer(ctx, 0);
114     dac_device        = board_get_node_by_handle(MODULE_DAC, &dac_handle);
115     if (NULL == dac_device) {
116         amp_error(MOD_STR, "board_get_node_by_handle fail!\n");
117         goto out;
118     }
119     aos_hal_dac_stop(dac_device, dac_device->port);
120     ret = aos_hal_dac_finalize(dac_device);
121     board_disattach_item(MODULE_DAC, &dac_handle);
122 out:
123     duk_push_int(ctx, ret);
124     return 1;
125 }
126 
module_dac_register(void)127 void module_dac_register(void)
128 {
129     duk_context *ctx = be_get_context();
130 
131     duk_push_object(ctx);
132 
133     AMP_ADD_FUNCTION("open",   native_dac_open, 1);
134     AMP_ADD_FUNCTION("getVol", native_dac_getVol, 1);
135     AMP_ADD_FUNCTION("setVol", native_dac_setVol, 2);
136     AMP_ADD_FUNCTION("close",  native_dac_close, 1);
137 
138     duk_put_prop_string(ctx, -2, "DAC");
139 }
140