⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 djbase.pas

📁 自己写的用delphi封装东劲板卡api.
💻 PAS
字号:
unit DjBase;

interface

uses SyncObjs,SysUtils,ExtCtrls,Classes,messages;

const

  MaxChannel = 100;

const
  WM_ReceiveMessage = WM_USER + 501 ;
  WM_Test   = WM_USER + 502 ;
  WM_SEATSTATECHANGE = WM_USER +503 ;
  WM_HANGUP = WM_USER + 504;
  WM_HANGOFF = WM_USER + 505 ;
  WM_OFFHOOK = WM_USER + 506 ;
  WM_CALLOUT = WM_USER + 507 ;
  WM_KEEP = WM_USER + 508 ;
  WM_GETKEEP = WM_USER + 509 ;
  WM_BEGINTHREECALL = WM_USER + 510 ;
  WM_ENDTHREECALL = WM_USER + 511 ;
  WM_ENJOY = WM_USER + 512 ;
  WM_STOPENJOY = WM_USER + 513 ;

const
  DjE_InitError = 0 ;
  DjE_FinalError = 1 ;
  DjE_LoadDriveFailed = 2 ;
  DjE_InitDjCardFailed =3 ;
  DjE_NoDialInFun = 4 ;
  DjE_IsNotForm = 5 ;
  DjE_NoManager= 6 ;
  DjE_LINKTHREE = 7 ;  

const
  S_TimeOut = 0;
  

type

  TDjException = class(Exception)
  private
    FErrorCode :Integer;
  public
    constructor Create(ErrorCode:Integer);
    property ErrorCode:integer read FErrorCode;
  end;

type

  TRecordType =
  (
    ShengKong,           //声控
    YaKong               //压控
  );

  TPlayState =
  (
    Playing,
    NotPlay
  );

  TRecord = record
    IsRecord :Boolean;
    Recording:boolean;
    
    RecordChannel:Integer;
    RecordType : TRecordType ;
    IsAGC:boolean;
    FileName:array[0..159] of char;
  end;

type
  TChannelState =
  (
    Idle, //空闲     (软件挂机)
    occupy, //占用
    Calling,         //(呼出)
    CallNuming, //呼出拨号阶段
    Dailing,    //呼入
    Speck,      //通话
    keep,
    DailEnd,
    disabled, //禁止使用
    NotingState
  );

type

  TChannelType = //通道内型
  (
    UserChannel,
    TrunkChannel,
    Nothing,
    RecordChannel
  );

type
  TConnectState =
  (
    Ringing,
    Connected,
    OneConnect,
    ThreeState,
    MeetingState,
    Keeping,
    NotingConnect
  );

type
  TConnectStep =
  (
     InitStep = 0 ,
     ringstep
  );

type
  TPhoneState =
  (
    HangState,   //挂机
    HookState   //摘机
  );

type

  //区分主动摘机,被动摘机
  TCallActor =
  (
    CallerActor,
    DialerActor
  );

  //主动挂机/被动挂机
  TDialActor =
  (
    MasterActor,
    Slaveactor
  );


type
  TConnectChannel = record
    ConState : TConnectState ;
    ConChnlId : Integer;
    CallActive:boolean;
    CallerPhone:string;
    Channeler :pointer;
    DailerPhone:string;
  end;


type
  PMeeting = ^TMeeting;
  TMeeting = record
    IsUse :boolean;
    MeetingID:integer;
    ChannelList:TList;
  end;

type
  PChannel = ^TChannel;
  TChannel = record
    ChannelID:integer;
    State: TChannelState;
    Ringing: boolean; //通道是否正在振铃
    ChannelType: TChannelType;
    ConnectChannel: TConnectChannel; //与本通道连接的通道
    Dtmf: string; //本通道收到的DTMF码
    Step: integer;
    Phone:string; //本通道分配的电话号码
    IsUse :Boolean ;
    PhoneState:TPhoneState;
    IsMeeting:Boolean;
    Meeting:PMeeting;
    Recorded:TRecord ;
    PlayState:TPlayState;
    CallActor:TCallActor;
    DialActor:TDialActor;
  end;

type
  TMeetingList = class
  private
    MeetGroup:array[0..9] of PMeeting;
    function GetMeeting(Index:integer):PMeeting;
  protected
  public
    constructor Create;
    destructor Destroy;override;
    function GetFreeMeeting:PMeeting ;
    property items[index:integer] :PMeeting read GetMeeting ;
  end;

