Skip to content

Commit def3aa9

Browse files
authored
Merge pull request #37 from bcmi-labs/reorg-gfx-code
Cleaning up GFX/LVGL code.
2 parents dd56f4f + 04e4a57 commit def3aa9

File tree

2 files changed

+86
-85
lines changed

2 files changed

+86
-85
lines changed

src/Braccio++.cpp

Lines changed: 58 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,43 @@
66

77
#include "mbed.h"
88

9-
void my_print( const char * dsc )
9+
#if LV_USE_LOG
10+
void lvgl_my_print(const char * dsc)
1011
{
11-
Serial.println(dsc);
12+
Serial.println(dsc);
1213
}
14+
#endif /* #if LV_USE_LOG */
15+
16+
extern "C" {
17+
void braccio_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
18+
void braccio_read_keypad(lv_indev_drv_t * indev, lv_indev_data_t * data);
19+
};
1320

1421
using namespace std::chrono_literals;
1522

1623
BraccioClass::BraccioClass()
1724
: serial485{Serial1, 0, 7, 8} /* TX, DE, RE */
1825
, servos{serial485}
1926
, PD_UFP{PD_LOG_LEVEL_VERBOSE}
20-
, expander{TCA6424A_ADDRESS_ADDR_HIGH}
21-
, bl{}
22-
, _display_thd{}
27+
, _expander{TCA6424A_ADDRESS_ADDR_HIGH}
2328
, _is_ping_allowed{true}
2429
, _is_motor_connected{false}
2530
, _motors_connected_mtx{}
2631
, _motors_connected_thd{}
27-
, _customMenu{nullptr}
32+
, _bl{}
2833
, _gfx{}
34+
, _lvgl_disp_drv{}
35+
, _lvgl_indev_drv{}
36+
, _lvgl_disp_buf{}
37+
, _lvgl_draw_buf{}
38+
, _lvgl_p_obj_group{nullptr}
39+
, _lvgl_kb_indev{nullptr}
40+
, _display_thd{}
2941
{
3042

3143
}
3244

33-
bool BraccioClass::begin(voidFuncPtr customMenu)
45+
bool BraccioClass::begin(voidFuncPtr custom_menu)
3446
{
3547
Wire.begin();
3648
Serial.begin(115200);
@@ -57,33 +69,33 @@ bool BraccioClass::begin(voidFuncPtr customMenu)
5769
SPI.begin();
5870

5971
i2c_mutex.lock();
60-
bl.begin();
61-
if (bl.getChipID() != 0xCE) {
72+
_bl.begin();
73+
if (_bl.getChipID() != 0xCE) {
6274
return false;
6375
}
64-
bl.setColor(red);
76+
_bl.setColor(red);
6577

66-
int ret = expander.testConnection();
78+
int ret = _expander.testConnection();
6779

6880
if (ret == false) {
6981
return ret;
7082
}
7183

7284
for (int i = 0; i < 14; i++) {
73-
expander.setPinDirection(i, 0);
85+
_expander.setPinDirection(i, 0);
7486
}
7587

7688
// Set SLEW to low
77-
expander.setPinDirection(21, 0); // P25 = 8 * 2 + 5
78-
expander.writePin(21, 0);
89+
_expander.setPinDirection(21, 0); // P25 = 8 * 2 + 5
90+
_expander.writePin(21, 0);
7991

8092
// Set TERM to HIGH (default)
81-
expander.setPinDirection(19, 0); // P23 = 8 * 2 + 3
82-
expander.writePin(19, 1);
93+
_expander.setPinDirection(19, 0); // P23 = 8 * 2 + 3
94+
_expander.writePin(19, 1);
8395

84-
expander.setPinDirection(18, 0); // P22 = 8 * 2 + 2
85-
expander.writePin(18, 0); // reset LCD
86-
expander.writePin(18, 1); // LCD out of reset
96+
_expander.setPinDirection(18, 0); // P22 = 8 * 2 + 2
97+
_expander.writePin(18, 0); // reset LCD
98+
_expander.writePin(18, 1); // LCD out of reset
8799

88100
/* Set all motor status LEDs to red. */
89101
for (int id = SmartServoClass::MIN_MOTOR_ID; id <= SmartServoClass::MAX_MOTOR_ID; id++) {
@@ -99,25 +111,25 @@ bool BraccioClass::begin(voidFuncPtr customMenu)
99111
pinMode(BTN_ENTER, INPUT_PULLUP);
100112

101113
#if LV_USE_LOG
102-
lv_log_register_print_cb( my_print );
114+
lv_log_register_print_cb(lvgl_my_print);
103115
#endif
104116

105117
lv_init();
106118

107-
lv_disp_draw_buf_init(&disp_buf, buf, NULL, 240 * 240 / 10);
119+
lv_disp_draw_buf_init(&_lvgl_disp_buf, _lvgl_draw_buf, NULL, LVGL_DRAW_BUFFER_SIZE);
108120

109121
/*Initialize the display*/
110-
lv_disp_drv_init(&disp_drv);
111-
disp_drv.hor_res = 240;
112-
disp_drv.ver_res = 240;
113-
disp_drv.flush_cb = braccio_disp_flush;
114-
disp_drv.draw_buf = &disp_buf;
115-
lv_disp_drv_register(&disp_drv);
116-
117-
lv_indev_drv_init(&indev_drv);
118-
indev_drv.type = LV_INDEV_TYPE_KEYPAD;
119-
indev_drv.read_cb = read_keypad;
120-
kb_indev = lv_indev_drv_register(&indev_drv);
122+
lv_disp_drv_init(&_lvgl_disp_drv);
123+
_lvgl_disp_drv.hor_res = 240;
124+
_lvgl_disp_drv.ver_res = 240;
125+
_lvgl_disp_drv.flush_cb = braccio_disp_flush;
126+
_lvgl_disp_drv.draw_buf = &_lvgl_disp_buf;
127+
lv_disp_drv_register(&_lvgl_disp_drv);
128+
129+
lv_indev_drv_init(&_lvgl_indev_drv);
130+
_lvgl_indev_drv.type = LV_INDEV_TYPE_KEYPAD;
131+
_lvgl_indev_drv.read_cb = braccio_read_keypad;
132+
_lvgl_kb_indev = lv_indev_drv_register(&_lvgl_indev_drv);
121133

122134
lv_style_init(&_lv_style);
123135

@@ -126,8 +138,8 @@ bool BraccioClass::begin(voidFuncPtr customMenu)
126138
_gfx.fillScreen(TFT_WHITE);
127139
_gfx.setAddrWindow(0, 0, 240, 240);
128140

129-
p_objGroup = lv_group_create();
130-
lv_group_set_default(p_objGroup);
141+
_lvgl_p_obj_group = lv_group_create();
142+
lv_group_set_default(_lvgl_p_obj_group);
131143

132144
_display_thd.start(mbed::callback(this, &BraccioClass::display_thread_func));
133145

@@ -154,11 +166,10 @@ bool BraccioClass::begin(voidFuncPtr customMenu)
154166
check_power_func();
155167
lv_obj_clean(lv_scr_act());
156168

157-
if (customMenu) {
158-
customMenu();
159-
} else {
160-
defaultMenu();
161-
}
169+
if (custom_menu)
170+
custom_menu();
171+
else
172+
lvgl_defaultMenu();
162173

163174
servos.begin();
164175
servos.setTime(SmartServoClass::BROADCAST, SLOW);
@@ -228,9 +239,10 @@ void BraccioClass::positions(float & a1, float & a2, float & a3, float & a4, flo
228239
a6 = servos.getPosition(6);
229240
}
230241

231-
void BraccioClass::connectJoystickTo(lv_obj_t* obj) {
232-
lv_group_add_obj(p_objGroup, obj);
233-
lv_indev_set_group(kb_indev, p_objGroup);
242+
void BraccioClass::connectJoystickTo(lv_obj_t* obj)
243+
{
244+
lv_group_add_obj(_lvgl_p_obj_group, obj);
245+
lv_indev_set_group(_lvgl_kb_indev, _lvgl_p_obj_group);
234246
}
235247

236248
void BraccioClass::lvgl_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
@@ -282,10 +294,10 @@ void BraccioClass::display_thread_func()
282294
}
283295
}
284296

285-
#include <extra/libs/gif/lv_gif.h>
286-
287297
void BraccioClass::lvgl_splashScreen(unsigned long const duration_ms, std::function<void()> check_power_func)
288298
{
299+
extern const lv_img_dsc_t img_bulb_gif;
300+
289301
LV_IMG_DECLARE(img_bulb_gif);
290302
lv_obj_t* img = lv_gif_create(lv_scr_act());
291303
lv_gif_set_src(img, &img_bulb_gif);
@@ -314,7 +326,7 @@ void BraccioClass::lvgl_pleaseConnectPower()
314326
lv_obj_set_pos(label1, 0, 0);
315327
}
316328

317-
void BraccioClass::defaultMenu()
329+
void BraccioClass::lvgl_defaultMenu()
318330
{
319331
// TODO: create a meaningful default menu
320332
lv_style_set_text_font(&_lv_style, &lv_font_montserrat_32);
@@ -392,7 +404,7 @@ extern "C" void braccio_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, l
392404
}
393405

394406
/* Reading input device (simulated encoder here) */
395-
extern "C" void read_keypad(lv_indev_drv_t * drv, lv_indev_data_t* data)
407+
extern "C" void braccio_read_keypad(lv_indev_drv_t * drv, lv_indev_data_t* data)
396408
{
397409
static uint32_t last_key = 0;
398410

src/Braccio++.h

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,6 @@
1111
#include "lib/TFT_eSPI/TFT_eSPI.h" // Hardware-specific library
1212
#include <lvgl.h>
1313

14-
extern const lv_img_dsc_t img_bulb_gif;
15-
16-
extern "C" {
17-
void braccio_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
18-
void read_keypad(lv_indev_drv_t * indev, lv_indev_data_t * data);
19-
};
20-
2114
enum speed_grade_t {
2215
FAST = 10,
2316
MEDIUM = 100,
@@ -36,7 +29,7 @@ class BraccioClass
3629
BraccioClass();
3730

3831
inline bool begin() { return begin(nullptr); }
39-
bool begin(voidFuncPtr customMenu);
32+
bool begin(voidFuncPtr custom_menu);
4033

4134

4235
void pingOn();
@@ -75,27 +68,15 @@ class BraccioClass
7568
void lvgl_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
7669

7770
protected:
78-
// ioexpander APIs
79-
void digitalWrite(int pin, uint8_t value);
80-
81-
// default display APIs
82-
void lvgl_splashScreen(unsigned long const duration_ms, std::function<void()> check_power_func);
83-
void lvgl_pleaseConnectPower();
84-
void defaultMenu();
8571

86-
void setID(int id) {
87-
servos.setID(id);
88-
}
72+
inline void setID(int const id) { servos.setID(id); }
8973

9074
private:
9175

9276
RS485Class serial485;
9377
SmartServoClass servos;
9478
PD_UFP_log_c PD_UFP;
95-
TCA6424A expander;
96-
Backlight bl;
97-
rtos::Thread _display_thd;
98-
void display_thread_func();
79+
TCA6424A _expander;
9980

10081
bool _is_ping_allowed;
10182
bool _is_motor_connected[SmartServoClass::NUM_MOTORS];
@@ -105,23 +86,31 @@ class BraccioClass
10586
void setMotorConnectionStatus(int const id, bool const is_connected);
10687
void motorConnectedThreadFunc();
10788

108-
voidFuncPtr _customMenu;
10989

110-
const int BTN_LEFT = 3;
111-
const int BTN_RIGHT = 4;
112-
const int BTN_UP = 5;
113-
const int BTN_DOWN = 2;
114-
const int BTN_SEL = A0;
115-
const int BTN_ENTER = A1;
90+
static int constexpr BTN_LEFT = 3;
91+
static int constexpr BTN_RIGHT = 4;
92+
static int constexpr BTN_UP = 5;
93+
static int constexpr BTN_DOWN = 2;
94+
static int constexpr BTN_SEL = A0;
95+
static int constexpr BTN_ENTER = A1;
96+
11697

98+
static size_t constexpr LVGL_DRAW_BUFFER_SIZE = 240 * 240 / 10;
99+
100+
Backlight _bl;
117101
TFT_eSPI _gfx;
118-
lv_disp_drv_t disp_drv;
119-
lv_indev_drv_t indev_drv;
120-
lv_disp_draw_buf_t disp_buf;
121-
lv_color_t buf[240 * 240 / 10];
122-
lv_group_t* p_objGroup;
123-
lv_indev_t *kb_indev;
102+
lv_disp_drv_t _lvgl_disp_drv;
103+
lv_indev_drv_t _lvgl_indev_drv;
104+
lv_disp_draw_buf_t _lvgl_disp_buf;
105+
lv_color_t _lvgl_draw_buf[LVGL_DRAW_BUFFER_SIZE];
106+
lv_group_t * _lvgl_p_obj_group;
107+
lv_indev_t * _lvgl_kb_indev;
124108
lv_style_t _lv_style;
109+
rtos::Thread _display_thd;
110+
void display_thread_func();
111+
void lvgl_splashScreen(unsigned long const duration_ms, std::function<void()> check_power_func);
112+
void lvgl_pleaseConnectPower();
113+
void lvgl_defaultMenu();
125114

126115
#ifdef __MBED__
127116
rtos::EventFlags pd_events;
@@ -140,13 +129,13 @@ class BraccioClass
140129
}
141130

142131
void setGreen(int i) {
143-
expander.writePin(i * 2 - 1, 0);
144-
expander.writePin(i * 2 - 2, 1);
132+
_expander.writePin(i * 2 - 1, 0);
133+
_expander.writePin(i * 2 - 2, 1);
145134
}
146135

147136
void setRed(int i) {
148-
expander.writePin(i * 2 - 1, 1);
149-
expander.writePin(i * 2 - 2, 0);
137+
_expander.writePin(i * 2 - 1, 1);
138+
_expander.writePin(i * 2 - 2, 0);
150139
}
151140

152141
void pd_thread();

0 commit comments

Comments
 (0)