关于CSR8670按键处理



static void configManagerButtons( void )
{  
/* Allocate enough memory to hold event configuration   BM_EVENTS_PER_PS_BLOCK=22
  分配三块内存空间 每块内存空间分配22个事件 总共只有66个事件可以处理。。。。。 




// 这个用户事件 的数字对应头文件 sink_events.h typedef enum sinkEventsTag 定义的


volume up 对应 input 2 PIO12 对应事件  EventUsrVolumeUp




Co : AddMap indexes [0,0] Ev[2][d][45]  
Co : AddMap indexes [1,3] Ev[1][d][47]
Co : AddMap indexes [2,6] Ev[3][e][48]
Co : AddMap indexes [3,9] Ev[4][e][49]
Co : AddMap indexes [4,12] Ev[6][c][4a]
Co : AddMap indexes [5,15] Ev[26][10][4a]
Co : AddMap indexes [6,18] Ev[8][13][4a]
Co : AddMap indexes [7,21] Ev[9][14][4b]
Co : AddMap indexes [8,24] Ev[a][6][4c]
Co : AddMap indexes [9,27] Ev[b][f][4c]
Co : AddMap indexes [10,30] Ev[18][2d][4c]
Co : AddMap indexes [11,33] Ev[18][2e][57]
Co : AddMap indexes [12,36] Ev[11][8f][58]
Co : AddMap indexes [13,39] Ev[12][22][46]
Co : AddMap indexes [14,42] Ev[1e][1][0]
Co : AddMap indexes [15,44] Ev[1f][1][0]
Co : AddMap indexes [16,46] Ev[20][89][0]
Co : AddMap indexes [17,48] Ev[95][8a][0]
Co : AddMap indexes [18,50] Ev[96][8b][0]
Co : AddMap indexes [19,52] Ev[18][18][0]
Co : AddMap indexes [20,54] Ev[34][0][0]
Co : AddMap indexes [21,55] Ev[27][0][0]


上面打印结果为什么是这样的,其实很简单。 (事件索引对应文件 #include"sink_events.h" typedef enum sinkEventsTag定义 
比如  /*0x4000*/    EventInvalid = EVENTS_USR_MESSAGE_BASE,    这个对应索引0
     /*0x4001*/    EventUsrPowerOn ,                           这个对应索引1
      /*0x4002     EventUsrPowerOff ,                          这个对应索引2
    /*0x4003*/    EventUsrEnterPairing ,)                     这个对应索引3
这里分配了三块内存空间,分配为A,B,C 每一块存储22个事件,其中
A内存块存储事件索引为0-21 对应的事件索引为 :2 、 1 、 3、 4、 6 、26 、 8 、 9 、a 、b、 18、 18 、11 、 12 、1e 、1f、20 、95、96、18、34、27;


B内存块存储事件索引为22-43


A内存块存储事件索引为44-66




每一个内存块存储33个事件。。。。。  这里好像有两个内存块来存储事件 可以存储66个事件
void buttonManagerAddMapping ( event_config_type * event_config, uint8 index ) 


    /*used by the button manager*/
typedef struct ButtonEventsTag
{  
    unsigned     ButtonMaskLS :16; /* least significant word of the button mask 这个对应 logical input mask*/
    unsigned     ButtonMaskVC :2;  /* VREG and CHG bits of the mask 这个对应 VREG和CHG */
    unsigned     StateMask :14;   /*这个对应 state mask */   
    
    unsigned     Duration:4 ; /*ButtonsTime_t  这个对应 Button timing */
    unsigned     Event:12 ;   /* 这个对应 user event*/
}ButtonEvents_t ;




void buttonManagerInit ( void ) 


函数功能:
   为 ButtonsTaskData 分配内存空间
    为 两个事件块分配内存空间 
     theSink.theButtonsTask->gButtonEvents[0] = (ButtonEvents_t * ) ( mallocPanic( sizeof( ButtonEvents_t ) * BM_EVENTS_PER_CONF_BLOCK ) ) ;
    theSink.theButtonsTask->gButtonEvents[1]= (ButtonEvents_t * ) ( mallocPanic( sizeof( ButtonEvents_t ) * BM_EVENTS_PER_CONF_BLOCK ) ) ;






