My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
Scanner.h
1 #ifndef GCP_MEDIATOR_SCANNER_H
2 #define GCP_MEDIATOR_SCANNER_H
3 
11 #include "gcp/util/specific/Directives.h"
12 
13 #include "gcp/util/common/AntennaDataFrameManager.h"
14 #include "gcp/util/common/AntennaFrameBuffer.h"
15 #include "gcp/util/common/ArrayFrameBuffer.h"
16 #include "gcp/util/common/DataFrameManager.h"
17 #include "gcp/util/common/GenericTask.h"
18 #include "gcp/util/common/NetStr.h"
19 #include "gcp/util/common/TcpClient.h"
20 
21 #include "gcp/util/specific/Directives.h"
22 
23 #include "gcp/mediator/specific/ScannerMsg.h"
24 
25 // Don't move this around: GCC3.2.2 is easily confused!
26 
27 #include "gcp/control/code/unix/libunix_src/common/scanner.h"
28 
29 namespace gcp {
30 
31  namespace util {
32  class ArrayDataFrameManager;
33  class BoardDataFrameManager;
34  }
35 
36 #if DIR_HAVE_MUX
37 
38  namespace receiver {
39  class DioConsumer;
40  class XMLConsumer;
41  }
42 
43 #endif
44 
45  namespace mediator {
46 
51  class Master;
52  class XMLConsumer;
53  class AntennaConsumer;
54 
58  class Scanner :
59  public gcp::util::GenericTask<ScannerMsg> {
60 
61  public:
62 
63  //------------------------------------------------------------
64  // Scanner public members
65  //------------------------------------------------------------
66 
70  ~Scanner();
71 
80 
81 #if DIR_HAVE_MUX
82 
88  void packBolometerFrame();
89 #endif
90 
99  std::string regMapName);
100 
105 
110  void packBoardSynch(gcp::util::BoardDataFrameManager* dataFrame, unsigned int id);
111 
117 
122  std::string dioHost();
123  std::string hwHost();
124  unsigned dioPort();
125  unsigned hwPort();
126 
127  //------------------------------------------------------------
128  // Scanner private members
129  //------------------------------------------------------------
130 
131  private:
132 
133  // Needed so that alone can instantiate this class
134 
135  friend class Master;
136 
137  // Needed because AntennaConsumer will call our packFrame method.
138 
139  friend class AntennaConsumer;
140 
141  // Needed because DioConsumer will call our packFrame method.
142 
143  friend class DioConsumer;
144 
145  // Needed because XMLConsumer will call our packFrame method.
146 
147  friend class XMLConsumer;
148 
153  struct {
154  unsigned transient;
155  unsigned persistent;
156  unsigned seq;
157  } features_;
158 
162  void initAntennaResources();
163 
164  //------------------------------------------------------------
165  // Declare startup functions for threads managed by this class.
166  //------------------------------------------------------------
167 
168  static THREAD_START(startAntennaConsumer);
169  static THREAD_START(startReceiverConfigConsumer);
170  static THREAD_START(startPointingTelConsumer);
171  static THREAD_START(startHoloConsumer);
172  static THREAD_START(startSecondaryConsumer);
173  static THREAD_START(startFridgeConsumer);
174  static THREAD_START(startDeicingConsumer);
175 
176 #if DIR_HAVE_MUX
177  static THREAD_START(startBolometerConsumer);
178  static THREAD_START(startSquidConsumer);
179 #endif
180 
181  //------------------------------------------------------------
182  // Declare cleanup handlers for threads managed by this class.
183  //------------------------------------------------------------
184 
185  static THREAD_CLEAN(cleanAntennaConsumer);
186  static THREAD_CLEAN(cleanReceiverConfigConsumer);
187  static THREAD_CLEAN(cleanPointingTelConsumer);
188  static THREAD_CLEAN(cleanHoloConsumer);
189  static THREAD_CLEAN(cleanSecondaryConsumer);
190  static THREAD_CLEAN(cleanFridgeConsumer);
191  static THREAD_CLEAN(cleanDeicingConsumer);
192 
193 #if DIR_HAVE_MUX
194  static THREAD_CLEAN(cleanBolometerConsumer);
195  static THREAD_CLEAN(cleanSquidConsumer);
196 #endif
197 
201  Master* parent_;
202 
207  AntennaConsumer* antennaConsumer_;
208 
209 #if DIR_HAVE_MUX
210 
214  gcp::receiver::DioConsumer* bolometerConsumer_;
215 
219  gcp::receiver::DioConsumer* squidConsumer_;
220 
225  gcp::receiver::XMLConsumer* receiverConfigConsumer_;
226 
227 #endif
228 
233  XMLConsumer* deicingConsumer_;
234 
239  XMLConsumer* pointingTelConsumer_;
240 
245  XMLConsumer* holoConsumer_;
246 
251  XMLConsumer* secondaryConsumer_;
252 
257  XMLConsumer* fridgeConsumer_;
258 
262  ArrayMap* arraymap_;
263 
267  std::string host_;
268 
272  gcp::util::TcpClient client_;
273 
278  gcp::util::NetStr* arrayStr_;
279 
280  static const unsigned int NUM_BUFFER_FRAMES = 10;
281  static const unsigned int MIN_FRAMES_IN_QUEUE = 4;
286  unsigned boloId_;
290  bool dispatchPending_;
291 
292  //------------------------------------------------------------
293  // Antenna resources
294  //------------------------------------------------------------
295 
299  unsigned nAntenna_;
300 
304  std::vector<unsigned> nArchiveAntenna_;
305 
310  std::vector<int> antStartSlots_;
311 
316  std::vector<int> antRecSlots_;
317 
322  unsigned antReceivedCurrent_;
323  unsigned antReceivedLast_;
324 
328  void setAntReceived(bool received,
330 
334  void setAntReceived(unsigned iant, bool received,
336 
340  bool antennasChangedState();
341 
345  void reportStateChange();
346 
351  Scanner(Master* master);
352 
356  bool isConnected();
357 
361  bool connect();
362 
366  void disconnect();
367 
371  void connectScanner(bool reEnable);
372 
376  void disconnectScanner();
377 
383  void processMsg(ScannerMsg* taskMsg);
384 
389  startNewArrayFrame();
390 
394  void initializeShare(gcp::util::TimeVal& timeVal);
395 
399  void initializeDefaultRegisters(gcp::util::ArrayDataFrameManager* frame,
400  gcp::util::TimeVal& mjd);
401 
405  void checkDataFrames();
406 
410  void pollConsumers();
411 
416  void packFrame(gcp::util::DataFrame* frame);
417 
421  void dispatchNextFrame();
422 
426  bool connected();
427 
428  //------------------------------------------------------------
429  // Messaging methods
430  //------------------------------------------------------------
431 
436  void sendDispatchDataFrameMsg();
437 
444  void sendFlagAntennaMsg(unsigned antenna, bool flag);
445 
449  void sendScannerConnectedMsg(bool connected);
450 
454  void sendControlConnectedMsg(bool connected);
455 
459  void respondToHeartBeat();
460 
464  void parseGreeting();
465 
469  static NET_READ_HANDLER(readHandler);
470 
474  static NET_SEND_HANDLER(sendHandler);
475 
479  static NET_ERROR_HANDLER(networkError);
480 
484  void serviceMsgQ();
485  void serviceMsgQSave();
486 
490  void changeFeatures(unsigned seq, unsigned mode, unsigned mask);
491 
492  Master* parent() {return parent_;};
493 
497  void forwardDioMsg(ScannerMsg* msg);
498 
499  }; // End class Scanner
500 
501  } // End namespace mediator
502 } // End namespace gcp
503 
504 #endif // End #ifndef GCP_MEDIATOR_SCANNER_H
Definition: BoardDataFrameManager.h:31
std::string dioHost()
Definition: NetStr.h:21
Definition: ArrayDataFrameManager.h:22
Definition: Scanner.h:58
Definition: ScannerMsg.h:18
Definition: TcpClient.h:18
void sendPackBoloDataFrameMsg()
Definition: Scanner.cc:1203
Definition: ArrayFrameBuffer.h:19
Definition: DataFrame.h:27
Definition: Master.h:64
void packDataFrame(gcp::util::RegMapDataFrameManager *frame, std::string regMapName)
Definition: Scanner.cc:398
void packAntennaFrame(gcp::util::AntennaDataFrameManager *frame)
Definition: Scanner.cc:308
Definition: XMLConsumer.h:29
Definition: TimeVal.h:55
void packBoardSynch(gcp::util::BoardDataFrameManager *dataFrame, unsigned int id)
Definition: Scanner.cc:432
Definition: AntennaConsumer.h:19
void packBoard(gcp::util::BoardDataFrameManager *dataFrame)
Definition: Scanner.cc:422
Definition: AntennaDataFrameManager.h:22
Definition: RegMapDataFrameManager.h:26
Definition: DioConsumer.h:32
Definition: GenericTask.h:33
~Scanner()
Definition: Scanner.cc:235
Definition: arraymap.h:177