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

📄 opptask.c

📁 通过蓝牙实现OPP功能。。 比如和NOKIA MOTO的蓝牙手机 对传名片
💻 C
字号:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Ltd. 2004-2006
Part of BlueLab 3.6.2-release

FILE NAME
    OPPTask.c
    
DESCRIPTION
	Source file for an OPP Server application OPP Task.
*/


#include "opps.h"
#include <message.h>
#include <vm.h>
#include <connection.h>
#include <pio.h>
#include <file.h>
#include <panic.h>
#include <stdlib.h>
#include <ps.h>

#include <vgen.h>

#include "OPPServer.h"

enum
{
	vcard_ps_email = 30,
	vcard_ps_phone,
	vcard_ps_url,
	vcard_ps_org,
	vcard_ps_fname,
	vcard_ps_name,
	vcard_ps_rev,
	vcard_ps_title,
	vcard_ps_mobile
};

static const vGenListType vCardList[] = 
{
/*	vCard Constant		Length of CONSTANT 		PS Key 			  Length	Include if Empty */
	{VCARD_BEGIN,		sizeof(VCARD_BEGIN),	cGenNoKey,			0,		FALSE},
	{VCARD_VERSION21,	sizeof(VCARD_VERSION21),cGenNoKey,			0,		FALSE},
	{VCARD_NAME,		sizeof(VCARD_NAME),		vcard_ps_name,		30,		TRUE},
	{VCARD_TITLE,		sizeof(VCARD_TITLE),	vcard_ps_title,		30,		TRUE},
	{VCARD_FNAME,		sizeof(VCARD_FNAME),	vcard_ps_fname,		30,		FALSE}, 
	{VCARD_ORG,			sizeof(VCARD_ORG),		vcard_ps_org,		25,		FALSE},
	{VCARD_URL,			sizeof(VCARD_URL),		vcard_ps_url,		25,		FALSE},
	{VCARD_TEL,			sizeof(VCARD_TEL),		vcard_ps_phone,		20,		TRUE},
	{VCARD_EMAIL,		sizeof(VCARD_EMAIL),	vcard_ps_email,		20,		FALSE},
	{VCARD_MOBILE,		sizeof(VCARD_MOBILE),	vcard_ps_mobile,	20,		FALSE},
	{VCARD_REV,			sizeof(VCARD_REV),		vcard_ps_rev,		17,		FALSE},
	{VCARD_END,			sizeof(VCARD_END),		cGenNoKey,			0,		FALSE}
};


