diff --git a/script.js b/script.js index 58a1c93..a6beadb 100644 --- a/script.js +++ b/script.js @@ -216,35 +216,89 @@ resetBtn.addEventListener('click', (e) => { preset2WheelBtn.addEventListener('click', () => { const positions = PresetConfigs.twoWheel(robotSize); robot.setModules(positions); + createModuleDisplays(robot.modules); + updateModuleDisplays(robot.modules); }); preset3WheelBtn.addEventListener('click', () => { const positions = PresetConfigs.threeWheel(robotSize); robot.setModules(positions); + createModuleDisplays(robot.modules); + updateModuleDisplays(robot.modules); }); preset4WheelBtn.addEventListener('click', () => { const positions = PresetConfigs.fourWheelSquare(robotSize); robot.setModules(positions); + createModuleDisplays(robot.modules); + updateModuleDisplays(robot.modules); }); preset4RectBtn.addEventListener('click', () => { const positions = PresetConfigs.fourWheelRectangle(robotSize); robot.setModules(positions); + createModuleDisplays(robot.modules); + updateModuleDisplays(robot.modules); }); preset6WheelBtn.addEventListener('click', () => { const positions = PresetConfigs.sixWheel(robotSize); robot.setModules(positions); + createModuleDisplays(robot.modules); + updateModuleDisplays(robot.modules); }); preset8WheelBtn.addEventListener('click', () => { const positions = PresetConfigs.eightWheel(robotSize); robot.setModules(positions); + createModuleDisplays(robot.modules); + updateModuleDisplays(robot.modules); }); /* * END LISTENER CODE +* BEGIN DYNAMIC DOM FUNCTIONS +*/ + +function createModuleDisplays(modules) { + const grid = document.getElementById('module-grid'); + grid.innerHTML = ''; // Delete any pre-existing elements before creating new ones + + modules.forEach((module, i) => { + const article = document.createElement('article'); + article.className = 'module-display'; + const name = module.name; + + article.innerHTML = ` +

${name}

+
+ Angle: + 0.0° +
+
+ Speed: + 0.00 pixels/s +
+ `; + grid.appendChild(article); + }); +} + +function updateModuleDisplays(modules) { + modules.forEach((module, i) => { + const angleElement = document.getElementById(`module-${i}-angle`); + const speedElement = document.getElementById(`module-${i}-speed`); + + if (angleElement && speedElement) { + const angleDeg = (module.angle * 180 / Math.PI).toFixed(1); + angleElement.textContent = `${angleDeg}°`; + speedElement.textContent = `${module.speed.toFixed(2)} pixels/s`; + } + }); +} + +/* +* END DYNAMIC DOM FUNCTIONS * BEGIN ANIMATION CODE */ @@ -346,7 +400,9 @@ function drawRobot(ctx, robot) { // Initialize Variables const robotSize = 200; -const robot = new SwerveDrive(PresetConfigs.fourWheelSquare(robotSize)); +const defaultModulePositions = PresetConfigs.fourWheelSquare(robotSize); +const robot = new SwerveDrive(defaultModulePositions); +createModuleDisplays(defaultModulePositions); let xSpeed = 0; let ySpeed = 0; let turnSpeed = -1; @@ -382,13 +438,15 @@ function animate() { xGridOffset = (xGridOffset + (worldVx / offsetSpeedDivisor)) % gridSquareSize; yGridOffset = (yGridOffset + (worldVy / offsetSpeedDivisor)) % gridSquareSize; + // Update module states before drawing the robot + robot.drive(xSpeed, ySpeed, turnSpeed, parseFloat(maxSpeedSlider.value)); + updateModuleDisplays(robot.modules); + // Draw the robot and it's movement. Grid should be oversized so movement // doesn't find the edge of the grid drawGrid(ctx, canvas.width * 2, gridSquareSize, xGridOffset, yGridOffset, robotRotation); drawRobot(ctx, robot); - robot.drive(xSpeed, ySpeed, turnSpeed, parseFloat(maxSpeedSlider.value)); - // Do it all over again ctx.restore(); requestAnimationFrame(animate); diff --git a/styles.css b/styles.css index cdecc50..7dc76de 100644 --- a/styles.css +++ b/styles.css @@ -296,4 +296,29 @@ button:hover { border-color: var(--accent-blue); transform: translateY(-2px); box-shadow: var(--shadow); +} + +/* Module States Grid */ +.module-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: var(--spacing-small); + margin-top: var(--spacing-small); +} + +.module-card { + background-color: var(--background-dark); + border: 2px solid var(--border-color); + border-radius: var(--border-radius-sm); + padding: var(--spacing-small); + transition: all 0.3s ease; +} + +.config-info { + background-color: var(--background-dark); + border: 1px solid var(--border-color); + border-radius: var(--border-radius-sm); + padding: var(--spacing-small); + margin-bottom: var(--spacing-small); + color: var(--text-secondary); } \ No newline at end of file