1 module puppeteer.configuration.iconfiguration;
2 
3 import std.stdio;
4 import std.exception;
5 
6 public shared interface IConfiguration(VarMonitorTypes...)
7 {
8     void setAIValueAdapterExpression(ubyte pin, string adapterExpression);
9     string getAIValueAdapterExpression(ubyte pin);
10     float adaptAIValue(ubyte pin, float value);
11 
12     void setPWMOutAvgAdapterExpression(ubyte pin, string adapterExpression);
13     string getPWMOutAvgAdapterExpression(ubyte pin);
14     float adaptPWMOutAvgValue(ubyte pin, float value);
15 
16     void setAISensorName(ubyte pin, string name);
17     string getAISensorName(ubyte pin) const;
18 
19     string save() const
20         out(s){assert(s !is null);}
21     void save(File sinkFile, bool flush = true) const;
22     void load(string configString)
23         in{assert(configString !is null);}
24     void load(File configFile);
25 
26 
27     //pragma(msg, unrollHelperMethodDeclarations!VarMonitorTypes);
28     mixin(unrollHelperMethodDeclarations!VarMonitorTypes);
29 
30 
31     final void setVarMonitorValueAdapterExpression(VarType)(ubyte varIndex, string adapterExpression)
32     {
33         mixin(generateHelperMethodName!VarType("setVarMonitorValueAdapterExpression"))(varIndex, adapterExpression);
34     }
35 
36     final string getVarMonitorValueAdapterExpression(VarType)(ubyte varIndex) const
37     {
38         return mixin(generateHelperMethodName!VarType("getVarMonitorValueAdapterExpression"))(varIndex);
39     }
40 
41     final VarType adaptVarMonitorValue(VarType)(ubyte varIndex, VarType value) const
42     {
43         return mixin(generateHelperMethodName!VarType("adaptVarMonitorValue"))(varIndex, value);
44     }
45 
46     final void setVarMonitorSensorName(VarType)(ubyte varIndex, string name)
47     {
48         mixin(generateHelperMethodName!VarType("setVarMonitorSensorName"))(varIndex, name);
49     }
50 
51     final string getVarMonitorSensorName(VarType)(ubyte varIndex) const
52     {
53         return mixin(generateHelperMethodName!VarType("getVarMonitorSensorName"))(varIndex);
54     }
55 }
56 
57 private pure string generateHelperMethodName(VarType)(string methodName)
58 {
59     return methodName ~ "_" ~ VarType.stringof;
60 }
61 
62 private pure string generateHelperMethodSignature(VarType)(string returnType, string methodName, string arguments, string attributes = "")
63 {
64     return returnType ~ " " ~ generateHelperMethodName!VarType(methodName) ~ arguments ~ " " ~ attributes;
65 }
66 
67 private pure string unrollHelperMethodDeclarations(VarMonitorTypes...)()
68 {
69     string unroll = "";
70 
71     foreach(T; VarMonitorTypes)
72     {
73         unroll ~= generateHelperMethodSignature!T("void",
74                     "setVarMonitorValueAdapterExpression",
75                     "(ubyte varIndex, string adapterExpression)") ~ ";\n";
76         unroll ~= generateHelperMethodSignature!T("string",
77                     "getVarMonitorValueAdapterExpression",
78                     "(ubyte varIndex)", "const") ~ ";\n";
79         unroll ~= generateHelperMethodSignature!T(T.stringof,
80                     "adaptVarMonitorValue",
81                     "(ubyte varIndex, " ~ T.stringof ~ " value)",
82                      "const") ~ ";\n";
83         unroll ~= generateHelperMethodSignature!T("void",
84                     "setVarMonitorSensorName",
85                     "(ubyte varIndex, string name)") ~ ";\n";
86         unroll ~= generateHelperMethodSignature!T("string",
87                     "getVarMonitorSensorName",
88                     "(ubyte varIndex)",
89                     "const") ~ ";\n";
90     }
91 
92     return unroll;
93 }
94 
95 public pure string unrollHelperMethods(VarMonitorTypes...)()
96 {
97     string unroll = "";
98 
99     foreach(T; VarMonitorTypes)
100     {
101         unroll ~= generateHelperMethodSignature!T("void",
102                     "setVarMonitorValueAdapterExpression",
103                     "(ubyte varIndex, string adapterExpression)") ~
104                     "{setVarMonitorValueAdapterExpression!" ~ T.stringof ~
105                     "(varIndex, adapterExpression);}\n";
106         unroll ~= generateHelperMethodSignature!T("string",
107                     "getVarMonitorValueAdapterExpression",
108                     "(ubyte varIndex)", "const") ~
109                     "{return getVarMonitorValueAdapterExpression!" ~ T.stringof ~
110                     "(varIndex);}\n";
111         unroll ~= generateHelperMethodSignature!T(T.stringof,
112                     "adaptVarMonitorValue",
113                     "(ubyte varIndex, " ~ T.stringof ~ " value)", "const") ~
114                     "{return adaptVarMonitorValue!" ~ T.stringof ~
115                     "(varIndex, value);}\n";
116         unroll ~= generateHelperMethodSignature!T("void",
117                     "setVarMonitorSensorName",
118                     "(ubyte varIndex, string name)") ~
119                     "{setVarMonitorSensorName!" ~ T.stringof ~
120                     "(varIndex, name);}\n";
121         unroll ~= generateHelperMethodSignature!T("string",
122                     "getVarMonitorSensorName",
123                     "(ubyte varIndex)", "const") ~
124                     "{return getVarMonitorSensorName!" ~ T.stringof ~
125                     "(varIndex);}\n";
126     }
127 
128     return unroll;
129 }