📄 djtc081ac.pas
字号:
unit DjTc081AC;
interface
uses tc08a32,SyncObjs,SysUtils,ExtCtrls,DjSSCx,Classes,DjBase,Dialogs,uRecordcenter;
type
{ TDjTc081AC }
TDjTc081AC = class(TObject)
private
TestChannle:Integer;
FDjSSC :TDjSSCx;
TmrDj :TTimer;
ChannelCount:Integer;
function InitTc081A:boolean;
function FinalTc081A:boolean;
procedure DoWork(Sender:TObject);overload;
procedure DoWork(ChnlID:integer);overload;
function ConvertDTMF(sVal: integer): string;
function CheckDial(Channel:PChannel):integer;
function ClearThree(Channel1: PChannel): integer;
function CheckPlayEnd(Channel:PChannel):boolean;
protected
public
KeepList:TChannelList;
constructor Create(DjSSC :TDjSSCx);
destructor Destroy; override;
function ResetChannel(ChnlID:integer):boolean;
procedure HangUp(Channel:PChannel); //挂机
function SetLink(ChnlId1,ChnlId2:integer):integer;
function OffHook(Channel:PChannel):integer; //内线摘机
function HangOff(Channel:PChannel):integer; //内线摘机接听电话
function CallOut(ChannelIn,ChannelOut:pChannel;DTMFNum:string):integer;
function KeepChannel(ChannelIn:PChannel):integer;
function GetKeepChannel(ChannelIn,ChannelOut:PChannel):integer;
function ClearLink(Channel1,Channel2:PChannel):Integer;
procedure StartRecord(Channel:PChannel);
procedure StopRecord(Channel:PChannel);
procedure InitRecordChannel;
procedure StartPlayFile(Channel:PChannel; FileName: string);
procedure StopPlayFile(Channel:PChannel);
published
end;
var
DjTc081 :TDjTc081AC ;
implementation
uses UnitWriteLogThread,uMeetingCenter;
{ TDjTc081AC }
{-------------------------------------------------------------------------------
过程名: TDjTc081AC.Create
作者: fengfan
日期: 2006.08.29
参数: 无
返回值: 无
-------------------------------------------------------------------------------}
constructor TDjTc081AC.Create(DjSSC :TDjSSCx);
begin
TestChannle := 0 ;
FDjSSC := DjSSC;
if not Assigned(ChannelList) then
begin
ChannelList := TChannelList.Create;
end;
if not InitTc081A then
begin
AddLogToListB('初始化板卡失败!','板卡',LogError);
raise TDjException.Create(DjE_InitError);
end
else
begin
AddLogToListB('初始化板卡成功!','板卡',LogNormal);
end;
TmrDj := TTimer.Create(nil);
TmrDj.Interval := 1 ;
TmrDj.OnTimer := DoWork ;
TmrDj.Enabled := True ;
end;
{-------------------------------------------------------------------------------
过程名: TDjTc081AC.Destroy
作者: fengfan
日期: 2006.08.29
参数: 无
返回值: 无
-------------------------------------------------------------------------------}
destructor TDjTc081AC.Destroy;
begin
TmrDj.Enabled := False ;
TmrDj.Free;
if not FinalTc081A then
begin
raise TDjException.Create(DjE_FinalError);
end;
inherited;
end;
procedure TDjTc081AC.DoWork(Sender: TObject);
var
i:integer;
Channel:PChannel;
begin
PUSH_PLAY;
FeedSigFunc;
for i :=0 to ChannelList.count -1 do
begin
Channel := ChannelList.items[i];
if not Channel.IsUse then Continue ;
case Channel.ChannelType of
TrunkChannel:
begin
if Sig_CheckBusy(i) = 1 then //忙音检测
begin
Channel.DialActor := MasterActor ;
HangUp(Channel);//ResetChannel(i)
end;
end;
UserChannel:
begin
if (not RingDetect(i)) and (Channel.PhoneState = HangState) and (Channel.ringing = false) then
begin
if Channel.State in [calling,speck] then Channel.DialActor := MasterActor ;
ReSetChannel(i);
end;
end;
end;
DoWork(i);
end;
end;
procedure TDjTc081AC.DoWork(ChnlID: integer);
var
Channel:PChannel;
DTMFCode: string;
// freetrunk: integer;
// chnl: integer;
// Channel2:PChannel;
begin
Channel := ChannelList.items[ChnlID];
if ChnlID = TestChannle then
begin
AddLogToList('');
end;
if (Channel.ChannelType <> UserChannel) and (Channel.ChannelType <> TrunkChannel) then exit ;
case Channel.Step of
0:
begin
if RingDetect(ChnlID) then //检测摘机信号
begin
Channel.PhoneState := HangState ;
StartRecord(Channel);
case Channel.ChannelType of
UserChannel: //内线摘机 拨出电话
begin
self.OffHook(Channel);
end;
TrunkChannel: //外线摘机,呼入电话
begin
if (Channel.state = Idle) then
begin
Channel.State := Calling ;
Channel.CallActor := CallerActor ;
if Assigned(FDjSSC.OnDial) then
begin
FDjSSC.OnDial(FDjSSC,ChnlID);
end
else
begin
raise TDjException.Create(DjE_NoDialInFun);
end;
end
else
begin
end;
end;
end;
//ChannelList.items[ChnlID] := Channel ;
end;
end;
100:
begin
if (DtmfHit(ChnlID)) then
begin
Channel.PhoneState := HangState ; //软件摘机后判断话机摘机
if (Channel.dtmf = '') then //收到按键,停止播放信号音
begin
StartPlaySignal(ChnlID, SIG_STOP);
end;
DTMFCode := ConvertDTMF(GetDtmfCode(ChnlID));
Channel.Dtmf := Channel.Dtmf + DTMFCode ;
if Channel.Dtmf <> '' then
begin
if Assigned(FDjSSC.OnDTMFHit) then
begin
FDjSSC.OnDTMFHit(FDjSSC,ChnlID,Channel.Dtmf);
end;
end;
end;
end;
101: //内线呼出是对内线话机结果检测并检测外线摘机情况.
begin
if (RingDetect(ChnlID)) then
begin
if (Channel.PhoneState <> HangState) then //
begin
Channel.PhoneState := HangState ;
//StartPlaySignal(ChnlID,SIG_RINGBACK);
Self.SetLink(channel.ChannelID,Channel.ConnectChannel.ConChnlId);
end;
end;
CheckDial(Channel.ConnectChannel.Channeler) ;
end;
1000:
begin
if Assigned(FDjSSC.OnException) then
begin
FDjSSC.OnException(FDjSSC,ChnlID,DjE_NoManager);
end;
end;
1001:
begin
if (RingDetect(ChnlID)) then
begin
if (Channel.PhoneState <> HangState) then //
begin
Channel.PhoneState := HangState ;
//StartRecord(Channel);
end
else
Channel.Step := 1003;
end;
end;
1002: //内线呼内线后呼出内线状态检测
begin
if (RingDetect(ChnlID)) then
begin
if (Channel.PhoneState <> HangState) then //
begin
Channel.PhoneState := HangState ;
StartRecord(Channel);
//StartPlaySignal(ChnlID,SIG_RINGBACK);
end
else
Channel.Step := 1003;
end;
end;
1004:
begin
if (RingDetect(ChnlID)) then
if (Channel.PhoneState <> HangState) then //
begin
Channel.PhoneState := HangState;
Channel.State := Calling;
end;
if CheckPlayEnd(Channel) then
begin
StopPlayFile(Channel);
Channel.Step := 1003;
end;
end;
end; // end of case
end;
function TDjTc081AC.FinalTc081A: boolean;
begin
DisableCard;
FreeDRV ;
Result := true ;
end;
function TDjTc081AC.InitTc081A: boolean;
var
i: integer;
Channel:pChannel ;
begin
//Result := false ;
if LoadDRV > 0 then
begin
raise TDjException.Create(DjE_LoadDriveFailed);
end
else
begin
AddLogToListB('板卡驱动加载成功','板卡',LogNormal);
end;
ChannelCount := CheckValidCh();
if EnableCard(ChannelCount, 1024 * 50) > 0 then
begin
FreeDrv;
raise TDjException.Create(DjE_InitDjCardFailed);
end;
SetPackRate(FDjSSC.PackRate); //录放音压缩比率
Sig_Init(0); /////不需要判断成功失败、?
for i := 0 to ChannelCount -1 do
begin
InitDtmfBuf(i);
StartSigCheck(i);
New(Channel);
Channel.ChannelID := i ;
Channel.ChannelType := TChannelType(CheckChTypeNew(i));
case Channel.ChannelType of
UserChannel, TrunkChannel,RecordChannel:
begin
Channel.State :=Idle;
end;
Nothing:
begin
Channel.State := disabled;
end;
else
begin
Channel.State := disabled;
end;
end;
Channel.ConnectChannel.ConState := NotingConnect ;
Channel.ConnectChannel.ConChnlId := -1 ;
Channel.Dtmf := '';
Channel.Phone := '';
Channel.Step := 0;
Channel.PhoneState := HookState;
Channel.Ringing:= false ;
Channel.IsUse := False ;
Channel.PlayState := NotPlay;
Channel.Recorded.IsRecord :=false;
Channel.IsMeeting := false ;
Channel.ConnectChannel.Channeler := nil ;
ChannelList.Add(Channel);
end; // end of for
Result := true;
end;
function TDjTc081AC.ResetChannel(ChnlID:integer): boolean;
var
// chnl: integer;
Channel,ChannelOut:PChannel ;
// Channel2:PChannel;
i:integer;
begin
Channel := ChannelList.items[ChnlID] ;
if Channel.PlayState = Playing then
DjTc081.StopPlayFile(Channel);
Channel.PhoneState := HookState;
case Channel.ChannelType of
UserChannel:
begin
if Channel.Ringing then
begin
FeedPower(ChnlID);
Channel.Ringing := false ;
end;
end;
TrunkChannel:
begin
tc08a32.HangUp(ChnlID);
StartSigCheck(ChnlID);
Sig_ResetCheck(ChnlID);
//tc08a32.HangUp(ChnlID);
end;
end;
StartPlaySignal(ChnlID, SIG_STOP);
if Channel.ConnectChannel.ConState = OneConnect then
begin
if Channel.ConnectChannel.ConChnlId <> -1 then
begin
//来电话直接挂掉,不接的情况
i:= ClearLink(Channel,ChannelList.Items[Channel.ConnectChannel.ConChnlId]) ;
if i = 0 then
begin
if Assigned(FDjSSC.OnClearLink) then
begin
FDjSSC.OnClearLink(FDjSSC,Channel.ConnectChannel.ConChnlId,Channel.ChannelID);
end
else
begin
end;
end;
end;
end;
//如果软件没有挂机,则挂机.负责不用激发.
if Channel.State <> idle then
begin
StopRecord(Channel);
if Channel.IsMeeting then
if Channel.ConnectChannel.ConState = ThreeState then
begin
Channel.ConnectChannel.ConState:= OneConnect ;
Channel.ConnectChannel.ConChnlId := -1 ;
Channel.ConnectChannel.CallActive := false ;
Channel.ConnectChannel.CallerPhone := '';
Channel.ConnectChannel.Channeler := nil ;
ClearThree(Channel);
end;
end;
i:= Channel.ConnectChannel.ConChnlId;
ChannelOut := Channel.ConnectChannel.Channeler;
if Channel.State <> idle then
if Assigned(FDjSSC.OnHangUp) then
if (Assigned(ChannelOut)) and (ChannelOut.State <> idle) then
FDjSSC.OnHangUp(FDjSSC,Channel.ChannelID,Channel.ConnectChannel.ConChnlId)
else
FDjSSC.OnHangUp(FDjSSC,Channel.ChannelID,-1);
Channel.Ringing := false ;
Channel.State := Idle ;
Channel.dtmf := '';
Channel.step := 0;
Channel.IsMeeting := false ;
Channel.Meeting := nil;
if Channel.ConnectChannel.ConState = Connected then
begin
// Chnl := Channel.ConnectChannel.ConChnlId ;
// Channel2 := ChannelList.Items[chnl];
// HangUp(Channel2);
end
else
if (Channel.ConnectChannel.ConState = Ringing) then
ResetChannel(Channel.ConnectChannel.ConChnlId);
Channel.ConnectChannel.ConState := NotingConnect ;
Channel.ConnectChannel.ConChnlId := -1 ;
Channel.ConnectChannel.CallActive := false ;
Channel.ConnectChannel.CallerPhone := '';
Channel.ConnectChannel.Channeler := nil;
end;
function TDjTc081AC.ConvertDTMF(sVal: integer): string;
begin
case sval of
10: result := '0';
11: result := '*';
12: result := '#';
13: result := 'A';
14: result := 'B';
15: result := 'C';
0: result := 'D';
1..9: result := inttostr(sval);
-1: result := '';
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -