mirror of
https://github.com/jhbruhn/respira.git
synced 2026-03-14 02:38:41 +00:00
Implemented proper time calculation matching the Brother app algorithm: - 150ms per stitch + 3000ms startup time per color block - Calculate total and elapsed time by summing across color blocks - This fixes the "999 seconds" issue by calculating time accurately Created timeCalculation utility with: - convertStitchesToMinutes: Convert stitches to minutes using PP1 formula - calculatePatternTime: Calculate total/elapsed time per color blocks Updated ProgressMonitor to show: - Total Time (calculated from all color blocks) - Elapsed Time / Total Time (based on current stitch position) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
/**
|
|
* 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')}`;
|
|
}
|