Keyboard( double const xDebounceTicks = 18000000.0 ) : mM( ) , mQuit( ) , mCallbacks( ) , mInitialized( false ) , mKeyboardListener( [ & ] ( int64_t const xSleepIntervalNs ) -> uint32_t { bool pressedLastTime[ SDL_NUM_SCANCODES ]; for ( uint16_t ii = 0; ii < SDL_NUM_SCANCODES; ++ii ) { pressedLastTime [ ii ] = false; } double continueDebounceAccum = 0.0; Stopwatch t; while ( !mQuit.isSet( ) ) { if ( xSleepIntervalNs > 0 ) { sleep::ns( xSleepIntervalNs ); } const Uint8 * state = SDL_GetKeyboardState( NULL ); for ( uint16_t ii = 0; ii < SDL_NUM_SCANCODES; ++ii ) { eKeyState keyState = eKeyState_None; auto runCallbacks = [&]() { mM.run([&]( ) { for ( auto callback : mCallbacks ) { callback( KeyboardEvent( keyState, ii, state ) ); } }); }; if ( state[ ii ] && !pressedLastTime[ ii ] ) { keyState = eKeyState_Down; t.startMs( ); } else if ( state[ ii ] && pressedLastTime[ ii ] ) { continueDebounceAccum += t.stop( ); if ( continueDebounceAccum > mDebounceTicks ) { keyState = eKeyState_Continue; continueDebounceAccum = 0; t.startMs( ); } } else if ( !state[ ii ] && pressedLastTime[ ii ] ) { keyState = eKeyState_Up; } if ( keyState != eKeyState_None ) { runCallbacks( ); } pressedLastTime[ ii ] = state[ ii ]; } } }) , mDebounceTicks( xDebounceTicks ) { SISULOG( "In Keyboard Ctor" ); }
void registerCallback( OnKeyboardEventCallback xCallback ) { mM.run([&]() { mCallbacks.push_back( xCallback ); }); }