Code:
unit SimpleServer;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets, CPort, SyncObjs, CellEditors, ComCtrls,
XiTrackBar, inifiles;
type
TForm1 = class(TForm)
ArduinoServer: TTcpServer;
btnStartServer: TButton;
btnStopServer: TButton;
btnExitProgram: TButton;
Memo1: TMemo;
Label2: TLabel;
IPAdress: TEdit;
Label3: TLabel;
PortNumber: TEdit;
ComPortNumber: TEdit;
Label4: TLabel;
LichtAan: TButton;
LichtUit: TButton;
XiTrackBar1: TXiTrackBar;
Label5: TLabel;
UpDateLED: TButton;
MovieMode: TLabel;
MM_Status: TLabel;
Label1: TLabel;
Status_label: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
procedure btnStartServerClick(Sender: TObject);
procedure btnStopServerClick(Sender: TObject);
procedure btnExitProgramClick(Sender: TObject);
procedure ArduinoServerAccept(Sender: TObject;
ClientSocket: TCustomIpClient);
procedure LichtAanClick(Sender: TObject);
procedure LichtUitClick(Sender: TObject);
procedure XiTrackBar1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure UpDateLEDClick(Sender: TObject);
procedure ReadLED(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ComPort: TComport;
ComDataPacket: TcomDataPacket; // extra toegevoegd
ComDataPacketPacket: string; // extra toegevoegd
Event: TEvent;
Lightdata: string;
Data: string;
i: integer;
status: string;
implementation
{$R *.dfm}
function CtrlHandler(CtrlType: LongWord): Boolean;
begin
Event.SetEvent;
Result := True;
end;
procedure TForm1.btnStartServerClick(Sender: TObject);
begin
//Event := TEvent.Create(nil, True, False, '');
//SetConsoleCtrlHandler(@CtrlHandler, True);
ComPort := TComPort.Create(nil);
ComPort.Port := 'COM6'; // comport van arduino (varieerd)
ComPort.BaudRate := br9600;
ComPort.DataBits := (dbEight);
ComPort.StopBits := (sbOneStopBit);
//ComPort.FlowControl
// ComDataPacket.ComPort := ComPort; // extra toegevoegd
// ComDataPacket.StartString :='2'; // extra toegevoegd
// ComDataPacket.StopString :='5'; // extra toegevoegd
// ComDataPacket.OnPacket := ComDataPacketPacket; // extra toegevoegd
// info gevonden op:
// http://stackoverflow.com/questions/22436319/comport-readstr
ComPort.Open; // open port
// set Host IP en Poort nummer van Server. i.e. 192.168.2.23:7777 (instelbaar in program)
ArduinoServer.LocalHost := IPAdress.Text;
ArduinoServer.LocalPort := PortNumber.Text;
ArduinoServer.Open;
Memo1.Lines.Add(DateTimeToStr(Now)+': server started');
btnStartServer.Enabled := False;
// knoppen disabelen als server gestart is!
IPAdress.Enabled := False;
PortNumber.Enabled := False;
ComPortNumber.Enabled := False;
btnStopServer.Enabled := True;
LichtAan.Enabled := True;
LichtUit.Enabled := True;
XiTrackBar1.Position := 0;
end;
procedure TForm1.btnStopServerClick(Sender: TObject);
begin
ComPort.Close;
ArduinoServer.Close;
Memo1.Lines.Add(DateTimeToStr(Now)+': server stopped');
// knoppen Enabelen als server gestopt is!
IPAdress.Enabled := True;
PortNumber.Enabled := True;
ComPortNumber.Enabled := True;
btnStartServer.Enabled := True;
end;
procedure TForm1.ArduinoServerAccept(Sender: TObject; // TTcpServer
ClientSocket: TCustomIpClient);
var
line: string;
commands: string;
HTTPPos: integer;
VraagTekenPos: integer;
begin
line := ' ';
//Memo1.Clear;
while ClientSocket.Connected and (Line <> '') do
begin
Line := ClientSocket.Receiveln();
Memo1.Lines.Add(Line);
if Copy(Line,1,6) = 'GET /?' then // zonder de slash als je urllib.urlretrieve gebruikt in python xbmc
// MET slash als je de android app gebruikt. (aanpassen)
// C:\Users\Gebruiker\AppData\Roaming\XBMC\scripts\playeractions.py
// C:\Users\Gebruiker\AppData\Roaming\XBMC\userdata\autoexec.py
begin
HTTPPos := Pos('HTTP',Line);
VraagTekenPos := Pos('?',Line);
commands := Copy(Line,VraagTekenPos+1,HTTPPos-8); // zoek naar de letters achter GET en vóór HTTP/x.x
Status_label.Caption := commands;
if commands = 'STATUS' then // status van verlichting (aan of uit) en alle andere relevante data terug sturen naar de app.
begin
if i > 0 then
begin
status := 'LICHT_AAN';
end;
if i < 1 then
begin
status := 'LICHT_UIT';
end;
if MM_Status.Caption = 'AAN' then
begin
status := status + ',MM_ON'
end;
if MM_Status.Caption = 'UIT' then
begin
status := status + ',MM_OFF'
end;
end;
if commands = 'LEVELUP' then // licht stapje hoger
begin
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('Up: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
inc(i,5);
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end;
if commands = 'LEVELDOWN' then // licht stapje lager (dimmen)
begin
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('Down: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
i:=i-5;
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end;
if (commands = 'XBMC_FADEUP') and (MM_Status.Caption = 'AAN') then // licht vol aan
begin
// i:=0; // niet nodig omdat de huidige waarde gebruikt word.
while i <=255 do
begin
ClientSocket.Sendln('HTTP/1.0 200 OK');
ClientSocket.Sendln('');
ClientSocket.Sendln(status); // vervangen door terug meldingen naar de app.
ClientSocket.Close;
Status_label.Caption := status;
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('DIM0: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.OnChange := NIL;
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
inc(i,5);
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end;
end;
// hieronder is voor XBMC (zodat ik het onafhankelijk kan aan of uit zetten van movie_mode mogelijk kan maken.
if (commands = 'XBMC_FADEDOWN') and (MM_Status.Caption = 'AAN') then // licht uit (gedimmed)
begin
// i:=255; // niet nodig omdat de huidige waarde gebruikt word.
while i >=0 do
begin
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('Fade to 100%: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.OnChange := NIL;
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
i:=i-5;
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end;
end;
if (commands = 'XBMC_FADEUPHALF') and (MM_Status.Caption = 'AAN') then // licht gedimmed naar 50%
begin
while i < 75 do
begin
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('Fade to 100%: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.OnChange := NIL;
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
i:=i+5; // (dimmen)
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end; // while i loop
end; // if commands loop
// hieronder is voor Smartfoons
if commands = 'FADEUP' then // licht vol aan
begin
// i:=0; // niet nodig omdat de huidige waarde gebruikt word.
while i <=255 do
begin
ClientSocket.Sendln('HTTP/1.0 200 OK');
ClientSocket.Sendln('');
ClientSocket.Sendln(status); // vervangen door terug meldingen naar de app.
ClientSocket.Close;
Status_label.Caption := status;
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('DIM0: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.OnChange := NIL;
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
inc(i,5);
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end;
end;
if commands = 'FADEDOWN' then // licht uit (gedimmed)
begin
// i:=255; // niet nodig omdat de huidige waarde gebruikt word.
while i >=0 do
begin
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('Fade to 100%: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.OnChange := NIL;
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
i:=i-5;
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end;
end;
if commands = 'FADEUPHALF' then // licht gedimmed naar 50%
begin
while i < 75 do
begin
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('Fade to 100%: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.OnChange := NIL;
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
i:=i+5; // (dimmen)
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end; // while i loop
end; // if commands loop
if commands = 'MOVIEMODEON' then // zet movie mode aan
begin
MM_Status.Caption := 'AAN';
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end; // if commands loop
if commands = 'MOVIEMODEOFF' then // zet movie mode uit
begin
MM_Status.Caption := 'UIT';
sleep(30); // kleine wacht tijd anders gaat de loop te snel
end; // if commands loop
Memo1.Lines.Add('Commands: '+commands); // update status label met het ontvangen commando.
XiTrackBar1.OnChange := XiTrackBar1Change;
end;
end;
ClientSocket.Sendln('HTTP/1.0 200 OK');
ClientSocket.Sendln('');
ClientSocket.Sendln(status); // vervangen door terug meldingen naar de app.
ClientSocket.Close;
Status_label.Caption := status;
end;
procedure TForm1.LichtAanClick(Sender: TObject);
begin
XiTrackBar1.OnChange := NIL; // voorkomt het triggeren van zichzelf!!!
try
repeat
inc(i, 5);
if i > 255 then i := 255;
ComPort.WriteStr(IntToStr(i) + ',' + IntToStr(i) + ',' + IntToStr(i) + #10);
Memo1.Lines.Add('Licht AAN: ' + IntToStr(i) + ',' + IntToStr(i) + ',' + IntToStr(i) + #10); // update status label met het ontvangen commando.
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(i);
sleep(30); // kleine wacht tijd anders gaat de loop te snel
until i = 255;
finally
XiTrackBar1.OnChange := XiTrackBar1Change;
end;
end;
procedure TForm1.LichtUitClick(Sender: TObject);
begin
XiTrackBar1.OnChange := NIL;
try
repeat
dec(i,5);
if i < 0 then i := 0;
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('Licht UIT: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
XiTrackBar1.Position := i;
Label5.Caption := IntToStr(XiTrackBar1.Position);
sleep(30); // kleine wacht tijd anders gaat de loop te snel
until i = 0;
finally
XiTrackBar1.OnChange := XiTrackBar1Change;
end;
end;
procedure TForm1.XiTrackBar1Change(Sender: TObject); // als onchange aan staat NIET programmatish de trackbar verschuiven (loop!!!)
begin
i := XiTrackBar1.Position; // trackbar in stapjes van 5 mogelijk???????
begin
ComPort.WriteStr(IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10);
Memo1.Lines.Add('Trackbar: '+IntToStr(i)+','+IntToStr(i)+','+IntToStr(i)+#10); // update status label met het ontvangen commando.
Label5.Caption := IntToStr(XiTrackBar1.Position);
sleep(30);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
appINI : TIniFile;
IPAdres : String;
Port : String;
SerPort : String;
begin
appINI := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')) ;
try
IPAdres := appINI.ReadString('Network','IPAdres','') ; //if no IP Adres return an empty string
Port := appINI.ReadString('Network','Port','') ; //if no ComPort return an empty string
SerPort := appINI.ReadString('Arduino','SerPort','') ; //if no SerPort return an empty string
// ShowMessage('Network IP ' + IPAdres +':'+ Port + ' en de compoort = '+ SerPort);
IPAdress.Text := IPAdres;
PortNumber.Text := Port;
ComPortNumber.Text := SerPort;
finally
appINI.Free;
end;
btnStartServer.Click; // Start Server
ReadLED(Sender); // lees de LED.ini
end;
procedure TForm1.btnExitProgramClick(Sender: TObject);
var
appINI : TIniFile;
begin
UpDateLEDClick(Sender); // bij afsluiten de huidige waarde schrijven in de LED.ini
btnStopServerClick(Sender);
appINI := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')) ;
try
appINI.WriteString('Network','IPAdres',IPAdress.Text) ;
appINI.WriteString('Network', 'Port', PortNumber.Text) ;
with appINI, Form1 do
begin
appINI.WriteString('Arduino','SerPort', ComPortNumber.Text) ;
end;
finally
appIni.Free;
end;
Close;
end;
procedure TForm1.UpDateLEDClick(Sender: TObject);
// schrijf de aktuele stand van de led's weg
var
LED : TIniFile;
RED : String;
GREEN : String;
BLUE : String;
LEVEL : String;
begin
LED := TIniFile.Create('.\LED.ini') ;
try
LED.WriteString('Channel1','RED','255');
LED.WriteString('Channel1','GREEN','255');
LED.WriteString('Channel1','BLUE','0');
LED.WriteString('Master','LEVEL',IntToStr(i));
finally
LED.Free;
end;
end;
procedure TForm1.ReadLED(Sender: TObject);
// schrijf de aktuele stand van de led's weg
var
LED : TIniFile;
RED : String;
GREEN : String;
BLUE : String;
LEVEL : String;
begin
LED := TIniFile.Create('.\LED.ini') ;
try
RED := LED.ReadString('Channel1','RED',''); // nog aanpassen aan ledkleur
GREEN := LED.ReadString('Channel1','GREEN',''); // nu nog samen de kleur geel.
BLUE := LED.ReadString('Channel1','BLUE','');
LEVEL := LED.ReadString('Master','LEVEL','');
finally
LED.Free;
end;
Label5.Caption := LEVEL;
XiTrackBar1.Position := StrToInt(LEVEL);
end;
end.
Bookmarks