/*
userinput.cpp
Copyright (C) 2007 Acekard, www.acekard.com
Copyright (C) 2007-2009 somebody
Copyright (C) 2009 yellow wood goblin
This program 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 3 of the License, or
(at your option) any later version.
This program 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, see .
*/
#include
#include "dbgtool.h"
#include "userinput.h"
#include "windowmanager.h"
#include "keymessage.h"
#include "timer.h"
using namespace akui;
static INPUT inputs;
static INPUT lastInputs;
static double lastInputTime;
static u32 idleMs;
void initInput()
{
lastInputTime = 0;
idleMs = 0;
keysSetRepeat( 30, 1 );
}
INPUT & updateInput()
{
memset( &inputs, 0, sizeof(inputs) );
touchRead(&inputs.touchPt);
if( inputs.touchPt.px == 0 && inputs.touchPt.py == 0 ) {
if( lastInputs.touchHeld ) {
inputs.touchUp = true;
inputs.touchPt = lastInputs.touchPt;
dbg_printf( "getInput() Touch UP! %d %d\n", inputs.touchPt.px, inputs.touchPt.py );
} else {
inputs.touchUp = false;
}
inputs.touchDown = false;
inputs.touchHeld = false;
} else {
if( !lastInputs.touchHeld ) {
inputs.touchDown = true;
dbg_printf( "getInput() Touch DOWN! %d %d\n", inputs.touchPt.px, inputs.touchPt.py );
} else {
inputs.movedPt.px = inputs.touchPt.px - lastInputs.touchPt.px;
inputs.movedPt.py = inputs.touchPt.py - lastInputs.touchPt.py;
inputs.touchMoved = (0 != inputs.movedPt.px) || (0 != inputs.movedPt.py);
inputs.touchDown = false;
}
inputs.touchUp = false;
inputs.touchHeld = true;
}
//dbg_printf( "touch x %d y %d\n", inputs.touchPt.px, inputs.touchPt.py );
//dbg_printf( "touchdown %d clicked %d\n", inputs.touchDown, inputs.clicked );
scanKeys();
inputs.keysDown = keysDown();
inputs.keysUp = keysUp();
inputs.keysHeld = keysHeld();
inputs.keysDownRepeat = keysDownRepeat();
if( lastInputs == inputs ) {
idleMs = (u32)( (timer().getTime() - lastInputTime) * 1000);
}
else {
//dbg_printf( "input idled %d\n", idleMs );
resetInputIdle();
}
lastInputs = inputs;
return inputs;
}
INPUT & getInput()
{
return inputs;
}
u32 getInputIdleMs()
{
return idleMs;
}
void resetInputIdle(void)
{
lastInputTime=timer().getTime();
idleMs=0;
}
bool processInput( INPUT & inputs )
{
bool ret = false;
unsigned char shift = 0;
if( inputs.keysHeld & KEY_L ) shift |= cKeyMessage::UI_SHIFT_L;
if( inputs.keysDown & KEY_A )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_A, shift );
if( inputs.keysDown & KEY_B )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_B, shift );
if( inputs.keysDown & KEY_X )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_X, shift );
if( inputs.keysDown & KEY_Y )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_Y, shift );
if( inputs.keysDown & KEY_R )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_R, shift );
if( inputs.keysDown & KEY_L )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_L, shift );
if( inputs.keysDown & KEY_START || inputs.keysDownRepeat & KEY_START )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_START, shift );
if( inputs.keysDown & KEY_SELECT )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_SELECT, shift );
if( inputs.keysDown & KEY_LEFT || inputs.keysDownRepeat & KEY_LEFT )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_LEFT, shift );
if( inputs.keysDown & KEY_RIGHT || inputs.keysDownRepeat & KEY_RIGHT )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_RIGHT, shift );
if( inputs.keysDown & KEY_UP || inputs.keysDownRepeat & KEY_UP )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_UP, shift );
if( inputs.keysDown & KEY_DOWN || inputs.keysDownRepeat & KEY_DOWN )
ret = ret || windowManager().onKeyDown( cKeyMessage::UI_KEY_DOWN, shift );
if( inputs.keysUp & KEY_L )
ret = ret || windowManager().onKeyUp( cKeyMessage::UI_KEY_L, shift );
if( inputs.touchDown )
ret = ret || windowManager().onTouchDown( inputs.touchPt.px, inputs.touchPt.py );
if( inputs.touchUp )
ret = ret || windowManager().onTouchUp( inputs.touchPt.px, inputs.touchPt.py );
if( inputs.touchMoved )
ret = ret || windowManager().onTouchMove( inputs.movedPt.px, inputs.movedPt.py );
if( inputs.keysDown & KEY_LID ) {
dbg_printf("lid closed\n");
fifoSendValue32(FIFO_PM,PM_REQ_SLEEP);
swiDelay(8380000); //500ms
/*
powerOff(0x3f);
powerOn(0x10);
*/
} else if( inputs.keysUp & KEY_LID ) {
dbg_printf("lid opened\n");
/*
powerOff(0x3f);
powerOn(0x0f);
*/
}
return ret;
}