Add segmented_movement pattern with n4 parameter support

- Add n4 parameter to control server, LED bar receiver, and test script
- Create segmented_movement pattern with alternating forward/backward movement
- Pattern supports n1 (segment length), n2 (spacing), n3 (forward speed), n4 (backward speed)
- Fix test script to send all messages instead of just the first one
- Add segmented_movement to patterns_needing_params for proper parameter transmission
- Pattern intelligently handles all cases: alternating, forward-only, backward-only, or static
- Implements repeating segments with configurable spacing across LED strip
This commit is contained in:
Pi User
2025-10-03 19:54:43 +13:00
parent f4e9f8fff7
commit e4a83e8f0d
7 changed files with 485 additions and 27 deletions

View File

@@ -6,10 +6,10 @@ Starts a client to localhost:8765 and sends a small sequence of UI commands:
- pattern_change
- color_change
- brightness_change
- parameter_change (n1/n2/n3)
- parameter_change (n1/n2/n3/n4)
Usage examples:
python test/test_control_server.py --pattern on --r 255 --g 0 --b 0 --brightness 150 --n1 5 --n2 5 --n3 1
python test/test_control_server.py --pattern on --r 255 --g 0 --b 0 --brightness 150 --n1 5 --n2 5 --n3 1 --n4 2
python test/test_control_server.py --pattern rainbow
"""
@@ -51,7 +51,7 @@ def build_messages(args):
if args.brightness is not None:
msgs.append({"type": "brightness_change", "data": {"brightness": args.brightness}})
if any(v is not None for v in (args.n1, args.n2, args.n3)):
if any(v is not None for v in (args.n1, args.n2, args.n3, args.n4)):
payload = {}
if args.n1 is not None:
payload["n1"] = args.n1
@@ -59,6 +59,8 @@ def build_messages(args):
payload["n2"] = args.n2
if args.n3 is not None:
payload["n3"] = args.n3
if args.n4 is not None:
payload["n4"] = args.n4
msgs.append({"type": "parameter_change", "data": payload})
return msgs
@@ -66,9 +68,11 @@ def build_messages(args):
async def run_test(uri: str, messages: list[dict], sleep_s: float):
async with websockets.connect(uri) as ws:
# Send only one message (first in list)
m = messages[0]
await ws.send(json.dumps(m))
# Send all messages with a delay between them
for m in messages:
await ws.send(json.dumps(m))
if len(messages) > 1:
await asyncio.sleep(sleep_s)
def parse_args():
@@ -83,6 +87,7 @@ def parse_args():
p.add_argument("--n1", type=int, help="n1 for parameter_change")
p.add_argument("--n2", type=int, help="n2 for parameter_change")
p.add_argument("--n3", type=int, help="n3 for parameter_change")
p.add_argument("--n4", type=int, help="n4 for parameter_change")
p.add_argument("--sleep", type=float, default=0.2, help="Seconds to wait between messages (default 0.2)")
p.add_argument("--colors", help="Comma-separated hex colors (uses first as r,g,b)")
return p.parse_args()