예제 #1
0
파일: gap.c 프로젝트: hudkmr/zephyr
static void start_advertising(const uint8_t *data, uint16_t len)
{
	const struct gap_start_advertising_cmd *cmd = (void *) data;
	struct gap_start_advertising_rp rp;
	uint8_t adv_len, sd_len;
	bool adv_conn;
	int i;

	for (i = 0, adv_len = 1; i < cmd->adv_data_len; adv_len++) {
		if (adv_len >= ARRAY_SIZE(ad)) {
			BTTESTER_DBG("ad[] Out of memory");
			goto fail;
		}

		ad[adv_len].type = cmd->adv_data[i++];
		ad[adv_len].data_len = cmd->adv_data[i++];
		ad[adv_len].data = &cmd->adv_data[i];
		i += ad[adv_len].data_len;
	}

	for (i = 0, sd_len = 0; i < cmd->scan_rsp_len; sd_len++) {
		if (sd_len >= ARRAY_SIZE(sd)) {
			BTTESTER_DBG("sd[] Out of memory");
			goto fail;
		}

		sd[sd_len].type = cmd->scan_rsp[i++];
		sd[sd_len].data_len = cmd->scan_rsp[i++];
		sd[sd_len].data = &cmd->scan_rsp[i];
		i += sd[sd_len].data_len;
	}

	adv_conn = atomic_test_bit(&current_settings, GAP_SETTINGS_CONNECTABLE);

	/* BTP API don't allow to set empty scan response data. */
	if (bt_le_adv_start(adv_conn ? BT_LE_ADV_CONN : BT_LE_ADV_NCONN,
			    ad, adv_len, sd_len ? sd : NULL, sd_len) < 0) {
		BTTESTER_DBG("Failed to start advertising");
		goto fail;
	}

	atomic_set_bit(&current_settings, GAP_SETTINGS_ADVERTISING);
	rp.current_settings = sys_cpu_to_le32(current_settings);

	tester_send(BTP_SERVICE_ID_GAP, GAP_START_ADVERTISING, CONTROLLER_INDEX,
		    (uint8_t *) &rp, sizeof(rp));
	return;
fail:
	tester_rsp(BTP_SERVICE_ID_GAP, GAP_START_ADVERTISING, CONTROLLER_INDEX,
		   BTP_STATUS_FAILED);
}
예제 #2
0
static void bt_ready(int err)
{
	if (err) {
		printk("Bluetooth init failed (err %d)\n", err);
		return;
	}

	bt_gatt_register(attrs, ARRAY_SIZE(attrs));

	err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad),
			      sd, ARRAY_SIZE(sd));
	if (err) {
		printk("Advertising failed to start (err %d)\n", err);
		return;
	}
}
예제 #3
0
파일: gap.c 프로젝트: CurieBSP/zephyr
static void start_advertising(const uint8_t *data, uint16_t len)
{
	const struct gap_start_advertising_cmd *cmd = (void *) data;
	struct gap_start_advertising_rp rp;
	uint8_t adv_type, adv_len;
	int i;

	if (atomic_test_bit(&current_settings, GAP_SETTINGS_CONNECTABLE)) {
		adv_type = BT_LE_ADV_IND;
	} else {
		adv_type = BT_LE_ADV_NONCONN_IND;
	}

	for (i = 0, adv_len = 1; i < cmd->adv_data_len; adv_len++) {
		if (adv_len >= ARRAY_SIZE(ad)) {
			BTTESTER_DBG("ad[] Out of memory");
			goto fail;
		}

		ad[adv_len].type = cmd->adv_data[i++];
		ad[adv_len].data_len = cmd->adv_data[i++];
		ad[adv_len].data = &cmd->adv_data[i];
		i += ad[adv_len].data_len;
	}

	if (bt_le_adv_start(BT_LE_ADV(adv_type), ad, adv_len, NULL, 0) < 0) {
		BTTESTER_DBG("Failed to start advertising");
		goto fail;
	}

	atomic_set_bit(&current_settings, GAP_SETTINGS_ADVERTISING);
	rp.current_settings = sys_cpu_to_le32(current_settings);

	tester_send(BTP_SERVICE_ID_GAP, GAP_START_ADVERTISING, CONTROLLER_INDEX,
		    (uint8_t *) &rp, sizeof(rp));
	return;
fail:
	tester_rsp(BTP_SERVICE_ID_GAP, GAP_START_ADVERTISING, CONTROLLER_INDEX,
		   BTP_STATUS_FAILED);
}
예제 #4
0
파일: main.c 프로젝트: sunkaizhu/zephyr
static void bt_ready(int err)
{
	if (err) {
		printk("Bluetooth init failed (err %d)\n", err);
		return;
	}

	printk("Bluetooth initialized\n");

	gap_init(DEVICE_NAME, HEART_RATE_APPEARANCE);
	hrs_init(0x01);
	bas_init();
	dis_init(CONFIG_SOC, "Manufacturer");

	err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad),
			      sd, ARRAY_SIZE(sd));
	if (err) {
		printk("Advertising failed to start (err %d)\n", err);
		return;
	}

	printk("Advertising successfully started\n");
}
예제 #5
0
파일: main.c 프로젝트: hudkmr/zephyr
static void bt_ready(int err)
{
	if (err) {
		printk("Bluetooth init failed (err %d)\n", err);
		return;
	}

	printk("Bluetooth initialized\n");

	gap_init(DEVICE_NAME, CSC_APPEARANCE);
	bas_init();
	dis_init(CONFIG_SOC, "ACME");
	bt_gatt_register(csc_attrs, ARRAY_SIZE(csc_attrs));

	err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad),
			      sd, ARRAY_SIZE(sd));
	if (err) {
		printk("Advertising failed to start (err %d)\n", err);
		return;
	}

	printk("Advertising successfully started\n");
}
예제 #6
0
static void bt_ready(int err)
{
	if (err) {
		printk("Bluetooth init failed (err %d)\n", err);
		return;
	}

	printk("Bluetooth initialized\n");

	bt_gatt_register(gap_attrs, ARRAY_SIZE(gap_attrs));
	bt_gatt_register(bas_attrs, ARRAY_SIZE(bas_attrs));
	bt_gatt_register(dis_attrs, ARRAY_SIZE(dis_attrs));
	bt_gatt_register(csc_attrs, ARRAY_SIZE(csc_attrs));

	err = bt_le_adv_start(BT_LE_ADV(BT_LE_ADV_IND), ad, ARRAY_SIZE(ad),
					sd, ARRAY_SIZE(sd));
	if (err) {
		printk("Advertising failed to start (err %d)\n", err);
		return;
	}

	printk("Advertising successfully started\n");
}
예제 #7
0
파일: main.c 프로젝트: lwehmeier/zephyr
static int cmd_advertise(int argc, char *argv[])
{
	struct bt_le_adv_param param;
	const struct bt_data *ad, *scan_rsp;
	size_t ad_len, scan_rsp_len;

	if (argc < 2) {
		goto fail;
	}

	if (!strcmp(argv[1], "off")) {
		if (bt_le_adv_stop() < 0) {
			printk("Failed to stop advertising\n");
		} else {
			printk("Advertising stopped\n");
		}

		return 0;
	}

	param.interval_min = BT_GAP_ADV_FAST_INT_MIN_2;
	param.interval_max = BT_GAP_ADV_FAST_INT_MAX_2;

	if (!strcmp(argv[1], "on")) {
		param.options = BT_LE_ADV_OPT_CONNECTABLE;
		scan_rsp = sd;
		scan_rsp_len = ARRAY_SIZE(sd);
	} else if (!strcmp(argv[1], "scan")) {
		param.options = 0;
		scan_rsp = sd;
		scan_rsp_len = ARRAY_SIZE(sd);
	} else if (!strcmp(argv[1], "nconn")) {
		param.options = 0;
		scan_rsp = NULL;
		scan_rsp_len = 0;
	} else {
		goto fail;
	}

	/* Parse advertisement data */
	if (argc >= 3) {
		const char *mode = argv[2];

		if (!strcmp(mode, "discov")) {
			ad = ad_discov;
			ad_len = ARRAY_SIZE(ad_discov);
		} else if (!strcmp(mode, "non_discov")) {
			ad = NULL;
			ad_len = 0;
		} else {
			goto fail;
		}
	} else {
		ad = ad_discov;
		ad_len = ARRAY_SIZE(ad_discov);
	}

	if (bt_le_adv_start(&param, ad, ad_len, scan_rsp, scan_rsp_len) < 0) {
		printk("Failed to start advertising\n");
	} else {
		printk("Advertising started\n");
	}

	return 0;

fail:
	return -EINVAL;
}
예제 #8
0
파일: ble_app.c 프로젝트: SDICurie/main
static void advertise_start(enum ble_adv_reason reason)
{
	size_t adv_len;
	struct bt_le_adv_param adv_param;
	uint16_t interval;
	uint16_t timeout;

	struct bt_data ad[] = {
		BT_DATA_BYTES(BT_DATA_FLAGS,
			      (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
		BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, BLE_APP_APPEARANCE & 0xFF,
			      BLE_APP_APPEARANCE >> 8),
		BT_DATA_BYTES(BT_DATA_MANUFACTURER_DATA, BLE_APP_MANUFACTURER &
			      0xFF,
			      BLE_APP_MANUFACTURER >> 8),
		BT_DATA(BT_DATA_NAME_COMPLETE, _ble_app_cb.device_name,
			strlen((char *)_ble_app_cb.device_name))
	};

	struct bt_data *ad_name = &ad[3];
	int status;

	pr_info(LOG_MODULE_MAIN, "advertise_start: reason:0x%x", reason);

	switch (reason) {
	case BLE_ADV_USER1:
	case BLE_ADV_USER2:
	case BLE_ADV_DISCONNECT:
		timeout = CONFIG_BLE_APP_DEFAULT_ADV_TIMEOUT;
		interval = CONFIG_BLE_APP_DEFAULT_ADV_INTERVAL;
		break;
	case BLE_ADV_TIMEOUT:
		interval = CONFIG_BLE_ADV_SLOW_INTERVAL;
		timeout = CONFIG_BLE_ADV_SLOW_TIMEOUT;
		break;
	case BLE_ADV_STARTUP:
		interval = CONFIG_BLE_ULTRA_FAST_ADV_INTERVAL;
		if (get_boot_target() == TARGET_RECOVERY)
			timeout = 0;
		else
			timeout = CONFIG_BLE_APP_DEFAULT_ADV_TIMEOUT;
		break;
	default:
		interval = CONFIG_BLE_APP_DEFAULT_ADV_INTERVAL;
		timeout = 0;
		break;
	}

	adv_param.type = BT_LE_ADV_IND;
	adv_param.interval_max = interval;
	adv_param.interval_min = interval;
	adv_param.addr_type = _ble_app_cb.my_bd_addr.type;

	adv_len = adv_data_len(ad, ARRAY_SIZE(ad)) + 2 * ARRAY_SIZE(ad);
	if (adv_len > 31) {
		ad_name->data_len -= adv_len - 31;
		ad_name->type = BT_DATA_NAME_SHORTENED;
	}

	status = bt_le_adv_start(&adv_param, ad, ARRAY_SIZE(ad), NULL, 0);

	if (!status && timeout)
		ble_app_adv_timer_start(timeout, adv_timeout_cb);

	if (status)
		pr_error(LOG_MODULE_MAIN, "start_adv err %d", status);
}