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

Files at this revision

API Documentation at this revision

Comitter:
tobyspark
Date:
Fri Jul 26 12:46:58 2013 +0000
Parent:
60:13bc754cb76f
Child:
62:523de36d2f88
Commit message:
Mix Mode Menu UX + Keying redux. ; ; Saving back to .ini hasn't worked out, so having active key settings saved in processor and read back in on load. Presets from ini now "activate" their values.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
spk_settings.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Jun 25 02:10:38 2013 +0000
+++ b/main.cpp	Fri Jul 26 12:46:58 2013 +0000
@@ -218,9 +218,6 @@
 float oldFadeUp = 0;
 bool  commsInActive = false;
 
-// Key mode parameters
-int keyerParamsSet = -1; // last keyParams index uploaded to unit 
-
 // TVOne input sources stable flag
 bool tvOneRGB1Stable = false;
 bool tvOneRGB2Stable = false;
@@ -482,32 +479,6 @@
     return ok;
 }   
 
-bool setKeyParamsTo(int index) 
-{   
-    // Only spend the time uploading six parameters if we need to
-    // Might want to bounds check here
-    
-    bool ok;
-    
-    if (index != keyerParamsSet)
-    {
-        ok =       tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, settings.keyerParamSet(index)[SPKSettings::minY]); 
-        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, settings.keyerParamSet(index)[SPKSettings::maxY]); 
-        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, settings.keyerParamSet(index)[SPKSettings::minU]); 
-        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, settings.keyerParamSet(index)[SPKSettings::maxU]); 
-        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, settings.keyerParamSet(index)[SPKSettings::minV]); 
-        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, settings.keyerParamSet(index)[SPKSettings::maxV]);
-        
-        keyerParamsSet = index;
-    }
-    else
-    {
-        ok = true;
-    }
-    
-    return ok;
-}
-
 void actionMixMode()
 {
     if (debug) debug->printf("Changing mix mode \r\n");
@@ -517,7 +488,7 @@
     char sentMSGBuffer[kStringBufferLength];
 
     // Set Keyer
-    if (mixMode < mixKey)
+    if (mixMode != mixKey)
     {
         // Set Keyer Off. Quicker to set and fail than to test for on and then turn off
         tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
@@ -545,18 +516,15 @@
     }
     else
     {
-        int index = mixModeMenu.selectedIndex() - mixKeyStartIndex;
-        
         // Turn off Additive Mixing on output
         if (tvOne.getProcessorType().version == 423)
         {
             ok = tvOne.command(0, kTV1WindowIDA, 0x298, 0);
         }
         // Turn on Keyer
-        ok = ok && setKeyParamsTo(index);
         ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
         
-        snprintf(sentMSGBuffer, kStringBufferLength, "Keyer On with %i", index);
+        snprintf(sentMSGBuffer, kStringBufferLength, "Key L over R");
     }
     
     mixModeOld = mixMode;
@@ -745,17 +713,24 @@
     
     if (tvOne.getProcessorType().version == 423 || tvOne.getProcessorType().version == -1)
     {
-        mixModeMenu.addMenuItem(SPKMenuItem("Crossfade", &mixModeAdditiveMenu));
+        mixModeAdditiveMenu.title = "Crossfade";
+        mixModeMenu.addMenuItem(SPKMenuItem(mixModeAdditiveMenu.title, &mixModeAdditiveMenu));
     }
     else
     {
         mixModeMenu.addMenuItem(SPKMenuItem("Blend", mixBlend));
     }
     
-    for (int i=0; i < settings.keyerSetCount(); i++)
-    {
-        mixModeMenu.addMenuItem(SPKMenuItem(settings.keyerParamName(i), mixKeyStartIndex + i));
-    }
+    mixModeMenu.addMenuItem(SPKMenuItem("Key: L over R", mixKey));
+    mixModeMenu.addMenuItem(SPKMenuItem("Key: Tweak key values", &mixModeUpdateKeyMenu));
+    
+    // Load in presets from settings. Index 0 is the "live" key read from TVOne, so we ignore here.
+    if (settings.keyerSetCount() > 1)
+        for (int i=1; i < settings.keyerSetCount(); i++)
+        {
+            mixModeMenu.addMenuItem(SPKMenuItem("Key Preset: " + settings.keyerParamName(i), mixKey + i));
+        }
+    
     mixModeMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
 }
 
