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
-
User sets pedal to AUTO mode
- Pedal timers start alternating
isPedalAutoMode = true
-
Pedal timer triggers state change
pedalState = 0(ON) orpedalState = 1(OFF)
-
Main monitoring loop processes state
- Directly controls fountain motor based on pedal state
- Updates UI immediately
- Sends hardware commands
-
Fountain responds immediately
- ON: Chocolate flows
- OFF: Chocolate stops
- No delays or intermediate states
-
Cycle repeats based on timing settings
- OFF for configured duration
- ON for configured duration
🛡️ Safety Features
- Manual Override: User can always take manual control
- Timer Cleanup: Pedal timers are properly stopped when needed
- State Reset: Pedal auto mode is reset when starting/stopping recipes
- No Conflicts: Other fountain control mechanisms are disabled during pedal auto mode
- 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
- Set pedal to AUTO mode
- Configure timing (e.g., 2s ON, 1 unit OFF)
- Expected: Fountain alternates cleanly between ON/OFF states
Scenario 2: Manual Override
- While in auto mode, click fountain button
- Expected: Auto mode stops, user gains manual control
Scenario 3: Recipe Integration
- Start recipe with pedal in AUTO mode
- Complete all phases
- Expected: Fountain follows pedal timing throughout
Scenario 4: Visual Feedback
- Observe fountain button during auto operation
- 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 durationpedalOffTimer: Controls OFF duration- Timers are properly disposed when not needed
State Variables
isPedalAutoMode: Main flag indicating pedal auto mode is activepedalState: 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