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

📄 c_trkin.c

📁 这是电信语音聊天设备的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*******主要完成数字中继的呼入处理和用户选择处理*********//* 老聊友回呼:1、修改命令字 2、两个成员的加入私聊的问题 */

#pragma CODE DEBUG SYMBOLS OBJECTEXTEND
#include <reg51.h>
#include <absacc.h>
#include "Const.h"
#include "Extern.h"

extern unsigned char mfc_req(unsigned char trk_num,unsigned char send_type);//请求MFC通道
extern mfc_release(unsigned char mfc_num);//释放MFC通道

extern unsigned char dtmf_req(unsigned char trk_num,unsigned char type);//请求DTMF通道
extern dtmf_release(unsigned char dtmf_num);//释放DTMF通道

extern command(unsigned char x,unsigned char y,unsigned char z,unsigned char i,unsigned char j,unsigned char k,unsigned char l,unsigned char m,
			   unsigned char n,unsigned char o,unsigned char p,unsigned char q,unsigned char r,unsigned char s,unsigned char t,unsigned char u);

extern connect(unsigned char i_slot,unsigned char o_slot);//用于连接两个时隙
extern no_sound(unsigned char para1);//无音处理
extern sig_req(unsigned char para1, unsigned char para2);//发送线路信令

extern user_release(unsigned char user_num);//释放呼出资源

extern audio_play(unsigned char audio_num,unsigned char duan_num);//放音程序
extern audio_stop(unsigned char audio_num);//停止目前操作

extern delay_time(unsigned int subtime);//延时程序

extern unsigned char add_user(unsigned char user_num,unsigned char password[6],unsigned char chat_type);//公共聊天室加入会员
extern reduce_user(unsigned char chat_num,unsigned char user_num);//用户从此聊天室中退出
extern unsigned char ask_online(unsigned char user_num,unsigned char password[6],unsigned char chat_type);//公共聊天室加入会员
extern unsigned search_user(unsigned char chat_num,unsigned char user_num);

extern unsigned char call_out_req(unsigned char user_num);//申请呼出资源

extern unsigned char back_search(unsigned char phone[6],unsigned char type);//判断用户是否为普通回呼用户
extern unsigned char number_release(unsigned char phone[6],unsigned char type);//判断用户是否为老聊友回呼用户
extern back_index(unsigned char user_num);//激活回呼用户

extern audio_control(unsigned char yukong_num,unsigned char chat_num);//语音控制
extern yukong_release(unsigned char yukong_num);//语控资源释放

void send_mfc_in(unsigned char mfc_num,unsigned char mfc_data)//MFC发送芯片操作 mfc_data:要发送的数据 mfc_number:发送通道号
{
	unsigned char xdata temp;
	temp = 1;
	while(temp)
	{
    	if(((MFC_W_R >> (2 * mfc_num + 4)) & 0x01) != 0x01)//判断此通道是否可写
    	{
            XBYTE[chat_mfc_resource[mfc_num].addr] = 0x3c;//设置为发后项,收前项
            temp = 0;
        }
    }   
    delay_time(1000);
    temp = 1;
    mfc_data = (mfc_data & 0x0f);
	while(temp)
	{
    	if(((MFC_W_R >> (2 * mfc_num + 4)) & 0x01) != 0x01)//判断此通道是否可写
    	{
            XBYTE[chat_mfc_resource[mfc_num].addr] = 0x80 + mfc_data;//发送要发的数据
            temp = 0;
        }
    }
}

void error_chuli(unsigned char user_num)//输入错误处理
{
	audio_play(user_e1[user_num].dtmf,ERROR_DUAN);//放选择错误提示音
	audio_dtmf_resource[user_e1[user_num].dtmf].index = 0;//放完了,将指针置为0
	audio_dtmf_resource[user_e1[user_num].dtmf].time = 0;//清空时间间隔
	audio_dtmf_resource[user_e1[user_num].dtmf].count = 0;//本段音播放次数加1
}

void clr_duan(unsigned char user_num)//清空放音
{
	unsigned char xdata trk_j;
	for(trk_j = 0;trk_j < 8;trk_j++)//清播放音
	{
		audio_dtmf_resource[user_e1[user_num].dtmf].num[trk_j] = IDLE;
	}
	audio_dtmf_resource[user_e1[user_num].dtmf].length = 0;//清空长度
	audio_dtmf_resource[user_e1[user_num].dtmf].count = 0;//清播放次数
	audio_dtmf_resource[user_e1[user_num].dtmf].index = 0;//清空段索引
}

void play_one(unsigned char user_num,unsigned char duan)//播放单段音
{
	audio_dtmf_resource[user_e1[user_num].dtmf].num[0] = duan;//通知聊天室中的人X号到了
	audio_dtmf_resource[user_e1[user_num].dtmf].index = 0;//清空段索引
	audio_dtmf_resource[user_e1[user_num].dtmf].length = 1;//置段长度
	audio_play(user_e1[user_num].dtmf,audio_dtmf_resource[user_e1[user_num].dtmf].num[audio_dtmf_resource[user_e1[user_num].dtmf].index]);
	//放提示音
	audio_dtmf_resource[user_e1[user_num].dtmf].index++;//提示音索引号加1
}

void only_one(unsigned char user_num)//聊天室中只剩下一个人时处理
{
	unsigned char xdata trk_j;
	trk_j = IDLE;
	if(user_e1[user_num].chat_num > 0x7f)//用户进入的是公共聊天室
	{
		if(chat_common_resource[user_e1[user_num].chat_num - 0x80].user_count == 2)//此聊天室仅剩一人
		{
			trk_j = search_user(user_e1[user_num].chat_num,user_num);//找到此人,问他是否想要转到其他聊天室
		}
	}
	else//用户进入的是私人聊天室
	{
		if(chat_private_resource[user_e1[user_num].chat_num].user_count == 2)//此聊天室仅剩一人
		{
			trk_j = search_user(user_e1[user_num].chat_num,user_num);//找到此人,问他是否想要转到其他聊天室
		}
	}
	if(trk_j != IDLE)//仅剩一人
	{
		if(dtmf_req(trk_j,IDLE) != IDLE)//申请DTMF资源
		{
			user_e1[trk_j].lc_state = WAIT_DOWN;//准备接收用户选择
			user_e1[trk_j].user_state = WAIT_COMMON;//等待用户选择
			clr_duan(user_e1[trk_j].dtmf);
			audio_dtmf_resource[user_e1[trk_j].dtmf].auto_flag = OCCUPY;//允许自动放音
			play_one(trk_j,ONLY_ONE_DUAN);
			connect(audio_dtmf_resource[user_e1[trk_j].dtmf].slot,trk_j);//连接相应时隙
			connect(trk_j,audio_dtmf_resource[user_e1[trk_j].dtmf].slot);//连接相应时隙
		}
	}
}

