ngc 1.5.0
 
Loading...
Searching...
No Matches
ngcdcsDTT_COM.hpp
Go to the documentation of this file.
1
8#ifndef ngcdcsDTT_COM_H
9#define ngcdcsDTT_COM_H
10
11
12#ifndef __cplusplus
13#error This is a C++ include file and cannot be used from plain C
14#endif
15
16#include <ngc/core/ngcb.h>
17#include <ngc/core/ngcbSIO.hpp>
19
20
21/*
22 * Simple private tagged DTT protocol
23 */
24#define ngcdcsDTT_NOP 0
25#define ngcdcsDTT_CONFIG 1
26#define ngcdcsDTT_BASENAME 2
27#define ngcdcsDTT_SETUP 3
28#define ngcdcsDTT_START 4
29#define ngcdcsDTT_EXPSTART 5
30#define ngcdcsDTT_EXPSTOP 6
31#define ngcdcsDTT_STOP 7
32#define ngcdcsDTT_CLOSE 8
33
34
41
44
46 int format;
47
49 int naming;
50
52 char expId[64];
53
56
59
62
74
75};
76
82 int type;
83
85 int store;
86
88 int gen;
89
92
94 int sx;
95
97 int sy;
98
100 int nx;
101
103 int ny;
104
106 char name[64];
107
110 type = 0;
111 name[0] = '\0';
112 store = 0;
113 gen = 0;
114 breakCond = 0; // no break condition (take all until exp.-end)
115 sx = 1; // take frame as it is
116 sy = 1; // take frame as it is
117 nx = 0; // take frame as it is
118 ny = 0; // take frame as it is
119 }
120};
121
126{
127public:
129 int xterm;
130
132 char acqHost[64];
133
136
139
142 pid_ = 0;
143 host_[0] = '\0';
144 fdCmd_ = -1;
145 fdEvt_ = -1;
146 xterm = 0;
147 acqHost[0] = '\0';
148 acqPort = 0;
149 enabled = 0;
150 endian_ = ngcbEndian();
151 }
152
154 virtual ~ngcdcsDTT_COM() {
155 Shutdown();
156 }
157
159 int Launch(const char *host) {
160 char cmd[256];
161 char reply[256];
162 char tmp[256];
163 int cmdPort, evtPort;
164
165 if (pid_ > 0)
166 {
167 return (ngcbSUCCESS); // already running
168 }
169 else if (strlen(acqHost) < 1)
170 {
171 strcpy(ErrMsg(), "invalid acquisition process host");
172 return (ngcbFAILURE);
173 }
174 else if (acqPort <= 0)
175 {
176 strcpy(ErrMsg(), "invalid acquisition process data port");
177 return (ngcbFAILURE);
178 }
179
180 sprintf(cmd, "ngcdcsDtt -host %s -port %d", acqHost, acqPort);
181 if (xterm && (verboseLevel > 0))
182 {
183 sprintf(tmp, " -verbose %d", verboseLevel);
184 strcat(cmd, tmp);
185 }
186 if (logLevel > 0)
187 {
188 sprintf(tmp, " -log %d", logLevel);
189 strcat(cmd, tmp);
190 }
191
192 /*
193 * Execute DTT
194 */
195 if (xterm) pid_ = ExecXt(host, cmd, reply);
196 else pid_ = Exec(host, cmd, reply);
197 if (pid_ <= 0)
198 {
199 pid_ = 0;
200 return (ngcbFAILURE);
201 }
202
203 sscanf(reply, "%10d %10d", &cmdPort, &evtPort);
204 sprintf(tmp, "%s,%d", host, cmdPort);
205 fdCmd_ = TcpConnect(tmp);
206 if (fdCmd_ < 0)
207 {
208 strcpy(tmp, ErrMsg());
209 Kill(host, pid_); pid_ = 0;
210 strcpy(ErrMsg(), tmp);
211 return (ngcbFAILURE);
212 }
213 sprintf(tmp, "%s,%d", host, evtPort);
214 fdEvt_ = TcpConnect(tmp);
215 if (fdCmd_ < 0)
216 {
217 strcpy(tmp, ErrMsg());
218 TcpClose(fdCmd_); fdCmd_ = -1; Kill(host, pid_); pid_ = 0;
219 strcpy(ErrMsg(), tmp);
220 return (ngcbFAILURE);
221 }
222
223 strcpy(host_, host);
224 return (ngcbSUCCESS);
225 }
226
228 int Shutdown() {
229 int res = ngcbSUCCESS;
230 if (fdEvt_ >= 0)
231 {
232 TcpClose(fdEvt_); fdEvt_ = -1;
233 }
234 if (fdCmd_ >= 0)
235 {
236 res = SendCmd_(ngcdcsDTT_CLOSE);
237 TcpClose(fdCmd_); fdCmd_ = -1;
238 if (res == ngcbSUCCESS) pid_ = 0;
239 }
240 if (pid_ > 0)
241 {
242 res = Kill(host_, pid_);
243 pid_ = 0;
244 }
245 return (res);
246 }
247
249 int Ping() {
250 return (SendCmd_(ngcdcsDTT_NOP));
251 }
252
254 int BaseName(const char *name) {
255 char tmp[256];
256 strcpy(tmp, name);
257 return (SendCmd_(ngcdcsDTT_BASENAME, tmp, sizeof(tmp)));
258 }
259
261 int Transfer(int flag) {
262 if (flag)
263 {
264 return (SendCmd_(ngcdcsDTT_START));
265 }
266 else
267 {
268 return (SendCmd_(ngcdcsDTT_STOP));
269 }
270 }
271
273 int StartExp() {
274 return (SendCmd_(ngcdcsDTT_EXPSTART));
275 }
276
278 int StopExp() {
279 return (SendCmd_(ngcdcsDTT_EXPSTOP));
280 }
281
283 int Setup(ngcdcs_dtt_exp_t expSetup, ngcdcs_dtt_frame_t *frameSetup,
284 ngcbFITS *fits) {
285 int xsize;
286 int intVal;
289
290 if (SendTag_(ngcdcsDTT_SETUP) != ngcbSUCCESS)
291 {
292 return (ngcbFAILURE);
293 }
294
295 xsize = (int)sizeof(ngcdcs_dtt_exp_t);
296 if (endian_ == ngcbBIG_ENDIAN)
297 {
298 ngcbSwap4(&expSetup, 7);
299 ngcbSwap8(&expSetup.integrationTime, 1);
300 }
301 if (TcpWrite(fdCmd_, &expSetup, xsize) != ngcbSUCCESS)
302 {
303 TcpClose(fdCmd_); fdCmd_ = -1;
304 return (ngcbFAILURE);
305 }
306
307 xsize = ngcdcsMAX_FRAME_TYPES * (int)sizeof(ngcdcs_dtt_frame_t);
308 fs = frameSetup;
309 if (endian_ == ngcbBIG_ENDIAN)
310 {
311 int i;
312 memcpy(fs1, fs, xsize);
313 for (i=0;i<ngcdcsMAX_FRAME_TYPES;i++)
314 {
315 if (endian_ == ngcbBIG_ENDIAN) ngcbSwap4(&fs1[i], 8);
316 }
317 fs = fs1;
318 }
319 if (TcpWrite(fdCmd_, fs, xsize) != ngcbSUCCESS)
320 {
321 TcpClose(fdCmd_); fdCmd_ = -1;
322 return (ngcbFAILURE);
323 }
324
325 xsize = fits->HeaderSize();
326 intVal = xsize;
327 if (endian_ == ngcbBIG_ENDIAN) ngcbSwap4(&intVal, 1);
328 if (TcpWrite(fdCmd_, &intVal, sizeof(int)) != ngcbSUCCESS)
329 {
330 TcpClose(fdCmd_); fdCmd_ = -1;
331 return (ngcbFAILURE);
332 }
333 if (TcpWrite(fdCmd_, fits->Header(), xsize) != ngcbSUCCESS)
334 {
335 TcpClose(fdCmd_); fdCmd_ = -1;
336 return (ngcbFAILURE);
337 }
338
339 return (RecvReply_());
340 }
341
342protected:
343
344private:
346 char host_[64];
347
349 int pid_;
350
352 int fdCmd_;
353
355 int fdEvt_;
356
358 int endian_;
359
361 int SendTag_(int cmd) {
362 int tag = cmd;
363
364 if (fdCmd_ < 0)
365 {
366 sprintf(ErrMsg(), "connection closed");
367 return (ngcbFAILURE);
368 }
369
370 if (endian_ == ngcbBIG_ENDIAN) ngcbSwap4(&tag, 1);
371
372 if (TcpWrite(fdCmd_, &tag, sizeof(int)) != ngcbSUCCESS)
373 {
374 TcpClose(fdCmd_); fdCmd_ = -1;
375 return (ngcbFAILURE);
376 }
377
378 return (ngcbSUCCESS);
379 }
380
382 int RecvReply_() {
383 int result;
384
385 if (TcpRead(fdCmd_, &result, sizeof(int)) != ngcbSUCCESS)
386 {
387 TcpClose(fdCmd_); fdCmd_ = -1;
388 return (ngcbFAILURE);
389 }
390
391 if (endian_ == ngcbBIG_ENDIAN) ngcbSwap4(&result, 1);
392
393 if (result != ngcbSUCCESS)
394 {
395 char tmp[256];
396 if (TcpRead(fdCmd_, tmp, 256) != ngcbSUCCESS)
397 {
398 TcpClose(fdCmd_); fdCmd_ = -1;
399 return (ngcbFAILURE);
400 }
401 strcpy(ErrMsg(), tmp);
402 return (ngcbFAILURE);
403 }
404
405 return (ngcbSUCCESS);
406 }
407
409 int SendCmd_(int cmd, const char *p, int size) {
410 if (SendTag_(cmd) != ngcbSUCCESS)
411 {
412 return (ngcbFAILURE);
413 }
414
415 if ((p != NULL) && (size > 0))
416 {
417 if (TcpWrite(fdCmd_, p, size) != ngcbSUCCESS)
418 {
419 TcpClose(fdCmd_); fdCmd_ = -1;
420 return (ngcbFAILURE);
421 }
422 }
423
424 return (RecvReply_());
425 }
426
427 // Send command
428 int SendCmd_(int cmd) {return (SendCmd_(cmd, NULL, 0));}
429
430};
431
432#endif
Definition ngcbFITS.hpp:25
int HeaderSize()
Current header size.
Definition ngcbFITS.hpp:49
char * Header()
Current header.
Definition ngcbFITS.hpp:46
int ExecXt(const char *host, const char *cmd, char *reply, const char *geom=NULL)
Execute process on host (in new terminal)
Definition ngcbSIO.cpp:553
int Kill(const char *host, int pid)
Terminate process on host.
Definition ngcbSIO.cpp:577
ngcbSIO()
Constructor.
Definition ngcbSIO.cpp:31
int TcpConnect(const char *service)
Connect to a tcp/ip socket service.
Definition ngcbSIO.cpp:293
int Exec(const char *host, const char *cmd, char *reply, int port=0)
Execute process on host.
Definition ngcbSIO.cpp:530
int TcpWrite(int fd, const void *buffer, size_t size)
Write buffer to tcp/ip socket.
Definition ngcbSIO.cpp:371
int TcpRead(int fd, void *buffer, size_t size)
Read buffer from tcp/ip socket.
Definition ngcbSIO.cpp:356
char * ErrMsg()
Error message.
Definition ngcbSIO.hpp:104
int TcpClose(int fd)
Close tcp/ip socket.
Definition ngcbSIO.cpp:318
int logLevel
Loggin level.
Definition ngcbSIO.hpp:98
int verboseLevel
Verbose level.
Definition ngcbSIO.hpp:95
int Ping()
Ping DTT.
Definition ngcdcsDTT_COM.hpp:249
char acqHost[64]
Acquisition process host.
Definition ngcdcsDTT_COM.hpp:132
virtual ~ngcdcsDTT_COM()
Destructor.
Definition ngcdcsDTT_COM.hpp:154
int acqPort
Acquisition process data port.
Definition ngcdcsDTT_COM.hpp:135
int StopExp()
Abort exposure.
Definition ngcdcsDTT_COM.hpp:278
int Transfer(int flag)
Enable/disable transfer.
Definition ngcdcsDTT_COM.hpp:261
ngcdcsDTT_COM()
Constructor.
Definition ngcdcsDTT_COM.hpp:141
int xterm
Launch DTT in new terminal.
Definition ngcdcsDTT_COM.hpp:129
int StartExp()
Start exposure.
Definition ngcdcsDTT_COM.hpp:273
int Setup(ngcdcs_dtt_exp_t expSetup, ngcdcs_dtt_frame_t *frameSetup, ngcbFITS *fits)
Setup exposure.
Definition ngcdcsDTT_COM.hpp:283
int Shutdown()
Shutdown DTT.
Definition ngcdcsDTT_COM.hpp:228
int BaseName(const char *name)
Set exposure basename.
Definition ngcdcsDTT_COM.hpp:254
int Launch(const char *host)
Launch DTT.
Definition ngcdcsDTT_COM.hpp:159
int enabled
Enabled flag.
Definition ngcdcsDTT_COM.hpp:138
void ngcbSwap8(void *buffer, size_t length)
Definition ngcbMath.c:49
#define ngcbBIG_ENDIAN
Definition ngcb.h:404
void ngcbSwap4(void *buffer, size_t length)
Definition ngcbMath.c:38
#define ngcbSUCCESS
Definition ngcb.h:138
int ngcbEndian(void)
Definition ngcbMath.c:19
#define ngcbFAILURE
Definition ngcb.h:140
#define ngcdcsDTT_STOP
Definition ngcdcsDTT_COM.hpp:31
#define ngcdcsDTT_CLOSE
Definition ngcdcsDTT_COM.hpp:32
#define ngcdcsDTT_BASENAME
Definition ngcdcsDTT_COM.hpp:26
#define ngcdcsDTT_SETUP
Definition ngcdcsDTT_COM.hpp:27
#define ngcdcsDTT_EXPSTOP
Definition ngcdcsDTT_COM.hpp:30
#define ngcdcsDTT_START
Definition ngcdcsDTT_COM.hpp:28
#define ngcdcsDTT_EXPSTART
Definition ngcdcsDTT_COM.hpp:29
#define ngcdcsDTT_NOP
Definition ngcdcsDTT_COM.hpp:24
#define ngcdcsEXP_NAMING_REQUEST
Definition ngcdcsEXP.hpp:80
#define ngcdcsEXP_FORMAT_SINGLE
Definition ngcdcsEXP.hpp:69
#define ngcdcsMAX_FRAME_TYPES
Definition ngcdcsFINFO.hpp:25
Definition ngcdcsDTT_COM.hpp:38
int format
Data file format.
Definition ngcdcsDTT_COM.hpp:46
ngcdcs_dtt_exp_t()
Constructor.
Definition ngcdcsDTT_COM.hpp:64
int sequenceNumber
Sequence number.
Definition ngcdcsDTT_COM.hpp:43
int naming
Naming scheme.
Definition ngcdcsDTT_COM.hpp:49
int extFits
Flag for extended FITS header.
Definition ngcdcsDTT_COM.hpp:40
double integrationTime
Integration time (for FITS header EXPTIME)
Definition ngcdcsDTT_COM.hpp:61
int setupId
Setup-id.
Definition ngcdcsDTT_COM.hpp:55
int numFitsBlock
Number of FITS-blocks to reserve.
Definition ngcdcsDTT_COM.hpp:58
char expId[64]
Exposure-id.
Definition ngcdcsDTT_COM.hpp:52
Definition ngcdcsDTT_COM.hpp:80
int ny
Window for this frame (size in y direction)
Definition ngcdcsDTT_COM.hpp:103
int sx
Window for this frame (lower left x)
Definition ngcdcsDTT_COM.hpp:94
int type
Frame type.
Definition ngcdcsDTT_COM.hpp:82
char name[64]
Frame type name.
Definition ngcdcsDTT_COM.hpp:106
int sy
Window for this frame (lower left y)
Definition ngcdcsDTT_COM.hpp:97
int gen
Frame is generated.
Definition ngcdcsDTT_COM.hpp:88
int breakCond
Break condition for exposure.
Definition ngcdcsDTT_COM.hpp:91
int nx
Window for this frame (size in x-direction)
Definition ngcdcsDTT_COM.hpp:100
ngcdcs_dtt_frame_t()
Constructor.
Definition ngcdcsDTT_COM.hpp:109
int store
Frame is stored.
Definition ngcdcsDTT_COM.hpp:85