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

📄 generate_at_resp.c

📁 pbap_client:bluetooth 可查询带有PBAP功能手机的Phonebook
💻 C
字号:
/****************************************************************************

DESCRIPTION
    Implementation of AT Response generation functionality
	
FILE
	generate_at_resp.c
*/

#include <stream.h>
#include <sink.h>
#include <source.h>
#include <string.h>
#include <panic.h>
#include <stdio.h>

#include "generate_at_resp.h"


static const uint8 gConResStr[] = {'+','C','O','N','='};
static const uint8 gDiscoResStr[] = {'+','D','I','S','C','O'};
static const uint8 gSetPbResStr[] = {'+','S','P','B','='};

static const uint8 gGetVCLDataStr[] = {'+','G','V','C','L','D','='};
static const uint8 gGetVCLCompleteStr[] = {'+','G','V','C','L','C','='};

static const uint8 gGetVCEDataStr[] = {'+','G','V','C','E','D','='};
static const uint8 gGetVCECompleteStr[] = {'+','G','V','C','E','C','='};

static const uint8 gGetDLPBDataStr[] = {'+','D','L','P','B','D','='};
static const uint8 gGetDLPBCompleteStr[] = {'+','D','L','P','B','C','='};

static const uint8 gCrLfStr[] = {'\r','\n'};

typedef struct
{
	const uint8 *str;
	uint16 len;
} ATStrType;

#define AT_LIST_ENTRY(i) {(i), sizeof((i))}

static const ATStrType gAtStrList[] = 
							{ 
								AT_LIST_ENTRY(gConResStr),
								AT_LIST_ENTRY(gDiscoResStr),
								AT_LIST_ENTRY(gSetPbResStr),
								AT_LIST_ENTRY(gGetVCLDataStr),
								AT_LIST_ENTRY(gGetVCLCompleteStr),
								AT_LIST_ENTRY(gGetVCEDataStr),
								AT_LIST_ENTRY(gGetVCECompleteStr),
								AT_LIST_ENTRY(gGetDLPBDataStr),
								AT_LIST_ENTRY(gGetDLPBCompleteStr),
								
								{0, 0}
							};


uint16 addATStr(Sink pSink, pbapATRespId pId)
{
	uint16 lLen = gAtStrList[pId].len;
	uint8* lS=SinkMap(pSink);
	uint16 lO;
	
	lO = SinkClaim(pSink, lLen);
	if (lO == 0xffff)
		Panic(); /* Error */
	lS += lO;
	
	memcpy(lS, gAtStrList[pId].str, lLen);
	
	return lLen;
}

void addATCrLfandSend(Sink pSink, uint16 pUsed)
{
	uint16 lLen = sizeof(gCrLfStr);
	uint8* lS=SinkMap(pSink);
	uint16 lO;
	
	lO = SinkClaim(pSink, lLen);
	if (lO == 0xffff)
		Panic(); /* Error */
	lS += lO;
	
	memcpy(lS, gCrLfStr, lLen);
	
	SinkFlush(pSink, lLen+pUsed);
}

uint16 addATBuffer8(Sink pSink, const uint8 *pBuffer, uint16 pBufLen)
{
	uint8* lS=SinkMap(pSink);
	uint16 lO;
	
	lO = SinkClaim(pSink, pBufLen);
	if (lO == 0xffff)
		Panic(); /* Error */
	lS += lO;
	
	memcpy(lS, pBuffer, pBufLen);
	
	return pBufLen;
}

uint16 addATByte(Sink pSink, uint8 pByte)
{
	uint8* lS=SinkMap(pSink);
	uint16 lO;
	
	lO = SinkClaim(pSink, 1);
	if (lO == 0xffff)
		Panic(); /* Error */
	lS += lO;
	
	lS[0] = pByte;
	
	return 1;
}

uint16 addATUint8(Sink pSink, uint8 pValue)
{
	char lTxt[10];
	uint16 lLen;
	uint8* lS=SinkMap(pSink);
	uint16 lO;
	
	
	sprintf(lTxt, "%d", pValue & 0xff);
	lLen = strlen(lTxt);
	
	lO = SinkClaim(pSink, lLen);
	if (lO == 0xffff)
		Panic(); /* Error */
	lS += lO;
	
	memcpy(lS, lTxt, lLen);
	
	return lLen;
}

void atRespSendConCfm(uint8 pRes)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_Connect);
	lUsed += addATUint8(lUart, pRes);
	addATCrLfandSend(lUart, lUsed);
}

void atRespSendDiscoCfm(void)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_Disconnect);
	addATCrLfandSend(lUart, lUsed);
}

void atRespSendSetPbCfm(uint8 pRes)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_SetPhonebook);
	lUsed += addATUint8(lUart, pRes);
	addATCrLfandSend(lUart, lUsed);
}

void atRespSendGetVCListData(Source pSrc, uint16 pOffset, uint16 pLength)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	const uint8 *lSource = SourceMap(pSrc);
	
	lSource += pOffset;
	
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_GetVCardListData);
	lUsed += addATBuffer8(lUart, lSource, pLength);
	addATCrLfandSend(lUart, lUsed);
}

void atRespSendGetVCListComplete(uint8 pRes)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_GetVCardListComplete);
	lUsed += addATUint8(lUart, pRes);
	addATCrLfandSend(lUart, lUsed);
}

void atRespSendGetVCEntryData(Source pSrc, uint16 pOffset, uint16 pLength)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	const uint8 *lSource = SourceMap(pSrc);
	
	lSource += pOffset;
	
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_GetVCardEntryData);
	lUsed += addATBuffer8(lUart, lSource, pLength);
	addATCrLfandSend(lUart, lUsed);
}

void atRespSendGetVCEntryComplete(uint8 pRes)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_GetVCardEntryComplete);
	lUsed += addATUint8(lUart, pRes);
	addATCrLfandSend(lUart, lUsed);
}

void atRespSendPullPhonebookData(Source pSrc, uint16 pOffset, uint16 pLength)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	const uint8 *lSource = SourceMap(pSrc);
	
	lSource += pOffset;
	
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_PullPhonebookData);
	lUsed += addATBuffer8(lUart, lSource, pLength);
	addATCrLfandSend(lUart, lUsed);
}

void atRespSendPullPhonebookComplete(uint8 pRes)
{
	Sink lUart = StreamUartSink();
	uint16 lUsed = 0;
	/* Send result to host */
	lUsed = addATStr(lUart, pbapATRespId_PullPhonebookComplete);
	lUsed += addATUint8(lUart, pRes);
	addATCrLfandSend(lUart, lUsed);
}

⌨️ 快捷键说明

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