Beispiel #1
0
/* condev might be NULL here */
static void link_loss_change_alert_level(struct link_loss_adapter *la,
					 struct connected_device *condev,
					 uint8_t level)
{
	attrib_db_update(la->adapter, la->alert_lvl_value_handle,
			 NULL, &level, sizeof(level), NULL);
	if (condev)
		condev->alert_level = level;
}
static uint8_t battery_state_read(struct attribute *a, gpointer user_data)
{
	struct btd_adapter *adapter = user_data;
	uint8_t value;

	value = 0x04;
	attrib_db_update(adapter, a->handle, NULL, &value, sizeof(value), NULL);

	return 0;
}
Beispiel #3
0
static void update_new_alert(gpointer data, gpointer user_data)
{
	struct alert_adapter *al_adapter = data;
	struct btd_adapter *adapter = al_adapter->adapter;
	uint8_t *value = user_data;

	attrib_db_update(adapter, al_adapter->hnd_value[NOTIFY_NEW_ALERT], NULL,
						&value[1], value[0], NULL);

	notify_devices(al_adapter, NOTIFY_NEW_ALERT, &value[1], value[0]);
}
Beispiel #4
0
static uint8_t current_time_read(struct attribute *a, gpointer user_data)
{
	uint8_t value[10];

	if (encode_current_time(value) < 0)
		return ATT_ECODE_IO;

	/* FIXME: Provide the adapter in next function */
	attrib_db_update(NULL, a->handle, NULL, value, sizeof(value), NULL);

	return 0;
}
Beispiel #5
0
static void update_unread_alert(gpointer data, gpointer user_data)
{
	struct alert_adapter *al_adapter = data;
	struct btd_adapter *adapter = al_adapter->adapter;
	uint8_t *value = user_data;

	attrib_db_update(adapter,
			al_adapter->hnd_value[NOTIFY_UNREAD_ALERT], NULL, value,
			2, NULL);

	notify_devices(al_adapter, NOTIFY_UNREAD_ALERT, value, 2);
}
Beispiel #6
0
static void update_supported_categories(gpointer data, gpointer user_data)
{
	struct alert_adapter *al_adapter = data;
	struct btd_adapter *adapter = al_adapter->adapter;
	uint8_t value[2];
	unsigned int i;

	memset(value, 0, sizeof(value));

	for (i = 0; i < G_N_ELEMENTS(anp_categories); i++) {
		if (registered_category(anp_categories[i]))
			hci_set_bit(i, value);
	}

	attrib_db_update(adapter, al_adapter->supp_new_alert_cat_handle, NULL,
						value, sizeof(value), NULL);

	/* FIXME: For now report all registered categories as supporting unread
	 * status, until it is known which ones should be supported */
	attrib_db_update(adapter, al_adapter->supp_unread_alert_cat_handle,
					NULL, value, sizeof(value), NULL);
}
Beispiel #7
0
static uint8_t current_time_read(struct attribute *a,
				 struct btd_device *device, gpointer user_data)
{
	struct btd_adapter *adapter = user_data;
	uint8_t value[10];

	if (encode_current_time(value) < 0)
		return ATT_ECODE_IO;

	attrib_db_update(adapter, a->handle, NULL, value, sizeof(value), NULL);

	return 0;
}
Beispiel #8
0
static uint8_t time_with_dst_read(struct attribute *a, gpointer user_data,
				    struct btd_device *device)
{
	struct time_with_dst next_time;
	struct time_adapter *ta = user_data;

	DBG("");

	attrib_db_update(ta->adapter, a->handle, NULL, (uint8_t*)&next_dst,
			 sizeof(next_dst), NULL);

	return 0;
}
Beispiel #9
0
static void __notify_alert_status(gpointer data, gpointer user_data)
{
    struct alert_adapter *aa = data;
    uint8_t status = (uint32_t)user_data & 0xff;

    if (alert_status != status) {
        alert_status = status;
        queue_notification(aa->adapter, BDADDR_ALL,
                           aa->h_alert_status, aa->h_alert_status_ccc,
                           &alert_status, sizeof(alert_status));
        attrib_db_update(aa->adapter, aa->h_alert_status, NULL,
                         &alert_status, sizeof(alert_status), NULL);
    }
}
Beispiel #10
0
static uint8_t current_time_read(struct attribute *a, gpointer user_data,
				 struct btd_device *device)
{
	struct current_time curtime;
	struct time_adapter *ta = user_data;

	if (get_current_time(&curtime) < 0)
		return ATT_ECODE_IO;

	attrib_db_update(ta->adapter, a->handle, NULL, (uint8_t *)&curtime,
			 sizeof(curtime), NULL);

