From ce195bdbe68466004fefbeb6d00ae758ca81b9bd Mon Sep 17 00:00:00 2001 From: marschap Date: Tue, 28 Mar 2006 14:01:34 +0000 Subject: [PATCH] add new chapter about driver API; fix a few errors in the other dobbooks --- docs/lcdproc-dev/add-your-driver.docbook | 29 +- docs/lcdproc-dev/driver-api.docbook | 612 +++++++++++++++++++++++ docs/lcdproc-dev/language.docbook | 37 +- docs/lcdproc-dev/lcdproc-dev.docbook | 4 +- 4 files changed, 659 insertions(+), 23 deletions(-) create mode 100644 docs/lcdproc-dev/driver-api.docbook diff --git a/docs/lcdproc-dev/add-your-driver.docbook b/docs/lcdproc-dev/add-your-driver.docbook index 45b38af..4db574b 100644 --- a/docs/lcdproc-dev/add-your-driver.docbook +++ b/docs/lcdproc-dev/add-your-driver.docbook @@ -46,11 +46,11 @@ AC_ARG_ENABLE(drivers, [ --enable-drivers=<list> compile driver for LCDs in <list>.] [ drivers may be separated with commas.] [ Possible choices are:] - [ bayrad,cfontz,cfontz633,curses,cwlnx,glcdlib,glk,] - [ hd44780,icp_a106,imon,iowarrior,irman,joy,lb216,] - [ lcdm001,lcterm,lirc,ms6931,mtc_s16209x,mtxorb,] - [ noritakevfd,pylcd,sed1330,sed1520,sli,stv5730,svga,] - [ t6963,text,tyan,xosd] + [ bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,] + [ glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,irman,] + [ joy,lb216,lcdm001,lcterm,lirc,ms6931,mtc_s16209x,] + [ MtxOrb,NoritakeVFD,pylcd,sed1330,sed1520,serialVFD,] + [ sli,stv5730,svga,t6963,text,tyan,ula200,xosd] [ \"all\" compiles all drivers], drivers="$enableval", @@ -60,15 +60,14 @@ AC_ARG_ENABLE(drivers, [ --enable-drivers=<list> compile driver for LCDs in <list>.] [ drivers may be separated with commas.] [ Possible choices are:] - [ bayrad,cfontz,cfontz633,curses,cwlnx,glcdlib,glk,] - [ hd44780,icp_a106,imon,iowarrior,irman,joy,lb216,] - [ lcdm001,lcterm,lirc,ms6931,mtc_s16209x,mtxorb,] - [ noritakevfd,pylcd,sed1330,sed1520,sli,stv5730,svga,] - [ t6963,text,tyan,xosd,myDriver] + [ bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,] + [ glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,irman,] + [ joy,lb216,lcdm001,lcterm,lirc,ms6931,mtc_s16209x,] + [ MtxOrb,NoritakeVFD,pylcd,sed1330,sed1520,serialVFD,] + [ sli,stv5730,svga,t6963,text,tyan,ula200,xosd,myDriver] [ \"all\" compiles all drivers], drivers="$enableval", - @@ -79,13 +78,13 @@ AC_ARG_ENABLE(drivers, This: if test "$drivers" = "all"; then - drivers=[bayrad,cfontz,...(big list)...,tyan,xosd] + drivers=[bayrad,CFontz,...(big list)...,ula200,xosd] fi becomes: if test "$drivers" = "all"; then - drivers=[bayrad,cfontz,...(big list)...,tyan,xosd,myDriver] + drivers=[bayrad,CFontz,...(big list)...,ula200,xosd,myDriver] fi @@ -123,11 +122,11 @@ If your driver only works in some platform or requires a particular library or h This -EXTRA_PROGRAMS = bayrad CFontz ...(big list)... wirz_sli xosd +EXTRA_PROGRAMS = bayrad CFontz ...(big list)... ula200 xosd becomes -EXTRA_PROGRAMS = bayrad CFontz ...(big list)... wirz_sli xosd myDriver +EXTRA_PROGRAMS = bayrad CFontz ...(big list)... ula200 xosd myDriver diff --git a/docs/lcdproc-dev/driver-api.docbook b/docs/lcdproc-dev/driver-api.docbook new file mode 100644 index 0000000..a180fc5 --- /dev/null +++ b/docs/lcdproc-dev/driver-api.docbook @@ -0,0 +1,612 @@ + + The LCDproc driver API + + + This chapter describes the driver API of v0.5 of LCDproc. + At time of this writing, this version is not released and some things might + be changed. + + + + The API consists of several functions to tell the driver that + certains actions should be performed, some data, and several functions + to retrieve configuration data from the server. + + + + 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 use of the API has changed from v0.4 to v0.5. The default functions that + the server put in the pointers in v0.4 do no longer exist. Instead empty + functions are the default. If a driver implements a function, the function + will be detected by the server. The driver should at least implement all + basic functions like driver_chr and driver_str itself, and should also have + defined a number of other symbols for the server. + + + + I will walk through the driver struct here. + + + +typedef struct lcd_logical_driver { + + //////// Variables in the driver module + // The driver loader will look for symbols with these names ! + char *api_version; + int *stay_in_foreground; // Does this driver require to be in foreground ? + int *does_input; // Does this driver do output ? + int *does_output; // Does this driver do output ? + + The programmer should define the following symbols: + +char * api_version = API_VERSION; // <-- this symbol is defined by make +int stay_in_foreground = 0; // This driver does not need to be in foreground +int does_input = 0; // This driver does not do input +int does_output = 1; // But only output + + And fill these values with the correct values. Upon loading the driver module, + the server will locate these symbols and store pointers to them in the + driver struct. + + Because the drivers are loadable, some kind of version checking should be + done. Therefor the server expects the correct version number to be found in + the api_version symbol (a string). For the v0.5 version this should be "0.5". + If the version is incompatible, the driver will not be loaded. The current + API version can always be determined by inserting the compiler define + API_VERSION in the code. + + ///// Functions in the driver module + // Basic functions + // All these Basic functions should be implemented ! + int (*init) (drvthis); + void (*close) (drvthis); + int (*width) (drvthis); + int (*height) (drvthis); + void (*clear) (drvthis); + void (*flush) (drvthis); + void (*string) (drvthis, int x, int y, char *str); + void (*chr) (drvthis, int x, int y, char c); + + // Extended functions + void (*vbar) (drvthis, int x, int y, int len, int promille, int options); + void (*hbar) (drvthis, int x, int y, int len, int promille, int options); + + These functions have been extended since v0.4. They now now expext complete + coordinates, a length (in chars, not pixels!) a promillage (0 to 1000) and an + option. + + void (*num) (drvthis, int x, int num); + + Draw big numbers on your display. Only 6 positions exist, 1 to 6. + David GLAUDE: + "I don't think this is valid... There are as many position as wanted. + A BigNum could be at any column from 1 to end of the LCD. + It could also be at -1 and -2 (where only the end is visible). + Optionaly it could be on a specific raw from -3 to end of the LCD. + This permit scrolling of BIGNUM or in the futur BIGFONT." + + void (*heartbeat) (drvthis, int state); + + Should be called to animate the heartbeat. The driver should therefore + probably call the icon function below. + + void (*icon) (drvthis, int x, int y, int icon); + + Tells to place a certain icon at a position. + + + // Userdef character functions + + void (*set_char) (drvthis, char ch, char *dat) + int (*get_free_chars) (drvthis) + int (*cellwidth) (drvthis) + int (*cellheight) (drvthis) + + Functions to define a character. It is currently unclear how this system + should exactly work. The set_char function expects a simple block of data + with 1 byte for each pixel-line. So that is 8 bytes for a 5x8 char. + + // Hardware functions + int (*contrast) (drvthis, int contrast); + void (*backlight) (drvthis, int on); + void (*output) (drvthis, int on); + + // Key functions + char *(*get_key) (drvthis); + + Returns a string. This string is withing driver's memory space and the server + should therefor never try to modify this string. + + char *(*get_info) (drvthis); + + Returns a string describing the driver and it's features. + + //////// Variables in server core available for drivers + + char * name; // Name of this driver. + void * private_data; + +These variables should be taken read-only for the drivers. The name variable +should be used to access the driver's own section in the config file. +The private_data pointer is the pointer to the driver's own data block. This +pointer should be stored using the store_private_ptr function below. The +driver should cast this to it's own private structure pointer. + + + //////// Functions in server core available for drivers + + int (*store_private_ptr) (struct lcd_logical_driver * driver, void * private_data); + +Store the driver's private data: + + + // Config file functions, filled by server + char (*config_get_bool) (char * sectionname, char * keyname, + int skip, char default_value); + int (*config_get_int) (char * sectionname, char * keyname, + int skip, int default_value); + double (*config_get_float) (char * sectionname, char * keyname, + int skip, double default_value); + char *(*config_get_string) (char * sectionname, char * keyname, + int skip, char * default_value); + // Returns a string in server memory space. + // Copy this string. + int config_has_section (char *sectionname); + int config_has_key (char *sectionname, char *keyname); + +See configfile.h on how to use these functions. As sectionname, always use the +driver name: drvthis->name + + + // Reporting function + void (*report) ( const int level, const char *format, .../*args*/ ); + +Easily usable report functions by including drivers/report.h. See that file +for details. + + + // Display properties functions (for drivers that adapt to other loaded drivers) + int (*get_display_width) (); + int (*get_display_height) (); + +If you have a driver that can adapt its size to the size of an other driver, +it should read these values. If there is no other driver loaded yet, the +returned values will be 0. + + + // Driver private data + void * private_data; // Filled by server by calling store_private_ptr() + +} Driver; + +The flush_box and draw_frame functions have been removed for v0.5. + + + + + + PRIVATE DATA + + + With the introduction of loadable modules it is necesary to stop using global + variables to store a driver's data in. Instead, you should store it in a + structure, that you allocate abd store on driver's init. If you don't use + this system, but use globals, you get queer results if you run two LCDd + daemons on one machine. They will then use the same variables ! + + + + In the driver's private structure will probably at least be something like: + + + +typedef struct my_driver_private { + + // Size in cells of the LCD + int width, height; + // Size of each LCD cell, in pixels + int cellwidth, cellheight; + // Frame buffer... + char *framebuf; +} PrivateData; + + + + You allocate and store this structure like this: + + + + PrivateData * p; + + // Allocate and store private data + p = (PrivateData *) malloc( sizeof(PrivateData) ); + if( p == NULL ) + return -1; + if( drvthis->store_private_ptr( drvthis, p ) < 0 ) + return -1; + + (... continue with the rest of your init routine) + + + + You retrieve this private data pointer by adding the following code to the + beginning of your functions: + + + + PrivateData * p = (PrivateData*) drvthis->private_data; + + + + Then you can access your data like: + + + p->framebuf + + + + + + FUNCTIONS IN DETAIL + + + + int (*init) + Driver *drvthis + + + + The init function + Starts up the LCD, initializes all vars. Allocates private data space + and stores the pointer by calling store_private_ptr(); + + + + + void (*close) + Driver *drvthis + + + + Shuts down the connection with the LCD. + Called just before unloading the driver. + + + + + int (*width) + Driver *drvthis + + + + Get the screen width. + + + + + int (*height) + Driver *drvthis + + + + Get the screen height. + + + + + void (*clear) + Driver *drvthis + + + + Clears the framebuffer + + + + + void (*flush) + Driver *drvthis + + + + Flushes the framebuffer to the LCD. + + + + + void (*string) + Driver *drvthis + int x + int y + char *str + + + + Places a string in the framebuffer + All coordinates are 1-based, (1,1) is top left. + Driver should check for overflows + + + + + void (*chr) + Driver *drvthis + int x + int y + char c + + + + Places a char in the framebuffer + Driver should check for overflows + + + + + void (*vbar) + Driver *drvthis + int x + int y + int len + int promille + int options + + + + Draws a vertical bar at horizontal position x and with length len. + + + + + void (*hbar) + Driver *drvthis + int x + int y + int len + int promille + int options + + + + Draws a horizontal bar at position x,y and with length len. + + + + + void (*num) + Driver *drvthis + int x + int num + + + + Displays a big number at position x. + + + + + void (*heartbeat) + Driver *drvthis + int state + + + + Sets the heartbeat to the indicated state. + 0=off 1=graph1 2=graph2 + David GLAUDE: + "state is apparently type and it could have the value + HEARTBEAT_ON to say that we want to display/refresh the heartbeat. + The driver choose how to do it. See MtxOrb.c" + + + + + void (*icon) + Driver *drvthis + int x + int y + int icon + + + + + + + + void (*set_char) + Driver *drvthis + char ch + char *dat + + + + + + + + int (*get_free_chars) + Driver *drvthis + + + + + + + + int (*cellwidth) + Driver *drvthis + + + + + + + + int (*cellheight) + Driver *drvthis + + + + + + + + int (*contrast) + Driver *drvthis + int contrast + + + + Sets the contrast to the given value. Values should be 0 to 255. + Many displays do not support software setting of contrast. + Use -1 to get the current value returned. + + + + + void (*backlight) + Driver *drvthis + int brightness + + + + 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) + Driver *drvthis + int state + + + + 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'. + + + + + char *(*get_key) + Driver *drvthis + + + + Checks if a key has been pressed on the device. + Returns NULL for "no key pressed", or a string describing the pressd key. + These characters should match the keypad-layout. + + + + + char *(*get_info) + Driver *drvthis + + + + Returns a string describing the driver and its features. + + + + + char (*config_get_bool) + char *sectionname + char *keyname + int skip + char default_value + + + + Call to server. Retrieve a bool from the config file. + Sectionname should be the name of the driver (as in the struct). + If the key cannot be found, the default value will be returned. + skip should be 0 usually, but if you want to retrieve multiple + identical keys, then increase skip to get every next value. + + + + + int (*config_get_int) + char *sectionname + char *keyname + int skip + int default_value + + + + Call to server. Retrieve an integer from the config file. + + + + + double (*config_get_float) + char *sectionname + char *keyname + int skip + double default_value + + + + Call to server. Retrieve a float from the config file. + + + + + char *(*config_get_string) + char *sectionname + char *keyname + int skip + char *default + + + + Call to server. Retrieve a string from the config file. + Fill result with a pointer to some available space. You can fill it + with a default value. If the key is found, it will be overwritten + with the value from the key. + Note that you should always first copy the the returned string. + It is in the address space of the server, and will be freed at the + next call. + + + + + int config_has_section + char *sectionname + + + + Returns wether a section exists. Does not need to be called prior + to a call to a config_get_* function. + + + + + int config_has_key + char *sectionname + char *keyname + + + + Returns the number of times a key exists. Does not need to be called + prior to a call to a config_get_* function. + + + + +First version, Joris Robijn, 20011016 + + + + + diff --git a/docs/lcdproc-dev/language.docbook b/docs/lcdproc-dev/language.docbook index b86e7a5..961a86c 100644 --- a/docs/lcdproc-dev/language.docbook +++ b/docs/lcdproc-dev/language.docbook @@ -338,9 +338,31 @@ int a positive integer that maps to priority classes above - using the usual logic for priorities: - the lower the number the higher the priority. - + according to the mapping given in the table below. + + + + + range + priority + + + + + 1 - 64 + foreground + + + 65 - 192 + info + + + 193 - ∞ + background + + + + @@ -1597,11 +1619,11 @@ huh? - errorr_description + error_description - This is the reponse to a command in case something has gone wrong. + This is the response to a command in case something has gone wrong. The description is not meant to be parsed, it's only meant for the programmer of the client. It might be that your command has only been partially executed, for example if you try to reserve 3 @@ -1623,8 +1645,9 @@ - The given screen is now visible on the display (listen) or it is - not visible anymore on the display (ignore). + The screen with the screen_id given is now + visible on the display (listen) or it is not visible + anymore on the display (ignore). diff --git a/docs/lcdproc-dev/lcdproc-dev.docbook b/docs/lcdproc-dev/lcdproc-dev.docbook index 378285d..d20a1d7 100644 --- a/docs/lcdproc-dev/lcdproc-dev.docbook +++ b/docs/lcdproc-dev/lcdproc-dev.docbook @@ -5,6 +5,7 @@ + @@ -17,8 +18,9 @@ &introduction; &shared-files; &language; -&make-driver; +&driver-api; &add-your-driver; +&make-driver; &license;