btsrv_hfp.c 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504
  1. /*
  2. * Copyright (c) 2017 Actions Semi Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file
  8. * @brief btsrvice hfp
  9. */
  10. #define SYS_LOG_DOMAIN "btsrv_hfp"
  11. #include "btsrv_os_common.h"
  12. #include "btsrv_inner.h"
  13. struct btsrv_hfp_context_info {
  14. btsrv_hfp_callback hfp_user_callback;
  15. };
  16. static int btsrv_hfp_hf_disable_nrec(struct bt_conn *br_conn);
  17. static struct btsrv_hfp_context_info hfp_context;
  18. static void _btsrv_hfp_connected_cb(struct bt_conn *conn)
  19. {
  20. btsrv_event_notify(MSG_BTSRV_CONNECT, MSG_BTSRV_HFP_CONNECTED, conn);
  21. }
  22. static void _btsrv_hfp_disconnected_cb(struct bt_conn *conn)
  23. {
  24. /* TODO: Disconnected process order: btsrv_tws(if need)->btsrv_hfp->btsrv_connect */
  25. btsrv_event_notify(MSG_BTSRV_HFP, MSG_BTSRV_HFP_DISCONNECTED, conn);
  26. }
  27. static void _btsrv_hfp_service_cb(struct bt_conn *conn, uint32_t value)
  28. {
  29. /* CIEV service
  30. * 0: No Home/Roam network available.
  31. * 1: Home/Roam network available.
  32. */
  33. SYS_LOG_INF("hf service %d", value);
  34. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SERVICE, conn, (uint8_t)value);
  35. }
  36. static void _btsrv_hfp_call_cb(struct bt_conn *conn, uint32_t value)
  37. {
  38. /* CIEV call
  39. * 0: there are no calls in progress
  40. * 1: at least one call is in progress
  41. */
  42. SYS_LOG_INF("hf call %d", value);
  43. if (value == 0) {
  44. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_EXITED);
  45. } else if (value == 1) {
  46. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_ONGOING);
  47. }
  48. }
  49. static void _btsrv_hfp_call_setup_cb(struct bt_conn *conn, uint32_t value)
  50. {
  51. /* CIEV call_setup
  52. * 0: not currently in call set up
  53. * 1: an incoming call process ongoing
  54. * 2: an outgoing call set up is ongoing
  55. * 3: remote party being alerted in an outgoing call
  56. */
  57. SYS_LOG_INF("hf call_setup %d", value);
  58. switch (value) {
  59. case 0:
  60. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_SETUP_EXITED);
  61. break;
  62. case 1:
  63. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_INCOMING);
  64. break;
  65. case 2:
  66. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_OUTCOMING);
  67. break;
  68. case 3:
  69. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_ALERTED);
  70. break;
  71. }
  72. }
  73. static void _btsrv_hfp_call_held_cb(struct bt_conn *conn, uint32_t value)
  74. {
  75. /* CIEV call_held
  76. * 0: No calls held
  77. * 1: Call is placed on hold or active/held calls swapped
  78. * 2: Call on hold, no active call
  79. */
  80. SYS_LOG_INF("hf call_held %d", value);
  81. switch (value) {
  82. case 0:
  83. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_HELD_EXITED);
  84. break;
  85. case 1:
  86. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_MULTIPARTY_HELD);
  87. break;
  88. case 2:
  89. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SET_STATE, conn, BTSRV_HFP_STATE_CALL_HELD);
  90. break;
  91. }
  92. }
  93. static void _btsrv_hfp_signal_cb(struct bt_conn *conn, uint32_t value)
  94. {
  95. SYS_LOG_INF("hfp signal %u", value);
  96. }
  97. static void _btsrv_hfp_roam_cb(struct bt_conn *conn, uint32_t value)
  98. {
  99. SYS_LOG_INF("Roaming is %s active", value ? "" : "not");
  100. }
  101. static void _btsrv_hfp_battery_cb(struct bt_conn *conn, uint32_t value)
  102. {
  103. SYS_LOG_INF("Battery value: %u", value);
  104. }
  105. static void _btsrv_hfp_ring_cb(struct bt_conn *conn)
  106. {
  107. SYS_LOG_INF("Incoming Call...");
  108. }
  109. static void _btsrv_hfp_bsir_cb(struct bt_conn *conn, uint32_t value)
  110. {
  111. SYS_LOG_INF("%s provide in-band ring tones", value ? "" : "not");
  112. }
  113. static void _btsrv_hfp_ccwa_cb(struct bt_conn *conn, uint8_t *buf, uint32_t value)
  114. {
  115. int buffer[12] = {0};
  116. int len = 0;
  117. SYS_LOG_INF("Call waiting phone number:%s, type:%d", buf, value);
  118. buffer[0] = (int)conn;
  119. len = snprintf((char *)&buffer[1], sizeof(buffer) - 4, "%s", buf) + 4;
  120. btsrv_event_notify_malloc(MSG_BTSRV_HFP, MSG_BTSRV_HFP_HF_CCWA_PHONE_NUM, (uint8_t *)buffer, len, 0);
  121. }
  122. static void _btsrv_hfp_clip_cb(struct bt_conn *conn, uint8_t *buf, uint32_t value, uint8_t *name)
  123. {
  124. int buffer[12] = {0};
  125. int len = 0;
  126. SYS_LOG_INF("phone number:%s, type:%d phone name:%s", buf, value ,name);
  127. buffer[0] = (int)conn;
  128. len = snprintf((char *)&buffer[1], sizeof(buffer) - 4, "%s", buf) + 4;
  129. btsrv_event_notify_malloc(MSG_BTSRV_HFP, MSG_BTSRV_HFP_PHONE_NUM, (uint8_t *)buffer, len, 0);
  130. #if 0 /* Not used now */
  131. buffer[0] = (int)conn;
  132. len = snprintf((char *)&buffer[1], sizeof(buffer) - 4, "%s", name) + 4;
  133. btsrv_event_notify_malloc(MSG_BTSRV_HFP, MSG_BTSRV_HFP_PHONE_NAME, (uint8_t *)buffer, len, 0);
  134. #endif
  135. }
  136. static void _btsrv_hfp_bcs_cb(struct bt_conn *conn, uint32_t codec_id)
  137. {
  138. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_CODEC_INFO, conn, codec_id);
  139. SYS_LOG_INF("codec_id %d\n", codec_id);
  140. }
  141. static void _btsrv_hfp_bvra_cb(struct bt_conn *conn, uint32_t active)
  142. {
  143. uint8_t state;
  144. state = active ? BTSRV_HFP_SIRI_CHANGE_ACTIVE : BTSRV_HFP_SIRI_CHANGE_DEACTIVE;
  145. SYS_LOG_INF("Voice recognition is %s in the AG", active ? "enabled" : "disabled");
  146. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SIRI_STATE, conn, state);
  147. }
  148. static void _btsrv_hfp_vgs_cb(struct bt_conn *conn, uint32_t value)
  149. {
  150. SYS_LOG_INF("Gain of Speaker %d", value);
  151. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_VOLUME_CHANGE, conn, value);
  152. }
  153. static void _btsrv_hfp_vgm_cb(struct bt_conn *conn, uint32_t value)
  154. {
  155. SYS_LOG_INF("Gain of Microphone %d", value);
  156. }
  157. static void _btsrv_hfp_btrh_cb(struct bt_conn *conn, uint32_t value)
  158. {
  159. /* CIEV btrh
  160. * 0: Incoming call is put on hold in the AG
  161. * 1: Held incoming call is accepted in the AG
  162. * 2: Held incoming call is rejected in the AG
  163. */
  164. SYS_LOG_INF("hf btrh %d", value);
  165. }
  166. static void _btsrv_hfp_cops_cb(struct bt_conn *conn, uint32_t mode, uint32_t format, uint8_t *opt)
  167. {
  168. SYS_LOG_INF("Cops mode %d, format: %d, operator: %s", mode, format, opt);
  169. }
  170. static void _btsrv_hfp_cnum_cb(struct bt_conn *conn, uint8_t *buf, uint32_t value)
  171. {
  172. SYS_LOG_INF("Subscriber Number Information phone number:%s, type:%d", buf, value);
  173. }
  174. static void _btsrv_hfp_clcc_cb(struct bt_conn *conn, uint32_t idx, uint32_t dir, uint32_t status, uint32_t mode, uint32_t mpty,uint8_t *number, uint32_t type, uint8_t *name)
  175. {
  176. struct btsrv_hfp_clcc_info clcc_info;
  177. SYS_LOG_INF("list current calls result code, idx: %d, dir: %d,"
  178. "status: %d, mode: %d, mpty: %d number:%s type: %d, name: %s", idx, dir, status, mode, mpty,number, type, name);
  179. clcc_info.conn = conn;
  180. clcc_info.idx = idx;
  181. clcc_info.dir = dir;
  182. clcc_info.status = status;
  183. clcc_info.mode = mode;
  184. clcc_info.mpty = mpty;
  185. snprintf(clcc_info.number, 24, "%s", number);
  186. btsrv_event_notify_malloc(MSG_BTSRV_HFP, MSG_BTSRV_HFP_CLCC_INFO, (uint8_t *)&clcc_info, sizeof(struct btsrv_hfp_clcc_info), 0);
  187. }
  188. static void _btsrv_hfp_cclk_cb(struct bt_conn *conn, uint8_t *buf)
  189. {
  190. uint8_t buffer[36] = {0};
  191. int len = 0;
  192. SYS_LOG_INF("time of phone is :%s",buf);
  193. buffer[0] = (int)conn;
  194. memcpy(buffer,&conn,4);
  195. len = snprintf((char *)&buffer[4], sizeof(buffer) - 4, "%s", buf) + 4;
  196. //memcpy(&buffer[4],buf,strlen(buf));
  197. //len = strlen(buf) + 4 +1;
  198. btsrv_event_notify_malloc(MSG_BTSRV_HFP, MSG_BTSRV_HFP_TIME_UPDATE, (uint8_t *)buffer, len, 0);
  199. }
  200. static void _btsrv_hfp_cgmi_cb(struct bt_conn *conn, uint8_t *buf)
  201. {
  202. uint8_t buffer[30] = {0};
  203. int len = 0;
  204. SYS_LOG_INF("phone:%s",buf);
  205. buffer[0] = (int)conn;
  206. memcpy(buffer,&conn,4);
  207. len = snprintf((char *)&buffer[4], sizeof(buffer) - 4, "%s", buf) + 4;
  208. //memcpy(&buffer[4],buf,strlen(buf));
  209. //len = strlen(buf) + 4 +1;
  210. btsrv_event_notify_malloc(MSG_BTSRV_HFP, MSG_BTSRV_HFP_MANUFACTURE_INFO, (uint8_t *)buffer, len, 0);
  211. }
  212. static void _btsrv_hfp_battery_indicator_cb(struct bt_conn *conn, uint32_t status)
  213. {
  214. SYS_LOG_INF("status:%d.",status);
  215. if (1 == status) {
  216. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_HPREC_BATTERY, conn, status);
  217. }
  218. }
  219. static void _btsrv_hfp_cmd_complete_cb(struct bt_conn *conn,
  220. struct bt_hfp_hf_cmd_complete *cmd)
  221. {
  222. uint8_t state;
  223. if (cmd->type != HFP_HF_CMD_OK) {
  224. SYS_LOG_INF("Send at cmd %s err %d-%d", cmd->sending_cmd, cmd->type, cmd->cme);
  225. if (!memcmp(cmd->sending_cmd, "AT+BVRA=1", strlen("AT+BVRA=1"))) {
  226. state = BTSRV_HFP_SIRI_CHANGE_DEACTIVE;
  227. btsrv_event_notify_ext(MSG_BTSRV_HFP, MSG_BTSRV_HFP_SIRI_STATE, conn, state);
  228. }
  229. }
  230. }
  231. static void _btsrv_hfp_cmd_recv_cb(struct bt_conn *conn, uint8_t *data, uint16_t len)
  232. {
  233. /* Do not modify the content of the input parameters.*/
  234. // stack_print_char("\nrecv:\n", data, len);
  235. }
  236. static const struct bt_hfp_hf_cb btsrv_hf_cb = {
  237. .connected = _btsrv_hfp_connected_cb,
  238. .disconnected = _btsrv_hfp_disconnected_cb,
  239. .service = _btsrv_hfp_service_cb,
  240. .call = _btsrv_hfp_call_cb,
  241. .call_setup = _btsrv_hfp_call_setup_cb,
  242. .call_held = _btsrv_hfp_call_held_cb,
  243. .signal = _btsrv_hfp_signal_cb,
  244. .roam = _btsrv_hfp_roam_cb,
  245. .battery = _btsrv_hfp_battery_cb,
  246. .ring_indication = _btsrv_hfp_ring_cb,
  247. .bsir = _btsrv_hfp_bsir_cb,
  248. .ccwa = _btsrv_hfp_ccwa_cb,
  249. .clip = _btsrv_hfp_clip_cb,
  250. .bcs = _btsrv_hfp_bcs_cb,
  251. .bvra = _btsrv_hfp_bvra_cb,
  252. .vgs = _btsrv_hfp_vgs_cb,
  253. .vgm = _btsrv_hfp_vgm_cb,
  254. .btrh = _btsrv_hfp_btrh_cb,
  255. .cops = _btsrv_hfp_cops_cb,
  256. .cnum = _btsrv_hfp_cnum_cb,
  257. .clcc = _btsrv_hfp_clcc_cb,
  258. .cclk = _btsrv_hfp_cclk_cb,
  259. .cgmi = _btsrv_hfp_cgmi_cb,
  260. .battery_indicator = _btsrv_hfp_battery_indicator_cb,
  261. .cmd_complete_cb = _btsrv_hfp_cmd_complete_cb,
  262. .recv = _btsrv_hfp_cmd_recv_cb,
  263. };
  264. uint8_t btsrv_hfp_get_codec_id(struct bt_conn *conn)
  265. {
  266. struct bt_conn *base_conn = btsrv_rdm_get_base_conn_by_sco(conn);
  267. uint8_t codec_id = BT_CODEC_ID_CVSD;
  268. uint8_t sample_rate = 8;
  269. btsrv_rdm_hfp_get_codec_info(base_conn, &codec_id, &sample_rate);
  270. return codec_id;
  271. }
  272. static int _btsrv_hfp_update_codec_info(void)
  273. {
  274. uint8_t codec_info[2] = {BT_CODEC_ID_CVSD, 8};
  275. struct bt_conn *conn = btsrv_rdm_hfp_get_actived();
  276. if(!conn)
  277. return -EINVAL;
  278. btsrv_rdm_hfp_get_codec_info(conn, codec_info, &codec_info[1]);
  279. #ifdef CONFIG_MEDIA
  280. if (codec_info[0] == BT_CODEC_ID_CVSD) {
  281. codec_info[0] = CVSD_TYPE;
  282. } else if (codec_info[0] == BT_CODEC_ID_MSBC) {
  283. codec_info[0] = MSBC_TYPE;
  284. }
  285. #endif
  286. hfp_context.hfp_user_callback(BTSRV_HFP_CODEC_INFO, codec_info, sizeof(codec_info));
  287. return 0;
  288. }
  289. static int _btsrv_hfp_tws_start_call(void)
  290. {
  291. #ifdef CONFIG_SUPPORT_TWS
  292. uint8_t codec_info[2] = {BT_CODEC_ID_CVSD, 8};
  293. struct bt_conn *conn = btsrv_rdm_hfp_get_actived();
  294. if(btsrv_rdm_get_dev_role() == BTSRV_TWS_MASTER){
  295. btsrv_rdm_hfp_get_codec_info(conn, codec_info, &codec_info[1]);
  296. btsrv_tws_hfp_start_callout(codec_info[0]);
  297. }
  298. #endif
  299. return 0;
  300. }
  301. static void btsrv_hfp_call_status_cb(struct bt_conn *conn, btsrv_hfp_event_e event, btsrv_hfp_state state)
  302. {
  303. struct bt_conn *second_conn = btsrv_rdm_hfp_get_second_dev();
  304. int other_dev_state = -1;
  305. if (!second_conn) {
  306. if (state == BTSRV_HFP_STATE_SCO_ESTABLISHED) {
  307. _btsrv_hfp_update_codec_info();
  308. hfp_context.hfp_user_callback(BTSRV_HFP_SCO, NULL, 0);
  309. }
  310. hfp_context.hfp_user_callback(event, NULL, 0);
  311. } else {
  312. if (conn == second_conn)
  313. other_dev_state = btsrv_rdm_hfp_get_state(btsrv_rdm_hfp_get_actived());
  314. else
  315. other_dev_state = btsrv_rdm_hfp_get_state(second_conn);
  316. switch (state) {
  317. case BTSRV_HFP_STATE_INIT:
  318. case BTSRV_HFP_STATE_LINKED:
  319. switch (other_dev_state) {
  320. case BTSRV_HFP_STATE_INIT:
  321. case BTSRV_HFP_STATE_LINKED:
  322. hfp_context.hfp_user_callback(event, NULL, 0);
  323. break;
  324. case BTSRV_HFP_STATE_CALL_INCOMING:
  325. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_INCOMING, NULL, 0);
  326. event = BTSRV_HFP_CALL_INCOMING;
  327. break;
  328. case BTSRV_HFP_STATE_CALL_OUTCOMING:
  329. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_OUTGOING, NULL, 0);
  330. event = BTSRV_HFP_CALL_OUTGOING;
  331. break;
  332. case BTSRV_HFP_STATE_CALL_ALERTED:
  333. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_ALERTED, NULL, 0);
  334. event = BTSRV_HFP_CALL_ALERTED;
  335. break;
  336. case BTSRV_HFP_STATE_CALL_ONGOING:
  337. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_ONGOING, NULL, 0);
  338. event = BTSRV_HFP_CALL_ONGOING;
  339. break;
  340. case BTSRV_HFP_STATE_SCO_ESTABLISHED:
  341. hfp_context.hfp_user_callback(BTSRV_HFP_SCO, NULL, 0);
  342. event = BTSRV_HFP_SCO;
  343. break;
  344. case BTSRV_HFP_STATE_CALL_3WAYIN:
  345. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_3WAYIN, NULL, 0);
  346. event = BTSRV_HFP_CALL_3WAYIN;
  347. break;
  348. case BTSRV_HFP_STATE_CALL_MULTIPARTY:
  349. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_MULTIPARTY, NULL, 0);
  350. event = BTSRV_HFP_CALL_MULTIPARTY;
  351. break;
  352. default:
  353. break;
  354. }
  355. break;
  356. case BTSRV_HFP_STATE_CALL_INCOMING:
  357. case BTSRV_HFP_STATE_CALL_OUTCOMING:
  358. case BTSRV_HFP_STATE_CALL_ALERTED:
  359. switch (other_dev_state) {
  360. case BTSRV_HFP_STATE_INIT:
  361. case BTSRV_HFP_STATE_LINKED:
  362. hfp_context.hfp_user_callback(event, NULL, 0);
  363. break;
  364. case BTSRV_HFP_STATE_CALL_INCOMING:
  365. case BTSRV_HFP_STATE_CALL_OUTCOMING:
  366. case BTSRV_HFP_STATE_CALL_ALERTED:
  367. case BTSRV_HFP_STATE_CALL_ONGOING:
  368. case BTSRV_HFP_STATE_SCO_ESTABLISHED: /* to do */
  369. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_3WAYIN, NULL, 0);
  370. event = BTSRV_HFP_CALL_3WAYIN;
  371. break;
  372. case BTSRV_HFP_STATE_CALL_3WAYIN:
  373. case BTSRV_HFP_STATE_CALL_MULTIPARTY:
  374. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_MULTIPARTY, NULL, 0);
  375. event = BTSRV_HFP_CALL_MULTIPARTY;
  376. break;
  377. default:
  378. break;
  379. }
  380. break;
  381. case BTSRV_HFP_STATE_CALL_ONGOING:
  382. switch (other_dev_state) {
  383. case BTSRV_HFP_STATE_INIT:
  384. case BTSRV_HFP_STATE_LINKED:
  385. hfp_context.hfp_user_callback(event, NULL, 0);
  386. break;
  387. case BTSRV_HFP_STATE_CALL_INCOMING:
  388. case BTSRV_HFP_STATE_CALL_OUTCOMING:
  389. case BTSRV_HFP_STATE_CALL_ALERTED:
  390. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_3WAYIN, NULL, 0);
  391. event = BTSRV_HFP_CALL_3WAYIN;
  392. break;
  393. case BTSRV_HFP_STATE_CALL_ONGOING:
  394. case BTSRV_HFP_STATE_SCO_ESTABLISHED: /* to do */
  395. case BTSRV_HFP_STATE_CALL_3WAYIN:
  396. case BTSRV_HFP_STATE_CALL_MULTIPARTY:
  397. hfp_context.hfp_user_callback(BTSRV_HFP_CALL_MULTIPARTY, NULL, 0);
  398. event = BTSRV_HFP_CALL_MULTIPARTY;
  399. break;
  400. default:
  401. break;
  402. }
  403. break;
  404. case BTSRV_HFP_STATE_SCO_ESTABLISHED:
  405. if (conn != second_conn) {
  406. _btsrv_hfp_update_codec_info();
  407. hfp_context.hfp_user_callback(BTSRV_HFP_SCO, NULL, 0);
  408. hfp_context.hfp_user_callback(event, NULL, 0);
  409. }
  410. break;
  411. case BTSRV_HFP_STATE_CALL_3WAYIN:
  412. case BTSRV_HFP_STATE_CALL_MULTIPARTY:
  413. hfp_context.hfp_user_callback(event, NULL, 0);
  414. break;
  415. default:
  416. break;
  417. }
  418. }
  419. SYS_LOG_INF("event %d dev state %d second dev state %d\n", event, state, other_dev_state);
  420. }
  421. int btsrv_hfp_set_status(struct bt_conn *conn, int state)
  422. {
  423. int old_state = btsrv_rdm_hfp_get_state(conn);
  424. int new_state = -1;
  425. int event = -1;
  426. uint8_t active_call, held_call, incoming_call, outgoing_call;
  427. int ret = btsrv_rdm_hfp_get_call_state(conn, &active_call, &held_call, &incoming_call, &outgoing_call);
  428. if (ret < 0)
  429. return -ESRCH;
  430. switch (state) {
  431. case BTSRV_HFP_STATE_CALL_EXITED:
  432. active_call = 0;
  433. held_call = 0;
  434. if (old_state > BTSRV_HFP_STATE_INIT) {
  435. if (!incoming_call && !outgoing_call) {
  436. new_state = BTSRV_HFP_STATE_LINKED;
  437. event = BTSRV_HFP_CALL_EXIT;
  438. if(btsrv_rdm_hfp_get_sco_state(conn) == BTSRV_SCO_STATE_PHONE)
  439. btsrv_rdm_hfp_set_sco_state(conn, BTSRV_SCO_STATE_INIT);
  440. } else if (incoming_call == 1) {
  441. new_state = BTSRV_HFP_STATE_CALL_INCOMING;
  442. event = BTSRV_HFP_CALL_INCOMING;
  443. } else if (outgoing_call == 1) {
  444. new_state = BTSRV_HFP_STATE_CALL_OUTCOMING;
  445. event = BTSRV_HFP_CALL_OUTGOING;
  446. }
  447. }
  448. break;
  449. case BTSRV_HFP_STATE_CALL_SETUP_EXITED:
  450. if (incoming_call > 0)
  451. incoming_call = 0;
  452. else if (outgoing_call > 0)
  453. outgoing_call = 0;
  454. if (old_state == BTSRV_HFP_STATE_CALL_INCOMING ||
  455. old_state == BTSRV_HFP_STATE_CALL_OUTCOMING ||
  456. old_state == BTSRV_HFP_STATE_CALL_ALERTED) {
  457. new_state = BTSRV_HFP_STATE_LINKED;
  458. event = BTSRV_HFP_CALL_EXIT;
  459. if(btsrv_rdm_hfp_get_sco_state(conn) == BTSRV_SCO_STATE_PHONE)
  460. btsrv_rdm_hfp_set_sco_state(conn, BTSRV_SCO_STATE_INIT);
  461. } else if (old_state == BTSRV_HFP_STATE_CALL_3WAYIN) {
  462. new_state = BTSRV_HFP_STATE_CALL_ONGOING;
  463. event = BTSRV_HFP_CALL_ONGOING;
  464. }
  465. break;
  466. case BTSRV_HFP_STATE_CALL_HELD_EXITED:
  467. held_call = 0;
  468. if (old_state == BTSRV_HFP_STATE_CALL_MULTIPARTY) {
  469. if ((incoming_call + outgoing_call > 0)
  470. && active_call){
  471. new_state = BTSRV_HFP_STATE_CALL_3WAYIN;
  472. event = BTSRV_HFP_CALL_3WAYIN;
  473. } else if (incoming_call == 1) {
  474. new_state = BTSRV_HFP_STATE_CALL_INCOMING;
  475. event = BTSRV_HFP_CALL_INCOMING;
  476. } else if (outgoing_call == 1) {
  477. new_state = BTSRV_HFP_STATE_CALL_OUTCOMING;
  478. event = BTSRV_HFP_CALL_OUTGOING;
  479. } else {/* to do : held call --> active call */
  480. new_state = BTSRV_HFP_STATE_CALL_ONGOING;
  481. event = BTSRV_HFP_CALL_ONGOING;
  482. active_call = 1;
  483. }
  484. }
  485. break;
  486. case BTSRV_HFP_STATE_CALL_HELD:
  487. new_state = BTSRV_HFP_STATE_CALL_MULTIPARTY;
  488. event = BTSRV_HFP_CALL_MULTIPARTY;
  489. active_call = 0;
  490. held_call = 1;
  491. break;
  492. case BTSRV_HFP_STATE_CALL_MULTIPARTY_HELD:
  493. active_call = 1;
  494. held_call = 1;
  495. new_state = BTSRV_HFP_STATE_CALL_MULTIPARTY;
  496. event = BTSRV_HFP_CALL_MULTIPARTY;
  497. break;
  498. case BTSRV_HFP_STATE_CALL_INCOMING:
  499. incoming_call = 1;
  500. if (old_state == BTSRV_HFP_STATE_INIT ||
  501. old_state == BTSRV_HFP_STATE_LINKED ||
  502. old_state == BTSRV_HFP_STATE_SCO_ESTABLISHED) {
  503. new_state = BTSRV_HFP_STATE_CALL_INCOMING;
  504. event = BTSRV_HFP_CALL_INCOMING;
  505. } else if (old_state >= BTSRV_HFP_STATE_CALL_ONGOING && old_state <= BTSRV_HFP_STATE_CALL_3WAYIN) {
  506. new_state = BTSRV_HFP_STATE_CALL_3WAYIN;
  507. event = BTSRV_HFP_CALL_3WAYIN;
  508. }
  509. break;
  510. case BTSRV_HFP_STATE_CALL_OUTCOMING:
  511. outgoing_call = 1;
  512. if (old_state == BTSRV_HFP_STATE_INIT ||
  513. old_state == BTSRV_HFP_STATE_LINKED ||
  514. old_state == BTSRV_HFP_STATE_SCO_ESTABLISHED) {
  515. new_state = BTSRV_HFP_STATE_CALL_OUTCOMING;
  516. event = BTSRV_HFP_CALL_OUTGOING;
  517. } else if (old_state >= BTSRV_HFP_STATE_CALL_ONGOING && old_state <= BTSRV_HFP_STATE_CALL_3WAYIN) {
  518. new_state = BTSRV_HFP_STATE_CALL_3WAYIN;
  519. event = BTSRV_HFP_CALL_3WAYIN;
  520. }
  521. break;
  522. case BTSRV_HFP_STATE_CALL_ONGOING:
  523. active_call = 1;
  524. if (old_state == BTSRV_HFP_STATE_INIT ||
  525. old_state == BTSRV_HFP_STATE_CALL_INCOMING ||
  526. old_state == BTSRV_HFP_STATE_CALL_OUTCOMING ||
  527. old_state == BTSRV_HFP_STATE_CALL_ALERTED ||
  528. old_state == BTSRV_HFP_STATE_SCO_ESTABLISHED) {
  529. new_state = BTSRV_HFP_STATE_CALL_ONGOING;
  530. event = BTSRV_HFP_CALL_ONGOING;
  531. } else if (old_state == BTSRV_HFP_STATE_CALL_3WAYIN) {
  532. new_state = BTSRV_HFP_STATE_CALL_MULTIPARTY;
  533. event = BTSRV_HFP_CALL_MULTIPARTY;
  534. }
  535. break;
  536. case BTSRV_HFP_STATE_CALL_ALERTED:
  537. outgoing_call = 1;
  538. if (old_state == BTSRV_HFP_STATE_INIT ||
  539. old_state == BTSRV_HFP_STATE_CALL_OUTCOMING ||
  540. old_state == BTSRV_HFP_STATE_SCO_ESTABLISHED) {
  541. new_state = BTSRV_HFP_STATE_CALL_ALERTED;
  542. event = BTSRV_HFP_CALL_ALERTED;
  543. } else if (old_state >= BTSRV_HFP_STATE_CALL_ONGOING && old_state <= BTSRV_HFP_STATE_CALL_3WAYIN) {
  544. new_state = BTSRV_HFP_STATE_CALL_3WAYIN;
  545. event = BTSRV_HFP_CALL_3WAYIN;
  546. }
  547. break;
  548. case BTSRV_HFP_STATE_SCO_ESTABLISHED:
  549. if (old_state == BTSRV_HFP_STATE_INIT ||
  550. old_state == BTSRV_HFP_STATE_LINKED)
  551. new_state = BTSRV_HFP_STATE_SCO_ESTABLISHED;
  552. else{
  553. if (conn == btsrv_rdm_hfp_get_actived() ||
  554. conn == btsrv_rdm_get_tws_by_role(BTSRV_TWS_SLAVE)) {
  555. _btsrv_hfp_update_codec_info();
  556. hfp_context.hfp_user_callback(BTSRV_SCO_CONNECTED, NULL, 0);
  557. }
  558. }
  559. event = BTSRV_SCO_CONNECTED;
  560. btsrv_rdm_hfp_set_sco_state(conn, BTSRV_SCO_STATE_HFP);
  561. if(conn == btsrv_rdm_hfp_get_actived() && btsrv_rdm_get_dev_role() == BTSRV_TWS_MASTER){
  562. _btsrv_hfp_tws_start_call();
  563. }
  564. break;
  565. case BTSRV_HFP_STATE_SCO_RELEASED:
  566. if (old_state == BTSRV_HFP_STATE_SCO_ESTABLISHED) {
  567. new_state = BTSRV_HFP_STATE_LINKED;
  568. btsrv_rdm_hfp_set_sco_state(conn, BTSRV_SCO_STATE_INIT);
  569. } else {
  570. if (conn == btsrv_rdm_hfp_get_actived() ||
  571. conn == btsrv_rdm_get_tws_by_role(BTSRV_TWS_SLAVE))
  572. hfp_context.hfp_user_callback(BTSRV_SCO_DISCONNECTED, NULL, 0);
  573. /* sco may be released after call exit,sco state must set to INIT */
  574. if (old_state != BTSRV_HFP_STATE_LINKED && old_state != BTSRV_HFP_STATE_INIT)
  575. btsrv_rdm_hfp_set_sco_state(conn, BTSRV_SCO_STATE_PHONE);
  576. else
  577. btsrv_rdm_hfp_set_sco_state(conn, BTSRV_SCO_STATE_INIT);
  578. }
  579. event = BTSRV_SCO_DISCONNECTED;
  580. #ifdef CONFIG_SUPPORT_TWS
  581. if(conn == btsrv_rdm_hfp_get_actived() && btsrv_rdm_get_dev_role() == BTSRV_TWS_MASTER){
  582. btsrv_tws_hfp_stop_call();
  583. }
  584. #endif
  585. break;
  586. }
  587. SYS_LOG_INF("old state %d new state %d state %d\n", old_state, new_state, state);
  588. SYS_LOG_INF("active %d hold %d coming %d\n", active_call, held_call,
  589. incoming_call + outgoing_call);
  590. btsrv_rdm_hfp_set_call_state(conn, active_call, held_call, incoming_call, outgoing_call);
  591. if (new_state >= 0) {
  592. if ((new_state >= BTSRV_HFP_STATE_CALL_INCOMING &&
  593. new_state <= BTSRV_HFP_STATE_SCO_ESTABLISHED) &&
  594. conn == btsrv_rdm_a2dp_get_actived() &&
  595. btsrv_rdm_is_a2dp_stream_open(conn)) {
  596. btsrv_rdm_a2dp_actived_switch_lock(conn, 1);
  597. SYS_LOG_INF("conn %p a2dp switch lock\n", conn);
  598. } else if (new_state == BTSRV_HFP_STATE_LINKED &&
  599. conn == btsrv_rdm_a2dp_get_actived()) {
  600. btsrv_rdm_a2dp_actived_switch_lock(conn, 0);
  601. SYS_LOG_INF("conn %p a2dp switch unlock\n", conn);
  602. }
  603. if(conn == btsrv_rdm_hfp_get_actived() && old_state == BTSRV_HFP_STATE_CALL_INCOMING
  604. && btsrv_rdm_hfp_get_notify_phone_num_state(conn)){
  605. hfp_context.hfp_user_callback(BTSRV_HFP_PHONE_NUM_STOP, NULL, 0);
  606. btsrv_rdm_hfp_set_notify_phone_num_state(conn,0);
  607. }
  608. btsrv_rdm_hfp_set_state(conn, new_state);
  609. btsrv_hfp_call_status_cb(conn, event, new_state);
  610. }
  611. return 0;
  612. }
  613. int btsrv_hfp_connect(struct bt_conn *conn)
  614. {
  615. if (!hostif_bt_hfp_hf_connect(conn)) {
  616. SYS_LOG_INF("Connect hfp_conn:%p\n", conn);
  617. } else {
  618. SYS_LOG_ERR("cmd_bredr_hfp_connect failed\n");
  619. }
  620. return 0;
  621. }
  622. int btsrv_hfp_init(btsrv_hfp_callback cb)
  623. {
  624. SYS_LOG_INF("cb %p", cb);
  625. memset(&hfp_context, 0, sizeof(struct btsrv_hfp_context_info));
  626. hostif_bt_hfp_hf_register_cb((struct bt_hfp_hf_cb *)&btsrv_hf_cb);
  627. hfp_context.hfp_user_callback = cb;
  628. return 0;
  629. }
  630. int btsrv_hfp_deinit(void)
  631. {
  632. hostif_bt_hfp_hf_register_cb(NULL);
  633. return 0;
  634. }
  635. static int _btsrv_hfp_connected(struct bt_conn *conn)
  636. {
  637. bd_address_t *addr = NULL;
  638. int state = btsrv_rdm_hfp_get_state(conn);
  639. addr = GET_CONN_BT_ADDR(conn);
  640. SYS_LOG_INF("hfp connected:%p addr %p\n", conn, addr);
  641. /**decode id may update during connect*/
  642. /* btsrv_rdm_hfp_set_codec_info(conn, BT_CODEC_ID_CVSD, 8); */
  643. if (state == BTSRV_HFP_STATE_INIT)
  644. btsrv_rdm_hfp_set_state(conn, BTSRV_HFP_STATE_LINKED);
  645. hfp_context.hfp_user_callback(BTSRV_HFP_CONNECTED, NULL, 0);
  646. btsrv_hfp_hf_disable_nrec(conn);
  647. return 0;
  648. }
  649. static int _btsrv_hfp_disconnected(struct bt_conn *conn)
  650. {
  651. bd_address_t *addr = NULL;
  652. int old_state = btsrv_rdm_hfp_get_state(conn);
  653. addr = GET_CONN_BT_ADDR(conn);
  654. SYS_LOG_INF("hfp disconnected:%p addr %p\n", conn, addr);
  655. btsrv_rdm_hfp_set_state(conn, BTSRV_HFP_STATE_INIT);
  656. if(btsrv_rdm_hfp_get_sco_state(conn) == BTSRV_SCO_STATE_PHONE)
  657. btsrv_rdm_hfp_set_sco_state(conn, BTSRV_SCO_STATE_INIT);
  658. if (old_state > BTSRV_HFP_STATE_LINKED)
  659. btsrv_hfp_call_status_cb(conn, BTSRV_HFP_CALL_EXIT, BTSRV_HFP_STATE_INIT);
  660. if (!btsrv_rdm_hfp_get_second_dev())
  661. hfp_context.hfp_user_callback(BTSRV_HFP_DISCONNECTED, NULL, 0);
  662. return 0;
  663. }
  664. int btsrv_hfp_rejected(struct bt_conn *conn)
  665. {
  666. hfp_context.hfp_user_callback(BTSRV_HFP_SCO_REJECTED, NULL, 0);
  667. return 0;
  668. }
  669. static int _btsrv_hfp_phone_num(struct bt_conn *conn, char *data)
  670. {
  671. struct bt_conn *trs_conn;
  672. /* call back to uplayer , play tts deceide by up layer*/
  673. if (conn == btsrv_rdm_hfp_get_actived()) {
  674. if (NULL != (trs_conn = (struct bt_conn *)btsrv_a2dp_trs_conn_get())) {
  675. hostif_bt_conn_check_exit_sniff(trs_conn);
  676. }
  677. hfp_context.hfp_user_callback(BTSRV_HFP_PHONE_NUM, data, strlen(data));
  678. btsrv_rdm_hfp_set_notify_phone_num_state(conn,1);
  679. }
  680. return 0;
  681. }
  682. static int _btsrv_hfp_phone_name(struct bt_conn *conn, char *data)
  683. {
  684. if (conn == btsrv_rdm_hfp_get_actived()) {
  685. hfp_context.hfp_user_callback(BTSRV_HFP_PHONE_NAME, data, strlen(data));
  686. }
  687. return 0;
  688. }
  689. static int _btsrv_hfp_hf_ccwa_phone_num(struct bt_conn *conn, char *data)
  690. {
  691. if (conn == btsrv_rdm_hfp_get_actived()) {
  692. hfp_context.hfp_user_callback(BTSRV_HFP_CCWA_PHONE_NUM, data, strlen(data));
  693. }
  694. return 0;
  695. }
  696. static int _btsrv_hfp_hf_clcc_info(struct btsrv_hfp_clcc_info *data)
  697. {
  698. if (data->conn == btsrv_rdm_hfp_get_actived()) {
  699. hfp_context.hfp_user_callback(BTSRV_HFP_CLCC_INFO, (uint8_t *)data, sizeof(struct btsrv_hfp_clcc_info));
  700. }
  701. return 0;
  702. }
  703. static int _btsrv_hfp_codec_info(struct bt_conn *conn, uint8_t codec_id)
  704. {
  705. uint8_t codec_info[2] = {0};
  706. #ifdef CONFIG_MEDIA
  707. if (codec_id == BT_CODEC_ID_CVSD) {
  708. codec_info[0] = CVSD_TYPE;
  709. codec_info[1] = 8;
  710. } else if (codec_id == BT_CODEC_ID_MSBC) {
  711. codec_info[0] = MSBC_TYPE;
  712. codec_info[1] = 16;
  713. }
  714. #endif
  715. btsrv_rdm_hfp_set_codec_info(conn, codec_id, codec_info[1]);
  716. if (conn == btsrv_rdm_hfp_get_actived() || conn == btsrv_rdm_get_tws_by_role(BTSRV_TWS_SLAVE))
  717. hfp_context.hfp_user_callback(BTSRV_HFP_CODEC_INFO, codec_info, sizeof(codec_info));
  718. return 0;
  719. }
  720. static int _btsrv_hfp_volume_change(struct bt_conn *conn, uint8_t volume)
  721. {
  722. if (conn == btsrv_rdm_hfp_get_actived())
  723. hfp_context.hfp_user_callback(BTSRV_HFP_VOLUME_CHANGE, (uint8_t *)&volume, sizeof(volume));
  724. return 0;
  725. }
  726. static int _btsrv_hfp_active_dev_change(struct bt_conn *conn)
  727. {
  728. if (conn == btsrv_rdm_hfp_get_actived()) {
  729. #ifdef CONFIG_SUPPORT_TWS
  730. if(btsrv_rdm_get_dev_role() == BTSRV_TWS_MASTER){
  731. btsrv_tws_hfp_stop_call();
  732. }
  733. #endif
  734. hfp_context.hfp_user_callback(BTSRV_HFP_ACTIVE_DEV_CHANGE, NULL, 0);
  735. int state = btsrv_rdm_hfp_get_state(conn);
  736. int sco_state = btsrv_rdm_hfp_get_sco_state(conn);
  737. if(!btsrv_rdm_hfp_get_actived_sco()){
  738. if ((state >= BTSRV_HFP_STATE_CALL_ONGOING && state <= BTSRV_HFP_STATE_CALL_MULTIPARTY) ||
  739. (state >= BTSRV_HFP_STATE_CALL_INCOMING && state <= BTSRV_HFP_STATE_CALL_ALERTED &&
  740. sco_state == BTSRV_SCO_STATE_PHONE))
  741. if (btsrv_allow_sco_connect()) {
  742. hostif_bt_conn_create_sco(conn);
  743. }
  744. }else{
  745. struct thread_timer *sco_disconnect_timer = btsrv_rdm_get_sco_disconnect_timer(conn);
  746. if(thread_timer_is_running(sco_disconnect_timer)){
  747. thread_timer_stop(sco_disconnect_timer);
  748. }
  749. if(sco_state != BTSRV_SCO_STATE_DISCONNECT){
  750. _btsrv_hfp_update_codec_info();
  751. _btsrv_hfp_tws_start_call();
  752. hfp_context.hfp_user_callback(BTSRV_SCO_CONNECTED, NULL, 0);
  753. }
  754. }
  755. struct bt_conn *second_conn = btsrv_rdm_hfp_get_second_dev();
  756. if(second_conn && btsrv_rdm_hfp_get_notify_phone_num_state(second_conn)){
  757. hfp_context.hfp_user_callback(BTSRV_HFP_PHONE_NUM_STOP, NULL, 0);
  758. btsrv_rdm_hfp_set_notify_phone_num_state(second_conn,0);
  759. }
  760. }
  761. return 0;
  762. }
  763. static int _btsrv_hfp_siri_state_change(struct bt_conn *conn, uint8_t state)
  764. {
  765. if (conn == btsrv_rdm_hfp_get_actived())
  766. hfp_context.hfp_user_callback(BTSRV_HFP_SIRI_STATE_CHANGE, (uint8_t *)&state, sizeof(state));
  767. return 0;
  768. }
  769. static int _btsrv_hfp_time_update(struct bt_conn *conn, char *data)
  770. {
  771. /* call back to uplayer , play tts deceide by up layer*/
  772. if (conn == btsrv_rdm_hfp_get_actived()) {
  773. hfp_context.hfp_user_callback(BTSRV_HFP_TIME_UPDATE, data, strlen(data));
  774. }
  775. return 0;
  776. }
  777. static int _btsrv_hfp_cgmi_update(struct bt_conn *conn, char *data)
  778. {
  779. /* call back to uplayer , play tts deceide by up layer*/
  780. if (conn == btsrv_rdm_hfp_get_actived()) {
  781. hfp_context.hfp_user_callback(BTSRV_HFP_CGMI_UPDATE, data, strlen(data));
  782. }
  783. return 0;
  784. }
  785. static int _btsrv_hfp_hf_switch_sound_source(void)
  786. {
  787. struct bt_conn *sco_conn = btsrv_rdm_hfp_get_actived_sco();
  788. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  789. struct bt_conn *second_conn = btsrv_rdm_hfp_get_second_dev();
  790. int state;
  791. if(second_conn)
  792. state = btsrv_rdm_hfp_get_state(second_conn);
  793. if (!br_conn)
  794. return -ESRCH;
  795. if (sco_conn) {
  796. if (second_conn && (state >= BTSRV_HFP_STATE_CALL_INCOMING
  797. && state <= BTSRV_HFP_STATE_SCO_ESTABLISHED)){
  798. btsrv_rdm_hfp_actived(second_conn, 1, 1);
  799. }
  800. btsrv_sco_disconnect(sco_conn);
  801. } else {
  802. if (second_conn && (state >= BTSRV_HFP_STATE_CALL_INCOMING
  803. && state <= BTSRV_HFP_STATE_SCO_ESTABLISHED)){
  804. btsrv_rdm_hfp_actived(second_conn, 1, 1);
  805. return 0;
  806. }
  807. /* phone which has ring tone will creat sco buring incoming
  808. * so we don't creat sco during incoming except for BTSRV_SCO_STATE_PHONE state
  809. * this state means sco has been created before.
  810. */
  811. int sco_state = btsrv_rdm_hfp_get_sco_state(br_conn);
  812. int state = btsrv_rdm_hfp_get_state(br_conn);
  813. if ((state >= BTSRV_HFP_STATE_CALL_ONGOING && state <= BTSRV_HFP_STATE_CALL_MULTIPARTY) ||
  814. (state >= BTSRV_HFP_STATE_CALL_INCOMING && state <= BTSRV_HFP_STATE_CALL_ALERTED &&
  815. sco_state == BTSRV_SCO_STATE_PHONE)) {
  816. if (btsrv_allow_sco_connect()) {
  817. hostif_bt_conn_create_sco(br_conn);
  818. }
  819. }
  820. }
  821. return 0;
  822. }
  823. static int _btsrv_hfp_hf_dial_number(uint8_t *number)
  824. {
  825. char at_command[32];
  826. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  827. if (!br_conn)
  828. return -ESRCH;
  829. snprintf(at_command, sizeof(at_command), "ATD%s;\r", number);
  830. hostif_bt_hfp_hf_send_cmd(br_conn, at_command);
  831. return 0;
  832. }
  833. static int _btsrv_hfp_hf_dial_last_number(void)
  834. {
  835. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  836. if (!br_conn)
  837. return -ESRCH;
  838. int state = btsrv_rdm_hfp_get_state(br_conn);
  839. if (state != BTSRV_HFP_STATE_LINKED && state != BTSRV_HFP_STATE_CALL_ONGOING &&
  840. state != BTSRV_HFP_STATE_SCO_ESTABLISHED)
  841. return -EBUSY;
  842. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+BLDN\r");
  843. return 0;
  844. }
  845. static int _btsrv_hfp_hf_dial_memory(int location)
  846. {
  847. char at_command[32];
  848. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  849. if (!br_conn)
  850. return -ESRCH;
  851. snprintf(at_command, sizeof(at_command), "ATD>%u;\r", location);
  852. hostif_bt_hfp_hf_send_cmd(br_conn, at_command);
  853. return 0;
  854. }
  855. static int _btsrv_hfp_hf_volume_control(uint8_t type, uint8_t volume)
  856. {
  857. char at_command[32];
  858. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  859. if (!br_conn)
  860. return -ESRCH;
  861. if (type == 0x01) {
  862. snprintf(at_command, sizeof(at_command), "AT+VGS=%u\r", volume);
  863. } else {
  864. snprintf(at_command, sizeof(at_command), "AT+VGM=%u\r", volume);
  865. }
  866. hostif_bt_hfp_hf_send_cmd(br_conn, at_command);
  867. return 0;
  868. }
  869. static int _btsrv_hfp_hf_battery_report(uint8_t mode, uint8_t bat_val)
  870. {
  871. char at_command[32];
  872. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  873. if (!br_conn)
  874. return -ESRCH;
  875. if (mode == 0x01) {
  876. snprintf(at_command, sizeof(at_command), "AT+XAPL=0000-0000-0100,2\r");
  877. } else {
  878. snprintf(at_command, sizeof(at_command), "AT+IPHONEACCEV=1,1,%u\r", bat_val);
  879. }
  880. hostif_bt_hfp_hf_send_cmd(br_conn, at_command);
  881. br_conn = btsrv_rdm_hfp_get_second_dev();
  882. if (br_conn) {
  883. hostif_bt_hfp_hf_send_cmd(br_conn, at_command);
  884. }
  885. return 0;
  886. }
  887. static int btsrv_hfp_hf_disable_nrec(struct bt_conn *br_conn)
  888. {
  889. if (!br_conn)
  890. return -ESRCH;
  891. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+NREC=0");
  892. return 0;
  893. }
  894. static int _btsrv_hfp_hf_accept_call(void)
  895. {
  896. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  897. if (!br_conn)
  898. return -ESRCH;
  899. int state = btsrv_rdm_hfp_get_state(br_conn);
  900. if (state == BTSRV_HFP_STATE_CALL_INCOMING) {
  901. hostif_bt_hfp_hf_send_cmd(br_conn, "ATA");
  902. }
  903. return 0;
  904. }
  905. static int _btsrv_hfp_hf_reject_call(void)
  906. {
  907. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  908. if (!br_conn)
  909. return -ESRCH;
  910. int state = btsrv_rdm_hfp_get_state(br_conn);
  911. if (state == BTSRV_HFP_STATE_CALL_INCOMING) {
  912. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+CHUP");
  913. }
  914. return 0;
  915. }
  916. static int _btsrv_hfp_hf_hangup_call(void)
  917. {
  918. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  919. if (!br_conn)
  920. return -ESRCH;
  921. int state = btsrv_rdm_hfp_get_state(br_conn);
  922. if (state == BTSRV_HFP_STATE_CALL_ONGOING ||
  923. state == BTSRV_HFP_STATE_CALL_OUTCOMING ||
  924. state == BTSRV_HFP_STATE_CALL_ALERTED ||
  925. state == BTSRV_HFP_STATE_CALL_MULTIPARTY) {
  926. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+CHUP");
  927. }
  928. return 0;
  929. }
  930. static int _btsrv_hfp_hf_hangup_another_call(void)
  931. {
  932. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  933. if (!br_conn)
  934. return -ESRCH;
  935. int state = btsrv_rdm_hfp_get_state(br_conn);
  936. if (state == BTSRV_HFP_STATE_CALL_3WAYIN ||
  937. state == BTSRV_HFP_STATE_CALL_MULTIPARTY) {
  938. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+CHLD=0");
  939. return 0;
  940. }
  941. struct bt_conn *second_conn = btsrv_rdm_hfp_get_second_dev();
  942. if (!second_conn)
  943. return 0;
  944. int other_dev_state = btsrv_rdm_hfp_get_state(second_conn);
  945. if (state == BTSRV_HFP_STATE_CALL_INCOMING) {
  946. hostif_bt_hfp_hf_send_cmd(br_conn, "ATA");
  947. }
  948. switch (other_dev_state) {
  949. case BTSRV_HFP_STATE_CALL_INCOMING:
  950. case BTSRV_HFP_STATE_CALL_OUTCOMING:
  951. case BTSRV_HFP_STATE_CALL_ALERTED:
  952. case BTSRV_HFP_STATE_CALL_ONGOING:
  953. hostif_bt_hfp_hf_send_cmd(second_conn, "AT+CHUP");
  954. break;
  955. case BTSRV_HFP_STATE_CALL_3WAYIN:
  956. case BTSRV_HFP_STATE_CALL_MULTIPARTY:
  957. hostif_bt_hfp_hf_send_cmd(second_conn, "AT+CHLD=0");
  958. break;
  959. }
  960. return 0;
  961. }
  962. static int _btsrv_hfp_hf_holdcur_answer_call(void)
  963. {
  964. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  965. if (!br_conn)
  966. return -ESRCH;
  967. int state = btsrv_rdm_hfp_get_state(br_conn);
  968. if (state == BTSRV_HFP_STATE_CALL_3WAYIN ||
  969. state == BTSRV_HFP_STATE_CALL_MULTIPARTY) {
  970. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+CHLD=2");
  971. return 0;
  972. }
  973. struct bt_conn *second_conn = btsrv_rdm_hfp_get_second_dev();
  974. if (!second_conn)
  975. return 0;
  976. int other_dev_state = btsrv_rdm_hfp_get_state(second_conn);
  977. if (state == BTSRV_HFP_STATE_CALL_INCOMING) {
  978. if (other_dev_state == BTSRV_HFP_STATE_CALL_INCOMING ||
  979. other_dev_state == BTSRV_HFP_STATE_CALL_OUTCOMING ||
  980. other_dev_state == BTSRV_HFP_STATE_CALL_ALERTED) {
  981. hostif_bt_hfp_hf_send_cmd(br_conn, "ATA");
  982. return 0;
  983. }
  984. }
  985. if (state == BTSRV_HFP_STATE_CALL_OUTCOMING ||
  986. state == BTSRV_HFP_STATE_CALL_ALERTED) {
  987. if (other_dev_state == BTSRV_HFP_STATE_CALL_OUTCOMING ||
  988. other_dev_state == BTSRV_HFP_STATE_CALL_ALERTED) {
  989. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+CHUP");
  990. return 0;
  991. }
  992. }
  993. switch (state) {
  994. case BTSRV_HFP_STATE_SCO_ESTABLISHED: /* to do for siri */
  995. break;
  996. }
  997. switch (other_dev_state) {
  998. case BTSRV_HFP_STATE_CALL_INCOMING:
  999. hostif_bt_hfp_hf_send_cmd(second_conn, "ATA");
  1000. break;
  1001. case BTSRV_HFP_STATE_CALL_3WAYIN:
  1002. case BTSRV_HFP_STATE_CALL_MULTIPARTY:
  1003. hostif_bt_hfp_hf_send_cmd(second_conn, "AT+CHLD=2");
  1004. break;
  1005. }
  1006. btsrv_rdm_hfp_actived(second_conn, 1, 1);
  1007. return 0;
  1008. }
  1009. static int _btsrv_hfp_hf_hangupcur_answer_call(void)
  1010. {
  1011. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  1012. if (!br_conn)
  1013. return -ESRCH;
  1014. int state = btsrv_rdm_hfp_get_state(br_conn);
  1015. if (state == BTSRV_HFP_STATE_CALL_3WAYIN ||
  1016. state == BTSRV_HFP_STATE_CALL_MULTIPARTY) {
  1017. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+CHLD=1");
  1018. return 0;
  1019. }
  1020. struct bt_conn *second_conn = btsrv_rdm_hfp_get_second_dev();
  1021. if (!second_conn)
  1022. return 0;
  1023. int other_dev_state = btsrv_rdm_hfp_get_state(second_conn);
  1024. switch (state) {
  1025. case BTSRV_HFP_STATE_CALL_INCOMING:
  1026. case BTSRV_HFP_STATE_CALL_OUTCOMING:
  1027. case BTSRV_HFP_STATE_CALL_ALERTED:
  1028. case BTSRV_HFP_STATE_CALL_ONGOING:
  1029. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+CHUP");
  1030. break;
  1031. case BTSRV_HFP_STATE_SCO_ESTABLISHED: /* to do */
  1032. break;
  1033. }
  1034. switch (other_dev_state) {
  1035. case BTSRV_HFP_STATE_CALL_INCOMING:
  1036. hostif_bt_hfp_hf_send_cmd(second_conn, "ATA");
  1037. break;
  1038. case BTSRV_HFP_STATE_CALL_3WAYIN:
  1039. case BTSRV_HFP_STATE_CALL_MULTIPARTY:
  1040. hostif_bt_hfp_hf_send_cmd(second_conn, "AT+CHLD=1");
  1041. break;
  1042. }
  1043. btsrv_rdm_hfp_actived(second_conn, 1, 1);
  1044. return 0;
  1045. }
  1046. static int _btsrv_hfp_hf_voice_recognition_start(void)
  1047. {
  1048. uint8_t srir_state = BTSRV_HFP_SIRI_CHANGE_START;
  1049. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  1050. int state;
  1051. if (!br_conn) {
  1052. return -ESRCH;
  1053. }
  1054. state = btsrv_rdm_hfp_get_state(br_conn);
  1055. if (state >= BTSRV_HFP_STATE_CALL_INCOMING &&
  1056. state <= BTSRV_HFP_STATE_SCO_ESTABLISHED) {
  1057. return -EBUSY;
  1058. }
  1059. hfp_context.hfp_user_callback(BTSRV_HFP_SIRI_STATE_CHANGE, (uint8_t *)&srir_state, sizeof(srir_state));
  1060. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+BVRA=1");
  1061. return 0;
  1062. }
  1063. static int _btsrv_hfp_hf_voice_recognition_stop(void)
  1064. {
  1065. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  1066. if (!br_conn)
  1067. return -ESRCH;
  1068. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+BVRA=0");
  1069. return 0;
  1070. }
  1071. static int _btsrv_hfp_get_time()
  1072. {
  1073. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  1074. if (!br_conn)
  1075. return -ESRCH;
  1076. hostif_bt_hfp_hf_send_cmd(br_conn, "AT+CCLK?");
  1077. return 0;
  1078. }
  1079. static int _btsrv_hfp_hf_send_at_command(uint8_t *command,uint8_t active_call)
  1080. {
  1081. if(active_call){
  1082. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  1083. if (!br_conn)
  1084. return -ESRCH;
  1085. hostif_bt_hfp_hf_send_cmd(br_conn, command);
  1086. }else{
  1087. struct bt_conn *second_conn = btsrv_rdm_hfp_get_second_dev();
  1088. if (!second_conn)
  1089. return -ESRCH;
  1090. hostif_bt_hfp_hf_send_cmd(second_conn, command);
  1091. }
  1092. return 0;
  1093. }
  1094. int btsrv_hfp_get_call_state(uint8_t active_call,uint8_t *call_state)
  1095. {
  1096. uint8_t active_state,held_call,incoming_call,outgoing_call;
  1097. if(active_call){
  1098. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  1099. if (!br_conn)
  1100. return BTSRV_HFP_STATE_INIT;
  1101. if(!btsrv_rdm_hfp_get_call_state(br_conn,
  1102. &active_state,
  1103. &held_call,
  1104. &incoming_call,
  1105. &outgoing_call)){
  1106. if(call_state){
  1107. *call_state = ((active_state << 4) | (held_call << 2)
  1108. | (incoming_call << 1) | outgoing_call);
  1109. }
  1110. }
  1111. return btsrv_rdm_hfp_get_state(br_conn);
  1112. }else{
  1113. struct bt_conn *second_conn = btsrv_rdm_hfp_get_second_dev();
  1114. if (!second_conn)
  1115. return BTSRV_HFP_STATE_INIT;
  1116. if(!btsrv_rdm_hfp_get_call_state(second_conn,
  1117. &active_state,
  1118. &held_call,
  1119. &incoming_call,
  1120. &outgoing_call)){
  1121. if(call_state){
  1122. *call_state = ((active_state << 4) | (held_call << 2)
  1123. | (incoming_call << 1) | outgoing_call);
  1124. }
  1125. }
  1126. return btsrv_rdm_hfp_get_state(second_conn);
  1127. }
  1128. }
  1129. static void _btsrv_hfp_service_notify(struct bt_conn *conn, uint8_t service)
  1130. {
  1131. btsrv_rdm_set_hfp_service(conn, service);
  1132. }
  1133. static int _btsrv_hfp_hf_battery_indicator(struct bt_conn *conn, char *data)
  1134. {
  1135. if (conn == btsrv_rdm_hfp_get_actived()) {
  1136. hfp_context.hfp_user_callback(BTSRV_HFP_BATTERY_HPREC, NULL, 0);
  1137. }
  1138. return 0;
  1139. }
  1140. static int _btsrv_hfp_hf_battery_hprec_report(uint8_t bat_val)
  1141. {
  1142. char at_command[32];
  1143. struct bt_conn *br_conn = btsrv_rdm_hfp_get_actived();
  1144. if (!br_conn)
  1145. return -ESRCH;
  1146. if (bat_val > 100)
  1147. bat_val = 100;
  1148. snprintf(at_command, sizeof(at_command), "AT+BIEV=2,%u\r", bat_val);
  1149. hostif_bt_hfp_hf_send_cmd(br_conn, at_command);
  1150. return 0;
  1151. }
  1152. int btsrv_hfp_process(struct app_msg *msg)
  1153. {
  1154. struct bt_conn *param;
  1155. if (_btsrv_get_msg_param_type(msg) != MSG_BTSRV_HFP) {
  1156. return -ENOTSUP;
  1157. }
  1158. switch (_btsrv_get_msg_param_cmd(msg)) {
  1159. case MSG_BTSRV_HFP_START:
  1160. SYS_LOG_INF("BHF start");
  1161. btsrv_hfp_init(msg->ptr);
  1162. break;
  1163. case MSG_BTSRV_HFP_STOP:
  1164. SYS_LOG_INF("BHF stop");
  1165. btsrv_hfp_deinit();
  1166. break;
  1167. case MSG_BTSRV_HFP_CONNECTED:
  1168. _btsrv_hfp_connected(msg->ptr);
  1169. break;
  1170. case MSG_BTSRV_HFP_DISCONNECTED:
  1171. _btsrv_hfp_disconnected(msg->ptr);
  1172. btsrv_event_notify(MSG_BTSRV_CONNECT, _btsrv_get_msg_param_cmd(msg), msg->ptr);
  1173. break;
  1174. case MSG_BTSRV_HFP_SET_STATE:
  1175. SYS_LOG_INF("BHF set state");
  1176. btsrv_hfp_set_status(msg->ptr, msg->reserve);
  1177. break;
  1178. case MSG_BTSRV_HFP_HF_DIAL_NUM:
  1179. SYS_LOG_INF("BHF dial num");
  1180. _btsrv_hfp_hf_dial_number(msg->ptr);
  1181. break;
  1182. case MSG_BTSRV_HFP_HF_DIAL_LAST_NUM:
  1183. SYS_LOG_INF("BHF last num");
  1184. _btsrv_hfp_hf_dial_last_number();
  1185. break;
  1186. case MSG_BTSRV_HFP_HF_DIAL_MEMORY:
  1187. SYS_LOG_INF("BHF dial mem");
  1188. _btsrv_hfp_hf_dial_memory(msg->value);
  1189. break;
  1190. case MSG_BTSRV_HFP_HF_VOLUME_CONTROL:
  1191. SYS_LOG_INF("BHF vol ctrl");
  1192. _btsrv_hfp_hf_volume_control((uint8_t)(msg->value >> 16), (uint8_t)msg->value);
  1193. break;
  1194. case MSG_BTSRV_HFP_HF_BATTERY_REPORT:
  1195. SYS_LOG_INF("BHF bat rep");
  1196. _btsrv_hfp_hf_battery_report((uint8_t)(msg->value >> 16), (uint8_t)msg->value);
  1197. break;
  1198. case MSG_BTSRV_HFP_HF_ACCEPT_CALL:
  1199. SYS_LOG_INF("BHF accep call");
  1200. _btsrv_hfp_hf_accept_call();
  1201. break;
  1202. case MSG_BTSRV_HFP_HF_REJECT_CALL:
  1203. SYS_LOG_INF("BHF reject call");
  1204. _btsrv_hfp_hf_reject_call();
  1205. break;
  1206. case MSG_BTSRV_HFP_HF_HANGUP_CALL:
  1207. SYS_LOG_INF("BHF hangup call");
  1208. _btsrv_hfp_hf_hangup_call();
  1209. break;
  1210. case MSG_BTSRV_HFP_HF_HANGUP_ANOTHER_CALL:
  1211. SYS_LOG_INF("BHF hangup another call");
  1212. _btsrv_hfp_hf_hangup_another_call();
  1213. break;
  1214. case MSG_BTSRV_HFP_HF_HOLDCUR_ANSWER_CALL:
  1215. SYS_LOG_INF("BHF holdcur answer call");
  1216. _btsrv_hfp_hf_holdcur_answer_call();
  1217. break;
  1218. case MSG_BTSRV_HFP_HF_HANGUPCUR_ANSWER_CALL:
  1219. SYS_LOG_INF("BHF hangupcur answer call");
  1220. _btsrv_hfp_hf_hangupcur_answer_call();
  1221. break;
  1222. case MSG_BTSRV_HFP_HF_VOICE_RECOGNITION_START:
  1223. SYS_LOG_INF("BHF voice rec start");
  1224. _btsrv_hfp_hf_voice_recognition_start();
  1225. break;
  1226. case MSG_BTSRV_HFP_HF_VOICE_RECOGNITION_STOP:
  1227. SYS_LOG_INF("BHF voice rec stop");
  1228. _btsrv_hfp_hf_voice_recognition_stop();
  1229. break;
  1230. case MSG_BTSRV_HFP_HF_VOICE_SEND_AT_COMMAND:
  1231. SYS_LOG_INF("BHF send at cmd");
  1232. _btsrv_hfp_hf_send_at_command(msg->ptr, _btsrv_get_msg_param_reserve(msg));
  1233. break;
  1234. case MSG_BTSRV_HFP_SWITCH_SOUND_SOURCE:
  1235. SYS_LOG_INF("BHF switch sound source");
  1236. _btsrv_hfp_hf_switch_sound_source();
  1237. break;
  1238. case MSG_BTSRV_HFP_PHONE_NUM:
  1239. SYS_LOG_INF("BHF phone num");
  1240. param = (struct bt_conn *) *(int *)(msg->ptr);
  1241. _btsrv_hfp_phone_num(param, (char *)((uint32_t)msg->ptr+4));
  1242. break;
  1243. case MSG_BTSRV_HFP_PHONE_NAME:
  1244. SYS_LOG_INF("BHF phone name");
  1245. param = (struct bt_conn *) *(int *)(msg->ptr);
  1246. _btsrv_hfp_phone_name(param, (char *)((uint32_t)msg->ptr+4));
  1247. break;
  1248. case MSG_BTSRV_HFP_HF_CCWA_PHONE_NUM:
  1249. SYS_LOG_INF("BHF ccwa num");
  1250. param = (struct bt_conn *) *(int *)(msg->ptr);
  1251. _btsrv_hfp_hf_ccwa_phone_num(param, (char *)((uint32_t)msg->ptr+4));
  1252. break;
  1253. case MSG_BTSRV_HFP_CODEC_INFO:
  1254. SYS_LOG_INF("BHF codec info");
  1255. _btsrv_hfp_codec_info(msg->ptr, msg->reserve);
  1256. break;
  1257. case MSG_BTSRV_HFP_VOLUME_CHANGE:
  1258. SYS_LOG_INF("BHF vol change");
  1259. _btsrv_hfp_volume_change(msg->ptr, msg->reserve);
  1260. break;
  1261. case MSG_BTSRV_HFP_ACTIVED_DEV_CHANGED:
  1262. SYS_LOG_INF("BHF active dev change");
  1263. _btsrv_hfp_active_dev_change(msg->ptr);
  1264. break;
  1265. case MSG_BTSRV_HFP_SIRI_STATE:
  1266. SYS_LOG_INF("BHF siri state change");
  1267. _btsrv_hfp_siri_state_change(msg->ptr, msg->reserve);
  1268. break;
  1269. case MSG_BTSRV_HFP_TIME_UPDATE:
  1270. SYS_LOG_INF("BHF time update");
  1271. param = (struct bt_conn *) *(int *)(msg->ptr);
  1272. _btsrv_hfp_time_update(param, (char *)(msg->ptr)+4);
  1273. break;
  1274. case MSG_BTSRV_HFP_MANUFACTURE_INFO:
  1275. SYS_LOG_INF("BHF man info");
  1276. param = (struct bt_conn *) *(int *)(msg->ptr);
  1277. _btsrv_hfp_cgmi_update(param, (char *)(msg->ptr)+4);
  1278. case MSG_BTSRV_HFP_GET_TIME:
  1279. SYS_LOG_INF("BHF get time");
  1280. _btsrv_hfp_get_time();
  1281. break;
  1282. case MSG_BTSRV_HFP_CLCC_INFO:
  1283. _btsrv_hfp_hf_clcc_info((struct btsrv_hfp_clcc_info *)(msg->ptr));
  1284. break;
  1285. case MSG_BTSRV_HFP_SERVICE:
  1286. _btsrv_hfp_service_notify(_btsrv_get_msg_param_ptr(msg), _btsrv_get_msg_param_reserve(msg));
  1287. break;
  1288. case MSG_BTSRV_HFP_HPREC_BATTERY:
  1289. _btsrv_hfp_hf_battery_indicator(_btsrv_get_msg_param_ptr(msg), NULL);
  1290. break;
  1291. case MSG_BTSRV_HFP_HF_BATTERY_HPREC_REPORT:
  1292. SYS_LOG_INF("BHF high precision bat rep");
  1293. _btsrv_hfp_hf_battery_hprec_report((uint8_t)msg->value);
  1294. break;
  1295. }
  1296. return 0;
  1297. }