📄 msgvoc.pas
字号:
unit MsgVoc;
{Delphi 3.0 Component TMsgVoc 1.1 - written by Guido Giorgetti - Aug 98}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, ComDrv32;
type TMsgVocStatus = (stGoInit,stWaitInit,stInit,
stGoDial,stWaitDial,stDial,
stGoConn,stWaitConn,stConn,
stGoTX,stWaitTX,stTX,
stGoRX,stWaitRX,stRX,
stGoEndTX,stWaitEndTX,stEndTX,
stGoEndRX,stWaitEndRX,stEndRX,
stGoDisc,stWaitDisc,stDisc);
const MAXRXCHARS = 4096;
const MAXTXCHARS = 8192;
type
TMsgVocDTMFDataEvent = procedure( Sender: TObject; DTMF: Char ) of object;
TMsgVocOnRingDataEvent = procedure( Sender: TObject) of object;
TMsgVocPlayedDataEvent = procedure( Sender: TObject) of object;
TMsgVocOnConnDataEvent = procedure( Sender: TObject) of object;
TMsgVocOnInitDataEvent = procedure( Sender: TObject) of object;
TMsgVocOnTXDataEvent = procedure( Sender: TObject) of object;
TMsgVocOnEndTXDataEvent = procedure( Sender: TObject) of object;
TMsgVocOnRXDataEvent = procedure( Sender: TObject) of object;
TMsgVocOnEndRXDataEvent = procedure( Sender: TObject) of object;
TMsgVoc = class(TComponent)
private
{ Private declarations }
function IsDTMFCode(dtmf : Char) : Boolean;
function MemPos(stringa , str_in: PChar; maxchars : Integer) : Integer;
protected
{ Protected declarations }
FActive : Boolean;
FCountReps : Integer;
FLastingTime : Integer;
FLastingCounter : Integer;
FPollingTime : Integer;
FMsgVocStatus : TMsgVocStatus;
FComPortNumber : TComPortNumber;
FComPortBaudRate : TComPortBaudRate;
FDialNum,FInitString,FConnString,FTXString,FRXString: string;
FDiscString,FPlayFile,FRecFile : string;
FModemDialog : string;
FFileStream : TFileStream;
FRxChars : array[0..MAXRXCHARS-1] of Char;
FBytesInRxChars : Integer;
FTxChars : array[0..MAXTXCHARS-1] of Char;
FMsgVocDTMF : TMsgVocDTMFDataEvent; // Event to raise on DTMF receipt
FMsgVocOnRing : TMsgVocOnRingDataEvent; // Event to raise on RING received
FMsgVocPlayed : TMsgVocPlayedDataEvent; // Event to raise on file played
FMsgVocOnConn : TMsgVocOnConnDataEvent; // Event to raise when the modem goes into Command Voice stauts
FMsgVocOnInit : TMsgVocOnInitDataEvent; // Event to raise after the modem has been initialized
FMsgVocOnTX : TMsgVocOnTXDataEvent; // Event to raise when the modem goes into Voice transmit
FMsgVocOnEndTX: TMsgVocOnEndTXDataEvent; // Event to raise when the modem ends voice transmit
FMsgVocOnRX : TMsgVocOnRXDataEvent; // Event to raise when the modem goes into Voice receive
FMsgVocOnEndRX: TMsgVocOnEndRXDataEvent; // Event to raise when the modem ends voice receive
InternalTimer : TTimer;
FTries : Integer;
procedure SetActive(Value :Boolean);
procedure SetLastingTime(Value :Integer);
procedure SetPollingTime(Value :Integer);
procedure SetComPortNumber(Value : TComPortNumber);
procedure SetComPortBaudRate(Value : TComPortBaudRate);
procedure PlayingTimer(Sender : TObject);
procedure SetPlayFile(Value : string);
procedure SetRecFile(Value : string);
procedure SetInitString(Value : string);
procedure SetDialNum(Value : string);
procedure SetConnString(Value : string);
procedure SetTXString(Value : string);
procedure SetRXString(Value : string);
procedure SetDiscString(Value : string);
procedure ReceiveData(Sender : TObject; DataPtr: pointer; DataSize: integer);
public
{ Public declarations }
constructor Create( AOwner: TComponent ); override;
destructor Destroy; override;
published
{ Published declarations }
property Active :Boolean read FActive ;
property PollingTime :Integer read FPollingTime write SetPollingTime default 1000;
property LastingTime :Integer read FLastingTime write SetLastingTime default 10000;
property ComPortNumber :TComPortNumber read FComPortNumber write SetComPortNumber;
property ComPortBaudRate :TComPortBaudRate read FComPortBaudRate write SetComPortBaudRate ;
property CounterTime : Integer read FLastingCounter default 10000;
property RecFile : string read FRecFile write SetRecFile;
property InitString : string read FInitString write SetInitString;
property DialNum : string read FDialNum write SetDialNum;
property ConnString : string read FConnString write SetConnString;
property DiscString : string read FDiscString write SetDiscString;
property ModemDialog : string read FModemDialog;
procedure GoInit;
procedure GoDialConn;
procedure GoConn;
procedure GoTX;
procedure GoEndTX;
procedure GoRX;
procedure GoEndRX;
procedure GoDisc;
procedure Play(filename : string; numreps: Integer);
function GetStatusString : string;
function GetStatus : TMsgVocStatus;
// Event to raise when there a DTMF is received
property OnDTMF: TMsgVocDTMFDataEvent read FMsgVocDTMF write FMsgVocDTMF;
// Event to raise on RING
property OnRing: TMsgVocOnRingDataEvent read FMsgVocOnRing write FMsgVocOnRing;
// Event to raise when there a file is played
property OnPlayed: TMsgVocPlayedDataEvent read FMsgVocPlayed write FMsgVocPlayed;
// Event to raise when the modem goes into 'Command Voice' status
property OnInit: TMsgVocOnInitDataEvent read FMsgVocOnInit write FMsgVocOnInit;
// Event to raise when the modem goes into 'Voice Playing' status
property OnConn: TMsgVocOnConnDataEvent read FMsgVocOnConn write FMsgVocOnConn;
// Event to raise when the modem goes into 'Voice Playing' status
property OnTX: TMsgVocOnTXDataEvent read FMsgVocOnTX write FMsgVocOnTX;
// Event to raise when the modem stops 'Voice Playing'
property OnEndTX: TMsgVocOnEndTXDataEvent read FMsgVocOnEndTX write FMsgVocOnEndTX;
// Event to raise when the modem goes into 'Voice Recording' status
property OnRX: TMsgVocOnRXDataEvent read FMsgVocOnRX write FMsgVocOnRX;
// Event to raise when the modem stops 'Voice Recording'
property OnEndRX: TMsgVocOnEndRXDataEvent read FMsgVocOnEndRX write FMsgVocOnEndRX;
end;
procedure Register;
implementation
var
CPDModem : TCommPortDriver;
constructor TMsgVoc.Create( AOwner: TComponent );
begin
inherited Create( AOwner );
// Creates CPDModem
CPDModem := TCommPortDriver.Create(Self);
CPDModem.ComPortHwHandshaking := hhRTSCTS;
// Initialize to default values
FActive := False; {not active}
FCountReps := 1 ;
FLastingTime := 10000; {msec}
FPollingTime := 200; {msec}
InternalTimer := TTimer.Create(Self);
InternalTimer.OnTimer := PlayingTimer;
InternalTimer.Enabled := False;
FMSgVocStatus := stDisc;
FMsgVocDTMF := nil; // no data handler
end;
destructor TMsgVoc.Destroy;
begin
inherited Destroy;
end;
procedure TMSgVoc.SetActive(Value : Boolean);
begin
FActive := Value;
if FActive then
begin
if CPDModem <> nil then begin
CPDModem.Connect;
CPDModem.OnReceiveData := ReceiveData;
FMSgVocStatus := stDisc;
InternalTimer.Enabled := True;
InternalTimer.Interval := FPollingTime;
FLastingCounter := FLastingTime;
end;
end
else begin
FMSgVocStatus := stDisc;
InternalTimer.Enabled := False;
FFileStream.Free;
FFileStream := nil;
end;
FBytesInRxChars := 0; {azzera il contatore dei bytes da interpretare}
end;
procedure TMSgVoc.SetPollingTime(Value : Integer);
begin
if FMsgVocStatus = stDisc then
FPollingTime := Value;
end;
procedure TMSgVoc.SetLastingTime(Value : Integer);
begin
if FMsgVocStatus = stDisc then
FLastingTime := Value;
end;
procedure TMSgVoc.SetComportNumber(Value : TComPortNumber);
begin
if FMsgVocStatus = stDisc then begin
CPDModem.ComPort := Value;
FComPortNumber := CPDModem.ComPort;
end;
end;
procedure TMSgVoc.SetComportBaudRate(Value : TComPortBaudRate);
begin
if FMsgVocStatus = stDisc then begin
CPDModem.ComPortSpeed := Value;
FComPortBaudRate := CPDModem.ComPortSpeed;
end;
end;
procedure TMsgVoc.PlayingTimer(Sender : TObject);
var nc : Integer;
i,mp : Integer;
begin
if FLastingTime > 0 then begin
FlastingCounter := FLastingCounter - FPollingTime;
if FLastingCounter <= 0 then
begin
GoDisc; {disconnette}
// SetActive(False); {altrimenti ferma la riproduzione}
end;
end;
{Finite State Sequential Machine to handle all the phases of
connection, playing, recording and disconnecting }
case FMSgVocStatus of
stGoInit: begin
{sends the init modem string}
FRxChars := '';
CPDModem.FlushBuffers(True,True);
CPDModem.SendString('at' + FInitString + CHR(13));
FMsgVocStatus := stWaitInit;
FTries := 8;
end;
stWaitInit: begin
{waits the answer from the modem}
if MemPos(FRxChars,'OK',FBytesInRxChars) >= 0 then begin
FMsgVocStatus := stInit;
if Assigned(FMsgVocOnInit) then
FMsgVocOnInit( Self);//raises the event OnInit
end else if FTries = 0 then
FMsgVocStatus := stGoDisc
else
dec(FTries);
end;
stInit: begin
end;
stGoDial: begin
{sends string of dialing}
FBytesInRxChars := 0;
CPDModem.FlushBuffers(True,True);
CPDModem.SendString('at' + ' dt' + FDialNum + ';' + CHR(13));
FMsgVocStatus := stWaitDial;
FTries := 128;
end;
stWaitDial: begin
{attesa messaggio di OK dal modem}
if MemPos(FRxChars,'OK',FBytesInRxChars) >= 0 then
FMsgVocStatus := stDial
else if FTries = 0 then
FMsgVocStatus := stGoDisc
else
dec(FTries);
end;
stDial: begin
FMsgVocStatus := stGoConn;
end;
stGoConn: begin
{send ConnString}
FBytesInRxChars := 0;
CPDModem.FlushBuffers(True,True);
CPDModem.SendString('at' + FConnString + CHR(13));
FMsgVocStatus := stWaitConn;
FTries := 12;
end;
stWaitConn: begin
{waits VCON from the modem}
if MemPos(FRxChars,'VCON',FBytesInRxChars) >= 0 then begin
FMsgVocStatus := stConn;
if Assigned(FMsgVocOnConn) then
FMsgVocOnConn( Self);//raises the event OnConn
end else if FTries = 0 then
FMsgVocStatus := stGoDisc
else
dec(FTries);
end;
stConn: begin
end;
stGoTX: begin
{send TXString}
FBytesInRxChars := 0;
CPDModem.FlushBuffers(True,True);
CPDModem.SendString('at#VTX' + CHR(13));
FMsgVocStatus := stWaitTX;
FTries := 24;
end;
stWaitTX: begin
{attesa messaggio di CONNECT dal modem}
if MemPos(FRxChars,'CONNECT',FBytesInRxChars) >= 0 then begin
FMsgVocStatus := stTX;
if Assigned(FMsgVocOnTX) then
FMsgVocOnTX( Self);//raises the event OnTX
end
else if FTries = 0 then
FMsgVocStatus := stGoDisc
else
dec(FTries);
end;
stTX: begin
if FFileStream <> nil then begin
if FFileStream.Position < FFileStream.Size then
begin
nc := CPDModem.OutFreeSpace;
if MAXTXCHARS < nc then
nc := MAXTXCHARS;
nc := FFileStream.Read(FTxChars,nc);
CPDModem.SendData(@FTxChars,nc);
end
else begin
dec(FCountReps);
if FCountReps <= 0 then begin
if Assigned(FMsgVocPlayed) then
FMsgVocPlayed( Self);//raises the event OnPlayed
FFileStream.Free;
FFileStream := nil;
end else
FFileStream.Seek(0,soFromBeginning);
end;
end;
end;
stGoEndTX: begin
{end of playing}
FBytesInRxChars := 0;
CPDModem.FlushBuffers(True,True);
CPDModem.SendString(CHR(16) + CHR(3));{DLE + ETX}
FMsgVocStatus := stWaitEndTX;
FTries := 12;
end;
stWaitEndTX: begin
{attesa messaggio di CONNECT dal modem}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -