Line data Source code
1 : /*******************************************************************\
2 :
3 : Name: tmfe_example_everything.cxx
4 : Created by: K.Olchanski
5 :
6 : Contents: Example Front end to demonstrate all functions of TMFE class
7 :
8 : \********************************************************************/
9 :
10 : #undef NDEBUG // midas required assert() to be always enabled
11 :
12 : #include <stdio.h>
13 : #include <math.h> // M_PI
14 :
15 : #include "tmfe.h"
16 :
17 : class EqEverything :
18 : public TMFeEquipment
19 : {
20 : public:
21 0 : EqEverything(const char* eqname, const char* eqfilename) // ctor
22 0 : : TMFeEquipment(eqname, eqfilename)
23 : {
24 0 : printf("EqEverything::ctor!\n");
25 :
26 : // configure the equipment here:
27 :
28 : //fEqConfReadConfigFromOdb = false;
29 0 : fEqConfEventID = 1;
30 0 : fEqConfPeriodMilliSec = 1000;
31 0 : fEqConfLogHistory = 1;
32 0 : fEqConfWriteEventsToOdb = true;
33 0 : fEqConfEnablePoll = true; // enable polled equipment
34 : //fEqConfPollSleepSec = 0; // to create a "100% CPU busy" polling loop, set poll sleep time to zero
35 0 : }
36 :
37 0 : ~EqEverything() // dtor
38 0 : {
39 0 : printf("EqEverything::dtor!\n");
40 0 : }
41 :
42 0 : void HandleUsage()
43 : {
44 0 : printf("EqEverything::HandleUsage!\n");
45 0 : }
46 :
47 0 : TMFeResult HandleInit(const std::vector<std::string>& args)
48 : {
49 0 : printf("EqEverything::HandleInit!\n");
50 0 : fMfe->RegisterTransitionStartAbort();
51 0 : fEqConfReadOnlyWhenRunning = false; // overwrite ODB Common RO_RUNNING to false
52 0 : fEqConfWriteEventsToOdb = true; // overwrite ODB Common RO_ODB to true
53 0 : EqSetStatus("Started...", "white");
54 : //EqStartPollThread();
55 0 : return TMFeOk();
56 : }
57 :
58 0 : TMFeResult HandleRpc(const char* cmd, const char* args, std::string& response)
59 : {
60 0 : fMfe->Msg(MINFO, "HandleRpc", "RPC cmd [%s], args [%s]", cmd, args);
61 :
62 : // RPC handler
63 :
64 : char tmp[256];
65 0 : time_t now = time(NULL);
66 0 : snprintf(tmp, sizeof(tmp), "{ \"current_time\" : [ %d, \"%s\"] }", (int)now, ctime(&now));
67 :
68 0 : response = tmp;
69 :
70 0 : return TMFeOk();
71 : }
72 :
73 0 : TMFeResult HandleBeginRun(int run_number)
74 : {
75 0 : fMfe->Msg(MINFO, "HandleBeginRun", "Begin run %d!", run_number);
76 0 : EqSetStatus("Running", "#00FF00");
77 0 : return TMFeOk();
78 : }
79 :
80 0 : TMFeResult HandleEndRun(int run_number)
81 : {
82 0 : fMfe->Msg(MINFO, "HandleEndRun", "End run %d!", run_number);
83 0 : EqSetStatus("Stopped", "#FFFFFF");
84 0 : return TMFeOk();
85 : }
86 :
87 0 : TMFeResult HandlePauseRun(int run_number)
88 : {
89 0 : fMfe->Msg(MINFO, "HandlePauseRun", "Pause run %d!", run_number);
90 0 : EqSetStatus("Paused", "#FFFF00");
91 0 : return TMFeOk();
92 : }
93 :
94 0 : TMFeResult HandleResumeRun(int run_number)
95 : {
96 0 : fMfe->Msg(MINFO, "HandleResumeRun", "Resume run %d!", run_number);
97 0 : EqSetStatus("Running", "#00FF00");
98 0 : return TMFeOk();
99 : }
100 :
101 0 : TMFeResult HandleStartAbortRun(int run_number)
102 : {
103 0 : fMfe->Msg(MINFO, "HandleStartAbortRun", "Begin run %d aborted!", run_number);
104 0 : EqSetStatus("Stopped", "#FFFFFF");
105 0 : return TMFeOk();
106 : }
107 :
108 0 : void SendData(double dvalue)
109 : {
110 : char buf[1024];
111 0 : ComposeEvent(buf, sizeof(buf));
112 0 : BkInit(buf, sizeof(buf));
113 :
114 0 : double* ptr = (double*)BkOpen(buf, "data", TID_DOUBLE);
115 0 : *ptr++ = dvalue;
116 0 : BkClose(buf, ptr);
117 :
118 0 : EqSendEvent(buf);
119 0 : }
120 :
121 0 : void HandlePeriodic()
122 : {
123 0 : printf("EqEverything::HandlePeriodic!\n");
124 0 : double t = TMFE::GetTime();
125 0 : double data = 100.0*sin(0*M_PI/2.0+M_PI*t/40);
126 0 : SendData(data);
127 : char status_buf[256];
128 0 : snprintf(status_buf, sizeof(status_buf), "value %.1f", data);
129 0 : EqSetStatus(status_buf, "#00FF00");
130 0 : }
131 :
132 0 : bool HandlePoll()
133 : {
134 : //printf("EqEverything::HandlePoll!\n");
135 :
136 0 : if (!fMfe->fStateRunning) // only poll when running
137 0 : return false;
138 :
139 0 : double r = drand48();
140 0 : if (r > 0.999) {
141 : // return successful poll rarely
142 0 : printf("EqEverything::HandlePoll!\n");
143 0 : return true;
144 : }
145 :
146 0 : return false;
147 : }
148 :
149 0 : void HandlePollRead()
150 : {
151 0 : printf("EqEverything::HandlePollRead!\n");
152 :
153 : char buf[1024];
154 :
155 0 : ComposeEvent(buf, sizeof(buf));
156 0 : BkInit(buf, sizeof(buf));
157 :
158 0 : uint32_t* ptr = (uint32_t*)BkOpen(buf, "poll", TID_UINT32);
159 0 : for (int i=0; i<16; i++) {
160 0 : *ptr++ = lrand48();
161 : }
162 0 : BkClose(buf, ptr);
163 :
164 0 : EqSendEvent(buf, false); // do not write polled data to ODB and history
165 0 : }
166 : };
167 :
168 : // example frontend
169 :
170 : class FeEverything: public TMFrontend
171 : {
172 : public:
173 0 : FeEverything() // ctor
174 0 : {
175 0 : printf("FeEverything::ctor!\n");
176 0 : FeSetName("tmfe_example_everything");
177 0 : FeAddEquipment(new EqEverything("tmfe_example_everything", __FILE__));
178 0 : }
179 :
180 0 : void HandleUsage()
181 : {
182 0 : printf("FeEverything::HandleUsage!\n");
183 0 : };
184 :
185 0 : TMFeResult HandleArguments(const std::vector<std::string>& args)
186 : {
187 0 : printf("FeEverything::HandleArguments!\n");
188 0 : return TMFeOk();
189 : };
190 :
191 0 : TMFeResult HandleFrontendInit(const std::vector<std::string>& args)
192 : {
193 0 : printf("FeEverything::HandleFrontendInit!\n");
194 0 : return TMFeOk();
195 : };
196 :
197 0 : TMFeResult HandleFrontendReady(const std::vector<std::string>& args)
198 : {
199 0 : printf("FeEverything::HandleFrontendReady!\n");
200 : //FeStartPeriodicThread();
201 : //fMfe->StartRpcThread();
202 0 : return TMFeOk();
203 : };
204 :
205 0 : void HandleFrontendExit()
206 : {
207 0 : printf("FeEverything::HandleFrontendExit!\n");
208 0 : };
209 : };
210 :
211 : // boilerplate main function
212 :
213 0 : int main(int argc, char* argv[])
214 : {
215 0 : FeEverything fe_everything;
216 0 : return fe_everything.FeMain(argc, argv);
217 0 : }
218 :
219 : /* emacs
220 : * Local Variables:
221 : * tab-width: 8
222 : * c-basic-offset: 3
223 : * indent-tabs-mode: nil
224 : * End:
225 : */
|