@@ -186,10 +186,9 @@ def begin(self) -> int:
186
186
sleep_ms (1000 )
187
187
self ._idle (1000 )
188
188
self ._begin_update_thread ()
189
+
189
190
sleep_ms (100 )
190
- if self ._has_events_registered ():
191
- print ('Starting events thread' )
192
- self ._start_events_thread ()
191
+
193
192
self ._reset_hw ()
194
193
self ._flush_uart ()
195
194
self ._snake_robot (1000 )
@@ -198,6 +197,9 @@ def begin(self) -> int:
198
197
self .set_illuminator (True )
199
198
self .set_behaviour (1 )
200
199
self ._set_color_reference ()
200
+ if self ._has_events_registered ():
201
+ print ('Starting events thread' )
202
+ self ._start_events_thread ()
201
203
self .set_servo_positions (0 , 0 )
202
204
return 0
203
205
@@ -1062,7 +1064,7 @@ def print_status(self):
1062
1064
print (f'LINEAR VEL: { self ._linear_velocity } ' )
1063
1065
print (f'ANGULAR VEL: { self ._angular_velocity } ' )
1064
1066
1065
- def timer (self , mode : str , period : int , callback : callable , args : tuple = ()) -> None :
1067
+ def set_timer (self , mode : str , period : int , callback : callable , args : tuple = ()) -> None :
1066
1068
"""
1067
1069
Register a timer callback
1068
1070
:param mode: _ArduinoAlvikTimerEvents.PERIODIC or .ONE_SHOT
@@ -1075,6 +1077,14 @@ def timer(self, mode: str, period: int, callback: callable, args: tuple = ()) ->
1075
1077
self ._timer_events = _ArduinoAlvikTimerEvents (period )
1076
1078
self ._timer_events .register_callback (mode , callback , args )
1077
1079
1080
+ @property
1081
+ def timer (self ):
1082
+ """
1083
+ Gives access to the timer object
1084
+ :return:
1085
+ """
1086
+ return self ._timer_events
1087
+
1078
1088
def on_touch_ok_pressed (self , callback : callable , args : tuple = ()) -> None :
1079
1089
"""
1080
1090
Register callback when touch button OK is pressed
@@ -1208,6 +1218,8 @@ def _start_events_thread(self) -> None:
1208
1218
"""
1209
1219
if not self .__class__ ._events_thread_running :
1210
1220
self .__class__ ._events_thread_running = True
1221
+ self ._timer_events .reset () # resets the timer before starting
1222
+ self ._move_events .reset (_ArduinoAlvikMoveEvents .NZ_TILT ) # resets the orientation to -Z tilted
1211
1223
self .__class__ ._events_thread_id = _thread .start_new_thread (self ._update_events , (50 ,))
1212
1224
1213
1225
def _update_events (self , delay_ : int = 100 ):
@@ -1441,8 +1453,68 @@ def __init__(self, period: int):
1441
1453
self ._last_trigger = ticks_ms ()
1442
1454
self ._period = period
1443
1455
self ._triggered = False
1456
+ self ._stopped = False
1444
1457
super ().__init__ ()
1445
1458
1459
+ def is_triggered (self ):
1460
+ """
1461
+ Returns the trigger state
1462
+ :return:
1463
+ """
1464
+ return self ._triggered
1465
+
1466
+ def is_stopped (self ):
1467
+ """
1468
+ Return True if timer is stopped
1469
+ :return:
1470
+ """
1471
+ return self ._stopped
1472
+
1473
+ def set (self , start = None , period : int = None ):
1474
+ """
1475
+ Sets the last trigger time
1476
+ :param start:
1477
+ :param period:
1478
+ :return:
1479
+ """
1480
+ self ._last_trigger = start if start is not None else ticks_ms ()
1481
+ if period is not None :
1482
+ self ._period = period
1483
+
1484
+ def reset (self , start = None , period : int = None ):
1485
+ """
1486
+ Resets the timer. Use just before starting the events thread or if you want to restart the Timer
1487
+ :param start:
1488
+ :param period:
1489
+ :return:
1490
+ """
1491
+ self ._last_trigger = start if start is not None else ticks_ms ()
1492
+ if period is not None :
1493
+ self ._period = period
1494
+ self ._triggered = False
1495
+
1496
+ def stop (self ):
1497
+ """
1498
+ Stops the timer
1499
+ :return:
1500
+ """
1501
+
1502
+ self ._stopped = True
1503
+
1504
+ def resume (self ):
1505
+ """
1506
+ Resumes the timer
1507
+ :return:
1508
+ """
1509
+ self ._stopped = False
1510
+
1511
+ def get (self ) -> int :
1512
+ """
1513
+ Returns the time passed since the last trigger in ms
1514
+ :return:
1515
+ """
1516
+ return ticks_diff (ticks_ms (), self ._last_trigger )
1517
+
1446
1518
def register_callback (self , event_name : str , callback : callable , args : tuple = None ):
1447
1519
"""
1448
1520
Repeated calls to register_callback will overwrite the timer's behaviour. The Timer can be either PERIODIC
@@ -1455,30 +1527,32 @@ def register_callback(self, event_name: str, callback: callable, args: tuple = N
1455
1527
self ._callbacks = dict ()
1456
1528
super ().register_callback (event_name , callback , args )
1457
1529
1458
- def _is_period_expired (self , now = ticks_ms () ) -> bool :
1530
+ def _is_period_expired (self , now = None ) -> bool :
1459
1531
"""
1460
1532
True if the timer period is expired
1461
1533
:return:
1462
1534
"""
1463
1535
1464
- if ticks_diff ( now , self . _last_trigger ) > self . _period :
1465
- self . _last_trigger = now
1466
- return True
1536
+ if now is None :
1537
+ now = ticks_ms ()
1538
+ return ticks_diff ( now , self . _last_trigger ) > self . _period
1467
1539
1468
- return False
1469
-
1470
- def update_state (self , state ):
1540
+ def update_state (self , ticks ):
1471
1541
"""
1472
1542
Updates the internal state of the events handler and executes the related callback
1473
1543
:return:
1474
1544
"""
1475
1545
1476
1546
if list (self ._callbacks .keys ()) == [self .PERIODIC ]:
1477
- if self ._is_period_expired (state ):
1478
- self .execute_callback (self .PERIODIC )
1547
+ if self ._is_period_expired (ticks ):
1548
+ self ._last_trigger = ticks
1549
+ if not self ._stopped :
1550
+ self .execute_callback (self .PERIODIC )
1479
1551
elif list (self ._callbacks .keys ()) == [self .ONE_SHOT ] and not self ._triggered :
1480
- if self ._is_period_expired (state ):
1481
- self .execute_callback (self .ONE_SHOT )
1552
+ if self ._is_period_expired (ticks ):
1553
+ self ._last_trigger = ticks
1554
+ if not self ._stopped :
1555
+ self .execute_callback (self .ONE_SHOT )
1482
1556
self ._triggered = True
1483
1557
1484
1558
@@ -1608,10 +1682,20 @@ class _ArduinoAlvikMoveEvents(_ArduinoAlvikEvents):
1608
1682
available_events = ['on_shake' , 'on_x_tilt' , 'on_y_tilt' , 'on_z_tilt' ,
1609
1683
'on_nx_tilt' , 'on_ny_tilt' , 'on_nz_tilt' ]
1610
1684
1685
+ NZ_TILT = 0x80
1686
+
1611
1687
def __init__ (self ):
1612
1688
self ._current_state = 0
1613
1689
super ().__init__ ()
1614
1690
1691
+ def reset (self , state : int = 0x00 ):
1692
+ """
1693
+ Sets the initial state
1694
+ :param state:
1695
+ :return:
1696
+ """
1697
+ self ._current_state = state
1698
+
1615
1699
@staticmethod
1616
1700
def _is_shaken (current_state , new_state ) -> bool :
1617
1701
"""
0 commit comments