[Lcdproc] Re: serialPOS driver
Eric Pooch
epooch@cox.net
Fri Aug 3 10:31:02 2007
--Apple-Mail-2--476070614
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=US-ASCII;
delsp=yes;
format=flowed
Added key input for POS displays with a pass-through port connected
to a terminal or RS232 keyboard.
Eliminated unused code.
Updated docs.
--Eric
On Feb 4, 2007, at 10:23 AM, Eric Pooch wrote:
> driver and docbook for text based serial Point of Sale displays.
> Currently only supports the AEDEX protocol, but can be extended to
> use other text-based POS emulation protocols.
>
> These can be picked up cheap on ebay if you look around. They also
> usually come with full rs232 support and a power adapter.
>
>
>
>
> <serialPOS.tgz>
--Apple-Mail-2--476070614
Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream;
x-unix-mode=0644;
name=serialPOS_input.patch
Content-Disposition: attachment;
filename=serialPOS_input.patch
--- lcdproc-CVS-current-20070802/server/drivers/serialPOS.c 2007-04-15 00:00:22.000000000 -0700
+++ lcdproc-update-20070802/server/drivers/serialPOS.c 2007-08-03 03:00:34.000000000 -0700
@@ -2,7 +2,7 @@
various protocols. While it currently only supports AEDEX,
it can be extended to provide support for many POS emulation types.
- Copyright (C) 2006 Eric Pooch
+ Copyright (C) 2006, 2007 Eric Pooch
This driver is based on MtxOrb.c driver and is subject to its copyrights.
@@ -35,10 +35,10 @@
hbar Implemented.
num Implemented.
heartbeat Implemented.
-icon NOT IMPLEMENTED: not part of POS protocol
+icon NOT IMPLEMENTED: not part of any POS protocol
cursor NOT IMPLEMENTED: not part of AEDEX protocol
set_char NOT IMPLEMENTED: not part of AEDEX protocol
-get_free_chars Implemented.
+get_free_chars NOT IMPLEMENTED: not part of AEDEX protocol
cellwidth Implemented.
cellheight Implemented.
get_contrast NOT IMPLEMENTED: not part of AEDEX protocol
@@ -46,8 +46,8 @@
get_brightness NOT IMPLEMENTED: not part of AEDEX protocol
set_brightness NOT IMPLEMENTED: not part of AEDEX protocol
backlight NOT IMPLEMENTED: not part of AEDEX protocol
-output Not implemented.
-get_key Not implemented, no keys.
+output NOT IMPLEMENTED: not part of any POS protocol
+get_key Implemented for devices using a pass-through serial port connected to an RS232 terminal or keyboard.
get_info Implemented.
*/
@@ -839,67 +839,6 @@
#ifdef NOTUSED
/**
- * Get total number of custom characters available.
- * \param drvthis Pointer to driver structure.
- * \return Number of custom characters (always NUM_CCs).
- */
-MODULE_EXPORT int
-serialPOS_get_free_chars (Driver *drvthis)
-{
- //PrivateData *p = drvthis->private_data;
-
- return NUM_CCs;
-}
-
-
-/**
- * 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
-serialPOS_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)
- return;
-
- out[2] = n; /* Custom char to define. xxx */
-
- for (row = 0; row < p->cellheight; row++) {
- out[row+3] = dat[row] & mask;
- }
- write(p->fd, out, 11);
-}
-
-
-/**
- * Place an icon on the screen.
- * \param drvthis Pointer to driver structure.
- * \param x Horizontal character position (column).
- * \param y Vertical character position (row).
- * \param icon synbolic value representing the icon.
- * \return Information whether the icon is handled here or needs to be handled by the server core.
- */
-MODULE_EXPORT int
-serialPOS_icon (Driver *drvthis, int x, int y, int icon)
-{
- //PrivateData *p = drvthis->private_data;
-
- return 0;
-}
-
-
-/**
* Set cursor position and state.
* \param drvthis Pointer to driver structure.
* \param x Horizontal cursor position (column).
@@ -915,54 +854,79 @@
//serialPOS_cursor_goto(drvthis, x, y);
}
+#endif
+
/**
- * Get key from the LCD/VFD.
+ * Get key from a pass-through port of the POS display.
* \param drvthis Pointer to driver structure.
* \return String representation of the key.
- *
*/
+
MODULE_EXPORT const char *
serialPOS_get_key (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
- char key = 0;
- struct pollfd fds[1];
-
- /* don't query the keyboard if there are no mapped keys; see \todo above */
- if ((p->keys == 0) && (!p->keypad_test_mode))
+ int ret;
+ char buf;
+ const char *key = NULL;
+ static struct timeval selectTimeout = { 0, 0 };
+ fd_set fdset;
+
+ FD_ZERO(&fdset);
+ FD_SET(p->fd, &fdset);
+
+ if ((ret = select(FD_SETSIZE, &fdset, NULL, NULL, &selectTimeout)) < 0) {
+ report(RPT_DEBUG, "%s: get_key: select() failed (%s)",
+ drvthis->name, strerror(errno));
return NULL;
-
- /* poll for data or return */
- fds[0].fd = p->fd;
- fds[0].events = POLLIN;
- fds[0].revents = 0;
- poll(fds,1,0);
- if (fds[0].revents == 0)
+ }
+ if (!ret) {
+ FD_SET(p->fd, &fdset);
return NULL;
+ }
- (void) read(p->fd, &key, 1);
- report(RPT_DEBUG, "%s: get_key: key 0x%02X", drvthis->name, key);
+ if (!FD_ISSET(p->fd, &fdset))
+ return NULL;
- if (key == '\0')
+ if ((ret = read(p->fd, &buf, 1)) < 0) {
+ report(RPT_DEBUG, "%s: get_key: read() failed (%s)",
+ drvthis->name, strerror(errno));
return NULL;
+ }
- if (!p->keypad_test_mode) {
- /* we assume standard key mapping here */
- if ((key >= 'A') && (key <= 'A' + MAX_KEY_MAP)) {
- return p->keymap[key-'A'];
- }
- else {
- report(RPT_INFO, "%s: Untreated key 0x%02X", drvthis->name, key);
+ if (ret == 1) {
+
+ switch (buf) {
+ case 13:
+ key = "Enter";
+ break;
+ case 65:
+ key = "Up";
+ break;
+ case 66:
+ key = "Down";
+ break;
+ case 67:
+ key = "Right";
+ break;
+ case 68:
+ key = "Left";
+ break;
+ case 8:
+ key = "Escape";
+ break;
+ default:
+ report(RPT_DEBUG, "%s get_key: illegal key 0x%02X",
+ drvthis->name, buf);
return NULL;
}
+
+ report(RPT_DEBUG, "%s: get_key: returns %s", drvthis->name, key);
+ return key;
}
- else {
- fprintf(stdout, "serialPOS: Received character %c\n", key);
- fprintf(stdout, "serialPOS: Press another key of your device.\n");
- }
+
return NULL;
}
-#endif
/* EOF */
--- lcdproc-CVS-current-20070802/docs/lcdproc-user/drivers/serialPOS.docbook 2007-04-04 00:00:20.000000000 -0700
+++ lcdproc-update-20070802/docs/lcdproc-user/drivers/serialPOS.docbook 2007-08-03 02:42:48.000000000 -0700
@@ -82,20 +82,25 @@
<para>
Connecting the display should consist of simply plugging it into your computer's
-RS-232 port. Because these displays typically support full RS-232, no additional
-wiring is needed. If your computer does not have such a port (many newer computers don't),
+RS-232 serial port. Because these displays typically support full RS-232, no additional
+wiring is needed. If your computer does not have such a port (many newer computers don't),
you can use a USB to serial adapter with the appropriate driver.
</para>
-
+<para>
+If your display supports a <emphasis>pass-through</emphasis> function, you can connect
+an RS-232 keyboard or terminal to the pass-through port. This will allow you to input
+keystrokes to LCDproc and control features and menus. Use the pass-through keyboard's
+arrow, delete, and return keys by default.
+</para>
<note>
<para>
If your display supports a <emphasis>pass-through</emphasis> function,
but you do not have another RS-232 device connected to the pass-through port,
you may experience hangs if an improperly formatted command sneaks through.
This is because the display is waiting for the pass-through device to accept
- the data and a blocking state is created within the device.
- You can either connect another RS-232 device, or rewire the display to send the
- pass-through commands back to your computer.
+ the data and a blocking state is created within the display.
+ You can either connect another RS-232 device or use a wire to jumper the CTS and RTS
+ pins together within the display.
</para>
</note>
--Apple-Mail-2--476070614
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=US-ASCII;
format=flowed
--Apple-Mail-2--476070614--