type

  TChannelList = class(TThreadList)
  private
    function GetCount :Integer;
    function GetItems(Index:integer):PChannel;
  protected
  public
    constructor Create;
    destructor Destroy;override;
    property Count :integer read GetCount;
    property Items[Index:integer]:PChannel read GetItems;
    function GetChannelFromPhone(Phone:string):PChannel ;
    //function GetChannelFromCallerPhone(Phone:string):PChannel ;
    function GetFreeTurnk:PChannel;
  end;

var
  ChannelList :TChannelList;

implementation

{ TChannelList }

{-------------------------------------------------------------------------------
  过程名:    TChannelList.Create
  作者:      fengfan
  日期:      2006.08.29
  参数:      无
  返回值:    无
-------------------------------------------------------------------------------}
constructor TChannelList.Create;
begin
  inherited;
end;

{-------------------------------------------------------------------------------
  过程名:    TChannelList.Destroy
  作者:      fengfan
  日期:      2006.08.29
  参数:      无
  返回值:    无
-------------------------------------------------------------------------------}
destructor TChannelList.Destroy;
begin

  inherited;
end;

{-------------------------------------------------------------------------------
  过程名:    TChannelList.SetChannel
  作者:      fengfan
  日期:      2006.08.29
  参数:      Index: integer; Channel: PChannel
  返回值:    无
-------------------------------------------------------------------------------}
//function TChannelList.GetCount: Integer;
//var
//  List :TList ;
//begin
//  List := LockList;
//  Result := List.Count;
//  UnlockList;
//end;

{ TDjException }

constructor TDjException.Create(ErrorCode: Integer);
begin
  inherited CreateRes(ErrorCode);
  FErrorCode := ErrorCode;
end;



function TChannelList.GetChannelFromPhone(Phone: string): PChannel;
var
  List:TList ;
  Channel:PChannel ;
  i:integer;
begin
  Result := nil ;
  List := LockList;
  try
    for i:=0 to List.Count -1 do
    begin
      Channel := List.Items[i];
      if Channel.Phone = Phone then
      begin
        Result := Channel;
        break;
      end;
    end;
  finally
    UnlockList ;
  end;
end;

function TChannelList.GetCount: Integer;
var
  List:TList;
begin
  List := LockList ;
  result := List.Count ;
  UnlockList;
end;

function TChannelList.GetFreeTurnk: PChannel;
var
  List:TList ;
  i:integer;
  Channel :PChannel ;
begin
  Result := nil ;
  List := LockList;
  for i:=0 to List.Count -1 do
  begin
    Channel := List.items[i];
    if (Channel.ChannelType = TrunkChannel) and (Channel.IsUse) then
      if Channel.State = Idle then
      begin
        Result := Channel ;
        break;
      end;
  end;
  UnlockList;
end;

function TChannelList.GetItems(Index: integer): PChannel;
var
  List:TList ;
begin
  List := LockList;
  if Index < List.Count then
  begin
    Result := (List.items[index]);
  end
  else
  begin
    result := nil;
  end;
  UnlockList;
end;

{ TMeetingList }

constructor TMeetingList.Create;
var
  i:integer;
//  Meeting:PMeeting;
begin
  inherited create;
  for i := low(MeetGroup) to High(MeetGroup) do
  begin
    new(MeetGroup[i]);
    MeetGroup[i].IsUse := False ;
    MeetGroup[i].MeetingID := i+1 ;
    MeetGroup[i].ChannelList:= TList.Create;
  end;
end;

destructor TMeetingList.Destroy;
begin

  inherited;
end;

function TMeetingList.GetFreeMeeting: PMeeting;
var
  i:integer;
  Meeting:PMeeting;
begin
  Meeting:= nil;
  for i := low(MeetGroup) to High(MeetGroup) do
  begin
    if Assigned(MeetGroup[i]) then
    begin
      if not MeetGroup[i].IsUse then
      begin
        Meeting :=  MeetGroup[i] ;
        break;
      end;
    end;
  end;
  Result := Meeting ;
end;

function TMeetingList.GetMeeting(Index: integer): PMeeting;
begin
  if Index in [Low(MeetGroup)..High(MeetGroup)] then
    Result := MeetGroup[Index]
  else
    Result := nil ;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -