55import threading
66import Queue
77import random
8+ import socket
9+
810
911import async_requester
1012from casperfpga import CasperFpga
1719 setattr (katcp .CallbackClient , 'MAX_MSG_SIZE' ,
1820 katcp .CallbackClient .MAX_MSG_SIZE * 10 )
1921
22+
2023class KatcpRequestError (RuntimeError ):
21- """Exception that is raised when a KATCP request fails when it should not"""
24+ """An error occurred processing a KATCP request."""
25+
26+
27+ class KatcpRequestInvalid (RuntimeError ):
28+ """An invalid KATCP request was made."""
29+
30+
31+ class KatcpRequestFail (RuntimeError ):
32+ """A valid KATCP request failed."""
33+
2234
2335def sendfile (filename , targethost , port , result_queue , timeout = 2 ):
2436 """
@@ -29,7 +41,6 @@ def sendfile(filename, targethost, port, result_queue, timeout=2):
2941 :param result_queue: the result of the upload, nothing '' indicates success
3042 :return:
3143 """
32- import socket
3344 upload_socket = socket .socket ()
3445 stime = time .time ()
3546 connected = False
@@ -45,16 +56,16 @@ def sendfile(filename, targethost, port, result_queue, timeout=2):
4556 upload_socket .send (open (filename ).read ())
4657 except :
4758 result_queue .put ('Could not send file to upload port.' )
59+ else :
60+ result_queue .put ('' )
4861 finally :
4962 LOGGER .info ('%s: upload thread complete at %.3f' %
5063 (targethost , time .time ()))
51- result_queue .put ('' )
52- return
5364
5465
5566class KatcpFpga (CasperFpga , async_requester .AsyncRequester , katcp .CallbackClient ):
5667
57- def __init__ (self , host , port = 7147 , timeout = 5 .0 , connect = True ):
68+ def __init__ (self , host , port = 7147 , timeout = 20 .0 , connect = True ):
5869 async_requester .AsyncRequester .__init__ (self , host , self .callback_request , max_requests = 100 )
5970 katcp .CallbackClient .__init__ (self , host , port , tb_limit = 20 , timeout = timeout ,
6071 logger = LOGGER , auto_reconnect = True )
@@ -120,9 +131,21 @@ def katcprequest(self, name, request_timeout=-1.0, require_ok=True, request_args
120131 request = katcp .Message .request (name , * request_args )
121132 reply , informs = self .blocking_request (request , timeout = request_timeout )
122133 if (reply .arguments [0 ] != katcp .Message .OK ) and require_ok :
123- raise KatcpRequestError (
124- 'Request %s on host %s failed.\n \t Request: %s\n \t Reply: %s' %
125- (request .name , self .host , request , reply ))
134+ if reply .arguments [0 ] == katcp .Message .FAIL :
135+ raise KatcpRequestFail (
136+ 'Request %s on host %s failed.\n \t '
137+ 'Request: %s\n \t Reply: %s' %
138+ (request .name , self .host , request , reply ))
139+ elif reply .arguments [0 ] == katcp .Message .INVALID :
140+ raise KatcpRequestInvalid (
141+ 'Invalid katcp request %s on host %s.\n \t '
142+ 'Request: %s\n \t Reply: %s' %
143+ (request .name , self .host , request , reply ))
144+ else :
145+ raise KatcpRequestError (
146+ 'Unknown error processing request %s on host '
147+ '%s.\n \t Request: %s\n \t Reply: %s' %
148+ (request .name , self .host , request , reply ))
126149 return reply , informs
127150
128151 def listdev (self , getsize = False , getaddress = False ):
@@ -342,6 +365,8 @@ def makerequest(result_queue):
342365 result_queue .put ('Request to client %s returned, but not Message.OK.' % self .host )
343366 except :
344367 result_queue .put ('Request to client %s failed.' % self .host )
368+ finally :
369+ LOGGER .debug ('progremote thread done' )
345370
346371 if port == - 1 :
347372 port = random .randint (2000 , 2500 )
@@ -482,9 +507,9 @@ def _read_design_info_from_host(self, device=None):
482507 """
483508 LOGGER .debug ('%s: reading designinfo' % self .host )
484509 if device is None :
485- reply , informs = self .katcprequest (name = 'meta' , request_timeout = 5 .0 , require_ok = True )
510+ reply , informs = self .katcprequest (name = 'meta' , request_timeout = 10 .0 , require_ok = True )
486511 else :
487- reply , informs = self .katcprequest (name = 'meta' , request_timeout = 5 .0 , require_ok = True ,
512+ reply , informs = self .katcprequest (name = 'meta' , request_timeout = 10 .0 , require_ok = True ,
488513 request_args = (device , ))
489514 if reply .arguments [0 ] != 'ok' :
490515 raise RuntimeError ('Could not read meta information from %s' % self .host )
0 commit comments