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

📄 c_manage.c

📁 这是电信语音聊天设备的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
					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] = 0x3c;//设置为收前项,发后项
                   			temp =0;
                   		}
                    }
					connect(trk_num,chat_mfc_resource[i].slot);//连接相应时隙
					connect(chat_mfc_resource[i].slot,trk_num);//连接相应时隙
					return(i);
				}
			}
		}	
	}
	return(IDLE);
}

mfc_release(unsigned char mfc_num)//释放MFC通道
{
	unsigned char xdata j,temp;
	if(chat_mfc_resource[mfc_num].flag == OCCUPY)
	{
		chat_mfc_resource[mfc_num].flag = LEISURE;//置空闲标志
		for(j = 0;j < 2;j++)
		{
			chat_mfc_resource[mfc_num].buf[j] = IDLE;
		}
		chat_mfc_resource[mfc_num].buf_p = 0;
		chat_mfc_resource[mfc_num].delay = 0;
		chat_mfc_resource[mfc_num].user = IDLE;
		mfc_count++;
		command(8,0,mfc_count,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
		temp = 1;
		while(temp) 
    	{
    		if(((MFC_W_R >> (2 * mfc_num + 4)) & 0x01) != 0x01)
    	    {
    	    	XBYTE[chat_mfc_resource[mfc_num].addr] = 0x3c;//设置为发前项,收后项
    	    	temp =0;
    	    }
    	}
		connect(chat_mfc_resource[mfc_num].slot,chat_mfc_resource[mfc_num].slot);//自环连接
	}
}

mfc_read()//读MFC数据
{
	unsigned char xdata i;
	if(mfc_test_num == IDLE)//判断是否正在测试
	{
		for(i = 0;i < 2;i++)//没有
		{
        	if(((MFC_W_R >> (2 * i + 5)) & 0x01) != 0x01)
            {
            	chat_mfc_resource[i].buf[chat_mfc_resource[i].buf_p] = XBYTE[chat_mfc_resource[i].addr];//读取MFC互控数据
            	chat_mfc_resource[i].buf_p = 1 - chat_mfc_resource[i].buf_p;
           	}
		}
	}
}

mfc_test100()//100毫秒MFC测试
{
	unsigned char xdata mfc_buf;
	if(mfc_test_num != IDLE)//判断是否正在测试
	{
		chat_mfc_resource[mfc_test_num].delay--;
        if(((MFC_W_R >> (2 * (1 - mfc_test_num) + 5)) & 0x01) != 0x01)
        {
           	mfc_buf = XBYTE[chat_mfc_resource[1 - mfc_test_num].addr];//读取MFC测试数据
            mfc_release(mfc_test_num);//释放MFC资源
        	mfc_release(1 - mfc_test_num);//释放MFC资源
        	command(0,0,mfc_test_num,mfc_buf,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
       		//往后台回测试结果
        	mfc_test_num = IDLE;
        }
        else if(chat_mfc_resource[mfc_test_num].delay == 0)//200毫秒还没有收到
        {
        	mfc_release(mfc_test_num);//释放MFC资源
        	mfc_release(1 - mfc_test_num);//释放MFC资源
        	command(0,0,mfc_test_num,0,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
       		//往后台回测试结果
        	mfc_test_num = IDLE;
        }
	}
}

isd_write(unsigned int addr,unsigned char offset,unsigned int command,unsigned int c_addr)//ISD写操作
{
	unsigned char k;
    XBYTE[addr + S_CS] = 8 + offset;//置片选
    delay_time(20);
    XBYTE[addr + S_CLK] = 0;//时钟置低
    delay_time(10);
    for(k = 0;k < 15;k++)
    {
        XBYTE[addr + S_IN] = c_addr & 0x01;//写数
        delay_time(10);
        XBYTE[addr + S_CLK] = 1;//时钟置高
        delay_time(10);
        XBYTE[addr + S_CLK] = 0;//时钟置低
        delay_time(10);
        c_addr = (c_addr >> 1);
    }
    for(k = 0;k < 8;k++)
    {
        XBYTE[addr + S_IN] = command & 0x01;//写数
        delay_time(10);
        XBYTE[addr + S_CLK] = 1;//时钟置高
        delay_time(10);
        XBYTE[addr + S_CLK] = 0;//时钟置低
        delay_time(10);
        command = (command >> 1);
    }
    delay_time(20);
    XBYTE[addr + S_CS] = 0;//释放片选
    delay_time(20);
}

audio_stop(unsigned char audio_num)//停止目前操作
{
	unsigned int xdata start_addr;
	audio_dtmf_resource[audio_num].play = REST;//清放音标志
	audio_dtmf_resource[audio_num].time = 0;
	audio_dtmf_resource[audio_num].power_count = 0;
	audio_dtmf_resource[audio_num].power_flag = LEISURE;
	audio_dtmf_resource[audio_num].num_set = IDLE;
	start_addr = audio_dtmf_resource[audio_num].addr;//计算起址
	audio_num = (audio_num % 8);//计算片移量
	isd_write(start_addr,audio_num,STOP_COMMAND,0);//停止目前操作
}

audio_play(unsigned char audio_num,unsigned char duan_num)//放音程序
{
	unsigned int xdata start_addr;
	audio_dtmf_resource[audio_num].play = WORKING;//置放音标志
	audio_dtmf_resource[audio_num].time = 0;//清间隔时间
	audio_dtmf_resource[audio_num].power_flag = OCCUPY;
	audio_dtmf_resource[audio_num].power_count = 0;
	audio_dtmf_resource[audio_num].num_set = duan_num;
	start_addr = audio_dtmf_resource[audio_num].addr;//计算起址
	audio_num = (audio_num % 8);//计算片移量
	isd_write(start_addr,audio_num,POWER_COMMAND,0);//芯片上电
}

audio_scan_50ms()//定时检测放音是否结束
{
	unsigned char i;
	for(i = 0;i < AUDIO_MAX;i++)
	{
		if(audio_test_num == i)//该单元是否正在测试
		{
			if(((XBYTE[audio_dtmf_resource[i].addr + ISD_INIT] >> (i % 8)) & 0x01 ) != 0x01)//该单元放音结束
			{
				audio_stop(audio_test_num);//停止当前操作
				audio_play(audio_test_num,test_duan_num);//放测试音
			}
			if(audio_dtmf_resource[i].power_flag == OCCUPY)
			{
				audio_dtmf_resource[i].power_count++;
				if(audio_dtmf_resource[i].power_count > 5)
				{
					audio_dtmf_resource[i].power_count = 0;
					audio_dtmf_resource[i].power_flag = LEISURE;
					if(audio_dtmf_resource[i].num_set != IDLE)
					{
						isd_write(audio_dtmf_resource[i].addr,(i % 8),SET_ADDR,audio_duan_addr[audio_dtmf_resource[i].num_set]);//设定段地址
						isd_write(audio_dtmf_resource[i].addr,(i % 8),PLAY_COMMAND,0);//开始放音	
						audio_dtmf_resource[i].num_set = IDLE;
					}
				}
			}
		}
		else//没有测试
		{ 
			if(audio_dtmf_resource[i].flag == OCCUPY)
			{
				if(((XBYTE[audio_dtmf_resource[i].addr + ISD_INIT] >> (i % 8)) & 0x01 ) != 0x01)//该单元放音结束
				{
					audio_stop(i);//停止当前操作
					if((audio_dtmf_resource[i].index != audio_dtmf_resource[i].length) && (audio_dtmf_resource[i].num[audio_dtmf_resource[i].index] != IDLE))//判断提示音是否放完
					{
						audio_play(i,audio_dtmf_resource[i].num[audio_dtmf_resource[i].index]);//没有,继续放下一段
						audio_dtmf_resource[i].index++;//段指针加1
					}
					else
					{
						audio_dtmf_resource[i].index = 0;//放完了,将指针置为0
						audio_dtmf_resource[i].time = 0;//清空时间间隔
						audio_dtmf_resource[i].count++;//本段音播放次数加1
					}
				}
				if(audio_dtmf_resource[i].power_flag == OCCUPY)
				{
					audio_dtmf_resource[i].power_count++;
					if(audio_dtmf_resource[i].power_count > 5)
					{
						audio_dtmf_resource[i].power_count = 0;
						audio_dtmf_resource[i].power_flag = LEISURE;
						if(audio_dtmf_resource[i].num_set != IDLE)
						{
							isd_write(audio_dtmf_resource[i].addr,(i % 8),SET_ADDR,audio_duan_addr[audio_dtmf_resource[i].num_set]);//设定段地址
							isd_write(audio_dtmf_resource[i].addr,(i % 8),PLAY_COMMAND,0);//开始放音	
							audio_dtmf_resource[i].num_set = IDLE;
						}
					}
				}
			}
		}
	}
}

audio_manage_100ms()//定时检测是否应该放音
{
	unsigned char i;
	for(i = 0;i < AUDIO_MAX;i++)
	{
		if(i != audio_test_num)//只处理非测试单元
		{
			if(audio_dtmf_resource[i].auto_flag == OCCUPY)
			{
				if(audio_dtmf_resource[i].play == WORKING)//判断ISD是否在放音
				{
					audio_dtmf_resource[i].time = 0;//清空时间间隔
				}
				else//没有放音
				{
					audio_dtmf_resource[i].time++;//时间间隔加1
					if(audio_dtmf_resource[i].time > 30)//1秒钟时间到
					{
						audio_dtmf_resource[i].time = 0;//清空时间间隔
						if(audio_dtmf_resource[i].count > 2)//判断提示音是否放了3遍
						{
							if(user_e1[audio_dtmf_resource[i].user].type == CALL_IN)
							{
								audio_play(i,ASK_DUAN);//是则放:“您怎么还不选择啊?”
								audio_dtmf_resource[i].count = 0;//清空播放次数
								audio_dtmf_resource[i].index = 0;
							}
						}
						else//不是则放正常的提示音
						{
							audio_play(i,audio_dtmf_resource[i].num[audio_dtmf_resource[i].index]);
							audio_dtmf_resource[i].index++;
						}
					}
				}
			}
		}
	}
}

dtmf_init()//DTMF变量初始化
{
	unsigned char i,j;
	audio_dtmf_count = 0;
	audio_test_num = IDLE;
	test_duan_num = IDLE;
	dtmf_test_num = IDLE;
	for(i = 0;i < AUDIO_MAX;i++)
	{
		audio_dtmf_resource[i].flag = IDLE;
		audio_dtmf_resource[i].power_flag = LEISURE;
		audio_dtmf_resource[i].power_count = 0;
		audio_dtmf_resource[i].num_set = IDLE;
		audio_dtmf_resource[i].auto_flag = LEISURE;
		audio_dtmf_resource[i].slot = IDLE;
		audio_dtmf_resource[i].addr = IDLE;
		audio_dtmf_resource[i].buf = IDLE;
		for(j = 0;j < 8;j++)
		{
			audio_dtmf_resource[i].num[j]  = IDLE;
		}
		audio_dtmf_resource[i].index = 0;
		audio_dtmf_resource[i].length = 0;
		audio_dtmf_resource[i].play = REST;
		audio_dtmf_resource[i].time = 0;
		audio_dtmf_resource[i].count = 0;
		audio_dtmf_resource[i].delay = 0;
		audio_dtmf_resource[i].user = IDLE;
	}
}

unsigned char dtmf_req(unsigned char trk_num,unsigned char type)//请求DTMF通道(0:老聊友回呼  1:普通回呼 2:呼叫测试)
{
	unsigned char xdata i,j;
	if(audio_dtmf_count == 0)
	{
		return(IDLE);	
	}
	else
	{
		for(i = 0;i < AUDIO_MAX;i++)
		{
			if(audio_dtmf_resource[i].flag == LEISURE)//此路为空闲
			{
				audio_dtmf_count--;//剩余路数减1
				command(8,1,audio_dtmf_count,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
				audio_dtmf_resource[i].flag = OCCUPY;//置占用标志
				audio_dtmf_resource[i].power_flag = LEISURE;
				audio_dtmf_resource[i].power_count = 0;
				audio_dtmf_resource[i].num_set = IDLE;
				audio_dtmf_resource[i].auto_flag = LEISURE;
				audio_dtmf_resource[i].buf = IDLE;
				if(user_e1[trk_num].type == CALL_OUT)//呼出申请
				{
					switch(type)
					{
						case 0://老聊友回呼
						{
							audio_dtmf_resource[i].num[0] = OUT_DUAN_START;
							for(j = 1;j < 7;j++)
							{
								audio_dtmf_resource[i].num[j]  = user_e1[trk_num].number_chat[j - 1];
							}
							audio_dtmf_resource[i].num[7] = OUT_DUAN_END;
							audio_dtmf_resource[i].length = 8;
						}
						break;
						case 1://普通回呼
						{
							audio_dtmf_resource[i].num[0] = BACK_DUAN;
							for(j = 1;j < 8;j++)
							{
								audio_dtmf_resource[i].num[j]  = IDLE;
							}
							audio_dtmf_resource[i].length = 1;
						}
						break;
						case 2://呼叫测试
						{
							audio_dtmf_resource[i].num[0]  = OUT_DUAN_START;
							audio_dtmf_resource[i].num[1]  = 0x6;
							audio_dtmf_resource[i].num[2]  = 0x6;
							audio_dtmf_resource[i].num[3]  = 0x6;
							audio_dtmf_resource[i].num[4]  = 0x6;
							audio_dtmf_resource[i].num[5]  = 0x6;
							audio_dtmf_resource[i].num[6]  = 0x6;
							audio_dtmf_resource[i].num[7]  = OUT_DUAN_END;
							audio_dtmf_resource[i].length = 8;
						}
						break;
						default:
						break;
					}
				}
				else//呼入申请
				{
					audio_dtmf_resource[i].num[0] = FIRST_AUDIO;
					for(j = 1;j < 8;j++)
					{
						audio_dtmf_resource[i].num[j]  = IDLE;
					}
					audio_dtmf_resource[i].length = 1;
				}
				audio_dtmf_resource[i].index = 0;
				audio_dtmf_resource[i].delay = 0;
				audio_dtmf_resource[i].play = REST;
				audio_dtmf_resource[i].time = 0;
				audio_dtmf_resource[i].count = 0;
				audio_dtmf_resource[i].user = trk_num;
				user_e1[trk_num].dtmf = i;//置数字中继用户对应的DTMF通道号
				return(i);
			}
		}
	}
}

dtmf_release(unsigned char dtmf_num)//释放DTMF通道
{
	unsigned char i;
	audio_stop(dtmf_num);//停止放音
	if(dtmf_num != IDLE)
	{
		user_e1[audio_dtmf_resource[dtmf_num].user].dtmf = IDLE;
		if(audio_dtmf_resource[dtmf_num].flag == OCCUPY)
		{
			audio_dtmf_count++;
			command(8,1,audio_dtmf_count,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
			audio_dtmf_resource[dtmf_num].flag = LEISURE;
			audio_dtmf_resource[dtmf_num].power_flag = LEISURE;
			audio_dtmf_resource[dtmf_num].power_count = 0;
			audio_dtmf_resource[dtmf_num].num_set = IDLE;
			audio_dtmf_resource[dtmf_num].auto_flag = LEISURE;
			audio_dtmf_resource[dtmf_num].buf = IDLE;
			for(i = 0;i < 8;i++)
			{
				audio_dtmf_resource[dtmf_num].num[i]  = IDLE;
			}
			audio_dtmf_resource[dtmf_num].index = 0;
			audio_dtmf_resource[dtmf_num].length = 0;	
			audio_dtmf_resource[dtmf_num].delay = 0;
			audio_dtmf_resource[dtmf_num].play = REST;
			audio_dtmf_resource[dtmf_num].time = 0;
			audio_dtmf_resource[dtmf_num].count = 0;
			audio_dtmf_resource[dtmf_num].user = IDLE;
			no_sound(audio_dtmf_resource[dtmf_num].slot);
		}
	}
}

dtmf_test100()//100毫秒DTMF测试
{
	unsigned char xdata dtmf_buf;
	if(dtmf_test_num != IDLE)//现在是否有DTMF测试单元
	{
		dtmf_buf = XBYTE[audio_dtmf_resource[dtmf_test_num].addr + (dtmf_test_num % 8) + 8];//读DTMF
		audio_dtmf_resource[dtmf_test_num].delay--;//测试延时减1  
		if(((dtmf_buf >> ((dtmf_test_num % 4) + 4)) & 0x01)  == 0x01)//判断测试端口有无收到DTMF信号
		{
			dtmf_buf = dtmf_buf & 0x0f;//有,则取出收到的值
			command(0,1,dtmf_test_num,dtmf_buf,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
			//往后台发送测试结果
			dtmf_release(dtmf_test_num);//释放测试单元
			dtmf_test_num = IDLE;//将测试单元置为无
		}
		else if(audio_dtmf_resource[dtmf_test_num].delay == 0)//200毫秒没有收到DTMF信号
		{
			command(0,1,dtmf_test_num,0,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
			//往后台发送测试结果
			dtmf_release(dtmf_test_num);//释放测试单元
			dtmf_test_num = IDLE;//将测试单元置为无
		}
	}
}

⌨️ 快捷键说明

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