[作品提交] 【环境专家之智能手表】Part8:下井人员代码迁移

w494143467   2021-6-20 16:13 楼主

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.总结

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

回复评论 (1)

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

加油!在电子行业默默贡献自己的力量!:)
点赞  2021-6-21 09:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复