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:
Mon Sep 17 00:34:51 2012 +0000
Revision:
13:3796bde6ba8f
Parent:
12:c270870bdd23
Child:
15:4b394c64b461
SPK-Setting using iniparser library; ...but it crashes on using it, despite the class being tested good when in test program. see note in load method.

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