Skip to content

Commit c9b3a8d

Browse files
committed
Merge branch 'staging' into main
2 parents d68bc67 + b78fb4b commit c9b3a8d

File tree

25 files changed

+366
-276
lines changed

25 files changed

+366
-276
lines changed

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
[bumpversion]
22
tag_name = rc/v{new_version}
3-
current_version = 1.2.6
3+
current_version = 1.2.8

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
setuptools.setup(
99
name="edgepi-python-sdk",
10-
version="1.2.6",
10+
version="1.2.8",
1111
author="S.Park",
1212
author_email="spark@osensa.com",
1313
description="EdgePi Python SDK package",

src/edgepi/adc/edgepi_adc.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,11 @@ def __read_register(self, start_addx: ADCReg, num_regs: int = 1):
212212
if num_regs < 1:
213213
raise ValueError("Number of registers to read must be at least 1")
214214
code = self.adc_ops.read_register_command(start_addx.value, num_regs)
215-
out = self.transfer(code)
216-
_logger.debug(f"__read_register: received {out}")
217-
# first 2 entries are null bytes
218-
return out[2:]
215+
with self.spi_open():
216+
out = self.transfer(code)
217+
_logger.debug(f"__read_register: received {out}")
218+
# first 2 entries are null bytes
219+
return out[2:]
219220

220221
def __write_register(self, start_addx: ADCReg, data: list[int]):
221222
"""
@@ -231,7 +232,8 @@ def __write_register(self, start_addx: ADCReg, data: list[int]):
231232
raise ValueError("Number of registers to write to must be at least 1")
232233
code = self.adc_ops.write_register_command(start_addx.value, data)
233234
_logger.debug(f"__write_register: sending {code}")
234-
out = self.transfer(code)
235+
with self.spi_open():
236+
out = self.transfer(code)
235237
return out
236238

237239
def __set_rtd_pin(self, enable: bool = False):
@@ -273,12 +275,14 @@ def stop_conversions(self, adc_num: ADCNum):
273275
Halt voltage read conversions when ADC is set to perform continuous conversions
274276
"""
275277
stop_cmd = self.adc_ops.stop_adc(adc_num=adc_num.value)
276-
self.transfer(stop_cmd)
278+
with self.spi_open():
279+
self.transfer(stop_cmd)
277280

278281
def __send_start_command(self, adc_num: ADCNum):
279282
"""Triggers ADC conversion(s)"""
280283
start_cmd = self.adc_ops.start_adc(adc_num=adc_num.value)
281-
self.transfer(start_cmd)
284+
with self.spi_open():
285+
self.transfer(start_cmd)
282286

283287
def start_conversions(self, adc_num: ADCNum):
284288
"""
@@ -321,7 +325,8 @@ def clear_reset_bit(self):
321325

322326
def __read_data(self, adc: ADCNum, data_size: int):
323327
"""Sends command to ADC to get new voltage conversion data"""
324-
return self.transfer([adc.value.read_cmd] + [255] * data_size)
328+
with self.spi_open():
329+
return self.transfer([adc.value.read_cmd] + [255] * data_size)
325330

326331
def __voltage_read(self, adc_num: ADCNum):
327332
"""
@@ -554,19 +559,21 @@ def reset(self):
554559
Note this state differs from ADS1263 default power-on, due to
555560
application of custom power-on configurations required by EdgePi.
556561
"""
557-
self.transfer(self.adc_ops.reset_adc())
562+
with self.spi_open():
563+
self.transfer(self.adc_ops.reset_adc())
558564
self.__reapply_config()
559565

560566
def __is_data_ready(self, adc_num: ADCNum):
561567
# pylint: disable=unused-private-member
562568
# required for integration testing in test_conversion_times.py
563569
"""Utility for testing conversion times, returns True if ADC indicates new voltage data"""
564-
read_data = self.transfer([adc_num.value.read_cmd] + [255] * 6)
565-
if adc_num is ADCNum.ADC_1:
566-
ready = (read_data[1] & 0b01000000) == 0b01000000
567-
if adc_num is ADCNum.ADC_2:
568-
ready = (read_data[1] & 0b10000000) == 0b10000000
569-
return ready
570+
with self.spi_open():
571+
read_data = self.transfer([adc_num.value.read_cmd] + [255] * 6)
572+
if adc_num is ADCNum.ADC_1:
573+
ready = (read_data[1] & 0b01000000) == 0b01000000
574+
if adc_num is ADCNum.ADC_2:
575+
ready = (read_data[1] & 0b10000000) == 0b10000000
576+
return ready
570577

571578
def __read_registers_to_map(self):
572579
"""

src/edgepi/dac/edgepi_dac.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ def write_voltage(self, analog_out: DACChannel, voltage: float):
124124
self.log.debug(f'Code: {code}')
125125

126126
# update DAC register
127-
self.transfer(self.dac_ops.generate_write_and_update_command(analog_out.value, code))
127+
with self.spi_open():
128+
self.transfer(self.dac_ops.generate_write_and_update_command(analog_out.value, code))
128129
# send voltage to analog out pin
129130
self.__send_to_gpio_pins(analog_out.value, voltage)
130131
return code
@@ -145,15 +146,17 @@ def set_power_mode(self, analog_out: DACChannel, power_mode: PowerMode):
145146
self.__dac_power_state[analog_out.value] = power_mode.value
146147
power_code = self.dac_ops.generate_power_code(self.__dac_power_state.values())
147148
cmd = self.dac_ops.combine_command(COM.COM_POWER_DOWN_OP.value, NULL_BITS, power_code)
148-
self.transfer(cmd)
149+
with self.spi_open():
150+
self.transfer(cmd)
149151

150152
def reset(self):
151153
"""
152154
Performs a software reset of the EdgePi DAC to power-on default values,
153155
and stops all voltage transmissions through pins.
154156
"""
155157
cmd = self.dac_ops.combine_command(COM.COM_SW_RESET.value, NULL_BITS, SW_RESET)
156-
self.transfer(cmd)
158+
with self.spi_open():
159+
self.transfer(cmd)
157160

158161
def channel_readback(self, analog_out: DACChannel) -> int:
159162
"""
@@ -170,10 +173,11 @@ def channel_readback(self, analog_out: DACChannel) -> int:
170173
cmd = self.dac_ops.combine_command(
171174
COM.COM_READBACK.value, DACChannel(analog_out.value).value, NULL_BITS
172175
)
173-
self.transfer(cmd)
174-
# all zero dummy command to trigger second transfer which
175-
# contains the DAC register contents.
176-
read_data = self.transfer([NULL_BITS, NULL_BITS, NULL_BITS])
176+
with self.spi_open():
177+
self.transfer(cmd)
178+
# all zero dummy command to trigger second transfer which
179+
# contains the DAC register contents.
180+
read_data = self.transfer([NULL_BITS, NULL_BITS, NULL_BITS])
177181
self.log.debug(f"reading code {read_data}")
178182
return self.dac_ops.extract_read_data(read_data)
179183

@@ -247,18 +251,19 @@ def __auto_code_handler(self, set_gain: bool):
247251
# gain have different steps of sending code value and toggling the GPIO pin.
248252

249253
# gain being enabled, change code first than enable gain
250-
if set_gain:
251-
for ch, code in enumerate(codes):
252-
# update DAC register
253-
self.transfer(self.dac_ops.generate_write_and_update_command(ch, code))
254-
self.gpio.set_pin_state(GainPin.DAC_GAIN.value)
255-
256-
# Disabling gain, change gain first than change codes
257-
else:
258-
self.gpio.clear_pin_state(GainPin.DAC_GAIN.value)
259-
for ch, code in enumerate(codes):
260-
# update DAC register
261-
self.transfer(self.dac_ops.generate_write_and_update_command(ch, code))
254+
with self.spi_open():
255+
if set_gain:
256+
for ch, code in enumerate(codes):
257+
# update DAC register
258+
self.transfer(self.dac_ops.generate_write_and_update_command(ch, code))
259+
self.gpio.set_pin_state(GainPin.DAC_GAIN.value)
260+
261+
# Disabling gain, change gain first than change codes
262+
else:
263+
self.gpio.clear_pin_state(GainPin.DAC_GAIN.value)
264+
for ch, code in enumerate(codes):
265+
# update DAC register
266+
self.transfer(self.dac_ops.generate_write_and_update_command(ch, code))
262267

263268
def set_dac_gain(self, set_gain: bool, auto_code_change: bool = False):
264269
"""

src/edgepi/eeprom/edgepi_eeprom.py

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ def __allocated_memory(self, offset):
8282
Return:
8383
length (int): size of memory to read
8484
'''
85-
read_data = self.__sequential_read(offset, EEPROMInfo.PAGE_SIZE.value)
85+
with self.i2c_open():
86+
read_data = self.__sequential_read(offset, EEPROMInfo.PAGE_SIZE.value)
8687
check_crc(read_data[:-1], read_data[-1])
8788
return (read_data[0]<<8)| read_data[1]
8889

@@ -124,10 +125,11 @@ def __write_edgepi_reserved_memory(self, pb_serial_list: bytes):
124125
pages = self.__generate_list_of_pages_crc(data)
125126

126127
mem_offset = start_mem
127-
for page in pages:
128-
self.__page_write_register(mem_offset, page)
129-
mem_offset = mem_offset+len(page)
130-
time.sleep(PAGE_WRITE_CYCLE_TIME)
128+
with self.i2c_open():
129+
for page in pages:
130+
self.__page_write_register(mem_offset, page)
131+
mem_offset = mem_offset+len(page)
132+
time.sleep(PAGE_WRITE_CYCLE_TIME)
131133

132134
def __read_edgepi_reserved_memory(self):
133135
'''
@@ -149,11 +151,12 @@ def __read_edgepi_reserved_memory(self):
149151
int((buff_and_len)/(page_size-CRC_BYTE_SIZE))+1
150152

151153
mem_offset = EdgePiMemoryInfo.PRIVATE_SPACE_START_BYTE.value
152-
for page in range(num_pages):
153-
buff_list = self.__sequential_read(mem_offset+(page*page_size), page_size)
154-
check_crc(buff_list[:-1], buff_list[-1])
155-
buff+=buff_list[:-1]
156-
time.sleep(0.01)
154+
with self.i2c_open():
155+
for page in range(num_pages):
156+
buff_list = self.__sequential_read(mem_offset+(page*page_size), page_size)
157+
check_crc(buff_list[:-1], buff_list[-1])
158+
buff+=buff_list[:-1]
159+
time.sleep(0.01)
157160
return bytes(buff[2:buff_and_len])
158161

159162
def read_edgepi_data(self):
@@ -290,10 +293,11 @@ def read_user_space(self, mem_size: int = None):
290293
num_pages = int((buff_and_len)/(page_size-CRC_BYTE_SIZE))+1
291294

292295
mem_offset = EdgePiMemoryInfo.USER_SPACE_START_BYTE.value
293-
for page in range(num_pages):
294-
buff_list = self.__sequential_read(mem_offset+(page*page_size), page_size)
295-
check_crc(buff_list[:-1], buff_list[-1])
296-
buff+=buff_list[:-1]
296+
with self.i2c_open():
297+
for page in range(num_pages):
298+
buff_list = self.__sequential_read(mem_offset+(page*page_size), page_size)
299+
check_crc(buff_list[:-1], buff_list[-1])
300+
buff+=buff_list[:-1]
297301
return buff[2:buff_and_len]
298302

299303
def write_user_space(self, data: bytes):
@@ -314,10 +318,11 @@ def write_user_space(self, data: bytes):
314318
pages = self.__generate_list_of_pages_crc(data)
315319

316320
mem_offset = start_mem
317-
for page in pages:
318-
self.__page_write_register(mem_offset, page)
319-
mem_offset = mem_offset+len(page)
320-
time.sleep(PAGE_WRITE_CYCLE_TIME)
321+
with self.i2c_open():
322+
for page in pages:
323+
self.__page_write_register(mem_offset, page)
324+
mem_offset = mem_offset+len(page)
325+
time.sleep(PAGE_WRITE_CYCLE_TIME)
321326

322327
# TODO why not separate it into a class
323328
def init_memory(self):
@@ -381,10 +386,11 @@ def reset_user_space(self):
381386
reset_vals = [255] * page_size
382387

383388
mem_offset = start_address_page
384-
for _ in range(tatal_page):
385-
self.__page_write_register(mem_offset, reset_vals)
386-
mem_offset = mem_offset+page_size
387-
time.sleep(PAGE_WRITE_CYCLE_TIME)
389+
with self.i2c_open():
390+
for _ in range(tatal_page):
391+
self.__page_write_register(mem_offset, reset_vals)
392+
mem_offset = mem_offset+page_size
393+
time.sleep(PAGE_WRITE_CYCLE_TIME)
388394

389395
def reset_edgepi_memory(self, bin_hash: str = None, bin_bytes: bytes = None):
390396
"""

src/edgepi/gpio/edgepi_gpio_chip.py

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,10 @@ def read_gpio_pin_state(self, pin_name: str = None):
3939
Returns:
4040
`bool`: True if state is high, False if state is low
4141
"""
42-
self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
42+
with self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
4343
pin_dir=self.gpiochip_pins_dict[pin_name].dir,
44-
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
45-
state = self.read_state()
46-
self.close_gpio()
44+
pin_bias=self.gpiochip_pins_dict[pin_name].bias):
45+
state = self.read_state()
4746
return state
4847

