Skip to content

Commit 3608705

Browse files
committed
components/M5Unified: Unable to execute button callback.
When running slightly complex code and setting a button callback, there is a high probability that a callback call exception will occur. Signed-off-by: lbuque <[email protected]>
1 parent fc3c6a0 commit 3608705

File tree

3 files changed

+69
-25
lines changed

3 files changed

+69
-25
lines changed

m5stack/components/M5Unified/mpy_m5btn.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,23 +78,23 @@ namespace m5
7878
{
7979
case BTN_TYPE_WAS_CLICKED:
8080
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasClicked = 1;
81-
((btn_obj_t *)pos_args[0])->callbacks.wasClicked_cb = args[ARG_cb].u_obj;
81+
*((btn_obj_t *)pos_args[0])->callbacks.wasClicked_cb = args[ARG_cb].u_obj;
8282
break;
8383
case BTN_TYPE_WAS_DOUBLECLICKED:
8484
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasDoubleClicked = 1;
85-
((btn_obj_t *)pos_args[0])->callbacks.wasDoubleClicked_cb = args[ARG_cb].u_obj;
85+
*((btn_obj_t *)pos_args[0])->callbacks.wasDoubleClicked_cb = args[ARG_cb].u_obj;
8686
break;
8787
case BTN_TYPE_WAS_HOLD:
8888
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasHold = 1;
89-
((btn_obj_t *)pos_args[0])->callbacks.wasHold_cb = args[ARG_cb].u_obj;
89+
*((btn_obj_t *)pos_args[0])->callbacks.wasHold_cb = args[ARG_cb].u_obj;
9090
break;
9191
case BTN_TYPE_WAS_PRESSED:
9292
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasPressed = 1;
93-
((btn_obj_t *)pos_args[0])->callbacks.wasPressed_cb = args[ARG_cb].u_obj;
93+
*((btn_obj_t *)pos_args[0])->callbacks.wasPressed_cb = args[ARG_cb].u_obj;
9494
break;
9595
case BTN_TYPE_WAS_RELEASED:
9696
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasReleased = 1;
97-
((btn_obj_t *)pos_args[0])->callbacks.wasReleased_cb = args[ARG_cb].u_obj;
97+
*((btn_obj_t *)pos_args[0])->callbacks.wasReleased_cb = args[ARG_cb].u_obj;
9898
break;
9999
default:
100100
break;
@@ -115,23 +115,23 @@ namespace m5
115115
{
116116
case BTN_TYPE_WAS_CLICKED:
117117
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasClicked = 0;
118-
((btn_obj_t *)pos_args[0])->callbacks.wasClicked_cb = NULL;
118+
*((btn_obj_t *)pos_args[0])->callbacks.wasClicked_cb = NULL;
119119
break;
120120
case BTN_TYPE_WAS_DOUBLECLICKED:
121121
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasDoubleClicked = 0;
122-
((btn_obj_t *)pos_args[0])->callbacks.wasDoubleClicked_cb = NULL;
122+
*((btn_obj_t *)pos_args[0])->callbacks.wasDoubleClicked_cb = NULL;
123123
break;
124124
case BTN_TYPE_WAS_HOLD:
125125
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasHold = 0;
126-
((btn_obj_t *)pos_args[0])->callbacks.wasHold_cb = NULL;
126+
*((btn_obj_t *)pos_args[0])->callbacks.wasHold_cb = NULL;
127127
break;
128128
case BTN_TYPE_WAS_PRESSED:
129129
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasPressed = 0;
130-
((btn_obj_t *)pos_args[0])->callbacks.wasPressed_cb = NULL;
130+
*((btn_obj_t *)pos_args[0])->callbacks.wasPressed_cb = NULL;
131131
break;
132132
case BTN_TYPE_WAS_RELEASED:
133133
((btn_obj_t *)pos_args[0])->callbacks.flag_bit.wasReleased = 0;
134-
((btn_obj_t *)pos_args[0])->callbacks.wasReleased_cb = NULL;
134+
*((btn_obj_t *)pos_args[0])->callbacks.wasReleased_cb = NULL;
135135
break;
136136
default:
137137
break;

m5stack/components/M5Unified/mpy_m5btn.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ typedef struct _btn_callback_t {
2626
} flag_bit;
2727
uint8_t flag;
2828
};
29-
mp_obj_t wasClicked_cb; // flag bit[1]
30-
mp_obj_t wasDoubleClicked_cb; // flag bit[3]
31-
mp_obj_t wasHold_cb; // flag bit[4]
32-
mp_obj_t wasPressed_cb; // flag bit[5]
33-
mp_obj_t wasReleased_cb; // flag bit[6]
29+
mp_obj_t *wasClicked_cb; // flag bit[1]
30+
mp_obj_t *wasDoubleClicked_cb; // flag bit[3]
31+
mp_obj_t *wasHold_cb; // flag bit[4]
32+
mp_obj_t *wasPressed_cb; // flag bit[5]
33+
mp_obj_t *wasReleased_cb; // flag bit[6]
3434
} btn_callback_t;
3535

3636
typedef struct _btn_obj_t {

m5stack/components/M5Unified/mpy_m5unified.cpp

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ const spk_obj_t m5_speaker = {&mp_spk_type, &(M5.Speaker)};
3434
const pwr_obj_t m5_power = {&mp_power_type, &(M5.Power) };
3535
const pwr_obj_t m5_imu = {&mp_imu_type, &(M5.Imu) };
3636
als_obj_t m5_als = {&mp_als_type, &(M5.Als) };
37-
btn_obj_t m5_btnA = {&mp_btn_type, &(M5.BtnA) };
38-
btn_obj_t m5_btnB = {&mp_btn_type, &(M5.BtnB) };
39-
btn_obj_t m5_btnC = {&mp_btn_type, &(M5.BtnC) };
40-
btn_obj_t m5_btnPWR = {&mp_btn_type, &(M5.BtnPWR) };
41-
btn_obj_t m5_btnEXT = {&mp_btn_type, &(M5.BtnEXT) };
37+
btn_obj_t m5_btnA = {&mp_btn_type, &(M5.BtnA), {0}};
38+
btn_obj_t m5_btnB = {&mp_btn_type, &(M5.BtnB), {0}};
39+
btn_obj_t m5_btnC = {&mp_btn_type, &(M5.BtnC), {0}};
40+
btn_obj_t m5_btnPWR = {&mp_btn_type, &(M5.BtnPWR), {0}};
41+
btn_obj_t m5_btnEXT = {&mp_btn_type, &(M5.BtnEXT), {0}};
4242
gfx_obj_t m5_display = {&mp_gfxdevice_type, &(M5.Display)};
4343
touch_obj_t m5_touch = {&mp_touch_type, &(M5.Touch) };
4444
const mic_obj_t m5_mic = {&mp_mic_type, &(M5.Mic) };
@@ -62,6 +62,44 @@ mp_obj_t m5_begin(void) {
6262
// set default font to DejaVu9, keep same style with UIFlow website UI design.
6363
M5.Display.setTextFont(&fonts::DejaVu9);
6464

65+
{
66+
for (uint8_t i = 0; i < 5; i++) {
67+
MP_STATE_PORT(wasClicked_cb)[i] = mp_const_none;
68+
MP_STATE_PORT(wasDoubleClicked_cb)[i] = mp_const_none;
69+
MP_STATE_PORT(wasHold_cb)[i] = mp_const_none;
70+
MP_STATE_PORT(wasPressed_cb)[i] = mp_const_none;
71+
MP_STATE_PORT(wasReleased_cb)[i] = mp_const_none;
72+
}
73+
m5_btnA.callbacks.wasClicked_cb = &MP_STATE_PORT(wasClicked_cb)[0];
74+
m5_btnA.callbacks.wasDoubleClicked_cb = &MP_STATE_PORT(wasDoubleClicked_cb)[0];
75+
m5_btnA.callbacks.wasHold_cb = &MP_STATE_PORT(wasHold_cb)[0];
76+
m5_btnA.callbacks.wasPressed_cb = &MP_STATE_PORT(wasPressed_cb)[0];
77+
m5_btnA.callbacks.wasReleased_cb = &MP_STATE_PORT(wasReleased_cb)[0];
78+
79+
m5_btnB.callbacks.wasClicked_cb = &MP_STATE_PORT(wasClicked_cb)[1];
80+
m5_btnB.callbacks.wasDoubleClicked_cb = &MP_STATE_PORT(wasDoubleClicked_cb)[1];
81+
m5_btnB.callbacks.wasHold_cb = &MP_STATE_PORT(wasHold_cb)[1];
82+
m5_btnB.callbacks.wasPressed_cb = &MP_STATE_PORT(wasPressed_cb)[1];
83+
m5_btnB.callbacks.wasReleased_cb = &MP_STATE_PORT(wasReleased_cb)[1];
84+
85+
m5_btnC.callbacks.wasClicked_cb = &MP_STATE_PORT(wasClicked_cb)[2];
86+
m5_btnC.callbacks.wasDoubleClicked_cb = &MP_STATE_PORT(wasDoubleClicked_cb)[2];
87+
m5_btnC.callbacks.wasHold_cb = &MP_STATE_PORT(wasHold_cb)[2];
88+
m5_btnC.callbacks.wasPressed_cb = &MP_STATE_PORT(wasPressed_cb)[2];
89+
m5_btnC.callbacks.wasReleased_cb = &MP_STATE_PORT(wasReleased_cb)[2];
90+
91+
m5_btnPWR.callbacks.wasClicked_cb = &MP_STATE_PORT(wasClicked_cb)[3];
92+
m5_btnPWR.callbacks.wasDoubleClicked_cb = &MP_STATE_PORT(wasDoubleClicked_cb)[3];
93+
m5_btnPWR.callbacks.wasHold_cb = &MP_STATE_PORT(wasHold_cb)[3];
94+
m5_btnPWR.callbacks.wasPressed_cb = &MP_STATE_PORT(wasPressed_cb)[3];
95+
m5_btnPWR.callbacks.wasReleased_cb = &MP_STATE_PORT(wasReleased_cb)[3];
96+
97+
m5_btnEXT.callbacks.wasClicked_cb = &MP_STATE_PORT(wasClicked_cb)[4];
98+
m5_btnEXT.callbacks.wasDoubleClicked_cb = &MP_STATE_PORT(wasDoubleClicked_cb)[4];
99+
m5_btnEXT.callbacks.wasHold_cb = &MP_STATE_PORT(wasHold_cb)[4];
100+
m5_btnEXT.callbacks.wasPressed_cb = &MP_STATE_PORT(wasPressed_cb)[4];
101+
m5_btnEXT.callbacks.wasReleased_cb = &MP_STATE_PORT(wasReleased_cb)[4];
102+
}
65103
return mp_const_none;
66104
}
67105

@@ -121,35 +159,35 @@ static void m5_btns_callbacks_check(void) {
121159
if (m5_btn_list[i]->callbacks.flag) {
122160
if (m5_btn_list[i]->callbacks.flag_bit.wasClicked) {
123161
if (((m5::Button_Class *)(m5_btn_list[i]->btn))->wasClicked()) {
124-
mp_sched_schedule(m5_btn_list[i]->callbacks.wasClicked_cb,
162+
mp_sched_schedule(*m5_btn_list[i]->callbacks.wasClicked_cb,
125163
mp_obj_new_int(((m5::Button_Class *)(m5_btn_list[i]->btn))->getState()));
126164
}
127165
}
128166

129167
if (m5_btn_list[i]->callbacks.flag_bit.wasDoubleClicked) {
130168
if (((m5::Button_Class *)(m5_btn_list[i]->btn))->wasDoubleClicked()) {
131-
mp_sched_schedule(m5_btn_list[i]->callbacks.wasDoubleClicked_cb,
169+
mp_sched_schedule(*m5_btn_list[i]->callbacks.wasDoubleClicked_cb,
132170
mp_obj_new_int(((m5::Button_Class *)(m5_btn_list[i]->btn))->getState()));
133171
}
134172
}
135173

136174
if (m5_btn_list[i]->callbacks.flag_bit.wasHold) {
137175
if (((m5::Button_Class *)(m5_btn_list[i]->btn))->wasHold()) {
138-
mp_sched_schedule(m5_btn_list[i]->callbacks.wasHold_cb,
176+
mp_sched_schedule(*m5_btn_list[i]->callbacks.wasHold_cb,
139177
mp_obj_new_int(((m5::Button_Class *)(m5_btn_list[i]->btn))->getState()));
140178
}
141179
}
142180

143181
if (m5_btn_list[i]->callbacks.flag_bit.wasPressed) {
144182
if (((m5::Button_Class *)(m5_btn_list[i]->btn))->wasPressed()) {
145-
mp_sched_schedule(m5_btn_list[i]->callbacks.wasPressed_cb,
183+
mp_sched_schedule(*m5_btn_list[i]->callbacks.wasPressed_cb,
146184
mp_obj_new_int(((m5::Button_Class *)(m5_btn_list[i]->btn))->getState()));
147185
}
148186
}
149187

150188
if (m5_btn_list[i]->callbacks.flag_bit.wasReleased) {
151189
if (((m5::Button_Class *)(m5_btn_list[i]->btn))->wasReleased()) {
152-
mp_sched_schedule(m5_btn_list[i]->callbacks.wasReleased_cb,
190+
mp_sched_schedule(*m5_btn_list[i]->callbacks.wasReleased_cb,
153191
mp_obj_new_int(((m5::Button_Class *)(m5_btn_list[i]->btn))->getState()));
154192
}
155193
}
@@ -169,4 +207,10 @@ static void m5_btns_callbacks_deinit(void) {
169207
#if MICROPY_PY_LVGL
170208
#include "mpy_lvgl.txt"
171209
#endif
210+
211+
MP_REGISTER_ROOT_POINTER(mp_obj_t wasClicked_cb[5]);
212+
MP_REGISTER_ROOT_POINTER(mp_obj_t wasDoubleClicked_cb[5]);
213+
MP_REGISTER_ROOT_POINTER(mp_obj_t wasHold_cb[5]);
214+
MP_REGISTER_ROOT_POINTER(mp_obj_t wasPressed_cb[5]);
215+
MP_REGISTER_ROOT_POINTER(mp_obj_t wasReleased_cb[5]);
172216
}

0 commit comments

Comments
 (0)