📄 drive.c
字号:
听空音 3
听催挂音 4
用户听回铃 5
用户听振铃 6
信号指示标志的构造是前后个4位表示,注意处理
******************************/
void OPEN_EXT_Signal(unchar Ext_No,unchar Signal_Type)
{
switch(Signal_Type)
{
case 1:
Micro_Switch_8816(Ext_No,BUSY_Channel, 1);
Signal_Type <<= 4;
Signal_Type |= 0x01;
Ext_Param[Ext_No].Flag_Signal = Signal_Type;
break;
case 2:
Micro_Switch_8816(Ext_No,BUSY2_Channel, 1);
Signal_Type <<= 4;
Signal_Type |= 0x01;
Ext_Param[Ext_No].Flag_Signal = Signal_Type;
break;
case 3:
Micro_Switch_8816(Ext_No,BUSY_Channel, 0);
Micro_Switch_8816(Ext_No,BUSY2_Channel, 0);
Micro_Switch_8816(Ext_No,BUSY3_Channel, 0);
Signal_Type <<= 4;
Signal_Type |= 0x01;
Ext_Param[Ext_No].Flag_Signal = Signal_Type;
break;
case 4:
Micro_Switch_8816(Ext_No,BUSY2_Channel, 1);
Signal_Type <<= 4;
Signal_Type |= 0x01;
Ext_Param[Ext_No].Flag_Signal = Signal_Type;
break;
case 5:
Micro_Switch_8816(Ext_No,BUSY3_Channel, 1);
Signal_Type <<= 4;
Signal_Type |= 0x01;
Ext_Param[Ext_No].Flag_Signal = Signal_Type;
break;
default:
break;
}
}
/******************************
Name:TURN_EXT_Signal(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
将当前的信号音状态反转
******************************/
void TURN_EXT_Signal(unchar Ext_No)
{
unchar data signal,temp;
signal = Ext_Param[Ext_No].Flag_Signal & 0xf0;
signal >>= 4;
Ext_Param[Ext_No].Flag_Signal++;
Ext_Param[Ext_No].Flag_Signal &= 0xf1;
temp = Ext_Param[Ext_No].Flag_Signal & 0x01;
switch(signal)
{
case 1:
Micro_Switch_8816(Ext_No,BUSY_Channel, temp);
break;
case 2:
Micro_Switch_8816(Ext_No,BUSY2_Channel, temp);
break;
case 3:
Micro_Switch_8816(Ext_No,BUSY_Channel, temp);
break;
case 4:
Micro_Switch_8816(Ext_No,BUSY2_Channel, temp);
break;
case 5:
Micro_Switch_8816(Ext_No,BUSY3_Channel, temp);
break;
default:
break;
}
}
/******************************
Name:STOP_EXT_Signal(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
关闭当前信号音
******************************/
void STOP_EXT_Signal(unchar Ext_No)
{
unchar data signal;
signal = Ext_Param[Ext_No].Flag_Signal & 0xf0;
signal >>= 4;
switch(signal)
{
case 1:
Micro_Switch_8816(Ext_No,BUSY_Channel, 0);
break;
case 2:
Micro_Switch_8816(Ext_No,BUSY2_Channel, 0);
break;
case 3:
Micro_Switch_8816(Ext_No,BUSY_Channel, 0);
break;
case 4:
Micro_Switch_8816(Ext_No,BUSY2_Channel, 0);
break;
case 5:
Micro_Switch_8816(Ext_No,BUSY3_Channel, 0);
break;
default:
break;
}
Ext_Timer[Ext_No].Counter_Signal = 0;
Ext_Param[Ext_No].Flag_Signal = 0;
}
/******************************
Name:OPEN_EXT_Ring(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
信号音的类型说明
用户听振铃 6
改写当前用户组的振铃数据,
同时向用户写入开始振铃数据
******************************/
void OPEN_EXT_Ring(unchar Ext_No)
{
unchar data temp,group;
group = Ext_No/8;
temp = Ext_No%8;
temp = RING<<temp;
Ext_Group[group].Ext_Ring_ST |= temp;
XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
Ext_Param[Ext_No].Flag_Signal = 0x61;
}
/******************************
Name:TURN_EXT_Ring(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
将当前的振铃状态反转
******************************/
void TURN_EXT_Ring(unchar Ext_No)
{
unchar data temp,group;
Ext_Param[Ext_No].Flag_Signal++;
Ext_Param[Ext_No].Flag_Signal &= 0xf1;
temp = Ext_Param[Ext_No].Flag_Signal & 0x01;
if( temp )
{
group = Ext_No/8;
temp = Ext_No%8;
temp = RING<<temp;
Ext_Group[group].Ext_Ring_ST |= temp;
XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
Ext_Param[Ext_No].Flag_Signal = 0x61;
}
else
{
group = Ext_No/8;
temp = Ext_No%8;
temp = RING<<temp;
temp =~temp;
Ext_Group[group].Ext_Ring_ST &= temp;
XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
Ext_Param[Ext_No].Flag_Signal = 0x60;
}
}
/******************************
Name:STOP_EXT_Ring(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
改写当前用户组的振铃数据,
同时向用户写入停止振铃数据
******************************/
void STOP_EXT_Ring(unchar Ext_No)
{
unchar data temp,group;
group = Ext_No/8;
temp = Ext_No%8;
temp = RING<<temp;
temp =~temp;
Ext_Group[group].Ext_Ring_ST &= temp;
XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
Ext_Param[Ext_No].Flag_Signal = 0;
}
/******************************
Name:OPEN_Trk(unchar Ext_No)
input:Ext_No
output:none
description:
打开用户中继线路
******************************/
void OPEN_Trk(unchar Ext_No)
{
unchar data temp,group;
group = Ext_No/8;
temp = Ext_No%8;
temp = OPEN<<temp;
Ext_Group[group].Ext_Ring_ST |= temp;
XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
}
/******************************
Name:CLOSE_Trk(unchar Ext_No)
input:Ext_No
output:none
description:
关闭用户中继线路
******************************/
void CLOSE_Trk(unchar Ext_No)
{
unchar data temp,group;
group = Ext_No/8;
temp = Ext_No%8;
temp = OPEN<<temp;
temp =~temp;
Ext_Group[group].Ext_Ring_ST &= temp;
XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
}
/******************************
Name:Scan_Ext_Cable(void)
input: /
output: cable no
description:
计算出当前可以用的绳路
******************************/
unchar Scan_Ext_Cable(void)
{
unchar data i;
if( CABLE_USE == TAL_CABLE )
{
return 15;
}
for(i=(CABLE_USE_NOW+1);i<TAL_CABLE;i++)
{
if( CABLE_USE_LIST[i] == 0 )
{
CABLE_USE_NOW = i;
CABLE_USE++;
CABLE_USE_LIST[i] = 1; //1表示该绳路使用中0表示空闲
return i;
}
}
for(i=0;i<CABLE_USE_NOW;i++)
{
if( CABLE_USE_LIST[i] == 0 )
{
CABLE_USE_NOW = i;
CABLE_USE++;
CABLE_USE_LIST[i] = 1;
return i;
}
}
return 15;
}
/******************************
Name:Release_Cable(unchar channel)
input: channel
output: /
description:
释放当前计算的绳路
******************************/
void Release_Cable(unchar channel)
{
CABLE_USE--;
CABLE_USE_LIST[channel] = 0;
}
/******************************
Name:Use_Cable(unchar channel)
input: channel
output: /
description:
占用当前计算的绳路
******************************/
void Use_Cable(unchar channel)
{
CABLE_USE++;
CABLE_USE_LIST[channel] = 1;
}
/******************************
Name:Scan_Trk(void)
input: /
output: TRK no
description:
计算出当前可以用的中继
使用轮循方式计算新的中继
先计算当前使用的到满用户数的中继是否有空闲
如果有空闲就占用,通过带入中继组号计算
如果中继组的每个成员都是小于标志0x80的,表示
中继用户是空闲的还没有使用,那么就增加
该组的用户使用数量,同时将该用户写入被使用标志0x80
同时取到成员的0x7f号码为中继用户号i
******************************/
unchar Scan_Trk(unchar group)
{
unchar data i;
for(i=Trk_Group[group].No_Use_Now;i<Trk_Group[group].Num_Member;i++)
{
if( Trk_Group[group].Trk_Member[i] < 0x80 )
{
if( Ext_Param[Trk_Group[group].Trk_Member[i]].Trk_Group_Param >= 0xfe )
{
Trk_Group[group].Num_Use++;
Trk_Group[group].Trk_Member[i] |= 0x80;
i = Trk_Group[group].Trk_Member[i] & 0x7f;
return i;
}
}
}
for(i=0;i<Trk_Group[group].No_Use_Now;i++)
{
if( Trk_Group[group].Trk_Member[i] < 0x80 )
{
if( Ext_Param[Trk_Group[group].Trk_Member[i]].Trk_Group_Param >= 0xfe )
{
Trk_Group[group].Num_Use++;
Trk_Group[group].Trk_Member[i] |= 0x80;
i = Trk_Group[group].Trk_Member[i] & 0x7f;
return i;
}
}
}
return 0xff;
}
/******************************
Name:Reign_Trk(unchar Ext_No)
input: Ext_No
output: 1/0
description:
占用当前计算的用户中继
0x80是占用标志,or 标志就是占用
and 0x7f 就是空闲中继
******************************/
void Reign_Trk(unchar Ext_No)
{
unchar xdata i,group;
group = Ext_Param[Ext_No].Trk_Group_Num;
for(i=0;i<Trk_Group[group].Num_Member;i++)
{
if( (Trk_Group[group].Trk_Member[i]&0x7f) == Ext_No )
{
Trk_Group[group].Num_Use++;
Trk_Group[group].Trk_Member[i] |= 0x80;
}
}
}
/******************************
Name:Release_Cable(unchar Ext_No)
input: Ext_No
output: 1/0
description:
释放当前计算的中继
******************************/
void Release_Trk(unchar Ext_No)
{
unchar xdata i,group;
group = Ext_Param[Ext_No].Trk_Group_Num;
for(i=0;i<Trk_Group[group].Num_Member;i++)
{
if( (Trk_Group[group].Trk_Member[i]&0x7f) == Ext_No )
{
Trk_Group[group].Num_Use--;
Trk_Group[group].Trk_Member[i] &= 0x7f;
}
}
}
/******************************
Name:Release_MeetGroup(unchar group)
input: group
output: /
description:
释放当前计算的会议组
******************************/
void Release_MeetGroup(unchar group)
{
unchar data i,SExt_No;
for(i=0;i<Temp_MeetGroup[group].Num_Member;i++)
{
SExt_No = Temp_MeetGroup[group].Meet_Member[i];
if( SExt_No < TAL_EXT_PORT )
{
HostExt_Called_List[SExt_No] = 0;
HostExt_Calling_List[SExt_No] = 0;
Temp_MeetGroup[group].Meet_Member[i] = 0xff;
if( SExt_No != Temp_MeetGroup[group].Manager_Ext )
{
if(Ext_Param[SExt_No].Ext_State == state6_Ring )
{
Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);//用户主叫挂机,被叫撤铃
}
else if(Ext_Param[SExt_No].Ext_State == state8_MeetTalk)
{
Ext_Param[SExt_No].Ext_EVENT = event18_MangerRelease;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);//用户主叫挂机,通话挂断
}
}
}
}//对会议组织者进行处理
SExt_No = Temp_MeetGroup[group].Manager_Ext;
if(Ext_Param[SExt_No].Ext_State == state6_Ring )
{
HostExt_Called_List[SExt_No] = 0;
HostExt_Calling_List[SExt_No] = 0;
Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);//用户被叫挂机,主叫撤铃
}
i = Temp_MeetGroup[group].MeetGroup;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -