def _lindstrom(value, length): result = ba(floatbe=value, length=length) ^ ba(floatbe=2, length=length) if value < 0: result.invert() else: result.invert(0) return result.uintbe
def f(self, value): assert isinstance( value, (np.float32, np.float64, float)), "Don't understand number" if isinstance(value, (np.float32)): result = ba(floatbe=value, length=32) elif isinstance(value, (np.float64, float)): result = ba(floatbe=value, length=64) bits = result.len self._ba = result self._m, self._e = (23, 8) if bits == 32 else (52, 11) self._f = value
def _rev_lindstrom(value, length): result = ba(uintbe=value, length=length) # ^ ba(floatbe=2, length=length) if result.bin[0] == "1": result.invert(0) else: result.invert() return result.floatbe
def f(self, value): assert isinstance( value, (np.float32, np.float64, float)), "Don't understand number" if isinstance(value, (np.float32)): result = ba(floatbe=value, length=32) ^ ba(floatbe=2, length=32) elif isinstance(value, (np.float64, float)): result = ba(floatbe=value, length=64) ^ ba(floatbe=2, length=64) bits = result.len if value < 0: result = ~result else: result = ba(uintbe=result.uintbe ^ (1 << result.len - 1), length=result.len) self._ba = result self._m, self._e = (23, 8) if bits == 32 else (52, 11) self._f = value
def prepare_message(self, rawmessage) -> list: """ Parse the raw bitstring to decoded raw bytes with start stop bits removed and endianness fixed :param rawmessage: :return: list of bytes """ if type(rawmessage) == ba: packet = rawmessage else: packet = ba(bin=rawmessage) try: # Save raw bitstream self.raw_message = packet.bin # Sync on preamble counter = 0 bit = packet[0] while packet[counter] == bit: bit = not bit counter += 1 packet = packet << (counter - 2) # Split bin string to raw packets message = [ packet[i:i + RAW_BYTE_LENGTH] for i in range(0, len(packet), RAW_BYTE_LENGTH) ] # Remove start and stop bytes message = [byte[1:9] for byte in message] # Reverse bit order (Endianess is LSB) message = [byte[::-1] for byte in message] return message except Exception: raise PreambleError()
def extract_message(self, prepared_message: list) -> list: """ Remove preamble, syncwords and end word :param prepared_message: :return: """ # Remove sync words for i, x in enumerate(SYNC): if prepared_message[i].uint != x: raise SyncError() prepared_message = prepared_message[len(SYNC):len(prepared_message)] # Remove stop and rest of bogus data in packet index = prepared_message.index(ba(int=STOP, length=8)) prepared_message = prepared_message[:index] # Convert to numpy uint8 datatype prepared_message = [np.uint8(x.uint) for x in prepared_message] return prepared_message
CANID_4003_PROXI = 0x1E114003 CANID_4003_CLOCK = 0x0C214003 CANID_RADIO_STATION = 0x0A194005 CANID_RADIO_AUDIOCH = 0x06314005 CANID_RADIO_FREQUENCY = 0x0A114005 CANID_BM_STATUS = 0x0E094021 CANID_BM_PROXI = 0x1E114021 CANID_BM_WATCHDOG = 0x0A014021 CANID_BM_AUDIO_CHANNEL = 0x06314021 CANID_BM_TRACK_TIME = 0x08094021 CANID_BM_TEXT_MESSAGE = 0x0A394021 MASK_BUTTON_VOLUME_UP = ba(hex='0x8000') MASK_BUTTON_VOLUME_DN = ba(hex='0x4000') MASK_BUTTON_WINDOWS = ba(hex='0x0040') MASK_BUTTON_MUTE = ba(hex='0x2000') MASK_BUTTON_UP = ba(hex='0x1000') MASK_BUTTON_DOWN = ba(hex='0x0800') MASK_BUTTON_MENU = ba(hex='0x0080') MASK_BUTTON_SOURCE = ba(hex='0x0400') MASK_DOOR_DRIVER = ba(hex='0x0004000000000000') MASK_DOOR_PASSENGER = ba(hex='0x0008000000000000') MASK_ARROW_LEFT = ba(hex='0x000040000000') MASK_ARROW_RIGHT = ba(hex='0x000020000000') MASK_AUDIOCH_MUTED = ba(hex='0x0000000000000080')
def get_axes(self, x, y): """generates the axes as from a binary value""" self.XAxis = ba(bin=x).int self.YAxis = ba(bin=y).int