Coverage for farmbot_sidecar_starter_pack/functions/peripherals.py: 100%

49 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-09-11 15:44 -0700

1""" 

2Peripherals class. 

3""" 

4 

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() 

12 

13from .broker import BrokerConnect 

14from .information import Information 

15 

16 

17class Peripherals(): 

18 """Peripherals class.""" 

19 

20 def __init__(self, state): 

21 self.broker = BrokerConnect(state) 

22 self.info = Information(state) 

23 self.state = state 

24 

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}.") 

28 

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 

34 

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 } 

42 

43 self.broker.publish(control_servo_message) 

44 

45 return 

46 

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}).") 

52 

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 } 

61 

62 self.broker.publish(write_pin_message) 

63 

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}.") 

68 

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) 

78 

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 } 

93 

94 self.broker.publish(control_peripheral_message) 

95 

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 } 

117 

118 self.broker.publish(toggle_peripheral_message) 

119 

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}.") 

124 

125 on_message = { 

126 "kind": "write_pin", 

127 "args": { 

128 "pin_value": 1, 

129 "pin_mode": 0, 

130 "pin_number": pin_number, 

131 } 

132 } 

133 

134 self.broker.publish(on_message) 

135 

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}.") 

140 

141 off_message = { 

142 "kind": "write_pin", 

143 "args": { 

144 "pin_value": 0, 

145 "pin_mode": 0, 

146 "pin_number": pin_number, 

147 } 

148 } 

149 

150 self.broker.publish(off_message)