Blame android/client/if-rc.c

Packit 34410b
/*
Packit 34410b
 * Copyright (C) 2014 Intel Corporation
Packit 34410b
 *
Packit 34410b
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 34410b
 * you may not use this file except in compliance with the License.
Packit 34410b
 * You may obtain a copy of the License at
Packit 34410b
 *
Packit 34410b
 *      http://www.apache.org/licenses/LICENSE-2.0
Packit 34410b
 *
Packit 34410b
 * Unless required by applicable law or agreed to in writing, software
Packit 34410b
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 34410b
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 34410b
 * See the License for the specific language governing permissions and
Packit 34410b
 * limitations under the License.
Packit 34410b
 *
Packit 34410b
 */
Packit 34410b
Packit 34410b
#define _GNU_SOURCE
Packit 34410b
#include <stdio.h>
Packit 34410b
#include <ctype.h>
Packit 34410b
#include <string.h>
Packit 34410b
Packit 34410b
#include <hardware/bluetooth.h>
Packit 34410b
#include <hardware/bt_hh.h>
Packit 34410b
Packit 34410b
#include "if-main.h"
Packit 34410b
#include "pollhandler.h"
Packit 34410b
#include "../hal-utils.h"
Packit 34410b
Packit 34410b
const btrc_interface_t *if_rc = NULL;
Packit 34410b
Packit 34410b
SINTMAP(btrc_play_status_t, -1, "(unknown)")
Packit 34410b
	DELEMENT(BTRC_PLAYSTATE_STOPPED),
Packit 34410b
	DELEMENT(BTRC_PLAYSTATE_PLAYING),
Packit 34410b
	DELEMENT(BTRC_PLAYSTATE_PAUSED),
Packit 34410b
	DELEMENT(BTRC_PLAYSTATE_FWD_SEEK),
Packit 34410b
	DELEMENT(BTRC_PLAYSTATE_REV_SEEK),
Packit 34410b
	DELEMENT(BTRC_PLAYSTATE_ERROR),
Packit 34410b
ENDMAP
Packit 34410b
Packit 34410b
SINTMAP(btrc_media_attr_t, -1, "(unknown)")
Packit 34410b
	DELEMENT(BTRC_MEDIA_ATTR_TITLE),
Packit 34410b
	DELEMENT(BTRC_MEDIA_ATTR_ARTIST),
Packit 34410b
	DELEMENT(BTRC_MEDIA_ATTR_ALBUM),
Packit 34410b
	DELEMENT(BTRC_MEDIA_ATTR_TRACK_NUM),
Packit 34410b
	DELEMENT(BTRC_MEDIA_ATTR_NUM_TRACKS),
Packit 34410b
	DELEMENT(BTRC_MEDIA_ATTR_GENRE),
Packit 34410b
	DELEMENT(BTRC_MEDIA_ATTR_PLAYING_TIME),
Packit 34410b
ENDMAP
Packit 34410b
Packit 34410b
SINTMAP(btrc_status_t, -1, "(unknown)")
Packit 34410b
	DELEMENT(BTRC_STS_BAD_CMD),
Packit 34410b
	DELEMENT(BTRC_STS_BAD_PARAM),
Packit 34410b
	DELEMENT(BTRC_STS_NOT_FOUND),
Packit 34410b
	DELEMENT(BTRC_STS_INTERNAL_ERR),
Packit 34410b
	DELEMENT(BTRC_STS_NO_ERROR),
Packit 34410b
ENDMAP
Packit 34410b
Packit 34410b
SINTMAP(btrc_event_id_t, -1, "(unknown)")
Packit 34410b
	DELEMENT(BTRC_EVT_PLAY_STATUS_CHANGED),
Packit 34410b
	DELEMENT(BTRC_EVT_TRACK_CHANGE),
Packit 34410b
	DELEMENT(BTRC_EVT_TRACK_REACHED_END),
