debouncing code broke handling of threaded inputs; fix

This commit is contained in:
Glenn Maynard
2005-11-06 12:14:35 +00:00
parent 40b0dec7c4
commit 499dcf9c32
2 changed files with 30 additions and 11 deletions
+28 -10
View File
@@ -114,8 +114,15 @@ void InputFilter::ButtonPressed( const DeviceInput &di, bool Down )
if( bs.m_BeingHeld != Down )
{
/* Flush any delayed input, like Update() (in case Update() isn't being called). */
RageTimer now;
CheckButtonChange( bs, di, now );
bs.m_BeingHeld = Down;
bs.m_BeingHeldTime = di.ts;
/* Try to report presses immediately. */
CheckButtonChange( bs, di, now );
}
ActivateButton( di );
@@ -136,6 +143,25 @@ void InputFilter::ResetDevice( InputDevice device )
ButtonPressed( DeviceInput(device, button, -1, now), false );
}
/* Check for reportable presses. */
void InputFilter::CheckButtonChange( ButtonState &bs, DeviceInput di, const RageTimer &now )
{
if( bs.m_BeingHeld == bs.m_bLastReportedHeld )
return;
/* If the last IET_FIRST_PRESS or IET_RELEASE event was sent too recently,
* wait a while before sending it. */
if( now - bs.m_LastReportTime < g_fInputDebounceTime )
return;
bs.m_LastReportTime = now;
bs.m_bLastReportedHeld = bs.m_BeingHeld;
bs.m_fSecsHeld = 0;
di.ts = bs.m_BeingHeldTime;
queue.push_back( InputEvent(di,bs.m_bLastReportedHeld? IET_FIRST_PRESS:IET_RELEASE) );
}
void InputFilter::Update(float fDeltaTime)
{
RageTimer now;
@@ -156,16 +182,8 @@ void InputFilter::Update(float fDeltaTime)
ButtonState &bs = m_ButtonState[di.device][di.button];
di.level = bs.m_Level;
/* Generate IET_FIRST_PRESS and IET_RELEASE events. */
if( now - bs.m_LastReportTime >= g_fInputDebounceTime && bs.m_BeingHeld != bs.m_bLastReportedHeld )
{
bs.m_LastReportTime = now;
bs.m_bLastReportedHeld = bs.m_BeingHeld;
bs.m_fSecsHeld = 0;
di.ts = bs.m_BeingHeldTime;
queue.push_back( InputEvent(di,bs.m_bLastReportedHeld? IET_FIRST_PRESS:IET_RELEASE) );
}
/* Generate IET_FIRST_PRESS and IET_RELEASE events that were delayed. */
CheckButtonChange( bs, di, now );
/* Generate IET_LEVEL_CHANGED events. */
if( bs.m_LastLevel != bs.m_Level && bs.m_Level != -1 )
+2 -1
View File
@@ -70,13 +70,14 @@ private:
float m_fSecsHeld;
float m_Level, m_LastLevel;
// Timestamp of the last real event that came in: the time m_BeingHeld changed.
// Timestamp of m_BeingHeld changing.
RageTimer m_BeingHeldTime;
// The time that we actually reported the last event (used for debouncing).
RageTimer m_LastReportTime;
};
ButtonState m_ButtonState[NUM_INPUT_DEVICES][MAX_DEVICE_BUTTONS];
void CheckButtonChange( ButtonState &bs, DeviceInput di, const RageTimer &now );
InputEventArray queue;
RageMutex *queuemutex;