##// END OF EJS Templates
SpwPlugin:...
Jeandet Alexis -
r91:857534592b43 default draft
parent child
Show More
@@ -1,1014 +1,1015
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
22
23 #include "stardundeespw_usb.h"
23 #include "stardundeespw_usb.h"
24 #include "fakestardundeespwusb_lib.h"
24 #include "fakestardundeespwusb_lib.h"
25 #include <socexplorerengine.h>
25 #include <socexplorerengine.h>
26 #include <qhexedit.h>
26 #include <qhexedit.h>
27
27
28 const QString dwLinkStatusQString[6] = {
28 const QString dwLinkStatusQString[6] = {
29 "CFG_SPACEWIRE_ERROR_RESET",
29 "CFG_SPACEWIRE_ERROR_RESET",
30 "CFG_SPACEWIRE_ERROR_WAIT",
30 "CFG_SPACEWIRE_ERROR_WAIT",
31 "CFG_SPACEWIRE_READY",
31 "CFG_SPACEWIRE_READY",
32 "CFG_SPACEWIRE_STARTED",
32 "CFG_SPACEWIRE_STARTED",
33 "CFG_SPACEWIRE_CONNECTING",
33 "CFG_SPACEWIRE_CONNECTING",
34 "CFG_SPACEWIRE_RUN"
34 "CFG_SPACEWIRE_RUN"
35 };
35 };
36
36
37 stardundeeSPW_USB::stardundeeSPW_USB(socexplorerplugin *parent) :
37 stardundeeSPW_USB::stardundeeSPW_USB(socexplorerplugin *parent) :
38 abstractSpwBridge(parent)
38 abstractSpwBridge(parent)
39 {
39 {
40 Q_UNUSED(parent)
40 Q_UNUSED(parent)
41 this->manager = new stardundeeSPW_USB_Manager(parent,this);
41 this->manager = new stardundeeSPW_USB_Manager(parent,this);
42 makeGUI(parent);
42 makeGUI(parent);
43 connect(this->manager,SIGNAL(emitPacket(char*,int)),this,SIGNAL(pushPacketOverTCP(char*,int)));
43 connect(this->manager,SIGNAL(emitPacket(char*,int)),this,SIGNAL(pushPacketOverTCP(char*,int)));
44 connect(this->manager, SIGNAL(bytesReceivedFromSpw(uint)), this, SIGNAL(BytesReceivedFromSpw(uint)));
44 connect(this->manager, SIGNAL(bytesReceivedFromSpw(uint)), this, SIGNAL(BytesReceivedFromSpw(uint)));
45 connect(this->manager, SIGNAL(bytesTransmittedToSpw(uint)), this, SIGNAL(BytesTransmittedToSpw(uint)));
45 connect(this->manager, SIGNAL(bytesTransmittedToSpw(uint)), this, SIGNAL(BytesTransmittedToSpw(uint)));
46 connect(this->manager, SIGNAL(ccsdsPacketTransmittedToSpw()), this, SIGNAL(CCSDSPacketTransmittedToSpw()));
46 connect(this->manager, SIGNAL(ccsdsPacketTransmittedToSpw()), this, SIGNAL(CCSDSPacketTransmittedToSpw()));
47 this->manager->start();
47 this->manager->start();
48 }
48 }
49
49
50 stardundeeSPW_USB::~stardundeeSPW_USB()
50 stardundeeSPW_USB::~stardundeeSPW_USB()
51 {
51 {
52 SocExplorerEngine::message(this,"Deleting stardundeeSPW_USB",0);
52 SocExplorerEngine::message(this,"Deleting stardundeeSPW_USB",0);
53 delete this->manager;
53 }
54 }
54
55
55 void stardundeeSPW_USB::toggleBridgeConnection()
56 void stardundeeSPW_USB::toggleBridgeConnection()
56 {
57 {
57 if(this->plugin->isConnected())
58 if(this->plugin->isConnected())
58 {
59 {
59 this->disconnectBridge();
60 this->disconnectBridge();
60 }
61 }
61 else
62 else
62 {
63 {
63 this->connectBridge();
64 this->connectBridge();
64 }
65 }
65 }
66 }
66
67
67 bool stardundeeSPW_USB::connectBridge()
68 bool stardundeeSPW_USB::connectBridge()
68 {
69 {
69 if(this->manager->connectBridge())
70 if(this->manager->connectBridge())
70 {
71 {
71 this->timecodeFrequencyChanged( ((StarDundeeGUI*)this->p_GUI)->getTimecodeFrequency());
72 this->timecodeFrequencyChanged( ((StarDundeeGUI*)this->p_GUI)->getTimecodeFrequency());
72 this->startSendingTimecodes( ((StarDundeeGUI*)this->p_GUI)->getStartSendingTimecodes());
73 this->startSendingTimecodes( ((StarDundeeGUI*)this->p_GUI)->getStartSendingTimecodes());
73 ((StarDundeeGUI*)this->p_GUI)->lock(true);
74 ((StarDundeeGUI*)this->p_GUI)->lock(true);
74 emit setConnected(true);
75 emit setConnected(true);
75 return true;
76 return true;
76 }
77 }
77 return false;
78 return false;
78 }
79 }
79
80
80 bool stardundeeSPW_USB::disconnectBridge()
81 bool stardundeeSPW_USB::disconnectBridge()
81 {
82 {
82 if(this->manager->disconnectBridge())
83 if(this->manager->disconnectBridge())
83 {
84 {
84 ((StarDundeeGUI*)this->p_GUI)->lock(false);
85 ((StarDundeeGUI*)this->p_GUI)->lock(false);
85 emit setConnected(false);
86 emit setConnected(false);
86 return true;
87 return true;
87 }
88 }
88 return false;
89 return false;
89 }
90 }
90
91
91 int stardundeeSPW_USB::pushRMAPPacket(char *packet, int size)
92 int stardundeeSPW_USB::pushRMAPPacket(char *packet, int size)
92 {
93 {
93 return this->manager->sendPacket(packet,size);
94 return this->manager->sendPacket(packet,size);
94 }
95 }
95
96
96 unsigned int stardundeeSPW_USB::Write(unsigned int *Value, unsigned int count, unsigned int address)
97 unsigned int stardundeeSPW_USB::Write(unsigned int *Value, unsigned int count, unsigned int address)
97 {
98 {
98 char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))+1];
99 char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))+1];
99 char *RMAPAckBuff;
100 char *RMAPAckBuff;
100 writeBuffer[0]=this->manager->linkNumber;//Link number
101 writeBuffer[0]=this->manager->linkNumber;//Link number
101 int transactionID = 0;
102 int transactionID = 0;
102 int written=0;
103 int written=0;
103 SocExplorerEngine::message(this->plugin,"Enter Write function",2);
104 SocExplorerEngine::message(this->plugin,"Enter Write function",2);
104 QProgressBar* progress=NULL;
105 QProgressBar* progress=NULL;
105 SocExplorerAutoProgressBar autopb;
106 SocExplorerAutoProgressBar autopb;
106 if(count>RMAP_MAX_XFER_SIZE)
107 if(count>RMAP_MAX_XFER_SIZE)
107 {
108 {
108 progress= SocExplorerEngine::getProgressBar("Writing on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count);
109 progress= SocExplorerEngine::getProgressBar("Writing on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count);
109 autopb.setProgressBar(progress);
110 autopb.setProgressBar(progress);
110 }
111 }
111 //Quite stupide loop, I guess that I always get the number of byte I asked for!
112 //Quite stupide loop, I guess that I always get the number of byte I asked for!
112 while(count>=RMAP_MAX_XFER_SIZE)
113 while(count>=RMAP_MAX_XFER_SIZE)
113 {
114 {
114 for(int i=0;i<(RMAP_MAX_XFER_SIZE);i++)
115 for(int i=0;i<(RMAP_MAX_XFER_SIZE);i++)
115 {
116 {
116 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>24)&0xFF);
117 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>24)&0xFF);
117 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>16)&0xFF);
118 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>16)&0xFF);
118 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
119 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
119 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char)(((unsigned int)Value[i+written])&0xFF);
120 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char)(((unsigned int)Value[i+written])&0xFF);
120 }
121 }
121 transactionID=manager->getRMAPtransactionID();
122 transactionID=manager->getRMAPtransactionID();
122 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
123 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
123 RMAP_build_tx_request_header(
124 RMAP_build_tx_request_header(
124 this->manager->destinationLogicalAddress,
125 this->manager->destinationLogicalAddress,
125 this->manager->destinationKey,
126 this->manager->destinationKey,
126 this->manager->sourceLogicalAddress,
127 this->manager->sourceLogicalAddress,
127 transactionID,
128 transactionID,
128 address+(written*4),
129 address+(written*4),
129 RMAP_MAX_XFER_SIZE*4,
130 RMAP_MAX_XFER_SIZE*4,
130 writeBuffer+1);
131 writeBuffer+1);
131 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4)+1);
132 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4)+1);
132 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
133 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
133 free(RMAPAckBuff);
134 free(RMAPAckBuff);
134 written+=RMAP_MAX_XFER_SIZE;
135 written+=RMAP_MAX_XFER_SIZE;
135 count-=RMAP_MAX_XFER_SIZE;
136 count-=RMAP_MAX_XFER_SIZE;
136 progress->setValue(written);
137 progress->setValue(written);
137 qApp->processEvents();
138 qApp->processEvents();
138 }
139 }
139 if(count>0)
140 if(count>0)
140 {
141 {
141 for(int i=0;i<((int)count);i++)
142 for(int i=0;i<((int)count);i++)
142 {
143 {
143 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>24)&0xFF);
144 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>24)&0xFF);
144 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>16)&0xFF);
145 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>16)&0xFF);
145 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
146 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
146 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char)(((unsigned int)Value[i+written])&0xFF);
147 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char)(((unsigned int)Value[i+written])&0xFF);
147 }
148 }
148 transactionID=manager->getRMAPtransactionID();
149 transactionID=manager->getRMAPtransactionID();
149 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
150 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
150 RMAP_build_tx_request_header(
151 RMAP_build_tx_request_header(
151 this->manager->destinationLogicalAddress,
152 this->manager->destinationLogicalAddress,
152 this->manager->destinationKey,
153 this->manager->destinationKey,
153 this->manager->sourceLogicalAddress,
154 this->manager->sourceLogicalAddress,
154 transactionID,
155 transactionID,
155 address+(written*4),
156 address+(written*4),
156 count*4,
157 count*4,
157 writeBuffer+1);
158 writeBuffer+1);
158 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4) +1);
159 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4) +1);
159 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
160 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
160 free(RMAPAckBuff);
161 free(RMAPAckBuff);
161 written+=count;
162 written+=count;
162 if(progress!=NULL)
163 if(progress!=NULL)
163 {
164 {
164 progress->setValue(written);
165 progress->setValue(written);
165 qApp->processEvents();
166 qApp->processEvents();
166 }
167 }
167 }
168 }
168 return written;
169 return written;
169 }
170 }
170
171
171 unsigned int stardundeeSPW_USB::Read(unsigned int *Value, unsigned int count, unsigned int address)
172 unsigned int stardundeeSPW_USB::Read(unsigned int *Value, unsigned int count, unsigned int address)
172 {
173 {
173 char requestBuffer[RMAP_READ_HEADER_MIN_SZ+1];
174 char requestBuffer[RMAP_READ_HEADER_MIN_SZ+1];
174 char* RMAP_AnswerBuffer;
175 char* RMAP_AnswerBuffer;
175 requestBuffer[0]=this->manager->linkNumber;//Link number
176 requestBuffer[0]=this->manager->linkNumber;//Link number
176 int transactionID = 0;
177 int transactionID = 0;
177 int read=0;
178 int read=0;
178 QProgressBar* progress=NULL;
179 QProgressBar* progress=NULL;
179 SocExplorerAutoProgressBar autopb;
180 SocExplorerAutoProgressBar autopb;
180 if(count>RMAP_MAX_XFER_SIZE)
181 if(count>RMAP_MAX_XFER_SIZE)
181 {
182 {
182 progress= SocExplorerEngine::getProgressBar("Reading on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count);
183 progress= SocExplorerEngine::getProgressBar("Reading on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count);
183 autopb.setProgressBar(progress);
184 autopb.setProgressBar(progress);
184 }
185 }
185 SocExplorerEngine::message(this->plugin,QString("Enter read function, count=%1, RMAP_MAX_XFER_SIZE=%2").arg(count).arg(RMAP_MAX_XFER_SIZE),2);
186 SocExplorerEngine::message(this->plugin,QString("Enter read function, count=%1, RMAP_MAX_XFER_SIZE=%2").arg(count).arg(RMAP_MAX_XFER_SIZE),2);
186
187
187 //Quite stupide loop, I guess that I always get the number of byte I asked for!
188 //Quite stupide loop, I guess that I always get the number of byte I asked for!
188 while((int)count>=(int)RMAP_MAX_XFER_SIZE)
189 while((int)count>=(int)RMAP_MAX_XFER_SIZE)
189 {
190 {
190 transactionID = manager->getRMAPtransactionID();
191 transactionID = manager->getRMAPtransactionID();
191 SocExplorerEngine::message(this->plugin,QString("New transactionID:%1").arg(transactionID),2);
192 SocExplorerEngine::message(this->plugin,QString("New transactionID:%1").arg(transactionID),2);
192 RMAP_build_rx_request_header(
193 RMAP_build_rx_request_header(
193 this->manager->destinationLogicalAddress,
194 this->manager->destinationLogicalAddress,
194 this->manager->destinationKey,
195 this->manager->destinationKey,
195 this->manager->sourceLogicalAddress,
196 this->manager->sourceLogicalAddress,
196 transactionID,
197 transactionID,
197 address+(read*4),
198 address+(read*4),
198 RMAP_MAX_XFER_SIZE*4,
199 RMAP_MAX_XFER_SIZE*4,
199 requestBuffer+1);
200 requestBuffer+1);
200 manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ+1);
201 manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ+1);
201 int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer);
202 int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer);
202 if(len==-1)
203 if(len==-1)
203 {
204 {
204 this->toggleBridgeConnection();
205 this->toggleBridgeConnection();
205 return 0;
206 return 0;
206 }
207 }
207 for(int i=0;i<((len-13)/4);i++)
208 for(int i=0;i<((len-13)/4);i++)
208 {
209 {
209 Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]);
210 Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]);
210 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13]));
211 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13]));
211 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14]));
212 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14]));
212 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15]));
213 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15]));
213 }
214 }
214 free(RMAP_AnswerBuffer);
215 free(RMAP_AnswerBuffer);
215 read+=RMAP_MAX_XFER_SIZE;
216 read+=RMAP_MAX_XFER_SIZE;
216 count-=RMAP_MAX_XFER_SIZE;
217 count-=RMAP_MAX_XFER_SIZE;
217 if(progress!=NULL)
218 if(progress!=NULL)
218 {
219 {
219 progress->setValue(read);
220 progress->setValue(read);
220 qApp->processEvents();
221 qApp->processEvents();
221 }
222 }
222 }
223 }
223 if((int)count>0)
224 if((int)count>0)
224 {
225 {
225 transactionID = manager->getRMAPtransactionID();
226 transactionID = manager->getRMAPtransactionID();
226 SocExplorerEngine::message(this->plugin,QString("New transactionID: %1").arg(transactionID),2);
227 SocExplorerEngine::message(this->plugin,QString("New transactionID: %1").arg(transactionID),2);
227 SocExplorerEngine::message(this->plugin,QString("Building request with:"),2);
228 SocExplorerEngine::message(this->plugin,QString("Building request with:"),2);
228 SocExplorerEngine::message(this->plugin,QString("Address = %1").arg(address+(read*4),8,16),2);
229 SocExplorerEngine::message(this->plugin,QString("Address = %1").arg(address+(read*4),8,16),2);
229 SocExplorerEngine::message(this->plugin,QString("Size = %1").arg(count*4),2);
230 SocExplorerEngine::message(this->plugin,QString("Size = %1").arg(count*4),2);
230 SocExplorerEngine::message(this->plugin,QString("Size + 13 = %1").arg((count*4)+13),2);
231 SocExplorerEngine::message(this->plugin,QString("Size + 13 = %1").arg((count*4)+13),2);
231 RMAP_build_rx_request_header(
232 RMAP_build_rx_request_header(
232 this->manager->destinationLogicalAddress,
233 this->manager->destinationLogicalAddress,
233 this->manager->destinationKey,
234 this->manager->destinationKey,
234 this->manager->sourceLogicalAddress,
235 this->manager->sourceLogicalAddress,
235 transactionID,
236 transactionID,
236 address+(read*4),
237 address+(read*4),
237 count*4,
238 count*4,
238 requestBuffer+1);
239 requestBuffer+1);
239 manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ+1);
240 manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ+1);
240 int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer);
241 int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer);
241 if(len==-1)
242 if(len==-1)
242 {
243 {
243 this->toggleBridgeConnection();
244 this->toggleBridgeConnection();
244 return 0;
245 return 0;
245 }
246 }
246 for(int i=0;i<((len-13)/4);i++)
247 for(int i=0;i<((len-13)/4);i++)
247 {
248 {
248 Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]);
249 Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]);
249 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13]));
250 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13]));
250 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14]));
251 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14]));
251 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15]));
252 Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15]));
252 }
253 }
253 free(RMAP_AnswerBuffer);
254 free(RMAP_AnswerBuffer);
254 read+=count;
255 read+=count;
255 if(progress!=NULL)
256 if(progress!=NULL)
256 {
257 {
257 progress->setValue(read);
258 progress->setValue(read);
258 qApp->processEvents();
259 qApp->processEvents();
259 }
260 }
260 }
261 }
261 return read;
262 return read;
262 }
263 }
263
264
264 void stardundeeSPW_USB::brickSelectionChanged(int brickIndex)
265 void stardundeeSPW_USB::brickSelectionChanged(int brickIndex)
265 {
266 {
266 this->manager->selectedBrick = brickIndex-1;
267 this->manager->selectedBrick = brickIndex-1;
267 SocExplorerEngine::message(plugin,QString("Changing brick index: %1").arg(manager->selectedBrick),1);
268 SocExplorerEngine::message(plugin,QString("Changing brick index: %1").arg(manager->selectedBrick),1);
268 }
269 }
269
270
270 void stardundeeSPW_USB::linkNumberSelectionChanged(int linkIndex)
271 void stardundeeSPW_USB::linkNumberSelectionChanged(int linkIndex)
271 {
272 {
272 this->manager->linkNumber = linkIndex + 1;
273 this->manager->linkNumber = linkIndex + 1;
273 SocExplorerEngine::message(plugin,QString("Changing Link Number: %1").arg(manager->linkNumber),1);
274 SocExplorerEngine::message(plugin,QString("Changing Link Number: %1").arg(manager->linkNumber),1);
274 }
275 }
275
276
276 void stardundeeSPW_USB::linkSpeedSelectionChanged(const QString &linkSpeed)
277 void stardundeeSPW_USB::linkSpeedSelectionChanged(const QString &linkSpeed)
277 {
278 {
278 this->manager->linkSpeed = linkSpeed.toInt();
279 this->manager->linkSpeed = linkSpeed.toInt();
279
280
280 SocExplorerEngine::message(plugin,QString("Changing Link Speed: %1").arg(manager->linkSpeed),1);
281 SocExplorerEngine::message(plugin,QString("Changing Link Speed: %1").arg(manager->linkSpeed),1);
281 }
282 }
282
283
283 void stardundeeSPW_USB::sourceLogicalAddressChanged(const QString &sourceAddress)
284 void stardundeeSPW_USB::sourceLogicalAddressChanged(const QString &sourceAddress)
284 {
285 {
285 this->manager->sourceLogicalAddress = sourceAddress.toInt();
286 this->manager->sourceLogicalAddress = sourceAddress.toInt();
286 SocExplorerEngine::message(plugin,QString("Changing Destination Key: %1").arg(manager->sourceLogicalAddress),1);
287 SocExplorerEngine::message(plugin,QString("Changing Destination Key: %1").arg(manager->sourceLogicalAddress),1);
287 }
288 }
288
289
289 void stardundeeSPW_USB::destinationAddressChanged(const QString &rmapaddress)
290 void stardundeeSPW_USB::destinationAddressChanged(const QString &rmapaddress)
290 {
291 {
291 this->manager->destinationLogicalAddress = rmapaddress.toInt();
292 this->manager->destinationLogicalAddress = rmapaddress.toInt();
292 SocExplorerEngine::message(plugin,QString("Changing RMAP address: %1").arg(manager->destinationLogicalAddress),1);
293 SocExplorerEngine::message(plugin,QString("Changing RMAP address: %1").arg(manager->destinationLogicalAddress),1);
293 }
294 }
294
295
295 void stardundeeSPW_USB::destinationKeyChanged(const QString &key)
296 void stardundeeSPW_USB::destinationKeyChanged(const QString &key)
296 {
297 {
297 this->manager->destinationKey = key.toInt();
298 this->manager->destinationKey = key.toInt();
298 SocExplorerEngine::message(plugin,QString("Changing RMAP Key: %1").arg(manager->destinationKey),1);
299 SocExplorerEngine::message(plugin,QString("Changing RMAP Key: %1").arg(manager->destinationKey),1);
299 }
300 }
300
301
301 void stardundeeSPW_USB::brickModeChanged( bool interfaceMode )
302 void stardundeeSPW_USB::brickModeChanged( bool interfaceMode )
302 {
303 {
303 this->manager->interfaceMode = interfaceMode;
304 this->manager->interfaceMode = interfaceMode;
304 }
305 }
305
306
306 void stardundeeSPW_USB::timecodeFrequencyChanged(const QString &frequency)
307 void stardundeeSPW_USB::timecodeFrequencyChanged(const QString &frequency)
307 {
308 {
308 this->manager->timecodeFrequency = frequency.toDouble();
309 this->manager->timecodeFrequency = frequency.toDouble();
309 this->manager->setTimecodeFrequency( this->manager->timecodeFrequency);
310 this->manager->setTimecodeFrequency( this->manager->timecodeFrequency);
310 SocExplorerEngine::message(plugin,QString("Changing timecode frequency: %1").arg(manager->timecodeFrequency),1);
311 SocExplorerEngine::message(plugin,QString("Changing timecode frequency: %1").arg(manager->timecodeFrequency),1);
311 }
312 }
312
313
313 void stardundeeSPW_USB::startSendingTimecodes(bool onOff )
314 void stardundeeSPW_USB::startSendingTimecodes(bool onOff )
314 {
315 {
315 this->manager->sendTimecodePeriodically( onOff );
316 this->manager->sendTimecodePeriodically( onOff );
316 }
317 }
317
318
318 void stardundeeSPW_USB::rmapTimeoutChanged(const QString &timeout)
319 void stardundeeSPW_USB::rmapTimeoutChanged(const QString &timeout)
319 {
320 {
320 int tim=timeout.toInt();
321 int tim=timeout.toInt();
321 if(tim<50)
322 if(tim<50)
322 {
323 {
323 tim = 50;
324 tim = 50;
324 ((StarDundeeGUI*)this->p_GUI)->setRmapTimeout(QString("%1").arg(tim));
325 ((StarDundeeGUI*)this->p_GUI)->setRmapTimeout(QString("%1").arg(tim));
325 }
326 }
326 this->manager->RMAPtimeout = tim;
327 this->manager->RMAPtimeout = tim;
327 SocExplorerEngine::message(plugin,QString("Changing RMAP Timeout: %1").arg(manager->RMAPtimeout),1);
328 SocExplorerEngine::message(plugin,QString("Changing RMAP Timeout: %1").arg(manager->RMAPtimeout),1);
328 }
329 }
329
330
330 void stardundeeSPW_USB::makeGUI(socexplorerplugin *parent)
331 void stardundeeSPW_USB::makeGUI(socexplorerplugin *parent)
331 {
332 {
332 Q_UNUSED(parent)
333 Q_UNUSED(parent)
333 this->p_GUI = new StarDundeeGUI();
334 this->p_GUI = new StarDundeeGUI();
334 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(connectClicked()),this,SLOT(toggleBridgeConnection()));
335 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(connectClicked()),this,SLOT(toggleBridgeConnection()));
335 connect(this->manager,SIGNAL(updateAvailableBrickCount(int)),((StarDundeeGUI*)this->p_GUI),SLOT(updateAvailableBrickCount(int)));
336 connect(this->manager,SIGNAL(updateAvailableBrickCount(int)),((StarDundeeGUI*)this->p_GUI),SLOT(updateAvailableBrickCount(int)));
336 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(brickSelectionChanged(int)),this,SLOT(brickSelectionChanged(int)));
337 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(brickSelectionChanged(int)),this,SLOT(brickSelectionChanged(int)));
337 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(linkNumberSelectionChanged(int)),this,SLOT(linkNumberSelectionChanged(int)));
338 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(linkNumberSelectionChanged(int)),this,SLOT(linkNumberSelectionChanged(int)));
338 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(linkSpeedSelectionChanged(QString)),this,SLOT(linkSpeedSelectionChanged(QString)));
339 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(linkSpeedSelectionChanged(QString)),this,SLOT(linkSpeedSelectionChanged(QString)));
339 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(sourceLogicalAddressChanged(QString)),this,SLOT(sourceLogicalAddressChanged(QString)));
340 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(sourceLogicalAddressChanged(QString)),this,SLOT(sourceLogicalAddressChanged(QString)));
340 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(rmapAddressChanged(QString)),this,SLOT(destinationAddressChanged(QString)));
341 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(rmapAddressChanged(QString)),this,SLOT(destinationAddressChanged(QString)));
341 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(destinationKeyChanged(QString)),this,SLOT(destinationKeyChanged(QString)));
342 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(destinationKeyChanged(QString)),this,SLOT(destinationKeyChanged(QString)));
342 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(rmapTimeoutChanged(QString)),this,SLOT(rmapTimeoutChanged(QString)));
343 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(rmapTimeoutChanged(QString)),this,SLOT(rmapTimeoutChanged(QString)));
343 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(brickModeChanged(bool)), this, SLOT(brickModeChanged(bool)));
344 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(brickModeChanged(bool)), this, SLOT(brickModeChanged(bool)));
344 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(timecodeFrequencyChange(QString)), this, SLOT(timecodeFrequencyChanged(QString)));
345 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(timecodeFrequencyChange(QString)), this, SLOT(timecodeFrequencyChanged(QString)));
345 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(startSendingTimecode(bool)), this, SLOT(startSendingTimecodes(bool)));
346 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(startSendingTimecode(bool)), this, SLOT(startSendingTimecodes(bool)));
346
347
347 this->brickSelectionChanged( ((StarDundeeGUI*)this->p_GUI)->getBrickSelection());
348 this->brickSelectionChanged( ((StarDundeeGUI*)this->p_GUI)->getBrickSelection());
348 this->linkNumberSelectionChanged( ((StarDundeeGUI*)this->p_GUI)->getLinkNumberSelection());
349 this->linkNumberSelectionChanged( ((StarDundeeGUI*)this->p_GUI)->getLinkNumberSelection());
349 this->linkSpeedSelectionChanged( ((StarDundeeGUI*)this->p_GUI)->getLinkSpeedSelection());
350 this->linkSpeedSelectionChanged( ((StarDundeeGUI*)this->p_GUI)->getLinkSpeedSelection());
350 this->sourceLogicalAddressChanged(((StarDundeeGUI*)this->p_GUI)->getSourceAddress());
351 this->sourceLogicalAddressChanged(((StarDundeeGUI*)this->p_GUI)->getSourceAddress());
351 this->destinationAddressChanged( ((StarDundeeGUI*)this->p_GUI)->getDestinationAddress());
352 this->destinationAddressChanged( ((StarDundeeGUI*)this->p_GUI)->getDestinationAddress());
352 this->destinationKeyChanged( ((StarDundeeGUI*)this->p_GUI)->getDestinationKey());
353 this->destinationKeyChanged( ((StarDundeeGUI*)this->p_GUI)->getDestinationKey());
353 this->rmapTimeoutChanged( ((StarDundeeGUI*)this->p_GUI)->getRmapTimeout());
354 this->rmapTimeoutChanged( ((StarDundeeGUI*)this->p_GUI)->getRmapTimeout());
354 this->brickModeChanged( ((StarDundeeGUI*)this->p_GUI)->isBrickSetAsAnInterface());
355 this->brickModeChanged( ((StarDundeeGUI*)this->p_GUI)->isBrickSetAsAnInterface());
355
356
356 connect(this,SIGNAL(SelectBrick(int)), ((StarDundeeGUI*)this->p_GUI),SLOT(selectBrick(int)));
357 connect(this,SIGNAL(SelectBrick(int)), ((StarDundeeGUI*)this->p_GUI),SLOT(selectBrick(int)));
357 connect(this,SIGNAL(SelectLinkNumber(int)), ((StarDundeeGUI*)this->p_GUI),SLOT(selectLinkNumber(int)));
358 connect(this,SIGNAL(SelectLinkNumber(int)), ((StarDundeeGUI*)this->p_GUI),SLOT(selectLinkNumber(int)));
358 connect(this,SIGNAL(SelectLinkSpeed(int)), ((StarDundeeGUI*)this->p_GUI),SLOT(selectLinkSpeed(int)));
359 connect(this,SIGNAL(SelectLinkSpeed(int)), ((StarDundeeGUI*)this->p_GUI),SLOT(selectLinkSpeed(int)));
359 connect(this,SIGNAL(SetDestinationKey(QString)), ((StarDundeeGUI*)this->p_GUI),SLOT(setDestinationKey(QString)));
360 connect(this,SIGNAL(SetDestinationKey(QString)), ((StarDundeeGUI*)this->p_GUI),SLOT(setDestinationKey(QString)));
360 connect(this,SIGNAL(SetDestinationAddress(QString)),((StarDundeeGUI*)this->p_GUI),SLOT(setDestinationAddress(QString)));
361 connect(this,SIGNAL(SetDestinationAddress(QString)),((StarDundeeGUI*)this->p_GUI),SLOT(setDestinationAddress(QString)));
361 connect(this,SIGNAL(SetSourceAddress(QString)), ((StarDundeeGUI*)this->p_GUI),SLOT(setSourceAddress(QString)));
362 connect(this,SIGNAL(SetSourceAddress(QString)), ((StarDundeeGUI*)this->p_GUI),SLOT(setSourceAddress(QString)));
362 connect(this,SIGNAL(SetRmapTimeout(QString)), ((StarDundeeGUI*)this->p_GUI),SLOT(setRmapTimeout(QString)));
363 connect(this,SIGNAL(SetRmapTimeout(QString)), ((StarDundeeGUI*)this->p_GUI),SLOT(setRmapTimeout(QString)));
363 connect(this,SIGNAL(GetAvailableBrickCount()), ((StarDundeeGUI*)this->p_GUI),SLOT(getAvailableBrickCount()));
364 connect(this,SIGNAL(GetAvailableBrickCount()), ((StarDundeeGUI*)this->p_GUI),SLOT(getAvailableBrickCount()));
364 connect(this,SIGNAL(GetNbPacketsTransmittedToSpw()),((StarDundeeGUI*)this->p_GUI),SLOT(getNbPacketsTransmittedToSpw()));
365 connect(this,SIGNAL(GetNbPacketsTransmittedToSpw()),((StarDundeeGUI*)this->p_GUI),SLOT(getNbPacketsTransmittedToSpw()));
365 connect(this,SIGNAL(GetNbCCSDSPacketsTransmittedToSpw()),
366 connect(this,SIGNAL(GetNbCCSDSPacketsTransmittedToSpw()),
366 ((StarDundeeGUI*)this->p_GUI),SLOT(getNbCCSDSPacketsTransmittedToSpw()));
367 ((StarDundeeGUI*)this->p_GUI),SLOT(getNbCCSDSPacketsTransmittedToSpw()));
367 connect(this,SIGNAL(SetBrickAsAnInterface(bool)), ((StarDundeeGUI*)this->p_GUI),SLOT(setBrickAsAnInterface(bool)));
368 connect(this,SIGNAL(SetBrickAsAnInterface(bool)), ((StarDundeeGUI*)this->p_GUI),SLOT(setBrickAsAnInterface(bool)));
368 connect(this,SIGNAL(SetBrickAsARouter(bool)), ((StarDundeeGUI*)this->p_GUI),SLOT(setBrickAsARouter(bool)));
369 connect(this,SIGNAL(SetBrickAsARouter(bool)), ((StarDundeeGUI*)this->p_GUI),SLOT(setBrickAsARouter(bool)));
369 connect(this,SIGNAL(BytesReceivedFromSpw(uint)), ((StarDundeeGUI*)this->p_GUI),SLOT(updateNbReceivedBytesFromSpw(uint)));
370 connect(this,SIGNAL(BytesReceivedFromSpw(uint)), ((StarDundeeGUI*)this->p_GUI),SLOT(updateNbReceivedBytesFromSpw(uint)));
370 connect(this,SIGNAL(BytesTransmittedToSpw(uint)), ((StarDundeeGUI*)this->p_GUI),SLOT(updateNbTransmittedBytesToSpw(uint)));
371 connect(this,SIGNAL(BytesTransmittedToSpw(uint)), ((StarDundeeGUI*)this->p_GUI),SLOT(updateNbTransmittedBytesToSpw(uint)));
371 connect(this,SIGNAL(CCSDSPacketTransmittedToSpw()), ((StarDundeeGUI*)this->p_GUI),SLOT(updateCCSDSPacketTransmittedToSpw()));
372 connect(this,SIGNAL(CCSDSPacketTransmittedToSpw()), ((StarDundeeGUI*)this->p_GUI),SLOT(updateCCSDSPacketTransmittedToSpw()));
372 connect(this,SIGNAL(SetTimecodeFrequency(double)), ((StarDundeeGUI*)this->p_GUI),SLOT(setTimecodeFrequency(double)));
373 connect(this,SIGNAL(SetTimecodeFrequency(double)), ((StarDundeeGUI*)this->p_GUI),SLOT(setTimecodeFrequency(double)));
373 connect(this,SIGNAL(StartSendingTimecodes(bool)), ((StarDundeeGUI*)this->p_GUI),SLOT(setStartSendingTimecodes(bool)));
374 connect(this,SIGNAL(StartSendingTimecodes(bool)), ((StarDundeeGUI*)this->p_GUI),SLOT(setStartSendingTimecodes(bool)));
374
375
375 connect(this,SIGNAL(SendOneTimecode(unsigned char)),this->manager, SLOT(sendOneTimecode(unsigned char)));
376 connect(this,SIGNAL(SendOneTimecode(unsigned char)),this->manager, SLOT(sendOneTimecode(unsigned char)));
376 connect(this,SIGNAL(GetLinkNumber()), this->manager, SLOT(getLinkNumber()));
377 connect(this,SIGNAL(GetLinkNumber()), this->manager, SLOT(getLinkNumber()));
377 }
378 }
378
379
379 void stardundeeSPW_USB::sendPacketComingFromTCPServer(char *packet, int size)
380 void stardundeeSPW_USB::sendPacketComingFromTCPServer(char *packet, int size)
380 {
381 {
381 char* data;
382 char* data;
382 int i;
383 int i;
383
384
384 data = (char *) malloc( size + 5 );
385 data = (char *) malloc( size + 5 );
385
386
386 data[0] = this->manager->linkNumber;
387 data[0] = this->manager->linkNumber;
387 data[1] = this->manager->destinationLogicalAddress; // target logical address
388 data[1] = this->manager->destinationLogicalAddress; // target logical address
388 data[2] = SPW_PROTO_ID_CCSDS; // protocol identifier
389 data[2] = SPW_PROTO_ID_CCSDS; // protocol identifier
389 data[3] = 0x00; // reserved
390 data[3] = 0x00; // reserved
390 data[4] = 0x00; // user application
391 data[4] = 0x00; // user application
391
392
392 for ( i=0; i<size; i++ )
393 for ( i=0; i<size; i++ )
393 {
394 {
394 data[i+5] = packet[i];
395 data[i+5] = packet[i];
395 }
396 }
396
397
397 this->manager->sendPacket( data, size + 5);
398 this->manager->sendPacket( data, size + 5);
398
399
399 free(data);
400 free(data);
400 free(packet);
401 free(packet);
401 }
402 }
402
403
403 stardundeeSPW_USB_Manager::stardundeeSPW_USB_Manager(socexplorerplugin *plugin, QObject *parent)
404 stardundeeSPW_USB_Manager::stardundeeSPW_USB_Manager(socexplorerplugin *plugin, QObject *parent)
404 :abstractSpwManager(plugin, parent)
405 :abstractSpwManager(plugin, parent)
405 {
406 {
406 // TODO remove this crap!
407 // TODO remove this crap!
407 this->initDialog();
408 this->initDialog();
408 // this->moveToThread(this);
409 // this->moveToThread(this);
409 }
410 }
410
411
411 stardundeeSPW_USB_Manager::~stardundeeSPW_USB_Manager()
412 stardundeeSPW_USB_Manager::~stardundeeSPW_USB_Manager()
412 {
413 {
413 if(this->connected)disconnectBridge();
414 if(this->connected)disconnectBridge();
414 this->requestInterruption();
415 this->requestInterruption();
415 while(!this->isFinished());
416 while(!this->isFinished());
416 }
417 }
417
418
418 void stardundeeSPW_USB_Manager::run()
419 void stardundeeSPW_USB_Manager::run()
419 {
420 {
420 USB_SPACEWIRE_PACKET_PROPERTIES properties;
421 USB_SPACEWIRE_PACKET_PROPERTIES properties;
421 USB_SPACEWIRE_ID pIdentifier=NULL;
422 USB_SPACEWIRE_ID pIdentifier=NULL;
422 USB_SPACEWIRE_STATUS stat;
423 USB_SPACEWIRE_STATUS stat;
423 SocExplorerEngine::message(this->plugin,"Starting Startdundee USB pooling thread",1);
424 SocExplorerEngine::message(this->plugin,"Starting Startdundee USB pooling thread",1);
424 char buffer[(RMAP_MAX_XFER_SIZE*4)+50];
425 char buffer[(RMAP_MAX_XFER_SIZE*4)+50];
425 while (!QThread::currentThread()->isInterruptionRequested())
426 while (!QThread::currentThread()->isInterruptionRequested())
426 {
427 {
427 if(this->connected)
428 if(this->connected)
428 {
429 {
429 this->handleMutex->lock();
430 this->handleMutex->lock();
430 SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",4);
431 SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",4);
431 if(USBSpaceWire_WaitOnReadPacketAvailable(hDevice,0.01))
432 if(USBSpaceWire_WaitOnReadPacketAvailable(hDevice,0.01))
432 {
433 {
433 SocExplorerEngine::message(this->plugin,"Got packet",2);
434 SocExplorerEngine::message(this->plugin,"Got packet",2);
434 stat = USBSpaceWire_ReadPackets(hDevice, buffer, (RMAP_MAX_XFER_SIZE*4)+50,1, 1, &properties, &pIdentifier);
435 stat = USBSpaceWire_ReadPackets(hDevice, buffer, (RMAP_MAX_XFER_SIZE*4)+50,1, 1, &properties, &pIdentifier);
435 if (stat == TRANSFER_SUCCESS)
436 if (stat == TRANSFER_SUCCESS)
436 {
437 {
437 if(USBSpaceWire_GetReadTrafficType(&properties, 0) ==SPACEWIRE_TRAFFIC_PACKET)
438 if(USBSpaceWire_GetReadTrafficType(&properties, 0) ==SPACEWIRE_TRAFFIC_PACKET)
438 {
439 {
439 SocExplorerEngine::message(this->plugin,"It's a SPW packet",2);
440 SocExplorerEngine::message(this->plugin,"It's a SPW packet",2);
440 if(USBSpaceWire_GetReadEOPStatus(&properties, 0)== SPACEWIRE_USB_EOP)
441 if(USBSpaceWire_GetReadEOPStatus(&properties, 0)== SPACEWIRE_USB_EOP)
441 {
442 {
442 SocExplorerEngine::message(this->plugin,"Got end of packet",2);
443 SocExplorerEngine::message(this->plugin,"Got end of packet",2);
443 emit bytesReceivedFromSpw( properties.len );
444 emit bytesReceivedFromSpw( properties.len );
444 if(buffer[1]==(char)SPW_PROTO_ID_RMAP) //RMAP packet
445 if(buffer[1]==(char)SPW_PROTO_ID_RMAP) //RMAP packet
445 {
446 {
446 RMAP_Answer* packet;
447 RMAP_Answer* packet;
447 SocExplorerEngine::message(this->plugin,"Got RMAP packet",2);
448 SocExplorerEngine::message(this->plugin,"Got RMAP packet",2);
448 SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(properties.len),2);
449 SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(properties.len),2);
449 char* packetbuffer = (char*)malloc(properties.len);
450 char* packetbuffer = (char*)malloc(properties.len);
450 memcpy(packetbuffer,buffer,properties.len);
451 memcpy(packetbuffer,buffer,properties.len);
451 USBSpaceWire_FreeRead(hDevice, pIdentifier);
452 USBSpaceWire_FreeRead(hDevice, pIdentifier);
452 pIdentifier = NULL;
453 pIdentifier = NULL;
453 this->handleMutex->unlock();
454 this->handleMutex->unlock();
454 if(properties.len==8)
455 if(properties.len==8)
455 {
456 {
456 packet=new RMAP_Answer(RMAP_get_transactionID(buffer),packetbuffer,properties.len);
457 packet=new RMAP_Answer(RMAP_get_transactionID(buffer),packetbuffer,properties.len);
457 }
458 }
458 else
459 else
459 {
460 {
460 packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,properties.len);
461 packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,properties.len);
461 }
462 }
462 RMAP_AnswersMtx->lock();
463 RMAP_AnswersMtx->lock();
463 RMAP_Answers.append(packet);
464 RMAP_Answers.append(packet);
464 RMAP_AnswersMtx->unlock();
465 RMAP_AnswersMtx->unlock();
465 RMAP_AnswersSem->release();
466 RMAP_AnswersSem->release();
466 }
467 }
467 else //any non-rmap packet will be pushed to the network
468 else //any non-rmap packet will be pushed to the network
468 {
469 {
469 char* packetbuffer = (char*)malloc(properties.len);
470 char* packetbuffer = (char*)malloc(properties.len);
470 memcpy(packetbuffer,buffer,properties.len);
471 memcpy(packetbuffer,buffer,properties.len);
471 emit emitPacket(packetbuffer,properties.len);
472 emit emitPacket(packetbuffer,properties.len);
472 USBSpaceWire_FreeRead(hDevice, pIdentifier);
473 USBSpaceWire_FreeRead(hDevice, pIdentifier);
473 this->handleMutex->unlock();
474 this->handleMutex->unlock();
474 SocExplorerEngine::message(this->plugin,"Got SPW packet",2);
475 SocExplorerEngine::message(this->plugin,"Got SPW packet",2);
475 }
476 }
476 }
477 }
477 else
478 else
478 {
479 {
479 SocExplorerEngine::message(this->plugin,"No EOP received",2);
480 SocExplorerEngine::message(this->plugin,"No EOP received",2);
480 this->handleMutex->unlock();
481 this->handleMutex->unlock();
481 }
482 }
482 }
483 }
483
484
484 }
485 }
485 else
486 else
486 {
487 {
487 USBSpaceWire_FreeRead(hDevice, pIdentifier);
488 USBSpaceWire_FreeRead(hDevice, pIdentifier);
488 this->handleMutex->unlock();
489 this->handleMutex->unlock();
489 }
490 }
490 }
491 }
491 else
492 else
492 {
493 {
493 USBSpaceWire_FreeRead(hDevice, pIdentifier);
494 USBSpaceWire_FreeRead(hDevice, pIdentifier);
494 this->handleMutex->unlock();
495 this->handleMutex->unlock();
495 }
496 }
496 }
497 }
497 else
498 else
498 {
499 {
499 //do some sanity checks!
500 //do some sanity checks!
500 int list = USBSpaceWire_ListDevices();
501 int list = USBSpaceWire_ListDevices();
501 if(this->brickList!=list)
502 if(this->brickList!=list)
502 {
503 {
503 this->brickList = list;
504 this->brickList = list;
504 emit updateAvailableBrickCount(this->brickList);
505 emit updateAvailableBrickCount(this->brickList);
505 }
506 }
506 usleep(RMAPtimeout/2);
507 usleep(RMAPtimeout/2);
507 }
508 }
508 usleep(1000);
509 usleep(1000);
509 }
510 }
510 SocExplorerEngine::message(this->plugin,"Exiting Startdundee USB pooling thread",1);
511 SocExplorerEngine::message(this->plugin,"Exiting Startdundee USB pooling thread",1);
511 }
512 }
512
513
513 bool stardundeeSPW_USB_Manager::connectBridge()
514 bool stardundeeSPW_USB_Manager::connectBridge()
514 {
515 {
515 bool ret;
516 bool ret;
516
517
517 if (this->interfaceMode == BRICK_IS_SET_AS_AN_INTERFACE)
518 if (this->interfaceMode == BRICK_IS_SET_AS_AN_INTERFACE)
518 {
519 {
519 ret = connectBridgeAsInterface();
520 ret = connectBridgeAsInterface();
520 }
521 }
521 else if (this->interfaceMode == BRICK_IS_SET_AS_A_ROUTER)
522 else if (this->interfaceMode == BRICK_IS_SET_AS_A_ROUTER)
522 {
523 {
523 ret = connectBridgeAsRouter();
524 ret = connectBridgeAsRouter();
524 }
525 }
525 else
526 else
526 {
527 {
527 ret = false;
528 ret = false;
528 }
529 }
529
530
530 return ret;
531 return ret;
531 }
532 }
532
533
533 bool stardundeeSPW_USB_Manager::connectBridgeAsInterface()
534 bool stardundeeSPW_USB_Manager::connectBridgeAsInterface()
534 {
535 {
535 this->handleMutex->lock();
536 this->handleMutex->lock();
536 int status;
537 int status;
537 U32 statusControl;
538 U32 statusControl;
538 this->connected = false;
539 this->connected = false;
539 if (!USBSpaceWire_Open(&hDevice, this->selectedBrick)) // Open the USB device
540 if (!USBSpaceWire_Open(&hDevice, this->selectedBrick)) // Open the USB device
540 {
541 {
541 SocExplorerEngine::message(this->plugin,"stardundee *** Open *** ERROR: USBSpaceWire_Open(&hDevice, 0))",0);
542 SocExplorerEngine::message(this->plugin,"stardundee *** Open *** ERROR: USBSpaceWire_Open(&hDevice, 0))",0);
542 this->handleMutex->unlock();
543 this->handleMutex->unlock();
543 return false;
544 return false;
544 }
545 }
545 SocExplorerEngine::message(this->plugin,"stardundee *** Open *** USBSpaceWire_Open successful",0);
546 SocExplorerEngine::message(this->plugin,"stardundee *** Open *** USBSpaceWire_Open successful",0);
546
547
547 USBSpaceWire_EnableNetworkMode(hDevice, 0); // deactivate the network mode
548 USBSpaceWire_EnableNetworkMode(hDevice, 0); // deactivate the network mode
548 CFGSpaceWire_EnableRMAP(1); // Enable the use of RMAP for the StarDundee brick configuration
549 CFGSpaceWire_EnableRMAP(1); // Enable the use of RMAP for the StarDundee brick configuration
549 CFGSpaceWire_SetRMAPDestinationKey(0x20); // Set the destination key expected by STAR-Dundee devices
550 CFGSpaceWire_SetRMAPDestinationKey(0x20); // Set the destination key expected by STAR-Dundee devices
550
551
551 // Set the path and return path to the device
552 // Set the path and return path to the device
552 CFGSpaceWire_StackClear();
553 CFGSpaceWire_StackClear();
553 CFGSpaceWire_AddrStackPush(0);
554 CFGSpaceWire_AddrStackPush(0);
554 CFGSpaceWire_AddrStackPush(254);
555 CFGSpaceWire_AddrStackPush(254);
555 CFGSpaceWire_RetAddrStackPush(254);
556 CFGSpaceWire_RetAddrStackPush(254);
556 // set the base transmit rate to 100 MHz
557 // set the base transmit rate to 100 MHz
557 status = CFGSpaceWire_SetBrickBaseTransmitRate( hDevice, CFG_BRK_CLK_100_MHZ, CFG_BRK_DVDR_1, 0xff);
558 status = CFGSpaceWire_SetBrickBaseTransmitRate( hDevice, CFG_BRK_CLK_100_MHZ, CFG_BRK_DVDR_1, 0xff);
558 if (status != CFG_TRANSFER_SUCCESS)
559 if (status != CFG_TRANSFER_SUCCESS)
559 {
560 {
560 SocExplorerEngine::message(this->plugin,"ERROR CFGSpaceWire_SetBrickBaseTransmitRate",1);
561 SocExplorerEngine::message(this->plugin,"ERROR CFGSpaceWire_SetBrickBaseTransmitRate",1);
561 this->handleMutex->unlock();
562 this->handleMutex->unlock();
562 return false;
563 return false;
563 }
564 }
564 else
565 else
565 {
566 {
566 SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_SetBrickBaseTransmitRate, base rate = 100 MHz",1);
567 SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_SetBrickBaseTransmitRate, base rate = 100 MHz",1);
567 }
568 }
568
569
569 // read the link status
570 // read the link status
570 if (CFGSpaceWire_GetLinkStatusControl(hDevice, this->linkNumber, &statusControl) != CFG_TRANSFER_SUCCESS)
571 if (CFGSpaceWire_GetLinkStatusControl(hDevice, this->linkNumber, &statusControl) != CFG_TRANSFER_SUCCESS)
571 {
572 {
572 SocExplorerEngine::message(this->plugin,"Could not read link status control for link " + QString::number(this->linkNumber),1);
573 SocExplorerEngine::message(this->plugin,"Could not read link status control for link " + QString::number(this->linkNumber),1);
573 this->handleMutex->unlock();
574 this->handleMutex->unlock();
574 return false;
575 return false;
575 }
576 }
576 else
577 else
577 {
578 {
578 SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_GetLinkStatusControl of link " + QString::number(this->linkNumber),1);
579 SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_GetLinkStatusControl of link " + QString::number(this->linkNumber),1);
579
580
580 // Set the link status control register properties
581 // Set the link status control register properties
581 CFGSpaceWire_LSEnableAutoStart(&statusControl, 1);
582 CFGSpaceWire_LSEnableAutoStart(&statusControl, 1);
582 CFGSpaceWire_LSEnableStart(&statusControl, 1);
583 CFGSpaceWire_LSEnableStart(&statusControl, 1);
583 CFGSpaceWire_LSEnableDisabled(&statusControl, 0);
584 CFGSpaceWire_LSEnableDisabled(&statusControl, 0);
584 CFGSpaceWire_LSEnableTristate(&statusControl, 0);
585 CFGSpaceWire_LSEnableTristate(&statusControl, 0);
585 CFGSpaceWire_LSSetOperatingSpeed(&statusControl, 9); // sets the link speed to ( 100 MHz / (9+1) ) = 10 MHz
586 CFGSpaceWire_LSSetOperatingSpeed(&statusControl, 9); // sets the link speed to ( 100 MHz / (9+1) ) = 10 MHz
586
587
587 // Set the link status control register
588 // Set the link status control register
588 if (CFGSpaceWire_SetLinkStatusControl(hDevice, this->linkNumber, statusControl) != CFG_TRANSFER_SUCCESS)
589 if (CFGSpaceWire_SetLinkStatusControl(hDevice, this->linkNumber, statusControl) != CFG_TRANSFER_SUCCESS)
589 {
590 {
590 SocExplorerEngine::message(this->plugin,"Could not set the link status control for link " + QString::number(this->linkNumber),1);
591 SocExplorerEngine::message(this->plugin,"Could not set the link status control for link " + QString::number(this->linkNumber),1);
591 this->handleMutex->unlock();
592 this->handleMutex->unlock();
592 return false;
593 return false;
593 }
594 }
594 else
595 else
595 {
596 {
596 SocExplorerEngine::message(this->plugin,"Set the link status control for link " + QString::number(this->linkNumber),1);
597 SocExplorerEngine::message(this->plugin,"Set the link status control for link " + QString::number(this->linkNumber),1);
597 }
598 }
598 }
599 }
599
600
600 if (CFGSpaceWire_SetAsInterface(hDevice, 1, 0) != CFG_TRANSFER_SUCCESS)
601 if (CFGSpaceWire_SetAsInterface(hDevice, 1, 0) != CFG_TRANSFER_SUCCESS)
601 {
602 {
602 SocExplorerEngine::message(this->plugin,"Could not set the device to be an interface",1);
603 SocExplorerEngine::message(this->plugin,"Could not set the device to be an interface",1);
603 this->handleMutex->unlock();
604 this->handleMutex->unlock();
604 return false;
605 return false;
605 }
606 }
606 else
607 else
607 {
608 {
608 SocExplorerEngine::message(this->plugin,"Device set to be an interface",1);
609 SocExplorerEngine::message(this->plugin,"Device set to be an interface",1);
609 }
610 }
610
611
611 USBSpaceWire_RegisterReceiveOnAllPorts(hDevice); // Register to receive on all ports
612 USBSpaceWire_RegisterReceiveOnAllPorts(hDevice); // Register to receive on all ports
612 USBSpaceWire_ClearEndpoints(hDevice); // clear the USB endpoints
613 USBSpaceWire_ClearEndpoints(hDevice); // clear the USB endpoints
613 USBSpaceWire_SetTimeout(hDevice,1.0);
614 USBSpaceWire_SetTimeout(hDevice,1.0);
614 this->handleMutex->unlock();
615 this->handleMutex->unlock();
615 SocExplorerEngine::message(this->plugin,"The driver's current send buffer size is " + QString::number(USBSpaceWire_GetDriverSendBufferSize(hDevice)) + " bytes",1);
616 SocExplorerEngine::message(this->plugin,"The driver's current send buffer size is " + QString::number(USBSpaceWire_GetDriverSendBufferSize(hDevice)) + " bytes",1);
616 SocExplorerEngine::message(this->plugin,"The driver's current read buffer size is " + QString::number(USBSpaceWire_GetDriverReadBufferSize(hDevice)) + " bytes",1);
617 SocExplorerEngine::message(this->plugin,"The driver's current read buffer size is " + QString::number(USBSpaceWire_GetDriverReadBufferSize(hDevice)) + " bytes",1);
617 SocExplorerEngine::message(this->plugin,"USBSpaceWire_IsReadThrottling is " + QString::number(USBSpaceWire_IsReadThrottling(hDevice)),1);
618 SocExplorerEngine::message(this->plugin,"USBSpaceWire_IsReadThrottling is " + QString::number(USBSpaceWire_IsReadThrottling(hDevice)),1);
618 this->connected = true;
619 this->connected = true;
619 return true;
620 return true;
620 }
621 }
621
622
622 bool stardundeeSPW_USB_Manager::connectBridgeAsRouter()
623 bool stardundeeSPW_USB_Manager::connectBridgeAsRouter()
623 {
624 {
624 // QMutexLocker mlock(&this->handleMutex);
625 // QMutexLocker mlock(&this->handleMutex);
625 this->handleMutex->lock();
626 this->handleMutex->lock();
626 int status;
627 int status;
627 U32 statusControl;
628 U32 statusControl;
628 unsigned int linkStatus1;
629 unsigned int linkStatus1;
629 unsigned int linkStatus2;
630 unsigned int linkStatus2;
630 unsigned char linkNumber;
631 unsigned char linkNumber;
631 unsigned char deviceIsAnInterface;
632 unsigned char deviceIsAnInterface;
632
633
633 if (!USBSpaceWire_Open(&hDevice, this->selectedBrick)) // Open the USB device
634 if (!USBSpaceWire_Open(&hDevice, this->selectedBrick)) // Open the USB device
634 {
635 {
635 SocExplorerEngine::message(this->plugin,"stardundee *** Open *** ERROR: USBSpaceWire_Open(&hDevice, 0))");
636 SocExplorerEngine::message(this->plugin,"stardundee *** Open *** ERROR: USBSpaceWire_Open(&hDevice, 0))");
636 this->handleMutex->unlock();
637 this->handleMutex->unlock();
637 return false;
638 return false;
638 }
639 }
639 SocExplorerEngine::message(this->plugin,"stardundee *** Open *** USBSpaceWire_Open successful, device number: "
640 SocExplorerEngine::message(this->plugin,"stardundee *** Open *** USBSpaceWire_Open successful, device number: "
640 + QString::number(this->selectedBrick));
641 + QString::number(this->selectedBrick));
641
642
642 USBSpaceWire_EnableNetworkMode(hDevice, 0); // deactivate the network mode
643 USBSpaceWire_EnableNetworkMode(hDevice, 0); // deactivate the network mode
643 CFGSpaceWire_EnableRMAP(1); // Enable the use of RMAP for the StarDundee brick configuration
644 CFGSpaceWire_EnableRMAP(1); // Enable the use of RMAP for the StarDundee brick configuration
644 CFGSpaceWire_SetRMAPDestinationKey(0x20); // Set the destination key expected by STAR-Dundee devices
645 CFGSpaceWire_SetRMAPDestinationKey(0x20); // Set the destination key expected by STAR-Dundee devices
645
646
646 // Set the path and return path to the device
647 // Set the path and return path to the device
647 // This affects just the operations performed by the Configuration Library and does not affect the packets
648 // This affects just the operations performed by the Configuration Library and does not affect the packets
648 // sent and received using the driver API.
649 // sent and received using the driver API.
649 CFGSpaceWire_StackClear();
650 CFGSpaceWire_StackClear();
650 CFGSpaceWire_AddrStackPush(0);
651 CFGSpaceWire_AddrStackPush(0);
651 CFGSpaceWire_AddrStackPush(254);
652 CFGSpaceWire_AddrStackPush(254);
652 CFGSpaceWire_RetAddrStackPush(254);
653 CFGSpaceWire_RetAddrStackPush(254);
653
654
654 // set the base transmit rate to 100 MHz
655 // set the base transmit rate to 100 MHz
655 status = CFGSpaceWire_SetBrickBaseTransmitRate( hDevice, CFG_BRK_CLK_100_MHZ, CFG_BRK_DVDR_1, 0xff);
656 status = CFGSpaceWire_SetBrickBaseTransmitRate( hDevice, CFG_BRK_CLK_100_MHZ, CFG_BRK_DVDR_1, 0xff);
656 if (status != CFG_TRANSFER_SUCCESS)
657 if (status != CFG_TRANSFER_SUCCESS)
657 {
658 {
658 SocExplorerEngine::message(this->plugin,"ERROR CFGSpaceWire_SetBrickBaseTransmitRate");
659 SocExplorerEngine::message(this->plugin,"ERROR CFGSpaceWire_SetBrickBaseTransmitRate");
659 }
660 }
660 else SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_SetBrickBaseTransmitRate, base rate = 100 MHz");
661 else SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_SetBrickBaseTransmitRate, base rate = 100 MHz");
661
662
662 //*********************
663 //*********************
663 // LINK 1 CONFIGURATION
664 // LINK 1 CONFIGURATION
664 linkNumber = 1;
665 linkNumber = 1;
665 if (CFGSpaceWire_GetLinkStatusControl(hDevice, linkNumber, &statusControl) != CFG_TRANSFER_SUCCESS)
666 if (CFGSpaceWire_GetLinkStatusControl(hDevice, linkNumber, &statusControl) != CFG_TRANSFER_SUCCESS)
666 SocExplorerEngine::message(this->plugin,"Could not read link status control for link " + QString::number(linkNumber));
667 SocExplorerEngine::message(this->plugin,"Could not read link status control for link " + QString::number(linkNumber));
667 else
668 else
668 {
669 {
669 SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_GetLinkStatusControl of link " + QString::number(linkNumber));
670 SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_GetLinkStatusControl of link " + QString::number(linkNumber));
670
671
671 // Set the link status control register properties
672 // Set the link status control register properties
672 CFGSpaceWire_LSEnableAutoStart(&statusControl, 1);
673 CFGSpaceWire_LSEnableAutoStart(&statusControl, 1);
673 CFGSpaceWire_LSEnableStart(&statusControl, 1);
674 CFGSpaceWire_LSEnableStart(&statusControl, 1);
674 CFGSpaceWire_LSEnableDisabled(&statusControl, 0);
675 CFGSpaceWire_LSEnableDisabled(&statusControl, 0);
675 CFGSpaceWire_LSEnableTristate(&statusControl, 0);
676 CFGSpaceWire_LSEnableTristate(&statusControl, 0);
676 CFGSpaceWire_LSSetOperatingSpeed(&statusControl, 9); // sets the link speed to ( 100 MHz / (9+1) ) = 10 MHz
677 CFGSpaceWire_LSSetOperatingSpeed(&statusControl, 9); // sets the link speed to ( 100 MHz / (9+1) ) = 10 MHz
677
678
678 // Set the link status control register
679 // Set the link status control register
679 if (CFGSpaceWire_SetLinkStatusControl(hDevice, linkNumber, statusControl) != CFG_TRANSFER_SUCCESS)
680 if (CFGSpaceWire_SetLinkStatusControl(hDevice, linkNumber, statusControl) != CFG_TRANSFER_SUCCESS)
680 SocExplorerEngine::message(this->plugin,"Could not set the link status control for link " + QString::number(linkNumber));
681 SocExplorerEngine::message(this->plugin,"Could not set the link status control for link " + QString::number(linkNumber));
681 else
682 else
682 SocExplorerEngine::message(this->plugin,"link status control for link " + QString::number(0x01) + " is set");
683 SocExplorerEngine::message(this->plugin,"link status control for link " + QString::number(0x01) + " is set");
683 }
684 }
684
685
685 //*********************
686 //*********************
686 // LINK 2 CONFIGURATION
687 // LINK 2 CONFIGURATION
687 linkNumber = 2;
688 linkNumber = 2;
688 if (CFGSpaceWire_GetLinkStatusControl(hDevice, linkNumber, &statusControl) != CFG_TRANSFER_SUCCESS)
689 if (CFGSpaceWire_GetLinkStatusControl(hDevice, linkNumber, &statusControl) != CFG_TRANSFER_SUCCESS)
689 SocExplorerEngine::message(this->plugin,"Could not read link status control for link " + QString::number(linkNumber));
690 SocExplorerEngine::message(this->plugin,"Could not read link status control for link " + QString::number(linkNumber));
690 else
691 else
691 {
692 {
692 SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_GetLinkStatusControl of link " + QString::number(linkNumber));
693 SocExplorerEngine::message(this->plugin,"OK CFGSpaceWire_GetLinkStatusControl of link " + QString::number(linkNumber));
693
694
694 // Set the link status control register properties
695 // Set the link status control register properties
695 CFGSpaceWire_LSEnableAutoStart(&statusControl, 1);
696 CFGSpaceWire_LSEnableAutoStart(&statusControl, 1);
696 CFGSpaceWire_LSEnableStart(&statusControl, 1);
697 CFGSpaceWire_LSEnableStart(&statusControl, 1);
697 CFGSpaceWire_LSEnableDisabled(&statusControl, 0);
698 CFGSpaceWire_LSEnableDisabled(&statusControl, 0);
698 CFGSpaceWire_LSEnableTristate(&statusControl, 0);
699 CFGSpaceWire_LSEnableTristate(&statusControl, 0);
699 CFGSpaceWire_LSSetOperatingSpeed(&statusControl, 9); // sets the link speed to ( 100 MHz / (9+1) ) = 10 MHz
700 CFGSpaceWire_LSSetOperatingSpeed(&statusControl, 9); // sets the link speed to ( 100 MHz / (9+1) ) = 10 MHz
700
701
701 // Set the link status control register
702 // Set the link status control register
702 if (CFGSpaceWire_SetLinkStatusControl(hDevice, linkNumber, statusControl) != CFG_TRANSFER_SUCCESS)
703 if (CFGSpaceWire_SetLinkStatusControl(hDevice, linkNumber, statusControl) != CFG_TRANSFER_SUCCESS)
703 SocExplorerEngine::message(this->plugin,"Could not set the link status control for link " + QString::number(linkNumber));
704 SocExplorerEngine::message(this->plugin,"Could not set the link status control for link " + QString::number(linkNumber));
704 else
705 else
705 SocExplorerEngine::message(this->plugin,"link status control for link " + QString::number(linkNumber) + " is set");
706 SocExplorerEngine::message(this->plugin,"link status control for link " + QString::number(linkNumber) + " is set");
706 }
707 }
707
708
708 //***************************
709 //***************************
709 // SET THE DEVICE AS A ROUTER
710 // SET THE DEVICE AS A ROUTER
710 deviceIsAnInterface = 0; // 0 = router, 1 = interface
711 deviceIsAnInterface = 0; // 0 = router, 1 = interface
711 if (CFGSpaceWire_SetAsInterface(hDevice, deviceIsAnInterface, 0) != CFG_TRANSFER_SUCCESS)
712 if (CFGSpaceWire_SetAsInterface(hDevice, deviceIsAnInterface, 0) != CFG_TRANSFER_SUCCESS)
712 SocExplorerEngine::message(this->plugin,"Could not set the device to be an interface");
713 SocExplorerEngine::message(this->plugin,"Could not set the device to be an interface");
713 else
714 else
714 SocExplorerEngine::message(this->plugin,"Device is an interface: " + QString::number(deviceIsAnInterface) + " (1 => true, 0 => false)");
715 SocExplorerEngine::message(this->plugin,"Device is an interface: " + QString::number(deviceIsAnInterface) + " (1 => true, 0 => false)");
715
716
716 setRoutingTableEntry(0xfe, 0x02, 0); // [0010] => route 0xfe on port 1
717 setRoutingTableEntry(0xfe, 0x02, 0); // [0010] => route 0xfe on port 1
717 setRoutingTableEntry(32 , 0x08, 0); // [1000] => route 32 on port 3
718 setRoutingTableEntry(32 , 0x08, 0); // [1000] => route 32 on port 3
718
719
719 USBSpaceWire_RegisterReceiveOnAllPorts(hDevice); // Register to receive on port 1 only
720 USBSpaceWire_RegisterReceiveOnAllPorts(hDevice); // Register to receive on port 1 only
720 USBSpaceWire_ClearEndpoints(hDevice); // clear the USB endpoints
721 USBSpaceWire_ClearEndpoints(hDevice); // clear the USB endpoints
721
722
722 SocExplorerEngine::message(this->plugin,"The driver's current send buffer size is " + QString::number(USBSpaceWire_GetDriverSendBufferSize(hDevice)) + " bytes");
723 SocExplorerEngine::message(this->plugin,"The driver's current send buffer size is " + QString::number(USBSpaceWire_GetDriverSendBufferSize(hDevice)) + " bytes");
723 SocExplorerEngine::message(this->plugin,"The driver's current read buffer size is " + QString::number(USBSpaceWire_GetDriverReadBufferSize(hDevice)) + " bytes");
724 SocExplorerEngine::message(this->plugin,"The driver's current read buffer size is " + QString::number(USBSpaceWire_GetDriverReadBufferSize(hDevice)) + " bytes");
724 SocExplorerEngine::message(this->plugin,"USBSpaceWire_IsReadThrottling is " + QString::number(USBSpaceWire_IsReadThrottling(hDevice)));
725 SocExplorerEngine::message(this->plugin,"USBSpaceWire_IsReadThrottling is " + QString::number(USBSpaceWire_IsReadThrottling(hDevice)));
725
726
726 //************
727 //************
727 // test Link 1 and Link 2
728 // test Link 1 and Link 2
728 linkStatus1 = getLinkStatus(0x01);
729 linkStatus1 = getLinkStatus(0x01);
729 linkStatus2 = getLinkStatus(0x02);
730 linkStatus2 = getLinkStatus(0x02);
730 this->handleMutex->unlock();
731 this->handleMutex->unlock();
731
732
732 if ((linkStatus1==1) || (linkStatus2==1))
733 if ((linkStatus1==1) || (linkStatus2==1))
733 {
734 {
734 initializeTimecodeGeneration();
735 initializeTimecodeGeneration();
735 this->connected=true;
736 this->connected=true;
736 return true;
737 return true;
737 }
738 }
738 else
739 else
739 {
740 {
740 statusLink1->setText("Link 1 status code: " + QString::number(linkStatus1));
741 statusLink1->setText("Link 1 status code: " + QString::number(linkStatus1));
741 statusLink2->setText("Link 2 status code: " + QString::number(linkStatus2));
742 statusLink2->setText("Link 2 status code: " + QString::number(linkStatus2));
742 starDundeeStatusQueryDialog->exec();
743 starDundeeStatusQueryDialog->exec();
743 this->connected = false;
744 this->connected = false;
744 return false;
745 return false;
745 }
746 }
746 }
747 }
747
748
748 void stardundeeSPW_USB_Manager::initDialog( void )
749 void stardundeeSPW_USB_Manager::initDialog( void )
749 {
750 {
750 // STAR DUNDEE STATUS QUERY DIALOG
751 // STAR DUNDEE STATUS QUERY DIALOG
751 starDundeeStatusQueryDialog = new QDialog;
752 starDundeeStatusQueryDialog = new QDialog;
752 starDundeeStatusQueryDialogLayout = new QGridLayout;
753 starDundeeStatusQueryDialogLayout = new QGridLayout;
753 starDundeeStatusQueryDialogLabel = new QLabel(tr("SpaceWire links state"));
754 starDundeeStatusQueryDialogLabel = new QLabel(tr("SpaceWire links state"));
754 starDundeeStatusQueryContinueButton = new QPushButton(tr("Continue"));
755 starDundeeStatusQueryContinueButton = new QPushButton(tr("Continue"));
755 starDundeeStatusQueryRetryButton = new QPushButton(tr("Retry"));
756 starDundeeStatusQueryRetryButton = new QPushButton(tr("Retry"));
756 starDundeeStatusQueryAbortButton = new QPushButton(tr("Abort"));
757 starDundeeStatusQueryAbortButton = new QPushButton(tr("Abort"));
757 statusLink1 = new QLabel(tr("Link 1 status code: -"));
758 statusLink1 = new QLabel(tr("Link 1 status code: -"));
758 statusLink2 = new QLabel(tr("Link 2 status code: -"));
759 statusLink2 = new QLabel(tr("Link 2 status code: -"));
759
760
760 starDundeeStatusQueryDialogLayout->addWidget(starDundeeStatusQueryDialogLabel, 0, 0, 1, 2);
761 starDundeeStatusQueryDialogLayout->addWidget(starDundeeStatusQueryDialogLabel, 0, 0, 1, 2);
761 starDundeeStatusQueryDialogLayout->addWidget(starDundeeStatusQueryContinueButton, 1, 0, 0);
762 starDundeeStatusQueryDialogLayout->addWidget(starDundeeStatusQueryContinueButton, 1, 0, 0);
762 starDundeeStatusQueryDialogLayout->addWidget(starDundeeStatusQueryRetryButton, 1, 1, 0);
763 starDundeeStatusQueryDialogLayout->addWidget(starDundeeStatusQueryRetryButton, 1, 1, 0);
763 starDundeeStatusQueryDialogLayout->addWidget(starDundeeStatusQueryAbortButton, 1, 2, 0);
764 starDundeeStatusQueryDialogLayout->addWidget(starDundeeStatusQueryAbortButton, 1, 2, 0);
764 starDundeeStatusQueryDialogLayout->addWidget(statusLink1, 2, 0, 0);
765 starDundeeStatusQueryDialogLayout->addWidget(statusLink1, 2, 0, 0);
765 starDundeeStatusQueryDialogLayout->addWidget(statusLink2, 3, 0, 0);
766 starDundeeStatusQueryDialogLayout->addWidget(statusLink2, 3, 0, 0);
766 starDundeeStatusQueryDialog->setLayout(starDundeeStatusQueryDialogLayout);
767 starDundeeStatusQueryDialog->setLayout(starDundeeStatusQueryDialogLayout);
767 }
768 }
768
769
769 unsigned char stardundeeSPW_USB_Manager::setRoutingTableEntry(int tableEntry, U32 dwOutputPorts, char bDelHead)
770 unsigned char stardundeeSPW_USB_Manager::setRoutingTableEntry(int tableEntry, U32 dwOutputPorts, char bDelHead)
770 {
771 {
771 U32 routingTableEntry;
772 U32 routingTableEntry;
772 // SET THE ROUTING TABLE ENTRY FOR LOGICAL ADDRESSING, TARGET entryNumber
773 // SET THE ROUTING TABLE ENTRY FOR LOGICAL ADDRESSING, TARGET entryNumber
773 if (CFGSpaceWire_ClearRoutingTableEntry(hDevice, tableEntry) != CFG_TRANSFER_SUCCESS)
774 if (CFGSpaceWire_ClearRoutingTableEntry(hDevice, tableEntry) != CFG_TRANSFER_SUCCESS)
774 {
775 {
775 SocExplorerEngine::message(this->plugin,"Could not clear routing table entry " + QString::number(tableEntry));
776 SocExplorerEngine::message(this->plugin,"Could not clear routing table entry " + QString::number(tableEntry));
776 }
777 }
777 // Build the routing table entry
778 // Build the routing table entry
778 CFGSpaceWire_RTBuildRoutingTableEntry(&routingTableEntry,
779 CFGSpaceWire_RTBuildRoutingTableEntry(&routingTableEntry,
779 dwOutputPorts, // route out of port dwOutputPorts
780 dwOutputPorts, // route out of port dwOutputPorts
780 bDelHead, // header deletion is enabled [1] or disabled [0]
781 bDelHead, // header deletion is enabled [1] or disabled [0]
781 0); // priority normal
782 0); // priority normal
782 // Set the routing table entry for logical address tableEntry
783 // Set the routing table entry for logical address tableEntry
783 if (CFGSpaceWire_SetRoutingTableEntry(hDevice, tableEntry, routingTableEntry) != CFG_TRANSFER_SUCCESS)
784 if (CFGSpaceWire_SetRoutingTableEntry(hDevice, tableEntry, routingTableEntry) != CFG_TRANSFER_SUCCESS)
784 {
785 {
785 SocExplorerEngine::message(this->plugin,"Could not set routing table entry [" + QString::number(tableEntry) + "]");
786 SocExplorerEngine::message(this->plugin,"Could not set routing table entry [" + QString::number(tableEntry) + "]");
786 }
787 }
787 else SocExplorerEngine::message(this->plugin,"Routing table entry [" + QString::number(tableEntry) + "] set" );
788 else SocExplorerEngine::message(this->plugin,"Routing table entry [" + QString::number(tableEntry) + "] set" );
788 return 1;
789 return 1;
789 }
790 }
790
791
791 unsigned int stardundeeSPW_USB_Manager::getRoutingTableEntry(int tableEntry)
792 unsigned int stardundeeSPW_USB_Manager::getRoutingTableEntry(int tableEntry)
792 {
793 {
793 U32 routingTableEntry, outputPorts;
794 U32 routingTableEntry, outputPorts;
794 char enabled, delHead, priority;
795 char enabled, delHead, priority;
795 int portNum;
796 int portNum;
796
797
797 SocExplorerEngine::message(this->plugin,"GetRoutingTableEntry [" + QString::number(tableEntry) + "]");
798 SocExplorerEngine::message(this->plugin,"GetRoutingTableEntry [" + QString::number(tableEntry) + "]");
798 // Read the routing table entry
799 // Read the routing table entry
799 if (CFGSpaceWire_GetRoutingTableEntry(hDevice, tableEntry, &routingTableEntry) != CFG_TRANSFER_SUCCESS)
800 if (CFGSpaceWire_GetRoutingTableEntry(hDevice, tableEntry, &routingTableEntry) != CFG_TRANSFER_SUCCESS)
800 {
801 {
801 SocExplorerEngine::message(this->plugin,"Could not read routing table entry [" + QString::number(tableEntry) + "]");
802 SocExplorerEngine::message(this->plugin,"Could not read routing table entry [" + QString::number(tableEntry) + "]");
802 }
803 }
803 else
804 else
804 {
805 {
805 // Display the routing table entry properties
806 // Display the routing table entry properties
806 CFGSpaceWire_RTIsEnabled(routingTableEntry, &enabled);
807 CFGSpaceWire_RTIsEnabled(routingTableEntry, &enabled);
807 CFGSpaceWire_RTIsDelHead(routingTableEntry, &delHead);
808 CFGSpaceWire_RTIsDelHead(routingTableEntry, &delHead);
808 CFGSpaceWire_RTIsPriority(routingTableEntry, &priority);
809 CFGSpaceWire_RTIsPriority(routingTableEntry, &priority);
809 CFGSpaceWire_RTGetOutputPorts(routingTableEntry, &outputPorts);
810 CFGSpaceWire_RTGetOutputPorts(routingTableEntry, &outputPorts);
810 SocExplorerEngine::message(this->plugin,"CFGSpaceWire_RTIsEnabled : " + QString::number(enabled));
811 SocExplorerEngine::message(this->plugin,"CFGSpaceWire_RTIsEnabled : " + QString::number(enabled));
811 SocExplorerEngine::message(this->plugin,"CFGSpaceWire_RTIsDelHead : " + QString::number(delHead));
812 SocExplorerEngine::message(this->plugin,"CFGSpaceWire_RTIsDelHead : " + QString::number(delHead));
812 SocExplorerEngine::message(this->plugin,"CFGSpaceWire_RTIsPriority : " + QString::number(priority));
813 SocExplorerEngine::message(this->plugin,"CFGSpaceWire_RTIsPriority : " + QString::number(priority));
813 SocExplorerEngine::message(this->plugin,"CFGSpaceWire_RTGetOutputPorts : ");
814 SocExplorerEngine::message(this->plugin,"CFGSpaceWire_RTGetOutputPorts : ");
814 for (portNum = 0; portNum < 32; portNum++)
815 for (portNum = 0; portNum < 32; portNum++)
815 {
816 {
816 if (outputPorts & (1 << portNum))
817 if (outputPorts & (1 << portNum))
817 {
818 {
818 SocExplorerEngine::message(this->plugin,QString::number(portNum));
819 SocExplorerEngine::message(this->plugin,QString::number(portNum));
819 }
820 }
820 }
821 }
821 }
822 }
822
823
823 return 1;
824 return 1;
824 }
825 }
825
826
826 void stardundeeSPW_USB_Manager::initializeTimecodeGeneration()
827 void stardundeeSPW_USB_Manager::initializeTimecodeGeneration()
827 {
828 {
828 U32 dwTickEnableStatus;
829 U32 dwTickEnableStatus;
829 U32 rtr_clk_freq;
830 U32 rtr_clk_freq;
830
831
831 // (1) RESET
832 // (1) RESET
832 if (!USBSpaceWire_TC_Reset(hDevice))
833 if (!USBSpaceWire_TC_Reset(hDevice))
833 SocExplorerEngine::message(this->plugin,"ERR *** in Open *** Could not reset timecodes\n");
834 SocExplorerEngine::message(this->plugin,"ERR *** in Open *** Could not reset timecodes\n");
834
835
835 // (2) Clear the tick enable register
836 // (2) Clear the tick enable register
836 if (CFGSpaceWire_SetTickEnableStatus(hDevice, 6) != CFG_TRANSFER_SUCCESS)
837 if (CFGSpaceWire_SetTickEnableStatus(hDevice, 6) != CFG_TRANSFER_SUCCESS)
837 SocExplorerEngine::message(this->plugin,"Could not clear the tick enable register");
838 SocExplorerEngine::message(this->plugin,"Could not clear the tick enable register");
838 else
839 else
839 SocExplorerEngine::message(this->plugin,"Cleared the tick enable register");
840 SocExplorerEngine::message(this->plugin,"Cleared the tick enable register");
840
841
841 // (3) get the tick status
842 // (3) get the tick status
842 CFGSpaceWire_GetTickEnableStatus(hDevice, &dwTickEnableStatus);
843 CFGSpaceWire_GetTickEnableStatus(hDevice, &dwTickEnableStatus);
843 SocExplorerEngine::message(this->plugin,"OK *** in Open *** CFGSpaceWire_GetTickEnableStatus, code is " + QString::number(dwTickEnableStatus, 2));
844 SocExplorerEngine::message(this->plugin,"OK *** in Open *** CFGSpaceWire_GetTickEnableStatus, code is " + QString::number(dwTickEnableStatus, 2));
844
845
845 // (4) enable external timecode selection
846 // (4) enable external timecode selection
846 if(!USBSpaceWire_TC_EnableExternalTimecodeSelection(hDevice,0))
847 if(!USBSpaceWire_TC_EnableExternalTimecodeSelection(hDevice,0))
847 SocExplorerEngine::message(this->plugin,"ERR *** disable external timecode selection");
848 SocExplorerEngine::message(this->plugin,"ERR *** disable external timecode selection");
848
849
849 rtr_clk_freq = USBSpaceWire_TC_GetClockFrequency(hDevice);
850 rtr_clk_freq = USBSpaceWire_TC_GetClockFrequency(hDevice);
850
851
851 SocExplorerEngine::message(this->plugin,"clock frequency = " + QString::number(rtr_clk_freq) );
852 SocExplorerEngine::message(this->plugin,"clock frequency = " + QString::number(rtr_clk_freq) );
852
853
853 //**************************************************
854 //**************************************************
854 // auto _ tick _ freq = rtr _ clk _ freq / freqCount
855 // auto _ tick _ freq = rtr _ clk _ freq / freqCount
855 if (!USBSpaceWire_TC_SetAutoTickInFrequency(hDevice, rtr_clk_freq) )
856 if (!USBSpaceWire_TC_SetAutoTickInFrequency(hDevice, rtr_clk_freq) )
856 SocExplorerEngine::message(this->plugin,"Could not set the tick-in frequency");
857 SocExplorerEngine::message(this->plugin,"Could not set the tick-in frequency");
857 }
858 }
858
859
859 unsigned int stardundeeSPW_USB_Manager::getLinkStatus(unsigned char link)
860 unsigned int stardundeeSPW_USB_Manager::getLinkStatus(unsigned char link)
860 {
861 {
861 U32 statusControl, errorStatus, portType;
862 U32 statusControl, errorStatus, portType;
862 U32 linkStatus=0, operatingSpeed, outputPortConnection;
863 U32 linkStatus=0, operatingSpeed, outputPortConnection;
863 char isLinkRunning, isAutoStart, isStart, isDisabled, isTristate;
864 char isLinkRunning, isAutoStart, isStart, isDisabled, isTristate;
864
865
865 // Read the link status control register
866 // Read the link status control register
866 if (CFGSpaceWire_GetLinkStatusControl(hDevice, link, &statusControl) != CFG_TRANSFER_SUCCESS)
867 if (CFGSpaceWire_GetLinkStatusControl(hDevice, link, &statusControl) != CFG_TRANSFER_SUCCESS)
867 {
868 {
868 SocExplorerEngine::message(this->plugin,"Could not read link status control for link" + QString::number(link));
869 SocExplorerEngine::message(this->plugin,"Could not read link status control for link" + QString::number(link));
869 }
870 }
870 else
871 else
871 {
872 {
872 // Display the link status control register properties
873 // Display the link status control register properties
873 CFGSpaceWire_LSPortType(statusControl, &portType);
874 CFGSpaceWire_LSPortType(statusControl, &portType);
874 if (portType == CFG_CONFIGURATION_PORT)
875 if (portType == CFG_CONFIGURATION_PORT)
875 {
876 {
876 CFGSpaceWire_LSConfigErrorStatus(statusControl, &errorStatus);
877 CFGSpaceWire_LSConfigErrorStatus(statusControl, &errorStatus);
877 }
878 }
878 else if (portType == CFG_SPACEWIRE_EXTERNAL_PORT)
879 else if (portType == CFG_SPACEWIRE_EXTERNAL_PORT)
879 {
880 {
880 CFGSpaceWire_LSExternalErrorStatus(statusControl, &errorStatus);
881 CFGSpaceWire_LSExternalErrorStatus(statusControl, &errorStatus);
881 }
882 }
882 else
883 else
883 {
884 {
884 CFGSpaceWire_LSErrorStatus(statusControl, &errorStatus);
885 CFGSpaceWire_LSErrorStatus(statusControl, &errorStatus);
885 }
886 }
886 CFGSpaceWire_LSLinkState(statusControl, &linkStatus);
887 CFGSpaceWire_LSLinkState(statusControl, &linkStatus);
887 CFGSpaceWire_LSIsLinkRunning(statusControl, &isLinkRunning);
888 CFGSpaceWire_LSIsLinkRunning(statusControl, &isLinkRunning);
888 CFGSpaceWire_LSIsAutoStart(statusControl, &isAutoStart);
889 CFGSpaceWire_LSIsAutoStart(statusControl, &isAutoStart);
889 CFGSpaceWire_LSIsStart(statusControl, &isStart);
890 CFGSpaceWire_LSIsStart(statusControl, &isStart);
890 CFGSpaceWire_LSIsDisabled(statusControl, &isDisabled);
891 CFGSpaceWire_LSIsDisabled(statusControl, &isDisabled);
891 CFGSpaceWire_LSIsTristate(statusControl, &isTristate);
892 CFGSpaceWire_LSIsTristate(statusControl, &isTristate);
892 CFGSpaceWire_LSOperatingSpeed(statusControl, &operatingSpeed);
893 CFGSpaceWire_LSOperatingSpeed(statusControl, &operatingSpeed);
893 CFGSpaceWire_LSOutputPortConnection(statusControl, &outputPortConnection);
894 CFGSpaceWire_LSOutputPortConnection(statusControl, &outputPortConnection);
894 }
895 }
895 SocExplorerEngine::message(this->plugin,"status of link " + QString::number(link)
896 SocExplorerEngine::message(this->plugin,"status of link " + QString::number(link)
896 +" is " + dwLinkStatusQString[linkStatus]);
897 +" is " + dwLinkStatusQString[linkStatus]);
897 if (linkStatus == 5)
898 if (linkStatus == 5)
898 {
899 {
899 return 1;
900 return 1;
900 }
901 }
901 else return 0;
902 else return 0;
902 }
903 }
903
904
904 bool stardundeeSPW_USB_Manager::disconnectBridge()
905 bool stardundeeSPW_USB_Manager::disconnectBridge()
905 {
906 {
906 this->handleMutex->lock();
907 this->handleMutex->lock();
907 USBSpaceWire_UnregisterReceiveOnAllPorts(hDevice); // Stop receiving on all ports
908 USBSpaceWire_UnregisterReceiveOnAllPorts(hDevice); // Stop receiving on all ports
908 USBSpaceWire_Close(hDevice); // Close the device
909 USBSpaceWire_Close(hDevice); // Close the device
909 SocExplorerEngine::message(this->plugin,"stardundee *** Close *** USBSpaceWire_Close, device: " + QString::number(0),0);
910 SocExplorerEngine::message(this->plugin,"stardundee *** Close *** USBSpaceWire_Close, device: " + QString::number(0),0);
910 this->handleMutex->unlock();
911 this->handleMutex->unlock();
911 this->RMAP_pending_transaction_IDsMtx->lock();
912 this->RMAP_pending_transaction_IDsMtx->lock();
912 this->RMAP_pending_transaction_IDs.clear();
913 this->RMAP_pending_transaction_IDs.clear();
913 this->RMAP_pending_transaction_IDsMtx->unlock();
914 this->RMAP_pending_transaction_IDsMtx->unlock();
914 this->RMAP_AnswersMtx->lock();
915 this->RMAP_AnswersMtx->lock();
915 this->RMAP_Answers.clear();
916 this->RMAP_Answers.clear();
916 this->RMAP_AnswersMtx->unlock();
917 this->RMAP_AnswersMtx->unlock();
917 this->RMAP_AnswersSem->acquire(this->RMAP_AnswersSem->available());
918 this->RMAP_AnswersSem->acquire(this->RMAP_AnswersSem->available());
918 this->connected=false;
919 this->connected=false;
919 return true;
920 return true;
920 }
921 }
921
922
922 bool stardundeeSPW_USB_Manager::sendPacket(char *packet, int size)
923 bool stardundeeSPW_USB_Manager::sendPacket(char *packet, int size)
923 {
924 {
924 char protocoleIdentifier;
925 char protocoleIdentifier;
925 USB_SPACEWIRE_STATUS result=TRANSFER_ERROR_NOT_FOUND;
926 USB_SPACEWIRE_STATUS result=TRANSFER_ERROR_NOT_FOUND;
926 USB_SPACEWIRE_ID pIdentifier;
927 USB_SPACEWIRE_ID pIdentifier;
927 SocExplorerEngine::message(this->plugin,"Sending SPW packet",2);
928 SocExplorerEngine::message(this->plugin,"Sending SPW packet",2);
928 this->handleMutex->lock();
929 this->handleMutex->lock();
929 result = USBSpaceWire_SendPacket(hDevice,packet,size,1, &pIdentifier);
930 result = USBSpaceWire_SendPacket(hDevice,packet,size,1, &pIdentifier);
930 USBSpaceWire_FreeSend(hDevice, pIdentifier);
931 USBSpaceWire_FreeSend(hDevice, pIdentifier);
931 this->handleMutex->unlock();
932 this->handleMutex->unlock();
932 if (result != TRANSFER_SUCCESS)
933 if (result != TRANSFER_SUCCESS)
933 {
934 {
934 SocExplorerEngine::message(this->plugin,"ERR sending the READ command ",2);
935 SocExplorerEngine::message(this->plugin,"ERR sending the READ command ",2);
935 return false;
936 return false;
936 }
937 }
937 else
938 else
938 {
939 {
939 emit bytesTransmittedToSpw( size-1 ); // -1 is for removing the first bytes added to the packet to route to the right link
940 emit bytesTransmittedToSpw( size-1 ); // -1 is for removing the first bytes added to the packet to route to the right link
940 // read the protocole identifier
941 // read the protocole identifier
941 protocoleIdentifier = packet[2];
942 protocoleIdentifier = packet[2];
942 if (protocoleIdentifier == SPW_PROTO_ID_CCSDS)
943 if (protocoleIdentifier == SPW_PROTO_ID_CCSDS)
943 emit ccsdsPacketTransmittedToSpw();
944 emit ccsdsPacketTransmittedToSpw();
944
945
945 SocExplorerEngine::message(this->plugin,"Packet sent",2);
946 SocExplorerEngine::message(this->plugin,"Packet sent",2);
946 }
947 }
947 return true;
948 return true;
948 }
949 }
949
950
950
951
951 void stardundeeSPW_USB_Manager::sendTimecodePeriodically( bool onOff )
952 void stardundeeSPW_USB_Manager::sendTimecodePeriodically( bool onOff )
952 {
953 {
953 this->handleMutex->lock();
954 this->handleMutex->lock();
954 if (onOff == true)
955 if (onOff == true)
955 {
956 {
956 if (!USBSpaceWire_TC_EnableAutoTickIn(hDevice, 1, 1))
957 if (!USBSpaceWire_TC_EnableAutoTickIn(hDevice, 1, 1))
957 SocExplorerEngine::message(this->plugin,"Could not enable auto tick-in");
958 SocExplorerEngine::message(this->plugin,"Could not enable auto tick-in");
958 }
959 }
959 else
960 else
960 {
961 {
961 if (!USBSpaceWire_TC_EnableAutoTickIn(hDevice, 0, 0))
962 if (!USBSpaceWire_TC_EnableAutoTickIn(hDevice, 0, 0))
962 SocExplorerEngine::message(this->plugin,"Could not disable auto tick-in");
963 SocExplorerEngine::message(this->plugin,"Could not disable auto tick-in");
963 }
964 }
964 this->handleMutex->unlock();
965 this->handleMutex->unlock();
965 }
966 }
966
967
967 int stardundeeSPW_USB_Manager::getLinkNumber( void )
968 int stardundeeSPW_USB_Manager::getLinkNumber( void )
968 {
969 {
969 return this->linkNumber;
970 return this->linkNumber;
970 }
971 }
971
972
972 void stardundeeSPW_USB_Manager::setTimecodeFrequency(double requestedFrequency)
973 void stardundeeSPW_USB_Manager::setTimecodeFrequency(double requestedFrequency)
973 {
974 {
974 U32 rtr_clk_freq=0;
975 U32 rtr_clk_freq=0;
975 U32 freqCount=0;
976 U32 freqCount=0;
976 double freqCountInDouble=0.0;
977 double freqCountInDouble=0.0;
977 double currentFrequency=0.0;
978 double currentFrequency=0.0;
978
979
979 this->handleMutex->lock();
980 this->handleMutex->lock();
980 rtr_clk_freq = USBSpaceWire_TC_GetClockFrequency(hDevice);
981 rtr_clk_freq = USBSpaceWire_TC_GetClockFrequency(hDevice);
981 freqCountInDouble = ((double) rtr_clk_freq) / requestedFrequency;
982 freqCountInDouble = ((double) rtr_clk_freq) / requestedFrequency;
982 freqCount = (unsigned int) freqCountInDouble;
983 freqCount = (unsigned int) freqCountInDouble;
983
984
984 currentFrequency = ((double) rtr_clk_freq) / ((double) freqCount);
985 currentFrequency = ((double) rtr_clk_freq) / ((double) freqCount);
985
986
986 //**************************************************
987 //**************************************************
987 // auto _ tick _ freq = rtr _ clk _ freq / freqCount
988 // auto _ tick _ freq = rtr _ clk _ freq / freqCount
988 if (!USBSpaceWire_TC_SetAutoTickInFrequency(hDevice, freqCount) )
989 if (!USBSpaceWire_TC_SetAutoTickInFrequency(hDevice, freqCount) )
989 SocExplorerEngine::message(this->plugin,"Could not set the tick-in frequency");
990 SocExplorerEngine::message(this->plugin,"Could not set the tick-in frequency");
990 else
991 else
991 SocExplorerEngine::message(this->plugin,"tick frequency set to " + QString::number(currentFrequency) +" Hz"
992 SocExplorerEngine::message(this->plugin,"tick frequency set to " + QString::number(currentFrequency) +" Hz"
992 + " (freqCount set to " + QString::number(freqCount) + ")" );
993 + " (freqCount set to " + QString::number(freqCount) + ")" );
993 this->handleMutex->unlock();
994 this->handleMutex->unlock();
994 }
995 }
995
996
996 void stardundeeSPW_USB_Manager::sendOneTimecode( unsigned char nTimein )
997 void stardundeeSPW_USB_Manager::sendOneTimecode( unsigned char nTimein )
997 {
998 {
998 this->handleMutex->lock();
999 this->handleMutex->lock();
999 // enable external timecode selection
1000 // enable external timecode selection
1000 if(!USBSpaceWire_TC_EnableExternalTimecodeSelection(hDevice,1))
1001 if(!USBSpaceWire_TC_EnableExternalTimecodeSelection(hDevice,1))
1001 SocExplorerEngine::message(this->plugin,"sendOneTimecode *** ERR *** enable external timecode selection");
1002 SocExplorerEngine::message(this->plugin,"sendOneTimecode *** ERR *** enable external timecode selection");
1002
1003
1003 if (!USBSpaceWire_TC_PerformTickIn( hDevice, nTimein) )
1004 if (!USBSpaceWire_TC_PerformTickIn( hDevice, nTimein) )
1004 SocExplorerEngine::message( this->plugin,"sendOneTimecode *** ERR *** Could not send the requested timecode: " + QString::number(nTimein) );
1005 SocExplorerEngine::message( this->plugin,"sendOneTimecode *** ERR *** Could not send the requested timecode: " + QString::number(nTimein) );
1005 else
1006 else
1006 SocExplorerEngine::message( this->plugin,"sendOneTimecode *** OK *** timecode sent " + QString::number(nTimein) );
1007 SocExplorerEngine::message( this->plugin,"sendOneTimecode *** OK *** timecode sent " + QString::number(nTimein) );
1007
1008
1008 // disable external timecode selection
1009 // disable external timecode selection
1009 if(!USBSpaceWire_TC_EnableExternalTimecodeSelection(hDevice,0))
1010 if(!USBSpaceWire_TC_EnableExternalTimecodeSelection(hDevice,0))
1010 SocExplorerEngine::message(this->plugin,"sendOneTimecode *** ERR *** disable external timecode selection");
1011 SocExplorerEngine::message(this->plugin,"sendOneTimecode *** ERR *** disable external timecode selection");
1011 this->handleMutex->unlock();
1012 this->handleMutex->unlock();
1012 }
1013 }
1013
1014
1014
1015
@@ -1,187 +1,186
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
22
23 #include "spwplugin.h"
23 #include "spwplugin.h"
24 #include "stardundeespw_usb.h"
24 #include "stardundeespw_usb.h"
25 #include "gr_esb_bridge.h"
25 #include "gr_esb_bridge.h"
26 #include <socexplorerproxy.h>
26 #include <socexplorerproxy.h>
27 #include "fakestardundeespwusb_lib.h"
27 #include "fakestardundeespwusb_lib.h"
28
28
29
29
30 spwplugin::spwplugin(QWidget *parent):socexplorerplugin(parent,false)
30 spwplugin::spwplugin(QWidget *parent):socexplorerplugin(parent,false)
31 {
31 {
32 Q_UNUSED(parent)
32 Q_UNUSED(parent)
33 FakeStarDundeeSpwUSB_Lib::resolve();
33 FakeStarDundeeSpwUSB_Lib::resolve();
34 this->bridge = Q_NULLPTR;
34 this->bridge = Q_NULLPTR;
35 this->scanDone = false;
35 this->scanDone = false;
36 // this->pyObject = new spwPyWrapper(this);
37 this->tcpServer = new SpwTcpPacketServer(this);
36 this->tcpServer = new SpwTcpPacketServer(this);
38 this->mainGroupBox = new QGroupBox("SpaceWire Plugin Configuration",this);
37 this->mainGroupBox = new QGroupBox("SpaceWire Plugin Configuration",this);
39 this->bridgeSelector = new QComboBox(this);
38 this->bridgeSelector = new QComboBox(this);
40 this->mainTabWidgt = new QTabWidget(this);
39 this->mainTabWidgt = new QTabWidget(this);
41 this->mainTabWidgt->addTab(this->mainGroupBox,"Bridge Configuration");
40 this->mainTabWidgt->addTab(this->mainGroupBox,"Bridge Configuration");
42 this->mainTabWidgt->addTab(this->tcpServer,"TCP Server");
41 this->mainTabWidgt->addTab(this->tcpServer,"TCP Server");
43 this->mainLayout = new QGridLayout(this->mainGroupBox);
42 this->mainLayout = new QGridLayout(this->mainGroupBox);
44 this->mainLayout->addWidget(new QLabel("Select SpaceWire bridge",this),0,0,1,1,Qt::AlignCenter);
43 this->mainLayout->addWidget(new QLabel("Select SpaceWire bridge",this),0,0,1,1,Qt::AlignCenter);
45 this->mainLayout->addWidget(this->bridgeSelector,0,1,1,1);
44 this->mainLayout->addWidget(this->bridgeSelector,0,1,1,1);
46 this->setWidget(this->mainTabWidgt);
45 this->setWidget(this->mainTabWidgt);
47 this->bridgeSelector->addItem("none");
46 this->bridgeSelector->addItem("none");
48 this->bridgeSelector->addItem("STAR-Dundee Spw USB Brick");
47 this->bridgeSelector->addItem("STAR-Dundee Spw USB Brick");
49 this->bridgeSelector->addItem("GR-ESB");
48 this->bridgeSelector->addItem("GR-ESB");
50 connect(this->bridgeSelector,SIGNAL(currentIndexChanged(QString)),this,SLOT(bridgeSelectionChanged(QString)));
49 connect(this->bridgeSelector,SIGNAL(currentIndexChanged(QString)),this,SLOT(bridgeSelectionChanged(QString)));
51 connect(this,SIGNAL(selectBridge(QString)),this,SLOT(selectBridge(QString)));
50 connect(this,SIGNAL(selectBridge(QString)),this,SLOT(selectBridge(QString)));
52 connect(this,SIGNAL(TCPServerConnect()),this->tcpServer,SLOT(connectServer()));
51 connect(this,SIGNAL(TCPServerConnect()),this->tcpServer,SLOT(connectServer()));
53 connect(this,SIGNAL(TCPServerDisconnect()),this->tcpServer,SLOT(disconnectServer()));
52 connect(this,SIGNAL(TCPServerDisconnect()),this->tcpServer,SLOT(disconnectServer()));
54 connect(this,SIGNAL(TCPServerSetPort(qint32)),this->tcpServer,SLOT(setServerPort(qint32)));
53 connect(this,SIGNAL(TCPServerSetPort(qint32)),this->tcpServer,SLOT(setServerPort(qint32)));
55 connect(this,SIGNAL(TCPServerSetIP(QString)),this->tcpServer,SLOT(setServerSetIP(QString)));
54 connect(this,SIGNAL(TCPServerSetIP(QString)),this->tcpServer,SLOT(setServerSetIP(QString)));
56 }
55 }
57
56
58
57
59 spwplugin::~spwplugin()
58 spwplugin::~spwplugin()
60 {
59 {
61 if(this->bridge!=Q_NULLPTR)
60 if(this->bridge!=Q_NULLPTR)
62 delete this->bridge;
61 delete this->bridge;
63 }
62 }
64
63
65
64
66
65
67 unsigned int spwplugin::Read(unsigned int *Value,unsigned int count,unsigned int address)
66 unsigned int spwplugin::Read(unsigned int *Value,unsigned int count,unsigned int address)
68 {
67 {
69 if(Connected)
68 if(Connected)
70 {
69 {
71 return bridge->Read(Value,count,address);
70 return bridge->Read(Value,count,address);
72 }
71 }
73 return 0;
72 return 0;
74 }
73 }
75
74
76 void spwplugin::bridgeSelectionChanged(const QString &text)
75 void spwplugin::bridgeSelectionChanged(const QString &text)
77 {
76 {
78 printf("test");
77 printf("test");
79 if(text=="none")
78 if(text=="none")
80 {
79 {
81 if(this->bridge!=NULL)
80 if(this->bridge!=NULL)
82 {
81 {
83 this->mainLayout->removeWidget(this->bridge->getGUI());
82 this->mainLayout->removeWidget(this->bridge->getGUI());
84 this->bridge->getGUI()->hide();
83 this->bridge->getGUI()->hide();
85 this->disconnect(this,SLOT(setConnected(bool)));
84 this->disconnect(this,SLOT(setConnected(bool)));
86 delete this->bridge;
85 delete this->bridge;
87 this->bridge= NULL;
86 this->bridge= NULL;
88 }
87 }
89 }
88 }
90 if(text=="STAR-Dundee Spw USB Brick")
89 if(text=="STAR-Dundee Spw USB Brick")
91 {
90 {
92 if(this->bridge!=NULL)
91 if(this->bridge!=NULL)
93 {
92 {
94 this->mainLayout->removeWidget(this->bridge->getGUI());
93 this->mainLayout->removeWidget(this->bridge->getGUI());
95 this->bridge->getGUI()->hide();
94 this->bridge->getGUI()->hide();
96 this->disconnect(this,SLOT(setConnected(bool)));
95 this->disconnect(this,SLOT(setConnected(bool)));
97 delete this->bridge;
96 delete this->bridge;
98 }
97 }
99 this->bridge = new stardundeeSPW_USB(this);
98 this->bridge = new stardundeeSPW_USB(this);
100 this->mainLayout->addWidget(this->bridge->getGUI(),1,0,1,2);
99 this->mainLayout->addWidget(this->bridge->getGUI(),1,0,1,2);
101 connect(this->bridge,SIGNAL(setConnected(bool)),this,SLOT(setConnected(bool)));
100 connect(this->bridge,SIGNAL(setConnected(bool)),this,SLOT(setConnected(bool)));
102 connect(this,SIGNAL(StarDundeeSelectBrick(int)),((stardundeeSPW_USB*)bridge),SIGNAL(SelectBrick(int)));
101 connect(this,SIGNAL(StarDundeeSelectBrick(int)),((stardundeeSPW_USB*)bridge),SIGNAL(SelectBrick(int)));
103 connect(this,SIGNAL(StarDundeeSelectLinkNumber(int)),((stardundeeSPW_USB*)bridge),SIGNAL(SelectLinkNumber(int)));
102 connect(this,SIGNAL(StarDundeeSelectLinkNumber(int)),((stardundeeSPW_USB*)bridge),SIGNAL(SelectLinkNumber(int)));
104 connect(this,SIGNAL(StarDundeeSelectLinkSpeed(int)),((stardundeeSPW_USB*)bridge),SIGNAL(SelectLinkSpeed(int)));
103 connect(this,SIGNAL(StarDundeeSelectLinkSpeed(int)),((stardundeeSPW_USB*)bridge),SIGNAL(SelectLinkSpeed(int)));
105 connect(this,SIGNAL(StarDundeeSetSourceAddress(QString)),((stardundeeSPW_USB*)bridge),SIGNAL(SetSourceAddress(QString)));
104 connect(this,SIGNAL(StarDundeeSetSourceAddress(QString)),((stardundeeSPW_USB*)bridge),SIGNAL(SetSourceAddress(QString)));
106 connect(this,SIGNAL(StarDundeeSetDestinationAddress(QString)),((stardundeeSPW_USB*)bridge),SIGNAL(SetDestinationAddress(QString)));
105 connect(this,SIGNAL(StarDundeeSetDestinationAddress(QString)),((stardundeeSPW_USB*)bridge),SIGNAL(SetDestinationAddress(QString)));
107 connect(this,SIGNAL(StarDundeeSetDestinationKey(QString)),((stardundeeSPW_USB*)bridge),SIGNAL(SetDestinationKey(QString)));
106 connect(this,SIGNAL(StarDundeeSetDestinationKey(QString)),((stardundeeSPW_USB*)bridge),SIGNAL(SetDestinationKey(QString)));
108 connect(this,SIGNAL(StarDundeeSetRmapTimeout(QString)),((stardundeeSPW_USB*)bridge),SIGNAL(SetRmapTimeout(QString)));
107 connect(this,SIGNAL(StarDundeeSetRmapTimeout(QString)),((stardundeeSPW_USB*)bridge),SIGNAL(SetRmapTimeout(QString)));
109 connect(this,SIGNAL(connectBridge()),((stardundeeSPW_USB*)bridge),SLOT(connectBridge()));
108 connect(this,SIGNAL(connectBridge()),((stardundeeSPW_USB*)bridge),SLOT(connectBridge()));
110 connect(this,SIGNAL(disconnectBridge()),((stardundeeSPW_USB*)bridge),SLOT(disconnectBridge()));
109 connect(this,SIGNAL(disconnectBridge()),((stardundeeSPW_USB*)bridge),SLOT(disconnectBridge()));
111 connect(this,SIGNAL(StarDundeeGetAvailableBrickCount()),
110 connect(this,SIGNAL(StarDundeeGetAvailableBrickCount()),
112 ((stardundeeSPW_USB*)bridge),SIGNAL(GetAvailableBrickCount()));
111 ((stardundeeSPW_USB*)bridge),SIGNAL(GetAvailableBrickCount()));
113 connect(this,SIGNAL(StarDundeeGetNbPacketsTransmittedToSpw()),
112 connect(this,SIGNAL(StarDundeeGetNbPacketsTransmittedToSpw()),
114 ((stardundeeSPW_USB*)bridge),SIGNAL(GetNbPacketsTransmittedToSpw()));
113 ((stardundeeSPW_USB*)bridge),SIGNAL(GetNbPacketsTransmittedToSpw()));
115 connect(this,SIGNAL(StarDundeeGetNbCCSDSPacketsTransmittedToSpw()),
114 connect(this,SIGNAL(StarDundeeGetNbCCSDSPacketsTransmittedToSpw()),
116 ((stardundeeSPW_USB*)bridge),SIGNAL(GetNbCCSDSPacketsTransmittedToSpw()));
115 ((stardundeeSPW_USB*)bridge),SIGNAL(GetNbCCSDSPacketsTransmittedToSpw()));
117 connect(this,SIGNAL(StarDundeeGetLinkNumber()),((stardundeeSPW_USB*)bridge),SIGNAL(GetLinkNumber()));
116 connect(this,SIGNAL(StarDundeeGetLinkNumber()),((stardundeeSPW_USB*)bridge),SIGNAL(GetLinkNumber()));
118 connect(this,SIGNAL(StarDundeeSetBrickAsAninterface(bool)),
117 connect(this,SIGNAL(StarDundeeSetBrickAsAninterface(bool)),
119 ((stardundeeSPW_USB*)bridge),SIGNAL(SetBrickAsAnInterface(bool)));
118 ((stardundeeSPW_USB*)bridge),SIGNAL(SetBrickAsAnInterface(bool)));
120 connect(this,SIGNAL(StarDundeeSetBrickAsARouter(bool)),
119 connect(this,SIGNAL(StarDundeeSetBrickAsARouter(bool)),
121 ((stardundeeSPW_USB*)bridge),SIGNAL(SetBrickAsARouter(bool)));
120 ((stardundeeSPW_USB*)bridge),SIGNAL(SetBrickAsARouter(bool)));
122 connect(this,SIGNAL(StarDundeeStartTimecodes(bool)),
121 connect(this,SIGNAL(StarDundeeStartTimecodes(bool)),
123 ((stardundeeSPW_USB*)bridge),SIGNAL(StartSendingTimecodes(bool)));
122 ((stardundeeSPW_USB*)bridge),SIGNAL(StartSendingTimecodes(bool)));
124 connect(this,SIGNAL(StarDundeeSetTimecodeFrequency(double)),
123 connect(this,SIGNAL(StarDundeeSetTimecodeFrequency(double)),
125 ((stardundeeSPW_USB*)bridge),SIGNAL(SetTimecodeFrequency(double)));
124 ((stardundeeSPW_USB*)bridge),SIGNAL(SetTimecodeFrequency(double)));
126 connect(this,SIGNAL(StarDundeeSendOneTimecode(unsigned char)),
125 connect(this,SIGNAL(StarDundeeSendOneTimecode(unsigned char)),
127 ((stardundeeSPW_USB*)bridge),SIGNAL(SendOneTimecode(unsigned char)));
126 ((stardundeeSPW_USB*)bridge),SIGNAL(SendOneTimecode(unsigned char)));
128 connect(this->bridge,SIGNAL(pushPacketOverTCP(char*,int)),this->tcpServer,SLOT(pushPacket(char*,int)));
127 connect(this->bridge,SIGNAL(pushPacketOverTCP(char*,int)),this->tcpServer,SLOT(pushPacket(char*,int)));
129 connect(this->tcpServer, SIGNAL(sendSPWPacket(char*,int)), ((stardundeeSPW_USB*)bridge), SLOT(sendPacketComingFromTCPServer(char*,int)));
128 connect(this->tcpServer, SIGNAL(sendSPWPacket(char*,int)), ((stardundeeSPW_USB*)bridge), SLOT(sendPacketComingFromTCPServer(char*,int)));
130 }
129 }
131 if(text=="GR-ESB")
130 if(text=="GR-ESB")
132 {
131 {
133 if(this->bridge!=NULL)
132 if(this->bridge!=NULL)
134 {
133 {
135 this->mainLayout->removeWidget(this->bridge->getGUI());
134 this->mainLayout->removeWidget(this->bridge->getGUI());
136 this->bridge->getGUI()->hide();
135 this->bridge->getGUI()->hide();
137 this->disconnect(this,SLOT(setConnected(bool)));
136 this->disconnect(this,SLOT(setConnected(bool)));
138 delete this->bridge;
137 delete this->bridge;
139 }
138 }
140 this->bridge = new GR_ESB_bridge(this);
139 this->bridge = new GR_ESB_bridge(this);
141 this->mainLayout->addWidget(this->bridge->getGUI(),1,0,1,2);
140 this->mainLayout->addWidget(this->bridge->getGUI(),1,0,1,2);
142 connect(this->bridge,SIGNAL(setConnected(bool)),this,SLOT(setConnected(bool)));
141 connect(this->bridge,SIGNAL(setConnected(bool)),this,SLOT(setConnected(bool)));
143 }
142 }
144 }
143 }
145
144
146
145
147 void spwplugin::selectBridge(const QString &text)
146 void spwplugin::selectBridge(const QString &text)
148 {
147 {
149
148
150 if(text=="none")
149 if(text=="none")
151 {
150 {
152 this->bridgeSelector->setCurrentIndex(0);
151 this->bridgeSelector->setCurrentIndex(0);
153 }
152 }
154 if(text=="STAR-Dundee Spw USB Brick")
153 if(text=="STAR-Dundee Spw USB Brick")
155 {
154 {
156 this->bridgeSelector->setCurrentIndex(1);
155 this->bridgeSelector->setCurrentIndex(1);
157 }
156 }
158 }
157 }
159
158
160 void spwplugin::setConnected(bool connected)
159 void spwplugin::setConnected(bool connected)
161 {
160 {
162 this->bridgeSelector->setDisabled(connected);
161 this->bridgeSelector->setDisabled(connected);
163 this->Connected = connected;
162 this->Connected = connected;
164 emit activateSig(connected);
163 emit activateSig(connected);
165 if(!this->scanDone)
164 if(!this->scanDone)
166 {
165 {
167 socexplorerproxy::loadChildSysDriver(this,"AMBA_PLUGIN");
166 socexplorerproxy::loadChildSysDriver(this,"AMBA_PLUGIN");
168 this->scanDone=true;
167 this->scanDone=true;
169 }
168 }
170 }
169 }
171
170
172 unsigned int spwplugin::Write(unsigned int *Value,unsigned int count, unsigned int address)
171 unsigned int spwplugin::Write(unsigned int *Value,unsigned int count, unsigned int address)
173 {
172 {
174 if(Connected)
173 if(Connected)
175 {
174 {
176 return bridge->Write(Value,count,address);
175 return bridge->Write(Value,count,address);
177 }
176 }
178 return 0;
177 return 0;
179 }
178 }
180
179
181
180
182
181
183
182
184
183
185
184
186
185
187
186
General Comments 0
You need to be logged in to leave comments. Login now