Skip to content

Commit bd7038b

Browse files
authored
v1.10.17 — Creality: only show fans the printer model actually has (#7)
The live control card rendered all three fan sliders (part/case/side) on every Creality model, but only the enclosed K-series has the case and side fans. Open-frame printers (Hi, Ender-3 V4, SparkX i7) and unrecognized models now show only the part-cooling fan, gated by a per-model capability map keyed on printerModelId. Firmware reports all *FanPct telemetry fields regardless of hardware, so the model id is the only reliable signal. Rebased onto main; re-versioned to v1.10.17 (v1.10.14-1.10.16 were taken by other changes that merged while this PR was open).
1 parent 6fa3406 commit bd7038b

4 files changed

Lines changed: 42 additions & 13 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@ Versions follow [Semantic Versioning](https://semver.org/).
55

66
---
77

8+
## v1.10.17 — 2026-06-22
9+
10+
### Fixed
11+
12+
- **Creality: fan controls now match each printer's hardware.** The live control card was showing the part-cooling, case, and side fan sliders on every Creality model, but only the enclosed K-series (K1 and K2 families) actually has all three. Open-frame printers — **Hi, Ender-3 V4, SparkX i7** — and any unidentified model now show only the **part-cooling fan**, so you no longer get sliders for fans the machine doesn't have.
13+
14+
---
15+
816
## v1.10.16 — 2026-06-22
917

1018
### Added

‎WORKLOG.md‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
1-
# Worklog — v1.10.16 (in progress)
1+
# Worklog — v1.10.17 (in progress)
22

33
## Added
4-
- **"What's New" — floating window (draggable + resizable).** The explainer is now a browser-like floating window: drag it by the title bar, resize from the bottom-right grip, and it remembers its size/position (`localStorage tigertag.whatsnew.win`). Restyled — title bar with an accent badge + a version picker pill, a per-version release-note heading ("Tiger Studio Manager X Public Release Note", localised, updates with the picker), items with icons in soft colour chips, sticky footer. `renderer/inventory.html`, `renderer/inventory.js` (`_initWhatsNewWindow`, `_placeWhatsNewWin`), `css/60-modals.css`
5-
- **"What's New" modal (per-version changelog explainer).** After an update, a dedicated window surfaces the new features in vulgarised language, shown **once per version** (compares the running `appVersion` to `localStorage tigertag.whatsnew.seen`). **"Got it"** marks the version seen; **"Later"** / ✕ / backdrop leave it unseen so it returns next launch. Re-openable any time from **Settings → About → "What's New"**. Content lives in `data/whatsnew.json` (keyed by version, **9 locales inline**, full history kept); auto-trigger is skipped while a blocking modal (login / display-name) is open. **Browsable history**: a version picker in the modal lets the user read any past release's notes (newest-first). The full back-catalogue (71 versions) was imported from `CHANGELOG.md` as an **English baseline** (the UI falls back to EN when a locale is missing); v1.10.13–1.10.15 are hand-localised to 9 locales. Release tooling: `npm run whatsnew:add -- <ver>` scaffolds an empty 9-locale entry, `npm run whatsnew:import` backfills all CHANGELOG versions (EN, never overwrites existing localised ones), `npm run whatsnew:check` verifies completeness (EN mandatory; an entry is either EN-only or fully 9-locale — no half-translated states). `scripts/whatsnew-import-changelog.mjs` `renderer/inventory.html`, `renderer/inventory.js`, `css/60-modals.css`, `data/whatsnew.json`, `scripts/whatsnew-add.mjs`, `scripts/whatsnew-check.mjs`
64

75
## Changed
8-
- **No more emojis in the UI — replaced by SVG icons or plain text.** Swept the renderer free of true emojis: the "What's New" item icons are SVG icon-set names (not emojis); locale strings (`welcomeBack`, `mobileApp`, `badgeRecycled`, `setupNameSave`, `tutoOpenBtn`, `tigerPodCta`) had their emojis stripped across all 9 locales; `inventory.html` greeting/label/option fallbacks + language-picker flags removed (flags can't be SVG inside native `<option>` → kept the language name); copy button (📋→`icon-copy`) and display-name hero (👋→`icon-user`); printer modules — Bambu humidity (💧→`icon-droplets`), Creality time-left (⏳→`SNAP_ICON_CLOCK`), TigerScale status badges (emoji→text, colour conveys state); plus emoji in comments/CSS. Monochrome functional glyphs (✕ ✓ ▲ ▼ arrows, box-drawing) intentionally left. `renderer/**` (locales, inventory.html, inventory.js, css/70-detail-misc.css, printers/*, IoT/tigerscale)
96

107
## Fixed
11-
- **"Set Color & TD Value" modal is now draggable.** Drag it by its header (clamped to the viewport, re-centered on each open). Added a reusable `_makeDraggableModal(overlayId, cardSel, handleSel)` helper. Blur removed behind it + the "TD1S Sensor" and "What's New" overlays (dim only). `renderer/inventory.js`, `css/60-modals.css`
12-
- **Spool grouping: TigerCloud now groups with TigerTag (Maker).** Cloud entries were never grouped (key returned `null`). They're now treated exactly like Maker chips — both use the attribute key `diy:brand|material|colorHex|aspect1` — so a Cloud spool and a Maker spool of the same filament collapse into one group. Only TigerTag+ still groups by `id_product`. `renderer/inventory.js` (`_spoolGroupKey`)
8+
- Creality: the live control card showed all three fans (part/case/side) on every model, but only the enclosed K-series has the case + side fans. Open-frame printers (Hi, Ender-3 V4, SparkX i7) and unknown models now show only the part-cooling fan. Gated by a per-model capability map keyed on `printerModelId` (firmware reports all `*FanPct` fields regardless of hardware, so model is the only reliable signal) — `renderer/printers/creality/index.js`.
139

1410
## Removed
1511

1612
## i18n
17-
- Added: `whatsNewTitle`, `whatsNewReleaseTitle`, `whatsNewGotIt`, `whatsNewLater`, `whatsNewEmpty` — 9 locales

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "tigertag-inventory",
3-
"version": "1.10.16",
3+
"version": "1.10.17",
44
"description": "Tiger Studio Manager — desktop app",
55
"main": "main.js",
66
"engines": {

‎renderer/printers/creality/index.js‎

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,25 @@ export function creActionFeed(printer, boxId, materialId, isFeed) {
347347
creSendSet(conn, { feedInOrOut: { boxId: Number(boxId), materialId: Number(materialId), isFeed: isFeed ? 1 : 0 } });
348348
}
349349

350+
// Catalog model ids (data/printers/cre_printer_models.json) that physically have
351+
// the enclosed-printer fan trio: part (P0) + case (P1) + side/auxiliary (P2).
352+
// Everything else — open-frame machines (Hi, Ender-3 V4, SparkX i7) and any
353+
// unrecognized model (id "0") — has only the part-cooling fan. The firmware
354+
// reports all three *FanPct fields regardless of the hardware (a real Ender-3 V4
355+
// still pushes caseFanPct/auxiliaryFanPct = 0, see RETRO.md), so field presence
356+
// is not a reliable signal — we gate the extra fans by model instead.
357+
const CRE_MULTI_FAN_MODEL_IDS = new Set(["2", "3", "4", "5", "6", "7", "8", "9"]);
358+
359+
// Returns the ordered list of fan telemetry keys this printer exposes in the UI.
360+
// Multi-fan models get all three; everything else (and unknown models) gets the
361+
// universal part-cooling fan only.
362+
function creFanKeysFor(p) {
363+
const base = ["modelFanPct"];
364+
if (CRE_MULTI_FAN_MODEL_IDS.has(String(p?.printerModelId || "")))
365+
base.push("caseFanPct", "auxiliaryFanPct");
366+
return base;
367+
}
368+
350369
// Set a fan speed (0-100%) via the 9999 WS. `key` is the telemetry field; it maps
351370
// to the M106 fan index P0/P1/P2 (part/case/side — confirmed by capturing Creality
352371
// Print, see PROTOCOL §6.7). Sent as a `gcodeCmd` wrapper running `M106 P<i> S<0-255>`
@@ -1034,6 +1053,14 @@ function renderCreControlCard(p, conn) {
10341053

10351054
const step = conn._ctrlStep ?? 10;
10361055
const pos = creParsePos(d.curPosition);
1056+
// Fans present on this model — open-frame printers expose only the part fan
1057+
// (see CRE_MULTI_FAN_MODEL_IDS). Labelled per key so order stays part/case/side.
1058+
const fanLabels = {
1059+
modelFanPct: ctx.t("creFanPart"),
1060+
caseFanPct: ctx.t("creFanCase"),
1061+
auxiliaryFanPct: ctx.t("creFanSide"),
1062+
};
1063+
const fanKeys = creFanKeysFor(p);
10371064
// One fan row: toggle icon + label + 1%-granular slider + live % readout.
10381065
// Toggle/slider are wired in inventory.js (slider → creActionFan on release).
10391066
const fanRow = (key, label) => {
@@ -1112,12 +1139,11 @@ function renderCreControlCard(p, conn) {
11121139
11131140
</div>
11141141
1115-
<!-- Fans — part cooling, case, side. Live % from the connect snapshot, updated
1116-
optimistically on change. Case + side override the chamber-temp auto control. -->
1142+
<!-- Fans — part cooling always; case + side only on enclosed K-series
1143+
(creFanKeysFor). Live % from the connect snapshot, updated optimistically
1144+
on change. Case + side override the chamber-temp auto control. -->
11171145
<div class="cre-fan-section">
1118-
${fanRow("modelFanPct", ctx.t("creFanPart"))}
1119-
${fanRow("caseFanPct", ctx.t("creFanCase"))}
1120-
${fanRow("auxiliaryFanPct", ctx.t("creFanSide"))}
1146+
${fanKeys.map(key => fanRow(key, fanLabels[key])).join("")}
11211147
</div>
11221148
11231149
</section>`;

0 commit comments

Comments
 (0)