Pushok icon

Elevator code

Pushok | PRO | 12/26/11 11:56:01 AM UTC | 0 ⭐ | 361 👁️ | Never ⏰ | []
Lua |

4.71 KB

|

None

|

0 👍

/

0 👎

@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