unewdevicewizard.pas
来自「FMA is a free1 powerful phone editing to」· PAS 代码 · 共 939 行 · 第 1/2 页
PAS
939 行
lblSearchInfo.Caption := _('Searching Bluetooth...') + Reason;
Application.ProcessMessages;
if FCanceled then exit;
try
FConnectionType := 0;
if Assigned(BtDevices) then
for i := 0 to BtDevices.Count-1 do begin
if FCanceled or Application.Terminated then break;
DevName := BtDevices[i].btDeviceName;
DevAddr := IntToHex(BtDevices[i].btDeviceAddr,12);
LocalWBtSocket.Addr := DevAddr;
LocalWBtSocket.Port := '0';
LocalWBtSocket.Connect;
try
while LocalWBtSocket.State = wsConnecting do WaitASec(50,True);
ProbeDevice;
finally
if LocalWBtSocket.State = wsConnected then LocalWBtSocket.Close;
end;
end;
except
end;
end;
// infrared
if cbSearchIR.Checked then begin
try
IrDevices := LocalWIrSocket.GetConnectedDevices;
except
AddDevice(_('Native Infrared is not supported!'));
end;
lblSearchInfo.Caption := _('Searching Infrared...') + Reason;
Application.ProcessMessages;
if FCanceled then exit;
try
FConnectionType := 1;
if Assigned(IrDevices) then
for i := 0 to IrDevices.Count-1 do begin
if FCanceled or Application.Terminated then break;
DevName := IrDevices.Items[i].irdaDeviceName;
DevAddr := IntToHex(DWORD(IrDevices.Items[i].irdaDeviceID[1]),8);
LocalWIrSocket.DeviceID := IrDevices.Items[i].irdaDeviceID;
LocalWIrSocket.Connect;
try
while LocalWIrSocket.State = wsConnecting do WaitASec(50,True);
ProbeDevice;
finally
if LocalWIrSocket.State = wsConnected then LocalWIrSocket.Close;
end;
end;
except
end;
end;
// serial cable
if cbSearchCOM.Checked then begin
lblSearchInfo.Caption := _('Searching Ports...') + Reason;
Application.ProcessMessages;
if FCanceled then exit;
FConnectionType := 2;
DevName := '';
ComPortList := TStringList.Create;
try
EnumLikelyComPorts(ComPortList);
for i := 0 to ComPortList.Count-1 do
try
if FCanceled or Application.Terminated then break;
LocalComPort.Port := ComPortList[i];
LocalComPort.BaudRate := br9600;
LocalComPort.FlowControl.ControlRTS := rtsHandshake;
LocalComPort.FlowControl.ControlDTR := dtrHandshake;
LocalComPort.Open;
// Give the chance to run the com thread.
// The main event loop in TComThread.Execute have to be started (see the CPort.pas)
WaitASec(200, True);
try
DevAddr := ComPortList[i];
ProbeDevice;
finally
LocalComPort.Close;
end;
except
end;
finally
ComPortList.Free;
end;
end;
FSearchCompleted := not FCanceled;
finally
if Assigned(IrDevices) then IrDevices.Free;
if Assigned(BtDevices) then BtDevices.Free;
lblSearchInfo.Caption := _('Select prefered phone device and click Next to continue.');
NoItemsPanel.Visible := lvDevices.Items.Count = 0;
Animate1.Active := False;
Animate1.Visible := False;
PreviousButton.Visible := True;
NextButton.Visible := True;
RefreshButton.Enabled := True;
end;
end;
procedure TfrmNewDeviceWizard.LocalComPortRxChar(Sender: TObject;
Count: Integer);
var
c: char;
i: Integer;
buffer: String;
PStr: PChar;
begin
if FConnectionType = 0 then begin
SetLength(buffer, 2048);
SetLength(buffer, LocalWBtSocket.Receive(@buffer[1], 2048));
end
else if FConnectionType = 1 then begin
SetLength(buffer, 2048);
SetLength(buffer, LocalWIrSocket.Receive(@buffer[1], 2048));
end
else begin
SetLength(buffer, Count);
LocalComPort.ReadStr(buffer, Count);
end;
if ThreadSafe.DoCharConvertion then
buffer := GSMDecode7Bit(buffer);
{ process received data }
for i := 1 to length(buffer) do begin
c := buffer[i];
//if ThreadSafe.DoCharConvertion then c := ConvertCharSet(c);
case c of
#00:;
#10:;
#13:
begin
if length(trim(FMessageBuf)) > 0 then
begin
PStr := StrNew(PChar(FMessageBuf));
PostMessage(Handle, WM_HANDLEMESSAGE, Integer(PStr), 0);
end;
FMessageBuf := '';
end;
else begin
FMessageBuf := FMessageBuf + c;
end;
end;
if (FMessageBuf = 'OK') and (FMessageBuf <> '') then begin
PStr := StrNew(PChar(FMessageBuf));
PostMessage(Handle, WM_HANDLEMESSAGE, Integer(PStr), 0);
FMessageBuf := '';
end;
end;
end;
procedure TfrmNewDeviceWizard.HandleMessage(var Msg: TSearchHandleMessage);
var
s: string;
begin
s := Msg.Message;
StrDispose(Msg.Message);
FReceived := (CompareText('OK',s) = 0) or (CompareText('ERROR',s) = 0);
FRxBuffer.Add(s);
inherited;
end;
procedure TfrmNewDeviceWizard.TxAndWait(Data: string);
var
FMSec: cardinal;
begin
FReceived := False;
FMessageBuf := '';
FRxBuffer.Clear;
if ThreadSafe.DoCharConvertion then
Data := GSMEncode7Bit(Data);
{ Send command }
if FConnectionType = 0 then LocalWBtSocket.SendStr(Data + #13) // Blutooth
else if FConnectionType = 1 then LocalWIrSocket.SendStr(Data + #13) // Infrared
else LocalComPort.WriteStr(Data + #13); // Serial
{ Set timeout, max 5 seconds }
FMSec := ThreadSafe.InactivityTimeout;
if FMSec > 5000 then FMSec := 5000;
FMSec := GetTickCount + FMSec;
{ Wait for response }
while not FCanceled and not FReceived and not Application.Terminated do begin
WaitASec(10,True);
if GetTickCount > FMSec then
raise EInOutError.Create('Timeout'); // do not localize
end;
if FReceived and (CompareText('ERROR',FRxBuffer[0]) = 0) then
raise EInOutError.Create('AT Error'); // do not localize
end;
procedure TfrmNewDeviceWizard.OnSocketDataAvailable(Sender: TObject;
Error: Word);
begin
if Error = 0 then LocalComPortRxChar(nil, 0);
end;
procedure TfrmNewDeviceWizard.TntPopupMenu1Popup(Sender: TObject);
begin
Refresh1.Enabled := RefreshButton.Enabled;
end;
procedure TfrmNewDeviceWizard.Refresh1Click(Sender: TObject);
begin
DoSearch;
end;
procedure TfrmNewDeviceWizard.AsIcons1Click(Sender: TObject);
begin
lvDevices.ViewStyle := vsIcon;
end;
procedure TfrmNewDeviceWizard.AsList1Click(Sender: TObject);
begin
lvDevices.ViewStyle := vsReport;
end;
procedure TfrmNewDeviceWizard.TntFormDestroy(Sender: TObject);
begin
FRxBuffer.Free;
end;
procedure TfrmNewDeviceWizard.AddDevice(Text: WideString; Address: string;
FriendlyName, Manufacturer: WideString);
begin
{ for modems: ImageIndex := 3 }
if (Text <> '') and (WidePos('MODEM',WideUpperCase(Text)) = 0) then
with lvDevices.Items.Add do begin
Caption := Text; // Device name
SubItems.Add(Address); // Peer Bluetooth address or COM port name
SubItems.Add(FriendlyName);
SubItems.Add(Manufacturer);
if Address <> '' then begin
case FConnectionType of
0: ImageIndex := 0;
1: ImageIndex := 1;
2: ImageIndex := 2;
end;
StateIndex := 5; // Phone found!
end
else
ImageIndex := 4; // No address, so it is a warning message
Data := Pointer(FConnectionType); // Connection type
end;
end;
procedure TfrmNewDeviceWizard.DoCalibrateConnection;
var
i: integer;
dlg: TfrmStatusDlg;
begin
if Integer(lvDevices.Selected.Data) = ndcSerial then // serial?
try
dlg := ShowStatusDlg(_('Calibrating Port Speed...'),poMainFormCenter);
try
if Form1.IsK750orBetter(FSelected.DeviceName) then begin
{ K750 working settings: Port:'COM X', Baud:256000, RTS:Handshake, DTR:Enabled }
LocalComPort.BaudRate := br256000;
LocalComPort.FlowControl.ControlRTS := rtsHandshake;
LocalComPort.FlowControl.ControlDTR := dtrEnable;
end;
{ Get already tested speed }
i := Ord(LocalComPort.BaudRate);
while i < Ord(High(TBaudRate)) do begin
{ try next higher speed }
inc(i);
LocalComPort.BaudRate := TBaudRate(i);
LocalComPort.Open;
// Give the chance to run the com thread.
// The main event loop in TComThread.Execute have to be started (see the CPort.pas)
WaitASec(200, True);
try
try
{ Check if we can transmit/receive on that speed }
TxAndWait('ATE0'); // do not localize
if not FReceived then Abort; // just in case
except
{ Revert to previous speed and exit }
LocalComPort.BaudRate := TBaudRate(i-1);
break;
end;
finally
LocalComPort.Close;
end;
end;
finally
dlg.Free;
end;
except
// be silent
end;
end;
procedure TfrmNewDeviceWizard.cbDeviceReadyClick(Sender: TObject);
begin
FSearchCompleted := False;
NextButton.Enabled := cbDeviceReady.Checked and
(cbSearchBT.Checked or cbSearchIR.Checked or cbSearchCOM.Checked);
NextButton.Default := NextButton.Enabled;
if cbDeviceReady.Checked then begin
cbSearchBT.Enabled := True;
cbSearchIR.Enabled := True;
cbSearchCOM.Enabled := True;
cbSearchAll.Enabled := True;
end;
end;
procedure TfrmNewDeviceWizard.lvDevicesSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
begin
{ Allow selection of devices which have Manufacturer field set, i.e. support AT+CGMI }
NextButton.Enabled := Assigned(lvDevices.Selected) and (lvDevices.Selected.StateIndex = 5);
NextButton.Default := NextButton.Enabled;
end;
procedure TfrmNewDeviceWizard.OnUSBDeviceChange(Sender: TObject);
begin
if nbWizard.PageIndex = piSearch then begin
Timer1.Enabled := False;
Timer1.Enabled := True;
end;
end;
procedure TfrmNewDeviceWizard.Timer1Timer(Sender: TObject);
begin
if nbWizard.PageIndex = piSearch then begin
if RefreshButton.Enabled then begin
Timer1.Enabled := False;
DoSearch(_('USB device arrival or removed'));
end
else
{ Restart searching due to device change }
FCanceled := True;
end
else
Timer1.Enabled := False;
end;
function TfrmNewDeviceWizard.Get_DontShowVis: boolean;
begin
Result := cbDontShow.Visible;
end;
procedure TfrmNewDeviceWizard.Set_DontShowVis(const Value: boolean);
begin
cbDontShow.Visible := Value;
lblWelcomeNext.Visible := not Value;
end;
function TfrmNewDeviceWizard.Get_DontShow: boolean;
begin
Result := IsDontShowVisible and cbDontShow.Checked;
end;
procedure TfrmNewDeviceWizard.cbDontShowClick(Sender: TObject);
begin
if cbDontShow.Checked then
CancelButton.Caption := _('&Close')
else
CancelButton.Caption := _('&Cancel');
end;
procedure TfrmNewDeviceWizard.DoCheckObex;
var
dlg: TfrmStatusDlg;
begin
if Integer(lvDevices.Selected.Data) = ndcSerial then // serial?
try
dlg := ShowStatusDlg(_('Checking OBEX support...'),poMainFormCenter);
try
LocalComPort.Open;
// Give the chance to run the com thread.
// The main event loop in TComThread.Execute have to be started (see the CPort.pas)
WaitASec(200, True);
try
TxAndWait('ATE0'); // do not localize
if not FReceived then Abort; // just in case
try
TxAndWait('AT*EOBEX=?'); // do not localize
if not FReceived then begin
FSelected.DisableObex := True;
FSelected.DisableIrmcSync := True;
end;
except
end;
if FSelected.DisableObex then
try
TxAndWait('AT+CPROT=?'); // do not localize
FSelected.DisableObex := not FReceived;
FSelected.DisableIrmcSync := not FReceived;
except
end;
finally
LocalComPort.Close;
end;
finally
dlg.Free;
end;
except
// be silent
end;
end;
procedure TfrmNewDeviceWizard.lvDevicesInsert(Sender: TObject;
Item: TListItem);
begin
NoItemsPanel.Visible := False;
end;
procedure TfrmNewDeviceWizard.cbSearchAllClick(Sender: TObject);
begin
cbSearchBT.Checked := cbSearchAll.Checked;
cbSearchIR.Checked := cbSearchAll.Checked;
cbSearchCOM.Checked := cbSearchAll.Checked;
cbDeviceReadyClick(nil);
end;
procedure TfrmNewDeviceWizard.EnumLikelyComPorts(var AList: TStringList);
var
reg: TRegistry;
i: integer;
s: string;
Ports: TStrings;
begin
AList.Clear;
reg := TRegistry.Create(KEY_READ);
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM', False) then
try
Ports := TStringList.Create;
try
reg.GetValueNames(Ports);
for i := 0 to Ports.Count-1 do begin
if Ports[i] <> '' then begin
if (Pos('\', Ports[i]) = 0) or (Pos('obex', Ports[i]) <> 0) or (Pos('mgmt', Ports[i]) <> 0) then
Continue; // these ports are evil, hide them :)
s := reg.ReadString(Ports[i]);
AList.Add(s);
end;
end;
finally
Ports.Free;
end;
finally
reg.CloseKey;
end;
finally
reg.Free;
end;
AList.Sort;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?