--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/brewco/keyboard.c Thu Nov 26 22:47:42 2015 +0100 @@ -0,0 +1,243 @@ +/***************************************************************************** + * Copyright (C) 2015 + * + * Michiel Broek <mbroek at mbse dot eu> + * + * This file is part of the mbsePi-apps + * + * This 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. + * + * mbsePi-apps 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 ThermFerm; see the file COPYING. If not, write to the Free + * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + *****************************************************************************/ + +#include "brewco.h" +#include "lcd-pcf8574.h" +#include "slcd.h" +#include "keyboard.h" + + + +/* + * 10 Milliseconds counts for a key to be short or long pressed. + */ +#define PRESS_NORMAL 5 +#define PRESS_LONG 200 + +/* + * LCD timeout in seconds + */ +#define LCD_SLEEP 120 + +/* + * Menu timeout in seconds + */ +#define MENU_TIMEOUT 60 + + + +extern int my_shutdown; +extern int debug; +extern int setupmenu; +extern uint16_t keys; +extern uint16_t leds; +extern int slcdHandle; + +int Key_Enter = FALSE; +int Key_Return = FALSE; +int Key_Up = FALSE; +int Key_Down = FALSE; + +int previous_key = KEY_NONE; +int menutimer = 0; + + +int keypressed(void); + + +/* + * Check for a key. Return last pressed key or none. + */ +int keycheck(void) +{ + int key, retkey = KEY_NONE; + + key = keypressed(); + if ((key == KEY_NONE) && (previous_key != KEY_NONE)) { + retkey = previous_key; + } + + previous_key = key; + return retkey; +} + + + +int keypressed(void) +{ + if (Key_Enter && Key_Up && Key_Down && Key_Return) + return KEY_ALL; + if (Key_Up) + return KEY_UP; + if (Key_Down) + return KEY_DOWN; + if (Key_Enter) + return KEY_ENTER; + if (Key_Return) + return KEY_RETURN; + return KEY_NONE; +} + + +#ifdef HAVE_WIRINGPI_H +PI_THREAD (my_panel_loop) +#else +void *my_panel_loop(void *threadid) +#endif +{ + int Return = 0, Enter = 0, Up = 0, Down = 0, Backlight = LCD_SLEEP, AnyKey = FALSE; + time_t Last = (time_t)0, Now; + +#ifdef HAVE_WIRINGPI_H + pinMode(PANEL_RETURN, INPUT); + pinMode(PANEL_ENTER, INPUT); + pinMode(PANEL_UP, INPUT); + pinMode(PANEL_DOWN, INPUT); +#endif + + syslog(LOG_NOTICE, "Thread my_panel_loop started"); + + /* + * Loop forever until the external shutdown variable is set. + */ + for (;;) { + if (my_shutdown) + break; + +#ifdef HAVE_WIRINGPI_H + if (digitalRead(PANEL_ENTER) && ((keys & 0x0001) == 0)) { +#else + if ((keys & 0x0001) == 0) { +#endif + Enter = 0; + Key_Enter = FALSE; + } else { + Enter++; + if (Enter > PRESS_NORMAL) + Key_Enter = TRUE; + } + +#ifdef HAVE_WIRINGPI_H + if (digitalRead(PANEL_RETURN) && ((keys & 0x0002) == 0)) { +#else + if ((keys & 0x0002) == 0) { +#endif + Return = 0; + Key_Return = FALSE; + } else { + Return++; + if (Return > PRESS_NORMAL) + Key_Return = TRUE; + } + +#ifdef HAVE_WIRINGPI_H + if (digitalRead(PANEL_UP) && ((keys & 0x0008) == 0)) { +#else + if ((keys & 0x0008) == 0) { +#endif + Up = 0; + Key_Up = FALSE; + } else { + Up++; + if (Up > PRESS_NORMAL) + Key_Up = TRUE; + } + +#ifdef HAVE_WIRINGPI_H + if (digitalRead(PANEL_DOWN) && ((keys & 0x0004) == 0)) { +#else + if ((keys & 0x0004) == 0) { +#endif + Down = 0; + Key_Down = FALSE; + } else { + Down++; + if (Down > PRESS_NORMAL) + Key_Down = TRUE; + } + + if (Key_Enter || Key_Return || Key_Up || Key_Down) { + AnyKey = TRUE; + /* + * Any key is pressed. + */ +#ifdef HAVE_WIRINGPI_H + piLock(LOCK_LCD); +#endif + setBacklight(1); +#ifdef HAVE_WIRINGPI_H + piUnlock(LOCK_LCD); +#endif + Backlight = LCD_SLEEP; + menutimer = 0; + } else { + /* + * No key pressed. + */ + AnyKey = FALSE; + } + + Now = time(NULL); + if (Now != Last) { + Last = Now; + + if (AnyKey == FALSE) { + if (Backlight == 1) { +#ifdef HAVE_WIRINGPI_H + piLock(LOCK_LCD); +#endif + setBacklight(0); +#ifdef HAVE_WIRINGPI_H + piUnlock(LOCK_LCD); +#endif + } + if (Backlight > 0) { + Backlight--; + } + +#ifdef HAVE_WIRINGPI_H +// piLock(LOCK_MENU); +#endif +// if (setupmenu != MENU_NONE) { +// if (menutimer < MENU_TIMEOUT) +// menutimer++; +// else { +// setupmenu = MENU_NONE; +// } +// } +#ifdef HAVE_WIRINGPI_H +// piUnlock(LOCK_MENU); +#endif + } + } + + /* + * Loop 10 milliseconds + */ + usleep(10000); + } + + syslog(LOG_NOTICE, "Thread my_panel_loop stopped"); + return 0; +} + +