二、Sink例程

1. Sink例程

CSR粗略的将audio蓝牙设备分为了两大类:sink和source设备,并分别提供了两类设备的例程,配置工具,说明文档。如对于sink设备,提供了sink app例程,SinkUserGuide,SinkConfigurationUserGuide,SinkConfigurationTool等。SinkUserGuide主要介绍了sink app里面涉及到的一些抽象概念,重要功能 (如用户事件,audio configuration,audio routing, input manager, smart control等)。SinkConfigurationUserGuide则主要介绍sink app里面涉及到的配置参数(PS_KEY)的定义; SinkConfigurationTool则提供了一个GUI界面供用户配置sink app里面的配置参数(PS_KEY)。

Sink app运行一个状态机,该状态机有多个状态,状态机根据外部输入进行状态翻转,并进行适当的操作。这个外部输入是以事件形式产生的。这就产生了以下几个概念和问题:

1.状态机有哪些状态,各个状态的主要工作是什么?

2.事件有哪些?事件是如何产生的?

Sink app共有以下几个状态:Limbo,Connectable,ConnDiscoverable,Connected,OutgoingCallEstablish,IncomingCallEstablish,ActiveCallSCO,TestMode,ThreeWayCallWaiting,ThreeWayCallOnHold,ThreeWayMulticall,IncomingCallOnHold,ActiveCallNoSCO,A2DPStreaming,LowBattery。可见大部分状态跟连接建立和维护有关。

事件分为用户事件(user event)和系统事件(system event)。系统事件主要用于通知状态机操作失败等内部事件,这些内部事件通常与外部输入无关,如PairingFail,ChargeComplete,BatteryLow,SysError等,因此不支持配置,我们重点关注用户事件。用户事件通常都跟用户输入有关,物理表现就是跟某个PIO关联,对于一个按键,可以有不同的操作语义(长按,短按,重复按等),同时,某个事件是跟状态机状态是相关的,即只有在某些特定状态里面,该事件才是有效,否则应该忽略掉。因此一个有效的用户事件应该具有以下属性:

1.关联感兴趣的PIOs。可以关联多个PIO,这种情况下,多个PIO同时满足条件时才能触发该事件;

2.定义按键属性,可选属性有:短按,长按,双击,重复,上升沿,下降沿等;

3.指定有效状态,用户事件只在指定的状态内产生。可以指定多个状态。

因此一个用户事件的产生应该同时满足以下三个条件:关联的PIOs检测到预定义的按键属性,并且处于有效状态内。

Input manager模块下面的event配置与event configuration有和区别和联系???

1.1  PIO管理和映射

Sink app将PIO资源抽象出16个逻辑IO,与IO相关的配置(input,output,user event configuration等)都是基于逻辑IO的。Sink app维持一个逻辑IO与物理IO的映射表,通过修改映射表来将逻辑IO与物理IO进行关联,这样能大大提高代码可移植性。

INPUT/OUTPUT配置。

Sink app需要利用PIO来对外部事件的输入进行接收,以及在某个事件发生时需要通过某个PIO来通知外部设备。

Sink app目前的预定义的输入事件有:SPIDF input, Analog input, Charger input, DUT mode input。如果需要使用这些事件,就需要给其指定一个PIO,用于接收该事件。

Sink app目前的预定义的输出事件有:call active, incoming, outgoing, sink active, power on, LED enable.

CSR芯片部分引脚是是某项功能与PIO共用的,如CSR8670的H3是PCM_OUT与PIO[18]共用,默认是工作在非PIO模式下面,因此如果欲使用PIO[18],则需要设置PIO  mapping assignments配置参数,使其工作在PIO模式下面。PIO[0..12]默认是工作在PIO模式下面,因此无需设置。

对于某个PIO,当其工作在输入模式时(比如按键),默认高电平表示按下按键,当其工作在输出模式时,事件产生时默认产生高电平。当IO工作在输入模式时,如果希望改变这种行为(电平极性),可以通过配置PIO invert mask field bits进行修改。IO工作在输出模式时,无法改变极性。

