Skip to content

Commit 7bc331b

Browse files
committed
Add scripting feature
1 parent 0b129b1 commit 7bc331b

File tree

12 files changed

+933
-175
lines changed

12 files changed

+933
-175
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ execute_process(
3434
)
3535
message(STATUS "VERSION: ${MAESTRO_VERSION}")
3636

37-
add_subdirectory(libmaestro)
37+
add_subdirectory(src)
3838

3939
if(PYTHON_BINDING)
4040
add_subdirectory(python)

README.md

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ The supported devices are:
3434

3535
### C++
3636

37-
#include <libmaestro.h>
37+
#include <maestro/Device.h>
3838

39-
std::vector<MaestroDevice> devices = MaestroDevice::getConnectedDevices();
40-
41-
devices[0].setAcceleration(0, 4); // set servo 0 acceleration to 4
42-
devices[0].setTarget(0, 6000); // set servo to move to center position
43-
devices[0].setSpeed(1, 10); // set servo 1 speed to 10
39+
std::vector<Maestro::Device> devices = Maestro::Device::getConnectedDevices();
40+
41+
devices[0].setAcceleration(0, 4); // set servo 0 acceleration to 4
42+
devices[0].setTarget(0, 6000); // set servo to move to center position
43+
devices[0].setSpeed(1, 10); // set servo 1 speed to 10
4444

4545
### Python
4646

@@ -62,3 +62,11 @@ The supported devices are:
6262
device.setAcceleration(0, 4) # set servo 0 acceleration to 4
6363
device.setTarget(0, 6000) # set servo to move to center position
6464
device.setSpeed(1, 10) # set servo 1 speed to 10
65+
66+
# compile and upload a script
67+
with open('blink.txt', 'r') as content_file:
68+
script = content_file.read()
69+
70+
program = maestro.Program(script=script, isMiniMaestro=False)
71+
72+
device.writeScript(program.getByteList())

libmaestro/CMakeLists.txt

Lines changed: 0 additions & 17 deletions
This file was deleted.

python/maestro.cpp

Lines changed: 79 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,103 @@
1-
#include <libmaestro.h>
1+
#include <maestro/Device.h>
2+
#include <maestro/Program.h>
23
#include <pybind11/pybind11.h>
34
#include <pybind11/stl.h>
45

56
namespace py = pybind11;
67

8+
using namespace Maestro;
9+
710
// clang-format off
811
PYBIND11_MODULE(maestro, m)
912
{
10-
m.attr("__version__") = "1.0.0";
11-
m.def("getConnectedDevices", &MaestroDevice::getConnectedDevices);
13+
m.attr("__version__") = "0.1.0";
14+
m.def("getConnectedDevices", &Device::getConnectedDevices);
1215

13-
py::class_<MaestroDevice> device(m, "Device");
16+
py::class_<Device> device(m, "Device");
1417

15-
py::enum_<MaestroDevice::SerialMode>(device, "SerialMode")
16-
.value("SERIAL_MODE_USB_DUAL_PORT", MaestroDevice::SerialMode::SERIAL_MODE_USB_DUAL_PORT)
17-
.value("SERIAL_MODE_USB_CHAINED", MaestroDevice::SerialMode::SERIAL_MODE_USB_CHAINED)
18-
.value("SERIAL_MODE_UART_DETECT_BAUD_RATE", MaestroDevice::SerialMode::SERIAL_MODE_UART_DETECT_BAUD_RATE)
19-
.value("SERIAL_MODE_UART_FIXED_BAUD_RATE", MaestroDevice::SerialMode::SERIAL_MODE_UART_FIXED_BAUD_RATE)
18+
py::enum_<Device::SerialMode>(device, "SerialMode")
19+
.value("SERIAL_MODE_USB_DUAL_PORT", Device::SerialMode::SERIAL_MODE_USB_DUAL_PORT)
20+
.value("SERIAL_MODE_USB_CHAINED", Device::SerialMode::SERIAL_MODE_USB_CHAINED)
21+
.value("SERIAL_MODE_UART_DETECT_BAUD_RATE", Device::SerialMode::SERIAL_MODE_UART_DETECT_BAUD_RATE)
22+
.value("SERIAL_MODE_UART_FIXED_BAUD_RATE", Device::SerialMode::SERIAL_MODE_UART_FIXED_BAUD_RATE)
2023
.export_values();
2124

22-
py::class_<MaestroDevice::DeviceSettings>(device, "DeviceSettings")
23-
.def_readwrite("firmwareVersionMinor", &MaestroDevice::DeviceSettings::firmwareVersionMinor)
24-
.def_readwrite("firmwareVersionMajor", &MaestroDevice::DeviceSettings::firmwareVersionMajor)
25-
.def_readwrite("servosAvailable", &MaestroDevice::DeviceSettings::servosAvailable)
26-
.def_readwrite("servoPeriod", &MaestroDevice::DeviceSettings::servoPeriod)
27-
.def_readwrite("miniMaestroServoPeriod", &MaestroDevice::DeviceSettings::miniMaestroServoPeriod)
28-
.def_readwrite("servoMultiplier", &MaestroDevice::DeviceSettings::servoMultiplier)
29-
.def_readwrite("fixedBaudRate", &MaestroDevice::DeviceSettings::fixedBaudRate)
30-
.def_readwrite("enableCrc", &MaestroDevice::DeviceSettings::enableCrc)
31-
.def_readwrite("neverSuspend", &MaestroDevice::DeviceSettings::neverSuspend)
32-
.def_readwrite("serialDeviceNumber", &MaestroDevice::DeviceSettings::serialDeviceNumber)
33-
.def_readwrite("miniSscOffset", &MaestroDevice::DeviceSettings::miniSscOffset)
34-
.def_readwrite("serialTimeout", &MaestroDevice::DeviceSettings::serialTimeout)
35-
.def_readwrite("scriptDone", &MaestroDevice::DeviceSettings::scriptDone)
36-
.def_readwrite("enablePullups", &MaestroDevice::DeviceSettings::enablePullups)
25+
py::class_<Device::DeviceSettings>(device, "DeviceSettings")
26+
.def_readwrite("firmwareVersionMinor", &Device::DeviceSettings::firmwareVersionMinor)
27+
.def_readwrite("firmwareVersionMajor", &Device::DeviceSettings::firmwareVersionMajor)
28+
.def_readwrite("servosAvailable", &Device::DeviceSettings::servosAvailable)
29+
.def_readwrite("servoPeriod", &Device::DeviceSettings::servoPeriod)
30+
.def_readwrite("miniMaestroServoPeriod", &Device::DeviceSettings::miniMaestroServoPeriod)
31+
.def_readwrite("servoMultiplier", &Device::DeviceSettings::servoMultiplier)
32+
.def_readwrite("fixedBaudRate", &Device::DeviceSettings::fixedBaudRate)
33+
.def_readwrite("enableCrc", &Device::DeviceSettings::enableCrc)
34+
.def_readwrite("neverSuspend", &Device::DeviceSettings::neverSuspend)
35+
.def_readwrite("serialDeviceNumber", &Device::DeviceSettings::serialDeviceNumber)
36+
.def_readwrite("miniSscOffset", &Device::DeviceSettings::miniSscOffset)
37+
.def_readwrite("serialTimeout", &Device::DeviceSettings::serialTimeout)
38+
.def_readwrite("scriptDone", &Device::DeviceSettings::scriptDone)
39+
.def_readwrite("enablePullups", &Device::DeviceSettings::enablePullups)
3740
;
3841

39-
py::enum_<MaestroDevice::ChannelMode>(device, "ChannelMode")
40-
.value("SERVO", MaestroDevice::ChannelMode::SERVO)
41-
.value("SERVO_MULTIPLIED", MaestroDevice::ChannelMode::SERVO_MULTIPLIED)
42-
.value("OUTPUT", MaestroDevice::ChannelMode::OUTPUT)
43-
.value("INPUT", MaestroDevice::ChannelMode::INPUT)
42+
py::enum_<Device::ChannelMode>(device, "ChannelMode")
43+
.value("SERVO", Device::ChannelMode::SERVO)
44+
.value("SERVO_MULTIPLIED", Device::ChannelMode::SERVO_MULTIPLIED)
45+
.value("OUTPUT", Device::ChannelMode::OUTPUT)
46+
.value("INPUT", Device::ChannelMode::INPUT)
4447
.export_values();
4548

46-
py::enum_<MaestroDevice::HomeMode>(device, "HomeMode")
47-
.value("OFF", MaestroDevice::HomeMode::OFF)
48-
.value("IGNORE", MaestroDevice::HomeMode::IGNORE)
49-
.value("GOTO", MaestroDevice::HomeMode::GOTO)
49+
py::enum_<Device::HomeMode>(device, "HomeMode")
50+
.value("OFF", Device::HomeMode::OFF)
51+
.value("IGNORE", Device::HomeMode::IGNORE)
52+
.value("GOTO", Device::HomeMode::GOTO)
5053
.export_values();
5154

52-
py::class_<MaestroDevice::ChannelSettings>(device, "ChannelSettings")
53-
.def_readwrite("mode", &MaestroDevice::ChannelSettings::mode)
54-
.def_readwrite("homeMode", &MaestroDevice::ChannelSettings::homeMode)
55-
.def_readwrite("home", &MaestroDevice::ChannelSettings::home)
56-
.def_readwrite("minimum", &MaestroDevice::ChannelSettings::minimum)
57-
.def_readwrite("maximum", &MaestroDevice::ChannelSettings::maximum)
58-
.def_readwrite("neutral", &MaestroDevice::ChannelSettings::neutral)
59-
.def_readwrite("range", &MaestroDevice::ChannelSettings::range)
60-
.def_readwrite("speed", &MaestroDevice::ChannelSettings::speed)
61-
.def_readwrite("acceleration", &MaestroDevice::ChannelSettings::acceleration)
55+
py::class_<Device::ChannelSettings>(device, "ChannelSettings")
56+
.def_readwrite("mode", &Device::ChannelSettings::mode)
57+
.def_readwrite("homeMode", &Device::ChannelSettings::homeMode)
58+
.def_readwrite("home", &Device::ChannelSettings::home)
59+
.def_readwrite("minimum", &Device::ChannelSettings::minimum)
60+
.def_readwrite("maximum", &Device::ChannelSettings::maximum)
61+
.def_readwrite("neutral", &Device::ChannelSettings::neutral)
62+
.def_readwrite("range", &Device::ChannelSettings::range)
63+
.def_readwrite("speed", &Device::ChannelSettings::speed)
64+
.def_readwrite("acceleration", &Device::ChannelSettings::acceleration)
6265
;
6366

64-
py::class_<MaestroDevice::ServoStatus>(device, "ServoStatus")
65-
.def_readonly("position", &MaestroDevice::ServoStatus::position)
66-
.def_readonly("target", &MaestroDevice::ServoStatus::target)
67-
.def_readonly("speed", &MaestroDevice::ServoStatus::speed)
68-
.def_readonly("acceleration", &MaestroDevice::ServoStatus::acceleration)
67+
py::class_<Device::ServoStatus>(device, "ServoStatus")
68+
.def_readonly("position", &Device::ServoStatus::position)
69+
.def_readonly("target", &Device::ServoStatus::target)
70+
.def_readonly("speed", &Device::ServoStatus::speed)
71+
.def_readonly("acceleration", &Device::ServoStatus::acceleration)
6972
;
7073

71-
device.def("getName", &MaestroDevice::getName)
72-
.def("getNumChannels", &MaestroDevice::getNumChannels)
73-
.def("setTarget", &MaestroDevice::setTarget)
74-
.def("setSpeed", &MaestroDevice::setSpeed)
75-
.def("setAcceleration", &MaestroDevice::setAcceleration)
76-
.def("getServoStatus", &MaestroDevice::getServoStatus)
77-
.def("restoreDefaultConfiguration", &MaestroDevice::restoreDefaultConfiguration)
78-
.def("getDeviceSettings", &MaestroDevice::getDeviceSettings)
79-
.def("setDeviceSettings", &MaestroDevice::setDeviceSettings)
80-
.def("getChannelSettings", &MaestroDevice::getChannelSettings)
81-
.def("setChannelSettings", &MaestroDevice::setChannelSettings)
82-
.def("eraseScript", &MaestroDevice::eraseScript)
83-
.def("restartScriptAtSubroutine", &MaestroDevice::restartScriptAtSubroutine)
84-
.def("restartScriptAtSubroutineWithParameter", &MaestroDevice::restartScriptAtSubroutineWithParameter)
85-
.def("restartScript", &MaestroDevice::restartScript)
86-
.def("setScriptDone", &MaestroDevice::setScriptDone)
87-
.def("startBootloader", &MaestroDevice::startBootloader)
88-
.def("reinitialize", &MaestroDevice::reinitialize)
89-
.def("clearErrors", &MaestroDevice::clearErrors)
90-
.def("writeScript", &MaestroDevice::writeScript)
91-
.def("setPWM", &MaestroDevice::setPWM)
92-
.def("disablePWM", &MaestroDevice::disablePWM)
74+
device.def("getName", &Device::getName)
75+
.def("getNumChannels", &Device::getNumChannels)
76+
.def("setTarget", &Device::setTarget, py::arg("channelNumber"), py::arg("target"))
77+
.def("setSpeed", &Device::setSpeed, py::arg("channelNumber"), py::arg("target"))
78+
.def("setAcceleration", &Device::setAcceleration, py::arg("channelNumber"), py::arg("target"))
79+
.def("getServoStatus", &Device::getServoStatus)
80+
.def("restoreDefaultConfiguration", &Device::restoreDefaultConfiguration)
81+
.def("getDeviceSettings", &Device::getDeviceSettings)
82+
.def("setDeviceSettings", &Device::setDeviceSettings, py::arg("settings"))
83+
.def("getChannelSettings", &Device::getChannelSettings)
84+
.def("setChannelSettings", &Device::setChannelSettings, py::arg("channelNumber"), py::arg("settings"))
85+
.def("eraseScript", &Device::eraseScript)
86+
.def("restartScriptAtSubroutine", &Device::restartScriptAtSubroutine, py::arg("subroutineNumber"))
87+
.def("restartScriptAtSubroutineWithParameter", &Device::restartScriptAtSubroutineWithParameter, py::arg("subroutineNumber"), py::arg("parameter"))
88+
.def("restartScript", &Device::restartScript)
89+
.def("setScriptDone", &Device::setScriptDone, py::arg("value"))
90+
.def("startBootloader", &Device::startBootloader)
91+
.def("reinitialize", &Device::reinitialize)
92+
.def("clearErrors", &Device::clearErrors)
93+
.def("writeScript", &Device::writeScript, py::arg("bytecode"))
94+
.def("setPWM", &Device::setPWM, py::arg("dutyCycle"), py::arg("period"))
95+
.def("disablePWM", &Device::disablePWM)
9396
;
97+
98+
py::class_<Program>(m, "Program")
99+
.def(py::init<const std::string &, bool>(), py::arg("script"), py::arg("isMiniMaestro"))
100+
.def("getByteList", &Program::getByteList)
101+
.def("getCRC", &Program::getCRC)
102+
.def("toString", &Program::toString);
94103
}

src/CMakeLists.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
cmake_minimum_required(VERSION 3.11.4)
2+
3+
project(Maestro)
4+
5+
add_library(maestro STATIC
6+
maestro/Device.h
7+
maestro/Device.cpp
8+
maestro/Instruction.cpp
9+
maestro/Instruction.h
10+
maestro/Program.cpp
11+
maestro/Program.h
12+
maestro/Opcode.h
13+
)
14+
target_link_libraries(maestro PRIVATE usb-1.0)
15+
set_target_properties(maestro PROPERTIES CXX_STANDARD 11)
16+
set_target_properties(maestro PROPERTIES POSITION_INDEPENDENT_CODE ON)
17+
set_target_properties(maestro PROPERTIES PUBLIC_HEADER "maestro/Device.h;maestro/Program.h")
18+
set_target_properties(maestro PROPERTIES FOLDER "Maestro")
19+
target_include_directories(maestro PUBLIC .)
20+
21+
install(TARGETS maestro
22+
LIBRARY DESTINATION lib
23+
ARCHIVE DESTINATION lib
24+
PUBLIC_HEADER DESTINATION include)
25+

0 commit comments

Comments
 (0)