hfhs.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "include.h"
  2. #include "api.h"
  3. #if HLW_UI
  4. #include "hlw_func.h"
  5. #endif
  6. char redial_buf[2][32];
  7. void bt_redial_init(void)
  8. {
  9. memset(redial_buf, 0, 64);
  10. }
  11. void bt_reset_redial_number(uint8_t index)
  12. {
  13. memset(redial_buf[index], 0, 32);
  14. }
  15. void bt_update_redial_number(uint8_t index, char *buf, u32 len)
  16. {
  17. if (len < 32) {
  18. memset(redial_buf[index], 0, 32);
  19. memcpy(redial_buf[index], buf, len);
  20. }
  21. }
  22. const char *bt_get_last_call_number(uint8_t index)
  23. {
  24. if (redial_buf[index][0]) {
  25. return (const char *)redial_buf[index];
  26. } else {
  27. return NULL;
  28. }
  29. }
  30. const char *hfp_get_last_call_number(uint8_t index) {
  31. return bt_get_last_call_number(index);
  32. }
  33. #if AB_MATE_CALL_EN
  34. void hfp_hf_emit_curr_calls(u8 idx, u8 type, const char * number, u32 len)
  35. {
  36. bt_update_redial_number(idx, (char *)number, len);
  37. }
  38. AT(.text.func.btring)
  39. bool hfp_is_list_curr_calls(void) {
  40. return true;
  41. }
  42. #endif
  43. uint hfp_get_mic_gain(void)
  44. {
  45. return 9;
  46. }
  47. uint hfp_get_spk_gain(void)
  48. {
  49. return (sys_cb.hfp_vol>15)? 15 : sys_cb.hfp_vol;
  50. }
  51. uint hfp_get_bat_level(void)
  52. {
  53. #if VBAT_DETECT_EN
  54. #if HLW_UI
  55. return hlw_cb.curr_bat_level;
  56. #else
  57. //计算方法:level = (实测电压 - 关机电压) / ((满电电压 - 关机电压) / 10)
  58. u16 bat_off = LPWR_OFF_VBAT * 100 + 2700;
  59. if (bat_off > sys_cb.vbat) {
  60. return 0;
  61. }
  62. uint bat_level = (sys_cb.vbat - bat_off) / ((4200 - bat_off) / 10);
  63. if (bat_level) {
  64. bat_level--;
  65. }
  66. // printf("bat level: %d %d\n", sys_cb.vbat, bat_level);
  67. return bat_level;
  68. #endif
  69. #else
  70. return 9;
  71. #endif
  72. }
  73. uint hfp_get_bat_level_ex(void)
  74. {
  75. uint level_bat;
  76. level_bat = hfp_get_bat_level();
  77. return (level_bat+1) * 10;
  78. }
  79. /************************使用示例************************/
  80. ////按键发起回拨号码
  81. //bt_call_redial_number();
  82. //delay_5ms(10); //延迟一下,等它发送完毕
  83. //
  84. ////此函数返回需要回拨的号码,例如“10086”
  85. //char * hfp_get_outgoing_number(void) {
  86. // return "10086";
  87. //}
  88. ////发送自定义ATCMD
  89. //bt_hfp_send_at_cmd();
  90. //delay_5ms(10); //延迟一下,等它发送完毕
  91. //
  92. // //此函数返回需要发送的ATCMD
  93. //char * hfp_get_at_cmd(void) {
  94. // return "AT+VTS=1"; //例如,通话过程发起号码键"1"
  95. // return "ATD10086;"; //也可以,发起回拨号码"10086"
  96. // return "AT+CCLK?\r";//获取IOS手机时间(安卓暂不支持),获取回调函数hfp_get_time
  97. //}
  98. //获取IOS手机时间(安卓暂不支持),需要先发送"AT+CCLK?\r"AT命令
  99. //void hfp_notice_network_time(u8 *buf, u16 len)
  100. //{
  101. // char cache[12];
  102. // memcpy(cache, buf, 12);
  103. // printf("%s\n", cache);
  104. //}
  105. //---------------------------------AT_CMD---------------------------------
  106. char *at_cmd_pt; //AT命令指针
  107. //蓝牙库获取AT命令
  108. char * hfp_get_at_cmd(void) {
  109. return at_cmd_pt;
  110. }
  111. void bt_hfp_send_at_cmd_with_str(char *cmd_str)
  112. {
  113. at_cmd_pt = cmd_str;
  114. bt_hfp_send_at_cmd();
  115. delay_5ms(10); //延迟一下,等它发送完毕
  116. }
  117. //------------------------------------------------------------------------
  118. ///AT指令拨号
  119. #if AB_MATE_CUSTOM_CMD_CALL_EN
  120. char hfp_cmd_call[16] = "ATD10086;";
  121. void hfp_at_dial(char *number)
  122. {
  123. if (strlen(number) > 11) {
  124. number[11] = '\0';
  125. }
  126. sprintf(hfp_cmd_call, "ATD%s;", number);
  127. bt_hfp_send_at_cmd_with_str(hfp_cmd_call);
  128. }
  129. #endif // AB_MATE_CUSTOM_CMD_CALL_EN
  130. ///AT指令获取IOS手机时间
  131. #if BT_HFP_TIME_EN
  132. char hfp_cmd_cclk[] = "AT+CCLK?\r";
  133. u32 hfp_start_tick;
  134. u8 hfp_time_data[7] = {0};
  135. void hfp_at_kick(void)
  136. {
  137. memset(hfp_time_data, 0, 7);
  138. hfp_start_tick = tick_get();
  139. printf("hfp_at_kick\n");
  140. bt_hfp_send_at_cmd_with_str(hfp_cmd_cclk);
  141. }
  142. bool hfp_at_time_get(u8 *buf, u8 len)
  143. {
  144. if (hfp_time_data[0] == 0) {
  145. printf("hfp time empty!\n");
  146. return false;
  147. }
  148. if (tick_check_expire(hfp_start_tick, 30000)) {
  149. printf("hfp time outdated!\n"); //超过30s,数据过时
  150. return false;
  151. }
  152. memcpy(buf, hfp_time_data, min(len, 7));
  153. return true;
  154. }
  155. int nibble_for_char(char c);
  156. void hfp_get_time(char *ptr)
  157. {
  158. my_printf("-->(hfp)set time\n");
  159. u16 year = 2000 + nibble_for_char(ptr[0])*10 + nibble_for_char(ptr[1]);
  160. u8 month = nibble_for_char(ptr[2])*10 + nibble_for_char(ptr[3]);
  161. u8 day = nibble_for_char(ptr[4])*10 + nibble_for_char(ptr[5]);
  162. u8 hour = nibble_for_char(ptr[6])*10 + nibble_for_char(ptr[7]);
  163. u8 min = nibble_for_char(ptr[8])*10 + nibble_for_char(ptr[9]);
  164. u8 sec = nibble_for_char(ptr[10])*10 + nibble_for_char(ptr[11]);
  165. if((year >= 2000) && (year <= 3000) && (month <= 12) && (day <= 31) && (hour <= 24) && (min <= 60) && sec <= 60){
  166. printf("IOS get time:\ndate:%04d.%02d.%02d time:%02d:%02d:%02d\n", year, month, day, hour, min, sec);
  167. memcpy(&hfp_time_data[0], &year, 2);
  168. hfp_time_data[2] = month;
  169. hfp_time_data[3] = day;
  170. hfp_time_data[4] = hour;
  171. hfp_time_data[5] = min;
  172. hfp_time_data[6] = sec;
  173. msg_enqueue(EVT_HFP_TIME_DONE);
  174. } else {
  175. // printf("time error:04d.%02d.%02d-%02d:%02d:%02d\n", year, month, day, hour, min, sec);
  176. }
  177. }
  178. void hfp_notice_network_time(u8 *buf, u16 len)
  179. {
  180. // char cache[16] = "";
  181. // memcpy(cache, buf, min(len, 15));
  182. // printf("hfp_notice_network_time:%s\n", cache);
  183. if (bt_is_ios_device()) {
  184. hfp_get_time((char *)buf);
  185. }
  186. }
  187. #endif //BT_HFP_TIME_EN