1
2
3
4
5
6
7
8
9
10 """Scans the available bitfling ports in the same way as comscan and usbscan work
11 as well as providing the rest of the BitFling interface"""
12
13 import sys
14 import common
15
16 try:
17 import bitfling.client as bitfling
18 except ImportError:
19 bitfling=None
20
22 if bitfling is None:
23 return False
24 return True
25
27
29
31 self.certverifier=certverifier
32 self.unconfigure()
33
39
45
52
55
59
61 self.certverifier=certverifier
62
64 if not self.isconfigured():
65 return []
66 self._configure()
67 ports=self.client.scan()
68 for p in range(len(ports)):
69 ports[p]['BitFling']=True
70 ports[p]['name']='bitfling::'+ports[p]['name']
71 return ports
72
73
74
75 - def deviceopen(self, port, baud, timeout, hardwareflow, softwareflow):
76 self._configure()
77 return self.client.deviceopen(port, baud, timeout, hardwareflow, softwareflow)
78
86
90
94
98
102
111
115
119
123
127
128
129 flinger=flinger()
130
131 encode=common.obfus_encode
132 decode=common.obfus_decode
133
134
135
136
137
138
139
140
141
142
143
144
145
146 import thread
147 import threading
148 import Queue
149
151
153 threading.Thread.__init__(self)
154 self.setName("BitFling worker thread")
155 self.setDaemon(True)
156 self.q=Queue.Queue()
157 self.resultqueues={}
158 self.eventloops={}
159
161 while True:
162 q,func,args,kwargs=self.q.get()
163 try:
164 res=func(*args, **kwargs)
165 q.put( (res, None) )
166 except:
167 q.put( (None, sys.exc_info()) )
168
169 - def callfunc(self, func, args, kwargs):
170 qres=self.getresultqueue()
171 self.q.put( (qres, func, args, kwargs) )
172
173 loopfunc=self.eventloops.get(thread.get_ident(), None)
174 if loopfunc is not None:
175 while qres.empty():
176 loopfunc()
177 res, exc = qres.get()
178 if exc is not None:
179 ex=exc[1]
180 ex.gui_exc_info=exc
181 raise ex
182 return res
183
185 """Return the thread specific result Queue object
186
187 They are automatically allocated on demand"""
188 q=self.resultqueues.get(thread.get_ident(), None)
189 if q is not None:
190 return q
191 q=Queue.Queue()
192 self.resultqueues[thread.get_ident()]=q
193 return q
194
196 """Sets the eventloopfunction used for this thread"""
197 self.eventloops[thread.get_ident()]=eventfunc
198
200 """Provides proxy method wrappers so that all method calls can be redirected to worker thread
201
202 This works in a very similar way to how xmlrpclib wraps client side xmlrpc
203 """
204
211
212 worker=None
213 object=None
214
218
226
227
228 if IsBitFlingEnabled():
229 BitFlingWorkerThread=BitFlingWorkerThread()
230 BitFlingWorkerThread.start()
231
232
233 flinger=CallWrapper(BitFlingWorkerThread, flinger)
234 else:
240 raise Exception("BitFling is not enabled")
243 flinger=flinger()
244
245
247
248
249 - def __init__(self, logtarget, port, baud=115200, timeout=3, hardwareflow=0,
250 softwareflow=0, autolistfunc=None, autolistargs=None, configparameters=None):
251 assert port.startswith("bitfling::")
252 self.logtarget=logtarget
253 self.port=port
254 self.baud=baud
255 self.timeout=timeout
256 self.hardwareflow=hardwareflow
257 self.softwareflow=softwareflow
258 self.handle=None
259 self._openport()
260
262 if self.handle is not None:
263 self.close()
264 self.log("Opening port %s, %d baud, timeout %f, hardwareflow %d, softwareflow %d" %
265 (self.port, self.baud, float(self.timeout), self.hardwareflow, self.softwareflow) )
266 self.handle=flinger.deviceopen(self.port[len("bitfling::"):], self.baud, self.timeout, self.hardwareflow,
267 self.softwareflow)
268
271
276
279
280 - def log(self, str):
281 if self.logtarget:
282 self.logtarget.log(self.port+": "+str)
283
285 if self.logtarget:
286 self.logtarget.logdata(self.port+": "+str, data)
287
293
297
301
302 - def write(self, data, log=True):
306
310
311 - def read(self, numchars=1, log=True):
316
317 - def readsome(self, log=True, numchars=-1):
322
323 - def readuntil(self, char, log=True, logsuccess=True, numfailures=0):
330
331
332 - def writethenreaduntil(self, data, logwrite, char, logreaduntil=True, logreaduntilsuccess=True, numfailures=0):
339