Packit 34410b
	DELEMENT(BTRC_EVT_TRACK_REACHED_START),
Packit 34410b
	DELEMENT(BTRC_EVT_PLAY_POS_CHANGED),
Packit 34410b
	DELEMENT(BTRC_EVT_APP_SETTINGS_CHANGED),
Packit 34410b
ENDMAP
Packit 34410b
Packit 34410b
SINTMAP(btrc_notification_type_t, -1, "(unknown)")
Packit 34410b
	DELEMENT(BTRC_NOTIFICATION_TYPE_INTERIM),
Packit 34410b
	DELEMENT(BTRC_NOTIFICATION_TYPE_CHANGED),
Packit 34410b
ENDMAP
Packit 34410b
Packit 34410b
static char last_addr[MAX_ADDR_STR_LEN];
Packit 34410b
Packit 34410b
static void remote_features_cb(bt_bdaddr_t *bd_addr,
Packit 34410b
					btrc_remote_features_t features)
Packit 34410b
{
Packit 34410b
	haltest_info("%s: remote_bd_addr=%s features=%u\n", __func__,
Packit 34410b
				bt_bdaddr_t2str(bd_addr, last_addr), features);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void get_play_status_cb(void)
Packit 34410b
{
Packit 34410b
	haltest_info("%s\n", __func__);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void list_player_app_attr_cb(void)
Packit 34410b
{
Packit 34410b
	haltest_info("%s\n", __func__);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void list_player_app_values_cb(btrc_player_attr_t attr_id)
Packit 34410b
{
Packit 34410b
	haltest_info("%s, attr_id=%d\n", __func__, attr_id);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void get_player_app_value_cb(uint8_t num_attr,
Packit 34410b
						btrc_player_attr_t *p_attrs)
Packit 34410b
{
Packit 34410b
	int i;
Packit 34410b
Packit 34410b
	haltest_info("%s, num_attr=%d\n", __func__, num_attr);
Packit 34410b
Packit 34410b
	for (i = 0; i < num_attr; i++)
Packit 34410b
		haltest_info("attribute=%u\n", p_attrs[i]);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void get_player_app_attrs_text_cb(uint8_t num_attr,
Packit 34410b
						btrc_player_attr_t *p_attrs)
Packit 34410b
{
Packit 34410b
	int i;
Packit 34410b
Packit 34410b
	haltest_info("%s, num_attr=%d\n", __func__, num_attr);
Packit 34410b
Packit 34410b
	for (i = 0; i < num_attr; i++)
Packit 34410b
		haltest_info("attribute=%u\n", p_attrs[i]);
Packit 34410b
Packit 34410b
}
Packit 34410b
Packit 34410b
static void get_player_app_values_text_cb(uint8_t attr_id, uint8_t num_val,
Packit 34410b
								uint8_t *p_vals)
Packit 34410b
{
Packit 34410b
	haltest_info("%s, attr_id=%d num_val=%d values=%p\n", __func__,
Packit 34410b
						attr_id, num_val, p_vals);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void set_player_app_value_cb(btrc_player_settings_t *p_vals)
Packit 34410b
{
Packit 34410b
	int i;
Packit 34410b
Packit 34410b
	haltest_info("%s, num_attr=%u\n", __func__, p_vals->num_attr);
Packit 34410b
Packit 34410b
	for (i = 0; i < p_vals->num_attr; i++)
Packit 34410b
		haltest_info("attr id=%u, values=%u\n", p_vals->attr_ids[i],
Packit 34410b
							p_vals->attr_values[i]);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void get_element_attr_cb(uint8_t num_attr, btrc_media_attr_t *attrs)
Packit 34410b
{
Packit 34410b
	uint8_t i;
Packit 34410b
Packit 34410b
	haltest_info("%s, num_of_attributes=%d\n", __func__, num_attr);
Packit 34410b
Packit 34410b
	for (i = 0; i < num_attr; i++)
Packit 34410b
		haltest_info("attr id=%s\n", btrc_media_attr_t2str(attrs[i]));
Packit 34410b
}
Packit 34410b
Packit 34410b
static void register_notification_cb(btrc_event_id_t event_id, uint32_t param)
Packit 34410b
{
Packit 34410b
	haltest_info("%s, event=%u param=%u\n", __func__, event_id, param);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void volume_change_cb(uint8_t volume, uint8_t ctype)
Packit 34410b
{
Packit 34410b
	haltest_info("%s, volume=%d ctype=%d\n", __func__, volume, ctype);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void passthrough_cmd_cb(int id, int key_state)
Packit 34410b
{
Packit 34410b
	haltest_info("%s, id=%d key_state=%d\n", __func__, id, key_state);
Packit 34410b
}
Packit 34410b
Packit 34410b
static btrc_callbacks_t rc_cbacks = {
Packit 34410b
	.size = sizeof(rc_cbacks),
Packit 34410b
	.remote_features_cb = remote_features_cb,
Packit 34410b
	.get_play_status_cb = get_play_status_cb,
Packit 34410b
	.list_player_app_attr_cb = list_player_app_attr_cb,
Packit 34410b
	.list_player_app_values_cb = list_player_app_values_cb,
Packit 34410b
	.get_player_app_value_cb = get_player_app_value_cb,
Packit 34410b
	.get_player_app_attrs_text_cb = get_player_app_attrs_text_cb,
Packit 34410b
	.get_player_app_values_text_cb = get_player_app_values_text_cb,
Packit 34410b
	.set_player_app_value_cb = set_player_app_value_cb,
Packit 34410b
	.get_element_attr_cb = get_element_attr_cb,
Packit 34410b
	.register_notification_cb = register_notification_cb,
Packit 34410b
	.volume_change_cb = volume_change_cb,
Packit 34410b
	.passthrough_cmd_cb = passthrough_cmd_cb,
Packit 34410b
};
Packit 34410b
Packit 34410b
/* init */
Packit 34410b
Packit 34410b
static void init_p(int argc, const char **argv)
Packit 34410b
{
Packit 34410b
	RETURN_IF_NULL(if_rc);
Packit 34410b
Packit 34410b
	EXEC(if_rc->init, &rc_cbacks);
Packit 34410b
}
Packit 34410b
Packit 34410b
/* get_play_status_rsp */
Packit 34410b
Packit 34410b
static void get_play_status_rsp_c(int argc, const char **argv,
Packit 34410b
					enum_func *enum_func, void **user)
Packit 34410b
{
Packit 34410b
	if (argc == 3) {
Packit 34410b
		*user = TYPE_ENUM(btrc_play_status_t);
Packit 34410b
		*enum_func = enum_defines;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static void get_play_status_rsp_p(int argc, const char **argv)
Packit 34410b
{
Packit 34410b
	btrc_play_status_t play_status;
Packit 34410b
	uint32_t song_len, song_pos;
Packit 34410b
Packit 34410b
	RETURN_IF_NULL(if_rc);
Packit 34410b
Packit 34410b
	if (argc <= 2) {
Packit 34410b
		haltest_error("No play status specified");
Packit 34410b
		return;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	if (argc <= 3) {
Packit 34410b
		haltest_error("No song length specified");
Packit 34410b
		return;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	if (argc <= 4) {
Packit 34410b
		haltest_error("No song position specified");
Packit 34410b
		return;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	play_status = str2btrc_play_status_t(argv[2]);
Packit 34410b
	song_len = (uint32_t) atoi(argv[3]);
Packit 34410b
	song_pos = (uint32_t) atoi(argv[4]);
Packit 34410b
Packit 34410b
	EXEC(if_rc->get_play_status_rsp, play_status, song_len, song_pos);
Packit 34410b
}
Packit 34410b
Packit 34410b
/* get_element_attr_rsp */
Packit 34410b
Packit 34410b
static void get_element_attr_rsp_c(int argc, const char **argv,
Packit 34410b
					enum_func *enum_func, void **user)
Packit 34410b
{
Packit 34410b
	if (argc == 4) {
Packit 34410b
		*user = TYPE_ENUM(btrc_media_attr_t);
Packit 34410b
		*enum_func = enum_defines;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static void get_element_attr_rsp_p(int argc, const char **argv)
Packit 34410b
{
Packit 34410b
	uint8_t num_attr;
Packit 34410b
	btrc_element_attr_val_t attrs;
Packit 34410b
Packit 34410b
	RETURN_IF_NULL(if_rc);
Packit 34410b
Packit 34410b
	if (argc <= 2) {
Packit 34410b
		haltest_error("No number of attributes specified");
Packit 34410b
		return;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	if (argc <= 4) {
Packit 34410b
		haltest_error("No attr id and value specified");
Packit 34410b
		return;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	num_attr = (uint8_t) atoi(argv[2]);
Packit 34410b
	attrs.attr_id = str2btrc_media_attr_t(argv[3]);
Packit 34410b
	strcpy((char *)attrs.text, argv[4]);
Packit 34410b
Packit 34410b
	EXEC(if_rc->get_element_attr_rsp, num_attr, &attrs);
Packit 34410b
}
Packit 34410b
Packit 34410b
/* set_volume */
Packit 34410b
Packit 34410b
static void set_volume_c(int argc, const char **argv,
Packit 34410b
					enum_func *enum_func, void **user)
Packit 34410b
{
Packit 34410b
}
Packit 34410b
Packit 34410b
static void set_volume_p(int argc, const char **argv)
Packit 34410b
{
Packit 34410b
	uint8_t volume;
Packit 34410b
Packit 34410b
	RETURN_IF_NULL(if_rc);
Packit 34410b
Packit 34410b
	if (argc <= 2) {
Packit 34410b
		haltest_error("No volume specified");
Packit 34410b
		return;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	volume = (uint8_t) atoi(argv[2]);
Packit 34410b
Packit 34410b
	EXEC(if_rc->set_volume, volume);
Packit 34410b
}
Packit 34410b
Packit 34410b
/* set_player_app_value_rsp */
Packit 34410b
Packit 34410b
static void set_player_app_value_rsp_c(int argc, const char **argv,
Packit 34410b
					enum_func *enum_func, void **user)
Packit 34410b
{
Packit 34410b
	if (argc == 3) {
Packit 34410b
		*user = TYPE_ENUM(btrc_status_t);
Packit 34410b
		*enum_func = enum_defines;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static void set_player_app_value_rsp_p(int argc, const char **argv)
Packit 34410b
{
Packit 34410b
	btrc_status_t rsp_status;
Packit 34410b
Packit 34410b
	RETURN_IF_NULL(if_rc);
Packit 34410b
Packit 34410b
	if (argc <= 2) {
Packit 34410b
		haltest_error("No response status specified");
Packit 34410b
		return;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	rsp_status = str2btrc_status_t(argv[2]);
Packit 34410b
Packit 34410b
	EXEC(if_rc->set_player_app_value_rsp, rsp_status);
Packit 34410b
}
Packit 34410b
Packit 34410b
/* register_notification_rsp */
Packit 34410b
Packit 34410b
static void register_notification_rsp_c(int argc, const char **argv,
Packit 34410b
					enum_func *enum_func, void **user)
Packit 34410b
{
Packit 34410b
	if (argc == 3) {
Packit 34410b
		*user = TYPE_ENUM(btrc_event_id_t);
Packit 34410b
		*enum_func = enum_defines;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	if (argc == 4) {
Packit 34410b
		*user = TYPE_ENUM(btrc_notification_type_t);
Packit 34410b
		*enum_func = enum_defines;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static void register_notification_rsp_p(int argc, const char **argv)
Packit 34410b
{
Packit 34410b
	btrc_event_id_t event_id;
Packit 34410b
	btrc_notification_type_t type;
Packit 34410b
	btrc_register_notification_t reg;
Packit 34410b
	uint32_t song_pos;
Packit 34410b
	uint64_t track;
Packit 34410b
Packit 34410b
	RETURN_IF_NULL(if_rc);
Packit 34410b
Packit 34410b
	memset(&reg, 0, sizeof(reg));
Packit 34410b
	event_id = str2btrc_event_id_t(argv[2]);
Packit 34410b
	type = str2btrc_notification_type_t(argv[3]);
Packit 34410b
Packit 34410b
	switch (event_id) {
Packit 34410b
	case BTRC_EVT_PLAY_STATUS_CHANGED:
Packit 34410b
		reg.play_status = str2btrc_play_status_t(argv[4]);
Packit 34410b
		break;
Packit 34410b
Packit 34410b
	case BTRC_EVT_TRACK_CHANGE:
Packit 34410b
		track = strtoull(argv[5], NULL, 10);
Packit 34410b
		memcpy(reg.track, &track, sizeof(btrc_uid_t));
Packit 34410b
		break;
Packit 34410b
Packit 34410b
	case BTRC_EVT_TRACK_REACHED_END:
Packit 34410b
	case BTRC_EVT_TRACK_REACHED_START:
Packit 34410b
		break;
Packit 34410b
Packit 34410b
	case BTRC_EVT_PLAY_POS_CHANGED:
Packit 34410b
		song_pos = strtoul(argv[4], NULL, 10);
Packit 34410b
		memcpy(&reg.song_pos, &song_pos, sizeof(uint32_t));
Packit 34410b
		break;
Packit 34410b
Packit 34410b
	case BTRC_EVT_APP_SETTINGS_CHANGED:
Packit 34410b
		haltest_error("not supported");
Packit 34410b
		return;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	EXEC(if_rc->register_notification_rsp, event_id, type, ®);
Packit 34410b
}
Packit 34410b
Packit 34410b
/* cleanup */
Packit 34410b
Packit 34410b
static void cleanup_p(int argc, const char **argv)
Packit 34410b
{
Packit 34410b
	RETURN_IF_NULL(if_rc);
Packit 34410b
Packit 34410b
	EXECV(if_rc->cleanup);
Packit 34410b
	if_rc = NULL;
Packit 34410b
}
Packit 34410b
Packit 34410b
static struct method methods[] = {
Packit 34410b
	STD_METHOD(init),
Packit 34410b
	STD_METHODCH(get_play_status_rsp,
Packit 34410b
					"<play_status> <song_len> <song_pos>"),
Packit 34410b
	STD_METHODCH(get_element_attr_rsp, "<num_attr> <attrs_id> <value>"),
Packit 34410b
	STD_METHODCH(set_player_app_value_rsp, "<rsp_status>"),
Packit 34410b
	STD_METHODCH(set_volume, "<volume>"),
Packit 34410b
	STD_METHODCH(register_notification_rsp,
Packit 34410b
			"<event_id> <type> <respective_data...>\n"
Packit 34410b
			"BTRC_EVT_PLAY_STATUS_CHANGED <type> <play_status>\n"
Packit 34410b
			"BTRC_EVT_TRACK_CHANGE <type> <track>\n"
Packit 34410b
			"BTRC_EVT_TRACK_REACHED_END <type>\n"
Packit 34410b
			"BTRC_EVT_TRACK_REACHED_START <type>\n"
Packit 34410b
			"BTRC_EVT_PLAY_POS_CHANGED <type> <song_pos>\n"),
Packit 34410b
	STD_METHOD(cleanup),
Packit 34410b
	END_METHOD
Packit 34410b
};
Packit 34410b
Packit 34410b
const struct interface rc_if = {
Packit 34410b
	.name = "rc",
Packit 34410b
	.methods = methods
Packit 34410b
};