1 ///
2 module modbus.protocol.slave.model;
3 
4 import modbus.types;
5 import modbus.backend;
6 import modbus.protocol.slave.types;
7 import modbus.protocol.slave.device;
8 
9 ///
10 interface ModbusSlaveModel
11 {
12     ///
13     enum Reaction
14     {
15         none, ///
16         onlyProcessMessage, ///
17         processAndAnswer ///
18     }
19 
20     ///
21     Reaction checkDeviceNumber(ulong dev);
22 
23     ///
24     Response onMessage(ResponseWriter rw, ref const Message msg);
25 }
26 
27 ///
28 class NodeModbusSlaveModel : ModbusSlaveModel
29 {
30     ///
31     ModbusSlaveModel[] models;
32 
33     override
34     {
35         Reaction checkDeviceNumber(ulong devNumber)
36         {
37             foreach (mdl; models)
38             {
39                 const r = mdl.checkDeviceNumber(devNumber);
40                 if (r != Reaction.none) return r;
41             }
42             return Reaction.none;
43         }
44 
45         Response onMessage(ResponseWriter rw, ref const Message msg)
46         {
47             foreach (mdl; models)
48             {
49                 const r = mdl.checkDeviceNumber(msg.dev);
50                 if (r != Reaction.none) return mdl.onMessage(rw, msg);
51             }
52             
53             throwModbusException("model not found");
54             assert(0,"WTF?");
55         }
56     }
57 }
58 
59 ///
60 class MultiCustomDevModbusSlaveModel(T : ModbusSlaveDevice) : ModbusSlaveModel
61 {
62     ///
63     T[] devices;
64 
65     override
66     {
67         Reaction checkDeviceNumber(ulong devNumber)
68         {
69             foreach (dev; devices)
70                 if (dev.number == devNumber)
71                     return Reaction.processAndAnswer;
72             return Reaction.none;
73         }
74 
75         Response onMessage(ResponseWriter rw, ref const Message msg)
76         {
77             foreach (dev; devices)
78                 if (dev.number == msg.dev)
79                     return dev.onMessage(rw, msg);
80             
81             throwModbusException("device not found");
82             assert(0,"WTF?");
83         }
84     }
85 }
86 
87 ///
88 alias MultiDevModbusSlaveModel = MultiCustomDevModbusSlaveModel!ModbusSlaveDevice;