From 0813734e78af785d04fcc0f1e3461b259fa9f43b Mon Sep 17 00:00:00 2001 From: christian Date: Wed, 21 Oct 2026 16:06:04 -0400 Subject: [PATCH] NA page-number key: hold 2 s = status page, keep holding to 3 s = LOCATIONS page - nav_hold_more: longer holds go further (tested on NA's Companion emulator: 2.5 s -> 19, 3.5 s -> 98, tap -> 1) Co-Authored-By: Claude Opus 5.5 --- README.md | 1 + config.json | 10 ++++++++-- make_page.py | 8 ++++++++ ready-page.companionconfig | Bin 3466 -> 3497 bytes restart-page.companionconfig | Bin 3865 -> 3906 bytes schema.py | 2 ++ status-page.companionconfig | Bin 6546 -> 6584 bytes tests/test_campus.py | 11 +++++++++++ tests/test_status_panel.py | 7 ++++--- 9 files changed, 34 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ec0fedf..37d41b7 100644 --- a/README.md +++ b/README.md @@ -311,6 +311,7 @@ Smart-plug keys (outlets.json) are never copied. page gets a blue band naming it ("SC", "SC WS", "SC?" when it stops answering). It flashes until that location acknowledges, then stays; the page's own name and number shrink into the top 60% so they stay readable. Red stays for NA's own problems. +- **Page-number key holds at NA** (`nav_hold_ms` 2000 + `nav_hold_more`): tap = page 1, hold 2 s = the status page (19), keep holding to 3 s = the LOCATIONS page (98) to pick a location. WS and SC keep a 1 s hold to their status page. - **ALL AUTO-FIX** (LOCATIONS page 98, bottom-left): blue "ALL ON", or grey naming the paused locations. Tap: pause auto-fix at NA, WS and SC at once; tap again: every one back to its own auto-fix hours (`autofix auto`). Alarms stay on and holds still fix. diff --git a/config.json b/config.json index 2ae354e..f8bd413 100644 --- a/config.json +++ b/config.json @@ -855,7 +855,7 @@ "ssh": "studio@10.1.7.39" } }, - "nav_hold_ms": 1000, + "nav_hold_ms": 2000, "nav_keys": [ "pagenum" ], @@ -2299,5 +2299,11 @@ "heartbeat": "sp_hb", "state": "sp_state" }, - "nav_locations_band": true + "nav_locations_band": true, + "nav_hold_more": [ + { + "ms": 3000, + "page": 98 + } + ] } diff --git a/make_page.py b/make_page.py index 6ea2469..9d77517 100644 --- a/make_page.py +++ b/make_page.py @@ -333,6 +333,14 @@ def nav_key(kind, names, status_page=None, hold_ms=1000, tap_page=1, cfg=None): "options": {"surfaceId": prop("self"), "page": prop(status_page)}, "children": {}}] step["action_sets"] = {"down": [], "up": tap, str(hold_ms): hold} step["options"]["runWhileHeld"] = [hold_ms] + # Longer holds go further (NA, 2026-10-21: 2 s the status page, still held at 3 s the LOCATIONS page). + for i, more in enumerate(sorted((cfg or {}).get("nav_hold_more") or [], key=lambda m: m["ms"])): + if more["ms"] > hold_ms: + step["action_sets"][str(more["ms"])] = [{"type": "action", "id": stable_id("nav", "hold%d" % (i + 2)), + "definitionId": "set_page", "connectionId": "internal", + "options": {"surfaceId": prop("self"), "page": prop(more["page"])}, + "children": {}}] + step["options"]["runWhileHeld"].append(more["ms"]) key["options"]["notes"] = ("%s (%s): colour follows the ALL button on the status page. " "Undo on every page with: python3 nav_keys.py --revert" % (NAV_MARKER, kind)) return key diff --git a/ready-page.companionconfig b/ready-page.companionconfig index 657322cd1a1a1522506f61cf186827722543e259..d882e1664e64877fc7d82ee7a8ae871bab7a15d2 100644 GIT binary patch delta 3495 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 diff --git a/restart-page.companionconfig b/restart-page.companionconfig index 4cfc36b8ac8d990fc3e2f70151a87091f136646d..c659c0cca22e010381cbcf63b3339326164eead3 100644 GIT binary patch literal 3906 zcmV-I554doiwFpt8rfbYXIIEpTCHWiDfHZE#_3X>V?0Z*FF3X8`S;Yg6LN z7KXq3E3#8lTdgx%+%KLpXBQ%aC<93FdfY{Y(1A!uFbOwj&woF;f#DJ$h?z0-ewk6y zy_)WP~pgD{daBLBl<6Nk8Kg!_<)nUJyz0-oc0B=X}jM=1)Vl_DfeHSGn`+S~nei zQH`?tCAMoe7zsT-N>!p;R5a@fCrg?li>hskqC=CPoIlQf<$jMgKmGC9Di>Z-uF=;t zSvnHgF;Pg9{%l`XwXsNEi&L~&z-aw{_9xRz(|&QRG+@<<3Chu(?8244Y7Gm`_BGjg zVe-8ejWr1;E39VSpV!9qyT*!rt1q(BB#NVs{>{|fsHYIszO6hfs$_ckhr_zsmWPbS zYJIh!54GynM3eArU(`IbvA59J!oW4;QE1t)ow8h~rO17$>1pV6bIy;6WVmJ1rAM05 zCtD4e++#UG8@redheBIf9l6-s&f0jV)`mh;Ywx(fZ6dVV+K!DXvbO3u+0G~@i?ZVO zSbRDVB#kH%E1qaVm(=@`Fgm1;s80u6U)AL9iQ22T8;8_?sc@Y7i%O*9(NrozolpnU z61>Q&?Ybs#okQx&7b>h5ds1bo$7<~Zrx{%nHFEfw+W&N{sP*PRt@jkUcih-N)XjOS z5!pXHT=gIukH*rWuyp2jg*$9F#FpLcih+KM-HNOVtJG7FRG~?Bt87A7*Q%x3R_NMu z>c+Ar%-4XhLD+Wjbg(K(#4LYYZddAy;&y|;ibBivf#ZmwncIacgLkvc3!?Z-?@hPbP2jVCcEeDWYPq7PcYp1B3|L0{+l4E; zjNHPBWHK4if81f{#(NIk_^m^?52?s{>aPkfWJk9!67o3O>Xv>t`Q8~()N|{$B1oNG zOR>>}>yS@a&5_DV>UKjf_cc+F$f}S$7D=YU=};&Y+G19;fB1WEre%GGF+|J>A!t=2 zy^12YUTw}!gJyx5HtE-EhAb-M3^%cAex2!6j+OKYU*N}#0euQmrYER#H-(mDjTj%& z)f`jHRBKd+jH!Kxm+b2f*OtX56`|APBXDrKmG)Y7d{N?$U{ji~);lZVIj+`#dKG#f0}F+tVe zuP}@BW(G6lyq7dz>?v$v)EY{4ecN65_H3KnWJpV|6=RRkl%F}{1$u#oGeL%d#yIn ziP=(%-Zm45&3x#1zI4Ihy3H9=>l}af>2g|gYs4u}dTWRO=4FK=l*93;rSj+bYwfvw zMVf01VpAcevO7w>{`mJ|jJtG5Y2AZwbz|h5nCRHyFop{)v9~w#|J2DvnPbHp`_@~Y zK7)B9z`Ve`NOq9y1Pk+OiZQW!1HF?vK)pb{5I3M+pkAO}2m}PeFVtJBX0n%zN7!oz zEdj*6cF*`NLO38_pOCLT-hjSsI^;O;KlM`CY4lC_5j z!0!g&*YX3P-+A;K1^Na0Me>8>CvfOjQbo_`*Q^8d3-k+d1NsH}1^R_RKp=cXza^&V z9sL?XOEA%|(KCLF5Dw_qKlE#iH_$K8?>h9W`-%VPS8vqR{h;vQr}SMbbJ;4ExU*O$ z7U`yLB=Q3OyBYu0odNuJp8v+cf5Cr|0U-kl7XKB@fWRC7ozwyU1^-$E&$V`?7xuN|}mkpJ2}zxH^8|APOngK z zqhD@#_Qa|R)4cln(!V;Y9A(w<{W49abF&HkhNhOpW4{32H3BVu zsf?dsq8u~ zyFp7E!kvZ4w_A**;&M4wxGP@sLtYh!x0%FGihLKN)_?w47x;d01ipIdMH62T_#*H{ z;JaDi8>yC319I^YxyTlZA@<_*sC3yv;ETZbO@VLhgT}p;Og@KD_oIip4O!E>_O79B zEPNb^Bij8b(eCG!6Pm^(&WDi;;lA@S9G1IG>+1RX3=`U~GNHxdA9F^F$3Nzb)*{;E zZ|?_>^fXm^q|H?8ksi%vNglNx^WCp7-)VC1T_?ME?AWil?u}acTZ5haX+y4d;+>01 zFVCbO#OKmIDJ}y$MVVu*1wZe$ScCR8!T;?zPvV1sp4dlO7P8jUjQPZze$2nMyU$I@ zXgC=+SyMV4OUA=k#__JpIAX(YN%~d~2{(nrS%P_DQ>o{xm6}Is@4IgY$_M59#guQ= z4xzP<_8wb$CV~F%vukn9-k5pZ;N3Fzu6)S7E3<{Bn^%}xrgqIx5<4*WuN)XDyVUO< zo>0bP)mJE9Htx4-ZdAz>iPn#C){;E&o7%*L#@$ zIX5x-)|(g;FFWL3$@Uvnb@UvqKeY;p#BX{N)2R=)uglSBbf+hLg>k|cPWZx>E^O%v z&Iw<}Tio?;zxnZA(+b$&Md55O$QsV}!r5Lp+Y15#f$-sMuS&ICspgnmsg|pHINfU! zvjpsDuSvIfudy2r_446RugPHJL@%7^<$9u*?Ib=P=ViBOK2Je8&?}Tb&-9h^L?o4X zj)$Y=JTG*@IM8d&fnK&J;54s!%o_pb1?EM%gLEf2nAdP^UB5QRyweK6yuiGWHDF#~ zUSM7b1O&nl%$qqa=4$1V2f{lER{}LkarE_wVeTwcOLRa0eJy=k?bJZ2@d47Ud*n4 zvN`5;Q~~G(=!LWa^aAt(^gW1Nt(Ra;@<7-UITTgew69 zzLRe8Uc)xPULRoZWUzsHfqGq0uk9p0f?m7DdQW7>L1DbN%yTg!KlFvr@IwAJRFizW zegVe2hVj~-0Kz*@c;g_vAiT(Qkm&^I{03csSr4Z-Sj9niL3bf(pu3>Ept}$V2!tAa@FK_ok&Bhw(Z+ed>wElV`g23;|An0D}M{8$vd; zYXTfiL?X#({0)#2P!+%g5)oivV!ikL@lmQ|@;Q3v3N)bvv6FNZSw0f5YjYmw<1bZ1dG&rpk=Q(rxKV>58F;dN@?X z%jSRGL>X@&M`DY_7EvpfHqE>zv8jhbp58!iRlxElEN_CWVR;jlH(_}b1Ofu#(;LXo zvgL2yUOsMyE5UpDxY;e91Fcf z#8~P!#ogX(_tB@(*JmttTL0d0!wIn53GW>T+(nXuBq!i-x2ae3Mt7|mz`MY^5H{dl z;9cNd2m}PeFT8t}Va`4BT{B<_AmBCo#d{9jfOvgEyyj?w@q+QLWW0u#_zZc?CIdow zFU4|5&9_;VQ7Y%p$?***@^w(&4JfbS1;D&`^Efask{u*F0mi%>YYFP+nD?~?FfTAK zgbkP%m=~BA0s(>W1M_Axm0F=(Vmx5pX}}UN%scHD?>Te>=Jf&dPDdM<7ns)-^G>|P zN6b5IG9Z|@(YqdD;qs~`KlR#?dbthEy9V=4ya1RN?->W?MY4lrC%~Aup$N?u z*&Omt$^-EN@j}#qc!79f z1=w{3yOxjmh;{7-0|IsV^yx+A^!YwRlYh z3&M+B2f0p=2(QMf9P8mM-br~7UJzc08VD~4F9Fv4s1 ziuV|@f$;i3cs`ZoEpGtpon^gyc1gOW2u;Q@anM~s(#5Rbm8LNe-DOA9k5Zo}rK<99rik@>e9yFQ z7&j<^#!8&o`gik_S4YzgiexG`=7U1(@=(zq{8GQ$AcmMmLZ%fX+bRkTMHi@PQRj#A QruKgPA8#1xDsOoK0Ba`Q5&!@I literal 3865 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 diff --git a/schema.py b/schema.py index e74831e..c6d4954 100644 --- a/schema.py +++ b/schema.py @@ -71,6 +71,8 @@ field("nav_keys", "list", ["pagenum"], "Which of Companion's page keys (page up, apply="pages") field("nav_hold_ms", "int", 1000, "Holding the page-number key this long jumps to the Status page.", "Companion", advanced=True, lo=200, hi=5000, apply="pages") +field("nav_hold_more", "list", [], "Longer holds on the page-number key: [{\"ms\": 3000, \"page\": 98}] - still held at 3 s, " + "it goes on to page 98 (NA: 2 s the status page, 3 s the LOCATIONS page).", "Companion", advanced=True, apply="pages") field("nav_tap_page", "int", 1, "Tapping the page-number key goes to this page.", "Companion", advanced=True, lo=1, apply="pages") field("variables", "dict", {}, "The custom variables the panel uses inside Companion.", "Companion", required=True) diff --git a/status-page.companionconfig b/status-page.companionconfig index a5f8b735ec8851c0367e1b2733af03cfe8b640a9..ea57e65c0c62827741c9351f1611d1ba33aaa17d 100644 GIT binary patch delta 6445 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 delta 6409 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 LlP%jQ{*C_ut%l!Y diff --git a/tests/test_campus.py b/tests/test_campus.py index acefcf2..f2f9427 100644 --- a/tests/test_campus.py +++ b/tests/test_campus.py @@ -616,3 +616,14 @@ class TestAllAutoFix(unittest.TestCase): key = page["page"]["controls"]["3"]["1"] self.assertIn("all autofix", key["options"]["notes"]) self.assertIn("sp_all_cmd", json.dumps(key["steps"])) + + +class TestLongerHolds(unittest.TestCase): + def test_na_page_key_goes_to_status_at_2s_and_locations_at_3s(self): + na = json.load(open(os.path.join(ROOT, "config.json"))) + cfg = dict(na, nav_hold_ms=2000, nav_hold_more=[{"ms": 3000, "page": 98}]) + st = make_page.nav_key("pagenum", cfg["variables"], 19, 2000, 1, cfg)["steps"]["0"] + pages = {k: [a["options"]["page"]["value"] for a in v] for k, v in st["action_sets"].items()} + self.assertEqual(pages, {"down": [], "up": [1], "2000": [19], "3000": [98]}) + self.assertEqual(st["options"]["runWhileHeld"], [2000, 3000]) + self.assertEqual(schema.validate(cfg)[0], []) diff --git a/tests/test_status_panel.py b/tests/test_status_panel.py index 4ade477..918883b 100644 --- a/tests/test_status_panel.py +++ b/tests/test_status_panel.py @@ -2274,10 +2274,11 @@ class TestPage(unittest.TestCase): self.assertTrue(key["options"]["notes"].startswith("STATUS nav key (%s)" % kind)) step = key["steps"]["0"] self.assertEqual(step["action_sets"]["down"], []) - tap, hold = step["action_sets"]["up"][0], step["action_sets"]["1000"][0] + tap, hold = step["action_sets"]["up"][0], step["action_sets"]["2000"][0] # NA: 2 s ... self.assertEqual((tap["definitionId"], tap["options"]["page"]["value"]), (action, 1)) # page 1 outright, not "startup" self.assertEqual((hold["definitionId"], hold["options"]["page"]["value"]), ("set_page", 19)) - self.assertEqual(step["options"]["runWhileHeld"], [1000]) + self.assertEqual(step["action_sets"]["3000"][0]["options"]["page"]["value"], 98) # ... then 3 s: LOCATIONS + self.assertEqual(step["options"]["runWhileHeld"], [2000, 3000]) box = [l for l in key["style"]["layers"] if l["type"] == "box"][0] self.assertTrue(box["color"]["isExpression"]) self.assertIn("'$.all.b'", box["color"]["value"]) # follows the ALL button @@ -2297,7 +2298,7 @@ class TestPage(unittest.TestCase): for r in c.values(): for ctl in r.values(): sets = ctl.get("steps", {}).get("0", {}).get("action_sets", {}) - if "2000" in sets: + if "2000" in sets and sets["2000"][0]["definitionId"] != "set_page": # not the page-number key's hold holds[sets["2000"][0]["options"]["value"]["value"]] = sets["up"] self.assertEqual(len(holds), len(CONFIG["restart_page"]["keys"])) self.assertIn("$(custom:sp_cmd);force rs_tascam $(internal:time_unix)", holds)