📄 drive.c
字号:
if(i<7)
Meet_Group[i].Meetstate = 0;
Temp_MeetGroup[group].Manager_Ext = 0xff;
Temp_MeetGroup[group].Num_Member = 0;
Temp_MeetGroup[group].Meetstate = 0;
}
/******************************
Name:HostCreat_MeetGroup(unchar Ext_No)
input: group
output: /
description:
计算当前的总机的会议组
******************************/
void HostCreat_MeetGroup(unchar Ext_No,unchar SExt_No)
{
unchar data group,channal;
for(group=0;group<TAL_CABLE;group++)
{
if(Temp_MeetGroup[group].Meetstate)
continue;
else
{
if((Ext_Param[SExt_No].Ext_State>3)&&(Ext_Param[SExt_No].Ext_State<9))
{//如果用户已经有了绳路,不需要再申请
channal = Ext_Param[SExt_No].Num_Switch_Cable&0x0f;
Use_Cable(channal);
}
else if(Ext_Param[SExt_No].Ext_State>0)
{//如果用户没有绳路,需要再申请
channal = Ext_Param[SExt_No].Num_Switch_Cable&0x0f;
if(channal>=TAL_CABLE)
{
channal = Scan_Ext_Cable();
Ext_Param[SExt_No].Num_Switch_Cable = channal;
}
else
{
Use_Cable(channal);
}
}
else
{
channal = Scan_Ext_Cable();
}
if( channal >= TAL_CABLE )//用户不具有空闲绳路
{
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态
Ext_Param[Ext_No].Ext_EVENT = event12_CableBusy; //用户进入绳路忙事件
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
return;
}
Temp_MeetGroup[group].MeetGroup = 0xff;
Temp_MeetGroup[group].Meetstate = 0xf0;//如果空闲就占用,得到会议号
Temp_MeetGroup[group].Num_Member = 2;//给出临时会议组的初始用户数
Temp_MeetGroup[group].Manager_Ext = Host_Ext;
Temp_MeetGroup[group].Num_Member = 0;
if( Temp_MeetGroup[group].Manager_Ext == Ext_No )
Temp_MeetGroup[group].Meet_Member[0] = SExt_No;
else
Temp_MeetGroup[group].Meet_Member[0] = Ext_No;
Temp_MeetGroup[group].Num_Member+=2;
Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec; //用户不可收号
Ext_Param[Ext_No].Num_MeetGroup = group; //写入会议组号
Ext_Param[Ext_No].Num_Call_Me= 0XFE; //写入会议组号
Ext_Param[Ext_No].Num_Switch_Cable = channal; //写用户绳路
Ext_Param[Ext_No].Ext_State= state4_DailOk; //用户进入会议听回铃状态
OPEN_EXT_Signal(Ext_No, 5);
if( Ext_Param[SExt_No].Ext_State )
{//如果对方处于忙状态,需要区分对方是总机还是分机
HostExt_Called_List[Ext_No] = 0x0f;//表示该用户正在呼叫总机 等待中
return;
}
else
{
Ext_Param[SExt_No].Num_Call_Other = Ext_No;//写入对方标志号码
Ext_Param[SExt_No].Num_MeetGroup = group; //写入会议组号
Ext_Param[SExt_No].Num_Call_Me= 0XFE; //写入会议组号
Ext_Param[SExt_No].Num_Switch_Cable = channal; //写用户绳路
Ext_Param[SExt_No].Ext_EVENT= event4_ExtRing; //用户进入会议振铃状态
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);
}
return;
}
}
if( group>=TAL_CABLE )
{
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态
Ext_Param[Ext_No].Ext_EVENT = event12_CableBusy; //用户进入绳路忙事件
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
}
}
/******************************
Name:HostHangup_MeetGroup(unchar group)
input: group
output: /
description:
挂起当前计算的总机的会议组
******************************/
void HostHangup_MeetGroup(unchar group)
{
unchar data Ext_No,channel,Num_Member,member;
Num_Member = Temp_MeetGroup[group].Num_Member;
channel = Ext_Param[Host_Ext].Num_Switch_Cable & 0xf0;
if( Num_Member > 2 )
{
Temp_MeetGroup[group].Num_Member--;
for(member=0;member<Num_Member;member++)
{
Ext_No= Temp_MeetGroup[group].Meet_Member[member];
if(Ext_No<MAX_Ext)
{
Micro_Switch_8816(Ext_No, channel, 0);
}
}
}
else if( Num_Member == 2 )
{
Ext_No= Temp_MeetGroup[group].Meet_Member[0];
Micro_Switch_8816(Ext_No,channel, 0);
Temp_MeetGroup[group].Num_Member--;
if( Ext_Param[Ext_No].Ext_State == state8_MeetTalk )
{
OPEN_EXT_Signal(Ext_No, 5);//主叫用户换被叫用户,其他用户等待
}
}
else
{
Release_MeetGroup(group);
}
}
/******************************
Name:HostConnet_MeetGroup(unchar group)
input: group
output: /
description:
连接当前计算的总机的会议组
******************************/
void HostConnet_MeetGroup(unchar group)
{
unchar data Ext_No;
if( Temp_MeetGroup[group].Num_Member > 2 )
{
Ext_No = Temp_MeetGroup[group].Manager_Ext;
Micro_Switch_8816(Host_Ext,
Ext_Param[Ext_No].Num_Switch_Cable & 0xf0, 1);
Temp_MeetGroup[group].Meet_Member[0] = Ext_No;
Temp_MeetGroup[group].Manager_Ext = Host_Ext;
Temp_MeetGroup[group].Num_Member++;
}
else if( Temp_MeetGroup[group].Num_Member == 2 )
{
Ext_No = Temp_MeetGroup[group].Manager_Ext;
Micro_Switch_8816(Host_Ext,
Ext_Param[Ext_No].Num_Switch_Cable & 0xf0, 1);
Temp_MeetGroup[group].Meet_Member[0] = Ext_No;
Temp_MeetGroup[group].Manager_Ext = Host_Ext;
Temp_MeetGroup[group].Num_Member++;
if( Ext_Param[Ext_No].Ext_State == state8_MeetTalk )
{
STOP_EXT_Signal(Ext_No);//主叫用户换被叫用户,其他用户等待
}
}
else
{
Release_MeetGroup(group);
}
}
/******************************
Name:Scan_NextManager(unchar group,unchar Ext_No)
input: group
output: /
description:
释放当前计算的会议组
注意:
会议组织者放在会议管理位置上
如果当前用户是会议成员,则直接挂机
如果当前用户是会议组织者,则要取消会议
******************************/
void Scan_NextManager(unchar group,unchar Ext_No)
{
unchar data i,allmember,manager,SExt_No;
allmember = Temp_MeetGroup[group].Num_Member;
manager = Temp_MeetGroup[group].Manager_Ext;
if( Ext_No == manager )//挂机用户是会议主席
{
if(FlagSystemType)//如果系统应用在指令上就主机挂就直接挂
{
i = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取用户绳路
Release_Cable(i);
Ext_Timer_Reset(Ext_No);
Ext_Param_Reset(Ext_No);
Release_MeetGroup(group);
}
else//如果系统应用在普通电话上就循环主机占用
{
for(i=0;i<allmember;i++)
{
SExt_No = Temp_MeetGroup[group].Meet_Member[i];
if( Ext_Param[SExt_No].Ext_State == state8_MeetTalk)
{
if(Temp_MeetGroup[group].Num_Member)
{
Temp_MeetGroup[group].Num_Member--;
for(i=0;i<Temp_MeetGroup[group].Num_Member;i++)
{
HostExt_Called_List[Temp_MeetGroup[group].Meet_Member[i]] = 0;
HostExt_Calling_List[Temp_MeetGroup[group].Meet_Member[i]] = 0;
}
}
if( Ext_Param[SExt_No].Bit_Param >= 0x80 )
{
Ext_Param[SExt_No].Ext_EVENT = event2_ExtHookOff;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);//启动主席挂机,中继是主动挂机事件
}
else
{
if( Ext_No == Host_Ext )
{
for(i=0;i<MAX_Ext;i++)
{
if(HostExt_Called_List[i] == 0xf0 )
{
Ext_Param[Ext_No].Num_Call_Other = i;//写入对方标志号码
Ext_Param[Ext_No].Num_MeetGroup = Ext_Param[i].Num_MeetGroup; //写入会议组号
Ext_Param[Ext_No].Num_Call_Me= 0XFE; //写入会议组号
Ext_Param[Ext_No].Num_Switch_Cable = Ext_Param[i].Num_Switch_Cable; //写用户绳路
Use_Cable(Ext_Param[Ext_No].Num_Switch_Cable&0x0f);
Ext_Param[Ext_No].Ext_EVENT= event4_ExtRing; //用户进入会议振铃状态
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
break;
}
}
}
Temp_MeetGroup[group].Manager_Ext = SExt_No;
Ext_Param[SExt_No].Num_Call_Other = Ext_No;
Ext_Param[SExt_No].Ext_EVENT =event7_SExtHookOff;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);//启动主席挂机,用户是对方挂机事件
Ext_No = SExt_No;
for(i=0;i<allmember;i++)//撤销在队列里的管理者
{
SExt_No = Temp_MeetGroup[group].Meet_Member[i];
if( Ext_No == SExt_No )
{
if(allmember==1)
{
Temp_MeetGroup[group].Meet_Member[0] = 0xff;
}
else
{
SExt_No = Temp_MeetGroup[group].Meet_Member[allmember-2];
Temp_MeetGroup[group].Meet_Member[i] = SExt_No;
Temp_MeetGroup[group].Meet_Member[allmember-2] = 0xff;
}
break;
}
}//分析完普通的用户会议
}
return;
}
}
}
}
else
{
for(i=0;i<allmember;i++)
{//撤销在队列里的挂机用户
SExt_No = Temp_MeetGroup[group].Meet_Member[i];
HostExt_Called_List[SExt_No] = 0;
HostExt_Calling_List[SExt_No] = 0;
if( Ext_No == SExt_No )
{
SExt_No = Temp_MeetGroup[group].Meet_Member[allmember-2];
Temp_MeetGroup[group].Meet_Member[i] = SExt_No;
Temp_MeetGroup[group].Meet_Member[allmember-2] = 0xff;
Temp_MeetGroup[group].Num_Member--;
SExt_No = Temp_MeetGroup[group].Manager_Ext;
Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);//会议成员挂机,主席判断是否结束会议
return;
}
}
}
}
/************************************
Name:Save_System
Input:none
Output:none
description:for every cable to extno1,lisent dailsingal
************************************/
void Save_System(unchar restart)
{
unchar i,m;
unint j;
Write_FlashPage();
Read_FlashSecter(0x0000);
FlashRamTemp[0] = 0x55; //首次启动计数为0开始
FlashRamTemp[1] = EXT_Head; //修改变量
FlashRamTemp[2] = EXT_Len; //修改变量
FlashRamTemp[3] = Host_Head; //修改变量
FlashRamTemp[4] = TAL_EXT_PORT; //修改变量
FlashRamTemp[5] = TAL_MeetGroup; //修改变量
FlashRamTemp[6] = TAL_TrkGroup; //修改变量
FlashRamTemp[7] = TAL_TroopGroup; //修改变量
FlashRamTemp[8] = Hot_Len; //修改变量
FlashRamTemp[9] = Host_Ext; //修改变量
FlashRamTemp[10] = First_Meet_Head; //修改变量
FlashRamTemp[11] = First_Troop_Head; //修改变量
FlashRamTemp[12] = FlagSystemType; //修改变量
FlashRamTemp[20] = restart; //修改复位重起变量
FlashRamTemp[21] = FlagHeartSkip; //修改变量
FlashRamTemp[24] = Password1;
FlashRamTemp[25] = Password2;
FlashRamTemp[26] = Password3;
Write_FlashPage();
Write_FlashSecter(0x0000); //向Flash写变量
/**********************************************************/
/*系统组参数表,地址从0100h开始*/
/**********************************************************/
for(i=0;i<7;i++)//7组会议组
{
j = i*36;
FlashRamTemp[j++] = Meet_Group[i].MeetLen;
FlashRamTemp[j++] = Meet_Group[i].MeetHead;
FlashRamTemp[j++] = Meet_Group[i].Meetstate;
FlashRamTemp[j++] = Meet_Group[i].Num_Member;
for(m=0;m<MAX_Ext;m++)
{
FlashRamTemp[j++] = Meet_Group[i].Meet_Member[m];
}
}
Write_FlashPage();
Write_FlashSecter(0x0100);
/*
for(i=0;i<7;i++)//7组中继组
{
j = i*36;
FlashRamTemp[j++]= Trk_Group[i].TrkLen;
FlashRamTemp[j++]= Trk_Group[i].TrkHead;
FlashRamTemp[j++] = Trk_Group[i].Num_Member;
FlashRamTemp[j++] = Trk_Group[i].Num_Use;
for(m=0;m<MAX_Ext;m++)
{
FlashRamTemp[j++] = Trk_Group[i].Trk_Member[m];
}
}
Write_FlashPage();
Write_FlashSecter(0x0200);
*/
for(i=0;i<7;i++)//群呼组最大7组
{
j = i*37;
FlashRamTemp[j++] = Troop_Param[i].TroopLen;
FlashRamTemp[j++] = Troop_Param[i].TroopHead;
FlashRamTemp[j++] = Troop_Param[i].Num_Member;
FlashRamTemp[j++] = Troop_Param[i].TroopType;
FlashRamTemp[j++] = Troop_Param[i].Troopstate;
for(m=0;m<MAX_Ext;m++)
{
FlashRamTemp[j++]= Troop_Param[i].Troop_Member[m];
}
}
Write_FlashPage();
Write_FlashSecter(0x0300);
}
/************************************
Name:Restart_System
Input:none
Output:none
description:for every cable to extno1,lisent dailsingal
************************************/
void ReLoad_System(void)
{
Write_FlashPage();
Read_FlashSecter(0x0000);
FlashRamTemp[0] = 0x55; //首次启动计数为0开始
FlashRamTemp[20] = 0xaa; //修改复位重起变量
FlashRamTemp[22] = NoFreeFlag;
FlashRamTemp[23] = NoFreeCounter;
Write_FlashPage();
Write_FlashSecter(0x0000); //向Flash写变量
systemreload = 1;
}
/************************************
Name:Read_8870ST
Input:none
Output:none
description:for every cable to extno1,lisent dailsingal
************************************/
void Read_8870ST(void)
{
if( (Counter5MS ==2)||(Counter5MS ==3) )
{
Ext_Group[(SLEC_Point+1)&0X03].DTMF_ST |= XBYTE[(Addr_DTMF_State)];
}
else if( Counter5MS ==0 )
{
Ext_Group[SLEC_Point&0X03].DTMF_ST |= XBYTE[(Addr_DTMF_State)];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -