亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? headset_buttons.c

?? bc5_stereo:bluetooth stereo Headset CODE 支持A2DP HSP 和 HSP 。可作為車載免提。BlueLab 2007環境下編譯
?? C
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2005-2007

FILE NAME
    headset_buttons.c        

DESCRIPTION
    This is the button interpreter for the stereo application.
    This file extracts the button messages from the PIO subsystem and figures out
    the button press type and time. It passes the information to the button manager
    which is responsible for translating the button press generated into a system event.

*/


#include "headset_buttonmanager.h"
#include "headset_buttons.h"
#include "headset_debug.h"
#include "headset_private.h"

#include <charger.h>
#include <csrtypes.h>
#include <panic.h>
#include <pio.h>
#include <stddef.h>
#include <stdlib.h>


#ifdef DEBUG_BUTTONS
#define B_DEBUG(x) DEBUG(x)
#else
#define B_DEBUG(x) 
#endif


/* The default button durations */
#define B_LONG_TIME_MS           (1000)
#define B_VERY_LONG_TIME_MS      (2000)
#define B_VERY_VERY_LONG_TIME_MS (4000)

#define B_DOUBLE_PRESS_TIME_MS   (500)
#define B_REPEAT_TIME_MS         (500)

typedef enum ButtonsIntMsgTag 
{
    B_DOUBLE_TIMER , 
    B_INTERNAL_TIMER , 
    B_REPEAT_TIMER  
}ButtonsIntMsg_t;


#define BUTTON_PIO_DEBOUNCE_NUM_CHECKS  (4)
#define BUTTON_PIO_DEBOUNCE_TIME_MS     (15)

#define VREG_PIN    (24)
#define CHG_PIN     (25)


/****************************************************************************
    LOCAL FUNCTION PROTOTYPES
*/
static void ButtonsMessageHandler ( Task pTask, MessageId pId, Message pMessage )   ;
static bool ButtonsWasButtonPressed ( uint32 pOldState , uint32 pNewState) ;
static uint32 ButtonsWhichButtonChanged ( uint32 pOldState , uint32 pNewState ) ;
static void ButtonsButtonDetected (  BTaskData * pBTask ,uint32 pButtonMask  , ButtonsTime_t pTime  ) ;
static void ButtonsEdgeDetect ( const uint32 pState , BTaskData * pBTask ) ;       
static void ButtonsLevelDetect ( const uint32 pState , BTaskData * pBTask )  ;
static bool ButtonsIsChargerConnected ( void )  ;


/****************************************************************************
  FUNCTIONS
*/

/*****************************************************************************/  
void ButtonsInit ( BTaskData *pBTask )
{
    pBTask->gBOldState    = 0x0000 ;
    pBTask->gBTime        = B_SHORT ;
    pBTask->gBDoubleTap   = FALSE ;
    pBTask->gBDoubleState = 0x0000 ;
    pBTask->gButtonLevelMask   = 0x0000 ;
    
    pBTask->gButtonEdgeMask     = 0x0000 ;
    pBTask->gBOldEdgeState = 0x0000 ;
    
    pBTask->task.handler = ButtonsMessageHandler;
    
    /*connect the underlying PIO task to this task*/
    MessagePioTask(&pBTask->task);
    /*connect the underlying Charger task to this task*/
    MessageChargerTask(&pBTask->task);
    
    pBTask->gBLongDuration_ms           =  B_LONG_TIME_MS;
    pBTask->gBVeryLongDuration_ms       =  B_VERY_LONG_TIME_MS;
    pBTask->gBDoubleDuration_ms         =  B_DOUBLE_PRESS_TIME_MS;
    pBTask->gBRepeatDuration_ms         =  B_REPEAT_TIME_MS;
    pBTask->gBVeryVeryLongDuration_ms   =  B_VERY_VERY_LONG_TIME_MS;
    
    B_DEBUG(("B : Get[%lx]\n", PioGet32() )) ;        
}


/*****************************************************************************/
void ButtonsRegisterButtons ( BTaskData *pBTask, uint32 pButtonMask , ButtonTriggerType_t pTrigger , const uint16 pio_debounce ) 
{
    uint16 charger_events = 0;
    bool vreg_en = PioGetVregEn();
	bool chg_en = ButtonsIsChargerConnected();
    uint32 vreg_val = 0;
    uint32 chg_val = 0;
    
    if (vreg_en)
        vreg_val = (uint32)1 << VREG_PIN;
    
    if (chg_en)
        chg_val = (uint32)1 << CHG_PIN;
    
    switch ( pTrigger )
    {
        case ( ButtonLevelTrigger ):
        {
            pBTask->gButtonLevelMask |= pButtonMask ;
            B_DEBUG(("B  :Reg Lvl[%lx][%lx]\n",pButtonMask , pBTask->gButtonLevelMask)) ;
    

                /*reset the state so that no messages are sent*/                
            pBTask->gBTime = B_INVALID ; 
    
               /*kick off the messages looking for a power On*/
            ButtonsLevelDetect ( PioGet32() | vreg_val | chg_val , pBTask ) ;
    
        }
        break;
        case ( ButtonEdgeTrigger ):
        {
            pBTask->gButtonEdgeMask |= pButtonMask ;
            B_DEBUG(("B  :Reg Edge[%lx][%lx]\n",pButtonMask , pBTask->gButtonEdgeMask)) ;
            


            ButtonsEdgeDetect ( PioGet32() | vreg_val | chg_val , pBTask) ;
        }
        break;
        default:
            B_DEBUG(("B: reg [%x]?\n",pTrigger)) ;
        break;
    }
	
	B_DEBUG(("B: Debounce no[%x] time[%x]?\n",( pio_debounce >> 8 ) & 0xff, pio_debounce & 0xff)) ;
    
         /* Debounce required PIO lines - only first 24 bits */
    PioDebounce( (pBTask->gButtonEdgeMask | pBTask->gButtonLevelMask) & 0xffffff, ( pio_debounce >> 8 ) & 0xff, pio_debounce & 0xff );    
    
    /* Debounce required charger events - special PIO values (24 = vreg, 25 = chg) */
    if ((pBTask->gButtonEdgeMask | pBTask->gButtonLevelMask) & ((uint32)1 << VREG_PIN))
        charger_events |= CHARGER_VREG_EVENT;
    if ((pBTask->gButtonEdgeMask | pBTask->gButtonLevelMask) & ((uint32)1 << CHG_PIN))
        charger_events |= CHARGER_CONNECT_EVENT;
    
    B_DEBUG(("B  :Reg chg[%x]\n", charger_events));
             
    if (charger_events)
        ChargerDebounce(charger_events, ( pio_debounce >> 8 ) & 0xff, pio_debounce & 0xff);
}


/*****************************************************************************/
void ButtonsConfigDurations ( BTaskData *pBTask,  uint16 pLong , uint16 pVeryLong , uint16 pDouble , uint16 pRepeat , uint16 pVeryVeryLong)      
{
    /* Range checking performed by Configuration Manager */
    B_DEBUG(("B : Dur [%d][%d][%d][%d]\n" , pLong , pVeryLong , pDouble, pRepeat )) ;

    pBTask->gBLongDuration_ms         = pLong;
    pBTask->gBVeryLongDuration_ms     = pVeryLong ;
    pBTask->gBDoubleDuration_ms       = pDouble ;
    pBTask->gBRepeatDuration_ms       = pRepeat ;
    pBTask->gBVeryVeryLongDuration_ms = pVeryVeryLong ;
}