1.2       LED管理和配置

大部分蓝牙设备没有配备屏幕的显示设备,因此通过LED的某种闪烁模式来指示设备的工作状态成为一种可行以及实用的方法。LED的管理和配置主要分为三大部分:

1.为某个状态设置一种LED模式;

2.为某个事件设置一种LED模式;

3.三色LED设置。

LED模式主要涉及以下属性:

1.LED on time。

2.LED off time。

3.LED repeat time.闪烁间隔。

4.time out。从开启模式到结束模式历时,0表示无限长。

5.Number of flashes。

6.LED_A映射。

7.LED_B映射。

8.override led disable。

9.colour。A,B显示组合配置。

LED模块抽象出两个LED灯——LED_A,LED_B,根据映射规则,其可能映射到1~3个物理IO输出,同时两个LED组合起来(A, B, A&&B, A|B),能够产生多种颜色。

LED_A/LED_B可以映射为:PIO[0..10],LED_0,LED_1,Tricol_a(抽象LED),Tricol_b,Tricol_c中之一。比如LED_A映射为PIO2,则PIO2作为LED_A的实际输出引脚。

其中Tricol_a/b/c是抽象出来的三个三色LED灯,通过配置(映射),与实际的PIO[0..10],LED_0,LED_1, LED_2相关联。

LED状态/事件指示的几种特殊用法:

一、在某件事件发生(如power on/Power off)时,指定IO输出一个电平脉冲(1000ms高电平脉冲为例)。

1、on_time = 1000, off_time = 0,repeat time = 0,Number of flashes = 1;

2、指定IO。

二、在某个状态(connected)内,将指定IO拉高或者拉低(以拉高为例)。

1、on_time = 100(非零数值均可), off_time = 0,repeat time = 0,Number of flashes = 0;

2、指定IO。

关于LED Filter

2.      TASK/MESSAGE

时间: 2024-11-10 07:07:22

二、Sink例程的相关文章

C++二维数组(指针)做参数

一.问题描述 使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃.下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍. 1.二维数组的定义与初始化 在实际使用数组的时候往往开始不知道二维数组的行数和列数,因此程序需要根据用户输入动态定义二维数组的行和列.这里通过C++二级指针来实现,引入变量 int rowNum 行 数, int coluNum 列数, char **p 二维字符数组,这里假定二维字符数组中的字符只能为'0'和'1'. int

一、Stream,sink,source,transform

1. 蓝牙核心概述 2.Stream,sink,source,transform 在ADK的blueCore里面,Stream作为一个逻辑结构用来描述一个数据终点(data Endpoint).通常,一个流描述一个sink或者source,比如一个UART口,既可以接受数据,也可以发送数据,因此UART-stream包含一个sourse和一个sink. Data can be written to a sink and read from a source. An application may

C++ 虚函数表解析(转)

转自:http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以看看相关的C

特别优秀的虚函数讲解博客地址

http://blog.csdn.net/haoel/article/details/1948051/ C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么

关于c#中”ref”和”out”关键字的一些理解

一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正) 在c#中,方法的参数传递有四种类型: (1) 传值参数(by value) 传值参数无需额外的修饰符.传值参数在方法调用过程中,如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保持原来传入的值.实际 上,传值参数传递的是调用参数的一份拷贝,因此在调用方法的过程中,即使改变了参数的值,也不会影响到实际传入的参数值,详见例程: (2) 传址参数(by reference) 传址

c++ 虚函数表

转自 http://blog.csdn.net/haoel/article/details/1948051/ C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,

关于C++虚函数表的那些事儿

前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以看看相关的C++的书籍.在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰

学习笔记-quartz2D

一.简介                                                                            quartz2D是属于core Graphic框架,该框架是基于C的API.quartz2D用于绘制平面图形. 二.例程步骤 添加UIView的子类MyView,在MyView.m中实现如下方法: 1 #pragma mark 在这个方法内部进行绘图 2 - (void)drawRect:(CGRect)rect { 3 4 } 在该方法

C++ 虚函数表解析(比较清楚,还可打印虚函数地址)

C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以