1 ///
2 module modbus.protocol.base;
3 
4 public import std.bitmanip : BitArray;
5 public import std.exception : enforce;
6 public import std.datetime.stopwatch;
7 public import std.conv : to;
8 
9 version (modbus_verbose)
10     public import std.experimental.logger;
11 
12 public import modbus.exception;
13 public import modbus.connection;
14 public import modbus.backend;
15 public import modbus.types;
16 public import modbus.func;
17 
18 ///
19 abstract class Modbus
20 {
21 protected:
22     void[MAX_BUFFER] buffer;
23 
24     Backend be;
25     Connection con;
26 public:
27 
28     ///
29     this(Backend be, Connection con)
30     {
31         if (be is null) throwModbusException("backend is null");
32         if (con is null) throwModbusException("connection is null");
33         this.be = be;
34         this.con = con;
35     }
36 
37     ///
38     Backend backend() @property { return be; }
39     ///
40     Connection connection() @property { return con; }
41 
42     /++ Write to serial port
43 
44         Params:
45             dev = modbus device address (number)
46             fnc = function number
47             args = writed data in native endian
48         Returns:
49             sended message
50      +/
51     const(void)[] write(Args...)(ulong dev, ubyte fnc, Args args)
52     {
53         auto buf = be.buildMessage(buffer, dev, fnc, 0, args);
54         con.write(buf);
55         return buf;
56     }
57 
58     // ditto
59     const(void)[] writeS(Args...)(ulong dev, ubyte fnc, ulong stamp, Args args)
60     {
61         auto buf = be.buildMessage(buffer, dev, fnc, stamp, args);
62         con.write(buf);
63         return buf;
64     }
65 }