?? channels.pas
字號:
unit Channels;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls;
const
maxchannel = 100;
type
channel_state =
(Free, //空閑
occupy, //占用
disabled //禁止使用
);
type
channel_type = //通道內型
(user,
trunk,
nothing
);
type
TDunInfo = class
public
Sbbh: string;
//Dialnumlst: TStringList;
Dialnum: string;
end;
type
channel_structure = record
State: channel_state; // 通道狀態
Ringing: boolean; // 通道是否正在振鈴
Channeltype: channel_type; // 通道類型
Connectchannel: Integer; // 與本通道連接的通道
dtmf: string; // 本通道收到的DTMF碼
Step: integer; // 本通道當前所處流程
PlayingWaterfee: Boolean; // 是否正在播放語音流
MeterID: string; // 存儲客戶的水表編號
end;
procedure AddItemtoTellist(Achnl: Integer);
procedure InitSystem();
procedure ReleSystem();
procedure DunWaterfee(channelno: Integer);//主程序
procedure ResetChannel(channelno: Integer); //
procedure drawgrid();
function HangupCheck(Achnl: Integer): Boolean;
var
Channel: array [0..maxchannel] of channel_STRUCture;
Totalchannel: Integer;
TTSChannel: Integer;
implementation
uses tc08a32, Mainform, filectrl, DJTTS3, CallerDM;
{-------------------------------------------------------------------------------
Procedure: HangupCheck
Author: Xsp
DateTime: 2006.04.28
Arguments: Achnl: Integer
Result: Boolean
Popose: 掛機檢測
-------------------------------------------------------------------------------}
function HangupCheck(Achnl: Integer): Boolean;
begin
if Channel[Achnl].Channeltype = trunk then
Result := (ReadCheckResult(Achnl, PLAY_CHECK) = R_BUSY) and (ReadBusyCount() >= 2)
else
Result := not RingDetect(Achnl);
end;
{-------------------------------------------------------------------------------
Procedure: InitSystem
Author: Xsp
DateTime: 2006.05.09
Arguments:
Result: None
Popose: 初始化語音卡
-------------------------------------------------------------------------------}
procedure InitSystem();
var
i, t: Integer;
begin
if loaddrv > 0 then
begin
ShowMessage('驅動加載失敗!');
application.Terminate;
end;
totalchannel := checkvalidch();
if enablecard(totalchannel, 1024 * 50) > 0 then
begin
ShowMessage('初始化卡失敗!');
application.Terminate;
end;
sig_init(0);
//初始化stategrid
Mainfrm.stategrid.RowCount := totalchannel + 1;
Mainfrm.stategrid.ColCount := 4;
Mainfrm.stategrid.Cells[0, 0] := '序號';
Mainfrm.stategrid.Cells[1, 0] := '通道類型';
Mainfrm.stategrid.Cells[2, 0] := '狀態';
Mainfrm.stategrid.Cells[3, 0] := '當前操作內容';
Mainfrm.stategrid.ColWidths[1] := 60;
Mainfrm.stategrid.ColWidths[2] := 60;
Mainfrm.stategrid.ColWidths[3] := 402;
for i := 0 to totalchannel do
begin
startsigcheck(i);
initdtmfbuf(i);
Mainfrm.stategrid.Cells[0, i + 1] := IntToStr(i);
t := checkchtype(i);
if t = 0 then
begin
Mainfrm.stategrid.Cells[1, i + 1] := '內線通道';
channel[i].channeltype := user;
channel[i].state := disabled; //由于是呼出系統,因此這里的內線全部給屏蔽
Mainfrm.stategrid.Cells[3, i + 1] := '本通道不能作為呼出通道';
end
else if t = 1 then
begin
Mainfrm.stategrid.Cells[1, i + 1] := '外線通道';
channel[i].channeltype := trunk;
channel[i].state := Free;
end
else
begin
Mainfrm.stategrid.Cells[1, i + 1] := '通道懸空';
channel[i].channeltype := nothing;
channel[i].state := disabled;
Mainfrm.stategrid.Cells[3, i + 1] := '本通道不能作為呼出通道';
end;
channel[i].connectchannel := -1;
channel[i].dtmf := '';
end;// end of for
// 初始化TTS功能
DJTTS3_Init();
TTSChannel := DJTTS3_GetTotalTTSChannel();
for i := 0 to TTSChannel - 1 do
begin
if channel[i].channeltype = trunk then
DJTTS3_AddTTSToChannel(i);
end;
Mainfrm.statMain.Panels[1].Text := Format('共激活 %d 條TTS通道', [TTSChannel]);
//Mainfrm.label3.Caption := IntToStr(newreadpass(0));
Mainfrm.Timer1.Enabled := True;
end;
{-------------------------------------------------------------------------------
Procedure: ReleSystem
Author: Xsp
DateTime: 2006.05.09
Arguments:
Result: None
Popose: 釋放系統占用的資源
-------------------------------------------------------------------------------}
procedure ReleSystem();
var
I: Integer;
begin
for I := 0 to TTSChannel - 1 do
begin
if Channel[I].channeltype = trunk then
begin
DJTTS3_StopPlayText(I);
DJTTS3_DelTTSFromChannel(I);
end;
end;
DJTTS3_Release();
disablecard;
freedrv
end;
{-------------------------------------------------------------------------------
Procedure: AddItemtoTellist
Author: Xsp
DateTime: 2006.05.09
Arguments: Achnl: Integer
Result: None
Popose: 向催繳列表中加入一項未成功的資料
-------------------------------------------------------------------------------}
procedure AddItemtoTellist(Achnl: Integer);
var
Aduninfo: TDunInfo;
begin
with Mainfrm.telebox.Items do
begin
Aduninfo := TDunInfo.Create;
Aduninfo.Sbbh := Channel[Achnl].MeterID;
Aduninfo.Dialnum := Channel[Achnl].dtmf;
AddObject(Aduninfo.Dialnum, Aduninfo);
end;
end;
{-------------------------------------------------------------------------------
Procedure: DunWaterfee
Author: Xsp
DateTime: 2006.05.09
Arguments: channelno: Integer
Result: None
Popose: 催繳業務處理過程,實在太簡單:),不過作為一般的開發入門應該可以
-------------------------------------------------------------------------------}
procedure DunWaterfee(channelno: Integer);
var
dialnum: PChar;
Result, Delay: integer;
Ainfo, AmeterID, Adialnum: string;
begin
case channel[channelno].step of
0:
begin
if (channel[channelno].channeltype = trunk) and
(channel[channelno].state = Free) then
begin
if Mainfrm.telebox.Items.Count >= 1 then
begin
channel[channelno].dtmf := Mainfrm.telebox.Items.Strings[0];
Channel[channelno].MeterID := TDunInfo(Mainfrm.telebox.Items.Objects[0]).Sbbh;
//從表中取走號碼,防止另外一個通道也撥同一個號碼
Mainfrm.telebox.Items.Delete(0);
Mainfrm.Progressbar.Position := Round((dmCaller.DuntaskCount - Mainfrm.telebox.Count) / dmCaller.DuntaskCount);
Mainfrm.stategrid.cells[3, channelno + 1] :=
'撥打電話:' + channel[channelno].dtmf;
startsigcheck(channelno);
dialnum := PChar(channel[channelno].dtmf);
offhook(channelno);
channel[channelno].state := occupy;
starttimer(channelno, 4);
sig_startdial(channelno, PChar(dialnum), PChar(Mainfrm.PrefixNum), 0);
channel[channelno].step := 100;
end
end
end;
100:
begin
if ElapseTime(channelno, 4) >= 2000 then //超時處理
begin
AddItemtoTellist(channelno);
//把號碼加入到電話表中,留待下次呼出
ResetChannel(channelno);
end;
Result := sig_checkdial(channelno);
case Result of
//S_NORESULT:;//還沒有檢測到結果
S_BUSY: // 遇忙
begin
dmCaller.Dunlog(channelno, '外線', '呼出',
Format('催繳水表編號 %s 所對應的客戶欠費,電話號碼為:%s', [Channel[channelno].MeterID, Channel[channelno].dtmf]), '對方忙');
AddItemtoTellist(channelno);
ResetChannel(channelno);
end;
S_NOBODY: // 沒人接聽
begin
dmCaller.Dunlog(channelno, '外線', '呼出',
Format('催繳水表編號 %s 所對應的客戶欠費,電話號碼為:%s', [Channel[channelno].MeterID, Channel[channelno].dtmf]), '無人接聽');
AddItemtoTellist(channelno);
ResetChannel(channelno);
end;
S_NOSIGNAL: // 沒有信號
begin
dmCaller.Dunlog(channelno, '外線', '呼出',
Format('催繳水表編號 %s 所對應的客戶欠費,電話號碼為:%s', [Channel[channelno].MeterID, Channel[channelno].dtmf]), '沒有信號');
AddItemtoTellist(channelno);
ResetChannel(channelno);
end;
S_CONNECT: // 對方摘機
begin
Delay := 0;
while(Delay < 3000) do
begin
Inc(Delay, 50);
end;
dmCaller.Dunlog(channelno, '外線', '呼出',
Format('催繳水表編號 %s 所對應的客戶欠費,電話號碼為:%s', [Channel[channelno].MeterID, Channel[channelno].dtmf]), '對方摘機');
Mainfrm.stategrid.cells[3, channelno + 1] :=
Mainfrm.stategrid.cells[3, channelno + 1] + '..對方摘機,開始放音';
Ainfo := dmCaller.GetDunWaterfee(Channel[channelno].MeterID);
DJTTS3_StartPlayText(channelno, PChar(Ainfo), INFO_TEXT_BUFFER, 0, 45, 100);
channel[channelno].Step := 101;
Channel[channelno].PlayingWaterfee := True;
end;
end// end of case
end;
101:
begin
if (DJTTS3_CheckPlayTextEnd(channelno) = INFO_PLAY_COMPLATE) or HangupCheck(channelno) then
begin
AmeterID := Channel[channelno].MeterID;
Adialnum := Channel[channelno].dtmf;
ResetChannel(channelno);
dmCaller.DunInsert(AmeterID, Adialnum, 1, '催繳成功');
end;
end
end;// end of case
end;//end of dowork
{-------------------------------------------------------------------------------
Procedure: ResetChannel
Author: Xsp
DateTime: 2006.05.09
Arguments: channelno: integer
Result: None
Popose: 通道復位以便于下次進行相關的操作
-------------------------------------------------------------------------------}
procedure ResetChannel(channelno: integer);
begin
channel[channelno].state := Free;
Mainfrm.stategrid.Cells[3, channelno + 1] := '';
channel[channelno].dtmf := '';
channel[channelno].step := 0;
Channel[channelno].PlayingWaterfee := False;
if channel[channelno].channeltype = trunk then // 如果是外線通道,進行掛機
begin
hangup(channelno);
Sleep(2000);
startsigcheck(channelno);
Sig_ResetCheck(channelno);
end;
end;
{-------------------------------------------------------------------------------
Procedure: drawgrid
Author: Xsp
DateTime: 2006.05.09
Arguments:
Result: None
Popose: 更新每條通道的狀態信息
-------------------------------------------------------------------------------}
procedure drawgrid();
var
channelno: integer;
temp: string;
begin
for channelno := 0 to totalchannel do
begin
if channel[channelno].connectchannel <>-1 then
Mainfrm.stategrid.Cells[3, channelno + 1] :=
'本通道正在和第' + IntToStr(channel[channelno].connectchannel) + '通道通話';
case channel[channelno].state of
Free: Mainfrm.stategrid.Cells[2, channelno + 1] := '空閑';
occupy: Mainfrm.stategrid.Cells[2, channelno + 1] := '占用';
disabled: Mainfrm.stategrid.Cells[2, channelno + 1] := '無效';
end;//end of case
end
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -