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:
24:49c6624119ae
Parent:
23:909928cafb95
Child:
25:3b519ef70341
--- a/main.cpp	Fri Oct 26 16:51:28 2012 +0000
+++ b/main.cpp	Fri Oct 26 19:22:39 2012 +0000
@@ -152,14 +152,14 @@
 
 // Menu 
 SPKMenu *selectedMenu;
-SPKMenu *lastSelectedMenu;
 SPKMenu mainMenu;
 SPKMenu resolutionMenu;
 
-SPKMenu mixModeMenu; 
+SPKMenu mixModeMenu;
+SPKMenu mixModeAdditiveMenu; 
 enum { mixBlend, mixAdditive, mixKey }; // additive will require custom TVOne firmware.
 int mixMode = mixBlend;
-float fadeCurve = 0; // 0 = "X", 1 = "/\"  <-- pictograms!
+float fadeCurve = 1.0f; // 0 = "X", ie. as per blend, 1 = "/\"  <-- pictograms!
 
 SPKMenu commsMenu;
 enum { commsNone, commsOSC, commsArtNet, commsDMXIn, commsDMXOut};
@@ -309,6 +309,47 @@
     return ok;
 }
 
+void actionMixMode()
+{
+    bool ok = true;
+    std::string sentOK;
+    std::stringstream sentMSG;
+
+    // Set Keyer
+    if (mixMode < mixKey)
+    {
+        if (mixMode == mixBlend)
+        {
+            // Waiting on TV One...
+        }
+        else if (mixMode == mixAdditive)
+        {
+            // Waiting on TV One...
+        }
+        
+        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
+        sentMSG << "Keyer Off";                
+    }
+    else
+    {
+        ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
+        sentMSG << "Keyer On";
+        
+        int index = mixMode - mixKey;
+        ok = ok && setKeyParamsTo(index);
+        sentMSG << " with " << index;
+    }
+
+    if (ok) sentOK = "Sent:";
+    else sentOK = "Send Error:";
+    
+    screen.clearBufferRow(kTVOneStatusLine);
+    screen.textToBuffer(sentOK + sentMSG.str(), kTVOneStatusLine);
+    
+    if (debug) { debug->printf("Changing mix mode"); }
+}
+
+
 bool conformProcessor()
 {
     bool ok = true;
@@ -491,20 +532,22 @@
     // Set menu structure
     mixModeMenu.title = "Mix Mode";
     mixModeMenu.addMenuItem(SPKMenuItem("Blend", mixBlend));
-    if (true) mixModeMenu.addMenuItem(SPKMenuItem("Additive", mixAdditive)); // TODO: Detect whether SPKDF custom firmware
-    // TODO: Set fadecurve parameter menuitem
+    if (true) mixModeMenu.addMenuItem(SPKMenuItem("Additive", &mixModeAdditiveMenu)); // TODO: Detect whether SPKDF custom firmware
     for (int i=0; i < settings.keyerSetCount(); i++)
     {
         mixModeMenu.addMenuItem(SPKMenuItem(settings.keyerParamName(i), mixKey+i));
     }
-    mixModeMenu.addMenuItem(SPKMenuItem("< Main Menu", &mainMenu));
+    mixModeMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
+    
+    mixModeAdditiveMenu.title = "Additive - adjust midpoint";
+    mixModeAdditiveMenu.addMenuItem(SPKMenuItem("click to return", &mixModeMenu, true));
  
     resolutionMenu.title = "Resolution";
     for (int i=0; i < settings.resolutionsCount(); i++)
     {
         resolutionMenu.addMenuItem(SPKMenuItem(settings.resolutionName(i), settings.resolutionIndex(i), settings.resolutionEDIDIndex(i)));
     }
-    resolutionMenu.addMenuItem(SPKMenuItem("< Main Menu", &mainMenu));
+    resolutionMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
 
     commsMenu.title = "Network Mode"; 
     // commsMenu is built in mixer's run loop, depending on RJ45 mode.
@@ -515,13 +558,13 @@
     advancedMenu.addMenuItem(SPKMenuItem("Conform Processor", advancedConformProcessor));
     if (settingsAreCustom) advancedMenu.addMenuItem(SPKMenuItem("Revert to defaults", advancedLoadDefaults));
     advancedMenu.addMenuItem(SPKMenuItem("Start Self-Test", advancedSelfTest));
-    advancedMenu.addMenuItem(SPKMenuItem("< Main Menu", &mainMenu));
+    advancedMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
     
     mainMenu.title = "Main Menu";
-    mainMenu.addMenuItem(SPKMenuItem("> " + mixModeMenu.title, &mixModeMenu));
-    mainMenu.addMenuItem(SPKMenuItem("> " + resolutionMenu.title, &resolutionMenu));
-    mainMenu.addMenuItem(SPKMenuItem("> " + commsMenu.title, &commsMenu));
-    mainMenu.addMenuItem(SPKMenuItem("> " + advancedMenu.title, &advancedMenu));
+    mainMenu.addMenuItem(SPKMenuItem(mixModeMenu.title, &mixModeMenu));
+    mainMenu.addMenuItem(SPKMenuItem(resolutionMenu.title, &resolutionMenu));
+    mainMenu.addMenuItem(SPKMenuItem(commsMenu.title, &commsMenu));
+    mainMenu.addMenuItem(SPKMenuItem(advancedMenu.title, &advancedMenu));
       
     selectedMenu = &mainMenu;
       
@@ -555,8 +598,6 @@
     screen.textToBuffer(tvOneDetectString, kTVOneStatusLine);
     screen.sendBuffer();
 
-debug->printf("this far?");
-
     //// CONTROLS TEST
 
     while (0) {
@@ -588,7 +629,7 @@
                 commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
                 commsMenu.addMenuItem(SPKMenuItem("OSC", commsOSC));
                 commsMenu.addMenuItem(SPKMenuItem("ArtNet", commsArtNet));
-                commsMenu.addMenuItem(SPKMenuItem("< Main Menu", &mainMenu));
+                commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
             }
             if (rj45Mode == rj45DMX) 
             {
@@ -597,7 +638,7 @@
                 commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
                 commsMenu.addMenuItem(SPKMenuItem("DMX In", commsDMXIn));
                 commsMenu.addMenuItem(SPKMenuItem("DMX Out", commsDMXOut));
-                commsMenu.addMenuItem(SPKMenuItem("< Main Menu", &mainMenu));
+                commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
             }
             
             // cancel old comms
@@ -621,15 +662,36 @@
         // Update GUI
         if (menuChange != 0)
         {
-            if (debug) debug->printf("Menu changed by %i\r\n", menuChange);
-            
-            *selectedMenu = selectedMenu->selectedIndex() + menuChange;
-            
-            // update OLED line 2 here
-            screen.clearBufferRow(kMenuLine2);
-            screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
-            
-            if (debug) debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
+            if (selectedMenu->selectedItem().handlingControls)
+            {
+                if (selectedMenu == &mixModeAdditiveMenu)
+                {
+                    fadeCurve += menuChange * 0.05;
+                    if (fadeCurve > 1.0f) fadeCurve = 1.0f;
+                    if (fadeCurve < 0.0f) fadeCurve = 0.0f;
+                    
+                    /* Mystery Crash
+                    std::stringstream fadeCurveMessage;
+                    fadeCurveMessage << "Blend < " << fadeCurve << " > Additive";
+                    screen.clearBufferRow(kMenuLine2);
+                    screen.textToBuffer(fadeCurveMessage.str(), kMenuLine2);
+                    */
+                    
+                    if (debug) debug->printf("Fade curve changed by %i to %f", menuChange, fadeCurve);
+                }
+            }
+            else
+            {
+                if (debug) debug->printf("Menu changed by %i\r\n", menuChange);
+                
+                *selectedMenu = selectedMenu->selectedIndex() + menuChange;
+                
+                // update OLED line 2 here
+                screen.clearBufferRow(kMenuLine2);
+                screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
+                
+                if (debug) debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
+            }    
         }
         
         // Action menu item
@@ -643,9 +705,6 @@
                 // point selected menu to the new menu
                 selectedMenu = selectedMenu->selectedItem().payload.menu;
                 
-                // reset the selection within that menu to the first position
-                (*selectedMenu) = 0;
-                
                 // update OLED lines 1&2
                 screen.clearBufferRow(kMenuLine1);
                 screen.clearBufferRow(kMenuLine2);
@@ -658,39 +717,19 @@
                     debug->printf("%s \r\n", selectedMenu->title.c_str());
                     debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
                 }
+                
+                // Are we changing menus that should have a command attached?
+                if (selectedMenu == &mixModeAdditiveMenu)
+                {
+                    mixMode = mixAdditive;
+                    actionMixMode();
+                }
             }
             // 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];
-            
-                bool ok = true;
-                std::string sentOK;
-                std::stringstream sentMSG;
-            
-                // Set Keyer
-                if (mixMode < mixKey)
-                {
-                    ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
-                    sentMSG << "Keyer Off";                
-                }
-                else
-                {
-                    ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
-                    sentMSG << "Keyer On";
-                    
-                    int index = mixMode - mixKey;
-                    ok = ok && setKeyParamsTo(index);
-                    sentMSG << " with " << index;
-                }
-
-                if (ok) sentOK = "Sent:";
-                else sentOK = "Send Error:";
-                
-                screen.clearBufferRow(kTVOneStatusLine);
-                screen.textToBuffer(sentOK + sentMSG.str(), kTVOneStatusLine);
-                
-                if (debug) { debug->printf("Changing mix mode"); }
+                actionMixMode();
             }
             else if (selectedMenu == &resolutionMenu)
             {