Advertisement
agmike

lse.base.locomotive.gs

Aug 17th, 2011
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.56 KB | None | 0 0
  1. /* LSE_FILE_HEADER */
  2.  
  3. include "locomotive.gs"
  4.  
  5. include "lse.init.gs"
  6.  
  7. include "lse.pneum.vehicle.gs"
  8.  
  9. include "lse.dev.device.gs"
  10.  
  11. include "lse.base.cabin.gs"
  12.  
  13.  
  14. final static class LseUpdate
  15. {
  16.     public float time;
  17.     public float dt;
  18.    
  19.     final public void BeginUpdate(float time, float dt)
  20.     {
  21.         me.time = time;
  22.         me.dt = dt;
  23.     }
  24. };
  25.  
  26.  
  27. final class LseCabinControlState
  28. {
  29.     public float Value   = 0.0;
  30.     public bool  Visible = true;
  31.     public float Fade    = 0.0;
  32.     public bool  Locked  = false;
  33. };
  34.  
  35.  
  36. class LseStdVehicleGraphScheme isclass LseStdLocomotiveScheme {};
  37.  
  38.  
  39. class LseLocomotive isclass Locomotive, LseInit, LpeVehicle
  40. {
  41.     public LseStdVehicleGraphScheme PneumaticScheme;
  42.  
  43.     public LpeScheme Lpe_GetPneumaticScheme() { return cast <LpeScheme> PneumaticScheme; }
  44.  
  45.     define public int PositionSingle = 0;
  46.     define public int PositionFrontmost = 1;
  47.     define public int PositionRearmost = 2;
  48.     define public int PositionInternal = 3;
  49.  
  50.     final public int GetPosition();
  51.    
  52.     final public void AddDevice(string deviceName, LseDevDevice device);
  53.     final public LseDevDevice GetDevice(string deviceName);
  54.     final public void AddDeviceUpdates(LseDevDevice dev, int flags, bool useCabinUpdates);
  55.     final public void AddDeviceUpdates(LseDevDevice dev, int flags);
  56.     public void AddDeviceControlHandler(LseDevCabinDevice device, string controlName);
  57.     public thread void CreateDeviceThread(LseDevDevice src, string threadName);
  58.    
  59.     final public bool CheckCabin();
  60.     final public LseCabin GetCabin();
  61.     final public void AttachCabin(LseCabin cabin);
  62.    
  63.     final public int GetControlId(string controlName);
  64.     final public LseCabinControlState GetControlState(int controlId);
  65.     final public void SetControlState(int controlId);
  66.     final public void ProcessControl(CabinControl srcControl, float value);
  67.  
  68.     final public int GetPosition()
  69.     {
  70.         Vehicle[] trainVehicles = GetMyTrain().GetVehicles();
  71.         int trainVehiclesSize = trainVehicles.size();
  72.  
  73.         if (trainVehiclesSize <= 1)
  74.             return PositionSingle;
  75.         if (trainVehicles[0] == me)
  76.             return PositionFrontmost;
  77.         if (trainVehicles[trainVehiclesSize - 1] == me)
  78.             return PositionRearmost;
  79.         return PositionInternal;
  80.     }
  81.    
  82.     // ****************************************************
  83.     // Device management
  84.     //
  85.    
  86.     LseDevDevice[] _devices;
  87.     LlIndexMap     _deviceNames;
  88.    
  89.     int[] _deviceIdsUpdateFrame;
  90.     int[] _deviceIdsUpdateFast;
  91.     int[] _deviceIdsUpdateMidi;
  92.     int[] _deviceIdsUpdateSlow;
  93.     int[] _deviceIdsUpdateCabinFrame;
  94.     int[] _deviceIdsUpdateCabinFast;
  95.     int[] _deviceIdsUpdateCabinMidi;
  96.     int[] _deviceIdsUpdateCabinSlow;
  97.    
  98.     LlIndexMap _controlHandlers;
  99.  
  100.     final public void AddDevice(string deviceName, LseDevDevice device)
  101.     {
  102.         int deviceId = _devices.size();
  103.         _devices[deviceId] = device;
  104.  
  105.         if (!LlStr.IsEmpty(deviceName))
  106.             _deviceNames.SetIndex(deviceName, deviceId);
  107.  
  108.         device.Id = deviceId;
  109.  
  110.         device.Init(me);
  111.     }
  112.  
  113.     final public LseDevDevice GetDevice(string deviceName)
  114.     {
  115.         int id = _deviceNames.GetIndex(deviceName);
  116.         if (id >= 0)
  117.             return _devices[id];
  118.         return null;
  119.     }
  120.    
  121.     final public void AddDeviceUpdates(LseDevDevice dev, int flags, bool useCabinUpdates)
  122.     {
  123.         int devId = dev.Id;
  124.         if (useCabinUpdates)
  125.         {
  126.             if (flags & LseDevDevice.UpdateFlagFrame)
  127.                 _deviceIdsUpdateCabinFrame[_deviceIdsUpdateCabinFrame.size()] = devId;
  128.  
  129.             if (flags & LseDevDevice.UpdateFlagFast)
  130.                 _deviceIdsUpdateCabinFast[_deviceIdsUpdateCabinFast.size()] = devId;
  131.  
  132.             if (flags & LseDevDevice.UpdateFlagMidi)
  133.                 _deviceIdsUpdateCabinMidi[_deviceIdsUpdateCabinMidi.size()] = devId;
  134.  
  135.             if (flags & LseDevDevice.UpdateFlagSlow)
  136.                 _deviceIdsUpdateCabinSlow[_deviceIdsUpdateCabinSlow.size()] = devId;
  137.         }
  138.         else
  139.         {
  140.             if (flags & LseDevDevice.UpdateFlagFrame)
  141.                 _deviceIdsUpdateFrame[_deviceIdsUpdateFrame.size()] = devId;
  142.  
  143.             if (flags & LseDevDevice.UpdateFlagFast)
  144.                 _deviceIdsUpdateFast[_deviceIdsUpdateFast.size()] = devId;
  145.  
  146.             if (flags & LseDevDevice.UpdateFlagMidi)
  147.                 _deviceIdsUpdateMidi[_deviceIdsUpdateMidi.size()] = devId;
  148.  
  149.             if (flags & LseDevDevice.UpdateFlagSlow)
  150.                 _deviceIdsUpdateSlow[_deviceIdsUpdateSlow.size()] = devId;
  151.         }
  152.     }
  153.    
  154.     final public void AddDeviceUpdates(LseDevDevice dev, int flags)
  155.     {
  156.         AddDeviceUpdates(dev, flags, false);
  157.     }
  158.  
  159.     public void AddDeviceControlHandler(LseDevCabinDevice device, string controlName)
  160.     {
  161.         _controlHandlers.SetIndex(controlName, device.Id);
  162.     }
  163.    
  164.     int maximumDeviceThreads = 20;
  165.     int _deviceThreads = 0;
  166.  
  167.     public thread void CreateDeviceThread(LseDevDevice src, string threadName)
  168.     {
  169.         if (++_deviceThreads < maximumDeviceThreads)
  170.         {
  171.             src.ThreadEnter(me, threadName);
  172.             --_deviceThreads;
  173.         }
  174.         else
  175.             LlUtil.ThrowException(me,
  176.                                   "DeviceThreadPoolUnderflow",
  177.                                   "Could not create thread '" + threadName +
  178.                                   "' for device id " + src.Id +
  179.                                   " - limit exceeded");
  180.     }
  181.    
  182.     // ****************************************************
  183.     // Cabin handling
  184.     //
  185.    
  186.     int _cabinId = -1;
  187.     bool _cabinInit = false;
  188.     float _lastCabinCheckTime = -1.0;
  189.    
  190.     LseCabin _cabin;
  191.    
  192.     CabinControl[]             _controlList;
  193.     LseCabinControlState[]  _controlStateList;
  194.     LlIndexMap                 _controlNames;
  195.    
  196.     final void InitCabin()
  197.     {
  198.         _cabin.InitSim();
  199.         _cabin.InitSimFinalize();
  200.        
  201.         CabinControl[] cabinControls = _cabin.GetControls();
  202.         _controlList = new CabinControl[_controlStateList.size()];
  203.  
  204.         int i;
  205.         for (i = 0; i < cabinControls.size(); ++i)
  206.         {
  207.             if (!cabinControls[i])
  208.                 continue;
  209.  
  210.             int controlId = GetControlId(cabinControls[i].GetName());
  211.  
  212.             cabinControls[i].SetValue(_controlStateList[controlId].Value);
  213.             _cabin.SetMeshVisible(cabinControls[i].GetName(),
  214.                                  _controlStateList[controlId].Visible,
  215.                                  0.0);
  216.             cabinControls[i].SetLocked(_controlStateList[controlId].Locked);
  217.  
  218.             _controlList[controlId] = cabinControls[i];
  219.  
  220.             ProcessControl(cabinControls[i], _controlStateList[controlId].Value);
  221.         }
  222.        
  223.         _cabinInit = true;
  224.     }
  225.    
  226.     final public bool CheckCabin()
  227.     {
  228.         if (_cabinId < 0)
  229.             return false;
  230.            
  231.         float t = World.GetSeconds();
  232.        
  233.         if (_lastCabinCheckTime == t)
  234.             return true;
  235.         _lastCabinCheckTime = t;
  236.        
  237.         _cabin = cast<LseCabin> Router.GetGameObject(_cabinId);
  238.         if (_cabin)
  239.         {
  240.             if (!_cabinInit)
  241.                 InitCabin();
  242.             return true;
  243.         }
  244.        
  245.         if (_cabin)
  246.         {
  247.             _cabin = null;
  248.             _cabinInit = false;
  249.             _cabinId = -1;
  250.            
  251.             int i;
  252.             for (i = 0; i < _controlList.size(); ++i)
  253.                 _controlList[i] = null;
  254.         }
  255.         return false;
  256.     }
  257.    
  258.     final public LseCabin GetCabin()
  259.     {
  260.         CheckCabin();
  261.         return _cabin;
  262.     }
  263.    
  264.     final public void AttachCabin(LseCabin cabin)
  265.     {
  266.         if (cabin == null or cabin.GetParentObject() != me)
  267.             return;
  268.            
  269.         _cabinId = cabin.GetId();
  270.     }
  271.    
  272.     final public int GetControlId(string controlName)
  273.     {
  274.         int id = _controlNames.GetIndex(controlName);
  275.         if (id < 0)
  276.         {
  277.             id = _controlStateList.size();
  278.             _controlStateList[id] = new LseCabinControlState();
  279.             _controlList[id] = null;
  280.             _controlNames.SetIndex(controlName, id);
  281.         }
  282.         return id;
  283.     }
  284.  
  285.     final public LseCabinControlState GetControlState(int controlId)
  286.     {
  287.         if (_controlList[controlId])
  288.         {
  289.             _controlStateList[controlId].Visible = _controlList[controlId].IsVisible();
  290.             _controlStateList[controlId].Value = _controlList[controlId].GetValue();
  291.             _controlStateList[controlId].Locked = _controlList[controlId].IsLocked();
  292.         }
  293.  
  294.         return _controlStateList[controlId];
  295.     }
  296.  
  297.     final public void SetControlState(int controlId)
  298.     {
  299.         if (!_controlList[controlId])
  300.             return;
  301.  
  302.         _controlList[controlId].SetValue(_controlStateList[controlId].Value);
  303.         _controlList[controlId].SetLocked(_controlStateList[controlId].Locked);
  304.         GetCabin().SetMeshVisible(_controlList[controlId].GetName(),
  305.                                   _controlStateList[controlId].Visible,
  306.                                   _controlStateList[controlId].Fade);
  307.     }
  308.  
  309.     final public void ProcessControl(CabinControl srcControl, float value)
  310.     {
  311.         string srcControlName = srcControl.GetName();
  312.  
  313.         int processingDeviceId = _controlHandlers.GetIndex(srcControlName);
  314.  
  315.         if (processingDeviceId >= 0)
  316.         {
  317.             int controlId = GetControlId(srcControlName);
  318.             LseDevCabinDevice device = cast <LseDevCabinDevice> _devices[processingDeviceId];
  319.             device.ProcessControl(srcControlName,
  320.                                   GetControlState(controlId),
  321.                                   value);
  322.  
  323.             SetControlState(controlId);
  324.  
  325.             /* DEBUG */
  326.             Interface.Print("ProcessControlInput: " + srcControlName + " -> " + processingDeviceId);
  327.             // */
  328.         }
  329.         /* DEBUG */
  330.         else
  331.             Interface.Print("ProcessControlInput: " + srcControlName + " - unhandled");
  332.         // */
  333.     }
  334.    
  335.     // ****************************************************
  336.     // Update handling
  337.     //
  338.  
  339.     void UpdateFrame()
  340.     {
  341.         int i;
  342.         int count = _deviceIdsUpdateFrame.size();
  343.         for (i = 0; i < count; ++i)
  344.             _devices[_deviceIdsUpdateFrame[i]].UpdateFrame();
  345.     }
  346.  
  347.     void UpdateFast()
  348.     {
  349.         int i;
  350.         int count = _deviceIdsUpdateFast.size();
  351.         for (i = 0; i < count; ++i)
  352.             _devices[_deviceIdsUpdateFast[i]].UpdateFast();
  353.     }
  354.  
  355.     void UpdateMidi()
  356.     {
  357.         int i;
  358.         int count = _deviceIdsUpdateMidi.size();
  359.         for (i = 0; i < count; ++i)
  360.             _devices[_deviceIdsUpdateMidi[i]].UpdateMidi();
  361.     }
  362.  
  363.     void UpdateSlow()
  364.     {
  365.         int i;
  366.         int count = _deviceIdsUpdateSlow.size();
  367.         for (i = 0; i < count; ++i)
  368.             _devices[_deviceIdsUpdateSlow[i]].UpdateSlow();
  369.     }
  370.  
  371.     public void UpdateCabinFrame()
  372.     {
  373.         int i;
  374.         int count = _deviceIdsUpdateCabinFrame.size();
  375.         for (i = 0; i < count; ++i)
  376.             _devices[_deviceIdsUpdateCabinFrame[i]].UpdateFrame();
  377.     }
  378.  
  379.     public void UpdateCabinFast()
  380.     {
  381.         int i;
  382.         int count = _deviceIdsUpdateCabinFast.size();
  383.         for (i = 0; i < count; ++i)
  384.             _devices[_deviceIdsUpdateCabinFast[i]].UpdateFast();
  385.     }
  386.  
  387.     public void UpdateCabinMidi()
  388.     {
  389.         int i;
  390.         int count = _deviceIdsUpdateCabinMidi.size();
  391.         for (i = 0; i < count; ++i)
  392.             _devices[_deviceIdsUpdateCabinMidi[i]].UpdateMidi();
  393.     }
  394.  
  395.     public void UpdateCabinSlow()
  396.     {
  397.         int i;
  398.         int count = _deviceIdsUpdateCabinSlow.size();
  399.         for (i = 0; i < count; ++i)
  400.             _devices[_deviceIdsUpdateCabinSlow[i]].UpdateSlow();
  401.     }
  402.  
  403.     float updateFastInterval = 0.1;
  404.     float updateMidiInterval = 0.3;
  405.     float updateSlowInterval = 1.0;
  406.    
  407.     bool _mainThread = false;
  408.     bool _aiSystemsRunning = false;
  409.  
  410.     final thread void _main()
  411.     {
  412.         float lastUpdateTime = World.GetTimeElapsed();
  413.         float lastFastUpdateTime = lastUpdateTime;
  414.         float lastMidiUpdateTime = lastUpdateTime;
  415.         float lastSlowUpdateTime = lastUpdateTime;
  416.        
  417.         Sleep(0.001);
  418.  
  419.         while (_mainThread)
  420.         {
  421.             float time = World.GetTimeElapsed();
  422.             float dt = time - lastUpdateTime;
  423.            
  424.             CheckCabin();
  425.            
  426.             LseUpdate.BeginUpdate(time, dt);
  427.             UpdateFrame();
  428.             lastUpdateTime = time;
  429.  
  430.             while ((dt = time - lastFastUpdateTime) > updateFastInterval)
  431.             {
  432.                 LseUpdate.BeginUpdate(time, dt);
  433.                 UpdateFast();
  434.                 lastFastUpdateTime = lastFastUpdateTime + dt;
  435.             }
  436.  
  437.             while ((dt = time - lastMidiUpdateTime) > updateMidiInterval)
  438.             {
  439.                 LseUpdate.BeginUpdate(time, dt);
  440.                 UpdateMidi();
  441.                 lastMidiUpdateTime = lastMidiUpdateTime + dt;
  442.             }
  443.  
  444.             while ((dt = time - lastSlowUpdateTime) > updateSlowInterval)
  445.             {
  446.                 LseUpdate.BeginUpdate(time, dt);
  447.                 UpdateSlow();
  448.                 lastSlowUpdateTime = lastSlowUpdateTime + dt;
  449.             }
  450.            
  451.             Sleep(0.001);
  452.         }
  453.     }
  454.  
  455.     final public void NotifyTrainChanged(Train prevTrain, Train nextTrain)
  456.     {
  457.         inherited(prevTrain, nextTrain);
  458.     }
  459.  
  460.     void InitSim()
  461.     {
  462.         _devices     = new LseDevDevice[0];
  463.         _deviceNames = new LlIndexMap();
  464.        
  465.         _deviceIdsUpdateFrame      = new int[0];
  466.         _deviceIdsUpdateFast       = new int[0];
  467.         _deviceIdsUpdateMidi       = new int[0];
  468.         _deviceIdsUpdateSlow       = new int[0];
  469.         _deviceIdsUpdateCabinFrame = new int[0];
  470.         _deviceIdsUpdateCabinFast  = new int[0];
  471.         _deviceIdsUpdateCabinMidi  = new int[0];
  472.         _deviceIdsUpdateCabinSlow  = new int[0];
  473.        
  474.         _controlHandlers = new LlIndexMap();
  475.        
  476.         _controlList      = new CabinControl[0];  
  477.         _controlStateList = new LseCabinControlState[0];
  478.         _controlNames     = new LlIndexMap();
  479.    
  480.         PneumaticScheme = new LseStdVehicleGraphScheme();
  481.         PneumaticScheme.Init(me);
  482.  
  483.         SetMaximumTractiveEffort(0.0);
  484.         SetWheelslipTractionMultiplier(1.0);
  485.         SetWheelslipMomentumMultiplier(1.0);
  486.         SetSandingTractionMultiplier(1.0);
  487.         SetTractionMultiplier(1.0);
  488.  
  489.         //SetMaximumCouplerCompressionStress(3300.0);
  490.         //SetMaximumCouplerExpansionStress(3000.0);
  491.         //SetMaximumCoupleVelocity(12.9 * Train.KPH_TO_MPS);
  492.         //SetCouplerBreakageEnabled(true);
  493.     }
  494.    
  495.     void InitSimFinalize()
  496.     {
  497.     }
  498.    
  499.     void RcUserInit()
  500.     {
  501.         inherited();
  502.        
  503.         InitSim();
  504.         InitSimFinalize();
  505.        
  506.         _mainThread = true;
  507.         _main();
  508.        
  509.         Sleep(0.5);
  510.     }
  511.    
  512.     void RcUserTerm()
  513.     {
  514.         inherited();
  515.        
  516.         _mainThread = false;
  517.        
  518.         Sleep(0.5);
  519.     }
  520.    
  521.     void RcAutoInit()
  522.     {
  523.         inherited();
  524.     }
  525.    
  526.     void RcAutoTerm()
  527.     {
  528.         inherited();
  529.     }
  530.  
  531.     final public void Init(Asset asset)
  532.     {
  533.         inherited(asset);
  534.        
  535.         me.LseInit();
  536.  
  537.         LpeLoader.Load();
  538.     }
  539. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement