リビジョン | 7 (tree) |
---|---|
日時 | 2022-04-23 00:07:07 |
作者 | ![]() |
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
@@ -1,9 +1,5 @@ | ||
1 | 1 | program OnStepper; |
2 | 2 | |
3 | - | |
4 | - | |
5 | - | |
6 | - | |
7 | 3 | {$R *.dres} |
8 | 4 | |
9 | 5 | uses |
@@ -11,7 +7,7 @@ | ||
11 | 7 | KRK.Vcl.Forms, |
12 | 8 | Vcl.Themes, |
13 | 9 | Vcl.Styles, |
14 | - UKRFMPrincipal in '..\src\UKRFMPrincipal.pas' {KRFMPrincipal}, | |
10 | + UKrfmPrincipal in '..\src\UKrfmPrincipal.pas' {KrfmPrincipal}, | |
15 | 11 | UFuncoes in '..\src\UFuncoes.pas', |
16 | 12 | UDamoPrincipal in '..\src\UDamoPrincipal.pas' {DamoPrincipal: TDataModule}, |
17 | 13 | UClassesAjudantes in '..\src\UClassesAjudantes.pas', |
@@ -18,7 +14,10 @@ | ||
18 | 14 | UFramBasico in '..\src\UFramBasico.pas' {FramBasico: TFrame}, |
19 | 15 | UFramLocaisDeObservacao in '..\src\UFramLocaisDeObservacao.pas' {FramLocaisDeObservacao: TFrame}, |
20 | 16 | 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}; | |
22 | 21 | |
23 | 22 | {$R *.res} |
24 | 23 |
@@ -28,6 +27,6 @@ | ||
28 | 27 | Application.MainFormOnTaskbar := True; |
29 | 28 | Application.Title := 'OnStepper'; |
30 | 29 | TStyleManager.TrySetStyle('Cyan Night'); |
31 | - Application.CreateForm(TKRFMPrincipal, KRFMPrincipal); | |
30 | + Application.CreateForm(TKrfmPrincipal, KrfmPrincipal); | |
32 | 31 | Application.Run; |
33 | 32 | end. |
@@ -109,8 +109,8 @@ | ||
109 | 109 | <DelphiCompile Include="$(MainSource)"> |
110 | 110 | <MainSource>MainSource</MainSource> |
111 | 111 | </DelphiCompile> |
112 | - <DCCReference Include="..\src\UKRFMPrincipal.pas"> | |
113 | - <Form>KRFMPrincipal</Form> | |
112 | + <DCCReference Include="..\src\UKrfmPrincipal.pas"> | |
113 | + <Form>KrfmPrincipal</Form> | |
114 | 114 | </DCCReference> |
115 | 115 | <DCCReference Include="..\src\UFuncoes.pas"/> |
116 | 116 | <DCCReference Include="..\src\UDamoPrincipal.pas"> |
@@ -130,6 +130,12 @@ | ||
130 | 130 | </DCCReference> |
131 | 131 | <DCCReference Include="..\src\UOnStepInfo.pas"/> |
132 | 132 | <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> | |
133 | 139 | <RcItem Include="..\res\icons8-casa-32.ico"> |
134 | 140 | <ResourceType>ICON</ResourceType> |
135 | 141 | <ResourceId>IMAGATHOME</ResourceId> |
@@ -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. |
@@ -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. |
@@ -5,8 +5,8 @@ | ||
5 | 5 | uses |
6 | 6 | System.SysUtils, System.Classes, System.ImageList, Vcl.ImgList, Vcl.Controls, |
7 | 7 | 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; | |
10 | 10 | |
11 | 11 | type |
12 | 12 | TFramBasicoClass = class of TFramBasico; |
@@ -15,6 +15,7 @@ | ||
15 | 15 | PNILPrincpal: TPngImageList; |
16 | 16 | PNILBalloonHint: TPngImageList; |
17 | 17 | KRTT: TKRKToolTip; |
18 | + PNICPrincipal: TPngImageCollection; | |
18 | 19 | procedure KRTTRegisterToolTip(const AToolTip: TToolTip); |
19 | 20 | private |
20 | 21 | { Private declarations } |
@@ -22,17 +23,36 @@ | ||
22 | 23 | FFrameList: TList<TFramBasico>; |
23 | 24 | FVisibleFrame: TFramBasico; |
24 | 25 | |
26 | + procedure HandleOnInfo(AIdentification: String; AStatus: TOnStepStatus); | |
27 | + | |
25 | 28 | function FrameByClassName(AClassName: String): TFramBasico; |
29 | + procedure ImagemConectado; | |
30 | + procedure ImagemDesconectado; | |
31 | + procedure StartPooling; | |
32 | + procedure PausePooling; | |
33 | + function AlterandoOMeioDeConexao(APara: TMeioDeConexao): Boolean; | |
26 | 34 | |
27 | - procedure HandleOnInfo(AIdentification: String; AStatus: TOnStepStatus); | |
35 | +// function GetOnStepConnected: Boolean; | |
36 | +// function GetConfiguracoes: TConfiguracoes; | |
28 | 37 | public |
29 | 38 | { Public declarations } |
30 | 39 | constructor Create(AOwner: TComponent); override; |
31 | 40 | destructor Destroy; override; |
32 | 41 | |
42 | + function HandleTTNGetDispInfo(ANMDispInfo: PNMTTDispInfo): Boolean; | |
43 | + function HandleTTNShow(ANMHdr: TNMHdr): Boolean; | |
44 | + | |
33 | 45 | 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; | |
36 | 56 | end; |
37 | 57 | |
38 | 58 | implementation |
@@ -40,11 +60,48 @@ | ||
40 | 60 | {%CLASSGROUP 'Vcl.Controls.TControl'} |
41 | 61 | |
42 | 62 | 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; | |
45 | 65 | |
46 | 66 | {$R *.dfm} |
47 | 67 | |
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 | + | |
48 | 105 | constructor TDamoPrincipal.Create(AOwner: TComponent); |
49 | 106 | begin |
50 | 107 | inherited; |
@@ -73,9 +130,50 @@ | ||
73 | 130 | end; |
74 | 131 | end; |
75 | 132 | |
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 | + | |
76 | 176 | procedure TDamoPrincipal.HandleOnInfo(AIdentification: String; AStatus: TOnStepStatus); |
77 | -var | |
78 | - KRFM: TKRFMPrincipal; | |
79 | 177 | begin |
80 | 178 | // Tive um problema de Access Violation ao fechar a aplicação porque |
81 | 179 | // aparentemente aqui KRFM é destruído antes da thread terminar. Não |
@@ -84,33 +182,97 @@ | ||
84 | 182 | // porque isso aconteceu. É melhor prevenir logo |
85 | 183 | if not (csDestroying in ComponentState) then |
86 | 184 | 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; | |
88 | 196 | |
89 | - KRFM.LABEOnStepIdentification.Caption := AIdentification; | |
197 | + TKRFMPrincipal(Owner).LABEOnStepIdentification.Caption := AIdentification; | |
90 | 198 | |
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; | |
95 | 203 | |
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); | |
100 | 208 | end; |
101 | 209 | end; |
102 | 210 | |
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 | + | |
103 | 252 | procedure TDamoPrincipal.KRTTRegisterToolTip(const AToolTip: TToolTip); |
104 | 253 | begin |
105 | 254 | AToolTip.Text := GetLongHint(AToolTip.Tool.Hint); |
106 | 255 | 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 | |
107 | 260 | end; |
108 | 261 | |
109 | 262 | procedure TDamoPrincipal.PausePooling; |
110 | 263 | begin |
111 | 264 | 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); | |
112 | 269 | end; |
113 | 270 | |
271 | +procedure TDamoPrincipal.RegistrarToolTips; | |
272 | +begin | |
273 | + KRTT.RegisterToolTips; | |
274 | +end; | |
275 | + | |
114 | 276 | procedure TDamoPrincipal.ShowFrame(AFrameClass: TFramBasicoClass; AAction: TAction); |
115 | 277 | var |
116 | 278 | Frame: TFramBasico; |
@@ -133,12 +295,44 @@ | ||
133 | 295 | FVisibleFrame.Action.Disable; |
134 | 296 | end; |
135 | 297 | |
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 | + | |
136 | 317 | procedure TDamoPrincipal.StartPooling; |
137 | 318 | 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 | |
140 | 326 | else |
141 | - FOnStepInfo.Start; | |
327 | + Application.MessageBox(PChar(MEIODECOMUNICACAONAOSELECIONADO),PChar(MEIODECONEXAO),MB_ICONWARNING); | |
142 | 328 | end; |
143 | 329 | |
330 | +procedure TDamoPrincipal.TogglePooling; | |
331 | +begin | |
332 | + if FOnStepInfo.IsRunning then | |
333 | + PausePooling | |
334 | + else | |
335 | + StartPooling; | |
336 | +end; | |
337 | + | |
144 | 338 | end. |
@@ -17,7 +17,7 @@ | ||
17 | 17 | implementation |
18 | 18 | |
19 | 19 | uses |
20 | - KRK.Network.WinSock2, System.SysUtils, WinApi.Windows; | |
20 | + KRK.Network.WinSock2, System.SysUtils, WinApi.Windows, UConfiguracoes; | |
21 | 21 | |
22 | 22 | type |
23 | 23 | LPCOLESTR = PChar; // ansi em delphis ansi e wide em delphis unicode |
@@ -24,11 +24,16 @@ | ||
24 | 24 | |
25 | 25 | function VarDateFromStr(const AStrIn: LPCOLESTR; ALCID: DWORD; ADWFlags: Integer; out ADateOut: TDateTime): HRESULT; stdcall; external 'OleAut32.dll'; |
26 | 26 | |
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 | |
31 | 31 | |
32 | +function SendSynchronousSerialMessage(APortaCom: Byte; AMessage: String): String; | |
33 | +begin | |
34 | + Result := 'Conexão via USB não implementada!'; | |
35 | +end; | |
36 | + | |
32 | 37 | function ParseStringResult(ARawResult: String): String; |
33 | 38 | begin |
34 | 39 | Result := Copy(ARawResult,1,Pred(Pos('#',ARawResult))); |
@@ -71,22 +76,42 @@ | ||
71 | 76 | |
72 | 77 | function GetFirmwareName: String; |
73 | 78 | 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; | |
75 | 85 | end; |
76 | 86 | |
77 | 87 | function GetFirmwareNumber: String; |
78 | 88 | 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; | |
80 | 95 | end; |
81 | 96 | |
82 | 97 | function GetFirmwareDate: TDate; |
83 | 98 | 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; | |
85 | 105 | end; |
86 | 106 | |
87 | 107 | function GetFirmwareTime: TTime; |
88 | 108 | 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; | |
90 | 115 | end; |
91 | 116 | |
92 | 117 | function GetOnStepIdentification: String; |
@@ -100,7 +125,10 @@ | ||
100 | 125 | |
101 | 126 | function GetStatus: TOnStepStatus; |
102 | 127 | 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; | |
104 | 132 | end; |
105 | 133 | |
106 | 134 | end. |
@@ -8,17 +8,17 @@ | ||
8 | 8 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, |
9 | 9 | System.Classes, Vcl.Graphics, Vcl.ComCtrls, Vcl.Controls, Vcl.StdCtrls, |
10 | 10 | 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, | |
12 | 12 | Vcl.PlatformDefaultStyleActnCtrls, Vcl.ExtCtrls, Vcl.Imaging.pngimage, |
13 | 13 | KRK.Vcl.StdCtrls; |
14 | 14 | |
15 | 15 | type |
16 | - TKRFMPrincipal = class(TKRKForm) | |
16 | + TKrfmPrincipal = class(TKRKForm) | |
17 | 17 | AMMBPrincipal: TActionMainMenuBar; |
18 | 18 | AMANPrincipal: TActionManager; |
19 | 19 | ACTNConexaoViaRedeSemFio: TAction; |
20 | 20 | ACTNLocaisDeObservacao: TAction; |
21 | - ACTNConexaoUsb: TAction; | |
21 | + ACTNConexaoViaUsb: TAction; | |
22 | 22 | ACTNSobre: TAction; |
23 | 23 | KRPAFooter: TKRKPanel; |
24 | 24 | IMAGTipoDeConexao: TImage; |
@@ -29,19 +29,24 @@ | ||
29 | 29 | IMAGParked: TImage; |
30 | 30 | IMAGTracking: TImage; |
31 | 31 | IMAGGoTo: TImage; |
32 | + ACTNParametros: TAction; | |
32 | 33 | procedure ACTNLocaisDeObservacaoExecute(Sender: TObject); |
33 | 34 | procedure FormCreate(Sender: TObject); |
34 | 35 | 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 } | |
37 | 43 | FDamoPrincipal: TDamoPrincipal; |
38 | - public | |
39 | - { Public declarations } | |
44 | + public { Declarações públicas } | |
40 | 45 | constructor Create(AOwner: TComponent); override; |
41 | 46 | end; |
42 | 47 | |
43 | 48 | var |
44 | - KRFMPrincipal: TKRFMPrincipal; | |
49 | + KrfmPrincipal: TKrfmPrincipal; | |
45 | 50 | |
46 | 51 | implementation |
47 | 52 |
@@ -48,17 +53,37 @@ | ||
48 | 53 | {$R *.dfm} |
49 | 54 | |
50 | 55 | uses |
51 | - UFramLocaisDeObservacao, UClassesAjudantes, KRK.Rtl.Win.CommCtrl; | |
56 | + UFramLocaisDeObservacao, UClassesAjudantes, KRK.Rtl.Win.CommCtrl, UConstantes; | |
52 | 57 | |
53 | 58 | { TFormPrincipal } |
54 | 59 | |
55 | -procedure TKRFMPrincipal.ACTNLocaisDeObservacaoExecute(Sender: TObject); | |
60 | +procedure TKrfmPrincipal.ACTNConexaoViaUsbExecute(Sender: TObject); | |
56 | 61 | 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 | |
57 | 72 | FDamoPrincipal.ShowFrame(TFramLocaisDeObservacao,TAction(Sender)); |
58 | 73 | end; |
59 | 74 | |
60 | -constructor TKRFMPrincipal.Create(AOwner: TComponent); | |
75 | +procedure TKrfmPrincipal.ACTNParametrosExecute(Sender: TObject); | |
61 | 76 | 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 | |
62 | 87 | // Anteriormente eu criva FDamoPrincipal antes de inherited, porque eu |
63 | 88 | // imaginava que inherited "finalizava" a construção da classe, o que |
64 | 89 | // executaria o evento OnCreate, mas isso não é verdade. Inherited, como se |
@@ -76,25 +101,27 @@ | ||
76 | 101 | FDamoPrincipal := TDamoPrincipal.Create(Self); |
77 | 102 | end; |
78 | 103 | |
79 | -procedure TKRFMPrincipal.FormCreate(Sender: TObject); | |
104 | +procedure TKrfmPrincipal.FormCreate(Sender: TObject); | |
80 | 105 | begin |
81 | - FDamoPrincipal.KRTT.RegisterToolTips; | |
106 | + FDamoPrincipal.RegistrarToolTips;; | |
82 | 107 | end; |
83 | 108 | |
84 | -function TKRFMPrincipal.KRKFormTTNShow(ANMHdr: tagNMHDR): Boolean; | |
109 | +procedure TKrfmPrincipal.IMAGTipoDeConexaoClick(Sender: TObject); | |
85 | 110 | begin |
86 | - Result := False; | |
111 | + FDamoPrincipal.TogglePooling; | |
112 | +end; | |
87 | 113 | |
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); | |
95 | 117 | end; |
96 | 118 | |
119 | +function TKrfmPrincipal.KRKFormTTNShow(ANMHdr: tagNMHDR): Boolean; | |
120 | +begin | |
121 | + Result := FDamoPrincipal.HandleTTNShow(ANMHdr); | |
122 | +end; | |
123 | + | |
97 | 124 | initialization |
98 | - RegisterClass(TKRFMPrincipal) | |
125 | + RegisterClass(TKrfmPrincipal) | |
99 | 126 | |
100 | 127 | end. |
@@ -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 |
@@ -17,15 +17,20 @@ | ||
17 | 17 | FPauseRestart: TEvent; |
18 | 18 | FTimeOut: TEvent; |
19 | 19 | FTimeOutValue: Byte; |
20 | - FOnInfo: TOnInfo; | |
20 | + FException: Exception; | |
21 | + FRunning: Boolean; | |
21 | 22 | FOnStepIdentification: String; |
22 | 23 | FOnStepStatus: TOnStepStatus; |
23 | - FException: Exception; | |
24 | 24 | |
25 | + FOnInfo: TOnInfo; | |
26 | + | |
25 | 27 | procedure DoExecute; |
28 | + procedure DoForwareException; | |
29 | + | |
26 | 30 | procedure ForwareException; |
27 | - procedure DoForwareException; | |
28 | 31 | procedure ClearAllInfo; |
32 | + | |
33 | + function GetIsConnected: Boolean; | |
29 | 34 | protected |
30 | 35 | procedure Execute; override; |
31 | 36 | public |
@@ -35,6 +40,9 @@ | ||
35 | 40 | procedure Pause; |
36 | 41 | procedure Restart; |
37 | 42 | |
43 | + property IsRunning: Boolean read FRunning; | |
44 | + property IsConnected: Boolean read GetIsConnected; | |
45 | + | |
38 | 46 | property OnInfo: TOnInfo read FOnInfo write FOnInfo; |
39 | 47 | end; |
40 | 48 |
@@ -41,7 +49,7 @@ | ||
41 | 49 | implementation |
42 | 50 | |
43 | 51 | uses |
44 | - Winapi.Windows, Winapi.Messages, Vcl.Forms; | |
52 | + Winapi.Windows, Winapi.Messages, Vcl.Forms, UConstantes; | |
45 | 53 | |
46 | 54 | { TPooling } |
47 | 55 |
@@ -50,7 +58,7 @@ | ||
50 | 58 | // logar a mensagem de erro em alguma propriedade da própria thread e fazer |
51 | 59 | // essa propriedade acessível externamente, assim é possivel obter a lista de |
52 | 60 | // exceções |
53 | - FOnStepIdentification := 'Falha na obtenção de dados'; | |
61 | + FOnStepIdentification := FALHANAOBTENCAODEDADOS; | |
54 | 62 | FOnStepStatus := []; |
55 | 63 | end; |
56 | 64 |
@@ -61,6 +69,8 @@ | ||
61 | 69 | FPauseRestart := nil; |
62 | 70 | FTimeOut := nil; |
63 | 71 | FTimeOutValue := ATimeOutValue; |
72 | + FRunning := False; | |
73 | + FOnStepIdentification := FALHANAOBTENCAODEDADOS; | |
64 | 74 | end; |
65 | 75 | |
66 | 76 | destructor TOnStepInfo.Destroy; |
@@ -106,8 +116,15 @@ | ||
106 | 116 | |
107 | 117 | while not Terminated do |
108 | 118 | 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 | + | |
109 | 124 | WR := FPauseRestart.WaitFor(INFINITE); |
110 | 125 | |
126 | + FRunning := True; | |
127 | + | |
111 | 128 | if not Terminated then |
112 | 129 | case WR of |
113 | 130 | wrSignaled: begin |
@@ -137,8 +154,18 @@ | ||
137 | 154 | |
138 | 155 | procedure TOnStepInfo.DoForwareException; |
139 | 156 | 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 | |
142 | 169 | if GetCapture <> 0 then |
143 | 170 | SendMessage(GetCapture, WM_CANCELMODE, 0, 0); |
144 | 171 |
@@ -161,6 +188,11 @@ | ||
161 | 188 | end; |
162 | 189 | end; |
163 | 190 | |
191 | +function TOnStepInfo.GetIsConnected: Boolean; | |
192 | +begin | |
193 | + Result := FOnStepIdentification <> FALHANAOBTENCAODEDADOS; | |
194 | +end; | |
195 | + | |
164 | 196 | procedure TOnStepInfo.Pause; |
165 | 197 | begin |
166 | 198 | if Started and Assigned(FPauseRestart) then |