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