mirror of
https://github.com/pybricks/pybricks-api.git
synced 2026-09-12 09:37:25 +00:00
144 lines
3.1 KiB
Python
144 lines
3.1 KiB
Python
# SPDX-License-Identifier: MIT
|
|
# Copyright (c) 2018-2020 The Pybricks Authors
|
|
|
|
"""Constant parameters/arguments for the Pybricks API."""
|
|
|
|
from enum import Enum as _Enum
|
|
|
|
|
|
class _PybricksEnumMeta(type(_Enum)):
|
|
def __dir__(cls):
|
|
yield '__class__'
|
|
yield '__name__'
|
|
for member in cls:
|
|
yield member.name
|
|
|
|
|
|
class _PybricksEnum(_Enum, metaclass=_PybricksEnumMeta):
|
|
def __dir__(self):
|
|
yield '__class__'
|
|
for member in type(self):
|
|
yield member.name
|
|
|
|
def __str__(self):
|
|
return '{}.{}'.format(type(self).__name__, self.name)
|
|
|
|
def __repr__(self):
|
|
return str(self)
|
|
|
|
|
|
class Color:
|
|
"""Light or surface color."""
|
|
|
|
def __init__(self, h, s=100, v=100):
|
|
self.h = h % 360
|
|
self.s = max(0, min(s, 100))
|
|
self.v = max(0, min(v, 100))
|
|
|
|
def __repr__(self):
|
|
return "Color(h={}, s={}, v={})".format(self.h, self.s, self.v)
|
|
|
|
def __eq__(self, other):
|
|
return (isinstance(other, Color) and
|
|
self.h == other.h and self.s == other.s and self.v == other.v)
|
|
|
|
def __mul__(self, scale):
|
|
v = max(0, min(self.v * scale, 100))
|
|
return Color(self.h, self.s, int(v), self.name)
|
|
|
|
def __rmul__(self, scale):
|
|
return self.__mul__(scale)
|
|
|
|
def __truediv__(self, scale):
|
|
return self.__mul__(1/scale)
|
|
|
|
def __floordiv__(self, scale):
|
|
return self.__mul__(1/scale)
|
|
|
|
|
|
Color.NONE = Color(0, 0, 0)
|
|
Color.BLACK = Color(0, 0, 15)
|
|
Color.GRAY = Color(0, 0, 50)
|
|
Color.WHITE = Color(0, 0, 100)
|
|
Color.RED = Color(0, 100, 100)
|
|
Color.ORANGE = Color(30, 100, 100)
|
|
Color.YELLOW = Color(60, 100, 100)
|
|
Color.GREEN = Color(120, 100, 100)
|
|
Color.CYAN = Color(180, 100, 100)
|
|
Color.BLUE = Color(240, 100, 100)
|
|
Color.VIOLET = Color(270, 100, 100)
|
|
Color.MAGENTA = Color(300, 100, 100)
|
|
|
|
|
|
class Port(_PybricksEnum):
|
|
"""Port on the programmable brick or hub."""
|
|
|
|
# Generic motor/sensor ports
|
|
A = ord('A')
|
|
B = ord('B')
|
|
C = ord('C')
|
|
D = ord('D')
|
|
E = ord('E')
|
|
F = ord('F')
|
|
|
|
# NXT/EV3 sensor ports
|
|
S1 = ord('1')
|
|
S2 = ord('2')
|
|
S3 = ord('3')
|
|
S4 = ord('4')
|
|
|
|
|
|
class Stop(_PybricksEnum):
|
|
"""Action after the motor stops."""
|
|
|
|
COAST = 0
|
|
"""Let the motor move freely."""
|
|
|
|
BRAKE = 1
|
|
"""Passively resist small external forces."""
|
|
|
|
HOLD = 2
|
|
"""Keep controlling the motor to hold it at the commanded angle. This is
|
|
only available on motors with encoders."""
|
|
|
|
|
|
class Direction(_PybricksEnum):
|
|
"""Rotational direction for positive speed or angle values."""
|
|
|
|
CLOCKWISE = 0
|
|
"""A positive speed value should make the motor move clockwise."""
|
|
|
|
COUNTERCLOCKWISE = 1
|
|
"""A positive speed value should make the motor move counterclockwise."""
|
|
|
|
|
|
class Button(_PybricksEnum):
|
|
"""Buttons on a hub or remote."""
|
|
|
|
LEFT_DOWN = 1
|
|
LEFT_MINUS = 1
|
|
DOWN = 2
|
|
RIGHT_DOWN = 3
|
|
RIGHT_MINUS = 3
|
|
LEFT = 4
|
|
CENTER = 5
|
|
RIGHT = 6
|
|
LEFT_UP = 7
|
|
LEFT_PLUS = 7
|
|
UP = 8
|
|
BEACON = 8
|
|
RIGHT_UP = 9
|
|
RIGHT_PLUS = 9
|
|
BLUETOOTH = 9
|
|
|
|
|
|
class Side(_PybricksEnum):
|
|
"""Side of a hub or a sensor."""
|
|
|
|
RIGHT = 6
|
|
FRONT = 0
|
|
TOP = 8
|
|
LEFT = 4
|
|
BACK = 5
|
|
BOTTOM = 2
|