aboutsummaryrefslogtreecommitdiffstats
path: root/README.X11
blob: 7b5562425a3ceb4ab148ddc9a8c1fc6986c5267b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#
# $Id: README.X11,v 1.2 2000/04/03 04:46:38 reinelt Exp $
#

This is the README file for the X11 display driver for lcd4linux

The driver opens a X11 window based on the geometry specified in the
config file. This window cannot be resized. The contents of the window
will be redrawn every 'tick' msec.

The driver uses very low cpu time, and requires low bandwitdh, because 
only modified pixels are redrawn.


Configuration:

The driver needs/supports the following entries in lcd4linux.conf:

Display: must be "X11"
size: [columns]x[rows], e.g. "20x4"
font: [xrex]x[yres], at the moment only "5x8" and "6x8" supported.
pixel: [pixelsize]+[pixelgap], e.g. "5+1"
gap: [row gap]x[column gap], e.g. "3x3"
border: border width
foreground: color of an active LCD Pixel, must be #rrggbb
halfground: color of an inactive LCD Pixel, must be #rrggbb
background: backlight color, must be #rrggbb

This may look weird, but it is weird. Let's explain this a bit further:
The X11 driver tries to emulate a real LC display. A real LCD has a
size of columns*rows characters. Each character consists of xres*yres 
LCD cells. One single cell will be represented by a rectangle of
pixelsize*pixelsize pixels. If you want to, you can emulate the gap 
between this lcd cells by specifying a pixelgap greater than zero.
Sometimes there's a gap between characters, too. You can specify this 
gap (in pixels again) horizontally and vertically. Usually this gap
is the same size as a cell (which is pixelsize+pixelgap).  If you specify
either the row gap or the column gap as -1, this cell size will be used
instead.

If you use a font of 5x8, some characters may use the first and the last 
pixel. So you should specify a column gap, otherwise the caracters may 
touch. On the other hand, the 6x8 font never uses the first pixel. So you 
can omit the column gap, and will get the same text layout, but 
uninterupted bars!

After all: don't try to understand this unless you have tried it out!
tring.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/* $Id: exec.c,v 1.7 2002/04/29 11:00:28 reinelt Exp $
 *
 * exec ('x*') functions
 *
 * Copyright 2001 by Leopold T�tsch (lt@toetsch.at)
 *
 * 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, or (at your option)
 * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 * $Log: exec.c,v $
 * Revision 1.7  2002/04/29 11:00:28  reinelt
 *
 * added Toshiba T6963 driver
 * added ndelay() with nanosecond resolution
 *
 * Revision 1.6  2001/03/15 09:13:22  ltoetsch
 * delay first exec for faster start
 *
 * Revision 1.5  2001/03/13 08:34:15  reinelt
 *
 * corrected a off-by-one bug with sensors
 *
 * Revision 1.4  2001/03/09 14:24:49  ltoetsch
 * exec: Scale_x ->Min/Max_x
 *
 * Revision 1.3  2001/03/08 15:25:38  ltoetsch
 * improved exec
 *
 * Revision 1.2  2001/03/08 08:39:54  reinelt
 *
 * fixed two typos
 *
 * Revision 1.1  2001/03/07 18:10:21  ltoetsch
 * added e(x)ec commands
 *
 *
 * This implements the x1 .. x9 commands
 * config options:
 *   x1 .. x9      command to execute
 *   Tick_x1 ... 9 delay in ticks
 *   Delay_x1 .. 9 delay in seconds
 *   Max_x1 .. 9   max for scaling bars (100)
 *   Min_x1 .. 9   min for scaling bars (0)
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <errno.h>
#define IN_EXEC
#include "exec.h"
#include "debug.h"
#include "cfg.h"


int Exec(int index, char buff[EXEC_TXT_LEN], double *val)
{
  static time_t now[EXECS+1];
  static int errs[EXECS+1];
  static int ticks[EXECS+1];
  char *command, *p;
  char xn[20];
  char env[EXEC_TXT_LEN];
  FILE *pipe;
  size_t len;
  int i;

  if (index < 0 || index > EXECS)
    return -1; 
  if (errs[index])
    return -1;
  
  /* first time ? */
  if (now[index] == 0) { /* not first time, to give faster a chance */
    now[index] = -1;
    return 0;
  }
  if (now[index] > 0) {
    /* delay in Ticks ? */
    sprintf(xn, "Tick_x%d", index);
    p = cfg_get(xn);
    if (p && *p) {
      if (ticks[index]++ % atoi(p) != 0)
        return 0;
    }
    else {
      sprintf(xn, "Delay_x%d", index);
      /* delay in Delay_x* sec ? */
      debug ("%s=%s",xn,cfg_get(xn));
      if (time(NULL) <= now[index] + atoi(cfg_get(xn)?:"1")) {
        return 0;
      }
    }
  }
  time(&now[index]); 
  *val = -1;
  
  sprintf(xn, "x%d", index);
  command = cfg_get(xn);
  debug("%s:'%s'",xn,command);
					    
  if (!command || !*command) {
    error("Empty command for 'x%d'", index);
    errs[index]++;
    return -1;
  }
  for (i = 1; i < index; i++) {
    sprintf(env, "X%d=%.*s", i, EXEC_TXT_LEN-10, exec[i].s);
    putenv(env);
  }
  putenv("PATH=/usr/local/bin:/usr/bin:/bin");
  pipe = popen(command, "r");
  if (pipe == NULL) {
    error("Couldn't run pipe '%s':\n%s", command, strerror(errno));
    errs[index]++;
    return -1;
  }
  len = fread(buff, 1, EXEC_TXT_LEN-1,  pipe);
  if (len <= 0) {
    pclose(pipe);
    error("Couldn't fread from pipe '%s', len=%d", command, len);
    errs[index]++;
    *buff = '\0';
    return -1;
  }
  pclose(pipe);
  buff[len] = '\0';
  for (p = buff ; *p && isspace(*p); p++)
    ;
  if (isdigit(*p)) {
    double max, min;
    *val = atof(p);
    sprintf(xn, "Max_x%d", index);
    max = atof(cfg_get(xn)?:"100")?:100;
    sprintf(xn, "Min_x%d", index);
    min = atof(cfg_get(xn)?:"0");
    if (max != min)
      *val = (*val - min)/(max - min);
  }
  return 0;
}