	return 0;
}
Beispiel #11
0
static uint8_t ringer_setting_read(struct attribute *a,
						struct btd_device *device,
						gpointer user_data)
{
	struct btd_adapter *adapter = user_data;

	DBG("a = %p", a);

	if (a->data == NULL || a->data[0] != ringer_setting)
		attrib_db_update(adapter, a->handle, NULL, &ringer_setting,
						sizeof(ringer_setting), NULL);

	return 0;
}
Beispiel #12
0
static uint8_t alert_status_read(struct attribute *a,
						struct btd_device *device,
						gpointer user_data)
{
	struct btd_adapter *adapter = user_data;

	DBG("a = %p", a);

	if (a->data == NULL || a->data[0] != alert_status)
		attrib_db_update(adapter, a->handle, NULL, &alert_status,
						sizeof(alert_status), NULL);

	return 0;
}
Beispiel #13
0
static uint8_t supp_unread_alert_cat_read(struct attribute *a,
						struct btd_device *device,
						gpointer user_data)
{
	struct btd_adapter *adapter = user_data;
	uint8_t value[] = { 0x00, 0x00 };

	DBG("a = %p", a);

	if (a->data == NULL)
		attrib_db_update(adapter, a->handle, NULL, value, sizeof(value),
									NULL);

	return 0;
}
Beispiel #14
0
static uint8_t time_update_status(struct attribute *a,
						struct btd_device *device,
						gpointer user_data)
{
	struct btd_adapter *adapter = user_data;
	uint8_t value[2];

	DBG("handle 0x%04x", a->handle);

	value[0] = UPDATE_STATE_IDLE;
	value[1] = UPDATE_RESULT_SUCCESSFUL;
	attrib_db_update(adapter, a->handle, NULL, value, sizeof(value), NULL);

	return 0;
}
Beispiel #15
0
static void __notify_ringer_setting(gpointer data, gpointer user_data)
{
    struct alert_adapter *aa = data;
    uint8_t setting = (uint32_t)user_data & 0xff;

    if (ringer_setting != setting) {
        ringer_setting = setting;
        queue_notification(aa->adapter, BDADDR_ALL,
                           aa->h_ringer_setting,
                           aa->h_ringer_setting_ccc,
                           &ringer_setting, sizeof(ringer_setting));
        attrib_db_update(aa->adapter, aa->h_ringer_setting, NULL,
                         &ringer_setting, sizeof(ringer_setting), NULL);
    }
}
Beispiel #16
0
static uint8_t alert_status_read(struct attribute *a, gpointer user_data,
                                 struct btd_device *device)
{
    struct alert_adapter *aa = user_data;

    if (!initialized) {
        error("Uninitialized");
        return ATT_ECODE_IO;
    }

    DBG("Alert state = 0x%X", alert_status);

    if (a->data == NULL || a->data[0] != alert_status)
        attrib_db_update(aa->adapter, a->handle, NULL, &alert_status,
                         sizeof(alert_status), NULL);

    return 0;
}
Beispiel #17
0
static uint8_t ringer_setting_read(struct attribute *a, gpointer user_data,
                                   struct btd_device *device)
{
    struct alert_adapter *aa = user_data;

    if (!initialized) {
        error("Uninitialized");
        return ATT_ECODE_IO;
    }

    DBG("Ringer state = 0x%X", ringer_setting);

    if (a->data == NULL || a->data[0] != ringer_setting)
        attrib_db_update(aa->adapter, a->handle, NULL, &ringer_setting,
                         sizeof(ringer_setting), NULL);

    return 0;
}
Beispiel #18
0
static uint8_t supp_new_alert_cat_read(struct attribute *a, gpointer user_data,
                                       struct btd_device *device)
{
    struct alert_adapter *aa = user_data;

    if (!initialized) {
        error("Uninitialized");
        return ATT_ECODE_IO;
    }

    DBG("Supported new alert = 0x%X", supp_new_alerts);

    if (a->data == NULL || a->data[0] != supp_new_alerts)
        attrib_db_update(aa->adapter, a->handle, NULL, &supp_new_alerts,
                         sizeof(supp_new_alerts), NULL);

    return 0;
}
Beispiel #19
0
static uint8_t local_time_info_read(struct attribute *a, gpointer user_data)
{
	uint8_t value[2];

	DBG("a=%p", a);

	tzset();

	/* FIXME: POSIX "daylight" variable only indicates whether there is DST
	 * for the local time or not. The offset is unknown. */
	value[0] = daylight ? 0xff : 0x00;

	/* Convert POSIX "timezone" (seconds West of GMT) to Time Profile
	 * format (offset from UTC in number of 15 minutes increments). */
	value[1] = (uint8_t) (-1 * timezone / (60 * 15));

	/* FIXME: Provide the adapter in next function */
	attrib_db_update(NULL, a->handle, NULL, value, sizeof(value), NULL);

	return 0;
}
Beispiel #20
0
static uint8_t local_time_info_read(struct attribute *a, gpointer user_data,
				    struct btd_device *device)
{
	struct local_time_information local_time;
	struct time_adapter *ta = user_data;

	tzset();

	local_time.dst_offset.dst_offset = dst_offset.dst_offset;

	/* Convert POSIX "timezone" (seconds West of GMT) to Time Profile
	 * format (offset from UTC in number of 15 minutes increments). */
	local_time.time_zone.time_zone = (uint8_t)(-1 * timezone / (60 * 15));

	DBG("dst_offset = %d, time_zone = %d",
	    local_time.dst_offset.dst_offset,
	    local_time.time_zone.time_zone);

	attrib_db_update(ta->adapter, a->handle, NULL, (uint8_t*)&local_time,
			 sizeof(local_time), NULL);

	return 0;
}
Beispiel #21
0
static uint8_t link_loss_alert_lvl_read(struct attribute *a, gpointer user_data,
					struct btd_device *device)
{
	struct link_loss_adapter *adapter = user_data;
	struct connected_device *condev;
	GSList *l = NULL;
	uint8_t alert_level = NO_ALERT;

	if (device)
		l = g_slist_find_custom(adapter->connected_devices, device,
					lldevice_cmp);
	if (l) {
		condev = l->data;
		alert_level = condev->alert_level;
	}

	DBG("return alert level %d for dev %p", alert_level, device);

	/* update the alert level according to the requesting device */
	attrib_db_update(adapter->adapter, a->handle, NULL, &alert_level,
			 sizeof(alert_level), NULL);

	return 0;
}