update lcd
This commit is contained in:
parent
e3d2dae9ea
commit
9f0c15cb02
@ -216,6 +216,7 @@ static int diskto_check_cb(void *privdata)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
close(fd);
|
||||
|
||||
/* args[2]:
|
||||
* 0x00 - standby
|
||||
|
75
lcd.c
75
lcd.c
@ -81,6 +81,7 @@ struct lcddev {
|
||||
struct event_timeout *reset_timeout;
|
||||
struct event_timeout *backlight_timeout;
|
||||
struct event_timeout *scroll_timeout;
|
||||
struct event_timeout *update_timeout;
|
||||
};
|
||||
|
||||
void lcd_close(struct lcddev *dev)
|
||||
@ -95,6 +96,11 @@ void lcd_close(struct lcddev *dev)
|
||||
dev->backlight_timeout = NULL;
|
||||
}
|
||||
|
||||
if (dev->update_timeout) {
|
||||
event_remove_timeout(dev->update_timeout);
|
||||
dev->update_timeout = NULL;
|
||||
}
|
||||
|
||||
if (dev->scroll_timeout) {
|
||||
event_remove_timeout(dev->scroll_timeout);
|
||||
dev->scroll_timeout = NULL;
|
||||
@ -327,11 +333,28 @@ int lcd_trigger_backlight(struct lcddev *dev, int timeout)
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int lcd_update_timeout_cb(void *privdata)
|
||||
{
|
||||
struct lcddev *dev = (struct lcddev *)privdata;
|
||||
dev->update_timeout = NULL;
|
||||
|
||||
int update = dev->event_callback(dev, LCD_EVENT_UPDATE, dev->event_privdata);
|
||||
|
||||
/* update only if backlight is on (display visible) */
|
||||
if ((update != 0) && (dev->backlight_state != 0)) {
|
||||
struct timeval tv = { .tv_sec = update / 1000, .tv_usec = (update % 1000) * 1000 };
|
||||
dev->update_timeout = event_add_timeout(&tv, lcd_update_timeout_cb, dev);
|
||||
}
|
||||
|
||||
return -1; /* singleshot */
|
||||
}
|
||||
|
||||
static int lcd_read_cb(int fd, void *privdata)
|
||||
{
|
||||
struct lcddev *dev = (struct lcddev *)privdata;
|
||||
|
||||
char buf[4];
|
||||
int update = 0;
|
||||
int size = (dev->state != LCD_STATE_INITIALIZING) ? sizeof(buf) : 2;
|
||||
int len = lcd_read(dev, buf, size);
|
||||
|
||||
@ -348,7 +371,7 @@ static int lcd_read_cb(int fd, void *privdata)
|
||||
dev->state = LCD_STATE_READY;
|
||||
|
||||
/* trigger application to set data */
|
||||
dev->event_callback(dev, LCD_EVENT_INIT, dev->event_privdata);
|
||||
update = dev->event_callback(dev, LCD_EVENT_INIT, dev->event_privdata);
|
||||
}
|
||||
|
||||
} else if (dev->state == LCD_STATE_READY) {
|
||||
@ -359,13 +382,24 @@ static int lcd_read_cb(int fd, void *privdata)
|
||||
return 0;
|
||||
|
||||
if (memcmp(buf, expect1, sizeof(buf)) == 0) {
|
||||
dev->event_callback(dev, LCD_EVENT_BUTTON1, dev->event_privdata);
|
||||
update = dev->event_callback(dev, LCD_EVENT_BUTTON1, dev->event_privdata);
|
||||
|
||||
} else if (memcmp(buf, expect2, sizeof(buf)) == 0) {
|
||||
dev->event_callback(dev, LCD_EVENT_BUTTON2, dev->event_privdata);
|
||||
update = dev->event_callback(dev, LCD_EVENT_BUTTON2, dev->event_privdata);
|
||||
}
|
||||
}
|
||||
|
||||
if (dev->update_timeout != NULL) {
|
||||
event_remove_timeout(dev->update_timeout);
|
||||
dev->update_timeout = NULL;
|
||||
}
|
||||
|
||||
/* update only if backlight is on (display visible) */
|
||||
if ((update != 0) && (dev->backlight_state != 0)) {
|
||||
struct timeval tv = { .tv_sec = update / 1000, .tv_usec = (update % 1000) * 1000 };
|
||||
dev->update_timeout = event_add_timeout(&tv, lcd_update_timeout_cb, dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -429,15 +463,36 @@ static int lcd_scroll_timeout_cb(void *privdata)
|
||||
|
||||
int lcd_setlines(struct lcddev *dev, int scroll_speed, const char *line1, const char *line2)
|
||||
{
|
||||
dev->line_data[0] = line1;
|
||||
dev->line_length[0] = (line1 != NULL) ? strlen(line1) : 0;
|
||||
lcd_setline(dev, 0, dev->line_length[0], dev->line_data[0]);
|
||||
int i;
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (dev->line_data[i] != NULL) {
|
||||
free((void *)dev->line_data[i]);
|
||||
}
|
||||
|
||||
dev->line_data[1] = line2;
|
||||
dev->line_length[1] = (line2 != NULL) ? strlen(line2) : 0;
|
||||
dev->line_data[i] = NULL;
|
||||
dev->line_length[i] = 0;
|
||||
}
|
||||
|
||||
if (line1 != NULL) {
|
||||
dev->line_data[0] = strdup(line1);
|
||||
|
||||
if (dev->line_data[0] != NULL) {
|
||||
dev->line_length[0] = strlen(line1);
|
||||
}
|
||||
}
|
||||
|
||||
if (line2 != NULL) {
|
||||
dev->line_data[1] = strdup(line2);
|
||||
|
||||
if (dev->line_data[1] != NULL) {
|
||||
dev->line_length[1] = strlen(line2);
|
||||
}
|
||||
}
|
||||
|
||||
lcd_setline(dev, 0, dev->line_length[0], dev->line_data[0]);
|
||||
lcd_setline(dev, 1, dev->line_length[1], dev->line_data[1]);
|
||||
|
||||
int scroll_enable = (dev->line_length[0] > 16 && dev->line_length[1] > 16);
|
||||
int scroll_enable = (dev->line_length[0] > 16) || (dev->line_length[1] > 16);
|
||||
if (dev->scroll_timeout && ((dev->scroll_speed != scroll_speed) || !scroll_enable)) {
|
||||
event_remove_timeout(dev->scroll_timeout);
|
||||
dev->scroll_timeout = NULL;
|
||||
@ -447,7 +502,7 @@ int lcd_setlines(struct lcddev *dev, int scroll_speed, const char *line1, const
|
||||
dev->scroll_pos = 0;
|
||||
|
||||
if ((dev->scroll_timeout == NULL) && scroll_enable && (scroll_speed > 0)) {
|
||||
struct timeval tv = { .tv_usec = 1000 * dev->scroll_speed };
|
||||
struct timeval tv = { .tv_sec = dev->scroll_speed / 1000, .tv_usec = (dev->scroll_speed % 1000) * 1000 };
|
||||
dev->scroll_timeout = event_add_timeout(&tv, lcd_scroll_timeout_cb, dev);
|
||||
}
|
||||
|
||||
|
9
lcd.h
9
lcd.h
@ -1,10 +1,11 @@
|
||||
#ifndef _LCD_H_
|
||||
#define _LCD_H_
|
||||
|
||||
#define LCD_EVENT_INIT 0x00
|
||||
#define LCD_EVENT_BUTTON1 0x01
|
||||
#define LCD_EVENT_BUTTON2 0x02
|
||||
#define LCD_EVENT_BACKLIGHT 0x04
|
||||
#define LCD_EVENT_INIT 0x00 /* lcd initialized */
|
||||
#define LCD_EVENT_UPDATE 0x01 /* update data */
|
||||
#define LCD_EVENT_BUTTON1 0x02 /* button1 pressed */
|
||||
#define LCD_EVENT_BUTTON2 0x03 /* button2 pressed */
|
||||
#define LCD_EVENT_BACKLIGHT 0x04 /* backlight timeout */
|
||||
|
||||
struct lcddev; /* private data */
|
||||
|
||||
|
61
qnapd.c
61
qnapd.c
@ -27,6 +27,9 @@
|
||||
#include <sys/types.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <sys/utsname.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "configfile.h"
|
||||
#include "disktimeout.h"
|
||||
#include "event.h"
|
||||
@ -62,13 +65,41 @@ static int button_callback(struct lcddev *dev, int button, void *privdata)
|
||||
page = (page > 0) ? page -1 : PAGE_MAX;
|
||||
|
||||
} else if (button == LCD_EVENT_BACKLIGHT) {
|
||||
return 0;
|
||||
return 0; /* no update requested */
|
||||
}
|
||||
|
||||
if (button != LCD_EVENT_UPDATE) {
|
||||
lcd_trigger_backlight(dev, LCD_TIMEOUT);
|
||||
}
|
||||
|
||||
int update = 0;
|
||||
|
||||
switch (page) {
|
||||
case 0:
|
||||
lcd_setlines(dev, 500, "Debian GNU/Linux 5.0", "Linux 2.6.32.27-486 i586");
|
||||
case 7:
|
||||
{
|
||||
FILE *fp = fopen("/etc/issue.net", "r");
|
||||
char line1[64];
|
||||
char line2[64];
|
||||
|
||||
memset(line1, 0x00, sizeof(line1));
|
||||
memset(line2, 0x00, sizeof(line2));
|
||||
|
||||
if (fp != NULL) {
|
||||
fread(line1, 1, sizeof(line1), fp);
|
||||
fclose(fp);
|
||||
} else {
|
||||
strcpy(line1, "<unknown system>");
|
||||
}
|
||||
|
||||
struct utsname utsbuf;
|
||||
uname(&utsbuf);
|
||||
|
||||
snprintf(line2, sizeof(line2), "%s %s", utsbuf.sysname, utsbuf.release);
|
||||
|
||||
lcd_setlines(dev, 500, line1, line2);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
lcd_setlines(dev, 0, "Hostname:", "storenix.lan");
|
||||
break;
|
||||
@ -87,13 +118,29 @@ static int button_callback(struct lcddev *dev, int button, void *privdata)
|
||||
case 6:
|
||||
lcd_setlines(dev, 0, "Uptime:", " XXXd XX:XX:XX");
|
||||
break;
|
||||
case 7:
|
||||
lcd_setlines(dev, 0, "Time: XX:XX:XX", "Date: XX-XX-XXXX");
|
||||
case 0:
|
||||
{
|
||||
char line1[20];
|
||||
char line2[20];
|
||||
|
||||
struct tm tmp;
|
||||
time_t now;
|
||||
|
||||
time(&now);
|
||||
localtime_r(&now, &tmp);
|
||||
|
||||
strftime(line1, sizeof(line1), "Time: %H:%M:%S", &tmp);
|
||||
strftime(line2, sizeof(line2), "Date: %d-%m-%Y", &tmp);
|
||||
|
||||
lcd_setlines(dev, 0, line1, line2);
|
||||
update = 1000;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
|
||||
lcd_trigger_backlight(dev, LCD_TIMEOUT);
|
||||
return 1;
|
||||
return update;
|
||||
}
|
||||
|
||||
static int restart_var;
|
||||
|
@ -1,7 +1,7 @@
|
||||
[global]
|
||||
|
||||
#lcddevice /dev/ttyS0
|
||||
#lcddevice dummy
|
||||
lcddevice dummy
|
||||
|
||||
pidfile qnapd.pid
|
||||
logfile qnapd.log
|
||||
|
Loading…
Reference in New Issue
Block a user