aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/frozen/Adafruit_CircuitPython_HID/adafruit_hid/consumer_control.py
diff options
context:
space:
mode:
Diffstat (limited to 'circuitpython/frozen/Adafruit_CircuitPython_HID/adafruit_hid/consumer_control.py')
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_HID/adafruit_hid/consumer_control.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_HID/adafruit_hid/consumer_control.py b/circuitpython/frozen/Adafruit_CircuitPython_HID/adafruit_hid/consumer_control.py
new file mode 100644
index 0000000..d26f116
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_HID/adafruit_hid/consumer_control.py
@@ -0,0 +1,106 @@
+# SPDX-FileCopyrightText: 2018 Dan Halbert for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+"""
+`adafruit_hid.consumer_control.ConsumerControl`
+====================================================
+
+* Author(s): Dan Halbert
+"""
+
+import sys
+
+if sys.implementation.version[0] < 3:
+ raise ImportError(
+ "{0} is not supported in CircuitPython 2.x or lower".format(__name__)
+ )
+
+# pylint: disable=wrong-import-position
+import struct
+import time
+from . import find_device
+
+try:
+ from typing import Sequence
+ import usb_hid
+except ImportError:
+ pass
+
+
+class ConsumerControl:
+ """Send ConsumerControl code reports, used by multimedia keyboards, remote controls, etc."""
+
+ def __init__(self, devices: Sequence[usb_hid.Device]) -> None:
+ """Create a ConsumerControl object that will send Consumer Control Device HID reports.
+
+ Devices can be a sequence of devices that includes a Consumer Control device or a CC device
+ itself. A device is any object that implements ``send_report()``, ``usage_page`` and
+ ``usage``.
+ """
+ self._consumer_device = find_device(devices, usage_page=0x0C, usage=0x01)
+
+ # Reuse this bytearray to send consumer reports.
+ self._report = bytearray(2)
+
+ # Do a no-op to test if HID device is ready.
+ # If not, wait a bit and try once more.
+ try:
+ self.send(0x0)
+ except OSError:
+ time.sleep(1)
+ self.send(0x0)
+
+ def send(self, consumer_code: int) -> None:
+ """Send a report to do the specified consumer control action,
+ and then stop the action (so it will not repeat).
+
+ :param consumer_code: a 16-bit consumer control code.
+
+ Examples::
+
+ from adafruit_hid.consumer_control_code import ConsumerControlCode
+
+ # Raise volume.
+ consumer_control.send(ConsumerControlCode.VOLUME_INCREMENT)
+
+ # Advance to next track (song).
+ consumer_control.send(ConsumerControlCode.SCAN_NEXT_TRACK)
+ """
+ self.press(consumer_code)
+ self.release()
+
+ def press(self, consumer_code: int) -> None:
+ """Send a report to indicate that the given key has been pressed.
+ Only one consumer control action can be pressed at a time, so any one
+ that was previously pressed will be released.
+
+ :param consumer_code: a 16-bit consumer control code.
+
+ Examples::
+
+ from adafruit_hid.consumer_control_code import ConsumerControlCode
+
+ # Raise volume for 0.5 seconds
+ consumer_control.press(ConsumerControlCode.VOLUME_INCREMENT)
+ time.sleep(0.5)
+ consumer_control.release()
+ """
+ struct.pack_into("<H", self._report, 0, consumer_code)
+ self._consumer_device.send_report(self._report)
+
+ def release(self) -> None:
+ """Send a report indicating that the consumer control key has been
+ released. Only one consumer control key can be pressed at a time.
+
+ Examples::
+
+ from adafruit_hid.consumer_control_code import ConsumerControlCode
+
+ # Raise volume for 0.5 seconds
+ consumer_control.press(ConsumerControlCode.VOLUME_INCREMENT)
+ time.sleep(0.5)
+ consumer_control.release()
+ """
+ self._report[0] = self._report[1] = 0x0
+ self._consumer_device.send_report(self._report)