def multiplex(self, signal_output, trigger_update=True): """ Converts a desired signal into an address to parse to the VirtualAddressMap Updates the virtual address map with the values """ values = [] if signal_output is "": virtual_address = 0 else: try: virtual_address = self.signal_map[signal_output] except ValueError as e: raise ValueError( "signal_output {} not found in multiplexer".format( signal_output)) from e for index, b in enumerate( bits(virtual_address, num_bits=len(self.pin_list), order="LSB")): try: values.append((self.pin_mask[index], b)) except IndexError: # Should only ever happen in development sys.stderr("SIGNAL OUTPUT: {}".format(signal_output)) sys.stderr("SIGNAL: {}".format(virtual_address)) sys.stderr("PIN MASK: {}".format(self.pin_mask)) sys.stderr("PIN LIST: {}".format(self.pin_list)) raise self.update_callback(values, trigger_update) if signal_output != self.state: self.state_update_time = time.time() self.state = signal_output
def pin_values(self): return list( zip( self.virtual_pin_list, bits(self._virtual_pin_values, num_bits=len(self.virtual_pin_list), order="LSB")))
def update_output(self, value): print("Updating from {}".format(self.__class__.__name__)) print( *zip( self.pin_list, [b for b in bits(value, len(self.pin_list), order="LSB")] ), sep="\n" )
def active_pins(self): return [( self.virtual_pin_list[pin], self.mux_assigned_pins[self.virtual_pin_list[pin]], ) for pin, value in enumerate( bits( self._virtual_pin_values_active, num_bits=len(self.virtual_pin_list), order="LSB", )) if value]
def _build_values_update(self, virtual_address): values = [] for index, b in enumerate( bits(virtual_address, num_bits=len(self.pin_list), order="LSB")): try: values.append((self.pin_mask[index], b)) except IndexError: # Should only ever happen in development sys.stderr("SIGNAL: {}".format(virtual_address)) sys.stderr("PIN MASK: {}".format(self.pin_mask)) sys.stderr("PIN LIST: {}".format(self.pin_list)) raise return values
def update_input(self): """ Iterates through the address_handlers and reads the values back to update the pin values for the digital inputs :return: """ start_addr = 0x00 for addr, handler in self.address_handlers: values = handler.update_input() if values is not None: # Handler can return valid input values pin_values = [] for index, b in enumerate( bits(values, num_bits=len(handler.pin_list), order="LSB") ): pin_values.append((index + start_addr, b)) self.update_pin_values(pin_values, trigger_update=False) start_addr = addr
def _serial_shift_bit_bang(self, data, bytes_required, bb_mask): data_out = bytearray() data_out.append(bb_mask + self.bb_inv_mask) for b in bits(data, num_bytes=bytes_required): # Write Data if b: data_out.append(bb_mask + self.bb_data ^ self.bb_inv_mask) # Clock Up data_out.append(bb_mask + (self.bb_data + self.bb_clk) ^ self.bb_inv_mask) else: data_out.append(bb_mask + self.bb_inv_mask) # Clock Up data_out.append(bb_mask + self.bb_clk ^ self.bb_inv_mask) # Latch to output data_out.append(bb_mask + self.bb_inv_mask) data_out.append(bb_mask + self.bb_latch ^ self.bb_inv_mask) data_out.append(bb_mask + self.bb_inv_mask) return data_out