Access memories on the Crazyflie
| 208 | |
| 209 | |
| 210 | class Memory(): |
| 211 | """Access memories on the Crazyflie""" |
| 212 | |
| 213 | # These codes can be decoded using os.stderror, but |
| 214 | # some of the text messages will look very strange |
| 215 | # in the UI, so they are redefined here |
| 216 | _err_codes = { |
| 217 | errno.ENOMEM: 'No more memory available', |
| 218 | errno.ENOEXEC: 'Command not found', |
| 219 | errno.ENOENT: 'No such block id', |
| 220 | errno.E2BIG: 'Block too large', |
| 221 | errno.EEXIST: 'Block already exists' |
| 222 | } |
| 223 | |
| 224 | def __init__(self, crazyflie=None): |
| 225 | """Instantiate class and connect callbacks""" |
| 226 | self.cf = crazyflie |
| 227 | self.cf.add_port_callback(CRTPPort.MEM, self._new_packet_cb) |
| 228 | self.cf.disconnected.add_callback(self._disconnected) |
| 229 | self._write_requests_lock = Lock() |
| 230 | |
| 231 | self._clear_state() |
| 232 | |
| 233 | def _clear_state(self): |
| 234 | self.mems = [] |
| 235 | # Called when new memories have been added |
| 236 | self.mem_added_cb = Caller() |
| 237 | |
| 238 | # Called to signal completion of read or write |
| 239 | self.mem_read_cb = Caller() |
| 240 | self.mem_read_failed_cb = Caller() |
| 241 | self.mem_write_cb = Caller() |
| 242 | self.mem_write_failed_cb = Caller() |
| 243 | |
| 244 | self._refresh_callback = None |
| 245 | self._fetch_id = 0 |
| 246 | self.nbr_of_mems = 0 |
| 247 | self._ow_mem_fetch_index = 0 |
| 248 | self._elem_data = () |
| 249 | self._read_requests = {} |
| 250 | self._write_requests = {} |
| 251 | self._ow_mems_left_to_update = [] |
| 252 | self._getting_count = False |
| 253 | |
| 254 | def _mem_update_done(self, mem): |
| 255 | """ |
| 256 | Callback from each individual memory (only 1-wire) when reading of |
| 257 | header/elements are done |
| 258 | """ |
| 259 | if mem.id in self._ow_mems_left_to_update: |
| 260 | self._ow_mems_left_to_update.remove(mem.id) |
| 261 | |
| 262 | logger.debug(mem) |
| 263 | |
| 264 | if len(self._ow_mems_left_to_update) == 0: |
| 265 | if self._refresh_callback: |
| 266 | self._refresh_callback() |
| 267 | self._refresh_callback = None |