Uses *spark d-fuser controller hardware as a USB-DMX interface. Developed for visualising Laurel Pardue’s augmented violin with lights.

Dependencies:   DMX mbed spk_oled_ssd1305

Revision:
3:642cd9d00b69
Parent:
2:24d9b7a3073c
Child:
4:c8b23ce175f4
--- a/main.cpp	Thu May 14 00:43:18 2015 +0000
+++ b/main.cpp	Thu May 14 19:57:40 2015 +0000
@@ -43,6 +43,8 @@
 #define kDMX_PARCAN_B 2
 #define kDMX_PARCAN_LUMA 3
 
+#define kDMX_SPOT_DIMMER 31
+
 #define kDMX_HAZER_HAZE 128
 #define kDMX_HAZER_FAN  129
 
@@ -76,7 +78,8 @@
 
 char usbSerialBuffer[kUSBSerialBufferLength];
 int  usbSerialBufferPosition = 0;
-bool newData = false;
+bool newStringData = false;
+bool newBowData = false;
 
 //// LAUREL VIOLIN DATA
 
@@ -104,34 +107,46 @@
 float sMaxFixed = 0.2;
 float sMultiplier = 255.0/sMaxFixed;
 
+float eMaxFixed = 400;
+float eMultiplier = 255.0/eMaxFixed;
+
 void testDMX()
 {
     static char state = 1;
     
-    int address;
-    
-    switch (state)
+    if (state == 5)
+    {
+        dmx.put(kDMX_SPOT_DIMMER, 255);
+    }
+    else
     {
-        case 1: address = kDMX_PARCAN_1; break;
-        case 2: address = kDMX_PARCAN_2; break;
-        case 3: address = kDMX_PARCAN_3; break;
-        case 4: address = kDMX_PARCAN_4; break;
+        dmx.put(kDMX_SPOT_DIMMER, 0);
+        
+        int address;
+        
+        switch (state)
+        {
+            case 1: address = kDMX_PARCAN_1; break;
+            case 2: address = kDMX_PARCAN_2; break;
+            case 3: address = kDMX_PARCAN_3; break;
+            case 4: address = kDMX_PARCAN_4; break;
+        }
+        
+        unsigned char parCanData[4];
+        parCanData[kDMX_PARCAN_R] = 255; 
+        parCanData[kDMX_PARCAN_G] = 255; 
+        parCanData[kDMX_PARCAN_B] = 255;
+        parCanData[kDMX_PARCAN_LUMA] = 0;
+        dmx.put(parCanData, kDMX_PARCAN_1, 4);
+        dmx.put(parCanData, kDMX_PARCAN_2, 4);
+        dmx.put(parCanData, kDMX_PARCAN_3, 4);
+        dmx.put(parCanData, kDMX_PARCAN_4, 4);
+    
+        parCanData[kDMX_PARCAN_LUMA] = 255;
+        dmx.put(parCanData, address, 4);
     }
     
-    unsigned char parCanData[4];
-    parCanData[kDMX_PARCAN_R] = 255; 
-    parCanData[kDMX_PARCAN_G] = 255; 
-    parCanData[kDMX_PARCAN_B] = 255;
-    parCanData[kDMX_PARCAN_LUMA] = 0;
-    dmx.put(parCanData, kDMX_PARCAN_1, 4);
-    dmx.put(parCanData, kDMX_PARCAN_2, 4);
-    dmx.put(parCanData, kDMX_PARCAN_3, 4);
-    dmx.put(parCanData, kDMX_PARCAN_4, 4);
-    
-    parCanData[kDMX_PARCAN_LUMA] = 255;
-    dmx.put(parCanData, address, 4);
-    
-    if (++state > 4) state = 1; 
+    if (++state > 5) state = 1; 
 }
 
 inline void processData()
@@ -177,13 +192,13 @@
             
             if (scanCount == 7)
             {
-                newData = true;
+                newStringData = true;
+                newBowData = true;
                 processData();
             }
             else if (scanCount == 4)
             {
-                // No bow data
-                newData = true;
+                newStringData = true;
                 processData();    
             }
             else
@@ -269,7 +284,7 @@
     // We've finished setting up, now loop this forever...
     while (true) 
     {            
-        if (newData)
+        if (newStringData)
         {   
             char S1DMX = S1 * sMultiplier;
             char S2DMX = S2 * sMultiplier;
@@ -301,7 +316,14 @@
             snprintf(dmxSummary, kStringBufferLength, "S %03u %03u %03u %03u", S1DMX, S2DMX, S3DMX, S4DMX);
             screen.textToBuffer(dmxSummary,6);
             
-            newData = false;
+            newStringData = false;
+        }
+        
+        if (newBowData)
+        {
+            if (EB < 0) EB = 0;
+            char bowDMX = EB * eMultiplier;
+            dmx.put(kDMX_SPOT_DIMMER, bowDMX);    
         }
         
         // Has the button changed?