Skip to content

Commit af666b6

Browse files
committed
Adds rotation to SDL driver
1 parent 1718aa6 commit af666b6

File tree

13 files changed

+501
-450
lines changed

13 files changed

+501
-450
lines changed

api_drivers/common_api_drivers/display/sdl_display/sdl_display.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,10 @@ def __init__(
109109
buffer_size = lv.color_format_get_size(color_space)
110110
buffer_size *= display_width * display_height
111111

112+
self.__buf_size = buffer_size
113+
112114
if frame_buffer1 is None:
113115
frame_buffer1 = data_bus.allocate_framebuffer(buffer_size, 0)
114-
115-
if frame_buffer2 is None:
116-
frame_buffer2 = data_bus.allocate_framebuffer(buffer_size, 0)
117116
else:
118117
if buffer_size != len(frame_buffer1):
119118
raise RuntimeError('frame buffer is not large enough')
@@ -159,7 +158,8 @@ def __init__(
159158
cf,
160159
False,
161160
8,
162-
8
161+
8,
162+
True
163163
)
164164

165165
self._disp_drv.set_flush_cb(self._flush_cb)
@@ -180,6 +180,7 @@ def __init__(
180180

181181
self._disp_drv.add_event_cb(
182182
self._res_chg_event_cb, lv.EVENT.RESOLUTION_CHANGED, None) # NOQA
183+
183184
self._disp_drv.add_event_cb(
184185
self._release_disp_cb, lv.EVENT.DELETE, None) # NOQA
185186

@@ -199,22 +200,26 @@ def _quit_cb(self):
199200
self._disp_drv.delete()
200201

201202
def _res_chg_event_cb(self, _):
203+
self._rotation = self._disp_drv.get_rotation()
202204
bpp = lv.color_format_get_size(self._disp_drv.get_color_format())
203205

204206
hor_res = self._disp_drv.get_horizontal_resolution()
205207
ver_res = self._disp_drv.get_vertical_resolution()
206208

207209
buf_size = int(hor_res * ver_res * bpp)
208210

209-
self._frame_buffer1 = self._data_bus.realloc_buffer(buf_size, 1) # NOQA
210-
self._frame_buffer2 = self._data_bus.realloc_buffer(buf_size, 2) # NOQA
211+
if self.__buf_size != buf_size:
212+
self.__buf_size = buf_size
211213

212-
self._disp_drv.set_buffers(
213-
self._frame_buffer1,
214-
self._frame_buffer2,
215-
len(self._frame_buffer1),
216-
lv.DISPLAY_RENDER_MODE.DIRECT # NOQA
217-
)
214+
self._frame_buffer1 = self._data_bus.realloc_buffer(buf_size, 1) # NOQA
215+
self._frame_buffer2 = self._data_bus.realloc_buffer(buf_size, 2) # NOQA
216+
217+
self._disp_drv.set_buffers(
218+
self._frame_buffer1,
219+
self._frame_buffer2,
220+
len(self._frame_buffer1),
221+
lv.DISPLAY_RENDER_MODE.DIRECT # NOQA
222+
)
218223

219224
self._data_bus.set_window_size(
220225
hor_res, ver_res, self._cf, self._ignore_size_chg)

ext_mod/lcd_bus/esp32_include/rotation.h

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,12 @@
99
#include "freertos/FreeRTOS.h"
1010
#include "freertos/task.h"
1111

12+
#include "rotate.h"
13+
1214

1315
#ifndef __ROTATION_H__
1416
#define __ROTATION_H__
1517

16-
#define ROTATION_0 (0)
17-
#define ROTATION_90 (1)
18-
#define ROTATION_180 (2)
19-
#define ROTATION_270 (3)
20-
2118
typedef struct _rotation_task_t {
2219
bus_lock_t lock;
2320
bus_event_t exit;
@@ -42,27 +39,13 @@
4239
mp_rom_error_text_t msg;
4340
} rotation_init_err_t;
4441

45-
46-
typedef struct _rotation_data_t {
47-
int x_start;
48-
int y_start;
49-
int x_end;
50-
int y_end;
51-
52-
uint16_t width;
53-
uint16_t height;
54-
55-
uint8_t rotation: 2;
56-
uint8_t bytes_per_pixel: 2;
57-
uint8_t last_update: 1;
58-
42+
typedef struct _rotation_param_data_t {
5943
uint8_t tx_param_count;
6044
int param_cmd[24];
6145
void *param[24];
6246
size_t param_size[24];
6347
bool param_last_cmd[24];
64-
65-
} rotation_data_t;
48+
} rotation_param_data_t;
6649

6750

6851
typedef int (*init_func_cb_t)(void *self_in);
@@ -73,6 +56,7 @@
7356
rotation_buffer_t buf;
7457
rotation_data_t data;
7558
rotation_init_err_t init_err;
59+
rotation_param_data_t param_data;
7660
int lcd_cmd;
7761

7862
init_func_cb_t init_func;

ext_mod/lcd_bus/esp32_src/i2c_bus.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -232,17 +232,17 @@ mp_lcd_err_t i2c_tx_param(mp_obj_t obj, int lcd_cmd, void *param, size_t param_s
232232
} else {
233233
bus_lock_acquire(&self->rotation->task.tx_param_lock, -1);
234234

235-
if (self->rotation->data.tx_param_count == 24) {
235+
if (self->rotation->param_data.tx_param_count == 24) {
236236
bus_lock_release(&self->rotation->task.tx_param_lock);
237237
mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("tx_parameter overflow."));
238238
} else {
239-
uint8_t tx_param_count = self->rotation->data.tx_param_count;
239+
uint8_t tx_param_count = self->rotation->param_data.tx_param_count;
240240

241-
self->rotation->data.param_cmd[tx_param_count] = lcd_cmd;
242-
self->rotation->data.param[tx_param_count] = param;
243-
self->rotation->data.param_size[tx_param_count] = param_size;
244-
self->rotation->data.param_last_cmd[tx_param_count] = last_flush_cmd;
245-
self->rotation->data.tx_param_count++;
241+
self->rotation->param_data.param_cmd[tx_param_count] = lcd_cmd;
242+
self->rotation->param_data.param[tx_param_count] = param;
243+
self->rotation->param_data.param_size[tx_param_count] = param_size;
244+
self->rotation->param_data.param_last_cmd[tx_param_count] = last_flush_cmd;
245+
self->rotation->param_data.tx_param_count++;
246246

247247
bus_lock_release(&self->rotation->task.tx_param_lock);
248248
}

ext_mod/lcd_bus/esp32_src/i80_bus.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -249,17 +249,17 @@
249249
} else {
250250
bus_lock_acquire(&self->rotation->task.tx_param_lock, -1);
251251

252-
if (self->rotation->data.tx_param_count == 24) {
252+
if (self->rotation->param_data.tx_param_count == 24) {
253253
bus_lock_release(&self->rotation->task.tx_param_lock);
254254
mp_raise_msg(&mp_type_MemoryError, MP_ERROR_TEXT("tx_parameter overflow."));
255255
} else {
256-
uint8_t tx_param_count = self->rotation->data.tx_param_count;
256+
uint8_t tx_param_count = self->rotation->param_data.tx_param_count;
257257

258-
self->rotation->data.param_cmd[tx_param_count] = lcd_cmd;
259-
self->rotation->data.param[tx_param_count] = param;
260-
self->rotation->data.param_size[tx_param_count] = param_size;
261-
self->rotation->data.param_last_cmd[tx_param_count] = last_flush_cmd;
262-
self->rotation->data.tx_param_count++;
258+
self->rotation->param_data.param_cmd[tx_param_count] = lcd_cmd;
259+
self->rotation->param_data.param[tx_param_count] = param;
260+
self->rotation->param_data.param_size[tx_param_count] = param_size;
261+
self->rotation->param_data.param_last_cmd[tx_param_count] = last_flush_cmd;
262+
self->rotation->param_data.tx_param_count++;
263263

264264
bus_lock_release(&self->rotation->task.tx_param_lock);
265265
}

0 commit comments

Comments
 (0)