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

📄 smsref.c

📁 在GPRS或者CDMA modem上实现发送/接收短信的C代码;支持Siemens
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <fcntl.h>
#include <errno.h>

#ifndef _LINUX_
#define _LINUX_
#endif

#ifdef _LINUX_
#include<sys/types.h>
#include<netdb.h>
#include<syslog.h>
#include<fcntl.h>
#include <signal.h>
#include <utmp.h>
#include <unistd.h>
#include <pthread.h>
#endif

#include "sms.h"


#define SMS_REF_CNT 30

int giSmsRefBufWrite = 0;
int giSmsRefBufCnt = SMS_REF_CNT;

SMS_REF gSmsRefBuf[SMS_REF_CNT];
//SMS_REF gSmsRef;
SMS_REF gCurSmsRef;

SMS_REF *smsref_head = NULL;
SMS_REF *smsref_tail = NULL;

#ifdef _LINUX_
pthread_mutex_t bufmutex = PTHREAD_MUTEX_INITIALIZER;
#endif

void smspkt_P(void)
{
#ifdef _LINUX_
	pthread_mutex_lock(&bufmutex);
#endif
}

void smspkt_V(void)
{
#ifdef _LINUX_
	pthread_mutex_unlock(&bufmutex);
#endif
}


/**********************************************
* extern variales
**********************************************/
extern char debugType;
extern void WMMP_TRACE(char type, const char *format, ...);


/************SMS packet buffer****************/
int  initsmsrefbuf(void);
int  clearsmsrefbuf(void);
SMS_REF* allocsmsrefbuf(void);
int  freesmsrefbuf(SMS_REF *ptSmsRef);

int add_queue(SMS_REF *ptSmsRef);
SMS_REF *del_queue(void);
/************SMS packet buffer***************/


//initialize 
int initsmsrefbuf(void)
{
	int i;
	
	smspkt_P();

	giSmsRefBufWrite = 0;
	giSmsRefBufCnt = SMS_REF_CNT;
	
	for (i=0;  i < SMS_REF_CNT ; i++)
	{
		memset(gSmsRefBuf + i, 0, sizeof(gSmsRefBuf[i]));
	}
	
	smsref_head = NULL;
	smsref_tail= NULL;
	
	smspkt_V();

	return 0;	
}

SMS_REF *allocsmsrefbuf(void)
{
	SMS_REF *smsref;
	int i;
	
	smspkt_P();
	
	WMMP_TRACE(debugType, "\r\nallocsmsrefbuf:gCnt=%d.", giSmsRefBufCnt);

	if (giSmsRefBufCnt>0)
	{
		giSmsRefBufCnt--;
		
		for (i=0; i < SMS_REF_CNT; i++)
		{
			smsref = &gSmsRefBuf[giSmsRefBufWrite];
			giSmsRefBufWrite++;
			giSmsRefBufWrite %= SMS_REF_CNT;
			if (0 == smsref->allocated)
				break;
		}

		if (SMS_REF_CNT == i)
		{
			WMMP_TRACE(debugType, "\r\nError! NOT FOUND AN EMPTY SMS ref buffer!");
			giSmsRefBufCnt++;
			smspkt_V();
			return NULL;
		}

		memset(smsref, 0, sizeof(SMS_REF));
		smsref->allocated=1;

		WMMP_TRACE(debugType, "\r\nallocsmsbuf:ret %x.", smsref);
		smspkt_V();
		return smsref;
	}
    
	WMMP_TRACE(debugType, "\r\nallocsmsrefbuf:ret null1.");
	
	smspkt_V();

	return NULL;
}

int freesmsrefbuf(SMS_REF *ptSmsRef)
{
	int i = 0;
	
	smspkt_P();
	WMMP_TRACE(debugType, "\r\nfreesmsrefbuf:[%x], gCnt=%d.", ptSmsRef, giSmsRefBufCnt);
	
	if(ptSmsRef == NULL)
	{
		WMMP_TRACE(debugType, "\r\nfree a NULL sms ref buffer!!!");
		smspkt_V();
		return -1;
	}

	if(giSmsRefBufCnt >= SMS_REF_CNT)
	{
		WMMP_TRACE(debugType, "\r\nall empty sms ref buffer");
		smspkt_V();
		return -2;
	}

	for(i = 0; i < SMS_REF_CNT; i++)
	{
		if(ptSmsRef == &gSmsRefBuf[i])
			break;
	}

	if(i == SMS_REF_CNT)
	{
		WMMP_TRACE(debugType, "\r\nFree an not existing sms ref buffer");
		smspkt_V();
		return -3;
	}

	ptSmsRef->smsRef = 0;
	ptSmsRef->allocated = 0;
	ptSmsRef->next = NULL;
	giSmsRefBufCnt++;

	smspkt_V();
	
	return 0;
}

int add_queue(SMS_REF* ptSmsRef)
{
	smspkt_P();

	if(ptSmsRef == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: Add a NULL SMS ref buffer to queue");
		smspkt_V();
		return -1;
	}

	if(smsref_head == NULL)
	{
		smsref_head = ptSmsRef;
		smsref_tail   = ptSmsRef;
	}
	else
	{
		if(smsref_tail == NULL)
		{
			smsref_tail = ptSmsRef;
		}
		else
		{
			smsref_tail->next = ptSmsRef;
		       smsref_tail = ptSmsRef;
		}
	}

	smspkt_V();

	return 0;
}

SMS_REF* del_queue(void)
{
	SMS_REF *pRet = NULL;
	
	smspkt_P();

	if(smsref_head == NULL)
	{
		WMMP_TRACE(debugType, "\r\nError: SMS buffer is empty!");
		smspkt_V();
		return NULL;
	}

	pRet = smsref_head;
	smsref_head = smsref_head->next;
	if(smsref_head == NULL)
	{
		smsref_tail   = NULL;
	}
	
	if(pRet != NULL)
	{
		memcpy(&gCurSmsRef, pRet, sizeof(SMS_REF));
	}

	smspkt_V();
	return pRet;
}

⌨️ 快捷键说明

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