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

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

Committer:
tobyspark
Date:
Sun May 12 15:56:00 2013 +0000
Revision:
56:d6f77bd54e10
Parent:
55:35a295d36d23
Child:
57:14d37904c889
ConformProcessor; - proper rest, ignoring HDCP/EDID/aspect prefs; - was missing SIS1 aspect and test card sets

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