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

Files at this revision

API Documentation at this revision

Comitter:
tobyspark
Date:
Sat Jul 27 18:27:11 2013 +0000
Parent:
67:6ce9fb62b17c
Child:
69:cd1c85de3e38
Commit message:
Read network settings in from SPKDF.ini

Changed in this revision

SPKDF_ini.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
spk_settings.h Show annotated file Show diff for this revision Revisions of this file
--- a/SPKDF_ini.h	Sat Jul 27 14:53:57 2013 +0000
+++ b/SPKDF_ini.h	Sat Jul 27 18:27:11 2013 +0000
@@ -6,6 +6,37 @@
 #                                                                        #
 ######################################### A PROJECT BY TOBY HARRIS #######
 
+### NETWORK
+#
+# Parameters for the various network modes
+#
+# OSC: if DHCP is set to Yes, the IP address parameters will be ignored.
+# Artnet: Will use the channel mapping set in the DMX section.
+
+[OSC]
+
+DHCP = No
+ControllerAddress = 10.0.0.2
+ControllerPort = 10000
+ControllerSubnetMask = 255.255.255.0
+ControllerGateway = 10.0.0.1
+ControllerDNS = 10.0.0.1
+
+SendAddress = 255.255.255.255
+SendPort = 10000
+
+[ArtNet]
+
+ControllerAddress = 2.0.0.100
+BroadcastAddress = 2.255.255.255
+
+[DMX]
+
+InChannelXFade = 0
+InChannelFadeUp = 1
+OutChannelXFade = 0
+OutChannelFadeUp = 1
+
 ### KEYS
 #
 # Name = What is shown in menu
--- a/main.cpp	Sat Jul 27 14:53:57 2013 +0000
+++ b/main.cpp	Sat Jul 27 18:27:11 2013 +0000
@@ -44,7 +44,7 @@
  * v25 - UX work
  * v26 - Tweaks: Network in works with hands-on controls, EDID Change message, Fit/Fill
  * v27 - Rework Keying UX, having current key saved in processor and loading in presets.
- * vxx - TODO: Reads OSC and ArtNet network info from .ini
+ * v28 - Network tweaks. Reads OSC and ArtNet network info from .ini
  * vxx - TODO: Writes back to .ini on USB mass storage: keyer updates, comms, hdcp, edid internal/passthrough, ...?
  * vxx - TODO: EDID creation from resolution
  */
@@ -63,7 +63,7 @@
 #include "DMX.h"
 #include "filter.h"
 
-#define kSPKDFSoftwareVersion "27"
+#define kSPKDFSoftwareVersion "28"
 
 // MBED PINS
 
@@ -97,25 +97,6 @@
 #define kTVOneStatusLine 7
 #define kTVOneStatusMessageHoldTime 5
 
-// NETWORKING
-
-#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
-
-#define kOSCDestIPAddress 255,255,255,255
-#define kOSCDestPort 10000
-
-#define kArtNetBindIPAddress 2,0,0,100
-#define kArtNetBroadcastAddress 2,255,255,255
-
-#define kDMXInChannelXFade 0
-#define kDMXInChannelFadeUp 1
-#define kDMXOutChannelXFade 0
-#define kDMXOutChannelFadeUp 1
-
 // 8.3 format filename only, no subdirs
 #define kSPKDFSettingsFilename "SPKDF.ini"
 
