Skip to content

Commit f58f172

Browse files
committed
clean up slicing; PEP8isms
1 parent 8180928 commit f58f172

File tree

1 file changed

+22
-42
lines changed

1 file changed

+22
-42
lines changed

adafruit_fram.py

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ def __init__(self, max_size, write_protect=False, wp_pin=None):
6767
self._wp = write_protect
6868
self._wraparound = False
6969
if not wp_pin is None:
70-
#import digitalio
7170
self._wp_pin = wp_pin
7271
# Make sure write_prot is set to output
7372
self._wp_pin.switch_to_output()
@@ -136,9 +135,6 @@ def __getitem__(self, key):
136135
137136
# read values 0 thru 9 with a slice
138137
fram[0:9]
139-
140-
# read every other value from 0 thru 10 using a step
141-
fram[0:10:2]
142138
"""
143139
if isinstance(key, int):
144140
if key > self._max_size:
@@ -147,9 +143,11 @@ def __getitem__(self, key):
147143
buffer = bytearray(1)
148144
read_buffer = self._read_register(key, buffer)
149145
elif isinstance(key, slice):
150-
registers = list(range(key.start if not key.start is None else 0,
151-
key.stop if not key.stop is None else self._max_size,
152-
key.step if not key.step is None else 1))
146+
if key.step is not None:
147+
raise ValueError("Slice stepping is not currently available.")
148+
149+
registers = list(range(key.start if key.start is not None else 0,
150+
key.stop if key.stop is not None else self._max_size))
153151
if (registers[0] + len(registers)) > self._max_size:
154152
raise ValueError("Register + Length greater than maximum FRAM size."
155153
" ({0})".format(self._max_size))
@@ -160,52 +158,38 @@ def __getitem__(self, key):
160158
return read_buffer
161159

162160
def __setitem__(self, key, value):
163-
""" Write the value at the given index, or values in a slice.
161+
""" Write the value at the given starting index.
164162
165163
.. code-block:: python
166164
167165
# write single index
168166
fram[0] = 1
169167
170-
# write values 0 thru 4 with a slice
171-
fram[0:4] = [0,1,2,3]
172-
173-
.. note:: Slice stepping is not available when writing
168+
# write values 0 thru 4 with a list
169+
fram[0] = [0,1,2,3]
174170
"""
175171
if self.write_protected:
176172
raise RuntimeError("FRAM currently write protected.")
177173

178174
if isinstance(key, int):
179-
if not isinstance(value, int):
180-
raise ValueError("Data must be an integer.")
175+
if not isinstance(value, (int, bytearray, list, tuple)):
176+
raise ValueError("Data must be a single integer, or a bytearray,"
177+
" list, or tuple.")
181178
if key > self._max_size:
182179
raise ValueError("Requested register '{0}' greater than maximum"
183180
" FRAM size. ({1})".format(key,
184181
self._max_size))
185182

186-
self._write_register(key, value)
183+
self._write(key, value, self._wraparound)
187184

188185
elif isinstance(key, slice):
189-
if not isinstance(value, (bytearray, list, tuple)):
190-
raise ValueError("Data must be either a bytearray, list, or tuple.")
191-
if key.start > self._max_size:
192-
raise ValueError("Requested register '{0}' greater than maximum"
193-
" FRAM size. ({1})".format(key.start,
194-
self._max_size))
195-
if not key.step is None:
196-
raise ValueError("Slice steps are not allowed during write operations.")
197-
198-
self._write_page(key.start, value, self._wraparound)
186+
raise ValueError("Slicing not available during write operations.")
199187

200-
def _read_register(self, register):
188+
def _read_register(self, register, buffer):
201189
# Implemented by subclass
202190
raise NotImplementedError
203191

204-
def _write_register(self, register, data):
205-
# Implemented by subclass
206-
raise NotImplementedError
207-
208-
def _write_page(self, start_register, data, wraparound):
192+
def _write(self, start_register, data, wraparound):
209193
# Implemened by subclass
210194
raise NotImplementedError
211195

@@ -244,23 +228,19 @@ def _read_register(self, register, read_buffer):
244228
i2c.write_then_readinto(write_buffer, read_buffer)
245229
return read_buffer
246230

247-
def _write_register(self, register, data):
248-
buffer = bytearray(3)
249-
buffer[0] = register >> 8
250-
buffer[1] = register & 0xFF
251-
buffer[2] = data
252-
with self._i2c as i2c:
253-
i2c.write(buffer)
254-
255-
def _write_page(self, start_register, data, wraparound=False):
231+
def _write(self, start_register, data, wraparound=False):
256232
# Decided against using the chip's "Page Write", since that would require
257233
# doubling the memory usage by creating a buffer that includes the passed
258234
# in data so that it can be sent all in one `i2c.write`. The single-write
259235
# method is slower, and forces us to handle wraparound, but I feel this
260236
# is a better tradeoff for limiting the memory required for large writes.
261237
buffer = bytearray(3)
262-
data_length = len(data)
263-
if (start_register + data_length) > self._max_size:
238+
if not isinstance(data, int):
239+
data_length = len(data)
240+
else:
241+
data_length = 1
242+
data = [data]
243+
if (start_register + data_length) - 1 > self._max_size:
264244
if wraparound:
265245
pass
266246
else:

0 commit comments

Comments
 (0)