1 // modbus with back end
2 module modbus.mbwbe;
3 
4 import modbus.protocol;
5 import modbus.iface;
6 
7 version(withSerialPort)
8 {
9     public import std.datetime : Duration, dur, hnsecs, nsecs, msecs, seconds;
10     public import serialport;
11 
12     import modbus.backend.rtu;
13 
14     /// Modbus with RTU backend based on existing serial port
15     class ModbusRTU : Modbus
16     {
17     protected:
18         SerialPort _com;
19 
20         class Iface : SerialPortIface
21         {
22             override:
23             void write(const(void)[] msg)
24             { _com.write(msg, writeTimeout); }
25             void[] read(void[] buffer)
26             { return _com.read(buffer, readTimeout, readFrameGap); }
27         }
28 
29     public:
30 
31         ///
32         Duration writeTimeout = 100.msecs,
33                  readTimeout = 1.seconds,
34                  readFrameGap = 4.msecs;
35 
36         ///
37         this(SerialPort sp)
38         {
39             import std.exception : enforce;
40             _com = enforce(sp, "serial port is null");
41             super(new RTU(new Iface));
42         }
43 
44         @property
45         {
46             ///
47             SerialPort com() { return _com; }
48             ///
49             const(SerialPort) com() const { return _com; }
50         }
51 
52         ~this()
53         {
54             com.destroy();
55         }
56     }
57 }