Line data Source code
1 : /********************************************************************\
2 :
3 : Name: mdev_mscb.h
4 : Created by: Stefan Ritt
5 :
6 : Contents: MIDAS device drivers class for MSCB devices
7 :
8 : \********************************************************************/
9 :
10 : #ifndef MDEV_MSCB_H
11 : #define MDEV_MSCB_H
12 :
13 : #include "mscbxx.h"
14 : #include "mdev.h"
15 :
16 : struct mscb_var {
17 : std::string var;
18 : std::string name;
19 : int index;
20 : bool output;
21 : std::function<bool(mscb_var, float)> confirm;
22 : std::function<float(float)> convert;
23 : std::string unit;
24 : std::string format;
25 :
26 : mscb_var(std::string &v, std::string &n, int i, bool o, std::string u, std::string fo)
27 : : var(v), name(n), index(i), output(o), confirm(nullptr), convert(nullptr), unit(u), format(fo) {};
28 : mscb_var(std::string &n, int i, bool o, std::string u, std::string fo)
29 : : var(""), name(n), index(i), output(o), confirm(nullptr), convert(nullptr), unit(u), format(fo) {};
30 : mscb_var(std::string &v, std::string &n, int i, bool o, std::function<bool(mscb_var, float)> f, std::string u, std::string fo)
31 : : var(v), name(n), index(i), output(o), confirm(f), convert(nullptr), unit(u), format(fo) {};
32 : mscb_var(std::string &n, int i, bool o, std::function<bool(mscb_var, float)> f, std::string u, std::string fo)
33 : : var(""), name(n), index(i), output(o), confirm(f), convert(nullptr), unit(u), format(fo) {};
34 : mscb_var(std::string &v, std::string &n, int i, bool o, std::function<float(float)> f, std::string u, std::string fo)
35 : : var(v), name(n), index(i), output(o), confirm(nullptr), convert(f), unit(u), format(fo) {};
36 : mscb_var(std::string &n, int i, bool o, std::function<float(float)> f, std::string u, std::string fo)
37 : : var(""), name(n), index(i), output(o), confirm(nullptr), convert(f), unit(u), format(fo) {};
38 :
39 : };
40 :
41 : class mscb_node {
42 : public:
43 : std::string m_device;
44 : std::string m_pwd;
45 : int m_address;
46 : bool m_enabled;
47 : midas::mscb* m_mscb;
48 : bool m_group_flag;
49 :
50 : std::vector<mscb_var> m_mscb_var;
51 : std::vector<bool> m_group;
52 :
53 : public:
54 : mscb_node(std::string d, int a, std::string pwd = "", bool e=true) :
55 : m_device(d), m_pwd(pwd), m_address(a), m_enabled(e), m_group_flag(false) {};
56 :
57 : void add_group(void) {
58 : m_group.push_back(m_group_flag);
59 : m_group_flag = false;
60 : }
61 :
62 : void add_input(std::string var, std::string name, std::string unit = "", std::string format = "") {
63 : m_mscb_var.emplace_back(var, name, 0, false, unit, format);
64 : add_group();
65 : }
66 :
67 : void add_input(int index, std::string name, std::string unit = "", std::string format = "") {
68 : m_mscb_var.emplace_back(name, index, false, unit, format);
69 : add_group();
70 : }
71 :
72 : void add_input(std::string var, std::string name, std::function<float(float)> f, std::string unit = "", std::string format = "") {
73 : m_mscb_var.emplace_back(var, name, 0, false, f, unit, format);
74 : add_group();
75 : }
76 :
77 : void add_input(int index, std::string name, std::function<float(float)> f, std::string unit = "", std::string format = "") {
78 : m_mscb_var.emplace_back(name, index, false, f, unit, format);
79 : add_group();
80 : }
81 :
82 : void add_output(std::string var, std::string name, std::string unit = "", std::string format = "") {
83 : m_mscb_var.emplace_back(var, name, 0, true, unit, format);
84 : add_group();
85 : }
86 :
87 : void add_output(int index, std::string name, std::string unit = "", std::string format = "") {
88 : m_mscb_var.emplace_back(name, index, true, unit, format);
89 : add_group();
90 : }
91 :
92 : void add_output(std::string var, std::string name, std::function<bool(mscb_var, float)> f, std::string unit = "", std::string format = "") {
93 : m_mscb_var.emplace_back(var, name, 0, true, f, unit, format);
94 : add_group();
95 : }
96 :
97 : void add_output(int index, std::string name, std::function<bool(mscb_var, float)> f, std::string unit = "", std::string format = "") {
98 : m_mscb_var.emplace_back(name, index, true, f, unit, format);
99 : add_group();
100 : }
101 :
102 : void start_new_group() { m_group_flag = true; }
103 :
104 : std::vector<bool> get_group() { return m_group; };
105 : };
106 :
107 : class mdev_mscb : public mdev {
108 :
109 : private:
110 : midas::odb m_settings;
111 : midas::odb m_variables;
112 : midas::odb m_common;
113 : int m_n_variables;
114 :
115 : std::vector<mscb_node> m_node;
116 : std::vector<float> m_mirror;
117 : std::vector<bool> m_group;
118 :
119 : public:
120 : mdev_mscb(std::string equipment_name) :
121 : mdev(equipment_name) {};
122 :
123 0 : ~mdev_mscb(void) {};
124 :
125 : void add_node(mscb_node n) {
126 : m_node.push_back(n);
127 :
128 : for (auto g : n.get_group())
129 : m_group.push_back(g);
130 : }
131 :
132 : midas::mscb *get_mscb_node(int i) { return m_node[i].m_mscb; }
133 :
134 : void get_all(int i);
135 :
136 : void odb_setup(void) override;
137 : void init(void) override;
138 : void exit(void) override;
139 : void loop(void) override;
140 : int read_event(char *pevent, int off) override;
141 : };
142 :
143 : #endif // MDEV_MPDC_H
|