rockbox/firmware/button.c
Daniel Stenberg feef1ed076 Gary's code for reading the Recorder's keyboard. This can't yet be used in
the simulator as we need to tweak how it reads raw input when we simulate
this.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@101 a1c6a512-1295-4272-9138-f99709370657
2002-04-16 13:37:50 +00:00

151 lines
3.8 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 by Daniel Stenberg
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
/*
* Archos Jukebox Recorder button functions
*/
#include "config.h"
#ifdef HAVE_RECORDER_KEYPAD
#include "types.h"
#include "sh7034.h"
#include "button.h"
/* AJBR buttons are connected to the CPU as follows:
*
* ON and OFF are connected to separate port B input pins.
*
* F1, F2, F3, and UP are connected to the AN4 analog input, each through
* a separate voltage divider. The voltage on AN4 depends on which button
* (or none, or a combination) is pressed.
*
* DOWN, PLAY, LEFT, and RIGHT are likewise connected to AN5. */
/* Button voltage levels on AN4 and AN5 */
#define LEVEL1 50
#define LEVEL2 125
#define LEVEL3 175
#define LEVEL4 225
/* Number of calls to get_button for a button to stop bouncing
* and to be considered held down.
* Should really use a hardware timer for this.
*/
#define BOUNCE_COUNT 200
#define HOLD_COUNT 10000
static int last; /* Last button pressed */
static int count; /* Number of calls button has been down */
/*
*Initialize buttons
*/
void button_init()
{
#ifndef SIMULATOR
/* Set PB4 and PB8 as input pins */
PBCR1 &= 0xfffc; /* PB8MD = 00 */
PBCR2 &= 0xfcff; /* PB4MD = 00 */
PBIOR &= ~(PBDR_BTN_ON|PBDR_BTN_OFF); /* Inputs */
/* Set A/D to scan AN4 and AN5.
* This needs to be changed to scan other analog pins
* for battery level, etc. */
ADCSR = 0;
ADCR = 0;
ADCSR = ADCSR_ADST | ADCSR_SCAN | 0x5;
#endif
last = BUTTON_NONE;
count = 0;
}
/*
* Get button pressed from hardware
*/
static int get_raw_button (void)
{
/* Check port B pins for ON and OFF */
int data = PBDR;
if ((data & PBDR_BTN_ON) == 0)
return BUTTON_ON;
else if ((data & PBDR_BTN_OFF) == 0)
return BUTTON_OFF;
/* Check AN4 pin for F1-3 and UP */
data = ADDRAH;
if (data >= LEVEL4)
return BUTTON_F3;
else if (data >= LEVEL3)
return BUTTON_UP;
else if (data >= LEVEL2)
return BUTTON_F2;
else if (data >= LEVEL1)
return BUTTON_F1;
/* Check AN5 pin for DOWN, PLAY, LEFT, RIGHT */
data = ADDRBH;
if (data >= LEVEL4)
return BUTTON_DOWN;
else if (data >= LEVEL3)
return BUTTON_PLAY;
else if (data >= LEVEL2)
return BUTTON_LEFT;
else if (data >= LEVEL1)
return BUTTON_RIGHT;
return BUTTON_NONE;
}
/*
* Get the currently pressed button.
* Returns one of BUTTON_xxx codes, with possibly a modifier bit set.
* No modifier bits are set when the button is first pressed.
* BUTTON_HELD bit is while the button is being held.
* BUTTON_REL bit is set when button has been released.
*/
int button_get(void)
{
int btn = get_raw_button();
int ret;
/* Last button pressed is still down */
if (btn != BUTTON_NONE && btn == last) {
count++;
if (count == BOUNCE_COUNT)
return btn;
else if (count >= HOLD_COUNT)
return btn | BUTTON_HELD;
else
return BUTTON_NONE;
}
/* Last button pressed now released */
if (btn == BUTTON_NONE && last != BUTTON_NONE)
ret = last | BUTTON_REL;
else
ret = BUTTON_NONE;
last = btn;
count = 0;
return ret;
}
#endif /* HAVE_RECORDER_KEYPAD */