Author: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri Sep 26 06:19:43 2025 +0100 feat: Add power status borders to builder icons This commit introduces a visual indication of the power status for each builder in the UI. - The `createBuilderDiv` function in `assets/sai.js` now adds CSS classes to the builder's div based on its power management status (`power_managed`) and whether it's under a "stay on" (`stay_on`). - New CSS rules in `assets/sai.css` style these classes: - `.power-unmanaged`: Applies a grey border for builders whose power is not managed. - `.power-stay`: Applies a green border for builders that are managed and have a "stay on" active. - Builders that are online but not in either of these states will have no border, as before. diff --git a/assets/sai.css b/assets/sai.css index b846bb3..3165758 100644 --- a/assets/sai.css +++ b/assets/sai.css @@ -645,6 +645,14 @@ div.ibuil { width: 80px; } +div.ibuil.power-unmanaged { + border: 2px solid black; +} + +div.ibuil.power-stay { + border: 2px solid green; +} + div.ibuilctr { font-weight: normal; font-size: 9pt; diff --git a/assets/sai.js b/assets/sai.js index e5ad7ce..cd314b2 100644 --- a/assets/sai.js +++ b/assets/sai.js @@ -1015,6 +1015,13 @@ function createBuilderDiv(plat) { platDiv.className = "ibuil bdr"; if (!plat.online) platDiv.className += " offline"; + else { + if (!plat.power_managed) + platDiv.className += " power-unmanaged"; + else + if (plat.stay_on) + platDiv.className += " power-stay"; + } if (plat.powering_up) platDiv.className += " powering-up"; if (plat.powering_down) diff --git a/src/server/s-comms.c b/src/server/s-comms.c index 53c4e44..fa0e8c4 100644 --- a/src/server/s-comms.c +++ b/src/server/s-comms.c @@ -833,11 +833,14 @@ s_callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user, case 1: { sai_power_managed_builders_t *pmb = (sai_power_managed_builders_t *)a.dest; - + uint64_t bf_set = 0; + lws_start_foreach_dll(struct lws_dll2 *, p, pmb->builders.head) { sai_power_managed_builder_t *b = lws_container_of(p, sai_power_managed_builder_t, list); char q[256]; + int shi = 0; + lwsl_notice("%s: Marking builder %s as power-managed\n", __func__, b->name); lws_snprintf(q, sizeof(q), @@ -847,14 +850,23 @@ s_callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user, lwsl_err("%s: Failed to mark builder %s as power-managed\n", __func__, b->name); - sai_plat_t *cb; lws_start_foreach_dll(struct lws_dll2 *, p2, vhd->server.builder_owner.head) { - cb = lws_container_of(p2, sai_plat_t, - sai_plat_list); + + sai_plat_t *cb = lws_container_of(p2, sai_plat_t, sai_plat_list); const char *dot = strchr(cb->name, '.'); - if (dot && !strncmp(cb->name, b->name, (size_t)(dot - cb->name))) + + lwsl_notice("%s: builder entry: %s\n", __func__, cb->name); + + if (dot && !(bf_set & (1 << shi)) && strlen(b->name) <= (size_t)(dot - cb->name) && + !strncmp(cb->name + (dot - cb->name) - strlen(b->name), b->name, strlen(b->name))) { + lwsl_notice("%s: ++++++++++++ Setting %s .stay_on=%d\n", __func__, cb->name, b->stay_on); cb->stay_on = b->stay_on; + bf_set |= (1 << shi); + } else + lwsl_notice("%s: ------------ Unmatched '%s' '%s'\n", __func__, cb->name + (dot - cb->name) - strlen(b->name), b->name); + + shi++; } lws_end_foreach_dll(p2); } lws_end_foreach_dll(p);