Coverage for farmbot_sidecar_starter_pack/functions/peripherals.py: 100%
47 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-09-04 17:38 -0700
« prev ^ index » next coverage.py v7.4.4, created at 2024-09-04 17:38 -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
16class Peripherals():
17 """Peripherals class."""
18 def __init__(self, state):
19 self.broker = BrokerConnect(state)
20 self.info = Information(state)
21 self.state = state
23 def control_servo(self, pin, angle):
24 """Set servo angle between 0-100 degrees."""
25 self.state.print_status(description=f"Setting servo angle to {angle}.")
27 if angle < 0 or angle > 180:
28 error = "ERROR: Servo angle constrained to 0-180 degrees."
29 self.state.print_status(description=error, update_only=True)
30 self.state.error = error
31 return
33 control_servo_message = {
34 "kind": "set_servo_angle",
35 "args": {
36 "pin_number": pin,
37 "pin_value": angle # From 0 to 180
38 }
39 }
41 self.broker.publish(control_servo_message)
43 return
45 def write_pin(self, pin_number, value, mode=0):
46 """Write a value to a pin."""
47 mode_str = self.info.convert_mode_to_string(mode)
48 self.state.print_status(
49 description=f"Setting pin {pin_number} to {value} ({mode_str}).")
51 write_pin_message = {
52 "kind": "write_pin",
53 "args": {
54 "pin_number": pin_number,
55 "pin_value": value,
56 "pin_mode": mode,
57 }
58 }
60 self.broker.publish(write_pin_message)
62 def control_peripheral(self, peripheral_name, value, mode=None):
63 """Set peripheral value and mode."""
64 self.state.print_status(description=f"Setting {peripheral_name} to {value}.")
66 peripheral = self.info.get_resource_by_name("peripherals", peripheral_name)
67 if peripheral is None:
68 return
69 peripheral_id = peripheral["id"]
70 pin_mode = peripheral["mode"] if mode is None else mode
72 control_peripheral_message = {
73 "kind": "write_pin",
74 "args": {
75 "pin_value": value, # Controls ON/OFF or slider value from 0-255
76 "pin_mode": pin_mode, # Controls digital (0) or analog (1) mode
77 "pin_number": {
78 "kind": "named_pin",
79 "args": {
80 "pin_type": "Peripheral",
81 "pin_id": peripheral_id,
82 }
83 }
84 }
85 }
87 self.broker.publish(control_peripheral_message)
89 def toggle_peripheral(self, peripheral_name):
90 """Toggles the state of a specific peripheral between `on` and `off`."""
91 self.state.print_status(description=f"Toggling {peripheral_name}.")
92 peripheral = self.info.get_resource_by_name("peripherals", peripheral_name)
93 if peripheral is None:
94 return
95 peripheral_id = peripheral["id"]
96 toggle_peripheral_message = {
97 "kind": "toggle_pin",
98 "args": {
99 "pin_number": {
100 "kind": "named_pin",
101 "args": {
102 "pin_type": "Peripheral",
103 "pin_id": peripheral_id,
104 }
105 }
106 }
107 }
109 self.broker.publish(toggle_peripheral_message)
111 def on(self, pin_number):
112 """Turns specified pin number `on` (100%)."""
113 self.state.print_status(description=f"Turning ON pin number {pin_number}.")
115 on_message = {
116 "kind": "write_pin",
117 "args": {
118 "pin_value": 1,
119 "pin_mode": 0,
120 "pin_number": pin_number,
121 }
122 }
124 self.broker.publish(on_message)
126 def off(self, pin_number):
127 """Turns specified pin number `off` (0%)."""
128 self.state.print_status(description=f"Turning OFF pin number {pin_number}.")
130 off_message = {
131 "kind": "write_pin",
132 "args": {
133 "pin_value": 0,
134 "pin_mode": 0,
135 "pin_number": pin_number,
136 }
137 }
139 self.broker.publish(off_message)