@@ -67,7 +67,6 @@ def __init__(self, max_size, write_protect=False, wp_pin=None):
67
67
self ._wp = write_protect
68
68
self ._wraparound = False
69
69
if not wp_pin is None :
70
- #import digitalio
71
70
self ._wp_pin = wp_pin
72
71
# Make sure write_prot is set to output
73
72
self ._wp_pin .switch_to_output ()
@@ -136,9 +135,6 @@ def __getitem__(self, key):
136
135
137
136
# read values 0 thru 9 with a slice
138
137
fram[0:9]
139
-
140
- # read every other value from 0 thru 10 using a step
141
- fram[0:10:2]
142
138
"""
143
139
if isinstance (key , int ):
144
140
if key > self ._max_size :
@@ -147,9 +143,11 @@ def __getitem__(self, key):
147
143
buffer = bytearray (1 )
148
144
read_buffer = self ._read_register (key , buffer )
149
145
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 ))
153
151
if (registers [0 ] + len (registers )) > self ._max_size :
154
152
raise ValueError ("Register + Length greater than maximum FRAM size."
155
153
" ({0})" .format (self ._max_size ))
@@ -160,52 +158,38 @@ def __getitem__(self, key):
160
158
return read_buffer
161
159
162
160
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 .
164
162
165
163
.. code-block:: python
166
164
167
165
# write single index
168
166
fram[0] = 1
169
167
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]
174
170
"""
175
171
if self .write_protected :
176
172
raise RuntimeError ("FRAM currently write protected." )
177
173
178
174
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." )
181
178
if key > self ._max_size :
182
179
raise ValueError ("Requested register '{0}' greater than maximum"
183
180
" FRAM size. ({1})" .format (key ,
184
181
self ._max_size ))
185
182
186
- self ._write_register (key , value )
183
+ self ._write (key , value , self . _wraparound )
187
184
188
185
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." )
199
187
200
- def _read_register (self , register ):
188
+ def _read_register (self , register , buffer ):
201
189
# Implemented by subclass
202
190
raise NotImplementedError
203
191
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 ):
209
193
# Implemened by subclass
210
194
raise NotImplementedError
211
195
@@ -244,23 +228,19 @@ def _read_register(self, register, read_buffer):
244
228
i2c .write_then_readinto (write_buffer , read_buffer )
245
229
return read_buffer
246
230
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 ):
256
232
# Decided against using the chip's "Page Write", since that would require
257
233
# doubling the memory usage by creating a buffer that includes the passed
258
234
# in data so that it can be sent all in one `i2c.write`. The single-write
259
235
# method is slower, and forces us to handle wraparound, but I feel this
260
236
# is a better tradeoff for limiting the memory required for large writes.
261
237
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 :
264
244
if wraparound :
265
245
pass
266
246
else :
0 commit comments