This document describes the driver API of v0.4 of LCDproc.

The API consists of several functions to tell the driver that
certains actions should be performed, and some data. I consider
the data part of the API, because this data is transfered
between core and driver.

OVERVIEW OF OPERATION

The API is best descibed by starting with the struct lcd_logical_driver
which is defined in server/drivers/lcd.h.

The various variables and functions in this struct are filled by the server
with default values and functions. It is then passed to the driver while
calling the init function of the driver. The driver can decide to change
values and to override functions.

typedef struct lcd_logical_driver {
	// Size in cells of the LCD
	int wid, hgt;
	// Size of each LCD cell, in pixels
	int cellwid, cellhgt;
	// Frame buffer...
	char *framebuf;

	// Functions which might be the same for all drivers...
	void (*clear) ();
	void (*string) (int x, int y, char lcd[]);

	void (*chr) (int x, int y, char c);
	void (*vbar) (int x, int len);
	void (*hbar) (int x, int y, int len);
	void (*init_num) ();
	void (*num) (int x, int num);

	// Functions which should probably be implemented in each driver...
	int (*init) (struct lcd_logical_driver * driver, char *args);
	void (*close) ();
	void (*flush) ();
	void (*flush_box) (int lft, int top, int rgt, int bot);
	int (*contrast) (int contrast);
	void (*backlight) (int on);
	void (*output) (int on);
	void (*set_char) (int n, char *dat);
	void (*icon) (int which, char dest);
	void (*init_vbar) ();
	void (*init_hbar) ();
	void (*draw_frame) ();

	// Returns 0 for "no key pressed", or (A-Z).
	char (*getkey) ();

	// more?

} lcd_logical_driver;

The various parts are meant for the following:

1. Several variables
These vars are meant to tell the server how many characters wide and high the
LCD is, and what size the definable characters are.

2. Framebuf
The framebuffer can be written to by server and client in the 0.4 version.
Therefor the framebuffer must always be of the size wid*hgt. It holds the
display contents, line after line.

3. Functions which might be the same for all drivers
These functions are usually implemented by server's internal functions that
perform standard operations. Placing a char in the framebuffer etc. are
all equal in all drivers and therefor are implemented in the server.
This behaviour probably changes in v0.5.

4. Functions which should probably be implemented in each driver
These functions are probably different for all drivers.


FUNCTIONS IN DETAIL

void (*clear) ();
// Clears the framebuffer

void (*string) (int x, int y, char lcd[]);
// Places a string in the framebuffer
// All coordinates are 1-based, (1,1) is top left.

void (*chr) (int x, int y, char c);
// Places a char in the framebuffer

void (*vbar) (int x, int len);
// Draws a vertical bar at horizontal position x and with length len.
// init_vbar will be called once before this functions.

void (*hbar) (int x, int y, int len);
// Draws a horizontal bar at position x,y and with length len.
// init_hbar will be called once before this functions.

void (*init_num) ();
// Initializes the big number displaying. A big number should have a width
// of 4 characters, and a spacing of 1 character.

void (*num) (int x, int num);
// Displays a big number at position x.

int (*init) (struct lcd_logical_driver * driver, char *args);
// The init function
// Starts up the LCD and initializes the struct with correct values and
// correct function pointers.

void (*close) ();
// Shuts down the connection with the LCD.

void (*flush) ();
// Flushes the framebuffer to the LCD.

void (*flush_box) (int lft, int top, int rgt, int bot);
// Flushes only a part of the framebuffer to the LCD.
// Not called by the server currently.

int (*contrast) (int contrast);
// Sets the contrast to the given value.
// Many displays do not support software setting of contrast.

void (*backlight) (int on);
// Sets the backlight to brightness 'on'.
// Often hardware can only support on and off, in that case any value
// of on>0 will switch the backlight on.

void (*output) (int on);
// Sets the output value. Some displays/wirings have a general purpose
// output, which can be controlled by calling this function. See the
// 'output' command in the 'widget language'.

void (*set_char) (int n, char *dat);
// Define a character

void (*icon) (int which, char dest);
// Define a character to be a standard icon. Is used for the heartbeat.

void (*init_vbar) ();
// Initializes the LCD to display vertical bars

void (*init_hbar) ();
// Initializes the LCD to display horizontal bars

void (*draw_frame) ();
// Unclear function.
// Not called by the server currently.

char (*getkey) ();
// Checks if a key has been pressed on the device.
// Returns 0 for "no key pressed", or a character for the key.
// These characters do not always match the keypad-layout.


First version, Joris Robijn, 20011016

