⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hbcp.c

📁 在VC6.0上编译通过的蓝牙通信演示程序, COM1口控制.
💻 C
📖 第 1 页 / 共 2 页
字号:
			{
				// 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 + -