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:
36:8b5c75c8bc23
Parent:
35:d5d9f0838f99
Child:
37:744bef2e8be8
--- a/main.cpp	Tue Nov 06 00:21:38 2012 +0000
+++ b/main.cpp	Tue Nov 06 03:34:31 2012 +0000
@@ -39,8 +39,8 @@
  * v20 - Keying values and resolutions load from USB mass storage - September'12
  * v21 - Mixing behaviour upgrade: blend-additive as continuum, test cards on startup if no valid source - October'12
  * v22 - EDID passthrough override and EDID upload from USB mass storage
- * vxx - TODO: Set keying values from controller, requires a guided, step-through process for user
- * vxx - TODO: Defaults load/save from USB mass storage
+ * v23 - Set keying values from controller, requires a guided, step-through process for user
+ * vxx - TODO: Writes back to .ini on USB mass storage: keyer updates, comms, hdcp, edid internal/passthrough, ...?
  * vxx - TODO: EDID creation from resolution
  */
  
@@ -58,7 +58,7 @@
 #include "DMX.h"
 #include "filter.h"
 
-#define kSPKDFSoftwareVersion "22"
+#define kSPKDFSoftwareVersion "23"
 
 // MBED PINS
 
@@ -115,8 +115,8 @@
 //// DEBUG
 
 // Comment out one or the other...
-//Serial *debug = new Serial(USBTX, USBRX); // For debugging via USB serial
-Serial *debug = NULL; // For release (no debugging)
+Serial *debug = new Serial(USBTX, USBRX); // For debugging via USB serial
+//Serial *debug = NULL; // For release (no debugging)
 
 //// SOFT RESET
 
@@ -157,8 +157,16 @@
 SPKMenu resolutionMenu;
 
 SPKMenu mixModeMenu;
-SPKMenu mixModeAdditiveMenu; 
-enum { mixBlend, mixAdditive, mixKey }; // additive will require custom TVOne firmware.
+SPKMenu mixModeAdditiveMenu;
+SPKMenu mixModeKeyerMenuUpdate; 
+SPKMenu mixModeKeyerMenuMinY;
+SPKMenu mixModeKeyerMenuMaxY;
+SPKMenu mixModeKeyerMenuMinU;
+SPKMenu mixModeKeyerMenuMaxU;
+SPKMenu mixModeKeyerMenuMinV;
+SPKMenu mixModeKeyerMenuMaxV;
+enum { mixBlend, mixAdditive, mixKey };
+int mixKeyStartIndex = 1; // need this hard coded as mixBlend and mixAdditive are now combined into the same menu item
 int mixMode = mixBlend; // Start with safe mix mode, and test to get out of it. Safe mode will work with inputs missing and without hold frames.
 float fadeCurve = 0.0f; // 0 = "X", ie. as per blend, 1 = "/\", ie. as per additive  <-- pictograms!
 
@@ -431,7 +439,7 @@
     char sentMSGBuffer[kStringBufferLength];
 
     // Set Keyer
-    if (mixMode < mixKey)
+    if (mixMode < mixKeyStartIndex)
     {
         // Set Keyer Off. Quicker to set and fail than to test for on and then turn off
         tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
@@ -453,7 +461,7 @@
     }
     else
     {
-        int index = mixMode - mixKey;
+        int index = mixMode - mixKeyStartIndex;
 
         ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
         ok = ok && setKeyParamsTo(index);
@@ -563,7 +571,7 @@
     mixModeMenu.addMenuItem(SPKMenuItem("Crossfade", &mixModeAdditiveMenu));
     for (int i=0; i < settings.keyerSetCount(); i++)
     {
-        mixModeMenu.addMenuItem(SPKMenuItem(settings.keyerParamName(i), mixKey+i));
+        mixModeMenu.addMenuItem(SPKMenuItem(settings.keyerParamName(i), &mixModeKeyerMenuUpdate));
     }
     mixModeMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
 }
@@ -629,6 +637,28 @@
     
     mixModeAdditiveMenu.title = "Crossfade";
     mixModeAdditiveMenu.addMenuItem(SPKMenuItem("[title overridden]", &mixModeMenu, true));
+
+    mixModeKeyerMenuUpdate.title = "Update Keyer Settings?";
+    mixModeKeyerMenuUpdate.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMaxY, true));
+
+    mixModeKeyerMenuMaxY.title = "UP until lighter gone";
+    mixModeKeyerMenuMaxY.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMinY, true)); 
+ 
+    mixModeKeyerMenuMinY.title = "UP to bring back darker";
+    mixModeKeyerMenuMinY.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMaxU, true)); 
+
+    mixModeKeyerMenuMaxU.title = "UP until lighter gone";
+    mixModeKeyerMenuMaxU.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMinU, true)); 
+ 
+    mixModeKeyerMenuMinU.title = "UP to bring back darker";
+    mixModeKeyerMenuMinU.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMaxV, true)); 
+
+    mixModeKeyerMenuMaxV.title = "UP until lighter gone";
+    mixModeKeyerMenuMaxV.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMinV, true)); 
+ 
+    mixModeKeyerMenuMinV.title = "UP to bring back darker";
+    mixModeKeyerMenuMinV.addMenuItem(SPKMenuItem("[title overridden]", &mixModeMenu, true)); 
+ 
  
     resolutionMenu.title = "Resolution";
     setResolutionMenuItems();
@@ -759,6 +789,131 @@
                     
                     if (debug) debug->printf("Fade curve changed by %i to %f \r\n", menuChange, fadeCurve);
                 }
+                else if (selectedMenu == &mixModeKeyerMenuUpdate)
+                {
+                    if (menuChange < 0)
+                    {
+                        settings.editingKeyerSetIndex = mixModeMenu.selectedIndex() - mixKeyStartIndex;
+                        screen.textToBuffer("[Yes/  ]", kMenuLine2);
+                    }
+                    else
+                    {
+                        settings.editingKeyerSetIndex = -1;
+                        screen.textToBuffer("[   /No]", kMenuLine2);
+                    }
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMinY)
+                {
+                        int value = settings.editingKeyerSetValue(SPKSettings::minY);
+                        value += menuChange;
+                        if (value < 0) value = 0;
+                        if (value > settings.editingKeyerSetValue(SPKSettings::maxY)) value = settings.editingKeyerSetValue(SPKSettings::maxY);
+                        settings.setEditingKeyerSetValue(SPKSettings::minY, value);
+                
+                        screen.clearBufferRow(kMenuLine2);
+                        
+                        char paramLine[kStringBufferLength];
+                        snprintf(paramLine, kStringBufferLength, "[%3i/%3i][   /   ][   /   ]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::maxY), 
+                                                                                                value);
+                        screen.textToBuffer(paramLine, kMenuLine2);
+                        
+                        tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, value);              
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMaxY)
+                {
+                        int value = settings.editingKeyerSetValue(SPKSettings::maxY);
+                        value += menuChange;
+                        if (value < 0) value = 0;
+                        if (value > 255) value = 255;
+                        settings.setEditingKeyerSetValue(SPKSettings::maxY, value);
+                
+                        screen.clearBufferRow(kMenuLine2);
+                        
+                        char paramLine[kStringBufferLength];
+                        snprintf(paramLine, kStringBufferLength, "[   /%3i][   /   ][   /   ]", value);
+                        screen.textToBuffer(paramLine, kMenuLine2);
+                        
+                        tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, value);              
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMinU)
+                {
+                        int value = settings.editingKeyerSetValue(SPKSettings::minU);
+                        value += menuChange;
+                        if (value > settings.editingKeyerSetValue(SPKSettings::maxU)) value = settings.editingKeyerSetValue(SPKSettings::maxU);
+                        if (value > 255) value = 255;
+                        settings.setEditingKeyerSetValue(SPKSettings::minU, value);
+                
+                        screen.clearBufferRow(kMenuLine2);
+                        
+                        char paramLine[kStringBufferLength];
+                        snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][   /   ]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::maxY), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::minU), 
+                                                                                                value);
+                        screen.textToBuffer(paramLine, kMenuLine2);
+                        
+                        tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, value);              
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMaxU)
+                {
+                        int value = settings.editingKeyerSetValue(SPKSettings::maxU);
+                        value += menuChange;
+                        if (value < 0) value = 0;
+                        if (value > 255) value = 255;
+                        settings.setEditingKeyerSetValue(SPKSettings::maxU, value);
+                
+                        screen.clearBufferRow(kMenuLine2);
+                        
+                        char paramLine[kStringBufferLength];
+                        snprintf(paramLine, kStringBufferLength, "[%3i/%3i][   /%3i][   /   ]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::maxY),  
+                                                                                                value);
+                        screen.textToBuffer(paramLine, kMenuLine2);
+                        
+                        tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, value);              
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMinV)
+                {
+                        int value = settings.editingKeyerSetValue(SPKSettings::minV);
+                        value += menuChange;
+                        if (value > settings.editingKeyerSetValue(SPKSettings::maxV)) value = settings.editingKeyerSetValue(SPKSettings::maxV);
+                        if (value > 255) value = 255;
+                        settings.setEditingKeyerSetValue(SPKSettings::minV, value);
+                
+                        screen.clearBufferRow(kMenuLine2);
+                        
+                        char paramLine[kStringBufferLength];
+                        snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][%3i/%3i]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::maxY), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::minU), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::maxU), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::minV), 
+                                                                                                value);
+                        screen.textToBuffer(paramLine, kMenuLine2);
+                        
+                        tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, value);              
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMaxV)
+                {
+                        int value = settings.editingKeyerSetValue(SPKSettings::maxV);
+                        value += menuChange;
+                        if (value < 0) value = 0;
+                        if (value > 255) value = 255;
+                        settings.setEditingKeyerSetValue(SPKSettings::maxV, value);
+                
+                        screen.clearBufferRow(kMenuLine2);
+                        
+                        char paramLine[kStringBufferLength];
+                        snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][   /%3i]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::maxY), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::minU), 
+                                                                                                settings.editingKeyerSetValue(SPKSettings::maxU),  
+                                                                                                value);
+                        screen.textToBuffer(paramLine, kMenuLine2);
+                        
+                        tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, value);    
+                }
             }
             else
             {
@@ -814,13 +969,90 @@
                     mixMode = fadeCurve > 0 ? mixAdditive : mixBlend;
                     updateMixMode = true;
                 }
+                else if (selectedMenu == &mixModeKeyerMenuUpdate)
+                {
+                    screen.clearBufferRow(kMenuLine2);
+                    if (settings.editingKeyerSetIndex == mixModeMenu.selectedIndex() - mixKeyStartIndex)
+                        screen.textToBuffer("[Yes/  ]", kMenuLine2);
+                    else
+                        screen.textToBuffer("[   /No]", kMenuLine2);
+                    
+                    mixMode = mixKey;
+                    updateMixMode = true;
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMinY)
+                {                    
+                    char paramLine[kStringBufferLength];
+                    screen.clearBufferRow(kMenuLine2);
+                    snprintf(paramLine, kStringBufferLength, "[%3i/%3i][   /   ][   /   ]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxY));
+                    screen.textToBuffer(paramLine, kMenuLine2);
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMaxY)
+                {
+                    // First, check outcome of menu that got us here: mixModeKeyerMenuUpdate
+                    if (settings.editingKeyerSetIndex == -1)
+                    {
+                        selectedMenu = &mixModeMenu;
+                        
+                        // update OLED lines 1&2
+                        screen.clearBufferRow(kMenuLine1);
+                        screen.clearBufferRow(kMenuLine2);
+                        screen.textToBuffer(selectedMenu->title, kMenuLine1);
+                        screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
+                    }
+                    else
+                    {
+                        char paramLine[kStringBufferLength];
+                        screen.clearBufferRow(kMenuLine2);
+                        snprintf(paramLine, kStringBufferLength, "[   /%3i][   /   ][   /   ]", settings.editingKeyerSetValue(SPKSettings::maxY));
+                        screen.textToBuffer(paramLine, kMenuLine2);
+                    }
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMinU)
+                {
+                    char paramLine[kStringBufferLength];
+                    screen.clearBufferRow(kMenuLine2);
+                    snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][   /   ]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::minU), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxU));
+                    screen.textToBuffer(paramLine, kMenuLine2);
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMaxU)
+                {
+                    char paramLine[kStringBufferLength];
+                    screen.clearBufferRow(kMenuLine2);
+                    snprintf(paramLine, kStringBufferLength, "[%3i/%3i][   /%3i][   /   ]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxU));
+                    screen.textToBuffer(paramLine, kMenuLine2);                
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMinV)
+                {
+                    char paramLine[kStringBufferLength];
+                    screen.clearBufferRow(kMenuLine2);
+                    snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][%3i/%3i]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::minU), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxU), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::minV),
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxV));
+                    screen.textToBuffer(paramLine, kMenuLine2);
+                }
+                else if (selectedMenu == &mixModeKeyerMenuMaxV)
+                {
+                    char paramLine[kStringBufferLength];
+                    screen.clearBufferRow(kMenuLine2);
+                    snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][   /%3i]", settings.editingKeyerSetValue(SPKSettings::minY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxY), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::minU), 
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxU),
+                                                                                            settings.editingKeyerSetValue(SPKSettings::maxV));
+                    screen.textToBuffer(paramLine, kMenuLine2);
+                }
             }
             // 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];
-                updateMixMode = true;
-            }
             else if (selectedMenu == &resolutionMenu)
             {
                 bool ok = true;
@@ -1156,7 +1388,7 @@
             newFadeAPercent = newFadeA * fadeUp * 100.0;
             newFadeBPercent = newFadeB * fadeUp * 100.0;
         }
-        else if (mixMode >= mixKey)
+        else if (mixMode >= mixKeyStartIndex)
         {
             newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
             newFadeBPercent = fadeUp * 100.0;