44# Copyright (c) Isabel Paredes.
55# Distributed under the terms of the Modified BSD License.
66
7- """
7+ '''
88TODO: Add module docstring
9- """
9+ '''
1010
11- from ipywidgets import DOMWidget
11+ from ipywidgets import DOMWidget , Output
1212from traitlets import Unicode , Integer
1313from ._frontend import module_name , module_version
14- from time import sleep
1514import asyncio
1615
1716
18-
1917class NaoRobotService ():
2018 name = None
2119 widget = None
2220 output = None
2321
24- def __init__ (self , widget , service_name ):
22+ def __init__ (self , widget , service_name , output = Output () ):
2523 self .name = service_name
2624 self .widget = widget
25+ self .output = output
2726
28-
29- def create_service_msg (self , method_name , * args , ** kwargs ):
27+ def _create_msg (self , method_name , * args , ** kwargs ):
3028 data = {}
31- data [" command" ] = " callService"
32- data [" service" ] = str (self .name )
33- data [" method" ] = str (method_name )
29+ data [' command' ] = ' callService'
30+ data [' service' ] = str (self .name )
31+ data [' method' ] = str (method_name )
3432 # convert tuple to list to avoid empty arg values
35- data ["args" ] = list (args )
36- data ["kwargs" ] = kwargs
37-
33+ data ['args' ] = list (args )
34+ data ['kwargs' ] = kwargs
35+ return data
36+
37+ def call_service (self , method_name , * args , ** kwargs ):
38+ data = self ._create_msg (method_name , * args , ** kwargs )
3839 self .widget .send (data )
3940
40- # TODO: combine msg creating into separate function
41- async def async_create_service_msg (self , method_name , * args , ** kwargs ):
42- data = {}
43- data ["command" ] = "callService"
44- data ["service" ] = str (self .name )
45- data ["method" ] = str (method_name )
46- # convert tuple to list to avoid empty arg values
47- data ["args" ] = list (args )
48- data ["kwargs" ] = kwargs
49-
41+ async def async_call_service (self , method_name , * args , ** kwargs ):
42+ data = self ._create_msg (method_name , * args , ** kwargs )
5043 self .widget .send (data )
5144
5245 try :
53- await self .widget .wait_for_change ('counter' )
46+ self .output .clear_output ()
47+ self .output .append_stdout ('Calling service... \n ' )
48+ await self .widget .wait_for_change ('counter' , self .output )
5449 except Exception as e :
5550 return e
56- return self .widget .response
51+ return self .widget .response [ 'data' ]
5752
5853
5954 def __getattr__ (self , method_name ):
60- # TODO: add error for when service is not ready
61- if (method_name [:6 ] == "async_" ):
62- return lambda * x , ** y : self .async_create_service_msg (method_name [6 :], * x , ** y )
55+ if (method_name [:6 ] == 'async_' ):
56+ return lambda * x , ** y : self .async_call_service (method_name [6 :], * x , ** y )
6357 else :
64- return lambda * x , ** y : self .create_service_msg (method_name , * x , ** y )
58+ return lambda * x , ** y : self .call_service (method_name , * x , ** y )
6559
6660
6761class NaoRobotWidget (DOMWidget ):
68- """TODO: Add docstring here
69- """
7062 _model_name = Unicode ('NaoRobotModel' ).tag (sync = True )
7163 _model_module = Unicode (module_name ).tag (sync = True )
7264 _model_module_version = Unicode (module_version ).tag (sync = True )
7365 _view_name = Unicode ('NaoRobotView' ).tag (sync = True )
7466 _view_module = Unicode (module_name ).tag (sync = True )
7567 _view_module_version = Unicode (module_version ).tag (sync = True )
7668
77- connected = Unicode (" Disconnected" ).tag (sync = True )
78- status = Unicode (" Not busy" ).tag (sync = True )
69+ connected = Unicode (' Disconnected' ).tag (sync = True )
70+ status = Unicode (' Not busy' ).tag (sync = True )
7971 counter = Integer (0 ).tag (sync = True )
8072 response = None
8173
@@ -86,36 +78,47 @@ def __init__(self, **kwargs):
8678
8779
8880 def _handle_frontend_msg (self , model , msg , buffer ):
89- print (" Received frontend msg: " , msg )
81+ print (' Received frontend msg: ' , msg )
9082 self .response = msg
9183
9284
93- def wait_for_change (widget , value_name ):
85+ def wait_for_change (widget , value_name , output = Output () ):
9486 future = asyncio .Future ()
9587 widget .response = None
9688
9789 def get_value_change (change ):
9890 widget .unobserve (get_value_change , names = value_name )
9991 if (widget .response != None ):
100- future .set_result (widget .response )
92+ if (widget .response ['isError' ]):
93+ future .set_exception (Exception (widget .response ['data' ]))
94+ output .append_stderr (widget .response ['data' ])
95+ else :
96+ future .set_result (widget .response ['data' ])
97+ output .append_stdout (widget .response ['data' ])
10198 else :
10299 future .set_result (change )
103100
104101 widget .observe (get_value_change , names = value_name )
105102 return future
106103
107104
108- def connect (self , ip_address = "nao.local" , port = "80" ):
105+ def connect (self , ip_address = 'nao.local' , port = '80' ):
106+ data = {}
107+ data ['command' ] = str ('connect' )
108+ data ['ipAddress' ] = str (ip_address )
109+ data ['port' ] = str (port )
110+ self .send (data )
111+
112+
113+ def disconnect (self ):
109114 data = {}
110- data ["command" ] = str ("connect" )
111- data ["ipAddress" ] = str (ip_address )
112- data ["port" ] = str (port )
115+ data ['command' ] = str ('disconnect' )
113116 self .send (data )
114117
115118
116- def service (self , service_name ):
119+ def service (self , service_name , output = Output () ):
117120 data = {}
118- data [" command" ] = str (" createService" )
119- data [" service" ] = str (service_name )
121+ data [' command' ] = str (' createService' )
122+ data [' service' ] = str (service_name )
120123 self .send (data )
121- return NaoRobotService (self , service_name )
124+ return NaoRobotService (self , service_name , output )
0 commit comments