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

📄 c_trkout.c

📁 这是电信语音聊天设备的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	/***********主要完成数字中继的呼出处理和通知用户***********/

#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 dtmf_release(unsigned char dtmf_num);//释放DTMF通道
extern unsigned char dtmf_req(unsigned char trk_num,unsigned char type);//请求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);//停止目前操作

send_mfc_out(unsigned char mfc_num,unsigned char mfc_data)//出中继MFC发送
{
	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] = 0x3d;//设置为发前项,收后项
            temp = 0;
        }
    }   
    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;
        }
    }
}

false_p(unsigned char user_num)//呼叫失败处理子程序
{
	user_e1[user_num].false++;
	dtmf_release(user_e1[user_num].dtmf);//释放DTMF资源
	if((user_e1[user_num].false > 2) || (user_test_num == IDLE))
	{
		user_release(user_num);
	}
	user_e1[user_num].user_index = 0;
	user_e1[user_num].mfc_state = IDLE;
}

out_mfc_line(unsigned char user_num)// 出中继MFC互控处理
{
	unsigned char xdata trk_j,trk_k,temp[8];
	switch(user_e1[user_num].mfc_state)//MFC状态			
	{
		case MFC_START ://开始MFC互控
		{
			if(user_e1[user_num].telephone[0] == 0x0a)//如果第一位为0
			{
				user_e1[user_num].kd = 2;//长途自动呼叫
			}
			else
			{
				if(user_e1[user_num].telephone[1] == 1)//如果第二位为1
				{
					if((user_e1[user_num].telephone[2] == 0x0a) || (user_e1[user_num].telephone[2] == 7))
					{//在第二位为1时,如果第三位为0或7
						user_e1[user_num].kd = 2;//长途自动呼叫
					}
					else
					{
						user_e1[user_num].kd = 3;//市话业务
					}
				}
				else
				{
					user_e1[user_num].kd = 3;//市话业务
				}
			}
			if(user_e1[user_num].telephone[user_e1[user_num].user_index] != IDLE)//第一位号码为正常
			{
				send_mfc_out(user_e1[user_num].mfc,user_e1[user_num].telephone[user_e1[user_num].user_index]);//发送第一位号码
				if((user_monitor_num == user_num) || (user_test_num == user_num))//判断此端口是否为呼出测试端口或监视端口
				{
					//往后台回应监视信息
					command(1,0,user_num,FORWARD_MFC_SIGNAL,user_e1[user_num].telephone[user_e1[user_num].user_index],IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
				}
				user_e1[user_num].mfc_state = WAIT_KA;//转为等待KA信号
				user_e1[user_num].mfc_count = 0;//将MFC读次数置为0
				user_e1[user_num].sub_status = 0;//设置为主控命令
				for(trk_j = 0;trk_j < 2;trk_j++)//清空接收数据 
				{
					chat_mfc_resource[user_e1[user_num].mfc].buf[trk_j] = IDLE;
				}
				chat_mfc_resource[user_e1[user_num].mfc].buf_p = 0;//清空接收指针
				user_e1[user_num].delay = 20;//设置1秒的等待时间
				user_e1[user_num].control = 16;//设置800毫秒控制时间
				user_e1[user_num].user_index++;//号码指针加1
			}
			else//号码异常
			{
				user_e1[user_num].sub_status = 1;//置为受控命令
				user_e1[user_num].mfc_state = WAIT_KA;//转为等待KA信令
				user_e1[user_num].delay = 20;//设置1秒的等待时间
				user_e1[user_num].control = 16;//设置800毫秒控制时间
			}
		}
		break;
		case SEND_NEXT://发送下一位号码
		{
			if((chat_mfc_resource[user_e1[user_num].mfc].buf[0] > 0) && (chat_mfc_resource[user_e1[user_num].mfc].buf[0] < 7))
			{
				if((chat_mfc_resource[user_e1[user_num].mfc].buf[0] == 3) || (user_e1[user_num].mfc_count > 30))// && (user_e1[user_num].mfc_count > 30)
				{
					user_e1[user_num].mfc_state = SEND_KD;//转为发KD信令
					if((user_monitor_num == user_num) || (user_test_num == user_num))//判断此端口是否为呼出测试端口或监视端口
					{
						//往后台回应监视信息
						command(1,0,user_num,BACKWARD_MFC_SIGNAL,chat_mfc_resource[user_e1[user_num].mfc].buf[0],IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
					}
				}
				else
				{
					if((chat_mfc_resource[user_e1[user_num].mfc].buf[0] == 4) || (chat_mfc_resource[user_e1[user_num].mfc].buf[0] == 5))
					{//MFC失败
						user_e1[user_num].mfc_state = MFC_FAILURE;//转到MFC失败处理
						if((user_monitor_num == user_num) || (user_test_num == user_num))//判断此端口是否为呼出测试端口或监视端口
						{
							//往后台回应监视信息
							command(1,0,user_num,BACKWARD_MFC_SIGNAL,chat_mfc_resource[user_e1[user_num].mfc].buf[0],IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
						}
					}
					else
					{
						user_e1[user_num].mfc_count++;//MFC读次数加1
						user_e1[user_num].mfc_state = ABNORMAL_MFC;//转为MFC异常处理
						user_e1[user_num].delay = 3;//设置150毫秒等待时间
					}
				}
			}
			else
			{
				if(user_e1[user_num].telephone[user_e1[user_num].user_index] != IDLE)//号码没有发完
				{
					send_mfc_out(user_e1[user_num].mfc,user_e1[user_num].telephone[user_e1[user_num].user_index]);//发送第一位号码
					if((user_monitor_num == user_num) || (user_test_num == user_num))//判断此端口是否为呼出测试端口或监视端口
					{
						//往后台回应监视信息
						command(1,0,user_num,FORWARD_MFC_SIGNAL,user_e1[user_num].telephone[user_e1[user_num].user_index],IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
					}
					user_e1[user_num].user_index++;//号码指针加1
					user_e1[user_num].mfc_state = WAIT_KA;//转为等待KA信号
					user_e1[user_num].sub_status = 0;//设置为主控命令
					user_e1[user_num].mfc_count = 0;//清空MFC读次数
					for(trk_j = 0;trk_j < 2;trk_j++)//清空接收数据 
					{
						chat_mfc_resource[user_e1[user_num].mfc].buf[trk_j] = IDLE;
					}
					chat_mfc_resource[user_e1[user_num].mfc].buf_p = 0;//清空接收指针
					user_e1[user_num].delay = 20;//设置1秒的等待时间
					user_e1[user_num].control = 16;//设置800毫秒控制时间
				}
				else
				{
					user_e1[user_num].delay--;//等待时间减1
					if(user_e1[user_num].delay == 0)
					{
						user_e1[user_num].delay = 20;//设置1秒等待时间
						user_e1[user_num].control--;//控制时间减1
						if(user_e1[user_num].control == 0)
						{
							user_e1[user_num].mfc_state = MFC_FAILURE;//转到MFC失败处理
						}
					}
				}
			}
		}
		break;
		case WAIT_KA://等待KA信令
		{
			user_e1[user_num].delay--;//等待时间减1
			if(user_e1[user_num].delay == 0)
			{
				user_e1[user_num].delay = 20;//设置1秒等待时间
				user_e1[user_num].control--;//控制时间减1
				if(user_e1[user_num].control == 0)
				{
					user_e1[user_num].mfc_state = MFC_FAILURE;//转到MFC失败处理
				}
			}
			else
			{
				if(user_e1[user_num].sub_status == 0)//如果为主控命令
				{
					if((chat_mfc_resource[user_e1[user_num].mfc].buf[0] > 0) && (chat_mfc_resource[user_e1[user_num].mfc].buf[0] < 7))
					{//判断是否为正常的KA信号
						if((user_monitor_num == user_num) || (user_test_num == user_num))//判断此端口是否为呼出测试端口或监视端口
						{
							//往后台回应监视信息
							command(1,0,user_num,BACKWARD_MFC_SIGNAL,chat_mfc_resource[user_e1[user_num].mfc].buf[0],IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
						}
						send_mfc_out(user_e1[user_num].mfc,0);//发停发信令
						if((user_monitor_num == user_num) || (user_test_num == user_num))//判断此端口是否为呼出测试端口或监视端口
						{
							//往后台回应监视信息
							command(1,0,user_num,FORWARD_MFC_SIGNAL,0,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
						}
						user_e1[user_num].mfc_state = OUT_PAUSE;//转为等待交换机的停发信令
						user_e1[user_num].delay = 250;//设置10秒钟的等待时间
						user_e1[user_num].sub_status = 0;//设置为主控命令
						user_e1[user_num].control = 0;//清空控制时间
					}
					else
					{
						if((user_e1[user_num].mfc_count < 3) && ((chat_mfc_resource[user_e1[user_num].mfc].buf[0] > 0) && (chat_mfc_resource[user_e1[user_num].mfc].buf[0] < 16)))//收到不正常的KA信号
						{
							user_e1[user_num].mfc_count++;//MFC读次数加1
							user_e1[user_num].mfc_state = ABNORMAL_KA;//转到异常KA信号处理
							user_e1[user_num].delay = 1;//设置50毫秒等待时间
						}
					}
				}
				else
				{
					if(user_e1[user_num].sub_status == 1)//如果为受控命令
					{
						if(user_e1[user_num].telephone[user_e1[user_num].user_index] != IDLE)
						{//判断要发送的号码是否正常
							send_mfc_out(user_e1[user_num].mfc,user_e1[user_num].telephone[user_e1[user_num].user_index]);//发送下一位电话号码
							if((user_monitor_num == user_num) || (user_test_num == user_num))//判断此端口是否为呼出测试端口或监视端口
							{
								//往后台回应监视信息
								command(1,0,user_num,FORWARD_MFC_SIGNAL,user_e1[user_num].telephone[user_e1[user_num].user_index],IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
							}
							user_e1[user_num].sub_status = 0;//设置为主控命令
							for(trk_j = 0;trk_j < 2;trk_j++)//清空接收数据 
							{
								chat_mfc_resource[user_e1[user_num].mfc].buf[trk_j] = IDLE;
							}
							chat_mfc_resource[user_e1[user_num].mfc].buf_p = 0;//清空接收指针
							user_e1[user_num].delay = 20;//设置1秒的等待时间
							user_e1[user_num].control = 16;//设置800毫秒控制时间
							user_e1[user_num].mfc_count = 0;//清空MFC读次数
							user_e1[user_num].mfc_state = WAIT_KA;//转为等待KA信令
							user_e1[user_num].user_index++;//发送号码指针加1
						}
					}
				}
			}
		}
		break;
		case OUT_PAUSE://等待停发信令
		{
			user_e1[user_num].delay--;//控制时间减1
			if(user_e1[user_num].delay == 0)//10秒钟内没有收到停发信号
			{
				user_e1[user_num].mfc_state = MFC_FAILURE;//转到MFC失败处理

⌨️ 快捷键说明

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