unit webinterface;
{$mode objfpc}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
ExtCtrls, StdCtrls, ComCtrls, Inifiles, Signals, Alarms, MQTT, MQTTreadthread;
type
{ TWebFrm }
TWebFrm = class(TForm)
ApplyBtn: TButton;
Button1: TButton;
StatusBar1: TStatusBar;
Timer1: TTimer;
Wpassword: TLabeledEdit;
Whost: TLabeledEdit;
procedure ApplyBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure myPublish(sender:TObject; topic, payload:Ansistring);
procedure myconnect(Sender:TObject; test:LongInt);
procedure OnPingMe(sender:TObject);
private
{ private declarations }
public
{ public declarations }
Procedure UpdateSignal;
end;
var
WebFrm: TWebFrm;
MQTTClient2:TMQTTClient;
pingrec, pingsent:Boolean;
pingmecnt:integer;
implementation
procedure TWebFrm.ApplyBtnClick(Sender: TObject);
var
webini:TInifile;
begin
if MQTTClient2.isConnected=false then
begin
if MQTTClient2 <> nil then
MQTTClient2.Free;
MQTTClient2 := TMQTTClient.Create(Whost.Text,strtoint(Wpassword.Text));
MQTTClient2.OnPublish:=@myPublish;
MQTTClient2.OnConnAck:=@myconnect;
MQTTClient2.OnPingResp:=@OnPingMe;
MQTTClient2.Connect;
Timer1.Enabled:=true;
end;
end;
procedure TWebFrm.myPublish(sender: TObject; topic, payload: Ansistring);
var
InSig:TSignal;
begin
topic:=ExtractFilename(topic);
InSig:=FindSignal(topic);
if InSig <> nil then
if (InSig.f.WebEnabled=true) and (InSig.f.RemoteAccess = traReadWrite) then
begin
InSig.SetInteger(strtoInt(payload));
end;
end;
procedure TWebFrm.myconnect(Sender: TObject; test:LongInt);
begin
StatusBar1.Panels[0].Text:='Connected to the MQTT Broker';
end;
procedure TWebFrm.OnPingMe(sender:TObject);
begin
pingrec:=true;
pingsent:=false;
end;
procedure TWebFrm.FormCreate(Sender: TObject);
var
webini:Tinifile;
begin
pingsent:=false;
pingrec:=false;
pingmecnt:=0;
stopmessage:=false;
MQTTClient2 := TMQTTClient.Create('localhost',1883);
MQTTClient2.OnPublish:=@myPublish;
MQTTClient2.OnConnAck:=@myconnect;
MQTTClient2.OnPingResp:=@OnPingMe;
MQTTClient2.Connect;
if MQTTClient2.isConnected then
begin
StatusBar1.Panels[0].Text:='MQTT Client Connected to Broker';
MQTTClient2.Subscribe('belt/set/#');
Timer1.Enabled:=true;
end;
end;
procedure TWebFrm.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false;
UpdateSignal;
end;
procedure TWebFrm.UpdateSignal;
var
I, mqsec:Integer;
stat1,memregstr:string;
lastAlmState:TAlarmState;
tmpstr,ValueStr:string;
begin
if MQTTClient2.isConnected=false then exit;
for I:=0 to SignalList.Count-1 do
begin
if (TSignal(SignalList.Items[I]).f.WebEnabled=true) then
begin
tmpstr:=TSignal(SignalList.Items[I]).f.TagName;
if (TSignal(SignalList.Items[I]).GetValueStr = 'OFF') then
ValueStr:='0'
else if (TSignal(SignalList.Items[I]).GetValueStr='ON') then
ValueStr:='1'
else
ValueStr:= inttostr(round(TSignal(SignalList.Items[I]).AsPercent));
MQTTClient2.Publish('belt/status/'+tmpstr, ValueStr, false);
sleep(1);
end;
end;
inc(pingmecnt);
//if ping is sent and there is no reply, then try to reconnect.
if (pingsent=true) and (pingrec=false) then
begin
if MQTTClient2<>nil then
begin
MQTTClient2.Disconnect;
MQTTClient2.Free;
end;
MQTTClient2 := TMQTTClient.Create('localhost',1883);
MQTTClient2.OnPublish:=@myPublish;
MQTTClient2.OnConnAck:=@myconnect;
MQTTClient2.OnPingResp:=@OnPingMe;
MQTTClient2.Connect;
end;
//ping every 5 minutes
if (pingmecnt>=30) then
begin
pingrec:=false;
pingsent:=true;
pingmecnt:=0;
MQTTClient2.PingReq;
end;
Timer1.Enabled:=true;
end;
initialization
{$I webinterface.lrs}
end.