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:
1:f9fca21102e0
Parent:
0:87aab40d5806
Child:
2:50043054e4f7
--- a/main.cpp	Sat Mar 10 19:26:44 2012 +0000
+++ b/main.cpp	Wed Mar 14 00:35:15 2012 +0000
@@ -12,10 +12,9 @@
 // v13 - Menu system for Resolution + Keying implemented, it writing to debug, it sending TVOne commands - Apr'11
 // v14 - Fixes for new PCB - Oct'11
 // v15 - TBZ PCB, OLED - Mar'12
-// v16 - TODO: EDID upload from USB mass storage
-// v17 - TODO: EDID creation from resolution
-
-// !! AIN on own thread doing some kind of low pass / median filter? ie. take average of two most similar values from last three
+// v16 - Comms menu, OSC. There in theory: lots of trouble from EthernetNetIf. NetServices better. But still silently crashes on creation of EthernetNetIf, despite (now) ample memory and code tested elsewhere (inc OSC + spkOLED). 
+// vxx - TODO: EDID upload from USB mass storage
+// vxx - TODO: EDID creation from resolution
 
 #include "mbed.h"
 
@@ -23,12 +22,21 @@
 #include "spk_utils.h"
 #include "spk_mRotaryEncoder.h"
 #include "spk_oled_ssd1305.h"
+#include "EthernetNetIf.h"
+#include "mbedOSC.h"
 
 #include <sstream>
 
-#define kMenuLine1 4
-#define kMenuLine2 5
-#define kStatusLine 7
+#define kMenuLine1 3
+#define kMenuLine2 4
+#define kCommsStatusLine 6
+#define kTVOneStatusLine 7
+
+#define kOSCMbedPort 10000
+#define kOSCMbedIPAddress 10,0,0,2
+#define kOSCMbedSubnetMask 255,255,255,0
+#define kOSCMbedGateway 10,0,0,1
+#define kOSCMbedDNS 10,0,0,1
 
 //// DEBUG
 
@@ -57,8 +65,6 @@
 // SPKDisplay(PinName mosi, PinName clk, PinName cs, PinName dc, PinName res, Serial *debugSerial = NULL);
 SPKDisplay screen(p5, p7, p8, p10, p9, debug);
 
-
-
 // Menu 
 
 SPKMenu *selectedMenu;
@@ -66,6 +72,11 @@
 SPKMenuOfMenus mainMenu;
 SPKMenuPayload resolutionMenu;
 SPKMenuPayload mixModeMenu;
+SPKMenuPayload commsMenu;
+
+// Comms Objects
+EthernetNetIf *ethernet = NULL;
+OSCClass *osc = NULL;
 
 // Fade logic constants + variables
 const float xFadeTolerance = 0.05;
@@ -124,22 +135,25 @@
     return ok;
 }
 
+void oscCallback() {
+                screen.clearBufferRow(kCommsStatusLine);
+                screen.textToBuffer("OSC message received", kCommsStatusLine);
+                screen.sendBuffer();
+}
+
 int main() 
 {
-
     if (debug) 
     { 
         debug->printf("\r\n\r\n");
         debug->printf("*spark d-fuser -----------\r\n");
         debug->printf(" debug channel\r\n");
     }
-    
+
     // Splash screen
     screen.imageToBuffer();
     screen.textToBuffer("SPK:D-Fuser",0);
     screen.textToBuffer("SW beta.15",1);
-    screen.sendBuffer();
-
     
     // Set menu structure
     mixModeMenu.title = "Mix Mode";
@@ -160,9 +174,17 @@
     resolutionMenu.addMenuItem(kTV1ResolutionDescriptionDualHeadXGAp60, kTV1ResolutionDualHeadXGAp60, 0);
     resolutionMenu.addMenuItem(kTV1ResolutionDescriptionTripleHeadVGAp60, kTV1ResolutionTripleHeadVGAp60, 0);
 
+    commsMenu.title = "Network Mode";
+    enum { commsNone, commsOSC, commsArtNet, commsDMX}; 
+    commsMenu.addMenuItem("None", commsNone, 0);
+    commsMenu.addMenuItem("OSC", commsOSC, 0);
+    commsMenu.addMenuItem("ArtNet", commsArtNet, 0);
+    commsMenu.addMenuItem("DMX", commsDMX, 0);
+
     mainMenu.title = "Main Menu";
     mainMenu.addMenuItem(&mixModeMenu);
     mainMenu.addMenuItem(&resolutionMenu);
+    mainMenu.addMenuItem(&commsMenu);
     
     selectedMenu = &mainMenu;
     lastSelectedMenu = &mainMenu;    
@@ -188,9 +210,11 @@
     screen.clearBufferRow(kMenuLine2);
     screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
     screen.horizLineToBuffer(kMenuLine2*pixInPage + pixInPage);
-    screen.horizLineToBuffer(kStatusLine*pixInPage - 1);
-    screen.clearBufferRow(kStatusLine);
-    screen.textToBuffer(sendOK, 7);
+    screen.horizLineToBuffer(kCommsStatusLine*pixInPage - 1);
+    screen.clearBufferRow(kCommsStatusLine);
+    screen.textToBuffer(commsMenu.selectedString(), kCommsStatusLine);
+    screen.clearBufferRow(kTVOneStatusLine);
+    screen.textToBuffer(sendOK, kTVOneStatusLine);
     screen.sendBuffer();
 
 
@@ -204,6 +228,12 @@
 
     while (1) {
 
+        //// Task background things
+        if (commsMenu.selectedPayload1() == commsOSC)
+        {
+            Net::poll();
+        }
+
         //// MENU
         
         int menuChange = menuEnc.getChange();
@@ -311,8 +341,8 @@
                 if (ok) sentOK = "Sent:";
                 else sentOK = "Send Error:";
                 
-                screen.clearBufferRow(kStatusLine);
-                screen.textToBuffer(sentOK + sentMSG.str(), kStatusLine);
+                screen.clearBufferRow(kTVOneStatusLine);
+                screen.textToBuffer(sentOK + sentMSG.str(), kTVOneStatusLine);
                 screen.sendBuffer();
                 
                 if (debug) { debug->printf("Changing mix mode"); }
@@ -332,12 +362,66 @@
                 std::stringstream sentMSG;
                 sentMSG << "Res " << resolutionMenu.selectedPayload1() << ", EDID " << resolutionMenu.selectedPayload2();
                 
-                screen.clearBufferRow(kStatusLine);
-                screen.textToBuffer(sentOK + sentMSG.str(), kStatusLine);
+                screen.clearBufferRow(kTVOneStatusLine);
+                screen.textToBuffer(sentOK + sentMSG.str(), kTVOneStatusLine);
                 screen.sendBuffer();
                 
                 if (debug) { debug->printf("Changing resolution"); }
             }
+            else if (selectedMenu == &commsMenu)
+            {
+                std::string commsType = "Network: --";
+                std::stringstream commsStatus;
+            
+                // Tear down any existing comms
+                // This is the action of commsNone
+                // And also clears the way for other comms actions
+                if (osc) {delete osc; osc = NULL;}  
+                if (ethernet) {delete ethernet; ethernet = NULL;}
+
+                if (commsMenu.selectedPayload1() == commsOSC) 
+                {
+                    commsType = "OSC: ";                    
+                    
+                    ethernet = new EthernetNetIf(
+                    IpAddr(kOSCMbedIPAddress), 
+                    IpAddr(kOSCMbedSubnetMask), 
+                    IpAddr(kOSCMbedGateway), 
+                    IpAddr(kOSCMbedDNS)  
+                    );
+printf("ethernet created");                    
+                    EthernetErr ethError = ethernet->setup();
+                    if(ethError)
+                    {
+                        if (debug) debug->printf("Ethernet setup error, %d", ethError);
+                        commsStatus << "Ethernet setup failed";
+                        // commsMenu = commsNone; //FIXME: this should set the selected menu item to none, but errors. wtf?
+                        // break out of here. this setup should be a function that returns a boolean
+                    }
+
+printf("ethernet setup done");
+
+                    osc = new OSCClass();
+                    osc->messageReceivedCallback.attach(&oscCallback);
+                    osc->begin(kOSCMbedPort);
+                    
+                    commsStatus << "Listening on .25:" << kOSCMbedPort;
+                    
+printf("osc done");
+                }
+                else if (commsMenu.selectedPayload1() == commsArtNet) 
+                {
+                    
+                }
+                else if (commsMenu.selectedPayload1() == commsDMX) 
+                {
+                    
+                }
+                
+                screen.clearBufferRow(kCommsStatusLine);
+                screen.textToBuffer(commsType + commsStatus.str(), kCommsStatusLine);
+                screen.sendBuffer();
+            }
             else
             {
                 if (debug) { debug->printf("Warning: No action identified"); }
@@ -345,7 +429,7 @@
 
         }
         
-
+       
         
         //// MIX