123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869 |
- #include "include.h"
- #if CHARGE_BOX_EN
- #define TRACE_EN 0
- #if TRACE_EN
- #define TRACE(...) printf(__VA_ARGS__)
- #else
- #define TRACE(...)
- #endif
- int btstack_get_link_key(uint8_t *bd_addr, uint8_t *link_key, uint8_t *type, bool ext);
- ch_box_cb_t chbox_cb;
- inbox_cb_t inbox_cb;
- #if (CHARGE_BOX_TYPE == CBOX_SSW)
- vhouse_cb_t vhouse_cb;
- #endif
- ///设置leakage状态, 返回值 0:disable, 1: enable
- AT(.com_text.charge_box)
- void charge_box_leakage_set(u8 sta, u8 val)
- {
- u32 level = (val) ? val : xcfg_cb.ch_leakage_sel;
- chbox_cb.leakage_sta = sta & 0xfc;
- charge_set_leakage(sta, level);
- }
- ///使能出仓唤醒功能
- AT(.text.charge_box)
- void charge_box_inbox_wakeup_enable(void)
- {
- RTCCON3 |= BIT(12); //RTCCON3[12], INBOX Wakeup enable
- if ((xcfg_cb.ch_box_type_sel == 2) || (xcfg_cb.ch_box_type_sel == 0)) { //有维持电压的充电仓关闭leakage漏电
- charge_box_leakage_set(0, 0); //leakage disable
- }
- }
- ///检测INBOX状态 返回值 0: 正在检测, 1:检测完成,INBOX不在线, 2:检测完成,INBOX在线
- AT(.com_text.charge_box)
- u8 charge_box_inbox_check(void)
- {
- inbox_cb_t *s = &inbox_cb;
- if (CHARGE_INBOX()) {
- #if CHARGE_BOX_OUTBOX_FLIT
- s->on_cnt_filt = 0;
- #endif
- s->off_cnt = 0;
- if (s->on_cnt < s->on_delay) { //等待VUSB放电,确认INBOX是否在线
- s->on_cnt++;
- return 0;
- }
- if (s->on_cnt == s->on_delay) {
- s->on_cnt = s->on_delay + 5;
- return 2; //inbox在线
- }
- return 0x82;
- } else {
- #if CHARGE_BOX_OUTBOX_FLIT
- s->on_cnt_filt ++;
- if (s->on_cnt_filt >= 8) {
- s->on_cnt_filt = 0;
- s->on_cnt = 0;
- }
- #else
- s->on_cnt = 0;
- #endif
- if (s->off_cnt < s->off_delay) {
- s->off_cnt++;
- if ((s->off_cnt == 4) && (chbox_cb.leakage_sta & BIT(7))) {
- charge_box_leakage_set(0, 0);
- }
- return 0;
- }
- if (s->off_cnt == s->off_delay) {
- s->off_cnt = s->off_delay + 5;
- return 1; //inbox不在线
- }
- return 0x81;
- }
- }
- ///用于兼容短暂掉0V充电仓(充满后 5V -> 0V -> 2.xV)
- AT(.text.bsp.charge)
- int charge_box_outbox_stable_check(void)
- {
- int i;
- u8 inbox_sta = 0;
- if (xcfg_cb.ch_box_type_sel) {
- return 1; //非此类型仓, 直接返回出仓开机
- }
- charge_box_leakage_set(0, 0); //disable leakage
- delay_5ms(60); //delay 300ms
- charge_box_inbox_chk_init(12+(u16)xcfg_cb.chbox_out_delay*10, 20);
- for (i = 0; i < 200; i++) {
- delay_5ms(2);
- WDT_CLR();
- inbox_sta = charge_box_inbox_check(); //检测INBOX状态判断是否为充满状态
- if (inbox_sta) {
- break;
- }
- }
- if (inbox_sta == 2) { //inbox stable online
- if (CHARGE_DC_IN()) {
- charge_box_leakage_set(1, 0); //enable leakage
- return 0; //5V online, 继续充电
- }
- charge_box_inbox_wakeup_enable(); //INBOX Wakeup enable
- bsp_saradc_exit();
- sfunc_pwrdown(1); //开VUSB复位,且并机
- }
- charge_box_leakage_set(1, 0); //enable leakage
- return 1; //出仓开机
- }
- ///兼容某些维持电压的仓: 耳机入仓, 电池仓的电压不会自动升到5V, 需要手动按仓的按键。
- AT(.com_text.charge_box)
- void charge_box_inbox_process(void)
- {
- static u32 inbox_tick = 0;
- u8 sta;
- if ((chbox_cb.inbox_rtt_check) && (!CHARGE_DC_IN())) {
- if (!tick_check_expire(inbox_tick, 10)) {
- return;
- }
- inbox_tick = tick_get();
- sta = charge_box_inbox_check();
- #if (CHARGE_BOX_TYPE == CBOX_SSW)
- charge_box_inbox_sta(sta);
- #endif
- if ((2 == sta) && (xcfg_cb.chg_inbox_pwrdwn_en)) {
- msg_enqueue(EVT_CHARGE_INBOX);
- }
- }
- }
- ///5ms调用一次
- AT(.text.charge_box)
- u8 charge_box_charge_on_process(void)
- {
- u8 inbox_sta, chbox_sta = 0;
- #if (CHARGE_BOX_TYPE == CBOX_SSW)
- chbox_sta = charge_box_ssw_process(1);
- #endif
- if ((charge_box_sta() == 2) || (chbox_sta == 2)) { //是否充满
- charge_exit();
- unlock_code_charge();
- charge_box_inbox_wakeup_enable(); //INBOX Wakeup enable
- bsp_saradc_exit();
- sfunc_pwrdown(0);
- }
- if (!CHARGE_DC_IN()) { //DC IN online?
- // if ((chbox_cb.dc_in == 3) && CHARGE_INBOX()) {
- // charge_box_leakage_set(0x81, 6); //用大电流leakage加速VUSB掉电, 在检测到低于INBOX电压后关闭leakage(防止VUSB电容导致掉电慢)
- // }
- // if (chbox_cb.dc_in < 10) {
- // chbox_cb.dc_in++;
- // }
- charge_box_leakage_set(0, 0);
- inbox_sta = charge_box_inbox_check() & 0x3; //检查inbox online状态
- #if (CHARGE_BOX_TYPE == CBOX_SSW)
- if (chbox_sta) { //智能充电仓已开盖, 需要退出充电流程
- charge_box_leakage_set(1, 0);
- if (inbox_sta == 1) { //dc_in = 0, 且inbox = 0
- sys_cb.outbox_pwron_flag = 1;
- }
- return 2;
- }
- #endif
- if (inbox_sta == 1) { //dc_in = 0, 且inbox = 0
- charge_box_leakage_set(1, 0);
- if ((chbox_cb.out2pwr_en) || (chbox_sta)) { //拿起开机
- sys_cb.outbox_pwron_flag = 1;
- return 2;
- }
- return 1;
- } else if (inbox_sta == 2) { //dc_in = 0, inbox = 1, 需要关机
- #if UART0_PRINTF_SEL != PRINTF_VUSB //vusb打印不关机
- charge_exit();
- unlock_code_charge();
- charge_box_inbox_wakeup_enable(); //INBOX Wakeup enable
- bsp_saradc_exit();
- sfunc_pwrdown(1);
- #endif
- }
- } else {
- chbox_cb.dc_in = 1;
- chbox_cb.out2pwr_en = xcfg_cb.ch_out_auto_pwron_en;
- inbox_cb.off_cnt = 0;
- inbox_cb.on_cnt = 0;
- charge_box_leakage_set(1, 0);
- }
- return 0;
- }
- AT(.text.charge_box.process)
- void charge_box_process(void)
- {
- charge_box_inbox_process();
- #if (CHARGE_BOX_TYPE == CBOX_SSW)
- charge_box_ssw_process(0);
- #endif
- }
- ///耳机在充电仓充满自动关机,拿起自动开机处理。
- AT(.text.bsp.charge)
- u8 charge_box_sta(void)
- {
- if ((sys_cb.charge_sta == 2) && (!sys_cb.charge_bled_flag)) {
- //充满且蓝灯灭时进入关机
- if (xcfg_cb.ch_full_auto_pwrdwn_en) {
- //printf("charge full auto pwrdwn\n");
- charge_box_inbox_wakeup_enable();
- return 2; //充满关机
- }
- }
- return 0;
- }
- AT(.text.charge_box)
- void charge_box_inbox_chk_init(u16 off_delay, u16 on_delay)
- {
- inbox_cb.off_cnt = 0;
- inbox_cb.on_cnt = 0;
- inbox_cb.off_delay = off_delay;
- inbox_cb.on_delay = on_delay;
- }
- AT(.text.charge_box)
- void charge_box_enter(u8 out_auto_pwron)
- {
- memset(&chbox_cb, 0, sizeof(chbox_cb));
- chbox_cb.out2pwr_en = out_auto_pwron;
- charge_box_inbox_chk_init(20, 120); //inbox online检测长点,等待VUSB电容放电
- if ((chbox_cb.out2pwr_en) && (!xcfg_cb.ch_box_type_sel)) { //短暂掉0V的仓
- inbox_cb.off_delay = 100+(u16)xcfg_cb.chbox_out_delay*20; //inbox offline check 500ms + n*100ms
- }
- }
- void charge_box_reinit(void)
- {
- sys_cb.inbox_wken_flag = 0;
- charge_box_inbox_chk_init(10, 20);
- chbox_cb.leakage_sta = 0;
- if ((xcfg_cb.ch_box_type_sel == 2) || (xcfg_cb.ch_box_type_sel == 0)) {
- chbox_cb.inbox_rtt_check = 1;
- }
- }
- void charge_box_init(void)
- {
- #if (CHARGE_BOX_TYPE == CBOX_SSW)
- charge_box_ssw_init();
- #endif
- }
- #if (CHARGE_BOX_TYPE == CBOX_SSW)
- AT(.com_text.charge_box)
- void charge_box_inbox_sta(u8 sta)
- {
- if (sta) {
- bool new_sta = vhouse_cb.inbox_sta;
- if (sta & BIT(1)) {
- new_sta = true;
- } else if (sta & BIT(0)) {
- new_sta = false;
- }
- if(new_sta != vhouse_cb.inbox_sta) {
- vhouse_cb.inbox_sta = new_sta;
- vhouse_cb.update_ear_flag = true;
- }
- }
- }
- AT(.text.charge_box)
- void charge_box_update_sta(void)
- {
- vhouse_cb.update_ear_flag = true;
- }
- AT(.text.charge_box)
- static void charge_box_update_bat_adv(void)
- {
- if(vhouse_cb.update_ear_flag) {
- vhouse_cb.update_ear_flag = false;
- bool old_sta = (bool)(sys_cb.loc_bat & BIT(7));
- bool new_sta = vhouse_cb.inbox_sta;
- if(old_sta != new_sta) {
- if(new_sta) {
- sys_cb.loc_bat |= BIT(7);
- } else {
- sys_cb.loc_bat &= ~BIT(7);
- }
- }
- }
- }
- AT(.text.charge_box)
- static void charge_box_open_windows(void)
- {
- vhouse_cb.open_win_flag = 0;
- vhouse_cb.status = 1; //开窗,停止充电
- }
- u8 charge_box_popup_is_enable(void)
- {
- return sys_cb.popup_en;
- }
- AT(.text.charge_box)
- static void charge_box_popup_ctrl(vh_packet_t *packet)
- {
- u8 channel = packet->buf[0];
- u8 data = packet->buf[1];
- if (!bt_tws_channel_check(channel)) {
- return;
- }
- if ((data == 1) || (data == 2)) { //开或关广播功能
- param_vuart_popup_flag_write(data);
- sys_cb.popup_en = data - 1;
- ble_adv0_set_ctrl(0);
- } else { //翻转广播功能
- if (sys_cb.popup_en) {
- sys_cb.popup_en = 0;
- param_vuart_popup_flag_write(1); //disable
- ble_adv0_set_ctrl(0);
- } else {
- sys_cb.popup_en = 1;
- param_vuart_popup_flag_write(2); //enable
- ble_adv0_set_ctrl(2);
- }
- }
- }
- bool charge_box_bat_is_ready(void)
- {
- return vhouse_cb.rem_bat_ok;
- }
- u8 charge_box_get_charge_box_bat_level(void)
- {
- if(bt_tws_is_connected()){
- if((sys_cb.loc_bat & BIT(7)) == 0 && (sys_cb.rem_bat & BIT(7)) != 0) {
- return sys_cb.rem_house_bat & 0x7f;
- }
- }
- return sys_cb.loc_house_bat & 0x7f;
- }
- #if (CHARGE_BOX_INTF_SEL == INTF_UART1) || (CHARGE_BOX_INTF_SEL == INTF_UART2)
- //uart中断解析并匹配命令包
- AT(.com_text.charge_box)
- void charge_box_packet_recv(void)
- {
- #if QTEST_EN
- if(qtest_get_mode()){
- return ;
- }
- #endif
- vh_packet_t *p = &vh_packet;
- vhouse_cb.ticks = tick_get();
- if (p->cmd == VHOUSE_CMD_OPEN_WINDOW) {
- vhouse_cb.win_ticks = vhouse_cb.ticks;
- vhouse_cb.open_win_flag = 1;
- }
- if((!vhouse_cb.ack_dat_confirm)||(vhouse_cb.ack_dat == p->buf[0])){
- vhouse_cb.ack_dat = p->buf[0];
- if((p->cmd != VHOUSE_CMD_PAIR)&&(p->cmd != VHOUSE_CMD_GET_TWS_BTADDR)){
- vhouse_cb.need_ack = 1;
- }
- }
- }
- #elif (CHARGE_BOX_INTF_SEL == INTF_HUART)
- AT(.com_rodata.charge_box_tbl)
- const char charge_box_header[]={0x55,0xAA,0xFF};
- //uart中断解析并匹配命令包
- AT(.com_text.charge_box)
- void charge_box_packet_huart_recv(u8 *buf)
- {
- if(qtest_get_mode()) {
- return ;
- }
- if(!memcmp(buf,charge_box_header,3)) {
- if(buf[4] < VH_DATA_LEN){
- vh_packet_t *packet = &vhouse_cb.packet;
- vhouse_cb.ticks = tick_get();
- if (buf[3] == VHOUSE_CMD_OPEN_WINDOW) {
- vhouse_cb.win_ticks = vhouse_cb.ticks;
- vhouse_cb.open_win_flag = 1;
- }
- if((!vhouse_cb.ack_dat_confirm) || (vhouse_cb.ack_dat == buf[5])){
- vhouse_cb.ack_dat = buf[5];
- if((buf[3] != VHOUSE_CMD_PAIR) && (buf[3] != VHOUSE_CMD_GET_TWS_BTADDR)) {
- vhouse_cb.need_ack = 1;
- }
- }
- memcpy(packet, buf, buf[4]+5);
- packet->checksum = buf[packet->length+5];
- vhouse_cb.rx_flag=1;
- }
- }
- }
- #endif
- //接收心跳包后需要5~10ms回应1字节
- AT(.com_text.timer)
- void charge_box_heart_beat_ack(void)
- {
- if (vhouse_cb.need_ack == 1) {
- if (tick_check_expire(vhouse_cb.ticks, 6)) {
- #if (CHARGE_BOX_INTF_SEL == INTF_HUART)
- huart_tx((u8*)&vhouse_cb.ack_dat,1);
- #elif (CHARGE_BOX_INTF_SEL == INTF_UART1)
- UART1DATA = vhouse_cb.ack_dat;
- #elif (CHARGE_BOX_INTF_SEL == INTF_UART2)
- UART2DATA = vhouse_cb.ack_dat;
- #endif
- vhouse_cb.need_ack = 2;
- }
- }
- }
- AT(.text.charge_box)
- static void charge_box_send_data(u8 *buf,u8 len)
- {
- //超过5ms没有接收到VBUS程序才发送数据
- while (!tick_check_expire(vhouse_cb.ticks, 5)) {
- WDT_CLR();
- }
- if(vhouse_cb.need_ack == 2) {
- while (!(UART1CON & BIT(8)));
- }
- vhouse_cb.need_ack = 0;
- if(tick_check_expire(vhouse_cb.ticks, 80)){
- return;
- }
- #if (CHARGE_BOX_INTF_SEL == INTF_HUART)
- huart_tx(buf,len);
- #elif (CHARGE_BOX_INTF_SEL == INTF_UART1)
- for(u8 i = 0; i < len; i++){
- uart1_putchar(buf[i]);
- }
- #elif (CHARGE_BOX_INTF_SEL == INTF_UART2)
- for(u8 i = 0; i < len; i++){
- uart2_putchar(buf[i]);
- }
- #endif
- }
- AT(.text.charge_box)
- static void charge_box_cmd_ack(vh_packet_t *packet)
- {
- u8 *buf = (u8*)packet;
- u8 length = 5 + packet->length;
- buf[length] = crc8_maxim(buf, length);
- charge_box_send_data(buf, length + 1);
- }
- AT(.text.charge_box)
- static void charge_box_send_msg_suceess(void)
- {
- vh_packet_t *packet = &vhouse_cb.packet;
- packet->header = 0xAA55;
- packet->distinguish = VHOUSE_DISTINGUISH;
- packet->cmd = VHOUSE_CMD_SUCCESS;
- packet->length = 0;
- charge_box_cmd_ack(packet);
- }
- AT(.text.charge_box)
- static void charge_box_update_bat_value(vh_packet_t *packet)
- {
- bool update_flag = false;
- if ((packet->cmd == VHOUSE_CMD_OPEN_WINDOW) || (packet->cmd == VHOUSE_CMD_GET_VBAT)||packet->cmd == VHOUSE_CMD_CLOSE_WIN_GET_VBAT) {
- if(sys_cb.loc_house_bat != packet->buf[1]) {
- sys_cb.loc_house_bat = packet->buf[1];
- sys_cb.rem_house_bat = packet->buf[1];
- update_flag = true;
- }
- if(packet->cmd == VHOUSE_CMD_CLOSE_WIN_GET_VBAT) {
- return;
- }
- if(packet->buf[2] & BIT(7)) {
- if(sys_cb.rem_bat != packet->buf[2]) { //对方在仓内,且电量不为0时,用仓互传
- if((packet->buf[2]&0x7f) == 0) {
- sys_cb.rem_bat |= BIT(7);
- } else {
- sys_cb.rem_bat = packet->buf[2];
- vhouse_cb.rem_bat_ok = true;
- }
- update_flag = true;
- }
- } else {
- if(vhouse_cb.rem_bat_ok) {
- update_flag = true;
- }
- vhouse_cb.rem_bat_ok = false; //对方出仓后,电量通过TWS互传
- }
- if(!vhouse_cb.inbox_sta) {
- vhouse_cb.inbox_sta = true;
- update_flag = true;
- }
- }
- vhouse_cb.update_ear_flag = update_flag;
- }
- //分析电量接收包并回应相关电量数据
- AT(.text.charge_box)
- static void charge_box_vbat_ack(vh_packet_t *packet)
- {
- vhouse_cb.cmd3_rx_flag = 0;
- u8 channel = packet->buf[0];
- if (!bt_tws_channel_check(channel)) {
- // vhouse_send_message_err();
- return;
- }
- charge_box_update_bat_value(packet);
- //发送电量响应包
- packet->header = 0xAA55;
- packet->distinguish = VHOUSE_DISTINGUISH;
- packet->length = 0x04;
- packet->buf[0] = channel;
- packet->buf[2] = sys_cb.loc_bat;
- packet->buf[3] = sys_cb.charge_sta;
- charge_box_cmd_ack(packet);
- }
- AT(.text.charge_box)
- static void charge_box_pair_ack(vh_packet_t *packet)
- {
- u8 channel = packet->buf[0];
- if (!bt_tws_channel_check(channel)) {
- return;
- }
- if((channel != LEFT_CHANNEL_USER) || vhouse_cb.cmd3_rx_flag){
- //发送蓝牙地址包
- u8 bt_tws_addr[6];
- u8 feature = bt_tws_get_link_info(bt_tws_addr);
- memset(packet, 0, sizeof(vh_packet_t));
- packet->header = 0xAA55;
- packet->distinguish = VHOUSE_DISTINGUISH;
- packet->cmd = VHOUSE_CMD_GET_TWS_BTADDR;
- packet->length = 14;
- packet->buf[0] = (channel == RIGHT_CHANNEL_USER) ? LEFT_CHANNEL_USER : RIGHT_CHANNEL_USER; //发送对方声道
- memcpy(packet->buf+1, bt_tws_addr, 6); //TWS地址
- memcpy(packet->buf+7, xcfg_cb.bt_addr, 6); //本地的地址
- packet->buf[13] = feature; //TWS主从Feature
- charge_box_cmd_ack(packet);
- if (!bt_tws_is_slave()) {
- bt_nor_disconnect();
- ble_adv0_idx_update();
- }
- }else{
- vhouse_cb.cmd3_rx_flag = 1;
- }
- }
- AT(.text.charge_box)
- static void charge_box_clr_tws_link_info(void)
- {
- bt_clr_master_addr();
- bt_tws_delete_link_info_with_tag(BT_INFO_TAG_CHARGE_BOX, (uint32_t)__builtin_return_address(0));
- }
- AT(.text.iodm)
- static void charge_box_clr_bt_all_link_info(void)
- {
- bt_clr_master_addr();
- bt_nor_delete_link_info();
- bt_tws_delete_link_info_with_tag(BT_INFO_TAG_CHARGE_BOX, (uint32_t)__builtin_return_address(0));
- }
- AT(.text.charge_box)
- static void charge_box_get_tws_btaddr_ack(vh_packet_t *packet)
- {
- vhouse_cb.cmd3_rx_flag = 1;
- u8 tws_role = 0;
- u8 bt_tws_addr[6], new_addr[6];
- u8 channel = packet->buf[0];
- u8 pkt_feature = packet->buf[13];
- u8 feature = bt_tws_get_link_info(bt_tws_addr); //获取TWS地址及feature
- if (!bt_tws_channel_check(channel)) {
- return;
- }
- //TWS地址不匹配或Feature不对需要清除配对信息
- if ((memcmp(packet->buf+1, bt_tws_addr, 6) != 0) || (feature == pkt_feature) || (feature == 0) || (pkt_feature == 0)) {
- if(bt_tws_is_connected()){
- bt_tws_disconnect();
- }
- tws_role = bt_tws_get_tws_role();
- TRACE("BT_ADDDR_IS_DIFF: %d\n", tws_role);
- charge_box_clr_tws_link_info();
- if (tws_role) {
- memcpy(new_addr, packet->buf + 7, 6); //保存master
- } else {
- memcpy(new_addr, xcfg_cb.bt_addr, 6);
- }
- tws_update_local_addr(new_addr);
- u8 data[4];
- data[0] = new_addr[2];
- data[1] = new_addr[3];
- data[2] = new_addr[4];
- data[3] = new_addr[5];
- bt_tws_put_link_info_addr(new_addr,data);
- bt_tws_put_link_info_feature(new_addr, tws_role);
- }
- if (sys_cb.tws_force_channel == 1) {
- charge_box_send_msg_suceess();
- }
- if(tws_role){
- bt_tws_connect();
- }
- }
- AT(.text.charge_box)
- void bsp_vhouse_get_ear_addr(vh_packet_t *packet)
- {
- u8 channel = packet->buf[0];
- if (!bt_tws_channel_check(channel)) {
- return;
- }
- //发送蓝牙地址包
- u8 bt_tws_addr[6];
- u8 feature = bt_tws_get_link_info(bt_tws_addr);
- memset(packet, 0, sizeof(vh_packet_t));
- packet->header = 0xAA55;
- packet->distinguish = VHOUSE_DISTINGUISH;
- packet->cmd = VHOUSE_CMD_GET_EAR_ADDR;
- packet->length = 16;
- packet->buf[0] = channel;
- memcpy(packet->buf+1, bt_tws_addr, 6); //TWS地址
- memcpy(packet->buf+7, xcfg_cb.bt_addr, 6); //本地的地址
- packet->buf[13] = feature; //TWS主从Feature
- u16 link_key_sum = 0;
- u8 link_key[16];
- memset(link_key, 0, 16);
- btstack_get_link_key(bt_tws_addr, link_key, NULL, 1);
- for (u8 i = 0; i < 16; i++) {
- link_key_sum += link_key[i];
- }
- memcpy(packet->buf+14, (u8 *)&link_key_sum, 2);
- charge_box_cmd_ack(packet);
- }
- AT(.text.charge_box)
- static void charge_box_analysis_packet(vh_packet_t *packet)
- {
- u8 cmd = packet->cmd;
- switch (cmd) {
- case VHOUSE_CMD_GET_VBAT:
- // TRACE("VHOUSE_CMD_GET_VBAT\n");
- charge_box_vbat_ack(packet);
- break;
- case VHOUSE_CMD_PAIR:
- TRACE("VHOUSE_CMD_PAIR\n");
- charge_box_pair_ack(packet);
- break;
- case VHOUSE_CMD_GET_TWS_BTADDR:
- TRACE("VHOUSE_CMD_GET_TWS_BTADDR\n");
- charge_box_get_tws_btaddr_ack(packet);
- break;
- case VHOUSE_CMD_CLEAR_PAIR:
- TRACE("VHOUSE_CMD_CLEAR_PAIR\n");
- charge_box_clr_bt_all_link_info(); //删除所有配对信息
- break;
- case VHOUSE_CMD_PWROFF:
- TRACE("VHOUSE_CMD_PWROFF\n");
- vhouse_cb.status = 2; //充满电
- func_cb.sta = FUNC_PWROFF;
- break;
- case VHOUSE_CMD_CLOSE_WINDOW:
- TRACE("VHOUSE_CMD_CLOSE_WINDOW\n");
- vhouse_cb.open_win_flag = 0;
- vhouse_cb.status = 0; //关盖, 充电
- charge_box_vbat_ack(packet);
- break;
- case VHOUSE_CMD_OPEN_WINDOW:
- TRACE("VHOUSE_CMD_OPEN_WINDOW\n");
- charge_box_open_windows();
- charge_box_vbat_ack(packet);
- break;
- case VHOUSE_CMD_ENABLE_POPUP:
- TRACE("VHOUSE_CMD_ENABLE_POPUP\n");
- charge_box_popup_ctrl(packet);
- break;
- case VHOUSE_CMD_GET_EAR_ADDR:
- TRACE("VHOUSE_CMD_GET_EAR_ADDR\n");
- bsp_vhouse_get_ear_addr(packet);
- break;
- case VHOUSE_CMD_SYS_RST:
- sw_reset_kick(SW_RST_FLAG);
- break;
- default:
- break;
- }
- le_popup_vhouse_cmd_notice(cmd);
- }
- AT(.text.charge_box)
- static void charge_box_analysis_packet_for_charge(vh_packet_t *packet)
- {
- switch (packet->cmd) {
- //仓关盖后获取电量
- case VHOUSE_CMD_CLOSE_WIN_GET_VBAT:
- TRACE("VHOUSE_DISP_VBAT\n");
- charge_box_vbat_ack(packet);
- vhouse_cb.open_win_flag = 0;
- vhouse_cb.status = 0; //关盖, 充电
- break;
- //仓开盖后获取电量
- case VHOUSE_CMD_OPEN_WINDOW:
- TRACE("VHOUSE_CMD_OPEN_WINDOW\n");
- case VHOUSE_CMD_GET_VBAT:
- TRACE("VHOUSE_CMD_GET_VBAT\n");
- charge_box_vbat_ack(packet);
- vhouse_cb.status = 1; //开窗,停止充电
- break;
- case VHOUSE_CMD_PWROFF:
- TRACE("VHOUSE_CMD_PWROFF\n");
- vhouse_cb.status = 2; //充满电
- break;
- default:
- break;
- }
- }
- AT(.text.charge_box)
- u32 charge_box_ssw_process(u32 charge_sta)
- {
- #if QTEST_EN
- if(qtest_get_mode()){
- return 0;
- }
- #endif
- vh_packet_t *packet = &vhouse_cb.packet;
- if(vhouse_cb.open_win_flag && tick_check_expire(vhouse_cb.win_ticks, 180)) {
- charge_box_open_windows(); //防止开盖命令被堵而丢失的问题
- }
- if(tick_check_expire(vhouse_cb.loc_ticks, 500)) { //没必要一直检测,容易跳来跳去
- u8 loc_bat = bsp_get_bat_level();
- //修正会充不满电的问题
- if(charge_sta&&(loc_bat==100)) {
- loc_bat=99;
- }
- if((sys_cb.loc_bat & 0x7f) != loc_bat) {
- sys_cb.loc_bat = (sys_cb.loc_bat & 0x80) | loc_bat;
- vhouse_cb.update_ear_flag = true;
- }
- vhouse_cb.loc_ticks = tick_get();
- }
- #if (CHARGE_BOX_INTF_SEL == INTF_HUART)
- if(vhouse_cb.rx_flag) {
- if(packet->checksum == crc8_maxim((u8 *)packet, 5 + packet->length)) {
- // TRACE("cmd [%d], %d\n", packet->cmd, charge_sta);
- if (charge_sta) {
- charge_box_analysis_packet_for_charge(packet);
- } else {
- reset_sleep_delay(); //耳机在仓内不进休眠, 需要接收电量心跳包数据
- charge_box_analysis_packet(packet);
- charge_box_update_bat_adv();
- }
- }
- vhouse_cb.rx_flag=0;
- }
- #elif ((CHARGE_BOX_INTF_SEL == INTF_UART1) || (CHARGE_BOX_INTF_SEL == INTF_UART2))
- u8 parse_done;
- u8 ch;
- #if (CHARGE_BOX_INTF_SEL == INTF_UART1)
- while (bsp_uart1_get(&ch))
- #elif (CHARGE_BOX_INTF_SEL == INTF_UART2)
- while (bsp_uart2_get(&ch))
- #endif
- {
- WDT_CLR();
- parse_done = bsp_uart_packet_parse(packet, ch);
- if ((parse_done) && (packet->checksum == crc8_maxim((u8 *)packet, 5 + packet->length))) {
- TRACE("cmd [%d], %d\n", packet->cmd, charge_sta);
- if (charge_sta) {
- charge_box_analysis_packet_for_charge(packet);
- } else {
- reset_sleep_delay(); //耳机在仓内不进休眠, 需要接收电量心跳包数据
- charge_box_analysis_packet(packet);
- charge_box_update_bat_adv();
- }
- }
- }
- #endif
- if (charge_sta == 0) {
- charge_box_update_bat_adv();
- }
- return vhouse_cb.status;
- }
- void charge_box_channel_confirm(void)
- {
- u8 channel = bt_tws_get_tws_channel();
- if(!channel){
- return ;
- }
- vhouse_cb.ack_dat_confirm=1;
- if (channel == LEFT_CHANNEL) {
- vhouse_cb.ack_dat = LEFT_CHANNEL_USER;
- }else if(channel == RIGHT_CHANNEL){
- vhouse_cb.ack_dat = RIGHT_CHANNEL_USER;
- }
- }
- void charge_box_ssw_init(void)
- {
- printf("charge_box_ssw_init\n");
- memset(&vhouse_cb, 0, sizeof(vhouse_cb));
- tws_lr_xcfg_sel();
- charge_box_channel_confirm();
- bt_tws_channel_read();
- }
- #endif
- #endif
|