@@ -204,7 +204,6 @@ class BaseNode402(RemoteNode):
204
204
TIMEOUT_SWITCH_STATE_SINGLE = 0.4 # seconds
205
205
INTERVAL_CHECK_STATE = 0.01 # seconds
206
206
TIMEOUT_HOMING_DEFAULT = 30 # seconds
207
- INTERVAL_CHECK_HOMING = 0.1 # seconds
208
207
209
208
def __init__ (self , node_id , object_dictionary ):
210
209
super (BaseNode402 , self ).__init__ (node_id , object_dictionary )
@@ -276,18 +275,6 @@ def is_faulted(self):
276
275
bitmask , bits = State402 .SW_MASK ['FAULT' ]
277
276
return self .statusword & bitmask == bits
278
277
279
- def _homing_status (self ):
280
- """Interpret the current Statusword bits as homing state string."""
281
- # Wait to make sure an RPDO was received. Should better check for reception
282
- # instead of this hard-coded delay, but at least it can be configured per node.
283
- time .sleep (self .INTERVAL_CHECK_HOMING )
284
- status = None
285
- for key , value in Homing .STATES .items ():
286
- bitmask , bits = value
287
- if self .statusword & bitmask == bits :
288
- status = key
289
- return status
290
-
291
278
def is_homed (self , restore_op_mode = False ):
292
279
"""Switch to homing mode and determine its status.
293
280
@@ -299,7 +286,11 @@ def is_homed(self, restore_op_mode=False):
299
286
if previous_op_mode != 'HOMING' :
300
287
logger .info ('Switch to HOMING from %s' , previous_op_mode )
301
288
self .op_mode = 'HOMING'
302
- homingstatus = self ._homing_status ()
289
+ homingstatus = None
290
+ for key , value in Homing .STATES .items ():
291
+ bitmask , bits = value
292
+ if self .statusword & bitmask == bits :
293
+ homingstatus = key
303
294
if restore_op_mode :
304
295
self .op_mode = previous_op_mode
305
296
return homingstatus in ('TARGET REACHED' , 'ATTAINED' )
@@ -320,10 +311,16 @@ def homing(self, timeout=TIMEOUT_HOMING_DEFAULT):
320
311
t = time .monotonic () + timeout
321
312
try :
322
313
while homingstatus not in ('TARGET REACHED' , 'ATTAINED' ):
323
- homingstatus = self ._homing_status ()
314
+ for key , value in Homing .STATES .items ():
315
+ # check if the Statusword after applying the bitmask
316
+ # corresponds with the needed bits to determine the current status
317
+ bitmask , bits = value
318
+ if self .statusword & bitmask == bits :
319
+ homingstatus = key
324
320
if homingstatus in ('INTERRUPTED' , 'ERROR VELOCITY IS NOT ZERO' ,
325
321
'ERROR VELOCITY IS ZERO' ):
326
322
raise RuntimeError ('Unable to home. Reason: {0}' .format (homingstatus ))
323
+ time .sleep (self .INTERVAL_CHECK_STATE )
327
324
if time .monotonic () > t :
328
325
raise RuntimeError ('Unable to home, timeout reached' )
329
326
logger .info ('Homing mode carried out successfully.' )
0 commit comments