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

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 

16class Peripherals(): 

17 """Peripherals class.""" 

18 def __init__(self, state): 

19 self.broker = BrokerConnect(state) 

20 self.info = Information(state) 

21 self.state = state 

22 

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

26 

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 

32 

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 } 

40 

41 self.broker.publish(control_servo_message) 

42 

43 return 

44 

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

50 

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 } 

59 

60 self.broker.publish(write_pin_message) 

61 

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

65 

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 

71 

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 } 

86 

87 self.broker.publish(control_peripheral_message) 

88 

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 } 

108 

109 self.broker.publish(toggle_peripheral_message) 

110 

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

114 

115 on_message = { 

116 "kind": "write_pin", 

117 "args": { 

118 "pin_value": 1, 

119 "pin_mode": 0, 

120 "pin_number": pin_number, 

121 } 

122 } 

123 

124 self.broker.publish(on_message) 

125 

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

129 

130 off_message = { 

131 "kind": "write_pin", 

132 "args": { 

133 "pin_value": 0, 

134 "pin_mode": 0, 

135 "pin_number": pin_number, 

136 } 

137 } 

138 

139 self.broker.publish(off_message)