Diana Software
QGDReceiver.cc
Go to the documentation of this file.
1 #include "QGDReceiver.hh"
2 #include "QGDMessageHandler.hh"
3 #include <TMessage.h>
4 #include <TServerSocket.h>
5 #include <TThread.h>
6 #include <iostream>
7 
9 
10 //TMessage* QGDReceiver::fMessage = NULL;
11 //TSocket* QGDReceiver::fSocket = NULL;
12 //QGDMessageHandler* QGDReceiver::fMainFrame = NULL;
13 //QGDReceiver::Status QGDReceiver::fStatus;
14 //Int_t QGDReceiver::fPort = 1130;
15 
17 {
18  fMessage = NULL;
19  fSocket = NULL;
20  fReceiveThread = NULL;
21  fGetNewDataThread = NULL;
22  fMainFrame = mainFrame;
23  fStatus = ST_STOP;
25 }
26 
27 
29 {
30  Stop();
31 }
32 
33 void QGDReceiver::Start(Int_t port)
34 {
35  Stop();
36  fMessage = NULL;
37  fPort = port;
39  fReceiveThread = new TThread("WaitNewData",(void(*) (void *))&WaitNewData,(void*) this);
40  fReceiveThread->Run();
41  fGetNewDataThread = new TThread("GetNewData",(void(*) (void *))&GetNewData,(void*) this);
42  fGetNewDataThread->Run();
43 }
44 
46 {
48 
49 
50  if(fGetNewDataThread) {
51  while (fGetNewDataThread->GetState() == TThread::kRunningState) usleep (100000);
52  TThread::Delete(fGetNewDataThread);
53  delete fGetNewDataThread;
54  }
55  fGetNewDataThread = NULL;
56 
57  if(fReceiveThread) {
58  while (fReceiveThread->GetState() == TThread::kRunningState) usleep (100000);
59  TThread::Delete(fReceiveThread);
60  delete fReceiveThread;
61  }
62  fReceiveThread = NULL;
63 
64  fMessage = NULL;
65  if(fSocket != NULL && fSocket != (TSocket*)-1) {
66  fSocket->Close();
67  delete fSocket;
68  }
69  fSocket = NULL;
70 
71 
72 }
73 
75 {
76  if(fStatus != status) {
77  fStatus = status;
79  }
80 }
81 
82 void* QGDReceiver::WaitNewData(void* mainframe)
83 {
84  QGDReceiver* me = (QGDReceiver*) mainframe;
86  while(me->GetStatus() != ST_STOP) {
87  // create server
88  TServerSocket ss(me->fPort,kTRUE);
89  ss.SetOption(kNoBlock,1);
90  // wait the client for establishing connection
92  me->fSocket = NULL;
93  do {
94  me->fSocket = ss.Accept();
95  usleep(200000);
96  if (me->GetStatus()==ST_STOP) {ss.Close(); return NULL;}
97  } while(me->fSocket == NULL || me->fSocket == (TSocket*)-1);
98  // connection established
99  ss.Close();
100  //fSocket->Send("Go");
101  me->SetStatus(ST_CONNECTED);
102 
103  // wait for a message and receive it if we are not proccessing one already.
104  while(me->fSocket != NULL && me->fSocket->IsValid()) {
105  if(me->fMessage == NULL) {
106  me->fSocket->Recv(me->fMessage);
107  //fSocket->Send("GotIt");
108  }
109  usleep(10000);
110  if (me->GetStatus()==ST_STOP) break;
111  }
112 
113  // connection closed
114  if(me->fSocket != NULL) {
115  me->fSocket->Close();
116  delete me->fSocket;
117  }
118  me->fSocket = NULL;
119  }
120  return NULL;
121 }
122 
123 void* QGDReceiver::GetNewData(void* mainframe)
124 {
125  QGDReceiver* me = (QGDReceiver*) mainframe;
126  while(me->GetStatus() != ST_STOP) {
127 // while(1) {
128  usleep(10000);
129  if(me->fMessage) {
130  TObject* obj = me->fMessage->ReadObject(me->fMessage->GetClass());
131  if(QGDCommandList* cmdList = dynamic_cast<QGDCommandList*>(obj)) {
132  QGDCommand cmd = me->fMainFrame->GetCommand(*cmdList);
133  if(me->fSocket != NULL && me->fSocket->IsValid()) {
134  TMessage mess(kMESS_OBJECT);
135  mess.WriteObject(&cmd);
136  me->fSocket->Send(mess);
137  }
138  } else if (QGDModuleList* modList = dynamic_cast<QGDModuleList*>(obj)) {
139  me->fMainFrame->DisplayModuleList(*modList);
140  } else if (QGDModuleParameterList* modList = dynamic_cast<QGDModuleParameterList*>(obj)) {
141  me->fMainFrame->DisplayModuleParameters(*modList);
142  } else {
143  me->fMainFrame->Display(obj);
144  }
145  delete me->fMessage;
146  me->fMessage = NULL;
147  }
148  }
149  return NULL;
150 }
ClassImp(QGDReceiver)
Abstract class for handling of the MGuiDriver messages.
virtual QGDCommand GetCommand(const QGDCommandList &cmdList)=0
virtual void DisplayModuleParameters(const QGDModuleParameterList &paramList)=0
virtual void Display(TObject *)=0
virtual void NotifyReceiverStatus(QGDReceiver::Status status)=0
virtual void DisplayModuleList(const QGDModuleList &modList)=0
Handles the connection of the interactive GUI with diana through TSocket.
Definition: QGDReceiver.hh:18
Status GetStatus()
Definition: QGDReceiver.hh:32
void SetStatus(Status status)
Definition: QGDReceiver.cc:74
TSocket * fSocket
Definition: QGDReceiver.hh:40
void Stop()
Definition: QGDReceiver.cc:45
QGDReceiver(QGDMessageHandler *)
Definition: QGDReceiver.cc:16
virtual ~QGDReceiver()
Definition: QGDReceiver.cc:28
QGDMessageHandler * fMainFrame
Definition: QGDReceiver.hh:42
static void * WaitNewData(void *)
Definition: QGDReceiver.cc:82
TThread * fReceiveThread
Definition: QGDReceiver.hh:45
TMessage * fMessage
Definition: QGDReceiver.hh:39
TThread * fGetNewDataThread
Definition: QGDReceiver.hh:46
Status fStatus
Definition: QGDReceiver.hh:41
static void * GetNewData(void *)
Definition: QGDReceiver.cc:123
void Start(Int_t port=1130)
Definition: QGDReceiver.cc:33