Ejemplo n.º 1
0
    def _handle_device_change(self, msg):
        if msg.event == MsgHubAttachedIO.EVENT_DETACHED:
            log.debug("Detaching peripheral: %s", self.peripherals[msg.port])
            self.peripherals.pop(msg.port)
            return

        assert msg.event in (msg.EVENT_ATTACHED, msg.EVENT_ATTACHED_VIRTUAL)
        port = msg.port
        dev_type = ushort(msg.payload, 0)

        if dev_type in PERIPHERAL_TYPES:
            self.peripherals[port] = PERIPHERAL_TYPES[dev_type](self, port)
        else:
            #log.warning("Have not dedicated class for peripheral type %x on port %x", dev_type, port)
            self.peripherals[port] = Peripheral(self, port)

        log.info("Attached peripheral: %s", self.peripherals[msg.port])

        if msg.event == msg.EVENT_ATTACHED:
            hw_revision = reversed([usbyte(msg.payload, x) for x in range(2, 6)])
            sw_revision = reversed([usbyte(msg.payload, x) for x in range(6, 10)])
            # what to do with this info? it's useless, I guess
            del hw_revision, sw_revision
        elif msg.event == msg.EVENT_ATTACHED_VIRTUAL:
            self.peripherals[port].virtual_ports = (usbyte(msg.payload, 2), usbyte(msg.payload, 3))
Ejemplo n.º 2
0
 def handle_port_data(self, data):
     if self._port_subscription_mode == self.COLOR_DISTANCE_FLOAT:
         color = usbyte(data, 4)
         distance = usbyte(data, 5)
         partial = usbyte(data, 7)
         if partial:
             distance += 1.0 / partial
         self._notify_subscribers(color, float(distance))
     elif self._port_subscription_mode == self.COLOR_ONLY:
         color = usbyte(data, 4)
         self._notify_subscribers(color)
     elif self._port_subscription_mode == self.DISTANCE_INCHES:
         distance = usbyte(data, 4)
         self._notify_subscribers(distance)
     elif self._port_subscription_mode == self.DISTANCE_HOW_CLOSE:
         distance = usbyte(data, 4)
         self._notify_subscribers(distance)
     elif self._port_subscription_mode == self.DISTANCE_SUBINCH_HOW_CLOSE:
         distance = usbyte(data, 4)
         self._notify_subscribers(distance)
     elif self._port_subscription_mode == self.OFF1 or self._port_subscription_mode == self.OFF2:
         log.info("Turned off led on %s", self)
     elif self._port_subscription_mode == self.COUNT_2INCH:
         count = unpack("<L", data[4:8])[0]  # is it all 4 bytes or just 2?
         self._notify_subscribers(count)
     elif self._port_subscription_mode == self.STREAM_3_VALUES:
         # TODO: understand better meaning of these 3 values
         val1 = ushort(data, 4)
         val2 = ushort(data, 6)
         val3 = ushort(data, 8)
         self._notify_subscribers(val1, val2, val3)
     elif self._port_subscription_mode == self.LUMINOSITY:
         luminosity = ushort(data, 4) / 1023.0
         self._notify_subscribers(luminosity)
     else:  # TODO: support whatever we forgot
         log.debug("Unhandled data in mode %s: %s",
                   self._port_subscription_mode, str2hex(data))
Ejemplo n.º 3
0
 def handle_port_data(self, data):
     if self._port_subscription_mode == self.MODE_3AXIS_SIMPLE:
         state = usbyte(data, 4)
         self._notify_subscribers(state)
     elif self._port_subscription_mode == self.MODE_2AXIS_SIMPLE:
         state = usbyte(data, 4)
         self._notify_subscribers(state)
     elif self._port_subscription_mode == self.MODE_BUMP_COUNT:
         bump_count = ushort(data, 4)
         self._notify_subscribers(bump_count)
     elif self._port_subscription_mode == self.MODE_2AXIS_FULL:
         roll = self._byte2deg(usbyte(data, 4))
         pitch = self._byte2deg(usbyte(data, 5))
         self._notify_subscribers(roll, pitch)
     elif self._port_subscription_mode == self.MODE_3AXIS_FULL:
         roll = self._byte2deg(usbyte(data, 4))
         pitch = self._byte2deg(usbyte(data, 5))
         yaw = self._byte2deg(usbyte(data, 6))  # did I get the order right?
         self._notify_subscribers(roll, pitch, yaw)
     else:
         log.debug("Got tilt sensor data while in unexpected mode: %s",
                   self._port_subscription_mode)
Ejemplo n.º 4
0
 def _decode_port_data(self, msg):
     data = msg.payload
     if self._port_mode.mode == self.COLOR_INDEX:
         color = usbyte(data, 0)
         return (color, )
     elif self._port_mode.mode == self.COLOR_DISTANCE_FLOAT:
         color = usbyte(data, 0)
         val = usbyte(data, 1)
         partial = usbyte(data, 3)
         if partial:
             val += 1.0 / partial
         return (color, float(val))
     elif self._port_mode.mode == self.DISTANCE_INCHES:
         val = usbyte(data, 0)
         return (val, )
     elif self._port_mode.mode == self.DISTANCE_REFLECTED:
         val = usbyte(data, 0) / 100.0
         return (val, )
     elif self._port_mode.mode == self.AMBIENT_LIGHT:
         val = usbyte(data, 0) / 100.0
         return (val, )
     elif self._port_mode.mode == self.COUNT_2INCH:
         count = usint(data, 0)
         return (count, )
     elif self._port_mode.mode == self.COLOR_RGB:
         val1 = int(255 * ushort(data, 0) / 1023.0)
         val2 = int(255 * ushort(data, 2) / 1023.0)
         val3 = int(255 * ushort(data, 4) / 1023.0)
         return (val1, val2, val3)
     elif self._port_mode.mode == self.DEBUG:
         val1 = 10 * ushort(data, 0) / 1023.0
         val2 = 10 * ushort(data, 2) / 1023.0
         return (val1, val2)
     elif self._port_mode.mode == self.CALIBRATE:
         return [ushort(data, x * 2) for x in range(8)]
     else:
         log.debug("Unhandled data in mode %s: %s", self._port_mode.mode,
                   str2hex(data))
         return ()
Ejemplo n.º 5
0
 def _decode_port_data(self, msg):
     val = ushort(msg.payload, 0)
     milliampers = 2444 * val / 4095.0
     return (milliampers, )
Ejemplo n.º 6
0
 def _decode_port_data(self, msg):
     data = msg.payload
     val = ushort(data, 0)
     volts = 9600.0 * val / 3893.0 / 1000.0
     return (volts, )
Ejemplo n.º 7
0
 def handle_port_data(self, data):
     val = ushort(data, 4)
     self.last_value = val / 4096.0
     self._notify_subscribers(self.last_value)
Ejemplo n.º 8
0
 def handle_port_data(self, data):
     val = ushort(data, 4)
     self.last_value = val / 4096.0
     if self.last_value < 0.2:
         log.warning("Battery low! %s%%", int(100 * self.last_value))
     self._notify_subscribers(self.last_value)
Ejemplo n.º 9
0
 def _decode_port_data(self, msg):
     data = msg.payload
     x = ushort(msg.payload, 0)
     y = ushort(msg.payload, 2)
     z = ushort(msg.payload, 4)
     return (x, y, z)