agmike

Simpliest relay ever

Aug 6th, 2014
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.26 KB | None | 0 0
  1. class DRelay isclass LseDevice
  2. {
  3.     LseSchemeElement coil;
  4.     LseSchemeElement[] frontContacts;
  5.     LseSchemeElement[] backContacts;
  6.     LseSound sound;
  7.     LseMesh mesh;
  8.     float onDelay = 0.0f;
  9.     float offDelay = 0.0f;
  10.    
  11.     define int STATE_OFF = 0;
  12.     define int STATE_ON = 1;
  13.     define int STATE_SWITCHING_ON = 2;
  14.     define int STATE_SWITCHING_OFF = 3;
  15.    
  16.     float processTime = 0.0f;
  17.     int state = STATE_OFF;
  18.    
  19.     public void SetProperties(Soup sp)
  20.     {
  21.         coil = SchemeMgr().GetElement(LData.GetString(sp, "coil", ""));
  22.        
  23.         if (LData.TryGetFloat("coil-resistance"))
  24.             coil.SetResistance(LData.LastFloat());
  25.        
  26.         if (LData.TryGetFloat("on-current") {
  27.             float onCurrent = LData.LastFloat();
  28.             if (LData.TryGetFloat("off-current"))
  29.                 coil.SetCurrentHysteresis(onCurrent, LData.LastFloat());
  30.             else
  31.                 coil.SetCurrentThreshold(onCurrent);
  32.         }
  33.        
  34.         LseSchemeElement[] elems;
  35.        
  36.         if (LData.TryGetStringArray(sp, "front"))
  37.             frontContacts = SchemeMgr().GetElements(LData.GetStringArray());
  38.         else {
  39.             elems = SchemeMgr().GetElements();
  40.             int i, count = elems.size();
  41.             frontContacts = new LseSchemeElement[0];
  42.             for (i = 0; i < count; ++i)
  43.                 if (LStr.TryParseInt(elems[i].GetName()) and LStr.ParseInt() % 2 == 1)
  44.                     frontContacts[frontContacts.size()] = elems[i];
  45.         }
  46.        
  47.         if (LData.TryGetStringArray(sp, "back"))
  48.             backContacts = SchemeMgr().GetElements(LData.GetStringArray());
  49.         else {
  50.             if (!elems)
  51.                 elems = SchemeMgr().GetElements();
  52.             int i, count = elems.size();
  53.             backContacts = new LseSchemeElement[0];
  54.             for (i = 0; i < count; ++i)
  55.                 if (LStr.TryParseInt(elems[i].GetName()) and LStr.ParseInt() % 2 == 0)
  56.                     backContacts[backContacts.size()] = elems[i];
  57.         }
  58.        
  59.         if (LData.TryGetFloat("contact-resistance")) {
  60.             float resistance = LData.LastFloat();
  61.             SchemeMgr().SetResistance(frontContacts, resistance);
  62.             SchemeMgr().SetResistance(backContacts, resistance);
  63.         }
  64.        
  65.         if (LData.TryGetFloat("contact-off-resistance")) {
  66.             float resistance = LData.LastFloat();
  67.             SchemeMgr().SetResistance(frontContacts, resistance);
  68.             SchemeMgr().SetResistance(backContacts, resistance);
  69.         }
  70.        
  71.         sound = SoundMgr().GetSound(LData.GetString(sp, "sound", GetName()));
  72.         mesh = MeshMgr().GetMesh(LData.GetString(sp, "mesh", GetName()));
  73.         onDelay = LData.GetFloat(sp, "on-delay", onDelay);
  74.         offDelay = LData.GetFloat(sp, "off-delay", offDelay);
  75.        
  76.         processTime = LData.GetFloat(sp, "process-time", processTime);
  77.         state = LData.GetInt(sp, "state", state);
  78.        
  79.         SchemeMgr().SetConducting(frontContacts, state == STATE_ON);
  80.         SchemeMgr().SetConducting(backContacts, state == STATE_OFF);
  81.     }
  82.    
  83.     public Soup GetProperties()
  84.     {
  85.         Soup sp = Constructors.NewSoup();
  86.         LData.Set(sp, "coil", coil.GetName());
  87.         LData.Set(sp, "front", SchemeMgr().GetNames(frontContacts));
  88.         LData.Set(sp, "back", SchemeMgr().GetNames(backContacts));
  89.         LData.Set(sp, "sound", sound.GetName());
  90.         LData.Set(sp, "mesh", mesh.GetName());
  91.         LData.Set(sp, "on-delay", onDelay);
  92.         LData.Set(sp, "off-delay", offDelay);
  93.         LData.Set(sp, "process-time", processTime);
  94.         LData.Set(sp, "state", state);
  95.         return sp;
  96.     }
  97.    
  98.     public void Update(float dt)
  99.     {
  100.         bool coilPowered = coil.GetCurrentState();
  101.        
  102.         int newState = state;
  103.         while (true) {
  104.             switch (state) {
  105.            
  106.                 case STATE_OFF:
  107.                     if (coilPowered) {
  108.                         mesh.SetAnimationState("on", onDelay);
  109.                         SchemeMgr().SetConducting(backContacts, false);
  110.                         processTime = 0.0f;
  111.                         newState = STATE_SWITCHING_ON;
  112.                         break;
  113.                     }
  114.                     break;
  115.                    
  116.                 case STATE_SWITCHING_ON:
  117.                     if (!coilPowered) {
  118.                         processTime = offDelay * (1.0f - processTime / onDelay);
  119.                         mesh.SetAnimationState("off", offDelay - processTime);
  120.                         newState = STATE_SWITCHING_OFF;
  121.                         break;
  122.                     }
  123.                     if (processTime >= onDelay) {
  124.                         sound.TriggerEvent("on");
  125.                         SchemeMgr().SetConducting(frontContacts, true);
  126.                         newState = STATE_ON;
  127.                         break;
  128.                     }
  129.                     processTime = processTime + dt;
  130.                     break;
  131.                
  132.                
  133.                 case STATE_ON:
  134.                     if (!coilPowered) {
  135.                         mesh.SetAnimationState("off", offDelay);
  136.                         SchemeMgr().SetConducting(frontContacts, false);
  137.                         processTime = 0.0f;
  138.                         newState = STATE_SWITCHING_OFF;
  139.                         break;
  140.                     }
  141.                     break;
  142.                    
  143.                 case STATE_SWITCHING_OFF:
  144.                     if (coilPowered) {
  145.                         processTime = onDelay * (1.0f - processTime / offDelay);
  146.                         mesh.SetAnimationState("off", onDelay - processTime);
  147.                         newState = STATE_SWITCHING_OFF;
  148.                         break;
  149.                     }
  150.                     if (processTime >= offDelay) {
  151.                         sound.TriggerEvent("off");
  152.                         SchemeMgr().SetConducting(backContacts, true);
  153.                         newState = STATE_OFF;
  154.                         break;
  155.                     }
  156.                     processTime = processTime + dt;
  157.                     break;
  158.             }
  159.             if (newState == state)
  160.                 break;
  161.             state = newState;
  162.         }
  163.     }
  164. };
Add Comment
Please, Sign In to add comment