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

📄 c_manage.c

📁 这是电信语音聊天设备的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	unsigned char xdata temp,i;
	temp = ask_private(user_num);
	if(temp != IDLE)//在线找到合意的聊友
	{
		i = assign_private_num(temp);//分配聊天室中用户的号码
		chat_private_resource[temp].user_num[i] = user_num;//置此聊天号对应的用户
		user_e1[user_num].user_num = i;//置此用户在聊天室中对应的号码
		user_e1[user_num].chat_num = temp;//置此用户对应的聊天室号
		chat_private_resource[temp].user_count++;//此聊天室人数加1	
		//往后台回应用户状态
		command(7,1,user_e1[user_num].user_sex,user_e1[user_num].user_age,user_e1[user_num].opp_sex,user_e1[user_num].opp_age,0,temp,user_e1[user_num].telephone[0],user_e1[user_num].telephone[1],user_e1[user_num].telephone[2],user_e1[user_num].telephone[3],user_e1[user_num].telephone[4],user_e1[user_num].telephone[5],IDLE,IDLE);
		return(temp);	
	}
	else//在线没有合意的聊友
	{
		return(chat_private_req(user_num));
	}
}

chat_private_release(unsigned char chat_num)//释放私人聊天室资源
{
	unsigned char temp;
	chat_private_count++;
	//往后台回应聊天室状态
	command(6,1,1,chat_num,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
	chat_private_resource[chat_num].flag = LEISURE;
	chat_private_resource[chat_num].user_count = 0;
	for(temp = 0;temp < 2;temp++)
	{
		chat_private_resource[chat_num].user_num[temp] = IDLE;
	}
}

reduce_user_private(unsigned char chat_num,unsigned char user_num)//用户从此聊天室中退出
{
	//往后台回应用户状态
	command(7,1,user_e1[user_num].user_sex,user_e1[user_num].user_age,user_e1[user_num].opp_sex,user_e1[user_num].opp_age,1,chat_num,user_e1[user_num].telephone[0],user_e1[user_num].telephone[1],user_e1[user_num].telephone[2],user_e1[user_num].telephone[3],user_e1[user_num].telephone[4],user_e1[user_num].telephone[5],IDLE,IDLE);
	if(chat_private_resource[chat_num].user_count < 2)//此聊天室此刻是否只剩一人
	{
		chat_private_release(chat_num);//是则释放此聊天室资源
	}
	else//不止一人
	{
		chat_private_resource[chat_num].user_num[user_e1[user_num].user_num] = IDLE;//将此用户从此聊天室中删除
		chat_private_resource[chat_num].user_count--;//聊天室人数减1
	}
}

unsigned char add_user(unsigned char user_num,unsigned char password[6],unsigned char chat_type)//公共聊天室加入会员
{
	unsigned char xdata temp;
	if(chat_type < 9)
	{
		temp = add_user_common(user_num,password,chat_type);
	}
	else
	{
		temp = add_user_private(user_num);
	}
	return(temp);
}

reduce_user(unsigned char chat_num,unsigned char user_num)//用户从此聊天室中退出
{
	if(chat_num < 0x80)
	{
		reduce_user_private(chat_num,user_num);
	}
	else
	{
		chat_num = chat_num - 0x80;
		reduce_user_common(chat_num,user_num);
	}
}

unsigned ask_online_private(unsigned char chat_type,unsigned char user_num)//在线私聊寻找
{
	unsigned char xdata temp;
	for(temp = 0;temp < TRK_MAX;temp++)
	{
		if(temp != user_num)
		{
			if(user_e1[temp].first_select == 0x80)
			{
				if(user_e1[temp].chat_type != 0x80)
				{
					return(temp);
				}
			}
		}
	}
	return(IDLE);	
}

unsigned char ask_online_common(unsigned char user_num,unsigned char password[6],unsigned char chat_type)//在线公聊寻找
{
	unsigned char xdata temp,i;
	if(chat_type == 8)
	{
		for(temp = 0;temp < TRK_MAX;temp++)
		{
			if(temp != IDLE)
			{
				if(user_e1[temp].first_select == chat_type)
				{
					if(user_e1[temp].chat_type != chat_type)
					{
						for(i = 0;i< 6;i++)
						{
							if(user_e1[user_num].password[i] != user_e1[temp].password[i])
							{
								return(IDLE);
							}
						}
						return(temp);
					}
				}
			}
		}
	}
	else
	{
		for(temp = 0;temp < TRK_MAX;temp++)
		{
			if(temp != user_num)
			{
				if(user_e1[temp].first_select == chat_type)
				{
					if(user_e1[temp].chat_type != chat_type)
					{
						return(temp);
					}
				}
			}
		}
	}
	return(IDLE);	
}

unsigned char ask_online(unsigned char user_num,unsigned char password[6],unsigned char chat_type)//寻找在线的聊友(第一选择没人而转到其他聊天室的人)
{
	unsigned char xdata temp;
	if(chat_type < 9)
	{
		temp = ask_online_common(user_num,password,chat_type);
	}
	else
	{
		temp = ask_online_private(chat_type,user_num);
	}
	return(temp);
}

unsigned char search_user_common(unsigned char chat_num,unsigned char user_num)//公共聊天室寻找
{
	unsigned char xdata i;
	for(i = 0;i < 16;i++)
	{
		if(chat_common_resource[chat_num].user_num[i] != IDLE)
		{
			if(chat_common_resource[chat_num].user_num[i] != user_num)
			{	
				return(chat_common_resource[chat_num].user_num[i]);
			}
		}
	}
	return(IDLE);
}

unsigned char search_user_private(unsigned char chat_num,unsigned char user_num)//私人聊天室寻找
{
	unsigned char xdata i;
	for(i = 0;i < 2;i++)
	{
		if(chat_private_resource[chat_num].user_num[i] != IDLE)
		{
			if(chat_private_resource[chat_num].user_num[i] != user_num)
			{
				return(chat_private_resource[chat_num].user_num[i]);
			}
		}
	}
	return(IDLE);
}

unsigned char search_user(unsigned char chat_num,unsigned char user_num)//寻找某聊天室剩下的最后一人
{
	unsigned char xdata temp;
	if(chat_num > 0x7f)
	{
		temp = search_user_common(chat_num - 0x80,user_num);
	}
	else
	{
		temp = search_user_private(chat_num,user_num);
	}
	return(temp);
}

void clear_DS21554(void)//DS21554寄存器清零
{
	unsigned char xdata i,j;
    for(i = 0;i < 0xc0;i++)
    {
    	for(j = 0;j < 4;j++)
    	{
    		XBYTE[DS21554_ADDR[j] + i] = 0;
    	}
	}
}

init_DS21554()//初始化DS21554
{
	unsigned char xdata i,j;
	for(j = 0;j < 4;j++)
	{
		XBYTE[DS21554_ADDR[j] + RCR1] = 0x60;
		XBYTE[DS21554_ADDR[j] + RCR2] = 0xfe;
		XBYTE[DS21554_ADDR[j] + TCR1] = 0x2b;
		XBYTE[DS21554_ADDR[j] + TCR2] = 0xf8;
		XBYTE[DS21554_ADDR[j] + CCR1] = 0x44;
		XBYTE[DS21554_ADDR[j] + LICR] = 0x04;
		XBYTE[DS21554_ADDR[j] + TEST3] = 0x10;
		XBYTE[DS21554_ADDR[j] + CCR2] = 0;
		XBYTE[DS21554_ADDR[j] + CCR3] = 0xc2;
		XBYTE[DS21554_ADDR[j] + TCBR1] = IDLE;
		XBYTE[DS21554_ADDR[j] + TCBR2] = IDLE;
		XBYTE[DS21554_ADDR[j] + TCBR3] = IDLE;
		XBYTE[DS21554_ADDR[j] + TCBR4] = IDLE;
		XBYTE[DS21554_ADDR[j] + TAF] = 0x9b;
		XBYTE[DS21554_ADDR[j] + TNAF] = 0xdf;
		XBYTE[DS21554_ADDR[j] + TS1] = 0x0b;
		for(i = 1;i < 16;i++)
		{
			XBYTE[DS21554_ADDR[j] + TS1 + i] = 0xbb;
		}
	}
	delay_time(200);
	for(j = 0;j < 4;j++)
	{
		XBYTE[DS21554_ADDR[j] + RCR1] = 0x61;
		XBYTE[DS21554_ADDR[j] + CCR5] = 0xf0;
		XBYTE[DS21554_ADDR[j] + CCR6] = 0x03;
	}
}

user_release(unsigned char user_num)//数字中继用户释放
{
	unsigned char xdata temp;
	user_e1[user_num].mfc = IDLE;
	user_e1[user_num].dtmf = IDLE;
	user_e1[user_num].opp_num = IDLE;
	user_e1[user_num].wait = 0;
	user_e1[user_num].false = 0;
	user_e1[user_num].backward_signal = RSD_IDLE;//闭塞、主叫挂机
	user_e1[user_num].forward_signal = 0xbb;
	user_e1[user_num].flag = LEISURE;
	user_e1[user_num].back_flag = 0;
	user_e1[user_num].user_age = IDLE;
	user_e1[user_num].opp_age = IDLE;
	user_e1[user_num].user_sex = MAN;
	user_e1[user_num].opp_sex = WOMAN;
	for(temp = 0;temp < 32;temp++)
	{
		user_e1[user_num].telephone[temp] = IDLE;
	}
	for(temp = 0;temp < 6;temp++)
	{
		user_e1[user_num].password[temp] = IDLE;
		user_e1[user_num].number_chat[temp] = IDLE;
	}
	user_e1[user_num].first_select = IDLE;
	user_e1[user_num].user_index = 0;
	user_e1[user_num].a6_flag = 0;
	user_e1[user_num].kd = 0;
	user_e1[user_num].lc_state = 0;
	user_e1[user_num].mfc_state = IDLE;
	user_e1[user_num].user_state = IDLE;
	user_e1[user_num].sub_status = IDLE;
	user_e1[user_num].mfc_count = 0;
	user_e1[user_num].delay = 0;
	user_e1[user_num].chat_num = IDLE;
	user_e1[user_num].chat_type = IDLE;
	user_e1[user_num].user_mix = IDLE;
	user_e1[user_num].user_num = IDLE;
	user_e1[user_num].yukong_num = IDLE;
}

mfc_init()//MFC变量初始化
{
	unsigned char i,j;
	mfc_count = 2;
	mfc_test_num = IDLE;
	for(i = 0;i < 2;i++)
	{
		chat_mfc_resource[i].flag = LEISURE;
		for(j = 0;j < 2;j++)
		{
			chat_mfc_resource[i].buf[j] = IDLE;
		}
		chat_mfc_resource[i].buf_p = 0;
		chat_mfc_resource[i].addr = MFC_READ_ADDR + i;
		chat_mfc_resource[i].slot = 0xc0 + i * 2;
		chat_mfc_resource[i].delay = 0;
		chat_mfc_resource[i].user = IDLE;
	}
}

i_mfc()//MFC通道初始化
{
	unsigned char temp;
	temp = 1;
	while(temp)
	{
    	if(((MFC_W_R >> 4) & 0x01) != 0x01)
    	{
           	XBYTE[chat_mfc_resource[0].addr] = 0x31;
           	temp = 0;
       	}
    }
   	temp = 1;
	while(temp)
	{
    	if(((MFC_W_R >> 4) & 0x01) != 0x01)
    	{
           	XBYTE[chat_mfc_resource[0].addr] = 0x60;
           	temp = 0;
        }
    }
   	temp = 1;
   	while(temp)
   	{
       	if(((MFC_W_R >> 5) & 0x01) != 0x01)
       	{
           	temp = XBYTE[chat_mfc_resource[0].addr];
           	temp = 0;
       	}
   	}
   	temp = 1;
	while(temp)
	{
    	if(((MFC_W_R >> 6) & 0x01) != 0x01)
    	{
           	XBYTE[chat_mfc_resource[0].addr] = 0x30;
           	temp = 0;
       	}
    }
   	temp = 1;
	while(temp)
	{
    	if(((MFC_W_R >> 6) & 0x01) != 0x01)
    	{
           	XBYTE[chat_mfc_resource[0].addr] = 0x61;
           	temp = 0;
        }
    }
   	temp = 1;
   	while(temp)
   	{
       	if(((MFC_W_R >> 7) & 0x01) != 0x01)
       	{
           	temp = XBYTE[chat_mfc_resource[0].addr];
           	temp = 0;
       	}
   	}
}

unsigned char mfc_req(unsigned char trk_num,unsigned char send_type)//请求MFC通道
{
	unsigned char xdata i,j,temp;
	if(send_type == CALL_OUT)//呼出,考虑到只有两路资源,只有在两路都空闲时才能呼出
	{
		if(mfc_count != 2 )//两路都空闲
		{
			return(IDLE);
		}
		else
		{
			for(i = 0; i < 2; i++)
			{
				if(chat_mfc_resource[i].flag == LEISURE)//本路空闲
				{
					mfc_count--;
					command(8,0,mfc_count,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
					chat_mfc_resource[i].flag = OCCUPY;//置占用标志
					for(j = 0;j < 2;j++)
					{
						chat_mfc_resource[i].buf[j] = IDLE;
					}
					chat_mfc_resource[i].buf_p = 0;
					chat_mfc_resource[i].user = trk_num;
					user_e1[trk_num].mfc = i;//置数字中继用户对应的MFC通道号
					temp = 1;
                    while(temp) 
               		{
               			if(((MFC_W_R >> (2 * i + 4)) & 0x01) != 0x01)
               			{
                   			XBYTE[chat_mfc_resource[i].addr] = 0x3d;//设置为发前项,收后项
                   			temp = 0;
                   		}
                    }
					connect(trk_num,chat_mfc_resource[i].slot);//连接相应时隙
					connect(chat_mfc_resource[i].slot,trk_num);//连接相应时隙
					return(i);
				}
			}
		}
	}
	else//呼入
	{
		if(mfc_count == 0)//没有空闲资源
		{
			return(IDLE);
		}
		else//至少还有一路
		{
			for(i = 0; i < 2; i++)
			{
				if(chat_mfc_resource[i].flag == LEISURE)//本路空闲
				{
					mfc_count--;//剩余通道数减1
					command(8,0,mfc_count,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
					chat_mfc_resource[i].flag = OCCUPY;//置占用标志
					for(j = 0;j < 2;j++)
					{
						chat_mfc_resource[i].buf[j] = IDLE;
					}
					chat_mfc_resource[i].buf_p = 0;
					chat_mfc_resource[i].user = trk_num;

⌨️ 快捷键说明

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