static void opp_handler(Task task, MessageId id, Message message)
{
	/* Get task control block */
	tOPPState *state = (tOPPState*)task;

	switch(id)
	{
	case OPPS_INIT_CFM:
	{
		OPPS_INIT_CFM_T *msg = (OPPS_INIT_CFM_T*)message;
		SVR_DEBUG(("OPPS_INIT_CFM :- "));
		if (msg->status == opps_success)
		{
			GEN_DEBUG(("success\n"));
			state->session = msg->opps;

			/* Make Server discoverable */
			ConnectionWriteScanEnable(hci_scan_enable_inq_and_page);

			/* Register this task to receive PIO events */
			MessagePioTask(&state->OppTask);
			PioDebounce(BUTTON_SHUTDOWN, 3, 1);
		}
#ifdef OPPS_SVR_DEBUG
		else
		{
			GEN_DEBUG(("failure : %d\n", msg->status));
		}
#endif
		break;
	}
		
	case OPPS_CONNECT_IND:
		{ /* Remote client has requested a connection */
		uint16 sz=0;
#ifdef OPPS_SVR_DEBUG
		OPPS_CONNECT_IND_T *msg = (OPPS_CONNECT_IND_T*)message;

		SVR_DEBUG(("OPPS_CONNECT_IND :-\n"));

		SVR_DEBUG(("            BD Addr : 0x%X 0x%X 0x%X%X\n", msg->bd_addr.nap, msg->bd_addr.uap, (uint16)(msg->bd_addr.lap>>16), (uint16)(msg->bd_addr.lap&0xFFFF)));
		SVR_DEBUG(("    Max. Packet Len : 0x%X (%d)\n", msg->maxPacketLen, msg->maxPacketLen));
#endif

		/* Get the maximum packet size from the PS and use it if it is bigger than the default (255) */
		PsRetrieve(PSKEY_MAX_PACKET, &sz, sizeof(sz));
		sz = sz<OPPS_MAX_PACKET_SIZE ? OPPS_MAX_PACKET_SIZE:sz;


		OppsConnectResponse(state->session, TRUE, sz);
		break;
	}
	case OPPS_CONNECT_CFM:
		{ /* Connection process complete */
		OPPS_CONNECT_CFM_T *msg = (OPPS_CONNECT_CFM_T*)message;

		SVR_DEBUG(("OPPS_CONNECT_CFM :- "));
		if (msg->status == opps_success)
		{
			GEN_DEBUG(("success\n"));
			SVR_DEBUG(("    Max. Packet Len : 0x%X (%d)\n", msg->maxPacketLen, msg->maxPacketLen));
			/* The actual max. packet size being used. ( minimum of client size and server size) */
			state->pktSize = msg->maxPacketLen;

			/* Stop being discoverble as we can only accept a single connection */
			ConnectionWriteScanEnable(hci_scan_enable_off);
		}
		else
		{
			SVR_DEBUG(("failure : %d\n", msg->status));
		}
		break;
	}
	case OPPS_DISCONNECT_IND:
	{ /* Remote client has disconnected */
		SVR_DEBUG(("OPPS_DISCONNECT_IND\n"));

		ConnectionWriteScanEnable(hci_scan_enable_inq_and_page);
		break;
	}

	case OPPS_PUSH_OBJ_START_IND:
		{
			OPPS_PUSH_OBJ_START_IND_T *msg = (OPPS_PUSH_OBJ_START_IND_T*)message;
#ifdef OPPS_SVR_DEBUG
            const uint8* s=SourceMap(msg->src);
            uint16 cnt,end;
			
			SVR_DEBUG(("OPPS_PUSH_OBJ_START_IND\n"));
			
            if (msg->nameLength>0)
            {
                end=msg->nameOffset+msg->nameLength-2; /* UTF-16 Null */
                SVR_DEBUG(("     Filename : "));
                cnt=msg->nameOffset+1;
                while (cnt<end)
                {
                    GEN_DEBUG(("%c",s[cnt]));
                    cnt+=2;
                }
                GEN_DEBUG(("\n"));
            }
            if (msg->typeLength>0)
            {
                end=msg->typeOffset+msg->typeLength;
                SVR_DEBUG(("     Type : "));
                for (cnt=msg->typeOffset; cnt<end; cnt++)
                    GEN_DEBUG(("%c, ",s[cnt]));
                GEN_DEBUG(("\n"));
            }
            if (msg->packetLen>0)
            {
                end=msg->packetOffset+msg->packetLen; 
                SVR_DEBUG(("   Data : "));
                for (cnt=msg->packetOffset; cnt<end; cnt++)
                {
                    if ((s[cnt]>=32) && (s[cnt]<=126))
					{
                        GEN_DEBUG(("%c",s[cnt]));
					}
                    else
					{
						GEN_DEBUG(("[0x%x]", s[cnt]));
					}
                }
                GEN_DEBUG(("\n"));
            }
#endif
			
			OppsPacketComplete(state->session);
			
#ifdef OPPS_SVR_DEBUG
            if (msg->moreData)
			{
				SVR_DEBUG(("      More Data Required\n"));
			}
			else
			{
				SVR_DEBUG(("      Finished\n"));
			}
#endif

            OppsGetNextPutPacket(state->session, msg->moreData);
			
			break;
		}
	case OPPS_PUSH_BC_START_IND:
		{
			OPPS_PUSH_BC_START_IND_T *msg = (OPPS_PUSH_BC_START_IND_T*)message;
#ifdef OPPS_SVR_DEBUG
            const uint8* s=SourceMap(msg->src);
            uint16 cnt,end;
			
			SVR_DEBUG(("OPPS_PUSH_BC_START_IND\n"));
			
            if (msg->nameLength>0)
            {
                end=msg->nameOffset+msg->nameLength-2; /* UTF-16 Null */
                SVR_DEBUG(("     Filename : "));
                cnt=msg->nameOffset+1;
                while (cnt<end)
                {
                    GEN_DEBUG(("%c",s[cnt]));
                    cnt+=2;
                }
                GEN_DEBUG(("\n"));
            }
            if (msg->packetLen>0)
            {
                end=msg->packetOffset+msg->packetLen; 
                SVR_DEBUG(("   Data : "));
                for (cnt=msg->packetOffset; cnt<end; cnt++)
                {
                    if ((s[cnt]>=32) && (s[cnt]<=126))
					{
                        GEN_DEBUG(("%c",s[cnt]));
					}
                    else
					{
						GEN_DEBUG(("[0x%x]", s[cnt]));
					}
                }
                GEN_DEBUG(("\n"));
            }
#endif
			
			OppsPacketComplete(state->session);
			
#ifdef OPPS_SVR_DEBUG
            if (msg->moreData)
			{
				SVR_DEBUG(("      More Data Required\n"));
			}
			else
			{
				SVR_DEBUG(("      Finished\n"));
			}
#endif

            OppsGetNextPutPacket(state->session, msg->moreData);
			
			break;
		}
	case OPPS_PUSH_OBJ_DATA_IND:
	case OPPS_PUSH_BC_DATA_IND:
		{
			OPPS_PUSH_OBJ_DATA_IND_T *msg = (OPPS_PUSH_OBJ_DATA_IND_T*)message;
#ifdef OPPS_SVR_DEBUG
			if (id == OPPS_PUSH_OBJ_DATA_IND)
			{
				SVR_DEBUG(("OPPS_PUSH_OBJ_DATA_IND\n"));
			}
			else
			{
				SVR_DEBUG(("OPPS_PUSH_BC_DATA_IND\n"));
			}
			
            if (msg->packetLen>0)
            {
                const uint8* s=SourceMap(msg->src);
                uint16 cnt,end;
                end=msg->packetOffset+msg->packetLen; 
                SVR_DEBUG(("   Data : "));
                for (cnt=msg->packetOffset; cnt<end; cnt++)
                {
                    if ((s[cnt]>=32) && (s[cnt]<=126))
					{
                        GEN_DEBUG(("%c",s[cnt]));
					}
                    else
					{
						GEN_DEBUG(("[0x%x]", s[cnt]));
					}
                }
                GEN_DEBUG(("\n"));
            }
#endif
			
			OppsPacketComplete(state->session);
			
#ifdef OPPS_SVR_DEBUG
            if (msg->moreData)
			{
				SVR_DEBUG(("      More Data Required\n"));
			}
			else
			{
				SVR_DEBUG(("      Finished\n"));
			}
#endif

            OppsGetNextPutPacket(state->session, msg->moreData);
			break;
		}
#ifdef OPPS_SVR_DEBUG
	case OPPS_PUSH_OBJ_COMPLETE_IND:
	case OPPS_PUSH_BC_COMPLETE_IND:
		{
			OPPS_PUSH_OBJ_COMPLETE_IND_T *msg = (OPPS_PUSH_OBJ_COMPLETE_IND_T*)message;
			if (id == OPPS_PUSH_OBJ_COMPLETE_IND)
			{
				SVR_DEBUG(("OPPS_PUSH_OBJ_COMPLETE_IND :- "));
			}
			else
			{
				SVR_DEBUG(("OPPS_PUSH_BC_COMPLETE_IND :- "));
			}
			if (msg->status == opps_success)
			{
                GEN_DEBUG(("success\n"));
			}
			else
			{
				GEN_DEBUG(("failure : %d\n", msg->status));
			}
			
			break;
		}
#endif
		
	case OPPS_PULL_BC_START_IND:
		{
			uint16 used;
			bool res;
		
			SVR_DEBUG(("OPPS_PULL_BC_START_IND\n"));
		
			/* Setup vGen Session */
			state->vGenWS = vGenInit(&vCardList[0], 12, VGEN_BUFFER_SIZE);

			if (state->vGenWS)
			{
				/* Get First Buffer */
				res = vGenGetBuffer(state->vGenWS, &state->buffer[0], &used);
#ifdef OPPS_SVR_DEBUG
				{
					uint16 c;
					SVR_DEBUG(("     Sending :- "));
					for (c = 0; c<used; c++)
					{
						if ((state->buffer[c] >= ' ') && (state->buffer[c] <= 126))
						{
							GEN_DEBUG(("%c", state->buffer[c]));
						}
						else
						{
							GEN_DEBUG(("[0x%x]", state->buffer[c]));
						}
					}
					GEN_DEBUG(("\n"));
				}
#endif

				/* Send First Buffer */
				OppsPushBusinessCardStart(state->session, 
						0, NULL, 
						used, &state->buffer[0], 
						0, res);
				
				if (res) /* Only 1 packet to send */
					vGenDeInit(state->vGenWS);
			}
			else
			{ /* Send an error */
			}
			break;
		}
	case OPPS_PULL_BC_MOREDATA_IND:
		{
			uint16 used;
			bool res;
		
			SVR_DEBUG(("OPPS_PULL_BC_MOREDATA_IND\n"));
		
			if (state->vGenWS)
			{
				/* Get Buffer */
				res = vGenGetBuffer(state->vGenWS, &state->buffer[0], &used);
#ifdef OPPS_SVR_DEBUG
				{
					uint16 c;
					SVR_DEBUG(("     Sending :- "));
					for (c = 0; c<used; c++)
					{
						if ((state->buffer[c] >= ' ') && (state->buffer[c] <= 126))
						{
							GEN_DEBUG(("%c", state->buffer[c]));
						}
						else
						{
							GEN_DEBUG(("[0x%x]", state->buffer[c]));
						}
					}
					GEN_DEBUG(("\n"));
				}
#endif
				
				/* Send Buffer */
				OppsPushBusinessCardNext(state->session, 
							used, &state->buffer[0], res);
				if (res) /* Sending last packet */
					vGenDeInit(state->vGenWS);
			}
			else
			{ /* Send an error */
			}
			break;
		}
	case OPPS_PULL_BC_COMPLETE_IND:
		SVR_DEBUG(("OPPS_PULL_BC_COMPLETE_IND\n"));
		/* Dunno yet */
		break;

	case MESSAGE_PIO_CHANGED:
	{
		if (!state->shutdown)
		{
			SVR_DEBUG(("Button Pressed\n"));

			if ((PioGet()&BUTTON_SHUTDOWN) == BUTTON_SHUTDOWN)
			{ /* Shutdown pressed */
				ConnectionWriteScanEnable(hci_scan_enable_off);
				state->shutdown = TRUE;
				if (state->connected)
				{ /* Disconnect before shutting down */
				}
			}
		}
		break;
	}

	default:
		SVR_DEBUG(("Unhandled Message : %d , 0x%0X\n",id,id)); 
		break;
	}
}

void opp_initTask(tOPPState *state)
{
	state->OppTask.handler = opp_handler;

	state->session = 0;

	state->connected = FALSE;
	state->shutdown = FALSE;
	state->vGenWS = NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -