@name Elevator
@outputs Tross
@outputs CurrentFloor TargetFloor StatusPixel Screen:string
@inputs F1 F2 F3 F4 F5 F6 F7 F8 F9 F0
@inputs Del Start Clear
@persist MaxFloor:normal DifValue:normal UnitsPerFloor:normal RealFloor:normal
@persist Imprecision:normal NextFloor
@persist ErrorColor WaitingColor ActionColor
@persist InAction PError:vector PWait:vector PAction:vector
@persist DiffBetCurTrg:normal StartFrom:normal
interval( 50 )
function normal getFloorByTrossLen( TrossLen, Half )
{
return ( Half ? round(TrossLen / UnitsPerFloor) : floor( TrossLen / UnitsPerFloor ) )
}
function normal getTrossLenByFloor( Floor )
{
return DifValue + Floor * UnitsPerFloor
}
function normal typeOfDigit( Digit )
{
if( Digit < 10 )
{
return 1
}
if( (Digit / 10) - ceil(Digit / 10) == 0 )
{
return 2
}
if( Digit == 0 )
{
return 3
}
return 4
}
function normal packetNumberFromVector( Vector:vector )
{
#Number = 255 || 255 << 8 || 255 << 16
Number = 0
Number = Vector:z()
Number = Number || Vector:y() << 8
Number = Number || Vector:x() << 16
return Number
}
if( first() )
{
PError = vec( 255, 0, 0 )
PAction = vec( 0, 255, 0 )
PWait = vec( 255, 216, 0 )
StatusPixel = packetNumberFromVector(PWait)
UnitsPerFloor = 30
Imprecision = 0.8
DifValue = 15.03
MaxFloor = 20
NextFloor = 0
TargetFloor = 0
InAction = 0
Tross = DifValue
Screen = "Waiting your command"
}
if( ~Clear )
{
TargetFloor = 0
}
if( ~Del )
{
if( Del )
{
TargetFloor = floor(TargetFloor / 10)
}
}
if
(
( ~F1 & F1 ) | (~F2 & F2) |
( ~F3 & F3 ) | ( ~F4 & F4 ) |
( ~F5 & F5 ) | ( ~F6 & F6 ) |
( ~F7 & F7 ) | ( ~F8 & F8 ) |
( ~F9 & F9 ) | ( ~F0 & F0 )
)
{
Type = typeOfDigit( TargetFloor )
State = 0
Changed = 0
if( State == 0 )
{
State = ~F1 * 1
}
if( State == 0 )
{
State = F2 * 2
}
if( State == 0 )
{
State = F3 * 3
}
if( State == 0 )
{
State = F4 * 4
}
if( State == 0 )
{
State = F5 * 5
}
if( State == 0 )
{
State = F6 * 6
}
if( State == 0 )
{
State = F7 * 7
}
if( State == 0 )
{
State = F8 * 8
}
if( State == 0 )
{
State = F9 * 9
}
if( State == 0 )
{
State = F0 * 0
Changed = 1
}
if( State != 0 | State == 0 & Changed )
{
if( Type == 4 )
{
TargetFloor = 0
Type = 3
}
if( Type == 3 )
{
TargetFloor = State
}
elseif( Type == 2 )
{
TargetFloor += State
}
elseif( Type == 1 )
{
TargetFloor = TargetFloor * 10 + State
}
}
}
CurrentFloor = getFloorByTrossLen( Tross, 1 )
if( ~Start & Start )
{
NextFloor = TargetFloor
if( NextFloor < MaxFloor )
{
InAction = !InAction
if( InAction )
{
Screen = "Let me do my work!"
StatusPixel = packetNumberFromVector(PAction)
DiffBetCurTrg = abs(getTrossLenByFloor( CurrentFloor ) - getTrossLenByFloor( NextFloor ))
StartFrom = NextFloor - CurrentFloor
if( DiffBetCurTrg < UnitsPerFloor )
{
DiffBetCurTrg = UnitsPerFloor
}
}
else
{
Screen = "Somethig went wrong?"
StatusPixel = packetNumberFromVector(PError)
}
}
else
{
Screen = "Selected floor is very big"
StatusPixel = packetNumberFromVector(PError)
}
}
if( ->Tross & ->CurrentFloor & ->TargetFloor & ->Start & InAction)
{
Diffirence = abs(getTrossLenByFloor( NextFloor ) - Tross) - ( TargetFloor == 0 ? 0 : 15 )
RealFloor = getFloorByTrossLen( Tross, 0 )
DifCurNextFloor = 0
if( $RealFloor == 0 )
{
DifCurNextFloor = abs( getTrossLenByFloor( TargetFloor ) - Tross - DifValue )
}
else
{
DifCurNextFloor = DiffBetCurTrg
}
if( Diffirence > Imprecision )
{
Value = abs((sin( DifCurNextFloor / DiffBetCurTrg * 180 )) * 7) + 0.5
Tross = ( RealFloor < NextFloor ? Tross + Value : Tross - Value )
}
else
{
InAction = 0
Screen = "Waiting your command"
StatusPixel = packetNumberFromVector(PWait)
}
}
Comments