Coverage for functions/peripherals.py: 100%
42 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-08-30 11:51 -0700
« prev ^ index » next coverage.py v7.4.4, created at 2024-08-30 11:51 -0700
1"""
2Peripherals class.
3"""
5# └── functions/peripherals.py
6# ├── [BROKER] control_servo()
7# ├── [BROKER] control_peripheral()
8# ├── [BROKER] toggle_peripheral()
9# ├── [BROKER] on()
10# └── [BROKER] off()
12from .broker import BrokerConnect
13from .information import Information
15class Peripherals():
16 """Peripherals class."""
17 def __init__(self, state):
18 self.broker = BrokerConnect(state)
19 self.info = Information(state)
20 self.state = state
22 def control_servo(self, pin, angle):
23 """Set servo angle between 0-100 degrees."""
24 self.state.print_status(description=f"Setting servo angle to {angle}.")
26 if angle < 0 or angle > 180:
27 error = "ERROR: Servo angle constrained to 0-180 degrees."
28 self.state.print_status(description=error, update_only=True)
29 self.state.error = error
30 return
32 control_servo_message = {
33 "kind": "set_servo_angle",
34 "args": {
35 "pin_number": pin,
36 "pin_value": angle # From 0 to 180
37 }
38 }
40 self.broker.publish(control_servo_message)
42 return
44 def control_peripheral(self, peripheral_name, value, mode=None):
45 """Set peripheral value and mode."""
46 self.state.print_status(description=f"Setting {peripheral_name} to {value}.")
48 peripheral = self.info.get_resource_by_name("peripherals", peripheral_name)
49 if peripheral is None:
50 return
51 peripheral_id = peripheral["id"]
52 pin_mode = peripheral["mode"] if mode is None else mode
54 control_peripheral_message = {
55 "kind": "write_pin",
56 "args": {
57 "pin_value": value, # Controls ON/OFF or slider value from 0-255
58 "pin_mode": pin_mode, # Controls digital (0) or analog (1) mode
59 "pin_number": {
60 "kind": "named_pin",
61 "args": {
62 "pin_type": "Peripheral",
63 "pin_id": peripheral_id,
64 }
65 }
66 }
67 }
69 self.broker.publish(control_peripheral_message)
71 def toggle_peripheral(self, peripheral_name):
72 """Toggles the state of a specific peripheral between `on` and `off`."""
73 self.state.print_status(description=f"Toggling {peripheral_name}.")
74 peripheral = self.info.get_resource_by_name("peripherals", peripheral_name)
75 if peripheral is None:
76 return
77 peripheral_id = peripheral["id"]
78 toggle_peripheral_message = {
79 "kind": "toggle_pin",
80 "args": {
81 "pin_number": {
82 "kind": "named_pin",
83 "args": {
84 "pin_type": "Peripheral",
85 "pin_id": peripheral_id,
86 }
87 }
88 }
89 }
91 self.broker.publish(toggle_peripheral_message)
93 def on(self, pin_number):
94 """Turns specified pin number `on` (100%)."""
95 self.state.print_status(description=f"Turning ON pin number {pin_number}.")
97 on_message = {
98 "kind": "write_pin",
99 "args": {
100 "pin_value": 1,
101 "pin_mode": 0,
102 "pin_number": pin_number,
103 }
104 }
106 self.broker.publish(on_message)
108 def off(self, pin_number):
109 """Turns specified pin number `off` (0%)."""
110 self.state.print_status(description=f"Turning OFF pin number {pin_number}.")
112 off_message = {
113 "kind": "write_pin",
114 "args": {
115 "pin_value": 0,
116 "pin_mode": 0,
117 "pin_number": pin_number,
118 }
119 }
121 self.broker.publish(off_message)