api_brainstorm

Hypothetical python sessions.

# This would connect to a single controller via some appropriate mechanism,
# (likely an attached fdcanusb or a pi3hat).

import asyncio

import moteus

async def main():
    controller = moteus.Controller()  # default id of 1

    while True:
        print(await controller.set_position(position = 0.1 * math.sin(time.time()), query=True))

asyncio.run(main())
# An all-options used variant.
import asyncio

import moteus

async def main():
    fdcanusb1 = moteus.Fdcanusb(path='/dev/fdcanusb')
    fdcanusb2 = moteus.Fdcanusb(path='/dev/ttyACM1')

    router = moteus.Router([(fdcanusb1, [1, 2]),
                            (fdcanusb2, [3, 5])])

    c1 = moteus.Controller(id=1)  # Will use a default router if any action calls are made
    c2 = moteus.Controller(id=2,
                           query_resolution={},
                           position_resolution={},
                           router=router)

    while True:
        data = await router.cycle(
          c1.make_position(position = 0.1 * math.sin(time.time()), query=True),
          c2.make_position(position = 0.1 * math.cos(time.time()), query={}),
        )
        print("1: {}, 2: {}", data[1].position, data[2].position)

        # This also works, and invokes a separate transmission cycle.
        await c2.set_position(position = 0.1 * math.cos(time.time()))