The codebase to run the *spark d-fuser controller www.sparkav.co.uk/dvimixer

Dependencies:   SPK-TVOne DMX DmxArtNet NetServicesMin OSC PinDetect mRotaryEncoder iniparser mbed spk_oled_ssd1305 filter

Revision:
72:f521154be01f
Parent:
71:d6d0ff33cf5b
--- a/main.cpp	Mon Jul 29 12:20:16 2013 +0000
+++ b/main.cpp	Mon Jul 29 13:09:27 2013 +0000
@@ -476,128 +476,12 @@
     return ok;
 }   
 
-void actionMixMode(bool reset = false)
-{
-    if (debug) debug->printf("Changing mix mode \r\n");
-
-    bool ok = true;
-    string sentOK;
-    char* sentMSGBuffer = "Blend";
-
-    // Perform unset before set, in case mixMode = mixModeOld
-
-    if (mixModeOld == mixAdditive || reset)
-    {
-        // Turn off Additive Mixing on output
-        if (tvOne.getProcessorType().version == 423)
-        {
-            ok = ok && tvOne.command(0, kTV1WindowIDA, 0x298, 0);
-        }
-    }
-    if (mixMode == mixAdditive) 
-    {   
-        sentMSGBuffer = "Additive";
-    
-        // First set B to what you'd expect for additive; it may be left at 100 if optimised blend mixing was previous mixmode.
-        ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
-        // Then turn on Additive Mixing
-        if (tvOne.getProcessorType().version == 423)
-        {
-            ok = ok && tvOne.command(0, kTV1WindowIDA, 0x298, 1);
-        }
-    }
-
-    if (mixModeOld == mixKeyLeft || reset)
-    {
-        // Turn off Keyer
-        tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
-    }
-    
-    if (mixMode == mixKeyLeft)
-    {
-        sentMSGBuffer = "Key L over R";
-        mixKeyWindow = kTV1WindowIDA;
-        
-        // Turn on Keyer
-        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
-    }
-
-    if (mixModeOld == mixKeyRight || reset)
-    {
-        // Restore window positions
-        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsLayerPriority, 0);
-        
-        // Turn off Keyer
-        tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustKeyerEnable, false); // Checkme: if check for success, returns failure errantly?
-    }    
-    if (mixMode == mixKeyRight)
-    {
-        sentMSGBuffer = "Key R over L";
-        mixKeyWindow = kTV1WindowIDB;
-        
-        // Turn on Keyer
-        ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustKeyerEnable, true);
-        
-        
-        // Set window B above window A
-        ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsLayerPriority, 0);
-    }
-    
-    if (ok) 
-    {
-        mixModeOld = mixMode;
-        sentOK = "Sent: ";
-    }
-    else 
-    {
-        mixMode = mixModeOld;
-        sentOK = "Send Error: ";
-    }
-    
-    tvOneStatusMessage.addMessage(sentOK + sentMSGBuffer, kTVOneStatusMessageHoldTime);
-}
-
-bool checkTVOneMixStatus()
+bool handleTVOneMixStatus()
 {
     bool ok = true;
     
     int32_t payload;
     
-    // Mix Mode
-    bool mixModeNeedsAction = false;
-    bool additiveOn = false, keyLeftOn = false, keyRightOn = false;
-    int  windowAPriority = -1;
-    
-    if (mixMode == mixBlend)    { additiveOn = false; keyLeftOn = false; keyRightOn = false; windowAPriority = 0;}
-    if (mixMode == mixAdditive) { additiveOn = true;  keyLeftOn = false; keyRightOn = false; windowAPriority = 0;}
-    if (mixMode == mixKeyLeft)  { additiveOn = false; keyLeftOn = true;  keyRightOn = false; windowAPriority = 0;}
-    if (mixMode == mixKeyRight) { additiveOn = false; keyLeftOn = false; keyRightOn = true;  windowAPriority = 1;}
-    
-    if (tvOne.getProcessorType().version == 423)
-    {
-        payload = -1;
-        ok = ok && tvOne.readCommand(0, kTV1WindowIDA, 0x298, payload);
-        if (payload != additiveOn) mixModeNeedsAction = true;
-    }
-    
-    payload = -1;
-    ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, payload);
-    if (payload != keyLeftOn) mixModeNeedsAction = true;
-
-    payload = -1;
-    ok = ok && tvOne.readCommand(0, kTV1WindowIDB, kTV1FunctionAdjustKeyerEnable, payload);
-    if (payload != keyRightOn) mixModeNeedsAction = true;
-    
-    payload = -1;
-    ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsLayerPriority, payload);
-    if (payload != windowAPriority) mixModeNeedsAction = true;
-
-    if (ok && mixModeNeedsAction) 
-    {
-        if (debug) debug->printf("Check TVOne Mix Status requiring mixMode action. mixMode: %i \r\n", mixMode);
-        actionMixMode(true);
-    }
-    
     // Check Fade
     payload = -1;
     ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, payload);
@@ -615,6 +499,66 @@
         ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
     }
     
+    // Mix Mode
+    bool mixModeUpdated = false;
+    bool additiveOn = false, keyLeftOn = false, keyRightOn = false;
+    int  windowAPriority = -1;
+    
+    if (mixMode == mixBlend)    { additiveOn = false; keyLeftOn = false; keyRightOn = false; windowAPriority = 0;}
+    if (mixMode == mixAdditive) { additiveOn = true;  keyLeftOn = false; keyRightOn = false; windowAPriority = 0;}
+    if (mixMode == mixKeyLeft)  { additiveOn = false; keyLeftOn = true;  keyRightOn = false; windowAPriority = 0;}
+    if (mixMode == mixKeyRight) { additiveOn = false; keyLeftOn = false; keyRightOn = true;  windowAPriority = 1;}
+    
+    if (tvOne.getProcessorType().version == 423)
+    {
+        payload = -1;
+        ok = ok && tvOne.readCommand(0, kTV1WindowIDA, 0x298, payload);
+        if (payload != additiveOn) 
+        {
+            ok = ok && tvOne.command(0, kTV1WindowIDA, 0x298, additiveOn);
+            mixModeUpdated = true;   
+        }
+    }
+    
+    payload = -1;
+    ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, payload);
+    if (payload != keyLeftOn) 
+    {
+        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, keyLeftOn);
+        mixModeUpdated = true;
+    }
+
+    payload = -1;
+    ok = ok && tvOne.readCommand(0, kTV1WindowIDB, kTV1FunctionAdjustKeyerEnable, payload);
+    if (payload != keyRightOn) 
+    {
+        ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustKeyerEnable, keyRightOn);
+        mixModeUpdated = true;
+    }
+    
+    payload = -1;
+    ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsLayerPriority, payload);
+    if (payload != windowAPriority) 
+    {
+        ok = ok && tvOne.command(0, windowAPriority == 0 ? kTV1WindowIDA : kTV1WindowIDB, kTV1FunctionAdjustWindowsLayerPriority, 0);
+        mixModeUpdated = true;
+    }
+
+    if (mixModeUpdated) 
+    {
+        if (ok) mixModeOld = mixMode;
+            
+        if (debug) debug->printf("Check TVOne Mix Status requiring mixMode action. mixMode: %i \r\n", mixMode);
+        
+        string sentOK = ok ? "Sent: " : "Send error: ";
+        char * mixModeString = "Blend";
+        if (mixMode == mixAdditive) mixModeString = "Additive";
+        if (mixMode == mixKeyLeft)  mixModeString = "Key L over R";
+        if (mixMode == mixKeyRight) mixModeString = "Key R over L";
+        
+        tvOneStatusMessage.addMessage(sentOK + mixModeString, kTVOneStatusMessageHoldTime);
+    }
+    
     return ok;
 }
 
@@ -1421,7 +1365,7 @@
     handleTVOneSources();
     
     // Processor can have been power-on saved with a keyer on, lets revert
-    checkTVOneMixStatus();
+    handleTVOneMixStatus();
     
     // Display menu and framing lines
     screen.horizLineToBuffer(kMenuLine1*pixInPage - 1);
@@ -1551,6 +1495,8 @@
                 {
                     mixMode = mixModeMenuPayload;
                     
+                    if (mixMode == mixKeyLeft) mixKeyWindow = kTV1WindowIDA;
+                    if (mixMode == mixKeyRight) mixKeyWindow = kTV1WindowIDB;
                     if (mixMode == mixModeOld) tvOneStatusMessage.addMessage("Mix mode already active", kTVOneStatusMessageHoldTime);
                 }
                 else
@@ -1915,7 +1861,7 @@
             fadeBPercentHasChanged = newFadeBPercent != fadeBPercent;
         
         // If changing mixMode from additive, we want to do this before updating fade values
-        if (mixMode != mixModeOld && mixModeOld == mixAdditive) actionMixMode();
+        if (mixMode != mixModeOld && mixModeOld == mixAdditive) handleTVOneMixStatus();
         
         // We want to send the higher first, otherwise black flashes can happen on taps
         if (fadeAPercentHasChanged && newFadeAPercent >= newFadeBPercent) 
@@ -1954,7 +1900,7 @@
         }
         
         // If changing mixMode to additive, we want to do this after updating fade values
-        if (mixMode != mixModeOld) actionMixMode();
+        if (mixMode != mixModeOld) handleTVOneMixStatus();
                 
         //// TASK: Process Network Comms Out, ie. send out any fade updates
         if (commsMode == commsOSC && updateFade && !commsInActive)
@@ -1980,7 +1926,7 @@
             handleTVOneSources();
             
             // Lets check on our fade levels
-            checkTVOneMixStatus();
+            handleTVOneMixStatus();
         }
     }
 }
\ No newline at end of file