blob: a0a399abf31b6119afeea43f460236d2b1c38462 (
plain) (
tree)
|
|
unit ULight;
interface
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
{$I switches.inc}
type
TLight = class
private
Enabled: boolean;
Light: array[0..7] of boolean;
LightTime: array[0..7] of real; // time to stop, need to call update to change state
LastTime: real;
public
constructor Create;
procedure Enable;
procedure SetState(State: integer);
procedure AutoSetState;
procedure TurnOn;
procedure TurnOff;
procedure LightOne(Number: integer; Time: real);
procedure Refresh;
end;
var
Light: TLight;
const
Data = $378; // default port address
Status = Data + 1;
Control = Data + 2;
implementation
uses
SysUtils,
{$IFDEF UseSerialPort}
zlportio,
{$ENDIF}
UTime;
{$IFDEF FPC}
function GetTime: TDateTime;
var
SystemTime: TSystemTime;
begin
GetLocalTime(SystemTime);
with SystemTime do
begin
{$IFDEF UNIX}
Result := EncodeTime(Hour, Minute, Second, MilliSecond);
{$ELSE}
Result := EncodeTime(wHour, wMinute, wSecond, wMilliSeconds);
{$ENDIF}
end;
end;
{$ENDIF}
constructor TLight.Create;
begin
inherited;
Enabled := false;
end;
procedure TLight.Enable;
begin
Enabled := true;
LastTime := GetTime;
end;
procedure TLight.SetState(State: integer);
begin
{$IFDEF UseSerialPort}
if Enabled then
PortWriteB($378, State);
{$ENDIF}
end;
procedure TLight.AutoSetState;
var
State: integer;
begin
if Enabled then begin
State := 0;
if Light[0] then State := State + 2;
if Light[1] then State := State + 1;
// etc
SetState(State);
end;
end;
procedure TLight.TurnOn;
begin
if Enabled then
SetState(3);
end;
procedure TLight.TurnOff;
begin
if Enabled then
SetState(0);
end;
procedure TLight.LightOne(Number: integer; Time: real);
begin
if Enabled then begin
if Light[Number] = false then begin
Light[Number] := true;
AutoSetState;
end;
LightTime[Number] := GetTime + Time/1000; // [s]
end;
end;
procedure TLight.Refresh;
var
Time: real;
L: integer;
begin
if Enabled then begin
Time := GetTime;
for L := 0 to 7 do begin
if Light[L] = true then begin
if LightTime[L] > Time then begin
end else begin
Light[L] := false;
end;
end;
end;
LastTime := Time;
AutoSetState;
end;
end;
end.
|