4948
def write_gpio_pin_state(self, pin_name: str = None, state: bool = None):
@@ -55,12 +54,11 @@ def write_gpio_pin_state(self, pin_name: str = None, state: bool = None):
5554
Return:
5655
N/A
5756
"""
58-
self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
57+
with self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
5958
pin_dir=self.gpiochip_pins_dict[pin_name].dir,
60-
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
61-
self.write_state(state)
62-
read_back = self.read_state()
63-
self.close_gpio()
59+
pin_bias=self.gpiochip_pins_dict[pin_name].bias):
60+
self.write_state(state)
61+
read_back = self.read_state()
6462
return read_back
6563

6664
def set_gpio_pin_dir(self, pin_name: str = None, direction: bool = None):
@@ -70,10 +68,10 @@ def set_gpio_pin_dir(self, pin_name: str = None, direction: bool = None):
7068
pin_name (str): name of the pin
7169
direction (bool): direction to write, True = Input, False = Output
7270
"""
73-
self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
71+
with self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
7472
pin_dir="in" if direction else "out",
75-
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
76-
self.close_gpio()
73+
pin_bias=self.gpiochip_pins_dict[pin_name].bias):
74+
return self.gpio.direction
7775

7876
def toggle_gpio_pin_state(self, pin_name: str = None):
7977
"""
@@ -83,12 +81,9 @@ def toggle_gpio_pin_state(self, pin_name: str = None):
8381
Return:
8482
N/A
8583
"""
86-
self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
84+
with self.open_gpio(pin_num=self.__pin_name_dict[pin_name],
8785
pin_dir=self.gpiochip_pins_dict[pin_name].dir,
88-
pin_bias=self.gpiochip_pins_dict[pin_name].bias)
89-
state = self.read_state()
90-
if state:
91-
self.write_state(False)
92-
else:
93-
self.write_state(True)
94-
self.close_gpio()
86+
pin_bias=self.gpiochip_pins_dict[pin_name].bias):
87+
state = self.read_state()
88+
self.write_state(not state)
89+

