#!/usr/bin/env python3 # This class is used for interfacing with the DWM1001 Decawave modules import time import spidev class Decawave: def __init__(self, spibus): self.spibus = spibus self.tlv_type = { 'POS_GET': 0x02 } def response_ready(self, expect): size_num = [0, 0] while size_num == [0, 0]: size_num = self.spibus.readbytes(2) time.sleep(0.001) if size_num != expect: return False return True return True def send(request): send_bytes = [request.type, request.length] if request.length != 0: send_bytes = send_bytes + request.value self.spibus.writebytes(send_bytes) return def receive(response, expect): while not self.response_ready(expect): pass response_bytes = self.spibus.readbytes(expect[0]) response.type = response_bytes[0] response.length = response_bytes[1] response.value = response_bytes[2:] return def pos_get(self): length = 0x00 expect = [18, 1] request = tlv.tlv(self.tlv_type['POS_GET'], length) self.send(request) response = tlv.tlv() self.receive(response, expect) value = response.value x = response.value[0] + (response.value[1] << 8) + (response.value[2] << 16) + (response.value[3] << 24) y = response.value[4] + (response.value[5] << 8) + (response.value[6] << 16) + (response.value[7] << 24) z = response.value[8] + (response.value[9] << 8) + (response.value[10] << 16) + (response.value[11] << 24) quality = response.value[12] return [x, y, z, quality] class tlv: def __init__(self, type=0, length=0, value=[]): self.type = type self.length = length self.value = value