Module micromelon.leds

Functions for controlling the RGB LEDs on the corners of the robot
Top and bottom LEDs are coupled so you can only control 4
Bottom LEDs mirror the setting of top LEDs

Expand source code
"""
Functions for controlling the RGB LEDs on the corners of the robot
  Top and bottom LEDs are coupled so you can only control 4
  Bottom LEDs mirror the setting of top LEDs
"""
from ._leds import *

__all__ = [
    "write",
    "writeAll",
    "off",
]

Functions

def off()

Turns all LEDs off by setting their colour to black ([0, 0, 0])

Expand source code
def off():
    """
    Turns all LEDs off by setting their colour to black ([0, 0, 0])
    """
    _rc.writeAttribute(OPTYPE.RGBS, [0x0F] + [0] * 12)
def write(id, c)

Sets the colour of a specific LED

Args

id : int
The LED to set - must be 1, 2, 3, or 4
c : array
Colour to set it to - must be in the form [r, g, b]
with r, g, and b values between 0 and 255 inclusive

Raises

Exception on an invalid LED id or colour

Expand source code
def write(id, c):
    """
    Sets the colour of a specific LED

    Args:
      id (int): The LED to set - must be 1, 2, 3, or 4
      c (array): Colour to set it to - must be in the form [r, g, b]
                with r, g, and b values between 0 and 255 inclusive

    Raises:
      Exception on an invalid LED id or colour
    """
    if id < 1 or id > 4:
        raise Exception("LED id must be 1, 2, 3 or 4. You gave " + id)

    rgb = _parseColourArg(c)
    if rgb:
        # The first byte is a bitmask in the least significant bits of which LEDs to set
        # Following 12 bytes are r,g,b for each LED.
        # Values not masked by the first byte are ignored on the robot
        ledArray = [(1 << (id - 1))] + [0, 0, 0] * 4  # set mask and prefill with 0
        offset = ((id - 1) * 3) + 1
        for i in (0, 1, 2):
            # Set the colour for the masked LED
            ledArray[i + offset] = rgb[i]
        _rc.writeAttribute(OPTYPE.RGBS, ledArray)
        return
    else:
        raise Exception(
            "Invalid colour: " + c + ".  Note rgb values should be in range 0-255"
        )
def writeAll(c1, c2=None, c3=None, c4=None)

Set the colour of all LEDs at once
If only one argument is given then all LEDs will be set to that colour
Colours must be in the form [r, g, b] with values between 0 and 255 inclusive

Args

c1 : array
Colour to set LED 1 or all LEDs if no other arguments
c2 : array
Colour to set LED 2
c3 : array
Colour to set LED 3
c4 : array
Colour to set LED 4

Raises

Exception on invalid number of arguments (anything other than 1 or 4)
Exception if any of the colour arguments are invalid colours

Expand source code
def writeAll(c1, c2=None, c3=None, c4=None):
    """
    Set the colour of all LEDs at once
    If only one argument is given then all LEDs will be set to that colour
    Colours must be in the form [r, g, b] with values between 0 and 255 inclusive

    Args:
      c1 (array): Colour to set LED 1 or all LEDs if no other arguments
      c2 (array): Colour to set LED 2
      c3 (array): Colour to set LED 3
      c4 (array): Colour to set LED 4

    Raises:
      Exception on invalid number of arguments (anything other than 1 or 4)
      Exception if any of the colour arguments are invalid colours
    """
    rgb1 = _parseColourArg(c1)

    if rgb1:
        ledArray = None
        if c2 and c3 and c4:
            rgb2 = _parseColourArg(c2)
            rgb3 = _parseColourArg(c3)
            rgb4 = _parseColourArg(c4)
            ledArray = rgb1 + rgb2 + rgb3 + rgb4
        elif c2 or c3 or c4:
            raise Exception("Incorrect number of colours provided.  Should be 1 or 4")
        else:
            ledArray = rgb1 * 4
        # 0x0F sets the mask for all 4 LEDs to be set ledArray is 12 bytes for 4 sets of r,g,b
        return _rc.writeAttribute(OPTYPE.RGBS, [0x0F] + ledArray)

    raise Exception("Invalid Colour - Should be in the form [r, g, b]")