539|1

1998

帖子

3

资源

版主

【环境专家之智能手表】Part8:下井人员代码迁移 [复制链接]

1.介绍

本来这一篇要写活动状态识别,但是下井人员代码有一些问题,所以做了代码迁移,将之前合并的代码迁移到【On-board Sensor Tag Demo】,为什么要迁移到这个例程中,是因为这个例程中有我所需要的各个驱动代码,已经广播例程。

2.代码迁移

本来觉得是一件非常容易的事,但是有一个问题卡了挺久的,就是动态广播,代码中没有对广播内容直接修改的样例,尝试上一篇中的打开再关闭,出现错误。

    GAPM_CancelCmd();
    APP_FollowSetAdvScanData();
    //set_adv_data(&app_adv_info);
    HRPS_Setup();
    HRPS_StartAdvertisement();

也尝试了许多打开再关闭的办法,比如广播超时后,重置的时候刷新,那么就可以等到超时的时候修改广播中的内容,将超时设置为5S,但是这个方案不行。

当手机连接之后,会重新发起广播,这时候广播包中的内容会被修改,所以尝试模拟手机连接,但是有耦合,故失败。

手机连接和断开的代码:

static int GAPC_ConnectionReqInd(ke_msg_id_t const msg_id, struct gapc_connection_req_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
{
    if (ble_env.state != BLE_STATE_CONNECTED)
    {
        ble_env.conidx = KE_IDX_GET(src_id);
        if (ble_env.conidx != GAP_INVALID_CONIDX)
        {
            ble_env.state = BLE_STATE_CONNECTED;
            ble_env.conhdl = param->conhdl;

            BDK_BLE_SendConnectionConfirmation();
            BDK_BLE_SetServiceState(true);
        }
    }

    return KE_MSG_CONSUMED;
}

static int GAPC_DisconnectInd(ke_msg_id_t const msg_id, struct gapc_disconnect_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
{
    if (ble_env.state != BLE_STATE_CONNECTED)
    {
        return (KE_MSG_CONSUMED);
    }

    /* Go to the ready state */
    ble_env.state = BLE_STATE_READY;
    ble_env.conidx = INVALID_DEV_IDX;

    /* Disable services for this connection */
    BDK_BLE_SetServiceState(false);

    return KE_MSG_CONSUMED;
}

最后发现了有一个刷新广播包内容的命令,但是没有相关例程,尝试写了一下,最后写出来了,具体代码如下:

void BDK_BLE_ADV_Refresh(void)
{
	if (ble_env.state != BLE_STATE_CONNECTED)
	{
		struct gapm_update_advertise_data_cmd *cmd1;

		cmd1 = KE_MSG_ALLOC(GAPM_UPDATE_ADVERTISE_DATA_CMD, TASK_GAPM, TASK_APP,
						gapm_update_advertise_data_cmd);

		cmd1->operation = GAPM_UPDATE_ADVERTISE_DATA;
		cmd1->adv_data[0] = 1 + ble_env.local_name_len;
		cmd1->adv_data[1] = GAP_AD_TYPE_COMPLETE_NAME;
		memcpy(&cmd1->adv_data[2], ble_env.local_name, ble_env.local_name_len);
		cmd1->adv_data_len = 2 + ble_env.local_name_len;

		cmd1->adv_data[cmd1->adv_data_len] = BDK_BLE_MANUFACTURER_ID_LENGTH + ble_env.manu_data_len;
		memcpy(&cmd1->adv_data[cmd1->adv_data_len + 1], BDK_BLE_MANUFACTURER_ID, BDK_BLE_MANUFACTURER_ID_LENGTH);
		memcpy(&cmd1->adv_data[cmd1->adv_data_len + 1 + BDK_BLE_MANUFACTURER_ID_LENGTH], ble_env.manu_data, ble_env.manu_data_len);
		cmd1->adv_data_len += 1 + BDK_BLE_MANUFACTURER_ID_LENGTH + ble_env.manu_data_len;

		/* Send the message */
		ke_msg_send(cmd1);
	}
}

这里要注意一点,当手机连接之后,就不能修改广播包内容,否在会导致错误,所以需要判断一下是否连接中,如果连接中就不要刷新广播内容了。

3.总结

还是对代码不够熟悉,需要多花一些时间对代码进行研究,好在最后找到的最佳的解决办法,坚持不懈很重要!下一篇正式开始活动识别了。


回复

2万

帖子

71

资源

管理员

期待期待,解决问题的过程也挺有成就感的。

个人签名

不管是哪年,都要加油!继续为中国电子行业做出小小的贡献吧! 扣扣 1206973913


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表