@@ -358,8 +339,8 @@
 
 bool processDMXIn() 
 {
-    int xFadeDMX = dmx->get(kDMXInChannelXFade);
-    int fadeUpDMX = dmx->get(kDMXInChannelFadeUp);
+    int xFadeDMX = dmx->get(settings.dmx.inChannelXFade);
+    int fadeUpDMX = dmx->get(settings.dmx.inChannelFadeUp);
 
     if (((float)xFadeDMX/255 != commsXFade) && ((float)fadeUpDMX/255 != commsFadeUp))
     {
@@ -384,8 +365,8 @@
     int xFadeDMX = xFade*255;
     int fadeUpDMX = fadeUp*255;
     
-    dmx->put(kDMXOutChannelXFade, xFadeDMX);
-    dmx->put(kDMXOutChannelFadeUp, fadeUpDMX);
+    dmx->put(settings.dmx.outChannelXFade, xFadeDMX);
+    dmx->put(settings.dmx.outChannelFadeUp, fadeUpDMX);
     
     char statusMessageBuffer[kStringBufferLength];
     snprintf(statusMessageBuffer, kStringBufferLength, "DMX Out: xF %3i fUp %3i", xFadeDMX, fadeUpDMX);
@@ -1586,13 +1567,20 @@
                     
                     if (!ethernet)
                     {
-                        ethernet = new EthernetNetIf(
-                        IpAddr(kOSCMbedIPAddress), 
-                        IpAddr(kOSCMbedSubnetMask), 
-                        IpAddr(kOSCMbedGateway), 
-                        IpAddr(kOSCMbedDNS)  
-                        );
-                      
+                        if (settings.osc.DHCP)
+                        {
+                            ethernet = new EthernetNetIf("dvimxr");
+                        }
+                        else
+                        {
+                            ethernet = new EthernetNetIf(
+                                settings.osc.controllerAddress, 
+                                settings.osc.controllerSubnetMask, 
+                                settings.osc.controllerGateway, 
+                                settings.osc.controllerDNS  
+                            );
+                        }
+                        
                         EthernetErr ethError = ethernet->setup();
                         if(ethError)
                         {
@@ -1607,15 +1595,15 @@
                     {
                         osc = new OSCClass();
                         osc->setReceiveMessage(&receiveMessage);
-                        osc->begin(kOSCMbedPort);
+                        osc->begin(settings.osc.sendPort);
                         
-                        uint8_t destIP[]  = { kOSCDestIPAddress };
-                        sendMessage.setIp( destIP );
-                        sendMessage.setPort( kOSCDestPort );
+                        uint8_t sendAddress[] = {settings.osc.sendAddress[0], settings.osc.sendAddress[1], settings.osc.sendAddress[2], settings.osc.sendAddress[3]};
+                        sendMessage.setIp( sendAddress );
+                        sendMessage.setPort( settings.osc.sendPort );
                     }
                     
                     IpAddr ethIP = ethernet->getIp();
-                    snprintf(commsStatusBuffer, kStringBufferLength, "In %u.%u.%u.%u:%u", ethIP[0], ethIP[1], ethIP[2], ethIP[3], kOSCMbedPort);
+                    snprintf(commsStatusBuffer, kStringBufferLength, "In %u.%u.%u.%u:%u", ethIP[0], ethIP[1], ethIP[2], ethIP[3], settings.osc.controllerPort);
                 
                     setCommsMenuItems(); // remove non-OSC from menu. we're locked in.
                 }
@@ -1626,8 +1614,8 @@
 
                     artNet = new DmxArtNet();
                     
-                    artNet->BindIpAddress = IpAddr(kArtNetBindIPAddress);
-                    artNet->BCastAddress = IpAddr(kArtNetBroadcastAddress);
+                    artNet->BindIpAddress = settings.artNet.controllerAddress;
+                    artNet->BCastAddress = settings.artNet.broadcastAddress;
                 
                     artNet->InitArtPollReplyDefaults();
                 
--- a/spk_settings.h	Sat Jul 27 14:53:57 2013 +0000
+++ b/spk_settings.h	Sat Jul 27 18:27:11 2013 +0000
@@ -1,4 +1,5 @@
 #include "mbed.h"
+#include "ipaddr.h"
 #include <string>
 #include <vector>
 
@@ -12,7 +13,31 @@
     enum keyerParameterType {minY = 0, maxY, minU, maxU, minV, maxV};
 
     int editingKeyerSetIndex;
-
+    
+    struct {
+        bool DHCP;
+        IpAddr controllerAddress;
+        int controllerPort;
+        IpAddr controllerSubnetMask;
+        IpAddr controllerGateway;
+        IpAddr controllerDNS;
+        
+        IpAddr sendAddress;
+        int sendPort;
+    } osc;
+    
+    struct {
+        IpAddr controllerAddress;
+        IpAddr broadcastAddress;
+    } artNet;
+    
+    struct {
+        int inChannelXFade;
+        int inChannelFadeUp;
+        int outChannelXFade;
+        int outChannelFadeUp;
+    } dmx;
+    
     SPKSettings()
     {
         editingKeyerSetIndex = -1;
@@ -21,6 +46,26 @@
     
     void loadDefaults()
     {
+        // NETWORK
+        
+        osc.DHCP = false;
+        osc.controllerAddress = IpAddr(10,0,0,2);
+        osc.controllerPort = 10000;
+        osc.controllerSubnetMask = IpAddr(255,255,255,0);
+        osc.controllerGateway = IpAddr(10,0,0,1);
+        osc.controllerDNS = IpAddr(10,0,0,1);
+        
+        osc.sendAddress = IpAddr(255,255,255,255);
+        osc.sendPort = 10000;
+        
+        artNet.controllerAddress = IpAddr(2,0,0,100);
+        artNet.broadcastAddress = IpAddr(2,255,255,255);
+        
+        dmx.inChannelXFade = 0;
+        dmx.inChannelFadeUp = 1;
+        dmx.outChannelXFade = 0;
+        dmx.outChannelFadeUp = 1;
+    
         //// KEYS
         
         keyerParamNames.clear();
@@ -164,7 +209,80 @@
         string filePath("/local/");
         filePath += filename;
 
+        char* const failString = "Failed to read";
+        const int failInt = -1;
+
         dictionary* settings = iniparser_load(filePath.c_str());
+        
+        // NETWORK
+        {
+            bool netReadOK = true;
+        
+            int DHCP = iniparser_getboolean(settings, "OSC:DHCP", failInt);
+            netReadOK = netReadOK && DHCP != failInt;
+            
+            IpAddr controllerAddress = ipAddrWithString(iniparser_getstring(settings, "OSC:ControllerAddress", failString));
+            netReadOK = netReadOK && !controllerAddress.isNull();
+            
+            int controllerPort = iniparser_getboolean(settings, "OSC:ControllerPort", failInt);
+            netReadOK = netReadOK && controllerPort != failInt;
+            
+            IpAddr controllerSubnetMask = ipAddrWithString(iniparser_getstring(settings, "OSC:ControllerSubnetMask", failString));
+            netReadOK = netReadOK && !controllerSubnetMask.isNull();
+            
+            IpAddr controllerGateway = ipAddrWithString(iniparser_getstring(settings, "OSC:ControllerGateway", failString));
+            netReadOK = netReadOK && !controllerGateway.isNull();
+            
+            IpAddr controllerDNS = ipAddrWithString(iniparser_getstring(settings, "OSC:ControllerDNS", failString));
+            netReadOK = netReadOK && !controllerDNS.isNull();
+        
+            IpAddr sendAddress = ipAddrWithString(iniparser_getstring(settings, "OSC:SendAddress", failString));
+            netReadOK = netReadOK && !sendAddress.isNull();
+            
+            int sendPort = iniparser_getboolean(settings, "OSC:SendPort", failInt);
+            netReadOK = netReadOK && sendPort != failInt;
+         
+            IpAddr artNetControllerAddress = ipAddrWithString(iniparser_getstring(settings, "ArtNet:ControllerAddress", failString));
+            netReadOK = netReadOK && !artNetControllerAddress.isNull();
+            
+            IpAddr artNetBroadcastAddress = ipAddrWithString(iniparser_getstring(settings, "ArtNet:BroadcastAddress", failString));
+            netReadOK = netReadOK && !artNetBroadcastAddress.isNull();
+            
+            int inChannelXFade = iniparser_getboolean(settings, "DMX:InChannelXFade", failInt);
+            netReadOK = netReadOK && inChannelXFade != failInt;
+            
+            int inChannelFadeUp = iniparser_getboolean(settings, "DMX:InChannelFadeUp", failInt);
+            netReadOK = netReadOK && inChannelFadeUp != failInt;
+            
+            int outChannelXFade = iniparser_getboolean(settings, "DMX:OutChannelXFade", failInt);
+            netReadOK = netReadOK && outChannelXFade != failInt;
+            
+            int outChannelFadeUp = iniparser_getboolean(settings, "DMX:OutChannelFadeUp", failInt);
+            netReadOK = netReadOK && outChannelFadeUp != failInt;
+            
+            if (netReadOK)
+            {
+                osc.DHCP = DHCP;
+                osc.controllerAddress = controllerAddress;
+                osc.controllerPort = controllerPort;
+                osc.controllerSubnetMask = controllerSubnetMask;
+                osc.controllerGateway = controllerGateway;
+                osc.controllerDNS = controllerDNS;
+        
+                osc.sendAddress = sendAddress;
+                osc.sendPort = sendPort;
+    
+                artNet.controllerAddress = artNetControllerAddress;
+                artNet.broadcastAddress = artNetBroadcastAddress;
+        
+                dmx.inChannelXFade = inChannelXFade;
+                dmx.inChannelFadeUp = inChannelFadeUp;
+                dmx.outChannelXFade = outChannelXFade;
+                dmx.outChannelFadeUp = outChannelFadeUp;
+                
+                success = true;
+            }
+        }
             
         // KEYER
         {
@@ -172,9 +290,7 @@
             
             bool keyParamReadOK = true;
             bool keyParamCleared = false;
-            
-            char* const failString = "Failed to read";
-            const int failInt = -1;
+
             const int stringLength = 11;
             
             // Loop through [Key1,2,...,99] sections
@@ -254,8 +370,6 @@
             bool resolutionReadOK = true;
             bool resolutionCleared = false;
             
-            char* const failString = "Failed to read";
-            const int failInt = -1;
             const int stringLength = 25;
             
             // Loop through [Key1,2,...,99] sections
@@ -318,4 +432,18 @@
     vector<string>          resolutionNames;
     vector<int32_t>         resolutionIndexes;
     vector<int32_t>         resolutionEDIDIndexes;
+    
+    IpAddr ipAddrWithString(const char* ipAsString)
+    {
+        int ip0, ip1, ip2, ip3;
+        
+        int parsedNum = sscanf(ipAsString, "%u.%u.%u.%u", &ip0, &ip1, &ip2, &ip3);
+        
+        if (parsedNum == 4)
+        {
+            return IpAddr(ip0, ip1, ip2, ip3);
+        }
+        
+        return IpAddr();    
+    }
 };
\ No newline at end of file