📄 adgsm.pas
字号:
DoFail(ErrorMessage, ErrorCode); {!!.06}
//raise Exception.Create('Exception ' + IntToStr(ErrorCode) + ' ' + {!!.06}
//ErrorMessage); {!!.06}
end;
procedure TApdCustomGSMPhone.ResponseStringPacket(Sender: TObject;
Data: string);
begin
// Handle data from packet -State Machine-
ResponseStr := Data;
PostMessage(FHandle, ApdGSMResponse, 0,0);
end;
procedure TApdCustomGSMPhone.NotifyStringPacket(Sender: TObject; {!!.02}
Data: string); {!!.02}
var {!!.02}
MessageIndex : Integer; {!!.02}
begin {!!.02}
NotifyStr := Data; {!!.02}
if NotifyStr <> '' then
begin {!!.02}
if assigned(FOnNewMessage) then
begin {!!.02}
NotifyStr := Copy(NotifyStr,
Pos('",', NotifyStr) + 2, Length(NotifyStr)); {!!.02}
MessageIndex := StrToInt(NotifyStr); {!!.02}
//if Assigned(FOnNewMessage) then begin {!!.02}
{ if OnNewMessage event then PostMessage to Synchronize/ListAllMessages }
FNeedNewMessage := MessageIndex; {!!.04}
PostMessage(FHandle, ApdGSMResponse, 1,0); {!!.04}
// FOnNewMessage(Self, MessageIndex, TheMessage); {!!.02} {!!.04}
//end; {!!.04} {!!.06}
end; {!!.02}
end; {!!.02}
end; {!!.02}
{ issues +CMGL to list all messages with a Status of ssUnsend}
procedure TApdCustomGSMPhone.ListAllMessages;
var
Res : Integer;
ET : EventTimer;
begin
if FQuickConnect then {!!.06}
exit; {!!.06}
if FGSMState > gsNone then
begin
DoFail(secSMSBusy,-8100);
Exit;
end;
if not FConnected then
begin
{ Do connection/configuration stuff }
DoFail(secBadOperation,-8302);
Exit;
end;
CmdIndex := 0;
SetState(gsListAll);
FMessageStore.ClearStore;
FComPort.FlushInBuffer;
ResponsePacket.StartCond := scAnyData; {!!.02}
//ResponsePacket.StartString := #13#10; {!!.02}
//ResponsePacket.StartString := '+CMGL: '; {!!.02}
ResponsePacket.EndString := #13#10'OK'#13#10; {!!.02}
ResponsePacket.IncludeStrings := True; {!!.04}
ResponsePacket.Enabled := True;
//DelayTicks(4, True); {!!.04}
FComPort.Output := 'AT' + GSMListAllMessagesCommands[CmdIndex] +'=4'+#13#10;
FComPort.Output := 'AT'#13;
NewTimer(ET, ExpiredTime+500); // 60 second timer
DelayTicks(1, True); {!!.06}
repeat
Sleep(SLEEPTIME);
Res := SafeYield;
until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
if TimerExpired(ET) then
begin
DoFail(secSMSTimedOut,-8101);
Exit;
end;
end;
{ issues +CMSS to send message from storage indexed by Index }
procedure TApdCustomGSMPhone.SendFromMemory(TheIndex: Integer);
var
Res : Integer;
ET : EventTimer;
begin
if FGSMState > gsNone then begin
DoFail(secSMSBusy,-8100);
Exit;
end;
if not FConnected then begin
{ Do connection/configuration stuff }
FQuickConnect := False;
Connect;
end;
CmdIndex := 0;
SetState(gsSendFStore);
ResponsePacket.StartString := '+CMSS: ';
ResponsePacket.EndString := #13#10'OK';
ResponsePacket.ComPort := FComPort;
ResponsePacket.Enabled := True;
//DelayTicks(4, True); {!!.04}
FComPort.Output := 'AT' + GSMSendMessFromStorage[CmdIndex] +
IntToStr(TheIndex) + #13;
NewTimer(ET, ExpiredTime); // 60 second timer
repeat
Sleep(SLEEPTIME);
Res := SafeYield;
until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
if TimerExpired(ET) then
begin
DoFail(secSMSTimedOut,-8101);
Exit;
end;
end;
procedure TApdCustomGSMPhone.Dial;
var
Res : Integer;
ET : EventTimer;
OutPutStr: String;
begin
HangUp;
if (FGSMState <> gsNone) and (FGSMState<>gsDialed) then
begin
DoFail(secSMSBusy,-8100);
Exit;
end;
if not FConnected then
Connect;
CmdIndex := 0; {!!.06}
// ResponsePacket.EndString := #13; {!!.01}
// ResponsePacket.StartString := GSMDialResponse[CmdIndex];
// ResponsePacket.Enabled := True;
DialErrorPacket.Enabled := false;
SetState(gsDialed);
OutPutStr := GSMDialCommand[CmdIndex]+SMSAddress+';'#13;
// OutPutStr :=GSMDialCommand[CmdIndex] + #13;
FComPort.Output := OutPutStr;
DelayTicks(9, True); {!!.06}
DialErrorPacket.Enabled := true;
// DialErrorPacket.AutoEnable
DelayTicks(9, True); {!!.06}
// OutPutStr :='AT' + #13;
// FComPort.Output := OutPutStr;
// NewTimer(ET, 1080); // 60 second timer
NewTimer(ET, DialExpiredTime); // 60 second timer
repeat
Sleep(SLEEPTIME);
Res := SafeYield;
until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
{ if FGSMState= gsNone then
begin
DoFail(secSMSTimedOut,-8101);
Exit;
end;
SetState(gsDialed);
}
end;
procedure TApdCustomGSMPhone.HangUp;
var
Res : Integer;
ET : EventTimer;
OutPutStr: String;
begin
if (FGSMState <> gsNone) and (FGSMState<>gsDialed) then
begin
DoFail(secSMSBusy,-8100);
Exit;
end;
if not FConnected then
Connect;
CmdIndex := 0; {!!.06}
ResponsePacket.EndString := #13; {!!.01}
ResponsePacket.StartString := GSMHangUpResponse[CmdIndex];
ResponsePacket.Enabled := True;
//DelayTicks(4, True); {!!.04}
SetState(gsHangUp);
OutPutStr :=GSMHangUpCommand[CmdIndex] + #13;
FComPort.Output := OutPutStr;
// NewTimer(ET, 1080); // 60 second timer
NewTimer(ET, ExpiredTime); // 60 second timer
repeat
Sleep(SLEEPTIME);
Res := SafeYield;
until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
if TimerExpired(ET) then
begin
DoFail(secSMSTimedOut,-8101);
Exit;
end;
end;
{ issues +CMGS to send message without placing the message in memory }
procedure TApdCustomGSMPhone.SendMessage;
var
Res : Integer;
ET : EventTimer;
OutPutStr: String;
begin
if FGSMState > gsNone then
begin
DoFail(secSMSBusy,-8100);
Exit;
end;
if not FConnected then begin
{ Do connection/configuration stuff }
Connect;
end;
//if FNotifyOnNewMessage then {!!.01}{!!.06}
// CmdIndex := 0 {!!.01}{!!.06}
//else {!!.01}{!!.06}
//CmdIndex := 1; // Handled in the gsConfig {!!.06}
CmdIndex := 0; {!!.06}
ResponsePacket.EndString := #13; {!!.01}
ResponsePacket.StartString := GSMSendMessageResponse[CmdIndex];
ResponsePacket.Enabled := True;
//DelayTicks(4, True); {!!.04}
SetState(gsSend);
OutPutStr := 'AT' + GSMSendMessageCommands[CmdIndex] + #13;
FComPort.Output := OutPutStr;
// NewTimer(ET, 1080); // 60 second timer
NewTimer(ET, ExpiredTime); // 60 second timer
repeat
Sleep(SLEEPTIME);
Res := SafeYield;
until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
if TimerExpired(ET) then
begin
DoFail(secSMSTimedOut,-8101);
Exit;
end;
end;
procedure TApdCustomGSMPhone.SetMessage(const Value: string);
begin
if Length(Value) > 160 then
begin
DoFail(secSMSTooLong,-8102);
Exit;
end;
FMessage := Value;
end;
{ enables/disables new message notification (+CNMI), new messages provided
through OnNewMessage event }
procedure TApdCustomGSMPhone.SetNotifyOnNewMessage(const Value: Boolean);
begin
FNotifyOnNewMessage := Value;
// Return True for then +CMTI for New Message Indications to TE
end;
procedure TApdCustomGSMPhone.DialErrorStringPacket(Sender: TObject;
Data: string);
var
ErrorCode : Integer;
ErrorMessage : string;
Temp : string;
begin
//Display Message Service Failure Result Code
Temp := Data;
if Temp <> '' then {!!.06}
begin {!!.06}
ErrorCode := -4012; {!!.06}
ErrorMessage := 'No carrier'; {!!.06}
end; {!!.06}
FGSMState := gsNone;
// DoFail(ErrorMessage, ErrorCode); {!!.06}
//raise Exception.Create('Exception ' + IntToStr(ErrorCode) + ' ' + {!!.06}
//ErrorMessage); {!!.06}
end;
{ TApdMessageStore }
function TApdMessageStore.AddMessage(const Dest, Msg: string): Integer;
var
SMS : TApdSMSMessage;
begin
SMS := nil;
try
SMS := TApdSMSMessage.Create;
SMS.Message := Msg;
SMS.Address := Dest;
SMS.TimeStampStr := FormatDateTime('yy/mm/dd/hh:mm:ss', Now);
SMS.Status := ssUnsent;
Result := AddObject(SMS.TimeStampStr, SMS);
finally
SMS.Free;
end;
end;
{ Clear all Messages }
procedure TApdMessageStore.Clear;
begin
inherited;exit;
// Clear All messages
while Count > 0 do begin
if Objects[Count - 1] <> nil then begin
TApdSMSMessage(Objects[Count - 1]).Free;
Objects[Count - 1] := nil;
end;
Delete(Count - 1);
end;
end;
{ Just clears our message store - not the phone }
procedure TApdMessageStore.ClearStore;
begin
JustClearStore := True;
Clear;
JustClearStore := False;
end;
{ Create Message Store }
constructor TApdMessageStore.Create(GSMPhone : TApdCustomGSMPhone);
begin
FGSMPhone := GSMPhone;
JustClearStore := False;
end;
{ issues +CMGD to Delete Message at Index }
procedure TApdMessageStore.Delete(PhoneIndex: Integer);
var
I : Integer;
begin
if (FGSMPhone.FConnected) and not(JustClearStore) then
FGSMPhone.DeleteFromMemoryIndex(PhoneIndex)
else
begin
for I := 0 to pred(Count) do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -