brew开发--FM 收音机

    终于完成了自己在brew平台上的第一个项目--FM收音机。由于之前项目硬件的原因,项目组之前没有开发FM收音机模块。所以我得从最原始的需求开始,编写概要设计文档,接下来是详细设计,不过公司不用写详细设计,这一步就省了。还好需求和UI不是我做的,我只需要和需求工程师和UI工程师以及SPDM一起确定需求和UI。

    FM收音机包括调节频率,调节音量,频道管理,保存频道,制式选择,自动扫描,灵敏度调节,收听方式选择,立体声和单声道以及最小化收音机功能。收音机的实现通过com + app来实现。com主要实现与收音机功能相关的部分,而app主要是处理界面相关的部分。
    主界面:

2010062123492328.jpg

    主界面显示当前播放的制式、频率,频道号、频道名称、收听方式及保真度(立体声或单声道)

注:这里音量是不显示的,只有调节音量时才显示音量图标,调节完成后音量图标消失。

    主菜单界面:

2010062123553528.jpg2010062123554818.jpg

1.调节频率:
    调节频率可以通过三个方式:

        1.通过左右键调节频道,每按一个左/右键,频率-/+0.1MHz,当频率调节到最小时,再按左键没有反应,同样的,频率调节到最大时,再按右键也没有反应。
        2.通过选项选择调节频率,直接输入频率值,点击确定,如果频率在合法的范围内,刚可直接跳到该频率; 如果频率不合法,则弹出提示对话框。
        3.通过上下键调节频率,点击上下键,可以在已保存的频道之前切换。如果当前播放频率不是已保存的频道,按上键,则跳到已保存的最大频率,按下键则跳到已保存的最小频率,如果当前播放的频率是已保存的频道,按上键则跳到该频道的上一频道,按下键则跳到该频道的下一频道。如果当前没有已保存的频道则按上下键没有反应,如果当前只有一个已保存的频道,则按上下键一直播放这个频道(前提是满足频率在当前制式的频率范围内,因为不同制式频率围不一样,但是有一部分交叉,而保存的频道是不区分制式的,可以参看制式先择功能)。

2.调节音量

2010062123530427.jpg
    当按侧边上下键时,可以调节音量,按上侧边键时音量增加一个单位,按下侧边键时音量减少一个单位。当音量为最大音量时,再按上侧边键没有反应当音量为最小音量时,按下侧边键也没有反应,音量调节完成后,音量图标消失。

3.频道管理
    通过选项菜单出入频道列表界面,可以对频道进行管理。包括删除频道,编辑频道,标记频道。频道列表界面如图:2010062123540910.jpg

    频道列表界面菜单:2010062123561276.jpg

    点击编辑进入频道编辑界面:2010062123564851.jpg

    点击删除可删除频道列表中当前选中的频道,点击删除所有可以删除所有频道,点击标记进入标记界面:2010062123582713.jpg

3.制式选择

2010062200000133.jpg
    制式选择包括日本制式和欧洲制式,日本制式的频率范围是70.0-90.0MHz,欧洲制式的频率范围为87.5-108.0MHz。

4.自动扫描

2010062200011234.jpg
    选择自动扫描,将清除所有保存的频道,并进行自动扫描,扫描结束后,当扫描成功时,自动播放扫描到的第一个频道,如果扫描失败,则播放扫描之前的那个频道。
5.灵敏度调节

2010062200015319.jpg
    选择灵敏度后,可按当前的灵敏度进行自动扫描,扫描后的处理和自动扫描相同。灵敏度越高,扫描到的频道越少,频道也越清晰,灵敏度越低,扫描到的频道越多,频道也越不清晰。

6.收听方式选择
    可以在耳机和者扬声器之间切换收听。以下是切换为扬声器模式收听:2010062200033149.jpg

7.立体声和单声道
     可以切换通过立体声或单声道进行收听。以下是切换为单声道模式收听:2010062200043371.jpg

8.最小化收音机
    最小化收音机,可以使收音机在后台播放。

几个需要注意的地方:
    1.最小化收音机,使收音机在后台播放。brew的App分为几种状态,激活的,挂起的,后台的,激活和挂起的App在应用程序栈里,brew通过这个栈来管理App.栈最上面的App是激活的状态,只有激活的App可以通过屏幕和用户来交互。当前运行的APP就是激活的状态,当APP收到EVT_APP_SUSPEND消息,处理完之后App就成了挂起的状态,挂起的App收到EVT_APP_RESUME消息,处理完之后成为active状态。所以可以通过suspend和resume来挂起和激活App.而后台的App不在这个栈里,所以它不会收到suspend和resume消息,也收不到按键消息。那么如何将一个app变成后台运行的?
    要将一个App放入后台运行,则应该在处理EVT_APP_STOP事件时,将dwParam的值设为false;在处理完EVT_APP_STOP事件后,这个App将进入后台运行。
代码示例:
    boolean bGoMinimize;

    case EVT_APP_STOP:
    if (bGoMinimize)
    {
       *((boolean*)dwParam) = false;
     return true;
  }

    后台的App怎么和用户和其他app交互呢?
    后台的APP没有办法和用户和其他app交互,我们只有通过ISHELL_StartApplet();来将App变成激活的才可以进行交互。可以定义一个用户自己的事件,将App激活,或者是通过某种条件激活。
 2.冲突处理
    在收音机播放的过程中,如果有其他需要播放声音的app要启动,这时就会产生冲突。如来电,短信,音乐播放,视频播放等等,根据不同App进行不同的处理,这里根据产生冲突的App运行的时间进行处理,主要是考虑省电,如果时间较长,则关闭收音机,如果时间较短,将收音机置为无声,等产生冲突的App关闭后,再继续播放收音机。
3.信息保存
    收音机关闭之后再打开,应该播放上一次播放的频率,声音大小也应该和上一次一样。这里通过一个配置文件保存这些信息,当收音机关闭时,将这些信息保存在配置文件中,下一次打开时,读配置文件信息,再进行播放,第一次打开时,配置文件中没有上一次播放的信息,所以收音机播放默认的频率和声音。

转载于:https://www.cnblogs.com/rager/archive/2010/06/22/1762332.html

猜你喜欢

转载自blog.csdn.net/weixin_34414650/article/details/93575594