src/edgepi/gpio/edgepi_gpio_expander.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,13 @@ def __read_register(self, reg_address: int, dev_address: int) -> int:
3232
Returns:
3333
`int`: 8-bit uint value of port/register
3434
'''
35-
msg_read = self.set_read_msg(reg_address, [0xFF])
36-
_logger.debug(f"Read Message: Register Address {msg_read[0].data}"
37-
f", Msg Place Holder {msg_read[1].data}")
38-
self.transfer(dev_address, msg_read)
39-
_logger.debug(f"Message Read: Register Address {msg_read[0].data},"
40-
f"Msg Place Holder {msg_read[1].data}")
35+
with self.i2c_open():
36+
msg_read = self.set_read_msg(reg_address, [0xFF])
37+
_logger.debug(f"Read Message: Register Address {msg_read[0].data}"
38+
f", Msg Place Holder {msg_read[1].data}")
39+
self.transfer(dev_address, msg_read)
40+
_logger.debug(f"Message Read: Register Address {msg_read[0].data},"
41+
f"Msg Place Holder {msg_read[1].data}")
4142
return msg_read[1].data[0]
4243

4344
def __write_changed_values(self, reg_dict: dict, dev_address: int):
@@ -50,11 +51,12 @@ def __write_changed_values(self, reg_dict: dict, dev_address: int):
5051
Returns:
5152
void
5253
'''
53-
for reg_addx, entry in reg_dict.items():
54-
if entry['is_changed']:
55-
msg_write = self.set_write_msg(reg_addx, [entry['value']])
56-
_logger.debug(f'Write Message Content {msg_write[0]}')
57-
self.transfer(dev_address, msg_write)
54+
with self.i2c_open():
55+
for reg_addx, entry in reg_dict.items():
56+
if entry['is_changed']:
57+
msg_write = self.set_write_msg(reg_addx, [entry['value']])
58+
_logger.debug(f'Write Message Content {msg_write[0]}')
59+
self.transfer(dev_address, msg_write)
5860

5961
def read_expander_pin(self, pin_name: str) -> bool:
6062
'''

0 commit comments

Comments
 (0)