Skip to content

Commit 7918a16

Browse files
committed
feature/m5: Add Mic
Signed-off-by: lbuque <[email protected]>
1 parent e4e1173 commit 7918a16

File tree

9 files changed

+501
-0
lines changed

9 files changed

+501
-0
lines changed

m5stack/cmodules/m5unified/m5unified.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ STATIC const mp_rom_map_elem_t mp_module_m5_globals_table[] = {
8888
{ MP_ROM_QSTR(MP_QSTR_Power), MP_OBJ_FROM_PTR(&m5_power) },
8989
{ MP_ROM_QSTR(MP_QSTR_Imu), MP_OBJ_FROM_PTR(&m5_imu) },
9090
{ MP_ROM_QSTR(MP_QSTR_Als), MP_OBJ_FROM_PTR(&m5_als) },
91+
{ MP_ROM_QSTR(MP_QSTR_Mic), MP_OBJ_FROM_PTR(&m5_mic) },
9192
{ MP_ROM_QSTR(MP_QSTR_Widgets), MP_OBJ_FROM_PTR(&m5_widgets) },
9293

9394
{ MP_ROM_QSTR(MP_QSTR_begin), MP_ROM_PTR(&m5_begin_obj) },

m5stack/cmodules/m5unified/m5unified.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ target_sources(usermod_M5UNIFIED INTERFACE
66
${CMAKE_CURRENT_LIST_DIR}/m5unified_gfx.c
77
${CMAKE_CURRENT_LIST_DIR}/m5unified_imu.c
88
${CMAKE_CURRENT_LIST_DIR}/m5unified_lvgl.c
9+
${CMAKE_CURRENT_LIST_DIR}/m5unified_mic.c
910
${CMAKE_CURRENT_LIST_DIR}/m5unified_power.c
1011
${CMAKE_CURRENT_LIST_DIR}/m5unified_speaker.c
1112
${CMAKE_CURRENT_LIST_DIR}/m5unified_touch.c
1213
${CMAKE_CURRENT_LIST_DIR}/m5unified_widgets.c
1314
${CMAKE_CURRENT_LIST_DIR}/m5unified.c
15+
${CMAKE_CURRENT_LIST_DIR}/mic_config_t.c
1416
)
1517

1618
target_include_directories(usermod_M5UNIFIED INTERFACE
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include "m5unified.h"
2+
3+
MAKE_METHOD_KW(mic, config, 0);
4+
MAKE_METHOD_0(mic, begin);
5+
MAKE_METHOD_0(mic, end);
6+
MAKE_METHOD_0(mic, isRunning);
7+
MAKE_METHOD_0(mic, isEnabled);
8+
MAKE_METHOD_0(mic, isRecording);
9+
MAKE_METHOD_KW(mic, setSampleRate, 1);
10+
MAKE_METHOD_KW(mic, record, 1);
11+
12+
STATIC const mp_rom_map_elem_t mic_member_table[] = {
13+
MAKE_TABLE(mic, config),
14+
MAKE_TABLE(mic, begin),
15+
MAKE_TABLE(mic, end),
16+
MAKE_TABLE(mic, isRunning),
17+
MAKE_TABLE(mic, isEnabled),
18+
MAKE_TABLE(mic, isRecording),
19+
MAKE_TABLE(mic, setSampleRate),
20+
MAKE_TABLE(mic, record),
21+
};
22+
23+
STATIC MP_DEFINE_CONST_DICT(mic_member, mic_member_table);
24+
25+
#ifdef MP_OBJ_TYPE_GET_SLOT
26+
MP_DEFINE_CONST_OBJ_TYPE(
27+
mp_mic_type,
28+
MP_QSTR_MIC,
29+
MP_TYPE_FLAG_NONE,
30+
locals_dict, (mp_obj_dict_t *)&mic_member
31+
);
32+
#else
33+
const mp_obj_type_t mp_mic_type = {
34+
.base = { &mp_type_type },
35+
.name = MP_QSTR_MIC,
36+
.locals_dict = (mp_obj_dict_t *)&mic_member,
37+
};
38+
#endif
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
#include "mic_config_t.h"
2+
3+
/* *FORMAT-OFF* */
4+
5+
STATIC mp_obj_t mic_config_t_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
6+
mp_mic_config_t *self = m_new_obj(mp_mic_config_t);
7+
self->base.type = &mp_mic_config_t_type;
8+
self->pin_data_in = mp_obj_new_int(-1);
9+
self->pin_bck = mp_obj_new_int(-1);
10+
self->pin_mck = mp_obj_new_int(-1);
11+
self->pin_ws = mp_obj_new_int(-1);
12+
self->sample_rate = mp_obj_new_int(16000);
13+
self->stereo = mp_obj_new_bool(false);
14+
self->input_offset = mp_obj_new_int(0);
15+
self->over_sampling = mp_obj_new_int(2);
16+
self->magnification = mp_obj_new_int(16);
17+
self->noise_filter_level = mp_obj_new_int(0);
18+
self->use_adc = mp_obj_new_bool(false);
19+
self->dma_buf_len = mp_obj_new_int(256);
20+
self->dma_buf_count = mp_obj_new_int(3);
21+
self->task_priority = mp_obj_new_int(2);
22+
self->task_pinned_core = mp_obj_new_int(-1);
23+
self->i2s_port = mp_obj_new_int(0);
24+
return MP_OBJ_FROM_PTR(self);
25+
}
26+
27+
STATIC void mic_config_t_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
28+
mp_mic_config_t *self = (mp_mic_config_t *)MP_OBJ_TO_PTR(self_in);
29+
if (dest[0] == MP_OBJ_NULL) {
30+
// Load
31+
if (attr == MP_QSTR_pin_data_in) {
32+
dest[0] = self->pin_data_in;
33+
} else if (attr == MP_QSTR_pin_bck) {
34+
dest[0] = self->pin_bck;
35+
} else if (attr == MP_QSTR_pin_mck) {
36+
dest[0] = self->pin_mck;
37+
} else if (attr == MP_QSTR_pin_ws) {
38+
dest[0] = self->pin_ws;
39+
} else if (attr == MP_QSTR_sample_rate) {
40+
dest[0] = self->sample_rate;
41+
} else if (attr == MP_QSTR_stereo) {
42+
dest[0] = self->stereo;
43+
} else if (attr == MP_QSTR_input_offset) {
44+
dest[0] = self->input_offset;
45+
} else if (attr == MP_QSTR_over_sampling) {
46+
dest[0] = self->over_sampling;
47+
} else if (attr == MP_QSTR_magnification) {
48+
dest[0] = self->magnification;
49+
} else if (attr == MP_QSTR_noise_filter_level) {
50+
dest[0] = self->noise_filter_level;
51+
} else if (attr == MP_QSTR_use_adc) {
52+
dest[0] = self->use_adc;
53+
} else if (attr == MP_QSTR_dma_buf_len) {
54+
dest[0] = self->dma_buf_len;
55+
} else if (attr == MP_QSTR_dma_buf_count) {
56+
dest[0] = self->dma_buf_count;
57+
} else if (attr == MP_QSTR_task_priority) {
58+
dest[0] = self->task_priority;
59+
} else if (attr == MP_QSTR_task_pinned_core) {
60+
dest[0] = self->task_pinned_core;
61+
} else if (attr == MP_QSTR_i2s_port) {
62+
dest[0] = self->i2s_port;
63+
}
64+
} else if (dest[1] != MP_OBJ_NULL) {
65+
// Store
66+
if (attr == MP_QSTR_pin_data_in) {
67+
self->pin_data_in = dest[1];
68+
dest[0] = MP_OBJ_NULL;
69+
} else if (attr == MP_QSTR_pin_bck) {
70+
self->pin_bck = dest[1];
71+
dest[0] = MP_OBJ_NULL;
72+
} else if (attr == MP_QSTR_pin_mck) {
73+
self->pin_mck = dest[1];
74+
dest[0] = MP_OBJ_NULL;
75+
} else if (attr == MP_QSTR_pin_ws) {
76+
self->pin_ws = dest[1];
77+
dest[0] = MP_OBJ_NULL;
78+
} else if (attr == MP_QSTR_sample_rate) {
79+
self->sample_rate = dest[1];
80+
dest[0] = MP_OBJ_NULL;
81+
} else if (attr == MP_QSTR_stereo) {
82+
self->stereo = dest[1];
83+
dest[0] = MP_OBJ_NULL;
84+
} else if (attr == MP_QSTR_input_offset) {
85+
self->input_offset = dest[1];
86+
dest[0] = MP_OBJ_NULL;
87+
} else if (attr == MP_QSTR_over_sampling) {
88+
self->over_sampling = dest[1];
89+
dest[0] = MP_OBJ_NULL;
90+
} else if (attr == MP_QSTR_magnification) {
91+
self->magnification = dest[1];
92+
dest[0] = MP_OBJ_NULL;
93+
} else if (attr == MP_QSTR_noise_filter_level) {
94+
self->noise_filter_level = dest[1];
95+
dest[0] = MP_OBJ_NULL;
96+
} else if (attr == MP_QSTR_use_adc) {
97+
self->use_adc = dest[1];
98+
dest[0] = MP_OBJ_NULL;
99+
} else if (attr == MP_QSTR_dma_buf_len) {
100+
self->dma_buf_len = dest[1];
101+
dest[0] = MP_OBJ_NULL;
102+
} else if (attr == MP_QSTR_dma_buf_count) {
103+
self->dma_buf_count = dest[1];
104+
dest[0] = MP_OBJ_NULL;
105+
} else if (attr == MP_QSTR_task_priority) {
106+
self->task_priority = dest[1];
107+
dest[0] = MP_OBJ_NULL;
108+
} else if (attr == MP_QSTR_task_pinned_core) {
109+
self->task_pinned_core = dest[1];
110+
dest[0] = MP_OBJ_NULL;
111+
} else if (attr == MP_QSTR_i2s_port) {
112+
self->i2s_port = dest[1];
113+
dest[0] = MP_OBJ_NULL;
114+
}
115+
}
116+
}
117+
118+
#ifdef MP_OBJ_TYPE_GET_SLOT
119+
MP_DEFINE_CONST_OBJ_TYPE(
120+
mp_mic_config_t_type,
121+
MP_QSTR_mic_config_t,
122+
MP_TYPE_FLAG_NONE,
123+
make_new, mic_config_t_make_new,
124+
attr, mic_config_t_attr
125+
);
126+
#else
127+
const mp_obj_type_t mp_mic_config_t_type = {
128+
.base = { &mp_type_type },
129+
.name = MP_QSTR_mic_config_t,
130+
.make_new = mic_config_t_make_new,
131+
.attr = mic_config_t_attr,
132+
};
133+
#endif
134+
135+
/* *FORMAT-ON* */
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#pragma once
2+
3+
#include <py/runtime.h>
4+
#include <py/objstr.h>
5+
#include <py/objmodule.h>
6+
7+
typedef struct _mp_mic_config_t {
8+
mp_obj_base_t base;
9+
mp_obj_t pin_data_in;
10+
mp_obj_t pin_bck;
11+
mp_obj_t pin_mck;
12+
mp_obj_t pin_ws;
13+
mp_obj_t sample_rate;
14+
mp_obj_t stereo;
15+
mp_obj_t input_offset;
16+
mp_obj_t over_sampling;
17+
mp_obj_t magnification;
18+
mp_obj_t noise_filter_level;
19+
mp_obj_t use_adc;
20+
mp_obj_t dma_buf_len;
21+
mp_obj_t dma_buf_count;
22+
mp_obj_t task_priority;
23+
mp_obj_t task_pinned_core;
24+
mp_obj_t i2s_port;
25+
} mp_mic_config_t;
26+
27+
extern const mp_obj_type_t mp_mic_config_t_type;

0 commit comments

Comments
 (0)