{* 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.