The codebase to run the *spark d-fuser controller www.sparkav.co.uk/dvimixer

Dependencies:   SPK-TVOne DMX DmxArtNet NetServicesMin OSC PinDetect mRotaryEncoder iniparser mbed spk_oled_ssd1305 filter

Committer:
tobyspark
Date:
Sat Jul 27 18:27:11 2013 +0000
Revision:
68:c26478f42ca4
Parent:
67:6ce9fb62b17c
Child:
69:cd1c85de3e38
Read network settings in from SPKDF.ini

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tobyspark 47:ff6b98459548 1 /* *SPARK D-FUSER
tobyspark 8:d46cc49f0f37 2 * A project by Toby Harris
tobyspark 8:d46cc49f0f37 3 *
tobyspark 65:24ee1bf3061c 4 * 'DJ' controller style 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 65:24ee1bf3061c 7 * www.tobyz.net/projects/dvi-mixer
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 35:d5d9f0838f99 41 * v22 - EDID passthrough override and EDID upload from USB mass storage
tobyspark 49:16309f39cead 42 * v23 - Set keying values from controller
tobyspark 44:723e65413ebe 43 * v24 - Conform uploads SIS image; now once firmware is loaded controller is all that is required
tobyspark 49:16309f39cead 44 * v25 - UX work
tobyspark 58:54347f2c3184 45 * v26 - Tweaks: Network in works with hands-on controls, EDID Change message, Fit/Fill
tobyspark 65:24ee1bf3061c 46 * v27 - Rework Keying UX, having current key saved in processor and loading in presets.
tobyspark 68:c26478f42ca4 47 * v28 - Network tweaks. Reads OSC and ArtNet network info from .ini
tobyspark 36:8b5c75c8bc23 48 * vxx - TODO: Writes back to .ini on USB mass storage: keyer updates, comms, hdcp, edid internal/passthrough, ...?
tobyspark 8:d46cc49f0f37 49 * vxx - TODO: EDID creation from resolution
tobyspark 8:d46cc49f0f37 50 */
tobyspark 8:d46cc49f0f37 51
tobyspark 0:87aab40d5806 52 #include "mbed.h"
tobyspark 0:87aab40d5806 53
tobyspark 0:87aab40d5806 54 #include "spk_tvone_mbed.h"
tobyspark 0:87aab40d5806 55 #include "spk_utils.h"
tobyspark 0:87aab40d5806 56 #include "spk_mRotaryEncoder.h"
tobyspark 0:87aab40d5806 57 #include "spk_oled_ssd1305.h"
tobyspark 2:50043054e4f7 58 #include "spk_oled_gfx.h"
tobyspark 11:0783cfbeb746 59 #include "spk_settings.h"
tobyspark 1:f9fca21102e0 60 #include "EthernetNetIf.h"
tobyspark 1:f9fca21102e0 61 #include "mbedOSC.h"
tobyspark 3:033d2b7768f3 62 #include "DmxArtNet.h"
tobyspark 5:f8b285ca41ba 63 #include "DMX.h"
tobyspark 17:fc68d40b8b1f 64 #include "filter.h"
tobyspark 0:87aab40d5806 65
tobyspark 68:c26478f42ca4 66 #define kSPKDFSoftwareVersion "28"
tobyspark 13:3796bde6ba8f 67
tobyspark 5:f8b285ca41ba 68 // MBED PINS
tobyspark 5:f8b285ca41ba 69
tobyspark 5:f8b285ca41ba 70 #define kMBED_AIN_XFADE p20
tobyspark 5:f8b285ca41ba 71 #define kMBED_AIN_FADEUP p19
tobyspark 5:f8b285ca41ba 72 #define kMBED_DIN_TAP_L p24
tobyspark 5:f8b285ca41ba 73 #define kMBED_DIN_TAP_R p23
tobyspark 5:f8b285ca41ba 74 #define kMBED_ENC_SW p15
tobyspark 5:f8b285ca41ba 75 #define kMBED_ENC_A p16
tobyspark 5:f8b285ca41ba 76 #define kMBED_ENC_B p17
tobyspark 5:f8b285ca41ba 77
tobyspark 5:f8b285ca41ba 78 #define kMBED_RS232_TTLTX p13
tobyspark 5:f8b285ca41ba 79 #define kMBED_RS232_TTLRX p14
tobyspark 5:f8b285ca41ba 80
tobyspark 5:f8b285ca41ba 81 #define kMBED_OLED_MOSI p5
tobyspark 5:f8b285ca41ba 82 #define kMBED_OLED_SCK p7
tobyspark 5:f8b285ca41ba 83 #define kMBED_OLED_CS p8
tobyspark 5:f8b285ca41ba 84 #define kMBED_OLED_RES p9
tobyspark 5:f8b285ca41ba 85 #define kMBED_OLED_DC p10
tobyspark 5:f8b285ca41ba 86
tobyspark 5:f8b285ca41ba 87 #define kMBED_DIN_ETHLO_DMXHI p30
tobyspark 5:f8b285ca41ba 88 #define kMBED_DOUT_RS485_TXHI_RXLO p29
tobyspark 5:f8b285ca41ba 89 #define kMBED_RS485_TTLTX p28
tobyspark 5:f8b285ca41ba 90 #define kMBED_RS485_TTLRX p27
tobyspark 5:f8b285ca41ba 91
tobyspark 5:f8b285ca41ba 92 // DISPLAY
tobyspark 5:f8b285ca41ba 93
tobyspark 1:f9fca21102e0 94 #define kMenuLine1 3
tobyspark 1:f9fca21102e0 95 #define kMenuLine2 4
tobyspark 1:f9fca21102e0 96 #define kCommsStatusLine 6
tobyspark 1:f9fca21102e0 97 #define kTVOneStatusLine 7
tobyspark 48:c0fedfa8c525 98 #define kTVOneStatusMessageHoldTime 5
tobyspark 1:f9fca21102e0 99
tobyspark 13:3796bde6ba8f 100 // 8.3 format filename only, no subdirs
tobyspark 13:3796bde6ba8f 101 #define kSPKDFSettingsFilename "SPKDF.ini"
tobyspark 11:0783cfbeb746 102
tobyspark 26:0299f8760715 103 #define kStringBufferLength 30
tobyspark 26:0299f8760715 104
tobyspark 0:87aab40d5806 105 //// DEBUG
tobyspark 0:87aab40d5806 106
tobyspark 0:87aab40d5806 107 // Comment out one or the other...
tobyspark 56:d6f77bd54e10 108 //Serial *debug = new Serial(USBTX, USBRX); // For debugging via USB serial
tobyspark 56:d6f77bd54e10 109 Serial *debug = NULL; // For release (no debugging)
tobyspark 0:87aab40d5806 110
tobyspark 15:4b394c64b461 111 //// SOFT RESET
tobyspark 15:4b394c64b461 112
tobyspark 15:4b394c64b461 113 extern "C" void mbed_reset();
tobyspark 15:4b394c64b461 114
tobyspark 0:87aab40d5806 115 //// mBED PIN ASSIGNMENTS
tobyspark 0:87aab40d5806 116
tobyspark 0:87aab40d5806 117 // Inputs
tobyspark 5:f8b285ca41ba 118 AnalogIn xFadeAIN(kMBED_AIN_XFADE);
tobyspark 5:f8b285ca41ba 119 AnalogIn fadeUpAIN(kMBED_AIN_FADEUP);
tobyspark 5:f8b285ca41ba 120 DigitalIn tapLeftDIN(kMBED_DIN_TAP_L);
tobyspark 5:f8b285ca41ba 121 DigitalIn tapRightDIN(kMBED_DIN_TAP_R);
tobyspark 17:fc68d40b8b1f 122 medianFilter xFadeFilter(9);
tobyspark 17:fc68d40b8b1f 123 medianFilter fadeUpFilter(9);
tobyspark 0:87aab40d5806 124
tobyspark 5:f8b285ca41ba 125 SPKRotaryEncoder menuEnc(kMBED_ENC_A, kMBED_ENC_B, kMBED_ENC_SW);
tobyspark 5:f8b285ca41ba 126
tobyspark 5:f8b285ca41ba 127 DigitalIn rj45ModeDIN(kMBED_DIN_ETHLO_DMXHI);
tobyspark 0:87aab40d5806 128
tobyspark 0:87aab40d5806 129 // Outputs
tobyspark 0:87aab40d5806 130 PwmOut fadeAPO(LED1);
tobyspark 0:87aab40d5806 131 PwmOut fadeBPO(LED2);
tobyspark 0:87aab40d5806 132
tobyspark 5:f8b285ca41ba 133 DigitalOut dmxDirectionDOUT(kMBED_DOUT_RS485_TXHI_RXLO);
tobyspark 5:f8b285ca41ba 134
tobyspark 0:87aab40d5806 135 // SPKTVOne(PinName txPin, PinName rxPin, PinName signWritePin, PinName signErrorPin, Serial *debugSerial)
tobyspark 5:f8b285ca41ba 136 SPKTVOne tvOne(kMBED_RS232_TTLTX, kMBED_RS232_TTLRX, LED3, LED4, debug);
tobyspark 0:87aab40d5806 137
tobyspark 0:87aab40d5806 138 // SPKDisplay(PinName mosi, PinName clk, PinName cs, PinName dc, PinName res, Serial *debugSerial = NULL);
tobyspark 5:f8b285ca41ba 139 SPKDisplay screen(kMBED_OLED_MOSI, kMBED_OLED_SCK, kMBED_OLED_CS, kMBED_OLED_DC, kMBED_OLED_RES, debug);
tobyspark 48:c0fedfa8c525 140 SPKMessageHold tvOneStatusMessage;
tobyspark 0:87aab40d5806 141
tobyspark 11:0783cfbeb746 142 // Saved Settings
tobyspark 11:0783cfbeb746 143 SPKSettings settings;
tobyspark 11:0783cfbeb746 144
tobyspark 0:87aab40d5806 145 // Menu
tobyspark 0:87aab40d5806 146 SPKMenu *selectedMenu;
tobyspark 23:909928cafb95 147 SPKMenu mainMenu;
tobyspark 23:909928cafb95 148 SPKMenu resolutionMenu;
tobyspark 12:c270870bdd23 149
tobyspark 24:49c6624119ae 150 SPKMenu mixModeMenu;
tobyspark 36:8b5c75c8bc23 151 SPKMenu mixModeAdditiveMenu;
tobyspark 49:16309f39cead 152 SPKMenu mixModeUpdateKeyMenu;
tobyspark 36:8b5c75c8bc23 153 enum { mixBlend, mixAdditive, mixKey };
tobyspark 36:8b5c75c8bc23 154 int mixKeyStartIndex = 1; // need this hard coded as mixBlend and mixAdditive are now combined into the same menu item
tobyspark 30:873979018850 155 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 49:16309f39cead 156 int mixModeOld = mixMode;
tobyspark 29:95a7efe30527 157 float fadeCurve = 0.0f; // 0 = "X", ie. as per blend, 1 = "/\", ie. as per additive <-- pictograms!
tobyspark 22:90054fe6d86c 158
tobyspark 23:909928cafb95 159 SPKMenu commsMenu;
tobyspark 5:f8b285ca41ba 160 enum { commsNone, commsOSC, commsArtNet, commsDMXIn, commsDMXOut};
tobyspark 5:f8b285ca41ba 161 int commsMode = commsNone;
tobyspark 22:90054fe6d86c 162
tobyspark 51:98cc27390484 163 SPKMenu troubleshootingMenu;
tobyspark 51:98cc27390484 164 SPKMenu troubleshootingMenuHDCP;
tobyspark 51:98cc27390484 165 SPKMenu troubleshootingMenuEDID;
tobyspark 55:35a295d36d23 166 SPKMenu troubleshootingMenuAspect;
tobyspark 51:98cc27390484 167 SPKMenu troubleshootingMenuReset;
tobyspark 51:98cc27390484 168
tobyspark 23:909928cafb95 169 SPKMenu advancedMenu;
tobyspark 51:98cc27390484 170 enum { advancedConformUploadProcessor, advancedSetResolutions };
tobyspark 1:f9fca21102e0 171
tobyspark 5:f8b285ca41ba 172 // RJ45 Comms
tobyspark 5:f8b285ca41ba 173 enum { rj45Ethernet = 0, rj45DMX = 1}; // These values from circuit
tobyspark 5:f8b285ca41ba 174 int rj45Mode = -1;
tobyspark 1:f9fca21102e0 175 EthernetNetIf *ethernet = NULL;
tobyspark 1:f9fca21102e0 176 OSCClass *osc = NULL;
tobyspark 33:e6672a9bd571 177 OSCMessage sendMessage;
tobyspark 33:e6672a9bd571 178 OSCMessage receiveMessage;
tobyspark 3:033d2b7768f3 179 DmxArtNet *artNet = NULL;
tobyspark 5:f8b285ca41ba 180 DMX *dmx = NULL;
tobyspark 0:87aab40d5806 181
tobyspark 3:033d2b7768f3 182 // Fade logic constants
tobyspark 0:87aab40d5806 183 const float xFadeTolerance = 0.05;
tobyspark 0:87aab40d5806 184 const float fadeUpTolerance = 0.05;
tobyspark 0:87aab40d5806 185
tobyspark 0:87aab40d5806 186 // A&B Fade as resolved percent
tobyspark 0:87aab40d5806 187 int fadeAPercent = 0;
tobyspark 0:87aab40d5806 188 int fadeBPercent = 0;
tobyspark 17:fc68d40b8b1f 189 int oldFadeAPercent = 0;
tobyspark 17:fc68d40b8b1f 190 int oldFadeBPercent = 0;
tobyspark 0:87aab40d5806 191
tobyspark 0:87aab40d5806 192 // Tap button states
tobyspark 5:f8b285ca41ba 193 bool tapLeftWasFirstPressed = false;
tobyspark 0:87aab40d5806 194
tobyspark 58:54347f2c3184 195 // Comms In fade state
tobyspark 65:24ee1bf3061c 196 float commsXFade = -1;
tobyspark 65:24ee1bf3061c 197 float commsFadeUp = -1;
tobyspark 58:54347f2c3184 198 float oldXFade = 0;
tobyspark 58:54347f2c3184 199 float oldFadeUp = 0;
tobyspark 58:54347f2c3184 200 bool commsInActive = false;
tobyspark 58:54347f2c3184 201
tobyspark 30:873979018850 202 // TVOne input sources stable flag
tobyspark 34:69dfe64e7e6b 203 bool tvOneRGB1Stable = false;
tobyspark 34:69dfe64e7e6b 204 bool tvOneRGB2Stable = false;
tobyspark 30:873979018850 205
tobyspark 31:01845a2347ff 206 // TVOne behaviour flags
tobyspark 31:01845a2347ff 207 bool tvOneHDCPOn = false;
tobyspark 34:69dfe64e7e6b 208 bool tvOneEDIDPassthrough = false;
tobyspark 31:01845a2347ff 209 const int32_t EDIDPassthroughSlot = 7;
tobyspark 34:69dfe64e7e6b 210
tobyspark 58:54347f2c3184 211 bool processOSCIn()
tobyspark 58:54347f2c3184 212 {
tobyspark 58:54347f2c3184 213 bool updateFade = false;
tobyspark 58:54347f2c3184 214
tobyspark 58:54347f2c3184 215 if (osc->newMessage)
tobyspark 3:033d2b7768f3 216 {
tobyspark 58:54347f2c3184 217 osc->newMessage = false; // fixme!
tobyspark 58:54347f2c3184 218
tobyspark 58:54347f2c3184 219 string statusMessage;
tobyspark 58:54347f2c3184 220
tobyspark 58:54347f2c3184 221 if (!strcmp( receiveMessage.getTopAddress() , "dvimxr" ))
tobyspark 25:3b519ef70341 222 {
tobyspark 58:54347f2c3184 223 statusMessage = "OSC: /dvimxr";
tobyspark 58:54347f2c3184 224 if (!strcmp( receiveMessage.getSubAddress() , "xFade" ))
tobyspark 58:54347f2c3184 225 {
tobyspark 58:54347f2c3184 226 if (receiveMessage.getArgNum() == 1)
tobyspark 58:54347f2c3184 227 if (receiveMessage.getTypeTag(0) == 'f')
tobyspark 58:54347f2c3184 228 {
tobyspark 58:54347f2c3184 229 commsXFade = receiveMessage.getArgFloat(0);
tobyspark 58:54347f2c3184 230 updateFade = true;
tobyspark 58:54347f2c3184 231
tobyspark 58:54347f2c3184 232 char buffer[15];
tobyspark 58:54347f2c3184 233 snprintf(buffer, 15, "/xFade %1.2f", commsXFade);
tobyspark 58:54347f2c3184 234 statusMessage += buffer;
tobyspark 58:54347f2c3184 235 }
tobyspark 58:54347f2c3184 236 }
tobyspark 58:54347f2c3184 237 else if (!strcmp( receiveMessage.getSubAddress() , "fadeUp" ))
tobyspark 58:54347f2c3184 238 {
tobyspark 58:54347f2c3184 239 if (receiveMessage.getArgNum() == 1)
tobyspark 58:54347f2c3184 240 if (receiveMessage.getTypeTag(0) == 'f')
tobyspark 58:54347f2c3184 241 {
tobyspark 58:54347f2c3184 242 commsFadeUp = receiveMessage.getArgFloat(0);
tobyspark 58:54347f2c3184 243 updateFade = true;
tobyspark 58:54347f2c3184 244
tobyspark 58:54347f2c3184 245 char buffer[15];
tobyspark 58:54347f2c3184 246 snprintf(buffer, 15, "/fadeUp %1.2f", commsFadeUp);
tobyspark 58:54347f2c3184 247 statusMessage += buffer;
tobyspark 58:54347f2c3184 248 }
tobyspark 58:54347f2c3184 249 }
tobyspark 66:02845e02a758 250 else if (!strcmp( receiveMessage.getSubAddress() , "xFadeFadeUp" ))
tobyspark 66:02845e02a758 251 {
tobyspark 66:02845e02a758 252 if (receiveMessage.getArgNum() == 2)
tobyspark 66:02845e02a758 253 if (receiveMessage.getTypeTag(0) == 'f' && receiveMessage.getTypeTag(1) == 'f')
tobyspark 66:02845e02a758 254 {
tobyspark 66:02845e02a758 255 commsXFade = receiveMessage.getArgFloat(0);
tobyspark 66:02845e02a758 256 commsFadeUp = receiveMessage.getArgFloat(1);
tobyspark 66:02845e02a758 257 updateFade = true;
tobyspark 66:02845e02a758 258
tobyspark 66:02845e02a758 259 char buffer[15];
tobyspark 66:02845e02a758 260 snprintf(buffer, 15, "/... %1.2f %1.2f", commsXFade, commsFadeUp);
tobyspark 66:02845e02a758 261 statusMessage += buffer;
tobyspark 66:02845e02a758 262 }
tobyspark 66:02845e02a758 263 }
tobyspark 58:54347f2c3184 264 else
tobyspark 58:54347f2c3184 265 {
tobyspark 58:54347f2c3184 266 statusMessage += receiveMessage.getSubAddress();
tobyspark 58:54347f2c3184 267 statusMessage += " - Ignoring";
tobyspark 58:54347f2c3184 268 }
tobyspark 25:3b519ef70341 269 }
tobyspark 58:54347f2c3184 270 else
tobyspark 25:3b519ef70341 271 {
tobyspark 58:54347f2c3184 272 statusMessage = "OSC: ";
tobyspark 58:54347f2c3184 273 statusMessage += receiveMessage.getTopAddress();
tobyspark 25:3b519ef70341 274 statusMessage += " - Ignoring";
tobyspark 25:3b519ef70341 275 }
tobyspark 58:54347f2c3184 276
tobyspark 58:54347f2c3184 277 screen.clearBufferRow(kCommsStatusLine);
tobyspark 58:54347f2c3184 278 screen.textToBuffer(statusMessage, kCommsStatusLine);
tobyspark 58:54347f2c3184 279
tobyspark 58:54347f2c3184 280 if (debug) debug->printf("%s \r\n", statusMessage.c_str());
tobyspark 3:033d2b7768f3 281 }
tobyspark 3:033d2b7768f3 282
tobyspark 58:54347f2c3184 283 return updateFade;
tobyspark 3:033d2b7768f3 284 }
tobyspark 3:033d2b7768f3 285
tobyspark 58:54347f2c3184 286 void processOSCOut(const float &xFade, const float &fadeUp)
tobyspark 33:e6672a9bd571 287 {
tobyspark 33:e6672a9bd571 288 sendMessage.setAddress("dvimxr", "xFadeFadeUp");
tobyspark 33:e6672a9bd571 289 sendMessage.setArgs("ff", &xFade, &fadeUp);
tobyspark 33:e6672a9bd571 290 osc->sendOsc(&sendMessage);
tobyspark 33:e6672a9bd571 291
tobyspark 58:54347f2c3184 292 char statusMessageBuffer[kStringBufferLength];
tobyspark 58:54347f2c3184 293 snprintf(statusMessageBuffer, kStringBufferLength, "OSC Out: xF %.2f fUp %.2f", xFade, fadeUp);
tobyspark 33:e6672a9bd571 294 screen.clearBufferRow(kCommsStatusLine);
tobyspark 33:e6672a9bd571 295 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 296
tobyspark 33:e6672a9bd571 297 if (debug) debug->printf(statusMessageBuffer);
tobyspark 33:e6672a9bd571 298 }
tobyspark 33:e6672a9bd571 299
tobyspark 58:54347f2c3184 300 bool processArtNetIn()
tobyspark 8:d46cc49f0f37 301 {
tobyspark 58:54347f2c3184 302 if (artNet->Work())
tobyspark 58:54347f2c3184 303 {
tobyspark 58:54347f2c3184 304 int xFadeDMX = artNet->DmxIn[0][0];
tobyspark 58:54347f2c3184 305 int fadeUpDMX = artNet->DmxIn[0][1];
tobyspark 58:54347f2c3184 306
tobyspark 58:54347f2c3184 307 commsXFade = (float)xFadeDMX/255;
tobyspark 58:54347f2c3184 308 commsFadeUp = (float)fadeUpDMX/255;
tobyspark 58:54347f2c3184 309
tobyspark 58:54347f2c3184 310 char statusMessageBuffer[kStringBufferLength];
tobyspark 58:54347f2c3184 311 snprintf(statusMessageBuffer, kStringBufferLength, "A'Net In: xF%3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 58:54347f2c3184 312 screen.clearBufferRow(kCommsStatusLine);
tobyspark 58:54347f2c3184 313 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 58:54347f2c3184 314
tobyspark 58:54347f2c3184 315 if (debug) debug->printf("ArtNet activity");
tobyspark 58:54347f2c3184 316
tobyspark 58:54347f2c3184 317 return true;
tobyspark 58:54347f2c3184 318 }
tobyspark 58:54347f2c3184 319
tobyspark 58:54347f2c3184 320 return false;
tobyspark 3:033d2b7768f3 321 }
tobyspark 0:87aab40d5806 322
tobyspark 58:54347f2c3184 323 void processArtNetOut(const float &xFade, const float &fadeUp)
tobyspark 33:e6672a9bd571 324 {
tobyspark 33:e6672a9bd571 325 int xFadeDMX = xFade*255;
tobyspark 33:e6672a9bd571 326 int fadeUpDMX = fadeUp*255;
tobyspark 33:e6672a9bd571 327
tobyspark 33:e6672a9bd571 328 // Universe 0, Channel 0 = xFade, Channel 1 = fadeUp
tobyspark 33:e6672a9bd571 329 char dmxData[2] = {xFadeDMX, fadeUpDMX};
tobyspark 33:e6672a9bd571 330 artNet->Send_ArtDmx(0, 0, dmxData, 2);
tobyspark 33:e6672a9bd571 331
tobyspark 58:54347f2c3184 332 char statusMessageBuffer[kStringBufferLength];
tobyspark 58:54347f2c3184 333 snprintf(statusMessageBuffer, kStringBufferLength, "A'Net Out: xF%3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 33:e6672a9bd571 334 screen.clearBufferRow(kCommsStatusLine);
tobyspark 33:e6672a9bd571 335 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 336
tobyspark 33:e6672a9bd571 337 if (debug) debug->printf(statusMessageBuffer);
tobyspark 33:e6672a9bd571 338 }
tobyspark 33:e6672a9bd571 339
tobyspark 58:54347f2c3184 340 bool processDMXIn()
tobyspark 8:d46cc49f0f37 341 {
tobyspark 68:c26478f42ca4 342 int xFadeDMX = dmx->get(settings.dmx.inChannelXFade);
tobyspark 68:c26478f42ca4 343 int fadeUpDMX = dmx->get(settings.dmx.inChannelFadeUp);
tobyspark 5:f8b285ca41ba 344
tobyspark 58:54347f2c3184 345 if (((float)xFadeDMX/255 != commsXFade) && ((float)fadeUpDMX/255 != commsFadeUp))
tobyspark 58:54347f2c3184 346 {
tobyspark 58:54347f2c3184 347 commsXFade = (float)xFadeDMX/255;
tobyspark 58:54347f2c3184 348 commsFadeUp = (float)fadeUpDMX/255;
tobyspark 58:54347f2c3184 349
tobyspark 58:54347f2c3184 350 char statusMessageBuffer[kStringBufferLength];
tobyspark 58:54347f2c3184 351 snprintf(statusMessageBuffer, kStringBufferLength, "DMX In: xF %3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 58:54347f2c3184 352 screen.clearBufferRow(kCommsStatusLine);
tobyspark 58:54347f2c3184 353 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 58:54347f2c3184 354
tobyspark 58:54347f2c3184 355 if (debug) debug->printf(statusMessageBuffer);
tobyspark 58:54347f2c3184 356
tobyspark 58:54347f2c3184 357 return true;
tobyspark 58:54347f2c3184 358 }
tobyspark 58:54347f2c3184 359
tobyspark 58:54347f2c3184 360 return false;
tobyspark 5:f8b285ca41ba 361 }
tobyspark 5:f8b285ca41ba 362
tobyspark 58:54347f2c3184 363 void processDMXOut(const float &xFade, const float &fadeUp)
tobyspark 8:d46cc49f0f37 364 {
tobyspark 51:98cc27390484 365 int xFadeDMX = xFade*255;
tobyspark 51:98cc27390484 366 int fadeUpDMX = fadeUp*255;
tobyspark 5:f8b285ca41ba 367
tobyspark 68:c26478f42ca4 368 dmx->put(settings.dmx.outChannelXFade, xFadeDMX);
tobyspark 68:c26478f42ca4 369 dmx->put(settings.dmx.outChannelFadeUp, fadeUpDMX);
tobyspark 5:f8b285ca41ba 370
tobyspark 58:54347f2c3184 371 char statusMessageBuffer[kStringBufferLength];
tobyspark 58:54347f2c3184 372 snprintf(statusMessageBuffer, kStringBufferLength, "DMX Out: xF %3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 5:f8b285ca41ba 373 screen.clearBufferRow(kCommsStatusLine);
tobyspark 25:3b519ef70341 374 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 375
tobyspark 25:3b519ef70341 376 if (debug) debug->printf(statusMessageBuffer);
tobyspark 5:f8b285ca41ba 377 }
tobyspark 0:87aab40d5806 378
tobyspark 8:d46cc49f0f37 379 inline float fadeCalc (const float AIN, const float tolerance)
tobyspark 8:d46cc49f0f37 380 {
tobyspark 0:87aab40d5806 381 float pos ;
tobyspark 0:87aab40d5806 382 if (AIN < tolerance) pos = 0;
tobyspark 0:87aab40d5806 383 else if (AIN > 1.0 - tolerance) pos = 1;
tobyspark 0:87aab40d5806 384 else pos = (AIN - tolerance) / (1 - 2*tolerance);
tobyspark 0:87aab40d5806 385 if (debug && false) debug->printf("fadeCalc in: %f out: %f \r\n", AIN, pos);
tobyspark 0:87aab40d5806 386 return pos;
tobyspark 0:87aab40d5806 387 }
tobyspark 0:87aab40d5806 388
tobyspark 34:69dfe64e7e6b 389 bool handleTVOneSources()
tobyspark 30:873979018850 390 {
tobyspark 49:16309f39cead 391 static int notOKCounter = 0;
tobyspark 49:16309f39cead 392
tobyspark 30:873979018850 393 bool ok = true;
tobyspark 30:873979018850 394
tobyspark 30:873979018850 395 int32_t payload = 0;
tobyspark 30:873979018850 396
tobyspark 30:873979018850 397 ok = ok && tvOne.readCommand(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceSourceStable, payload);
tobyspark 34:69dfe64e7e6b 398 bool RGB1 = (payload == 1);
tobyspark 30:873979018850 399
tobyspark 30:873979018850 400 ok = ok && tvOne.readCommand(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceSourceStable, payload);
tobyspark 30:873979018850 401 bool RGB2 = (payload == 1);
tobyspark 30:873979018850 402
tobyspark 34:69dfe64e7e6b 403 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, payload);
tobyspark 34:69dfe64e7e6b 404 int sourceA = payload;
tobyspark 34:69dfe64e7e6b 405
tobyspark 34:69dfe64e7e6b 406 ok = ok && tvOne.readCommand(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, payload);
tobyspark 34:69dfe64e7e6b 407 int sourceB = payload;
tobyspark 34:69dfe64e7e6b 408
tobyspark 44:723e65413ebe 409 if (debug) debug->printf("HandleTVOneSources: RGB1: %i, RGB2: %i, sourceA: %#x, sourceB: %#x \r\n", RGB1, RGB2, sourceA, sourceB);
tobyspark 45:cf8c2400be5c 410
tobyspark 45:cf8c2400be5c 411 string tvOneDetectString = "TVOne: ";
tobyspark 45:cf8c2400be5c 412
tobyspark 45:cf8c2400be5c 413 if (ok)
tobyspark 30:873979018850 414 {
tobyspark 45:cf8c2400be5c 415 string right = RGB1 ? "Live" : (tvOneRGB1Stable ? "Hold" : "Logo");
tobyspark 45:cf8c2400be5c 416 string left = RGB2 ? "Live" : (tvOneRGB2Stable ? "Hold" : "Logo");
tobyspark 45:cf8c2400be5c 417
tobyspark 45:cf8c2400be5c 418 tvOneDetectString += "L: ";
tobyspark 45:cf8c2400be5c 419 tvOneDetectString += left;
tobyspark 45:cf8c2400be5c 420 tvOneDetectString += " R: ";
tobyspark 45:cf8c2400be5c 421 tvOneDetectString += right;
tobyspark 30:873979018850 422 }
tobyspark 49:16309f39cead 423
tobyspark 62:523de36d2f88 424 tvOneStatusMessage.addMessage(tvOneDetectString);
tobyspark 34:69dfe64e7e6b 425
tobyspark 34:69dfe64e7e6b 426 // Assign appropriate source depending on whether DVI input is good
tobyspark 34:69dfe64e7e6b 427 // If that assign command completes ok, and the DVI input is good, finally flag the unit has had a live source
tobyspark 34:69dfe64e7e6b 428 // Note any further losses on this input will be handled by the unit holding the last frame, so we don't need to switch back to SIS.
tobyspark 34:69dfe64e7e6b 429 if (ok && !tvOneRGB1Stable)
tobyspark 30:873979018850 430 {
tobyspark 34:69dfe64e7e6b 431 if (RGB1 && (sourceB != kTV1SourceRGB1)) ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB1);
tobyspark 34:69dfe64e7e6b 432 if (!RGB1 && (sourceB != kTV1SourceSIS2)) ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceSIS2); // Wierd: Can't set to SIS1 sometimes.
tobyspark 34:69dfe64e7e6b 433 if (ok && RGB1) tvOneRGB1Stable = true;
tobyspark 30:873979018850 434 }
tobyspark 34:69dfe64e7e6b 435 if (ok && !tvOneRGB2Stable)
tobyspark 34:69dfe64e7e6b 436 {
tobyspark 34:69dfe64e7e6b 437 if (RGB2 && (sourceA != kTV1SourceRGB2)) ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB2);
tobyspark 34:69dfe64e7e6b 438 if (!RGB2 && (sourceA != kTV1SourceSIS2)) ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceSIS2);
tobyspark 34:69dfe64e7e6b 439 if (ok && RGB2) tvOneRGB2Stable = true;
tobyspark 34:69dfe64e7e6b 440 }
tobyspark 48:c0fedfa8c525 441
tobyspark 49:16309f39cead 442 // It seems there is an occasional RS232 choke around power-on of the processor.
tobyspark 49:16309f39cead 443 // Hard to reproduce, doubly so when in debug mode, this may fix.
tobyspark 49:16309f39cead 444 if (ok)
tobyspark 49:16309f39cead 445 {
tobyspark 49:16309f39cead 446 notOKCounter = 0;
tobyspark 49:16309f39cead 447 tvOne.resetCommandPeriods();
tobyspark 49:16309f39cead 448 }
tobyspark 51:98cc27390484 449 else
tobyspark 49:16309f39cead 450 {
tobyspark 51:98cc27390484 451 notOKCounter++;
tobyspark 51:98cc27390484 452 if (notOKCounter == 5)
tobyspark 51:98cc27390484 453 {
tobyspark 51:98cc27390484 454 tvOne.increaseCommandPeriods(200);
tobyspark 51:98cc27390484 455 }
tobyspark 51:98cc27390484 456 if (notOKCounter == 6)
tobyspark 51:98cc27390484 457 {
tobyspark 51:98cc27390484 458 tvOne.resetCommandPeriods();
tobyspark 51:98cc27390484 459 }
tobyspark 51:98cc27390484 460 if (notOKCounter % 15 == 0)
tobyspark 51:98cc27390484 461 {
tobyspark 51:98cc27390484 462 tvOneStatusMessage.addMessage("TVOne: Resetting link", 2.0f);
tobyspark 51:98cc27390484 463 screen.textToBuffer(tvOneStatusMessage.message(), kTVOneStatusLine);
tobyspark 51:98cc27390484 464 screen.sendBuffer();
tobyspark 51:98cc27390484 465
tobyspark 52:98f557fe93a3 466 tvOne.increaseCommandPeriods(1500);
tobyspark 51:98cc27390484 467 }
tobyspark 51:98cc27390484 468 if (notOKCounter % 15 == 1)
tobyspark 51:98cc27390484 469 {
tobyspark 51:98cc27390484 470 tvOne.resetCommandPeriods();
tobyspark 51:98cc27390484 471 }
tobyspark 49:16309f39cead 472 }
tobyspark 49:16309f39cead 473
tobyspark 51:98cc27390484 474 return ok;
tobyspark 30:873979018850 475 }
tobyspark 30:873979018850 476
tobyspark 24:49c6624119ae 477 void actionMixMode()
tobyspark 24:49c6624119ae 478 {
tobyspark 31:01845a2347ff 479 if (debug) debug->printf("Changing mix mode \r\n");
tobyspark 31:01845a2347ff 480
tobyspark 24:49c6624119ae 481 bool ok = true;
tobyspark 25:3b519ef70341 482 string sentOK;
tobyspark 26:0299f8760715 483 char sentMSGBuffer[kStringBufferLength];
tobyspark 24:49c6624119ae 484
tobyspark 24:49c6624119ae 485 // Set Keyer
tobyspark 61:f0a42bfca816 486 if (mixMode != mixKey)
tobyspark 24:49c6624119ae 487 {
tobyspark 31:01845a2347ff 488 // Set Keyer Off. Quicker to set and fail than to test for on and then turn off
tobyspark 35:d5d9f0838f99 489 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
tobyspark 31:01845a2347ff 490
tobyspark 31:01845a2347ff 491 if (mixMode == mixBlend)
tobyspark 24:49c6624119ae 492 {
tobyspark 31:01845a2347ff 493 // Turn off Additive Mixing on output
tobyspark 52:98f557fe93a3 494 if (tvOne.getProcessorType().version == 423)
tobyspark 52:98f557fe93a3 495 {
tobyspark 52:98f557fe93a3 496 ok = tvOne.command(0, kTV1WindowIDA, 0x298, 0);
tobyspark 52:98f557fe93a3 497 }
tobyspark 31:01845a2347ff 498 snprintf(sentMSGBuffer, kStringBufferLength, "Blend");
tobyspark 24:49c6624119ae 499 }
tobyspark 31:01845a2347ff 500 if (mixMode == mixAdditive)
tobyspark 31:01845a2347ff 501 {
tobyspark 31:01845a2347ff 502 // 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 503 ok = tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 31:01845a2347ff 504 // Then turn on Additive Mixing
tobyspark 52:98f557fe93a3 505 if (tvOne.getProcessorType().version == 423)
tobyspark 52:98f557fe93a3 506 {
tobyspark 52:98f557fe93a3 507 ok = ok && tvOne.command(0, kTV1WindowIDA, 0x298, 1);
tobyspark 52:98f557fe93a3 508 }
tobyspark 31:01845a2347ff 509 snprintf(sentMSGBuffer, kStringBufferLength, "Additive");
tobyspark 31:01845a2347ff 510 }
tobyspark 24:49c6624119ae 511 }
tobyspark 24:49c6624119ae 512 else
tobyspark 24:49c6624119ae 513 {
tobyspark 49:16309f39cead 514 // Turn off Additive Mixing on output
tobyspark 52:98f557fe93a3 515 if (tvOne.getProcessorType().version == 423)
tobyspark 52:98f557fe93a3 516 {
tobyspark 52:98f557fe93a3 517 ok = tvOne.command(0, kTV1WindowIDA, 0x298, 0);
tobyspark 52:98f557fe93a3 518 }
tobyspark 49:16309f39cead 519 // Turn on Keyer
tobyspark 24:49c6624119ae 520 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
tobyspark 49:16309f39cead 521
tobyspark 61:f0a42bfca816 522 snprintf(sentMSGBuffer, kStringBufferLength, "Key L over R");
tobyspark 24:49c6624119ae 523 }
tobyspark 49:16309f39cead 524
tobyspark 49:16309f39cead 525 mixModeOld = mixMode;
tobyspark 24:49c6624119ae 526
tobyspark 24:49c6624119ae 527 if (ok) sentOK = "Sent:";
tobyspark 24:49c6624119ae 528 else sentOK = "Send Error:";
tobyspark 24:49c6624119ae 529
tobyspark 48:c0fedfa8c525 530 tvOneStatusMessage.addMessage(sentOK + sentMSGBuffer, kTVOneStatusMessageHoldTime);
tobyspark 24:49c6624119ae 531 }
tobyspark 24:49c6624119ae 532
tobyspark 49:16309f39cead 533 bool checkTVOneMixStatus()
tobyspark 49:16309f39cead 534 {
tobyspark 49:16309f39cead 535 bool ok = true;
tobyspark 49:16309f39cead 536
tobyspark 49:16309f39cead 537 int32_t payload;
tobyspark 49:16309f39cead 538
tobyspark 49:16309f39cead 539 // Mix Mode
tobyspark 49:16309f39cead 540 bool mixModeNeedsAction = false;
tobyspark 49:16309f39cead 541 bool additiveOn = false, keyerOn = false;
tobyspark 49:16309f39cead 542
tobyspark 49:16309f39cead 543 if (mixMode == mixBlend) { additiveOn = false; keyerOn = false;}
tobyspark 49:16309f39cead 544 if (mixMode == mixAdditive) { additiveOn = true; keyerOn = false;}
tobyspark 49:16309f39cead 545 if (mixMode >= mixKey) { additiveOn = false; keyerOn = true; }
tobyspark 49:16309f39cead 546
tobyspark 52:98f557fe93a3 547 if (tvOne.getProcessorType().version == 423)
tobyspark 52:98f557fe93a3 548 {
tobyspark 52:98f557fe93a3 549 payload = -1;
tobyspark 52:98f557fe93a3 550 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, 0x298, payload);
tobyspark 52:98f557fe93a3 551 if (payload != additiveOn) mixModeNeedsAction = true;
tobyspark 52:98f557fe93a3 552 }
tobyspark 52:98f557fe93a3 553
tobyspark 49:16309f39cead 554 payload = -1;
tobyspark 49:16309f39cead 555 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, payload);
tobyspark 49:16309f39cead 556 if (payload != keyerOn) mixModeNeedsAction = true;
tobyspark 49:16309f39cead 557
tobyspark 49:16309f39cead 558 if (ok && mixModeNeedsAction)
tobyspark 49:16309f39cead 559 {
tobyspark 49:16309f39cead 560 if (debug) debug->printf("Check TVOne Mix Status requiring mixMode action. mixMode: %i \r\n", mixMode);
tobyspark 49:16309f39cead 561 actionMixMode();
tobyspark 49:16309f39cead 562 }
tobyspark 49:16309f39cead 563
tobyspark 49:16309f39cead 564 // Check Fade
tobyspark 49:16309f39cead 565 payload = -1;
tobyspark 49:16309f39cead 566 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, payload);
tobyspark 49:16309f39cead 567 if (ok && (payload != fadeAPercent))
tobyspark 49:16309f39cead 568 {
tobyspark 49:16309f39cead 569 if (debug) debug->printf("Check TVOne Mix Status requiring fadeA action");
tobyspark 49:16309f39cead 570 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 49:16309f39cead 571 }
tobyspark 49:16309f39cead 572
tobyspark 49:16309f39cead 573 payload = -1;
tobyspark 49:16309f39cead 574 ok = ok && tvOne.readCommand(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, payload);
tobyspark 49:16309f39cead 575 if (ok && (payload != fadeBPercent))
tobyspark 49:16309f39cead 576 {
tobyspark 49:16309f39cead 577 if (debug) debug->printf("Check TVOne Mix Status requiring fadeB action");
tobyspark 49:16309f39cead 578 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 49:16309f39cead 579 }
tobyspark 49:16309f39cead 580
tobyspark 49:16309f39cead 581 return ok;
tobyspark 49:16309f39cead 582 }
tobyspark 24:49c6624119ae 583
tobyspark 17:fc68d40b8b1f 584 bool conformProcessor()
tobyspark 17:fc68d40b8b1f 585 {
tobyspark 44:723e65413ebe 586 bool ok;
tobyspark 17:fc68d40b8b1f 587
tobyspark 17:fc68d40b8b1f 588 int32_t on = 1;
tobyspark 17:fc68d40b8b1f 589 int32_t off = 0;
tobyspark 17:fc68d40b8b1f 590
tobyspark 44:723e65413ebe 591 for (int i=0; i < 3; i++)
tobyspark 44:723e65413ebe 592 {
tobyspark 44:723e65413ebe 593 // Independent output
tobyspark 44:723e65413ebe 594 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionMode, 2);
tobyspark 44:723e65413ebe 595 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputEnable, on);
tobyspark 44:723e65413ebe 596 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsLockMethod, off);
tobyspark 44:723e65413ebe 597
tobyspark 44:723e65413ebe 598 // Make sure our windows exist
tobyspark 44:723e65413ebe 599 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsEnable, on);
tobyspark 44:723e65413ebe 600 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsEnable, on);
tobyspark 44:723e65413ebe 601 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsLayerPriority, 0);
tobyspark 44:723e65413ebe 602 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsLayerPriority, 1);
tobyspark 44:723e65413ebe 603
tobyspark 44:723e65413ebe 604 // Assign inputs to windows, so that left on the crossfader is left on the processor viewed from front
tobyspark 44:723e65413ebe 605 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB2);
tobyspark 44:723e65413ebe 606 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB1);
tobyspark 44:723e65413ebe 607
tobyspark 44:723e65413ebe 608 // Set scaling to fit source within output, maintaining aspect ratio
tobyspark 44:723e65413ebe 609 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsZoomLevel, 100);
tobyspark 44:723e65413ebe 610 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsZoomLevel, 100);
tobyspark 44:723e65413ebe 611 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsShrinkEnable, off);
tobyspark 44:723e65413ebe 612 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsShrinkEnable, off);
tobyspark 60:13bc754cb76f 613 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, SPKTVOne::aspectFit);
tobyspark 60:13bc754cb76f 614 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, SPKTVOne::aspectFit);
tobyspark 56:d6f77bd54e10 615 ok = ok && tvOne.command(kTV1SourceSIS1, kTV1WindowIDA, kTV1FunctionAdjustSourceTestCard, 1);
tobyspark 60:13bc754cb76f 616 ok = ok && tvOne.command(kTV1SourceSIS1, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, SPKTVOne::aspect1to1);
tobyspark 44:723e65413ebe 617 ok = ok && tvOne.command(kTV1SourceSIS2, kTV1WindowIDA, kTV1FunctionAdjustSourceTestCard, 1);
tobyspark 60:13bc754cb76f 618 ok = ok && tvOne.command(kTV1SourceSIS2, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, SPKTVOne::aspect1to1);
tobyspark 44:723e65413ebe 619
tobyspark 44:723e65413ebe 620 // On source loss, hold on the last frame received.
tobyspark 44:723e65413ebe 621 int32_t freeze = 1;
tobyspark 44:723e65413ebe 622 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceOnSourceLoss, freeze);
tobyspark 44:723e65413ebe 623 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceOnSourceLoss, freeze);
tobyspark 44:723e65413ebe 624
tobyspark 44:723e65413ebe 625 // Set resolution and fade levels for maximum chance of being seen
tobyspark 56:d6f77bd54e10 626 ok = ok && tvOne.setResolution(kTV1ResolutionVGA, 5);
tobyspark 48:c0fedfa8c525 627 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, 50);
tobyspark 44:723e65413ebe 628 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, 100);
tobyspark 44:723e65413ebe 629
tobyspark 44:723e65413ebe 630 // Set evil, evil HDCP off
tobyspark 44:723e65413ebe 631 ok = ok && tvOne.setHDCPOn(false);
tobyspark 30:873979018850 632
tobyspark 44:723e65413ebe 633 if (ok) break;
tobyspark 44:723e65413ebe 634 else tvOne.increaseCommandPeriods(500);
tobyspark 44:723e65413ebe 635 }
tobyspark 40:bfddeb2a7fcf 636
tobyspark 44:723e65413ebe 637 if (ok)
tobyspark 44:723e65413ebe 638 {
tobyspark 44:723e65413ebe 639 // Save current state in preset one
tobyspark 44:723e65413ebe 640 tvOne.command(0, kTV1WindowIDA, kTV1FunctionPreset, 1); // Set Preset 1
tobyspark 44:723e65413ebe 641 tvOne.command(0, kTV1WindowIDA, kTV1FunctionPresetStore, 1); // Store
tobyspark 44:723e65413ebe 642
tobyspark 44:723e65413ebe 643 // Save current state for power on
tobyspark 44:723e65413ebe 644 tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 44:723e65413ebe 645 }
tobyspark 41:00d1cd3b2af2 646
tobyspark 44:723e65413ebe 647 tvOne.resetCommandPeriods();
tobyspark 41:00d1cd3b2af2 648
tobyspark 41:00d1cd3b2af2 649 return ok;
tobyspark 41:00d1cd3b2af2 650 }
tobyspark 41:00d1cd3b2af2 651
tobyspark 41:00d1cd3b2af2 652 bool uploadToProcessor()
tobyspark 41:00d1cd3b2af2 653 {
tobyspark 41:00d1cd3b2af2 654 bool ok = true;
tobyspark 41:00d1cd3b2af2 655
tobyspark 41:00d1cd3b2af2 656 LocalFileSystem local("local");
tobyspark 41:00d1cd3b2af2 657 FILE *file;
tobyspark 41:00d1cd3b2af2 658
tobyspark 34:69dfe64e7e6b 659 // Upload Matrox EDID to mem4 (ie. index 3). Use this EDID slot when setting Matrox resolutions.
tobyspark 44:723e65413ebe 660 if (tvOne.getProcessorType().version < 415)
tobyspark 44:723e65413ebe 661 {
tobyspark 44:723e65413ebe 662 if (debug) debug->printf("Skipping EDID upload as unsupported on detected TV One firmware\r\n");
tobyspark 44:723e65413ebe 663 }
tobyspark 44:723e65413ebe 664 else
tobyspark 34:69dfe64e7e6b 665 {
tobyspark 41:00d1cd3b2af2 666 file = fopen("/local/matroxe.did", "r"); // 8.3, avoid .bin as mbed executable extension
tobyspark 35:d5d9f0838f99 667 if (file)
tobyspark 34:69dfe64e7e6b 668 {
tobyspark 41:00d1cd3b2af2 669 ok = ok && tvOne.uploadEDID(file, 3);
tobyspark 35:d5d9f0838f99 670 fclose(file);
tobyspark 34:69dfe64e7e6b 671 }
tobyspark 35:d5d9f0838f99 672 else
tobyspark 35:d5d9f0838f99 673 {
tobyspark 44:723e65413ebe 674 if (debug) debug->printf("Could not open Matrox EDID file 'matroxe.did'\r\n");
tobyspark 35:d5d9f0838f99 675 }
tobyspark 34:69dfe64e7e6b 676 }
tobyspark 41:00d1cd3b2af2 677
tobyspark 41:00d1cd3b2af2 678 // Upload Logo to SIS2. Use this (minimal) image when no sources are connected.
tobyspark 41:00d1cd3b2af2 679 {
tobyspark 41:00d1cd3b2af2 680 file = fopen("/local/spark.dat", "r"); // 8.3, avoid .bin as mbed executable extension
tobyspark 41:00d1cd3b2af2 681 if (file)
tobyspark 41:00d1cd3b2af2 682 {
tobyspark 52:98f557fe93a3 683 ok = ok && tvOne.uploadImage(file, 0);
tobyspark 41:00d1cd3b2af2 684 fclose(file);
tobyspark 41:00d1cd3b2af2 685 }
tobyspark 41:00d1cd3b2af2 686 else
tobyspark 41:00d1cd3b2af2 687 {
tobyspark 41:00d1cd3b2af2 688 if (debug) debug->printf("Could not open image file 'spark.dat'");
tobyspark 41:00d1cd3b2af2 689 }
tobyspark 41:00d1cd3b2af2 690 }
tobyspark 17:fc68d40b8b1f 691
tobyspark 17:fc68d40b8b1f 692 return ok;
tobyspark 17:fc68d40b8b1f 693 }
tobyspark 17:fc68d40b8b1f 694
tobyspark 27:27851d3d2bba 695 void setResolutionMenuItems()
tobyspark 27:27851d3d2bba 696 {
tobyspark 27:27851d3d2bba 697 resolutionMenu.clearMenuItems();
tobyspark 27:27851d3d2bba 698 for (int i=0; i < settings.resolutionsCount(); i++)
tobyspark 27:27851d3d2bba 699 {
tobyspark 27:27851d3d2bba 700 resolutionMenu.addMenuItem(SPKMenuItem(settings.resolutionName(i), settings.resolutionIndex(i), settings.resolutionEDIDIndex(i)));
tobyspark 27:27851d3d2bba 701 }
tobyspark 27:27851d3d2bba 702 resolutionMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 27:27851d3d2bba 703 }
tobyspark 27:27851d3d2bba 704
tobyspark 27:27851d3d2bba 705 void setMixModeMenuItems()
tobyspark 27:27851d3d2bba 706 {
tobyspark 27:27851d3d2bba 707 mixModeMenu.clearMenuItems();
tobyspark 44:723e65413ebe 708
tobyspark 46:491229c97336 709 if (tvOne.getProcessorType().version == 423 || tvOne.getProcessorType().version == -1)
tobyspark 44:723e65413ebe 710 {
tobyspark 61:f0a42bfca816 711 mixModeAdditiveMenu.title = "Crossfade";
tobyspark 61:f0a42bfca816 712 mixModeMenu.addMenuItem(SPKMenuItem(mixModeAdditiveMenu.title, &mixModeAdditiveMenu));
tobyspark 44:723e65413ebe 713 }
tobyspark 44:723e65413ebe 714 else
tobyspark 44:723e65413ebe 715 {
tobyspark 44:723e65413ebe 716 mixModeMenu.addMenuItem(SPKMenuItem("Blend", mixBlend));
tobyspark 44:723e65413ebe 717 }
tobyspark 44:723e65413ebe 718
tobyspark 61:f0a42bfca816 719 mixModeMenu.addMenuItem(SPKMenuItem("Key: L over R", mixKey));
tobyspark 61:f0a42bfca816 720 mixModeMenu.addMenuItem(SPKMenuItem("Key: Tweak key values", &mixModeUpdateKeyMenu));
tobyspark 61:f0a42bfca816 721
tobyspark 61:f0a42bfca816 722 // Load in presets from settings. Index 0 is the "live" key read from TVOne, so we ignore here.
tobyspark 61:f0a42bfca816 723 if (settings.keyerSetCount() > 1)
tobyspark 61:f0a42bfca816 724 for (int i=1; i < settings.keyerSetCount(); i++)
tobyspark 61:f0a42bfca816 725 {
tobyspark 61:f0a42bfca816 726 mixModeMenu.addMenuItem(SPKMenuItem("Key Preset: " + settings.keyerParamName(i), mixKey + i));
tobyspark 61:f0a42bfca816 727 }
tobyspark 61:f0a42bfca816 728
tobyspark 27:27851d3d2bba 729 mixModeMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 27:27851d3d2bba 730 }
tobyspark 27:27851d3d2bba 731
tobyspark 27:27851d3d2bba 732 void setCommsMenuItems()
tobyspark 27:27851d3d2bba 733 {
tobyspark 27:27851d3d2bba 734 if (rj45Mode == rj45Ethernet)
tobyspark 27:27851d3d2bba 735 {
tobyspark 27:27851d3d2bba 736 commsMenu.title = "Network Mode [Ethernet]";
tobyspark 27:27851d3d2bba 737 commsMenu.clearMenuItems();
tobyspark 67:6ce9fb62b17c 738 switch (commsMode) // Cannot switch between OSC and Artnet once one is selected (crash in EthernetIf deconstructor?), so this.
tobyspark 67:6ce9fb62b17c 739 {
tobyspark 67:6ce9fb62b17c 740 case commsNone:
tobyspark 67:6ce9fb62b17c 741 commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
tobyspark 67:6ce9fb62b17c 742 commsMenu.addMenuItem(SPKMenuItem("OSC", commsOSC));
tobyspark 67:6ce9fb62b17c 743 commsMenu.addMenuItem(SPKMenuItem("ArtNet", commsArtNet));
tobyspark 67:6ce9fb62b17c 744 break;
tobyspark 67:6ce9fb62b17c 745 case commsOSC:
tobyspark 67:6ce9fb62b17c 746 commsMenu.addMenuItem(SPKMenuItem("OSC", commsOSC));
tobyspark 67:6ce9fb62b17c 747 break;
tobyspark 67:6ce9fb62b17c 748 case commsArtNet:
tobyspark 67:6ce9fb62b17c 749 commsMenu.addMenuItem(SPKMenuItem("ArtNet", commsArtNet));
tobyspark 67:6ce9fb62b17c 750 break;
tobyspark 67:6ce9fb62b17c 751 }
tobyspark 27:27851d3d2bba 752 commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 33:e6672a9bd571 753 commsMenu = 0;
tobyspark 27:27851d3d2bba 754 }
tobyspark 27:27851d3d2bba 755 else if (rj45Mode == rj45DMX)
tobyspark 27:27851d3d2bba 756 {
tobyspark 27:27851d3d2bba 757 commsMenu.title = "Network Mode [DMX]";
tobyspark 27:27851d3d2bba 758 commsMenu.clearMenuItems();
tobyspark 27:27851d3d2bba 759 commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
tobyspark 27:27851d3d2bba 760 commsMenu.addMenuItem(SPKMenuItem("DMX In", commsDMXIn));
tobyspark 27:27851d3d2bba 761 commsMenu.addMenuItem(SPKMenuItem("DMX Out", commsDMXOut));
tobyspark 27:27851d3d2bba 762 commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 33:e6672a9bd571 763 commsMenu = 0;
tobyspark 27:27851d3d2bba 764 }
tobyspark 27:27851d3d2bba 765 }
tobyspark 27:27851d3d2bba 766
tobyspark 49:16309f39cead 767 void mixModeAdditiveMenuHandler(int change, bool action)
tobyspark 49:16309f39cead 768 {
tobyspark 49:16309f39cead 769 fadeCurve += change * 0.05f;
tobyspark 49:16309f39cead 770 if (fadeCurve > 1.0f) fadeCurve = 1.0f;
tobyspark 49:16309f39cead 771 if (fadeCurve < 0.0f) fadeCurve = 0.0f;
tobyspark 49:16309f39cead 772
tobyspark 49:16309f39cead 773 mixMode = (fadeCurve > 0.001f) ? mixAdditive: mixBlend;
tobyspark 49:16309f39cead 774
tobyspark 49:16309f39cead 775 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 776 screen.textToBuffer("Blend [ ----- ] Add", kMenuLine2);
tobyspark 49:16309f39cead 777 screen.characterToBuffer('X', 38 + fadeCurve*20.0f, kMenuLine2);
tobyspark 49:16309f39cead 778
tobyspark 49:16309f39cead 779 if (debug) debug->printf("Fade curve changed by %i to %f \r\n", change, fadeCurve);
tobyspark 49:16309f39cead 780
tobyspark 49:16309f39cead 781 if (action)
tobyspark 49:16309f39cead 782 {
tobyspark 49:16309f39cead 783 selectedMenu = &mixModeMenu;
tobyspark 49:16309f39cead 784
tobyspark 49:16309f39cead 785 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 786 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 787 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 49:16309f39cead 788 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 49:16309f39cead 789 }
tobyspark 49:16309f39cead 790 }
tobyspark 49:16309f39cead 791
tobyspark 51:98cc27390484 792 void troubleshootingMenuHDCPHandler(int change, bool action)
tobyspark 49:16309f39cead 793 {
tobyspark 49:16309f39cead 794 static int currentHDCP;
tobyspark 53:0993424e1529 795 static int state = 0;
tobyspark 49:16309f39cead 796
tobyspark 49:16309f39cead 797 if (change == 0 && !action)
tobyspark 49:16309f39cead 798 {
tobyspark 49:16309f39cead 799 // We check the control not the status, as status depends on connection etc.
tobyspark 49:16309f39cead 800
tobyspark 49:16309f39cead 801 int32_t payloadOutput = -1;
tobyspark 49:16309f39cead 802 tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsHDCPRequired, payloadOutput);
tobyspark 49:16309f39cead 803
tobyspark 49:16309f39cead 804 int32_t payload1 = -1;
tobyspark 49:16309f39cead 805 tvOne.readCommand(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceHDCPAdvertize, payload1);
tobyspark 49:16309f39cead 806
tobyspark 49:16309f39cead 807 int32_t payload2 = -1;
tobyspark 49:16309f39cead 808 tvOne.readCommand(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceHDCPAdvertize, payload2);
tobyspark 49:16309f39cead 809
tobyspark 49:16309f39cead 810 if ((payloadOutput == payload1) && (payload1 == payload2) && (payload2 == 0))
tobyspark 49:16309f39cead 811 {
tobyspark 49:16309f39cead 812 currentHDCP = 0; // Change to on
tobyspark 49:16309f39cead 813 }
tobyspark 49:16309f39cead 814 else if ((payloadOutput == payload1) && (payload1 == payload2) && (payload2 == 1))
tobyspark 49:16309f39cead 815 {
tobyspark 49:16309f39cead 816 currentHDCP = 1; // Change to off
tobyspark 49:16309f39cead 817 }
tobyspark 49:16309f39cead 818 else
tobyspark 49:16309f39cead 819 {
tobyspark 49:16309f39cead 820 currentHDCP = -1; // Change to off
tobyspark 49:16309f39cead 821 }
tobyspark 49:16309f39cead 822
tobyspark 49:16309f39cead 823 if (debug) debug->printf("HDCP detected O: %i 1: %i 2: %i", payloadOutput, payload1, payload2);
tobyspark 49:16309f39cead 824 }
tobyspark 49:16309f39cead 825
tobyspark 49:16309f39cead 826 state += change;
tobyspark 53:0993424e1529 827 if (state > 1) state = 1;
tobyspark 53:0993424e1529 828 if (state < 0) state = 0;
tobyspark 49:16309f39cead 829
tobyspark 49:16309f39cead 830 char paramLine[kStringBufferLength];
tobyspark 49:16309f39cead 831 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 832
tobyspark 49:16309f39cead 833 const char* current = currentHDCP == -1 ? "Mixed" : ( currentHDCP == 1 ? "On" : "Off");
tobyspark 49:16309f39cead 834
tobyspark 53:0993424e1529 835 if (state == 0) snprintf(paramLine, kStringBufferLength, "%s. Set: [%s/ ]?", current, currentHDCP == 0 ? "On " : "Off" );
tobyspark 49:16309f39cead 836 else snprintf(paramLine, kStringBufferLength, "%s. Set: [ /Cancel]?", current);
tobyspark 49:16309f39cead 837 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 49:16309f39cead 838
tobyspark 49:16309f39cead 839 if (action)
tobyspark 49:16309f39cead 840 {
tobyspark 53:0993424e1529 841 if (state == 0)
tobyspark 49:16309f39cead 842 {
tobyspark 49:16309f39cead 843 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 49:16309f39cead 844 screen.textToBuffer("Setting HDCP...", kTVOneStatusLine);
tobyspark 49:16309f39cead 845 screen.sendBuffer();
tobyspark 49:16309f39cead 846
tobyspark 49:16309f39cead 847 // Do the action
tobyspark 49:16309f39cead 848 bool ok = tvOne.setHDCPOn(currentHDCP == 0);
tobyspark 49:16309f39cead 849
tobyspark 49:16309f39cead 850 if (ok) tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 49:16309f39cead 851
tobyspark 49:16309f39cead 852 std::string sendOK = ok ? "Sent: HDCP " : "Send Error: HDCP ";
tobyspark 49:16309f39cead 853 sendOK += currentHDCP == 0 ? "On" : "Off";
tobyspark 49:16309f39cead 854
tobyspark 49:16309f39cead 855 tvOneStatusMessage.addMessage(sendOK, kTVOneStatusMessageHoldTime);
tobyspark 49:16309f39cead 856 }
tobyspark 49:16309f39cead 857
tobyspark 49:16309f39cead 858 // Get back to menu
tobyspark 51:98cc27390484 859 selectedMenu = &troubleshootingMenu;
tobyspark 49:16309f39cead 860
tobyspark 49:16309f39cead 861 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 862 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 863 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 49:16309f39cead 864 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 49:16309f39cead 865 }
tobyspark 49:16309f39cead 866 }
tobyspark 49:16309f39cead 867
tobyspark 51:98cc27390484 868 void troubleshootingMenuEDIDHandler(int change, bool action)
tobyspark 49:16309f39cead 869 {
tobyspark 49:16309f39cead 870 static int currentEDIDPassthrough;
tobyspark 57:14d37904c889 871 static int currentEDID;
tobyspark 53:0993424e1529 872 static int state = 0;
tobyspark 57:14d37904c889 873
tobyspark 49:16309f39cead 874 if (change == 0 && !action)
tobyspark 49:16309f39cead 875 {
tobyspark 57:14d37904c889 876 currentEDID = tvOne.getEDID();
tobyspark 49:16309f39cead 877
tobyspark 57:14d37904c889 878 if (currentEDID == -1) currentEDIDPassthrough = -1;
tobyspark 57:14d37904c889 879 else currentEDIDPassthrough = (currentEDID == EDIDPassthroughSlot) ? 1 : 0;
tobyspark 49:16309f39cead 880 }
tobyspark 49:16309f39cead 881
tobyspark 49:16309f39cead 882 state += change;
tobyspark 53:0993424e1529 883 if (state > 1) state = 1;
tobyspark 53:0993424e1529 884 if (state < 0) state = 0;
tobyspark 49:16309f39cead 885
tobyspark 49:16309f39cead 886 char paramLine[kStringBufferLength];
tobyspark 49:16309f39cead 887 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 888
tobyspark 51:98cc27390484 889 const char* current = currentEDIDPassthrough == -1 ? "Mixed" : ( currentEDIDPassthrough == 1 ? "Thru" : "Internal");
tobyspark 49:16309f39cead 890
tobyspark 53:0993424e1529 891 if (state == 0) snprintf(paramLine, kStringBufferLength, "%s. Set: [%s/ ]?", current, currentEDIDPassthrough == 0 ? "Thru" : "Int");
tobyspark 49:16309f39cead 892 else snprintf(paramLine, kStringBufferLength, "%s. Set: [ /Cancel]?", current);
tobyspark 49:16309f39cead 893 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 49:16309f39cead 894
tobyspark 49:16309f39cead 895 if (action)
tobyspark 49:16309f39cead 896 {
tobyspark 53:0993424e1529 897 if (state == 0)
tobyspark 49:16309f39cead 898 {
tobyspark 49:16309f39cead 899 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 49:16309f39cead 900 screen.textToBuffer("Setting EDID...", kTVOneStatusLine);
tobyspark 49:16309f39cead 901 screen.sendBuffer();
tobyspark 49:16309f39cead 902
tobyspark 49:16309f39cead 903 // Do the action
tobyspark 49:16309f39cead 904 tvOneEDIDPassthrough = currentEDIDPassthrough == 0;
tobyspark 49:16309f39cead 905
tobyspark 49:16309f39cead 906 bool ok = true;
tobyspark 57:14d37904c889 907 std::string message;
tobyspark 49:16309f39cead 908
tobyspark 57:14d37904c889 909 int newEDID = tvOneEDIDPassthrough ? EDIDPassthroughSlot : resolutionMenu.selectedItem().payload.command[1];
tobyspark 57:14d37904c889 910
tobyspark 57:14d37904c889 911 if (newEDID != currentEDID)
tobyspark 57:14d37904c889 912 {
tobyspark 57:14d37904c889 913 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, newEDID);
tobyspark 57:14d37904c889 914 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, newEDID);
tobyspark 57:14d37904c889 915 if (ok) message = "Sent: EDID";
tobyspark 57:14d37904c889 916 else message = "Send Error: EDID";
tobyspark 57:14d37904c889 917 }
tobyspark 57:14d37904c889 918 else message = "EDID already set";
tobyspark 49:16309f39cead 919
tobyspark 49:16309f39cead 920 if (ok) tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 49:16309f39cead 921
tobyspark 57:14d37904c889 922 tvOneStatusMessage.addMessage(message, kTVOneStatusMessageHoldTime);
tobyspark 49:16309f39cead 923
tobyspark 57:14d37904c889 924 // This is WHACK. Can't believe it's both needed and officially in the 1T-C2-750 manual
tobyspark 57:14d37904c889 925 if ((newEDID != currentEDID) && ok) tvOneStatusMessage.addMessage("EDID: Processor Off+On?", kTVOneStatusMessageHoldTime);
tobyspark 49:16309f39cead 926 }
tobyspark 49:16309f39cead 927
tobyspark 49:16309f39cead 928 // Get back to menu
tobyspark 51:98cc27390484 929 selectedMenu = &troubleshootingMenu;
tobyspark 49:16309f39cead 930
tobyspark 49:16309f39cead 931 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 932 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 933 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 49:16309f39cead 934 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 49:16309f39cead 935 }
tobyspark 49:16309f39cead 936 }
tobyspark 49:16309f39cead 937
tobyspark 55:35a295d36d23 938 void troubleshootingMenuAspectHandler(int change, bool action)
tobyspark 55:35a295d36d23 939 {
tobyspark 55:35a295d36d23 940 static int state = 0;
tobyspark 55:35a295d36d23 941
tobyspark 55:35a295d36d23 942 if (change == 0 && !action)
tobyspark 55:35a295d36d23 943 {
tobyspark 60:13bc754cb76f 944 switch (tvOne.getAspect())
tobyspark 55:35a295d36d23 945 {
tobyspark 60:13bc754cb76f 946 case SPKTVOne::aspectFit : state = 0; break;
tobyspark 60:13bc754cb76f 947 case SPKTVOne::aspectHFill : state = 1; break;
tobyspark 60:13bc754cb76f 948 case SPKTVOne::aspectVFill : state = 1; break;
tobyspark 60:13bc754cb76f 949 case SPKTVOne::aspectSPKFill : state = 1; break;
tobyspark 60:13bc754cb76f 950 case SPKTVOne::aspect1to1 : state = 2; break;
tobyspark 55:35a295d36d23 951 }
tobyspark 55:35a295d36d23 952 }
tobyspark 55:35a295d36d23 953
tobyspark 55:35a295d36d23 954 state += change;
tobyspark 55:35a295d36d23 955 if (state > 3) state = 3;
tobyspark 55:35a295d36d23 956 if (state < 0) state = 0;
tobyspark 55:35a295d36d23 957
tobyspark 55:35a295d36d23 958 screen.clearBufferRow(kMenuLine2);
tobyspark 55:35a295d36d23 959 switch (state)
tobyspark 55:35a295d36d23 960 {
tobyspark 55:35a295d36d23 961 case 0: screen.textToBuffer("Set: [Fit/ / / ]", kMenuLine2); break;
tobyspark 55:35a295d36d23 962 case 1: screen.textToBuffer("Set: [ /Fill/ / ]", kMenuLine2); break;
tobyspark 55:35a295d36d23 963 case 2: screen.textToBuffer("Set: [ / /1:1/ ]", kMenuLine2); break;
tobyspark 55:35a295d36d23 964 case 3: screen.textToBuffer("Set: [ / / /Cancel]", kMenuLine2); break;
tobyspark 55:35a295d36d23 965 }
tobyspark 55:35a295d36d23 966
tobyspark 55:35a295d36d23 967 if (action)
tobyspark 55:35a295d36d23 968 {
tobyspark 55:35a295d36d23 969 if (state != 3)
tobyspark 55:35a295d36d23 970 {
tobyspark 55:35a295d36d23 971 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 55:35a295d36d23 972 screen.textToBuffer("Setting Aspect...", kTVOneStatusLine);
tobyspark 55:35a295d36d23 973 screen.sendBuffer();
tobyspark 55:35a295d36d23 974
tobyspark 55:35a295d36d23 975 // Do the action
tobyspark 60:13bc754cb76f 976 bool ok = false;
tobyspark 55:35a295d36d23 977 switch (state)
tobyspark 55:35a295d36d23 978 {
tobyspark 60:13bc754cb76f 979 case 0: ok = tvOne.setAspect(SPKTVOne::aspectFit); break;
tobyspark 60:13bc754cb76f 980 case 1: ok = tvOne.setAspect(SPKTVOne::aspectSPKFill); break;
tobyspark 60:13bc754cb76f 981 case 2: ok = tvOne.setAspect(SPKTVOne::aspect1to1); break;
tobyspark 55:35a295d36d23 982 }
tobyspark 55:35a295d36d23 983 if (ok) tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 55:35a295d36d23 984
tobyspark 55:35a295d36d23 985 std::string sendOK = ok ? "Sent: " : "Send Error: ";
tobyspark 60:13bc754cb76f 986 switch (state)
tobyspark 55:35a295d36d23 987 {
tobyspark 60:13bc754cb76f 988 case 0: sendOK += "Aspect Fit "; break;
tobyspark 60:13bc754cb76f 989 case 1: sendOK += "Aspect Fill"; break;
tobyspark 60:13bc754cb76f 990 case 2: sendOK += "Aspect 1:1"; break;
tobyspark 55:35a295d36d23 991 }
tobyspark 55:35a295d36d23 992 tvOneStatusMessage.addMessage(sendOK, kTVOneStatusMessageHoldTime);
tobyspark 55:35a295d36d23 993 }
tobyspark 55:35a295d36d23 994
tobyspark 55:35a295d36d23 995 // Get back to menu
tobyspark 55:35a295d36d23 996 selectedMenu = &troubleshootingMenu;
tobyspark 55:35a295d36d23 997
tobyspark 55:35a295d36d23 998 screen.clearBufferRow(kMenuLine1);
tobyspark 55:35a295d36d23 999 screen.clearBufferRow(kMenuLine2);
tobyspark 55:35a295d36d23 1000 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 55:35a295d36d23 1001 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 55:35a295d36d23 1002 }
tobyspark 55:35a295d36d23 1003 }
tobyspark 55:35a295d36d23 1004
tobyspark 49:16309f39cead 1005 void mixModeUpdateKeyMenuHandler(int menuChange, bool action)
tobyspark 49:16309f39cead 1006 {
tobyspark 49:16309f39cead 1007 static int actionCount = 0;
tobyspark 49:16309f39cead 1008
tobyspark 49:16309f39cead 1009 if (action) actionCount++;
tobyspark 49:16309f39cead 1010
tobyspark 61:f0a42bfca816 1011 if (actionCount == 0)
tobyspark 49:16309f39cead 1012 {
tobyspark 61:f0a42bfca816 1013 settings.editingKeyerSetIndex = 0;
tobyspark 61:f0a42bfca816 1014 printf("about to load\r\n");
tobyspark 61:f0a42bfca816 1015 bool ok;
tobyspark 61:f0a42bfca816 1016 int minY, maxY, minU, maxU, minV, maxV;
tobyspark 61:f0a42bfca816 1017
tobyspark 61:f0a42bfca816 1018 ok = tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, minY);
tobyspark 61:f0a42bfca816 1019 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, maxY);
tobyspark 61:f0a42bfca816 1020 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, minU);
tobyspark 61:f0a42bfca816 1021 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, maxU);
tobyspark 61:f0a42bfca816 1022 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, minV);
tobyspark 61:f0a42bfca816 1023 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, maxV);
tobyspark 49:16309f39cead 1024
tobyspark 61:f0a42bfca816 1025 if (ok)
tobyspark 61:f0a42bfca816 1026 {
tobyspark 61:f0a42bfca816 1027 printf("%u %u %u %u", minY, maxY, minU, maxU);
tobyspark 61:f0a42bfca816 1028 settings.setEditingKeyerSetValue(SPKSettings::minY, minY);
tobyspark 61:f0a42bfca816 1029 settings.setEditingKeyerSetValue(SPKSettings::maxY, maxY);
tobyspark 61:f0a42bfca816 1030 settings.setEditingKeyerSetValue(SPKSettings::minU, minU);
tobyspark 61:f0a42bfca816 1031 settings.setEditingKeyerSetValue(SPKSettings::maxU, maxU);
tobyspark 61:f0a42bfca816 1032 settings.setEditingKeyerSetValue(SPKSettings::minV, minV);
tobyspark 61:f0a42bfca816 1033 settings.setEditingKeyerSetValue(SPKSettings::maxV, maxV);
tobyspark 61:f0a42bfca816 1034 }
tobyspark 61:f0a42bfca816 1035 else
tobyspark 61:f0a42bfca816 1036 {
tobyspark 61:f0a42bfca816 1037 printf("failed to load\r\n");
tobyspark 61:f0a42bfca816 1038 tvOneStatusMessage.addMessage("Failed to read key values", kTVOneStatusMessageHoldTime);
tobyspark 61:f0a42bfca816 1039 }
tobyspark 53:0993424e1529 1040
tobyspark 61:f0a42bfca816 1041 actionCount = 1;
tobyspark 49:16309f39cead 1042 }
tobyspark 49:16309f39cead 1043 if (actionCount == 1)
tobyspark 49:16309f39cead 1044 {
tobyspark 49:16309f39cead 1045 int value = settings.editingKeyerSetValue(SPKSettings::maxY);
tobyspark 49:16309f39cead 1046 value += menuChange;
tobyspark 49:16309f39cead 1047 if (value < 0) value = 0;
tobyspark 49:16309f39cead 1048 if (value > 255) value = 255;
tobyspark 49:16309f39cead 1049 settings.setEditingKeyerSetValue(SPKSettings::maxY, value);
tobyspark 49:16309f39cead 1050
tobyspark 49:16309f39cead 1051 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 1052 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 1053 screen.textToBuffer("Down until unmasked", kMenuLine1);
tobyspark 49:16309f39cead 1054
tobyspark 49:16309f39cead 1055 char paramLine[kStringBufferLength];
tobyspark 49:16309f39cead 1056 snprintf(paramLine, kStringBufferLength, "[ /%3i][ / ][ / ]", value);
tobyspark 49:16309f39cead 1057 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 49:16309f39cead 1058
tobyspark 49:16309f39cead 1059 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, value);
tobyspark 49:16309f39cead 1060 }
tobyspark 61:f0a42bfca816 1061 else if (actionCount == 2)
tobyspark 49:16309f39cead 1062 {
tobyspark 49:16309f39cead 1063 int value = settings.editingKeyerSetValue(SPKSettings::minY);
tobyspark 49:16309f39cead 1064 value += menuChange;
tobyspark 49:16309f39cead 1065 if (value < 0) value = 0;
tobyspark 49:16309f39cead 1066 if (value > settings.editingKeyerSetValue(SPKSettings::maxY)) value = settings.editingKeyerSetValue(SPKSettings::maxY);
tobyspark 49:16309f39cead 1067 settings.setEditingKeyerSetValue(SPKSettings::minY, value);
tobyspark 49:16309f39cead 1068
tobyspark 49:16309f39cead 1069 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 1070 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 1071 screen.textToBuffer("Up until unmasked", kMenuLine1);
tobyspark 49:16309f39cead 1072
tobyspark 49:16309f39cead 1073 char paramLine[kStringBufferLength];
tobyspark 49:16309f39cead 1074 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][ / ][ / ]", value,
tobyspark 49:16309f39cead 1075 settings.editingKeyerSetValue(SPKSettings::maxY));
tobyspark 49:16309f39cead 1076 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 49:16309f39cead 1077
tobyspark 49:16309f39cead 1078 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, value);
tobyspark 49:16309f39cead 1079 }
tobyspark 61:f0a42bfca816 1080 else if (actionCount == 3)
tobyspark 49:16309f39cead 1081 {
tobyspark 49:16309f39cead 1082 int value = settings.editingKeyerSetValue(SPKSettings::maxU);
tobyspark 49:16309f39cead 1083 value += menuChange;
tobyspark 49:16309f39cead 1084 if (value < 0) value = 0;
tobyspark 49:16309f39cead 1085 if (value > 255) value = 255;
tobyspark 49:16309f39cead 1086 settings.setEditingKeyerSetValue(SPKSettings::maxU, value);
tobyspark 49:16309f39cead 1087
tobyspark 49:16309f39cead 1088 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 1089 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 1090 screen.textToBuffer("Down until unmasked", kMenuLine1);
tobyspark 49:16309f39cead 1091
tobyspark 49:16309f39cead 1092 char paramLine[kStringBufferLength];
tobyspark 49:16309f39cead 1093 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][ /%3i][ / ]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 49:16309f39cead 1094 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 49:16309f39cead 1095 value);
tobyspark 49:16309f39cead 1096 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 49:16309f39cead 1097
tobyspark 49:16309f39cead 1098 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, value);
tobyspark 49:16309f39cead 1099 }
tobyspark 61:f0a42bfca816 1100 else if (actionCount == 4)
tobyspark 49:16309f39cead 1101 {
tobyspark 49:16309f39cead 1102 int value = settings.editingKeyerSetValue(SPKSettings::minU);
tobyspark 49:16309f39cead 1103 value += menuChange;
tobyspark 49:16309f39cead 1104 if (value < 0) value = 0;
tobyspark 49:16309f39cead 1105 if (value > settings.editingKeyerSetValue(SPKSettings::maxU)) value = settings.editingKeyerSetValue(SPKSettings::maxU);
tobyspark 49:16309f39cead 1106 settings.setEditingKeyerSetValue(SPKSettings::minU, value);
tobyspark 49:16309f39cead 1107
tobyspark 49:16309f39cead 1108 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 1109 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 1110 screen.textToBuffer("Up until unmasked", kMenuLine1);
tobyspark 49:16309f39cead 1111
tobyspark 49:16309f39cead 1112 char paramLine[kStringBufferLength];
tobyspark 49:16309f39cead 1113 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][ / ]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 49:16309f39cead 1114 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 49:16309f39cead 1115 value,
tobyspark 49:16309f39cead 1116 settings.editingKeyerSetValue(SPKSettings::maxU));
tobyspark 49:16309f39cead 1117 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 49:16309f39cead 1118
tobyspark 49:16309f39cead 1119 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, value);
tobyspark 49:16309f39cead 1120 }
tobyspark 61:f0a42bfca816 1121 else if (actionCount == 5)
tobyspark 49:16309f39cead 1122 {
tobyspark 49:16309f39cead 1123 int value = settings.editingKeyerSetValue(SPKSettings::maxV);
tobyspark 49:16309f39cead 1124 value += menuChange;
tobyspark 49:16309f39cead 1125 if (value < 0) value = 0;
tobyspark 49:16309f39cead 1126 if (value > 255) value = 255;
tobyspark 49:16309f39cead 1127 settings.setEditingKeyerSetValue(SPKSettings::maxV, value);
tobyspark 49:16309f39cead 1128
tobyspark 49:16309f39cead 1129 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 1130 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 1131 screen.textToBuffer("Down until unmasked", kMenuLine1);
tobyspark 49:16309f39cead 1132
tobyspark 49:16309f39cead 1133 char paramLine[kStringBufferLength];
tobyspark 49:16309f39cead 1134 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][ /%3i]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 49:16309f39cead 1135 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 49:16309f39cead 1136 settings.editingKeyerSetValue(SPKSettings::minU),
tobyspark 49:16309f39cead 1137 settings.editingKeyerSetValue(SPKSettings::maxU),
tobyspark 49:16309f39cead 1138 value);
tobyspark 49:16309f39cead 1139 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 49:16309f39cead 1140
tobyspark 49:16309f39cead 1141 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, value);
tobyspark 49:16309f39cead 1142 }
tobyspark 61:f0a42bfca816 1143 else if (actionCount == 6)
tobyspark 49:16309f39cead 1144 {
tobyspark 49:16309f39cead 1145 int value = settings.editingKeyerSetValue(SPKSettings::minV);
tobyspark 49:16309f39cead 1146 value += menuChange;
tobyspark 49:16309f39cead 1147 if (value < 0) value = 0;
tobyspark 49:16309f39cead 1148 if (value > settings.editingKeyerSetValue(SPKSettings::maxV)) value = settings.editingKeyerSetValue(SPKSettings::maxV);
tobyspark 49:16309f39cead 1149 settings.setEditingKeyerSetValue(SPKSettings::minV, value);
tobyspark 49:16309f39cead 1150
tobyspark 49:16309f39cead 1151 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 1152 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 1153 screen.textToBuffer("Up until unmasked", kMenuLine1);
tobyspark 49:16309f39cead 1154
tobyspark 49:16309f39cead 1155 char paramLine[kStringBufferLength];
tobyspark 49:16309f39cead 1156 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][%3i/%3i]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 49:16309f39cead 1157 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 49:16309f39cead 1158 settings.editingKeyerSetValue(SPKSettings::minU),
tobyspark 49:16309f39cead 1159 settings.editingKeyerSetValue(SPKSettings::maxU),
tobyspark 49:16309f39cead 1160 value,
tobyspark 49:16309f39cead 1161 settings.editingKeyerSetValue(SPKSettings::maxV));
tobyspark 49:16309f39cead 1162 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 49:16309f39cead 1163
tobyspark 49:16309f39cead 1164 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, value);
tobyspark 49:16309f39cead 1165 }
tobyspark 61:f0a42bfca816 1166 else if (actionCount == 7)
tobyspark 49:16309f39cead 1167 {
tobyspark 61:f0a42bfca816 1168 // Save settings
tobyspark 61:f0a42bfca816 1169 tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 61:f0a42bfca816 1170
tobyspark 49:16309f39cead 1171 // Get back to menu
tobyspark 49:16309f39cead 1172 actionCount = 0;
tobyspark 49:16309f39cead 1173 selectedMenu = &mixModeMenu;
tobyspark 49:16309f39cead 1174 screen.clearBufferRow(kMenuLine1);
tobyspark 49:16309f39cead 1175 screen.clearBufferRow(kMenuLine2);
tobyspark 49:16309f39cead 1176 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 49:16309f39cead 1177 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 49:16309f39cead 1178 }
tobyspark 49:16309f39cead 1179 }
tobyspark 49:16309f39cead 1180
tobyspark 51:98cc27390484 1181 void troubleshootingMenuResetHandler(int menuChange, bool action)
tobyspark 51:98cc27390484 1182 {
tobyspark 51:98cc27390484 1183 static int actionCount = 0;
tobyspark 51:98cc27390484 1184
tobyspark 51:98cc27390484 1185 if (action) actionCount++;
tobyspark 51:98cc27390484 1186
tobyspark 51:98cc27390484 1187 if (actionCount == 0)
tobyspark 51:98cc27390484 1188 {
tobyspark 51:98cc27390484 1189 screen.clearBufferRow(kMenuLine2);
tobyspark 63:33d7fa825c4f 1190 screen.textToBuffer("Follow instructions... [+]", kMenuLine2);
tobyspark 51:98cc27390484 1191 }
tobyspark 51:98cc27390484 1192 if (actionCount == 1)
tobyspark 51:98cc27390484 1193 {
tobyspark 63:33d7fa825c4f 1194 screen.clearBufferRow(kMenuLine2);
tobyspark 63:33d7fa825c4f 1195 screen.textToBuffer("On Processor find... [+]", kMenuLine2);
tobyspark 51:98cc27390484 1196 }
tobyspark 51:98cc27390484 1197 if (actionCount == 2)
tobyspark 51:98cc27390484 1198 {
tobyspark 51:98cc27390484 1199 screen.clearBufferRow(kMenuLine2);
tobyspark 63:33d7fa825c4f 1200 screen.textToBuffer("MENU+STANDBY buttons[+]", kMenuLine2);
tobyspark 51:98cc27390484 1201 }
tobyspark 51:98cc27390484 1202 if (actionCount == 3)
tobyspark 51:98cc27390484 1203 {
tobyspark 51:98cc27390484 1204 Timer timer;
tobyspark 51:98cc27390484 1205 timer.start();
tobyspark 51:98cc27390484 1206
tobyspark 51:98cc27390484 1207 while (timer.read_ms() < 16000)
tobyspark 51:98cc27390484 1208 {
tobyspark 51:98cc27390484 1209 screen.clearBufferRow(kMenuLine2);
tobyspark 51:98cc27390484 1210 char messageBuffer[kStringBufferLength];
tobyspark 52:98f557fe93a3 1211 snprintf(messageBuffer, kStringBufferLength,"Hold buttons for [%i s]", 15 - (timer.read_ms() / 1000));
tobyspark 51:98cc27390484 1212 screen.textToBuffer(messageBuffer, kMenuLine2);
tobyspark 51:98cc27390484 1213 screen.sendBuffer();
tobyspark 51:98cc27390484 1214 }
tobyspark 51:98cc27390484 1215
tobyspark 51:98cc27390484 1216 screen.clearBufferRow(kMenuLine2);
tobyspark 63:33d7fa825c4f 1217 screen.textToBuffer("Hold buttons for [+]", kMenuLine2);
tobyspark 51:98cc27390484 1218 }
tobyspark 63:33d7fa825c4f 1219 if (actionCount == 4)
tobyspark 51:98cc27390484 1220 {
tobyspark 51:98cc27390484 1221 screen.clearBufferRow(kMenuLine2);
tobyspark 63:33d7fa825c4f 1222 screen.textToBuffer("Updating processor [-]", kMenuLine2);
tobyspark 51:98cc27390484 1223 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 51:98cc27390484 1224 screen.textToBuffer("Sending...", kTVOneStatusLine);
tobyspark 51:98cc27390484 1225 screen.sendBuffer();
tobyspark 51:98cc27390484 1226
tobyspark 51:98cc27390484 1227 bool ok = conformProcessor();
tobyspark 51:98cc27390484 1228
tobyspark 51:98cc27390484 1229 std::string sendOK = ok ? "TVOne: Reset success" : "Send Error: Reset";
tobyspark 51:98cc27390484 1230
tobyspark 51:98cc27390484 1231 tvOneStatusMessage.addMessage(sendOK, kTVOneStatusMessageHoldTime);
tobyspark 51:98cc27390484 1232
tobyspark 51:98cc27390484 1233 tvOneRGB1Stable = false;
tobyspark 51:98cc27390484 1234 tvOneRGB2Stable = false;
tobyspark 51:98cc27390484 1235 handleTVOneSources();
tobyspark 51:98cc27390484 1236
tobyspark 51:98cc27390484 1237 actionCount++;
tobyspark 51:98cc27390484 1238 }
tobyspark 63:33d7fa825c4f 1239 if (actionCount == 5)
tobyspark 51:98cc27390484 1240 {
tobyspark 52:98f557fe93a3 1241 screen.clearBufferRow(kMenuLine2);
tobyspark 63:33d7fa825c4f 1242 screen.textToBuffer("Reset complete [DONE]", kMenuLine2);
tobyspark 51:98cc27390484 1243 }
tobyspark 63:33d7fa825c4f 1244 if (actionCount == 6)
tobyspark 51:98cc27390484 1245 {
tobyspark 51:98cc27390484 1246 // Get back to menu
tobyspark 51:98cc27390484 1247 actionCount = 0;
tobyspark 51:98cc27390484 1248 selectedMenu = &troubleshootingMenu;
tobyspark 51:98cc27390484 1249 screen.clearBufferRow(kMenuLine1);
tobyspark 51:98cc27390484 1250 screen.clearBufferRow(kMenuLine2);
tobyspark 51:98cc27390484 1251 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 51:98cc27390484 1252 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 51:98cc27390484 1253 }
tobyspark 51:98cc27390484 1254 }
tobyspark 51:98cc27390484 1255
tobyspark 0:87aab40d5806 1256 int main()
tobyspark 0:87aab40d5806 1257 {
tobyspark 0:87aab40d5806 1258 if (debug)
tobyspark 0:87aab40d5806 1259 {
tobyspark 0:87aab40d5806 1260 debug->printf("\r\n\r\n");
tobyspark 0:87aab40d5806 1261 debug->printf("*spark d-fuser -----------\r\n");
tobyspark 0:87aab40d5806 1262 debug->printf(" debug channel\r\n");
tobyspark 0:87aab40d5806 1263 }
tobyspark 2:50043054e4f7 1264
tobyspark 2:50043054e4f7 1265 // Set display font
tobyspark 2:50043054e4f7 1266 screen.fontStartCharacter = &characterBytesStartChar;
tobyspark 2:50043054e4f7 1267 screen.fontEndCharacter = &characterBytesEndChar;
tobyspark 2:50043054e4f7 1268 screen.fontCharacters = characterBytes;
tobyspark 2:50043054e4f7 1269
tobyspark 0:87aab40d5806 1270 // Splash screen
tobyspark 30:873979018850 1271 string softwareLine = "SW ";
tobyspark 30:873979018850 1272 softwareLine += kSPKDFSoftwareVersion;
tobyspark 2:50043054e4f7 1273 screen.imageToBuffer(spkDisplayLogo);
tobyspark 0:87aab40d5806 1274 screen.textToBuffer("SPK:D-Fuser",0);
tobyspark 30:873979018850 1275 screen.textToBuffer(softwareLine,1);
tobyspark 5:f8b285ca41ba 1276 screen.sendBuffer();
tobyspark 0:87aab40d5806 1277
tobyspark 11:0783cfbeb746 1278 // Load saved settings
tobyspark 16:52484666b323 1279 bool settingsAreCustom = false;
tobyspark 16:52484666b323 1280 settingsAreCustom = settings.load(kSPKDFSettingsFilename);
tobyspark 30:873979018850 1281 if (settingsAreCustom)
tobyspark 30:873979018850 1282 {
tobyspark 30:873979018850 1283 softwareLine += "; ini OK";
tobyspark 30:873979018850 1284 screen.textToBuffer(softwareLine, 1);
tobyspark 30:873979018850 1285 }
tobyspark 30:873979018850 1286
tobyspark 0:87aab40d5806 1287 // Set menu structure
tobyspark 0:87aab40d5806 1288 mixModeMenu.title = "Mix Mode";
tobyspark 61:f0a42bfca816 1289 mixModeAdditiveMenu.addMenuItem(SPKMenuItem(&mixModeAdditiveMenuHandler));
tobyspark 61:f0a42bfca816 1290 mixModeUpdateKeyMenu.addMenuItem(SPKMenuItem(&mixModeUpdateKeyMenuHandler));
tobyspark 61:f0a42bfca816 1291
tobyspark 27:27851d3d2bba 1292 setMixModeMenuItems();
tobyspark 36:8b5c75c8bc23 1293
tobyspark 0:87aab40d5806 1294 resolutionMenu.title = "Resolution";
tobyspark 27:27851d3d2bba 1295 setResolutionMenuItems();
tobyspark 0:87aab40d5806 1296
tobyspark 27:27851d3d2bba 1297 commsMenu.title = "Network Mode";
tobyspark 27:27851d3d2bba 1298 setCommsMenuItems();
tobyspark 23:909928cafb95 1299
tobyspark 51:98cc27390484 1300 advancedMenu.title = "Advanced Commands";
tobyspark 51:98cc27390484 1301 advancedMenu.addMenuItem(SPKMenuItem("Processor full conform", advancedConformUploadProcessor));
tobyspark 51:98cc27390484 1302 advancedMenu.addMenuItem(SPKMenuItem("Back to Troubleshooting Menu", &troubleshootingMenu));
tobyspark 51:98cc27390484 1303
tobyspark 51:98cc27390484 1304 troubleshootingMenu.title = "Troubleshooting";
tobyspark 51:98cc27390484 1305 troubleshootingMenuHDCP.title = "HDCP - Can Block DVI";
tobyspark 51:98cc27390484 1306 troubleshootingMenuHDCP.addMenuItem(SPKMenuItem(&troubleshootingMenuHDCPHandler));
tobyspark 51:98cc27390484 1307 troubleshootingMenu.addMenuItem(SPKMenuItem(troubleshootingMenuHDCP.title, &troubleshootingMenuHDCP));
tobyspark 51:98cc27390484 1308 troubleshootingMenuEDID.title = "EDID - Advertises Res's";
tobyspark 55:35a295d36d23 1309 troubleshootingMenuEDID.addMenuItem(SPKMenuItem(&troubleshootingMenuEDIDHandler));
tobyspark 51:98cc27390484 1310 troubleshootingMenu.addMenuItem(SPKMenuItem(troubleshootingMenuEDID.title, &troubleshootingMenuEDID));
tobyspark 55:35a295d36d23 1311 troubleshootingMenuAspect.title = "Aspect - Mismatched Res";
tobyspark 55:35a295d36d23 1312 troubleshootingMenuAspect.addMenuItem(SPKMenuItem(&troubleshootingMenuAspectHandler));
tobyspark 55:35a295d36d23 1313 troubleshootingMenu.addMenuItem(SPKMenuItem(troubleshootingMenuAspect.title, &troubleshootingMenuAspect));
tobyspark 51:98cc27390484 1314 troubleshootingMenuReset.title = "Output - Mixing Wrong";
tobyspark 51:98cc27390484 1315 troubleshootingMenuReset.addMenuItem(SPKMenuItem(&troubleshootingMenuResetHandler));
tobyspark 51:98cc27390484 1316 troubleshootingMenu.addMenuItem(SPKMenuItem(troubleshootingMenuReset.title, &troubleshootingMenuReset));
tobyspark 51:98cc27390484 1317 troubleshootingMenu.addMenuItem(SPKMenuItem(advancedMenu.title, &advancedMenu));
tobyspark 51:98cc27390484 1318 troubleshootingMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 23:909928cafb95 1319
tobyspark 0:87aab40d5806 1320 mainMenu.title = "Main Menu";
tobyspark 24:49c6624119ae 1321 mainMenu.addMenuItem(SPKMenuItem(mixModeMenu.title, &mixModeMenu));
tobyspark 24:49c6624119ae 1322 mainMenu.addMenuItem(SPKMenuItem(resolutionMenu.title, &resolutionMenu));
tobyspark 24:49c6624119ae 1323 mainMenu.addMenuItem(SPKMenuItem(commsMenu.title, &commsMenu));
tobyspark 51:98cc27390484 1324 mainMenu.addMenuItem(SPKMenuItem(troubleshootingMenu.title, &troubleshootingMenu));
tobyspark 23:909928cafb95 1325
tobyspark 0:87aab40d5806 1326 selectedMenu = &mainMenu;
tobyspark 23:909928cafb95 1327
tobyspark 0:87aab40d5806 1328 // Misc I/O stuff
tobyspark 0:87aab40d5806 1329
tobyspark 0:87aab40d5806 1330 fadeAPO.period(0.001);
tobyspark 0:87aab40d5806 1331 fadeBPO.period(0.001);
tobyspark 48:c0fedfa8c525 1332
tobyspark 48:c0fedfa8c525 1333 // If we do not have two solid sources, act on this as we rely on the window having a source for crossfade behaviour
tobyspark 48:c0fedfa8c525 1334 // 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 49:16309f39cead 1335 handleTVOneSources();
tobyspark 49:16309f39cead 1336
tobyspark 49:16309f39cead 1337 // Processor can have been power-on saved with a keyer on, lets revert
tobyspark 49:16309f39cead 1338 actionMixMode();
tobyspark 0:87aab40d5806 1339
tobyspark 12:c270870bdd23 1340 // Display menu and framing lines
tobyspark 0:87aab40d5806 1341 screen.horizLineToBuffer(kMenuLine1*pixInPage - 1);
tobyspark 0:87aab40d5806 1342 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 1343 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 1344 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 1345 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 1346 screen.horizLineToBuffer(kMenuLine2*pixInPage + pixInPage);
tobyspark 1:f9fca21102e0 1347 screen.horizLineToBuffer(kCommsStatusLine*pixInPage - 1);
tobyspark 1:f9fca21102e0 1348 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 48:c0fedfa8c525 1349 screen.textToBuffer(tvOneStatusMessage.message(), kTVOneStatusLine);
tobyspark 33:e6672a9bd571 1350 screen.sendBuffer();
tobyspark 33:e6672a9bd571 1351
tobyspark 0:87aab40d5806 1352 //// CONTROLS TEST
tobyspark 0:87aab40d5806 1353
tobyspark 0:87aab40d5806 1354 while (0) {
tobyspark 0:87aab40d5806 1355 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 1356 }
tobyspark 0:87aab40d5806 1357
tobyspark 0:87aab40d5806 1358 //// MIXER RUN
tobyspark 0:87aab40d5806 1359
tobyspark 8:d46cc49f0f37 1360 while (1)
tobyspark 49:16309f39cead 1361 {
tobyspark 1:f9fca21102e0 1362 //// Task background things
tobyspark 33:e6672a9bd571 1363 if ((osc || artNet) && rj45Mode == rj45Ethernet)
tobyspark 5:f8b285ca41ba 1364 {
tobyspark 5:f8b285ca41ba 1365 Net::poll();
tobyspark 5:f8b285ca41ba 1366 }
tobyspark 5:f8b285ca41ba 1367
tobyspark 5:f8b285ca41ba 1368 //// RJ45 SWITCH
tobyspark 5:f8b285ca41ba 1369
tobyspark 5:f8b285ca41ba 1370 if (rj45ModeDIN != rj45Mode)
tobyspark 1:f9fca21102e0 1371 {
tobyspark 23:909928cafb95 1372 if (debug) debug->printf("Handling RJ45 mode change\r\n");
tobyspark 27:27851d3d2bba 1373
tobyspark 5:f8b285ca41ba 1374 // update state
tobyspark 5:f8b285ca41ba 1375 rj45Mode = rj45ModeDIN;
tobyspark 27:27851d3d2bba 1376
tobyspark 27:27851d3d2bba 1377 setCommsMenuItems();
tobyspark 5:f8b285ca41ba 1378
tobyspark 5:f8b285ca41ba 1379 // cancel old comms
tobyspark 5:f8b285ca41ba 1380 commsMode = commsNone;
tobyspark 5:f8b285ca41ba 1381 commsMenu = commsMode;
tobyspark 5:f8b285ca41ba 1382
tobyspark 5:f8b285ca41ba 1383 // refresh display
tobyspark 23:909928cafb95 1384 if (selectedMenu == &commsMenu)
tobyspark 23:909928cafb95 1385 {
tobyspark 33:e6672a9bd571 1386 screen.clearBufferRow(kMenuLine1);
tobyspark 33:e6672a9bd571 1387 screen.clearBufferRow(kMenuLine2);
tobyspark 23:909928cafb95 1388 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 23:909928cafb95 1389 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 23:909928cafb95 1390 }
tobyspark 5:f8b285ca41ba 1391 if (rj45Mode == rj45Ethernet) screen.textToBuffer("RJ45: Ethernet Engaged", kCommsStatusLine);
tobyspark 5:f8b285ca41ba 1392 if (rj45Mode == rj45DMX) screen.textToBuffer("RJ45: DMX Engaged", kCommsStatusLine);
tobyspark 1:f9fca21102e0 1393 }
tobyspark 1:f9fca21102e0 1394
tobyspark 0:87aab40d5806 1395 //// MENU
tobyspark 0:87aab40d5806 1396
tobyspark 0:87aab40d5806 1397 int menuChange = menuEnc.getChange();
tobyspark 0:87aab40d5806 1398
tobyspark 0:87aab40d5806 1399 // Update GUI
tobyspark 0:87aab40d5806 1400 if (menuChange != 0)
tobyspark 0:87aab40d5806 1401 {
tobyspark 49:16309f39cead 1402 if (selectedMenu->selectedItem().type == SPKMenuItem::hasHandler)
tobyspark 24:49c6624119ae 1403 {
tobyspark 49:16309f39cead 1404 selectedMenu->selectedItem().payload.handler(menuChange, false);
tobyspark 24:49c6624119ae 1405 }
tobyspark 24:49c6624119ae 1406 else
tobyspark 24:49c6624119ae 1407 {
tobyspark 24:49c6624119ae 1408 if (debug) debug->printf("Menu changed by %i\r\n", menuChange);
tobyspark 24:49c6624119ae 1409
tobyspark 24:49c6624119ae 1410 *selectedMenu = selectedMenu->selectedIndex() + menuChange;
tobyspark 24:49c6624119ae 1411
tobyspark 24:49c6624119ae 1412 // update OLED line 2 here
tobyspark 24:49c6624119ae 1413 screen.clearBufferRow(kMenuLine2);
tobyspark 24:49c6624119ae 1414 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 24:49c6624119ae 1415
tobyspark 24:49c6624119ae 1416 if (debug) debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 24:49c6624119ae 1417 }
tobyspark 0:87aab40d5806 1418 }
tobyspark 0:87aab40d5806 1419
tobyspark 0:87aab40d5806 1420 // Action menu item
tobyspark 0:87aab40d5806 1421 if (menuEnc.hasPressed())
tobyspark 0:87aab40d5806 1422 {
tobyspark 0:87aab40d5806 1423 if (debug) debug->printf("Action Menu Item!\r\n");
tobyspark 21:f9d63cb7cedb 1424
tobyspark 0:87aab40d5806 1425 // Are we changing menus?
tobyspark 23:909928cafb95 1426 if (selectedMenu->selectedItem().type == SPKMenuItem::changesToMenu)
tobyspark 0:87aab40d5806 1427 {
tobyspark 31:01845a2347ff 1428 // If we're exiting the menu, we should set its selected index back to the menu's beginning...
tobyspark 31:01845a2347ff 1429 SPKMenu* menuToReset = selectedMenu->selectedItem().payload.menu == &mainMenu? selectedMenu : NULL;
tobyspark 31:01845a2347ff 1430
tobyspark 31:01845a2347ff 1431 // point selected menu pointer to the new menu pointer
tobyspark 23:909928cafb95 1432 selectedMenu = selectedMenu->selectedItem().payload.menu;
tobyspark 0:87aab40d5806 1433
tobyspark 31:01845a2347ff 1434 // ...doing this, of course, after we've used the value
tobyspark 31:01845a2347ff 1435 if (menuToReset) *menuToReset = 0;
tobyspark 31:01845a2347ff 1436
tobyspark 0:87aab40d5806 1437 // update OLED lines 1&2
tobyspark 0:87aab40d5806 1438 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 1439 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 1440 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 1441 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 1442
tobyspark 49:16309f39cead 1443 if (selectedMenu->selectedItem().type == SPKMenuItem::hasHandler)
tobyspark 49:16309f39cead 1444 {
tobyspark 49:16309f39cead 1445 selectedMenu->selectedItem().payload.handler(0, false);
tobyspark 49:16309f39cead 1446 }
tobyspark 49:16309f39cead 1447
tobyspark 0:87aab40d5806 1448 if (debug)
tobyspark 0:87aab40d5806 1449 {
tobyspark 0:87aab40d5806 1450 debug->printf("\r\n");
tobyspark 0:87aab40d5806 1451 debug->printf("%s \r\n", selectedMenu->title.c_str());
tobyspark 0:87aab40d5806 1452 debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 1453 }
tobyspark 49:16309f39cead 1454 }
tobyspark 49:16309f39cead 1455 else if (selectedMenu->selectedItem().type == SPKMenuItem::hasHandler)
tobyspark 49:16309f39cead 1456 {
tobyspark 49:16309f39cead 1457 selectedMenu->selectedItem().payload.handler(0, true);
tobyspark 0:87aab40d5806 1458 }
tobyspark 0:87aab40d5806 1459 // With that out of the way, we should be actioning a specific menu's payload?
tobyspark 44:723e65413ebe 1460 else if (selectedMenu == &mixModeMenu)
tobyspark 44:723e65413ebe 1461 {
tobyspark 61:f0a42bfca816 1462 int mixModeMenuPayload = mixModeMenu.selectedItem().payload.command[0];
tobyspark 61:f0a42bfca816 1463
tobyspark 61:f0a42bfca816 1464 if (mixModeMenuPayload == mixAdditive)
tobyspark 61:f0a42bfca816 1465 {
tobyspark 61:f0a42bfca816 1466 // This will have been handled by the mixModeAdditiveMenuHandler
tobyspark 61:f0a42bfca816 1467 }
tobyspark 61:f0a42bfca816 1468 else if (mixModeMenuPayload == mixBlend)
tobyspark 49:16309f39cead 1469 {
tobyspark 61:f0a42bfca816 1470 mixMode = mixBlend;
tobyspark 61:f0a42bfca816 1471
tobyspark 61:f0a42bfca816 1472 if (mixMode == mixModeOld) tvOneStatusMessage.addMessage("Blend already active", kTVOneStatusMessageHoldTime);
tobyspark 61:f0a42bfca816 1473 }
tobyspark 61:f0a42bfca816 1474 else if (mixModeMenuPayload >= mixKey)
tobyspark 61:f0a42bfca816 1475 {
tobyspark 61:f0a42bfca816 1476 mixMode = mixKey;
tobyspark 61:f0a42bfca816 1477
tobyspark 61:f0a42bfca816 1478 int keySetIndex = mixModeMenuPayload - mixKey;
tobyspark 49:16309f39cead 1479
tobyspark 61:f0a42bfca816 1480 if (keySetIndex > 0)
tobyspark 49:16309f39cead 1481 {
tobyspark 61:f0a42bfca816 1482 bool ok;
tobyspark 61:f0a42bfca816 1483 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, settings.keyerParamSet(keySetIndex)[SPKSettings::minY]);
tobyspark 61:f0a42bfca816 1484 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, settings.keyerParamSet(keySetIndex)[SPKSettings::maxY]);
tobyspark 61:f0a42bfca816 1485 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, settings.keyerParamSet(keySetIndex)[SPKSettings::minU]);
tobyspark 61:f0a42bfca816 1486 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, settings.keyerParamSet(keySetIndex)[SPKSettings::maxU]);
tobyspark 61:f0a42bfca816 1487 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, settings.keyerParamSet(keySetIndex)[SPKSettings::minV]);
tobyspark 61:f0a42bfca816 1488 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, settings.keyerParamSet(keySetIndex)[SPKSettings::maxV]);
tobyspark 49:16309f39cead 1489
tobyspark 61:f0a42bfca816 1490 tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 49:16309f39cead 1491
tobyspark 61:f0a42bfca816 1492 tvOneStatusMessage.addMessage(ok ? "Activated: " + settings.keyerParamName(keySetIndex) + " values" : "Send error: keyer values", kTVOneStatusMessageHoldTime);
tobyspark 61:f0a42bfca816 1493 }
tobyspark 61:f0a42bfca816 1494 else
tobyspark 61:f0a42bfca816 1495 {
tobyspark 61:f0a42bfca816 1496 if (mixMode == mixModeOld) tvOneStatusMessage.addMessage("Keying already active", kTVOneStatusMessageHoldTime);
tobyspark 49:16309f39cead 1497 }
tobyspark 49:16309f39cead 1498 }
tobyspark 44:723e65413ebe 1499 }
tobyspark 0:87aab40d5806 1500 else if (selectedMenu == &resolutionMenu)
tobyspark 0:87aab40d5806 1501 {
tobyspark 49:16309f39cead 1502 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 49:16309f39cead 1503 screen.textToBuffer("Setting Resolution...", kTVOneStatusLine);
tobyspark 49:16309f39cead 1504 screen.sendBuffer();
tobyspark 49:16309f39cead 1505
tobyspark 44:723e65413ebe 1506 bool ok;
tobyspark 57:14d37904c889 1507 int oldEDID = tvOne.getEDID();
tobyspark 57:14d37904c889 1508 int newEDID = tvOneEDIDPassthrough ? EDIDPassthroughSlot : resolutionMenu.selectedItem().payload.command[1];
tobyspark 31:01845a2347ff 1509
tobyspark 57:14d37904c889 1510 ok = tvOne.setResolution(resolutionMenu.selectedItem().payload.command[0], newEDID);
tobyspark 0:87aab40d5806 1511
tobyspark 35:d5d9f0838f99 1512 // Save new resolution and EDID into TV One unit for power-on. Cycling TV One power sometimes needed for EDID. Pffft.
tobyspark 44:723e65413ebe 1513 if (ok) tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 35:d5d9f0838f99 1514
tobyspark 57:14d37904c889 1515 string message;
tobyspark 57:14d37904c889 1516 if (ok)
tobyspark 57:14d37904c889 1517 {
tobyspark 57:14d37904c889 1518 if (oldEDID == newEDID) message = "Sent: Resolution";
tobyspark 57:14d37904c889 1519 else message = "Sent: Resolution + EDID";
tobyspark 57:14d37904c889 1520 }
tobyspark 57:14d37904c889 1521 else message = "Send Error: Resolution";
tobyspark 62:523de36d2f88 1522 tvOneStatusMessage.addMessage(message, kTVOneStatusMessageHoldTime, kTVOneStatusMessageHoldTime);
tobyspark 0:87aab40d5806 1523
tobyspark 57:14d37904c889 1524 // This is WHACK. Can't believe it's both needed and officially in the 1T-C2-750 manual
tobyspark 57:14d37904c889 1525 if ((oldEDID != newEDID) && ok) tvOneStatusMessage.addMessage("EDID: Processor Off+On?", kTVOneStatusMessageHoldTime);
tobyspark 0:87aab40d5806 1526
tobyspark 0:87aab40d5806 1527 if (debug) { debug->printf("Changing resolution"); }
tobyspark 0:87aab40d5806 1528 }
tobyspark 1:f9fca21102e0 1529 else if (selectedMenu == &commsMenu)
tobyspark 1:f9fca21102e0 1530 {
tobyspark 26:0299f8760715 1531 string commsTypeString = "Network:";
tobyspark 26:0299f8760715 1532 char commsStatusBuffer[kStringBufferLength] = "--";
tobyspark 1:f9fca21102e0 1533
tobyspark 1:f9fca21102e0 1534 // Tear down any existing comms
tobyspark 1:f9fca21102e0 1535 // This is the action of commsNone
tobyspark 1:f9fca21102e0 1536 // And also clears the way for other comms actions
tobyspark 26:0299f8760715 1537 commsMode = commsNone;
tobyspark 67:6ce9fb62b17c 1538 /* // These don't take well to being destroyed. So while it was a nice idea to be able to swap between None, OSC and Artnet, now the GUI won't allow it, and we don't need this.
tobyspark 5:f8b285ca41ba 1539 if (osc) {delete osc; osc = NULL;}
tobyspark 5:f8b285ca41ba 1540 if (ethernet) {delete ethernet; ethernet = NULL;}
tobyspark 33:e6672a9bd571 1541 if (artNet)
tobyspark 33:e6672a9bd571 1542 {
tobyspark 33:e6672a9bd571 1543 artNet->ArtPollReply.NumPorts = 0;
tobyspark 33:e6672a9bd571 1544 strcpy(artNet->ArtPollReply.NodeReport, "Shutdown");
tobyspark 33:e6672a9bd571 1545 artNet->SendArtPollReply();
tobyspark 33:e6672a9bd571 1546 artNet->Done();
tobyspark 33:e6672a9bd571 1547 delete artNet;
tobyspark 33:e6672a9bd571 1548 artNet = NULL;
tobyspark 33:e6672a9bd571 1549 }
tobyspark 67:6ce9fb62b17c 1550 */
tobyspark 5:f8b285ca41ba 1551 if (dmx) {delete dmx; dmx = NULL;}
tobyspark 5:f8b285ca41ba 1552
tobyspark 5:f8b285ca41ba 1553 // Ensure we can't change to comms modes the hardware isn't switched to
tobyspark 23:909928cafb95 1554 if (rj45Mode == rj45DMX && (commsMenu.selectedItem().payload.command[0] == commsOSC || commsMenu.selectedItem().payload.command[0] == commsArtNet))
tobyspark 1:f9fca21102e0 1555 {
tobyspark 5:f8b285ca41ba 1556 commsTypeString = "RJ45 not in Ethernet mode";
tobyspark 5:f8b285ca41ba 1557 }
tobyspark 23:909928cafb95 1558 else if (rj45Mode == rj45Ethernet && (commsMenu.selectedItem().payload.command[0] == commsDMXIn || commsMenu.selectedItem().payload.command[0] == commsDMXOut))
tobyspark 5:f8b285ca41ba 1559 {
tobyspark 5:f8b285ca41ba 1560 commsTypeString = "RJ45 not in DMX mode";
tobyspark 5:f8b285ca41ba 1561 }
tobyspark 5:f8b285ca41ba 1562 // Action!
tobyspark 23:909928cafb95 1563 else if (commsMenu.selectedItem().payload.command[0] == commsOSC)
tobyspark 5:f8b285ca41ba 1564 {
tobyspark 5:f8b285ca41ba 1565 commsMode = commsOSC;
tobyspark 66:02845e02a758 1566 commsTypeString = "OSC: ";
tobyspark 1:f9fca21102e0 1567
tobyspark 67:6ce9fb62b17c 1568 if (!ethernet)
tobyspark 1:f9fca21102e0 1569 {
tobyspark 68:c26478f42ca4 1570 if (settings.osc.DHCP)
tobyspark 68:c26478f42ca4 1571 {
tobyspark 68:c26478f42ca4 1572 ethernet = new EthernetNetIf("dvimxr");
tobyspark 68:c26478f42ca4 1573 }
tobyspark 68:c26478f42ca4 1574 else
tobyspark 68:c26478f42ca4 1575 {
tobyspark 68:c26478f42ca4 1576 ethernet = new EthernetNetIf(
tobyspark 68:c26478f42ca4 1577 settings.osc.controllerAddress,
tobyspark 68:c26478f42ca4 1578 settings.osc.controllerSubnetMask,
tobyspark 68:c26478f42ca4 1579 settings.osc.controllerGateway,
tobyspark 68:c26478f42ca4 1580 settings.osc.controllerDNS
tobyspark 68:c26478f42ca4 1581 );
tobyspark 68:c26478f42ca4 1582 }
tobyspark 68:c26478f42ca4 1583
tobyspark 67:6ce9fb62b17c 1584 EthernetErr ethError = ethernet->setup();
tobyspark 67:6ce9fb62b17c 1585 if(ethError)
tobyspark 67:6ce9fb62b17c 1586 {
tobyspark 67:6ce9fb62b17c 1587 if (debug) debug->printf("Ethernet setup error, %d", ethError);
tobyspark 67:6ce9fb62b17c 1588 snprintf(commsStatusBuffer, kStringBufferLength, "Ethernet setup failed");
tobyspark 67:6ce9fb62b17c 1589 commsMenu = commsNone;
tobyspark 67:6ce9fb62b17c 1590 // break out of here. this setup should be a function that returns a boolean
tobyspark 67:6ce9fb62b17c 1591 }
tobyspark 1:f9fca21102e0 1592 }
tobyspark 1:f9fca21102e0 1593
tobyspark 67:6ce9fb62b17c 1594 if (!osc)
tobyspark 67:6ce9fb62b17c 1595 {
tobyspark 67:6ce9fb62b17c 1596 osc = new OSCClass();
tobyspark 67:6ce9fb62b17c 1597 osc->setReceiveMessage(&receiveMessage);
tobyspark 68:c26478f42ca4 1598 osc->begin(settings.osc.sendPort);
tobyspark 67:6ce9fb62b17c 1599
tobyspark 68:c26478f42ca4 1600 uint8_t sendAddress[] = {settings.osc.sendAddress[0], settings.osc.sendAddress[1], settings.osc.sendAddress[2], settings.osc.sendAddress[3]};
tobyspark 68:c26478f42ca4 1601 sendMessage.setIp( sendAddress );
tobyspark 68:c26478f42ca4 1602 sendMessage.setPort( settings.osc.sendPort );
tobyspark 67:6ce9fb62b17c 1603 }
tobyspark 54:e8606eaa47a3 1604
tobyspark 66:02845e02a758 1605 IpAddr ethIP = ethernet->getIp();
tobyspark 68:c26478f42ca4 1606 snprintf(commsStatusBuffer, kStringBufferLength, "In %u.%u.%u.%u:%u", ethIP[0], ethIP[1], ethIP[2], ethIP[3], settings.osc.controllerPort);
tobyspark 67:6ce9fb62b17c 1607
tobyspark 67:6ce9fb62b17c 1608 setCommsMenuItems(); // remove non-OSC from menu. we're locked in.
tobyspark 1:f9fca21102e0 1609 }
tobyspark 23:909928cafb95 1610 else if (commsMenu.selectedItem().payload.command[0] == commsArtNet)
tobyspark 1:f9fca21102e0 1611 {
tobyspark 5:f8b285ca41ba 1612 commsMode = commsArtNet;
tobyspark 5:f8b285ca41ba 1613 commsTypeString = "ArtNet: ";
tobyspark 3:033d2b7768f3 1614
tobyspark 3:033d2b7768f3 1615 artNet = new DmxArtNet();
tobyspark 1:f9fca21102e0 1616
tobyspark 68:c26478f42ca4 1617 artNet->BindIpAddress = settings.artNet.controllerAddress;
tobyspark 68:c26478f42ca4 1618 artNet->BCastAddress = settings.artNet.broadcastAddress;
tobyspark 3:033d2b7768f3 1619
tobyspark 3:033d2b7768f3 1620 artNet->InitArtPollReplyDefaults();
tobyspark 3:033d2b7768f3 1621
tobyspark 33:e6672a9bd571 1622 artNet->ArtPollReply.PortType[0] = 128; // Bit 7 = Set is this channel can output data from the Art-Net Network.
tobyspark 33:e6672a9bd571 1623 artNet->ArtPollReply.GoodOutput[0] = 128; // Bit 7 = Set – Data is being transmitted.
tobyspark 33:e6672a9bd571 1624 artNet->ArtPollReply.PortType[2] = 64; // Bit 6 = Set if this channel can input onto the Art-NetNetwork.
tobyspark 33:e6672a9bd571 1625 artNet->ArtPollReply.GoodInput[2] = 128; // Bit 7 = Set – Data received.
tobyspark 3:033d2b7768f3 1626
tobyspark 3:033d2b7768f3 1627 artNet->Init();
tobyspark 3:033d2b7768f3 1628 artNet->SendArtPollReply(); // announce to art-net nodes
tobyspark 3:033d2b7768f3 1629
tobyspark 26:0299f8760715 1630 snprintf(commsStatusBuffer, kStringBufferLength, "Listening");
tobyspark 67:6ce9fb62b17c 1631
tobyspark 67:6ce9fb62b17c 1632 setCommsMenuItems(); // remove non-ArtNet from menu. we're locked in.
tobyspark 1:f9fca21102e0 1633 }
tobyspark 23:909928cafb95 1634 else if (commsMenu.selectedItem().payload.command[0] == commsDMXIn)
tobyspark 1:f9fca21102e0 1635 {
tobyspark 5:f8b285ca41ba 1636 commsMode = commsDMXIn;
tobyspark 5:f8b285ca41ba 1637 commsTypeString = "DMX In: ";
tobyspark 1:f9fca21102e0 1638
tobyspark 5:f8b285ca41ba 1639 dmxDirectionDOUT = 0;
tobyspark 5:f8b285ca41ba 1640
tobyspark 5:f8b285ca41ba 1641 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 1:f9fca21102e0 1642 }
tobyspark 23:909928cafb95 1643 else if (commsMenu.selectedItem().payload.command[0] == commsDMXOut)
tobyspark 5:f8b285ca41ba 1644 {
tobyspark 5:f8b285ca41ba 1645 commsMode = commsDMXOut;
tobyspark 5:f8b285ca41ba 1646 commsTypeString = "DMX Out: ";
tobyspark 5:f8b285ca41ba 1647
tobyspark 5:f8b285ca41ba 1648 dmxDirectionDOUT = 1;
tobyspark 5:f8b285ca41ba 1649
tobyspark 5:f8b285ca41ba 1650 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 5:f8b285ca41ba 1651 }
tobyspark 5:f8b285ca41ba 1652
tobyspark 1:f9fca21102e0 1653 screen.clearBufferRow(kCommsStatusLine);
tobyspark 25:3b519ef70341 1654 screen.textToBuffer(commsTypeString + commsStatusBuffer, kCommsStatusLine);
tobyspark 1:f9fca21102e0 1655 }
tobyspark 12:c270870bdd23 1656 else if (selectedMenu == &advancedMenu)
tobyspark 12:c270870bdd23 1657 {
tobyspark 51:98cc27390484 1658 if (advancedMenu.selectedItem().payload.command[0] == advancedConformUploadProcessor)
tobyspark 41:00d1cd3b2af2 1659 {
tobyspark 41:00d1cd3b2af2 1660 bool ok = true;
tobyspark 41:00d1cd3b2af2 1661
tobyspark 41:00d1cd3b2af2 1662 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 41:00d1cd3b2af2 1663 screen.textToBuffer("Uploading...", kTVOneStatusLine);
tobyspark 41:00d1cd3b2af2 1664 screen.sendBuffer();
tobyspark 41:00d1cd3b2af2 1665
tobyspark 41:00d1cd3b2af2 1666 ok = ok && uploadToProcessor();
tobyspark 41:00d1cd3b2af2 1667
tobyspark 41:00d1cd3b2af2 1668 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 20:8b92d7922c48 1669 screen.textToBuffer("Conforming...", kTVOneStatusLine);
tobyspark 20:8b92d7922c48 1670 screen.sendBuffer();
tobyspark 20:8b92d7922c48 1671
tobyspark 41:00d1cd3b2af2 1672 ok = ok && conformProcessor();
tobyspark 17:fc68d40b8b1f 1673
tobyspark 17:fc68d40b8b1f 1674 std::string sendOK = ok ? "Conform success" : "Send Error: Conform";
tobyspark 17:fc68d40b8b1f 1675
tobyspark 62:523de36d2f88 1676 tvOneStatusMessage.addMessage(sendOK, kTVOneStatusMessageHoldTime, 600);
tobyspark 17:fc68d40b8b1f 1677 }
tobyspark 51:98cc27390484 1678 // else if (advancedMenu.selectedItem().payload.command[0] == advancedSetResolutions)
tobyspark 51:98cc27390484 1679 // {
tobyspark 51:98cc27390484 1680 // bool ok;
tobyspark 51:98cc27390484 1681 // ok = tvOne.uploadCustomResolutions();
tobyspark 51:98cc27390484 1682 //
tobyspark 51:98cc27390484 1683 // tvOneStatusMessage.addMessage(ok ? "Resolutions set" : "Res' could not be set", kTVOneStatusMessageHoldTime);
tobyspark 51:98cc27390484 1684 // }
tobyspark 12:c270870bdd23 1685 }
tobyspark 0:87aab40d5806 1686 else
tobyspark 0:87aab40d5806 1687 {
tobyspark 0:87aab40d5806 1688 if (debug) { debug->printf("Warning: No action identified"); }
tobyspark 0:87aab40d5806 1689 }
tobyspark 0:87aab40d5806 1690 }
tobyspark 63:33d7fa825c4f 1691
tobyspark 34:69dfe64e7e6b 1692 // Send any updates to the display
tobyspark 48:c0fedfa8c525 1693 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 48:c0fedfa8c525 1694 screen.textToBuffer(tvOneStatusMessage.message(), kTVOneStatusLine);
tobyspark 34:69dfe64e7e6b 1695 screen.sendBuffer();
tobyspark 0:87aab40d5806 1696
tobyspark 5:f8b285ca41ba 1697 //// MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIXMIX MIX MIXMIX MIX MIX MIX MIX MIXMIX MIX MIX
tobyspark 0:87aab40d5806 1698
tobyspark 0:87aab40d5806 1699 bool updateFade = false;
tobyspark 3:033d2b7768f3 1700 float xFade = 0;
tobyspark 3:033d2b7768f3 1701 float fadeUp = 1;
tobyspark 3:033d2b7768f3 1702
tobyspark 3:033d2b7768f3 1703 //// TASK: Process control surface
tobyspark 3:033d2b7768f3 1704
tobyspark 0:87aab40d5806 1705 // Get new states of tap buttons, remembering at end of loop() assign these current values to the previous variables
tobyspark 5:f8b285ca41ba 1706 const bool tapLeft = !tapLeftDIN;
tobyspark 5:f8b285ca41ba 1707 const bool tapRight = !tapRightDIN;
tobyspark 0:87aab40d5806 1708
tobyspark 17:fc68d40b8b1f 1709 // We're taking a further median of the AINs on top of mbed libs v29.
tobyspark 17:fc68d40b8b1f 1710 // This takes some values from last passes and most from now. With debug off, seem to need median size > 5
tobyspark 17:fc68d40b8b1f 1711 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1712 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1713 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1714 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1715 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1716 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1717 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1718 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1719 const float xFadeAINCached = xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1720 const float fadeUpAINCached = fadeUpFilter.process(fadeUpAIN.read());
tobyspark 0:87aab40d5806 1721
tobyspark 0:87aab40d5806 1722 // When a tap is depressed, we can ignore any move of the crossfader but not fade to black
tobyspark 0:87aab40d5806 1723 if (tapLeft || tapRight)
tobyspark 0:87aab40d5806 1724 {
tobyspark 5:f8b285ca41ba 1725 // If both are pressed, take to the one that is new, ie. not the first pressed.
tobyspark 0:87aab40d5806 1726 if (tapLeft && tapRight)
tobyspark 0:87aab40d5806 1727 {
tobyspark 5:f8b285ca41ba 1728 xFade = tapLeftWasFirstPressed ? 1 : 0;
tobyspark 0:87aab40d5806 1729 }
tobyspark 5:f8b285ca41ba 1730 // If just one is pressed, take to that and remember which is pressed
tobyspark 5:f8b285ca41ba 1731 else if (tapLeft)
tobyspark 5:f8b285ca41ba 1732 {
tobyspark 5:f8b285ca41ba 1733 xFade = 0;
tobyspark 5:f8b285ca41ba 1734 tapLeftWasFirstPressed = 1;
tobyspark 5:f8b285ca41ba 1735 }
tobyspark 5:f8b285ca41ba 1736 else if (tapRight)
tobyspark 5:f8b285ca41ba 1737 {
tobyspark 5:f8b285ca41ba 1738 xFade = 1;
tobyspark 5:f8b285ca41ba 1739 tapLeftWasFirstPressed = 0;
tobyspark 5:f8b285ca41ba 1740 }
tobyspark 5:f8b285ca41ba 1741 }
tobyspark 18:ebe5da639a6a 1742 else xFade = 1.0 - fadeCalc(xFadeAINCached, xFadeTolerance);
tobyspark 0:87aab40d5806 1743
tobyspark 0:87aab40d5806 1744 fadeUp = 1.0 - fadeCalc(fadeUpAINCached, fadeUpTolerance);
tobyspark 0:87aab40d5806 1745
tobyspark 58:54347f2c3184 1746 //// TASK: Process Network Comms In, allowing hands-on controls to override
tobyspark 58:54347f2c3184 1747 if ((commsMode == commsOSC) || (commsMode == commsArtNet) || (commsMode == commsDMXIn))
tobyspark 3:033d2b7768f3 1748 {
tobyspark 58:54347f2c3184 1749 bool commsIn = false;
tobyspark 63:33d7fa825c4f 1750
tobyspark 58:54347f2c3184 1751 switch (commsMode)
tobyspark 58:54347f2c3184 1752 {
tobyspark 58:54347f2c3184 1753 case commsOSC: commsIn = processOSCIn(); break;
tobyspark 58:54347f2c3184 1754 case commsArtNet: commsIn = processArtNetIn(); break;
tobyspark 58:54347f2c3184 1755 case commsDMXIn: commsIn = processDMXIn(); break;
tobyspark 58:54347f2c3184 1756 }
tobyspark 58:54347f2c3184 1757
tobyspark 58:54347f2c3184 1758 if (commsIn)
tobyspark 3:033d2b7768f3 1759 {
tobyspark 58:54347f2c3184 1760 // Store hands-on control positions to compare for change later
tobyspark 58:54347f2c3184 1761 commsInActive = true;
tobyspark 58:54347f2c3184 1762 oldXFade = xFade;
tobyspark 58:54347f2c3184 1763 oldFadeUp = fadeUp;
tobyspark 58:54347f2c3184 1764 }
tobyspark 58:54347f2c3184 1765 else if (commsInActive)
tobyspark 58:54347f2c3184 1766 {
tobyspark 58:54347f2c3184 1767 // If no comms in update this loop, hold to the last unless hands-on controls have moved significantly
tobyspark 58:54347f2c3184 1768 bool movement = (fabs(oldXFade-xFade) > 0.1) || (fabs(oldFadeUp-fadeUp) > 0.1);
tobyspark 66:02845e02a758 1769 if (movement)
tobyspark 66:02845e02a758 1770 {
tobyspark 66:02845e02a758 1771 commsInActive = false;
tobyspark 66:02845e02a758 1772 commsXFade = -1;
tobyspark 66:02845e02a758 1773 commsFadeUp = -1;
tobyspark 66:02845e02a758 1774 }
tobyspark 58:54347f2c3184 1775 }
tobyspark 58:54347f2c3184 1776
tobyspark 58:54347f2c3184 1777 if (commsInActive)
tobyspark 58:54347f2c3184 1778 {
tobyspark 65:24ee1bf3061c 1779 if (commsXFade >= 0) xFade = commsXFade;
tobyspark 65:24ee1bf3061c 1780 if (commsFadeUp >= 0) fadeUp = commsFadeUp;
tobyspark 3:033d2b7768f3 1781 }
tobyspark 3:033d2b7768f3 1782 }
tobyspark 3:033d2b7768f3 1783
tobyspark 0:87aab40d5806 1784 // Calculate new A&B fade percents
tobyspark 0:87aab40d5806 1785 int newFadeAPercent = 0;
tobyspark 0:87aab40d5806 1786 int newFadeBPercent = 0;
tobyspark 0:87aab40d5806 1787
tobyspark 30:873979018850 1788 if (mixMode == mixBlend)
tobyspark 11:0783cfbeb746 1789 {
tobyspark 51:98cc27390484 1790 // This is the correct algorithm for blend where window A occludes B.
tobyspark 51:98cc27390484 1791 // Who knew a crossfade could be so tricky. The level of B has to be factored by what A is letting through.
tobyspark 51:98cc27390484 1792 // ie. if fully faded up, top window = xfade, bottom window = 100%
tobyspark 51:98cc27390484 1793 // This will however look very wrong if A is not occluding B, ie. mismatched aspect ratios.
tobyspark 51:98cc27390484 1794 if (xFade > 0) // avoids div by zero (if xFade = 0 and fadeUp = 1, B sum = 0 / 0)
tobyspark 51:98cc27390484 1795 {
tobyspark 51:98cc27390484 1796 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 51:98cc27390484 1797 newFadeBPercent = (xFade*fadeUp) / (1.0 - fadeUp + xFade*fadeUp) * 100.0;
tobyspark 51:98cc27390484 1798 }
tobyspark 51:98cc27390484 1799 else
tobyspark 51:98cc27390484 1800 {
tobyspark 51:98cc27390484 1801 newFadeAPercent = fadeUp * 100.0;
tobyspark 51:98cc27390484 1802 newFadeBPercent = 0;
tobyspark 51:98cc27390484 1803 }
tobyspark 11:0783cfbeb746 1804 }
tobyspark 15:4b394c64b461 1805 else if (mixMode == mixAdditive)
tobyspark 11:0783cfbeb746 1806 {
tobyspark 22:90054fe6d86c 1807 // we need to set fade level of both windows according to the fade curve profile
tobyspark 22:90054fe6d86c 1808 float newFadeA = (1.0-xFade) * (1.0 + fadeCurve);
tobyspark 22:90054fe6d86c 1809 float newFadeB = xFade * (1 + fadeCurve);
tobyspark 22:90054fe6d86c 1810 if (newFadeA > 1.0) newFadeA = 1.0;
tobyspark 22:90054fe6d86c 1811 if (newFadeB > 1.0) newFadeB = 1.0;
tobyspark 22:90054fe6d86c 1812
tobyspark 22:90054fe6d86c 1813 newFadeAPercent = newFadeA * fadeUp * 100.0;
tobyspark 22:90054fe6d86c 1814 newFadeBPercent = newFadeB * fadeUp * 100.0;
tobyspark 11:0783cfbeb746 1815 }
tobyspark 36:8b5c75c8bc23 1816 else if (mixMode >= mixKeyStartIndex)
tobyspark 11:0783cfbeb746 1817 {
tobyspark 0:87aab40d5806 1818 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 0:87aab40d5806 1819 newFadeBPercent = fadeUp * 100.0;
tobyspark 0:87aab40d5806 1820 }
tobyspark 0:87aab40d5806 1821
tobyspark 17:fc68d40b8b1f 1822 //// TASK: Send to TVOne if percents have changed
tobyspark 17:fc68d40b8b1f 1823
tobyspark 17:fc68d40b8b1f 1824 // No amount of median filtering is stopping flipflopping between two adjacent percents, so...
tobyspark 17:fc68d40b8b1f 1825 bool fadeAPercentHasChanged;
tobyspark 17:fc68d40b8b1f 1826 bool fadeBPercentHasChanged;
tobyspark 17:fc68d40b8b1f 1827 if (oldFadeAPercent == newFadeAPercent && (newFadeAPercent == fadeAPercent - 1 || newFadeAPercent == fadeAPercent + 1))
tobyspark 17:fc68d40b8b1f 1828 fadeAPercentHasChanged = false;
tobyspark 17:fc68d40b8b1f 1829 else
tobyspark 17:fc68d40b8b1f 1830 fadeAPercentHasChanged = newFadeAPercent != fadeAPercent;
tobyspark 17:fc68d40b8b1f 1831 if (oldFadeBPercent == newFadeBPercent && (newFadeBPercent == fadeBPercent - 1 || newFadeBPercent == fadeBPercent + 1))
tobyspark 17:fc68d40b8b1f 1832 fadeBPercentHasChanged = false;
tobyspark 17:fc68d40b8b1f 1833 else
tobyspark 17:fc68d40b8b1f 1834 fadeBPercentHasChanged = newFadeBPercent != fadeBPercent;
tobyspark 17:fc68d40b8b1f 1835
tobyspark 35:d5d9f0838f99 1836 // If changing mixMode from additive, we want to do this before updating fade values
tobyspark 49:16309f39cead 1837 if (mixMode != mixModeOld && mixModeOld == mixAdditive) actionMixMode();
tobyspark 35:d5d9f0838f99 1838
tobyspark 9:f83eadd8917a 1839 // We want to send the higher first, otherwise black flashes can happen on taps
tobyspark 17:fc68d40b8b1f 1840 if (fadeAPercentHasChanged && newFadeAPercent >= newFadeBPercent)
tobyspark 8:d46cc49f0f37 1841 {
tobyspark 17:fc68d40b8b1f 1842 oldFadeAPercent = fadeAPercent;
tobyspark 0:87aab40d5806 1843 fadeAPercent = newFadeAPercent;
tobyspark 0:87aab40d5806 1844 updateFade = true;
tobyspark 0:87aab40d5806 1845
tobyspark 0:87aab40d5806 1846 fadeAPO = fadeAPercent / 100.0;
tobyspark 0:87aab40d5806 1847 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 0:87aab40d5806 1848 }
tobyspark 17:fc68d40b8b1f 1849 if (fadeBPercentHasChanged)
tobyspark 8:d46cc49f0f37 1850 {
tobyspark 17:fc68d40b8b1f 1851 oldFadeBPercent = fadeBPercent;
tobyspark 0:87aab40d5806 1852 fadeBPercent = newFadeBPercent;
tobyspark 0:87aab40d5806 1853 updateFade = true;
tobyspark 0:87aab40d5806 1854
tobyspark 0:87aab40d5806 1855 fadeBPO = fadeBPercent / 100.0;
tobyspark 0:87aab40d5806 1856 tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 0:87aab40d5806 1857 }
tobyspark 17:fc68d40b8b1f 1858 if (fadeAPercentHasChanged && newFadeAPercent < newFadeBPercent)
tobyspark 9:f83eadd8917a 1859 {
tobyspark 17:fc68d40b8b1f 1860 oldFadeAPercent = fadeAPercent;
tobyspark 9:f83eadd8917a 1861 fadeAPercent = newFadeAPercent;
tobyspark 9:f83eadd8917a 1862 updateFade = true;
tobyspark 9:f83eadd8917a 1863
tobyspark 9:f83eadd8917a 1864 fadeAPO = fadeAPercent / 100.0;
tobyspark 9:f83eadd8917a 1865 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 9:f83eadd8917a 1866 }
tobyspark 8:d46cc49f0f37 1867 if (updateFade && debug)
tobyspark 8:d46cc49f0f37 1868 {
tobyspark 0:87aab40d5806 1869 //debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAIN.read(), fadeUpAIN.read());
tobyspark 0:87aab40d5806 1870 debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAINCached, fadeUpAINCached);
tobyspark 0:87aab40d5806 1871 debug->printf("xFade = %3f fadeUp = %3f fadeA% = %i fadeB% = %i \r\n", xFade, fadeUp, fadeAPercent, fadeBPercent);
tobyspark 18:ebe5da639a6a 1872 debug->printf("\r\n");
tobyspark 0:87aab40d5806 1873 }
tobyspark 30:873979018850 1874
tobyspark 49:16309f39cead 1875 // If changing mixMode to additive, we want to do this after updating fade values
tobyspark 49:16309f39cead 1876 if (mixMode != mixModeOld) actionMixMode();
tobyspark 35:d5d9f0838f99 1877
tobyspark 33:e6672a9bd571 1878 //// TASK: Process Network Comms Out, ie. send out any fade updates
tobyspark 66:02845e02a758 1879 if (commsMode == commsOSC && updateFade && !commsInActive)
tobyspark 33:e6672a9bd571 1880 {
tobyspark 33:e6672a9bd571 1881 processOSCOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1882 }
tobyspark 33:e6672a9bd571 1883
tobyspark 66:02845e02a758 1884 if (commsMode == commsArtNet && updateFade && !commsInActive)
tobyspark 33:e6672a9bd571 1885 {
tobyspark 33:e6672a9bd571 1886 processArtNetOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1887 }
tobyspark 33:e6672a9bd571 1888
tobyspark 66:02845e02a758 1889 if (commsMode == commsDMXOut && updateFade && !commsInActive)
tobyspark 33:e6672a9bd571 1890 {
tobyspark 33:e6672a9bd571 1891 processDMXOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1892 }
tobyspark 33:e6672a9bd571 1893
tobyspark 45:cf8c2400be5c 1894 //// TASK: Housekeeping
tobyspark 45:cf8c2400be5c 1895
tobyspark 49:16309f39cead 1896 if (tvOne.millisSinceLastCommandSent() > tvOne.getCommandTimeoutPeriod() + 1000)
tobyspark 30:873979018850 1897 {
tobyspark 45:cf8c2400be5c 1898 // Lets check on our sources
tobyspark 45:cf8c2400be5c 1899 handleTVOneSources();
tobyspark 49:16309f39cead 1900
tobyspark 49:16309f39cead 1901 // Lets check on our fade levels
tobyspark 49:16309f39cead 1902 checkTVOneMixStatus();
tobyspark 30:873979018850 1903 }
tobyspark 0:87aab40d5806 1904 }
tobyspark 30:873979018850 1905 }