按键PIO14 按下 input0 打印结果:
But CheckDet: Inputs: Cap[0] PIO[1004000] Inputs[1000001] OldState[1000000]
But CheckDet: Masks:  Edge [2000000] Lev [100001f]
But Lev Det|:NewInput[1000001] OldInput[1000000]
button press 
But CheckDet: Inputs: Cap[0] PIO[1000000] Inputs[1000000] OldState[1000001]
But CheckDet: Masks:  Edge [2000000] Lev [100001f]
But Lev Det|:NewInput[1000000] OldInput[1000001]
button was realease 


按键PIO13 按下 input1 打印结果: 怎么会是 100fc02 ???
But CheckDet: Inputs: Cap[0] PIO[1002000] Inputs[100fc02] OldState[1000000]
But CheckDet: Masks:  Edge [2000000] Lev [100001f]
But Lev Det|:NewInput[1000002] OldInput[1000000]
button press 
But CheckDet: Inputs: Cap[0] PIO[1000000] Inputs[1000000] OldState[100fc02]
But CheckDet: Masks:  Edge [2000000] Lev [100001f]
But Lev Det|:NewInput[1000000] OldInput[100fc02]
button was realease 


按键PIO12 按下 input2 打印结果:
But CheckDet: Inputs: Cap[0] PIO[1001000] Inputs[1000004] OldState[1000000]
But CheckDet: Masks:  Edge [2000000] Lev [100001f]
But Lev Det|:NewInput[1000004] OldInput[1000000]
button press 
But CheckDet: Inputs: Cap[0] PIO[1000000] Inputs[1000000] OldState[1000004]
But CheckDet: Masks:  Edge [2000000] Lev [100001f]
But Lev Det|:NewInput[1000000] OldInput[1000004]
button was realease 


按键PIO11 按下 input3 打印结果:
But CheckDet: Inputs: Cap[0] PIO[1000800] Inputs[1000008] OldState[1000000]
But CheckDet: Masks:  Edge [2000000] Lev [100001f]
But Lev Det|:NewInput[1000008] OldInput[1000000]
button press 
But CheckDet: Inputs: Cap[0] PIO[1000000] Inputs[1000000] OldState[1000008]
But CheckDet: Masks:  Edge [2000000] Lev [100001f]
But Lev Det|:NewInput[1000000] OldInput[1000008]
button was realease 


//都是提前做好布局。。。。
有两个表非常重要。。。。。。


第一个表:Translation;
第二个表:User Events;


第一步:查找State Mask: 是否选中满足那些状态
Powering on;
connectable;
connectable/discoverable;
connected;
outgoing call;
incoming call;
ongoing call with sco;
test mode;
twc call waiting;
twc call on hold;
twc multi party call;
twc incoming call on hold;
ongoing call without sco;
streaming a2dp;


第二步:查找 Logical Input Mask 是否选中那个logical input
Logical Input 0
Logical Input 1
Logical Input 2
Logical Input 3
Logical Input 4
Logical Input 5
Logical Input 6
Logical Input 7
Logical Input 8
Logical Input 9
Logical Input 10
Logical Input 11
Logical Input 12
Logical Input 13
Logical Input 14
Logical Input 15


第三步:查找VREG 是否选中


第四步:查找CHG  是否选中


第五步:Button Timing 是否选中哪一个按键对应的时间
short
long
double
repeat
rising
falling
sh single
long rel
vlong rel
vvlong
vvlong rel
unassigned




如何配置 level detect电平检测(电平检测应该就是高电平检测或者低电平检测) ,
边沿检测(就是上升沿检测或者下降沿检测)
//使用软件 sink_configuration_tool 工具:在选项
User Interface 下面的Buttons 下的Translation 
定义如下:
Logical Input Number     Physical Input Signal
     Input0                  PIO 13
     Input1                  PIO 12
     Input2                  PIO 11
     Input3                  PIO 10
     
     Input4                  CAP 0
     Input5                  CAP 1
     Input6                  CAP 2
     Input7                  CAP 3
     Input8                  CAP 4
     Input9                  CAP 5
     Input10                  PIO 13
     Input11                  PIO 13
     Input12                  PIO 13
     Input13                  PIO 13
     Input14                  PIO 13
     Input15                  PIO 13
     VREG                     PIO 24
     CHG                      PIO 25


现在改成:


     Logical Input Number     Physical Input Signal
     Input0                  PIO 14
     Input1                  PIO 13
     Input2                  PIO 12
     Input3                  PIO 11
     
     Input4                  CAP 0
     Input5                  CAP 1
     Input6                  CAP 2
     Input7                  CAP 3
     Input8                  CAP 4
     Input9                  CAP 5
     Input10                  PIO 13
     Input11                  PIO 13
     Input12                  PIO 13
     Input13                  PIO 13
     Input14                  PIO 13
     Input15                  PIO 13
     VREG                     PIO 24
     CHG                      PIO 25


Double Press:500ms  :时间间隔,在一秒钟之内产生的按下次数会导致一个double类型事件,而不是单一的按下。


Long   Press:1000ms :长时间按下,为了产生一个 long timer 消息


very long press:2500ms :长时间按下,为了产生一个 very long timer 消息




repeat rate :800ms:这个还不清楚 


very very long press :5000ms :长时间按下,为了产生一个 very very long timer 消息




判断是哪一个按键 按下的  经过测试 开发板按键对应如下


               PLAY ------>PIO11 0x800;
               V-   ------>PIO12 0x1000;
               V+   ------>PIO13 0x2000;
               PREF ------>PIO14 0x4000;
*/


//四个按钮 定义如下:


#define BUTTON_A        (1 << 11)        /* PIO0 is BUTTON_A */
#define BUTTON_B        (1 << 12)        /* PIO1 is BUTTON_B */
#define BUTTON_C        (1 << 13)        /* PIO2 is BUTTON_C */
#define BUTTON_D        (1 << 14)        /* PIO3 is BUTTON_D */


   /* Set app task to receive PIO messages */
    MessagePioTask(&app.task); 
Task MessagePioTask (Task task)
 注册一个任务主要去处理PIO变化,参数task将会接收消息MESSAGE_PIO_CHANGED当引脚被
函数(uint32 PioDebounce32(uint32 mask,uint16 count,uint16 period);)配置相关引脚引起的变化。






函数:bool PioCommonDebounce(uint32 pins,uint16 count,uint16 period);


  /* Setup PIO interrupt messages  设置PIO中断消息 */
  /* PIO pins we are interested in */   
 PioDebounce32(BUTTON_A | BUTTON_B | BUTTON_C | BUTTON_D, 2, 20);  


配对PIO 监控
uint32 PioDebounce32(uint32 mask,uint16 count,uint16 period);


mask:位掩码 指示哪一个引脚需要监控,如果设置为0则失能PIO监控。


count:如果设备为1那么不会消除抖动,那么就可以引起多次事件发生。如果设置为0,那么更加
会产生未知的事件发生,即使引脚的变化没有被检测到。


period:延时时间。单位毫秒


这个函数主要功能:去除PIO输入引脚的按键抖动,发生消息MESSAGE_PIO_CHANGED到函数
Task MessagePioTask (Task task) 注册的任务中。


MESSAGE_PIO_CHANGED  对应结构体类型为:


uint16 state;      消息发送出去的状态对应引脚是 PIO0---PIO15;
uint32 time;
uint16 state16to31;  消息发送出去的状态对应引脚是 PIO16---PIO31;






 uint32 PioSetMapPin32(uint32 mask,uint32 bits); //设置引脚映射为其他功能 32位 如果其中一位mask返回高电平说明没有被映射
mask:设置为1将要被监控,设置为0不会被监控
bits:设置为1将会映射,设置为0不会映射。




 CSR8670的PIO引脚映射其他功能如下所示:
 PIO0-PIO12 不能被映射 总是输入输出功能;  
 PIO13-PIO15如果需要也可以被映射,但是看使用哪个包,如果是CSP就必须映射PIO13-PIO15位UART_RX,UART_TX和UART_CTS.
 在BGA包PIO13-PIO15就有自己的引脚定义,但是如果被映射将要被连接到UART_RX,UART_TX和UART_CTS引脚。无论是否被映射都可以设置为输入输出功能
 
 PIO16可以被映射为UART_RTS 也可以作输入输出功能;
 PIO17可以被映射为PCM_IN 也可以作输入输出功能;
 PIO18可以被映射为PCM_OUT 也可以作输入输出功能;
 PIO19可以被映射为PCM_SYNC 也可以作输入输出功能;
 PIO20可以被映射为PCM_CLK 也可以作输入输出功能;
 PIO21可以被映射为SQIF Flash Clock引脚, 也可以作输入输出功能;
 PIO22可以被映射为SQIF RAM Clock引脚, 也可以作输入输出功能;
 PIO23可以被映射为SQIF Flash CS引脚, 也可以作输入输出功能;
 PIO24可以被映射为SQIF RAM CS引脚, 也可以作输入输出功能;
 PIO25可以被映射为SQIF DB0引脚, 也可以作输入输出功能;
 PIO26可以被映射为SQIF DB1引脚, 也可以作输入输出功能;
 PIO27可以被映射为SQIF DB2引脚, 也可以作输入输出功能;
 PIO28可以被映射为SQIF DB3引脚, 也可以作输入输出功能;
 PIO29-PIO31 不能被映射或者去写入;




typedef struct TaskData* Task; //Task 是一个结构体指针类型变量
typedef struct
{
   void(*handler)(Task,MessageId,Message);  //是一个函数指针类型
}TaskData;






下面宏定义在文件 #include<ps_if.h>定义


#define PSKEY_PIO_WAKEUP_STATE   (((900))+27)


下面函数在文件 #include<ps.h>定义
 PsFullRetrieve(PSKEY_PIO_WAKEUP_STATE, &pskey_val, sizeof(pskey_val));


uint16 PsFullRetrieve(uint16 key,void *buff,uint16 words);
函数功能是从存储key指向的地址的内容拷贝到buff数据缓存中,拷贝的字节数为words。
返回0应该是key不存在或者它的存储长度大于words。返回读取的字长度。




/* Persistent store event configuration definition */
typedef struct
{
  unsigned    event:8;
  unsigned type:8;
  uint16   pio_mask;
  uint16   state_mask;
}event_config_type;






/**********************************************************************************/
按键处理流程:


第一步:调用函数void configManagerPioMap(void)
功能:
为按钮数据和声音映射开辟内存空间
设置PIO引脚映射等功能;打印结果为 0 说明没有任何引脚映射 在这里配置


第二步:configManagerButtons( );
函数功能:读取系统事件配置和配置按钮
增加相关映射事件 这个不是很清楚如下代码:
  for(n = 0; n < BM_EVENTS_PER_PS_BLOCK; n++)
    { 
        CONF_DEBUG(("Co : AddMap indexes [%u,%u] Ev[%x][%x][%x]\n", n, i, configA[n].event , configB[n].event, configC[n].event )) ;
                       
           /* check to see if a valid pio mask is present, this includes the upper 2 bits of the state
              info as these are being used for bc5 as vreg enable and charger detect */
        if ( (configA[n].pio_mask)||(configA[n].state_mask & 0xC000))
            buttonManagerAddMapping ( &configA[n], i++ ); 
               
        if ( (configB[n].pio_mask)||(configB[n].state_mask & 0xC000))
            buttonManagerAddMapping ( &configB[n], i++ ); 
        
        if ( (configC[n].pio_mask)||(configC[n].state_mask & 0xC000))
            buttonManagerAddMapping ( &configC[n], i++ );         
                                                                 
    }


后面调用函数BMCheckButtonsAfterReadingConfig();接着在调用函数:
ButtonsCheckForChangeAfterInit();


第三步:函数ButtonsCheckForChangeAfterInit();里面调用了一个重要的函数






第四步:消息 HFP_INIT_CFM 调用函数 InitEarlyUserFeatures();
函数InitEarlyUserFeatures(); 其中里面调用了 buttonManagerInit() ; 




第五步:  buttonManagerInit() ; 其中调用函数
 ButtonsInit( theSink.theButtonsTask ) ;


第六步: ButtonsInit( theSink.theButtonsTask ) ;
函数功能:
pButtonsTask->task.handler = ButtonsMessageHandler; /* 按钮消息处理任务 */
    
    /*connect the underlying PIO task to this task  注册PIO变化的处理消息*/
    MessagePioTask(&pButtonsTask->task); /* 注册 PIO 按键变化 任务 */


    /*connect the underlying Charger task to this task 处理片装电池充电器和电源系统硬件消息*/
    MessageChargerTask(&pButtonsTask->task); 




第七步:static void ButtonsMessageHandler ( Task pTask, MessageId pId, Message pMessage ) 
这个函数主要处理按键产生的消息比如:  case MESSAGE_PIO_CHANGED : /* PIO 状态变化 消息处理 */
下面调用函数 ButtonsCheckDetection(0, lNewPioState); 非常重要这个函数


第八步:






static void BMCheckForButtonMatch ( uint32 pButtonMask , ButtonsTime_t  pDuration );
 检查一个按键为的是在按键事件映射当中进行匹配,发送一个消息到任务中为了回应这个事件。。。








static sinkState gTheSinkState ;  //定义一个静态全局变量     
  获取当前设备状态 
sinkState stateManagerGetState ( void )
{
    return gTheSinkState ;
}


以下是所有的状态类型。。。。。  共有15种类型 
typedef enum
{
       
    deviceLimbo, /*! The device is logically off but physically on - limbo power on 上电状态  */
       
    deviceConnectable, /*! The device is connectable - page scanning 这个设备处于可连接状态  */
      
    deviceConnDiscoverable,  /*! The device is connectable and discoverable - page and inquiry scanning*/
      
    deviceConnected,  /*! The device is connected to an AG*/
      
    deviceOutgoingCallEstablish,  /*! The connected AG has an outgoing call in progress*/
       
    deviceIncomingCallEstablish, /*! The connected AG has an incoming call in progress*/
        
    deviceActiveCallSCO ,/*! The connected AG has an active call in progress and the audio is in the device */
       
    deviceTestMode , /*! The device is in test mode*/
       
    deviceThreeWayCallWaiting, /*! The connected AG has an active call and a second incoming call*/
      
    deviceThreeWayCallOnHold,  /*! The connected AG has an active call and a second call on hold*/
        
    deviceThreeWayMulticall,/*! The connected AG has more than one active call*/
       
    deviceIncomingCallOnHold ,  /*! The connected AG has an incoming call on hold*/
       
    deviceActiveCallNoSCO , /*! The connected AG has an active call and the audio is in the handset*/
      
    deviceA2DPStreaming ,  /*! The device is streaming A2DP audio */
     
    deviceLowBattery    /* low battery state, won't actually change to this state but will be used for independant low battery led warning */
           
} sinkState;


检测一个按钮为的是匹配按钮事件映射,并发送一个消息到任务中回应这个事件。。。
static void BMCheckForButtonMatch ( uint32 pButtonMask , ButtonsTime_t  pDuration ); //这个函数非常重要。。。。 
这个函数里面的消息有 MessageSend( theSink.theButtonsTask->client, (lButtonEvent->Event + EVENTS_MESSAGE_BASE) , 0 ) ;






非常短时间:
B_SHORT
 pButtonsTask->gBTime != B_INVALID 




双击
 pButtonsTask->button_config->long_press_time=1000
  pButtonsTask->button_config->repeat_time=800
B_SHORT
 pButtonsTask->gBTime != B_INVALID 
  pButtonsTask->button_config->long_press_time=1000
  pButtonsTask->button_config->repeat_time=800
TapCount: [1000008][1000008][2]
pButtonsTask->gBTime != B_INVALID 




三击:
 pButtonsTask->button_config->long_press_time=1000
  pButtonsTask->button_config->repeat_time=800
B_SHORT
 pButtonsTask->gBTime != B_INVALID 
  pButtonsTask->button_config->long_press_time=1000
  pButtonsTask->button_config->repeat_time=800
TapCount: [1000008][1000008][2]
pButtonsTask->gBTime != B_INVALID 
  pButtonsTask->button_config->long_press_time=1000
  pButtonsTask->button_config->repeat_time=800
TapCount: [1000008][1000008][3]
TRIPLE_PRESS 
pButtonsTask->gBTime != B_INVALID 




1秒钟:
 pButtonsTask->button_config->long_press_time=1000
  pButtonsTask->button_config->repeat_time=800
B_LONG
 pButtonsTask->gBTime != B_INVALID 




2.5秒钟:
 pButtonsTask->button_config->long_press_time=1000
  pButtonsTask->button_config->repeat_time=800
B_VERY_LONG
 pButtonsTask->gBTime != B_INVALID 


5秒钟:
 pButtonsTask->button_config->long_press_time=1000
  pButtonsTask->button_config->repeat_time=800
B_VERY_VERY_LONG
 pButtonsTask->gBTime != B_INVALID 










原来的事件配置:
AVRCP Play Pause :
state mask = 0x2008 :状态是connected streaming A2DP


Logical mask = 0x0008 : 对应 input3 PIO11


Button timing = long ;


现在改为这样的配置:


AVRCP Play Pause :
state mask = 0x2008 :状态是connected streaming A2DP


Logical mask = 0x0008 : 对应 input3 PIO11 选中VREG


Button timing = vvlong ;






看配置文件通过这个结果得知:


                      事件是Peer Session Inquire ;  EventUsrPeerSessionInquire,
                       state mask:0x000e;
                       logical input mask=0x0008;
                       vrfg 已经选中
                       button timing :vlong 




现在改为:
        看配置文件通过这个结果得知:事件是Peer Session Inquire ;  EventUsrPeerSessionInquire,
                       state mask:0x000e;
                       logical input mask=0x0000;
                       vrfg 已经选中
                       button timing :vlong 


/********************************************************************************************/


结果:
第一:必须要选中 VREG 


第二:主要的函数处理static void BMCheckForButtonMatch ( uint32 pButtonMask , ButtonsTime_t  pDuration ) 




第三:必须学会使用软件对USER event进行相关配置。。。。。






/************************************************************2015-5-25**********************************************/


没有按下 MFB 
MFB 上电开机 
MFB  手动开机  






  */
