/**************************************************************************** DESCRIPTION function to detect level changes of buttons / multiple buttons. */ static void ButtonsLevelDetect ( const uint32 pState , ButtonsTaskData * pButtonsTask ) { uint32 lNewState = 0; /*we have an indication from the PIO subsytem that a PIO has changed value*/ lNewState = (uint32) (pState & (pButtonsTask->gPerformLevelCheck) ) ; B_DEBUG(("But Lev Det|:[%lx][%lx]\n", pState , (pButtonsTask->gButtonLevelMask) )) ; B_DEBUG(("But Lev Det|:[%lx][%lx]\n", pButtonsTask->gBOldState , lNewState )) ; if ( ButtonsWasButtonPressed( pButtonsTask->gBOldState , lNewState ) ) { /*cancel all previously timed messages*/ MessageCancelAll ( &pButtonsTask->task , B_INTERNAL_TIMER ) ; MessageCancelAll ( &pButtonsTask->task , B_REPEAT_TIMER ) ; MessageCancelAll ( &pButtonsTask->task , B_DOUBLE_TIMER ) ; /* send new timed messages*/ MessageSendLater ( &pButtonsTask->task , B_INTERNAL_TIMER , 0 , pButtonsTask->button_config->long_press_time ) ; MessageSendLater ( &pButtonsTask->task , B_REPEAT_TIMER , 0 , pButtonsTask->button_config->repeat_time ) ; /*having restrted the timers, reset the time*/ pButtonsTask->gBTime = B_SHORT ; } /*button was released or was masked out, check to make sure there is a pio bit change as vreg enable can generate an addition MSG without any pio's changing state */ else if(pButtonsTask->gBOldState != lNewState ) { /*it was only a released if there was a button actually pressed last time around - buttons we have masked out still end up here but no state changes are made */ if ( pButtonsTask->gBOldState != 0 ) { /*if we have had a double press in the required time and the button pressed was the same as this one*/ if ( (pButtonsTask->gBDoubleTap ) && (pButtonsTask->gBOldState == pButtonsTask->gBDoubleState ) ) { pButtonsTask->gBTime = B_DOUBLE ; /*reset the double state*/ pButtonsTask->gBDoubleState = 0x0000 ; pButtonsTask->gBDoubleTap = FALSE ; ButtonsButtonDetected ( pButtonsTask , pButtonsTask->gBOldState , B_DOUBLE ); } /*only send a message if it was a short one - long / v long /double handled elsewhere*/ if ( (pButtonsTask->gBTime == B_SHORT ) ) { ButtonsButtonDetected ( pButtonsTask , pButtonsTask->gBOldState , B_SHORT ); /*store the double state*/ pButtonsTask->gBDoubleState = pButtonsTask->gBOldState ; pButtonsTask->gBDoubleTap = TRUE ; /*start the double timer - only applicable to a short press*/ MessageSendLater ( &pButtonsTask->task , B_DOUBLE_TIMER , 0 ,pButtonsTask->button_config->double_press_time ) ; } else if ( (pButtonsTask->gBTime == B_LONG) ) { ButtonsButtonDetected ( pButtonsTask , pButtonsTask->gBOldState , B_LONG_RELEASE ); } else if ( (pButtonsTask->gBTime == B_VERY_LONG) ) { ButtonsButtonDetected ( pButtonsTask , pButtonsTask->gBOldState , B_VERY_LONG_RELEASE ); } else if ( (pButtonsTask->gBTime == B_VERY_VERY_LONG) ) { ButtonsButtonDetected ( pButtonsTask , pButtonsTask->gBOldState , B_VERY_VERY_LONG_RELEASE ); } if (pButtonsTask->gBTime != B_INVALID) { MessageCancelAll ( &pButtonsTask->task , B_INTERNAL_TIMER) ; MessageCancelAll ( &pButtonsTask->task , B_REPEAT_TIMER ) ; } /*removing this allows all releases to generate combination presses is this right?*/ if ( !lNewState ) { pButtonsTask->gBTime = B_INVALID ; } } } pButtonsTask->gBOldState = lNewState ; }
/**************************************************************************** DESCRIPTION function to detect level changes of buttons / multiple buttons, both PIO and capsense */ static void ButtonsLevelDetect ( const uint32 pInput , ButtonsTaskData * pButtonsTask ) { uint32 lNewInput = (uint32) (pInput & (pButtonsTask->gPerformInputLevelCheck)) ; uint32 lOldInput = (uint32) (pButtonsTask->gBOldInputState & pButtonsTask->gPerformInputLevelCheck); B_DEBUG(("But Lev Det|:NewInput[%lx] OldInput[%lx]\n", lNewInput, pButtonsTask->gBOldInputState )) ; if ( ButtonsWasButtonPressed(lOldInput, lNewInput ) ) { /* check whether device needs to be made connectable as a result of a button press on a multipoint device */ if(theSink.features.GoConnectableButtonPress) sinkEnableMultipointConnectable(); /*cancel all previously timed messages*/ MessageCancelAll ( &pButtonsTask->task , B_INTERNAL_TIMER ) ; MessageCancelAll ( &pButtonsTask->task , B_REPEAT_TIMER ) ; /* send new timed messages*/ MessageSendLater ( &pButtonsTask->task , B_INTERNAL_TIMER , 0 , pButtonsTask->button_config->long_press_time ) ; MessageSendLater ( &pButtonsTask->task , B_REPEAT_TIMER , 0 , pButtonsTask->button_config->repeat_time ) ; /*having restrted the timers, reset the time*/ pButtonsTask->gBTime = B_SHORT ; if (stateManagerGetState() == deviceTestMode) { checkDUTKeyPress(lNewInput); } } /*button was released or was masked out, check to make sure there is an input bit change as vreg enable can generate an addition MSG without any input's changing state */ else if(lOldInput!= lNewInput ) { /*it was only a released if there was a button actually pressed last time around - buttons we have masked out still end up here but no state changes are made */ if ( lOldInput != 0 ) { /*if we have had a double press in the required time and the button pressed was the same as this one*/ if ( (pButtonsTask->gBTapCount ) && (lOldInput == pButtonsTask->gBMultipleState ) ) { /* button has been released, increment multiple press counter */ pButtonsTask->gBTapCount++; B_DEBUG(("TapCount: [%lx][%lx][%x]\n", lOldInput , pButtonsTask->gBMultipleState , pButtonsTask->gBTapCount )) ; /* if the multiple press count is 2, set the time as a double, this will be used if no further presses are detected before the multiple press timeout occurs */ if(pButtonsTask->gBTapCount == DOUBLE_PRESS) pButtonsTask->gBTime = B_DOUBLE ; /* if the multiple press count is 3, process immediately as a triple press and cancel the multiple press timer */ else if(pButtonsTask->gBTapCount == TRIPLE_PRESS) { pButtonsTask->gBTime = B_TRIPLE ; /* indicate a triple press has been detected */ ButtonsButtonDetected ( pButtonsTask , lOldInput , B_TRIPLE ); /* reset current state and multiple press counter */ pButtonsTask->gBMultipleState = 0x0000 ; pButtonsTask->gBTapCount = 0; MessageCancelAll ( &pButtonsTask->task , B_MULTIPLE_TIMER ) ; } } /*only send a message if it was a short one - long / v long /double handled elsewhere*/ if ( (pButtonsTask->gBTime == B_SHORT ) ) { ButtonsButtonDetected ( pButtonsTask , lOldInput , B_SHORT ); /*store the double state*/ pButtonsTask->gBMultipleState = lOldInput ; pButtonsTask->gBTapCount++; /*start the double timer - only applicable to a short press*/ MessageSendLater ( &pButtonsTask->task , B_MULTIPLE_TIMER , 0 ,pButtonsTask->button_config->double_press_time ) ; } else if ( (pButtonsTask->gBTime == B_LONG) ) { ButtonsButtonDetected ( pButtonsTask , lOldInput , B_LONG_RELEASE ); } else if ( (pButtonsTask->gBTime == B_VERY_LONG) ) { ButtonsButtonDetected ( pButtonsTask , lOldInput , B_VERY_LONG_RELEASE ); } else if ( (pButtonsTask->gBTime == B_VERY_VERY_LONG) ) { ButtonsButtonDetected ( pButtonsTask , lOldInput , B_VERY_VERY_LONG_RELEASE ); } if (pButtonsTask->gBTime != B_INVALID) { MessageCancelAll ( &pButtonsTask->task , B_INTERNAL_TIMER) ; MessageCancelAll ( &pButtonsTask->task , B_REPEAT_TIMER ) ; } /*removing this allows all releases to generate combination presses is this right?*/ if ( !lNewInput ) { pButtonsTask->gBTime = B_INVALID ; } } } }