Advertisement
agmike

LseDeviceQuery

Aug 10th, 2014
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.53 KB | None | 0 0
  1. /* LSE_FILE_HEADER */
  2.  
  3. include "lse.gs"
  4.  
  5.  
  6. final class LseDeviceQuery
  7. {
  8.     // Usage:
  9.     // In loco/mode script:
  10.     // final LseDeviceQuery Q(string q) { return DevMgr().Query(q); }
  11.     //
  12.     // somewhere in Update:
  13.     // Q("diesel.MR4").Set(Q("MR4.state").AsBool())
  14.     //
  15.  
  16.     final public string AsString();
  17.     final public int    AsInt();
  18.     final public bool   AsBool();
  19.     final public float  AsFloat();
  20.  
  21.     final public void Set(string value);
  22.     final public void Set(int    value);
  23.     final public void Set(bool   value);
  24.     final public void Set(float  value);
  25.  
  26.  
  27.     // Respond to queries in devices:
  28.     //
  29.     // public void QueryValue(int id, LseDeviceQuery q)
  30.     // {
  31.     //     switch (id) {
  32.     //         case DRelayClass.State: State = q.Value(State, "rw"); return;
  33.     //         case ...
  34.     //         default: return;
  35.     //     }
  36.     // }
  37.     //
  38.     final public string Value(string value, string rw);
  39.     final public int    Value(int    value, string rw);
  40.     final public bool   Value(bool   value, string rw);
  41.     final public float  Value(float  value, string rw);
  42.    
  43.    
  44.     // ****************************************************
  45.     //
  46.     //    I M P L E M E N T A T I O N
  47.     //
  48.     // ****************************************************
  49.  
  50.     LseDevice dev;
  51.     int id;
  52.  
  53.     define int NoQuery = 0;
  54.     define int ReadQuery = 1;
  55.     define int WriteQuery = 2;
  56.  
  57.     define int UndefinedType = 0;
  58.     define int IntType = 1;
  59.     define int BoolType = 2;
  60.     define int FloatType = 3;
  61.     define int StringType = 4;
  62.  
  63.     int query;
  64.     int queryType;
  65.     bool responseStatus;
  66.  
  67.     string stringValue;
  68.     int intValue;
  69.     bool boolValue;
  70.     float floatValue;
  71.  
  72.     final void Reset()
  73.     {
  74.         query = NoQuery;
  75.         type = UndefinedType;
  76.         stringValue = null;
  77.         dev = null;
  78.         id = -1;
  79.     }
  80.  
  81.     // internal
  82.     final public void BeginQuery(LseDevice dev, int id)
  83.     {
  84.         query = NoQuery;
  85.         me.dev = dev;
  86.         me.id = id;
  87.     }
  88.  
  89.     final bool CheckQueryStatus()
  90.     {
  91.         if (query != NoQuery or !dev) {
  92.             string devName = "<null>";
  93.             if (dev) devName = dev.GetName();
  94.             LUtil.Error("device query: invalid operation",
  95.                         LUtil.Dump("deviceName", devName)
  96.                              .Dump("queryId", id));
  97.             return false;
  98.         }
  99.         return true;
  100.     }
  101.  
  102.     final bool PerformRead(int type)
  103.     {
  104.         if (CheckQueryStatus()) {
  105.             query = ReadQuery;
  106.             queryType = type;
  107.             dev.QueryValue(id, me);
  108.             return responseStatus;
  109.         }
  110.         return false;
  111.     }
  112.  
  113.     final public string AsString()
  114.     {
  115.         string ret = "";
  116.         if (PerformRead(StringType))
  117.             ret = stringValue;
  118.         Reset();
  119.         return ret;
  120.     }
  121.  
  122.     final public int AsInt()
  123.     {
  124.         int ret = 0;
  125.         if (PerformRead(IntType))
  126.             ret = intValue;
  127.         Reset();
  128.         return ret;
  129.     }
  130.  
  131.     final public bool AsBool()
  132.     {
  133.         bool ret = false;
  134.         if (PerformRead(BoolType))
  135.             ret = boolValue;
  136.         Reset();
  137.         return ret;
  138.     }
  139.  
  140.     final public float AsFloat()
  141.     {
  142.         float ret = 0;
  143.         if (PerformRead(FloatType))
  144.             ret = floatValue;
  145.         Reset();
  146.         return ret;
  147.     }
  148.  
  149.     bool PerformWrite(int type)
  150.     {
  151.         if (CheckQueryStatus()) {
  152.             query = WriteQuery;
  153.             queryType = type;
  154.             dev.QueryValue(id, me);
  155.             return responseStatus;
  156.         }
  157.         return false;
  158.     }
  159.  
  160.     final public void Set(string value);
  161.     {
  162.         stringValue = value;
  163.         PerformWrite(StringType);
  164.         Reset();
  165.     }
  166.  
  167.     final public void Set(int value)
  168.     {
  169.         intValue = value;
  170.         PerformWrite(IntType);
  171.         Reset();
  172.     }
  173.  
  174.     final public void Set(bool value)
  175.     {
  176.         boolValue = value;
  177.         PerformWrite(BoolType);
  178.         Reset();
  179.     }
  180.  
  181.     final public void Set(float value)
  182.     {
  183.         floatValue = value;
  184.         PerformWrite(FloatType);
  185.         Reset();
  186.     }
  187.  
  188.     bool CheckQueryResponse(string rw, int type)
  189.     {
  190.         bool permsOk = query == ReadQuery  and (rw == "r" or rw == "rw")
  191.                     or query == WriteQuery and (rw == "w" or rw == "rw");
  192.         if (!permsOk) {
  193.             string op = "invalid";
  194.             if (query == ReadQuery) op = "read";
  195.             else if (query == WriteQuery) op = "write";
  196.             LUtil.Error("device query: unable to read/write value",
  197.                         LUtil.Dump("permissions", rw)
  198.                              .Dump("operation", op)
  199.                              .Dump("deviceName", dev.GetName())
  200.                              .Dump("queryId", id));
  201.             return false;
  202.         }
  203.  
  204.         if (queryType != type) {
  205.             LUtil.Error("device query: type mismatch",
  206.                         LUtil.Dump("queryType", queryType)
  207.                              .Dump("responseType", type)
  208.                              .Dump("deviceName", dev.GetName())
  209.                              .Dump("queryId", id));
  210.             return false;
  211.         }
  212.         return true;
  213.     }
  214.  
  215.     bool Read() { return query == ReadQuery; }
  216.  
  217.     final public string Value(string value, string rw)
  218.     {
  219.         responseStatus = CheckQueryResponse(rw, StringType)
  220.         if (responseStatus) {
  221.             if (Read())
  222.                 stringValue = value;
  223.             else
  224.                 return stringValue;
  225.         }
  226.         return value;
  227.     }
  228.  
  229.     final public int Value(int value, string rw)
  230.     {
  231.         responseStatus = CheckQueryResponse(rw, IntType)
  232.         if (responseStatus) {
  233.             if (Read())
  234.                 intValue = value;
  235.             else
  236.                 return intValue;
  237.         }
  238.         return value;
  239.     }
  240.  
  241.     final public bool Value(bool value, string rw)
  242.     {
  243.         responseStatus = CheckQueryResponse(rw, BoolType)
  244.         if (responseStatus) {
  245.             if (Read())
  246.                 boolValue = value;
  247.             else
  248.                 return boolValue;
  249.         }
  250.         return value;
  251.     }
  252.  
  253.     final public float Value(float value, string rw)
  254.     {
  255.         responseStatus = CheckQueryResponse(rw, FloatType)
  256.         if (responseStatus) {
  257.             if (Read())
  258.                 floatValue = value;
  259.             else
  260.                 return floatValue;
  261.         }
  262.         return value;
  263.     }
  264. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement