Files
Tempering-Machine-Control-S…/DaireApplication/Automatic_Fountain_Control_Implementation.md

10 KiB

Automatic Fountain Control Implementation

Overview

This implementation adds automatic fountain control functionality that triggers after the pouring phase completes when the pedal is in Auto mode. The fountain state is determined by the second control box (RecipeTable.Fountain property).

Expected Behavior

  • After pouring phase completion and pedal mode set to Auto:
    • If the second control box is checked/enabled → Fountain should open
    • If the second control box is unchecked/disabled → Fountain should remain closed
  • No blinking/flashing of the Chocolate button after automatic control is established

🔧 Implementation Details

1. New Properties Added

public bool isAutomaticFountainControlActive { get; set; } = false;

This flag prevents interference between automatic fountain control and normal temperature-based fountain control.

2. New Methods Added

HandleAutomaticFountainControlAfterPouring(Settings settings)

  • Purpose: Main orchestrator for automatic fountain control
  • Trigger: Called when pouring phase completes
  • Logic:
    • Checks if pedal is in Auto mode (!settings._recipeTable.Pedal.Value)
    • Reads second control box state (settings._recipeTable.Fountain.Value)
    • Calls appropriate fountain control method

TurnOnFountainAutomatically()

  • Purpose: Automatically turns ON the fountain motor
  • Actions:
    • Sets fountain motor state variables
    • Sends hardware command to turn ON fountain motor
    • Updates UI to show fountain is ON
    • Logs the action for debugging

TurnOffFountainAutomatically()

  • Purpose: Automatically turns OFF the fountain motor
  • Actions:
    • Sets fountain motor state variables
    • Sends hardware command to turn OFF fountain motor
    • Updates UI to show fountain is OFF
    • Logs the action for debugging

ResetAutomaticFountainControl()

  • Purpose: Resets the automatic control flag
  • Usage: Called when manual control is needed or recipe is reset

3. Integration Points

Pouring Phase Completion

Modified PouringTimer method to call automatic fountain control:

// Handle automatic fountain control after pouring phase completion
await HandleAutomaticFountainControlAfterPouring(result);

Fountain Control Logic Protection

Modified main fountain control logic to respect automatic control:

//Fountain Motor - Normal temperature-based control
if (checkFountainTMT_PMT && !isAutomaticFountainControlActive)
{
    // Normal temperature-based fountain control
}

//Fountain Motor - Manual control (when not in automatic mode)
if (!checkFountainTMT_PMT && !isAutomaticFountainControlActive)
{
    // Manual fountain control
}

Automatic Fountain Control Processing

Added dedicated section for automatic fountain control in main monitoring loop:

//Fountain Motor - Automatic control (when automatic control is active)
if (isAutomaticFountainControlActive)
{
    // Handle automatic fountain control state changes
    if (startFountainMotorFlashing == 0 && sendComFountainMotor == 1 && errors.Count == 0 && !isPaused)
    {
        // Turn ON fountain motor
        // Send hardware command
        // Update UI
    }
    else if (startFountainMotorFlashing == 1 && sendComFountainMotor == 0)
    {
        // Turn OFF fountain motor
        // Send hardware command
        // Update UI
    }
}

Manual Override

Modified FountainClick method to reset automatic control when user manually controls fountain:

// Reset automatic fountain control flag when user manually controls fountain
if (isAutomaticFountainControlActive)
{
    ResetAutomaticFountainControl();
}

Recipe Lifecycle Management

  • Recipe Start: Resets automatic control flag
  • Recipe Stop: Resets automatic control flag

🔄 Control Flow

  1. Recipe Execution: Normal recipe phases (heating → cooling → pouring)
  2. Pouring Phase Completion:
    • Recipe timer completes
    • Pedal control is set based on recipe settings
    • NEW: Automatic fountain control is triggered
  3. Automatic Fountain Control:
    • Checks pedal mode (must be Auto)
    • Checks second control box state
    • Sets fountain state accordingly
    • Sends hardware commands to control fountain motor
    • Sets flag to prevent interference
  4. Hardware Control: Main monitoring loop processes automatic control commands
  5. Manual Override: User can manually control fountain, which resets automatic control

🛡️ Safety Features

  1. Flag Protection: Automatic control flag prevents conflicts with normal fountain control
  2. Manual Override: Users can always take manual control
  3. Recipe Reset: Automatic control is reset when starting/stopping recipes
  4. Error Handling: Comprehensive try-catch blocks with logging
  5. UI Updates: Visual feedback shows fountain state changes
  6. Hardware Commands: Direct hardware control ensures fountain state changes are executed

🚫 Blinking Prevention

Issue Fixed

The "Chocolate" button was blinking/toggling after pouring phase completion due to conflicting fountain control mechanisms.

Solution Implemented

1. Flashing Flag Protection

Modified automatic fountain control to set startFountainMotorFlashing = -1 instead of 1:

// In TurnOffFountainAutomatically()
startFountainMotorFlashing = -1; // Prevent flashing in automatic mode

2. InteractiveUILoop Protection

Added automatic control check to prevent flashing in UI loop:

// In InteractiveUILoop.cs
if (_mainWindow.startFountainMotorFlashing == 1 && !_mainWindow.isAutomaticFountainControlActive)
{
    // Only flash when not in automatic control mode
}

3. Temperature-Based Control Protection

Added automatic control checks to prevent normal fountain control from interfering:

// Prevent normal fountain control from setting flashing when automatic control is active
if (!isAutomaticFountainControlActive)
{
    startFountainMotorFlashing = 1;
}

4. Flashing Processing Protection

Added automatic control check to flashing processing logic:

if (startFountainMotorFlashing == 1 && !isAutomaticFountainControlActive)
{
    // Only process flashing when not in automatic control mode
}

Result

  • No more blinking of the Chocolate button after automatic control is established
  • Steady state maintained based on second control box value
  • Clean visual feedback without distracting flashing animations

📝 Debugging

The implementation includes debug logging for:

  • Automatic fountain control activation
  • Fountain state changes (ON/OFF)
  • Hardware command execution
  • Flag resets
  • Error conditions

🧪 Testing Scenarios

Scenario 1: Second Box Checked, Auto Mode

  1. Start recipe with second control box enabled
  2. Complete pouring phase
  3. Expected: Fountain turns ON automatically and chocolate flows (no blinking)

Scenario 2: Second Box Unchecked, Auto Mode

  1. Start recipe with second control box disabled
  2. Complete pouring phase
  3. Expected: Fountain remains OFF and chocolate flow stops (no blinking)

Scenario 3: Manual Mode

  1. Start recipe in manual pedal mode
  2. Complete pouring phase
  3. Expected: No automatic fountain control (manual control only)

Scenario 4: Manual Override

  1. Complete recipe with automatic fountain control active
  2. Manually click fountain button
  3. Expected: Automatic control is reset, manual control takes over

Scenario 5: No Blinking Verification

  1. Complete recipe with automatic fountain control
  2. Expected: Chocolate button remains steady (ON or OFF) without blinking

🔧 Configuration

The second control box is configured through the RecipeTable.Fountain property:

  • true = Fountain should be ON after pouring
  • false = Fountain should be OFF after pouring

🔧 Key Fixes Applied

Issue: Fountain State Not Changing

Problem: Automatic control was setting state variables but not sending hardware commands.

Solution:

  1. Direct Hardware Control: Modified TurnOnFountainAutomatically() and TurnOffFountainAutomatically() to send actual hardware commands
  2. Dedicated Processing: Added automatic fountain control section in main monitoring loop
  3. State Synchronization: Ensured UI updates and hardware commands are synchronized

Issue: Chocolate Button Blinking

Problem: The Chocolate button was blinking/toggling after pouring phase completion.

Solution:

  1. Flashing Flag Control: Set startFountainMotorFlashing = -1 in automatic control to prevent flashing
  2. UI Loop Protection: Added automatic control check to InteractiveUILoop
  3. Temperature Control Protection: Prevented normal fountain control from interfering
  4. Flashing Processing Protection: Added automatic control check to flashing processing logic

Hardware Command Implementation

// Turn ON fountain motor
var fount = _mapping.Find(x => x.Name.ToLower() == "Helix".ToLower());
if (fount != null && fount.BitNumbers.Count > 0)
{
    foreach (var bit in fount.BitNumbers)
    {
        holdingRegister.motor |= (ushort)(1 << bit);
    }
    await WriteToSerialAsync("Automatic Fountain On");
}

// Turn OFF fountain motor
var fount = _mapping.Find(x => x.Name.ToLower() == "Helix".ToLower());
if (fount != null && fount.BitNumbers.Count > 0)
{
    foreach (var bit in fount.BitNumbers)
    {
        holdingRegister.motor &= (ushort)~(1 << bit);
    }
    await WriteToSerialAsync("Automatic Fountain Off");
}

📋 Requirements Met

Automatic triggering after pouring phase completion
Pedal mode detection (Auto mode only)
Second control box integration (RecipeTable.Fountain)
Dynamic fountain control (open/close based on box state)
Hardware command execution (actual fountain motor control)
No interference with existing fountain control logic
Manual override capability
Proper error handling and logging
UI feedback for fountain state changes
Chocolate flow control (stops/starts based on fountain state)
No blinking/flashing of Chocolate button after automatic control
Steady state maintenance based on second control box value