FYI, I've implemented most all of the TMCC1 and TMCC2 commands on pages 4, 5, 6, 8, and 9 of the LCS Partner Documentation Legacy Command Protocol, rev 1.21. The commands I've omitted are those that add/remove engines and rail sounds cars from consists/trains.
The Python code is checked in at github.com/cdswindell/PyLegacy. There are a series of command line tools (CLI) you can use to control an engine from a shell window of a Linux/Mac/Windows PC, as well as a series of classes to issue commands programatically. With respect to the cli commands, the engine
command was the most challenging, because there are so many options!! Typing the command:
(legacyEnv) davids@Sprucewood-iMac PyLegacy (master) % src/cli/engine.py -h
usage: Control specified engine/train (1 - 99) [-h] [-a | -s | -fwd | -rev | -t | -fc | -rc | -r | -b |
-boost | -bl [0 - 7] | -brake | -kl [0 - 7] |
-tb [0 - 7] | -sui | -sud | -sdi | -sdd] [-tr]
[-tmcc | -legacy]
[-baud BAUDRATE] [-p PORT]
Engine/Train {speed,sp,bell,be,horn,ho,momentum,mo,sound,so}
positional arguments:
Engine/Train Engine/Train to control
{speed,sp,bell,be,horn,ho,momentum,mo,sound,so}
Engine/train sub-commands
speed (sp) Speed of engine/train
bell (be) Bell operations
horn (ho) Horn operations
momentum (mo) Momentum operations
sound (so) Sound operations
options:
-h, --help show this help message and exit
-a, --set_address Set engine address
-s, --stop_immediate Stop immediate
-fwd, --forward_direction
Set forward direction
-rev, --reverse_direction
Set reverse direction
-t, --toggle_direction
Toggle direction
-fc, --front_coupler Open front coupler
-rc, --rear_coupler Open rear coupler
-r, --ring_bell Ring bell
-b, --blow_horn Blow horn
-boost, --boost_speed
Brake speed
-bl [0 - 7], --boost_level [0 - 7]
Boost level
-brake, --brake_speed
Boost speed
-kl [0 - 7], --brake_level [0 - 7]
Brake level
-tb [0 - 7], --train_brake [0 - 7]
Train brake
-sui, --start_up_immediate
Start up immediate
-sud, --start_up_delayed
Start up delayed (prime mover)
-sdi, --shutdown_immediate
Shutdown Immediate
-sdd, --shutdown_delayed
Shutdown delayed with announcement
-tr, --train Direct command to addressed train rather than engine (for TMCC2 commands)
-tmcc, --tmcc1 Use TMCC1 command syntax.
-legacy, --tmcc2 Use TMCC2/Legacy command syntax.
-baud BAUDRATE, --baudrate BAUDRATE
Baud Rate (9600)
-p PORT, --port PORT Serial Port (/dev/ttyUSB0)
provides a list of command options that can be applied to the specified option. For example the command:
src/cli/engine.py 71 speed 65
sets the absolute speed of the Legacy engine with the Engine ID of 71 to 65.
The command:
src/cli/engine.py 71 -r
turns the bell on (or off) on Engine #71.
I've added tests for the TMCC1 commands. I need to think a bit about how to test the TMCC2 commands, as it is tedious to code the bit patterns from the Lionel doc into source code, but that is most likely what I need to do...
Next up is to implement a serial communications module that allows a single instance to take commands from multiple threads and meter them out to the serial input of the LCS SER2 (so its buffer doesn't overflow).
To follow are implementing the multi-word Legacy commands, the Raspberry Pi code to respond to button presses, complete unit tests, better documentation, and packaging the project into a downloadable project on PyPi.
-- Dave