📄 opptask.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 + -