📄 hbcp.c
字号:
{
// non escaped
if (ch == HBCP_FLAG)
{
if (gHBCP_Rx.nLen==0)
{
// no data at all,
// we received repeat 0xC0
// to support wakeup package
// consider it as a start of package
// instead of an end of package
// so, do nothing
}else
// found Sync flag again
// a complete packet was in buffer now
// notify to application
{
#ifdef CHECK_SUM
//printf("rx_sum_Lower=[%x]\n", gHBCP_Rx_Buf[gHBCP_Rx.nLen-1]);
//printf("rx_sum_Higher=[%x]\n", gHBCP_Rx_Buf[gHBCP_Rx.nLen-2]);
//printf("gHBCP_Rx.nLen=%d\n", gHBCP_Rx.nLen);
//printf("sum before=[%x]\n", gRx_chk_sum);
if(gHBCP_Rx.nLen >= 3)
{
gRx_chk_sum-=((unsigned short)gHBCP_Rx_Buf[gHBCP_Rx.nLen-1] + (unsigned short)gHBCP_Rx_Buf[gHBCP_Rx.nLen-2]);
/* checksum = ~(Sum of data bytes in data package) + 1.*/
gRx_chk_sum = ~gRx_chk_sum +1;
gRx_data_sum=(unsigned short)gHBCP_Rx_Buf[--gHBCP_Rx.nLen]
+(unsigned short)(gHBCP_Rx_Buf[--gHBCP_Rx.nLen] << 8);
if(!(gRx_chk_sum - gRx_data_sum))
{
//printf("sum == rx_sum \n");
HBCP_RcvPacket();
}
else
{
printf("rx_sum=[%x]\n", gRx_data_sum);
printf("sum=[%x]\n", gRx_chk_sum);
printf("UART RX Check sum error ! \n");
}
}
else
{
printf("error ! gHBCP_Rx.nLen < 3 ! \n");
InitHBCPState();
}
gRx_chk_sum = 0;
gRx_data_sum = 0;
#else
HBCP_RcvPacket();
#endif
// reset flags
gHBCP_Rx.bSync = 0; // lost of sync
gHBCP_Rx.bEsc = 0; // no esc
}
}else
if (ch == HBCP_ESCAPE)
{
/*
#ifdef CHECK_SUM
gRx_chk_sum+=ch;
#endif
*/
// set flag, next character is escaped
gHBCP_Rx.bEsc = 1; // escaped
}else
{
#ifdef CHECK_SUM
gRx_chk_sum+=ch;
#endif
gHBCP_Rx_Buf[gHBCP_Rx.nLen++] = ch;
// BUGHBCP HBCP_EXCEPTION
// Discard data if too many, reset state machine to initial state
if (gHBCP_Rx.nLen>(HBCP_RX_BUF_SIZE-2))
InitHBCPState();
}
}else
{
/*
#ifdef CHECK_SUM
gRx_chk_sum+=ch;
#endif
*/
// escaped
ch ^= 0x20;
#ifdef CHECK_SUM
gRx_chk_sum+=ch;
#endif
gHBCP_Rx_Buf[gHBCP_Rx.nLen++] = ch;
// BUGHBCP
gHBCP_Rx.bEsc = 0; // Reset ESCAPE flag
// BUGHBCP HBCP_FATALERROR
//Prevention purpose only!
if ( !((ch==HBCP_ESCAPE)||(ch==HBCP_FLAG)))
{
//If the byte after the ESCAPE byte is not our escaped code
//Simple discard the message, and reset state machine to initial state
InitHBCPState();
}
// BUGHBCP HBCP_EXCEPTION
//Discard data if too many, reset state machine to initial state
if (gHBCP_Rx.nLen>(HBCP_RX_BUF_SIZE-2))
InitHBCPState();
}
}
}//while
}
void FATAL_ERROR(void)
{
// BUGHBCP BUG_FATALERROR
printf(0, "FATA ERROR!!!\n");
while (1)
{
}
}
void CALLBACK SyncThread(DWORD dwParameter)
{
while(sync_send)
{
if(sync_send_num <= 10)
{
sync_send_num ++;
HBCP_Send_Sync();
Sleep(250);
}
else
{
HBCP_Sync_Ack();
}
}
}
void HBCP_Sync_Ack(void)
{
if(tx_buf.length)
HBCP_Physical_Send_Txbuffer(tx_buf.data, tx_buf.length);
tx_buf.length = 0;
Close_Sync_Thread();
}
/******************************************************
debug get call info
*/
void debug_f(unsigned char *pParam)
{
unsigned char ucLen;
printf("\n#%x#\n", *(pParam-1));
for(ucLen=0; ucLen<*(pParam-1); ucLen++)
printf("[%x]", pParam[ucLen]);
printf("\n");
}
void HBCP_RcvPacket()
{
HBCP_HEAD *head = (HBCP_HEAD *)gHBCP_Rx_Buf;
unsigned char *pParam = (unsigned char *)gHBCP_Rx_Buf + HBCP_HEAD_SIZE;
/*printf("Receive data len[%d],type[%x]\n", head->ucLen, head->ucType);*/
if (gHBCP_Rx.nLen < HBCP_HEAD_SIZE)
{
// BUGOBEX BUG_FATALERROR
//Fatal error here, just now we got a un-expected package (SMALL PACKAGE)
//Discard it here to prevent Protocol HANG
//TODO: add some MMI indication to notice user
//Won't hange device here, discard the message, and give message
#ifdef DEBUG_HBCP
{
char temp[12];
sprintf(temp, "%d ERROR", gHBCP_Rx.nLen);
tmpAppDbgLine(0,temp);
}
#endif
return;
// something wrong
FATAL_ERROR();
return;
}
// Handle events from BLUECORE
switch (head->ucType)
{
case HBCP_EVT_PAIR_STATUS:
HBCP_Pair_Status(*pParam);
break;
case HBCP_EVT_HSHF_IND:
HBCP_HsHf_Ind(*pParam);
break;
case HBCP_EVT_RING_IND:
HBCP_Hshf_Ring_Ind();
break;
case HBCP_EVT_STORAGE:
HBCP_Hshf_Set_Storage_Status(*pParam);
break;
case HBCP_EVT_VOL_LEVEL:
HBCP_Hshf_Volume_Level(pParam);
break;
case HBCP_EVT_CALL_STATUS:
HBCP_Hshf_Call_Status(*pParam);
break;
case HBCP_EVT_CALL_LIST:
HBCP_Call_List_Display(pParam);
break;
case HBCP_EVT_SYNC:
HBCP_Sync_Ack();
break;
case HBCP_EVT_SCO_IND:
HBCP_Hshf_Sco_Ind(*pParam);
break;
case HBCP_EVT_CALL_WAITING_IND:
HBCP_Hshf_Call_Waiting(head->ucLen, pParam);
break;
case HBCP_EVT_PAIRED_DEV_NAME:
HBCP_Paired_Dev_Name(head->ucLen, pParam);
break;
case HBCP_EVT_SET_PIN_ACK:
HBCP_Get_Pin(head->ucLen, pParam);
break;
case HBCP_EVT_CONNECTED_DEV_NAME:/*sxg 20070105*/
HBCP_Connected_Dev_Name(head->ucLen, pParam);
break;
case HBCP_EVT_INITIALIZED_COMPLETE:/*sxg 20070105*/
HBCP_Iinitialized_Complete();
break;
case HBCP_EVT_NO_PAIRED_DEVICE:
HBCP_No_Paired_Dev();
break;
case HBCP_EVT_CALLER_ID:
HBCP_Hshf_Caller_Id(head->ucLen, pParam);
break;
case HBCP_EVT_CALLER_NAME:
HBCP_Hshf_Caller_Name(head->ucLen, pParam);
break;
case HBCP_EVT_BLUECORE_ON_OFF:
HBCP_BLUECORE_On_Off(*pParam);
break;
case HBCP_EVT_AV_STATUS:
HBCP_AV_Status(*pParam);
break;
case HBCP_EVT_HSHF_STATUS:
HBCP_HSHF_Status(*pParam);
break;
case HBCP_EVT_CHKSUM_ERR:
HBCP_Checksum_Error();
break;
case HBCP_EVT_DEBUG:
HBCP_Debug_Msg(head->ucLen, pParam);
break;
case HBCP_EVT_ACK:
/*HBCP_Sync_Ack();*/
break;
/*Xiuge 20070103*/
case HBCP_EVT_HSHF_GET_STATUS:
HBCP_Hshf_All_Status(pParam);
break;
case HBCP_EVT_HSHF_INQUIRY_RESULT:
HBCP_Hshf_Inquiry_Result(pParam);
break;
/*Jim 20070530*/
case HBCP_EVT_BC_PULL_BEGIN:
printf("\n\nStart sending vCard...\n\n");
break;
case HBCP_EVT_BC_PULL_END:
printf("\n\nvCard sent complete.\n\n");
break;
case HBCP_EVT_OBJ_PUSH_BEGIN:
printf("\n\nStart receiving OPP object...\n\n");
break;
case HBCP_EVT_OBJ_PUSH_END:
printf("\n\nOPP object received complete.\n\n");
break;
case HBCP_EVT_OBJ_PUSH_FNAME:
HBCP_OPP_Filename(head->ucLen, pParam);
break;
case HBCP_EVT_OBJ_PUSH_FLEN:
{
int len = (int)((pParam[0] << 24) | (pParam[1] << 16) | (pParam[2] << 8) | pParam[3]);
printf("\n\nOPP object size: %d bytes.\n\n", len);
}
break;
case HBCP_EVT_OBJ_PUSH_DATA:
HBCP_Save_OPP_Data(head->ucLen, pParam);
break;
case HBCP_EVT_SPP_CONNECTED:
printf("\n\nSPP connected.\n\n");
break;
case HBCP_EVT_SPP_DISCONNECTED:
printf("\n\nSPP disconnected.\n\n");
break;
case HBCP_EVT_SPP_DATA:
HBCP_Spp_receive_Data(head->ucLen, pParam);
break;
default:
break;
}
}
#ifdef HBCP_DEBUG_CHANNEL
void HBCP_Debug(char *pStr)
{
HBCP_HEAD head;
unsigned char s1;
s1 = strlen(pStr);
head.ucType = HBCP_DBG;
head.ucSeqnum = TXSEQnum;
head.ucLen = s1;
HBCP_Physical_Send_Start((unsigned char *)&head, HBCP_HEAD_SIZE);
HBCP_Physical_Send_End((unsigned char *)pStr,s1);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -