aboutsummaryrefslogtreecommitdiffstats
path: root/plugin_cpuinfo.c
blob: 5975af7ce8ce2a7ad496e5091cc09870b1adbc86 (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* $Id$
 * $URL$
 *
 * plugin for /proc/cpuinfo parsing
 *
 * Copyright (C) 2003 Michael Reinelt <michael@reinelt.co.at>
 * Copyright (C) 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
 *
 * This file is part of LCD4Linux.
 *
 * LCD4Linux 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.
 *
 * LCD4Linux 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.
 *
 */

/* 
 * exported functions:
 *
 * int plugin_init_cpuinfo (void)
 *  adds functions to access /proc/cpuinfo
 *
 */


#include "config.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>

#include "debug.h"
#include "plugin.h"
#include "hash.h"


static HASH CPUinfo;
static FILE *stream = NULL;

static int parse_cpuinfo(void)
{
    int age;

    /* reread every second only */
    age = hash_age(&CPUinfo, NULL);
    if (age > 0 && age <= 1000)
	return 0;

    if (stream == NULL)
	stream = fopen("/proc/cpuinfo", "r");
    if (stream == NULL) {
	error("fopen(/proc/cpuinfo) failed: %s", strerror(errno));
	return -1;
    }
    rewind(stream);
    while (!feof(stream)) {
	char buffer[256];
	char *c, *key, *val;
	fgets(buffer, sizeof(buffer), stream);
	c = strchr(buffer, ':');
	if (c == NULL)
	    continue;
	key = buffer;
	val = c + 1;
	/* strip leading blanks from key */
	while (isspace(*key))
	    *key++ = '\0';
	/* strip trailing blanks from key */
	do
	    *c = '\0';
	while (isspace(*--c));
	/* strip leading blanks from value */
	while (isspace(*val))
	    *val++ = '\0';
	/* strip trailing blanks from value */
	for (c = val; *c != '\0'; c++);
	while (isspace(*--c))
	    *c = '\0';

	/* add entry to hash table */
	hash_put(&CPUinfo, key, val);

    }
    return 0;
}


static void my_cpuinfo(RESULT * result, RESULT * arg1)
{
    char *key, *val;

    if (parse_cpuinfo() < 0) {
	SetResult(&result, R_STRING, "");
	return;
    }

    key = R2S(arg1);
    val = hash_get(&CPUinfo, key, NULL);
    if (val == NULL)
	val = "";

    SetResult(&result, R_STRING, val);
}


int plugin_init_cpuinfo(void)
{
    hash_create(&CPUinfo);
    AddFunction("cpuinfo", 1, my_cpuinfo);
    return 0;
}

void plugin_exit_cpuinfo(void)
{
    if (stream != NULL) {
	fclose(stream);
	stream = NULL;
    }
    hash_destroy(&CPUinfo);
}
ULL; static int usblcd_file; static unsigned char *Buffer; static unsigned char *BufPtr; // **************************************** // *** hardware dependant functions *** // **************************************** static void drv_UL_send () { #if 0 struct timeval now, end; gettimeofday (&now, NULL); #endif write(usblcd_file,Buffer,BufPtr-Buffer); #if 0 gettimeofday (&end, NULL); debug ("send %d bytes in %d msec (%d usec/byte)", BufPtr-Buffer, (1000000*(end.tv_sec-now.tv_sec)+end.tv_usec-now.tv_usec)/1000, (1000000*(end.tv_sec-now.tv_sec)+end.tv_usec-now.tv_usec)/(BufPtr-Buffer)); #endif BufPtr=Buffer; } static void drv_UL_command (unsigned char cmd) { *BufPtr++='\0'; *BufPtr++=cmd; } static void drv_UL_write (unsigned char *string, int len) { while (len--) { if(*string==0) *BufPtr++=*string; *BufPtr++=*string++; } drv_UL_send(); } static void drv_UL_goto (int row, int col) { int pos=(row%2)*64+(row/2)*20+col; drv_UL_command (0x80|pos); } static void drv_UL_defchar (int ascii, unsigned char *buffer) { drv_UL_command (0x40|8*ascii); drv_UL_write (buffer, 8); // drv_UL_write() will call drv_UL_send(), so don't call it here! } static int drv_UL_start (char *section) { int rows=-1, cols=-1; int major, minor; char *port, *s; char buf[128]; if (Port) { free(Port); Port=NULL; } if ((port=cfg_get(section, "Port", NULL))==NULL || *port=='\0') { error ("%s: no '%s.Port' entry from %s", Name, section, cfg_source()); return -1; } if (port[0]=='/') { Port=strdup(port); } else { Port=malloc(5+strlen(port)+1); sprintf(Port,"/dev/%s",port); } debug ("using device %s ", Port); s=cfg_get(section, "Size", NULL); if (s==NULL || *s=='\0') { error ("%s: no '%s.Size' entry from %s", Name, section, cfg_source()); return -1; } if (sscanf(s,"%dx%d",&cols,&rows)!=2 || rows<1 || cols<1) { error ("%s: bad size '%s'", Name, s); return -1; } DROWS = rows; DCOLS = cols; // Init the command buffer Buffer = (char*)malloc(1024); if (Buffer==NULL) { error ("%s: coommand buffer could not be allocated: malloc() failed", Name); return -1; } // open port usblcd_file=open(Port,O_WRONLY); if (usblcd_file==-1) { error ("%s: open(%s) failed: %s", Name, Port, strerror(errno)); return -1; } // get driver version memset(buf,0,sizeof(buf)); if (ioctl(usblcd_file, IOC_GET_DRV_VERSION, buf)!=0) { error ("USBLCD: ioctl() failed, could not get Driver Version!"); return -1; } info("%s: Driver Version: %s", Name, buf); if (sscanf(buf,"USBLCD Driver Version %d.%d",&major,&minor)!=2) { error("%s: could not read Driver Version!", Name); return -1; } if (major!=1) { error("%d: Driver Version %d not supported!", Name, major); return -1; } memset(buf,0,sizeof(buf)); if (ioctl(usblcd_file, IOC_GET_HARD_VERSION, buf)!=0) { error ("%s: ioctl() failed, could not get Hardware Version!", Name); return -1; } info("%s: Hardware Version: %s", Name, buf); if (sscanf(buf,"%d.%d",&major,&minor)!=2) { error("%s: could not read Hardware Version!", Name); return -1; } if (major!=1) { error("%s: Hardware Version %d not supported!", Name, major); return -1; } // reset coimmand buffer BufPtr=Buffer; // initialize display drv_UL_command (0x29); // 8 Bit mode, 1/16 duty cycle, 5x8 font drv_UL_command (0x08); // Display off, cursor off, blink off drv_UL_command (0x0c); // Display on, cursor off, blink off drv_UL_command (0x06); // curser moves to right, no shift drv_UL_command (0x01); // clear display drv_UL_command (0x03); // return home // flush buffer drv_UL_send(); return 0; } // **************************************** // *** plugins *** // **************************************** // none at the moment... // **************************************** // *** widget callbacks *** // **************************************** // using drv_generic_text_draw(W) // using drv_generic_text_icon_draw(W) // using drv_generic_text_bar_draw(W) // **************************************** // *** exported functions *** // **************************************** // list models int drv_UL_list (void) { printf ("generic"); return 0; } // initialize driver & display int drv_UL_init (char *section) { WIDGET_CLASS wc; int asc255bug; int ret; // display preferences XRES = 5; // pixel width of one char YRES = 8; // pixel height of one char CHARS = 8; // number of user-defineable characters CHAR0 = 0; // ASCII of first user-defineable char GOTO_COST = 2; // number of bytes a goto command requires // real worker functions drv_generic_text_real_write = drv_UL_write; drv_generic_text_real_goto = drv_UL_goto; drv_generic_text_real_defchar = drv_UL_defchar; // start display if ((ret=drv_UL_start (section))!=0) return ret; // initialize generic text driver if ((ret=drv_generic_text_init(section, Name))!=0) return ret; // initialize generic icon driver if ((ret=drv_generic_text_icon_init())!=0) return ret; // initialize generic bar driver if ((ret=drv_generic_text_bar_init())!=0) return ret; // add fixed chars to the bar driver // most displays have a full block on ascii 255, but some have kind of // an 'inverted P'. If you specify 'asc255bug 1 in the config, this // char will not be used, but rendered by the bar driver cfg_number(section, "asc255bug", 0, 0, 1, &asc255bug); drv_generic_text_bar_add_segment ( 0, 0,255, 32); // ASCII 32 = blank if (!asc255bug) drv_generic_text_bar_add_segment (255,255,255,255); // ASCII 255 = block // register text widget wc=Widget_Text; wc.draw=drv_generic_text_draw; widget_register(&wc); // register icon widget wc=Widget_Icon; wc.draw=drv_generic_text_icon_draw; widget_register(&wc); // register bar widget wc=Widget_Bar; wc.draw=drv_generic_text_bar_draw; widget_register(&wc); // register plugins // none at the moment... return 0; } // close driver & display int drv_UL_quit (void) { info("%s: shutting down.", Name); // flush buffer drv_UL_send(); debug ("closing port %s", Port); close(usblcd_file); if (Buffer) { free(Buffer); Buffer=NULL; BufPtr=Buffer; } drv_generic_text_quit(); return (0); } DRIVER drv_USBLCD = { name: Name, list: drv_UL_list, init: drv_UL_init, quit: drv_UL_quit, };