-
Notifications
You must be signed in to change notification settings - Fork 4
/
audience.py
55 lines (48 loc) · 2.03 KB
/
audience.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import asyncio
from viam.logging import getLogger, setLevel
class Audience:
def __init__(self, robot, log_level):
"""
Audience keeps track of how many people have their hands up, and raises
and lowers the robot's hand to match. This class is thread safe.
"""
self._logger = getLogger(__name__)
setLevel(log_level)
self._robot = robot
self._mutex = asyncio.Lock()
self._count = 0 # Number of people in the audience raising their hands
async def increment_count(self):
"""
Call this to consider 1 extra person in the audience to have raised
their hand. If this is the first person to do so, we'll raise the
robot's hand, and otherwise we take no action.
"""
async with self._mutex:
self._logger.debug("one person raised their hand")
self._count += 1
if self._count == 1:
await self._robot.raise_hand()
async def decrement_count(self):
"""
Call this to consider 1 extra person in the audience to have lowered
their hand. If this is the last person who had their hand raised, we'll
lower the robot's hand, and otherwise take no action.
"""
async with self._mutex:
self._logger.debug("one person lowered their hand")
self._count -= 1
if self._count == 0:
await self._robot.lower_hand()
async def set_count(self, new_value):
"""
Call this to set the number of hands raised in the audience to a certain
value. This is mainly used to reset the count of raised hands if someone
forgets to lower their hand.
"""
async with self._mutex:
self._logger.debug(f"set hand count {self._count} to {new_value}")
if self._count == 0 and new_value > 0:
await self._robot.raise_hand()
if self._count > 0 and new_value == 0:
await self._robot.lower_hand()
self._count = new_value