Coverage for farmbot/functions/peripherals.py: 100%
49 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-09-12 12:03 -0700
« prev ^ index » next coverage.py v7.4.4, created at 2024-09-12 12:03 -0700
1"""
2Peripherals class.
3"""
5# └── functions/peripherals.py
6# ├── [BROKER] control_servo()
7# ├── [BROKER] write_pin()
8# ├── [BROKER] control_peripheral()
9# ├── [BROKER] toggle_peripheral()
10# ├── [BROKER] on()
11# └── [BROKER] off()
13from .broker import BrokerConnect
14from .information import Information
17class Peripherals():
18 """Peripherals class."""
20 def __init__(self, state):
21 self.broker = BrokerConnect(state)
22 self.info = Information(state)
23 self.state = state
25 def control_servo(self, pin, angle):
26 """Set servo angle between 0-180 degrees."""
27 self.state.print_status(description=f"Setting servo angle to {angle}.")
29 if angle < 0 or angle > 180:
30 error = "ERROR: Servo angle constrained to 0-180 degrees."
31 self.state.print_status(description=error, update_only=True)
32 self.state.error = error
33 return
35 control_servo_message = {
36 "kind": "set_servo_angle",
37 "args": {
38 "pin_number": pin,
39 "pin_value": angle # From 0 to 180
40 }
41 }
43 self.broker.publish(control_servo_message)
45 return
47 def write_pin(self, pin_number, value, mode="digital"):
48 """Write a value to a pin."""
49 pin_mode = self.info.convert_mode_to_number(mode)
50 self.state.print_status(
51 description=f"Setting pin {pin_number} to {value} ({mode}).")
53 write_pin_message = {
54 "kind": "write_pin",
55 "args": {
56 "pin_number": pin_number,
57 "pin_value": value,
58 "pin_mode": pin_mode,
59 }
60 }
62 self.broker.publish(write_pin_message)
64 def control_peripheral(self, peripheral_name, value, mode=None):
65 """Set peripheral value and mode."""
66 self.state.print_status(
67 description=f"Setting {peripheral_name} to {value}.")
69 peripheral = self.info.get_resource_by_name(
70 "peripherals",
71 peripheral_name)
72 if peripheral is None:
73 return
74 peripheral_id = peripheral["id"]
75 pin_mode = peripheral["mode"]
76 if mode is not None:
77 pin_mode = self.info.convert_mode_to_number(mode)
79 control_peripheral_message = {
80 "kind": "write_pin",
81 "args": {
82 "pin_value": value,
83 "pin_mode": pin_mode,
84 "pin_number": {
85 "kind": "named_pin",
86 "args": {
87 "pin_type": "Peripheral",
88 "pin_id": peripheral_id,
89 }
90 }
91 }
92 }
94 self.broker.publish(control_peripheral_message)
96 def toggle_peripheral(self, peripheral_name):
97 """Toggles the state of a specific peripheral between `on` and `off`."""
98 self.state.print_status(description=f"Toggling {peripheral_name}.")
99 peripheral = self.info.get_resource_by_name(
100 "peripherals",
101 peripheral_name)
102 if peripheral is None:
103 return
104 peripheral_id = peripheral["id"]
105 toggle_peripheral_message = {
106 "kind": "toggle_pin",
107 "args": {
108 "pin_number": {
109 "kind": "named_pin",
110 "args": {
111 "pin_type": "Peripheral",
112 "pin_id": peripheral_id,
113 }
114 }
115 }
116 }
118 self.broker.publish(toggle_peripheral_message)
120 def on(self, pin_number):
121 """Turns specified pin number `on` (100%)."""
122 self.state.print_status(
123 description=f"Turning ON pin number {pin_number}.")
125 on_message = {
126 "kind": "write_pin",
127 "args": {
128 "pin_value": 1,
129 "pin_mode": 0,
130 "pin_number": pin_number,
131 }
132 }
134 self.broker.publish(on_message)
136 def off(self, pin_number):
137 """Turns specified pin number `off` (0%)."""
138 self.state.print_status(
139 description=f"Turning OFF pin number {pin_number}.")
141 off_message = {
142 "kind": "write_pin",
143 "args": {
144 "pin_value": 0,
145 "pin_mode": 0,
146 "pin_number": pin_number,
147 }
148 }
150 self.broker.publish(off_message)