brewco/keyboard.c

changeset 435
4b1ed6897d80
child 438
7d1ec160d751
--- /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;
+}
+
+

mercurial