mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-20 01:36:34 +00:00
Fix anti-burn when software rotation is enabled #764
This commit is contained in:
parent
e6eae8b391
commit
ca346e868f
@ -217,11 +217,12 @@ void hasp_antiburn_cb(lv_task_t* task)
|
|||||||
lv_obj_t* layer = lv_disp_get_layer_sys(NULL);
|
lv_obj_t* layer = lv_disp_get_layer_sys(NULL);
|
||||||
if(layer) {
|
if(layer) {
|
||||||
// Fill a buffer with random colors
|
// Fill a buffer with random colors
|
||||||
lv_color_t color[1223];
|
lv_color_t color[1223]; // prime
|
||||||
size_t len = sizeof(color) / sizeof(color[0]);
|
size_t max_len = sizeof(color) / sizeof(color[0]);
|
||||||
for(size_t x = 0; x < len; x++) {
|
for(size_t x = 0; x < max_len; x++) {
|
||||||
color[x].full = HASP_RANDOM(UINT16_MAX);
|
color[x].full = HASP_RANDOM(UINT16_MAX);
|
||||||
}
|
}
|
||||||
|
max_len -= 64; // leave some headroom to randomize
|
||||||
|
|
||||||
// list of possible draw widths; prime numbers combat recurring patterns on the screen
|
// list of possible draw widths; prime numbers combat recurring patterns on the screen
|
||||||
uint8_t prime[] = {61, 67, 73, 79, 83, 89, 97, 103, 109, 113, 127, 131, 137, 139, 149,
|
uint8_t prime[] = {61, 67, 73, 79, 83, 89, 97, 103, 109, 113, 127, 131, 137, 139, 149,
|
||||||
@ -230,17 +231,27 @@ void hasp_antiburn_cb(lv_task_t* task)
|
|||||||
lv_disp_t* disp = lv_disp_get_default();
|
lv_disp_t* disp = lv_disp_get_default();
|
||||||
lv_disp_drv_t* disp_drv = &disp->driver;
|
lv_disp_drv_t* disp_drv = &disp->driver;
|
||||||
|
|
||||||
lv_coord_t scr_h = lv_obj_get_height(layer) - 1;
|
lv_coord_t scr_h;
|
||||||
lv_coord_t scr_w = lv_obj_get_width(layer) - 1;
|
lv_coord_t scr_w;
|
||||||
lv_coord_t w = 487; // first prime larger than 480
|
|
||||||
|
if(disp_drv->sw_rotate) {
|
||||||
|
scr_w = disp_drv->hor_res - 1; // use hardware w
|
||||||
|
scr_h = disp_drv->ver_res - 1; // use hardware h
|
||||||
|
} else {
|
||||||
|
scr_w = lv_obj_get_width(layer) - 1; // use software w
|
||||||
|
scr_h = lv_obj_get_height(layer) - 1; // use software h
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_coord_t w = scr_w; // maximum screen width
|
||||||
lv_area_t area;
|
lv_area_t area;
|
||||||
|
|
||||||
area.y1 = 0;
|
area.y1 = 0;
|
||||||
while(area.y1 <= scr_h) {
|
while(area.y1 <= scr_h) {
|
||||||
if(w > scr_w) w = scr_w; // limit to the actual screenwidth
|
if(w > scr_w) w = scr_w; // limit to the actual screenwidth
|
||||||
if(w > len) w = len; // don't overrun the buffer
|
if(w > max_len) w = max_len; // don't overrun the buffer
|
||||||
lv_coord_t h = len / w;
|
lv_coord_t h = max_len / w;
|
||||||
size_t headroom = len % w; // additional bytes in the buffer that can be used for a random offset
|
size_t headroom = (sizeof(color) / sizeof(color[0])) -
|
||||||
|
(h * w); // additional bytes in the buffer that can be used for a random offset
|
||||||
|
|
||||||
area.y2 = area.y1 + h - 1;
|
area.y2 = area.y1 + h - 1;
|
||||||
if(area.y2 > scr_h) area.y2 = scr_h;
|
if(area.y2 > scr_h) area.y2 = scr_h;
|
||||||
@ -255,16 +266,16 @@ void hasp_antiburn_cb(lv_task_t* task)
|
|||||||
area.x1 += w;
|
area.x1 += w;
|
||||||
}
|
}
|
||||||
|
|
||||||
w = prime[HASP_RANDOM(sizeof(prime))]; // new random width
|
w = prime[HASP_RANDOM(sizeof(prime) / sizeof(prime[0]))]; // new random width
|
||||||
area.y1 += h;
|
area.y1 += h;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(task->repeat_count != 1) return; // don't stop yet
|
|
||||||
|
|
||||||
// task is about to get deleted
|
// task is about to get deleted
|
||||||
hasp_stop_antiburn();
|
if(task->repeat_count == 1) {
|
||||||
dispatch_state_antiburn(HASP_EVENT_OFF);
|
hasp_stop_antiburn();
|
||||||
|
dispatch_state_antiburn(HASP_EVENT_OFF);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user