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

42 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-08-31 13:41 -0700

1""" 

2Peripherals class. 

3""" 

4 

5# └── functions/peripherals.py 

6# ├── [BROKER] control_servo() 

7# ├── [BROKER] control_peripheral() 

8# ├── [BROKER] toggle_peripheral() 

9# ├── [BROKER] on() 

10# └── [BROKER] off() 

11 

12from .broker import BrokerConnect 

13from .information import Information 

14 

15class Peripherals(): 

16 """Peripherals class.""" 

17 def __init__(self, state): 

18 self.broker = BrokerConnect(state) 

19 self.info = Information(state) 

20 self.state = state 

21 

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

25 

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 

31 

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 } 

39 

40 self.broker.publish(control_servo_message) 

41 

42 return 

43 

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

47 

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 

53 

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 } 

68 

69 self.broker.publish(control_peripheral_message) 

70 

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 } 

90 

91 self.broker.publish(toggle_peripheral_message) 

92 

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

96 

97 on_message = { 

98 "kind": "write_pin", 

99 "args": { 

100 "pin_value": 1, 

101 "pin_mode": 0, 

102 "pin_number": pin_number, 

103 } 

104 } 

105 

106 self.broker.publish(on_message) 

107 

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

111 

112 off_message = { 

113 "kind": "write_pin", 

114 "args": { 

115 "pin_value": 0, 

116 "pin_mode": 0, 

117 "pin_number": pin_number, 

118 } 

119 } 

120 

121 self.broker.publish(off_message)