##// END OF EJS Templates
GRESB: RMAP Write working.
Jeandet Alexis -
r72:597f74f8955c GRESB
parent child
Show More
@@ -1,431 +1,434
1 /*------------------------------------------------------------------------------
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the SocExplorer Software
2 -- This file is a part of the SocExplorer Software
3 -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS
3 -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS
4 --
4 --
5 -- This program is free software; you can redistribute it and/or modify
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 3 of the License, or
7 -- the Free Software Foundation; either version 3 of the License, or
8 -- (at your option) any later version.
8 -- (at your option) any later version.
9 --
9 --
10 -- This program is distributed in the hope that it will be useful,
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
13 -- GNU General Public License for more details.
14 --
14 --
15 -- You should have received a copy of the GNU General Public License
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------*/
18 -------------------------------------------------------------------------------*/
19 /*-- Author : Alexis Jeandet
19 /*-- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
20 -- Mail : alexis.jeandet@member.fsf.org
21 ----------------------------------------------------------------------------*/
21 ----------------------------------------------------------------------------*/
22 #include "gr_esb_bridge.h"
22 #include "gr_esb_bridge.h"
23 #include "gr_esb_ui.h"
23 #include "gr_esb_ui.h"
24 #include <unistd.h>
24 #include <unistd.h>
25 #include "spw.h"
25 #include "spw.h"
26 #include <socexplorerengine.h>
26 #include <socexplorerengine.h>
27
27
28 GR_ESB_bridge::GR_ESB_bridge(socexplorerplugin *parent) :
28 GR_ESB_bridge::GR_ESB_bridge(socexplorerplugin *parent) :
29 abstractSpwBridge(parent)
29 abstractSpwBridge(parent)
30 {
30 {
31 this->p_GUI = new GR_ESB_ui();
31 this->p_GUI = new GR_ESB_ui();
32 this->manager = new GR_ESB_Manager(parent,this);
32 this->manager = new GR_ESB_Manager(parent,this);
33
33
34 connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(ipchanged(QString)),this,SLOT(setIP(QString)));
34 connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(ipchanged(QString)),this,SLOT(setIP(QString)));
35 connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(vlinkchanged(QString)),this,SLOT(setVirtualLink(QString)));
35 connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(vlinkchanged(QString)),this,SLOT(setVirtualLink(QString)));
36 connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(connectClicked()),this,SLOT(toggleBridgeConnection()));
36 connect((GR_ESB_ui*)(this->p_GUI),SIGNAL(connectClicked()),this,SLOT(toggleBridgeConnection()));
37 this->manager->virtualLinkIndex = 0;
37 this->manager->virtualLinkIndex = 0;
38 this->manager->start();
38 this->manager->start();
39 }
39 }
40
40
41 GR_ESB_bridge::~GR_ESB_bridge()
41 GR_ESB_bridge::~GR_ESB_bridge()
42 {
42 {
43 this->manager->requestInterruption();
43 this->manager->requestInterruption();
44 while(this->manager->isRunning());
44 while(this->manager->isRunning());
45 }
45 }
46
46
47 void GR_ESB_bridge::toggleBridgeConnection()
47 void GR_ESB_bridge::toggleBridgeConnection()
48 {
48 {
49 if(this->plugin->isConnected())
49 if(this->plugin->isConnected())
50 {
50 {
51 this->disconnectBridge();
51 this->disconnectBridge();
52 }
52 }
53 else
53 else
54 {
54 {
55 this->connectBridge();
55 this->connectBridge();
56 }
56 }
57 }
57 }
58
58
59 bool GR_ESB_bridge::connectBridge()
59 bool GR_ESB_bridge::connectBridge()
60 {
60 {
61 if(this->manager->connectBridge())
61 if(this->manager->connectBridge())
62 {
62 {
63 ((GR_ESB_ui*)this->p_GUI)->lock(true);
63 ((GR_ESB_ui*)this->p_GUI)->lock(true);
64 emit setConnected(true);
64 emit setConnected(true);
65 return true;
65 return true;
66 }
66 }
67 return false;
67 return false;
68 }
68 }
69
69
70 bool GR_ESB_bridge::disconnectBridge()
70 bool GR_ESB_bridge::disconnectBridge()
71 {
71 {
72 if(this->manager->disconnectBridge())
72 if(this->manager->disconnectBridge())
73 {
73 {
74 ((GR_ESB_ui*)this->p_GUI)->lock(false);
74 ((GR_ESB_ui*)this->p_GUI)->lock(false);
75 emit setConnected(false);
75 emit setConnected(false);
76 return true;
76 return true;
77 }
77 }
78 return false;
78 return false;
79 }
79 }
80
80
81 void GR_ESB_bridge::setIP(QString ip)
81 void GR_ESB_bridge::setIP(QString ip)
82 {
82 {
83 this->manager->IP = ip;
83 this->manager->IP = ip;
84 }
84 }
85
85
86 void GR_ESB_bridge::setVirtualLink(QString vlink)
86 void GR_ESB_bridge::setVirtualLink(QString vlink)
87 {
87 {
88 vlink = vlink.section("Virtual link",0,0);
88 vlink = vlink.section("Virtual link",0,0);
89 bool success;
89 bool success;
90 int vlinkTmp = vlink.toInt(&success);
90 int vlinkTmp = vlink.toInt(&success);
91 if(success)
91 if(success)
92 {
92 {
93 setVirtualLink(vlinkTmp);
93 setVirtualLink(vlinkTmp);
94 }
94 }
95 }
95 }
96
96
97 void GR_ESB_bridge::setVirtualLink(qint32 vlink)
97 void GR_ESB_bridge::setVirtualLink(qint32 vlink)
98 {
98 {
99 if(vlink<6 && vlink>=0)
99 if(vlink<6 && vlink>=0)
100 {
100 {
101 this->manager->virtualLinkIndex = vlink;
101 this->manager->virtualLinkIndex = vlink;
102 }
102 }
103 }
103 }
104
104
105
105
106 unsigned int GR_ESB_bridge::Write(unsigned int *Value, unsigned int count, unsigned int address)
106 unsigned int GR_ESB_bridge::Write(unsigned int *Value, unsigned int count, unsigned int address)
107 {
107 {
108 char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))];
108 char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))];
109 char *RMAPAckBuff;
109 char *RMAPAckBuff;
110 int transactionID = 0;
110 int transactionID = 0;
111 int written=0;
111 int written=0;
112 SocExplorerEngine::message(this->plugin,"Enter Write function",2);
112 SocExplorerEngine::message(this->plugin,"Enter Write function",2);
113 QProgressBar* progress=NULL;
113 QProgressBar* progress=NULL;
114 SocExplorerAutoProgressBar autopb;
114 SocExplorerAutoProgressBar autopb;
115 if(count>RMAP_MAX_XFER_SIZE)
115 if(count>RMAP_MAX_XFER_SIZE)
116 {
116 {
117 progress= SocExplorerEngine::getProgressBar("Writing on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count);
117 progress= SocExplorerEngine::getProgressBar("Writing on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count);
118 autopb.setProgressBar(progress);
118 autopb.setProgressBar(progress);
119 }
119 }
120 //Quite stupide loop, I guess that I always get the number of byte I asked for!
120 //Quite stupide loop, I guess that I always get the number of byte I asked for!
121 while(count>=RMAP_MAX_XFER_SIZE)
121 while(count>=RMAP_MAX_XFER_SIZE)
122 {
122 {
123 for(int i=0;i<(RMAP_MAX_XFER_SIZE);i++)
123 for(int i=0;i<(RMAP_MAX_XFER_SIZE);i++)
124 {
124 {
125 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF);
125 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF);
126 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF);
126 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF);
127 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
127 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
128 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF);
128 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF);
129 }
129 }
130 transactionID=manager->getRMAPtransactionID();
130 transactionID=manager->getRMAPtransactionID();
131 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
131 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
132 RMAP_build_tx_request_header(
132 RMAP_build_tx_request_header(
133 this->manager->destinationLogicalAddress,
133 this->manager->destinationLogicalAddress,
134 this->manager->destinationKey,
134 this->manager->destinationKey,
135 this->manager->sourceLogicalAddress,
135 this->manager->sourceLogicalAddress,
136 transactionID,
136 transactionID,
137 address+(written*4),
137 address+(written*4),
138 RMAP_MAX_XFER_SIZE*4,
138 RMAP_MAX_XFER_SIZE*4,
139 writeBuffer);
139 writeBuffer);
140 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4));
140 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4));
141 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
141 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
142 free(RMAPAckBuff);
142 free(RMAPAckBuff);
143 written+=RMAP_MAX_XFER_SIZE;
143 written+=RMAP_MAX_XFER_SIZE;
144 count-=RMAP_MAX_XFER_SIZE;
144 count-=RMAP_MAX_XFER_SIZE;
145 progress->setValue(written);
145 progress->setValue(written);
146 qApp->processEvents();
146 qApp->processEvents();
147 }
147 }
148 if(count>0)
148 if(count>0)
149 {
149 {
150 for(int i=0;i<((int)count);i++)
150 for(int i=0;i<((int)count);i++)
151 {
151 {
152 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF);
152 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF);
153 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF);
153 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF);
154 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
154 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
155 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF);
155 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF);
156 }
156 }
157 transactionID=manager->getRMAPtransactionID();
157 transactionID=manager->getRMAPtransactionID();
158 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
158 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
159 RMAP_build_tx_request_header(
159 RMAP_build_tx_request_header(
160 this->manager->destinationLogicalAddress,
160 this->manager->destinationLogicalAddress,
161 this->manager->destinationKey,
161 this->manager->destinationKey,
162 this->manager->sourceLogicalAddress,
162 this->manager->sourceLogicalAddress,
163 transactionID,
163 transactionID,
164 address+(written*4),
164 address+(written*4),
165 count*4,
165 count*4,
166 writeBuffer);
166 writeBuffer);
167 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4));
167 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4));
168 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
168 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
169 free(RMAPAckBuff);
169 free(RMAPAckBuff);
170 written+=count;
170 written+=count;
171 if(progress!=NULL)
171 if(progress!=NULL)
172 {
172 {
173 progress->setValue(written);
173 progress->setValue(written);
174 qApp->processEvents();
174 qApp->processEvents();
175 }
175 }
176 }
176 }
177 return written;
177 return written;
178 }
178 }
179
179
180 unsigned int GR_ESB_bridge::Read(unsigned int *Value, unsigned int count, unsigned int address)
180 unsigned int GR_ESB_bridge::Read(unsigned int *Value, unsigned int count, unsigned int address)
181 {
181 {
182 char requestBuffer[RMAP_READ_HEADER_MIN_SZ];
182 char requestBuffer[RMAP_READ_HEADER_MIN_SZ];
183 char* RMAP_AnswerBuffer;
183 char* RMAP_AnswerBuffer;
184 requestBuffer[0]=this->manager->linkNumber;//Link number
184 requestBuffer[0]=this->manager->linkNumber;//Link number
185 int transactionID = 0;
185 int transactionID = 0;
186 int read=0;
186 int read=0;
187 QProgressBar* progress=NULL;
187 QProgressBar* progress=NULL;
188 SocExplorerAutoProgressBar autopb;
188 SocExplorerAutoProgressBar autopb;
189 if(count>RMAP_MAX_XFER_SIZE)
189 if(count>RMAP_MAX_XFER_SIZE)
190 {
190 {
191 progress= SocExplorerEngine::getProgressBar("Reading on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count);
191 progress= SocExplorerEngine::getProgressBar("Reading on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count);
192 autopb.setProgressBar(progress);
192 autopb.setProgressBar(progress);
193 }
193 }
194 SocExplorerEngine::message(this->plugin,QString("Enter read function, count=%1, RMAP_MAX_XFER_SIZE=%2").arg(count).arg(RMAP_MAX_XFER_SIZE),2);
194 SocExplorerEngine::message(this->plugin,QString("Enter read function, count=%1, RMAP_MAX_XFER_SIZE=%2").arg(count).arg(RMAP_MAX_XFER_SIZE),2);
195
195
196 //Quite stupide loop, I guess that I always get the number of byte I asked for!
196 //Quite stupide loop, I guess that I always get the number of byte I asked for!
197 while((int)count>=(int)RMAP_MAX_XFER_SIZE)
197 while((int)count>=(int)RMAP_MAX_XFER_SIZE)
198 {
198 {
199 transactionID = manager->getRMAPtransactionID();
199 transactionID = manager->getRMAPtransactionID();
200 SocExplorerEngine::message(this->plugin,QString("New transactionID:%1").arg(transactionID),2);
200 SocExplorerEngine::message(this->plugin,QString("New transactionID:%1").arg(transactionID),2);
201 RMAP_build_rx_request_header(
201 RMAP_build_rx_request_header(
202 this->manager->destinationLogicalAddress,
202 this->manager->destinationLogicalAddress,
203 this->manager->destinationKey,
203 this->manager->destinationKey,
204 this->manager->sourceLogicalAddress,
204 this->manager->sourceLogicalAddress,
205 transactionID,
205 transactionID,
206 address+(read*4),
206 address+(read*4),
207 RMAP_MAX_XFER_SIZE*4,
207 RMAP_MAX_XFER_SIZE*4,
208 requestBuffer);
208 requestBuffer);
209 manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ);
209 manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ);
210 int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer);
210 int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer);
211 if(len==-1)
211 if(len==-1)
212 {
212 {
213 this->toggleBridgeConnection();
213 this->toggleBridgeConnection();
214 return 0;
214 return 0;
215 }
215 }
216 for(int i=0;i<((len-13)/4);i++)
216 for(int i=0;i<((len-13)/4);i++)
217 {
217 {
218 Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]);
218 Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]);
219 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13]));
219 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13]));
220 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14]));
220 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14]));
221 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15]));
221 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15]));
222 }
222 }
223 free(RMAP_AnswerBuffer);
223 free(RMAP_AnswerBuffer);
224 read+=RMAP_MAX_XFER_SIZE;
224 read+=RMAP_MAX_XFER_SIZE;
225 count-=RMAP_MAX_XFER_SIZE;
225 count-=RMAP_MAX_XFER_SIZE;
226 progress->setValue(read);
226 progress->setValue(read);
227 qApp->processEvents();
227 qApp->processEvents();
228 }
228 }
229 if((int)count>0)
229 if((int)count>0)
230 {
230 {
231 transactionID = manager->getRMAPtransactionID();
231 transactionID = manager->getRMAPtransactionID();
232 SocExplorerEngine::message(this->plugin,QString("New transactionID: %1").arg(transactionID),2);
232 SocExplorerEngine::message(this->plugin,QString("New transactionID: %1").arg(transactionID),2);
233 SocExplorerEngine::message(this->plugin,QString("Building request with:"),2);
233 SocExplorerEngine::message(this->plugin,QString("Building request with:"),2);
234 SocExplorerEngine::message(this->plugin,QString("Address = %1").arg(address+(read*4),8,16),2);
234 SocExplorerEngine::message(this->plugin,QString("Address = %1").arg(address+(read*4),8,16),2);
235 SocExplorerEngine::message(this->plugin,QString("Size = %1").arg(count*4),2);
235 SocExplorerEngine::message(this->plugin,QString("Size = %1").arg(count*4),2);
236 SocExplorerEngine::message(this->plugin,QString("Size + 13 = %1").arg((count*4)+13),2);
236 SocExplorerEngine::message(this->plugin,QString("Size + 13 = %1").arg((count*4)+13),2);
237 RMAP_build_rx_request_header(
237 RMAP_build_rx_request_header(
238 this->manager->destinationLogicalAddress,
238 this->manager->destinationLogicalAddress,
239 this->manager->destinationKey,
239 this->manager->destinationKey,
240 this->manager->sourceLogicalAddress,
240 this->manager->sourceLogicalAddress,
241 transactionID,
241 transactionID,
242 address+(read*4),
242 address+(read*4),
243 count*4,
243 count*4,
244 requestBuffer);
244 requestBuffer);
245 manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ);
245 manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ);
246 int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer);
246 int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer);
247 if(len==-1)
247 if(len==-1)
248 {
248 {
249 this->toggleBridgeConnection();
249 this->toggleBridgeConnection();
250 return 0;
250 return 0;
251 }
251 }
252 for(int i=0;i<((len-13)/4);i++)
252 for(int i=0;i<((len-13)/4);i++)
253 {
253 {
254 Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]);
254 Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]);
255 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13]));
255 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13]));
256 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14]));
256 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14]));
257 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15]));
257 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15]));
258 }
258 }
259 free(RMAP_AnswerBuffer);
259 free(RMAP_AnswerBuffer);
260 read+=count;
260 read+=count;
261 if(progress!=NULL)
261 if(progress!=NULL)
262 {
262 {
263 progress->setValue(read);
263 progress->setValue(read);
264 qApp->processEvents();
264 qApp->processEvents();
265 }
265 }
266 }
266 }
267 return read;
267 return read;
268 }
268 }
269
269
270 int GR_ESB_bridge::pushRMAPPacket(char *packet, int size)
270 int GR_ESB_bridge::pushRMAPPacket(char *packet, int size)
271 {
271 {
272 return this->manager->sendPacket(packet,size);
272 return this->manager->sendPacket(packet,size);
273 }
273 }
274
274
275
275
276 GR_ESB_Manager::GR_ESB_Manager(socexplorerplugin *plugin, QObject *parent)
276 GR_ESB_Manager::GR_ESB_Manager(socexplorerplugin *plugin, QObject *parent)
277 :abstractSpwManager(plugin, parent)
277 :abstractSpwManager(plugin, parent)
278 {
278 {
279 this->Read_soc = new QTcpSocket(this);
279 this->Read_soc = new QTcpSocket(this);
280 this->Write_soc = new QTcpSocket(this);
280 this->Write_soc = new QTcpSocket(this);
281 this->sourceLogicalAddress=32;
282 this->destinationLogicalAddress=254;
283 this->destinationKey=2;
281 }
284 }
282
285
283 GR_ESB_Manager::~GR_ESB_Manager()
286 GR_ESB_Manager::~GR_ESB_Manager()
284 {
287 {
285 }
288 }
286
289
287 void GR_ESB_Manager::run()
290 void GR_ESB_Manager::run()
288 {
291 {
289 char buffer[(RMAP_MAX_XFER_SIZE*4)+50];
292 char buffer[(RMAP_MAX_XFER_SIZE*4)+50];
290 SocExplorerEngine::message(this->plugin,"Starting GRESB pooling thread",1);
293 SocExplorerEngine::message(this->plugin,"Starting GRESB pooling thread",1);
291 while (!this->isInterruptionRequested())
294 while (!this->isInterruptionRequested())
292 {
295 {
293 if(this->connected)
296 if(this->connected)
294 {
297 {
295 handleMutex->lock();
298 handleMutex->lock();
296 SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",5);
299 SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",5);
297 if(Read_soc->waitForReadyRead(100))
300 if(Read_soc->waitForReadyRead(100))
298 {
301 {
299 QByteArray data = Read_soc->readAll();
302 QByteArray data = Read_soc->readAll();
300 int PacketLen= ((int)data.at(2)& 0x0FF) + (((int)data.at(3)& 0x0FF)<<8) + (((int)data.at(4)& 0x0FF)<<16);
303 int PacketLen= ((int)data.at(2)& 0x0FF) + (((int)data.at(3)& 0x0FF)<<8) + (((int)data.at(4)& 0x0FF)<<16);
301 if(data[1]==(char)SPW_PROTO_ID_RMAP) //RMAP packet
304 if(data[1]==(char)SPW_PROTO_ID_RMAP) //RMAP packet
302 {
305 {
303 RMAP_Answer* packet;
306 RMAP_Answer* packet;
304 SocExplorerEngine::message(this->plugin,"Got RMAP packet",2);
307 SocExplorerEngine::message(this->plugin,"Got RMAP packet",2);
305 SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(PacketLen),2);
308 SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(PacketLen),2);
306 char* packetbuffer = (char*)malloc(PacketLen);
309 char* packetbuffer = (char*)malloc(PacketLen);
307 memcpy(packetbuffer,data.data(),PacketLen);
310 memcpy(packetbuffer,data.data(),PacketLen);
308 this->handleMutex->unlock();
311 this->handleMutex->unlock();
309 if(PacketLen==8)
312 if(PacketLen==8)
310 {
313 {
311 packet=new RMAP_Answer(RMAP_get_transactionID(buffer),packetbuffer,PacketLen);
314 packet=new RMAP_Answer(RMAP_get_transactionID(buffer),packetbuffer,PacketLen);
312 }
315 }
313 else
316 else
314 {
317 {
315 packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,PacketLen);
318 packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,PacketLen);
316 }
319 }
317 RMAP_AnswersMtx->lock();
320 RMAP_AnswersMtx->lock();
318 RMAP_Answers.append(packet);
321 RMAP_Answers.append(packet);
319 RMAP_AnswersMtx->unlock();
322 RMAP_AnswersMtx->unlock();
320 RMAP_AnswersSem->release();
323 RMAP_AnswersSem->release();
321 }
324 }
322 else //any non-rmap packet will be pushed to the network
325 else //any non-rmap packet will be pushed to the network
323 {
326 {
324 char* packetbuffer = (char*)malloc(PacketLen);
327 char* packetbuffer = (char*)malloc(PacketLen);
325 memcpy(packetbuffer,data.data(),PacketLen);
328 memcpy(packetbuffer,data.data(),PacketLen);
326 emit emitPacket(packetbuffer,PacketLen);
329 emit emitPacket(packetbuffer,PacketLen);
327 this->handleMutex->unlock();
330 this->handleMutex->unlock();
328 SocExplorerEngine::message(this->plugin,"Got SPW packet",2);
331 SocExplorerEngine::message(this->plugin,"Got SPW packet",2);
329 }
332 }
330
333
331 }
334 }
332 else
335 else
333 {
336 {
334 handleMutex->unlock();
337 handleMutex->unlock();
335 }
338 }
336
339
337 }
340 }
338 else
341 else
339 {
342 {
340 //do some sanity checks!
343 //do some sanity checks!
341
344
342 usleep(RMAPtimeout/2);
345 usleep(RMAPtimeout/2);
343 }
346 }
344 usleep(1000);
347 usleep(1000);
345 }
348 }
346 SocExplorerEngine::message(this->plugin,"Exiting Startdundee USB pooling thread",1);
349 SocExplorerEngine::message(this->plugin,"Exiting Startdundee USB pooling thread",1);
347 }
350 }
348
351
349 bool GR_ESB_Manager::connectBridge()
352 bool GR_ESB_Manager::connectBridge()
350 {
353 {
351 int timeout=60;
354 int timeout=60;
352 if(this->Read_soc->state()==QTcpSocket::UnconnectedState)
355 if(this->Read_soc->state()==QTcpSocket::UnconnectedState)
353 {
356 {
354 this->Read_soc->connectToHost(IP,gresb_Conf[virtualLinkIndex].Read_port);
357 this->Read_soc->connectToHost(IP,gresb_Conf[virtualLinkIndex].Write_port);
355 this->Read_soc->waitForConnected(30000);
358 this->Read_soc->waitForConnected(30000);
356 }
359 }
357 if(this->Write_soc->state()==QTcpSocket::UnconnectedState)
360 if(this->Write_soc->state()==QTcpSocket::UnconnectedState)
358 {
361 {
359 this->Write_soc->connectToHost(IP,gresb_Conf[virtualLinkIndex].Write_port);
362 this->Write_soc->connectToHost(IP,gresb_Conf[virtualLinkIndex].Read_port);
360 this->Write_soc->waitForConnected(30000);
363 this->Write_soc->waitForConnected(30000);
361 }
364 }
362 while((this->Read_soc->state()!=QTcpSocket::ConnectedState) && (this->Write_soc->state()!=QTcpSocket::ConnectedState))
365 while((this->Read_soc->state()!=QTcpSocket::ConnectedState) && (this->Write_soc->state()!=QTcpSocket::ConnectedState))
363 {
366 {
364 usleep(100000);
367 usleep(100000);
365 if(timeout--==0)return false;
368 if(timeout--==0)return false;
366 }
369 }
367 return true;
370 return true;
368
371
369 }
372 }
370
373
371 bool GR_ESB_Manager::disconnectBridge()
374 bool GR_ESB_Manager::disconnectBridge()
372 {
375 {
373 int timeout=60;
376 int timeout=60;
374 if(this->Read_soc->state()!=QTcpSocket::UnconnectedState)
377 if(this->Read_soc->state()!=QTcpSocket::UnconnectedState)
375 {
378 {
376 this->Read_soc->disconnectFromHost();
379 this->Read_soc->disconnectFromHost();
377 this->Read_soc->waitForDisconnected(30000);
380 this->Read_soc->waitForDisconnected(30000);
378 }
381 }
379 if(this->Write_soc->state()!=QTcpSocket::UnconnectedState)
382 if(this->Write_soc->state()!=QTcpSocket::UnconnectedState)
380 {
383 {
381 this->Write_soc->disconnectFromHost();
384 this->Write_soc->disconnectFromHost();
382 this->Write_soc->waitForDisconnected(30000);
385 this->Write_soc->waitForDisconnected(30000);
383 }
386 }
384 while((this->Read_soc->state()!=QTcpSocket::UnconnectedState) && (this->Write_soc->state()!=QTcpSocket::UnconnectedState))
387 while((this->Read_soc->state()!=QTcpSocket::UnconnectedState) && (this->Write_soc->state()!=QTcpSocket::UnconnectedState))
385 {
388 {
386 usleep(100000);
389 usleep(100000);
387 if(timeout--==0)return false;
390 if(timeout--==0)return false;
388 }
391 }
389 return true;
392 return true;
390 }
393 }
391
394
392
395
393 bool GR_ESB_Manager::sendPacket(char *packet, int size)
396 bool GR_ESB_Manager::sendPacket(char *packet, int size)
394 {
397 {
395 bool result = false;
398 bool result = false;
396 char protocoleIdentifier;
399 char protocoleIdentifier;
397 SocExplorerEngine::message(this->plugin,"Sending SPW packet",2);
400 SocExplorerEngine::message(this->plugin,"Sending SPW packet",2);
398 if(Q_UNLIKELY(this->Write_soc->state()!=QAbstractSocket::ConnectedState))
401 if(Q_UNLIKELY(this->Write_soc->state()!=QAbstractSocket::ConnectedState))
399 {
402 {
400 SocExplorerEngine::message(this->plugin,"Socket closed",2);
403 SocExplorerEngine::message(this->plugin,"Socket closed",2);
401 //TODO handle disconnection
404 //TODO handle disconnection
402 }
405 }
403 char* SPWpacket = (char*)malloc(size+4);
406 char* SPWpacket = (char*)malloc(size+4);
404 if(SPWpacket!=NULL)
407 if(SPWpacket!=NULL)
405 {
408 {
406 SPWpacket[0]=0; //Protocol = spw
409 SPWpacket[0]=0; //Protocol = spw
407 memcpy(SPWpacket+4,packet,size);
410 memcpy(SPWpacket+4,packet,size);
408 SPWpacket[1]=size & 0x0FF;
411 SPWpacket[1]=(size>>16) & 0x0FF;
409 SPWpacket[2]=(size>>8) & 0x0FF;
412 SPWpacket[2]=(size>>8) & 0x0FF;
410 SPWpacket[3]=(size>>16) & 0x0FF;
413 SPWpacket[3]=size & 0x0FF;
411 }
414 }
412 this->handleMutex->lock();
415 this->handleMutex->lock();
413 result = ((size+4) == this->Write_soc->write(SPWpacket,size+4));
416 result = ((size+4) == this->Write_soc->write(SPWpacket,size+4));
414 this->handleMutex->unlock();
417 this->handleMutex->unlock();
415 if (Q_UNLIKELY(!result))
418 if (Q_UNLIKELY(!result))
416 {
419 {
417 SocExplorerEngine::message(this->plugin,"ERR sending the READ command ",2);
420 SocExplorerEngine::message(this->plugin,"ERR sending the READ command ",2);
418 return false;
421 return false;
419 }
422 }
420 else
423 else
421 {
424 {
422 emit bytesTransmittedToSpw( size-1 ); // -1 is for removing the first bytes added to the packet to route to the right link
425 emit bytesTransmittedToSpw( size-1 ); // -1 is for removing the first bytes added to the packet to route to the right link
423 // read the protocole identifier
426 // read the protocole identifier
424 protocoleIdentifier = packet[2];
427 protocoleIdentifier = packet[2];
425 if (protocoleIdentifier == SPW_PROTO_ID_CCSDS)
428 if (protocoleIdentifier == SPW_PROTO_ID_CCSDS)
426 emit ccsdsPacketTransmittedToSpw();
429 emit ccsdsPacketTransmittedToSpw();
427 SocExplorerEngine::message(this->plugin,"Packet sent",2);
430 SocExplorerEngine::message(this->plugin,"Packet sent",2);
428 }
431 }
429 return true;
432 return true;
430 }
433 }
431
434
@@ -1,79 +1,79
1 #ifndef GR_ESB_BRIDGE_H
1 #ifndef GR_ESB_BRIDGE_H
2 #define GR_ESB_BRIDGE_H
2 #define GR_ESB_BRIDGE_H
3 #include "abstractspwbridge.h"
3 #include "abstractspwbridge.h"
4 #include <QTcpSocket>
4 #include <QTcpSocket>
5 #include <QThread>
5 #include <QThread>
6 #include <QMutex>
6 #include <QMutex>
7 #include <QSemaphore>
7 #include <QSemaphore>
8
8
9 struct gresb_Conf_str
9 struct gresb_Conf_str
10 {
10 {
11 qint32 Read_port;
11 qint32 Transmit_port;
12 qint32 Write_port;
12 qint32 Receive_port;
13 };
13 };
14
14
15
15
16 const struct gresb_Conf_str gresb_Conf[]=
16 const struct gresb_Conf_str gresb_Conf[]=
17 {
17 {
18 {3000,3001}, //Virtual link 0
18 {3000,3001}, //Virtual link 0
19 {3002,3003}, //Virtual link 1
19 {3002,3003}, //Virtual link 1
20 {3004,3005}, //Virtual link 2
20 {3004,3005}, //Virtual link 2
21 {3006,3007}, //Virtual link 3
21 {3006,3007}, //Virtual link 3
22 {3008,3009}, //Virtual link 4
22 {3008,3009}, //Virtual link 4
23 {3010,3011} //Virtual link 5
23 {3010,3011} //Virtual link 5
24 };
24 };
25
25
26
26
27 class GR_ESB_Manager: public abstractSpwManager
27 class GR_ESB_Manager: public abstractSpwManager
28 {
28 {
29 Q_OBJECT
29 Q_OBJECT
30 public:
30 public:
31 explicit GR_ESB_Manager(socexplorerplugin *plugin = 0,QObject* parent=0);
31 explicit GR_ESB_Manager(socexplorerplugin *plugin = 0,QObject* parent=0);
32 ~GR_ESB_Manager();
32 ~GR_ESB_Manager();
33 void run();
33 void run();
34 bool connectBridge();
34 bool connectBridge();
35 bool disconnectBridge();
35 bool disconnectBridge();
36 bool sendPacket(char* packet,int size);
36 bool sendPacket(char* packet,int size);
37
37
38 signals:
38 signals:
39 void emitPacket(char* packet,int size);
39 void emitPacket(char* packet,int size);
40 private:
40 private:
41 void pushRmapPacket(char* packet,int len);
41 void pushRmapPacket(char* packet,int len);
42 char* SPWPacketBuff;
42 char* SPWPacketBuff;
43
43
44 public:
44 public:
45 QTcpSocket* Read_soc;
45 QTcpSocket* Read_soc;
46 QTcpSocket* Write_soc;
46 QTcpSocket* Write_soc;
47 QString IP;
47 QString IP;
48 int virtualLinkIndex;
48 int virtualLinkIndex;
49 };
49 };
50
50
51
51
52 class GR_ESB_bridge : public abstractSpwBridge
52 class GR_ESB_bridge : public abstractSpwBridge
53 {
53 {
54 Q_OBJECT
54 Q_OBJECT
55 public:
55 public:
56 explicit GR_ESB_bridge(socexplorerplugin *parent = 0);
56 explicit GR_ESB_bridge(socexplorerplugin *parent = 0);
57 ~GR_ESB_bridge();
57 ~GR_ESB_bridge();
58 signals:
58 signals:
59
59
60
60
61 public slots:
61 public slots:
62 void toggleBridgeConnection();
62 void toggleBridgeConnection();
63 bool connectBridge();
63 bool connectBridge();
64 bool disconnectBridge();
64 bool disconnectBridge();
65 void setIP(QString ip);
65 void setIP(QString ip);
66 void setVirtualLink(QString vlink);
66 void setVirtualLink(QString vlink);
67 void setVirtualLink(qint32 vlink);
67 void setVirtualLink(qint32 vlink);
68 unsigned int Write(unsigned int *Value,unsigned int count, unsigned int address=0);
68 unsigned int Write(unsigned int *Value,unsigned int count, unsigned int address=0);
69 unsigned int Read(unsigned int *Value,unsigned int count, unsigned int address=0);
69 unsigned int Read(unsigned int *Value,unsigned int count, unsigned int address=0);
70 int pushRMAPPacket(char* packet,int size);
70 int pushRMAPPacket(char* packet,int size);
71 void packetReceived();
71 void packetReceived();
72
72
73 private:
73 private:
74
74
75 GR_ESB_Manager* manager;
75 GR_ESB_Manager* manager;
76
76
77 };
77 };
78
78
79 #endif // GR_ESB_BRIDGE_H
79 #endif // GR_ESB_BRIDGE_H
General Comments 0
You need to be logged in to leave comments. Login now