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

📄 common.c

📁 基于h323协议的软phone
💻 C
📖 第 1 页 / 共 4 页
字号:
		memset(&phonebook, 0, sizeof(phonebook));
	}

	offset += sizePhoneBook;
	if (sysNvRamGet((char *) &incomingcall, sizeCallRecord - 1, offset) != OK)
	{
		printf("Init incoming call record error. load default param!\n");
		memset(&incomingcall, 0, sizeCallRecord);
		needSetCall = 1;
	}

	offset += sizeCallRecord;
	if (sysNvRamGet((char *) &outgoingcall, sizeCallRecord - 1, offset) != OK)
	{
		printf("Init outgoing call record error. load default param!\n");
		memset(&outgoingcall, 0, sizeCallRecord);
		needSetCall = 1;
	}

	offset += sizeCallRecord;
	if (sysNvRamGet((char *) &noanswercall, sizeCallRecord - 1, offset) != OK)
	{
		printf("Init noanswer call record error. load default param!\n");
		memset(&noanswercall, 0, sizeCallRecord);
		needSetCall = 1;
	}

	offset += sizeCallRecord;
	if (sysNvRamGet((char *) &phoneconfig, sizePhoneConfig - 1, offset) != OK)
	{
		printf("Init phone config error. load default param!\n");
		LoadDefaultParam();
	}

	if (phoneconfig.conf_network.gateway == 0xFFFFFFFF)		
	{
		printf("Invalid gateway in nvram, set it to default value\n");
		phoneconfig.conf_network.gateway = phoneconfig.conf_network.ipaddr;
	}

	if (SpawnTask( "tRecordCall", (FUNCPTR) SetCallInfo, FALSE, 200, 2048 ) == ERROR)
	{
		fprintf(stderr, "InitPhoneParam: Unable to spawn RecodCall\n");
	}
}

int recordIncomingCall()
{
	int offset = CONFIG_LOCATION + sizeof(phonebook);
	int flag;
	semTake(callSem, WAIT_FOREVER);
	flag = sysNvRamSet((char *)incomingcall, sizeof(incomingcall), offset);
	semGive(callSem);
	return flag;
}
int recordNoanswercall()
{
	int offset = CONFIG_LOCATION + sizeof(phonebook) + 2*sizeof(incomingcall);
	int flag;
	semTake(callSem, WAIT_FOREVER);
	flag = sysNvRamSet((char *)noanswercall, sizeof(noanswercall), offset);
	semGive(callSem);
	return flag;
}
 int recordOutgoingcall()
{
	int offset = CONFIG_LOCATION + sizeof(phonebook) + sizeof(incomingcall);
	int flag;
	semTake(callSem, WAIT_FOREVER);
	flag = sysNvRamSet((char *)outgoingcall, sizeof(outgoingcall), offset);
	semGive(callSem);
	return flag;
}

int recordAllCall()
{
	int flag;
	if (!needSetCall)
		return OK;

	printf("write call info to flash!\n");

	flag = recordIncomingCall();
	flag = recordNoanswercall() && flag;
	flag = recordOutgoingcall() && flag;

	semTake(callSem, WAIT_FOREVER);
	needSetCall = 0;
	semGive(callSem);

	printf("write OK!\n");

	return flag;
}

int deleteCall(int flag, int index, int maxCallSize)
{
	int i;
	struct s_callrecord* callList;

	if (index >= maxCallSize || index < 0)
	{
		printf("index = %d error ! return ...\n", index);
		return ERROR;
	}
	if (flag == 1)
		callList = incomingcall;
	else if (flag == 2)
		callList = outgoingcall;
	else if (flag == 3)
		callList = noanswercall;
	else
	{
		printf("flag = %d error ! return ...\n", flag);
		return ERROR;
	}

	semTake(callSem, WAIT_FOREVER);
	for ( i = index; i < maxCallSize-1; ++i )
	{
		memcpy(&callList[i], &callList[i+1], sizeof(struct s_callrecord));
	}
	callList[maxCallSize-1].number[0] = '\0';
	callList[maxCallSize-1].time = 0;
	needSetCall = 1;
	semGive(callSem);

	return OK;
}
int deletAllCall(int flag)
{
	semTake(callSem, WAIT_FOREVER);

	if (flag == 1)
	{
		memset(&incomingcall, 0, sizeof(incomingcall));
		needSetCall = 1;
	}	
	else if (flag == 2)
	{
		memset(&outgoingcall, 0, sizeof(outgoingcall));
		needSetCall = 1;
	}
	else if (flag == 3)
	{
		memset(&noanswercall, 0, sizeof(noanswercall));
		needSetCall = 1;
	}
	else if (flag == 0)
	{
		memset(&incomingcall, 0, sizeof(incomingcall));
		memset(&outgoingcall, 0, sizeof(outgoingcall));
		memset(&noanswercall, 0, sizeof(noanswercall));
		needSetCall = 1;
	}
	else
	{
		printf("flag = %d error, return ...\n", flag);
	}
	semGive(callSem);

	return OK;
}
/**
 * 保存已接来电
 * 参数:	char *number:	已接来电的号码或IP地址
 * 返回值:	int:			执行是否成功,OK or Error
 */
int AppRecordIncomingCall(char * number)
{
       int i = 0;
	int end;		/* 数组末尾位置 */

	
	time_t currentTime = 0;	/* 当前时间 */
	struct timespec tp;

	semTake(callSem, WAIT_FOREVER);
	
	if (clock_gettime(CLOCK_REALTIME, &tp) == OK)
	{
		currentTime = tp.tv_sec;
	}
		
	for (end = MAX_CALL_RECORD - 1; (incomingcall[end].time == 0) && (end>=0); --end)
		;
	
	/* 将数组中已有的元素后移 */
	
	if ((end < MAX_CALL_RECORD - 1) && (end >= 0))
	{
		for (i = end; i>=0; --i)
			incomingcall[i+1] = incomingcall[i];
	}
	/* 数组已满 */
	else if (end == MAX_CALL_RECORD - 1)
	{
		for (i = end; i>0; --i)
			incomingcall[i] = incomingcall[i-1];
	}

	if (number == NULL || number[0] == 0)
	{
		incomingcall[0].number[0] = 0;
	}
	else
	{
		if (number[0] == '0' + 10)
			number[0] = '*';
		strncpy(incomingcall[0].number, number, MAX_PHONE_NUMBER_LEN);
		incomingcall[0].number[MAX_PHONE_NUMBER_LEN] = '\0';
	}
	incomingcall[0].time = currentTime;

	needSetCall = 1;
	semGive(callSem);
	
	return OK;
}

/**
 * 保存未接来电
 * 参数:	char *number:	未接来电的号码或IP地址
 * 返回值:	int:			执行是否成功,OK or Error
 */
int AppRecordNoAnswerCall(char * number)
{
       int i;
	int end;		/* 数组末尾位置 */

	
	time_t currentTime = 0;	/* 当前时间 */
	struct timespec tp;

	semTake(callSem, WAIT_FOREVER);

	if (clock_gettime(CLOCK_REALTIME, &tp) == OK)
	{
		currentTime = tp.tv_sec;
	}
	
	for (end = MAX_CALL_RECORD - 1; (noanswercall[end].time == 0) && (end>=0); --end)
		;
	
	/* 将数组中已有的元素后移 */
	
	if ((end < MAX_CALL_RECORD - 1) && (end >= 0))
	{
		for (i=end; i>=0; --i)
			noanswercall[i+1] = noanswercall[i];
	}
	/* 数组已满 */
	else if (end == MAX_CALL_RECORD - 1)
	{
		for (i=end; i>0; --i)
			noanswercall[i] = noanswercall[i-1];
	}

	if (number == NULL || number[0] == 0)
	{
		noanswercall[0].number[0] = 0;
	}
	else
	{
		if (number[0] == '0' + 10)
			number[0] = '*';		
		strncpy(noanswercall[0].number, number, MAX_PHONE_NUMBER_LEN);
		noanswercall[0].number[MAX_PHONE_NUMBER_LEN] = '\0';
	}
	noanswercall[0].time = currentTime;

	needSetCall = 1;
	semGive(callSem);

	return OK;
}

/**
 * 保存拨出号码
 * 参数:	char *number:	已拨出的号码或IP地址
 * 返回值:	int:			执行是否成功,OK or Error
 */
int AppRecordOutgoingCall(char * number)
{
       int i;
	int end;		/* 数组末尾位置 */

	time_t currentTime = 0;	/* 当前时间 */
	struct timespec tp;

	semTake(callSem, WAIT_FOREVER);

	if (clock_gettime(CLOCK_REALTIME, &tp) == OK)
	{
		currentTime = tp.tv_sec;
	}

	for (end = MAX_CALL_RECORD - 1; (outgoingcall[end].time == 0) && (end>=0); --end)
		;
	
	/* 将数组中已有的元素后移 */
	
	if ((end < MAX_CALL_RECORD - 1) && (end >= 0))
	{
		for (i=end; i>=0; --i)
			outgoingcall[i+1] = outgoingcall[i];
	}
	/* 数组已满 */
	else if (end == MAX_CALL_RECORD - 1)
	{
		for (i=end; i>0; --i)
			outgoingcall[i] = outgoingcall[i-1];
	}

	if (number == NULL || number[0] == 0)
	{
		outgoingcall[0].number[0] = 0;
	}
	else
	{
		if (number[0] == '0' + 10)
			number[0] = '*';
		strncpy(outgoingcall[0].number, number, MAX_PHONE_NUMBER_LEN);
		outgoingcall[0].number[MAX_PHONE_NUMBER_LEN] = '\0';
	}
	outgoingcall[0].time = currentTime;

	needSetCall = 1;
	semGive(callSem);

	return OK;
}

#ifndef HC
int convertType(int eType)
{
    int temp = eType;
    if (local_off_hook_event == eType)
    {
        handset_up = TRUE;
        temp = local_off_hook_event;
    }
    if (local_on_hook_event == eType)
    {
        handset_up = FALSE;
        if (on_speakerphone == FALSE)
        {
            temp = local_on_hook_event;
        }
        else
        {
            temp = local_off_hook_event;
        }
    }
    if (speaker_event == eType)
    {
#ifndef HC
        on_speakerphone = (on_speakerphone + 1) & 1;
#endif
	 if (!handset_up && !on_speakerphone)
        {
            temp = local_on_hook_event;
        }
        else
        {
            temp = local_off_hook_event;
        }
    }

    return temp;
}
#endif

int ConvertChar2CharNum(char* ipAddr, char* digit_set)
{
    int i = 1; 
    char iptemp[4];
    while (digit_set[i] != '\0')
    {
        if (digit_set[i] < '0' || digit_set[i] > '9')
		return -1;
        i++;
    }
    
    iptemp[3] = (digit_set[10]-'0')*100+(digit_set[11]-'0')*10+(digit_set[12]-'0');
    iptemp[2] = (digit_set[7]-'0')*100+(digit_set[8]-'0')*10+(digit_set[9]-'0');
    iptemp[1] = (digit_set[4]-'0')*100+(digit_set[5]-'0')*10+(digit_set[6]-'0');
    iptemp[0] = (digit_set[1]-'0')*100+(digit_set[2]-'0')*10+(digit_set[3]-'0');
    sprintf(ipAddr, "%u.%u.%u.%u", iptemp[0], iptemp[1], iptemp[2], iptemp[3]);

    return 0;
}

int ConvertChar2Int(char * ipAddr, unsigned int* num)
{
unsigned char ip[4] = {0,0,0,0};
int i;
	if (ipAddr == NULL || strlen(ipAddr) < 13 || ipAddr[0] != '*')
	{
		printf("string \"%s\" not valid!\n", ipAddr);
		return -1;
	}

	for (i = 1; i < 13; i++)
	{
		ip[(i-1)/3] = (ipAddr[i] - '0') + ip[(i-1)/3] * 10;
	}

	*num = 0;
	for (i = 0; i < 4; i++)
	{
		printf("ip[%i]=%x!\n", i , ip[i]);
			*num = (*num << 8) + ip[i];
		/*printf("num=%x!\n", *num);*/
	}

	return 0;
}

void ConvertInt2CharNum(char* ipAddr,  unsigned int num, int flag)
{
    unsigned char  ip[4];
    ip[0] = num >> 24;
    ip[1] = (num >> 16) & 0xFF;
       ip[2] = (num >> 8) & 0xFF;
    ip[3] = num & 0xFF;

    if (1 == flag)
    {
        /*ip addr is "*192168123001"*/
        sprintf(ipAddr, "*%03u%03u%03u%03u", ip[0], ip[1], ip[2], ip[3]);
    }
    else if (2 == flag)
    {
        /*ip addr is 192.168.123.1*/
        sprintf(ipAddr, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
    }
    else if (3 == flag)
    {
        /*ip addr is char[4]*/
        ipAddr[0] = ip[0];
        ipAddr[1] = ip[1];
        ipAddr[2] = ip[2];
        ipAddr[3] = ip[3];
    }
}

#ifndef HC
void LcdLowerShowString(char * msg)
{
    if (!(*menu_inuse))
    {
        ClearLcd();
        LcdShowString(msg);
    }
}
#endif

void LcdLowerShow(char* msg1, char* msg2)
{
    char str1[12];
    if(NULL == msg1)
        str1[0] = '\0';
    else
    {
        strncpy(str1,msg1,11);
        str1[11] = '\0';
    }

    if (!(*menu_inuse))
    {
        if (msg1)
        {
            ClearLcd();
        }
        WriteLcd( /*msg1*/str1, 0, 0 );
        WriteLcd( msg2, 1, 0 );
    }
}
#if 0
#ifndef HC
void LcdShowDialNum(char* msg)
{
    int iSize = sizeof(msg);
    ClearLcd();
    
    if (iSize > LCD_WIDTH)
    {
        WriteLcd(&msg[iSize - LCD_WIDTH], 1, 0);
    }
    else
    {
        WriteLcd(msg, 1, LCD_WIDTH - iSize);
    }
}
#endif
#endif
#if 0
void showTime(int val, int verify, int length, int location)
{
	static char format[4] = "%02u";

⌨️ 快捷键说明

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