Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SPK-TVOne DMX DmxArtNet NetServicesMin OSC PinDetect mRotaryEncoder iniparser mbed spk_oled_ssd1305 filter
Diff: main.cpp
- 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