Port remaining drivers to 0.5 API (icon, hbar, vbar).

This commit is contained in:
mmdolze
2011-02-10 22:48:57 +00:00
parent 361fcb2a51
commit 565a861d91
7 changed files with 320 additions and 400 deletions
+1
View File
@@ -17,6 +17,7 @@ v.0.5dev (ongoing development)
* lcdproc: Fix a single dot appearing on line 5 of the D screen
* lcdproc: Make the iface screen more readable on 2x16 displays
* All drivers: sync functions with prototypes
* Port remaining drivers to 0.5 API (glk, lcdm001, stv5730)
v0.5.4
* Update driver includes and LDFLAGS (fixed glk and bayrad binding error)
+59 -118
View File
@@ -1,14 +1,17 @@
/** \file server/drivers/glk.c
* LCDd \c glk driver for graphical displays by MatroxOrbital.
*
* \todo Adapt hBar, vBar, and icon to 0.5 API.
* LCDd \c glk driver for graphical displays by MatrixOrbital (GLK series).
*/
/*
* MatrixOrbital GLK Graphic Display Driver
*
* http://www.matrixorbital.com
*/
/*-
* Copyright ???
*
* License ???
*/
#include <stdlib.h>
@@ -33,12 +36,10 @@
# endif
#endif
#define DEBUG 1
#include "lcd.h"
#include "glk.h"
#include "glkproto.h"
#include "report.h"
#include "adv_bignum.h"
#define GLK_DEFAULT_DEVICE "/dev/lcd"
@@ -48,10 +49,6 @@
#define GLK_DEFAULT_CELLHEIGHT 8
//////////////////////////////////////////////////////////////////////////
//////////////////// Matrix Orbital Graphical Driver /////////////////////
//////////////////////////////////////////////////////////////////////////
/** private data for the \c glk driver */
typedef struct glk_private_data {
char device[256];
@@ -79,7 +76,7 @@ typedef struct glk_private_data {
} PrivateData;
// Vars for the server core
/* Vars for the server core */
MODULE_EXPORT char *api_version = API_VERSION;
MODULE_EXPORT int stay_in_foreground = 0;
MODULE_EXPORT int supports_multiple = 0;
@@ -110,7 +107,7 @@ glk_init(Driver *drvthis)
p->fd = NULL;
p->speed = GLK_DEFAULT_SPEED;
p->backingstore = NULL;
p->fontselected = -1; // No font selected
p->fontselected = -1; /* No font selected */
p->gpo_count = 0;
p->framebuf = NULL;
p->cellwidth = GLK_DEFAULT_CELLWIDTH;
@@ -131,7 +128,7 @@ glk_init(Driver *drvthis)
if (p->speed == 9600) p->speed = B9600;
else if (p->speed == 19200) p->speed = B19200;
// not in the specs:
/* not in the specs: */
//else if (p->speed == 38400) p->speed = B38400;
else if (p->speed == 57600) p->speed = B57600;
else if (p->speed == 115200) p->speed = B115200;
@@ -158,7 +155,7 @@ glk_init(Driver *drvthis)
return -1;
}
// Query the module for a device type
/* Query the module for a device type */
glkputl(p->fd, GLKCommand, 0x37, EOF);
i = glkget(p->fd);
if (i < 0) {
@@ -227,22 +224,21 @@ glk_init(Driver *drvthis)
memset(p->framebuf, ' ', p->width * p->height);
// glk_clear();
glkputl(p->fd, GLKCommand, 0x58, EOF);
// Enable flow control
/* Enable flow control */
glkflow(p->fd, 40, 2);
// Set read character timeout to 0
/* Set read character timeout to 0 */
glktimeout(p->fd, 0);
// Enable auto-transmit of up/down key events
// This allows us to generate REPEAT keys distinct from
// normal keys using timeouts. (see glk_get_key)
/*
* Enable auto-transmit of up/down key events. This allows us to generate
* REPEAT keys distinct from normal keys using timeouts. (see glk_get_key)
*/
glkputl(p->fd, GLKCommand, 0x7e, 1, GLKCommand, 0x41, EOF);
// Set p->contrast
/* Set p->contrast */
glk_set_contrast(drvthis, p->contrast);
report(RPT_DEBUG, "%s: init() done", drvthis->name);
@@ -360,7 +356,7 @@ glk_clear(Driver *drvthis)
memset(p->framebuf, ' ', p->width * p->height);
// do a hardware clear very CLEARCOUNT invocation
/* do a hardware clear very CLEARCOUNT invocation */
if (--p->clearcount < 0)
glk_clear_forced(drvthis);
}
@@ -375,7 +371,6 @@ glk_flush(Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
// puts("glk_flush()");
unsigned char *pf = p->framebuf;
unsigned char *qf = p->backingstore;
int x, y;
@@ -450,7 +445,7 @@ glk_chr(Driver *drvthis, int x, int y, char c)
PrivateData *p = drvthis->private_data;
int myc = (unsigned char) c;
x--; // Convert 1-based coords to 0-based...
x--; /* Convert 1-based coords to 0-based... */
y--;
if (p->fontselected != 1) {
@@ -507,14 +502,12 @@ glk_set_contrast(Driver *drvthis, int promille)
{
PrivateData *p = drvthis->private_data;
// Check it
if ((promille < 0) || (promille > 1000))
return;
// Store it
p->contrast = promille;
// Do it: map logical [0, 1000] -> physical [0, 255] for the hardware
/* Do it: map logical [0, 1000] -> physical [0, 255] for the hardware */
debug(RPT_DEBUG, "Contrast: %d", p->contrast);
glkputl(p->fd, GLKCommand, 0x50, (int) ((long) promille * 255 / 1000), EOF);
}
@@ -573,7 +566,6 @@ glk_output(Driver *drvthis, int on)
MODULE_EXPORT void
glk_num(Driver *drvthis, int x, int num)
{
//PrivateData *p = drvthis->private_data;
int do_init = 1;
debug(RPT_DEBUG, "glk_num(%d, %d)", x, num);
@@ -581,52 +573,20 @@ glk_num(Driver *drvthis, int x, int num)
if ((num < 0) || (num > 10))
return;
/* no need to check for alternative ccmodes: we have no custom characters
if (p->ccmode != bignum) {
if (p->ccmode != standard) {
// Not supported (yet)
report(RPT_WARNING, "%s: num: cannot combine two modes using user-defined characters",
drvthis->name);
return;
}
p->ccmode = bignum;
do_init = 1;
}
*/
// Lib_adv_bignum does everything needed to show the bignumbers.
/* Lib_adv_bignum does everything needed to show the bignumbers. */
lib_adv_bignum(drvthis, x, num, 0, do_init);
/* previous implementation using alternative font:
if (p->fontselected != 3) {
debug(RPT_DEBUG, "Switching to font 3");
// Select Big Numbers font
glkputl(p->fd, GLKCommand, 0x31, 3, EOF);
p->fontselected = 3;
// Set font metrics
glkputl(p->fd, GLKCommand, 0x32, 1, 0, 1, 1, 32, EOF);
// Clear the screen
glk_clear_forced(drvthis);
}
if ((x > 0) && (x <= p->width))
p->framebuf[x-1] = (num >= 10) ? ':' : (num + '0');
*/
}
/**
* Get total number of custom characters available.
* Get total number of custom characters available. This is required in order
* to be able to use bignum library.
* \param drvthis Pointer to driver structure.
* \return Number of custom characters (always 0).
*/
MODULE_EXPORT int
glk_get_free_chars(Driver *drvthis)
{
//PrivateData *p = drvthis->private_data;
debug(RPT_DEBUG, "glk_get_free_chars()");
return 0;
@@ -640,35 +600,32 @@ glk_get_free_chars(Driver *drvthis)
MODULE_EXPORT void
glk_set_char(Driver *drvthis, int n, char *dat)
{
//PrivateData *p = drvthis->private_data;
debug(RPT_DEBUG, "glk_set_char(%d)", n);
}
/**
* Draws a vertical bar, from the bottom of the screen up.
* This function still uses 0.4 API.
* Draws a vertical bar, from line y the screen up.
*/
MODULE_EXPORT void
glk_old_vbar(Driver *drvthis, int x, int len)
glk_vbar(Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = drvthis->private_data;
int y = p->height;
int pixels = ((long) 2 * len * p->cellheight) * promille / 2000;
debug(RPT_DEBUG, "glk_old_vbar(%d, %d)", x, len);
debug(RPT_DEBUG, "glk_old_vbar(%d, %d)", x, pixels);
while (len > p->cellheight) {
while (pixels > p->cellheight) {
glk_chr(drvthis, x, y, 255);
--y;
len -= p->cellheight;
pixels -= p->cellheight;
}
if (y >= 0) {
int lastc;
switch (len) {
case 0 : return; break; /* Don't output a char */
switch (pixels) {
case 0 : return; /* Don't output a char */
case 1 : lastc = 138; break; /* One bar */
case 2 : lastc = 139; break;
case 3 : lastc = 140; break;
@@ -684,25 +641,25 @@ glk_old_vbar(Driver *drvthis, int x, int len)
/**
* Draws a horizontal bar to the right.
* This function still uses 0.4 API.
*/
MODULE_EXPORT void
glk_old_hbar(Driver *drvthis, int x, int y, int len)
glk_hbar(Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = drvthis->private_data;
int pixels = ((long) 2 * len * p->cellwidth) * promille / 2000;
debug(RPT_DEBUG, "glk_old_hbar(%d, %d, %d)", x, y, len);
debug(RPT_DEBUG, "glk_old_hbar(%d, %d, %d)", x, y, pixels);
while (len > p->cellwidth) {
while (pixels > p->cellwidth) {
glk_chr(drvthis, x, y, 255);
++x;
len -= p->cellwidth;
pixels -= p->cellwidth;
}
if (x <= p->width) {
int lastc;
switch (len) {
switch (pixels) {
case 0 : lastc = ' '; break;
case 1 : lastc = 134; break; /* One bar */
case 2 : lastc = 135; break;
@@ -716,47 +673,31 @@ glk_old_hbar(Driver *drvthis, int x, int y, int len)
/**
* Sets character 0 to an icon.
* This function still uses 0.4 API.
* API: Draw an icon character on the screen.
*/
MODULE_EXPORT void
glk_old_icon(Driver *drvthis, int which, int dest)
MODULE_EXPORT int
glk_icon (Driver *drvthis, int x, int y, int icon)
{
PrivateData *p = drvthis->private_data;
unsigned char old, new;
unsigned char *pf = p->framebuf;
unsigned char *qf = p->backingstore;
int count;
debug(RPT_DEBUG, "%s: x=%d, y=%d, icon=%x", __FUNCTION__, x, y, icon);
debug(RPT_DEBUG, "glk_old_icon(%i, %i)", which, dest);
if ((dest < 0) || (dest > 7)) {
/* Illegal custom character */
return;
}
/* which == 0 => empty heart => 131
* which == 1 => filled heart => 132
* which == 2 => ellipsis => 128
*/
switch (which) {
case 0: new = 131; break;
case 1: new = 132; break;
case 2: new = 128; break;
default: return; /* ERROR */
}
old = p->CGRAM[(int) dest];
p->CGRAM[(int) dest] = new;
/* Replace all old icons with new icon in new frame */
for (count = p->width * p->height; count > 0; count--) {
if (*qf == old) {
debug(RPT_DEBUG, "icon %d to %d at %d", old, new, qf - p->backingstore);
*pf = new;
switch (icon) {
case ICON_BLOCK_FILLED:
glk_chr(drvthis, x, y, 255);
break;
case ICON_HEART_FILLED:
glk_chr(drvthis, x, y, 132);
break;
case ICON_HEART_OPEN:
glk_chr(drvthis, x, y, 131);
break;
case ICON_ELLIPSIS:
glk_chr(drvthis, x, y, 128);
break;
default:
return -1; /* Let the core do the others */
}
++qf; ++pf;
}
return 0;
}
@@ -828,7 +769,7 @@ glk_get_key(Driver *drvthis)
break;
default : break;
// What to do with repeated keys? We currently ignore them.
/* What to do with repeated keys? We currently ignore them. */
//case 'v' : c = 'N'; break;
//case 'p' : c = 'O'; break;
//case 'q' : c = 'P'; break;
+3 -7
View File
@@ -1,8 +1,6 @@
#ifndef GLK_H
#define GLK_H
#include "lcd.h"
MODULE_EXPORT int glk_init(Driver *drvthis);
MODULE_EXPORT void glk_close(Driver *drvthis);
MODULE_EXPORT int glk_width(Driver *drvthis);
@@ -15,6 +13,9 @@ MODULE_EXPORT void glk_string(Driver *drvthis, int x, int y, const char string[]
MODULE_EXPORT void glk_chr(Driver *drvthis, int x, int y, char c);
MODULE_EXPORT void glk_num(Driver *drvthis, int x, int num);
MODULE_EXPORT void glk_vbar(Driver *drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void glk_hbar(Driver *drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT int glk_icon(Driver *drvthis, int x, int y, int icon);
MODULE_EXPORT int glk_get_free_chars(Driver *drvthis);
MODULE_EXPORT void glk_set_char(Driver *drvthis, int n, char *dat);
@@ -26,9 +27,4 @@ MODULE_EXPORT void glk_output(Driver *drvthis, int on);
MODULE_EXPORT const char *glk_get_key(Driver *drvthis);
// Functions using old 0.4 API.
MODULE_EXPORT void glk_old_vbar(Driver *drvthis, int x, int len);
MODULE_EXPORT void glk_old_hbar(Driver *drvthis, int x, int y, int len);
MODULE_EXPORT void glk_old_icon(Driver *drvthis, int which, int dest);
#endif
+140 -162
View File
@@ -2,39 +2,33 @@
* LCDd \c lcdm001 driver for the LCDM001 device from kernelconcepts.de.
*/
/*-
* This driver is mostly based on the MtxOrb driver. See the file MtxOrb.c
* for copyright details. The function calls needed for reporting and getting
* settings from the configfile have been written taking the calls in
* sed1330.c.
*
* Copyright (C) 2001 Rene Wagner <reenoo@gmx.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
/*
Copyright (C) 2001 Rene Wagner <reenoo@gmx.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */
/* This driver is mostly based on the MtxOrb driver.
See the file MtxOrb.c for copyright details */
/* The heartbeat workaround has been taken from the curses driver
See the file curses_drv.c for copyright details */
/* The function calls needed for reporting and getting settings from the
configfile have been written taking the calls in
sed1330.c ((C) by Joris Robijn) as examples*/
/* (Hopefully I have NOT forgotten any file I have stolen code from.
If so send me an e-mail or add your copyright here!) */
/* LCDM001 does NOT support custom chars
Most of the displaying problems have been fixed
using ASCII workarounds*/
/* You can modify the characters that are displayed instead of
the normal icons for the heartbeat in lcdm001.h*/
* LCDM001 does NOT support custom chars. You can modify the characters that
* are displayed instead of the normal icons for the heartbeat in lcdm001.h.
*/
#include <stdlib.h>
#include <stdio.h>
@@ -49,21 +43,9 @@
# include "config.h"
#endif
# if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
# else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
# endif
#include "lcd.h"
#include "lcdm001.h"
#include "report.h"
//#include "configfile.h"
/** private data for the \c lcdm001 driver */
@@ -72,8 +54,6 @@ typedef struct lcdm001_private_data {
int fd;
int speed;
char icon_char;
char pause_key;
char back_key;
char forward_key;
@@ -81,23 +61,32 @@ typedef struct lcdm001_private_data {
char *framebuf;
int width;
int height;
} PrivateData;
int width, height;
int cellwidth, cellheight;
} PrivateData;
// Vars for the server core
/* Vars for the server core */
MODULE_EXPORT char *api_version = API_VERSION;
MODULE_EXPORT int stay_in_foreground = 0;
MODULE_EXPORT int supports_multiple = 0;
MODULE_EXPORT char *symbol_prefix = "lcdm001_";
/* Local function prototypes */
static void lcdm001_cursorblink(Driver *drvthis, int on);
static char lcdm001_parse_keypad_setting(Driver *drvthis, char * keyname, char * default_value);
// Parse one key from the configfile
static char lcdm001_parse_keypad_setting(Driver *drvthis, char * keyname, char * default_value)
/**
* Parse one key from the configfile.
* \param drvthis Pointer to driver
* \param keyname Name of the key in config file
* \param default_value Default key value to assign if keyname does not exist.
* \return The key character that will be assigned if the key on the device is
* pressed.
*/
static char
lcdm001_parse_keypad_setting(Driver *drvthis, char * keyname, char * default_value)
{
char return_val = 0;
@@ -125,7 +114,11 @@ static char lcdm001_parse_keypad_setting(Driver *drvthis, char * keyname, char *
return return_val;
}
/* Set cursorblink on/off */
/**
* Turn cursor blinking on or off.
* \param drvthis Pointer to driver structure.
* \param on Integer: 0 to turn off blinking, 1 to turn on blinking.
*/
static void
lcdm001_cursorblink(Driver *drvthis, int on)
{
@@ -141,11 +134,8 @@ lcdm001_cursorblink(Driver *drvthis, int on)
}
/* TODO: Get lcd.framebuf to properly work as whatever driver is running...*/
/*********************************************************************
* init() should set up any device-specific stuff, and
* point all the function pointers.
/**
* API: Set up any device-specific stuff.
*/
MODULE_EXPORT int
lcdm001_init (Driver *drvthis)
@@ -162,7 +152,6 @@ lcdm001_init (Driver *drvthis)
/* initialize private data */
p->speed = B38400;
p->icon_char = '@';
p->pause_key = DOWN_KEY;
p->back_key = LEFT_KEY;
p->forward_key = RIGHT_KEY;
@@ -170,6 +159,8 @@ lcdm001_init (Driver *drvthis)
p->framebuf = NULL;
p->width = LCD_DEFAULT_WIDTH;
p->height = LCD_DEFAULT_HEIGHT;
p->cellwidth = LCD_DEFAULT_CELLWIDTH;
p->cellheight = LCD_DEFAULT_CELLHEIGHT;
debug(RPT_INFO, "LCDM001: init(%p)", drvthis);
@@ -180,20 +171,20 @@ lcdm001_init (Driver *drvthis)
}
memset(p->framebuf, ' ', p->width * p->height);
// READ CONFIG FILE:
/* READ CONFIG FILE: */
// which serial device should be used
/* which serial device should be used */
strncpy(p->device, drvthis->config_get_string(drvthis->name, "Device", 0, "/dev/lcd"), sizeof(p->device));
p->device[sizeof(p->device)-1] = '\0';
report(RPT_INFO, "%s: using Device %s", drvthis->name, p->device);
// keypad settings
/* keypad settings */
p->pause_key = lcdm001_parse_keypad_setting(drvthis, "PauseKey", "DownKey");
p->back_key = lcdm001_parse_keypad_setting(drvthis, "BackKey", "LeftKey");
p->forward_key = lcdm001_parse_keypad_setting(drvthis, "ForwardKey", "RightKey");
p->main_menu_key = lcdm001_parse_keypad_setting(drvthis, "MainMenuKey", "UpKey");
// Set up io port correctly, and open it...
/* Set up io port correctly, and open it... */
debug(RPT_DEBUG, "%s: opening serial device: %s", __FUNCTION__, p->device);
p->fd = open(p->device, O_RDWR | O_NOCTTY | O_NDELAY);
if (p->fd == -1) {
@@ -224,23 +215,22 @@ lcdm001_init (Driver *drvthis)
tcsetattr(p->fd, TCSANOW, &portset);
tcflush(p->fd, TCIOFLUSH);
// Reset and clear the LCDM001
/* Reset and clear the LCDM001 */
write(p->fd, "~C", 2);
//Set cursorblink default
/* Set cursorblink default */
lcdm001_cursorblink(drvthis, DEFAULT_CURSORBLINK);
// Turn all LEDs off
/* Turn all LEDs off */
lcdm001_output(drvthis, 0);
report(RPT_DEBUG, "%s: init() done", drvthis->name);
report(RPT_INFO, "%s: init() done", drvthis->name);
return 0;
}
/* Below here, you may use either lcd.framebuf or driver->framebuf..
* lcd.framebuf will be set to the appropriate buffer before calling
* your driver.
*/
/**
* API: Cleanup all data structures and close device.
*/
MODULE_EXPORT void
lcdm001_close (Driver *drvthis)
{
@@ -252,10 +242,10 @@ lcdm001_close (Driver *drvthis)
p->framebuf = NULL;
if (p->fd >= 0) {
//switch off all LEDs
/* switch off all LEDs */
lcdm001_output(drvthis, 0);
close(p->fd);
}
}
p->fd = -1;
free(p);
@@ -265,9 +255,9 @@ lcdm001_close (Driver *drvthis)
report(RPT_INFO, "%s: closed", drvthis->name);
}
/////////////////////////////////////////////////////////////////
// Returns the display width
//
/**
* API: Returns the display width
*/
MODULE_EXPORT int
lcdm001_width (Driver *drvthis)
{
@@ -276,9 +266,9 @@ lcdm001_width (Driver *drvthis)
return p->width;
}
/////////////////////////////////////////////////////////////////
// Returns the display height
//
/**
* API: Returns the display height
*/
MODULE_EXPORT int
lcdm001_height (Driver *drvthis)
{
@@ -287,49 +277,44 @@ lcdm001_height (Driver *drvthis)
return p->height;
}
/////////////////////////////////////////////////////////////////
// Clears the LCD screen
//
/**
* API: Clears the internal frame buffer. Does not clear display screen
* immediately as it only makes the display flicker.
*/
MODULE_EXPORT void
lcdm001_clear (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
memset(p->framebuf, ' ', p->width * p->height);
/* instant clear is NOT neccessary, it only makes the display flicker */
//write(fd, "~C", 2);
debug(RPT_DEBUG, "LCDM001: cleared screen");
}
//////////////////////////////////////////////////////////////////
// Flushes all output to the lcd...
//
/**
* API: Flushes all output to the lcd...
*/
MODULE_EXPORT void
lcdm001_flush (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
//TODO: Check whether this is still correct
/* TODO: Check whether this is still correct */
write(p->fd, p->framebuf, p->width * p->height);
debug(RPT_DEBUG, "LCDM001: frame buffer flushed");
debug(RPT_DEBUG, "LCDM001: frame buffer flushed");
}
/////////////////////////////////////////////////////////////////
// Prints a character on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
/**
* API: Prints a character on the lcd display, at position (x,y). The
* upper-left is (1,1), and the lower right should be (20,4).
*/
MODULE_EXPORT void
lcdm001_chr (Driver *drvthis, int x, int y, char c)
{
PrivateData *p = drvthis->private_data;
if (c == '\0')
c = p->icon_char; //heartbeat workaround
y--; x--; // translate to 0-coords
y--; x--; /* translate to 0-coords */
if ((x >= 0) && (y >= 0) && (x < p->width) && (y < p->height))
p->framebuf[(y * p->width) + x] = c;
@@ -337,31 +322,36 @@ lcdm001_chr (Driver *drvthis, int x, int y, char c)
debug(RPT_DEBUG, "LCDM001: writing character %02X to position (%d,%d)", c, x, y);
}
/////////////////////////////////////////////////////////////////
// Prints a string on the lcd display, at position (x,y). The
// upper-left is (1,1), and the lower right should be (20,4).
//
/**
* API: Prints a string on the lcd display, at position (x,y). The
* upper-left is (1,1), and the lower right should be (20,4).
*/
MODULE_EXPORT void
lcdm001_string (Driver *drvthis, int x, int y, const char string[])
{
PrivateData *p = drvthis->private_data;
int i;
x--; y--; // Convert 1-based coords to 0-based...
x--; y--; /* Convert 1-based coords to 0-based... */
if ((y < 0) || (y >= p->height))
return;
for (i = 0; (string[i] != '\0') && (x < p->width); i++, x++) {
if (x >= 0) // no write left of left border
if (x >= 0) /* no write left of left border */
p->framebuf[(y * p->width) + x] = string[i];
}
debug(RPT_DEBUG, "LCDM001: printed string at (%d,%d)", x, y);
}
/////////////////////////////////////////////////////////////////
// Controls LEDs
/**
* API: Controls LEDs.
* \param drvthis Pointer to driver
* \param state LED state
*
* \todo Document LED state.
*/
MODULE_EXPORT void
lcdm001_output (Driver *drvthis, int state)
{
@@ -376,91 +366,79 @@ lcdm001_output (Driver *drvthis, int state)
debug(RPT_DEBUG, "LCDM001: current LED state %d", state);
}
/////////////////////////////////////////////////////////////////
// Draws a vertical bar, from the bottom of the screen up.
//
/**
* API: Draws a vertical bar, from the bottom of the screen up.
*/
MODULE_EXPORT void
lcdm001_old_vbar(Driver *drvthis, int x, int len)
lcdm001_vbar (Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = drvthis->private_data;
int y = p->height;
int pixels = ((long) 2 * len * p->cellheight) * promille / 2000;
debug(RPT_DEBUG , "LCDM001: vertical bar at %d set to %d", x, len);
if ((x <= 0) || (x > p->width) || (y <= 0) || (y > p->height))
return;
while (len >= LCD_DEFAULT_CELLHEIGHT) {
debug(RPT_DEBUG , "LCDM001: vertical bar at %d set to %d", x, pixels);
while (y > 0 && pixels >= p->cellheight) {
lcdm001_chr(drvthis, x, y, 0xFF);
len -= LCD_DEFAULT_CELLHEIGHT;
pixels -= p->cellheight;
y--;
}
if (!len)
return;
//TODO: Distinguish between len>=4 and len<4
}
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar to the right.
//
/**
* API: Draws a horizontal bar to the right.
*/
MODULE_EXPORT void
lcdm001_old_hbar(Driver *drvthis, int x, int y, int len)
lcdm001_hbar (Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = drvthis->private_data;
int pixels = ((long) 2 * len * p->cellwidth) * promille / 2000;
if ((y <= 0) || (y > p->height))
if ((x <= 0) || (y <= 0) || (y > p->height))
return;
debug(RPT_DEBUG, "LCDM001: horizontal bar at %d set to %d", x, len);
//TODO: Improve this function
while ((x <= p->width) && (len > 0)) {
if (len < LCD_DEFAULT_CELLWIDTH) {
//lcdm001_chr(x, y, 0x98 + len);
break;
}
debug(RPT_DEBUG, "LCDM001: horizontal bar at %d set to %d", x, pixels);
while (x <= p->width && pixels >= p->cellwidth) {
lcdm001_chr(drvthis, x, y, 0xFF);
len -= LCD_DEFAULT_CELLWIDTH;
pixels -= p->cellwidth;
x++;
}
return;
}
/////////////////////////////////////////////////////////////////
// Sets character 0 to an icon...
//
MODULE_EXPORT void
lcdm001_old_icon (Driver *drvthis, int which, char dest)
/**
* API: Place an icon on the screen. As this driver does not support custom
* characters only generic icons from core are supported. The heartbeat
* icons however are replaced with some different characters.
*/
MODULE_EXPORT int
lcdm001_icon (Driver *drvthis, int x, int y, int icon)
{
PrivateData *p = drvthis->private_data;
switch (icon) {
case ICON_HEART_OPEN:
lcdm001_chr(drvthis, x, y, LCDM001_OPEN_HEART);
break;
case ICON_HEART_FILLED:
lcdm001_chr(drvthis, x, y, LCDM001_FILLED_HEART);
break;
default:
return -1; /* Let the core do the other */
}
/*Heartbeat workaround:
As custom chars are not supported OPEN_HEART
and FILLED_HEART are displayed instead.
Change them in lcdm001.h*/
if (dest == 0)
switch (which) {
case 0:
p->icon_char = OPEN_HEART;
break;
case 1:
p->icon_char = FILLED_HEART;
break;
default:
p->icon_char = PAD;
break;
}
return 0;
}
//////////////////////////////////////////////////////////////////////
// Tries to read a character from an input device...
//
// Return NULL for "nothing available".
//
/**
* API: Tries to read a character from an input device...
*
* \return NULL for "nothing available" or one of the fixed strings "Enter",
* "Left", "Right", or "Escape".
*/
MODULE_EXPORT const char *
lcdm001_get_key (Driver *drvthis)
{
+31 -41
View File
@@ -1,38 +1,29 @@
/* This is the header file of the LCDproc driver for
the "LCDM001" device from kernelconcepts.de
Copyright (C) 2001 Rene Wagner <reenoo@gmx.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */
/* This driver is mostly based on the MtxOrb driver.
See the file MtxOrb.c for copyright details */
/* The heartbeat workaround has been taken from the curses driver
See the file curses_drv.c for copyright details */
/**
* This is the header file of the LCDproc driver for the "LCDM001" device from
* kernelconcepts.de
*/
/*-
* Copyright (C) 2001 Rene Wagner <reenoo@gmx.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
#ifndef LCDM001_H
#define LCDM001_H
/********************************************************************
lcdm001.h
******************************************************************/
/* REMOVE: I don't thing this is actualy needed. */
/* extern lcd_logical_driver *lcdm001; */
MODULE_EXPORT int lcdm001_init (Driver *drvthis);
MODULE_EXPORT void lcdm001_close (Driver *drvthis);
MODULE_EXPORT int lcdm001_width (Driver *drvthis);
@@ -42,24 +33,23 @@ MODULE_EXPORT void lcdm001_flush (Driver *drvthis);
MODULE_EXPORT void lcdm001_string (Driver *drvthis, int x, int y, const char string[]);
MODULE_EXPORT void lcdm001_chr (Driver *drvthis, int x, int y, char c);
MODULE_EXPORT void lcdm001_old_vbar (Driver *drvthis, int x, int len);
MODULE_EXPORT void lcdm001_old_hbar (Driver *drvthis, int x, int y, int len);
MODULE_EXPORT void lcdm001_vbar (Driver *drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void lcdm001_hbar (Driver *drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void lcdm001_num (Driver *drvthis, int x, int num);
MODULE_EXPORT void lcdm001_old_icon (Driver *drvthis, int which, char dest);
MODULE_EXPORT int lcdm001_icon (Driver *drvthis, int x, int y, int icon);
MODULE_EXPORT void lcdm001_output (Driver *drvthis, int on);
MODULE_EXPORT char lcdm001_getkey (Driver *drvthis);
#define DEFAULT_DEVICE "/dev/lcd"
#define DEFAULT_CURSORBLINK 0
#define DEFAULT_CURSORBLINK 0 /* cursor blinking off */
/*Heartbeat workaround
set chars to be displayed instead of "normal" icons*/
#define OPEN_HEART ' ' /* This combination is at least visible */
#define FILLED_HEART '*'
#define PAD 255
/*
* Use our own chars for the heartbeat instead of core's default. This
* combination is at least visible.
*/
#define LCDM001_OPEN_HEART ' '
#define LCDM001_FILLED_HEART '*'
#define LEFT_KEY '1'
#define RIGHT_KEY '2'
+83 -67
View File
@@ -29,7 +29,6 @@
#include <fcntl.h>
#include <string.h>
#include <errno.h>
//#include <sys/io.h>
#include <time.h>
#include "port.h"
#include "timing.h"
@@ -102,40 +101,42 @@ MODULE_EXPORT char *symbol_prefix = "stv5730_";
// Translation map ascii->stv5730 charset
unsigned char stv5730_to_ascii[256] =
{ 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x27, 0x0B, 0x27, 0x28,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x26, 0x26,
0x62, 0x78, 0x61, 0x70,
0x6c, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
0x17, 0x18, 0x19, 0x1A,
0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x0B,
0x0B, 0x0B, 0x0B, 0x72,
0x0B, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38,
0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x6E,
0x6C, 0x71, 0x79, 0x7F,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x77
};
{
/* 00 - 7F */
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x29, /* ' */
0x0B, 0x0B, 0x5F, 0x5E, 0x27, 0x0A, 0x27, 0x28, /* * + . - . / */
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0 1 2 3 4 5 6 7 */
0x08, 0x09, 0x26, 0x26, 0x62, 0x78, 0x61, 0x70, /* 8 9 : : « = » ? */
0x6c, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, /* @ A B C D E F G */
0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, /* H I J K L M N O */
0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, /* P Q R S T U V W */
0x23, 0x24, 0x25, 0x0B, 0x0B, 0x0B, 0x0B, 0x72, /* X Y Z _ */
0x0B, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, /* a b c d e f g */
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* h i j k l m n o */
0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, /* p q r s t u v w */
0x41, 0x42, 0x43, 0x6E, 0x6C, 0x71, 0x79, 0x7F, /* x y z # # # # # */
/* 80 - FF */
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B,
0x0B, 0x0B, 0x0B, 0x0B, 0x58, 0x69, 0x0B, 0x0B, /* Ä Å */
0x0B, 0x6B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, /* É */
0x0B, 0x6D, 0x0B, 0x0B, 0x0B, 0x0B, 0x59, 0x0B, /* Ñ Ö */
0x0B, 0x0B, 0x0B, 0x0B, 0x5A, 0x0B, 0x0B, 0x5C, /* Ü ß */
0x44, 0x47, 0x45, 0x0B, 0x46, 0x6A, 0x0B, 0x58, /* à á â ä å ç */
0x49, 0x48, 0x4B, 0x4A, 0x4C, 0x4F, 0x4D, 0x4E, /* è é ê ë ì í î ï */
0x0B, 0x5D, 0x50, 0x53, 0x51, 0x0B, 0x52, 0x0B, /* ñ ò ó ô ö */
0x0B, 0x54, 0x57, 0x55, 0x56, 0x0B, 0x0B, 0x77 /* ù ú û ü # */
};
//static void stv5730_upause(int delayCalls);
@@ -144,7 +145,6 @@ unsigned char stv5730_to_ascii[256] =
/////////////////////////////////////////////////////////////////
// This function returns true if a powered and working STV5730
// hardware is present at p->port
static int
stv5730_detect (unsigned int port)
{
@@ -178,7 +178,6 @@ stv5730_is_mute (unsigned int port)
// this family of functions write commands or data to the stv5730
// 8 bit writes repeat the high byte, 0 byte writes repeat the last
// written word
static void
stv5730_write16bit (unsigned int port, unsigned int flags, unsigned int value)
{
@@ -571,49 +570,53 @@ stv5730_num (Driver *drvthis, int x, int num)
}
/////////////////////////////////////////////////////////////////
// Draws a vertical bar from the bottom up to the last 7 rows of the
// framebuffer at 1-based position x. len is given in pixels.
// Draws a vertical bar from the bottom up at 1-based position x.
//
MODULE_EXPORT void
stv5730_old_vbar (Driver *drvthis, int x, int len)
stv5730_vbar(Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = drvthis->private_data;
int i;
int i; /* number of pixels drawn */
int pixels;
x--;
if (x < 0 || len < 0 || (len / 6) >= STV5730_WID)
if (x < 0 || len < 0 || (len) >= STV5730_HGT)
return;
for (i = 0; i <= len; i += 6) {
if (len >= (i + 6)) /* 6 = cellheight */
pixels = ((long) 2 * len * 6) * promille / 2000;
for (i = 0; i <= pixels; i += 6) {
if (pixels >= (i + 6)) /* 6 = cellheight */
p->framebuf[((10 - (i / 6)) * STV5730_WID) + x] = 0x77;
else
p->framebuf[((10 - (i / 6)) * STV5730_WID) + x] = 0x72 + (len % 6);
p->framebuf[((10 - (i / 6)) * STV5730_WID) + x] = 0x72 + (pixels % 6);
}
}
/////////////////////////////////////////////////////////////////
// Draws a horizontal bar from left to right at 1-based position
// x,y into the framebuffer. len is given in pixels.
// x,y into the framebuffer.
// It uses the STV5730 'channel-tuning' chars(0x64-0x68) to do
// this.
MODULE_EXPORT void
stv5730_old_hbar (Driver *drvthis, int x, int y, int len)
stv5730_hbar (Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = drvthis->private_data;
int i;
int pixels;
x--;
y--;
if (y < 0 || y >= STV5730_HGT || x < 0 || len < 0
|| (x + (len / 5)) >= STV5730_WID)
if (y < 0 || y >= STV5730_HGT || x < 0 || len < 0 || (x + len) >= STV5730_WID)
return;
for (i = 0; i <= len; i += 5) {
if (len >= (i + 4)) /* 4 = cellwidth */
pixels = ((long) 2 * len * 4) * promille / 2000;
for (i = 0; i <= pixels; i += 5) {
if (pixels >= (i + 4)) /* 4 = cellwidth */
p->framebuf[(y * STV5730_WID) + x + (i / 5)] = 0x64;
else
p->framebuf[(y * STV5730_WID) + x + (i / 5)] = 0x65 + (len % 5);
@@ -626,23 +629,36 @@ stv5730_old_hbar (Driver *drvthis, int x, int y, int len)
// The STV5730 has no programmable chars. The charset is very
// limited, it doesn't even contain a '%' char. But wait...
// It contains a heartbeat char ! :-)
MODULE_EXPORT void
stv5730_old_icon (Driver *drvthis, int which, char dest)
MODULE_EXPORT int
stv5730_icon(Driver *drvthis, int x, int y, int icon)
{
//PrivateData *p = drvthis->private_data;
PrivateData *p = drvthis->private_data;
switch (which) {
case 0: // 0:empty Heart
stv5730_to_ascii[(int) dest] = 0x71;
break;
case 1: // 1:Filled Heart
stv5730_to_ascii[(int) dest] = 0x0B;
break;
case 2: // 2:Ellipsis
stv5730_to_ascii[(int) dest] = 0x5F;
break;
switch (icon) {
case ICON_BLOCK_FILLED:
p->framebuf[(y * STV5730_WID) + x] = 0x77;
break;
case ICON_HEART_OPEN:
p->framebuf[(y * STV5730_WID) + x] = 0x0B;
break;
case ICON_HEART_FILLED:
p->framebuf[(y * STV5730_WID) + x] = 0x71;
break;
case ICON_ARROW_UP:
p->framebuf[(y * STV5730_WID) + x] = 0x7C;
break;
case ICON_ARROW_DOWN:
p->framebuf[(y * STV5730_WID) + x] = 0x7D;
break;
case ICON_ARROW_LEFT:
p->framebuf[(y * STV5730_WID) + x] = 0x7B;
break;
case ICON_ARROW_RIGHT:
p->framebuf[(y * STV5730_WID) + x] = 0x7A;
break;
default:
stv5730_to_ascii[(int) dest] = 0x0B;
break;
}
return -1; /* Let the core do the others */
}
return 0;
}
+3 -5
View File
@@ -1,8 +1,6 @@
#ifndef STV5730_H
#define STV5730_H
#include "lcd.h"
MODULE_EXPORT int stv5730_init (Driver *drvthis);
MODULE_EXPORT void stv5730_close (Driver *drvthis);
MODULE_EXPORT int stv5730_width (Driver *drvthis);
@@ -13,9 +11,9 @@ MODULE_EXPORT void stv5730_clear (Driver *drvthis);
MODULE_EXPORT void stv5730_flush (Driver *drvthis);
MODULE_EXPORT void stv5730_string (Driver *drvthis, int x, int y, const char string[]);
MODULE_EXPORT void stv5730_chr (Driver *drvthis, int x, int y, char c);
MODULE_EXPORT void stv5730_old_vbar (Driver *drvthis, int x, int len);
MODULE_EXPORT void stv5730_old_hbar (Driver *drvthis, int x, int y, int len);
MODULE_EXPORT void stv5730_vbar(Driver *drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void stv5730_hbar (Driver *drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void stv5730_num (Driver *drvthis, int x, int num);
MODULE_EXPORT void stv5730_old_icon (Driver *drvthis, int which, char dest);
MODULE_EXPORT int stv5730_icon(Driver *drvthis, int x, int y, int icon);
#endif