temperatureFanPresets.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /**
  2. * Helpers for the user-configurable temperature / fan-speed presets shown in
  3. * the printer-card popovers and edited under Settings -> Workflow.
  4. *
  5. * Storage shape: JSON string of exactly 3 integers per category. Empty string
  6. * means "use built-in defaults". Validators on the backend (AppSettingsUpdate)
  7. * enforce the same shape on writes; helpers here are defensive parsers.
  8. *
  9. * The "Off" (value 0) button is rendered separately by buildPresetOptions and
  10. * is not part of the configurable triple.
  11. */
  12. import { MAX_CHAMBER_TEMP_C } from './printer';
  13. export type PresetTriple = readonly [number, number, number];
  14. export const NOZZLE_TEMP_DEFAULTS: PresetTriple = [120, 220, 260];
  15. export const BED_TEMP_DEFAULTS: PresetTriple = [55, 75, 90];
  16. export const CHAMBER_TEMP_DEFAULTS: PresetTriple = [35, 45, 60];
  17. export const FAN_SPEED_DEFAULTS: PresetTriple = [50, 75, 100];
  18. export interface PresetCategory {
  19. key: 'nozzle_temp_presets' | 'bed_temp_presets' | 'chamber_temp_presets' | 'fan_speed_presets';
  20. defaults: PresetTriple;
  21. lo: number;
  22. hi: number;
  23. unit: 'C' | '%';
  24. }
  25. export const PRESET_CATEGORIES: readonly PresetCategory[] = [
  26. { key: 'nozzle_temp_presets', defaults: NOZZLE_TEMP_DEFAULTS, lo: 0, hi: 320, unit: 'C' },
  27. { key: 'bed_temp_presets', defaults: BED_TEMP_DEFAULTS, lo: 0, hi: 140, unit: 'C' },
  28. { key: 'chamber_temp_presets', defaults: CHAMBER_TEMP_DEFAULTS, lo: 0, hi: MAX_CHAMBER_TEMP_C, unit: 'C' },
  29. { key: 'fan_speed_presets', defaults: FAN_SPEED_DEFAULTS, lo: 0, hi: 100, unit: '%' },
  30. ];
  31. /**
  32. * Parse a JSON triple from settings, falling back to defaults if empty / malformed
  33. * / wrong shape. Forward-compat for any storage drift; backend validators are
  34. * the source of truth.
  35. */
  36. export function parsePresetTriple(
  37. raw: string | undefined | null,
  38. fallback: PresetTriple,
  39. lo: number,
  40. hi: number,
  41. ): [number, number, number] {
  42. if (!raw) return [...fallback];
  43. try {
  44. const parsed = JSON.parse(raw);
  45. if (
  46. Array.isArray(parsed) &&
  47. parsed.length === 3 &&
  48. parsed.every((n) => Number.isInteger(n) && n >= lo && n <= hi)
  49. ) {
  50. return parsed as [number, number, number];
  51. }
  52. } catch {
  53. // fall through to defaults
  54. }
  55. return [...fallback];
  56. }
  57. /** Build the popover options: fixed "Off" button + 3 user-configured presets. */
  58. export function buildPresetOptions(
  59. values: PresetTriple,
  60. unit: 'C' | '%',
  61. ): Array<{ label: string; value: number }> {
  62. return [
  63. { label: 'Off', value: 0 },
  64. ...values.map((v) => ({ label: `${v} ${unit}`, value: v })),
  65. ];
  66. }