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

Committer:
tobyspark
Date:
Sat Aug 18 08:22:59 2012 +0000
Revision:
10:c011b0e5c17e
Parent:
9:f83eadd8917a
Child:
11:0783cfbeb746
New TODO for setting keying values from controller

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tobyspark 8:d46cc49f0f37 1 /* *SPARK D-FUSER
tobyspark 8:d46cc49f0f37 2 * A project by Toby Harris
tobyspark 8:d46cc49f0f37 3 *
tobyspark 8:d46cc49f0f37 4 * 'DJ' controller styke RS232 Control for TV-One products
tobyspark 8:d46cc49f0f37 5 * Good for 1T-C2-750, others will need some extra work
tobyspark 8:d46cc49f0f37 6 *
tobyspark 8:d46cc49f0f37 7 * www.sparkav.co.uk/dvimixer
tobyspark 8:d46cc49f0f37 8 */
tobyspark 0:87aab40d5806 9
tobyspark 8:d46cc49f0f37 10 /* Copyright (c) 2011 Toby Harris, MIT License
tobyspark 8:d46cc49f0f37 11 *
tobyspark 8:d46cc49f0f37 12 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
tobyspark 8:d46cc49f0f37 13 * and associated documentation files (the "Software"), to deal in the Software without restriction,
tobyspark 8:d46cc49f0f37 14 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
tobyspark 8:d46cc49f0f37 15 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
tobyspark 8:d46cc49f0f37 16 * furnished to do so, subject to the following conditions:
tobyspark 8:d46cc49f0f37 17 *
tobyspark 8:d46cc49f0f37 18 * The above copyright notice and this permission notice shall be included in all copies or
tobyspark 8:d46cc49f0f37 19 * substantial portions of the Software.
tobyspark 8:d46cc49f0f37 20 *
tobyspark 8:d46cc49f0f37 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
tobyspark 8:d46cc49f0f37 22 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
tobyspark 8:d46cc49f0f37 23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
tobyspark 8:d46cc49f0f37 24 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
tobyspark 8:d46cc49f0f37 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tobyspark 8:d46cc49f0f37 26 */
tobyspark 8:d46cc49f0f37 27
tobyspark 8:d46cc49f0f37 28 /* ROADMAP / HISTORY
tobyspark 8:d46cc49f0f37 29 * v10 - Port to mBed, keying redux - Apr'11
tobyspark 8:d46cc49f0f37 30 * v11 - Sign callbacks, code clean-up - Apr'11
tobyspark 8:d46cc49f0f37 31 * v12 - TVOne header split into two: defines and mbed class. v002 header updates pulled down. Removed sign callbacks, rewrite of debug and signing. - Apr'11
tobyspark 8:d46cc49f0f37 32 * v13 - Menu system for Resolution + Keying implemented, it writing to debug, it sending TVOne commands - Apr'11
tobyspark 8:d46cc49f0f37 33 * v14 - Fixes for new PCB - Oct'11
tobyspark 8:d46cc49f0f37 34 * v15 - TBZ PCB, OLED - Mar'12
tobyspark 8:d46cc49f0f37 35 * v16 - Comms menu, OSC, ArtNet - April'12
tobyspark 8:d46cc49f0f37 36 * v17 - RJ45 - May'12
tobyspark 8:d46cc49f0f37 37 * v18 - DMX - July'12
tobyspark 8:d46cc49f0f37 38 * vxx - TODO: Keying values load from USB mass storage
tobyspark 10:c011b0e5c17e 39 * vxx - TODO: Set keying values from controller, requires a guided, step-through process for user
tobyspark 8:d46cc49f0f37 40 * vxx - TODO: Defaults load/save from USB mass storage
tobyspark 8:d46cc49f0f37 41 * vxx - TODO: EDID upload from USB mass storage
tobyspark 8:d46cc49f0f37 42 * vxx - TODO: EDID creation from resolution
tobyspark 8:d46cc49f0f37 43 */
tobyspark 8:d46cc49f0f37 44
tobyspark 0:87aab40d5806 45 #include "mbed.h"
tobyspark 0:87aab40d5806 46
tobyspark 0:87aab40d5806 47 #include "spk_tvone_mbed.h"
tobyspark 0:87aab40d5806 48 #include "spk_utils.h"
tobyspark 0:87aab40d5806 49 #include "spk_mRotaryEncoder.h"
tobyspark 0:87aab40d5806 50 #include "spk_oled_ssd1305.h"
tobyspark 2:50043054e4f7 51 #include "spk_oled_gfx.h"
tobyspark 1:f9fca21102e0 52 #include "EthernetNetIf.h"
tobyspark 1:f9fca21102e0 53 #include "mbedOSC.h"
tobyspark 3:033d2b7768f3 54 #include "DmxArtNet.h"
tobyspark 5:f8b285ca41ba 55 #include "DMX.h"
tobyspark 0:87aab40d5806 56
tobyspark 0:87aab40d5806 57 #include <sstream>
tobyspark 0:87aab40d5806 58
tobyspark 5:f8b285ca41ba 59 // MBED PINS
tobyspark 5:f8b285ca41ba 60
tobyspark 5:f8b285ca41ba 61 #define kMBED_AIN_XFADE p20
tobyspark 5:f8b285ca41ba 62 #define kMBED_AIN_FADEUP p19
tobyspark 5:f8b285ca41ba 63 #define kMBED_DIN_TAP_L p24
tobyspark 5:f8b285ca41ba 64 #define kMBED_DIN_TAP_R p23
tobyspark 5:f8b285ca41ba 65 #define kMBED_ENC_SW p15
tobyspark 5:f8b285ca41ba 66 #define kMBED_ENC_A p16
tobyspark 5:f8b285ca41ba 67 #define kMBED_ENC_B p17
tobyspark 5:f8b285ca41ba 68
tobyspark 5:f8b285ca41ba 69 #define kMBED_RS232_TTLTX p13
tobyspark 5:f8b285ca41ba 70 #define kMBED_RS232_TTLRX p14
tobyspark 5:f8b285ca41ba 71
tobyspark 5:f8b285ca41ba 72 #define kMBED_OLED_MOSI p5
tobyspark 5:f8b285ca41ba 73 #define kMBED_OLED_SCK p7
tobyspark 5:f8b285ca41ba 74 #define kMBED_OLED_CS p8
tobyspark 5:f8b285ca41ba 75 #define kMBED_OLED_RES p9
tobyspark 5:f8b285ca41ba 76 #define kMBED_OLED_DC p10
tobyspark 5:f8b285ca41ba 77
tobyspark 5:f8b285ca41ba 78 #define kMBED_DIN_ETHLO_DMXHI p30
tobyspark 5:f8b285ca41ba 79 #define kMBED_DOUT_RS485_TXHI_RXLO p29
tobyspark 5:f8b285ca41ba 80 #define kMBED_RS485_TTLTX p28
tobyspark 5:f8b285ca41ba 81 #define kMBED_RS485_TTLRX p27
tobyspark 5:f8b285ca41ba 82
tobyspark 5:f8b285ca41ba 83 // DISPLAY
tobyspark 5:f8b285ca41ba 84
tobyspark 1:f9fca21102e0 85 #define kMenuLine1 3
tobyspark 1:f9fca21102e0 86 #define kMenuLine2 4
tobyspark 1:f9fca21102e0 87 #define kCommsStatusLine 6
tobyspark 1:f9fca21102e0 88 #define kTVOneStatusLine 7
tobyspark 1:f9fca21102e0 89
tobyspark 5:f8b285ca41ba 90 // NETWORKING
tobyspark 5:f8b285ca41ba 91
tobyspark 1:f9fca21102e0 92 #define kOSCMbedPort 10000
tobyspark 1:f9fca21102e0 93 #define kOSCMbedIPAddress 10,0,0,2
tobyspark 1:f9fca21102e0 94 #define kOSCMbedSubnetMask 255,255,255,0
tobyspark 1:f9fca21102e0 95 #define kOSCMbedGateway 10,0,0,1
tobyspark 1:f9fca21102e0 96 #define kOSCMbedDNS 10,0,0,1
tobyspark 0:87aab40d5806 97
tobyspark 3:033d2b7768f3 98 #define kArtNetBindIPAddress 2,0,0,100
tobyspark 3:033d2b7768f3 99 #define kArtNetBroadcastAddress 2,255,255,255
tobyspark 3:033d2b7768f3 100
tobyspark 5:f8b285ca41ba 101 #define kDMXInChannelXFade 0
tobyspark 5:f8b285ca41ba 102 #define kDMXInChannelFadeUp 1
tobyspark 5:f8b285ca41ba 103 #define kDMXOutChannelXFade 0
tobyspark 5:f8b285ca41ba 104 #define kDMXOutChannelFadeUp 1
tobyspark 5:f8b285ca41ba 105
tobyspark 0:87aab40d5806 106 //// DEBUG
tobyspark 0:87aab40d5806 107
tobyspark 0:87aab40d5806 108 // Comment out one or the other...
tobyspark 5:f8b285ca41ba 109 //Serial *debug = new Serial(USBTX, USBRX); // For debugging via USB serial
tobyspark 5:f8b285ca41ba 110 Serial *debug = NULL; // For release (no debugging)
tobyspark 0:87aab40d5806 111
tobyspark 0:87aab40d5806 112 //// mBED PIN ASSIGNMENTS
tobyspark 0:87aab40d5806 113
tobyspark 0:87aab40d5806 114 // Inputs
tobyspark 5:f8b285ca41ba 115 AnalogIn xFadeAIN(kMBED_AIN_XFADE);
tobyspark 5:f8b285ca41ba 116 AnalogIn fadeUpAIN(kMBED_AIN_FADEUP);
tobyspark 5:f8b285ca41ba 117 DigitalIn tapLeftDIN(kMBED_DIN_TAP_L);
tobyspark 5:f8b285ca41ba 118 DigitalIn tapRightDIN(kMBED_DIN_TAP_R);
tobyspark 0:87aab40d5806 119
tobyspark 5:f8b285ca41ba 120 SPKRotaryEncoder menuEnc(kMBED_ENC_A, kMBED_ENC_B, kMBED_ENC_SW);
tobyspark 5:f8b285ca41ba 121
tobyspark 5:f8b285ca41ba 122 DigitalIn rj45ModeDIN(kMBED_DIN_ETHLO_DMXHI);
tobyspark 0:87aab40d5806 123
tobyspark 0:87aab40d5806 124 // Outputs
tobyspark 0:87aab40d5806 125 PwmOut fadeAPO(LED1);
tobyspark 0:87aab40d5806 126 PwmOut fadeBPO(LED2);
tobyspark 0:87aab40d5806 127
tobyspark 5:f8b285ca41ba 128 DigitalOut dmxDirectionDOUT(kMBED_DOUT_RS485_TXHI_RXLO);
tobyspark 5:f8b285ca41ba 129
tobyspark 0:87aab40d5806 130 // SPKTVOne(PinName txPin, PinName rxPin, PinName signWritePin, PinName signErrorPin, Serial *debugSerial)
tobyspark 5:f8b285ca41ba 131 SPKTVOne tvOne(kMBED_RS232_TTLTX, kMBED_RS232_TTLRX, LED3, LED4, debug);
tobyspark 0:87aab40d5806 132
tobyspark 0:87aab40d5806 133 // SPKDisplay(PinName mosi, PinName clk, PinName cs, PinName dc, PinName res, Serial *debugSerial = NULL);
tobyspark 5:f8b285ca41ba 134 SPKDisplay screen(kMBED_OLED_MOSI, kMBED_OLED_SCK, kMBED_OLED_CS, kMBED_OLED_DC, kMBED_OLED_RES, debug);
tobyspark 0:87aab40d5806 135
tobyspark 0:87aab40d5806 136 // Menu
tobyspark 0:87aab40d5806 137 SPKMenu *selectedMenu;
tobyspark 0:87aab40d5806 138 SPKMenu *lastSelectedMenu;
tobyspark 0:87aab40d5806 139 SPKMenuOfMenus mainMenu;
tobyspark 0:87aab40d5806 140 SPKMenuPayload resolutionMenu;
tobyspark 0:87aab40d5806 141 SPKMenuPayload mixModeMenu;
tobyspark 5:f8b285ca41ba 142 enum { blend, additive, lumaKey, chromaKey1, chromaKey2, chromaKey3 }; // additive will require custom TVOne firmware.
tobyspark 5:f8b285ca41ba 143 int mixMode = blend;
tobyspark 1:f9fca21102e0 144 SPKMenuPayload commsMenu;
tobyspark 5:f8b285ca41ba 145 enum { commsNone, commsOSC, commsArtNet, commsDMXIn, commsDMXOut};
tobyspark 5:f8b285ca41ba 146 int commsMode = commsNone;
tobyspark 1:f9fca21102e0 147
tobyspark 5:f8b285ca41ba 148 // RJ45 Comms
tobyspark 5:f8b285ca41ba 149 enum { rj45Ethernet = 0, rj45DMX = 1}; // These values from circuit
tobyspark 5:f8b285ca41ba 150 int rj45Mode = -1;
tobyspark 1:f9fca21102e0 151 EthernetNetIf *ethernet = NULL;
tobyspark 1:f9fca21102e0 152 OSCClass *osc = NULL;
tobyspark 3:033d2b7768f3 153 OSCMessage recMessage;
tobyspark 3:033d2b7768f3 154 DmxArtNet *artNet = NULL;
tobyspark 5:f8b285ca41ba 155 DMX *dmx = NULL;
tobyspark 0:87aab40d5806 156
tobyspark 3:033d2b7768f3 157 // Fade logic constants
tobyspark 0:87aab40d5806 158 const float xFadeTolerance = 0.05;
tobyspark 0:87aab40d5806 159 const float fadeUpTolerance = 0.05;
tobyspark 0:87aab40d5806 160
tobyspark 0:87aab40d5806 161 // A&B Fade as resolved percent
tobyspark 0:87aab40d5806 162 int fadeAPercent = 0;
tobyspark 0:87aab40d5806 163 int fadeBPercent = 0;
tobyspark 0:87aab40d5806 164
tobyspark 0:87aab40d5806 165 // Tap button states
tobyspark 5:f8b285ca41ba 166 bool tapLeftWasFirstPressed = false;
tobyspark 0:87aab40d5806 167
tobyspark 0:87aab40d5806 168 // Key mode parameters
tobyspark 0:87aab40d5806 169 int keyerParamsSet = -1; // last keyParams index uploaded to unit
tobyspark 0:87aab40d5806 170 // {lumakey, chroma on blue [, to be extended as needed] }
tobyspark 0:87aab40d5806 171 // {minY, maxY, minU, maxU, minV, maxV }
tobyspark 0:87aab40d5806 172 int keyerParams[2][6] =
tobyspark 0:87aab40d5806 173 {
tobyspark 0:87aab40d5806 174 {0, 18, 128, 129, 128, 129}, // lumakey
tobyspark 9:f83eadd8917a 175 {30, 35, 237, 242, 114, 121} // chroma on blue
tobyspark 0:87aab40d5806 176 // ...
tobyspark 0:87aab40d5806 177 };
tobyspark 0:87aab40d5806 178
tobyspark 3:033d2b7768f3 179 void processOSC(float &xFade, float &fadeUp) {
tobyspark 3:033d2b7768f3 180 std::stringstream statusMessage;
tobyspark 3:033d2b7768f3 181 statusMessage.setf(ios::fixed,ios::floatfield);
tobyspark 3:033d2b7768f3 182 statusMessage.precision(2);
tobyspark 3:033d2b7768f3 183
tobyspark 3:033d2b7768f3 184 if (!strcmp( recMessage.getTopAddress() , "dvimxr" ))
tobyspark 3:033d2b7768f3 185 {
tobyspark 3:033d2b7768f3 186 statusMessage << "OSC: /dvimxr";
tobyspark 3:033d2b7768f3 187 if (!strcmp( recMessage.getSubAddress() , "xFade" ))
tobyspark 3:033d2b7768f3 188 if (recMessage.getArgNum() == 1)
tobyspark 3:033d2b7768f3 189 if (recMessage.getTypeTag(0) == 'f')
tobyspark 3:033d2b7768f3 190 {
tobyspark 3:033d2b7768f3 191 double newXFade = recMessage.getArgFloat(0);
tobyspark 3:033d2b7768f3 192 statusMessage << "/xFade " << newXFade;
tobyspark 3:033d2b7768f3 193 xFade = newXFade;
tobyspark 3:033d2b7768f3 194 }
tobyspark 3:033d2b7768f3 195 else if (!strcmp( recMessage.getSubAddress() , "fadeUp" ))
tobyspark 3:033d2b7768f3 196 if (recMessage.getArgNum() == 1)
tobyspark 3:033d2b7768f3 197 if (recMessage.getTypeTag(0) == 'f')
tobyspark 3:033d2b7768f3 198 {
tobyspark 3:033d2b7768f3 199 double newFadeUp = recMessage.getArgFloat(0);
tobyspark 3:033d2b7768f3 200 statusMessage << "/fadeUp " << newFadeUp;
tobyspark 3:033d2b7768f3 201 xFade = newFadeUp;
tobyspark 3:033d2b7768f3 202 }
tobyspark 3:033d2b7768f3 203 else statusMessage << recMessage.getSubAddress() << " - Ignoring";
tobyspark 3:033d2b7768f3 204 }
tobyspark 3:033d2b7768f3 205 else
tobyspark 3:033d2b7768f3 206 {
tobyspark 3:033d2b7768f3 207 statusMessage << "OSC: " << recMessage.getTopAddress() << " - Ignoring";
tobyspark 3:033d2b7768f3 208 }
tobyspark 3:033d2b7768f3 209
tobyspark 3:033d2b7768f3 210 screen.clearBufferRow(kCommsStatusLine);
tobyspark 3:033d2b7768f3 211 screen.textToBuffer(statusMessage.str(), kCommsStatusLine);
tobyspark 3:033d2b7768f3 212 screen.sendBuffer();
tobyspark 3:033d2b7768f3 213 if (debug) debug->printf("%s \r\n", statusMessage.str().c_str());
tobyspark 3:033d2b7768f3 214
tobyspark 3:033d2b7768f3 215 }
tobyspark 3:033d2b7768f3 216
tobyspark 8:d46cc49f0f37 217 void processArtNet(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 218 {
tobyspark 3:033d2b7768f3 219 screen.clearBufferRow(kCommsStatusLine);
tobyspark 3:033d2b7768f3 220 screen.textToBuffer("ArtNet activity", kCommsStatusLine);
tobyspark 3:033d2b7768f3 221 screen.sendBuffer();
tobyspark 3:033d2b7768f3 222 if (debug) debug->printf("ArtNet activity");
tobyspark 3:033d2b7768f3 223 }
tobyspark 0:87aab40d5806 224
tobyspark 8:d46cc49f0f37 225 void processDMXIn(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 226 {
tobyspark 5:f8b285ca41ba 227 std::stringstream statusMessage;
tobyspark 5:f8b285ca41ba 228
tobyspark 5:f8b285ca41ba 229 int xFadeDMX = dmx->get(kDMXInChannelXFade);
tobyspark 7:e6717468c18d 230 int fadeUpDMX = dmx->get(kDMXInChannelFadeUp);
tobyspark 5:f8b285ca41ba 231
tobyspark 5:f8b285ca41ba 232 xFade = (float)xFadeDMX/255;
tobyspark 5:f8b285ca41ba 233 fadeUp = (float)fadeUpDMX/255;
tobyspark 5:f8b285ca41ba 234
tobyspark 5:f8b285ca41ba 235 screen.clearBufferRow(kCommsStatusLine);
tobyspark 5:f8b285ca41ba 236 statusMessage << "DMX In: xF " << xFadeDMX << " fUp " << fadeUpDMX;
tobyspark 5:f8b285ca41ba 237 screen.textToBuffer(statusMessage.str(), kCommsStatusLine);
tobyspark 5:f8b285ca41ba 238 screen.sendBuffer();
tobyspark 5:f8b285ca41ba 239 if (debug) debug->printf(statusMessage.str().c_str());
tobyspark 5:f8b285ca41ba 240 }
tobyspark 5:f8b285ca41ba 241
tobyspark 8:d46cc49f0f37 242 void processDMXOut(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 243 {
tobyspark 5:f8b285ca41ba 244 std::stringstream statusMessage;
tobyspark 5:f8b285ca41ba 245
tobyspark 5:f8b285ca41ba 246 int xFadeDMX = xFade*255;
tobyspark 5:f8b285ca41ba 247 int fadeUpDMX = fadeUp*255;
tobyspark 5:f8b285ca41ba 248
tobyspark 5:f8b285ca41ba 249 dmx->put(kDMXOutChannelXFade, xFadeDMX);
tobyspark 5:f8b285ca41ba 250 dmx->put(kDMXOutChannelFadeUp, fadeUpDMX);
tobyspark 5:f8b285ca41ba 251
tobyspark 5:f8b285ca41ba 252 screen.clearBufferRow(kCommsStatusLine);
tobyspark 5:f8b285ca41ba 253 statusMessage << "DMX Out: xF " << xFadeDMX << " fUp " << fadeUpDMX;
tobyspark 5:f8b285ca41ba 254 screen.textToBuffer(statusMessage.str(), kCommsStatusLine);
tobyspark 5:f8b285ca41ba 255 screen.sendBuffer();
tobyspark 5:f8b285ca41ba 256 if (debug) debug->printf(statusMessage.str().c_str());
tobyspark 5:f8b285ca41ba 257 }
tobyspark 0:87aab40d5806 258
tobyspark 8:d46cc49f0f37 259 inline float fadeCalc (const float AIN, const float tolerance)
tobyspark 8:d46cc49f0f37 260 {
tobyspark 0:87aab40d5806 261 float pos ;
tobyspark 0:87aab40d5806 262 if (AIN < tolerance) pos = 0;
tobyspark 0:87aab40d5806 263 else if (AIN > 1.0 - tolerance) pos = 1;
tobyspark 0:87aab40d5806 264 else pos = (AIN - tolerance) / (1 - 2*tolerance);
tobyspark 0:87aab40d5806 265 if (debug && false) debug->printf("fadeCalc in: %f out: %f \r\n", AIN, pos);
tobyspark 0:87aab40d5806 266 return pos;
tobyspark 0:87aab40d5806 267 }
tobyspark 0:87aab40d5806 268
tobyspark 8:d46cc49f0f37 269 bool setKeyParamsTo(int index)
tobyspark 8:d46cc49f0f37 270 {
tobyspark 0:87aab40d5806 271 // Only spend the time uploading six parameters if we need to
tobyspark 0:87aab40d5806 272 // Might want to bounds check here
tobyspark 0:87aab40d5806 273
tobyspark 9:f83eadd8917a 274 bool ok;
tobyspark 0:87aab40d5806 275
tobyspark 0:87aab40d5806 276 if (index != keyerParamsSet)
tobyspark 0:87aab40d5806 277 {
tobyspark 0:87aab40d5806 278 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, keyerParams[index][0]);
tobyspark 0:87aab40d5806 279 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, keyerParams[index][1]);
tobyspark 0:87aab40d5806 280 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, keyerParams[index][2]);
tobyspark 0:87aab40d5806 281 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, keyerParams[index][3]);
tobyspark 0:87aab40d5806 282 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, keyerParams[index][4]);
tobyspark 0:87aab40d5806 283 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, keyerParams[index][5]);
tobyspark 0:87aab40d5806 284
tobyspark 0:87aab40d5806 285 keyerParamsSet = index;
tobyspark 9:f83eadd8917a 286 }
tobyspark 9:f83eadd8917a 287 else
tobyspark 9:f83eadd8917a 288 {
tobyspark 9:f83eadd8917a 289 ok = true;
tobyspark 9:f83eadd8917a 290 }
tobyspark 0:87aab40d5806 291
tobyspark 0:87aab40d5806 292 return ok;
tobyspark 0:87aab40d5806 293 }
tobyspark 0:87aab40d5806 294
tobyspark 0:87aab40d5806 295 int main()
tobyspark 0:87aab40d5806 296 {
tobyspark 0:87aab40d5806 297 if (debug)
tobyspark 0:87aab40d5806 298 {
tobyspark 0:87aab40d5806 299 debug->printf("\r\n\r\n");
tobyspark 0:87aab40d5806 300 debug->printf("*spark d-fuser -----------\r\n");
tobyspark 0:87aab40d5806 301 debug->printf(" debug channel\r\n");
tobyspark 0:87aab40d5806 302 }
tobyspark 2:50043054e4f7 303
tobyspark 2:50043054e4f7 304 // Set display font
tobyspark 2:50043054e4f7 305 screen.fontStartCharacter = &characterBytesStartChar;
tobyspark 2:50043054e4f7 306 screen.fontEndCharacter = &characterBytesEndChar;
tobyspark 2:50043054e4f7 307 screen.fontCharacters = characterBytes;
tobyspark 2:50043054e4f7 308
tobyspark 0:87aab40d5806 309 // Splash screen
tobyspark 2:50043054e4f7 310 screen.imageToBuffer(spkDisplayLogo);
tobyspark 0:87aab40d5806 311 screen.textToBuffer("SPK:D-Fuser",0);
tobyspark 5:f8b285ca41ba 312 screen.textToBuffer("SW beta.18",1);
tobyspark 5:f8b285ca41ba 313 screen.sendBuffer();
tobyspark 0:87aab40d5806 314
tobyspark 0:87aab40d5806 315 // Set menu structure
tobyspark 0:87aab40d5806 316 mixModeMenu.title = "Mix Mode";
tobyspark 0:87aab40d5806 317 mixModeMenu.addMenuItem("Blend", blend, 0);
tobyspark 0:87aab40d5806 318 mixModeMenu.addMenuItem("LumaKey", lumaKey, 0);
tobyspark 0:87aab40d5806 319 mixModeMenu.addMenuItem("ChromaKey - Blue", chromaKey1, 0);
tobyspark 0:87aab40d5806 320
tobyspark 0:87aab40d5806 321 resolutionMenu.title = "Resolution";
tobyspark 0:87aab40d5806 322 resolutionMenu.addMenuItem(kTV1ResolutionDescriptionVGA, kTV1ResolutionVGA, 5);
tobyspark 0:87aab40d5806 323 resolutionMenu.addMenuItem(kTV1ResolutionDescriptionSVGA, kTV1ResolutionSVGA, 5);
tobyspark 0:87aab40d5806 324 resolutionMenu.addMenuItem(kTV1ResolutionDescriptionXGAp60, kTV1ResolutionXGAp60, 5);
tobyspark 0:87aab40d5806 325 resolutionMenu.addMenuItem(kTV1ResolutionDescriptionWSXGAPLUSp60, kTV1ResolutionWSXGAPLUSp60, 5);
tobyspark 0:87aab40d5806 326 resolutionMenu.addMenuItem(kTV1ResolutionDescriptionWUXGAp60, kTV1ResolutionWUXGAp60, 5);
tobyspark 0:87aab40d5806 327 resolutionMenu.addMenuItem(kTV1ResolutionDescription720p60, kTV1Resolution720p60, 5);
tobyspark 0:87aab40d5806 328 resolutionMenu.addMenuItem(kTV1ResolutionDescription1080p60, kTV1Resolution1080p60, 5);
tobyspark 0:87aab40d5806 329 resolutionMenu.addMenuItem(kTV1ResolutionDescriptionDualHeadSVGAp60, kTV1ResolutionDualHeadSVGAp60, 0);
tobyspark 0:87aab40d5806 330 resolutionMenu.addMenuItem(kTV1ResolutionDescriptionDualHeadXGAp60, kTV1ResolutionDualHeadXGAp60, 0);
tobyspark 0:87aab40d5806 331 resolutionMenu.addMenuItem(kTV1ResolutionDescriptionTripleHeadVGAp60, kTV1ResolutionTripleHeadVGAp60, 0);
tobyspark 0:87aab40d5806 332
tobyspark 5:f8b285ca41ba 333 commsMenu.title = "Network Mode";
tobyspark 1:f9fca21102e0 334 commsMenu.addMenuItem("None", commsNone, 0);
tobyspark 1:f9fca21102e0 335 commsMenu.addMenuItem("OSC", commsOSC, 0);
tobyspark 1:f9fca21102e0 336 commsMenu.addMenuItem("ArtNet", commsArtNet, 0);
tobyspark 5:f8b285ca41ba 337 commsMenu.addMenuItem("DMX In", commsDMXIn, 0);
tobyspark 5:f8b285ca41ba 338 commsMenu.addMenuItem("DMX Out", commsDMXOut, 0);
tobyspark 1:f9fca21102e0 339
tobyspark 0:87aab40d5806 340 mainMenu.title = "Main Menu";
tobyspark 0:87aab40d5806 341 mainMenu.addMenuItem(&mixModeMenu);
tobyspark 0:87aab40d5806 342 mainMenu.addMenuItem(&resolutionMenu);
tobyspark 1:f9fca21102e0 343 mainMenu.addMenuItem(&commsMenu);
tobyspark 0:87aab40d5806 344
tobyspark 0:87aab40d5806 345 selectedMenu = &mainMenu;
tobyspark 0:87aab40d5806 346 lastSelectedMenu = &mainMenu;
tobyspark 0:87aab40d5806 347
tobyspark 0:87aab40d5806 348 // Misc I/O stuff
tobyspark 0:87aab40d5806 349
tobyspark 0:87aab40d5806 350 fadeAPO.period(0.001);
tobyspark 0:87aab40d5806 351 fadeBPO.period(0.001);
tobyspark 0:87aab40d5806 352
tobyspark 0:87aab40d5806 353 // TVOne setup
tobyspark 0:87aab40d5806 354
tobyspark 9:f83eadd8917a 355 bool ok = true;
tobyspark 0:87aab40d5806 356
tobyspark 0:87aab40d5806 357 // horrid, horrid HDCP
tobyspark 0:87aab40d5806 358 ok = tvOne.setHDCPOff();
tobyspark 0:87aab40d5806 359
tobyspark 0:87aab40d5806 360 std::string sendOK = ok ? "Sent: HDCP Off" : "Send Error: HDCP Off";
tobyspark 0:87aab40d5806 361
tobyspark 0:87aab40d5806 362 // display menu and framing lines
tobyspark 0:87aab40d5806 363 screen.horizLineToBuffer(kMenuLine1*pixInPage - 1);
tobyspark 0:87aab40d5806 364 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 365 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 366 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 367 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 368 screen.horizLineToBuffer(kMenuLine2*pixInPage + pixInPage);
tobyspark 1:f9fca21102e0 369 screen.horizLineToBuffer(kCommsStatusLine*pixInPage - 1);
tobyspark 1:f9fca21102e0 370 screen.clearBufferRow(kCommsStatusLine);
tobyspark 1:f9fca21102e0 371 screen.textToBuffer(commsMenu.selectedString(), kCommsStatusLine);
tobyspark 1:f9fca21102e0 372 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 1:f9fca21102e0 373 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 0:87aab40d5806 374 screen.sendBuffer();
tobyspark 0:87aab40d5806 375
tobyspark 0:87aab40d5806 376
tobyspark 0:87aab40d5806 377 //// CONTROLS TEST
tobyspark 0:87aab40d5806 378
tobyspark 0:87aab40d5806 379 while (0) {
tobyspark 0:87aab40d5806 380 if (debug) debug->printf("xFade: %f, fadeOut: %f, tapLeft %i, tapRight: %i encPos: %i encChange:%i encHasPressed:%i \r\n" , xFadeAIN.read(), fadeUpAIN.read(), tapLeftDIN.read(), tapRightDIN.read(), menuEnc.getPos(), menuEnc.getChange(), menuEnc.hasPressed());
tobyspark 0:87aab40d5806 381 }
tobyspark 0:87aab40d5806 382
tobyspark 0:87aab40d5806 383 //// MIXER RUN
tobyspark 0:87aab40d5806 384
tobyspark 8:d46cc49f0f37 385 while (1)
tobyspark 8:d46cc49f0f37 386 {
tobyspark 1:f9fca21102e0 387 //// Task background things
tobyspark 5:f8b285ca41ba 388 if (ethernet && rj45Mode == rj45Ethernet)
tobyspark 5:f8b285ca41ba 389 {
tobyspark 5:f8b285ca41ba 390 if (debug) debug->printf("net poll");
tobyspark 5:f8b285ca41ba 391 Net::poll();
tobyspark 5:f8b285ca41ba 392 }
tobyspark 5:f8b285ca41ba 393
tobyspark 5:f8b285ca41ba 394 //// RJ45 SWITCH
tobyspark 5:f8b285ca41ba 395
tobyspark 5:f8b285ca41ba 396 if (rj45ModeDIN != rj45Mode)
tobyspark 1:f9fca21102e0 397 {
tobyspark 5:f8b285ca41ba 398 // update state
tobyspark 5:f8b285ca41ba 399 rj45Mode = rj45ModeDIN;
tobyspark 5:f8b285ca41ba 400 if (rj45Mode == rj45Ethernet) commsMenu.title = "Network Mode [Ethernet]";
tobyspark 5:f8b285ca41ba 401 if (rj45Mode == rj45DMX) commsMenu.title = "Network Mode [DMX]";
tobyspark 5:f8b285ca41ba 402
tobyspark 5:f8b285ca41ba 403 // cancel old comms
tobyspark 5:f8b285ca41ba 404 commsMode = commsNone;
tobyspark 5:f8b285ca41ba 405 commsMenu = commsMode;
tobyspark 5:f8b285ca41ba 406
tobyspark 5:f8b285ca41ba 407 // refresh display
tobyspark 5:f8b285ca41ba 408 if (selectedMenu == &commsMenu) screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 5:f8b285ca41ba 409 if (rj45Mode == rj45Ethernet) screen.textToBuffer("RJ45: Ethernet Engaged", kCommsStatusLine);
tobyspark 5:f8b285ca41ba 410 if (rj45Mode == rj45DMX) screen.textToBuffer("RJ45: DMX Engaged", kCommsStatusLine);
tobyspark 1:f9fca21102e0 411 }
tobyspark 1:f9fca21102e0 412
tobyspark 0:87aab40d5806 413 //// MENU
tobyspark 0:87aab40d5806 414
tobyspark 0:87aab40d5806 415 int menuChange = menuEnc.getChange();
tobyspark 0:87aab40d5806 416
tobyspark 0:87aab40d5806 417 // Update GUI
tobyspark 0:87aab40d5806 418 if (menuChange != 0)
tobyspark 0:87aab40d5806 419 {
tobyspark 0:87aab40d5806 420 if (debug) debug->printf("Menu changed by %i\r\n", menuChange);
tobyspark 0:87aab40d5806 421
tobyspark 0:87aab40d5806 422 *selectedMenu = selectedMenu->selectedIndex() + menuChange;
tobyspark 0:87aab40d5806 423
tobyspark 0:87aab40d5806 424 // update OLED line 2 here
tobyspark 0:87aab40d5806 425 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 426 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 427
tobyspark 0:87aab40d5806 428 if (debug) debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 429 }
tobyspark 0:87aab40d5806 430
tobyspark 0:87aab40d5806 431 // Action menu item
tobyspark 0:87aab40d5806 432 if (menuEnc.hasPressed())
tobyspark 0:87aab40d5806 433 {
tobyspark 0:87aab40d5806 434 if (debug) debug->printf("Action Menu Item!\r\n");
tobyspark 0:87aab40d5806 435
tobyspark 0:87aab40d5806 436 // Are we changing menus?
tobyspark 0:87aab40d5806 437 if (selectedMenu->type() == menuOfMenus)
tobyspark 0:87aab40d5806 438 {
tobyspark 0:87aab40d5806 439 // point selected menu to the new menu
tobyspark 0:87aab40d5806 440 // FIXME. Make this function abstract virtual of base class or get dynamic_cast working. BTW: C++ sucks / Obj-c rocks / Right now.
tobyspark 0:87aab40d5806 441 if (selectedMenu == &mainMenu) selectedMenu = mainMenu.selectedMenu();
tobyspark 0:87aab40d5806 442 else if (debug) debug->printf("FIXME: You've missed a SPKMenuOfMenus");
tobyspark 0:87aab40d5806 443
tobyspark 0:87aab40d5806 444 // reset the selection within that menu to the first position
tobyspark 0:87aab40d5806 445 (*selectedMenu) = 0;
tobyspark 0:87aab40d5806 446
tobyspark 0:87aab40d5806 447 // update OLED lines 1&2
tobyspark 0:87aab40d5806 448 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 449 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 450 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 451 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 452
tobyspark 0:87aab40d5806 453 if (debug)
tobyspark 0:87aab40d5806 454 {
tobyspark 0:87aab40d5806 455 debug->printf("\r\n");
tobyspark 0:87aab40d5806 456 debug->printf("%s \r\n", selectedMenu->title.c_str());
tobyspark 0:87aab40d5806 457 debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 458 }
tobyspark 0:87aab40d5806 459 }
tobyspark 0:87aab40d5806 460 // Are we cancelling?
tobyspark 0:87aab40d5806 461 else if (selectedMenu->type() == payload && selectedMenu->selectedIndex() == 0)
tobyspark 0:87aab40d5806 462 {
tobyspark 0:87aab40d5806 463 selectedMenu = lastSelectedMenu;
tobyspark 0:87aab40d5806 464
tobyspark 0:87aab40d5806 465 // update OLED lines 1&2
tobyspark 0:87aab40d5806 466 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 467 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 468 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 469 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 470
tobyspark 0:87aab40d5806 471 if (debug)
tobyspark 0:87aab40d5806 472 {
tobyspark 0:87aab40d5806 473 debug->printf("\r\n");
tobyspark 0:87aab40d5806 474 debug->printf("%s \r\n", selectedMenu->title.c_str());
tobyspark 0:87aab40d5806 475 debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 476 }
tobyspark 0:87aab40d5806 477 }
tobyspark 0:87aab40d5806 478 // With that out of the way, we should be actioning a specific menu's payload?
tobyspark 0:87aab40d5806 479 else if (selectedMenu == &mixModeMenu)
tobyspark 0:87aab40d5806 480 {
tobyspark 5:f8b285ca41ba 481 mixMode = mixModeMenu.selectedPayload1();
tobyspark 5:f8b285ca41ba 482
tobyspark 9:f83eadd8917a 483 bool ok = true;
tobyspark 0:87aab40d5806 484 std::string sentOK;
tobyspark 0:87aab40d5806 485 std::stringstream sentMSG;
tobyspark 0:87aab40d5806 486
tobyspark 0:87aab40d5806 487 // Set keying parameters
tobyspark 0:87aab40d5806 488 switch (mixModeMenu.selectedPayload1()) {
tobyspark 0:87aab40d5806 489 case lumaKey:
tobyspark 0:87aab40d5806 490 ok = setKeyParamsTo(0);
tobyspark 0:87aab40d5806 491 sentMSG << "Keyer Params 0, ";
tobyspark 0:87aab40d5806 492 break;
tobyspark 0:87aab40d5806 493 case chromaKey1:
tobyspark 0:87aab40d5806 494 ok = setKeyParamsTo(1);
tobyspark 0:87aab40d5806 495 sentMSG << "Keyer Params 1, ";
tobyspark 0:87aab40d5806 496 break;
tobyspark 0:87aab40d5806 497 }
tobyspark 0:87aab40d5806 498
tobyspark 0:87aab40d5806 499 // Set keying on or off
tobyspark 0:87aab40d5806 500 switch (mixModeMenu.selectedPayload1()) {
tobyspark 0:87aab40d5806 501 case blend:
tobyspark 0:87aab40d5806 502 case additive:
tobyspark 0:87aab40d5806 503 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
tobyspark 0:87aab40d5806 504 sentMSG << "Keyer Off";
tobyspark 0:87aab40d5806 505 break;
tobyspark 0:87aab40d5806 506 case lumaKey:
tobyspark 0:87aab40d5806 507 case chromaKey1:
tobyspark 0:87aab40d5806 508 case chromaKey2:
tobyspark 0:87aab40d5806 509 case chromaKey3:
tobyspark 0:87aab40d5806 510 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
tobyspark 0:87aab40d5806 511 sentMSG << "Keyer On";
tobyspark 0:87aab40d5806 512 break;
tobyspark 0:87aab40d5806 513 }
tobyspark 0:87aab40d5806 514
tobyspark 0:87aab40d5806 515 if (ok) sentOK = "Sent:";
tobyspark 0:87aab40d5806 516 else sentOK = "Send Error:";
tobyspark 0:87aab40d5806 517
tobyspark 1:f9fca21102e0 518 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 1:f9fca21102e0 519 screen.textToBuffer(sentOK + sentMSG.str(), kTVOneStatusLine);
tobyspark 0:87aab40d5806 520
tobyspark 0:87aab40d5806 521 if (debug) { debug->printf("Changing mix mode"); }
tobyspark 0:87aab40d5806 522 }
tobyspark 0:87aab40d5806 523 else if (selectedMenu == &resolutionMenu)
tobyspark 0:87aab40d5806 524 {
tobyspark 9:f83eadd8917a 525 bool ok = true;
tobyspark 0:87aab40d5806 526
tobyspark 0:87aab40d5806 527 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputResolution, resolutionMenu.selectedPayload1());
tobyspark 0:87aab40d5806 528 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, resolutionMenu.selectedPayload2());
tobyspark 0:87aab40d5806 529 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, resolutionMenu.selectedPayload2());
tobyspark 0:87aab40d5806 530
tobyspark 0:87aab40d5806 531 std::string sentOK;
tobyspark 0:87aab40d5806 532 if (ok) sentOK = "Sent: ";
tobyspark 0:87aab40d5806 533 else sentOK = "Send Error: ";
tobyspark 0:87aab40d5806 534
tobyspark 0:87aab40d5806 535 std::stringstream sentMSG;
tobyspark 0:87aab40d5806 536 sentMSG << "Res " << resolutionMenu.selectedPayload1() << ", EDID " << resolutionMenu.selectedPayload2();
tobyspark 0:87aab40d5806 537
tobyspark 1:f9fca21102e0 538 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 1:f9fca21102e0 539 screen.textToBuffer(sentOK + sentMSG.str(), kTVOneStatusLine);
tobyspark 0:87aab40d5806 540
tobyspark 0:87aab40d5806 541 if (debug) { debug->printf("Changing resolution"); }
tobyspark 0:87aab40d5806 542 }
tobyspark 1:f9fca21102e0 543 else if (selectedMenu == &commsMenu)
tobyspark 1:f9fca21102e0 544 {
tobyspark 5:f8b285ca41ba 545 std::string commsTypeString = "Network: --";
tobyspark 1:f9fca21102e0 546 std::stringstream commsStatus;
tobyspark 1:f9fca21102e0 547
tobyspark 1:f9fca21102e0 548 // Tear down any existing comms
tobyspark 1:f9fca21102e0 549 // This is the action of commsNone
tobyspark 1:f9fca21102e0 550 // And also clears the way for other comms actions
tobyspark 5:f8b285ca41ba 551 if (osc) {delete osc; osc = NULL;}
tobyspark 5:f8b285ca41ba 552 if (ethernet) {delete ethernet; ethernet = NULL;}
tobyspark 5:f8b285ca41ba 553 if (artNet) {delete artNet; artNet = NULL;}
tobyspark 5:f8b285ca41ba 554 if (dmx) {delete dmx; dmx = NULL;}
tobyspark 5:f8b285ca41ba 555
tobyspark 5:f8b285ca41ba 556 // Ensure we can't change to comms modes the hardware isn't switched to
tobyspark 5:f8b285ca41ba 557 if (rj45Mode == rj45DMX && (commsMenu.selectedPayload1() == commsOSC || commsMenu.selectedPayload1() == commsArtNet))
tobyspark 1:f9fca21102e0 558 {
tobyspark 5:f8b285ca41ba 559 commsTypeString = "RJ45 not in Ethernet mode";
tobyspark 5:f8b285ca41ba 560 }
tobyspark 5:f8b285ca41ba 561 else if (rj45Mode == rj45Ethernet && (commsMenu.selectedPayload1() == commsDMXIn || commsMenu.selectedPayload1() == commsDMXOut))
tobyspark 5:f8b285ca41ba 562 {
tobyspark 5:f8b285ca41ba 563 commsTypeString = "RJ45 not in DMX mode";
tobyspark 5:f8b285ca41ba 564 }
tobyspark 5:f8b285ca41ba 565 // Action!
tobyspark 5:f8b285ca41ba 566 else if (commsMenu.selectedPayload1() == commsOSC)
tobyspark 5:f8b285ca41ba 567 {
tobyspark 5:f8b285ca41ba 568 commsMode = commsOSC;
tobyspark 5:f8b285ca41ba 569 commsTypeString = "OSC: ";
tobyspark 1:f9fca21102e0 570
tobyspark 1:f9fca21102e0 571 ethernet = new EthernetNetIf(
tobyspark 1:f9fca21102e0 572 IpAddr(kOSCMbedIPAddress),
tobyspark 1:f9fca21102e0 573 IpAddr(kOSCMbedSubnetMask),
tobyspark 1:f9fca21102e0 574 IpAddr(kOSCMbedGateway),
tobyspark 1:f9fca21102e0 575 IpAddr(kOSCMbedDNS)
tobyspark 1:f9fca21102e0 576 );
tobyspark 3:033d2b7768f3 577
tobyspark 1:f9fca21102e0 578 EthernetErr ethError = ethernet->setup();
tobyspark 1:f9fca21102e0 579 if(ethError)
tobyspark 1:f9fca21102e0 580 {
tobyspark 1:f9fca21102e0 581 if (debug) debug->printf("Ethernet setup error, %d", ethError);
tobyspark 1:f9fca21102e0 582 commsStatus << "Ethernet setup failed";
tobyspark 5:f8b285ca41ba 583 commsMenu = commsNone;
tobyspark 1:f9fca21102e0 584 // break out of here. this setup should be a function that returns a boolean
tobyspark 1:f9fca21102e0 585 }
tobyspark 1:f9fca21102e0 586
tobyspark 1:f9fca21102e0 587 osc = new OSCClass();
tobyspark 3:033d2b7768f3 588 osc->setReceiveMessage(&recMessage);
tobyspark 1:f9fca21102e0 589 osc->begin(kOSCMbedPort);
tobyspark 1:f9fca21102e0 590
tobyspark 3:033d2b7768f3 591 commsStatus << "Listening on " << kOSCMbedPort;
tobyspark 1:f9fca21102e0 592 }
tobyspark 1:f9fca21102e0 593 else if (commsMenu.selectedPayload1() == commsArtNet)
tobyspark 1:f9fca21102e0 594 {
tobyspark 5:f8b285ca41ba 595 commsMode = commsArtNet;
tobyspark 5:f8b285ca41ba 596 commsTypeString = "ArtNet: ";
tobyspark 3:033d2b7768f3 597
tobyspark 3:033d2b7768f3 598 artNet = new DmxArtNet();
tobyspark 1:f9fca21102e0 599
tobyspark 3:033d2b7768f3 600 artNet->BindIpAddress = IpAddr(kArtNetBindIPAddress);
tobyspark 3:033d2b7768f3 601 artNet->BCastAddress = IpAddr(kArtNetBroadcastAddress);
tobyspark 3:033d2b7768f3 602
tobyspark 3:033d2b7768f3 603 artNet->InitArtPollReplyDefaults();
tobyspark 3:033d2b7768f3 604
tobyspark 3:033d2b7768f3 605 artNet->ArtPollReply.PortType[0] = 128; // output
tobyspark 3:033d2b7768f3 606 artNet->ArtPollReply.PortType[2] = 64; // input
tobyspark 3:033d2b7768f3 607 artNet->ArtPollReply.GoodInput[2] = 4;
tobyspark 3:033d2b7768f3 608
tobyspark 3:033d2b7768f3 609 artNet->Init();
tobyspark 3:033d2b7768f3 610 artNet->SendArtPollReply(); // announce to art-net nodes
tobyspark 3:033d2b7768f3 611
tobyspark 3:033d2b7768f3 612 commsStatus << "Listening";
tobyspark 1:f9fca21102e0 613 }
tobyspark 5:f8b285ca41ba 614 else if (commsMenu.selectedPayload1() == commsDMXIn)
tobyspark 1:f9fca21102e0 615 {
tobyspark 5:f8b285ca41ba 616 commsMode = commsDMXIn;
tobyspark 5:f8b285ca41ba 617 commsTypeString = "DMX In: ";
tobyspark 1:f9fca21102e0 618
tobyspark 5:f8b285ca41ba 619 dmxDirectionDOUT = 0;
tobyspark 5:f8b285ca41ba 620
tobyspark 5:f8b285ca41ba 621 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 1:f9fca21102e0 622 }
tobyspark 5:f8b285ca41ba 623 else if (commsMenu.selectedPayload1() == commsDMXOut)
tobyspark 5:f8b285ca41ba 624 {
tobyspark 5:f8b285ca41ba 625 commsMode = commsDMXOut;
tobyspark 5:f8b285ca41ba 626 commsTypeString = "DMX Out: ";
tobyspark 5:f8b285ca41ba 627
tobyspark 5:f8b285ca41ba 628 dmxDirectionDOUT = 1;
tobyspark 5:f8b285ca41ba 629
tobyspark 5:f8b285ca41ba 630 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 5:f8b285ca41ba 631 }
tobyspark 5:f8b285ca41ba 632
tobyspark 1:f9fca21102e0 633 screen.clearBufferRow(kCommsStatusLine);
tobyspark 5:f8b285ca41ba 634 screen.textToBuffer(commsTypeString + commsStatus.str(), kCommsStatusLine);
tobyspark 1:f9fca21102e0 635 }
tobyspark 0:87aab40d5806 636 else
tobyspark 0:87aab40d5806 637 {
tobyspark 0:87aab40d5806 638 if (debug) { debug->printf("Warning: No action identified"); }
tobyspark 0:87aab40d5806 639 }
tobyspark 0:87aab40d5806 640 }
tobyspark 0:87aab40d5806 641
tobyspark 2:50043054e4f7 642 // Send any updates to the display
tobyspark 2:50043054e4f7 643 screen.sendBuffer();
tobyspark 5:f8b285ca41ba 644
tobyspark 0:87aab40d5806 645
tobyspark 5:f8b285ca41ba 646 //// MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIXMIX MIX MIXMIX MIX MIX MIX MIX MIXMIX MIX MIX
tobyspark 0:87aab40d5806 647
tobyspark 0:87aab40d5806 648 bool updateFade = false;
tobyspark 3:033d2b7768f3 649 float xFade = 0;
tobyspark 3:033d2b7768f3 650 float fadeUp = 1;
tobyspark 3:033d2b7768f3 651
tobyspark 3:033d2b7768f3 652 //// TASK: Process control surface
tobyspark 3:033d2b7768f3 653
tobyspark 0:87aab40d5806 654 // Get new states of tap buttons, remembering at end of loop() assign these current values to the previous variables
tobyspark 5:f8b285ca41ba 655 const bool tapLeft = !tapLeftDIN;
tobyspark 5:f8b285ca41ba 656 const bool tapRight = !tapRightDIN;
tobyspark 0:87aab40d5806 657
tobyspark 0:87aab40d5806 658 // We're going to cache the analog in reads, as have seen wierdness otherwise
tobyspark 5:f8b285ca41ba 659 const float xFadeAINCached = 1-xFadeAIN.read();
tobyspark 0:87aab40d5806 660 const float fadeUpAINCached = fadeUpAIN.read();
tobyspark 0:87aab40d5806 661
tobyspark 0:87aab40d5806 662 // When a tap is depressed, we can ignore any move of the crossfader but not fade to black
tobyspark 0:87aab40d5806 663 if (tapLeft || tapRight)
tobyspark 0:87aab40d5806 664 {
tobyspark 5:f8b285ca41ba 665 // If both are pressed, take to the one that is new, ie. not the first pressed.
tobyspark 0:87aab40d5806 666 if (tapLeft && tapRight)
tobyspark 0:87aab40d5806 667 {
tobyspark 5:f8b285ca41ba 668 xFade = tapLeftWasFirstPressed ? 1 : 0;
tobyspark 0:87aab40d5806 669 }
tobyspark 5:f8b285ca41ba 670 // If just one is pressed, take to that and remember which is pressed
tobyspark 5:f8b285ca41ba 671 else if (tapLeft)
tobyspark 5:f8b285ca41ba 672 {
tobyspark 5:f8b285ca41ba 673 xFade = 0;
tobyspark 5:f8b285ca41ba 674 tapLeftWasFirstPressed = 1;
tobyspark 5:f8b285ca41ba 675 }
tobyspark 5:f8b285ca41ba 676 else if (tapRight)
tobyspark 5:f8b285ca41ba 677 {
tobyspark 5:f8b285ca41ba 678 xFade = 1;
tobyspark 5:f8b285ca41ba 679 tapLeftWasFirstPressed = 0;
tobyspark 5:f8b285ca41ba 680 }
tobyspark 5:f8b285ca41ba 681 }
tobyspark 0:87aab40d5806 682 else xFade = fadeCalc(xFadeAINCached, xFadeTolerance);
tobyspark 0:87aab40d5806 683
tobyspark 0:87aab40d5806 684 fadeUp = 1.0 - fadeCalc(fadeUpAINCached, fadeUpTolerance);
tobyspark 0:87aab40d5806 685
tobyspark 3:033d2b7768f3 686 //// TASK: Process Network Comms
tobyspark 5:f8b285ca41ba 687 if (commsMode == commsOSC)
tobyspark 3:033d2b7768f3 688 {
tobyspark 3:033d2b7768f3 689 if (osc->newMessage)
tobyspark 3:033d2b7768f3 690 {
tobyspark 3:033d2b7768f3 691 osc->newMessage = false; // fixme!
tobyspark 3:033d2b7768f3 692 processOSC(xFade, fadeUp);
tobyspark 3:033d2b7768f3 693 }
tobyspark 3:033d2b7768f3 694 }
tobyspark 3:033d2b7768f3 695
tobyspark 5:f8b285ca41ba 696 if (commsMode == commsArtNet)
tobyspark 3:033d2b7768f3 697 {
tobyspark 3:033d2b7768f3 698 if (artNet->Work()) processArtNet(xFade, fadeUp);
tobyspark 3:033d2b7768f3 699 }
tobyspark 3:033d2b7768f3 700
tobyspark 5:f8b285ca41ba 701 if (commsMode == commsDMXIn)
tobyspark 5:f8b285ca41ba 702 {
tobyspark 5:f8b285ca41ba 703 processDMXIn(xFade, fadeUp);
tobyspark 5:f8b285ca41ba 704 }
tobyspark 5:f8b285ca41ba 705
tobyspark 5:f8b285ca41ba 706 if (commsMode == commsDMXOut)
tobyspark 5:f8b285ca41ba 707 {
tobyspark 5:f8b285ca41ba 708 processDMXOut(xFade, fadeUp);
tobyspark 5:f8b285ca41ba 709 }
tobyspark 0:87aab40d5806 710
tobyspark 0:87aab40d5806 711 // Calculate new A&B fade percents
tobyspark 0:87aab40d5806 712 int newFadeAPercent = 0;
tobyspark 0:87aab40d5806 713 int newFadeBPercent = 0;
tobyspark 0:87aab40d5806 714
tobyspark 5:f8b285ca41ba 715 switch (mixMode) {
tobyspark 0:87aab40d5806 716 case blend:
tobyspark 9:f83eadd8917a 717 if (fadeUp < 1.0)
tobyspark 9:f83eadd8917a 718 {
tobyspark 9:f83eadd8917a 719 // we need to set fade level of both windows as there is no way AFAIK to implement fade to black as a further window on top of A&B
tobyspark 9:f83eadd8917a 720 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 9:f83eadd8917a 721 newFadeBPercent = xFade * fadeUp * 100.0;
tobyspark 9:f83eadd8917a 722 }
tobyspark 9:f83eadd8917a 723 else
tobyspark 9:f83eadd8917a 724 {
tobyspark 9:f83eadd8917a 725 // we can optimise and just fade A in and out over a fully up B, doubling the rate of fadeA commands sent.
tobyspark 9:f83eadd8917a 726 newFadeAPercent = (1.0-xFade) * 100.0;
tobyspark 9:f83eadd8917a 727 newFadeBPercent = 100.0;
tobyspark 9:f83eadd8917a 728 }
tobyspark 9:f83eadd8917a 729 break;
tobyspark 9:f83eadd8917a 730 case additive:
tobyspark 9:f83eadd8917a 731 // we need to set fade level of both windows according to the fade curve profile (yet to implement - to do when tvone supply additive capability)
tobyspark 0:87aab40d5806 732 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 0:87aab40d5806 733 newFadeBPercent = xFade * fadeUp * 100.0;
tobyspark 0:87aab40d5806 734 break;
tobyspark 0:87aab40d5806 735 case lumaKey:
tobyspark 0:87aab40d5806 736 case chromaKey1:
tobyspark 0:87aab40d5806 737 case chromaKey2:
tobyspark 0:87aab40d5806 738 case chromaKey3:
tobyspark 0:87aab40d5806 739 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 0:87aab40d5806 740 newFadeBPercent = fadeUp * 100.0;
tobyspark 0:87aab40d5806 741 break;
tobyspark 0:87aab40d5806 742 }
tobyspark 0:87aab40d5806 743
tobyspark 0:87aab40d5806 744 // Send to TVOne if percents have changed
tobyspark 9:f83eadd8917a 745 // We want to send the higher first, otherwise black flashes can happen on taps
tobyspark 9:f83eadd8917a 746 if (newFadeAPercent != fadeAPercent && newFadeAPercent >= newFadeBPercent)
tobyspark 8:d46cc49f0f37 747 {
tobyspark 0:87aab40d5806 748 fadeAPercent = newFadeAPercent;
tobyspark 0:87aab40d5806 749 updateFade = true;
tobyspark 0:87aab40d5806 750
tobyspark 0:87aab40d5806 751 fadeAPO = fadeAPercent / 100.0;
tobyspark 0:87aab40d5806 752 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 0:87aab40d5806 753 }
tobyspark 0:87aab40d5806 754
tobyspark 8:d46cc49f0f37 755 if (newFadeBPercent != fadeBPercent)
tobyspark 8:d46cc49f0f37 756 {
tobyspark 0:87aab40d5806 757 fadeBPercent = newFadeBPercent;
tobyspark 0:87aab40d5806 758 updateFade = true;
tobyspark 0:87aab40d5806 759
tobyspark 0:87aab40d5806 760 fadeBPO = fadeBPercent / 100.0;
tobyspark 0:87aab40d5806 761 tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 0:87aab40d5806 762 }
tobyspark 0:87aab40d5806 763
tobyspark 9:f83eadd8917a 764 if (newFadeAPercent != fadeAPercent && newFadeAPercent < newFadeBPercent)
tobyspark 9:f83eadd8917a 765 {
tobyspark 9:f83eadd8917a 766 fadeAPercent = newFadeAPercent;
tobyspark 9:f83eadd8917a 767 updateFade = true;
tobyspark 9:f83eadd8917a 768
tobyspark 9:f83eadd8917a 769 fadeAPO = fadeAPercent / 100.0;
tobyspark 9:f83eadd8917a 770 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 9:f83eadd8917a 771 }
tobyspark 9:f83eadd8917a 772
tobyspark 8:d46cc49f0f37 773 if (updateFade && debug)
tobyspark 8:d46cc49f0f37 774 {
tobyspark 0:87aab40d5806 775 debug->printf("\r\n");
tobyspark 0:87aab40d5806 776 //debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAIN.read(), fadeUpAIN.read());
tobyspark 0:87aab40d5806 777 debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAINCached, fadeUpAINCached);
tobyspark 0:87aab40d5806 778 debug->printf("xFade = %3f fadeUp = %3f fadeA% = %i fadeB% = %i \r\n", xFade, fadeUp, fadeAPercent, fadeBPercent);
tobyspark 0:87aab40d5806 779 }
tobyspark 5:f8b285ca41ba 780
tobyspark 0:87aab40d5806 781 }
tobyspark 0:87aab40d5806 782 }