Wave 2 Beta Release

 Wave 2 Beta Release: New Logic Gates, Improved UX, and Major Enhancements! 

---

## **🆕 New Features**
### **1️⃣ Additional Logic Gates**
#### **🔲 NAND Gate**
- **Fully functional NAND logic** implemented.
- **Truth Table**:
  | **Input A** | **Input B** | **Output (A NAND B)** |
  |-------------|-------------|-----------------------|
  | 0           | 0           | **1** (ON)            |
  | 0           | 1           | **1** (ON)            |
  | 1           | 0           | **1** (ON)            |
  | 1           | 1           | **0** (OFF)           |
- **Toggle buttons** for Input 1 and Input 2 work as expected.
- Lightbulb updates correctly to match the logic output.

#### **🔲 NOR Gate**
- **Fully functional NOR logic** implemented.
- **Truth Table**:
  | **Input A** | **Input B** | **Output (A NOR B)** |
  |-------------|-------------|----------------------|
  | 0           | 0           | **1** (ON)           |
  | 0           | 1           | **0** (OFF)          |
  | 1           | 0           | **0** (OFF)          |
  | 1           | 1           | **0** (OFF)          |
- Lightbulb updates correctly to match the logic output.
- Toggle buttons for Input 1 and Input 2 work as expected.

#### **🔲 XOR Gate**
- **Fully functional XOR logic** implemented.
- **Truth Table**:
  | **Input A** | **Input B** | **Output (A XOR B)** |
  |-------------|-------------|----------------------|
  | 0           | 0           | **0** (OFF)          |
  | 0           | 1           | **1** (ON)           |
  | 1           | 0           | **1** (ON)           |
  | 1           | 1           | **0** (OFF)          |
- Toggle buttons for Input 1 and Input 2 trigger the logic updates.
- Lightbulb behavior reflects the XOR output logic.

#### **🔲 XNOR Gate**
- **Fully functional XNOR logic** implemented.
- **Truth Table**:
  | **Input A** | **Input B** | **Output (A XNOR B)** |
  |-------------|-------------|-----------------------|
  | 0           | 0           | **1** (ON)            |
  | 0           | 1           | **0** (OFF)           |
  | 1           | 0           | **0** (OFF)           |
  | 1           | 1           | **1** (ON)            |
- Lightbulb updates correctly based on the logic.
- Input toggle buttons work correctly for Input 1 and Input 2.

---

## **🛠️ Enhancements & Improvements**
- **Input Handling**:
  - **Input toggles** now work consistently across all logic gate types (AND, OR, NOT, XOR, NOR, NAND, XNOR).
  - Input logic is consistent across all gate types, including the lightbulb status updates.

- **Reset Functionality**:
  - The **reset button** now works across all logic gates.
  - The lightbulb and toggle button status are properly reset.

- **Code Refactoring**:
  - Reduced **redundancy** in the toggle input functions.
  - Enhanced **code readability** and maintainability.
  - Removed unnecessary logic duplications and consolidated shared logic for gate input handling.

---

## **🐛 Bug Fixes**
- **Fixed NAND Gate logic** — lightbulb now correctly updates according to the truth table.
- **Fixed XNOR Gate logic** — logic now correctly handles the logic for matching inputs.
- **Fixed Reset Functionality** — lightbulbs and buttons now reset correctly across all gate types.
- **General Bug Fixes** — Minor improvements in input toggle functions for better user experience.

---

## **📁 Files Changed**
📄 logicGates.js 📄 logicGates.html

---

## **🚀 Release Notes**
This release marks the **Wave 2 Beta** of the CS:Box project, bringing support for all fundamental logic gates. This wave includes the **NAND, NOR, XOR, and XNOR gates**, which have been built with consistent logic, responsive lightbulb behavior, and proper input handling. This release also introduces major fixes to the **reset functionality**, ensuring that all gates reset properly when the reset button is pressed.

**New Features Include:**
- Full support for **NAND, NOR, XOR, XNOR logic gates**.
- Input toggle buttons now work seamlessly for all gates.
- Lightbulb status updates in real-time according to input changes.
- **Reset button** now clears all input states and correctly resets the lightbulb status for each gate type.

**Looking Ahead**:
- Further UI improvements to make the interface more user-friendly.
- Expanded testing to ensure accurate logic across all devices.

Enjoy this latest version of CS:Box! 🚀
This commit is contained in:
2024-12-07 23:46:18 +00:00
parent a247bc036e
commit d4441afd55
18 changed files with 1180 additions and 188 deletions

View File

@@ -1,77 +1,105 @@
let notValue = true;
let andValue = false;
let orValue = false;
let input1 = false;
let input2 = false;
let inputs = {
input1: false,
input2: false
};
const pageHeading = document.getElementById("pageHeading")?.textContent || "";
let gateValue = false;
// **Toggle any gate input (e.g., input1, input2, or NOT gate)**
function toggleGate(gateType) {
const gateKey = gateType === 'NOT' ? 'NotGate' : `Input${gateType}`;
const gateSwitch = document.getElementById(`swt${gateKey}`);
const isActive = gateType === '1' ? input1 : gateType === '2' ? input2 : notValue;
const newValue = !isActive;
if (gateType === '1') input1 = newValue;
if (gateType === '2') input2 = newValue;
if (gateType === 'NOT') notValue = newValue;
gateSwitch?.classList.toggle('btnActive', newValue);
updateGates();
// ** Toggle input (handles both input1 and input2) **
function toggleInput(inputNumber) {
const inputKey = `input${inputNumber}`;
inputs[inputKey] = !inputs[inputKey];
updateInputState(`swtInput${inputNumber}`, inputs[inputKey]);
updateGate();
}
// **Update AND, OR, and NOT gates based on the current input state**
function updateGates() {
if (pageHeading === "AND Gate") updateGate('AndGate', input1 && input2);
if (pageHeading === "OR Gate") updateGate('OrGate', input1 || input2);
if (pageHeading === "NOT Gate") updateGate('NotGate', !notValue);
// ** Update the gate's state based on the current inputs and gate type **
function updateGate() {
const pageHeading = document.getElementById("pageHeading").textContent;
gateValue = evaluateGate(pageHeading);
updateGateLight(pageHeading, gateValue);
}
// **Toggle the output bulb for a gate (e.g., AndGate, OrGate, or NotGate)**
function updateGate(gateName, isActive) {
const bulb = document.getElementById(`blb${gateName}`);
if (!bulb) return;
// ** Evaluate the gate logic **
function evaluateGate(pageHeading) {
const { input1, input2 } = inputs;
bulb.classList.toggle('poweredOn', isActive);
bulb.classList.toggle('poweredOff', !isActive);
if (gateName === 'AndGate') andValue = isActive;
if (gateName === 'OrGate') orValue = isActive;
switch (pageHeading) {
case "AND Gate":
return input1 && input2;
case "OR Gate":
return input1 || input2;
case "NOT Gate":
return !input1; // NOT gate only uses Input1
case "NAND Gate":
return !(input1 && input2); // Correct NAND logic
case "NOR Gate":
return !(input1 || input2);
case "XOR Gate":
return input1 !== input2; // XOR is true if inputs are different
case "XNOR Gate":
return input1 === input2; // XNOR is true if inputs are the same
default:
console.error("Unknown Gate Type");
return false;
}
}
// **Reset the gate to its default state**
// ** Update the lightbulb based on the gate's value **
function updateGateLight(pageHeading, value) {
const lightBulbId = getLightBulbId(pageHeading);
const lightBulb = document.getElementById(lightBulbId);
if (lightBulb) {
lightBulb.classList.toggle("poweredOn", value);
lightBulb.classList.toggle("poweredOff", !value);
}
}
// ** Get the correct lightbulb ID based on the gate type **
function getLightBulbId(pageHeading) {
switch (pageHeading) {
case "AND Gate":
return "blbAndGate";
case "OR Gate":
return "blbOrGate";
case "NOT Gate":
return "blbNotGate";
case "NAND Gate":
return "blbNandGate";
case "NOR Gate":
return "blbNorGate";
case "XOR Gate":
return "blbXorGate";
case "XNOR Gate":
return "blbXnorGate";
default:
console.error("Unknown Gate Type");
return null;
}
}
// ** Update the toggle switch to reflect its active/inactive state **
function updateInputState(switchId, isActive) {
const toggleSwitch = document.getElementById(switchId);
if (toggleSwitch) {
toggleSwitch.classList.toggle("btnActive", isActive);
}
}
// ** Reset the gate to its default state **
function resetGate() {
if (pageHeading === "AND Gate" || pageHeading === "OR Gate") {
resetInput('1');
resetInput('2');
} else if (pageHeading === "NOT Gate") {
resetNotGate();
}
updateGates();
}
inputs.input1 = false;
inputs.input2 = false;
updateInputState("swtInput1", inputs.input1);
updateInputState("swtInput2", inputs.input2);
// **Reset the inputs for Input1 or Input2**
function resetInput(inputNumber) {
if (inputNumber === '1') input1 = false;
if (inputNumber === '2') input2 = false;
const pageHeading = document.getElementById("pageHeading").textContent;
const switchElement = document.getElementById(`swtInput${inputNumber}`);
if (switchElement) switchElement.classList.remove('btnActive');
}
// **Reset the NOT gate to its default state**
function resetNotGate() {
notValue = false; // NOT Gate logic is inverted, so this is "off" input
const bulb = document.getElementById("blbNotGate");
const switchElement = document.getElementById("swtNotGate");
if (bulb) {
bulb.classList.add('poweredOn'); // Light should be on
bulb.classList.remove('poweredOff');
}
if (switchElement) {
switchElement.classList.remove('btnActive'); // Button should be off (inactive)
if (pageHeading === "NOT Gate") {
// For NOT Gate, the light should be on by default
gateValue = true;
updateGateLight(pageHeading, gateValue);
} else {
updateGate();
}
}