{* UltraStar Deluxe - Karaoke Game
*
* UltraStar Deluxe is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*}
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.