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:
67:6ce9fb62b17c
Parent:
66:02845e02a758
Child:
68:c26478f42ca4
--- a/main.cpp	Sat Jul 27 14:24:09 2013 +0000
+++ b/main.cpp	Sat Jul 27 14:53:57 2013 +0000
@@ -754,9 +754,20 @@
     {
         commsMenu.title = "Network Mode [Ethernet]";
         commsMenu.clearMenuItems();
-        commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
-        commsMenu.addMenuItem(SPKMenuItem("OSC", commsOSC));
-        commsMenu.addMenuItem(SPKMenuItem("ArtNet", commsArtNet));
+        switch (commsMode) // Cannot switch between OSC and Artnet once one is selected (crash in EthernetIf deconstructor?), so this.
+        {
+            case commsNone:        
+                commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
+                commsMenu.addMenuItem(SPKMenuItem("OSC", commsOSC));
+                commsMenu.addMenuItem(SPKMenuItem("ArtNet", commsArtNet));
+                break;
+            case commsOSC:
+                commsMenu.addMenuItem(SPKMenuItem("OSC", commsOSC));
+                break;
+            case commsArtNet:
+                commsMenu.addMenuItem(SPKMenuItem("ArtNet", commsArtNet));
+                break;
+        }
         commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
         commsMenu = 0;
     }
@@ -1543,6 +1554,7 @@
                 // This is the action of commsNone
                 // And also clears the way for other comms actions
                 commsMode = commsNone;
+                /* // These don't take well to being destroyed. So while it was a nice idea to be able to swap between None, OSC and Artnet, now the GUI won't allow it, and we don't need this.
                 if (osc)        {delete osc; osc = NULL;}  
                 if (ethernet)   {delete ethernet; ethernet = NULL;}
                 if (artNet)     
@@ -1554,6 +1566,7 @@
                     delete artNet; 
                     artNet = NULL;
                 }
+                */
                 if (dmx)        {delete dmx; dmx = NULL;}
                 
                 // Ensure we can't change to comms modes the hardware isn't switched to
@@ -1571,32 +1584,40 @@
                     commsMode = commsOSC;
                     commsTypeString = "OSC: ";
                     
-                    ethernet = new EthernetNetIf(
-                    IpAddr(kOSCMbedIPAddress), 
-                    IpAddr(kOSCMbedSubnetMask), 
-                    IpAddr(kOSCMbedGateway), 
-                    IpAddr(kOSCMbedDNS)  
-                    );
-                  
-                    EthernetErr ethError = ethernet->setup();
-                    if(ethError)
+                    if (!ethernet)
                     {
-                        if (debug) debug->printf("Ethernet setup error, %d", ethError);
-                        snprintf(commsStatusBuffer, kStringBufferLength, "Ethernet setup failed");
-                        commsMenu = commsNone;
-                        // break out of here. this setup should be a function that returns a boolean
+                        ethernet = new EthernetNetIf(
+                        IpAddr(kOSCMbedIPAddress), 
+                        IpAddr(kOSCMbedSubnetMask), 
+                        IpAddr(kOSCMbedGateway), 
+                        IpAddr(kOSCMbedDNS)  
+                        );
+                      
+                        EthernetErr ethError = ethernet->setup();
+                        if(ethError)
+                        {
+                            if (debug) debug->printf("Ethernet setup error, %d", ethError);
+                            snprintf(commsStatusBuffer, kStringBufferLength, "Ethernet setup failed");
+                            commsMenu = commsNone;
+                            // break out of here. this setup should be a function that returns a boolean
+                        }
                     }
-
-                    osc = new OSCClass();
-                    osc->setReceiveMessage(&receiveMessage);
-                    osc->begin(kOSCMbedPort);
                     
-                    uint8_t destIP[]  = { kOSCDestIPAddress };
-                    sendMessage.setIp( destIP );
-                    sendMessage.setPort( kOSCDestPort );
+                    if (!osc)
+                    {
+                        osc = new OSCClass();
+                        osc->setReceiveMessage(&receiveMessage);
+                        osc->begin(kOSCMbedPort);
+                        
+                        uint8_t destIP[]  = { kOSCDestIPAddress };
+                        sendMessage.setIp( destIP );
+                        sendMessage.setPort( kOSCDestPort );
+                    }
                     
                     IpAddr ethIP = ethernet->getIp();
                     snprintf(commsStatusBuffer, kStringBufferLength, "In %u.%u.%u.%u:%u", ethIP[0], ethIP[1], ethIP[2], ethIP[3], kOSCMbedPort);
+                
+                    setCommsMenuItems(); // remove non-OSC from menu. we're locked in.
                 }
                 else if (commsMenu.selectedItem().payload.command[0] == commsArtNet) 
                 {
@@ -1619,6 +1640,8 @@
                     artNet->SendArtPollReply(); // announce to art-net nodes
                     
                     snprintf(commsStatusBuffer, kStringBufferLength, "Listening");
+                    
+                    setCommsMenuItems(); // remove non-ArtNet from menu. we're locked in.
                 }
                 else if (commsMenu.selectedItem().payload.command[0] == commsDMXIn) 
                 {