@@ -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