Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* LSE_FILE_HEADER */
- include "lse.gs"
- final class LseDeviceQuery
- {
- // Usage:
- // In loco/mode script:
- // final LseDeviceQuery Q(string q) { return DevMgr().Query(q); }
- //
- // somewhere in Update:
- // Q("diesel.MR4").Set(Q("MR4.state").AsBool())
- //
- final public string AsString();
- final public int AsInt();
- final public bool AsBool();
- final public float AsFloat();
- final public void Set(string value);
- final public void Set(int value);
- final public void Set(bool value);
- final public void Set(float value);
- // Respond to queries in devices:
- //
- // public void QueryValue(int id, LseDeviceQuery q)
- // {
- // switch (id) {
- // case DRelayClass.State: State = q.Value(State, "rw"); return;
- // case ...
- // default: return;
- // }
- // }
- //
- final public string Value(string value, string rw);
- final public int Value(int value, string rw);
- final public bool Value(bool value, string rw);
- final public float Value(float value, string rw);
- // ****************************************************
- //
- // I M P L E M E N T A T I O N
- //
- // ****************************************************
- LseDevice dev;
- int id;
- define int NoQuery = 0;
- define int ReadQuery = 1;
- define int WriteQuery = 2;
- define int UndefinedType = 0;
- define int IntType = 1;
- define int BoolType = 2;
- define int FloatType = 3;
- define int StringType = 4;
- int query;
- int queryType;
- bool responseStatus;
- string stringValue;
- int intValue;
- bool boolValue;
- float floatValue;
- final void Reset()
- {
- query = NoQuery;
- type = UndefinedType;
- stringValue = null;
- dev = null;
- id = -1;
- }
- // internal
- final public void BeginQuery(LseDevice dev, int id)
- {
- query = NoQuery;
- me.dev = dev;
- me.id = id;
- }
- final bool CheckQueryStatus()
- {
- if (query != NoQuery or !dev) {
- string devName = "<null>";
- if (dev) devName = dev.GetName();
- LUtil.Error("device query: invalid operation",
- LUtil.Dump("deviceName", devName)
- .Dump("queryId", id));
- return false;
- }
- return true;
- }
- final bool PerformRead(int type)
- {
- if (CheckQueryStatus()) {
- query = ReadQuery;
- queryType = type;
- dev.QueryValue(id, me);
- return responseStatus;
- }
- return false;
- }
- final public string AsString()
- {
- string ret = "";
- if (PerformRead(StringType))
- ret = stringValue;
- Reset();
- return ret;
- }
- final public int AsInt()
- {
- int ret = 0;
- if (PerformRead(IntType))
- ret = intValue;
- Reset();
- return ret;
- }
- final public bool AsBool()
- {
- bool ret = false;
- if (PerformRead(BoolType))
- ret = boolValue;
- Reset();
- return ret;
- }
- final public float AsFloat()
- {
- float ret = 0;
- if (PerformRead(FloatType))
- ret = floatValue;
- Reset();
- return ret;
- }
- bool PerformWrite(int type)
- {
- if (CheckQueryStatus()) {
- query = WriteQuery;
- queryType = type;
- dev.QueryValue(id, me);
- return responseStatus;
- }
- return false;
- }
- final public void Set(string value);
- {
- stringValue = value;
- PerformWrite(StringType);
- Reset();
- }
- final public void Set(int value)
- {
- intValue = value;
- PerformWrite(IntType);
- Reset();
- }
- final public void Set(bool value)
- {
- boolValue = value;
- PerformWrite(BoolType);
- Reset();
- }
- final public void Set(float value)
- {
- floatValue = value;
- PerformWrite(FloatType);
- Reset();
- }
- bool CheckQueryResponse(string rw, int type)
- {
- bool permsOk = query == ReadQuery and (rw == "r" or rw == "rw")
- or query == WriteQuery and (rw == "w" or rw == "rw");
- if (!permsOk) {
- string op = "invalid";
- if (query == ReadQuery) op = "read";
- else if (query == WriteQuery) op = "write";
- LUtil.Error("device query: unable to read/write value",
- LUtil.Dump("permissions", rw)
- .Dump("operation", op)
- .Dump("deviceName", dev.GetName())
- .Dump("queryId", id));
- return false;
- }
- if (queryType != type) {
- LUtil.Error("device query: type mismatch",
- LUtil.Dump("queryType", queryType)
- .Dump("responseType", type)
- .Dump("deviceName", dev.GetName())
- .Dump("queryId", id));
- return false;
- }
- return true;
- }
- bool Read() { return query == ReadQuery; }
- final public string Value(string value, string rw)
- {
- responseStatus = CheckQueryResponse(rw, StringType)
- if (responseStatus) {
- if (Read())
- stringValue = value;
- else
- return stringValue;
- }
- return value;
- }
- final public int Value(int value, string rw)
- {
- responseStatus = CheckQueryResponse(rw, IntType)
- if (responseStatus) {
- if (Read())
- intValue = value;
- else
- return intValue;
- }
- return value;
- }
- final public bool Value(bool value, string rw)
- {
- responseStatus = CheckQueryResponse(rw, BoolType)
- if (responseStatus) {
- if (Read())
- boolValue = value;
- else
- return boolValue;
- }
- return value;
- }
- final public float Value(float value, string rw)
- {
- responseStatus = CheckQueryResponse(rw, FloatType)
- if (responseStatus) {
- if (Read())
- floatValue = value;
- else
- return floatValue;
- }
- return value;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement