diff --git a/src/components/ProgressMonitor.tsx b/src/components/ProgressMonitor.tsx index a952328..fe210ca 100644 --- a/src/components/ProgressMonitor.tsx +++ b/src/components/ProgressMonitor.tsx @@ -21,6 +21,7 @@ import { canResumeSewing, getStateVisualInfo, } from "../utils/machineStateHelpers"; +import { calculatePatternTime } from "../utils/timeCalculation"; export function ProgressMonitor() { // Machine store @@ -109,6 +110,15 @@ export function ProgressMonitor() { currentStitch >= block.startStitch && currentStitch < block.endStitch, ); + // Calculate time based on color blocks (matches Brother app calculation) + const { totalMinutes, elapsedMinutes } = useMemo(() => { + if (colorBlocks.length === 0) { + return { totalMinutes: 0, elapsedMinutes: 0 }; + } + const result = calculatePatternTime(colorBlocks, currentStitch); + return { totalMinutes: result.totalMinutes, elapsedMinutes: result.elapsedMinutes }; + }, [colorBlocks, currentStitch]); + // Auto-scroll to current block useEffect(() => { if (currentBlockRef.current) { @@ -185,11 +195,10 @@ export function ProgressMonitor() {
- Est. Time + Total Time - {Math.floor(patternInfo.totalTime / 60)}: - {String(patternInfo.totalTime % 60).padStart(2, "0")} + {totalMinutes} min
@@ -225,11 +234,10 @@ export function ProgressMonitor() {
- Time Elapsed + Time - {Math.floor(sewingProgress.currentTime / 60)}: - {String(sewingProgress.currentTime % 60).padStart(2, "0")} + {elapsedMinutes} / {totalMinutes} min
diff --git a/src/utils/timeCalculation.ts b/src/utils/timeCalculation.ts new file mode 100644 index 0000000..e85b8e4 --- /dev/null +++ b/src/utils/timeCalculation.ts @@ -0,0 +1,67 @@ +/** + * Convert stitch count to minutes using Brother PP1 timing formula + * Formula: ((pointCount - 1) * 150 + 3000) / 60000 + * - 150ms per stitch + * - 3000ms startup time + * - Result in minutes (rounded up) + */ +export function convertStitchesToMinutes(stitchCount: number): number { + if (stitchCount <= 1) return 0; + + const timeMs = (stitchCount - 1) * 150 + 3000; + const timeMin = Math.ceil(timeMs / 60000); + + return timeMin < 1 ? 1 : timeMin; +} + +/** + * Calculate total and elapsed time for a pattern based on color blocks + * This matches the Brother app's calculation method + */ +export function calculatePatternTime( + colorBlocks: Array<{ stitchCount: number }>, + currentStitch: number +): { + totalMinutes: number; + elapsedMinutes: number; + remainingMinutes: number; +} { + let totalMinutes = 0; + let elapsedMinutes = 0; + let cumulativeStitches = 0; + + // Calculate time per color block + for (const block of colorBlocks) { + totalMinutes += convertStitchesToMinutes(block.stitchCount); + cumulativeStitches += block.stitchCount; + + if (cumulativeStitches < currentStitch) { + // This entire block is completed + elapsedMinutes += convertStitchesToMinutes(block.stitchCount); + } else if (cumulativeStitches === currentStitch) { + // We just completed this block + elapsedMinutes += convertStitchesToMinutes(block.stitchCount); + break; + } else { + // We're partway through this block + const stitchesInBlock = currentStitch - (cumulativeStitches - block.stitchCount); + elapsedMinutes += convertStitchesToMinutes(stitchesInBlock); + break; + } + } + + return { + totalMinutes, + elapsedMinutes, + remainingMinutes: Math.max(0, totalMinutes - elapsedMinutes), + }; +} + +/** + * Format minutes as MM:SS + */ +export function formatMinutes(minutes: number): string { + const mins = Math.floor(minutes); + const secs = Math.round((minutes - mins) * 60); + return `${mins}:${String(secs).padStart(2, '0')}`; +}