Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
 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")))
Ejemplo n.º 3
0
 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"
     )
Ejemplo n.º 4
0
 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]
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
    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