搜索
bottom↓
回复: 3

好久没来,分享一下我MQX工程中的Bell模块!

[复制链接]

出0入0汤圆

发表于 2016-3-25 23:05:48 | 显示全部楼层 |阅读模式
本帖最后由 wangpengcheng 于 2016-3-25 23:07 编辑

其中应用了MQX中的事件!闲话没有,立马就来!

首先定义如下一个结构体:
typedef struct
{
    uint32_t on_time;                //Bell响的时间长度
    uint32_t off_time;                //Bell不响的时间长度
    uint32_t times;                //周期循环次数
    uint32_t wait_time;                //每个周期之间的间隔时间
}STRUCT_BELL_PARA, *pSTRUCT_BELL_PARA;

然后用这个结构体定义一个结构体常量数组:
static const STRUCT_BELL_PARA bell_event_para[] =   
{   
    {150, 30, 1, 1000},
            {150, 30, 3, 1000},
        {150, 30, 1, 1000},
        {150, 150, 5, 1000},
    {0,  0, 0, 0},
};
这是用来区分事件的,假如我们现在有四个事件如下:
typedef enum
{
    BELL_KEY_EVENT,                //按键事件
    BELL_ERROR_EVENT,        //错误事件
        BELL_OK_EVENT,        //OK事件
        BELL_POWER_OFF_EVENT, //关机事件
    BELL_EVENT_NUMBER,
}ENUM_BELL_EVENT_INDEX;
#define BELL_EVENT_ALL ((1 << BELL_KEY_EVENT) | (1 << BELL_ERROR_EVENT) | (1 << BELL_OK_EVENT) | (1 << BELL_POWER_OFF_EVENT))
然后上面四个事件分别对应着结构体常量数组中的常量。也就是说每个事件蜂鸣器的叫法不一样!

好了,现在我们应该做个BELL模块,如下:

typedef struct _bell *pSTRUCT_BELL;
typedef struct _bell
{
    void *para;
    void (*release)(pSTRUCT_BELL me);
    _task_id (*task_create)(pSTRUCT_BELL me, TASK_TEMPLATE_STRUCT_PTR template_list, _mqx_uint template_index);
    uint32_t (*set_on)(pSTRUCT_BELL me, uint32_t event_index);
}STRUCT_BELL;
从上面能看出来Bell模块里面包含三个函数以及一个参数入口变量,我们分别把这几个函数及变量补充起来:
//私有变量
typedef struct
{
    pSTRUCT_GPIO bell_port;
    char thread_name[MAX_NAME_SIZE];
    LWEVENT_STRUCT bell_event;
}STRUCT_PRIVATE, *pSTRUCT_PRIVATE;
//蜂鸣器事件发送函数
static uint32_t set_on(pSTRUCT_BELL me, uint32_t event_index)
{
    pSTRUCT_PRIVATE para = me->para;
    LWEVENT_STRUCT_PTR bell_event = &para->bell_event;
    if(event_index < BELL_EVENT_NUMBER)
    {
        _lwevent_set(bell_event, 1 << event_index);
    }
    return MQX_OK;
}
//任务
void bell_task(uint32_t task_para)
{
    pSTRUCT_BELL me = (pSTRUCT_BELL)task_para;
    pSTRUCT_PRIVATE para = me->para;
    pSTRUCT_GPIO bell_port = para->bell_port;
    LWEVENT_STRUCT_PTR bell_event = &para->bell_event;
    pSTRUCT_BELL_PARA bell_para;
    uint32_t event_bit, times;
    bell_port->init(bell_port, LWGPIO_VALUE_LOW);
    _lwevent_create(bell_event, LWEVENT_AUTO_CLEAR);
    while(1)
    {
        if(MQX_OK == _lwevent_wait_for(bell_event, BELL_EVENT_ALL, FALSE, NULL))
        {
            event_bit = _lwevent_get_signalled();
            do
            {
                if(event_bit & (1 << BELL_KEY_EVENT)){ bell_para = (pSTRUCT_BELL_PARA)&bell_event_para[BELL_KEY_EVENT];break; }
                                if(event_bit & (1 << BELL_ERROR_EVENT)){ bell_para = (pSTRUCT_BELL_PARA)&bell_event_para[BELL_ERROR_EVENT];break; }
                                if(event_bit & (1 << BELL_DOWN_OK_EVENT)){ bell_para = (pSTRUCT_BELL_PARA)&bell_event_para[BELL_DOWN_OK_EVENT];break;}
                                if(event_bit & (1 << BELL_POWER_OFF_EVENT)){ bell_para = (pSTRUCT_BELL_PARA)&bell_event_para[BELL_POWER_OFF_EVENT];break; }
            } while (0);
        }
        for(times = 0; times < bell_para->times; times++)
        {
            bell_port->write(bell_port, BELL_ON);
            _time_delay(bell_para->on_time);
            bell_port->write(bell_port, BELL_OFF);
            _time_delay(bell_para->off_time);
        }
    }
}
//任务创建,此处第二个以及第三个参数来自MQX的任务模板表
static _task_id task_create(pSTRUCT_BELL me, TASK_TEMPLATE_STRUCT_PTR template_list, _mqx_uint template_index)
{
        pSTRUCT_PRIVATE para = me->para;
        uint32_t task_index;
        _task_id task_id;
        for(task_index = 0; template_list[task_index].TASK_TEMPLATE_INDEX != 0; task_index++)
        {
                if(template_list[task_index].TASK_TEMPLATE_INDEX == template_index)
                {
                        break;
                }
        }
        assert(template_list[task_index].TASK_TEMPLATE_INDEX != 0);
        task_id = _task_get_id_from_name(template_list[task_index].TASK_NAME);
        if(task_id == MQX_NULL_TASK_ID)
        {
                task_id = _task_create(0, template_index, (uint32_t)me);
                assert(task_id != MQX_NULL_TASK_ID);
                strcpy(para->thread_name, template_list[task_index].TASK_NAME);
                return task_id;
        }
        return MQX_NULL_TASK_ID;
}
//模块释放
static void release(pSTRUCT_BELL me)
{
    pSTRUCT_PRIVATE para = me->para;
    _task_id task_id = _task_get_id_from_name(para->thread_name);
    if(task_id != MQX_NULL_TASK_ID)
    {
        _task_destroy(task_id);
    }
    _lwevent_destroy(&para->bell_event);
    para->bell_port->release(para->bell_port);
    _mem_free(para);
    _mem_free(me);
}
//模块创建,此处应用了pSTRUCT_GPIO_ITEM模块,该模块参见附件
pSTRUCT_BELL bell_create(pSTRUCT_GPIO_ITEM bell_port_group, uint32_t pin_number)
{
    pSTRUCT_BELL me = _mem_alloc_system_zero(sizeof(STRUCT_BELL));
    assert(me != NULL);
    pSTRUCT_PRIVATE para = me->para = _mem_alloc_system_zero(sizeof(STRUCT_PRIVATE));
    assert(para != NULL);
    para->bell_port = gpio_create(pin_number, bell_port_group, LWGPIO_DIR_OUTPUT);
    assert(para->bell_port != NULL);
    me->release = release;
    me->set_on = set_on;
    me->task_create = task_create;
    return me;
}

以上的代码就完成了BELL模块,应用起来也就比较简单,先用 bell_create函数创建一个Bell模块,创建完成后使用模块中的task_create 创建Bell任务,最后用模块中的set_on 使任务中的事件进行触发!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-3-26 10:01:49 | 显示全部楼层
跟我一直在用的很相似,我的是放10MS时基定时器里扫描的,配合PWM引脚输出加入音色控制更好

出0入0汤圆

 楼主| 发表于 2016-3-26 13:08:49 | 显示全部楼层
hzyyl2008 发表于 2016-3-26 10:01
跟我一直在用的很相似,我的是放10MS时基定时器里扫描的,配合PWM引脚输出加入音色控制更好 ...

我的没有用PWM,呵呵,目前这些就够用了!

出0入42汤圆

发表于 2016-7-7 09:49:18 | 显示全部楼层
感谢分享   PWM应用的很好  学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 05:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表