update lis driver (Daryl F)
This commit is contained in:
@@ -422,10 +422,10 @@ Speed=19200
|
|||||||
# Select what type of connection. See documentation for types.
|
# Select what type of connection. See documentation for types.
|
||||||
ConnectionType=4bit
|
ConnectionType=4bit
|
||||||
|
|
||||||
# Port where the LPT is. Usual values are 0x278, 0x378 and 0x3BC
|
# Port where the LPT is [ususal: 0x278, 0x378 and 0x3BC]
|
||||||
Port=0x378
|
Port=0x378
|
||||||
|
|
||||||
# Device of the serial interface (default is /dev/lcd)
|
# Device of the serial interface [default: /dev/lcd]
|
||||||
Device=/dev/ttyS0
|
Device=/dev/ttyS0
|
||||||
|
|
||||||
# Bitrate of the serial port (0 for interface default)
|
# Bitrate of the serial port (0 for interface default)
|
||||||
@@ -626,14 +626,16 @@ Size=16x2
|
|||||||
# 0-250 = 25%, 251-500 = 50%, 501-750 = 75%, 751-1000 = 100%
|
# 0-250 = 25%, 251-500 = 50%, 501-750 = 75%, 751-1000 = 100%
|
||||||
#Brightness=1000
|
#Brightness=1000
|
||||||
|
|
||||||
# Columns by lines (default 20x2)
|
# Columns by lines [default: 20x2]
|
||||||
#Size=20x2
|
#Size=20x2
|
||||||
|
|
||||||
# USB Vendor ID (default 0x0403)
|
# USB Vendor ID [default: 0x0403]
|
||||||
VendorID=0x0403
|
# Change only if testing a compatible device.
|
||||||
|
#VendorID=0x0403
|
||||||
|
|
||||||
# USB Product ID (default 0x6001
|
# USB Product ID [default: 0x6001]
|
||||||
ProductID=0x6001
|
# Change only if testing a compatible device.
|
||||||
|
#ProductID=0x6001
|
||||||
|
|
||||||
|
|
||||||
##The driver for the VFD of the Medion MD8800 PC ##
|
##The driver for the VFD of the Medion MD8800 PC ##
|
||||||
|
|||||||
@@ -74,10 +74,18 @@ can be done by specifying "--enable-drivers=all" or by
|
|||||||
<replaceable>VENDORID</replaceable>
|
<replaceable>VENDORID</replaceable>
|
||||||
</arg>
|
</arg>
|
||||||
</term>
|
</term>
|
||||||
<listitem><para>
|
<listitem>
|
||||||
USB Vendor ID
|
<para>
|
||||||
[default: <literal>0x0403</literal>].
|
The USB Vendor ID of the device to use.
|
||||||
</para></listitem>
|
If not given, it defaults to <literal>0x0403</literal> for a VLSystems L.I.S. MCE 2005 VFD
|
||||||
|
based on a FT232BL USB-to-RS232 converter by FTDIi, which was produced
|
||||||
|
before March 2007.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
It is usually not necessary to specify a <replaceable>VENDORID</replaceable>.
|
||||||
|
Please do so only if you want to test a compatible device.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
@@ -86,10 +94,18 @@ can be done by specifying "--enable-drivers=all" or by
|
|||||||
<replaceable>PRODUCTID</replaceable>
|
<replaceable>PRODUCTID</replaceable>
|
||||||
</arg>
|
</arg>
|
||||||
</term>
|
</term>
|
||||||
<listitem><para>
|
<listitem>
|
||||||
USB Product ID
|
<para>
|
||||||
[default: <literal>0x6001</literal>].
|
The USB Product ID of the device to use.
|
||||||
</para></listitem>
|
If not given, it defaults to <literal>0x6001</literal> for a VLSystems L.I.S. MCE 2005 VFD
|
||||||
|
based on a FT232BL USB-to-RS232 converter by FTDIi, which was produced
|
||||||
|
before March 2007.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
It is usually not necessary to specify a <replaceable>PRODUCTID</replaceable>.
|
||||||
|
Please do so only if you want to test a compatible device.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ IOWarrior_LDADD = @libusb_libs@ libLCD.a libbignum.a
|
|||||||
irman_LDADD = @LIBIRMAN@
|
irman_LDADD = @LIBIRMAN@
|
||||||
lcterm_LDADD = libLCD.a
|
lcterm_LDADD = libLCD.a
|
||||||
lirc_LDADD = @LIBLIRC_CLIENT@
|
lirc_LDADD = @LIBLIRC_CLIENT@
|
||||||
lis_LDADD = libLCD.a @LIBFTDI@
|
lis_LDADD = libLCD.a @LIBFTDI@ libbignum.a
|
||||||
MD8800_LDADD = libLCD.a
|
MD8800_LDADD = libLCD.a
|
||||||
mtc_s16209x_LDADD = libLCD.a
|
mtc_s16209x_LDADD = libLCD.a
|
||||||
MtxOrb_LDADD = libLCD.a libbignum.a
|
MtxOrb_LDADD = libLCD.a libbignum.a
|
||||||
|
|||||||
+285
-168
@@ -8,6 +8,7 @@
|
|||||||
* sure kernel module ftdi_sio doesn't claim the device.
|
* sure kernel module ftdi_sio doesn't claim the device.
|
||||||
*
|
*
|
||||||
* Based on: ula200 driver Copyright (C) 2006, Bernhard Walle
|
* Based on: ula200 driver Copyright (C) 2006, Bernhard Walle
|
||||||
|
* IOWarrior driver Copyright(C) 2004-2006 Peter Marschall <peter@adpm.de>
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007, Daryl Fonseca-Holt <wyatt@prairieturtle.ca>
|
* Copyright (c) 2007, Daryl Fonseca-Holt <wyatt@prairieturtle.ca>
|
||||||
*
|
*
|
||||||
@@ -41,6 +42,9 @@
|
|||||||
* lis_cellheight() and lis_cellwidth().
|
* lis_cellheight() and lis_cellwidth().
|
||||||
* Completely commented out lis_test() to
|
* Completely commented out lis_test() to
|
||||||
* save memory.
|
* save memory.
|
||||||
|
* 2007/05/30 Remove set_custom_chars(). Implement
|
||||||
|
* lis_set_chars(), lis_vbar(), lis_hbar()
|
||||||
|
* and lis_num() using helper functions.
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -64,9 +68,10 @@
|
|||||||
#include "lis.h"
|
#include "lis.h"
|
||||||
#include "report.h"
|
#include "report.h"
|
||||||
#include "lcd_lib.h"
|
#include "lcd_lib.h"
|
||||||
|
#include "adv_bignum.h"
|
||||||
#include "timing.h"
|
#include "timing.h"
|
||||||
|
|
||||||
// void lis_test(Driver *drvthis);
|
//void lis_test(Driver *drvthis);
|
||||||
|
|
||||||
/* Vars for the server core */
|
/* Vars for the server core */
|
||||||
MODULE_EXPORT char *api_version = API_VERSION;
|
MODULE_EXPORT char *api_version = API_VERSION;
|
||||||
@@ -133,9 +138,42 @@ const unsigned char UPD16314_charmap[] = {
|
|||||||
224, 225, 226, 227, 228, 229, 230, 231,
|
224, 225, 226, 227, 228, 229, 230, 231,
|
||||||
232, 233, 234, 235, 237, 237, 238, 239,
|
232, 233, 234, 235, 237, 237, 238, 239,
|
||||||
240, 241, 242, 243, 244, 245, 246, 247,
|
240, 241, 242, 243, 244, 245, 246, 247,
|
||||||
248, 249, 250, 251, 252, 253, 254, 3
|
248, 249, 250, 251, 252, 253, 254, 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////
|
||||||
|
// Cache standard custom chars
|
||||||
|
void
|
||||||
|
lis_standard_custom_chars (Driver *drvthis) {
|
||||||
|
|
||||||
|
PrivateData *p = drvthis->private_data;
|
||||||
|
|
||||||
|
static unsigned char checkbox_gray[] =
|
||||||
|
{ b_______,
|
||||||
|
b_______,
|
||||||
|
b__XXXXX,
|
||||||
|
b__X_X_X,
|
||||||
|
b__XX_XX,
|
||||||
|
b__X_X_X,
|
||||||
|
b__XXXXX,
|
||||||
|
b_______ };
|
||||||
|
|
||||||
|
static unsigned char block_filled[] =
|
||||||
|
{ b__XXXXX,
|
||||||
|
b__XXXXX,
|
||||||
|
b__XXXXX,
|
||||||
|
b__XXXXX,
|
||||||
|
b__XXXXX,
|
||||||
|
b__XXXXX,
|
||||||
|
b__XXXXX,
|
||||||
|
b__XXXXX };
|
||||||
|
|
||||||
|
lis_set_char(drvthis, 1, block_filled);
|
||||||
|
lis_set_char(drvthis, 2, checkbox_gray);
|
||||||
|
|
||||||
|
p->ccmode = standard;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Write a command to the display.
|
// Write a command to the display.
|
||||||
@@ -203,120 +241,43 @@ lis_flush(Driver *drvthis)
|
|||||||
{
|
{
|
||||||
PrivateData *p = (PrivateData *) drvthis->private_data;
|
PrivateData *p = (PrivateData *) drvthis->private_data;
|
||||||
|
|
||||||
int line;
|
int line, err, i, count;
|
||||||
|
unsigned char buffer[65];
|
||||||
|
|
||||||
|
// see if any custom characters changed
|
||||||
|
for (i = 0, count = 0; i < NUM_CCs; i++) {
|
||||||
|
if ( ! p->cc[i].clean ) {
|
||||||
|
count++;
|
||||||
|
p->cc[i].clean++; // mark clean
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count) {
|
||||||
|
// flush custom characters to device
|
||||||
|
buffer[0] = 0xAD; // command to write CGRAM at 0
|
||||||
|
for (i = 0; i < NUM_CCs; i++) {
|
||||||
|
memcpy(buffer + 1 + (i*CELLHEIGHT), p->cc[i].cache, CELLHEIGHT);
|
||||||
|
}
|
||||||
|
err = lis_ftdi_write_command(drvthis, buffer, sizeof(buffer));
|
||||||
|
if (err < 0) {
|
||||||
|
report(RPT_WARNING, "%s: lis_flush(): "
|
||||||
|
"lis_ftdi_write_command() failed", drvthis->name);
|
||||||
|
}
|
||||||
|
report(RPT_DEBUG, "Flushed %d custom chars that changed", count);
|
||||||
|
timing_uPause(16000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// write any line that has a change in it
|
||||||
for (line = 0; line < p->height; line++) {
|
for (line = 0; line < p->height; line++) {
|
||||||
if (p->line_flags[line]) {
|
if (p->line_flags[line]) {
|
||||||
|
report(RPT_DEBUG, "Flushing line %d", line+1);
|
||||||
lis_ftdi_line_to_display(drvthis, line+1, p->framebuf + (line * p->width), p->width);
|
lis_ftdi_line_to_display(drvthis, line+1, p->framebuf + (line * p->width), p->width);
|
||||||
p->line_flags[line] = 0; // clean
|
p->line_flags[line] = 0; // clean
|
||||||
|
timing_uPause(16000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Loads custom characters in the display
|
|
||||||
//
|
|
||||||
static int
|
|
||||||
lis_load_custom_chars(Driver *drvthis)
|
|
||||||
{
|
|
||||||
PrivateData *p = (PrivateData *) drvthis->private_data;
|
|
||||||
int i, col, row, err;
|
|
||||||
unsigned char buffer[65];
|
|
||||||
char custom_chars[8][CELLHEIGHT*CELLHEIGHT] = {
|
|
||||||
{ 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0 },
|
|
||||||
{ 1, 0, 0, 0, 0, /* 1-5 characters used by hbar() */
|
|
||||||
1, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0,
|
|
||||||
1, 0, 0, 0, 0 },
|
|
||||||
{ 1, 1, 0, 0, 0,
|
|
||||||
1, 1, 0, 0, 0,
|
|
||||||
1, 1, 0, 0, 0,
|
|
||||||
1, 1, 0, 0, 0,
|
|
||||||
1, 1, 0, 0, 0,
|
|
||||||
1, 1, 0, 0, 0,
|
|
||||||
1, 1, 0, 0, 0,
|
|
||||||
1, 1, 0, 0, 0 },
|
|
||||||
{ 1, 1, 1, 0, 0,
|
|
||||||
1, 1, 1, 0, 0,
|
|
||||||
1, 1, 1, 0, 0,
|
|
||||||
1, 1, 1, 0, 0,
|
|
||||||
1, 1, 1, 0, 0,
|
|
||||||
1, 1, 1, 0, 0,
|
|
||||||
1, 1, 1, 0, 0,
|
|
||||||
1, 1, 1, 0, 0 },
|
|
||||||
{ 1, 1, 1, 1, 0,
|
|
||||||
1, 1, 1, 1, 0,
|
|
||||||
1, 1, 1, 1, 0,
|
|
||||||
1, 1, 1, 1, 0,
|
|
||||||
1, 1, 1, 1, 0,
|
|
||||||
1, 1, 1, 1, 0,
|
|
||||||
1, 1, 1, 1, 0,
|
|
||||||
1, 1, 1, 1, 0 },
|
|
||||||
{ 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1 },
|
|
||||||
{ 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
1, 0, 0, 0, 1,
|
|
||||||
1, 0, 0, 0, 1,
|
|
||||||
1, 0, 0, 0, 1,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
0, 0, 0, 0, 0 },
|
|
||||||
{ 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
1, 0, 1, 0, 1,
|
|
||||||
1, 1, 0, 1, 1,
|
|
||||||
1, 0, 1, 0, 1,
|
|
||||||
1, 1, 1, 1, 1,
|
|
||||||
0, 0, 0, 0, 0 }};
|
|
||||||
|
|
||||||
buffer[0] = 0xAD; // command to write CGRAM at 0
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* build the buffer */
|
|
||||||
for (row = 0; row < CELLHEIGHT; row++) {
|
|
||||||
unsigned char value = 0;
|
|
||||||
|
|
||||||
for (col = 0; col < CELLWIDTH; col++) {
|
|
||||||
value <<= 1;
|
|
||||||
value |= (custom_chars[i][(row * CELLWIDTH) + col] > 0) ? 1 : 0;
|
|
||||||
}
|
|
||||||
buffer[(i*8)+row+1] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = lis_ftdi_write_command(drvthis, buffer, 65);
|
|
||||||
if (err < 0) {
|
|
||||||
report(RPT_WARNING, "%s: lis_load_custom_chars(): "
|
|
||||||
"lis_ftdi_write_command() failed", drvthis->name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
p->cc_flag = 1;
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// Separate thread to keep a read up on the USB device at all times
|
// Separate thread to keep a read up on the USB device at all times
|
||||||
int
|
int
|
||||||
@@ -353,8 +314,12 @@ lis_set_brightness(Driver *drvthis, int state, int promille)
|
|||||||
int err;
|
int err;
|
||||||
PrivateData *p = (PrivateData *) drvthis->private_data;
|
PrivateData *p = (PrivateData *) drvthis->private_data;
|
||||||
|
|
||||||
if (promille < 0 || promille > 1000)
|
if (promille < 0 || promille > 1000) {
|
||||||
|
report(RPT_WARNING, "%s: invalid brightness %d less then 0 or greater than 1000",
|
||||||
|
drvthis->name, promille);
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
buffer[0] = 0xA5;
|
buffer[0] = 0xA5;
|
||||||
if ( promille < 251 )
|
if ( promille < 251 )
|
||||||
@@ -373,6 +338,10 @@ lis_set_brightness(Driver *drvthis, int state, int promille)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
p->brightness = promille;
|
p->brightness = promille;
|
||||||
|
|
||||||
|
report(RPT_DEBUG, "%s: brightness set to %d",
|
||||||
|
drvthis->name, promille);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -383,6 +352,9 @@ lis_get_brightness(Driver *drvthis, int state)
|
|||||||
{
|
{
|
||||||
PrivateData *p = (PrivateData *) drvthis->private_data;
|
PrivateData *p = (PrivateData *) drvthis->private_data;
|
||||||
|
|
||||||
|
report(RPT_DEBUG, "%s: brightness query returns %d",
|
||||||
|
drvthis->name, p->brightness);
|
||||||
|
|
||||||
return p->brightness;
|
return p->brightness;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,6 +370,8 @@ lis_init(Driver *drvthis)
|
|||||||
unsigned char buffer[64], *thread_stack;
|
unsigned char buffer[64], *thread_stack;
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
|
report(RPT_DEBUG, "%s: Initializing driver",
|
||||||
|
drvthis->name);
|
||||||
// Alocate and store private data
|
// Alocate and store private data
|
||||||
p = (PrivateData *) malloc( sizeof( PrivateData) );
|
p = (PrivateData *) malloc( sizeof( PrivateData) );
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
@@ -409,7 +383,8 @@ lis_init(Driver *drvthis)
|
|||||||
|
|
||||||
p->child_flag = 0;
|
p->child_flag = 0;
|
||||||
p->parent_flag = 0;
|
p->parent_flag = 0;
|
||||||
p->cc_flag = 0;
|
p->cellwidth = CELLWIDTH;
|
||||||
|
p->cellheight = CELLHEIGHT;
|
||||||
|
|
||||||
// Get and parse size
|
// Get and parse size
|
||||||
s = drvthis->config_get_string( drvthis->name, "size", 0, "20x2");
|
s = drvthis->config_get_string( drvthis->name, "size", 0, "20x2");
|
||||||
@@ -1158,13 +1133,11 @@ lis_init(Driver *drvthis)
|
|||||||
err = lis_ftdi_write_command(drvthis, buffer, 1);
|
err = lis_ftdi_write_command(drvthis, buffer, 1);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
report(RPT_WARNING, "%s: lis_ftdi_clear: "
|
report(RPT_WARNING, "%s: lis_ftdi_clear: "
|
||||||
"lis_ftdi_write_command failed", drvthis->name);
|
"lis_ftdi_write_command failed", drvthis->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
timing_uPause(10*16000);
|
timing_uPause(10*16000);
|
||||||
|
|
||||||
lis_load_custom_chars(drvthis);
|
|
||||||
|
|
||||||
report(RPT_DEBUG, "%s: init() done", drvthis->name);
|
report(RPT_DEBUG, "%s: init() done", drvthis->name);
|
||||||
|
|
||||||
// lis_test(drvthis); /*DEBUG*/
|
// lis_test(drvthis); /*DEBUG*/
|
||||||
@@ -1196,6 +1169,8 @@ lis_close(Driver *drvthis)
|
|||||||
{
|
{
|
||||||
PrivateData *p = (PrivateData *) drvthis->private_data;
|
PrivateData *p = (PrivateData *) drvthis->private_data;
|
||||||
|
|
||||||
|
report(RPT_DEBUG, "%s: closing driver",
|
||||||
|
drvthis->name);
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
if (p->parent_flag) { // terminate the child
|
if (p->parent_flag) { // terminate the child
|
||||||
p->child_flag = 1;
|
p->child_flag = 1;
|
||||||
@@ -1245,24 +1220,30 @@ lis_clear (Driver *drvthis)
|
|||||||
PrivateData *p = (PrivateData *) drvthis->private_data;
|
PrivateData *p = (PrivateData *) drvthis->private_data;
|
||||||
int line;
|
int line;
|
||||||
|
|
||||||
|
report(RPT_DEBUG, "%s: Clearing display",
|
||||||
|
drvthis->name);
|
||||||
for (line = 0; line < p->height; line++) {
|
for (line = 0; line < p->height; line++) {
|
||||||
memset(p->framebuf + (line * p->width), ' ', p->width);
|
memset(p->framebuf + (line * p->width), ' ', p->width);
|
||||||
p->line_flags[line] = 1;
|
p->line_flags[line] = 1;
|
||||||
}
|
}
|
||||||
p->ccmode = standard;
|
lis_standard_custom_chars(drvthis);
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Place a character in the framebuffer
|
// Place a character in the framebuffer
|
||||||
//
|
//
|
||||||
MODULE_EXPORT void
|
MODULE_EXPORT void
|
||||||
lis_chr (Driver *drvthis, int x, int y, char ch)
|
lis_chr (Driver *drvthis, int x, int y, unsigned char ch)
|
||||||
{
|
{
|
||||||
PrivateData *p = (PrivateData *) drvthis->private_data;
|
PrivateData *p = (PrivateData *) drvthis->private_data;
|
||||||
|
|
||||||
// ignore out-of-range
|
// ignore out-of-range
|
||||||
if (y > p->height || x > p->width)
|
if (y > p->height || x > p->width) {
|
||||||
|
report(RPT_WARNING, "%s: Writing char %x at %d,%d"
|
||||||
|
" ignored out of range %d,%d",
|
||||||
|
drvthis->name, ch, x, y, p->height, p->width);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
y--;
|
y--;
|
||||||
x--;
|
x--;
|
||||||
@@ -1271,6 +1252,8 @@ lis_chr (Driver *drvthis, int x, int y, char ch)
|
|||||||
p->framebuf[ (y * p->width) + x] = ch;
|
p->framebuf[ (y * p->width) + x] = ch;
|
||||||
|
|
||||||
p->line_flags[y] = 1;
|
p->line_flags[y] = 1;
|
||||||
|
report(RPT_DEBUG, "%s: Caching char %x at %d,%d",
|
||||||
|
drvthis->name, ch, x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1286,10 +1269,16 @@ lis_string (Driver *drvthis, int x, int y, char *s)
|
|||||||
x --; // Convert 1-based coords to 0-based
|
x --; // Convert 1-based coords to 0-based
|
||||||
y --;
|
y --;
|
||||||
|
|
||||||
|
report(RPT_DEBUG, "%s: Write string to framebuffer %d,%d \"%s\"",
|
||||||
|
drvthis->name, x, y, s);
|
||||||
|
|
||||||
for (i = 0; s[i]; i++) {
|
for (i = 0; s[i]; i++) {
|
||||||
// Check for buffer overflows...
|
// Check for buffer overflows...
|
||||||
if ((y * p->width) + x + i > (p->width * p->height))
|
if ((y * p->width) + x + i > (p->width * p->height)) {
|
||||||
|
report(RPT_WARNING, "%s: Writing string ignored, out of range",
|
||||||
|
drvthis->name, x, y);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if ( p->framebuf[(y*p->width) + x + i] != s[i] ) {
|
if ( p->framebuf[(y*p->width) + x + i] != s[i] ) {
|
||||||
p->framebuf[(y*p->width) + x + i] = s[i];
|
p->framebuf[(y*p->width) + x + i] = s[i];
|
||||||
@@ -1305,11 +1294,12 @@ lis_string (Driver *drvthis, int x, int y, char *s)
|
|||||||
MODULE_EXPORT int
|
MODULE_EXPORT int
|
||||||
lis_icon (Driver *drvthis, int x, int y, int icon)
|
lis_icon (Driver *drvthis, int x, int y, int icon)
|
||||||
{
|
{
|
||||||
char ch;
|
PrivateData *p = (PrivateData *) drvthis->private_data;
|
||||||
|
unsigned char ch;
|
||||||
|
|
||||||
switch (icon) {
|
switch (icon) {
|
||||||
case ICON_BLOCK_FILLED:
|
case ICON_BLOCK_FILLED:
|
||||||
ch = 0xFF;
|
ch = 0xff;
|
||||||
break;
|
break;
|
||||||
case ICON_HEART_FILLED:
|
case ICON_HEART_FILLED:
|
||||||
ch = 0x9D;
|
ch = 0x9D;
|
||||||
@@ -1336,7 +1326,9 @@ lis_icon (Driver *drvthis, int x, int y, int icon)
|
|||||||
ch = 0xC7;
|
ch = 0xC7;
|
||||||
break;
|
break;
|
||||||
case ICON_CHECKBOX_GRAY:
|
case ICON_CHECKBOX_GRAY:
|
||||||
ch = 7;
|
ch = 2;
|
||||||
|
if (p->ccmode != standard)
|
||||||
|
lis_standard_custom_chars(drvthis);
|
||||||
break;
|
break;
|
||||||
case ICON_STOP:
|
case ICON_STOP:
|
||||||
ch = 0x16;
|
ch = 0x16;
|
||||||
@@ -1368,60 +1360,14 @@ lis_icon (Driver *drvthis, int x, int y, int icon)
|
|||||||
default:
|
default:
|
||||||
return -1; /* Let the core do other icons */
|
return -1; /* Let the core do other icons */
|
||||||
|
|
||||||
lis_chr(drvthis, x, y, ch);
|
|
||||||
}
|
}
|
||||||
|
report(RPT_DEBUG, "%s: Writing icon #%d (%x) @ %d,%d",
|
||||||
|
drvthis->name, icon, ch, x, y);
|
||||||
|
lis_chr(drvthis, x, y, ch);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Draw a horizontal bar
|
|
||||||
//
|
|
||||||
// options ignored
|
|
||||||
// truncates to fit display if needed
|
|
||||||
MODULE_EXPORT void
|
|
||||||
lis_hbar(Driver *drvthis, int x, int y, int len, int promille, int options)
|
|
||||||
{
|
|
||||||
PrivateData *p = (PrivateData *) drvthis->private_data;
|
|
||||||
char buf[p->width+1];
|
|
||||||
int per_pel;
|
|
||||||
char *bp;
|
|
||||||
|
|
||||||
if (! p->cc_flag)
|
|
||||||
lis_load_custom_chars(drvthis);
|
|
||||||
|
|
||||||
if (x + len > p->width)
|
|
||||||
len = p->width - x;
|
|
||||||
|
|
||||||
if (len < 1 || promille < 0 || promille > 1000 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// blank area for bar
|
|
||||||
memset(buf, ' ', len);
|
|
||||||
|
|
||||||
if( promille == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
per_pel = 1000 / (len * CELLWIDTH);
|
|
||||||
|
|
||||||
bp = buf;
|
|
||||||
|
|
||||||
while(promille > per_pel) {
|
|
||||||
if( promille >= per_pel * CELLWIDTH) {
|
|
||||||
*bp = 0x05; // full width
|
|
||||||
promille -= CELLWIDTH*per_pel;
|
|
||||||
} else {
|
|
||||||
*bp = (promille / per_pel);
|
|
||||||
promille = 0;
|
|
||||||
}
|
|
||||||
bp++;
|
|
||||||
}
|
|
||||||
*bp = 0x00;
|
|
||||||
|
|
||||||
lis_string(drvthis, x, y, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
void
|
void
|
||||||
@@ -1435,8 +1381,179 @@ lis_test(Driver *drvthis)
|
|||||||
lis_clear(drvthis);
|
lis_clear(drvthis);
|
||||||
|
|
||||||
for (i = 0; i < 1001; i++) {
|
for (i = 0; i < 1001; i++) {
|
||||||
lis_hbar(drvthis, 1, 1, 20, i, 0);
|
lis_vbar(drvthis, 1, 2, 2, i, 0);
|
||||||
lis_flush(drvthis);
|
lis_flush(drvthis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a custom character and write it to the LCD.
|
||||||
|
* \param drvthis Pointer to driver structure.
|
||||||
|
* \param n Custom character to define [0 - (NUM_CCs-1)].
|
||||||
|
* \param dat Array of 8(=cellheight) bytes, each representing a pixel row
|
||||||
|
* starting from the top to bottom.
|
||||||
|
* The bits in each byte represent the pixels where the LSB
|
||||||
|
* (least significant bit) is the rightmost pixel in each pixel row.
|
||||||
|
*/
|
||||||
|
MODULE_EXPORT void
|
||||||
|
lis_set_char(Driver *drvthis, int n, unsigned char *dat)
|
||||||
|
{
|
||||||
|
PrivateData *p = drvthis->private_data;
|
||||||
|
unsigned char mask = (1 << p->cellwidth) - 1;
|
||||||
|
int row;
|
||||||
|
|
||||||
|
|
||||||
|
if ((n < 0) || (n >= NUM_CCs))
|
||||||
|
return;
|
||||||
|
if (dat == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (row = 0; row < p->cellheight; row++) {
|
||||||
|
int letter = 0;
|
||||||
|
|
||||||
|
if (p->lastline || (row < p->cellheight - 1))
|
||||||
|
letter = dat[row] & mask;
|
||||||
|
|
||||||
|
if (p->cc[n].cache[row] != letter) {
|
||||||
|
p->cc[n].clean = 0; /* only mark dirty if really different */
|
||||||
|
}
|
||||||
|
p->cc[n].cache[row] = letter;
|
||||||
|
}
|
||||||
|
report(RPT_DEBUG, "%s: cached custom character #%d",
|
||||||
|
drvthis->name, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw a vertical bar bottom-up.
|
||||||
|
* \param drvthis Pointer to driver structure.
|
||||||
|
* \param x Horizontal character position (column) of the starting point.
|
||||||
|
* \param y Vertical character position (row) of the starting point.
|
||||||
|
* \param len Number of characters that the bar is high at 100%
|
||||||
|
* \param promille Current height level of the bar in promille.
|
||||||
|
* \param options Options (currently unused).
|
||||||
|
*/
|
||||||
|
MODULE_EXPORT void
|
||||||
|
lis_vbar(Driver *drvthis, int x, int y, int len, int promille, int options)
|
||||||
|
{
|
||||||
|
PrivateData *p = drvthis->private_data;
|
||||||
|
|
||||||
|
if (p->ccmode != vbar) {
|
||||||
|
unsigned char vBar[p->cellheight];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (p->ccmode != standard) {
|
||||||
|
/* Not supported(yet) */
|
||||||
|
report(RPT_WARNING, "%s: vbar: cannot combine two modes using user-defined characters",
|
||||||
|
drvthis->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
p->ccmode = vbar;
|
||||||
|
|
||||||
|
memset(vBar, 0x00, sizeof(vBar));
|
||||||
|
|
||||||
|
for (i = 2; i <= p->cellheight; i++) {
|
||||||
|
// add pixel line per pixel line ...
|
||||||
|
vBar[p->cellheight - i + 1] = 0x1F;
|
||||||
|
lis_set_char(drvthis, i, vBar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
report(RPT_DEBUG, "%s: vbar @ %d,%d len %d, %d/1000",
|
||||||
|
drvthis->name, x, y, len, promille);
|
||||||
|
|
||||||
|
lib_vbar_static(drvthis, x, y, len, promille, options, p->cellheight, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw a horizontal bar to the right.
|
||||||
|
* \param drvthis Pointer to driver structure.
|
||||||
|
* \param x Horizontal character position (column) of the starting point.
|
||||||
|
* \param y Vertical character position (row) of the starting point.
|
||||||
|
* \param len Number of characters that the bar is long at 100%
|
||||||
|
* \param promille Current length level of the bar in promille.
|
||||||
|
* \param options Options (currently unused).
|
||||||
|
*/
|
||||||
|
MODULE_EXPORT void
|
||||||
|
lis_hbar(Driver *drvthis, int x, int y, int len, int promille, int options)
|
||||||
|
{
|
||||||
|
PrivateData *p = drvthis->private_data;
|
||||||
|
|
||||||
|
if (p->ccmode != hbar) {
|
||||||
|
unsigned char hBar[p->cellheight];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (p->ccmode != standard) {
|
||||||
|
/* Not supported(yet) */
|
||||||
|
report(RPT_WARNING, "%s: hbar: cannot combine two modes using user-defined characters",
|
||||||
|
drvthis->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
p->ccmode = hbar;
|
||||||
|
|
||||||
|
for (i = 1; i <= p->cellwidth; i++) {
|
||||||
|
// fill pixel columns from left to right.
|
||||||
|
memset(hBar, 0xFF & ~((1 << (p->cellwidth - i)) - 1), sizeof(hBar));
|
||||||
|
lis_set_char(drvthis, i + 2, hBar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
report(RPT_DEBUG, "%s: hbar @ %d,%d len %d, %d/1000",
|
||||||
|
drvthis->name, x, y, len, promille);
|
||||||
|
|
||||||
|
lib_hbar_static(drvthis, x, y, len, promille, options, p->cellwidth, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a big number to the screen.
|
||||||
|
* \param drvthis Pointer to driver structure.
|
||||||
|
* \param x Horizontal character position (column).
|
||||||
|
* \param num Character to write (0 - 10 with 10 representing ':')
|
||||||
|
*/
|
||||||
|
MODULE_EXPORT void
|
||||||
|
lis_num(Driver *drvthis, int x, int num)
|
||||||
|
{
|
||||||
|
PrivateData *p = drvthis->private_data;
|
||||||
|
int do_init = 0;
|
||||||
|
|
||||||
|
if ((num < 0) || (num > 10))
|
||||||
|
return;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
report(RPT_DEBUG, "%s: big number %d @ %d",
|
||||||
|
drvthis->name, x, num);
|
||||||
|
|
||||||
|
// Lib_adv_bignum does everything needed to show the bignumbers.
|
||||||
|
// offset by 2 because driver uses first three custom characters
|
||||||
|
lib_adv_bignum(drvthis, x, num, 3, do_init);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get total number of custom characters available.
|
||||||
|
* \param drvthis Pointer to driver structure.
|
||||||
|
* \return Number of custom characters.
|
||||||
|
*/
|
||||||
|
MODULE_EXPORT int
|
||||||
|
lis_get_free_chars (Driver *drvthis)
|
||||||
|
{
|
||||||
|
//PrivateData *p = drvthis->private_data;
|
||||||
|
|
||||||
|
return NUM_CCs - 3; // first three are reserved
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+34
-4
@@ -38,17 +38,36 @@
|
|||||||
|
|
||||||
#define DEFAULT_BRIGHTNESS 1000
|
#define DEFAULT_BRIGHTNESS 1000
|
||||||
|
|
||||||
|
#define NUM_CCs 8
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// private data types
|
// private data types
|
||||||
//
|
//
|
||||||
|
typedef enum {
|
||||||
|
standard, /* only char 0 is used for heartbeat */
|
||||||
|
vbar, /* vertical bars */
|
||||||
|
hbar, /* horizontal bars */
|
||||||
|
bignum, /* big numbers */
|
||||||
|
bigchar, /* big characters */
|
||||||
|
custom /* custom icons */
|
||||||
|
} CGmode;
|
||||||
|
|
||||||
|
typedef struct cgram_cache {
|
||||||
|
unsigned char cache[CELLHEIGHT];
|
||||||
|
int clean;
|
||||||
|
} CGram;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
// the handle for the USB FTDI library
|
// the handle for the USB FTDI library
|
||||||
struct ftdi_context ftdic;
|
struct ftdi_context ftdic;
|
||||||
|
|
||||||
// the width and the height (in number of characters) of the library
|
// the width and the height (in number of characters) of the display
|
||||||
int width, height;
|
int width, height;
|
||||||
|
|
||||||
|
// pixel width and height of each character
|
||||||
|
int cellwidth, cellheight;
|
||||||
|
|
||||||
// The framebuffer and the framebuffer for the last contents (incr. update)
|
// The framebuffer and the framebuffer for the last contents (incr. update)
|
||||||
unsigned char *framebuf;
|
unsigned char *framebuf;
|
||||||
@@ -65,8 +84,9 @@ typedef struct {
|
|||||||
// display brightness 0-1000
|
// display brightness 0-1000
|
||||||
int brightness;
|
int brightness;
|
||||||
|
|
||||||
// custom characters loaded?
|
// ustom characters
|
||||||
int cc_flag;
|
CGram cc[NUM_CCs];
|
||||||
|
CGmode ccmode;
|
||||||
|
|
||||||
// USB Vendor ID
|
// USB Vendor ID
|
||||||
int VendorID;
|
int VendorID;
|
||||||
@@ -74,6 +94,11 @@ typedef struct {
|
|||||||
// USB Product ID
|
// USB Product ID
|
||||||
int ProductID;
|
int ProductID;
|
||||||
|
|
||||||
|
/* lastline controls the use of the last line, if pixel addressable (true, default) or */
|
||||||
|
/* underline effect (false). To avoid the underline effect in the latter case, the last */
|
||||||
|
/* line is always zeroed for whatever redefined character */
|
||||||
|
char lastline;
|
||||||
|
|
||||||
} PrivateData;
|
} PrivateData;
|
||||||
|
|
||||||
MODULE_EXPORT int lis_init(Driver *drvthis);
|
MODULE_EXPORT int lis_init(Driver *drvthis);
|
||||||
@@ -82,10 +107,15 @@ MODULE_EXPORT int lis_width (Driver *drvthis);
|
|||||||
MODULE_EXPORT int lis_height (Driver *drvthis);
|
MODULE_EXPORT int lis_height (Driver *drvthis);
|
||||||
MODULE_EXPORT void lis_clear (Driver * drvthis);
|
MODULE_EXPORT void lis_clear (Driver * drvthis);
|
||||||
MODULE_EXPORT void lis_string (Driver * drvthis, int x, int y, char string[]);
|
MODULE_EXPORT void lis_string (Driver * drvthis, int x, int y, char string[]);
|
||||||
MODULE_EXPORT void lis_chr (Driver * drvthis, int x, int y, char c);
|
MODULE_EXPORT void lis_chr (Driver * drvthis, int x, int y, unsigned char c);
|
||||||
MODULE_EXPORT void lis_flush (Driver * drvthis);
|
MODULE_EXPORT void lis_flush (Driver * drvthis);
|
||||||
MODULE_EXPORT void lis_vbar (Driver * drvthis, int x, int y, int len, int promille, int options);
|
MODULE_EXPORT void lis_vbar (Driver * drvthis, int x, int y, int len, int promille, int options);
|
||||||
MODULE_EXPORT void lis_hbar (Driver * drvthis, int x, int y, int len, int promille, int options);
|
MODULE_EXPORT void lis_hbar (Driver * drvthis, int x, int y, int len, int promille, int options);
|
||||||
MODULE_EXPORT int lis_icon(Driver * drvthis, int x, int y, int icon);
|
MODULE_EXPORT int lis_icon(Driver * drvthis, int x, int y, int icon);
|
||||||
|
MODULE_EXPORT int lis_cellheight (Driver *drvthis);
|
||||||
|
MODULE_EXPORT int lis_cellwidth (Driver *drvthis);
|
||||||
|
MODULE_EXPORT void lis_num(Driver *drvthis, int x, int num);
|
||||||
|
MODULE_EXPORT int lis_get_free_chars(Driver *drvthis);
|
||||||
|
MODULE_EXPORT void lis_set_char(Driver *drvthis, int n, unsigned char *dat);
|
||||||
|
|
||||||
#endif /* LIS_H */
|
#endif /* LIS_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user