2 * Copyright (C) 2014 Intel Corporation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include<hardware/bluetooth.h>
22 #include<hardware/bt_hh.h>
25 #include "pollhandler.h"
26 #include "../hal-utils.h"
28 const btrc_interface_t *if_rc = NULL;
30 SINTMAP(btrc_play_status_t, -1, "(unknown)")
31 DELEMENT(BTRC_PLAYSTATE_STOPPED),
32 DELEMENT(BTRC_PLAYSTATE_PLAYING),
33 DELEMENT(BTRC_PLAYSTATE_PAUSED),
34 DELEMENT(BTRC_PLAYSTATE_FWD_SEEK),
35 DELEMENT(BTRC_PLAYSTATE_REV_SEEK),
36 DELEMENT(BTRC_PLAYSTATE_ERROR),
39 SINTMAP(btrc_media_attr_t, -1, "(unknown)")
40 DELEMENT(BTRC_MEDIA_ATTR_TITLE),
41 DELEMENT(BTRC_MEDIA_ATTR_ARTIST),
42 DELEMENT(BTRC_MEDIA_ATTR_ALBUM),
43 DELEMENT(BTRC_MEDIA_ATTR_TRACK_NUM),
44 DELEMENT(BTRC_MEDIA_ATTR_NUM_TRACKS),
45 DELEMENT(BTRC_MEDIA_ATTR_GENRE),
46 DELEMENT(BTRC_MEDIA_ATTR_PLAYING_TIME),
49 static char last_addr[MAX_ADDR_STR_LEN];
51 static void remote_features_cb(bt_bdaddr_t *bd_addr,
52 btrc_remote_features_t features)
54 haltest_info("%s: remote_bd_addr=%s features=%u\n", __func__,
55 bt_bdaddr_t2str(bd_addr, last_addr), features);
58 static void get_play_status_cb(void)
60 haltest_info("%s\n", __func__);
63 static void get_element_attr_cb(uint8_t num_attr, btrc_media_attr_t *attrs)
67 haltest_info("%s, num_of_attributes=%d\n", __func__, num_attr);
69 for (i = 0; i < num_attr; i++)
70 haltest_info("attr id=%s\n", btrc_media_attr_t2str(attrs[i]));
73 static void register_notification_cb(btrc_event_id_t event_id, uint32_t param)
75 haltest_info("%s, event=%u param=%u\n", __func__, event_id, param);
78 static void volume_change_cb(uint8_t volume, uint8_t ctype)
80 haltest_info("%s, volume=%d ctype=%d\n", __func__, volume, ctype);
83 static btrc_callbacks_t rc_cbacks = {
84 .size = sizeof(rc_cbacks),
85 .remote_features_cb = remote_features_cb,
86 .get_play_status_cb = get_play_status_cb,
87 .get_element_attr_cb = get_element_attr_cb,
88 .register_notification_cb = register_notification_cb,
89 .volume_change_cb = volume_change_cb,
94 static void init_p(int argc, const char **argv)
96 RETURN_IF_NULL(if_rc);
98 EXEC(if_rc->init, &rc_cbacks);
101 /* get_play_status_rsp */
103 static void get_play_status_rsp_c(int argc, const char **argv,
104 enum_func *enum_func, void **user)
107 *user = TYPE_ENUM(btrc_play_status_t);
108 *enum_func = enum_defines;
112 static void get_play_status_rsp_p(int argc, const char **argv)
114 btrc_play_status_t play_status;
115 uint32_t song_len, song_pos;
117 RETURN_IF_NULL(if_rc);
120 haltest_error("No play status specified");
125 haltest_error("No song length specified");
130 haltest_error("No song position specified");
134 play_status = str2btrc_play_status_t(argv[2]);
135 song_len = (uint32_t) atoi(argv[3]);
136 song_pos = (uint32_t) atoi(argv[4]);
138 EXEC(if_rc->get_play_status_rsp, play_status, song_len, song_pos);
141 /* get_element_attr_rsp */
143 static void get_element_attr_rsp_c(int argc, const char **argv,
144 enum_func *enum_func, void **user)
147 *user = TYPE_ENUM(btrc_media_attr_t);
148 *enum_func = enum_defines;
152 static void get_element_attr_rsp_p(int argc, const char **argv)
155 btrc_element_attr_val_t attrs;
157 RETURN_IF_NULL(if_rc);
160 haltest_error("No number of attributes specified");
165 haltest_error("No attr id and value specified");
169 num_attr = (uint8_t) atoi(argv[2]);
170 attrs.attr_id = str2btrc_media_attr_t(argv[3]);
171 strcpy((char *)attrs.text, argv[4]);
173 EXEC(if_rc->get_element_attr_rsp, num_attr, &attrs);
178 static void set_volume_c(int argc, const char **argv,
179 enum_func *enum_func, void **user)
183 static void set_volume_p(int argc, const char **argv)
187 RETURN_IF_NULL(if_rc);
190 haltest_error("No volume specified");
194 volume = (uint8_t) atoi(argv[2]);
196 EXEC(if_rc->set_volume, volume);
201 static void cleanup_p(int argc, const char **argv)
203 RETURN_IF_NULL(if_rc);
205 EXECV(if_rc->cleanup);
209 static struct method methods[] = {
211 STD_METHODCH(get_play_status_rsp,
212 "<play_status> <song_len> <song_pos>"),
213 STD_METHODCH(get_element_attr_rsp, "<num_attr> <attrs_id> <value>"),
214 STD_METHODCH(set_volume, "<volume>"),
219 const struct interface rc_if = {