/****************************************************************************
NAME
    ButtonsMessageHandler
    
DESCRIPTION
 	The button event message handler - converts button events to the system events.
    
*/
static void ButtonsMessageHandler ( Task pTask, MessageId pId, Message pMessage ) 
{   
    BTaskData * lBTask = (BTaskData*)pTask ;

    B_DEBUG(("B :BMess \n")) ;
    switch ( pId )
    {
	    case MESSAGE_PIO_CHANGED : 
        {
            const MessagePioChanged * lMessage = ( const MessagePioChanged * ) (pMessage ) ;
            bool vreg_en = PioGetVregEn();
	        bool chg_en = ButtonsIsChargerConnected();
            uint32 vreg_val = 0;
            uint32 chg_val = 0;
    
            if (vreg_en)
                vreg_val = (uint32)1 << VREG_PIN;
            if (chg_en)
                chg_val = (uint32)1 << CHG_PIN;
             
            ButtonsLevelDetect ( ((uint32)lMessage->state16to31 << 16) | lMessage->state | vreg_val | chg_val , lBTask ) ;
            
            ButtonsEdgeDetect  ( ((uint32)lMessage->state16to31 << 16) | lMessage->state | vreg_val | chg_val , lBTask ) ;
        }
    	break ;
        
        case MESSAGE_CHARGER_CHANGED:
	    {
		    const MessageChargerChanged *m = (const MessageChargerChanged *) (pMessage ) ;			
            
            ButtonsLevelDetect ( ((uint32)m->vreg_en_high << VREG_PIN) | ((uint32)m->charger_connected << CHG_PIN) | PioGet32() , lBTask ) ;
            
            ButtonsEdgeDetect  ( ((uint32)m->vreg_en_high << VREG_PIN) | ((uint32)m->charger_connected << CHG_PIN) | PioGet32() , lBTask ) ;           
	    }
        break;
    
    	case B_DOUBLE_TIMER:
		{
				/*if we have reached here, then a double timer has been received*/
         	B_DEBUG(("B : Double[%lx][%x]\n", lBTask->gBDoubleState , B_SHORT_SINGLE)) ;
    
         	lBTask->gBDoubleTap = FALSE ;
        		/*indicate that a short button was pressed and it did not become a double press */
        	ButtonsButtonDetected ( lBTask, lBTask->gBDoubleState , B_SHORT_SINGLE ); 
		} 
        break ;
    	case B_INTERNAL_TIMER:
		{
				/*if we have reached here, then the buttons have been held longer than one of the timed messages*/
	        B_DEBUG(("B : Timer\n")) ;
            
        	if ( lBTask->gBTime == B_VERY_LONG )
        	{
            	lBTask->gBTime = B_VERY_VERY_LONG ;                
        	}
			else if ( lBTask->gBTime == B_LONG )
        	{
            	lBTask->gBTime = B_VERY_LONG ;
                	/*notify the app that the timer has expired*/
            	MessageSend( getAppTask() , EventVLongTimer , 0 ) ;    
        	}
			else
        	{
                	/*notify the app that the timer has expired*/
            	MessageSend( getAppTask() , EventLongTimer , 0 ) ;    
           		lBTask->gBTime = B_LONG ;
        	}    
            	/*indicate that we have received a message */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区三区高清不卡| 欧美一级黄色片| 国产精品1区2区| 久久国产尿小便嘘嘘尿| 日韩av中文字幕一区二区| 亚洲一二三区在线观看| 亚洲综合小说图片| 五月婷婷久久综合| 日韩国产欧美在线观看| 日韩成人伦理电影在线观看| 日韩国产欧美视频| 激情六月婷婷综合| 国产91对白在线观看九色| 国产成人av影院| 色综合中文综合网| 亚洲三级在线播放| 亚洲欧美一区二区三区久本道91 | 国产精品亚洲视频| 成人av网站在线| 一本色道久久综合亚洲aⅴ蜜桃| 欧美日韩中文另类| 亚洲精品一区在线观看| 国产精品伦理在线| 亚洲777理论| 国产一区二区三区在线观看精品 | 成人高清在线视频| 在线综合视频播放| 欧美成人免费网站| 日韩高清欧美激情| 欧美日本一道本在线视频| 亚洲欧美一区二区三区久本道91| 91啪九色porn原创视频在线观看| 国产精品色婷婷| 成人av网站在线| 成人欧美一区二区三区| 一本大道av一区二区在线播放| 欧美激情中文不卡| 不卡视频一二三四| 一区二区激情视频| 欧美在线一二三| 日日摸夜夜添夜夜添亚洲女人| 欧美区在线观看| 日韩电影在线一区| 精品国产一区二区精华| 国产精品白丝jk黑袜喷水| 国产三级一区二区| zzijzzij亚洲日本少妇熟睡| 国产精品国产精品国产专区不片 | 热久久久久久久| 亚洲精品一区二区在线观看| 国产经典欧美精品| 曰韩精品一区二区| 欧美一级日韩一级| 国产成人av影院| 亚洲午夜视频在线观看| 91精品国产入口在线| 国产精品一区二区视频| ...xxx性欧美| 欧美一区二区三区四区在线观看 | 亚洲成人福利片| 精品三级在线观看| www.成人在线| 亚洲成av人片在www色猫咪| 日韩女优电影在线观看| 成人免费看片app下载| 亚洲一区二区三区美女| www激情久久| 欧美丝袜丝nylons| 精品在线你懂的| 亚洲综合小说图片| 国产亲近乱来精品视频 | 大桥未久av一区二区三区中文| 亚洲欧美一区二区不卡| 欧美一区二区三区思思人| 不卡一区二区三区四区| 美女精品一区二区| 亚洲精品久久久久久国产精华液| 精品久久国产97色综合| 色天天综合久久久久综合片| 精品一区二区影视| 亚洲一区二区精品久久av| 久久久久久99精品| 制服视频三区第一页精品| 成人高清视频在线| 国产一区二区网址| 蜜臀av在线播放一区二区三区| 亚洲色图欧美在线| 国产精品三级在线观看| 日韩一区二区在线免费观看| 在线观看国产精品网站| 成人h精品动漫一区二区三区| 免费一级片91| 午夜av区久久| 亚洲精品老司机| 成人欧美一区二区三区| 国产精品免费免费| 久久久久高清精品| 欧美tk丨vk视频| 欧美一区二区三区成人| 欧美日韩精品一区二区天天拍小说 | 国产亚洲精品中文字幕| 日韩欧美一区在线| 欧美男人的天堂一二区| 欧美亚洲自拍偷拍| 色哟哟精品一区| 99精品1区2区| 99精品欧美一区二区蜜桃免费| 国产成人精品在线看| 国产在线播精品第三| 国产在线视频一区二区| 国内精品免费**视频| 蜜臀精品久久久久久蜜臀| 三级在线观看一区二区| 亚洲chinese男男1069| 午夜在线电影亚洲一区| 亚洲成精国产精品女| 三级不卡在线观看| 青青草成人在线观看| 日韩高清在线一区| 麻豆精品国产传媒mv男同| 美洲天堂一区二卡三卡四卡视频| 蜜乳av一区二区三区| 国产美女在线观看一区| 福利一区福利二区| 99久久婷婷国产综合精品电影 | 欧美日韩精品二区第二页| 欧美视频一区二区在线观看| 欧美日韩一区二区在线观看视频| 欧美肥妇毛茸茸| 欧美videos中文字幕| 日本一区二区三区四区在线视频 | 亚洲最大的成人av| 亚洲va欧美va人人爽午夜| 久久精品99国产精品| 国产又黄又大久久| 91视频免费看| 在线播放一区二区三区| 久久久美女艺术照精彩视频福利播放| 国产日韩欧美在线一区| 亚洲精品欧美综合四区| 青草av.久久免费一区| 国产高清不卡一区二区| 91色视频在线| 欧美一级一级性生活免费录像| 久久久久久久久久电影| 亚洲欧美日韩国产综合在线| 天堂精品中文字幕在线| 国产a级毛片一区| 欧美伊人久久久久久午夜久久久久| 91精品国产综合久久精品| 国产精品毛片久久久久久| 亚洲成a人在线观看| 国产69精品一区二区亚洲孕妇| 欧美视频一区在线观看| 国产欧美日韩一区二区三区在线观看| 亚洲欧美日韩一区二区三区在线观看| 奇米777欧美一区二区| 波多野结衣亚洲| 欧美一级艳片视频免费观看| 中文字幕亚洲在| 日本女人一区二区三区| 99re热视频这里只精品| 日韩午夜在线观看| 亚洲免费大片在线观看| 国产精品一二三在| 欧美三级电影网| 国产精品短视频| 久久99国产精品久久99果冻传媒| 91啪亚洲精品| 国产日韩欧美精品在线| 久久国产乱子精品免费女| 日本精品免费观看高清观看| 久久久影院官网| 麻豆国产精品官网| 欧洲国内综合视频| 国产精品第五页| 国产精品一线二线三线精华| 精品视频在线免费观看| 中文字幕一区二区三区四区不卡| 精品一区二区在线播放| 91精品国产综合久久国产大片| 亚洲福利视频一区二区| 99re成人精品视频| 国产欧美精品一区二区色综合 | 欧美综合天天夜夜久久| 国产精品的网站| 国产91精品久久久久久久网曝门| 日韩一级免费一区| 久久精品国产免费看久久精品| 欧美日韩和欧美的一区二区| 亚洲激情六月丁香| 一本一本久久a久久精品综合麻豆| 国产精品无人区| 成人一道本在线| 久久久久久久久99精品| 国产一区二区在线观看视频| 久久亚洲一区二区三区明星换脸 | 日本一区中文字幕| 欧美喷潮久久久xxxxx| 午夜精品福利一区二区三区蜜桃|