• R/O
  • SSH
  • HTTPS

onstepper: Commit


Commit MetaInfo

Revision7 (tree)
Time2022-04-23 00:07:07
Authorderekwildstar

Log Message

Mais recursos adicionados
Evolução no sistema de conexão/desconexão
Tela de parâmetros criada
Criação de unit de constantes para resourcestrings e outras constantes

Change Summary

Incremental Difference

--- trunk/prj/OnStepper.dpr (revision 6)
+++ trunk/prj/OnStepper.dpr (revision 7)
@@ -1,9 +1,5 @@
11 program OnStepper;
22
3-
4-
5-
6-
73 {$R *.dres}
84
95 uses
@@ -11,7 +7,7 @@
117 KRK.Vcl.Forms,
128 Vcl.Themes,
139 Vcl.Styles,
14- UKRFMPrincipal in '..\src\UKRFMPrincipal.pas' {KRFMPrincipal},
10+ UKrfmPrincipal in '..\src\UKrfmPrincipal.pas' {KrfmPrincipal},
1511 UFuncoes in '..\src\UFuncoes.pas',
1612 UDamoPrincipal in '..\src\UDamoPrincipal.pas' {DamoPrincipal: TDataModule},
1713 UClassesAjudantes in '..\src\UClassesAjudantes.pas',
@@ -18,7 +14,10 @@
1814 UFramBasico in '..\src\UFramBasico.pas' {FramBasico: TFrame},
1915 UFramLocaisDeObservacao in '..\src\UFramLocaisDeObservacao.pas' {FramLocaisDeObservacao: TFrame},
2016 UOnStepInfo in '..\src\UOnStepInfo.pas',
21- UTipos in '..\src\UTipos.pas';
17+ UTipos in '..\src\UTipos.pas',
18+ UConfiguracoes in '..\src\UConfiguracoes.pas',
19+ UConstantes in '..\src\UConstantes.pas',
20+ UKrfmParametros in '..\src\UKrfmParametros.pas' {KrfmParametros: TKRKForm};
2221
2322 {$R *.res}
2423
@@ -28,6 +27,6 @@
2827 Application.MainFormOnTaskbar := True;
2928 Application.Title := 'OnStepper';
3029 TStyleManager.TrySetStyle('Cyan Night');
31- Application.CreateForm(TKRFMPrincipal, KRFMPrincipal);
30+ Application.CreateForm(TKrfmPrincipal, KrfmPrincipal);
3231 Application.Run;
3332 end.
--- trunk/prj/OnStepper.dproj (revision 6)
+++ trunk/prj/OnStepper.dproj (revision 7)
@@ -109,8 +109,8 @@
109109 <DelphiCompile Include="$(MainSource)">
110110 <MainSource>MainSource</MainSource>
111111 </DelphiCompile>
112- <DCCReference Include="..\src\UKRFMPrincipal.pas">
113- <Form>KRFMPrincipal</Form>
112+ <DCCReference Include="..\src\UKrfmPrincipal.pas">
113+ <Form>KrfmPrincipal</Form>
114114 </DCCReference>
115115 <DCCReference Include="..\src\UFuncoes.pas"/>
116116 <DCCReference Include="..\src\UDamoPrincipal.pas">
@@ -130,6 +130,12 @@
130130 </DCCReference>
131131 <DCCReference Include="..\src\UOnStepInfo.pas"/>
132132 <DCCReference Include="..\src\UTipos.pas"/>
133+ <DCCReference Include="..\src\UConfiguracoes.pas"/>
134+ <DCCReference Include="..\src\UConstantes.pas"/>
135+ <DCCReference Include="..\src\UKrfmParametros.pas">
136+ <Form>KrfmParametros</Form>
137+ <DesignClass>TKRKForm</DesignClass>
138+ </DCCReference>
133139 <RcItem Include="..\res\icons8-casa-32.ico">
134140 <ResourceType>ICON</ResourceType>
135141 <ResourceId>IMAGATHOME</ResourceId>
--- trunk/src/UConfiguracoes.pas (nonexistent)
+++ trunk/src/UConfiguracoes.pas (revision 7)
@@ -0,0 +1,54 @@
1+unit UConfiguracoes;
2+
3+interface
4+
5+uses
6+ KRK.Rtl.Common.Classes;
7+
8+type
9+ TMeioDeConexao = (mdcNenhum,mdcWiFi,mdcUSB);
10+
11+ TConfiguracoes = class(TObjectFile)
12+ private
13+ FMeioDeConexao: TMeioDeConexao;
14+ FURL: String;
15+ FPorta: Word;
16+ FCOM: Byte;
17+ public
18+ constructor Create; reintroduce;
19+ published
20+ property MeioDeConexao: TMeioDeConexao read FMeioDeConexao write FMeioDeConexao default mdcNenhum;
21+ property URL: String read FURL write FURL;
22+ property Porta: Word read FPorta write FPorta default 0;
23+ property COM: Byte read FCOM write FCOM default 0;
24+ end;
25+
26+var
27+ Configuracoes: TConfiguracoes;
28+
29+implementation
30+
31+uses
32+ System.SysUtils;
33+
34+{ TConfiguracoes }
35+
36+constructor TConfiguracoes.Create;
37+begin
38+ inherited Create(nil,asmText);
39+
40+ FMeioDeConexao := mdcNenhum;
41+ FURL := '';
42+ FPorta := 0;
43+ FCOM := 0;
44+end;
45+
46+initialization
47+ Configuracoes := TConfiguracoes.Create;
48+ Configuracoes.LoadFromTextFile(ChangeFileExt(ParamStr(0),'.cfg'));
49+
50+finalization
51+ Configuracoes.Free;
52+
53+
54+end.
--- trunk/src/UConstantes.pas (nonexistent)
+++ trunk/src/UConstantes.pas (revision 7)
@@ -0,0 +1,19 @@
1+unit UConstantes;
2+
3+interface
4+
5+resourcestring
6+ FALHANAOBTENCAODEDADOS = 'Falha na obtenção de dados. O OnStep pode estar inacessível. Verifique as conexões e as configurações';
7+ MEIODECOMUNICACAONAOSELECIONADO = 'Nenhum meio de conexão selecionado. Não será possível conectar-se ao OnStep. Selecione um meio de conexão primeiro';
8+ MEIODECONEXAO = 'Meio de conexão';
9+ CONEXAOVIAREDESEMFIO = 'A conexão está sendo feita através de uma rede sem fio';
10+ CONEXAOSERAVIAREDESEMFIO = 'A conexão será feita através de uma rede sem fio';
11+ CONEXAOVIAUSB = 'A conexão está sendo feita através de um cabo USB';
12+ CONEXAOSERAVIAUSB = 'A conexão será feita através de um cabo USB';
13+ DESEJACONTINUAR = 'Deseja continuar?';
14+ CONEXAOALTERADADESEJAFECHARTUDO = 'A conexão atual será alterada e a fim de evevitar inconsistências, todas as telas do OnStepper que estejam abertas serão fechadas. Quaisquer dados não salvos nestas telas serão perdidos. Tem certeza de que quer continuar?';
15+ MEIODECONEXAOALTERADODESEJAFECHARTUDO = 'O meio de conexão atual será alterado e a fim de evevitar inconsistências, todas as telas do OnStepper que estejam abertas serão fechadas. Quaisquer dados não salvos nestas telas serão perdidos. Tem certeza de que quer continuar?';
16+
17+implementation
18+
19+end.
--- trunk/src/UDamoPrincipal.pas (revision 6)
+++ trunk/src/UDamoPrincipal.pas (revision 7)
@@ -5,8 +5,8 @@
55 uses
66 System.SysUtils, System.Classes, System.ImageList, Vcl.ImgList, Vcl.Controls,
77 UPngImageList, Vcl.Forms, Vcl.Menus, System.Generics.Collections, UFramBasico,
8- Vcl.ActnList, UOnStepInfo, UTipos, UClassesAjudantes,
9- KRK.Rtl.Win.CommCtrl, KRK.Vcl.Controls;
8+ Vcl.ActnList, UOnStepInfo, UTipos, UClassesAjudantes, Winapi.CommCtrl,
9+ KRK.Rtl.Win.CommCtrl, KRK.Vcl.Controls, WinApi.Windows, UConfiguracoes;
1010
1111 type
1212 TFramBasicoClass = class of TFramBasico;
@@ -15,6 +15,7 @@
1515 PNILPrincpal: TPngImageList;
1616 PNILBalloonHint: TPngImageList;
1717 KRTT: TKRKToolTip;
18+ PNICPrincipal: TPngImageCollection;
1819 procedure KRTTRegisterToolTip(const AToolTip: TToolTip);
1920 private
2021 { Private declarations }
@@ -22,17 +23,36 @@
2223 FFrameList: TList<TFramBasico>;
2324 FVisibleFrame: TFramBasico;
2425
26+ procedure HandleOnInfo(AIdentification: String; AStatus: TOnStepStatus);
27+
2528 function FrameByClassName(AClassName: String): TFramBasico;
29+ procedure ImagemConectado;
30+ procedure ImagemDesconectado;
31+ procedure StartPooling;
32+ procedure PausePooling;
33+ function AlterandoOMeioDeConexao(APara: TMeioDeConexao): Boolean;
2634
27- procedure HandleOnInfo(AIdentification: String; AStatus: TOnStepStatus);
35+// function GetOnStepConnected: Boolean;
36+// function GetConfiguracoes: TConfiguracoes;
2837 public
2938 { Public declarations }
3039 constructor Create(AOwner: TComponent); override;
3140 destructor Destroy; override;
3241
42+ function HandleTTNGetDispInfo(ANMDispInfo: PNMTTDispInfo): Boolean;
43+ function HandleTTNShow(ANMHdr: TNMHdr): Boolean;
44+
3345 procedure ShowFrame(AFrameClass: TFramBasicoClass; AAction: TAction);
34- procedure StartPooling;
35- procedure PausePooling;
46+ procedure TogglePooling;
47+ procedure ConectarViaUSB;
48+ procedure ConectarViaWiFi;
49+ procedure SincronizarGUI;
50+ procedure JanelaDeParametros;
51+ procedure RegistrarToolTips;
52+
53+
54+// property OnStepConnected: Boolean read GetOnStepConnected;
55+// property Configuracoes: TConfiguracoes read GetConfiguracoes;
3656 end;
3757
3858 implementation
@@ -40,11 +60,48 @@
4060 {%CLASSGROUP 'Vcl.Controls.TControl'}
4161
4262 uses
43- UKRFMPrincipal, Vcl.Graphics, Vcl.ExtCtrls, Dialogs,
44- Winapi.CommCtrl, Windows, Messages;
63+ Vcl.Graphics, Vcl.ExtCtrls, Vcl.Dialogs, Messages, UKRFMPrincipal,
64+ UConstantes, UKRFMParametros;
4565
4666 {$R *.dfm}
4767
68+function TDamoPrincipal.AlterandoOMeioDeConexao(APara: TMeioDeConexao): Boolean;
69+begin
70+ Result := Configuracoes.MeioDeConexao <> APara;
71+end;
72+
73+procedure TDamoPrincipal.ConectarViaUSB;
74+begin
75+ if (not AlterandoOMeioDeConexao(mdcUSB)) or (Application.MessageBox(PChar(MEIODECONEXAOALTERADODESEJAFECHARTUDO),PChar(DESEJACONTINUAR),MB_ICONWARNING or MB_YESNO) = IDYES) then
76+ begin
77+ if AlterandoOMeioDeConexao(mdcUSB) then
78+ begin
79+ { Fecha tudo }
80+
81+ criar uma função para varrer FFrameList e fechar cada frame
82+ fechar o frame ainda não foi criado, crie
83+ veja FrameByClassName
84+ end;
85+
86+ Configuracoes.MeioDeConexao := mdcUSB;
87+ Configuracoes.Save;
88+ end;
89+end;
90+
91+procedure TDamoPrincipal.ConectarViaWiFi;
92+begin
93+ if (not AlterandoOMeioDeConexao(mdcWiFi)) or (Application.MessageBox(PChar(MEIODECONEXAOALTERADODESEJAFECHARTUDO),PChar(DESEJACONTINUAR),MB_ICONWARNING or MB_YESNO) = IDYES) then
94+ begin
95+ if AlterandoOMeioDeConexao(mdcWiFi) then
96+ begin
97+ { Fecha tudo }
98+ end;
99+
100+ Configuracoes.MeioDeConexao := mdcWiFi;
101+ Configuracoes.Save;
102+ end;
103+end;
104+
48105 constructor TDamoPrincipal.Create(AOwner: TComponent);
49106 begin
50107 inherited;
@@ -73,9 +130,50 @@
73130 end;
74131 end;
75132
133+//function TDamoPrincipal.GetConfiguracoes: TConfiguracoes;
134+//begin
135+// Result := Configuracoes;
136+//end;
137+
138+//function TDamoPrincipal.GetOnStepConnected: Boolean;
139+//begin
140+// Result := FOnStepInfo.IsConnected;
141+//end;
142+
143+procedure TDamoPrincipal.ImagemConectado;
144+begin
145+ case Configuracoes.MeioDeConexao of
146+ mdcNenhum: TKRFMPrincipal(Owner).IMAGTipoDeConexao.Picture.Assign(PNICPrincipal.Items[0].PngImage);
147+ mdcWiFi: TKRFMPrincipal(Owner).IMAGTipoDeConexao.Picture.Assign(PNICPrincipal.Items[1].PngImage);
148+ mdcUSB: TKRFMPrincipal(Owner).IMAGTipoDeConexao.Picture.Assign(PNICPrincipal.Items[2].PngImage);
149+ end;
150+end;
151+
152+procedure TDamoPrincipal.ImagemDesconectado;
153+begin
154+ TKRFMPrincipal(Owner).IMAGTipoDeConexao.Picture.Assign(PNICPrincipal.Items[0].PngImage);
155+end;
156+
157+procedure TDamoPrincipal.JanelaDeParametros;
158+begin
159+ with TKRFMParametros.Create(Owner) do
160+ begin
161+ KLEDURL.Text := Configuracoes.URL;
162+ KLEDPorta.Text := Configuracoes.Porta.ToString;
163+ KLEDCOM.Text := Configuracoes.COM.ToString;
164+
165+ if ShowModal = mrOk then
166+ begin
167+ Configuracoes.URL := KLEDURL.Text;
168+ Configuracoes.Porta := KLEDPorta.UnformattedText.ToInteger;
169+ Configuracoes.COM := KLEDCOM.UnformattedText.ToInteger;
170+
171+ Configuracoes.Save;
172+ end;
173+ end;
174+end;
175+
76176 procedure TDamoPrincipal.HandleOnInfo(AIdentification: String; AStatus: TOnStepStatus);
77-var
78- KRFM: TKRFMPrincipal;
79177 begin
80178 // Tive um problema de Access Violation ao fechar a aplicação porque
81179 // aparentemente aqui KRFM é destruído antes da thread terminar. Não
@@ -84,33 +182,97 @@
84182 // porque isso aconteceu. É melhor prevenir logo
85183 if not (csDestroying in ComponentState) then
86184 begin
87- KRFM := TKRFMPrincipal(Owner);
185+ // Na verdade não há uma conexão persistente, pois o OnStep funciona como
186+ // respondedor de comandos, o que significa que a conexão só é feita para
187+ // enviar um comando e obter uma resposta, não há uma conexão sem que haja
188+ // um comando associado. IsConnected verifica se houve um comando (e
189+ // consequentemente uma conexão) bem sucedido e considera que o OnStep
190+ // está conectado caso ele esteja recebendo respostas no comando de
191+ // informações (GetOnStepIdentification)
192+ if FOnStepInfo.IsConnected then
193+ ImagemConectado
194+ else
195+ ImagemDesconectado;
88196
89- KRFM.LABEOnStepIdentification.Caption := AIdentification;
197+ TKRFMPrincipal(Owner).LABEOnStepIdentification.Caption := AIdentification;
90198
91- KRFM.IMAGAtHome.Hide;
92- KRFM.IMAGParked.Hide;
93- KRFM.IMAGTracking.Hide;
94- KRFM.IMAGGoTo.Hide;
199+ TKRFMPrincipal(Owner).IMAGAtHome.Hide;
200+ TKRFMPrincipal(Owner).IMAGParked.Hide;
201+ TKRFMPrincipal(Owner).IMAGTracking.Hide;
202+ TKRFMPrincipal(Owner).IMAGGoTo.Hide;
95203
96- KRFM.IMAGAtHome.Visible := TOnStepStatuses.AtHome in AStatus;
97- KRFM.IMAGParked.Visible := not (TOnStepStatuses.NotParked in AStatus);
98- KRFM.IMAGTracking.Visible := not (TOnStepStatuses.NotTracking in AStatus);
99- KRFM.IMAGGoTo.Visible := not (TOnStepStatuses.NotGoTo in AStatus);
204+ TKRFMPrincipal(Owner).IMAGAtHome.Visible := TOnStepStatuses.AtHome in AStatus;
205+ TKRFMPrincipal(Owner).IMAGParked.Visible := not (TOnStepStatuses.NotParked in AStatus);
206+ TKRFMPrincipal(Owner).IMAGTracking.Visible := not (TOnStepStatuses.NotTracking in AStatus);
207+ TKRFMPrincipal(Owner).IMAGGoTo.Visible := not (TOnStepStatuses.NotGoTo in AStatus);
100208 end;
101209 end;
102210
211+function TDamoPrincipal.HandleTTNGetDispInfo(ANMDispInfo: PNMTTDispInfo): Boolean;
212+begin
213+ Result := False;
214+
215+ if ANMDispInfo.hdr.idFrom = TKRFMPrincipal(Owner).IMAGTipoDeConexao.UniqueId then
216+ begin
217+ case Configuracoes.MeioDeConexao of
218+ mdcNenhum: ANMDispInfo.lpszText := PChar(MEIODECOMUNICACAONAOSELECIONADO);
219+ mdcWiFi: begin
220+ if FOnStepInfo.IsConnected then
221+ ANMDispInfo.lpszText := PChar(CONEXAOVIAREDESEMFIO)
222+ else
223+ ANMDispInfo.lpszText := PChar(CONEXAOSERAVIAREDESEMFIO);
224+ end;
225+ mdcUSB: begin
226+ if FOnStepInfo.IsConnected then
227+ ANMDispInfo.lpszText := PChar(CONEXAOVIAUSB)
228+ else
229+ ANMDispInfo.lpszText := PChar(CONEXAOSERAVIAUSB);
230+ end;
231+ end;
232+
233+ Result := True;
234+ end;
235+end;
236+
237+function TDamoPrincipal.HandleTTNShow(ANMHdr: TNMHdr): Boolean;
238+begin
239+ Result := False;
240+
241+ for var ToolTip: TToolTip in KRTT.ToolTips do
242+ if ToolTip.Id = ANMHdr.idFrom then
243+ begin
244+ KRTT.SetTipIconAndTitle(KRTT.IconResourceId2IconHandle(PChar(ToolTip.Tool.Name))
245+ ,PChar(GetShortHint(ToolTip.Tool.Hint)));
246+ Result := True;
247+
248+ Break;
249+ end;
250+end;
251+
103252 procedure TDamoPrincipal.KRTTRegisterToolTip(const AToolTip: TToolTip);
104253 begin
105254 AToolTip.Text := GetLongHint(AToolTip.Tool.Hint);
106255 AToolTip.Tool.ShowHint := False;
256+
257+//gera errado = Tipo de conexão|x x x x x ú x x x x x x x x x x í x x x x x x x x x á x x x x x x x x x x é x x x x x x x x x x x x x x x x
258+//gera certo = Tipo de conexão|x x x x x ú x x x x x x x x x x í x x x x x x x x x á x x x x x x x x x x é x x x x x x x x ú x x x x x x x
259+//tem um ú a mais no segundo
107260 end;
108261
109262 procedure TDamoPrincipal.PausePooling;
110263 begin
111264 FOnStepInfo.Pause;
265+
266+ TKRFMPrincipal(Owner).LABEOnStepIdentification.Caption := 'OnStep desconectado. Clique na imagem à esquerda para conectar...';
267+ // de acordo com a configuracao, escolher a imagem correta aqui
268+ TKRFMPrincipal(Owner).IMAGTipoDeConexao.Picture.Assign(PNICPrincipal.Items[0].PngImage);
112269 end;
113270
271+procedure TDamoPrincipal.RegistrarToolTips;
272+begin
273+ KRTT.RegisterToolTips;
274+end;
275+
114276 procedure TDamoPrincipal.ShowFrame(AFrameClass: TFramBasicoClass; AAction: TAction);
115277 var
116278 Frame: TFramBasico;
@@ -133,12 +295,44 @@
133295 FVisibleFrame.Action.Disable;
134296 end;
135297
298+procedure TDamoPrincipal.SincronizarGUI;
299+begin
300+ // IsRunning significa que a Thread de pooling está ativa e IsConnected
301+ // significa que o OnStep está acessível e respondendo a comandos. IsConnected
302+ // depende de IsRunning no sentido de que IsConnected só poderá ser true
303+ // quando IsRunning for true
304+ TKRFMPrincipal(Owner).ACTNLocaisDeObservacao.Enabled := FOnStepInfo.IsConnected;
305+
306+// Desabilitar ou habilitar todos os frames abertos de acordo com isconnected
307+
308+
309+ TKRFMPrincipal(Owner).ACTNConexaoViaRedeSemFio.Enabled := not FOnStepInfo.IsRunning;
310+ TKRFMPrincipal(Owner).ACTNConexaoViaUsb.Enabled := not FOnStepInfo.IsRunning;
311+ TKRFMPrincipal(Owner).ACTNParametros.Enabled := not FOnStepInfo.IsRunning;
312+ TKRFMPrincipal(Owner).ACTNConexaoViaRedeSemFio.Checked := Configuracoes.MeioDeConexao = mdcWiFi;
313+ TKRFMPrincipal(Owner).ACTNConexaoViaUsb.Checked := Configuracoes.MeioDeConexao = mdcUSB;
314+ TKRFMPrincipal(Owner).ACTNParametros.Enabled := not FOnStepInfo.IsRunning;
315+end;
316+
136317 procedure TDamoPrincipal.StartPooling;
137318 begin
138- if FOnStepInfo.Started then
139- FOnStepInfo.Restart
319+ if Configuracoes.MeioDeConexao <> mdcNenhum then
320+ begin
321+ if FOnStepInfo.Started then
322+ FOnStepInfo.Restart
323+ else
324+ FOnStepInfo.Start;
325+ end
140326 else
141- FOnStepInfo.Start;
327+ Application.MessageBox(PChar(MEIODECOMUNICACAONAOSELECIONADO),PChar(MEIODECONEXAO),MB_ICONWARNING);
142328 end;
143329
330+procedure TDamoPrincipal.TogglePooling;
331+begin
332+ if FOnStepInfo.IsRunning then
333+ PausePooling
334+ else
335+ StartPooling;
336+end;
337+
144338 end.
--- trunk/src/UFuncoes.pas (revision 6)
+++ trunk/src/UFuncoes.pas (revision 7)
@@ -17,7 +17,7 @@
1717 implementation
1818
1919 uses
20- KRK.Network.WinSock2, System.SysUtils, WinApi.Windows;
20+ KRK.Network.WinSock2, System.SysUtils, WinApi.Windows, UConfiguracoes;
2121
2222 type
2323 LPCOLESTR = PChar; // ansi em delphis ansi e wide em delphis unicode
@@ -24,11 +24,16 @@
2424
2525 function VarDateFromStr(const AStrIn: LPCOLESTR; ALCID: DWORD; ADWFlags: Integer; out ADateOut: TDateTime): HRESULT; stdcall; external 'OleAut32.dll';
2626
27-const
28- // Vao se transformar em configs,
29- A = 'ESP-E12BEC.feitoza.net.br';
30- B = 9999;
27+// http://sheepdogguides.com/dt4k.htm Delphi: How to connect via the serial port. How to use API calls
28+// http://sheepdogguides.com/dt4q.htm Delphi tutorial: serial comms, i.e. using the COM port Bi-directional Communications
29+// https://aticleworld.com/serial-port-programming-using-win32-api/
30+// https://stackoverflow.com/questions/23416655/correctly-reading-or-writing-serial-port-windows-api
3131
32+function SendSynchronousSerialMessage(APortaCom: Byte; AMessage: String): String;
33+begin
34+ Result := 'Conexão via USB não implementada!';
35+end;
36+
3237 function ParseStringResult(ARawResult: String): String;
3338 begin
3439 Result := Copy(ARawResult,1,Pred(Pos('#',ARawResult)));
@@ -71,22 +76,42 @@
7176
7277 function GetFirmwareName: String;
7378 begin
74- Result := ParseStringResult(SendSynchronousSocketMessage(A,B,':GVP#'));
79+ Result := '';
80+
81+ case Configuracoes.MeioDeConexao of
82+ mdcWiFi: Result := ParseStringResult(SendSynchronousSocketMessage(Configuracoes.URL,Configuracoes.Porta,':GVP#'));
83+ mdcUSB: Result := ParseStringResult(SendSynchronousSerialMessage(Configuracoes.COM,':GVP#'));
84+ end;
7585 end;
7686
7787 function GetFirmwareNumber: String;
7888 begin
79- Result := ParseStringResult(SendSynchronousSocketMessage(A,B,':GVN#'));
89+ Result := '';
90+
91+ case Configuracoes.MeioDeConexao of
92+ mdcWiFi: Result := ParseStringResult(SendSynchronousSocketMessage(Configuracoes.URL,Configuracoes.Porta,':GVN#'));
93+ mdcUSB: Result := ParseStringResult(SendSynchronousSerialMessage(Configuracoes.COM,':GVN#'));
94+ end;
8095 end;
8196
8297 function GetFirmwareDate: TDate;
8398 begin
84- Result := ParseDate_MMM_DD_YYYY_Result(SendSynchronousSocketMessage(A,B,':GVD#'));
99+ Result := 0;
100+
101+ case Configuracoes.MeioDeConexao of
102+ mdcWiFi: Result := ParseDate_MMM_DD_YYYY_Result(SendSynchronousSocketMessage(Configuracoes.URL,Configuracoes.Porta,':GVD#'));
103+ mdcUSB: Result := ParseDate_MMM_DD_YYYY_Result(SendSynchronousSerialMessage(Configuracoes.COM,':GVD#'));
104+ end;
85105 end;
86106
87107 function GetFirmwareTime: TTime;
88108 begin
89- Result := ParseTimeResult(SendSynchronousSocketMessage(A,B,':GVT#'));
109+ Result := 0;
110+
111+ case Configuracoes.MeioDeConexao of
112+ mdcWiFi: Result := ParseTimeResult(SendSynchronousSocketMessage(Configuracoes.URL,Configuracoes.Porta,':GVT#'));
113+ mdcUSB: Result := ParseTimeResult(SendSynchronousSerialMessage(Configuracoes.COM,':GVT#'));
114+ end;
90115 end;
91116
92117 function GetOnStepIdentification: String;
@@ -100,7 +125,10 @@
100125
101126 function GetStatus: TOnStepStatus;
102127 begin
103- Result := ParseStatusResult(SendSynchronousSocketMessage(A,B,':GU#'));
128+ case Configuracoes.MeioDeConexao of
129+ mdcWiFi: Result := ParseStatusResult(SendSynchronousSocketMessage(Configuracoes.URL,Configuracoes.Porta,':GU#'));
130+ mdcUSB: Result := ParseStatusResult(SendSynchronousSerialMessage(Configuracoes.COM,':GU#'));
131+ end;
104132 end;
105133
106134 end.
--- trunk/src/UKRFMPrincipal.pas (revision 6)
+++ trunk/src/UKRFMPrincipal.pas (revision 7)
@@ -8,17 +8,17 @@
88 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
99 System.Classes, Vcl.Graphics, Vcl.ComCtrls, Vcl.Controls, Vcl.StdCtrls,
1010 Vcl.Forms, KRK.Vcl.Forms, UDamoPrincipal, Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls,
11- Vcl.ActnMenus, System.Actions, Vcl.ActnList,
11+ Vcl.ActnMenus, System.Actions, Vcl.ActnList, Winapi.CommCtrl,
1212 Vcl.PlatformDefaultStyleActnCtrls, Vcl.ExtCtrls, Vcl.Imaging.pngimage,
1313 KRK.Vcl.StdCtrls;
1414
1515 type
16- TKRFMPrincipal = class(TKRKForm)
16+ TKrfmPrincipal = class(TKRKForm)
1717 AMMBPrincipal: TActionMainMenuBar;
1818 AMANPrincipal: TActionManager;
1919 ACTNConexaoViaRedeSemFio: TAction;
2020 ACTNLocaisDeObservacao: TAction;
21- ACTNConexaoUsb: TAction;
21+ ACTNConexaoViaUsb: TAction;
2222 ACTNSobre: TAction;
2323 KRPAFooter: TKRKPanel;
2424 IMAGTipoDeConexao: TImage;
@@ -29,19 +29,24 @@
2929 IMAGParked: TImage;
3030 IMAGTracking: TImage;
3131 IMAGGoTo: TImage;
32+ ACTNParametros: TAction;
3233 procedure ACTNLocaisDeObservacaoExecute(Sender: TObject);
3334 procedure FormCreate(Sender: TObject);
3435 function KRKFormTTNShow(ANMHdr: tagNMHDR): Boolean;
35- private
36- { Private declarations }
36+ procedure IMAGTipoDeConexaoClick(Sender: TObject);
37+ function KRKFormTTNGetDispInfo(ANMDispInfo: PNMTTDispInfoW): Boolean;
38+ procedure ACTNConexaoViaRedeSemFioExecute(Sender: TObject);
39+ procedure ACTNConexaoViaUsbExecute(Sender: TObject);
40+ procedure AMANPrincipalUpdate(Action: TBasicAction; var Handled: Boolean);
41+ procedure ACTNParametrosExecute(Sender: TObject);
42+ private { Declarações privadas }
3743 FDamoPrincipal: TDamoPrincipal;
38- public
39- { Public declarations }
44+ public { Declarações públicas }
4045 constructor Create(AOwner: TComponent); override;
4146 end;
4247
4348 var
44- KRFMPrincipal: TKRFMPrincipal;
49+ KrfmPrincipal: TKrfmPrincipal;
4550
4651 implementation
4752
@@ -48,17 +53,37 @@
4853 {$R *.dfm}
4954
5055 uses
51- UFramLocaisDeObservacao, UClassesAjudantes, KRK.Rtl.Win.CommCtrl;
56+ UFramLocaisDeObservacao, UClassesAjudantes, KRK.Rtl.Win.CommCtrl, UConstantes;
5257
5358 { TFormPrincipal }
5459
55-procedure TKRFMPrincipal.ACTNLocaisDeObservacaoExecute(Sender: TObject);
60+procedure TKrfmPrincipal.ACTNConexaoViaUsbExecute(Sender: TObject);
5661 begin
62+ FDamoPrincipal.ConectarViaUSB;
63+end;
64+
65+procedure TKrfmPrincipal.ACTNConexaoViaRedeSemFioExecute(Sender: TObject);
66+begin
67+ FDamoPrincipal.ConectarViaWiFi;
68+end;
69+
70+procedure TKrfmPrincipal.ACTNLocaisDeObservacaoExecute(Sender: TObject);
71+begin
5772 FDamoPrincipal.ShowFrame(TFramLocaisDeObservacao,TAction(Sender));
5873 end;
5974
60-constructor TKRFMPrincipal.Create(AOwner: TComponent);
75+procedure TKrfmPrincipal.ACTNParametrosExecute(Sender: TObject);
6176 begin
77+ FDamoPrincipal.JanelaDeParametros;
78+end;
79+
80+procedure TKrfmPrincipal.AMANPrincipalUpdate(Action: TBasicAction; var Handled: Boolean);
81+begin
82+ FDamoPrincipal.SincronizarGUI;
83+end;
84+
85+constructor TKrfmPrincipal.Create(AOwner: TComponent);
86+begin
6287 // Anteriormente eu criva FDamoPrincipal antes de inherited, porque eu
6388 // imaginava que inherited "finalizava" a construção da classe, o que
6489 // executaria o evento OnCreate, mas isso não é verdade. Inherited, como se
@@ -76,25 +101,27 @@
76101 FDamoPrincipal := TDamoPrincipal.Create(Self);
77102 end;
78103
79-procedure TKRFMPrincipal.FormCreate(Sender: TObject);
104+procedure TKrfmPrincipal.FormCreate(Sender: TObject);
80105 begin
81- FDamoPrincipal.KRTT.RegisterToolTips;
106+ FDamoPrincipal.RegistrarToolTips;;
82107 end;
83108
84-function TKRFMPrincipal.KRKFormTTNShow(ANMHdr: tagNMHDR): Boolean;
109+procedure TKrfmPrincipal.IMAGTipoDeConexaoClick(Sender: TObject);
85110 begin
86- Result := False;
111+ FDamoPrincipal.TogglePooling;
112+end;
87113
88- for var ToolTip: TToolTip in FDamoPrincipal.KRTT.ToolTips do
89- if ToolTip.Id = ANMHdr.idFrom then
90- begin
91- FDamoPrincipal.KRTT.SetTipIconAndTitle(FDamoPrincipal.KRTT.IconResourceId2IconHandle(PChar(ToolTip.Tool.Name))
92- ,PChar(GetShortHint(ToolTip.Tool.Hint)));
93- Break;
94- end;
114+function TKrfmPrincipal.KRKFormTTNGetDispInfo(ANMDispInfo: PNMTTDispInfoW): Boolean;
115+begin
116+ Result := FDamoPrincipal.HandleTTNGetDispInfo(ANMDispInfo);
95117 end;
96118
119+function TKrfmPrincipal.KRKFormTTNShow(ANMHdr: tagNMHDR): Boolean;
120+begin
121+ Result := FDamoPrincipal.HandleTTNShow(ANMHdr);
122+end;
123+
97124 initialization
98- RegisterClass(TKRFMPrincipal)
125+ RegisterClass(TKrfmPrincipal)
99126
100127 end.
--- trunk/src/UKrfmParametros.pas (nonexistent)
+++ trunk/src/UKrfmParametros.pas (revision 7)
@@ -0,0 +1,79 @@
1+unit UKRFMParametros;
2+
3+{ Anak Krakatoa Form. Copyright Zetta-Ømnis Soluções Tecnológicas Ltda }
4+
5+interface
6+
7+uses
8+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, KRK.Vcl.Forms,
9+ Vcl.ComCtrls, Vcl.StdCtrls, KRK.Vcl.StdCtrls, KRK.Vcl.ExtCtrls;
10+
11+type
12+ TKrfmParametros = class(TKRKForm)
13+ PACO: TPageControl;
14+ TASHMeiosDeConexao: TTabSheet;
15+ KLEDURL: TKRKLabeledEdit;
16+ GRBXConexaoViaWiFi: TGroupBox;
17+ KLEDPorta: TKRKLabeledEdit;
18+ GRBXConexaoViaUSB: TGroupBox;
19+ KLEDCOM: TKRKLabeledEdit;
20+ procedure KRKFormClose(Sender: TObject; var Action: TCloseAction);
21+ procedure KRKFormOkButtonClick(Sender: TObject);
22+ procedure KRKFormCancelButtonClick(Sender: TObject);
23+ private { Declarações privadas }
24+ function AlterandoAConexaoAtual: Boolean;
25+ protected { Declarações protegidas }
26+ public { Declarações públicas }
27+ end;
28+
29+implementation
30+
31+uses
32+ UConfiguracoes, UConstantes;
33+
34+//https://www.codeproject.com/Articles/4187/Serial-ports-Enumeration-and-FIFO-control
35+
36+{$R *.dfm}
37+
38+function TKrfmParametros.AlterandoAConexaoAtual: Boolean;
39+begin
40+ Result := False;
41+
42+ case Configuracoes.MeioDeConexao of
43+ mdcWiFi: Result := (KLEDURL.Text <> Configuracoes.URL) or (KLEDPorta.UnformattedText.ToInteger <> Configuracoes.Porta);
44+ mdcUSB: Result := KLEDCOM.UnformattedText.ToInteger <> Configuracoes.COM;
45+ end;
46+end;
47+
48+procedure TKrfmParametros.KRKFormCancelButtonClick(Sender: TObject);
49+begin
50+ ModalResult := mrCancel;
51+end;
52+
53+procedure TKrfmParametros.KRKFormClose(Sender: TObject; var Action: TCloseAction);
54+begin
55+ Action := caFree;
56+end;
57+
58+procedure TKrfmParametros.KRKFormOkButtonClick(Sender: TObject);
59+begin
60+ // Caso não estejamos alterando a conexão ou, caso estejamos, e respondermos
61+ // "sim" a pergunta a respeito de fechamento de telas do OnStepper, entra no
62+ // bloco abaixo o qual invariavelmente vai fechar a janela atual com
63+ // ModalResult = mrOk, porém apenas vai fechar as telas do OnStepper se
64+ // estivermos efetivamente alterando a conexão atual
65+ if (not AlterandoAConexaoAtual) or (Application.MessageBox(PChar(CONEXAOALTERADADESEJAFECHARTUDO),PChar(DESEJACONTINUAR),MB_ICONWARNING or MB_YESNO) = IDYES) then
66+ begin
67+ if AlterandoAConexaoAtual then
68+ begin
69+ { Fechar tudo aqui }
70+ end;
71+
72+ ModalResult := mrOk;
73+ end
74+end;
75+
76+initialization
77+ RegisterClass(TKrfmParametros)
78+
79+end.
\ No newline at end of file
--- trunk/src/UOnStepInfo.pas (revision 6)
+++ trunk/src/UOnStepInfo.pas (revision 7)
@@ -17,15 +17,20 @@
1717 FPauseRestart: TEvent;
1818 FTimeOut: TEvent;
1919 FTimeOutValue: Byte;
20- FOnInfo: TOnInfo;
20+ FException: Exception;
21+ FRunning: Boolean;
2122 FOnStepIdentification: String;
2223 FOnStepStatus: TOnStepStatus;
23- FException: Exception;
2424
25+ FOnInfo: TOnInfo;
26+
2527 procedure DoExecute;
28+ procedure DoForwareException;
29+
2630 procedure ForwareException;
27- procedure DoForwareException;
2831 procedure ClearAllInfo;
32+
33+ function GetIsConnected: Boolean;
2934 protected
3035 procedure Execute; override;
3136 public
@@ -35,6 +40,9 @@
3540 procedure Pause;
3641 procedure Restart;
3742
43+ property IsRunning: Boolean read FRunning;
44+ property IsConnected: Boolean read GetIsConnected;
45+
3846 property OnInfo: TOnInfo read FOnInfo write FOnInfo;
3947 end;
4048
@@ -41,7 +49,7 @@
4149 implementation
4250
4351 uses
44- Winapi.Windows, Winapi.Messages, Vcl.Forms;
52+ Winapi.Windows, Winapi.Messages, Vcl.Forms, UConstantes;
4553
4654 { TPooling }
4755
@@ -50,7 +58,7 @@
5058 // logar a mensagem de erro em alguma propriedade da própria thread e fazer
5159 // essa propriedade acessível externamente, assim é possivel obter a lista de
5260 // exceções
53- FOnStepIdentification := 'Falha na obtenção de dados';
61+ FOnStepIdentification := FALHANAOBTENCAODEDADOS;
5462 FOnStepStatus := [];
5563 end;
5664
@@ -61,6 +69,8 @@
6169 FPauseRestart := nil;
6270 FTimeOut := nil;
6371 FTimeOutValue := ATimeOutValue;
72+ FRunning := False;
73+ FOnStepIdentification := FALHANAOBTENCAODEDADOS;
6474 end;
6575
6676 destructor TOnStepInfo.Destroy;
@@ -106,8 +116,15 @@
106116
107117 while not Terminated do
108118 begin
119+ // Os dois campos abaixo são usados como flags de identificação, por isso
120+ // eles precisam ser "zerados" antes de um possível pausa da thread atual
121+ FRunning := False;
122+ FOnStepIdentification := FALHANAOBTENCAODEDADOS;
123+
109124 WR := FPauseRestart.WaitFor(INFINITE);
110125
126+ FRunning := True;
127+
111128 if not Terminated then
112129 case WR of
113130 wrSignaled: begin
@@ -137,8 +154,18 @@
137154
138155 procedure TOnStepInfo.DoForwareException;
139156 begin
140- // Cancel the mouse capture (não sei o efeito real disso, mas é
141- // interessante seu uso aqui. Talvez isso tenha )
157+ // "Cancel the mouse capture". Não sei o efeito real disso, mas é interessante
158+ // seu uso aqui. Pelo que pude entender lendo o MSDN, GetCapture obtém o
159+ // handle da janela que tem o mouse "capturado", isto é, a janela que recebe
160+ // mensagens do mouse, mesmo quando seu cursor não está dentro da janela. Isso
161+ // pra mim não faz muito sentido, mas o código abaixo aparentemente "libera" o
162+ // cursor do mouse da janela que tinha capturado este cursor. WM_CANCELMODE
163+ // faz outras coisas além de liberar o mouse (cursor do mouse) e talvez seja
164+ // por isso que ela foi usada ao invés de ReleaseCapture. Esse efeito de
165+ // capturar o mouse, tem a ver com aquele comprtamento de segurar o botão do
166+ // mouse em cima de uma barra de rolagem e mesmo quando se retira o mouse de
167+ // cima dessa barra, ainda assim é possível movimentá-la, enquanto o botão
168+ // permanecer pressionado
142169 if GetCapture <> 0 then
143170 SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
144171
@@ -161,6 +188,11 @@
161188 end;
162189 end;
163190
191+function TOnStepInfo.GetIsConnected: Boolean;
192+begin
193+ Result := FOnStepIdentification <> FALHANAOBTENCAODEDADOS;
194+end;
195+
164196 procedure TOnStepInfo.Pause;
165197 begin
166198 if Started and Assigned(FPauseRestart) then
Show on old repository browser