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:
Sun Nov 04 13:35:46 2012 +0000
Revision:
33:e6672a9bd571
Parent:
32:9f9eb3583bfa
Child:
34:69dfe64e7e6b
Comms redux

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 30:873979018850 39 * v20 - Keying values and resolutions load from USB mass storage - September'12
tobyspark 30:873979018850 40 * v21 - Mixing behaviour upgrade: blend-additive as continuum, test cards on startup if no valid source - October'12
tobyspark 10:c011b0e5c17e 41 * vxx - TODO: Set keying values from controller, requires a guided, step-through process for user
tobyspark 8:d46cc49f0f37 42 * vxx - TODO: Defaults load/save from USB mass storage
tobyspark 30:873979018850 43 * vxx - TODO: EDID passthrough override
tobyspark 8:d46cc49f0f37 44 * vxx - TODO: EDID upload from USB mass storage
tobyspark 8:d46cc49f0f37 45 * vxx - TODO: EDID creation from resolution
tobyspark 8:d46cc49f0f37 46 */
tobyspark 8:d46cc49f0f37 47
tobyspark 0:87aab40d5806 48 #include "mbed.h"
tobyspark 0:87aab40d5806 49
tobyspark 0:87aab40d5806 50 #include "spk_tvone_mbed.h"
tobyspark 0:87aab40d5806 51 #include "spk_utils.h"
tobyspark 0:87aab40d5806 52 #include "spk_mRotaryEncoder.h"
tobyspark 0:87aab40d5806 53 #include "spk_oled_ssd1305.h"
tobyspark 2:50043054e4f7 54 #include "spk_oled_gfx.h"
tobyspark 11:0783cfbeb746 55 #include "spk_settings.h"
tobyspark 1:f9fca21102e0 56 #include "EthernetNetIf.h"
tobyspark 1:f9fca21102e0 57 #include "mbedOSC.h"
tobyspark 3:033d2b7768f3 58 #include "DmxArtNet.h"
tobyspark 5:f8b285ca41ba 59 #include "DMX.h"
tobyspark 17:fc68d40b8b1f 60 #include "filter.h"
tobyspark 0:87aab40d5806 61
tobyspark 30:873979018850 62 #define kSPKDFSoftwareVersion "21"
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 26:0299f8760715 114 #define kStringBufferLength 30
tobyspark 26:0299f8760715 115
tobyspark 0:87aab40d5806 116 //// DEBUG
tobyspark 0:87aab40d5806 117
tobyspark 0:87aab40d5806 118 // Comment out one or the other...
tobyspark 32:9f9eb3583bfa 119 //Serial *debug = new Serial(USBTX, USBRX); // For debugging via USB serial
tobyspark 32:9f9eb3583bfa 120 Serial *debug = NULL; // For release (no debugging)
tobyspark 0:87aab40d5806 121
tobyspark 15:4b394c64b461 122 //// SOFT RESET
tobyspark 15:4b394c64b461 123
tobyspark 15:4b394c64b461 124 extern "C" void mbed_reset();
tobyspark 15:4b394c64b461 125
tobyspark 0:87aab40d5806 126 //// mBED PIN ASSIGNMENTS
tobyspark 0:87aab40d5806 127
tobyspark 0:87aab40d5806 128 // Inputs
tobyspark 5:f8b285ca41ba 129 AnalogIn xFadeAIN(kMBED_AIN_XFADE);
tobyspark 5:f8b285ca41ba 130 AnalogIn fadeUpAIN(kMBED_AIN_FADEUP);
tobyspark 5:f8b285ca41ba 131 DigitalIn tapLeftDIN(kMBED_DIN_TAP_L);
tobyspark 5:f8b285ca41ba 132 DigitalIn tapRightDIN(kMBED_DIN_TAP_R);
tobyspark 17:fc68d40b8b1f 133 medianFilter xFadeFilter(9);
tobyspark 17:fc68d40b8b1f 134 medianFilter fadeUpFilter(9);
tobyspark 0:87aab40d5806 135
tobyspark 5:f8b285ca41ba 136 SPKRotaryEncoder menuEnc(kMBED_ENC_A, kMBED_ENC_B, kMBED_ENC_SW);
tobyspark 5:f8b285ca41ba 137
tobyspark 5:f8b285ca41ba 138 DigitalIn rj45ModeDIN(kMBED_DIN_ETHLO_DMXHI);
tobyspark 0:87aab40d5806 139
tobyspark 0:87aab40d5806 140 // Outputs
tobyspark 0:87aab40d5806 141 PwmOut fadeAPO(LED1);
tobyspark 0:87aab40d5806 142 PwmOut fadeBPO(LED2);
tobyspark 0:87aab40d5806 143
tobyspark 5:f8b285ca41ba 144 DigitalOut dmxDirectionDOUT(kMBED_DOUT_RS485_TXHI_RXLO);
tobyspark 5:f8b285ca41ba 145
tobyspark 0:87aab40d5806 146 // SPKTVOne(PinName txPin, PinName rxPin, PinName signWritePin, PinName signErrorPin, Serial *debugSerial)
tobyspark 5:f8b285ca41ba 147 SPKTVOne tvOne(kMBED_RS232_TTLTX, kMBED_RS232_TTLRX, LED3, LED4, debug);
tobyspark 0:87aab40d5806 148
tobyspark 0:87aab40d5806 149 // SPKDisplay(PinName mosi, PinName clk, PinName cs, PinName dc, PinName res, Serial *debugSerial = NULL);
tobyspark 5:f8b285ca41ba 150 SPKDisplay screen(kMBED_OLED_MOSI, kMBED_OLED_SCK, kMBED_OLED_CS, kMBED_OLED_DC, kMBED_OLED_RES, debug);
tobyspark 0:87aab40d5806 151
tobyspark 11:0783cfbeb746 152 // Saved Settings
tobyspark 11:0783cfbeb746 153 SPKSettings settings;
tobyspark 11:0783cfbeb746 154
tobyspark 0:87aab40d5806 155 // Menu
tobyspark 0:87aab40d5806 156 SPKMenu *selectedMenu;
tobyspark 23:909928cafb95 157 SPKMenu mainMenu;
tobyspark 23:909928cafb95 158 SPKMenu resolutionMenu;
tobyspark 12:c270870bdd23 159
tobyspark 24:49c6624119ae 160 SPKMenu mixModeMenu;
tobyspark 24:49c6624119ae 161 SPKMenu mixModeAdditiveMenu;
tobyspark 30:873979018850 162 enum { mixBlend, mixAdditive, mixKey }; // additive will require custom TVOne firmware.
tobyspark 30:873979018850 163 int mixMode = mixBlend; // Start with safe mix mode, and test to get out of it. Safe mode will work with inputs missing and without hold frames.
tobyspark 29:95a7efe30527 164 float fadeCurve = 0.0f; // 0 = "X", ie. as per blend, 1 = "/\", ie. as per additive <-- pictograms!
tobyspark 22:90054fe6d86c 165
tobyspark 23:909928cafb95 166 SPKMenu commsMenu;
tobyspark 5:f8b285ca41ba 167 enum { commsNone, commsOSC, commsArtNet, commsDMXIn, commsDMXOut};
tobyspark 5:f8b285ca41ba 168 int commsMode = commsNone;
tobyspark 22:90054fe6d86c 169
tobyspark 23:909928cafb95 170 SPKMenu advancedMenu;
tobyspark 32:9f9eb3583bfa 171 enum { advancedHDCPOn, advancedHDCPOff, advancedEDIDPassthrough, advancedEDIDInternal, advancedTestSources, advancedConformProcessor, advancedLoadDefaults, advancedSetResolutions };
tobyspark 1:f9fca21102e0 172
tobyspark 5:f8b285ca41ba 173 // RJ45 Comms
tobyspark 5:f8b285ca41ba 174 enum { rj45Ethernet = 0, rj45DMX = 1}; // These values from circuit
tobyspark 5:f8b285ca41ba 175 int rj45Mode = -1;
tobyspark 1:f9fca21102e0 176 EthernetNetIf *ethernet = NULL;
tobyspark 1:f9fca21102e0 177 OSCClass *osc = NULL;
tobyspark 33:e6672a9bd571 178 OSCMessage sendMessage;
tobyspark 33:e6672a9bd571 179 OSCMessage receiveMessage;
tobyspark 3:033d2b7768f3 180 DmxArtNet *artNet = NULL;
tobyspark 5:f8b285ca41ba 181 DMX *dmx = NULL;
tobyspark 0:87aab40d5806 182
tobyspark 3:033d2b7768f3 183 // Fade logic constants
tobyspark 0:87aab40d5806 184 const float xFadeTolerance = 0.05;
tobyspark 0:87aab40d5806 185 const float fadeUpTolerance = 0.05;
tobyspark 0:87aab40d5806 186
tobyspark 0:87aab40d5806 187 // A&B Fade as resolved percent
tobyspark 0:87aab40d5806 188 int fadeAPercent = 0;
tobyspark 0:87aab40d5806 189 int fadeBPercent = 0;
tobyspark 17:fc68d40b8b1f 190 int oldFadeAPercent = 0;
tobyspark 17:fc68d40b8b1f 191 int oldFadeBPercent = 0;
tobyspark 0:87aab40d5806 192
tobyspark 0:87aab40d5806 193 // Tap button states
tobyspark 5:f8b285ca41ba 194 bool tapLeftWasFirstPressed = false;
tobyspark 0:87aab40d5806 195
tobyspark 0:87aab40d5806 196 // Key mode parameters
tobyspark 0:87aab40d5806 197 int keyerParamsSet = -1; // last keyParams index uploaded to unit
tobyspark 0:87aab40d5806 198
tobyspark 30:873979018850 199 // TVOne input sources stable flag
tobyspark 30:873979018850 200 bool tvOneRGB1Stable = true; // init true as this is conformed state of mixer, ie. RGB1 not SIS1
tobyspark 30:873979018850 201 bool tvOneRGB2Stable = true;
tobyspark 30:873979018850 202
tobyspark 31:01845a2347ff 203 // TVOne behaviour flags
tobyspark 31:01845a2347ff 204 bool tvOneHDCPOn = false;
tobyspark 31:01845a2347ff 205 bool tvOneEDIDPassthrough = true;
tobyspark 31:01845a2347ff 206 const int32_t EDIDPassthroughSlot = 7;
tobyspark 31:01845a2347ff 207
tobyspark 33:e6672a9bd571 208 void processOSCIn(float &xFade, float &fadeUp) {
tobyspark 25:3b519ef70341 209 string statusMessage;
tobyspark 3:033d2b7768f3 210
tobyspark 33:e6672a9bd571 211 if (!strcmp( receiveMessage.getTopAddress() , "dvimxr" ))
tobyspark 3:033d2b7768f3 212 {
tobyspark 25:3b519ef70341 213 statusMessage = "OSC: /dvimxr";
tobyspark 33:e6672a9bd571 214 if (!strcmp( receiveMessage.getSubAddress() , "xFade" ))
tobyspark 25:3b519ef70341 215 {
tobyspark 33:e6672a9bd571 216 if (receiveMessage.getArgNum() == 1)
tobyspark 33:e6672a9bd571 217 if (receiveMessage.getTypeTag(0) == 'f')
tobyspark 25:3b519ef70341 218 {
tobyspark 33:e6672a9bd571 219 xFade = receiveMessage.getArgFloat(0);
tobyspark 25:3b519ef70341 220 char buffer[15];
tobyspark 26:0299f8760715 221 snprintf(buffer, kStringBufferLength, "/xFade %1.2f", xFade);
tobyspark 25:3b519ef70341 222 statusMessage += buffer;
tobyspark 25:3b519ef70341 223 }
tobyspark 25:3b519ef70341 224 }
tobyspark 33:e6672a9bd571 225 else if (!strcmp( receiveMessage.getSubAddress() , "fadeUp" ))
tobyspark 25:3b519ef70341 226 {
tobyspark 33:e6672a9bd571 227 if (receiveMessage.getArgNum() == 1)
tobyspark 33:e6672a9bd571 228 if (receiveMessage.getTypeTag(0) == 'f')
tobyspark 3:033d2b7768f3 229 {
tobyspark 33:e6672a9bd571 230 fadeUp = receiveMessage.getArgFloat(0);
tobyspark 25:3b519ef70341 231 char buffer[15];
tobyspark 26:0299f8760715 232 snprintf(buffer, kStringBufferLength, "/fadeUp %1.2f", fadeUp);
tobyspark 25:3b519ef70341 233 statusMessage += buffer;
tobyspark 3:033d2b7768f3 234 }
tobyspark 25:3b519ef70341 235 }
tobyspark 25:3b519ef70341 236 else
tobyspark 25:3b519ef70341 237 {
tobyspark 33:e6672a9bd571 238 statusMessage += receiveMessage.getSubAddress();
tobyspark 25:3b519ef70341 239 statusMessage += " - Ignoring";
tobyspark 25:3b519ef70341 240 }
tobyspark 3:033d2b7768f3 241 }
tobyspark 3:033d2b7768f3 242 else
tobyspark 3:033d2b7768f3 243 {
tobyspark 25:3b519ef70341 244 statusMessage = "OSC: ";
tobyspark 33:e6672a9bd571 245 statusMessage += receiveMessage.getTopAddress();
tobyspark 25:3b519ef70341 246 statusMessage += " - Ignoring";
tobyspark 3:033d2b7768f3 247 }
tobyspark 3:033d2b7768f3 248
tobyspark 3:033d2b7768f3 249 screen.clearBufferRow(kCommsStatusLine);
tobyspark 25:3b519ef70341 250 screen.textToBuffer(statusMessage, kCommsStatusLine);
tobyspark 33:e6672a9bd571 251
tobyspark 25:3b519ef70341 252 if (debug) debug->printf("%s \r\n", statusMessage.c_str());
tobyspark 3:033d2b7768f3 253
tobyspark 3:033d2b7768f3 254 }
tobyspark 3:033d2b7768f3 255
tobyspark 33:e6672a9bd571 256 void processOSCOut(float &xFade, float &fadeUp)
tobyspark 33:e6672a9bd571 257 {
tobyspark 33:e6672a9bd571 258 char statusMessageBuffer[kStringBufferLength];
tobyspark 33:e6672a9bd571 259
tobyspark 33:e6672a9bd571 260 sendMessage.setAddress("dvimxr", "xFadeFadeUp");
tobyspark 33:e6672a9bd571 261 sendMessage.setArgs("ff", &xFade, &fadeUp);
tobyspark 33:e6672a9bd571 262 osc->sendOsc(&sendMessage);
tobyspark 33:e6672a9bd571 263
tobyspark 33:e6672a9bd571 264 screen.clearBufferRow(kCommsStatusLine);
tobyspark 33:e6672a9bd571 265 snprintf(statusMessageBuffer, kStringBufferLength, "OSC Out: xF %.2f fUp %.2f", xFade, fadeUp);
tobyspark 33:e6672a9bd571 266 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 267
tobyspark 33:e6672a9bd571 268 if (debug) debug->printf(statusMessageBuffer);
tobyspark 33:e6672a9bd571 269 }
tobyspark 33:e6672a9bd571 270
tobyspark 33:e6672a9bd571 271 void processArtNetIn(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 272 {
tobyspark 3:033d2b7768f3 273 screen.clearBufferRow(kCommsStatusLine);
tobyspark 3:033d2b7768f3 274 screen.textToBuffer("ArtNet activity", kCommsStatusLine);
tobyspark 33:e6672a9bd571 275
tobyspark 3:033d2b7768f3 276 if (debug) debug->printf("ArtNet activity");
tobyspark 3:033d2b7768f3 277 }
tobyspark 0:87aab40d5806 278
tobyspark 33:e6672a9bd571 279 void processArtNetOut(float &xFade, float &fadeUp)
tobyspark 33:e6672a9bd571 280 {
tobyspark 33:e6672a9bd571 281 char statusMessageBuffer[kStringBufferLength];
tobyspark 33:e6672a9bd571 282
tobyspark 33:e6672a9bd571 283 int xFadeDMX = xFade*255;
tobyspark 33:e6672a9bd571 284 int fadeUpDMX = fadeUp*255;
tobyspark 33:e6672a9bd571 285
tobyspark 33:e6672a9bd571 286 // Universe 0, Channel 0 = xFade, Channel 1 = fadeUp
tobyspark 33:e6672a9bd571 287 char dmxData[2] = {xFadeDMX, fadeUpDMX};
tobyspark 33:e6672a9bd571 288 artNet->Send_ArtDmx(0, 0, dmxData, 2);
tobyspark 33:e6672a9bd571 289
tobyspark 33:e6672a9bd571 290 screen.clearBufferRow(kCommsStatusLine);
tobyspark 33:e6672a9bd571 291 snprintf(statusMessageBuffer, kStringBufferLength, "A'Net Out: xF%3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 33:e6672a9bd571 292 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 293
tobyspark 33:e6672a9bd571 294 if (debug) debug->printf(statusMessageBuffer);
tobyspark 33:e6672a9bd571 295 }
tobyspark 33:e6672a9bd571 296
tobyspark 8:d46cc49f0f37 297 void processDMXIn(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 298 {
tobyspark 26:0299f8760715 299 char statusMessageBuffer[kStringBufferLength];
tobyspark 5:f8b285ca41ba 300
tobyspark 5:f8b285ca41ba 301 int xFadeDMX = dmx->get(kDMXInChannelXFade);
tobyspark 7:e6717468c18d 302 int fadeUpDMX = dmx->get(kDMXInChannelFadeUp);
tobyspark 5:f8b285ca41ba 303
tobyspark 5:f8b285ca41ba 304 xFade = (float)xFadeDMX/255;
tobyspark 5:f8b285ca41ba 305 fadeUp = (float)fadeUpDMX/255;
tobyspark 5:f8b285ca41ba 306
tobyspark 5:f8b285ca41ba 307 screen.clearBufferRow(kCommsStatusLine);
tobyspark 26:0299f8760715 308 snprintf(statusMessageBuffer, kStringBufferLength, "DMX In: xF %3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 25:3b519ef70341 309 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 310
tobyspark 25:3b519ef70341 311 if (debug) debug->printf(statusMessageBuffer);
tobyspark 5:f8b285ca41ba 312 }
tobyspark 5:f8b285ca41ba 313
tobyspark 8:d46cc49f0f37 314 void processDMXOut(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 315 {
tobyspark 26:0299f8760715 316 char statusMessageBuffer[kStringBufferLength];
tobyspark 5:f8b285ca41ba 317
tobyspark 5:f8b285ca41ba 318 int xFadeDMX = xFade*255;
tobyspark 5:f8b285ca41ba 319 int fadeUpDMX = fadeUp*255;
tobyspark 5:f8b285ca41ba 320
tobyspark 5:f8b285ca41ba 321 dmx->put(kDMXOutChannelXFade, xFadeDMX);
tobyspark 5:f8b285ca41ba 322 dmx->put(kDMXOutChannelFadeUp, fadeUpDMX);
tobyspark 5:f8b285ca41ba 323
tobyspark 5:f8b285ca41ba 324 screen.clearBufferRow(kCommsStatusLine);
tobyspark 26:0299f8760715 325 snprintf(statusMessageBuffer, kStringBufferLength, "DMX Out: xF %3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 25:3b519ef70341 326 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 327
tobyspark 25:3b519ef70341 328 if (debug) debug->printf(statusMessageBuffer);
tobyspark 5:f8b285ca41ba 329 }
tobyspark 0:87aab40d5806 330
tobyspark 8:d46cc49f0f37 331 inline float fadeCalc (const float AIN, const float tolerance)
tobyspark 8:d46cc49f0f37 332 {
tobyspark 0:87aab40d5806 333 float pos ;
tobyspark 0:87aab40d5806 334 if (AIN < tolerance) pos = 0;
tobyspark 0:87aab40d5806 335 else if (AIN > 1.0 - tolerance) pos = 1;
tobyspark 0:87aab40d5806 336 else pos = (AIN - tolerance) / (1 - 2*tolerance);
tobyspark 0:87aab40d5806 337 if (debug && false) debug->printf("fadeCalc in: %f out: %f \r\n", AIN, pos);
tobyspark 0:87aab40d5806 338 return pos;
tobyspark 0:87aab40d5806 339 }
tobyspark 0:87aab40d5806 340
tobyspark 31:01845a2347ff 341 bool handleTVOneSources(bool updateScreenOverride = false)
tobyspark 30:873979018850 342 {
tobyspark 30:873979018850 343 bool ok = true;
tobyspark 30:873979018850 344
tobyspark 30:873979018850 345 int32_t payload = 0;
tobyspark 30:873979018850 346
tobyspark 30:873979018850 347 ok = ok && tvOne.readCommand(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceSourceStable, payload);
tobyspark 30:873979018850 348 bool RGB1 = (payload == 1);
tobyspark 30:873979018850 349
tobyspark 30:873979018850 350 ok = ok && tvOne.readCommand(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceSourceStable, payload);
tobyspark 30:873979018850 351 bool RGB2 = (payload == 1);
tobyspark 30:873979018850 352
tobyspark 30:873979018850 353 string tvOneDetectString;
tobyspark 30:873979018850 354 if (!ok)
tobyspark 30:873979018850 355 {
tobyspark 30:873979018850 356 tvOneDetectString = "TVOne: link failed";
tobyspark 30:873979018850 357 }
tobyspark 30:873979018850 358 else if (!RGB1 || !RGB2)
tobyspark 30:873979018850 359 {
tobyspark 30:873979018850 360 if (!RGB1 && !RGB2) tvOneDetectString = "TVOne: no sources";
tobyspark 30:873979018850 361 else if (!RGB1) tvOneDetectString = "TVOne: no right source";
tobyspark 30:873979018850 362 else if (!RGB2) tvOneDetectString = "TVOne: no left source";
tobyspark 30:873979018850 363 }
tobyspark 30:873979018850 364 else
tobyspark 30:873979018850 365 {
tobyspark 30:873979018850 366 tvOneDetectString = "TVOne: OK";
tobyspark 30:873979018850 367 }
tobyspark 30:873979018850 368
tobyspark 30:873979018850 369 if (RGB1 && !tvOneRGB1Stable) tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB1);
tobyspark 30:873979018850 370 if (RGB2 && !tvOneRGB2Stable) tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB2);
tobyspark 30:873979018850 371 if (!RGB1 && tvOneRGB1Stable) tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceSIS1);
tobyspark 30:873979018850 372 if (!RGB2 && tvOneRGB2Stable) tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceSIS2);
tobyspark 31:01845a2347ff 373
tobyspark 31:01845a2347ff 374 if (updateScreenOverride || (RGB1 != tvOneRGB1Stable || RGB2 != tvOneRGB2Stable))
tobyspark 30:873979018850 375 {
tobyspark 30:873979018850 376 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 30:873979018850 377 screen.textToBuffer(tvOneDetectString, kTVOneStatusLine);
tobyspark 30:873979018850 378 }
tobyspark 30:873979018850 379
tobyspark 30:873979018850 380 tvOneRGB1Stable = RGB1;
tobyspark 30:873979018850 381 tvOneRGB2Stable = RGB2;
tobyspark 30:873979018850 382
tobyspark 30:873979018850 383 return ok;
tobyspark 30:873979018850 384 }
tobyspark 30:873979018850 385
tobyspark 8:d46cc49f0f37 386 bool setKeyParamsTo(int index)
tobyspark 8:d46cc49f0f37 387 {
tobyspark 0:87aab40d5806 388 // Only spend the time uploading six parameters if we need to
tobyspark 0:87aab40d5806 389 // Might want to bounds check here
tobyspark 0:87aab40d5806 390
tobyspark 9:f83eadd8917a 391 bool ok;
tobyspark 0:87aab40d5806 392
tobyspark 0:87aab40d5806 393 if (index != keyerParamsSet)
tobyspark 0:87aab40d5806 394 {
tobyspark 31:01845a2347ff 395 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, settings.keyerParamSet(index)[SPKSettings::minY]);
tobyspark 31:01845a2347ff 396 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, settings.keyerParamSet(index)[SPKSettings::maxY]);
tobyspark 31:01845a2347ff 397 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, settings.keyerParamSet(index)[SPKSettings::minU]);
tobyspark 31:01845a2347ff 398 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, settings.keyerParamSet(index)[SPKSettings::maxU]);
tobyspark 31:01845a2347ff 399 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, settings.keyerParamSet(index)[SPKSettings::minV]);
tobyspark 31:01845a2347ff 400 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, settings.keyerParamSet(index)[SPKSettings::maxV]);
tobyspark 0:87aab40d5806 401
tobyspark 0:87aab40d5806 402 keyerParamsSet = index;
tobyspark 9:f83eadd8917a 403 }
tobyspark 9:f83eadd8917a 404 else
tobyspark 9:f83eadd8917a 405 {
tobyspark 9:f83eadd8917a 406 ok = true;
tobyspark 9:f83eadd8917a 407 }
tobyspark 0:87aab40d5806 408
tobyspark 0:87aab40d5806 409 return ok;
tobyspark 0:87aab40d5806 410 }
tobyspark 0:87aab40d5806 411
tobyspark 24:49c6624119ae 412 void actionMixMode()
tobyspark 24:49c6624119ae 413 {
tobyspark 31:01845a2347ff 414 if (debug) debug->printf("Changing mix mode \r\n");
tobyspark 31:01845a2347ff 415
tobyspark 24:49c6624119ae 416 bool ok = true;
tobyspark 25:3b519ef70341 417 string sentOK;
tobyspark 26:0299f8760715 418 char sentMSGBuffer[kStringBufferLength];
tobyspark 24:49c6624119ae 419
tobyspark 24:49c6624119ae 420 // Set Keyer
tobyspark 24:49c6624119ae 421 if (mixMode < mixKey)
tobyspark 24:49c6624119ae 422 {
tobyspark 31:01845a2347ff 423 // Set Keyer Off. Quicker to set and fail than to test for on and then turn off
tobyspark 31:01845a2347ff 424 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
tobyspark 31:01845a2347ff 425
tobyspark 31:01845a2347ff 426 if (mixMode == mixBlend)
tobyspark 24:49c6624119ae 427 {
tobyspark 31:01845a2347ff 428 // Turn off Additive Mixing on output
tobyspark 31:01845a2347ff 429 ok = tvOne.command(0, kTV1WindowIDA, 0x298, 0);
tobyspark 31:01845a2347ff 430 snprintf(sentMSGBuffer, kStringBufferLength, "Blend");
tobyspark 24:49c6624119ae 431 }
tobyspark 31:01845a2347ff 432 if (mixMode == mixAdditive)
tobyspark 31:01845a2347ff 433 {
tobyspark 31:01845a2347ff 434 // First set B to what you'd expect for additive; it may be left at 100 if optimised blend mixing was previous mixmode.
tobyspark 31:01845a2347ff 435 ok = tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 31:01845a2347ff 436 // Then turn on Additive Mixing
tobyspark 31:01845a2347ff 437 ok = ok && tvOne.command(0, kTV1WindowIDA, 0x298, 1);
tobyspark 31:01845a2347ff 438 snprintf(sentMSGBuffer, kStringBufferLength, "Additive");
tobyspark 31:01845a2347ff 439 }
tobyspark 24:49c6624119ae 440 }
tobyspark 24:49c6624119ae 441 else
tobyspark 24:49c6624119ae 442 {
tobyspark 25:3b519ef70341 443 int index = mixMode - mixKey;
tobyspark 25:3b519ef70341 444
tobyspark 24:49c6624119ae 445 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
tobyspark 24:49c6624119ae 446 ok = ok && setKeyParamsTo(index);
tobyspark 25:3b519ef70341 447
tobyspark 26:0299f8760715 448 snprintf(sentMSGBuffer, kStringBufferLength, "Keyer On with %i", index);
tobyspark 24:49c6624119ae 449 }
tobyspark 24:49c6624119ae 450
tobyspark 24:49c6624119ae 451 if (ok) sentOK = "Sent:";
tobyspark 24:49c6624119ae 452 else sentOK = "Send Error:";
tobyspark 24:49c6624119ae 453
tobyspark 24:49c6624119ae 454 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 25:3b519ef70341 455 screen.textToBuffer(sentOK + sentMSGBuffer, kTVOneStatusLine);
tobyspark 24:49c6624119ae 456 }
tobyspark 24:49c6624119ae 457
tobyspark 24:49c6624119ae 458
tobyspark 17:fc68d40b8b1f 459 bool conformProcessor()
tobyspark 17:fc68d40b8b1f 460 {
tobyspark 17:fc68d40b8b1f 461 bool ok = true;
tobyspark 17:fc68d40b8b1f 462
tobyspark 17:fc68d40b8b1f 463 int32_t on = 1;
tobyspark 17:fc68d40b8b1f 464 int32_t off = 0;
tobyspark 20:8b92d7922c48 465
tobyspark 20:8b92d7922c48 466 // Independent output
tobyspark 30:873979018850 467 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionMode, 2);
tobyspark 20:8b92d7922c48 468 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputEnable, on);
tobyspark 20:8b92d7922c48 469 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsLockMethod, off);
tobyspark 17:fc68d40b8b1f 470
tobyspark 17:fc68d40b8b1f 471 // Make sure our windows exist
tobyspark 17:fc68d40b8b1f 472 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsEnable, on);
tobyspark 17:fc68d40b8b1f 473 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsEnable, on);
tobyspark 18:ebe5da639a6a 474 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsLayerPriority, 0);
tobyspark 18:ebe5da639a6a 475 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsLayerPriority, 1);
tobyspark 17:fc68d40b8b1f 476
tobyspark 17:fc68d40b8b1f 477 // Assign inputs to windows, so that left on the crossfader is left on the processor viewed from front
tobyspark 17:fc68d40b8b1f 478 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB2);
tobyspark 17:fc68d40b8b1f 479 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB1);
tobyspark 17:fc68d40b8b1f 480
tobyspark 17:fc68d40b8b1f 481 // Set scaling to fit source within output, maintaining aspect ratio
tobyspark 17:fc68d40b8b1f 482 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustWindowsZoomLevel, 100);
tobyspark 17:fc68d40b8b1f 483 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDB, kTV1FunctionAdjustWindowsZoomLevel, 100);
tobyspark 17:fc68d40b8b1f 484 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustWindowsShrinkEnable, off);
tobyspark 17:fc68d40b8b1f 485 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDB, kTV1FunctionAdjustWindowsShrinkEnable, off);
tobyspark 17:fc68d40b8b1f 486 int32_t fit = 1;
tobyspark 17:fc68d40b8b1f 487 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, fit);
tobyspark 17:fc68d40b8b1f 488 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, fit);
tobyspark 17:fc68d40b8b1f 489
tobyspark 17:fc68d40b8b1f 490 // On source loss, hold on the last frame received.
tobyspark 17:fc68d40b8b1f 491 int32_t freeze = 1;
tobyspark 17:fc68d40b8b1f 492 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceOnSourceLoss, freeze);
tobyspark 17:fc68d40b8b1f 493 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceOnSourceLoss, freeze);
tobyspark 17:fc68d40b8b1f 494
tobyspark 30:873979018850 495 // Set resolution and fade levels for maximum chance of being seen
tobyspark 31:01845a2347ff 496 int32_t slot = tvOneEDIDPassthrough ? EDIDPassthroughSlot : 5;
tobyspark 30:873979018850 497 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputResolution, kTV1ResolutionVGA);
tobyspark 31:01845a2347ff 498 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 499 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 30:873979018850 500 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, 100);
tobyspark 30:873979018850 501 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, 100);
tobyspark 30:873979018850 502
tobyspark 30:873979018850 503 // Save current state for power on
tobyspark 30:873979018850 504 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 17:fc68d40b8b1f 505
tobyspark 17:fc68d40b8b1f 506 return ok;
tobyspark 17:fc68d40b8b1f 507 }
tobyspark 17:fc68d40b8b1f 508
tobyspark 27:27851d3d2bba 509 void setResolutionMenuItems()
tobyspark 27:27851d3d2bba 510 {
tobyspark 27:27851d3d2bba 511 resolutionMenu.clearMenuItems();
tobyspark 27:27851d3d2bba 512 for (int i=0; i < settings.resolutionsCount(); i++)
tobyspark 27:27851d3d2bba 513 {
tobyspark 27:27851d3d2bba 514 resolutionMenu.addMenuItem(SPKMenuItem(settings.resolutionName(i), settings.resolutionIndex(i), settings.resolutionEDIDIndex(i)));
tobyspark 27:27851d3d2bba 515 }
tobyspark 27:27851d3d2bba 516 resolutionMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 27:27851d3d2bba 517 }
tobyspark 27:27851d3d2bba 518
tobyspark 27:27851d3d2bba 519 void setMixModeMenuItems()
tobyspark 27:27851d3d2bba 520 {
tobyspark 27:27851d3d2bba 521 mixModeMenu.clearMenuItems();
tobyspark 29:95a7efe30527 522 mixModeMenu.addMenuItem(SPKMenuItem("Crossfade", &mixModeAdditiveMenu));
tobyspark 27:27851d3d2bba 523 for (int i=0; i < settings.keyerSetCount(); i++)
tobyspark 27:27851d3d2bba 524 {
tobyspark 27:27851d3d2bba 525 mixModeMenu.addMenuItem(SPKMenuItem(settings.keyerParamName(i), mixKey+i));
tobyspark 27:27851d3d2bba 526 }
tobyspark 27:27851d3d2bba 527 mixModeMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 27:27851d3d2bba 528 }
tobyspark 27:27851d3d2bba 529
tobyspark 27:27851d3d2bba 530 void setCommsMenuItems()
tobyspark 27:27851d3d2bba 531 {
tobyspark 27:27851d3d2bba 532 if (rj45Mode == rj45Ethernet)
tobyspark 27:27851d3d2bba 533 {
tobyspark 27:27851d3d2bba 534 commsMenu.title = "Network Mode [Ethernet]";
tobyspark 27:27851d3d2bba 535 commsMenu.clearMenuItems();
tobyspark 27:27851d3d2bba 536 commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
tobyspark 27:27851d3d2bba 537 commsMenu.addMenuItem(SPKMenuItem("OSC", commsOSC));
tobyspark 27:27851d3d2bba 538 commsMenu.addMenuItem(SPKMenuItem("ArtNet", commsArtNet));
tobyspark 27:27851d3d2bba 539 commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 33:e6672a9bd571 540 commsMenu = 0;
tobyspark 27:27851d3d2bba 541 }
tobyspark 27:27851d3d2bba 542 else if (rj45Mode == rj45DMX)
tobyspark 27:27851d3d2bba 543 {
tobyspark 27:27851d3d2bba 544 commsMenu.title = "Network Mode [DMX]";
tobyspark 27:27851d3d2bba 545 commsMenu.clearMenuItems();
tobyspark 27:27851d3d2bba 546 commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
tobyspark 27:27851d3d2bba 547 commsMenu.addMenuItem(SPKMenuItem("DMX In", commsDMXIn));
tobyspark 27:27851d3d2bba 548 commsMenu.addMenuItem(SPKMenuItem("DMX Out", commsDMXOut));
tobyspark 27:27851d3d2bba 549 commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 33:e6672a9bd571 550 commsMenu = 0;
tobyspark 27:27851d3d2bba 551 }
tobyspark 27:27851d3d2bba 552 }
tobyspark 27:27851d3d2bba 553
tobyspark 0:87aab40d5806 554 int main()
tobyspark 0:87aab40d5806 555 {
tobyspark 0:87aab40d5806 556 if (debug)
tobyspark 0:87aab40d5806 557 {
tobyspark 0:87aab40d5806 558 debug->printf("\r\n\r\n");
tobyspark 0:87aab40d5806 559 debug->printf("*spark d-fuser -----------\r\n");
tobyspark 0:87aab40d5806 560 debug->printf(" debug channel\r\n");
tobyspark 0:87aab40d5806 561 }
tobyspark 2:50043054e4f7 562
tobyspark 2:50043054e4f7 563 // Set display font
tobyspark 2:50043054e4f7 564 screen.fontStartCharacter = &characterBytesStartChar;
tobyspark 2:50043054e4f7 565 screen.fontEndCharacter = &characterBytesEndChar;
tobyspark 2:50043054e4f7 566 screen.fontCharacters = characterBytes;
tobyspark 2:50043054e4f7 567
tobyspark 0:87aab40d5806 568 // Splash screen
tobyspark 30:873979018850 569 string softwareLine = "SW ";
tobyspark 30:873979018850 570 softwareLine += kSPKDFSoftwareVersion;
tobyspark 2:50043054e4f7 571 screen.imageToBuffer(spkDisplayLogo);
tobyspark 0:87aab40d5806 572 screen.textToBuffer("SPK:D-Fuser",0);
tobyspark 30:873979018850 573 screen.textToBuffer(softwareLine,1);
tobyspark 5:f8b285ca41ba 574 screen.sendBuffer();
tobyspark 0:87aab40d5806 575
tobyspark 11:0783cfbeb746 576 // Load saved settings
tobyspark 16:52484666b323 577 bool settingsAreCustom = false;
tobyspark 16:52484666b323 578 settingsAreCustom = settings.load(kSPKDFSettingsFilename);
tobyspark 30:873979018850 579 if (settingsAreCustom)
tobyspark 30:873979018850 580 {
tobyspark 30:873979018850 581 softwareLine += "; ini OK";
tobyspark 30:873979018850 582 screen.textToBuffer(softwareLine, 1);
tobyspark 30:873979018850 583 }
tobyspark 30:873979018850 584
tobyspark 0:87aab40d5806 585 // Set menu structure
tobyspark 0:87aab40d5806 586 mixModeMenu.title = "Mix Mode";
tobyspark 27:27851d3d2bba 587 setMixModeMenuItems();
tobyspark 24:49c6624119ae 588
tobyspark 29:95a7efe30527 589 mixModeAdditiveMenu.title = "Crossfade";
tobyspark 30:873979018850 590 mixModeAdditiveMenu.addMenuItem(SPKMenuItem("[title overridden]", &mixModeMenu, true));
tobyspark 0:87aab40d5806 591
tobyspark 0:87aab40d5806 592 resolutionMenu.title = "Resolution";
tobyspark 27:27851d3d2bba 593 setResolutionMenuItems();
tobyspark 0:87aab40d5806 594
tobyspark 27:27851d3d2bba 595 commsMenu.title = "Network Mode";
tobyspark 27:27851d3d2bba 596 setCommsMenuItems();
tobyspark 23:909928cafb95 597
tobyspark 15:4b394c64b461 598 advancedMenu.title = "Troubleshooting";
tobyspark 23:909928cafb95 599 advancedMenu.addMenuItem(SPKMenuItem("HDCP Off", advancedHDCPOff));
tobyspark 23:909928cafb95 600 advancedMenu.addMenuItem(SPKMenuItem("HDCP On", advancedHDCPOn));
tobyspark 31:01845a2347ff 601 advancedMenu.addMenuItem(SPKMenuItem("EDID Passthrough", advancedEDIDPassthrough)); // have global setting of passthrough that overrides resolution sets and is saved with conform processor
tobyspark 31:01845a2347ff 602 advancedMenu.addMenuItem(SPKMenuItem("EDID Internal", advancedEDIDInternal));
tobyspark 30:873979018850 603 advancedMenu.addMenuItem(SPKMenuItem("Test Processor Sources", advancedTestSources));
tobyspark 23:909928cafb95 604 advancedMenu.addMenuItem(SPKMenuItem("Conform Processor", advancedConformProcessor));
tobyspark 30:873979018850 605 if (settingsAreCustom) advancedMenu.addMenuItem(SPKMenuItem("Revert Controller", advancedLoadDefaults));
tobyspark 24:49c6624119ae 606 advancedMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 23:909928cafb95 607
tobyspark 0:87aab40d5806 608 mainMenu.title = "Main Menu";
tobyspark 24:49c6624119ae 609 mainMenu.addMenuItem(SPKMenuItem(mixModeMenu.title, &mixModeMenu));
tobyspark 24:49c6624119ae 610 mainMenu.addMenuItem(SPKMenuItem(resolutionMenu.title, &resolutionMenu));
tobyspark 24:49c6624119ae 611 mainMenu.addMenuItem(SPKMenuItem(commsMenu.title, &commsMenu));
tobyspark 24:49c6624119ae 612 mainMenu.addMenuItem(SPKMenuItem(advancedMenu.title, &advancedMenu));
tobyspark 23:909928cafb95 613
tobyspark 0:87aab40d5806 614 selectedMenu = &mainMenu;
tobyspark 23:909928cafb95 615
tobyspark 0:87aab40d5806 616 // Misc I/O stuff
tobyspark 0:87aab40d5806 617
tobyspark 0:87aab40d5806 618 fadeAPO.period(0.001);
tobyspark 0:87aab40d5806 619 fadeBPO.period(0.001);
tobyspark 0:87aab40d5806 620
tobyspark 20:8b92d7922c48 621 // Test for TV One connectivity and determine unit type
tobyspark 30:873979018850 622 // TODO: Determine and fall back if not dfuser firmware?
tobyspark 30:873979018850 623 // TODO: Use software version to select resolution slots?
tobyspark 30:873979018850 624 // TODO: Use product / board type to select TVOne conform type?
tobyspark 21:f9d63cb7cedb 625 // kTV1FunctionReadSoftwareVersion
tobyspark 21:f9d63cb7cedb 626 // kTV1FunctionReadProductType
tobyspark 21:f9d63cb7cedb 627 // kTV1FunctionReadBoardType
tobyspark 21:f9d63cb7cedb 628
tobyspark 12:c270870bdd23 629 // Display menu and framing lines
tobyspark 0:87aab40d5806 630 screen.horizLineToBuffer(kMenuLine1*pixInPage - 1);
tobyspark 0:87aab40d5806 631 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 632 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 633 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 634 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 635 screen.horizLineToBuffer(kMenuLine2*pixInPage + pixInPage);
tobyspark 1:f9fca21102e0 636 screen.horizLineToBuffer(kCommsStatusLine*pixInPage - 1);
tobyspark 1:f9fca21102e0 637 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 30:873979018850 638 screen.textToBuffer("TVOne: OK", kTVOneStatusLine); // handleTVOneSources may update this
tobyspark 30:873979018850 639
tobyspark 30:873979018850 640 // If we do not have two solid sources, act on this as we rely on the window having a source for crossfade behaviour
tobyspark 30:873979018850 641 // Once we've had two solid inputs, don't check any more as we're ok as the unit is set to hold on last frame.
tobyspark 33:e6672a9bd571 642 // This is set to update kTVOneStatusLine regardless
tobyspark 31:01845a2347ff 643 bool ok = handleTVOneSources(true);
tobyspark 33:e6672a9bd571 644
tobyspark 33:e6672a9bd571 645 // Update display before starting mixer loop
tobyspark 33:e6672a9bd571 646 screen.sendBuffer();
tobyspark 33:e6672a9bd571 647
tobyspark 0:87aab40d5806 648 //// CONTROLS TEST
tobyspark 0:87aab40d5806 649
tobyspark 0:87aab40d5806 650 while (0) {
tobyspark 0:87aab40d5806 651 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 652 }
tobyspark 0:87aab40d5806 653
tobyspark 0:87aab40d5806 654 //// MIXER RUN
tobyspark 0:87aab40d5806 655
tobyspark 8:d46cc49f0f37 656 while (1)
tobyspark 8:d46cc49f0f37 657 {
tobyspark 1:f9fca21102e0 658 //// Task background things
tobyspark 33:e6672a9bd571 659 if ((osc || artNet) && rj45Mode == rj45Ethernet)
tobyspark 5:f8b285ca41ba 660 {
tobyspark 5:f8b285ca41ba 661 Net::poll();
tobyspark 5:f8b285ca41ba 662 }
tobyspark 5:f8b285ca41ba 663
tobyspark 5:f8b285ca41ba 664 //// RJ45 SWITCH
tobyspark 5:f8b285ca41ba 665
tobyspark 5:f8b285ca41ba 666 if (rj45ModeDIN != rj45Mode)
tobyspark 1:f9fca21102e0 667 {
tobyspark 23:909928cafb95 668 if (debug) debug->printf("Handling RJ45 mode change\r\n");
tobyspark 27:27851d3d2bba 669
tobyspark 5:f8b285ca41ba 670 // update state
tobyspark 5:f8b285ca41ba 671 rj45Mode = rj45ModeDIN;
tobyspark 27:27851d3d2bba 672
tobyspark 27:27851d3d2bba 673 setCommsMenuItems();
tobyspark 5:f8b285ca41ba 674
tobyspark 5:f8b285ca41ba 675 // cancel old comms
tobyspark 5:f8b285ca41ba 676 commsMode = commsNone;
tobyspark 5:f8b285ca41ba 677 commsMenu = commsMode;
tobyspark 5:f8b285ca41ba 678
tobyspark 5:f8b285ca41ba 679 // refresh display
tobyspark 23:909928cafb95 680 if (selectedMenu == &commsMenu)
tobyspark 23:909928cafb95 681 {
tobyspark 33:e6672a9bd571 682 screen.clearBufferRow(kMenuLine1);
tobyspark 33:e6672a9bd571 683 screen.clearBufferRow(kMenuLine2);
tobyspark 23:909928cafb95 684 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 23:909928cafb95 685 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 23:909928cafb95 686 }
tobyspark 5:f8b285ca41ba 687 if (rj45Mode == rj45Ethernet) screen.textToBuffer("RJ45: Ethernet Engaged", kCommsStatusLine);
tobyspark 5:f8b285ca41ba 688 if (rj45Mode == rj45DMX) screen.textToBuffer("RJ45: DMX Engaged", kCommsStatusLine);
tobyspark 1:f9fca21102e0 689 }
tobyspark 1:f9fca21102e0 690
tobyspark 0:87aab40d5806 691 //// MENU
tobyspark 0:87aab40d5806 692
tobyspark 0:87aab40d5806 693 int menuChange = menuEnc.getChange();
tobyspark 0:87aab40d5806 694
tobyspark 0:87aab40d5806 695 // Update GUI
tobyspark 0:87aab40d5806 696 if (menuChange != 0)
tobyspark 0:87aab40d5806 697 {
tobyspark 24:49c6624119ae 698 if (selectedMenu->selectedItem().handlingControls)
tobyspark 24:49c6624119ae 699 {
tobyspark 24:49c6624119ae 700 if (selectedMenu == &mixModeAdditiveMenu)
tobyspark 24:49c6624119ae 701 {
tobyspark 24:49c6624119ae 702 fadeCurve += menuChange * 0.05;
tobyspark 24:49c6624119ae 703 if (fadeCurve > 1.0f) fadeCurve = 1.0f;
tobyspark 24:49c6624119ae 704 if (fadeCurve < 0.0f) fadeCurve = 0.0f;
tobyspark 29:95a7efe30527 705
tobyspark 31:01845a2347ff 706 int newMixMode = (fadeCurve > 0.0f) ? mixAdditive: mixBlend;
tobyspark 31:01845a2347ff 707
tobyspark 31:01845a2347ff 708 if (newMixMode != mixMode)
tobyspark 31:01845a2347ff 709 {
tobyspark 31:01845a2347ff 710 mixMode = newMixMode;
tobyspark 31:01845a2347ff 711 actionMixMode();
tobyspark 31:01845a2347ff 712 }
tobyspark 29:95a7efe30527 713
tobyspark 24:49c6624119ae 714 screen.clearBufferRow(kMenuLine2);
tobyspark 29:95a7efe30527 715 screen.textToBuffer("Blend [ ----- ] Add", kMenuLine2);
tobyspark 29:95a7efe30527 716 screen.characterToBuffer('X', 38 + fadeCurve*20.0f, kMenuLine2);
tobyspark 24:49c6624119ae 717
tobyspark 31:01845a2347ff 718 if (debug) debug->printf("Fade curve changed by %i to %f \r\n", menuChange, fadeCurve);
tobyspark 24:49c6624119ae 719 }
tobyspark 24:49c6624119ae 720 }
tobyspark 24:49c6624119ae 721 else
tobyspark 24:49c6624119ae 722 {
tobyspark 24:49c6624119ae 723 if (debug) debug->printf("Menu changed by %i\r\n", menuChange);
tobyspark 24:49c6624119ae 724
tobyspark 24:49c6624119ae 725 *selectedMenu = selectedMenu->selectedIndex() + menuChange;
tobyspark 24:49c6624119ae 726
tobyspark 24:49c6624119ae 727 // update OLED line 2 here
tobyspark 24:49c6624119ae 728 screen.clearBufferRow(kMenuLine2);
tobyspark 24:49c6624119ae 729 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 24:49c6624119ae 730
tobyspark 24:49c6624119ae 731 if (debug) debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 24:49c6624119ae 732 }
tobyspark 0:87aab40d5806 733 }
tobyspark 0:87aab40d5806 734
tobyspark 0:87aab40d5806 735 // Action menu item
tobyspark 0:87aab40d5806 736 if (menuEnc.hasPressed())
tobyspark 0:87aab40d5806 737 {
tobyspark 0:87aab40d5806 738 if (debug) debug->printf("Action Menu Item!\r\n");
tobyspark 21:f9d63cb7cedb 739
tobyspark 0:87aab40d5806 740 // Are we changing menus?
tobyspark 23:909928cafb95 741 if (selectedMenu->selectedItem().type == SPKMenuItem::changesToMenu)
tobyspark 0:87aab40d5806 742 {
tobyspark 31:01845a2347ff 743 // If we're exiting the menu, we should set its selected index back to the menu's beginning...
tobyspark 31:01845a2347ff 744 SPKMenu* menuToReset = selectedMenu->selectedItem().payload.menu == &mainMenu? selectedMenu : NULL;
tobyspark 31:01845a2347ff 745
tobyspark 31:01845a2347ff 746 // point selected menu pointer to the new menu pointer
tobyspark 23:909928cafb95 747 selectedMenu = selectedMenu->selectedItem().payload.menu;
tobyspark 0:87aab40d5806 748
tobyspark 31:01845a2347ff 749 // ...doing this, of course, after we've used the value
tobyspark 31:01845a2347ff 750 if (menuToReset) *menuToReset = 0;
tobyspark 31:01845a2347ff 751
tobyspark 0:87aab40d5806 752 // update OLED lines 1&2
tobyspark 0:87aab40d5806 753 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 754 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 755 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 756 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 757
tobyspark 0:87aab40d5806 758 if (debug)
tobyspark 0:87aab40d5806 759 {
tobyspark 0:87aab40d5806 760 debug->printf("\r\n");
tobyspark 0:87aab40d5806 761 debug->printf("%s \r\n", selectedMenu->title.c_str());
tobyspark 0:87aab40d5806 762 debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 763 }
tobyspark 24:49c6624119ae 764
tobyspark 24:49c6624119ae 765 // Are we changing menus that should have a command attached?
tobyspark 24:49c6624119ae 766 if (selectedMenu == &mixModeAdditiveMenu)
tobyspark 24:49c6624119ae 767 {
tobyspark 29:95a7efe30527 768 screen.clearBufferRow(kMenuLine2);
tobyspark 29:95a7efe30527 769 screen.textToBuffer("Blend [ ----- ] Add", kMenuLine2);
tobyspark 29:95a7efe30527 770 screen.characterToBuffer('X', 38 + fadeCurve*20.0f, kMenuLine2);
tobyspark 29:95a7efe30527 771
tobyspark 29:95a7efe30527 772 mixMode = fadeCurve > 0 ? mixAdditive : mixBlend;
tobyspark 24:49c6624119ae 773 actionMixMode();
tobyspark 24:49c6624119ae 774 }
tobyspark 0:87aab40d5806 775 }
tobyspark 0:87aab40d5806 776 // With that out of the way, we should be actioning a specific menu's payload?
tobyspark 0:87aab40d5806 777 else if (selectedMenu == &mixModeMenu)
tobyspark 0:87aab40d5806 778 {
tobyspark 23:909928cafb95 779 mixMode = mixModeMenu.selectedItem().payload.command[0];
tobyspark 24:49c6624119ae 780 actionMixMode();
tobyspark 0:87aab40d5806 781 }
tobyspark 0:87aab40d5806 782 else if (selectedMenu == &resolutionMenu)
tobyspark 0:87aab40d5806 783 {
tobyspark 9:f83eadd8917a 784 bool ok = true;
tobyspark 0:87aab40d5806 785
tobyspark 23:909928cafb95 786 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputResolution, resolutionMenu.selectedItem().payload.command[0]);
tobyspark 31:01845a2347ff 787
tobyspark 31:01845a2347ff 788 int32_t slot = tvOneEDIDPassthrough ? EDIDPassthroughSlot : resolutionMenu.selectedItem().payload.command[1];
tobyspark 31:01845a2347ff 789
tobyspark 31:01845a2347ff 790 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 791 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 0:87aab40d5806 792
tobyspark 25:3b519ef70341 793 string sentOK;
tobyspark 0:87aab40d5806 794 if (ok) sentOK = "Sent: ";
tobyspark 0:87aab40d5806 795 else sentOK = "Send Error: ";
tobyspark 0:87aab40d5806 796
tobyspark 26:0299f8760715 797 char sentMSGBuffer[kStringBufferLength];
tobyspark 26:0299f8760715 798 snprintf(sentMSGBuffer, kStringBufferLength,"Res %i, EDID %i", resolutionMenu.selectedItem().payload.command[0], resolutionMenu.selectedItem().payload.command[1]);
tobyspark 0:87aab40d5806 799
tobyspark 1:f9fca21102e0 800 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 25:3b519ef70341 801 screen.textToBuffer(sentOK + sentMSGBuffer, kTVOneStatusLine);
tobyspark 0:87aab40d5806 802
tobyspark 0:87aab40d5806 803 if (debug) { debug->printf("Changing resolution"); }
tobyspark 0:87aab40d5806 804 }
tobyspark 1:f9fca21102e0 805 else if (selectedMenu == &commsMenu)
tobyspark 1:f9fca21102e0 806 {
tobyspark 26:0299f8760715 807 string commsTypeString = "Network:";
tobyspark 26:0299f8760715 808 char commsStatusBuffer[kStringBufferLength] = "--";
tobyspark 1:f9fca21102e0 809
tobyspark 1:f9fca21102e0 810 // Tear down any existing comms
tobyspark 1:f9fca21102e0 811 // This is the action of commsNone
tobyspark 1:f9fca21102e0 812 // And also clears the way for other comms actions
tobyspark 26:0299f8760715 813 commsMode = commsNone;
tobyspark 5:f8b285ca41ba 814 if (osc) {delete osc; osc = NULL;}
tobyspark 5:f8b285ca41ba 815 if (ethernet) {delete ethernet; ethernet = NULL;}
tobyspark 33:e6672a9bd571 816 if (artNet)
tobyspark 33:e6672a9bd571 817 {
tobyspark 33:e6672a9bd571 818 artNet->ArtPollReply.NumPorts = 0;
tobyspark 33:e6672a9bd571 819 strcpy(artNet->ArtPollReply.NodeReport, "Shutdown");
tobyspark 33:e6672a9bd571 820 artNet->SendArtPollReply();
tobyspark 33:e6672a9bd571 821 artNet->Done();
tobyspark 33:e6672a9bd571 822 delete artNet;
tobyspark 33:e6672a9bd571 823 artNet = NULL;
tobyspark 33:e6672a9bd571 824 }
tobyspark 5:f8b285ca41ba 825 if (dmx) {delete dmx; dmx = NULL;}
tobyspark 5:f8b285ca41ba 826
tobyspark 5:f8b285ca41ba 827 // Ensure we can't change to comms modes the hardware isn't switched to
tobyspark 23:909928cafb95 828 if (rj45Mode == rj45DMX && (commsMenu.selectedItem().payload.command[0] == commsOSC || commsMenu.selectedItem().payload.command[0] == commsArtNet))
tobyspark 1:f9fca21102e0 829 {
tobyspark 5:f8b285ca41ba 830 commsTypeString = "RJ45 not in Ethernet mode";
tobyspark 5:f8b285ca41ba 831 }
tobyspark 23:909928cafb95 832 else if (rj45Mode == rj45Ethernet && (commsMenu.selectedItem().payload.command[0] == commsDMXIn || commsMenu.selectedItem().payload.command[0] == commsDMXOut))
tobyspark 5:f8b285ca41ba 833 {
tobyspark 5:f8b285ca41ba 834 commsTypeString = "RJ45 not in DMX mode";
tobyspark 5:f8b285ca41ba 835 }
tobyspark 5:f8b285ca41ba 836 // Action!
tobyspark 23:909928cafb95 837 else if (commsMenu.selectedItem().payload.command[0] == commsOSC)
tobyspark 5:f8b285ca41ba 838 {
tobyspark 5:f8b285ca41ba 839 commsMode = commsOSC;
tobyspark 5:f8b285ca41ba 840 commsTypeString = "OSC: ";
tobyspark 1:f9fca21102e0 841
tobyspark 1:f9fca21102e0 842 ethernet = new EthernetNetIf(
tobyspark 1:f9fca21102e0 843 IpAddr(kOSCMbedIPAddress),
tobyspark 1:f9fca21102e0 844 IpAddr(kOSCMbedSubnetMask),
tobyspark 1:f9fca21102e0 845 IpAddr(kOSCMbedGateway),
tobyspark 1:f9fca21102e0 846 IpAddr(kOSCMbedDNS)
tobyspark 1:f9fca21102e0 847 );
tobyspark 3:033d2b7768f3 848
tobyspark 1:f9fca21102e0 849 EthernetErr ethError = ethernet->setup();
tobyspark 1:f9fca21102e0 850 if(ethError)
tobyspark 1:f9fca21102e0 851 {
tobyspark 1:f9fca21102e0 852 if (debug) debug->printf("Ethernet setup error, %d", ethError);
tobyspark 26:0299f8760715 853 snprintf(commsStatusBuffer, kStringBufferLength, "Ethernet setup failed");
tobyspark 5:f8b285ca41ba 854 commsMenu = commsNone;
tobyspark 1:f9fca21102e0 855 // break out of here. this setup should be a function that returns a boolean
tobyspark 1:f9fca21102e0 856 }
tobyspark 1:f9fca21102e0 857
tobyspark 1:f9fca21102e0 858 osc = new OSCClass();
tobyspark 33:e6672a9bd571 859 osc->setReceiveMessage(&receiveMessage);
tobyspark 1:f9fca21102e0 860 osc->begin(kOSCMbedPort);
tobyspark 1:f9fca21102e0 861
tobyspark 26:0299f8760715 862 snprintf(commsStatusBuffer, kStringBufferLength, "Listening on %i", kOSCMbedPort);
tobyspark 1:f9fca21102e0 863 }
tobyspark 23:909928cafb95 864 else if (commsMenu.selectedItem().payload.command[0] == commsArtNet)
tobyspark 1:f9fca21102e0 865 {
tobyspark 5:f8b285ca41ba 866 commsMode = commsArtNet;
tobyspark 5:f8b285ca41ba 867 commsTypeString = "ArtNet: ";
tobyspark 3:033d2b7768f3 868
tobyspark 3:033d2b7768f3 869 artNet = new DmxArtNet();
tobyspark 1:f9fca21102e0 870
tobyspark 3:033d2b7768f3 871 artNet->BindIpAddress = IpAddr(kArtNetBindIPAddress);
tobyspark 3:033d2b7768f3 872 artNet->BCastAddress = IpAddr(kArtNetBroadcastAddress);
tobyspark 3:033d2b7768f3 873
tobyspark 3:033d2b7768f3 874 artNet->InitArtPollReplyDefaults();
tobyspark 3:033d2b7768f3 875
tobyspark 33:e6672a9bd571 876 artNet->ArtPollReply.PortType[0] = 128; // Bit 7 = Set is this channel can output data from the Art-Net Network.
tobyspark 33:e6672a9bd571 877 artNet->ArtPollReply.GoodOutput[0] = 128; // Bit 7 = Set – Data is being transmitted.
tobyspark 33:e6672a9bd571 878 artNet->ArtPollReply.PortType[2] = 64; // Bit 6 = Set if this channel can input onto the Art-NetNetwork.
tobyspark 33:e6672a9bd571 879 artNet->ArtPollReply.GoodInput[2] = 128; // Bit 7 = Set – Data received.
tobyspark 3:033d2b7768f3 880
tobyspark 3:033d2b7768f3 881 artNet->Init();
tobyspark 3:033d2b7768f3 882 artNet->SendArtPollReply(); // announce to art-net nodes
tobyspark 3:033d2b7768f3 883
tobyspark 26:0299f8760715 884 snprintf(commsStatusBuffer, kStringBufferLength, "Listening");
tobyspark 1:f9fca21102e0 885 }
tobyspark 23:909928cafb95 886 else if (commsMenu.selectedItem().payload.command[0] == commsDMXIn)
tobyspark 1:f9fca21102e0 887 {
tobyspark 5:f8b285ca41ba 888 commsMode = commsDMXIn;
tobyspark 5:f8b285ca41ba 889 commsTypeString = "DMX In: ";
tobyspark 1:f9fca21102e0 890
tobyspark 5:f8b285ca41ba 891 dmxDirectionDOUT = 0;
tobyspark 5:f8b285ca41ba 892
tobyspark 5:f8b285ca41ba 893 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 1:f9fca21102e0 894 }
tobyspark 23:909928cafb95 895 else if (commsMenu.selectedItem().payload.command[0] == commsDMXOut)
tobyspark 5:f8b285ca41ba 896 {
tobyspark 5:f8b285ca41ba 897 commsMode = commsDMXOut;
tobyspark 5:f8b285ca41ba 898 commsTypeString = "DMX Out: ";
tobyspark 5:f8b285ca41ba 899
tobyspark 5:f8b285ca41ba 900 dmxDirectionDOUT = 1;
tobyspark 5:f8b285ca41ba 901
tobyspark 5:f8b285ca41ba 902 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 5:f8b285ca41ba 903 }
tobyspark 5:f8b285ca41ba 904
tobyspark 1:f9fca21102e0 905 screen.clearBufferRow(kCommsStatusLine);
tobyspark 25:3b519ef70341 906 screen.textToBuffer(commsTypeString + commsStatusBuffer, kCommsStatusLine);
tobyspark 1:f9fca21102e0 907 }
tobyspark 12:c270870bdd23 908 else if (selectedMenu == &advancedMenu)
tobyspark 12:c270870bdd23 909 {
tobyspark 23:909928cafb95 910 if (advancedMenu.selectedItem().payload.command[0] == advancedHDCPOff)
tobyspark 12:c270870bdd23 911 {
tobyspark 31:01845a2347ff 912 bool ok;
tobyspark 12:c270870bdd23 913
tobyspark 15:4b394c64b461 914 ok = tvOne.setHDCPOn(false);
tobyspark 12:c270870bdd23 915
tobyspark 12:c270870bdd23 916 std::string sendOK = ok ? "Sent: HDCP Off" : "Send Error: HDCP Off";
tobyspark 12:c270870bdd23 917
tobyspark 12:c270870bdd23 918 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 12:c270870bdd23 919 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 12:c270870bdd23 920 }
tobyspark 23:909928cafb95 921 else if (advancedMenu.selectedItem().payload.command[0] == advancedHDCPOn)
tobyspark 15:4b394c64b461 922 {
tobyspark 31:01845a2347ff 923 bool ok;
tobyspark 15:4b394c64b461 924
tobyspark 15:4b394c64b461 925 ok = tvOne.setHDCPOn(true);
tobyspark 15:4b394c64b461 926
tobyspark 15:4b394c64b461 927 std::string sendOK = ok ? "Sent: HDCP On" : "Send Error: HDCP On";
tobyspark 15:4b394c64b461 928
tobyspark 15:4b394c64b461 929 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 15:4b394c64b461 930 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 15:4b394c64b461 931 }
tobyspark 31:01845a2347ff 932 else if (advancedMenu.selectedItem().payload.command[0] == advancedEDIDPassthrough)
tobyspark 31:01845a2347ff 933 {
tobyspark 31:01845a2347ff 934 tvOneEDIDPassthrough = true;
tobyspark 31:01845a2347ff 935
tobyspark 31:01845a2347ff 936 bool ok = true;
tobyspark 31:01845a2347ff 937
tobyspark 31:01845a2347ff 938 int32_t slot = tvOneEDIDPassthrough ? EDIDPassthroughSlot : resolutionMenu.selectedItem().payload.command[1];
tobyspark 31:01845a2347ff 939
tobyspark 31:01845a2347ff 940 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 941 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 942
tobyspark 31:01845a2347ff 943 std::string sendOK = ok ? "Sent: EDID. Next:conform?" : "Send Error: EDID";
tobyspark 31:01845a2347ff 944
tobyspark 31:01845a2347ff 945 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 31:01845a2347ff 946 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 31:01845a2347ff 947 }
tobyspark 31:01845a2347ff 948 else if (advancedMenu.selectedItem().payload.command[0] == advancedEDIDInternal)
tobyspark 31:01845a2347ff 949 {
tobyspark 31:01845a2347ff 950 tvOneEDIDPassthrough = false;
tobyspark 31:01845a2347ff 951
tobyspark 31:01845a2347ff 952 bool ok = true;
tobyspark 31:01845a2347ff 953
tobyspark 31:01845a2347ff 954 int32_t slot = tvOneEDIDPassthrough ? EDIDPassthroughSlot : resolutionMenu.selectedItem().payload.command[1];
tobyspark 31:01845a2347ff 955
tobyspark 31:01845a2347ff 956 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 957 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 958
tobyspark 31:01845a2347ff 959 std::string sendOK = ok ? "Sent: EDID. Next:conform?" : "Send Error: EDID";
tobyspark 31:01845a2347ff 960
tobyspark 31:01845a2347ff 961 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 31:01845a2347ff 962 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 31:01845a2347ff 963 }
tobyspark 30:873979018850 964 else if (advancedMenu.selectedItem().payload.command[0] == advancedTestSources)
tobyspark 29:95a7efe30527 965 {
tobyspark 31:01845a2347ff 966 handleTVOneSources(true);
tobyspark 29:95a7efe30527 967 }
tobyspark 23:909928cafb95 968 else if (advancedMenu.selectedItem().payload.command[0] == advancedConformProcessor)
tobyspark 17:fc68d40b8b1f 969 {
tobyspark 20:8b92d7922c48 970 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 20:8b92d7922c48 971 screen.textToBuffer("Conforming...", kTVOneStatusLine);
tobyspark 20:8b92d7922c48 972 screen.sendBuffer();
tobyspark 20:8b92d7922c48 973
tobyspark 17:fc68d40b8b1f 974 bool ok = conformProcessor();
tobyspark 17:fc68d40b8b1f 975
tobyspark 17:fc68d40b8b1f 976 std::string sendOK = ok ? "Conform success" : "Send Error: Conform";
tobyspark 17:fc68d40b8b1f 977
tobyspark 17:fc68d40b8b1f 978 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 17:fc68d40b8b1f 979 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 17:fc68d40b8b1f 980 }
tobyspark 23:909928cafb95 981 else if (advancedMenu.selectedItem().payload.command[0] == advancedLoadDefaults)
tobyspark 16:52484666b323 982 {
tobyspark 16:52484666b323 983 settings.loadDefaults();
tobyspark 27:27851d3d2bba 984 setMixModeMenuItems();
tobyspark 27:27851d3d2bba 985 setResolutionMenuItems();
tobyspark 16:52484666b323 986
tobyspark 16:52484666b323 987 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 16:52484666b323 988 screen.textToBuffer("Controller reverted", kTVOneStatusLine);
tobyspark 16:52484666b323 989 }
tobyspark 23:909928cafb95 990 else if (advancedMenu.selectedItem().payload.command[0] == advancedSetResolutions)
tobyspark 21:f9d63cb7cedb 991 {
tobyspark 21:f9d63cb7cedb 992 bool ok;
tobyspark 21:f9d63cb7cedb 993 ok = tvOne.setCustomResolutions();
tobyspark 21:f9d63cb7cedb 994
tobyspark 21:f9d63cb7cedb 995 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 21:f9d63cb7cedb 996 screen.textToBuffer(ok ? "Resolutions set" : "Res' could not be set", kTVOneStatusLine);
tobyspark 21:f9d63cb7cedb 997 }
tobyspark 12:c270870bdd23 998 }
tobyspark 0:87aab40d5806 999 else
tobyspark 0:87aab40d5806 1000 {
tobyspark 0:87aab40d5806 1001 if (debug) { debug->printf("Warning: No action identified"); }
tobyspark 0:87aab40d5806 1002 }
tobyspark 0:87aab40d5806 1003 }
tobyspark 0:87aab40d5806 1004
tobyspark 0:87aab40d5806 1005
tobyspark 5:f8b285ca41ba 1006 //// MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIXMIX MIX MIXMIX MIX MIX MIX MIX MIXMIX MIX MIX
tobyspark 0:87aab40d5806 1007
tobyspark 0:87aab40d5806 1008 bool updateFade = false;
tobyspark 3:033d2b7768f3 1009 float xFade = 0;
tobyspark 3:033d2b7768f3 1010 float fadeUp = 1;
tobyspark 3:033d2b7768f3 1011
tobyspark 3:033d2b7768f3 1012 //// TASK: Process control surface
tobyspark 3:033d2b7768f3 1013
tobyspark 0:87aab40d5806 1014 // Get new states of tap buttons, remembering at end of loop() assign these current values to the previous variables
tobyspark 5:f8b285ca41ba 1015 const bool tapLeft = !tapLeftDIN;
tobyspark 5:f8b285ca41ba 1016 const bool tapRight = !tapRightDIN;
tobyspark 0:87aab40d5806 1017
tobyspark 17:fc68d40b8b1f 1018 // We're taking a further median of the AINs on top of mbed libs v29.
tobyspark 17:fc68d40b8b1f 1019 // This takes some values from last passes and most from now. With debug off, seem to need median size > 5
tobyspark 17:fc68d40b8b1f 1020 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1021 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1022 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1023 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1024 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1025 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1026 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1027 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1028 const float xFadeAINCached = xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1029 const float fadeUpAINCached = fadeUpFilter.process(fadeUpAIN.read());
tobyspark 0:87aab40d5806 1030
tobyspark 0:87aab40d5806 1031 // When a tap is depressed, we can ignore any move of the crossfader but not fade to black
tobyspark 0:87aab40d5806 1032 if (tapLeft || tapRight)
tobyspark 0:87aab40d5806 1033 {
tobyspark 5:f8b285ca41ba 1034 // If both are pressed, take to the one that is new, ie. not the first pressed.
tobyspark 0:87aab40d5806 1035 if (tapLeft && tapRight)
tobyspark 0:87aab40d5806 1036 {
tobyspark 5:f8b285ca41ba 1037 xFade = tapLeftWasFirstPressed ? 1 : 0;
tobyspark 0:87aab40d5806 1038 }
tobyspark 5:f8b285ca41ba 1039 // If just one is pressed, take to that and remember which is pressed
tobyspark 5:f8b285ca41ba 1040 else if (tapLeft)
tobyspark 5:f8b285ca41ba 1041 {
tobyspark 5:f8b285ca41ba 1042 xFade = 0;
tobyspark 5:f8b285ca41ba 1043 tapLeftWasFirstPressed = 1;
tobyspark 5:f8b285ca41ba 1044 }
tobyspark 5:f8b285ca41ba 1045 else if (tapRight)
tobyspark 5:f8b285ca41ba 1046 {
tobyspark 5:f8b285ca41ba 1047 xFade = 1;
tobyspark 5:f8b285ca41ba 1048 tapLeftWasFirstPressed = 0;
tobyspark 5:f8b285ca41ba 1049 }
tobyspark 5:f8b285ca41ba 1050 }
tobyspark 18:ebe5da639a6a 1051 else xFade = 1.0 - fadeCalc(xFadeAINCached, xFadeTolerance);
tobyspark 0:87aab40d5806 1052
tobyspark 0:87aab40d5806 1053 fadeUp = 1.0 - fadeCalc(fadeUpAINCached, fadeUpTolerance);
tobyspark 0:87aab40d5806 1054
tobyspark 33:e6672a9bd571 1055 //// TASK: Process Network Comms In, ie. modify TVOne state
tobyspark 5:f8b285ca41ba 1056 if (commsMode == commsOSC)
tobyspark 3:033d2b7768f3 1057 {
tobyspark 3:033d2b7768f3 1058 if (osc->newMessage)
tobyspark 3:033d2b7768f3 1059 {
tobyspark 3:033d2b7768f3 1060 osc->newMessage = false; // fixme!
tobyspark 33:e6672a9bd571 1061 processOSCIn(xFade, fadeUp);
tobyspark 3:033d2b7768f3 1062 }
tobyspark 3:033d2b7768f3 1063 }
tobyspark 3:033d2b7768f3 1064
tobyspark 5:f8b285ca41ba 1065 if (commsMode == commsArtNet)
tobyspark 3:033d2b7768f3 1066 {
tobyspark 33:e6672a9bd571 1067 if (artNet->Work()) processArtNetIn(xFade, fadeUp);
tobyspark 3:033d2b7768f3 1068 }
tobyspark 3:033d2b7768f3 1069
tobyspark 5:f8b285ca41ba 1070 if (commsMode == commsDMXIn)
tobyspark 5:f8b285ca41ba 1071 {
tobyspark 5:f8b285ca41ba 1072 processDMXIn(xFade, fadeUp);
tobyspark 5:f8b285ca41ba 1073 }
tobyspark 5:f8b285ca41ba 1074
tobyspark 5:f8b285ca41ba 1075 if (commsMode == commsDMXOut)
tobyspark 5:f8b285ca41ba 1076 {
tobyspark 5:f8b285ca41ba 1077 processDMXOut(xFade, fadeUp);
tobyspark 5:f8b285ca41ba 1078 }
tobyspark 0:87aab40d5806 1079
tobyspark 0:87aab40d5806 1080 // Calculate new A&B fade percents
tobyspark 0:87aab40d5806 1081 int newFadeAPercent = 0;
tobyspark 0:87aab40d5806 1082 int newFadeBPercent = 0;
tobyspark 0:87aab40d5806 1083
tobyspark 30:873979018850 1084 if (mixMode == mixBlend)
tobyspark 11:0783cfbeb746 1085 {
tobyspark 30:873979018850 1086 if (fadeUp < 1.0)
tobyspark 30:873979018850 1087 {
tobyspark 30:873979018850 1088 // 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 30:873979018850 1089 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 30:873979018850 1090 newFadeBPercent = xFade * fadeUp * 100.0;
tobyspark 30:873979018850 1091 }
tobyspark 30:873979018850 1092 else
tobyspark 30:873979018850 1093 {
tobyspark 30:873979018850 1094 // we can optimise and just fade A in and out over a fully up B, doubling the rate of fadeA commands sent.
tobyspark 30:873979018850 1095 newFadeAPercent = (1.0-xFade) * 100.0;
tobyspark 30:873979018850 1096 newFadeBPercent = 100.0;
tobyspark 30:873979018850 1097 }
tobyspark 11:0783cfbeb746 1098 }
tobyspark 15:4b394c64b461 1099 else if (mixMode == mixAdditive)
tobyspark 11:0783cfbeb746 1100 {
tobyspark 22:90054fe6d86c 1101 // we need to set fade level of both windows according to the fade curve profile
tobyspark 22:90054fe6d86c 1102 float newFadeA = (1.0-xFade) * (1.0 + fadeCurve);
tobyspark 22:90054fe6d86c 1103 float newFadeB = xFade * (1 + fadeCurve);
tobyspark 22:90054fe6d86c 1104 if (newFadeA > 1.0) newFadeA = 1.0;
tobyspark 22:90054fe6d86c 1105 if (newFadeB > 1.0) newFadeB = 1.0;
tobyspark 22:90054fe6d86c 1106
tobyspark 22:90054fe6d86c 1107 newFadeAPercent = newFadeA * fadeUp * 100.0;
tobyspark 22:90054fe6d86c 1108 newFadeBPercent = newFadeB * fadeUp * 100.0;
tobyspark 11:0783cfbeb746 1109 }
tobyspark 15:4b394c64b461 1110 else if (mixMode >= mixKey)
tobyspark 11:0783cfbeb746 1111 {
tobyspark 0:87aab40d5806 1112 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 0:87aab40d5806 1113 newFadeBPercent = fadeUp * 100.0;
tobyspark 0:87aab40d5806 1114 }
tobyspark 0:87aab40d5806 1115
tobyspark 17:fc68d40b8b1f 1116 //// TASK: Send to TVOne if percents have changed
tobyspark 17:fc68d40b8b1f 1117
tobyspark 17:fc68d40b8b1f 1118 // No amount of median filtering is stopping flipflopping between two adjacent percents, so...
tobyspark 17:fc68d40b8b1f 1119 bool fadeAPercentHasChanged;
tobyspark 17:fc68d40b8b1f 1120 bool fadeBPercentHasChanged;
tobyspark 17:fc68d40b8b1f 1121 if (oldFadeAPercent == newFadeAPercent && (newFadeAPercent == fadeAPercent - 1 || newFadeAPercent == fadeAPercent + 1))
tobyspark 17:fc68d40b8b1f 1122 fadeAPercentHasChanged = false;
tobyspark 17:fc68d40b8b1f 1123 else
tobyspark 17:fc68d40b8b1f 1124 fadeAPercentHasChanged = newFadeAPercent != fadeAPercent;
tobyspark 17:fc68d40b8b1f 1125 if (oldFadeBPercent == newFadeBPercent && (newFadeBPercent == fadeBPercent - 1 || newFadeBPercent == fadeBPercent + 1))
tobyspark 17:fc68d40b8b1f 1126 fadeBPercentHasChanged = false;
tobyspark 17:fc68d40b8b1f 1127 else
tobyspark 17:fc68d40b8b1f 1128 fadeBPercentHasChanged = newFadeBPercent != fadeBPercent;
tobyspark 17:fc68d40b8b1f 1129
tobyspark 9:f83eadd8917a 1130 // We want to send the higher first, otherwise black flashes can happen on taps
tobyspark 17:fc68d40b8b1f 1131 if (fadeAPercentHasChanged && newFadeAPercent >= newFadeBPercent)
tobyspark 8:d46cc49f0f37 1132 {
tobyspark 17:fc68d40b8b1f 1133 oldFadeAPercent = fadeAPercent;
tobyspark 0:87aab40d5806 1134 fadeAPercent = newFadeAPercent;
tobyspark 0:87aab40d5806 1135 updateFade = true;
tobyspark 0:87aab40d5806 1136
tobyspark 0:87aab40d5806 1137 fadeAPO = fadeAPercent / 100.0;
tobyspark 0:87aab40d5806 1138 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 0:87aab40d5806 1139 }
tobyspark 17:fc68d40b8b1f 1140 if (fadeBPercentHasChanged)
tobyspark 8:d46cc49f0f37 1141 {
tobyspark 17:fc68d40b8b1f 1142 oldFadeBPercent = fadeBPercent;
tobyspark 0:87aab40d5806 1143 fadeBPercent = newFadeBPercent;
tobyspark 0:87aab40d5806 1144 updateFade = true;
tobyspark 0:87aab40d5806 1145
tobyspark 0:87aab40d5806 1146 fadeBPO = fadeBPercent / 100.0;
tobyspark 0:87aab40d5806 1147 tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 0:87aab40d5806 1148 }
tobyspark 17:fc68d40b8b1f 1149 if (fadeAPercentHasChanged && newFadeAPercent < newFadeBPercent)
tobyspark 9:f83eadd8917a 1150 {
tobyspark 17:fc68d40b8b1f 1151 oldFadeAPercent = fadeAPercent;
tobyspark 9:f83eadd8917a 1152 fadeAPercent = newFadeAPercent;
tobyspark 9:f83eadd8917a 1153 updateFade = true;
tobyspark 9:f83eadd8917a 1154
tobyspark 9:f83eadd8917a 1155 fadeAPO = fadeAPercent / 100.0;
tobyspark 9:f83eadd8917a 1156 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 9:f83eadd8917a 1157 }
tobyspark 8:d46cc49f0f37 1158 if (updateFade && debug)
tobyspark 8:d46cc49f0f37 1159 {
tobyspark 0:87aab40d5806 1160 //debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAIN.read(), fadeUpAIN.read());
tobyspark 0:87aab40d5806 1161 debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAINCached, fadeUpAINCached);
tobyspark 0:87aab40d5806 1162 debug->printf("xFade = %3f fadeUp = %3f fadeA% = %i fadeB% = %i \r\n", xFade, fadeUp, fadeAPercent, fadeBPercent);
tobyspark 18:ebe5da639a6a 1163 debug->printf("\r\n");
tobyspark 0:87aab40d5806 1164 }
tobyspark 30:873979018850 1165
tobyspark 33:e6672a9bd571 1166
tobyspark 33:e6672a9bd571 1167 //// TASK: Process Network Comms Out, ie. send out any fade updates
tobyspark 33:e6672a9bd571 1168 if (commsMode == commsOSC && updateFade)
tobyspark 33:e6672a9bd571 1169 {
tobyspark 33:e6672a9bd571 1170 processOSCOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1171 }
tobyspark 33:e6672a9bd571 1172
tobyspark 33:e6672a9bd571 1173 if (commsMode == commsArtNet && updateFade)
tobyspark 33:e6672a9bd571 1174 {
tobyspark 33:e6672a9bd571 1175 processArtNetOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1176 }
tobyspark 33:e6672a9bd571 1177
tobyspark 33:e6672a9bd571 1178 if (commsMode == commsDMXOut && updateFade)
tobyspark 33:e6672a9bd571 1179 {
tobyspark 33:e6672a9bd571 1180 processDMXOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1181 }
tobyspark 33:e6672a9bd571 1182
tobyspark 30:873979018850 1183 // If we're not actively mixing, we can do any housekeeping...
tobyspark 30:873979018850 1184 if (!updateFade)
tobyspark 30:873979018850 1185 {
tobyspark 30:873979018850 1186 // We should check up on any source flagged unstable
tobyspark 30:873979018850 1187 if (!tvOneRGB1Stable || !tvOneRGB2Stable) handleTVOneSources();
tobyspark 30:873979018850 1188 }
tobyspark 33:e6672a9bd571 1189
tobyspark 33:e6672a9bd571 1190 // Send any updates to the display
tobyspark 33:e6672a9bd571 1191 screen.sendBuffer();
tobyspark 0:87aab40d5806 1192 }
tobyspark 30:873979018850 1193 }