unit uled2811serverscenes;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, IdHTTPServer, IdGlobal, IdContext,
IdCustomHTTPServer, IdSocketHandle;
const
SC_LED2811_APPVERSION = '1.3.0.1';
type
TLEDsValueArray = array of byte;
TLED2811ServerScene = class;
TLED2811ServerLightScene = class;
TLED2811LanguageInfoList = TList;
TLED2811LanguageInfo = class
public
TextInLanguage : String;
Language : String;
class function createItemInList(aText, aLanguage : String) : TLED2811LanguageInfoList;
class function create2ItemsInList(aText1, aLanguage1, aText2, aLanguage2 : String) : TLED2811LanguageInfoList;
class procedure freeList(var aList : TLED2811LanguageInfoList);
end;
ILED2811Server = interface
['{7CFD83DB-7846-45AB-ACC8-69C5D3A0ABA7}']
function isCurrentActive : Boolean;
function isMasterbrickConnected : Boolean;
procedure activateCurrent;
procedure deactivateCurrent;
procedure lockCurrentScene;
procedure unlockCurrentScene;
function findScene(aSceneName:String) : TLED2811ServerScene;
function setCurrentScene(scene : TLED2811ServerLightScene) : Boolean;
function getCurrentScene : TLED2811ServerLightScene;
procedure lockScenes;
procedure unlockScenes;
function getScenes(aToList : TList) : Boolean;
procedure setValuesToStrip;
function existsStripBottom : Boolean;
function getPercentStripBottom : Integer;
procedure setStripBottomFull;
procedure setStripBottom(aPercent : Integer);
procedure setStripBottomClear;
function existsStripTop : Boolean;
function getPercentStripTop : Integer;
procedure setStripTopFull;
procedure setStripTop(aPercent : Integer);
procedure setStripTopClear;
procedure updateIntensity(aintensity : integer);
function getLEDCount : Integer;
function getLEDsR(index:Integer) : Byte;
function getLEDsG(index:Integer) : Byte;
function getLEDsB(index:Integer) : Byte;
procedure setLEDsR(index:Integer;avalue:Byte);
procedure setLEDsG(index:Integer;avalue:Byte);
procedure setLEDsB(index:Integer;avalue:Byte);
property LEDCount : Integer read getLEDCount;
property LEDsR[Index:Integer] : Byte read getLEDsR write setLEDsR;
property LEDsG[Index:Integer] : Byte read getLEDsG write setLEDsG;
property LEDsB[Index:Integer] : Byte read getLEDsB write setLEDsB;
end;
TLED2811ServerScene = class
protected
fConnector : ILED2811Server;
fIdent : String;
fDefaultCaption : String;
fCaptions : TStringList;
fLanguage : String;
fIsLightScene : Boolean;
fIsDurationScene : Boolean;
function getCaption : String; virtual;
function getCaptionInLanguage(aLanguage : String) : String; virtual;
procedure setCaption(aCaption : String; aLanguage : String = '');
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
destructor Destroy; override;
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); virtual; abstract;
property Connector : ILED2811Server read fConnector write fConnector;
property Ident : String read fIdent write fIdent;
property Caption : String read getCaption;
property IsLightScene : Boolean read fIsLightScene;
property IsDurationScene : Boolean read fIsDurationScene;
property Language : String read fLanguage write fLanguage;
end;
TLED2811ServerLightScene = class(TLED2811ServerScene)
protected
fRunning : Boolean;
procedure startRunning; virtual;
procedure stopRunning; virtual;
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
destructor Destroy; override;
procedure stop; virtual;
function isRunning : Boolean; virtual;
end;
TLED2811ServerDurationScene = class;
TLED2811ServerDurationSceneThread = class(TThread)
protected
fDelayMS: Integer;
fParent: TLED2811ServerDurationScene;
procedure Execute; override;
public
constructor Create(aParent : TLED2811ServerDurationScene; aDelay : Integer);
destructor Destroy; override;
end;
TLED2811ServerDurationScene = class(TLED2811ServerLightScene)
protected
fDelayMS : Integer;
fWorker : TLED2811ServerDurationSceneThread;
procedure startRunning; override;
procedure stopRunning; override;
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
destructor Destroy; override;
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
procedure init; virtual; abstract;
procedure work; virtual; abstract;
procedure done; virtual; abstract;
procedure stop; override;
end;
TLED2811ServerRunningDotScene = class(TLED2811ServerDurationScene)
protected
fCurrentIndex : Integer;
fRed, fGreen, fBlue, fFactor : Integer;
fDefRed, fDefGreen, fDefBlue : Integer;
public
constructor Create(aConnector:ILED2811Server;aIdent:String; aDotColorRed, aDotColorGreen, aDotColorBlue : Integer; aDelay : Integer);
destructor Destroy; override;
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
procedure init; override;
procedure work; override;
procedure done; override;
end;
TLED2811SceneSetAutomatic = class(TLED2811ServerDurationScene)
protected
fLastCheckTime : TDateTime;
procedure rethink; virtual;
procedure setNightMode; virtual;
procedure setDayMode; virtual;
public
constructor Create(aConnector:ILED2811Server;aIdent:String; aDelay : Integer);
destructor Destroy; override;
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
procedure init; override;
procedure work; override;
procedure done; override;
end;
TLED2811SceneExecute = class(TLED2811ServerLightScene)
protected
fExecPath : String;
public
constructor Create(aConnector:ILED2811Server;aIdent:String;aExecPath : String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811ScenePlainColor = class(TLED2811ServerLightScene)
private
fRed, fGreen, fBlue : Byte;
fDivFactor : Integer;
public
constructor Create(aConnector:ILED2811Server;aIdent:String;aRed,aGreen,aBlue:Byte;aDivFactor:Integer; aCaption : String; aLangInfo : TLED2811LanguageInfoList);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneMotionDetect = class(TLED2811ServerDurationScene)
private
fRed, fGreen, fBlue : Byte;
fDivFactor : Integer;
fDelayActive : Integer;
fLastActive : TDateTime;
public
constructor Create(aConnector:ILED2811Server;aIdent:String;aRed,aGreen,aBlue:Byte;aDivFactor:Integer; aCaption : String; aLangInfo : TLED2811LanguageInfoList);
destructor Destroy; override;
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
procedure init; override;
procedure work; override;
procedure done; override;
procedure setOn;
procedure setOff;
end;
TLED2811SceneInfo = class(TLED2811ServerScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneState = class(TLED2811ServerScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneStart = class(TLED2811ServerScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneStop = class(TLED2811ServerScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneClear = class(TLED2811ServerLightScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneSetAll = class(TLED2811ServerLightScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneSetColor = class(TLED2811ServerLightScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneSetBottom = class(TLED2811ServerLightScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneSetTop = class(TLED2811ServerLightScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneSetEvening = class(TLED2811ServerLightScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneSetNight = class(TLED2811ServerLightScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneToggle = class(TLED2811ServerScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneSetRainbow = class(TLED2811ServerLightScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneCurrentScene = class(TLED2811ServerScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
TLED2811SceneSupportedScenes = class(TLED2811ServerScene)
private
public
constructor Create(aConnector:ILED2811Server;aIdent:String);
procedure start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
implementation
uses DateUtils, sunRiseSetUnit, Math;
{ **************************************************************************** }
{ ***** TLED2811LanguageInfo ************************************************* }
{ **************************************************************************** }
class function TLED2811LanguageInfo.createItemInList(aText, aLanguage : String) : TLED2811LanguageInfoList;
var li : TLED2811LanguageInfo;
begin
result := TLED2811LanguageInfoList.Create;
li := TLED2811LanguageInfo.Create;
li.TextInLanguage:=aText;
li.Language:=aLanguage;
result.Add(li);
end;
class function TLED2811LanguageInfo.create2ItemsInList(aText1, aLanguage1, aText2, aLanguage2 : String) : TLED2811LanguageInfoList;
var li : TLED2811LanguageInfo;
begin
result := TLED2811LanguageInfoList.Create;
li := TLED2811LanguageInfo.Create;
li.TextInLanguage:=aText1;
li.Language:=aLanguage1;
result.Add(li);
li := TLED2811LanguageInfo.Create;
li.TextInLanguage:=aText2;
li.Language:=aLanguage2;
result.Add(li);
end;
class procedure TLED2811LanguageInfo.freeList(var aList : TLED2811LanguageInfoList);
var i : integer; o : TObject;
begin
if aList <> nil then
begin
for i := 0 to Pred(aList.Count) do
begin
o := TObject(aList[i]);
aList[i] := nil;
FreeAndNil(o);
end;
FreeAndNil(aList);
end;
end;
{ **************************************************************************** }
{ ***** TLED2811ServerScene ************************************************** }
{ **************************************************************************** }
constructor TLED2811ServerScene.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create;
fIdent:=aIdent;
fConnector:=aConnector;
fCaptions:=TStringList.Create;
fLanguage:='';
fDefaultCaption:='';
fIsLightScene:=false;
fIsDurationScene:=false;
end;
destructor TLED2811ServerScene.Destroy;
begin
FreeAndNil(fCaptions);
inherited Destroy;
end;
function TLED2811ServerScene.getCaption : String;
begin
result:=getCaptionInLanguage(fLanguage);
end;
function TLED2811ServerScene.getCaptionInLanguage(aLanguage : String) : String;
begin
if aLanguage<>'' then
begin
result:=fCaptions.Values[aLanguage];
if result='' then result:=fDefaultCaption;
end else
begin
result:=fDefaultCaption;
end;
end;
procedure TLED2811ServerScene.setCaption(aCaption : String; aLanguage : String = '');
begin
if aLanguage<>'' then
begin
fCaptions.Add(aLanguage+'='+aCaption);
end else
begin
fDefaultCaption:=aCaption;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811ServerLightScene ********************************************* }
{ **************************************************************************** }
constructor TLED2811ServerLightScene.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
fRunning:=false;
fIsLightScene:=true;
end;
destructor TLED2811ServerLightScene.Destroy;
begin
inherited Destroy;
end;
function TLED2811ServerLightScene.isRunning : Boolean;
begin
result := fRunning;
end;
procedure TLED2811ServerLightScene.startRunning;
begin
fRunning:=true;
end;
procedure TLED2811ServerLightScene.stopRunning;
begin
fRunning:=false;
end;
procedure TLED2811ServerLightScene.stop;
begin
fRunning:=false;
end;
{ **************************************************************************** }
{ ***** TLED2811ServerDurationSceneThread ************************************ }
{ **************************************************************************** }
constructor TLED2811ServerDurationSceneThread.Create(aParent : TLED2811ServerDurationScene; aDelay : Integer);
begin
inherited Create(true);
fParent:= aParent;
fDelayMS:= aDelay;
end;
destructor TLED2811ServerDurationSceneThread.Destroy;
begin
inherited Destroy;
end;
procedure TLED2811ServerDurationSceneThread.Execute;
begin
fParent.init;
try
while not Terminated do
begin
fParent.work;
sleep(fDelayMS);
end;
finally
fParent.done;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811ServerDurationScene ****************************************** }
{ **************************************************************************** }
constructor TLED2811ServerDurationScene.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
fWorker := nil;
fDelayMS := 100;
fIsDurationScene:=true;
end;
destructor TLED2811ServerDurationScene.Destroy;
begin
inherited Destroy;
end;
procedure TLED2811ServerDurationScene.startRunning;
begin
fWorker := TLED2811ServerDurationSceneThread.Create(self, fDelayMS);
fWorker.Start;
inherited startRunning;
end;
procedure TLED2811ServerDurationScene.stopRunning;
begin
if fWorker <> nil then
begin
fWorker.Terminate;
fWorker.WaitFor;
FreeAndNil(fWorker);
end;
inherited stopRunning;
end;
procedure TLED2811ServerDurationScene.stop;
begin
stopRunning;
end;
procedure TLED2811ServerDurationScene.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
startRunning;
end;
{ **************************************************************************** }
{ ***** TLED2811ServerRunningDotScene **************************************** }
{ **************************************************************************** }
constructor TLED2811ServerRunningDotScene.Create(aConnector:ILED2811Server;aIdent:String; aDotColorRed, aDotColorGreen, aDotColorBlue : Integer; aDelay : Integer);
begin
inherited Create(aConnector, aIdent);
fDefRed:=aDotColorRed;
fDefGreen:=aDotColorGreen;
fDefBlue:=aDotColorBlue;
fDelayMS := aDelay;
setCaption('running dot');
setCaption('running dot', 'en');
setCaption('Laufender Punkt', 'de');
end;
destructor TLED2811ServerRunningDotScene.Destroy;
begin
inherited Destroy;
end;
procedure TLED2811ServerRunningDotScene.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var d : Integer;
begin
fFactor := StrToIntDef(ARequestInfo.Params.Values['i'], 1);
fRed := StrToIntDef(ARequestInfo.Params.Values['r'], 0);
fGreen := StrToIntDef(ARequestInfo.Params.Values['g'], 0);
fBlue := StrToIntDef(ARequestInfo.Params.Values['b'], 0);
d := StrToIntDef(ARequestInfo.Params.Values['d'], 0);
if (fRed=0) and (fGreen=0) and (fBlue=0) then
begin
fRed:=fDefRed;
fGreen:=fDefGreen;
fBlue:=fDefBlue;
end;
if d > 0 then
begin
fDelayMS := d;
end;
inherited;
end;
procedure TLED2811ServerRunningDotScene.init;
var i : Integer;
begin
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
for i := 0 to Pred(fConnector.LEDCount) do
begin
fConnector.LEDsR[i] := 0;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
fCurrentIndex:=0;
fConnector.activateCurrent;
end;
procedure TLED2811ServerRunningDotScene.work;
begin
if fCurrentIndex<fConnector.LEDCount then
begin
if fCurrentIndex > 0 then
begin
fConnector.LEDsR[fCurrentIndex-1] := 0;
fConnector.LEDsG[fCurrentIndex-1] := 0;
fConnector.LEDsB[fCurrentIndex-1] := 0;
end;
fConnector.LEDsR[fCurrentIndex] := round(fRed / fFactor);
fConnector.LEDsG[fCurrentIndex] := round(fGreen / fFactor);
fConnector.LEDsB[fCurrentIndex] := round(fBlue / fFactor);
inc(fCurrentIndex);
end else
begin
fConnector.LEDsR[fConnector.LEDCount-1] := 0;
fConnector.LEDsG[fConnector.LEDCount-1] := 0;
fConnector.LEDsB[fConnector.LEDCount-1] := 0;
fCurrentIndex:=0;
end;
end;
procedure TLED2811ServerRunningDotScene.done;
begin
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSetAutomatic ******************************************** }
{ **************************************************************************** }
constructor TLED2811SceneSetAutomatic.Create(aConnector:ILED2811Server;aIdent:String; aDelay : Integer);
begin
inherited Create(aConnector, aIdent);
setCaption('automatic program');
setCaption('automatic program', 'en');
setCaption('Automatisches Programm', 'de');
end;
destructor TLED2811SceneSetAutomatic.Destroy;
begin
inherited Destroy;
end;
procedure TLED2811SceneSetAutomatic.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
fLastCheckTime:=0;
inherited;
end;
procedure TLED2811SceneSetAutomatic.rethink;
var sset, srise, n : TDateTime; lat, lon : double; zs : string;
begin
lon := 11.587034;
lat := 50.934860;
n := now;
zs := DateTimeToStr(n);
srise := sunRiseSet(sunrising, IncDay(n,1), lat, lon, zenithOfficial, 1);
zs := DateTimeToStr(srise);
sset := sunRiseSet(sunsetting, n, lat, lon, zenithOfficial, 1);
zs := DateTimeToStr(sset);
if (n >= sset) and (n <= srise) then
begin
setNightMode;
end else
begin
setDayMode;
end;
end;
procedure TLED2811SceneSetAutomatic.setNightMode;
var i, cfr : Integer;
begin
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
cfr := 12;
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := abs(255) div cfr;
fConnector.LEDsG[i] := abs(125-(i*2)) div cfr;
fConnector.LEDsB[i] := abs(65-(i*5)) div cfr;
end;
fConnector.activateCurrent;
end;
procedure TLED2811SceneSetAutomatic.setDayMode;
var i : Integer;
begin
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
for i := 0 to Pred(fConnector.LEDCount) do
begin
fConnector.LEDsR[i] := 0;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
fConnector.deactivateCurrent;
end;
procedure TLED2811SceneSetAutomatic.init;
var i : Integer;
begin
fLastCheckTime := 0;
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
for i := 0 to Pred(fConnector.LEDCount) do
begin
fConnector.LEDsR[i] := 0;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
fConnector.deactivateCurrent;
end;
procedure TLED2811SceneSetAutomatic.work;
begin
if SecondsBetween(fLastCheckTime, Now) > 30 then
begin
rethink;
fLastCheckTime := now;
end else
begin
end;
end;
procedure TLED2811SceneSetAutomatic.done;
begin
end;
{ **************************************************************************** }
{ ***** TLED2811SceneExecute ************************************************* }
{ **************************************************************************** }
constructor TLED2811SceneExecute.Create(aConnector:ILED2811Server;aIdent:String;aExecPath : String);
begin
inherited Create(aConnector, aIdent);
fExecPath := aExecPath;
setCaption('command '+aIdent);
setCaption('command '+aIdent, 'en');
setCaption('Kommando '+aIdent, 'de');
end;
procedure TLED2811SceneExecute.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
ExecuteProcess(fExecPath, '');
end;
{ **************************************************************************** }
{ ***** TLED2811ScenePlainColor ********************************************** }
{ **************************************************************************** }
constructor TLED2811ScenePlainColor.Create(aConnector:ILED2811Server;aIdent:String;aRed,aGreen,aBlue:Byte;aDivFactor:Integer; aCaption : String; aLangInfo : TLED2811LanguageInfoList);
var li : TLED2811LanguageInfo; i : Integer;
begin
inherited Create(aConnector, aIdent);
fRed:=aRed;
fGreen:=aGreen;
fBlue:=aBlue;
fDivFactor:=aDivFactor;
if aLangInfo = nil then
begin
setCaption('plain color');
setCaption('plain color', 'en');
setCaption('Komplett eine Farbe setzen', 'de');
end else
begin
if aCaption <> '' then
begin
setCaption(aCaption);
end else
begin
if aLangInfo.Count> 0 then
begin
li := TLED2811LanguageInfo(aLangInfo[0]);
setCaption(li.TextInLanguage);
end;
end;
for i := 0 to Pred(aLangInfo.Count) do
begin
li := TLED2811LanguageInfo(aLangInfo[i]);
setCaption(li.TextInLanguage, li.Language);
end;
end;
end;
procedure TLED2811ScenePlainColor.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i : Integer;
begin
startRunning;
try
fConnector.activateCurrent;
if fDivFactor > 0 then
begin
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := fRed div fDivFactor;
fConnector.LEDsG[i] := fGreen div fDivFactor;
fConnector.LEDsB[i] := fBlue div fDivFactor;
end;
end else
begin
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := fRed;
fConnector.LEDsG[i] := fGreen;
fConnector.LEDsB[i] := fBlue;
end;
end;
fConnector.setValuesToStrip;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneMotionDetect ******************************************** }
{ **************************************************************************** }
constructor TLED2811SceneMotionDetect.Create(aConnector:ILED2811Server;aIdent:String;aRed,aGreen,aBlue:Byte;aDivFactor:Integer; aCaption : String; aLangInfo : TLED2811LanguageInfoList);
var li : TLED2811LanguageInfo; i : Integer;
begin
inherited Create(aConnector, aIdent);
fRed:=aRed;
fGreen:=aGreen;
fBlue:=aBlue;
fDivFactor:=aDivFactor;
if aLangInfo = nil then
begin
setCaption('motion detect');
setCaption('motion detect', 'en');
setCaption('Bewegungserkennung', 'de');
end else
begin
if aCaption <> '' then
begin
setCaption(aCaption);
end else
begin
if aLangInfo.Count> 0 then
begin
li := TLED2811LanguageInfo(aLangInfo[0]);
setCaption(li.TextInLanguage);
end;
end;
for i := 0 to Pred(aLangInfo.Count) do
begin
li := TLED2811LanguageInfo(aLangInfo[i]);
setCaption(li.TextInLanguage, li.Language);
end;
end;
end;
destructor TLED2811SceneMotionDetect.Destroy;
begin
inherited;
end;
procedure TLED2811SceneMotionDetect.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
inherited;
end;
procedure TLED2811SceneMotionDetect.setOn;
var i : Integer;
begin
fConnector.activateCurrent;
if fDivFactor > 0 then
begin
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := fRed div fDivFactor;
fConnector.LEDsG[i] := fGreen div fDivFactor;
fConnector.LEDsB[i] := fBlue div fDivFactor;
end;
end else
begin
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := fRed;
fConnector.LEDsG[i] := fGreen;
fConnector.LEDsB[i] := fBlue;
end;
end;
fConnector.setValuesToStrip;
fLastActive:=Now;
end;
procedure TLED2811SceneMotionDetect.setOff;
var i : Integer;
begin
fConnector.deactivateCurrent;
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := 0;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
fConnector.setValuesToStrip;
fLastActive:=nan;
end;
procedure TLED2811SceneMotionDetect.init;
begin
fDelayActive := 50;
fLastActive := nan;
end;
procedure TLED2811SceneMotionDetect.work;
begin
if not isnan(fLastActive) then
begin
if DateUtils.SecondsBetween(fLastActive, Now) > fDelayActive then
begin
setOff;
end;
end;
end;
procedure TLED2811SceneMotionDetect.done;
begin
end;
{ **************************************************************************** }
{ ***** TLED2811SceneInfo **************************************************** }
{ **************************************************************************** }
constructor TLED2811SceneInfo.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('info');
setCaption('info', 'en');
setCaption('Informationen', 'de');
end;
procedure TLED2811SceneInfo.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var encoding : String; sl : TStrings;
begin
sl := TStringList.Create;
try
sl.Add('led2811-server:v3');
sl.Add('led2811-version:'+SC_LED2811_APPVERSION);
sl.Add('led2811-host:'+GetEnvironmentVariable('COMPUTERNAME'));
encoding:='UTF-8';
AResponseInfo.ResponseNo:=200;
AResponseInfo.ResponseText:='';
AResponseInfo.ContentText:=sl.Text;
AResponseInfo.ContentType:='text/plain';
AResponseInfo.ContentEncoding := encoding;
AResponseInfo.CustomHeaders.Values['encoding']:=encoding;
AResponseInfo.ContentLanguage := 'de';
finally
FreeAndNil(sl);
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneState *************************************************** }
{ **************************************************************************** }
constructor TLED2811SceneState.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('state');
setCaption('state', 'en');
setCaption('Status abrufen', 'de');
end;
procedure TLED2811SceneState.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var encoding, content, zs : String; i, ict, icb, ipt, ipb : Integer; sl, sld : TStringList; cr, cg, cb : Byte;
begin
sl := TStringList.Create;
sld := TStringList.Create;
try
sld.Delimiter:=';';
for i := 0 to Pred(fConnector.LEDCount) do
begin
cr := fConnector.LEDsR[i];
cg := fConnector.LEDsG[i];
cb := fConnector.LEDsB[i];
zs := ByteToHex(cr) + ByteToHex(cg) + ByteToHex(cb);
sld.Add(zs);
end;
if fConnector.existsStripTop then
begin
ict := 1;
ipt := fConnector.getPercentStripTop;
end else
begin
ict := 0;
ipt := 0;
end;
if fConnector.existsStripBottom then
begin
icb := 1;
ipb := fConnector.getPercentStripBottom;
end else
begin
icb := 0;
ipb := 0;
end;
sl.Add('currentactive='+BoolToStr(fConnector.isCurrentActive, true));
sl.Add('masterbrickconnected='+BoolToStr(fConnector.isMasterbrickConnected, true));
sl.Add('ledcountdigital='+IntToStr(fConnector.LEDCount));
sl.Add('ledstatedigital='+sld.DelimitedText);
sl.Add('ledcounttop='+IntToStr(ict));
sl.Add('ledstatetop='+IntToStr(ipt));
sl.Add('ledcountbottom='+IntToStr(icb));
sl.Add('ledstatebottom='+IntToStr(ipb));
content := sl.Text;
encoding:='UTF-8';
AResponseInfo.ResponseNo:=200;
AResponseInfo.ResponseText:='';
AResponseInfo.ContentText:=content;
AResponseInfo.ContentType:='text/plain';
AResponseInfo.ContentEncoding := encoding;
AResponseInfo.CustomHeaders.Values['encoding']:=encoding;
AResponseInfo.ContentLanguage := 'de';
finally
FreeAndNil(sld);
FreeAndNil(sl);
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneStart *************************************************** }
{ **************************************************************************** }
constructor TLED2811SceneStart.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('start');
setCaption('start', 'en');
setCaption('Starten', 'de');
end;
procedure TLED2811SceneStart.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
try
fConnector.activateCurrent;
finally
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneStop **************************************************** }
{ **************************************************************************** }
constructor TLED2811SceneStop.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('stop');
setCaption('stop', 'en');
setCaption('Stoppen', 'de');
end;
procedure TLED2811SceneStop.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
try
fConnector.deactivateCurrent;
finally
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneClear *************************************************** }
{ **************************************************************************** }
constructor TLED2811SceneClear.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('clear, switch off');
setCaption('clear, switch off', 'en');
setCaption('Löschen/Ausschalten', 'de');
end;
procedure TLED2811SceneClear.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i : Integer;
begin
startRunning;
try
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := 0;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
fConnector.setValuesToStrip;
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
sleep(1000); // to avoid flickering of stripe after deactivate current
fConnector.deactivateCurrent;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSetAll ************************************************** }
{ **************************************************************************** }
constructor TLED2811SceneSetAll.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('maximum lightning');
setCaption('maximum lightning', 'en');
setCaption('Volle Helligkeit', 'de');
end;
procedure TLED2811SceneSetAll.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i : Integer;
begin
startRunning;
try
fConnector.activateCurrent;
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := 255;
fConnector.LEDsG[i] := 255;
fConnector.LEDsB[i] := 255;
end;
fConnector.setValuesToStrip;
fConnector.setStripBottomFull;
fConnector.setStripTopFull;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSetColor ************************************************ }
{ **************************************************************************** }
constructor TLED2811SceneSetColor.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('set user color');
setCaption('set user color', 'en');
setCaption('Eigene Farbe setzen', 'de');
end;
procedure TLED2811SceneSetColor.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i, cfr, cred, cgreen, cblue : Integer;
begin
startRunning;
try
fConnector.activateCurrent;
cfr := StrToIntDef(ARequestInfo.Params.Values['i'], 1);
cred := StrToIntDef(ARequestInfo.Params.Values['r'], 0);
cgreen := StrToIntDef(ARequestInfo.Params.Values['g'], 0);
cblue := StrToIntDef(ARequestInfo.Params.Values['b'], 0);
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := cred div cfr;
fConnector.LEDsG[i] := cgreen div cfr;
fConnector.LEDsB[i] := cblue div cfr;
end;
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
fConnector.setValuesToStrip;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSetBottom *********************************************** }
{ **************************************************************************** }
constructor TLED2811SceneSetBottom.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('set bottom');
setCaption('set bottom', 'en');
setCaption('Licht unten setzen', 'de');
end;
procedure TLED2811SceneSetBottom.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i, cfr : Integer; clearrgbs, cleartop : boolean;
begin
startRunning;
try
cfr := StrToIntDef(ARequestInfo.Params.Values['v'], 0);
clearrgbs := StrToBoolDef(ARequestInfo.Params.Values['clearrgbs'], true);
cleartop := StrToBoolDef(ARequestInfo.Params.Values['cleartop'], true);
fConnector.activateCurrent;
if cfr = 100 then
begin
fConnector.setStripBottomFull;
end else
begin
if cfr = 0 then
begin
fConnector.setStripBottomClear;
end else
begin
fConnector.setStripBottom(cfr);
end;
end;
if clearrgbs then
begin
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := 0;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
end;
if cleartop then
begin
fConnector.setStripTopClear;
end;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSetTop ************************************************** }
{ **************************************************************************** }
constructor TLED2811SceneSetTop.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('set top');
setCaption('set top', 'en');
setCaption('Licht oben setzen', 'de');
end;
procedure TLED2811SceneSetTop.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i, cfr : Integer; clearrgbs, clearbottom : boolean;
begin
startRunning;
try
cfr := StrToIntDef(ARequestInfo.Params.Values['v'], 0);
clearrgbs := StrToBoolDef(ARequestInfo.Params.Values['clearrgbs'], true);
clearbottom := StrToBoolDef(ARequestInfo.Params.Values['clearbottom'], true);
fConnector.activateCurrent;
if cfr = 100 then
begin
fConnector.setStripTopFull;
end else
begin
if cfr = 0 then
begin
fConnector.setStripTopClear;
end else
begin
fConnector.setStripTop(cfr);
end;
end;
if clearrgbs then
begin
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := 0;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
end;
if clearbottom then
begin
fConnector.setStripBottomClear;
end;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSetEvening ********************************************** }
{ **************************************************************************** }
constructor TLED2811SceneSetEvening.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('evening program');
setCaption('evening program', 'en');
setCaption('Abendprogramm', 'de');
end;
procedure TLED2811SceneSetEvening.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i, cfr : Integer;
begin
startRunning;
try
fConnector.activateCurrent;
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
cfr := 12;
for i := 0 to fConnector.LEDCount - 1 do
begin
fConnector.LEDsR[i] := abs(255) div cfr;
fConnector.LEDsG[i] := abs(125-(i*2)) div cfr;
fConnector.LEDsB[i] := abs(65-(i*3)) div cfr;
end;
fConnector.setValuesToStrip;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSetNight ************************************************ }
{ **************************************************************************** }
constructor TLED2811SceneSetNight.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('night program');
setCaption('night program', 'en');
setCaption('Nachtprogramm', 'de');
end;
procedure TLED2811SceneSetNight.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i : Integer;
begin
startRunning;
try
fConnector.activateCurrent;
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
for i := 0 to fConnector.LEDCount - 1 do
begin
if (i mod 4) = 0 then
begin
//fConnector.LEDsR[i] := 3;
//fConnector.LEDsG[i] := 2;
//fConnector.LEDsB[i] := 1;
fConnector.LEDsR[i] := 3;
fConnector.LEDsG[i] := 1;
fConnector.LEDsB[i] := 0;
end else
begin
fConnector.LEDsR[i] := 1;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
end;
fConnector.setValuesToStrip;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneToggle ************************************************** }
{ **************************************************************************** }
constructor TLED2811SceneToggle.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('toggle');
setCaption('toggle', 'en');
setCaption('Umschalten', 'de');
end;
procedure TLED2811SceneToggle.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var scene : TLED2811ServerScene;
begin
try
if fConnector.isCurrentActive then
begin
//fConnector.deactivateCurrent;
scene := fConnector.findScene('clear');
if scene is TLED2811ServerLightScene then
begin
if fConnector.setCurrentScene(TLED2811ServerLightScene(scene)) then
begin
scene.start(AContext, ARequestInfo, AResponseInfo)
end;
end;
end else
begin
//fConnector.activateCurrent;
scene := fConnector.findScene('setall');
if scene is TLED2811ServerLightScene then
begin
if fConnector.setCurrentScene(TLED2811ServerLightScene(scene)) then
begin
scene.start(AContext, ARequestInfo, AResponseInfo)
end;
end;
end;
finally
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSetRainbow ********************************************** }
{ **************************************************************************** }
constructor TLED2811SceneSetRainbow.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('rainbow program');
setCaption('rainbow program', 'en');
setCaption('Regenbogen', 'de');
end;
procedure TLED2811SceneSetRainbow.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i, cfr : Integer;
begin
startRunning;
try
fConnector.activateCurrent;
fConnector.setStripBottomClear;
fConnector.setStripTopClear;
cfr := 12;
for i := 0 to fConnector.LEDCount - 1 do
begin
if (i mod 4) = 0 then
begin
fConnector.LEDsR[i] := 3;
fConnector.LEDsG[i] := 2;
fConnector.LEDsB[i] := 1;
end else
begin
fConnector.LEDsR[i] := 0;
fConnector.LEDsG[i] := 0;
fConnector.LEDsB[i] := 0;
end;
end;
fConnector.setValuesToStrip;
finally
stopRunning;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneGetCurrentScene ***************************************** }
{ **************************************************************************** }
constructor TLED2811SceneCurrentScene.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('get current scene');
setCaption('get current scene', 'en');
setCaption('Aktuelle Szene ermitteln', 'de');
end;
procedure TLED2811SceneCurrentScene.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var scene : TLED2811ServerLightScene; cont, encoding : String;
begin
fConnector.lockCurrentScene;
try
scene := fConnector.getCurrentScene;
if scene <> nil then
begin
cont := scene.Ident;
end else
begin
cont := '';
end;
encoding:='UTF-8';
AResponseInfo.ResponseNo:=200;
AResponseInfo.ResponseText:='';
AResponseInfo.ContentText:=cont;
AResponseInfo.ContentType:='text/plain';
AResponseInfo.ContentEncoding := encoding;
AResponseInfo.CustomHeaders.Values['encoding']:=encoding;
AResponseInfo.ContentLanguage := 'de';
finally
fConnector.unlockCurrentScene;
end;
end;
{ **************************************************************************** }
{ ***** TLED2811SceneSupportedScenes ***************************************** }
{ **************************************************************************** }
constructor TLED2811SceneSupportedScenes.Create(aConnector:ILED2811Server;aIdent:String);
begin
inherited Create(aConnector, aIdent);
setCaption('get supported scenes');
setCaption('get supported scenes', 'en');
setCaption('Unterstützte Szenen ermitteln', 'de');
end;
procedure TLED2811SceneSupportedScenes.start(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var i : integer; scene : TLED2811ServerScene; encoding, zs : String; lst : TList; sl : TStringList;
begin
fConnector.lockScenes;
try
sl := TStringList.Create;
lst := TList.Create;
try
fConnector.getScenes(lst);
for i := 0 to Pred(lst.Count) do
begin
scene := TLED2811ServerScene(lst[i]);
if scene <> nil then
begin
zs := Format('%0:s;%1:s;%2:s;%3:s', [scene.Ident, scene.Caption, BoolToStr(scene.IsLightScene, true), BoolToStr(scene.IsDurationScene, true)]);
sl.Add(zs);
end else
begin
end;
end;
zs := sl.Text;
encoding:='UTF-8';
AResponseInfo.ResponseNo:=200;
AResponseInfo.ResponseText:='';
AResponseInfo.ContentText:=zs;
AResponseInfo.ContentType:='text/plain';
AResponseInfo.ContentEncoding := encoding;
AResponseInfo.CustomHeaders.Values['encoding']:=encoding;
AResponseInfo.ContentLanguage := 'de';
finally
FreeAndNil(sl);
FreeAndNil(lst);
end;
finally
fConnector.unlockScenes;
end;
end;
end.