Added optimizations to MtxOrb driver:
* Don't send any data if there is no change. * High optimization of MtxOrb_draw_frame - only write changed data to screen.
This commit is contained in:
+38
-10
@@ -26,6 +26,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
|
#include "lcd_lib.h"
|
||||||
#include "MtxOrb.h"
|
#include "MtxOrb.h"
|
||||||
#include "drv_base.h"
|
#include "drv_base.h"
|
||||||
#include "shared/debug.h"
|
#include "shared/debug.h"
|
||||||
@@ -1037,30 +1038,57 @@ static void
|
|||||||
MtxOrb_draw_frame (char *dat)
|
MtxOrb_draw_frame (char *dat)
|
||||||
{
|
{
|
||||||
char out[12];
|
char out[12];
|
||||||
int i;
|
int i,j,mv = 1;
|
||||||
char *old = NULL;
|
static char *old = NULL;
|
||||||
|
char *p, *q;
|
||||||
|
|
||||||
if (!dat)
|
if (!dat)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!old) {
|
if (old == NULL) {
|
||||||
old = malloc(MtxOrb->wid * MtxOrb->hgt);
|
old = malloc(MtxOrb->wid * MtxOrb->hgt);
|
||||||
|
|
||||||
|
write(fd, "\x0FEG\x01\x01", 4);
|
||||||
|
write(fd, dat, MtxOrb->wid * MtxOrb->hgt);
|
||||||
|
|
||||||
|
strncpy(old, dat, MtxOrb->wid * MtxOrb->hgt);
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (! new_framebuf(MtxOrb, old))
|
if (! new_framebuf(MtxOrb, old))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(old, dat, MtxOrb->wid * MtxOrb->hgt);
|
p = dat;
|
||||||
|
q = old;
|
||||||
|
|
||||||
// snprintf(out, sizeof(out), "%cG%c%c", 254, 1, 1);
|
for (i = 1; i <= MtxOrb->hgt; i++) {
|
||||||
// write(fd, out, 4);
|
for (j = 1; j <= MtxOrb->wid; j++) {
|
||||||
// write(fd, dat, lcd.wid*lcd.hgt);
|
|
||||||
|
|
||||||
for (i = 0; i < MtxOrb->hgt; i++) {
|
if ((*p) == (*q))
|
||||||
snprintf (out, sizeof(out), "\x0FEG\x001%c", i + 1);
|
mv = 1;
|
||||||
|
else {
|
||||||
|
if (mv == 1) {
|
||||||
|
snprintf(out, sizeof(out), "\x0FEG%c%c", j, i);
|
||||||
write (fd, out, 4);
|
write (fd, out, 4);
|
||||||
write (fd, dat + (MtxOrb->wid * i), MtxOrb->wid);
|
mv = 0;
|
||||||
}
|
}
|
||||||
|
write (fd, p, 1);
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
q++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//for (i = 0; i < MtxOrb->hgt; i++) {
|
||||||
|
// snprintf (out, sizeof(out), "\x0FEG\x001%c", i + 1);
|
||||||
|
// write (fd, out, 4);
|
||||||
|
// write (fd, dat + (MtxOrb->wid * i), MtxOrb->wid);
|
||||||
|
//}
|
||||||
|
|
||||||
|
strncpy(old, dat, MtxOrb->wid * MtxOrb->hgt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user