Files
lcdproc/server/drivers/lcd_lib.c
T

185 lines
4.0 KiB
C

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "lcd.h"
// ==================================================
// LCD library of useful functions for drivers
// ==================================================
// Drawn from the "base driver" which really was the precursor
// to this library....
// TODO: What should this really be? Probably should be in the
// driver code or headers or something...
/*
ANY DRIVER SHOULD SIMPLY FREE ITS FRAMEBUFFER AT CLOSE()
NO CHECKING FOR NULL NEEDED
void
free_framebuf (Driver *driver) {
if (!driver)
return;
if (driver->framebuf != NULL)
free (driver->framebuf);
driver->framebuf = NULL;
}
*/
/*
NEED TO BE ADAPTED TO NEW SITUATION
void
clear_framebuf (Driver *driver) {
int framebuf_size;
if (!driver)
return;
framebuf_size = driver->wid * driver->hgt;
memset (driver->framebuf, ' ', framebuf_size);
}
*/
/*
NEED TO BE ADAPTED TO NEW SITUATION
int
new_framebuf (Driver *driver, char *oldbuf) {
int i;
if (driver->framebuf == NULL)
return 1;
if (oldbuf == NULL)
return 1;
for (i = 0; i < driver->wid * driver->hgt; i++) {
if (driver->framebuf[i] < MAX_CUSTOM_CHARS)
return 1;
if (driver->framebuf[i] != oldbuf[i])
return 1;
}
return 0;
}
*/
/*
NEED TO BE ADAPTED TO NEW SITUATION
void
insert_str_framebuf (Driver *driver, int x, int y, char *string) {
//int i;
char buf[64];
char *pos;
if (!driver)
return;
x--; y--; // convert to zero-indexing
if (x >= driver->wid) return;
if (x < 0) x = 0;
if (y >= driver->hgt) y = driver->hgt;
if (y < 0) y = 0;
if ((x + strlen(string)) > driver->wid)
strncpy(buf, string, driver->wid - x - 1);
else
strncpy(buf, string, sizeof(string));
pos = (driver->framebuf + (y * driver->wid) + x);
strcpy(pos, buf);
}
*/
/*
NEED TO BE ADAPTED TO NEW SITUATION
void
insert_chr_framebuf (Driver *driver, int x, int y, char c) {
if (!driver)
return;
x--; y--;
if (x >= driver->wid) x = driver->wid;
if (x < 0) x = 0;
if (y >= driver->hgt) y = driver->hgt;
if (y < 0) y = 0;
driver->framebuf[(y * driver->wid) + x] = c;
}
*/
void
lib_hbar_static (Driver *drvthis, int x, int y, int len, int promille, int options, int cellwidth, int cc_offset)
/*
* This function places a hbar using the v0.5 API format and the given cellwidth.
* It assumes that custom chars have been statically defined, so that number
* 1 has 1 pixel, number 2 has 2 etc...
* LCDs that have the custom chars at other char numbers than 0 should put the
* first custom char number in cc_offset.
*/
{
int total_pixels = ((long) 2 * len * cellwidth + 1 ) * promille / 2000;
int pos;
for (pos = 0; pos < len; pos ++ ) {
int pixels = total_pixels - cellwidth * pos;
if( pixels >= cellwidth ) {
/* write a "full" block to the screen... */
#if defined(SEAMLESS_HBARS)
drvthis->chr (drvthis, x+pos, y, cellwidth + cc_offset);
#else
drvthis->icon (drvthis, x+pos, y, ICON_BLOCK_FILLED);
#endif
}
else if( pixels > 0 ) {
/* write a partial block... */
drvthis->chr (drvthis, x+pos, y, pixels + cc_offset);
break;
}
else {
; /* write nothing (not even a space) */
}
}
}
void
lib_vbar_static (Driver *drvthis, int x, int y, int len, int promille, int options, int cellheight, int cc_offset)
/*
* This function places a vbar using the v0.5 API format and the given cellwidth.
* It assumes that custom chars have been statically defined, so that number
* 1 has 1 pixel, number 2 has 2 etc., just like in good old times...
* LCDs that have the custom chars at other char numbers than 0 should put the
* first custom char number in cc_offset.
*/
{
int total_pixels = ((long) 2 * len * cellheight + 1 ) * promille / 2000;
int pos;
for (pos = 0; pos < len; pos ++ ) {
int pixels = total_pixels - cellheight * pos;
if( pixels >= cellheight ) {
/* write a "full" block to the screen... */
drvthis->icon (drvthis, x, y-pos, ICON_BLOCK_FILLED);
}
else if( pixels > 0 ) {
/* write a partial block... */
drvthis->chr (drvthis, x, y-pos, pixels + cc_offset);
break;
}
else {
; /* write nothing (not even a space) */
}
}
}