@@ -1024,70 +999,43 @@
 void mixModeUpdateKeyMenuHandler(int menuChange, bool action)
 {
     static int actionCount = 0;
-    static int state = 0;
     
     if (action) actionCount++;
     
-    if (actionCount == 0)
+    if (actionCount == 0) 
     {
-        screen.clearBufferRow(kMenuLine1);
-        screen.clearBufferRow(kMenuLine2);
-        screen.textToBuffer("Edit current key?", kMenuLine1);
+        settings.editingKeyerSetIndex = 0;
+        printf("about to load\r\n");
+        bool ok;
+        int minY, maxY, minU, maxU, minV, maxV;
+    
+        ok =       tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, minY); 
+        ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, maxY); 
+        ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, minU); 
+        ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, maxU); 
+        ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, minV); 
+        ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, maxV);
         
-        state += menuChange;
-        if (state > 2) state = 2;
-        if (state < 0) state = 0;
+        if (ok)
+        {
+        printf("%u %u %u %u", minY, maxY, minU, maxU);
+            settings.setEditingKeyerSetValue(SPKSettings::minY, minY);
+            settings.setEditingKeyerSetValue(SPKSettings::maxY, maxY);
+            settings.setEditingKeyerSetValue(SPKSettings::minU, minU);
+            settings.setEditingKeyerSetValue(SPKSettings::maxU, maxU);
+            settings.setEditingKeyerSetValue(SPKSettings::minV, minV);
+            settings.setEditingKeyerSetValue(SPKSettings::maxV, maxV);
+        }
+        else
+        {
+        printf("failed to load\r\n");
+            tvOneStatusMessage.addMessage("Failed to read key values", kTVOneStatusMessageHoldTime);
+        }
         
-        switch (state) 
-        {
-            case 0: screen.textToBuffer("[Tweak/          /      ]", kMenuLine2); break;
-            case 1: screen.textToBuffer("[     /Start Over/      ]", kMenuLine2); break;
-            case 2: screen.textToBuffer("[     /          /Cancel]", kMenuLine2); break;
-        }
+        actionCount = 1;
     }
     if (actionCount == 1)
     {
-        if (state == 0) 
-        {
-            settings.editingKeyerSetIndex = mixModeMenu.selectedIndex() - mixKeyStartIndex;
-            actionCount++;
-        }
-        else if (state == 1)
-        {
-            settings.editingKeyerSetIndex = mixModeMenu.selectedIndex() - mixKeyStartIndex; 
-            settings.setEditingKeyerSetValue(SPKSettings::minY, 0);
-            settings.setEditingKeyerSetValue(SPKSettings::maxY, 255);
-            settings.setEditingKeyerSetValue(SPKSettings::minU, 0);
-            settings.setEditingKeyerSetValue(SPKSettings::maxU, 255);
-            settings.setEditingKeyerSetValue(SPKSettings::minV, 0);
-            settings.setEditingKeyerSetValue(SPKSettings::maxV, 255);
-            tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, 0);
-            tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, 255);
-            tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, 0);
-            tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, 255);
-            tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, 0);
-            tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, 255);
-            actionCount++;
-            state = 0;
-        }
-        else if (state == 2)
-        {
-            settings.editingKeyerSetIndex = -1;
-                    
-            // Get back to menu
-            actionCount = 0;
-            state = 0;
-            selectedMenu = &mixModeMenu;
-            screen.clearBufferRow(kMenuLine1);
-            screen.clearBufferRow(kMenuLine2);
-            screen.textToBuffer(selectedMenu->title, kMenuLine1);
-            screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
-            
-            return;
-        }
-    }
-    if (actionCount == 2)
-    {
         int value = settings.editingKeyerSetValue(SPKSettings::maxY);
         value += menuChange;
         if (value < 0) value = 0;
@@ -1104,7 +1052,7 @@
         
         tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, value);   
     }
-    else if (actionCount == 3)
+    else if (actionCount == 2)
     {
         int value = settings.editingKeyerSetValue(SPKSettings::minY);
         value += menuChange;
@@ -1123,7 +1071,7 @@
         
         tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, value); 
     }
-    else if (actionCount == 4)
+    else if (actionCount == 3)
     {
         int value = settings.editingKeyerSetValue(SPKSettings::maxU);
         value += menuChange;
@@ -1143,7 +1091,7 @@
         
         tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, value); 
     }
-    else if (actionCount == 5)
+    else if (actionCount == 4)
     {
         int value = settings.editingKeyerSetValue(SPKSettings::minU);
         value += menuChange;
@@ -1164,7 +1112,7 @@
         
         tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, value);
     }
-    else if (actionCount == 6)
+    else if (actionCount == 5)
     {
         int value = settings.editingKeyerSetValue(SPKSettings::maxV);
         value += menuChange;
@@ -1186,7 +1134,7 @@
         
         tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, value);    
     }
-    else if (actionCount == 7)
+    else if (actionCount == 6)
     {
         int value = settings.editingKeyerSetValue(SPKSettings::minV);
         value += menuChange;
@@ -1209,10 +1157,11 @@
         
         tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, value);    
     }
-    else if (actionCount == 8)
+    else if (actionCount == 7)
     {
-        // A save dialog would go here
-        
+        // Save settings
+        tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
+    
         // Get back to menu
         actionCount = 0;
         selectedMenu = &mixModeMenu;
@@ -1251,9 +1200,7 @@
             tvOneRGB1Stable = false;
             tvOneRGB2Stable = false;
             handleTVOneSources();
-            
-            settings.editingKeyerSetIndex = -1;
-            keyerParamsSet = -1;
+
             bool ok = settings.load(kSPKDFSettingsFilename);
             if (!ok) settings.loadDefaults();
             
@@ -1385,13 +1332,10 @@
     
     // Set menu structure
     mixModeMenu.title = "Mix Mode";
+    mixModeAdditiveMenu.addMenuItem(SPKMenuItem(&mixModeAdditiveMenuHandler));
+    mixModeUpdateKeyMenu.addMenuItem(SPKMenuItem(&mixModeUpdateKeyMenuHandler));
+
     setMixModeMenuItems();
-    
-    mixModeAdditiveMenu.title = "Crossfade";
-    mixModeAdditiveMenu.addMenuItem(SPKMenuItem(&mixModeAdditiveMenuHandler));
-
-    mixModeUpdateKeyMenu.title = "Update Keyer Settings?";
-    mixModeUpdateKeyMenu.addMenuItem(SPKMenuItem(&mixModeUpdateKeyMenuHandler));
 
     resolutionMenu.title = "Resolution";
     setResolutionMenuItems();
@@ -1561,23 +1505,41 @@
             // With that out of the way, we should be actioning a specific menu's payload?
             else if (selectedMenu == &mixModeMenu)
             {
-                mixMode = mixModeMenu.selectedItem().payload.command[0];
-                
-                // the spanner in the works: mixBlend and mixAdditive are now both index 0 in the menu
-                if (mixMode >= mixKeyStartIndex) 
+                int mixModeMenuPayload = mixModeMenu.selectedItem().payload.command[0];
+
+                if (mixModeMenuPayload == mixAdditive)
+                {
+                    // This will have been handled by the mixModeAdditiveMenuHandler 
+                }
+                else if (mixModeMenuPayload == mixBlend)
                 {
-                    // adjust for the two-into-one spanner
-                    mixMode += 1; 
+                    mixMode = mixBlend;
+                    
+                    if (mixMode == mixModeOld) tvOneStatusMessage.addMessage("Blend already active", kTVOneStatusMessageHoldTime);
+                }
+                else if (mixModeMenuPayload >= mixKey)
+                {
+                    mixMode = mixKey;
+                    
+                    int keySetIndex = mixModeMenuPayload - mixKey;
                     
-                    // if its the second click on the keying mode, lets edit the parameters
-                    if (mixMode == mixModeOld)
+                    if (keySetIndex > 0)
                     {
-                        selectedMenu = &mixModeUpdateKeyMenu;
+                        bool ok;
+                        ok =       tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, settings.keyerParamSet(keySetIndex)[SPKSettings::minY]); 
+                        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, settings.keyerParamSet(keySetIndex)[SPKSettings::maxY]); 
+                        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, settings.keyerParamSet(keySetIndex)[SPKSettings::minU]); 
+                        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, settings.keyerParamSet(keySetIndex)[SPKSettings::maxU]); 
+                        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, settings.keyerParamSet(keySetIndex)[SPKSettings::minV]); 
+                        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, settings.keyerParamSet(keySetIndex)[SPKSettings::maxV]);
                         
-                        screen.clearBufferRow(kMenuLine1);
-                        screen.textToBuffer(selectedMenu->title, kMenuLine1);
+                        tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
                         
-                        selectedMenu->selectedItem().payload.handler(0, false);
+                        tvOneStatusMessage.addMessage(ok ? "Activated: " + settings.keyerParamName(keySetIndex) + " values" : "Send error: keyer values", kTVOneStatusMessageHoldTime);
+                    }
+                    else
+                    {
+                        if (mixMode == mixModeOld) tvOneStatusMessage.addMessage("Keying already active", kTVOneStatusMessageHoldTime);
                     }
                 }
             }
@@ -1737,7 +1699,7 @@
                     
                     std::string sendOK = ok ? "Conform success" : "Send Error: Conform";
                     
-                    tvOneStatusMessage.addMessage(sendOK, kTVOneStatusMessageHoldTime);
+                    tvOneStatusMessage.addMessage(sendOK, 30);
                 }
 //                else if (advancedMenu.selectedItem().payload.command[0] == advancedSetResolutions)
 //                {
--- a/spk_settings.h	Tue Jun 25 02:10:38 2013 +0000
+++ b/spk_settings.h	Fri Jul 26 12:46:58 2013 +0000
@@ -34,6 +34,15 @@
         paramSet[minV] = 128;
         paramSet[maxV] = 129;
         keyerParamSets.push_back(paramSet);
+        keyerParamNames.push_back("Key - Current");
+        
+        paramSet[minY] = 0;
+        paramSet[maxY] = 18;
+        paramSet[minU] = 128;
+        paramSet[maxU] = 129;
+        paramSet[minV] = 128;
+        paramSet[maxV] = 129;
+        keyerParamSets.push_back(paramSet);
         keyerParamNames.push_back("Lumakey");
         
         paramSet[minY] = 30;
@@ -214,6 +223,16 @@
                         keyerParamNames.clear();
                         keyerParamSets.clear();
                         keyParamCleared = true;
+                        
+                        vector<int> paramSet(6);
+                        paramSet[minY] = 0;
+                        paramSet[maxY] = 18;
+                        paramSet[minU] = 128;
+                        paramSet[maxU] = 129;
+                        paramSet[minV] = 128;
+                        paramSet[maxV] = 129;
+                        keyerParamSets.push_back(paramSet);
+                        keyerParamNames.push_back("Key - Current");
                     }
                 
                     // Apply settings