Pushok

Elevator code

Dec 26th, 2011
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.71 KB | None | 0 0
  1. @name Elevator
  2.  
  3. @outputs Tross
  4.  
  5. @outputs CurrentFloor TargetFloor StatusPixel Screen:string
  6.  
  7. @inputs F1 F2 F3 F4 F5 F6 F7 F8 F9 F0
  8. @inputs Del Start Clear
  9.  
  10. @persist MaxFloor:normal DifValue:normal UnitsPerFloor:normal RealFloor:normal
  11. @persist Imprecision:normal NextFloor
  12. @persist ErrorColor WaitingColor ActionColor
  13. @persist InAction PError:vector PWait:vector PAction:vector
  14. @persist DiffBetCurTrg:normal StartFrom:normal
  15.  
  16. interval( 50 )
  17.  
  18. function normal getFloorByTrossLen( TrossLen, Half )
  19. {
  20.     return ( Half ? round(TrossLen / UnitsPerFloor) : floor( TrossLen / UnitsPerFloor ) )
  21. }
  22.  
  23. function normal getTrossLenByFloor( Floor )
  24. {
  25.     return DifValue + Floor * UnitsPerFloor
  26. }
  27.  
  28. function normal typeOfDigit( Digit )
  29. {
  30.     if( Digit < 10 )
  31.     {
  32.         return 1
  33.     }
  34.    
  35.     if( (Digit / 10) - ceil(Digit / 10) == 0 )
  36.     {
  37.         return 2
  38.     }
  39.    
  40.     if( Digit == 0 )
  41.     {
  42.         return 3
  43.     }
  44.    
  45.     return 4
  46. }
  47.  
  48. function normal packetNumberFromVector( Vector:vector )
  49. {
  50.     #Number = 255 || 255 << 8 || 255 << 16
  51.     Number = 0
  52.    
  53.     Number = Vector:z()
  54.     Number = Number || Vector:y() << 8
  55.     Number = Number || Vector:x() << 16
  56.    
  57.     return Number
  58. }
  59.  
  60. if( first() )
  61. {
  62.     PError = vec( 255, 0, 0 )
  63.     PAction = vec( 0, 255, 0 )
  64.     PWait = vec( 255, 216, 0 )
  65.    
  66.     StatusPixel = packetNumberFromVector(PWait)
  67.    
  68.     UnitsPerFloor = 30
  69.     Imprecision = 0.8
  70.     DifValue = 15.03
  71.     MaxFloor = 20
  72.    
  73.     NextFloor = 0
  74.     TargetFloor = 0
  75.     InAction = 0
  76.    
  77.     Tross = DifValue
  78.     Screen = "Waiting your command"
  79. }
  80.  
  81. if( ~Clear )
  82. {
  83.     TargetFloor = 0
  84. }
  85.  
  86. if( ~Del )
  87. {
  88.     if( Del )
  89.     {
  90.         TargetFloor = floor(TargetFloor / 10)
  91.     }
  92. }
  93.  
  94. if
  95. (
  96.  ( ~F1 & F1 ) | (~F2 & F2) |
  97.  ( ~F3 & F3 ) | ( ~F4 & F4 ) |
  98.  ( ~F5 & F5 ) | ( ~F6 & F6 ) |
  99.  ( ~F7 & F7 ) | ( ~F8 & F8 ) |
  100.  ( ~F9 & F9 ) | ( ~F0 & F0 )
  101. )
  102. {
  103.     Type = typeOfDigit( TargetFloor )
  104.    
  105.     State = 0
  106.     Changed = 0
  107.    
  108.     if( State == 0 )
  109.     {
  110.         State = ~F1 * 1
  111.     }
  112.     if( State == 0 )
  113.     {
  114.         State = F2 * 2
  115.     }
  116.     if( State == 0 )
  117.     {
  118.         State = F3 * 3
  119.     }
  120.     if( State == 0 )
  121.     {
  122.         State = F4 * 4
  123.     }
  124.     if( State == 0 )
  125.     {
  126.         State = F5 * 5
  127.     }
  128.     if( State == 0 )
  129.     {
  130.         State = F6 * 6
  131.     }
  132.     if( State == 0 )
  133.     {
  134.         State = F7 * 7
  135.     }
  136.     if( State == 0 )
  137.     {
  138.         State = F8 * 8
  139.     }
  140.     if( State == 0 )
  141.     {
  142.         State = F9 * 9
  143.     }
  144.     if( State == 0 )
  145.     {
  146.         State = F0 * 0
  147.         Changed = 1
  148.     }
  149.    
  150.     if( State != 0 | State == 0 & Changed )
  151.     {
  152.         if( Type == 4 )
  153.         {
  154.             TargetFloor = 0
  155.             Type = 3
  156.         }
  157.        
  158.         if( Type == 3 )
  159.         {
  160.             TargetFloor = State
  161.         }
  162.         elseif( Type == 2 )
  163.         {
  164.             TargetFloor += State
  165.         }
  166.         elseif( Type == 1 )
  167.         {
  168.             TargetFloor = TargetFloor * 10 + State
  169.         }
  170.     }
  171. }
  172.  
  173. CurrentFloor = getFloorByTrossLen( Tross, 1 )
  174.  
  175. if( ~Start & Start )
  176. {
  177.     NextFloor = TargetFloor
  178.    
  179.     if( NextFloor < MaxFloor )
  180.     {
  181.         InAction = !InAction
  182.    
  183.         if( InAction )
  184.         {
  185.             Screen = "Let me do my work!"
  186.            
  187.             StatusPixel = packetNumberFromVector(PAction)
  188.             DiffBetCurTrg = abs(getTrossLenByFloor( CurrentFloor ) - getTrossLenByFloor( NextFloor ))
  189.            
  190.             StartFrom = NextFloor - CurrentFloor
  191.            
  192.             if( DiffBetCurTrg < UnitsPerFloor )
  193.             {
  194.                 DiffBetCurTrg = UnitsPerFloor
  195.             }
  196.         }
  197.         else
  198.         {
  199.             Screen = "Somethig went wrong?"
  200.             StatusPixel = packetNumberFromVector(PError)
  201.         }
  202.     }
  203.     else
  204.     {
  205.         Screen = "Selected floor is very big"
  206.         StatusPixel = packetNumberFromVector(PError)
  207.     }
  208. }
  209.  
  210. if( ->Tross & ->CurrentFloor & ->TargetFloor & ->Start & InAction)
  211. {
  212.     Diffirence = abs(getTrossLenByFloor( NextFloor ) - Tross) - ( TargetFloor == 0 ? 0 : 15 )
  213.     RealFloor = getFloorByTrossLen( Tross, 0 )
  214.     DifCurNextFloor = 0
  215.    
  216.     if( $RealFloor == 0 )
  217.     {
  218.         DifCurNextFloor = abs( getTrossLenByFloor( TargetFloor ) - Tross - DifValue )
  219.     }
  220.     else
  221.     {
  222.         DifCurNextFloor = DiffBetCurTrg
  223.     }
  224.    
  225.     if( Diffirence > Imprecision )
  226.     {
  227.         Value = abs((sin( DifCurNextFloor / DiffBetCurTrg * 180 )) * 7) + 0.5
  228.        
  229.         Tross = ( RealFloor < NextFloor ? Tross + Value : Tross - Value )
  230.     }
  231.     else
  232.     {
  233.         InAction = 0
  234.         Screen = "Waiting your command"
  235.         StatusPixel = packetNumberFromVector(PWait)
  236.     }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment