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 Oct 08 13:45:47 2012 +0000
Revision:
20:8b92d7922c48
Parent:
18:ebe5da639a6a
Child:
21:f9d63cb7cedb
Set up reading in Processor version / software on startup. However my 750 has 0 stored for all these values... not so useful.

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 17:fc68d40b8b1f 58 #include "filter.h"
tobyspark 0:87aab40d5806 59
tobyspark 0:87aab40d5806 60 #include <sstream>
tobyspark 0:87aab40d5806 61
tobyspark 13:3796bde6ba8f 62 #define kSPKDFSoftwareVersion "beta.19"
tobyspark 13:3796bde6ba8f 63
tobyspark 5:f8b285ca41ba 64 // MBED PINS
tobyspark 5:f8b285ca41ba 65
tobyspark 5:f8b285ca41ba 66 #define kMBED_AIN_XFADE p20
tobyspark 5:f8b285ca41ba 67 #define kMBED_AIN_FADEUP p19
tobyspark 5:f8b285ca41ba 68 #define kMBED_DIN_TAP_L p24
tobyspark 5:f8b285ca41ba 69 #define kMBED_DIN_TAP_R p23
tobyspark 5:f8b285ca41ba 70 #define kMBED_ENC_SW p15
tobyspark 5:f8b285ca41ba 71 #define kMBED_ENC_A p16
tobyspark 5:f8b285ca41ba 72 #define kMBED_ENC_B p17
tobyspark 5:f8b285ca41ba 73
tobyspark 5:f8b285ca41ba 74 #define kMBED_RS232_TTLTX p13
tobyspark 5:f8b285ca41ba 75 #define kMBED_RS232_TTLRX p14
tobyspark 5:f8b285ca41ba 76
tobyspark 5:f8b285ca41ba 77 #define kMBED_OLED_MOSI p5
tobyspark 5:f8b285ca41ba 78 #define kMBED_OLED_SCK p7
tobyspark 5:f8b285ca41ba 79 #define kMBED_OLED_CS p8
tobyspark 5:f8b285ca41ba 80 #define kMBED_OLED_RES p9
tobyspark 5:f8b285ca41ba 81 #define kMBED_OLED_DC p10
tobyspark 5:f8b285ca41ba 82
tobyspark 5:f8b285ca41ba 83 #define kMBED_DIN_ETHLO_DMXHI p30
tobyspark 5:f8b285ca41ba 84 #define kMBED_DOUT_RS485_TXHI_RXLO p29
tobyspark 5:f8b285ca41ba 85 #define kMBED_RS485_TTLTX p28
tobyspark 5:f8b285ca41ba 86 #define kMBED_RS485_TTLRX p27
tobyspark 5:f8b285ca41ba 87
tobyspark 5:f8b285ca41ba 88 // DISPLAY
tobyspark 5:f8b285ca41ba 89
tobyspark 1:f9fca21102e0 90 #define kMenuLine1 3
tobyspark 1:f9fca21102e0 91 #define kMenuLine2 4
tobyspark 1:f9fca21102e0 92 #define kCommsStatusLine 6
tobyspark 1:f9fca21102e0 93 #define kTVOneStatusLine 7
tobyspark 1:f9fca21102e0 94
tobyspark 5:f8b285ca41ba 95 // NETWORKING
tobyspark 5:f8b285ca41ba 96
tobyspark 1:f9fca21102e0 97 #define kOSCMbedPort 10000
tobyspark 1:f9fca21102e0 98 #define kOSCMbedIPAddress 10,0,0,2
tobyspark 1:f9fca21102e0 99 #define kOSCMbedSubnetMask 255,255,255,0
tobyspark 1:f9fca21102e0 100 #define kOSCMbedGateway 10,0,0,1
tobyspark 1:f9fca21102e0 101 #define kOSCMbedDNS 10,0,0,1
tobyspark 0:87aab40d5806 102
tobyspark 3:033d2b7768f3 103 #define kArtNetBindIPAddress 2,0,0,100
tobyspark 3:033d2b7768f3 104 #define kArtNetBroadcastAddress 2,255,255,255
tobyspark 3:033d2b7768f3 105
tobyspark 5:f8b285ca41ba 106 #define kDMXInChannelXFade 0
tobyspark 5:f8b285ca41ba 107 #define kDMXInChannelFadeUp 1
tobyspark 5:f8b285ca41ba 108 #define kDMXOutChannelXFade 0
tobyspark 5:f8b285ca41ba 109 #define kDMXOutChannelFadeUp 1
tobyspark 5:f8b285ca41ba 110
tobyspark 13:3796bde6ba8f 111 // 8.3 format filename only, no subdirs
tobyspark 13:3796bde6ba8f 112 #define kSPKDFSettingsFilename "SPKDF.ini"
tobyspark 11:0783cfbeb746 113
tobyspark 0:87aab40d5806 114 //// DEBUG
tobyspark 0:87aab40d5806 115
tobyspark 0:87aab40d5806 116 // Comment out one or the other...
tobyspark 17:fc68d40b8b1f 117 //Serial *debug = new Serial(USBTX, USBRX); // For debugging via USB serial
tobyspark 17:fc68d40b8b1f 118 Serial *debug = NULL; // For release (no debugging)
tobyspark 0:87aab40d5806 119
tobyspark 15:4b394c64b461 120 //// SOFT RESET
tobyspark 15:4b394c64b461 121
tobyspark 15:4b394c64b461 122 extern "C" void mbed_reset();
tobyspark 15:4b394c64b461 123
tobyspark 0:87aab40d5806 124 //// mBED PIN ASSIGNMENTS
tobyspark 0:87aab40d5806 125
tobyspark 0:87aab40d5806 126 // Inputs
tobyspark 5:f8b285ca41ba 127 AnalogIn xFadeAIN(kMBED_AIN_XFADE);
tobyspark 5:f8b285ca41ba 128 AnalogIn fadeUpAIN(kMBED_AIN_FADEUP);
tobyspark 5:f8b285ca41ba 129 DigitalIn tapLeftDIN(kMBED_DIN_TAP_L);
tobyspark 5:f8b285ca41ba 130 DigitalIn tapRightDIN(kMBED_DIN_TAP_R);
tobyspark 17:fc68d40b8b1f 131 medianFilter xFadeFilter(9);
tobyspark 17:fc68d40b8b1f 132 medianFilter fadeUpFilter(9);
tobyspark 0:87aab40d5806 133
tobyspark 5:f8b285ca41ba 134 SPKRotaryEncoder menuEnc(kMBED_ENC_A, kMBED_ENC_B, kMBED_ENC_SW);
tobyspark 5:f8b285ca41ba 135
tobyspark 5:f8b285ca41ba 136 DigitalIn rj45ModeDIN(kMBED_DIN_ETHLO_DMXHI);
tobyspark 0:87aab40d5806 137
tobyspark 0:87aab40d5806 138 // Outputs
tobyspark 0:87aab40d5806 139 PwmOut fadeAPO(LED1);
tobyspark 0:87aab40d5806 140 PwmOut fadeBPO(LED2);
tobyspark 0:87aab40d5806 141
tobyspark 5:f8b285ca41ba 142 DigitalOut dmxDirectionDOUT(kMBED_DOUT_RS485_TXHI_RXLO);
tobyspark 5:f8b285ca41ba 143
tobyspark 0:87aab40d5806 144 // SPKTVOne(PinName txPin, PinName rxPin, PinName signWritePin, PinName signErrorPin, Serial *debugSerial)
tobyspark 5:f8b285ca41ba 145 SPKTVOne tvOne(kMBED_RS232_TTLTX, kMBED_RS232_TTLRX, LED3, LED4, debug);
tobyspark 0:87aab40d5806 146
tobyspark 0:87aab40d5806 147 // SPKDisplay(PinName mosi, PinName clk, PinName cs, PinName dc, PinName res, Serial *debugSerial = NULL);
tobyspark 5:f8b285ca41ba 148 SPKDisplay screen(kMBED_OLED_MOSI, kMBED_OLED_SCK, kMBED_OLED_CS, kMBED_OLED_DC, kMBED_OLED_RES, debug);
tobyspark 0:87aab40d5806 149
tobyspark 11:0783cfbeb746 150 // Saved Settings
tobyspark 11:0783cfbeb746 151 SPKSettings settings;
tobyspark 11:0783cfbeb746 152
tobyspark 0:87aab40d5806 153 // Menu
tobyspark 0:87aab40d5806 154 SPKMenu *selectedMenu;
tobyspark 0:87aab40d5806 155 SPKMenu *lastSelectedMenu;
tobyspark 0:87aab40d5806 156 SPKMenuOfMenus mainMenu;
tobyspark 0:87aab40d5806 157 SPKMenuPayload resolutionMenu;
tobyspark 0:87aab40d5806 158 SPKMenuPayload mixModeMenu;
tobyspark 12:c270870bdd23 159 SPKMenuPayload advancedMenu;
tobyspark 12:c270870bdd23 160
tobyspark 15:4b394c64b461 161 enum { mixBlend, mixAdditive, mixKey }; // additive will require custom TVOne firmware.
tobyspark 15:4b394c64b461 162 int mixMode = mixBlend;
tobyspark 1:f9fca21102e0 163 SPKMenuPayload commsMenu;
tobyspark 5:f8b285ca41ba 164 enum { commsNone, commsOSC, commsArtNet, commsDMXIn, commsDMXOut};
tobyspark 5:f8b285ca41ba 165 int commsMode = commsNone;
tobyspark 17:fc68d40b8b1f 166 enum { advancedHDCPOn, advancedHDCPOff, advancedConformProcessor, advancedLoadDefaults, advancedSelfTest };
tobyspark 1:f9fca21102e0 167
tobyspark 5:f8b285ca41ba 168 // RJ45 Comms
tobyspark 5:f8b285ca41ba 169 enum { rj45Ethernet = 0, rj45DMX = 1}; // These values from circuit
tobyspark 5:f8b285ca41ba 170 int rj45Mode = -1;
tobyspark 1:f9fca21102e0 171 EthernetNetIf *ethernet = NULL;
tobyspark 1:f9fca21102e0 172 OSCClass *osc = NULL;
tobyspark 3:033d2b7768f3 173 OSCMessage recMessage;
tobyspark 3:033d2b7768f3 174 DmxArtNet *artNet = NULL;
tobyspark 5:f8b285ca41ba 175 DMX *dmx = NULL;
tobyspark 0:87aab40d5806 176
tobyspark 3:033d2b7768f3 177 // Fade logic constants
tobyspark 0:87aab40d5806 178 const float xFadeTolerance = 0.05;
tobyspark 0:87aab40d5806 179 const float fadeUpTolerance = 0.05;
tobyspark 0:87aab40d5806 180
tobyspark 0:87aab40d5806 181 // A&B Fade as resolved percent
tobyspark 0:87aab40d5806 182 int fadeAPercent = 0;
tobyspark 0:87aab40d5806 183 int fadeBPercent = 0;
tobyspark 17:fc68d40b8b1f 184 int oldFadeAPercent = 0;
tobyspark 17:fc68d40b8b1f 185 int oldFadeBPercent = 0;
tobyspark 0:87aab40d5806 186
tobyspark 0:87aab40d5806 187 // Tap button states
tobyspark 5:f8b285ca41ba 188 bool tapLeftWasFirstPressed = false;
tobyspark 0:87aab40d5806 189
tobyspark 0:87aab40d5806 190 // Key mode parameters
tobyspark 0:87aab40d5806 191 int keyerParamsSet = -1; // last keyParams index uploaded to unit
tobyspark 0:87aab40d5806 192
tobyspark 3:033d2b7768f3 193 void processOSC(float &xFade, float &fadeUp) {
tobyspark 3:033d2b7768f3 194 std::stringstream statusMessage;
tobyspark 3:033d2b7768f3 195 statusMessage.setf(ios::fixed,ios::floatfield);
tobyspark 3:033d2b7768f3 196 statusMessage.precision(2);
tobyspark 3:033d2b7768f3 197
tobyspark 3:033d2b7768f3 198 if (!strcmp( recMessage.getTopAddress() , "dvimxr" ))
tobyspark 3:033d2b7768f3 199 {
tobyspark 3:033d2b7768f3 200 statusMessage << "OSC: /dvimxr";
tobyspark 3:033d2b7768f3 201 if (!strcmp( recMessage.getSubAddress() , "xFade" ))
tobyspark 3:033d2b7768f3 202 if (recMessage.getArgNum() == 1)
tobyspark 3:033d2b7768f3 203 if (recMessage.getTypeTag(0) == 'f')
tobyspark 3:033d2b7768f3 204 {
tobyspark 3:033d2b7768f3 205 double newXFade = recMessage.getArgFloat(0);
tobyspark 3:033d2b7768f3 206 statusMessage << "/xFade " << newXFade;
tobyspark 3:033d2b7768f3 207 xFade = newXFade;
tobyspark 3:033d2b7768f3 208 }
tobyspark 3:033d2b7768f3 209 else if (!strcmp( recMessage.getSubAddress() , "fadeUp" ))
tobyspark 3:033d2b7768f3 210 if (recMessage.getArgNum() == 1)
tobyspark 3:033d2b7768f3 211 if (recMessage.getTypeTag(0) == 'f')
tobyspark 3:033d2b7768f3 212 {
tobyspark 3:033d2b7768f3 213 double newFadeUp = recMessage.getArgFloat(0);
tobyspark 3:033d2b7768f3 214 statusMessage << "/fadeUp " << newFadeUp;
tobyspark 3:033d2b7768f3 215 xFade = newFadeUp;
tobyspark 3:033d2b7768f3 216 }
tobyspark 3:033d2b7768f3 217 else statusMessage << recMessage.getSubAddress() << " - Ignoring";
tobyspark 3:033d2b7768f3 218 }
tobyspark 3:033d2b7768f3 219 else
tobyspark 3:033d2b7768f3 220 {
tobyspark 3:033d2b7768f3 221 statusMessage << "OSC: " << recMessage.getTopAddress() << " - Ignoring";
tobyspark 3:033d2b7768f3 222 }
tobyspark 3:033d2b7768f3 223
tobyspark 3:033d2b7768f3 224 screen.clearBufferRow(kCommsStatusLine);
tobyspark 3:033d2b7768f3 225 screen.textToBuffer(statusMessage.str(), kCommsStatusLine);
tobyspark 3:033d2b7768f3 226 screen.sendBuffer();
tobyspark 3:033d2b7768f3 227 if (debug) debug->printf("%s \r\n", statusMessage.str().c_str());
tobyspark 3:033d2b7768f3 228
tobyspark 3:033d2b7768f3 229 }
tobyspark 3:033d2b7768f3 230
tobyspark 8:d46cc49f0f37 231 void processArtNet(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 232 {
tobyspark 3:033d2b7768f3 233 screen.clearBufferRow(kCommsStatusLine);
tobyspark 3:033d2b7768f3 234 screen.textToBuffer("ArtNet activity", kCommsStatusLine);
tobyspark 3:033d2b7768f3 235 screen.sendBuffer();
tobyspark 3:033d2b7768f3 236 if (debug) debug->printf("ArtNet activity");
tobyspark 3:033d2b7768f3 237 }
tobyspark 0:87aab40d5806 238
tobyspark 8:d46cc49f0f37 239 void processDMXIn(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 240 {
tobyspark 5:f8b285ca41ba 241 std::stringstream statusMessage;
tobyspark 5:f8b285ca41ba 242
tobyspark 5:f8b285ca41ba 243 int xFadeDMX = dmx->get(kDMXInChannelXFade);
tobyspark 7:e6717468c18d 244 int fadeUpDMX = dmx->get(kDMXInChannelFadeUp);
tobyspark 5:f8b285ca41ba 245
tobyspark 5:f8b285ca41ba 246 xFade = (float)xFadeDMX/255;
tobyspark 5:f8b285ca41ba 247 fadeUp = (float)fadeUpDMX/255;
tobyspark 5:f8b285ca41ba 248
tobyspark 5:f8b285ca41ba 249 screen.clearBufferRow(kCommsStatusLine);
tobyspark 5:f8b285ca41ba 250 statusMessage << "DMX In: xF " << xFadeDMX << " fUp " << fadeUpDMX;
tobyspark 5:f8b285ca41ba 251 screen.textToBuffer(statusMessage.str(), kCommsStatusLine);
tobyspark 5:f8b285ca41ba 252 screen.sendBuffer();
tobyspark 5:f8b285ca41ba 253 if (debug) debug->printf(statusMessage.str().c_str());
tobyspark 5:f8b285ca41ba 254 }
tobyspark 5:f8b285ca41ba 255
tobyspark 8:d46cc49f0f37 256 void processDMXOut(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 257 {
tobyspark 5:f8b285ca41ba 258 std::stringstream statusMessage;
tobyspark 5:f8b285ca41ba 259
tobyspark 5:f8b285ca41ba 260 int xFadeDMX = xFade*255;
tobyspark 5:f8b285ca41ba 261 int fadeUpDMX = fadeUp*255;
tobyspark 5:f8b285ca41ba 262
tobyspark 5:f8b285ca41ba 263 dmx->put(kDMXOutChannelXFade, xFadeDMX);
tobyspark 5:f8b285ca41ba 264 dmx->put(kDMXOutChannelFadeUp, fadeUpDMX);
tobyspark 5:f8b285ca41ba 265
tobyspark 5:f8b285ca41ba 266 screen.clearBufferRow(kCommsStatusLine);
tobyspark 5:f8b285ca41ba 267 statusMessage << "DMX Out: xF " << xFadeDMX << " fUp " << fadeUpDMX;
tobyspark 5:f8b285ca41ba 268 screen.textToBuffer(statusMessage.str(), kCommsStatusLine);
tobyspark 5:f8b285ca41ba 269 screen.sendBuffer();
tobyspark 5:f8b285ca41ba 270 if (debug) debug->printf(statusMessage.str().c_str());
tobyspark 5:f8b285ca41ba 271 }
tobyspark 0:87aab40d5806 272
tobyspark 8:d46cc49f0f37 273 inline float fadeCalc (const float AIN, const float tolerance)
tobyspark 8:d46cc49f0f37 274 {
tobyspark 0:87aab40d5806 275 float pos ;
tobyspark 0:87aab40d5806 276 if (AIN < tolerance) pos = 0;
tobyspark 0:87aab40d5806 277 else if (AIN > 1.0 - tolerance) pos = 1;
tobyspark 0:87aab40d5806 278 else pos = (AIN - tolerance) / (1 - 2*tolerance);
tobyspark 0:87aab40d5806 279 if (debug && false) debug->printf("fadeCalc in: %f out: %f \r\n", AIN, pos);
tobyspark 0:87aab40d5806 280 return pos;
tobyspark 0:87aab40d5806 281 }
tobyspark 0:87aab40d5806 282
tobyspark 8:d46cc49f0f37 283 bool setKeyParamsTo(int index)
tobyspark 8:d46cc49f0f37 284 {
tobyspark 0:87aab40d5806 285 // Only spend the time uploading six parameters if we need to
tobyspark 0:87aab40d5806 286 // Might want to bounds check here
tobyspark 0:87aab40d5806 287
tobyspark 9:f83eadd8917a 288 bool ok;
tobyspark 0:87aab40d5806 289
tobyspark 0:87aab40d5806 290 if (index != keyerParamsSet)
tobyspark 0:87aab40d5806 291 {
tobyspark 11:0783cfbeb746 292 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, settings.keyerParamSet(index)[0]);
tobyspark 11:0783cfbeb746 293 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, settings.keyerParamSet(index)[1]);
tobyspark 11:0783cfbeb746 294 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, settings.keyerParamSet(index)[2]);
tobyspark 11:0783cfbeb746 295 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, settings.keyerParamSet(index)[3]);
tobyspark 11:0783cfbeb746 296 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, settings.keyerParamSet(index)[4]);
tobyspark 11:0783cfbeb746 297 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, settings.keyerParamSet(index)[5]);
tobyspark 0:87aab40d5806 298
tobyspark 0:87aab40d5806 299 keyerParamsSet = index;
tobyspark 9:f83eadd8917a 300 }
tobyspark 9:f83eadd8917a 301 else
tobyspark 9:f83eadd8917a 302 {
tobyspark 9:f83eadd8917a 303 ok = true;
tobyspark 9:f83eadd8917a 304 }
tobyspark 0:87aab40d5806 305
tobyspark 0:87aab40d5806 306 return ok;
tobyspark 0:87aab40d5806 307 }
tobyspark 0:87aab40d5806 308
tobyspark 17:fc68d40b8b1f 309 bool conformProcessor()
tobyspark 17:fc68d40b8b1f 310 {
tobyspark 17:fc68d40b8b1f 311 bool ok = true;
tobyspark 17:fc68d40b8b1f 312
tobyspark 17:fc68d40b8b1f 313 int32_t on = 1;
tobyspark 17:fc68d40b8b1f 314 int32_t off = 0;
tobyspark 20:8b92d7922c48 315
tobyspark 20:8b92d7922c48 316 // Independent output
tobyspark 20:8b92d7922c48 317 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputEnable, on);
tobyspark 20:8b92d7922c48 318 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsLockMethod, off);
tobyspark 17:fc68d40b8b1f 319
tobyspark 17:fc68d40b8b1f 320 // Make sure our windows exist
tobyspark 17:fc68d40b8b1f 321 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsEnable, on);
tobyspark 17:fc68d40b8b1f 322 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsEnable, on);
tobyspark 18:ebe5da639a6a 323 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsLayerPriority, 0);
tobyspark 18:ebe5da639a6a 324 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsLayerPriority, 1);
tobyspark 17:fc68d40b8b1f 325
tobyspark 17:fc68d40b8b1f 326 // Assign inputs to windows, so that left on the crossfader is left on the processor viewed from front
tobyspark 17:fc68d40b8b1f 327 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB2);
tobyspark 17:fc68d40b8b1f 328 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB1);
tobyspark 17:fc68d40b8b1f 329
tobyspark 17:fc68d40b8b1f 330 // Set scaling to fit source within output, maintaining aspect ratio
tobyspark 17:fc68d40b8b1f 331 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustWindowsZoomLevel, 100);
tobyspark 17:fc68d40b8b1f 332 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDB, kTV1FunctionAdjustWindowsZoomLevel, 100);
tobyspark 17:fc68d40b8b1f 333 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustWindowsShrinkEnable, off);
tobyspark 17:fc68d40b8b1f 334 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDB, kTV1FunctionAdjustWindowsShrinkEnable, off);
tobyspark 17:fc68d40b8b1f 335 int32_t fit = 1;
tobyspark 17:fc68d40b8b1f 336 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, fit);
tobyspark 17:fc68d40b8b1f 337 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, fit);
tobyspark 17:fc68d40b8b1f 338
tobyspark 17:fc68d40b8b1f 339 // On source loss, hold on the last frame received.
tobyspark 17:fc68d40b8b1f 340 int32_t freeze = 1;
tobyspark 17:fc68d40b8b1f 341 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceOnSourceLoss, freeze);
tobyspark 17:fc68d40b8b1f 342 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceOnSourceLoss, freeze);
tobyspark 17:fc68d40b8b1f 343
tobyspark 17:fc68d40b8b1f 344 // Finally, autoset to sources?
tobyspark 17:fc68d40b8b1f 345 //int32_t start = 1;
tobyspark 17:fc68d40b8b1f 346 //ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceAutoSet, start);
tobyspark 17:fc68d40b8b1f 347 //ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceAutoSet, start);
tobyspark 17:fc68d40b8b1f 348
tobyspark 17:fc68d40b8b1f 349 return ok;
tobyspark 17:fc68d40b8b1f 350 }
tobyspark 17:fc68d40b8b1f 351
tobyspark 17:fc68d40b8b1f 352 void selfTest()
tobyspark 17:fc68d40b8b1f 353 {
tobyspark 17:fc68d40b8b1f 354 /* SELF TEST - Pixels
tobyspark 17:fc68d40b8b1f 355 * Clicking &#65533;self-test&#65533; menu will display a solid lit screen. Check all pixels lit.
tobyspark 17:fc68d40b8b1f 356 * Verified: Display
tobyspark 17:fc68d40b8b1f 357 */
tobyspark 17:fc68d40b8b1f 358
tobyspark 17:fc68d40b8b1f 359 screen.imageToBuffer(spkDisplayAllPixelsOn);
tobyspark 17:fc68d40b8b1f 360 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 361
tobyspark 17:fc68d40b8b1f 362 while(!menuEnc.hasPressed())
tobyspark 17:fc68d40b8b1f 363 {
tobyspark 17:fc68d40b8b1f 364 // do nothing, wait for press
tobyspark 17:fc68d40b8b1f 365 }
tobyspark 17:fc68d40b8b1f 366
tobyspark 17:fc68d40b8b1f 367 /* SELF TEST - Mixing Controls
tobyspark 17:fc68d40b8b1f 368 * Clicking again will prompt to check crossfader, fade to black and tap buttons. Check movement of physical controls against 0.0-1.0 values on- screen.
tobyspark 17:fc68d40b8b1f 369 * Verified: Mixing controls.
tobyspark 17:fc68d40b8b1f 370 */
tobyspark 17:fc68d40b8b1f 371
tobyspark 17:fc68d40b8b1f 372 screen.clearBuffer();
tobyspark 17:fc68d40b8b1f 373 screen.textToBuffer("Self test - Mixing Controls", 0);
tobyspark 17:fc68d40b8b1f 374
tobyspark 17:fc68d40b8b1f 375 while(!menuEnc.hasPressed())
tobyspark 17:fc68d40b8b1f 376 {
tobyspark 17:fc68d40b8b1f 377 stringstream xFadeReadOut;
tobyspark 17:fc68d40b8b1f 378 stringstream fadeToBlackReadOut;
tobyspark 17:fc68d40b8b1f 379 stringstream tapsReadOut;
tobyspark 17:fc68d40b8b1f 380
tobyspark 17:fc68d40b8b1f 381 xFadeReadOut.precision(2);
tobyspark 17:fc68d40b8b1f 382 fadeToBlackReadOut.precision(2);
tobyspark 17:fc68d40b8b1f 383 tapsReadOut.precision(1);
tobyspark 17:fc68d40b8b1f 384
tobyspark 17:fc68d40b8b1f 385 xFadeReadOut << "Crossfade: " << xFadeAIN.read();
tobyspark 17:fc68d40b8b1f 386 fadeToBlackReadOut << "Fade to black: " << fadeUpAIN.read();
tobyspark 17:fc68d40b8b1f 387 tapsReadOut << "Tap left: " << tapLeftDIN.read() << " right: " << tapRightDIN.read();
tobyspark 17:fc68d40b8b1f 388
tobyspark 17:fc68d40b8b1f 389 screen.clearBufferRow(1);
tobyspark 17:fc68d40b8b1f 390 screen.clearBufferRow(2);
tobyspark 17:fc68d40b8b1f 391 screen.clearBufferRow(3);
tobyspark 17:fc68d40b8b1f 392
tobyspark 17:fc68d40b8b1f 393 screen.textToBuffer(xFadeReadOut.str(), 1);
tobyspark 17:fc68d40b8b1f 394 screen.textToBuffer(fadeToBlackReadOut.str(), 2);
tobyspark 17:fc68d40b8b1f 395 screen.textToBuffer(tapsReadOut.str(), 3);
tobyspark 17:fc68d40b8b1f 396 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 397 }
tobyspark 17:fc68d40b8b1f 398
tobyspark 17:fc68d40b8b1f 399 /* SELF TEST - RS232
tobyspark 17:fc68d40b8b1f 400 * Click the controller menu control. Should see &#65533;RS232 test&#65533; prompt and test message. Ensure PC is displaying the test message.
tobyspark 17:fc68d40b8b1f 401 * Verified: RS232 connection.
tobyspark 17:fc68d40b8b1f 402 */
tobyspark 17:fc68d40b8b1f 403
tobyspark 17:fc68d40b8b1f 404 screen.clearBuffer();
tobyspark 17:fc68d40b8b1f 405 screen.textToBuffer("Self test - RS232", 0);
tobyspark 17:fc68d40b8b1f 406 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 407
tobyspark 17:fc68d40b8b1f 408 while(!menuEnc.hasPressed())
tobyspark 17:fc68d40b8b1f 409 {
tobyspark 17:fc68d40b8b1f 410 screen.textToBuffer("TODO!", 1);
tobyspark 17:fc68d40b8b1f 411 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 412 }
tobyspark 17:fc68d40b8b1f 413
tobyspark 17:fc68d40b8b1f 414 /* SELF TEST - DMX
tobyspark 17:fc68d40b8b1f 415 * Click the controller menu control. Should see &#65533;DMX test&#65533; prompt and test message. Ensure PC is displaying the test message.
tobyspark 17:fc68d40b8b1f 416 * Verified: RS485 connection and DMX library.
tobyspark 17:fc68d40b8b1f 417 */
tobyspark 17:fc68d40b8b1f 418
tobyspark 17:fc68d40b8b1f 419 screen.clearBuffer();
tobyspark 17:fc68d40b8b1f 420 screen.textToBuffer("Self test - DMX", 0);
tobyspark 17:fc68d40b8b1f 421 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 422
tobyspark 17:fc68d40b8b1f 423 while(!menuEnc.hasPressed())
tobyspark 17:fc68d40b8b1f 424 {
tobyspark 17:fc68d40b8b1f 425 screen.textToBuffer("TODO!", 1);
tobyspark 17:fc68d40b8b1f 426 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 427 }
tobyspark 17:fc68d40b8b1f 428
tobyspark 17:fc68d40b8b1f 429 /* SELF TEST - OSC
tobyspark 17:fc68d40b8b1f 430 * Click the controller menu control. Should see &#65533;OSC test&#65533; prompt and test message. Ensure PC is displaying the test message.
tobyspark 17:fc68d40b8b1f 431 * Verified: Ethernet connection and OSC library.
tobyspark 17:fc68d40b8b1f 432 */
tobyspark 17:fc68d40b8b1f 433
tobyspark 17:fc68d40b8b1f 434 screen.clearBuffer();
tobyspark 17:fc68d40b8b1f 435 screen.textToBuffer("Self test - DMX", 0);
tobyspark 17:fc68d40b8b1f 436 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 437
tobyspark 17:fc68d40b8b1f 438 while(!menuEnc.hasPressed())
tobyspark 17:fc68d40b8b1f 439 {
tobyspark 17:fc68d40b8b1f 440 screen.textToBuffer("TODO!", 1);
tobyspark 17:fc68d40b8b1f 441 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 442 }
tobyspark 17:fc68d40b8b1f 443
tobyspark 17:fc68d40b8b1f 444 /* SELF TEST - Exit!
tobyspark 17:fc68d40b8b1f 445 * To do this, we could just do nothing but we'd need to recreate screen and comms as they were.
tobyspark 17:fc68d40b8b1f 446 * Instead, lets just restart the mbed
tobyspark 17:fc68d40b8b1f 447 */
tobyspark 17:fc68d40b8b1f 448
tobyspark 17:fc68d40b8b1f 449 screen.clearBuffer();
tobyspark 17:fc68d40b8b1f 450 screen.textToBuffer("Self test complete", 0);
tobyspark 17:fc68d40b8b1f 451 screen.textToBuffer("Press to restart controller", 1);
tobyspark 17:fc68d40b8b1f 452 screen.sendBuffer();
tobyspark 17:fc68d40b8b1f 453
tobyspark 17:fc68d40b8b1f 454 while(!menuEnc.hasPressed()) {}
tobyspark 17:fc68d40b8b1f 455
tobyspark 17:fc68d40b8b1f 456 mbed_reset();
tobyspark 17:fc68d40b8b1f 457 }
tobyspark 17:fc68d40b8b1f 458
tobyspark 0:87aab40d5806 459 int main()
tobyspark 0:87aab40d5806 460 {
tobyspark 0:87aab40d5806 461 if (debug)
tobyspark 0:87aab40d5806 462 {
tobyspark 0:87aab40d5806 463 debug->printf("\r\n\r\n");
tobyspark 0:87aab40d5806 464 debug->printf("*spark d-fuser -----------\r\n");
tobyspark 0:87aab40d5806 465 debug->printf(" debug channel\r\n");
tobyspark 0:87aab40d5806 466 }
tobyspark 2:50043054e4f7 467
tobyspark 2:50043054e4f7 468 // Set display font
tobyspark 2:50043054e4f7 469 screen.fontStartCharacter = &characterBytesStartChar;
tobyspark 2:50043054e4f7 470 screen.fontEndCharacter = &characterBytesEndChar;
tobyspark 2:50043054e4f7 471 screen.fontCharacters = characterBytes;
tobyspark 2:50043054e4f7 472
tobyspark 0:87aab40d5806 473 // Splash screen
tobyspark 2:50043054e4f7 474 screen.imageToBuffer(spkDisplayLogo);
tobyspark 0:87aab40d5806 475 screen.textToBuffer("SPK:D-Fuser",0);
tobyspark 13:3796bde6ba8f 476 screen.textToBuffer(string("SW ") + kSPKDFSoftwareVersion,1);
tobyspark 5:f8b285ca41ba 477 screen.sendBuffer();
tobyspark 0:87aab40d5806 478
tobyspark 11:0783cfbeb746 479 // Load saved settings
tobyspark 16:52484666b323 480 bool settingsAreCustom = false;
tobyspark 13:3796bde6ba8f 481 /* CRAZY, see note in spk_settings.h
tobyspark 16:52484666b323 482 settingsAreCustom = settings.load(kSPKDFSettingsFilename);
tobyspark 16:52484666b323 483 if (settingsAreCustom)
tobyspark 13:3796bde6ba8f 484 {screen.textToBuffer("Settings Read",2); screen.sendBuffer();}
tobyspark 13:3796bde6ba8f 485 else
tobyspark 13:3796bde6ba8f 486 {screen.textToBuffer("Settings NOT Read",2); screen.sendBuffer();}
tobyspark 13:3796bde6ba8f 487 */
tobyspark 0:87aab40d5806 488 // Set menu structure
tobyspark 0:87aab40d5806 489 mixModeMenu.title = "Mix Mode";
tobyspark 15:4b394c64b461 490 mixModeMenu.addMenuItem("Blend", mixBlend, 0);
tobyspark 11:0783cfbeb746 491 for (int i=0; i < settings.keyerSetCount(); i++)
tobyspark 11:0783cfbeb746 492 {
tobyspark 15:4b394c64b461 493 mixModeMenu.addMenuItem(settings.keyerParamName(i), mixKey+i, 0);
tobyspark 11:0783cfbeb746 494 }
tobyspark 0:87aab40d5806 495
tobyspark 0:87aab40d5806 496 resolutionMenu.title = "Resolution";
tobyspark 16:52484666b323 497 for (int i=0; i < settings.resolutionsCount(); i++)
tobyspark 16:52484666b323 498 {
tobyspark 16:52484666b323 499 resolutionMenu.addMenuItem(settings.resolutionName(i), settings.resolutionIndex(i), settings.resolutionEDIDIndex(i));
tobyspark 16:52484666b323 500 }
tobyspark 0:87aab40d5806 501
tobyspark 5:f8b285ca41ba 502 commsMenu.title = "Network Mode";
tobyspark 1:f9fca21102e0 503 commsMenu.addMenuItem("None", commsNone, 0);
tobyspark 1:f9fca21102e0 504 commsMenu.addMenuItem("OSC", commsOSC, 0);
tobyspark 1:f9fca21102e0 505 commsMenu.addMenuItem("ArtNet", commsArtNet, 0);
tobyspark 5:f8b285ca41ba 506 commsMenu.addMenuItem("DMX In", commsDMXIn, 0);
tobyspark 5:f8b285ca41ba 507 commsMenu.addMenuItem("DMX Out", commsDMXOut, 0);
tobyspark 1:f9fca21102e0 508
tobyspark 15:4b394c64b461 509 advancedMenu.title = "Troubleshooting";
tobyspark 12:c270870bdd23 510 advancedMenu.addMenuItem("HDCP Off", advancedHDCPOff, 0);
tobyspark 15:4b394c64b461 511 advancedMenu.addMenuItem("HDCP On", advancedHDCPOn, 0);
tobyspark 17:fc68d40b8b1f 512 advancedMenu.addMenuItem("Conform Processor", advancedConformProcessor, 0);
tobyspark 16:52484666b323 513 if (settingsAreCustom) advancedMenu.addMenuItem("Revert to defaults", advancedLoadDefaults, 0);
tobyspark 15:4b394c64b461 514 advancedMenu.addMenuItem("Start Self-Test", advancedSelfTest, 0);
tobyspark 12:c270870bdd23 515
tobyspark 0:87aab40d5806 516 mainMenu.title = "Main Menu";
tobyspark 0:87aab40d5806 517 mainMenu.addMenuItem(&mixModeMenu);
tobyspark 0:87aab40d5806 518 mainMenu.addMenuItem(&resolutionMenu);
tobyspark 1:f9fca21102e0 519 mainMenu.addMenuItem(&commsMenu);
tobyspark 12:c270870bdd23 520 mainMenu.addMenuItem(&advancedMenu);
tobyspark 0:87aab40d5806 521
tobyspark 0:87aab40d5806 522 selectedMenu = &mainMenu;
tobyspark 0:87aab40d5806 523 lastSelectedMenu = &mainMenu;
tobyspark 0:87aab40d5806 524
tobyspark 0:87aab40d5806 525 // Misc I/O stuff
tobyspark 0:87aab40d5806 526
tobyspark 0:87aab40d5806 527 fadeAPO.period(0.001);
tobyspark 0:87aab40d5806 528 fadeBPO.period(0.001);
tobyspark 0:87aab40d5806 529
tobyspark 20:8b92d7922c48 530 // Test for TV One connectivity and determine unit type
tobyspark 20:8b92d7922c48 531 // Ah. My 750 reports zero for these types, both over RS232 and on OSD.
tobyspark 20:8b92d7922c48 532 if (false)
tobyspark 20:8b92d7922c48 533 {
tobyspark 20:8b92d7922c48 534 int ack[SPKTVOne::standardAckLength];
tobyspark 20:8b92d7922c48 535
tobyspark 20:8b92d7922c48 536 // kTV1FunctionReadSoftwareVersion
tobyspark 20:8b92d7922c48 537 // kTV1FunctionReadProductType
tobyspark 20:8b92d7922c48 538 // kTV1FunctionReadBoardType
tobyspark 20:8b92d7922c48 539
tobyspark 20:8b92d7922c48 540 bool ok = tvOne.command(SPKTVOne::readCommand, ack, SPKTVOne::standardAckLength, 0, kTV1WindowIDA, kTV1FunctionReadSoftwareVersion, 0);
tobyspark 20:8b92d7922c48 541
tobyspark 20:8b92d7922c48 542 printf("\r\nOK: %s\r\n", ok ? "true" : "false");
tobyspark 20:8b92d7922c48 543
tobyspark 20:8b92d7922c48 544 for (int i =0; i<20; i++) printf("%c", ack[i]);
tobyspark 20:8b92d7922c48 545 printf("\r\n");
tobyspark 20:8b92d7922c48 546 }
tobyspark 0:87aab40d5806 547
tobyspark 12:c270870bdd23 548 // Display menu and framing lines
tobyspark 0:87aab40d5806 549 screen.horizLineToBuffer(kMenuLine1*pixInPage - 1);
tobyspark 0:87aab40d5806 550 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 551 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 552 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 553 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 554 screen.horizLineToBuffer(kMenuLine2*pixInPage + pixInPage);
tobyspark 1:f9fca21102e0 555 screen.horizLineToBuffer(kCommsStatusLine*pixInPage - 1);
tobyspark 1:f9fca21102e0 556 screen.clearBufferRow(kCommsStatusLine);
tobyspark 1:f9fca21102e0 557 screen.textToBuffer(commsMenu.selectedString(), kCommsStatusLine);
tobyspark 1:f9fca21102e0 558 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 0:87aab40d5806 559 screen.sendBuffer();
tobyspark 0:87aab40d5806 560
tobyspark 0:87aab40d5806 561
tobyspark 0:87aab40d5806 562 //// CONTROLS TEST
tobyspark 0:87aab40d5806 563
tobyspark 0:87aab40d5806 564 while (0) {
tobyspark 0:87aab40d5806 565 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 566 }
tobyspark 0:87aab40d5806 567
tobyspark 0:87aab40d5806 568 //// MIXER RUN
tobyspark 0:87aab40d5806 569
tobyspark 8:d46cc49f0f37 570 while (1)
tobyspark 8:d46cc49f0f37 571 {
tobyspark 1:f9fca21102e0 572 //// Task background things
tobyspark 5:f8b285ca41ba 573 if (ethernet && rj45Mode == rj45Ethernet)
tobyspark 5:f8b285ca41ba 574 {
tobyspark 5:f8b285ca41ba 575 if (debug) debug->printf("net poll");
tobyspark 5:f8b285ca41ba 576 Net::poll();
tobyspark 5:f8b285ca41ba 577 }
tobyspark 5:f8b285ca41ba 578
tobyspark 5:f8b285ca41ba 579 //// RJ45 SWITCH
tobyspark 5:f8b285ca41ba 580
tobyspark 5:f8b285ca41ba 581 if (rj45ModeDIN != rj45Mode)
tobyspark 1:f9fca21102e0 582 {
tobyspark 5:f8b285ca41ba 583 // update state
tobyspark 5:f8b285ca41ba 584 rj45Mode = rj45ModeDIN;
tobyspark 5:f8b285ca41ba 585 if (rj45Mode == rj45Ethernet) commsMenu.title = "Network Mode [Ethernet]";
tobyspark 5:f8b285ca41ba 586 if (rj45Mode == rj45DMX) commsMenu.title = "Network Mode [DMX]";
tobyspark 5:f8b285ca41ba 587
tobyspark 5:f8b285ca41ba 588 // cancel old comms
tobyspark 5:f8b285ca41ba 589 commsMode = commsNone;
tobyspark 5:f8b285ca41ba 590 commsMenu = commsMode;
tobyspark 5:f8b285ca41ba 591
tobyspark 5:f8b285ca41ba 592 // refresh display
tobyspark 5:f8b285ca41ba 593 if (selectedMenu == &commsMenu) screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 5:f8b285ca41ba 594 if (rj45Mode == rj45Ethernet) screen.textToBuffer("RJ45: Ethernet Engaged", kCommsStatusLine);
tobyspark 5:f8b285ca41ba 595 if (rj45Mode == rj45DMX) screen.textToBuffer("RJ45: DMX Engaged", kCommsStatusLine);
tobyspark 1:f9fca21102e0 596 }
tobyspark 1:f9fca21102e0 597
tobyspark 0:87aab40d5806 598 //// MENU
tobyspark 0:87aab40d5806 599
tobyspark 0:87aab40d5806 600 int menuChange = menuEnc.getChange();
tobyspark 0:87aab40d5806 601
tobyspark 0:87aab40d5806 602 // Update GUI
tobyspark 0:87aab40d5806 603 if (menuChange != 0)
tobyspark 0:87aab40d5806 604 {
tobyspark 0:87aab40d5806 605 if (debug) debug->printf("Menu changed by %i\r\n", menuChange);
tobyspark 0:87aab40d5806 606
tobyspark 0:87aab40d5806 607 *selectedMenu = selectedMenu->selectedIndex() + menuChange;
tobyspark 0:87aab40d5806 608
tobyspark 0:87aab40d5806 609 // update OLED line 2 here
tobyspark 0:87aab40d5806 610 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 611 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 612
tobyspark 0:87aab40d5806 613 if (debug) debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 614 }
tobyspark 0:87aab40d5806 615
tobyspark 0:87aab40d5806 616 // Action menu item
tobyspark 0:87aab40d5806 617 if (menuEnc.hasPressed())
tobyspark 0:87aab40d5806 618 {
tobyspark 0:87aab40d5806 619 if (debug) debug->printf("Action Menu Item!\r\n");
tobyspark 0:87aab40d5806 620
tobyspark 0:87aab40d5806 621 // Are we changing menus?
tobyspark 0:87aab40d5806 622 if (selectedMenu->type() == menuOfMenus)
tobyspark 0:87aab40d5806 623 {
tobyspark 0:87aab40d5806 624 // point selected menu to the new menu
tobyspark 0:87aab40d5806 625 // 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 626 if (selectedMenu == &mainMenu) selectedMenu = mainMenu.selectedMenu();
tobyspark 0:87aab40d5806 627 else if (debug) debug->printf("FIXME: You've missed a SPKMenuOfMenus");
tobyspark 0:87aab40d5806 628
tobyspark 0:87aab40d5806 629 // reset the selection within that menu to the first position
tobyspark 0:87aab40d5806 630 (*selectedMenu) = 0;
tobyspark 0:87aab40d5806 631
tobyspark 0:87aab40d5806 632 // update OLED lines 1&2
tobyspark 0:87aab40d5806 633 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 634 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 635 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 636 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 637
tobyspark 0:87aab40d5806 638 if (debug)
tobyspark 0:87aab40d5806 639 {
tobyspark 0:87aab40d5806 640 debug->printf("\r\n");
tobyspark 0:87aab40d5806 641 debug->printf("%s \r\n", selectedMenu->title.c_str());
tobyspark 0:87aab40d5806 642 debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 643 }
tobyspark 0:87aab40d5806 644 }
tobyspark 0:87aab40d5806 645 // Are we cancelling?
tobyspark 0:87aab40d5806 646 else if (selectedMenu->type() == payload && selectedMenu->selectedIndex() == 0)
tobyspark 0:87aab40d5806 647 {
tobyspark 0:87aab40d5806 648 selectedMenu = lastSelectedMenu;
tobyspark 0:87aab40d5806 649
tobyspark 0:87aab40d5806 650 // update OLED lines 1&2
tobyspark 0:87aab40d5806 651 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 652 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 653 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 654 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 655
tobyspark 0:87aab40d5806 656 if (debug)
tobyspark 0:87aab40d5806 657 {
tobyspark 0:87aab40d5806 658 debug->printf("\r\n");
tobyspark 0:87aab40d5806 659 debug->printf("%s \r\n", selectedMenu->title.c_str());
tobyspark 0:87aab40d5806 660 debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 661 }
tobyspark 0:87aab40d5806 662 }
tobyspark 0:87aab40d5806 663 // With that out of the way, we should be actioning a specific menu's payload?
tobyspark 0:87aab40d5806 664 else if (selectedMenu == &mixModeMenu)
tobyspark 0:87aab40d5806 665 {
tobyspark 5:f8b285ca41ba 666 mixMode = mixModeMenu.selectedPayload1();
tobyspark 5:f8b285ca41ba 667
tobyspark 9:f83eadd8917a 668 bool ok = true;
tobyspark 0:87aab40d5806 669 std::string sentOK;
tobyspark 0:87aab40d5806 670 std::stringstream sentMSG;
tobyspark 0:87aab40d5806 671
tobyspark 11:0783cfbeb746 672 // Set Keyer
tobyspark 15:4b394c64b461 673 if (mixModeMenu.selectedPayload1() < mixKey)
tobyspark 11:0783cfbeb746 674 {
tobyspark 11:0783cfbeb746 675 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
tobyspark 11:0783cfbeb746 676 sentMSG << "Keyer Off";
tobyspark 11:0783cfbeb746 677 }
tobyspark 11:0783cfbeb746 678 else
tobyspark 11:0783cfbeb746 679 {
tobyspark 11:0783cfbeb746 680 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
tobyspark 11:0783cfbeb746 681 sentMSG << "Keyer On";
tobyspark 11:0783cfbeb746 682
tobyspark 15:4b394c64b461 683 int index = mixModeMenu.selectedPayload1() - mixKey;
tobyspark 11:0783cfbeb746 684 ok = ok && setKeyParamsTo(index);
tobyspark 11:0783cfbeb746 685 sentMSG << " with " << index;
tobyspark 0:87aab40d5806 686 }
tobyspark 0:87aab40d5806 687
tobyspark 0:87aab40d5806 688 if (ok) sentOK = "Sent:";
tobyspark 0:87aab40d5806 689 else sentOK = "Send Error:";
tobyspark 0:87aab40d5806 690
tobyspark 1:f9fca21102e0 691 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 1:f9fca21102e0 692 screen.textToBuffer(sentOK + sentMSG.str(), kTVOneStatusLine);
tobyspark 0:87aab40d5806 693
tobyspark 0:87aab40d5806 694 if (debug) { debug->printf("Changing mix mode"); }
tobyspark 0:87aab40d5806 695 }
tobyspark 0:87aab40d5806 696 else if (selectedMenu == &resolutionMenu)
tobyspark 0:87aab40d5806 697 {
tobyspark 9:f83eadd8917a 698 bool ok = true;
tobyspark 0:87aab40d5806 699
tobyspark 0:87aab40d5806 700 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputResolution, resolutionMenu.selectedPayload1());
tobyspark 0:87aab40d5806 701 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, resolutionMenu.selectedPayload2());
tobyspark 0:87aab40d5806 702 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, resolutionMenu.selectedPayload2());
tobyspark 0:87aab40d5806 703
tobyspark 0:87aab40d5806 704 std::string sentOK;
tobyspark 0:87aab40d5806 705 if (ok) sentOK = "Sent: ";
tobyspark 0:87aab40d5806 706 else sentOK = "Send Error: ";
tobyspark 0:87aab40d5806 707
tobyspark 0:87aab40d5806 708 std::stringstream sentMSG;
tobyspark 0:87aab40d5806 709 sentMSG << "Res " << resolutionMenu.selectedPayload1() << ", EDID " << resolutionMenu.selectedPayload2();
tobyspark 0:87aab40d5806 710
tobyspark 1:f9fca21102e0 711 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 1:f9fca21102e0 712 screen.textToBuffer(sentOK + sentMSG.str(), kTVOneStatusLine);
tobyspark 0:87aab40d5806 713
tobyspark 0:87aab40d5806 714 if (debug) { debug->printf("Changing resolution"); }
tobyspark 0:87aab40d5806 715 }
tobyspark 1:f9fca21102e0 716 else if (selectedMenu == &commsMenu)
tobyspark 1:f9fca21102e0 717 {
tobyspark 5:f8b285ca41ba 718 std::string commsTypeString = "Network: --";
tobyspark 1:f9fca21102e0 719 std::stringstream commsStatus;
tobyspark 1:f9fca21102e0 720
tobyspark 1:f9fca21102e0 721 // Tear down any existing comms
tobyspark 1:f9fca21102e0 722 // This is the action of commsNone
tobyspark 1:f9fca21102e0 723 // And also clears the way for other comms actions
tobyspark 5:f8b285ca41ba 724 if (osc) {delete osc; osc = NULL;}
tobyspark 5:f8b285ca41ba 725 if (ethernet) {delete ethernet; ethernet = NULL;}
tobyspark 5:f8b285ca41ba 726 if (artNet) {delete artNet; artNet = NULL;}
tobyspark 5:f8b285ca41ba 727 if (dmx) {delete dmx; dmx = NULL;}
tobyspark 5:f8b285ca41ba 728
tobyspark 5:f8b285ca41ba 729 // Ensure we can't change to comms modes the hardware isn't switched to
tobyspark 5:f8b285ca41ba 730 if (rj45Mode == rj45DMX && (commsMenu.selectedPayload1() == commsOSC || commsMenu.selectedPayload1() == commsArtNet))
tobyspark 1:f9fca21102e0 731 {
tobyspark 5:f8b285ca41ba 732 commsTypeString = "RJ45 not in Ethernet mode";
tobyspark 5:f8b285ca41ba 733 }
tobyspark 5:f8b285ca41ba 734 else if (rj45Mode == rj45Ethernet && (commsMenu.selectedPayload1() == commsDMXIn || commsMenu.selectedPayload1() == commsDMXOut))
tobyspark 5:f8b285ca41ba 735 {
tobyspark 5:f8b285ca41ba 736 commsTypeString = "RJ45 not in DMX mode";
tobyspark 5:f8b285ca41ba 737 }
tobyspark 5:f8b285ca41ba 738 // Action!
tobyspark 5:f8b285ca41ba 739 else if (commsMenu.selectedPayload1() == commsOSC)
tobyspark 5:f8b285ca41ba 740 {
tobyspark 5:f8b285ca41ba 741 commsMode = commsOSC;
tobyspark 5:f8b285ca41ba 742 commsTypeString = "OSC: ";
tobyspark 1:f9fca21102e0 743
tobyspark 1:f9fca21102e0 744 ethernet = new EthernetNetIf(
tobyspark 1:f9fca21102e0 745 IpAddr(kOSCMbedIPAddress),
tobyspark 1:f9fca21102e0 746 IpAddr(kOSCMbedSubnetMask),
tobyspark 1:f9fca21102e0 747 IpAddr(kOSCMbedGateway),
tobyspark 1:f9fca21102e0 748 IpAddr(kOSCMbedDNS)
tobyspark 1:f9fca21102e0 749 );
tobyspark 3:033d2b7768f3 750
tobyspark 1:f9fca21102e0 751 EthernetErr ethError = ethernet->setup();
tobyspark 1:f9fca21102e0 752 if(ethError)
tobyspark 1:f9fca21102e0 753 {
tobyspark 1:f9fca21102e0 754 if (debug) debug->printf("Ethernet setup error, %d", ethError);
tobyspark 1:f9fca21102e0 755 commsStatus << "Ethernet setup failed";
tobyspark 5:f8b285ca41ba 756 commsMenu = commsNone;
tobyspark 1:f9fca21102e0 757 // break out of here. this setup should be a function that returns a boolean
tobyspark 1:f9fca21102e0 758 }
tobyspark 1:f9fca21102e0 759
tobyspark 1:f9fca21102e0 760 osc = new OSCClass();
tobyspark 3:033d2b7768f3 761 osc->setReceiveMessage(&recMessage);
tobyspark 1:f9fca21102e0 762 osc->begin(kOSCMbedPort);
tobyspark 1:f9fca21102e0 763
tobyspark 3:033d2b7768f3 764 commsStatus << "Listening on " << kOSCMbedPort;
tobyspark 1:f9fca21102e0 765 }
tobyspark 1:f9fca21102e0 766 else if (commsMenu.selectedPayload1() == commsArtNet)
tobyspark 1:f9fca21102e0 767 {
tobyspark 5:f8b285ca41ba 768 commsMode = commsArtNet;
tobyspark 5:f8b285ca41ba 769 commsTypeString = "ArtNet: ";
tobyspark 3:033d2b7768f3 770
tobyspark 3:033d2b7768f3 771 artNet = new DmxArtNet();
tobyspark 1:f9fca21102e0 772
tobyspark 3:033d2b7768f3 773 artNet->BindIpAddress = IpAddr(kArtNetBindIPAddress);
tobyspark 3:033d2b7768f3 774 artNet->BCastAddress = IpAddr(kArtNetBroadcastAddress);
tobyspark 3:033d2b7768f3 775
tobyspark 3:033d2b7768f3 776 artNet->InitArtPollReplyDefaults();
tobyspark 3:033d2b7768f3 777
tobyspark 3:033d2b7768f3 778 artNet->ArtPollReply.PortType[0] = 128; // output
tobyspark 3:033d2b7768f3 779 artNet->ArtPollReply.PortType[2] = 64; // input
tobyspark 3:033d2b7768f3 780 artNet->ArtPollReply.GoodInput[2] = 4;
tobyspark 3:033d2b7768f3 781
tobyspark 3:033d2b7768f3 782 artNet->Init();
tobyspark 3:033d2b7768f3 783 artNet->SendArtPollReply(); // announce to art-net nodes
tobyspark 3:033d2b7768f3 784
tobyspark 3:033d2b7768f3 785 commsStatus << "Listening";
tobyspark 1:f9fca21102e0 786 }
tobyspark 5:f8b285ca41ba 787 else if (commsMenu.selectedPayload1() == commsDMXIn)
tobyspark 1:f9fca21102e0 788 {
tobyspark 5:f8b285ca41ba 789 commsMode = commsDMXIn;
tobyspark 5:f8b285ca41ba 790 commsTypeString = "DMX In: ";
tobyspark 1:f9fca21102e0 791
tobyspark 5:f8b285ca41ba 792 dmxDirectionDOUT = 0;
tobyspark 5:f8b285ca41ba 793
tobyspark 5:f8b285ca41ba 794 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 1:f9fca21102e0 795 }
tobyspark 5:f8b285ca41ba 796 else if (commsMenu.selectedPayload1() == commsDMXOut)
tobyspark 5:f8b285ca41ba 797 {
tobyspark 5:f8b285ca41ba 798 commsMode = commsDMXOut;
tobyspark 5:f8b285ca41ba 799 commsTypeString = "DMX Out: ";
tobyspark 5:f8b285ca41ba 800
tobyspark 5:f8b285ca41ba 801 dmxDirectionDOUT = 1;
tobyspark 5:f8b285ca41ba 802
tobyspark 5:f8b285ca41ba 803 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 5:f8b285ca41ba 804 }
tobyspark 5:f8b285ca41ba 805
tobyspark 1:f9fca21102e0 806 screen.clearBufferRow(kCommsStatusLine);
tobyspark 5:f8b285ca41ba 807 screen.textToBuffer(commsTypeString + commsStatus.str(), kCommsStatusLine);
tobyspark 1:f9fca21102e0 808 }
tobyspark 12:c270870bdd23 809 else if (selectedMenu == &advancedMenu)
tobyspark 12:c270870bdd23 810 {
tobyspark 12:c270870bdd23 811 if (advancedMenu.selectedPayload1() == advancedHDCPOff)
tobyspark 12:c270870bdd23 812 {
tobyspark 12:c270870bdd23 813 bool ok = false;
tobyspark 12:c270870bdd23 814
tobyspark 15:4b394c64b461 815 ok = tvOne.setHDCPOn(false);
tobyspark 12:c270870bdd23 816
tobyspark 12:c270870bdd23 817 std::string sendOK = ok ? "Sent: HDCP Off" : "Send Error: HDCP Off";
tobyspark 12:c270870bdd23 818
tobyspark 12:c270870bdd23 819 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 12:c270870bdd23 820 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 12:c270870bdd23 821 }
tobyspark 15:4b394c64b461 822 else if (advancedMenu.selectedPayload1() == advancedHDCPOn)
tobyspark 15:4b394c64b461 823 {
tobyspark 15:4b394c64b461 824 bool ok = false;
tobyspark 15:4b394c64b461 825
tobyspark 15:4b394c64b461 826 ok = tvOne.setHDCPOn(true);
tobyspark 15:4b394c64b461 827
tobyspark 15:4b394c64b461 828 std::string sendOK = ok ? "Sent: HDCP On" : "Send Error: HDCP On";
tobyspark 15:4b394c64b461 829
tobyspark 15:4b394c64b461 830 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 15:4b394c64b461 831 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 15:4b394c64b461 832 }
tobyspark 17:fc68d40b8b1f 833 else if (advancedMenu.selectedPayload1() == advancedConformProcessor)
tobyspark 17:fc68d40b8b1f 834 {
tobyspark 20:8b92d7922c48 835 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 20:8b92d7922c48 836 screen.textToBuffer("Conforming...", kTVOneStatusLine);
tobyspark 20:8b92d7922c48 837 screen.sendBuffer();
tobyspark 20:8b92d7922c48 838
tobyspark 17:fc68d40b8b1f 839 bool ok = conformProcessor();
tobyspark 17:fc68d40b8b1f 840
tobyspark 17:fc68d40b8b1f 841 std::string sendOK = ok ? "Conform success" : "Send Error: Conform";
tobyspark 17:fc68d40b8b1f 842
tobyspark 17:fc68d40b8b1f 843 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 17:fc68d40b8b1f 844 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 17:fc68d40b8b1f 845 }
tobyspark 16:52484666b323 846 else if (advancedMenu.selectedPayload1() == advancedLoadDefaults)
tobyspark 16:52484666b323 847 {
tobyspark 16:52484666b323 848 settings.loadDefaults();
tobyspark 16:52484666b323 849
tobyspark 16:52484666b323 850 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 16:52484666b323 851 screen.textToBuffer("Controller reverted", kTVOneStatusLine);
tobyspark 16:52484666b323 852 }
tobyspark 15:4b394c64b461 853 else if (advancedMenu.selectedPayload1() == advancedSelfTest)
tobyspark 15:4b394c64b461 854 {
tobyspark 17:fc68d40b8b1f 855 selfTest();
tobyspark 15:4b394c64b461 856 }
tobyspark 12:c270870bdd23 857 }
tobyspark 0:87aab40d5806 858 else
tobyspark 0:87aab40d5806 859 {
tobyspark 0:87aab40d5806 860 if (debug) { debug->printf("Warning: No action identified"); }
tobyspark 0:87aab40d5806 861 }
tobyspark 0:87aab40d5806 862 }
tobyspark 0:87aab40d5806 863
tobyspark 2:50043054e4f7 864 // Send any updates to the display
tobyspark 2:50043054e4f7 865 screen.sendBuffer();
tobyspark 5:f8b285ca41ba 866
tobyspark 0:87aab40d5806 867
tobyspark 5:f8b285ca41ba 868 //// MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIXMIX MIX MIXMIX MIX MIX MIX MIX MIXMIX MIX MIX
tobyspark 0:87aab40d5806 869
tobyspark 0:87aab40d5806 870 bool updateFade = false;
tobyspark 3:033d2b7768f3 871 float xFade = 0;
tobyspark 3:033d2b7768f3 872 float fadeUp = 1;
tobyspark 3:033d2b7768f3 873
tobyspark 3:033d2b7768f3 874 //// TASK: Process control surface
tobyspark 3:033d2b7768f3 875
tobyspark 0:87aab40d5806 876 // Get new states of tap buttons, remembering at end of loop() assign these current values to the previous variables
tobyspark 5:f8b285ca41ba 877 const bool tapLeft = !tapLeftDIN;
tobyspark 5:f8b285ca41ba 878 const bool tapRight = !tapRightDIN;
tobyspark 0:87aab40d5806 879
tobyspark 17:fc68d40b8b1f 880 // We're taking a further median of the AINs on top of mbed libs v29.
tobyspark 17:fc68d40b8b1f 881 // This takes some values from last passes and most from now. With debug off, seem to need median size > 5
tobyspark 17:fc68d40b8b1f 882 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 883 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 884 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 885 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 886 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 887 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 888 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 889 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 890 const float xFadeAINCached = xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 891 const float fadeUpAINCached = fadeUpFilter.process(fadeUpAIN.read());
tobyspark 0:87aab40d5806 892
tobyspark 0:87aab40d5806 893 // When a tap is depressed, we can ignore any move of the crossfader but not fade to black
tobyspark 0:87aab40d5806 894 if (tapLeft || tapRight)
tobyspark 0:87aab40d5806 895 {
tobyspark 5:f8b285ca41ba 896 // If both are pressed, take to the one that is new, ie. not the first pressed.
tobyspark 0:87aab40d5806 897 if (tapLeft && tapRight)
tobyspark 0:87aab40d5806 898 {
tobyspark 5:f8b285ca41ba 899 xFade = tapLeftWasFirstPressed ? 1 : 0;
tobyspark 0:87aab40d5806 900 }
tobyspark 5:f8b285ca41ba 901 // If just one is pressed, take to that and remember which is pressed
tobyspark 5:f8b285ca41ba 902 else if (tapLeft)
tobyspark 5:f8b285ca41ba 903 {
tobyspark 5:f8b285ca41ba 904 xFade = 0;
tobyspark 5:f8b285ca41ba 905 tapLeftWasFirstPressed = 1;
tobyspark 5:f8b285ca41ba 906 }
tobyspark 5:f8b285ca41ba 907 else if (tapRight)
tobyspark 5:f8b285ca41ba 908 {
tobyspark 5:f8b285ca41ba 909 xFade = 1;
tobyspark 5:f8b285ca41ba 910 tapLeftWasFirstPressed = 0;
tobyspark 5:f8b285ca41ba 911 }
tobyspark 5:f8b285ca41ba 912 }
tobyspark 18:ebe5da639a6a 913 else xFade = 1.0 - fadeCalc(xFadeAINCached, xFadeTolerance);
tobyspark 0:87aab40d5806 914
tobyspark 0:87aab40d5806 915 fadeUp = 1.0 - fadeCalc(fadeUpAINCached, fadeUpTolerance);
tobyspark 0:87aab40d5806 916
tobyspark 3:033d2b7768f3 917 //// TASK: Process Network Comms
tobyspark 5:f8b285ca41ba 918 if (commsMode == commsOSC)
tobyspark 3:033d2b7768f3 919 {
tobyspark 3:033d2b7768f3 920 if (osc->newMessage)
tobyspark 3:033d2b7768f3 921 {
tobyspark 3:033d2b7768f3 922 osc->newMessage = false; // fixme!
tobyspark 3:033d2b7768f3 923 processOSC(xFade, fadeUp);
tobyspark 3:033d2b7768f3 924 }
tobyspark 3:033d2b7768f3 925 }
tobyspark 3:033d2b7768f3 926
tobyspark 5:f8b285ca41ba 927 if (commsMode == commsArtNet)
tobyspark 3:033d2b7768f3 928 {
tobyspark 3:033d2b7768f3 929 if (artNet->Work()) processArtNet(xFade, fadeUp);
tobyspark 3:033d2b7768f3 930 }
tobyspark 3:033d2b7768f3 931
tobyspark 5:f8b285ca41ba 932 if (commsMode == commsDMXIn)
tobyspark 5:f8b285ca41ba 933 {
tobyspark 5:f8b285ca41ba 934 processDMXIn(xFade, fadeUp);
tobyspark 5:f8b285ca41ba 935 }
tobyspark 5:f8b285ca41ba 936
tobyspark 5:f8b285ca41ba 937 if (commsMode == commsDMXOut)
tobyspark 5:f8b285ca41ba 938 {
tobyspark 5:f8b285ca41ba 939 processDMXOut(xFade, fadeUp);
tobyspark 5:f8b285ca41ba 940 }
tobyspark 0:87aab40d5806 941
tobyspark 0:87aab40d5806 942 // Calculate new A&B fade percents
tobyspark 0:87aab40d5806 943 int newFadeAPercent = 0;
tobyspark 0:87aab40d5806 944 int newFadeBPercent = 0;
tobyspark 0:87aab40d5806 945
tobyspark 15:4b394c64b461 946 if (mixMode == mixBlend)
tobyspark 11:0783cfbeb746 947 {
tobyspark 9:f83eadd8917a 948 if (fadeUp < 1.0)
tobyspark 9:f83eadd8917a 949 {
tobyspark 9:f83eadd8917a 950 // 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 951 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 9:f83eadd8917a 952 newFadeBPercent = xFade * fadeUp * 100.0;
tobyspark 9:f83eadd8917a 953 }
tobyspark 9:f83eadd8917a 954 else
tobyspark 9:f83eadd8917a 955 {
tobyspark 9:f83eadd8917a 956 // 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 957 newFadeAPercent = (1.0-xFade) * 100.0;
tobyspark 9:f83eadd8917a 958 newFadeBPercent = 100.0;
tobyspark 9:f83eadd8917a 959 }
tobyspark 11:0783cfbeb746 960 }
tobyspark 15:4b394c64b461 961 else if (mixMode == mixAdditive)
tobyspark 11:0783cfbeb746 962 {
tobyspark 9:f83eadd8917a 963 // 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 964 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 0:87aab40d5806 965 newFadeBPercent = xFade * fadeUp * 100.0;
tobyspark 11:0783cfbeb746 966 }
tobyspark 15:4b394c64b461 967 else if (mixMode >= mixKey)
tobyspark 11:0783cfbeb746 968 {
tobyspark 0:87aab40d5806 969 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 0:87aab40d5806 970 newFadeBPercent = fadeUp * 100.0;
tobyspark 0:87aab40d5806 971 }
tobyspark 0:87aab40d5806 972
tobyspark 17:fc68d40b8b1f 973 //// TASK: Send to TVOne if percents have changed
tobyspark 17:fc68d40b8b1f 974
tobyspark 17:fc68d40b8b1f 975 // No amount of median filtering is stopping flipflopping between two adjacent percents, so...
tobyspark 17:fc68d40b8b1f 976 bool fadeAPercentHasChanged;
tobyspark 17:fc68d40b8b1f 977 bool fadeBPercentHasChanged;
tobyspark 17:fc68d40b8b1f 978 if (oldFadeAPercent == newFadeAPercent && (newFadeAPercent == fadeAPercent - 1 || newFadeAPercent == fadeAPercent + 1))
tobyspark 17:fc68d40b8b1f 979 fadeAPercentHasChanged = false;
tobyspark 17:fc68d40b8b1f 980 else
tobyspark 17:fc68d40b8b1f 981 fadeAPercentHasChanged = newFadeAPercent != fadeAPercent;
tobyspark 17:fc68d40b8b1f 982 if (oldFadeBPercent == newFadeBPercent && (newFadeBPercent == fadeBPercent - 1 || newFadeBPercent == fadeBPercent + 1))
tobyspark 17:fc68d40b8b1f 983 fadeBPercentHasChanged = false;
tobyspark 17:fc68d40b8b1f 984 else
tobyspark 17:fc68d40b8b1f 985 fadeBPercentHasChanged = newFadeBPercent != fadeBPercent;
tobyspark 17:fc68d40b8b1f 986
tobyspark 9:f83eadd8917a 987 // We want to send the higher first, otherwise black flashes can happen on taps
tobyspark 17:fc68d40b8b1f 988 if (fadeAPercentHasChanged && newFadeAPercent >= newFadeBPercent)
tobyspark 8:d46cc49f0f37 989 {
tobyspark 17:fc68d40b8b1f 990 oldFadeAPercent = fadeAPercent;
tobyspark 0:87aab40d5806 991 fadeAPercent = newFadeAPercent;
tobyspark 0:87aab40d5806 992 updateFade = true;
tobyspark 0:87aab40d5806 993
tobyspark 0:87aab40d5806 994 fadeAPO = fadeAPercent / 100.0;
tobyspark 0:87aab40d5806 995 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 0:87aab40d5806 996 }
tobyspark 17:fc68d40b8b1f 997 if (fadeBPercentHasChanged)
tobyspark 8:d46cc49f0f37 998 {
tobyspark 17:fc68d40b8b1f 999 oldFadeBPercent = fadeBPercent;
tobyspark 0:87aab40d5806 1000 fadeBPercent = newFadeBPercent;
tobyspark 0:87aab40d5806 1001 updateFade = true;
tobyspark 0:87aab40d5806 1002
tobyspark 0:87aab40d5806 1003 fadeBPO = fadeBPercent / 100.0;
tobyspark 0:87aab40d5806 1004 tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 0:87aab40d5806 1005 }
tobyspark 17:fc68d40b8b1f 1006 if (fadeAPercentHasChanged && newFadeAPercent < newFadeBPercent)
tobyspark 9:f83eadd8917a 1007 {
tobyspark 17:fc68d40b8b1f 1008 oldFadeAPercent = fadeAPercent;
tobyspark 9:f83eadd8917a 1009 fadeAPercent = newFadeAPercent;
tobyspark 9:f83eadd8917a 1010 updateFade = true;
tobyspark 9:f83eadd8917a 1011
tobyspark 9:f83eadd8917a 1012 fadeAPO = fadeAPercent / 100.0;
tobyspark 9:f83eadd8917a 1013 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 9:f83eadd8917a 1014 }
tobyspark 8:d46cc49f0f37 1015 if (updateFade && debug)
tobyspark 8:d46cc49f0f37 1016 {
tobyspark 0:87aab40d5806 1017 //debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAIN.read(), fadeUpAIN.read());
tobyspark 0:87aab40d5806 1018 debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAINCached, fadeUpAINCached);
tobyspark 0:87aab40d5806 1019 debug->printf("xFade = %3f fadeUp = %3f fadeA% = %i fadeB% = %i \r\n", xFade, fadeUp, fadeAPercent, fadeBPercent);
tobyspark 18:ebe5da639a6a 1020 debug->printf("\r\n");
tobyspark 0:87aab40d5806 1021 }
tobyspark 0:87aab40d5806 1022 }
tobyspark 0:87aab40d5806 1023 }