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

8.4 KiB

Pedal-Based Fountain Control Implementation

Overview

This implementation replaces the previous automatic fountain control with a direct pedal-based control system. When the pedal is in AUTO mode, the chocolate fountain directly follows the pedal state - ON when pedal is active, OFF when pedal is inactive.

Expected Behavior

When pedal is in AUTO mode:

  • Pedal ON (pedalState = 0) → Chocolate ON (fountain flows)
  • Pedal OFF (pedalState = 1) → Chocolate OFF (fountain stops)
  • No blinking/flashing of the Chocolate button
  • Clean alternating ON/OFF based on pedal timing settings

🔧 Implementation Details

1. Direct Fountain Control Logic

Located in the main monitoring loop (pedalMotor == 1 section):

else if (pedalMotor == 1) // auto Pedal
{
    // Set auto mode flag
    isPedalAutoMode = true;
    
    // Direct fountain control based on pedal state
    var fount = _mapping.Find(x => x.Name.ToLower() == "Helix".ToLower());
    if (fount != null && fount.BitNumbers.Count > 0)
    {
        if (pedalState == 0) // Pedal ON - Turn fountain ON
        {
            foreach (var bit in fount.BitNumbers)
            {
                holdingRegister.motor |= (ushort)(1 << bit); // Set the motor bit ON
            }
            isFountainMotorOn = true;
            startFountainMotor = 1;
            sendComFountainMotor = 1;
            startFountainMotorFlashing = -1; // No flashing
            // ... UI updates and hardware commands
        }
        else if (pedalState == 1) // Pedal OFF - Turn fountain OFF
        {
            foreach (var bit in fount.BitNumbers)
            {
                holdingRegister.motor &= (ushort)~(1 << bit); // Clear the motor bit OFF
            }
            isFountainMotorOn = false;
            startFountainMotor = 0;
            sendComFountainMotor = 0;
            startFountainMotorFlashing = -1; // No flashing
            // ... UI updates and hardware commands
        }
    }
    
    // Handle pedal timing (alternating ON/OFF based on recipe settings)
    // ... timer management logic
}

2. Pedal Timing Configuration

From the UI, users can configure:

  • PEDAL OFF TIME: Duration fountain stays OFF (e.g., 1 unit)
  • PEDAL ON TIME: Duration fountain stays ON (e.g., 2 seconds)

The system automatically alternates between these states using timers.

3. UI Feedback

Chocolate Button State

  • ON: Shows "ON" with active color (magenta underline)
  • OFF: Shows "OFF" with passive color (gray)
  • No flashing/blinking during automatic operation

Temperature Display

When fountain is ON, the UI also shows:

  • Current Temp: [actual temperature]
  • Target Temp: [target temperature]

4. Manual Override

When user manually clicks the fountain button:

  • Resets pedal auto mode (isPedalAutoMode = false)
  • Stops all pedal timers
  • Switches to manual mode (pedalMotor = -1)
  • User gains full manual control

5. Protection Logic

Fountain Control Protection

Normal fountain control logic is disabled when pedal auto mode is active:

// Temperature-based control (disabled in pedal auto mode)
if (checkFountainTMT_PMT && !isPedalAutoMode)

// Manual control (disabled in pedal auto mode)  
if (!checkFountainTMT_PMT && !isPedalAutoMode)

// Flashing processing (disabled in pedal auto mode)
if (startFountainMotorFlashing == 1 && !isPedalAutoMode)

UI Flashing Protection

The InteractiveUILoop prevents button flashing in pedal auto mode:

// Only flash when not in pedal auto mode
if (_mainWindow.startFountainMotorFlashing == 1 && !_mainWindow.isPedalAutoMode)

🔄 Control Flow

  1. User sets pedal to AUTO mode

    • Pedal timers start alternating
    • isPedalAutoMode = true
  2. Pedal timer triggers state change

    • pedalState = 0 (ON) or pedalState = 1 (OFF)
  3. Main monitoring loop processes state

    • Directly controls fountain motor based on pedal state
    • Updates UI immediately
    • Sends hardware commands
  4. Fountain responds immediately

    • ON: Chocolate flows
    • OFF: Chocolate stops
    • No delays or intermediate states
  5. Cycle repeats based on timing settings

    • OFF for configured duration
    • ON for configured duration

🛡️ Safety Features

  1. Manual Override: User can always take manual control
  2. Timer Cleanup: Pedal timers are properly stopped when needed
  3. State Reset: Pedal auto mode is reset when starting/stopping recipes
  4. No Conflicts: Other fountain control mechanisms are disabled during pedal auto mode
  5. Immediate Response: No delays or buffering - fountain responds instantly to pedal state

🚫 Previous Logic Removed

The following complex logic was removed and replaced with direct control:

  • Temperature threshold-based fountain control in pedal auto mode
  • Automatic fountain control based on second control box
  • Complex state management with multiple flags
  • Delayed or conditional fountain control
  • Multiple control mechanisms that could conflict

📱 User Interface

Settings Panel

Shows current pedal configuration:

  • PEDAL: AUTO/MANUAL toggle button
  • PEDAL OFF TIME: Adjustable duration (e.g., 1 unit)
  • PEDAL ON TIME: Adjustable duration (e.g., 2 seconds)

Fountain Button

  • Steady state display (ON/OFF)
  • Color coding: Active (magenta) / Passive (gray)
  • No blinking/flashing during automatic operation
  • Click to override and take manual control

🧪 Testing Scenarios

Scenario 1: Basic Auto Mode Operation

  1. Set pedal to AUTO mode
  2. Configure timing (e.g., 2s ON, 1 unit OFF)
  3. Expected: Fountain alternates cleanly between ON/OFF states

Scenario 2: Manual Override

  1. While in auto mode, click fountain button
  2. Expected: Auto mode stops, user gains manual control

Scenario 3: Recipe Integration

  1. Start recipe with pedal in AUTO mode
  2. Complete all phases
  3. Expected: Fountain follows pedal timing throughout

Scenario 4: Visual Feedback

  1. Observe fountain button during auto operation
  2. Expected: Clean ON/OFF display without blinking

📋 Configuration

Pedal Timing Settings

  • Configured through Settings UI
  • PEDAL OFF TIME: How long fountain stays OFF
  • PEDAL ON TIME: How long fountain stays ON
  • Values are saved in recipe table

Control Mode

  • AUTO: Fountain follows pedal timing automatically
  • MANUAL: User controls fountain manually via button clicks

🔧 Key Improvements

Simplified Logic

  • Direct control: Pedal state directly controls fountain
  • No intermediate states or complex decision trees
  • Immediate response with no delays

User Experience

  • Predictable behavior: ON when pedal ON, OFF when pedal OFF
  • Visual clarity: Clean state display without blinking
  • Easy override: Click fountain button to take manual control

Reliability

  • No conflicts: Other control mechanisms properly disabled
  • Clean state management: Single source of truth for pedal auto mode
  • Proper cleanup: Timers and states reset when needed

Performance

  • Efficient processing: Minimal logic overhead
  • Instant response: No waiting or buffering
  • Resource management: Proper timer lifecycle management

📝 Technical Notes

Timer Management

  • pedalOnTimer: Controls ON duration
  • pedalOffTimer: Controls OFF duration
  • Timers are properly disposed when not needed

State Variables

  • isPedalAutoMode: Main flag indicating pedal auto mode is active
  • pedalState: Current pedal state (0=ON, 1=OFF, -1=reset)
  • pedalMotor: Pedal mode (1=AUTO, -1=MANUAL)

Hardware Control

  • Direct bit manipulation of holdingRegister.motor
  • Immediate serial communication with hardware
  • Synchronized UI updates

Requirements Fulfilled

Direct pedal control: Fountain follows pedal state exactly
Timing-based operation: Uses configured ON/OFF durations
No blinking: Clean visual feedback without flashing
Manual override: User can always take control
Proper integration: Works with existing recipe system
Clean UI: Professional appearance without distractions
Reliable operation: No conflicts or unexpected behavior