temperatureFanPresets.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. export type PresetTriple = readonly [number, number, number];
  13. export const NOZZLE_TEMP_DEFAULTS: PresetTriple = [120, 220, 260];
  14. export const BED_TEMP_DEFAULTS: PresetTriple = [55, 75, 90];
  15. export const CHAMBER_TEMP_DEFAULTS: PresetTriple = [35, 45, 60];
  16. export const FAN_SPEED_DEFAULTS: PresetTriple = [50, 75, 100];
  17. export interface PresetCategory {
  18. key: 'nozzle_temp_presets' | 'bed_temp_presets' | 'chamber_temp_presets' | 'fan_speed_presets';
  19. defaults: PresetTriple;
  20. lo: number;
  21. hi: number;
  22. unit: 'C' | '%';
  23. }
  24. export const PRESET_CATEGORIES: readonly PresetCategory[] = [
  25. { key: 'nozzle_temp_presets', defaults: NOZZLE_TEMP_DEFAULTS, lo: 0, hi: 320, unit: 'C' },
  26. { key: 'bed_temp_presets', defaults: BED_TEMP_DEFAULTS, lo: 0, hi: 140, unit: 'C' },
  27. { key: 'chamber_temp_presets', defaults: CHAMBER_TEMP_DEFAULTS, lo: 0, hi: 60, unit: 'C' },
  28. { key: 'fan_speed_presets', defaults: FAN_SPEED_DEFAULTS, lo: 0, hi: 100, unit: '%' },
  29. ];
  30. /**
  31. * Parse a JSON triple from settings, falling back to defaults if empty / malformed
  32. * / wrong shape. Forward-compat for any storage drift; backend validators are
  33. * the source of truth.
  34. */
  35. export function parsePresetTriple(
  36. raw: string | undefined | null,
  37. fallback: PresetTriple,
  38. lo: number,
  39. hi: number,
  40. ): [number, number, number] {
  41. if (!raw) return [...fallback];
  42. try {
  43. const parsed = JSON.parse(raw);
  44. if (
  45. Array.isArray(parsed) &&
  46. parsed.length === 3 &&
  47. parsed.every((n) => Number.isInteger(n) && n >= lo && n <= hi)
  48. ) {
  49. return parsed as [number, number, number];
  50. }
  51. } catch {
  52. // fall through to defaults
  53. }
  54. return [...fallback];
  55. }
  56. /** Build the popover options: fixed "Off" button + 3 user-configured presets. */
  57. export function buildPresetOptions(
  58. values: PresetTriple,
  59. unit: 'C' | '%',
  60. ): Array<{ label: string; value: number }> {
  61. return [
  62. { label: 'Off', value: 0 },
  63. ...values.map((v) => ({ label: `${v} ${unit}`, value: v })),
  64. ];
  65. }