/*打印下 这个结果。。。。 如下  总共打印56条信息 这完全匹配了软件配置事件表格了。。。。 */
        
 /*


第一个参数:是否选中VREG 如果选中则该值为1 否则为0
第二个参数:事件类型 对应文件#include "sink_event.h" 定义的事件索引
第三个参数:时间
第四个参数:该事件对应真正的掩码 包括input0-input15 和VREG 
第五个参数:所有事件对应的掩码




BM: Add Mapping:ButteonMaskVC[1] Event[2] Duration[3] Input Mask[0x1000000] Level Check[0x1000000]
BM: Add Mapping:ButteonMaskVC[0] Event[d] Duration[1] Input Mask[0x4] Level Check[0x1000004]
BM: Add Mapping:ButteonMaskVC[1] Event[45] Duration[b] Input Mask[0x1000008] Level Check[0x100000c]
BM: Add Mapping:ButteonMaskVC[1] Event[1] Duration[2] Input Mask[0x1000000] Level Check[0x100000c]
BM: Add Mapping:ButteonMaskVC[0] Event[d] Duration[5] Input Mask[0x4] Level Check[0x100000c]
BM: Add Mapping:ButteonMaskVC[0] Event[47] Duration[8] Input Mask[0x8] Level Check[0x100000c]
BM: Add Mapping:ButteonMaskVC[1] Event[3] Duration[b] Input Mask[0x1000000] Level Check[0x100000c]
BM: Add Mapping:ButteonMaskVC[0] Event[e] Duration[1] Input Mask[0x2] Level Check[0x100000e]
BM: Add Mapping:ButteonMaskVC[0] Event[48] Duration[8] Input Mask[0x10] Level Check[0x100001e]
BM: Add Mapping:ButteonMaskVC[0] Event[4] Duration[8] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[e] Duration[5] Input Mask[0x2] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[49] Duration[2] Input Mask[0x8] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[6] Duration[2] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[c] Duration[1] Input Mask[0x6] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[4a] Duration[9] Input Mask[0x8] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[26] Duration[4] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[10] Duration[8] Input Mask[0x5] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[4a] Duration[a] Input Mask[0x8] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[8] Duration[8] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[13] Duration[1] Input Mask[0x3] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[4a] Duration[c] Input Mask[0x8] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[9] Duration[2] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[14] Duration[2] Input Mask[0x5] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[4b] Duration[2] Input Mask[0x10] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[a] Duration[8] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[6] Duration[1] Input Mask[0x1000002] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[4c] Duration[9] Input Mask[0x10] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[b] Duration[2] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[f] Duration[3] Input Mask[0x6] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[4c] Duration[a] Input Mask[0x10] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[18] Duration[2] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[2d] Duration[1] Input Mask[0x1000003] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[4c] Duration[c] Input Mask[0x10] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[18] Duration[9] Input Mask[0x1000000] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[2e] Duration[3] Input Mask[0x1000003] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[57] Duration[4] Input Mask[0x8] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[11] Duration[8] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[8f] Duration[b] Input Mask[0x1000001] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[58] Duration[4] Input Mask[0x10] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[12] Duration[4] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[22] Duration[b] Input Mask[0x1000003] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[46] Duration[2] Input Mask[0x1000000] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[1e] Duration[4] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[1] Duration[2] Input Mask[0x1000008] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[1f] Duration[8] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[1] Duration[2] Input Mask[0x1000004] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[20] Duration[2] Input Mask[0x1] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[89] Duration[3] Input Mask[0x1000000] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[2] Event[95] Duration[6] Input Mask[0x2000000] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[8a] Duration[3] Input Mask[0x1000004] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[2] Event[96] Duration[7] Input Mask[0x2000000] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[0] Event[8b] Duration[2] Input Mask[0xc] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[18] Duration[a] Input Mask[0x1000000] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[18] Duration[8] Input Mask[0x1000000] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[34] Duration[2] Input Mask[0x1000001] Level Check[0x100001f]
BM: Add Mapping:ButteonMaskVC[1] Event[27] Duration[4] Input Mask[0x1000001] Level Check[0x100001f]






设置当前设备状态提供一个单独状态改变指示和传递消息给管理者请求状态回应 
static void stateManagerSetState ( sinkState pNewState );






必须要去掉所有printf 打印语句然后重新上电 就可以了。。。。。。








In BlueCore and CSR μEnergy Software Development Kit (SDK) projects the database is described using a special object language. 
This database can be automatically generated by the GATT Database Generator.
这允许应用程序开发人员创建数据库的简单易读的、可维护的方式而不需要复杂的二进制表示形式,比如用于SDP记录。










B:BMH - PIO_CHANGE: 0 2000 //0001 0000 0000 0000    按下按键的时候 获取了状态 按下的时候调用函数static void ButtonsLevelDetect ( const uint32 pInput , ButtonsTaskData * pButtonsTask ) 


 B_REPEAT_TIMER 
B:Timer
 B_REPEAT_TIMER 
 B_REPEAT_TIMER 
B:Timer
 B_REPEAT_TIMER 
 B_REPEAT_TIMER 
 B_REPEAT_TIMER 
B:Timer
 B_REPEAT_TIMER 
 B_REPEAT_TIMER 
 B_REPEAT_TIMER 
B:BMH - PIO_CHANGE: 0 0 //按键释放的时候  重新得到该状态 释放的时候 调用函数static void ButtonsLevelDetect ( const uint32 pInput , ButtonsTaskData * pButtonsTask ) 


B_VERY_VERY_LONG //释放的时候得到按键的状态调用函数 static void ButtonsButtonDetected (  ButtonsTaskData * pButtonsTask, uint32 pButtonMask  , ButtonsTime_t pTime )


 pButtonsTask->gBTime != B_INVALID //重新回到按键的初始化状态 
 lNewInput
 
 




//500ms


 B:BMH - PIO_CHANGE: 0 1000
 B_REPEAT_TIMER 
EventUsrVolumeUp
B:BMH - PIO_CHANGE: 0 0
B_SHORT
 pButtonsTask->gBTime != B_INVALID 
 lNewInput




//2500


B:BMH - PIO_CHANGE: 0 1000
 B_REPEAT_TIMER 
EventUsrVolumeUp
B:Timer
 B_REPEAT_TIMER 
EventUsrVolumeUp
 B_REPEAT_TIMER 
EventUsrVolumeUp
B:BMH - PIO_CHANGE: 0 0
B_LONG
 pButtonsTask->gBTime != B_INVALID 
 lNewInput
 


//
这里的按键 




static void ButtonsLevelDetect ( const uint32 pInput , ButtonsTaskData * pButtonsTask ) 


这个函数其实调用了两次,第一次是在按键按下的时候,第二次是按键释放的时候。




这里利用发送消息来起到定时的功能:
  在800ms之内完成按下释放动作,释放的时候按键处于short状态,并且启动500ms的消息,这里分为两个处理,
  第一如果超过500ms没有按下按键说明只是短按键的触发功能。
  第二如果在500ms之内按下了按键说明这里是连续双击事件触发。
  (这里只解释双击事件,不解释三击事件了)
  
  如果超过1000ms才释放按键的话,这里有分为三个状态long,very_long,very_very_long 


  如果在1000ms-2500ms之间,按键处理long状态触发功能
   1:设置按键状态为 lBTask->gBTime = B_LONG ;
   2:启动消息函数MessageSendLater ( &lBTask->task , B_INTERNAL_TIMER , 0 , (lBTask->button_config->very_long_press_time - lBTask->button_config->long_press_time)) ;
   3:lBTask->button_config->very_long_press_time - lBTask->button_config->long_press_time = 1500ms
   4:如果在1500ms之内释放了按键,处理B_LONG状态的事件,ButtonsButtonDetected ( pButtonsTask , lOldInput , B_LONG_RELEASE  ); 
   5:如果超过1500ms释放按键,设置状态 lBTask->gBTime = B_VERY_LONG ;并发送消息函数
   MessageSendLater ( &lBTask->task , B_INTERNAL_TIMER , 0 ,  (lBTask->button_config->very_very_long_press_time - lBTask->button_config->very_long_press_time ) ) ;  


  如果在2500ms-5000ms之间,按键处理very_long状态触发功能
   lBTask->button_config->very_very_long_press_time - lBTask->button_config->very_long_press_time = 5000-2500=500ms。
  1:如果在500ms之内释放了按键处理状态very_long 的事件,同上边步骤一样。




  如果在超过5000ms,按键处理very_very_long状态触发功能


上边使用三个消息 来起到定时的功能:


B_MULTIPLE_TIMER 


B_INTERNAL_TIMER


B_REPEAT_TIMER






//回调函数 static void app_handler(Task task, MessageId id, Message message)
theSink.task.handler = app_handler;  //上层应用程序的回调函数入口地址




































































 
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值