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