📄 c_manage.c
字号:
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 + -