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;