mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-08-21 01:15:05 +00:00
Fix for display orientation
This commit is contained in:
parent
4d41d8497a
commit
7fef42426f
@ -118,6 +118,14 @@ struct Hx8357Internal {
|
|||||||
spi_device_handle_t spi_handle;
|
spi_device_handle_t spi_handle;
|
||||||
gpio_num_t dc_pin;
|
gpio_num_t dc_pin;
|
||||||
size_t max_transfer_size;
|
size_t max_transfer_size;
|
||||||
|
// Live MADCTL orientation bits, seeded from config at start() and updated in place by
|
||||||
|
// mirror()/swap_xy() - NOT reconstructed from the static config each call. swap_xy() and
|
||||||
|
// mirror() are invoked back-to-back by lvgl_display_apply_rotation() on every rotation
|
||||||
|
// change, so rebuilding from config would silently discard whichever bit the other call
|
||||||
|
// just set.
|
||||||
|
bool swap_xy;
|
||||||
|
bool mirror_x;
|
||||||
|
bool mirror_y;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int pin_or_unused(const struct GpioPinSpec& pin) {
|
static int pin_or_unused(const struct GpioPinSpec& pin) {
|
||||||
@ -180,11 +188,11 @@ static void run_init_cmds(const Hx8357Internal* internal) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void send_madctl(const Hx8357Internal* internal, const Hx8357Config* config) {
|
static void send_madctl(const Hx8357Internal* internal) {
|
||||||
uint8_t madctl = 0;
|
uint8_t madctl = 0;
|
||||||
if (config->swap_xy) madctl |= (1 << MADCTL_BIT_PAGE_COLUMN_ORDER);
|
if (internal->swap_xy) madctl |= (1 << MADCTL_BIT_PAGE_COLUMN_ORDER);
|
||||||
if (config->mirror_x) madctl |= (1 << MADCTL_BIT_COLUMN_ADDRESS_ORDER);
|
if (internal->mirror_x) madctl |= (1 << MADCTL_BIT_COLUMN_ADDRESS_ORDER);
|
||||||
if (config->mirror_y) madctl |= (1 << MADCTL_BIT_PAGE_ADDRESS_ORDER);
|
if (internal->mirror_y) madctl |= (1 << MADCTL_BIT_PAGE_ADDRESS_ORDER);
|
||||||
send_cmd(internal, HX8357_MADCTL);
|
send_cmd(internal, HX8357_MADCTL);
|
||||||
send_data(internal, &madctl, 1);
|
send_data(internal, &madctl, 1);
|
||||||
}
|
}
|
||||||
@ -272,8 +280,12 @@ static error_t start(Device* device) {
|
|||||||
vTaskDelay(pdMS_TO_TICKS(120));
|
vTaskDelay(pdMS_TO_TICKS(120));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal->swap_xy = config->swap_xy;
|
||||||
|
internal->mirror_x = config->mirror_x;
|
||||||
|
internal->mirror_y = config->mirror_y;
|
||||||
|
|
||||||
run_init_cmds(internal);
|
run_init_cmds(internal);
|
||||||
send_madctl(internal, config);
|
send_madctl(internal);
|
||||||
send_cmd(internal, config->invert_color ? HX8357_INVON : HX8357_INVOFF);
|
send_cmd(internal, config->invert_color ? HX8357_INVON : HX8357_INVOFF);
|
||||||
|
|
||||||
device_set_driver_data(device, internal);
|
device_set_driver_data(device, internal);
|
||||||
@ -340,21 +352,16 @@ static error_t hx8357_draw_bitmap(Device* device, int32_t x_start, int32_t y_sta
|
|||||||
|
|
||||||
static error_t hx8357_mirror(Device* device, bool x_axis, bool y_axis) {
|
static error_t hx8357_mirror(Device* device, bool x_axis, bool y_axis) {
|
||||||
auto* internal = static_cast<Hx8357Internal*>(device_get_driver_data(device));
|
auto* internal = static_cast<Hx8357Internal*>(device_get_driver_data(device));
|
||||||
auto* config = GET_CONFIG(device);
|
internal->mirror_x = x_axis;
|
||||||
// Reads back through the same config the panel was started with; swap_xy/gap are unaffected.
|
internal->mirror_y = y_axis;
|
||||||
Hx8357Config effective = *config;
|
send_madctl(internal);
|
||||||
effective.mirror_x = x_axis;
|
|
||||||
effective.mirror_y = y_axis;
|
|
||||||
send_madctl(internal, &effective);
|
|
||||||
return ERROR_NONE;
|
return ERROR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static error_t hx8357_swap_xy(Device* device, bool swap_axes) {
|
static error_t hx8357_swap_xy(Device* device, bool swap_axes) {
|
||||||
auto* internal = static_cast<Hx8357Internal*>(device_get_driver_data(device));
|
auto* internal = static_cast<Hx8357Internal*>(device_get_driver_data(device));
|
||||||
auto* config = GET_CONFIG(device);
|
internal->swap_xy = swap_axes;
|
||||||
Hx8357Config effective = *config;
|
send_madctl(internal);
|
||||||
effective.swap_xy = swap_axes;
|
|
||||||
send_madctl(internal, &effective);
|
|
||||||
return ERROR_NONE;
|
return ERROR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user