Совместное использование Enum между python и arduino

Я создал графический интерфейс на python, который позволяет перемещать управляемую arduino колесную тележку mecanum.

Тележка допускает 8 различных направлений перемещения и может вращаться влево и вправо. Команды передаются по последовательному соединению между ноутбуком (w10, python) и arduino.

У меня есть класс Enum в python, представляющий различные направления перемещения.

У меня есть соответствующее перечисление в arduino для интерпретации команд из задачи python.

Каков простой способ совместно использовать одно общее определение перечисления Enum для обеих сред кодирования?

, 👍2

Обсуждение

Вы имеете в виду простое совместное использование кода между двумя частями исходного кода на разных языках? Вам придется найти между ними какие-то точки соприкосновения., @Majenko

Вы имеете в виду копирование и перенос текста (списка перечислений) между ними? Я нашел отличную тему, в которой конкретно рассказывается о перечислениях Python. Но даже при немного отличающемся синтаксисе всех различных опций в Python я все еще вижу небольшие различия, которые, вероятно, предотвратят вырезание и вставку без модификации. Спросите, и я опубликую это в качестве ответа, если хотите., @st2000


1 ответ


3

Один из подходов, который я использовал для аналогичных целей, заключается в создании соответствующих заголовочных файлов (или модуля, или чего-то еще) из простого текстового файла для всех необходимых целей.

Поскольку вы уже знаете python, это должно быть довольно просто. Далее следует краткое "доказательство концепции". (Предупреждение: я почти не знаю ни одного python.)

Одним из недостатков этого является то, что вы должны помнить о необходимости регенерации заголовка / модуля каждый раз, когда вы обновляете перечисление (ключи или значения) - не забудьте перекомпилировать для части C ++. Если у вас есть система сборки, лучше всего интегрировать в нее этот этап генерации кода.

Разновидностью этого является синтаксический анализ одного из исходных кодов языка для извлечения определения и вывода его в формате, подходящем для другого. Однако, как правило, это гораздо сложнее сделать, если вы хотите сделать его надежным.


робот.перечисление

UP    1
DOWN  2
LEFT  3
RIGHT 4
JUMP  5

enum_generator.py

def python_enum(filename):
    with open(filename, 'w') as w:
        w.write('class Robot(Enum):\n')
        with open('robot.enum') as r:
            for line in r:
                parts = line.split()
                w.write(f'    {parts[0]} = {parts[1]}\n')

def cplusplus_enum(filename):
    with open(filename, 'w') as w:
        w.write('#pragma once\n')
        w.write('enum Robot: int {\n')
        with open('robot.enum') as f:
            for line in f:
                parts = line.split()
                w.write(f'  {parts[0]} = {parts[1]},\n')
        w.write('};');

python_enum('robot_enum.py')
cplusplus_enum('robot_enum.h')
,