Source code for jaeger.commands
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# @Author: José Sánchez-Gallego (gallegoj@uw.edu)
# @Date: 2018-08-27
# @Filename: __init__.py
# @License: BSD 3-clause (http://www.opensource.org/licenses/BSD-3-Clause)
# isort:skip_file
import enum
class TypesEnumMeta(enum.EnumMeta):
"""Metaclass to allow initialising an Enum from a string."""
def __call__(cls, value):
if isinstance(value, str):
for flag in cls:
if flag.name.lower() == value.lower():
return cls(flag.value)
return super().__call__(value)
[docs]class CommandID(enum.IntEnum, metaclass=TypesEnumMeta):
"""IDs associated with commands."""
GET_ID = 1
GET_FIRMWARE_VERSION = 2
GET_STATUS = 3
SEND_NEW_TRAJECTORY = 10
SEND_TRAJECTORY_DATA = 11
TRAJECTORY_DATA_END = 12
TRAJECTORY_TRANSMISSION_ABORT = 13
START_TRAJECTORY = 14
STOP_TRAJECTORY = 15
COLLISION_DETECTED = 18
GO_TO_DATUMS = 20
GO_TO_DATUM_ALPHA = 21
GO_TO_DATUM_BETA = 22
START_DATUM_CALIBRATION = 23
START_MOTOR_CALIBRATION = 26
GO_TO_ABSOLUTE_POSITION = 30
GO_TO_RELATIVE_POSITION = 31
GET_ACTUAL_POSITION = 32
SET_ACTUAL_POSITION = 33
GET_OFFSETS = 34
SET_OFFSETS = 35
SET_SPEED = 40
SET_CURRENT = 41
START_COGGING_CALIBRATION = 47
SAVE_INTERNAL_CALIBRATION = 53
GET_CURRENT = 56
HALL_ON = 116
HALL_OFF = 117
ALPHA_CLOSED_LOOP_COLLISION_DETECTION = 118
ALPHA_CLOSED_LOOP_WITHOUT_COLLISION_DETECTION = 119
ALPHA_OPEN_LOOP_COLLISION_DETECTION = 120
ALPHA_OPEN_LOOP_WITHOUT_COLLISION_DETECTION = 121
BETA_CLOSED_LOOP_COLLISION_DETECTION = 122
BETA_CLOSED_LOOP_WITHOUT_COLLISION_DETECTION = 123
BETA_OPEN_LOOP_COLLISION_DETECTION = 124
BETA_OPEN_LOOP_WITHOUT_COLLISION_DETECTION = 125
START_FIRMWARE_UPGRADE = 200
SEND_FIRMWARE_DATA = 201
[docs] def get_command_class(self):
"""Returns the class associated with this command."""
if self in COMMAND_LIST:
return COMMAND_LIST[self]
from .base import Command
from .base import *
from .bootloader import *
from .goto import *
from .status import *
from .trajectory import *
from .calibration import *
def all_subclasses(cls):
"""Recursive subclasses."""
return set(cls.__subclasses__()).union([s for c in cls.__subclasses__()
for s in all_subclasses(c)])
# Generate a dictionary of commands
COMMAND_LIST = {cclass.command_id: cclass
for cclass in all_subclasses(Command)
if cclass.command_id in CommandID}
# Dynamically generate command classes for those commands for which we
# didn't write a class. These classes are identical to a generic Command
# but with a custom name.
for cid in list(CommandID):
if cid not in COMMAND_LIST:
CommandClass = type(cid.name.title().replace('_', ''),
(Command,),
{'command_id': cid,
'broadcastable': False})
COMMAND_LIST[cid] = CommandClass