Skip to content

Commit 7c5cd6a

Browse files
authored
Gpio refactor 154 (#167)
* added gpio exception, gpio write, need some testing on the hardware #166 #154 #155 * added set direction in out function, get direction function * edgepi gpio methods gets enum values typed string * changed function name used in different modules * fixed pytest and pylint issues * added toggle pin * deleted unused module * PR #167 suggested fix - added __pin_name_check() - added more tests
1 parent c18b963 commit 7c5cd6a

File tree

16 files changed

+441
-326
lines changed

16 files changed

+441
-326
lines changed

src/edgepi/adc/edgepi_adc.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -351,17 +351,17 @@ def set_adc_reference(self, reference_config: ADCReferenceSwitching = None):
351351
reference_config: (ADCReferenceSwitching): selecting none, 1, 2, both
352352
"""
353353
if reference_config == ADCReferenceSwitching.GND_SW1.value:
354-
self.gpio.set_expander_pin(ADCPins.GNDSW_IN1.value)
355-
self.gpio.clear_expander_pin(ADCPins.GNDSW_IN2.value)
354+
self.gpio.set_pin_state(ADCPins.GNDSW_IN1.value)
355+
self.gpio.clear_pin_state(ADCPins.GNDSW_IN2.value)
356356
elif reference_config == ADCReferenceSwitching.GND_SW2.value:
357-
self.gpio.set_expander_pin(ADCPins.GNDSW_IN2.value)
358-
self.gpio.clear_expander_pin(ADCPins.GNDSW_IN1.value)
357+
self.gpio.set_pin_state(ADCPins.GNDSW_IN2.value)
358+
self.gpio.clear_pin_state(ADCPins.GNDSW_IN1.value)
359359
elif reference_config == ADCReferenceSwitching.GND_SW_BOTH.value:
360-
self.gpio.set_expander_pin(ADCPins.GNDSW_IN1.value)
361-
self.gpio.set_expander_pin(ADCPins.GNDSW_IN2.value)
360+
self.gpio.set_pin_state(ADCPins.GNDSW_IN1.value)
361+
self.gpio.set_pin_state(ADCPins.GNDSW_IN2.value)
362362
elif reference_config == ADCReferenceSwitching.GND_SW_NONE.value:
363-
self.gpio.clear_expander_pin(ADCPins.GNDSW_IN1.value)
364-
self.gpio.clear_expander_pin(ADCPins.GNDSW_IN2.value)
363+
self.gpio.clear_pin_state(ADCPins.GNDSW_IN1.value)
364+
self.gpio.clear_pin_state(ADCPins.GNDSW_IN2.value)
365365

366366
def stop_conversions(self, adc_num: ADCNum):
367367
"""

src/edgepi/dac/edgepi_dac.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ def __send_to_gpio_pins(self, analog_out: int, voltage: float):
6464
ao_pin = self.__analog_out_pin_map[analog_out].value
6565

6666
if voltage > 0:
67-
self.gpio.set_expander_pin(ao_pin)
67+
self.gpio.set_pin_state(ao_pin)
6868
elif voltage == 0:
69-
self.gpio.clear_expander_pin(ao_pin)
69+
self.gpio.clear_pin_state(ao_pin)
7070
else:
7171
raise ValueError("voltage cannot be negative")
7272

@@ -91,7 +91,7 @@ def write_voltage(self, analog_out: DACChannel, voltage: float):
9191
self.log.debug(f'Code: {code}')
9292

9393
if self.gpio.get_pin_direction(self.__analog_out_pin_map[analog_out.value].value):
94-
self.gpio.clear_expander_pin(self.__analog_out_pin_map[analog_out.value].value)
94+
self.gpio.clear_pin_state(self.__analog_out_pin_map[analog_out.value].value)
9595
self.gpio.set_pin_direction_out(self.__analog_out_pin_map[analog_out.value].value)
9696

9797
# update DAC register
@@ -176,8 +176,8 @@ def enable_dac_gain(self, enable: bool = None):
176176
gain_state (bool): state of the gain pin
177177
"""
178178
# pylint: disable=expression-not-assigned
179-
self.gpio.set_expander_pin(GainPin.DAC_GAIN.value) if enable else \
180-
self.gpio.clear_expander_pin(GainPin.DAC_GAIN.value)
179+
self.gpio.set_pin_state(GainPin.DAC_GAIN.value) if enable else \
180+
self.gpio.clear_pin_state(GainPin.DAC_GAIN.value)
181181
return self.__get_gain_state()
182182

183183
def __get_gain_state(self):

src/edgepi/gpio/edgepi_gpio.py

Lines changed: 104 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99

1010
_logger = logging.getLogger(__name__)
1111

12+
class PinNameNoneError(Exception):
13+
"""Raised when None is passed"""
14+
15+
class PinNameNotFound(Exception):
16+
""""Raised when name doesn't exist"""
17+
18+
1219
class EdgePiGPIO(EdgePiGPIOExpander, EdgePiGPIOChip):
1320
'''
1421
A class used to represent the GPIO Expander configuration for an I2C Device.
@@ -20,8 +27,11 @@ def __init__(self):
2027
EdgePiGPIOExpander.__init__(self)
2128
EdgePiGPIOChip.__init__(self)
2229

23-
# TODO: add generic functions read, write, set, clear methods. depending on the pin name,
24-
# the proper methods will get called
30+
def __pin_name_check(self, pin_name: str = None):
31+
if pin_name is None:
32+
raise PinNameNoneError(f'Missing Pin name: {pin_name}')
33+
if pin_name not in self.expander_pin_dict and pin_name not in self.gpiochip_pins_dict:
34+
raise PinNameNotFound(f'The following pin name: {pin_name} is not found')
2535

2636
def read_pin_state(self, pin_name: str = None):
2737
"""
@@ -31,9 +41,97 @@ def read_pin_state(self, pin_name: str = None):
3141
return
3242
state (bool): True/False depending on High/Low
3343
"""
44+
state = None
45+
self.__pin_name_check(pin_name)
46+
if pin_name in self.expander_pin_dict:
47+
state = self.read_expander_pin(pin_name)
48+
if pin_name in self.gpiochip_pins_dict:
49+
state = self.read_gpio_pin_state(pin_name)
50+
return state
51+
52+
53+
def set_pin_state(self, pin_name: str = None):
54+
"""
55+
Set corresponding pin state to high
56+
Args:
57+
pin_name(str): name of the pin will be passed as Enum
58+
return:
59+
N/A
60+
"""
61+
self.__pin_name_check(pin_name)
62+
if pin_name in self.expander_pin_dict:
63+
self.set_expander_pin(pin_name)
64+
if pin_name in self.gpiochip_pins_dict:
65+
self.write_gpio_pin_state(pin_name, True)
66+
67+
def clear_pin_state(self, pin_name: str = None):
68+
"""
69+
Clearcorresponding pin state to high
70+
Args:
71+
pin_name(str): name of the pin will be passed as Enum
72+
return:
73+
N/A
74+
"""
75+
self.__pin_name_check(pin_name)
76+
if pin_name in self.expander_pin_dict:
77+
self.clear_expander_pin(pin_name)
78+
if pin_name in self.gpiochip_pins_dict:
79+
self.write_gpio_pin_state(pin_name, False)
80+
81+
def get_pin_direction(self, pin_name: str = None):
82+
"""
83+
Get GPIO pin direction
84+
Args:
85+
pin_name(str): name of the pin
86+
Return:
87+
direction (bool): True if direction is input, False if direction is output
88+
"""
89+
direction = None
90+
self.__pin_name_check(pin_name)
91+
if pin_name in self.expander_pin_dict:
92+
direction = self.get_expander_pin_direction(pin_name)
93+
if pin_name in self.gpiochip_pins_dict:
94+
direction = bool(self.gpiochip_pins_dict[pin_name].dir == "in")
95+
return direction
96+
97+
def set_pin_direction_in(self, pin_name: str = None):
98+
"""
99+
Set GPIO pin direction to input
100+
Args:
101+
pin_name(str): name of the pin
102+
Return:
103+
N/A
104+
"""
105+
self.__pin_name_check(pin_name)
106+
if pin_name in self.expander_pin_dict:
107+
self.set_expander_pin_direction_in(pin_name)
108+
if pin_name in self.gpiochip_pins_dict:
109+
self.set_gpio_pin_dir(pin_name, True)
110+
111+
def set_pin_direction_out(self, pin_name: str = None):
112+
"""
113+
Set GPIO pin direction to output
114+
Args:
115+
pin_name(str): name of the pin
116+
Return:
117+
N/A
118+
"""
119+
self.__pin_name_check(pin_name)
120+
if pin_name in self.expander_pin_dict:
121+
self.set_expander_pin_direction_out(pin_name)
122+
if pin_name in self.gpiochip_pins_dict:
123+
self.set_gpio_pin_dir(pin_name, False)
124+
125+
def toggle_pin(self, pin_name: str = None):
126+
"""
127+
Toggle GPIO pin
128+
Args:
129+
pin_name (str): name of the pin
130+
Return:
131+
N/A
132+
"""
133+
self.__pin_name_check(pin_name)
34134
if pin_name in self.expander_pin_dict:
35-
return self.read_expander_pin(pin_name)
135+
self.toggle_expander_pin(pin_name)
36136
if pin_name in self.gpiochip_pins_dict:
37-
return self.read_gpio_pin_state(pin_name)
38-
_logger.error("pin_name doesn't exists")
39-
return None
137+
self.toggle_gpio_pin_state(pin_name)

src/edgepi/gpio/edgepi_gpio_chip.py

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ class EdgePiGPIOChip(GpioDevice):
2727
DOUTPins.DOUT2.value : 12}
2828

2929
def __init__(self):
30-
#pylint: disable=super-init-not-called
3130
super().__init__(GpioDevPaths.GPIO_CIHP_DEV_PATH.value)
3231
self.gpiochip_pins_dict = generate_gpiochip_pin_info()
3332

@@ -42,8 +41,55 @@ def read_gpio_pin_state(self, pin_name: str = None):
4241
`bool`: True if state is high, False if state is low
4342
"""
4443
self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
45-
pin_dir=self.gpiochip_pins_dict[pin_name].dir,
46-
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
44+
pin_dir=self.gpiochip_pins_dict[pin_name].dir,
45+
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
4746
state = self.read_state()
4847
self.close()
4948
return state
49+
50+
def write_gpio_pin_state(self, pin_name: str = None, state: bool = None):
51+
"""
52+
write pin state
53+
Args:
54+
pin_name (str): name of the pin to write state to
55+
state (bool): state to write, True = High, False = Low
56+
Return:
57+
N/A
58+
"""
59+
self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
60+
pin_dir=self.gpiochip_pins_dict[pin_name].dir,
61+
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
62+
self.write_state(state)
63+
read_back = self.read_state()
64+
self.close()
65+
return read_back
66+
67+
def set_gpio_pin_dir(self, pin_name: str = None, direction: bool = None):
68+
"""
69+
Set gpio pin direction
70+
Args:
71+
pin_name (str): name of the pin
72+
direction (bool): direction to write, True = Input, False = Output
73+
"""
74+
self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
75+
pin_dir="in" if direction else "out",
76+
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
77+
self.close()
78+
79+
def toggle_gpio_pin_state(self, pin_name: str = None):
80+
"""
81+
Toggle pin state
82+
Args:
83+
pin_name (str): name of the pin to write state to
84+
Return:
85+
N/A
86+
"""
87+
self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
88+
pin_dir=self.gpiochip_pins_dict[pin_name].dir,
89+
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
90+
state = self.read_state()
91+
if state:
92+
self.write_state(False)
93+
else:
94+
self.write_state(True)
95+
self.close()

src/edgepi/gpio/edgepi_gpio_expander.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def read_expander_pin(self, pin_name: str) -> bool:
7777

7878
return pin_state
7979

80-
def get_pin_direction(self, pin_name: str) -> bool:
80+
def get_expander_pin_direction(self, pin_name: str) -> bool:
8181
'''
8282
Get the current direction of a GPIO expander pin (low or high).
8383
@@ -95,11 +95,11 @@ def get_pin_direction(self, pin_name: str) -> bool:
9595
# read register at reg_addx
9696
reg_val = self.__read_register(reg_addx, dev_address)
9797
pin_state = is_bit_set(reg_val, pin_mask)
98-
_logger.debug(":get_pin_direction: pin '%s' = '%s'", pin_name, pin_state)
98+
_logger.debug(":get_expander_pin_direction: pin '%s' = '%s'", pin_name, pin_state)
9999

100100
return pin_state
101101

102-
def set_pin_direction_out(self, pin_name: str):
102+
def set_expander_pin_direction_out(self, pin_name: str):
103103
'''
104104
Set the direction of a GPIO expander pin to output. Note this will
105105
set pin to low before setting to output for safety reasons.
@@ -119,11 +119,11 @@ def set_pin_direction_out(self, pin_name: str):
119119

120120
# set pin direction to out
121121
self.__apply_code_to_register(dev_address, reg_addx, reg_val, dir_out_code)
122-
_logger.debug(":set_pin_direction_out: pin '%s' set to output", pin_name)
122+
_logger.debug(":set_expander_pin_direction_out: pin '%s' set to output", pin_name)
123123

124124
self.expander_pin_dict[pin_name].is_out = True
125125

126-
def set_pin_direction_in(self, pin_name: str):
126+
def set_expander_pin_direction_in(self, pin_name: str):
127127
'''
128128
Set the direction of a GPIO expander pin to high impedance input.
129129
@@ -139,7 +139,7 @@ def set_pin_direction_in(self, pin_name: str):
139139

140140
# set pin direction to input
141141
self.__apply_code_to_register(dev_address, reg_addx, reg_val, dir_in_code)
142-
_logger.debug(":set_pin_direction_in: pin '%s' set to output", pin_name)
142+
_logger.debug(":set_expander_pin_direction_in: pin '%s' set to output", pin_name)
143143

144144
self.expander_pin_dict[pin_name].is_out = False
145145

@@ -158,7 +158,7 @@ def set_expander_pin(self, pin_name: str):
158158
reg_val = self.__read_register(reg_addx, dev_address)
159159

160160
# set pin direction to output (also sets to low)
161-
self.set_pin_direction_out(pin_name)
161+
self.set_expander_pin_direction_out(pin_name)
162162

163163
# set pin state to high
164164
self.__apply_code_to_register(dev_address, reg_addx, reg_val, set_code)

0 commit comments

Comments
 (0)