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