void first_chuli(unsigned char user_num,unsigned char user_select,unsigned char type)//用户第一选择流程
{
	switch(user_select)//用户的按键
	{
		case 1://选择进入情感交友聊天室
		{
			if(type == 0)//正常的呼入拥护
			{
				audio_stop(user_e1[user_num].dtmf);//停止当前操作
				clr_duan(user_num);
				play_one(user_num,FEELING_DUAN);
				user_e1[user_num].user_state = SELECT_TYPE;//转到聊天室人数判断
			}
			else//回呼用户
			{
				if(user_e1[user_num].first_select == IDLE)
				{
					user_e1[user_num].first_select = COMMON_FEELING;
				}
				audio_stop(user_e1[user_num].dtmf);//停止当前操作
				audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
				clr_duan(user_num);
				play_one(user_num,FEELING_COMMON);
				user_e1[user_num].chat_type = COMMON_FEELING;
				user_e1[user_num].user_state = JUDGE_USER;//转到聊天室人数判断
			}
		}
		break;
		case 2://选择进入新闻聊天室
		{
			if(user_e1[user_num].first_select == IDLE)
			{
				user_e1[user_num].first_select = NEWS;
			}
			audio_stop(user_e1[user_num].dtmf);//停止当前操作
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
			clr_duan(user_num);
		    play_one(user_num,NEWS_DUAN);
			user_e1[user_num].user_state = JUDGE_USER;//转到聊天室人数判断
			user_e1[user_num].chat_type = NEWS;//置用户的聊天室种类
		}
		break;
		case 3://选择进入足球聊天室
		{	
			if(user_e1[user_num].first_select == IDLE)
			{
				user_e1[user_num].first_select = FOOTBALL;
			}
			audio_stop(user_e1[user_num].dtmf);//停止当前操作
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
			clr_duan(user_num);
			play_one(user_num,FOOTBALL_DUAN);
			user_e1[user_num].user_state = JUDGE_USER;//转到聊天室人数判断
			user_e1[user_num].chat_type = FOOTBALL;//置用户的聊天室种类
		}	
		break;
		case 4://选择进入股票聊天室
		{
			if(user_e1[user_num].first_select == IDLE)
			{
				user_e1[user_num].first_select = STOCK;	
			}
			audio_stop(user_e1[user_num].dtmf);//停止当前操作
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
			clr_duan(user_num);
			play_one(user_num,STOCK_DUAN);
			user_e1[user_num].user_state = JUDGE_USER;//转到聊天室人数判断
			user_e1[user_num].chat_type = STOCK;//置用户的聊天室种类
		}
		break;
		case 5://选择进入彩票聊天室
		{
			if(user_e1[user_num].first_select == IDLE)
			{
				user_e1[user_num].first_select = LOTTERY;
			}
			audio_stop(user_e1[user_num].dtmf);//停止当前操作
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
			clr_duan(user_num);
			play_one(user_num,LOTTERY_DUAN);
			user_e1[user_num].user_state = JUDGE_USER;//转到聊天室人数判断
			user_e1[user_num].chat_type = LOTTERY;//置用户的聊天室种类
		}
		break;
		case 6://选择进入英语聊天室
		{
			if(user_e1[user_num].first_select == IDLE)
			{
				user_e1[user_num].first_select = ENGLISH;	
			}
			audio_stop(user_e1[user_num].dtmf);//停止当前操作
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
			clr_duan(user_num);
			play_one(user_num,ENGLISH_DUAN);
			user_e1[user_num].user_state = JUDGE_USER;//转到聊天室人数判断
			user_e1[user_num].chat_type = ENGLISH;//置用户的聊天室种类
		}
		break;
		case 7://选择进入热门话题聊天室
		{
			if(user_e1[user_num].first_select == IDLE)
			{
				user_e1[user_num].first_select = HOT_MATTER;
			}
			audio_stop(user_e1[user_num].dtmf);//停止当前操作
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
			clr_duan(user_num);
			play_one(user_num,HOT_MATTER_DUAN);
			user_e1[user_num].user_state = JUDGE_USER;//转到聊天室人数判断
			user_e1[user_num].chat_type = HOT_MATTER;//置用户的聊天室种类
		}
		break;
		case 8://选择进入密码聊天室
		{
			if(type == 0)//正常呼入的用户
			{
				if(user_e1[user_num].first_select == IDLE)
				{
					user_e1[user_num].first_select = PASSWORD;
				}
				audio_stop(user_e1[user_num].dtmf);//停止当前操作
				clr_duan(user_num);
				play_one(user_num,PASSWORD_DUAN);
				user_e1[user_num].user_state = WAIT_PASSWORD;//等待用户输入密码
				user_e1[user_num].chat_type = PASSWORD;//置用户的聊天室种类
				user_e1[user_num].user_index = 0;
			}
			else//回呼用户
			{
				if(user_e1[user_num].first_select == IDLE)
				{
					user_e1[user_num].first_select = PASSWORD;
				}
				audio_stop(user_e1[user_num].dtmf);//停止当前操作
				clr_duan(user_num);
				audio_dtmf_resource[user_e1[user_num].dtmf].count = 1;	 
				user_e1[user_num].user_state = JUDGE_USER;//等待用户输入密码
				user_e1[user_num].chat_type = PASSWORD;//置用户的聊天室种类
			}
		}
		break;
		case 9://选择进入个人资料修改查询
		{
			audio_stop(user_e1[user_num].dtmf);//停止当前操作
			clr_duan(user_num);
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
			command(5,0,user_num,0,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,IDLE,IDLE,IDLE,IDLE);
			user_e1[user_num].wait = 1;
			user_e1[user_num].user_state = IDLE;
		}
		break;
		case 0x80://回呼用户(选择私聊)
		{
			if(user_e1[user_num].first_select == IDLE)
			{
				user_e1[user_num].first_select = PRIVATE_FEELING;
			}
			audio_stop(user_e1[user_num].dtmf);//停止当前操作
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = LEISURE;//清自动放音标志
			clr_duan(user_num);
		    audio_dtmf_resource[user_e1[user_num].dtmf].count = 1;
			user_e1[user_num].user_state = JUDGE_USER;//转到聊天室人数判断
			user_e1[user_num].chat_type = PRIVATE_FEELING;//置用户的聊天室种类
		}
		break;
		default:
		{
			error_chuli(user_num);//输入错误
		}
		break;
	}
	audio_dtmf_resource[user_e1[user_num].dtmf].buf = IDLE;//清空用户拨键
}

void back_failure(unsigned char user_num)//回呼的用户:申请回呼的用户已经和别人聊上了
{
	clr_duan(user_num);
	play_one(user_num,OTHER_USER);
	user_e1[user_num].user_state = INFORM_END;
	user_e1[user_num].back_flag = 0;
}

user_select_ctrl(unsigned char user_num,unsigned char user_select)//用户选择流程
{
	unsigned char xdata trk_j,trk_k;
	switch(user_e1[user_num].user_state)
	{
		case SELECT_START://开始处理用户选择
		{
			if(user_select != IDLE)//用户按键了 
			{
				if(user_monitor_num == user_num)//往后台回应监视信息
				{
					command(1,0,user_num,USER_PRESS_SIGNAL,user_select,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
				}
				first_chuli(user_num,user_select,0);
			}		
		}
		break;
		case WAIT_YES://已经注册的用户进入个人资料中心
		{
			play_one(user_num,PRIVATE_CENTER);
			user_e1[user_num].user_state = CHA_SHAN;//转到等待用户选择查询或删除聊天号
			audio_dtmf_resource[user_e1[user_num].dtmf].auto_flag = OCCUPY;

⌨️ 快捷键说明

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