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:
Wed Dec 05 16:08:24 2012 +0000
Revision:
44:723e65413ebe
Parent:
41:00d1cd3b2af2
Child:
45:cf8c2400be5c
v24.1 More robust, better handling of TVOne irregularities.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tobyspark 8:d46cc49f0f37 1 /* *SPARK D-FUSER
tobyspark 8:d46cc49f0f37 2 * A project by Toby Harris
tobyspark 8:d46cc49f0f37 3 *
tobyspark 8:d46cc49f0f37 4 * 'DJ' controller styke RS232 Control for TV-One products
tobyspark 8:d46cc49f0f37 5 * Good for 1T-C2-750, others will need some extra work
tobyspark 8:d46cc49f0f37 6 *
tobyspark 8:d46cc49f0f37 7 * www.sparkav.co.uk/dvimixer
tobyspark 8:d46cc49f0f37 8 */
tobyspark 0:87aab40d5806 9
tobyspark 8:d46cc49f0f37 10 /* Copyright (c) 2011 Toby Harris, MIT License
tobyspark 8:d46cc49f0f37 11 *
tobyspark 8:d46cc49f0f37 12 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
tobyspark 8:d46cc49f0f37 13 * and associated documentation files (the "Software"), to deal in the Software without restriction,
tobyspark 8:d46cc49f0f37 14 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
tobyspark 8:d46cc49f0f37 15 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
tobyspark 8:d46cc49f0f37 16 * furnished to do so, subject to the following conditions:
tobyspark 8:d46cc49f0f37 17 *
tobyspark 8:d46cc49f0f37 18 * The above copyright notice and this permission notice shall be included in all copies or
tobyspark 8:d46cc49f0f37 19 * substantial portions of the Software.
tobyspark 8:d46cc49f0f37 20 *
tobyspark 8:d46cc49f0f37 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
tobyspark 8:d46cc49f0f37 22 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
tobyspark 8:d46cc49f0f37 23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
tobyspark 8:d46cc49f0f37 24 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
tobyspark 8:d46cc49f0f37 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tobyspark 8:d46cc49f0f37 26 */
tobyspark 8:d46cc49f0f37 27
tobyspark 8:d46cc49f0f37 28 /* ROADMAP / HISTORY
tobyspark 8:d46cc49f0f37 29 * v10 - Port to mBed, keying redux - Apr'11
tobyspark 8:d46cc49f0f37 30 * v11 - Sign callbacks, code clean-up - Apr'11
tobyspark 8:d46cc49f0f37 31 * v12 - TVOne header split into two: defines and mbed class. v002 header updates pulled down. Removed sign callbacks, rewrite of debug and signing. - Apr'11
tobyspark 8:d46cc49f0f37 32 * v13 - Menu system for Resolution + Keying implemented, it writing to debug, it sending TVOne commands - Apr'11
tobyspark 8:d46cc49f0f37 33 * v14 - Fixes for new PCB - Oct'11
tobyspark 8:d46cc49f0f37 34 * v15 - TBZ PCB, OLED - Mar'12
tobyspark 8:d46cc49f0f37 35 * v16 - Comms menu, OSC, ArtNet - April'12
tobyspark 8:d46cc49f0f37 36 * v17 - RJ45 - May'12
tobyspark 8:d46cc49f0f37 37 * v18 - DMX - July'12
tobyspark 13:3796bde6ba8f 38 * v19 - TVOne mixing comms further optimised - August'12
tobyspark 30:873979018850 39 * v20 - Keying values and resolutions load from USB mass storage - September'12
tobyspark 30:873979018850 40 * v21 - Mixing behaviour upgrade: blend-additive as continuum, test cards on startup if no valid source - October'12
tobyspark 35:d5d9f0838f99 41 * v22 - EDID passthrough override and EDID upload from USB mass storage
tobyspark 36:8b5c75c8bc23 42 * v23 - Set keying values from controller, requires a guided, step-through process for user
tobyspark 44:723e65413ebe 43 * v24 - Conform uploads SIS image; now once firmware is loaded controller is all that is required
tobyspark 36:8b5c75c8bc23 44 * vxx - TODO: Writes back to .ini on USB mass storage: keyer updates, comms, hdcp, edid internal/passthrough, ...?
tobyspark 8:d46cc49f0f37 45 * vxx - TODO: EDID creation from resolution
tobyspark 8:d46cc49f0f37 46 */
tobyspark 8:d46cc49f0f37 47
tobyspark 0:87aab40d5806 48 #include "mbed.h"
tobyspark 0:87aab40d5806 49
tobyspark 0:87aab40d5806 50 #include "spk_tvone_mbed.h"
tobyspark 0:87aab40d5806 51 #include "spk_utils.h"
tobyspark 0:87aab40d5806 52 #include "spk_mRotaryEncoder.h"
tobyspark 0:87aab40d5806 53 #include "spk_oled_ssd1305.h"
tobyspark 2:50043054e4f7 54 #include "spk_oled_gfx.h"
tobyspark 11:0783cfbeb746 55 #include "spk_settings.h"
tobyspark 1:f9fca21102e0 56 #include "EthernetNetIf.h"
tobyspark 1:f9fca21102e0 57 #include "mbedOSC.h"
tobyspark 3:033d2b7768f3 58 #include "DmxArtNet.h"
tobyspark 5:f8b285ca41ba 59 #include "DMX.h"
tobyspark 17:fc68d40b8b1f 60 #include "filter.h"
tobyspark 0:87aab40d5806 61
tobyspark 44:723e65413ebe 62 #define kSPKDFSoftwareVersion "24.1"
tobyspark 13:3796bde6ba8f 63
tobyspark 5:f8b285ca41ba 64 // MBED PINS
tobyspark 5:f8b285ca41ba 65
tobyspark 5:f8b285ca41ba 66 #define kMBED_AIN_XFADE p20
tobyspark 5:f8b285ca41ba 67 #define kMBED_AIN_FADEUP p19
tobyspark 5:f8b285ca41ba 68 #define kMBED_DIN_TAP_L p24
tobyspark 5:f8b285ca41ba 69 #define kMBED_DIN_TAP_R p23
tobyspark 5:f8b285ca41ba 70 #define kMBED_ENC_SW p15
tobyspark 5:f8b285ca41ba 71 #define kMBED_ENC_A p16
tobyspark 5:f8b285ca41ba 72 #define kMBED_ENC_B p17
tobyspark 5:f8b285ca41ba 73
tobyspark 5:f8b285ca41ba 74 #define kMBED_RS232_TTLTX p13
tobyspark 5:f8b285ca41ba 75 #define kMBED_RS232_TTLRX p14
tobyspark 5:f8b285ca41ba 76
tobyspark 5:f8b285ca41ba 77 #define kMBED_OLED_MOSI p5
tobyspark 5:f8b285ca41ba 78 #define kMBED_OLED_SCK p7
tobyspark 5:f8b285ca41ba 79 #define kMBED_OLED_CS p8
tobyspark 5:f8b285ca41ba 80 #define kMBED_OLED_RES p9
tobyspark 5:f8b285ca41ba 81 #define kMBED_OLED_DC p10
tobyspark 5:f8b285ca41ba 82
tobyspark 5:f8b285ca41ba 83 #define kMBED_DIN_ETHLO_DMXHI p30
tobyspark 5:f8b285ca41ba 84 #define kMBED_DOUT_RS485_TXHI_RXLO p29
tobyspark 5:f8b285ca41ba 85 #define kMBED_RS485_TTLTX p28
tobyspark 5:f8b285ca41ba 86 #define kMBED_RS485_TTLRX p27
tobyspark 5:f8b285ca41ba 87
tobyspark 5:f8b285ca41ba 88 // DISPLAY
tobyspark 5:f8b285ca41ba 89
tobyspark 1:f9fca21102e0 90 #define kMenuLine1 3
tobyspark 1:f9fca21102e0 91 #define kMenuLine2 4
tobyspark 1:f9fca21102e0 92 #define kCommsStatusLine 6
tobyspark 1:f9fca21102e0 93 #define kTVOneStatusLine 7
tobyspark 1:f9fca21102e0 94
tobyspark 5:f8b285ca41ba 95 // NETWORKING
tobyspark 5:f8b285ca41ba 96
tobyspark 1:f9fca21102e0 97 #define kOSCMbedPort 10000
tobyspark 1:f9fca21102e0 98 #define kOSCMbedIPAddress 10,0,0,2
tobyspark 1:f9fca21102e0 99 #define kOSCMbedSubnetMask 255,255,255,0
tobyspark 1:f9fca21102e0 100 #define kOSCMbedGateway 10,0,0,1
tobyspark 1:f9fca21102e0 101 #define kOSCMbedDNS 10,0,0,1
tobyspark 0:87aab40d5806 102
tobyspark 3:033d2b7768f3 103 #define kArtNetBindIPAddress 2,0,0,100
tobyspark 3:033d2b7768f3 104 #define kArtNetBroadcastAddress 2,255,255,255
tobyspark 3:033d2b7768f3 105
tobyspark 5:f8b285ca41ba 106 #define kDMXInChannelXFade 0
tobyspark 5:f8b285ca41ba 107 #define kDMXInChannelFadeUp 1
tobyspark 5:f8b285ca41ba 108 #define kDMXOutChannelXFade 0
tobyspark 5:f8b285ca41ba 109 #define kDMXOutChannelFadeUp 1
tobyspark 5:f8b285ca41ba 110
tobyspark 13:3796bde6ba8f 111 // 8.3 format filename only, no subdirs
tobyspark 13:3796bde6ba8f 112 #define kSPKDFSettingsFilename "SPKDF.ini"
tobyspark 11:0783cfbeb746 113
tobyspark 26:0299f8760715 114 #define kStringBufferLength 30
tobyspark 26:0299f8760715 115
tobyspark 0:87aab40d5806 116 //// DEBUG
tobyspark 0:87aab40d5806 117
tobyspark 0:87aab40d5806 118 // Comment out one or the other...
tobyspark 41:00d1cd3b2af2 119 //Serial *debug = new Serial(USBTX, USBRX); // For debugging via USB serial
tobyspark 37:744bef2e8be8 120 Serial *debug = NULL; // For release (no debugging)
tobyspark 0:87aab40d5806 121
tobyspark 15:4b394c64b461 122 //// SOFT RESET
tobyspark 15:4b394c64b461 123
tobyspark 15:4b394c64b461 124 extern "C" void mbed_reset();
tobyspark 15:4b394c64b461 125
tobyspark 0:87aab40d5806 126 //// mBED PIN ASSIGNMENTS
tobyspark 0:87aab40d5806 127
tobyspark 0:87aab40d5806 128 // Inputs
tobyspark 5:f8b285ca41ba 129 AnalogIn xFadeAIN(kMBED_AIN_XFADE);
tobyspark 5:f8b285ca41ba 130 AnalogIn fadeUpAIN(kMBED_AIN_FADEUP);
tobyspark 5:f8b285ca41ba 131 DigitalIn tapLeftDIN(kMBED_DIN_TAP_L);
tobyspark 5:f8b285ca41ba 132 DigitalIn tapRightDIN(kMBED_DIN_TAP_R);
tobyspark 17:fc68d40b8b1f 133 medianFilter xFadeFilter(9);
tobyspark 17:fc68d40b8b1f 134 medianFilter fadeUpFilter(9);
tobyspark 0:87aab40d5806 135
tobyspark 5:f8b285ca41ba 136 SPKRotaryEncoder menuEnc(kMBED_ENC_A, kMBED_ENC_B, kMBED_ENC_SW);
tobyspark 5:f8b285ca41ba 137
tobyspark 5:f8b285ca41ba 138 DigitalIn rj45ModeDIN(kMBED_DIN_ETHLO_DMXHI);
tobyspark 0:87aab40d5806 139
tobyspark 0:87aab40d5806 140 // Outputs
tobyspark 0:87aab40d5806 141 PwmOut fadeAPO(LED1);
tobyspark 0:87aab40d5806 142 PwmOut fadeBPO(LED2);
tobyspark 0:87aab40d5806 143
tobyspark 5:f8b285ca41ba 144 DigitalOut dmxDirectionDOUT(kMBED_DOUT_RS485_TXHI_RXLO);
tobyspark 5:f8b285ca41ba 145
tobyspark 0:87aab40d5806 146 // SPKTVOne(PinName txPin, PinName rxPin, PinName signWritePin, PinName signErrorPin, Serial *debugSerial)
tobyspark 5:f8b285ca41ba 147 SPKTVOne tvOne(kMBED_RS232_TTLTX, kMBED_RS232_TTLRX, LED3, LED4, debug);
tobyspark 0:87aab40d5806 148
tobyspark 0:87aab40d5806 149 // SPKDisplay(PinName mosi, PinName clk, PinName cs, PinName dc, PinName res, Serial *debugSerial = NULL);
tobyspark 5:f8b285ca41ba 150 SPKDisplay screen(kMBED_OLED_MOSI, kMBED_OLED_SCK, kMBED_OLED_CS, kMBED_OLED_DC, kMBED_OLED_RES, debug);
tobyspark 0:87aab40d5806 151
tobyspark 11:0783cfbeb746 152 // Saved Settings
tobyspark 11:0783cfbeb746 153 SPKSettings settings;
tobyspark 11:0783cfbeb746 154
tobyspark 0:87aab40d5806 155 // Menu
tobyspark 0:87aab40d5806 156 SPKMenu *selectedMenu;
tobyspark 23:909928cafb95 157 SPKMenu mainMenu;
tobyspark 23:909928cafb95 158 SPKMenu resolutionMenu;
tobyspark 12:c270870bdd23 159
tobyspark 24:49c6624119ae 160 SPKMenu mixModeMenu;
tobyspark 36:8b5c75c8bc23 161 SPKMenu mixModeAdditiveMenu;
tobyspark 36:8b5c75c8bc23 162 SPKMenu mixModeKeyerMenuUpdate;
tobyspark 36:8b5c75c8bc23 163 SPKMenu mixModeKeyerMenuMinY;
tobyspark 36:8b5c75c8bc23 164 SPKMenu mixModeKeyerMenuMaxY;
tobyspark 36:8b5c75c8bc23 165 SPKMenu mixModeKeyerMenuMinU;
tobyspark 36:8b5c75c8bc23 166 SPKMenu mixModeKeyerMenuMaxU;
tobyspark 36:8b5c75c8bc23 167 SPKMenu mixModeKeyerMenuMinV;
tobyspark 36:8b5c75c8bc23 168 SPKMenu mixModeKeyerMenuMaxV;
tobyspark 36:8b5c75c8bc23 169 enum { mixBlend, mixAdditive, mixKey };
tobyspark 36:8b5c75c8bc23 170 int mixKeyStartIndex = 1; // need this hard coded as mixBlend and mixAdditive are now combined into the same menu item
tobyspark 30:873979018850 171 int mixMode = mixBlend; // Start with safe mix mode, and test to get out of it. Safe mode will work with inputs missing and without hold frames.
tobyspark 29:95a7efe30527 172 float fadeCurve = 0.0f; // 0 = "X", ie. as per blend, 1 = "/\", ie. as per additive <-- pictograms!
tobyspark 22:90054fe6d86c 173
tobyspark 23:909928cafb95 174 SPKMenu commsMenu;
tobyspark 5:f8b285ca41ba 175 enum { commsNone, commsOSC, commsArtNet, commsDMXIn, commsDMXOut};
tobyspark 5:f8b285ca41ba 176 int commsMode = commsNone;
tobyspark 22:90054fe6d86c 177
tobyspark 23:909928cafb95 178 SPKMenu advancedMenu;
tobyspark 41:00d1cd3b2af2 179 enum { advancedHDCPOn, advancedHDCPOff, advancedEDIDPassthrough, advancedEDIDInternal, advancedTestSources, advancedConformProcessor, advancedConformUploadProcessor, advancedLoadDefaults, advancedSetResolutions };
tobyspark 1:f9fca21102e0 180
tobyspark 5:f8b285ca41ba 181 // RJ45 Comms
tobyspark 5:f8b285ca41ba 182 enum { rj45Ethernet = 0, rj45DMX = 1}; // These values from circuit
tobyspark 5:f8b285ca41ba 183 int rj45Mode = -1;
tobyspark 1:f9fca21102e0 184 EthernetNetIf *ethernet = NULL;
tobyspark 1:f9fca21102e0 185 OSCClass *osc = NULL;
tobyspark 33:e6672a9bd571 186 OSCMessage sendMessage;
tobyspark 33:e6672a9bd571 187 OSCMessage receiveMessage;
tobyspark 3:033d2b7768f3 188 DmxArtNet *artNet = NULL;
tobyspark 5:f8b285ca41ba 189 DMX *dmx = NULL;
tobyspark 0:87aab40d5806 190
tobyspark 3:033d2b7768f3 191 // Fade logic constants
tobyspark 0:87aab40d5806 192 const float xFadeTolerance = 0.05;
tobyspark 0:87aab40d5806 193 const float fadeUpTolerance = 0.05;
tobyspark 0:87aab40d5806 194
tobyspark 0:87aab40d5806 195 // A&B Fade as resolved percent
tobyspark 0:87aab40d5806 196 int fadeAPercent = 0;
tobyspark 0:87aab40d5806 197 int fadeBPercent = 0;
tobyspark 17:fc68d40b8b1f 198 int oldFadeAPercent = 0;
tobyspark 17:fc68d40b8b1f 199 int oldFadeBPercent = 0;
tobyspark 0:87aab40d5806 200
tobyspark 0:87aab40d5806 201 // Tap button states
tobyspark 5:f8b285ca41ba 202 bool tapLeftWasFirstPressed = false;
tobyspark 0:87aab40d5806 203
tobyspark 0:87aab40d5806 204 // Key mode parameters
tobyspark 0:87aab40d5806 205 int keyerParamsSet = -1; // last keyParams index uploaded to unit
tobyspark 0:87aab40d5806 206
tobyspark 30:873979018850 207 // TVOne input sources stable flag
tobyspark 34:69dfe64e7e6b 208 bool tvOneRGB1Stable = false;
tobyspark 34:69dfe64e7e6b 209 bool tvOneRGB2Stable = false;
tobyspark 30:873979018850 210
tobyspark 31:01845a2347ff 211 // TVOne behaviour flags
tobyspark 31:01845a2347ff 212 bool tvOneHDCPOn = false;
tobyspark 34:69dfe64e7e6b 213 bool tvOneEDIDPassthrough = false;
tobyspark 31:01845a2347ff 214 const int32_t EDIDPassthroughSlot = 7;
tobyspark 31:01845a2347ff 215
tobyspark 34:69dfe64e7e6b 216
tobyspark 33:e6672a9bd571 217 void processOSCIn(float &xFade, float &fadeUp) {
tobyspark 25:3b519ef70341 218 string statusMessage;
tobyspark 3:033d2b7768f3 219
tobyspark 33:e6672a9bd571 220 if (!strcmp( receiveMessage.getTopAddress() , "dvimxr" ))
tobyspark 3:033d2b7768f3 221 {
tobyspark 25:3b519ef70341 222 statusMessage = "OSC: /dvimxr";
tobyspark 33:e6672a9bd571 223 if (!strcmp( receiveMessage.getSubAddress() , "xFade" ))
tobyspark 25:3b519ef70341 224 {
tobyspark 33:e6672a9bd571 225 if (receiveMessage.getArgNum() == 1)
tobyspark 33:e6672a9bd571 226 if (receiveMessage.getTypeTag(0) == 'f')
tobyspark 25:3b519ef70341 227 {
tobyspark 33:e6672a9bd571 228 xFade = receiveMessage.getArgFloat(0);
tobyspark 25:3b519ef70341 229 char buffer[15];
tobyspark 26:0299f8760715 230 snprintf(buffer, kStringBufferLength, "/xFade %1.2f", xFade);
tobyspark 25:3b519ef70341 231 statusMessage += buffer;
tobyspark 25:3b519ef70341 232 }
tobyspark 25:3b519ef70341 233 }
tobyspark 33:e6672a9bd571 234 else if (!strcmp( receiveMessage.getSubAddress() , "fadeUp" ))
tobyspark 25:3b519ef70341 235 {
tobyspark 33:e6672a9bd571 236 if (receiveMessage.getArgNum() == 1)
tobyspark 33:e6672a9bd571 237 if (receiveMessage.getTypeTag(0) == 'f')
tobyspark 3:033d2b7768f3 238 {
tobyspark 33:e6672a9bd571 239 fadeUp = receiveMessage.getArgFloat(0);
tobyspark 25:3b519ef70341 240 char buffer[15];
tobyspark 26:0299f8760715 241 snprintf(buffer, kStringBufferLength, "/fadeUp %1.2f", fadeUp);
tobyspark 25:3b519ef70341 242 statusMessage += buffer;
tobyspark 3:033d2b7768f3 243 }
tobyspark 25:3b519ef70341 244 }
tobyspark 25:3b519ef70341 245 else
tobyspark 25:3b519ef70341 246 {
tobyspark 33:e6672a9bd571 247 statusMessage += receiveMessage.getSubAddress();
tobyspark 25:3b519ef70341 248 statusMessage += " - Ignoring";
tobyspark 25:3b519ef70341 249 }
tobyspark 3:033d2b7768f3 250 }
tobyspark 3:033d2b7768f3 251 else
tobyspark 3:033d2b7768f3 252 {
tobyspark 25:3b519ef70341 253 statusMessage = "OSC: ";
tobyspark 33:e6672a9bd571 254 statusMessage += receiveMessage.getTopAddress();
tobyspark 25:3b519ef70341 255 statusMessage += " - Ignoring";
tobyspark 3:033d2b7768f3 256 }
tobyspark 3:033d2b7768f3 257
tobyspark 3:033d2b7768f3 258 screen.clearBufferRow(kCommsStatusLine);
tobyspark 25:3b519ef70341 259 screen.textToBuffer(statusMessage, kCommsStatusLine);
tobyspark 33:e6672a9bd571 260
tobyspark 25:3b519ef70341 261 if (debug) debug->printf("%s \r\n", statusMessage.c_str());
tobyspark 3:033d2b7768f3 262
tobyspark 3:033d2b7768f3 263 }
tobyspark 3:033d2b7768f3 264
tobyspark 33:e6672a9bd571 265 void processOSCOut(float &xFade, float &fadeUp)
tobyspark 33:e6672a9bd571 266 {
tobyspark 33:e6672a9bd571 267 char statusMessageBuffer[kStringBufferLength];
tobyspark 33:e6672a9bd571 268
tobyspark 33:e6672a9bd571 269 sendMessage.setAddress("dvimxr", "xFadeFadeUp");
tobyspark 33:e6672a9bd571 270 sendMessage.setArgs("ff", &xFade, &fadeUp);
tobyspark 33:e6672a9bd571 271 osc->sendOsc(&sendMessage);
tobyspark 33:e6672a9bd571 272
tobyspark 33:e6672a9bd571 273 screen.clearBufferRow(kCommsStatusLine);
tobyspark 33:e6672a9bd571 274 snprintf(statusMessageBuffer, kStringBufferLength, "OSC Out: xF %.2f fUp %.2f", xFade, fadeUp);
tobyspark 33:e6672a9bd571 275 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 276
tobyspark 33:e6672a9bd571 277 if (debug) debug->printf(statusMessageBuffer);
tobyspark 33:e6672a9bd571 278 }
tobyspark 33:e6672a9bd571 279
tobyspark 33:e6672a9bd571 280 void processArtNetIn(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 281 {
tobyspark 3:033d2b7768f3 282 screen.clearBufferRow(kCommsStatusLine);
tobyspark 3:033d2b7768f3 283 screen.textToBuffer("ArtNet activity", kCommsStatusLine);
tobyspark 33:e6672a9bd571 284
tobyspark 3:033d2b7768f3 285 if (debug) debug->printf("ArtNet activity");
tobyspark 3:033d2b7768f3 286 }
tobyspark 0:87aab40d5806 287
tobyspark 33:e6672a9bd571 288 void processArtNetOut(float &xFade, float &fadeUp)
tobyspark 33:e6672a9bd571 289 {
tobyspark 33:e6672a9bd571 290 char statusMessageBuffer[kStringBufferLength];
tobyspark 33:e6672a9bd571 291
tobyspark 33:e6672a9bd571 292 int xFadeDMX = xFade*255;
tobyspark 33:e6672a9bd571 293 int fadeUpDMX = fadeUp*255;
tobyspark 33:e6672a9bd571 294
tobyspark 33:e6672a9bd571 295 // Universe 0, Channel 0 = xFade, Channel 1 = fadeUp
tobyspark 33:e6672a9bd571 296 char dmxData[2] = {xFadeDMX, fadeUpDMX};
tobyspark 33:e6672a9bd571 297 artNet->Send_ArtDmx(0, 0, dmxData, 2);
tobyspark 33:e6672a9bd571 298
tobyspark 33:e6672a9bd571 299 screen.clearBufferRow(kCommsStatusLine);
tobyspark 33:e6672a9bd571 300 snprintf(statusMessageBuffer, kStringBufferLength, "A'Net Out: xF%3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 33:e6672a9bd571 301 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 302
tobyspark 33:e6672a9bd571 303 if (debug) debug->printf(statusMessageBuffer);
tobyspark 33:e6672a9bd571 304 }
tobyspark 33:e6672a9bd571 305
tobyspark 8:d46cc49f0f37 306 void processDMXIn(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 307 {
tobyspark 26:0299f8760715 308 char statusMessageBuffer[kStringBufferLength];
tobyspark 5:f8b285ca41ba 309
tobyspark 5:f8b285ca41ba 310 int xFadeDMX = dmx->get(kDMXInChannelXFade);
tobyspark 7:e6717468c18d 311 int fadeUpDMX = dmx->get(kDMXInChannelFadeUp);
tobyspark 5:f8b285ca41ba 312
tobyspark 5:f8b285ca41ba 313 xFade = (float)xFadeDMX/255;
tobyspark 5:f8b285ca41ba 314 fadeUp = (float)fadeUpDMX/255;
tobyspark 5:f8b285ca41ba 315
tobyspark 5:f8b285ca41ba 316 screen.clearBufferRow(kCommsStatusLine);
tobyspark 26:0299f8760715 317 snprintf(statusMessageBuffer, kStringBufferLength, "DMX In: xF %3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 25:3b519ef70341 318 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 319
tobyspark 25:3b519ef70341 320 if (debug) debug->printf(statusMessageBuffer);
tobyspark 5:f8b285ca41ba 321 }
tobyspark 5:f8b285ca41ba 322
tobyspark 8:d46cc49f0f37 323 void processDMXOut(float &xFade, float &fadeUp)
tobyspark 8:d46cc49f0f37 324 {
tobyspark 26:0299f8760715 325 char statusMessageBuffer[kStringBufferLength];
tobyspark 5:f8b285ca41ba 326
tobyspark 5:f8b285ca41ba 327 int xFadeDMX = xFade*255;
tobyspark 5:f8b285ca41ba 328 int fadeUpDMX = fadeUp*255;
tobyspark 5:f8b285ca41ba 329
tobyspark 5:f8b285ca41ba 330 dmx->put(kDMXOutChannelXFade, xFadeDMX);
tobyspark 5:f8b285ca41ba 331 dmx->put(kDMXOutChannelFadeUp, fadeUpDMX);
tobyspark 5:f8b285ca41ba 332
tobyspark 5:f8b285ca41ba 333 screen.clearBufferRow(kCommsStatusLine);
tobyspark 26:0299f8760715 334 snprintf(statusMessageBuffer, kStringBufferLength, "DMX Out: xF %3i fUp %3i", xFadeDMX, fadeUpDMX);
tobyspark 25:3b519ef70341 335 screen.textToBuffer(statusMessageBuffer, kCommsStatusLine);
tobyspark 33:e6672a9bd571 336
tobyspark 25:3b519ef70341 337 if (debug) debug->printf(statusMessageBuffer);
tobyspark 5:f8b285ca41ba 338 }
tobyspark 0:87aab40d5806 339
tobyspark 8:d46cc49f0f37 340 inline float fadeCalc (const float AIN, const float tolerance)
tobyspark 8:d46cc49f0f37 341 {
tobyspark 0:87aab40d5806 342 float pos ;
tobyspark 0:87aab40d5806 343 if (AIN < tolerance) pos = 0;
tobyspark 0:87aab40d5806 344 else if (AIN > 1.0 - tolerance) pos = 1;
tobyspark 0:87aab40d5806 345 else pos = (AIN - tolerance) / (1 - 2*tolerance);
tobyspark 0:87aab40d5806 346 if (debug && false) debug->printf("fadeCalc in: %f out: %f \r\n", AIN, pos);
tobyspark 0:87aab40d5806 347 return pos;
tobyspark 0:87aab40d5806 348 }
tobyspark 0:87aab40d5806 349
tobyspark 34:69dfe64e7e6b 350 bool handleTVOneSources()
tobyspark 30:873979018850 351 {
tobyspark 30:873979018850 352 bool ok = true;
tobyspark 30:873979018850 353
tobyspark 30:873979018850 354 int32_t payload = 0;
tobyspark 30:873979018850 355
tobyspark 30:873979018850 356 ok = ok && tvOne.readCommand(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceSourceStable, payload);
tobyspark 34:69dfe64e7e6b 357 bool RGB1 = (payload == 1);
tobyspark 30:873979018850 358
tobyspark 30:873979018850 359 ok = ok && tvOne.readCommand(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceSourceStable, payload);
tobyspark 30:873979018850 360 bool RGB2 = (payload == 1);
tobyspark 30:873979018850 361
tobyspark 34:69dfe64e7e6b 362 ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, payload);
tobyspark 34:69dfe64e7e6b 363 int sourceA = payload;
tobyspark 34:69dfe64e7e6b 364
tobyspark 34:69dfe64e7e6b 365 ok = ok && tvOne.readCommand(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, payload);
tobyspark 34:69dfe64e7e6b 366 int sourceB = payload;
tobyspark 34:69dfe64e7e6b 367
tobyspark 44:723e65413ebe 368 if (debug) debug->printf("HandleTVOneSources: RGB1: %i, RGB2: %i, sourceA: %#x, sourceB: %#x \r\n", RGB1, RGB2, sourceA, sourceB);
tobyspark 34:69dfe64e7e6b 369
tobyspark 30:873979018850 370 string tvOneDetectString;
tobyspark 30:873979018850 371 if (!ok)
tobyspark 30:873979018850 372 {
tobyspark 30:873979018850 373 tvOneDetectString = "TVOne: link failed";
tobyspark 30:873979018850 374 }
tobyspark 30:873979018850 375 else if (!RGB1 || !RGB2)
tobyspark 30:873979018850 376 {
tobyspark 30:873979018850 377 if (!RGB1 && !RGB2) tvOneDetectString = "TVOne: no sources";
tobyspark 30:873979018850 378 else if (!RGB1) tvOneDetectString = "TVOne: no right source";
tobyspark 30:873979018850 379 else if (!RGB2) tvOneDetectString = "TVOne: no left source";
tobyspark 30:873979018850 380 }
tobyspark 30:873979018850 381 else
tobyspark 30:873979018850 382 {
tobyspark 30:873979018850 383 tvOneDetectString = "TVOne: OK";
tobyspark 30:873979018850 384 }
tobyspark 30:873979018850 385
tobyspark 34:69dfe64e7e6b 386 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 34:69dfe64e7e6b 387 screen.textToBuffer(tvOneDetectString, kTVOneStatusLine);
tobyspark 34:69dfe64e7e6b 388
tobyspark 34:69dfe64e7e6b 389 // Assign appropriate source depending on whether DVI input is good
tobyspark 34:69dfe64e7e6b 390 // If that assign command completes ok, and the DVI input is good, finally flag the unit has had a live source
tobyspark 34:69dfe64e7e6b 391 // 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 392 if (ok && !tvOneRGB1Stable)
tobyspark 30:873979018850 393 {
tobyspark 34:69dfe64e7e6b 394 if (RGB1 && (sourceB != kTV1SourceRGB1)) ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB1);
tobyspark 34:69dfe64e7e6b 395 if (!RGB1 && (sourceB != kTV1SourceSIS2)) ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceSIS2); // Wierd: Can't set to SIS1 sometimes.
tobyspark 34:69dfe64e7e6b 396 if (ok && RGB1) tvOneRGB1Stable = true;
tobyspark 30:873979018850 397 }
tobyspark 34:69dfe64e7e6b 398 if (ok && !tvOneRGB2Stable)
tobyspark 34:69dfe64e7e6b 399 {
tobyspark 34:69dfe64e7e6b 400 if (RGB2 && (sourceA != kTV1SourceRGB2)) ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB2);
tobyspark 34:69dfe64e7e6b 401 if (!RGB2 && (sourceA != kTV1SourceSIS2)) ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceSIS2);
tobyspark 34:69dfe64e7e6b 402 if (ok && RGB2) tvOneRGB2Stable = true;
tobyspark 34:69dfe64e7e6b 403 }
tobyspark 30:873979018850 404
tobyspark 30:873979018850 405 return ok;
tobyspark 30:873979018850 406 }
tobyspark 30:873979018850 407
tobyspark 8:d46cc49f0f37 408 bool setKeyParamsTo(int index)
tobyspark 8:d46cc49f0f37 409 {
tobyspark 0:87aab40d5806 410 // Only spend the time uploading six parameters if we need to
tobyspark 0:87aab40d5806 411 // Might want to bounds check here
tobyspark 0:87aab40d5806 412
tobyspark 9:f83eadd8917a 413 bool ok;
tobyspark 0:87aab40d5806 414
tobyspark 0:87aab40d5806 415 if (index != keyerParamsSet)
tobyspark 0:87aab40d5806 416 {
tobyspark 31:01845a2347ff 417 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, settings.keyerParamSet(index)[SPKSettings::minY]);
tobyspark 31:01845a2347ff 418 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, settings.keyerParamSet(index)[SPKSettings::maxY]);
tobyspark 31:01845a2347ff 419 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, settings.keyerParamSet(index)[SPKSettings::minU]);
tobyspark 31:01845a2347ff 420 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, settings.keyerParamSet(index)[SPKSettings::maxU]);
tobyspark 31:01845a2347ff 421 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, settings.keyerParamSet(index)[SPKSettings::minV]);
tobyspark 31:01845a2347ff 422 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, settings.keyerParamSet(index)[SPKSettings::maxV]);
tobyspark 0:87aab40d5806 423
tobyspark 0:87aab40d5806 424 keyerParamsSet = index;
tobyspark 9:f83eadd8917a 425 }
tobyspark 9:f83eadd8917a 426 else
tobyspark 9:f83eadd8917a 427 {
tobyspark 9:f83eadd8917a 428 ok = true;
tobyspark 9:f83eadd8917a 429 }
tobyspark 0:87aab40d5806 430
tobyspark 0:87aab40d5806 431 return ok;
tobyspark 0:87aab40d5806 432 }
tobyspark 0:87aab40d5806 433
tobyspark 24:49c6624119ae 434 void actionMixMode()
tobyspark 24:49c6624119ae 435 {
tobyspark 31:01845a2347ff 436 if (debug) debug->printf("Changing mix mode \r\n");
tobyspark 31:01845a2347ff 437
tobyspark 24:49c6624119ae 438 bool ok = true;
tobyspark 25:3b519ef70341 439 string sentOK;
tobyspark 26:0299f8760715 440 char sentMSGBuffer[kStringBufferLength];
tobyspark 24:49c6624119ae 441
tobyspark 24:49c6624119ae 442 // Set Keyer
tobyspark 39:7d9a5eef93c9 443 if (mixMode < mixKey)
tobyspark 24:49c6624119ae 444 {
tobyspark 31:01845a2347ff 445 // Set Keyer Off. Quicker to set and fail than to test for on and then turn off
tobyspark 35:d5d9f0838f99 446 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false);
tobyspark 31:01845a2347ff 447
tobyspark 31:01845a2347ff 448 if (mixMode == mixBlend)
tobyspark 24:49c6624119ae 449 {
tobyspark 31:01845a2347ff 450 // Turn off Additive Mixing on output
tobyspark 31:01845a2347ff 451 ok = tvOne.command(0, kTV1WindowIDA, 0x298, 0);
tobyspark 31:01845a2347ff 452 snprintf(sentMSGBuffer, kStringBufferLength, "Blend");
tobyspark 24:49c6624119ae 453 }
tobyspark 31:01845a2347ff 454 if (mixMode == mixAdditive)
tobyspark 31:01845a2347ff 455 {
tobyspark 31:01845a2347ff 456 // 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 457 ok = tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 31:01845a2347ff 458 // Then turn on Additive Mixing
tobyspark 31:01845a2347ff 459 ok = ok && tvOne.command(0, kTV1WindowIDA, 0x298, 1);
tobyspark 31:01845a2347ff 460 snprintf(sentMSGBuffer, kStringBufferLength, "Additive");
tobyspark 31:01845a2347ff 461 }
tobyspark 24:49c6624119ae 462 }
tobyspark 24:49c6624119ae 463 else
tobyspark 24:49c6624119ae 464 {
tobyspark 39:7d9a5eef93c9 465 int index = mixModeMenu.selectedIndex() - mixKeyStartIndex;
tobyspark 25:3b519ef70341 466
tobyspark 24:49c6624119ae 467 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true);
tobyspark 24:49c6624119ae 468 ok = ok && setKeyParamsTo(index);
tobyspark 25:3b519ef70341 469
tobyspark 26:0299f8760715 470 snprintf(sentMSGBuffer, kStringBufferLength, "Keyer On with %i", index);
tobyspark 24:49c6624119ae 471 }
tobyspark 24:49c6624119ae 472
tobyspark 24:49c6624119ae 473 if (ok) sentOK = "Sent:";
tobyspark 24:49c6624119ae 474 else sentOK = "Send Error:";
tobyspark 24:49c6624119ae 475
tobyspark 24:49c6624119ae 476 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 25:3b519ef70341 477 screen.textToBuffer(sentOK + sentMSGBuffer, kTVOneStatusLine);
tobyspark 24:49c6624119ae 478 }
tobyspark 24:49c6624119ae 479
tobyspark 24:49c6624119ae 480
tobyspark 17:fc68d40b8b1f 481 bool conformProcessor()
tobyspark 17:fc68d40b8b1f 482 {
tobyspark 44:723e65413ebe 483 bool ok;
tobyspark 17:fc68d40b8b1f 484
tobyspark 17:fc68d40b8b1f 485 int32_t on = 1;
tobyspark 17:fc68d40b8b1f 486 int32_t off = 0;
tobyspark 17:fc68d40b8b1f 487 int32_t fit = 1;
tobyspark 38:2701101dcd56 488 int32_t oneToOne = 4;
tobyspark 17:fc68d40b8b1f 489
tobyspark 44:723e65413ebe 490 for (int i=0; i < 3; i++)
tobyspark 44:723e65413ebe 491 {
tobyspark 44:723e65413ebe 492 // Independent output
tobyspark 44:723e65413ebe 493 ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionMode, 2);
tobyspark 44:723e65413ebe 494 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputEnable, on);
tobyspark 44:723e65413ebe 495 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsLockMethod, off);
tobyspark 44:723e65413ebe 496
tobyspark 44:723e65413ebe 497 // Make sure our windows exist
tobyspark 44:723e65413ebe 498 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsEnable, on);
tobyspark 44:723e65413ebe 499 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsEnable, on);
tobyspark 44:723e65413ebe 500 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsLayerPriority, 0);
tobyspark 44:723e65413ebe 501 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsLayerPriority, 1);
tobyspark 44:723e65413ebe 502
tobyspark 44:723e65413ebe 503 // Assign inputs to windows, so that left on the crossfader is left on the processor viewed from front
tobyspark 44:723e65413ebe 504 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB2);
tobyspark 44:723e65413ebe 505 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, kTV1SourceRGB1);
tobyspark 44:723e65413ebe 506
tobyspark 44:723e65413ebe 507 // Set scaling to fit source within output, maintaining aspect ratio
tobyspark 44:723e65413ebe 508 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsZoomLevel, 100);
tobyspark 44:723e65413ebe 509 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsZoomLevel, 100);
tobyspark 44:723e65413ebe 510 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsShrinkEnable, off);
tobyspark 44:723e65413ebe 511 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsShrinkEnable, off);
tobyspark 44:723e65413ebe 512 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, fit);
tobyspark 44:723e65413ebe 513 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, fit);
tobyspark 44:723e65413ebe 514 ok = ok && tvOne.command(kTV1SourceSIS2, kTV1WindowIDA, kTV1FunctionAdjustSourceTestCard, 1);
tobyspark 44:723e65413ebe 515 ok = ok && tvOne.command(kTV1SourceSIS2, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, oneToOne);
tobyspark 44:723e65413ebe 516
tobyspark 44:723e65413ebe 517 // On source loss, hold on the last frame received.
tobyspark 44:723e65413ebe 518 int32_t freeze = 1;
tobyspark 44:723e65413ebe 519 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceOnSourceLoss, freeze);
tobyspark 44:723e65413ebe 520 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceOnSourceLoss, freeze);
tobyspark 44:723e65413ebe 521
tobyspark 44:723e65413ebe 522 // Set resolution and fade levels for maximum chance of being seen
tobyspark 44:723e65413ebe 523 ok = ok && tvOne.setResolution(kTV1ResolutionVGA, tvOneEDIDPassthrough ? EDIDPassthroughSlot : 5);
tobyspark 44:723e65413ebe 524 ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, 100);
tobyspark 44:723e65413ebe 525 ok = ok && tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, 100);
tobyspark 44:723e65413ebe 526
tobyspark 44:723e65413ebe 527 // Set evil, evil HDCP off
tobyspark 44:723e65413ebe 528 ok = ok && tvOne.setHDCPOn(false);
tobyspark 30:873979018850 529
tobyspark 44:723e65413ebe 530 if (ok) break;
tobyspark 44:723e65413ebe 531 else tvOne.increaseCommandPeriods(500);
tobyspark 44:723e65413ebe 532 }
tobyspark 40:bfddeb2a7fcf 533
tobyspark 44:723e65413ebe 534 if (ok)
tobyspark 44:723e65413ebe 535 {
tobyspark 44:723e65413ebe 536 // Save current state in preset one
tobyspark 44:723e65413ebe 537 tvOne.command(0, kTV1WindowIDA, kTV1FunctionPreset, 1); // Set Preset 1
tobyspark 44:723e65413ebe 538 tvOne.command(0, kTV1WindowIDA, kTV1FunctionPresetStore, 1); // Store
tobyspark 44:723e65413ebe 539
tobyspark 44:723e65413ebe 540 // Save current state for power on
tobyspark 44:723e65413ebe 541 tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 44:723e65413ebe 542 }
tobyspark 41:00d1cd3b2af2 543
tobyspark 44:723e65413ebe 544 tvOne.resetCommandPeriods();
tobyspark 41:00d1cd3b2af2 545
tobyspark 41:00d1cd3b2af2 546 return ok;
tobyspark 41:00d1cd3b2af2 547 }
tobyspark 41:00d1cd3b2af2 548
tobyspark 41:00d1cd3b2af2 549 bool uploadToProcessor()
tobyspark 41:00d1cd3b2af2 550 {
tobyspark 41:00d1cd3b2af2 551 bool ok = true;
tobyspark 41:00d1cd3b2af2 552
tobyspark 41:00d1cd3b2af2 553 LocalFileSystem local("local");
tobyspark 41:00d1cd3b2af2 554 FILE *file;
tobyspark 41:00d1cd3b2af2 555
tobyspark 34:69dfe64e7e6b 556 // Upload Matrox EDID to mem4 (ie. index 3). Use this EDID slot when setting Matrox resolutions.
tobyspark 44:723e65413ebe 557 if (tvOne.getProcessorType().version < 415)
tobyspark 44:723e65413ebe 558 {
tobyspark 44:723e65413ebe 559 if (debug) debug->printf("Skipping EDID upload as unsupported on detected TV One firmware\r\n");
tobyspark 44:723e65413ebe 560 }
tobyspark 44:723e65413ebe 561 else
tobyspark 34:69dfe64e7e6b 562 {
tobyspark 41:00d1cd3b2af2 563 file = fopen("/local/matroxe.did", "r"); // 8.3, avoid .bin as mbed executable extension
tobyspark 35:d5d9f0838f99 564 if (file)
tobyspark 34:69dfe64e7e6b 565 {
tobyspark 41:00d1cd3b2af2 566 ok = ok && tvOne.uploadEDID(file, 3);
tobyspark 35:d5d9f0838f99 567 fclose(file);
tobyspark 34:69dfe64e7e6b 568 }
tobyspark 35:d5d9f0838f99 569 else
tobyspark 35:d5d9f0838f99 570 {
tobyspark 44:723e65413ebe 571 if (debug) debug->printf("Could not open Matrox EDID file 'matroxe.did'\r\n");
tobyspark 35:d5d9f0838f99 572 }
tobyspark 34:69dfe64e7e6b 573 }
tobyspark 41:00d1cd3b2af2 574
tobyspark 41:00d1cd3b2af2 575 // Upload Logo to SIS2. Use this (minimal) image when no sources are connected.
tobyspark 41:00d1cd3b2af2 576 {
tobyspark 41:00d1cd3b2af2 577 file = fopen("/local/spark.dat", "r"); // 8.3, avoid .bin as mbed executable extension
tobyspark 41:00d1cd3b2af2 578 if (file)
tobyspark 41:00d1cd3b2af2 579 {
tobyspark 41:00d1cd3b2af2 580 ok = ok && tvOne.uploadImage(file, 1);
tobyspark 41:00d1cd3b2af2 581 fclose(file);
tobyspark 41:00d1cd3b2af2 582 }
tobyspark 41:00d1cd3b2af2 583 else
tobyspark 41:00d1cd3b2af2 584 {
tobyspark 41:00d1cd3b2af2 585 if (debug) debug->printf("Could not open image file 'spark.dat'");
tobyspark 41:00d1cd3b2af2 586 }
tobyspark 41:00d1cd3b2af2 587 }
tobyspark 17:fc68d40b8b1f 588
tobyspark 17:fc68d40b8b1f 589 return ok;
tobyspark 17:fc68d40b8b1f 590 }
tobyspark 17:fc68d40b8b1f 591
tobyspark 27:27851d3d2bba 592 void setResolutionMenuItems()
tobyspark 27:27851d3d2bba 593 {
tobyspark 27:27851d3d2bba 594 resolutionMenu.clearMenuItems();
tobyspark 27:27851d3d2bba 595 for (int i=0; i < settings.resolutionsCount(); i++)
tobyspark 27:27851d3d2bba 596 {
tobyspark 27:27851d3d2bba 597 resolutionMenu.addMenuItem(SPKMenuItem(settings.resolutionName(i), settings.resolutionIndex(i), settings.resolutionEDIDIndex(i)));
tobyspark 27:27851d3d2bba 598 }
tobyspark 27:27851d3d2bba 599 resolutionMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 27:27851d3d2bba 600 }
tobyspark 27:27851d3d2bba 601
tobyspark 27:27851d3d2bba 602 void setMixModeMenuItems()
tobyspark 27:27851d3d2bba 603 {
tobyspark 27:27851d3d2bba 604 mixModeMenu.clearMenuItems();
tobyspark 44:723e65413ebe 605
tobyspark 44:723e65413ebe 606 if (tvOne.getProcessorType().version == 423)
tobyspark 44:723e65413ebe 607 {
tobyspark 44:723e65413ebe 608 mixModeMenu.addMenuItem(SPKMenuItem("Crossfade", &mixModeAdditiveMenu));
tobyspark 44:723e65413ebe 609 }
tobyspark 44:723e65413ebe 610 else
tobyspark 44:723e65413ebe 611 {
tobyspark 44:723e65413ebe 612 mixModeMenu.addMenuItem(SPKMenuItem("Blend", mixBlend));
tobyspark 44:723e65413ebe 613 }
tobyspark 44:723e65413ebe 614
tobyspark 27:27851d3d2bba 615 for (int i=0; i < settings.keyerSetCount(); i++)
tobyspark 27:27851d3d2bba 616 {
tobyspark 36:8b5c75c8bc23 617 mixModeMenu.addMenuItem(SPKMenuItem(settings.keyerParamName(i), &mixModeKeyerMenuUpdate));
tobyspark 27:27851d3d2bba 618 }
tobyspark 27:27851d3d2bba 619 mixModeMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 27:27851d3d2bba 620 }
tobyspark 27:27851d3d2bba 621
tobyspark 27:27851d3d2bba 622 void setCommsMenuItems()
tobyspark 27:27851d3d2bba 623 {
tobyspark 27:27851d3d2bba 624 if (rj45Mode == rj45Ethernet)
tobyspark 27:27851d3d2bba 625 {
tobyspark 27:27851d3d2bba 626 commsMenu.title = "Network Mode [Ethernet]";
tobyspark 27:27851d3d2bba 627 commsMenu.clearMenuItems();
tobyspark 27:27851d3d2bba 628 commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
tobyspark 27:27851d3d2bba 629 commsMenu.addMenuItem(SPKMenuItem("OSC", commsOSC));
tobyspark 27:27851d3d2bba 630 commsMenu.addMenuItem(SPKMenuItem("ArtNet", commsArtNet));
tobyspark 27:27851d3d2bba 631 commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 33:e6672a9bd571 632 commsMenu = 0;
tobyspark 27:27851d3d2bba 633 }
tobyspark 27:27851d3d2bba 634 else if (rj45Mode == rj45DMX)
tobyspark 27:27851d3d2bba 635 {
tobyspark 27:27851d3d2bba 636 commsMenu.title = "Network Mode [DMX]";
tobyspark 27:27851d3d2bba 637 commsMenu.clearMenuItems();
tobyspark 27:27851d3d2bba 638 commsMenu.addMenuItem(SPKMenuItem("None", commsNone));
tobyspark 27:27851d3d2bba 639 commsMenu.addMenuItem(SPKMenuItem("DMX In", commsDMXIn));
tobyspark 27:27851d3d2bba 640 commsMenu.addMenuItem(SPKMenuItem("DMX Out", commsDMXOut));
tobyspark 27:27851d3d2bba 641 commsMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 33:e6672a9bd571 642 commsMenu = 0;
tobyspark 27:27851d3d2bba 643 }
tobyspark 27:27851d3d2bba 644 }
tobyspark 27:27851d3d2bba 645
tobyspark 0:87aab40d5806 646 int main()
tobyspark 0:87aab40d5806 647 {
tobyspark 0:87aab40d5806 648 if (debug)
tobyspark 0:87aab40d5806 649 {
tobyspark 0:87aab40d5806 650 debug->printf("\r\n\r\n");
tobyspark 0:87aab40d5806 651 debug->printf("*spark d-fuser -----------\r\n");
tobyspark 0:87aab40d5806 652 debug->printf(" debug channel\r\n");
tobyspark 0:87aab40d5806 653 }
tobyspark 2:50043054e4f7 654
tobyspark 2:50043054e4f7 655 // Set display font
tobyspark 2:50043054e4f7 656 screen.fontStartCharacter = &characterBytesStartChar;
tobyspark 2:50043054e4f7 657 screen.fontEndCharacter = &characterBytesEndChar;
tobyspark 2:50043054e4f7 658 screen.fontCharacters = characterBytes;
tobyspark 2:50043054e4f7 659
tobyspark 0:87aab40d5806 660 // Splash screen
tobyspark 30:873979018850 661 string softwareLine = "SW ";
tobyspark 30:873979018850 662 softwareLine += kSPKDFSoftwareVersion;
tobyspark 2:50043054e4f7 663 screen.imageToBuffer(spkDisplayLogo);
tobyspark 0:87aab40d5806 664 screen.textToBuffer("SPK:D-Fuser",0);
tobyspark 30:873979018850 665 screen.textToBuffer(softwareLine,1);
tobyspark 5:f8b285ca41ba 666 screen.sendBuffer();
tobyspark 0:87aab40d5806 667
tobyspark 11:0783cfbeb746 668 // Load saved settings
tobyspark 16:52484666b323 669 bool settingsAreCustom = false;
tobyspark 16:52484666b323 670 settingsAreCustom = settings.load(kSPKDFSettingsFilename);
tobyspark 30:873979018850 671 if (settingsAreCustom)
tobyspark 30:873979018850 672 {
tobyspark 30:873979018850 673 softwareLine += "; ini OK";
tobyspark 30:873979018850 674 screen.textToBuffer(softwareLine, 1);
tobyspark 30:873979018850 675 }
tobyspark 30:873979018850 676
tobyspark 0:87aab40d5806 677 // Set menu structure
tobyspark 0:87aab40d5806 678 mixModeMenu.title = "Mix Mode";
tobyspark 27:27851d3d2bba 679 setMixModeMenuItems();
tobyspark 24:49c6624119ae 680
tobyspark 29:95a7efe30527 681 mixModeAdditiveMenu.title = "Crossfade";
tobyspark 30:873979018850 682 mixModeAdditiveMenu.addMenuItem(SPKMenuItem("[title overridden]", &mixModeMenu, true));
tobyspark 36:8b5c75c8bc23 683
tobyspark 36:8b5c75c8bc23 684 mixModeKeyerMenuUpdate.title = "Update Keyer Settings?";
tobyspark 36:8b5c75c8bc23 685 mixModeKeyerMenuUpdate.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMaxY, true));
tobyspark 36:8b5c75c8bc23 686
tobyspark 36:8b5c75c8bc23 687 mixModeKeyerMenuMaxY.title = "UP until lighter gone";
tobyspark 36:8b5c75c8bc23 688 mixModeKeyerMenuMaxY.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMinY, true));
tobyspark 36:8b5c75c8bc23 689
tobyspark 36:8b5c75c8bc23 690 mixModeKeyerMenuMinY.title = "UP to bring back darker";
tobyspark 36:8b5c75c8bc23 691 mixModeKeyerMenuMinY.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMaxU, true));
tobyspark 36:8b5c75c8bc23 692
tobyspark 36:8b5c75c8bc23 693 mixModeKeyerMenuMaxU.title = "UP until lighter gone";
tobyspark 36:8b5c75c8bc23 694 mixModeKeyerMenuMaxU.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMinU, true));
tobyspark 36:8b5c75c8bc23 695
tobyspark 36:8b5c75c8bc23 696 mixModeKeyerMenuMinU.title = "UP to bring back darker";
tobyspark 36:8b5c75c8bc23 697 mixModeKeyerMenuMinU.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMaxV, true));
tobyspark 36:8b5c75c8bc23 698
tobyspark 36:8b5c75c8bc23 699 mixModeKeyerMenuMaxV.title = "UP until lighter gone";
tobyspark 36:8b5c75c8bc23 700 mixModeKeyerMenuMaxV.addMenuItem(SPKMenuItem("[title overridden]", &mixModeKeyerMenuMinV, true));
tobyspark 36:8b5c75c8bc23 701
tobyspark 36:8b5c75c8bc23 702 mixModeKeyerMenuMinV.title = "UP to bring back darker";
tobyspark 36:8b5c75c8bc23 703 mixModeKeyerMenuMinV.addMenuItem(SPKMenuItem("[title overridden]", &mixModeMenu, true));
tobyspark 36:8b5c75c8bc23 704
tobyspark 0:87aab40d5806 705
tobyspark 0:87aab40d5806 706 resolutionMenu.title = "Resolution";
tobyspark 27:27851d3d2bba 707 setResolutionMenuItems();
tobyspark 0:87aab40d5806 708
tobyspark 27:27851d3d2bba 709 commsMenu.title = "Network Mode";
tobyspark 27:27851d3d2bba 710 setCommsMenuItems();
tobyspark 23:909928cafb95 711
tobyspark 15:4b394c64b461 712 advancedMenu.title = "Troubleshooting";
tobyspark 23:909928cafb95 713 advancedMenu.addMenuItem(SPKMenuItem("HDCP Off", advancedHDCPOff));
tobyspark 23:909928cafb95 714 advancedMenu.addMenuItem(SPKMenuItem("HDCP On", advancedHDCPOn));
tobyspark 35:d5d9f0838f99 715 advancedMenu.addMenuItem(SPKMenuItem("EDID Passthrough", advancedEDIDPassthrough));
tobyspark 31:01845a2347ff 716 advancedMenu.addMenuItem(SPKMenuItem("EDID Internal", advancedEDIDInternal));
tobyspark 30:873979018850 717 advancedMenu.addMenuItem(SPKMenuItem("Test Processor Sources", advancedTestSources));
tobyspark 41:00d1cd3b2af2 718 advancedMenu.addMenuItem(SPKMenuItem("Revert Processor", advancedConformProcessor));
tobyspark 30:873979018850 719 if (settingsAreCustom) advancedMenu.addMenuItem(SPKMenuItem("Revert Controller", advancedLoadDefaults));
tobyspark 41:00d1cd3b2af2 720 advancedMenu.addMenuItem(SPKMenuItem("Conform Processor", advancedConformUploadProcessor));
tobyspark 24:49c6624119ae 721 advancedMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu));
tobyspark 23:909928cafb95 722
tobyspark 0:87aab40d5806 723 mainMenu.title = "Main Menu";
tobyspark 24:49c6624119ae 724 mainMenu.addMenuItem(SPKMenuItem(mixModeMenu.title, &mixModeMenu));
tobyspark 24:49c6624119ae 725 mainMenu.addMenuItem(SPKMenuItem(resolutionMenu.title, &resolutionMenu));
tobyspark 24:49c6624119ae 726 mainMenu.addMenuItem(SPKMenuItem(commsMenu.title, &commsMenu));
tobyspark 24:49c6624119ae 727 mainMenu.addMenuItem(SPKMenuItem(advancedMenu.title, &advancedMenu));
tobyspark 23:909928cafb95 728
tobyspark 0:87aab40d5806 729 selectedMenu = &mainMenu;
tobyspark 23:909928cafb95 730
tobyspark 0:87aab40d5806 731 // Misc I/O stuff
tobyspark 0:87aab40d5806 732
tobyspark 0:87aab40d5806 733 fadeAPO.period(0.001);
tobyspark 0:87aab40d5806 734 fadeBPO.period(0.001);
tobyspark 0:87aab40d5806 735
tobyspark 12:c270870bdd23 736 // Display menu and framing lines
tobyspark 0:87aab40d5806 737 screen.horizLineToBuffer(kMenuLine1*pixInPage - 1);
tobyspark 0:87aab40d5806 738 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 739 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 740 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 741 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 742 screen.horizLineToBuffer(kMenuLine2*pixInPage + pixInPage);
tobyspark 1:f9fca21102e0 743 screen.horizLineToBuffer(kCommsStatusLine*pixInPage - 1);
tobyspark 1:f9fca21102e0 744 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 34:69dfe64e7e6b 745 screen.textToBuffer("TVOne: OK", kTVOneStatusLine); // handleTVOneSources will update this
tobyspark 30:873979018850 746
tobyspark 30:873979018850 747 // If we do not have two solid sources, act on this as we rely on the window having a source for crossfade behaviour
tobyspark 30:873979018850 748 // 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 34:69dfe64e7e6b 749 bool ok = handleTVOneSources();
tobyspark 33:e6672a9bd571 750
tobyspark 33:e6672a9bd571 751 // Update display before starting mixer loop
tobyspark 33:e6672a9bd571 752 screen.sendBuffer();
tobyspark 33:e6672a9bd571 753
tobyspark 0:87aab40d5806 754 //// CONTROLS TEST
tobyspark 0:87aab40d5806 755
tobyspark 0:87aab40d5806 756 while (0) {
tobyspark 0:87aab40d5806 757 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 758 }
tobyspark 0:87aab40d5806 759
tobyspark 0:87aab40d5806 760 //// MIXER RUN
tobyspark 0:87aab40d5806 761
tobyspark 8:d46cc49f0f37 762 while (1)
tobyspark 8:d46cc49f0f37 763 {
tobyspark 35:d5d9f0838f99 764 bool updateMixMode = false;
tobyspark 35:d5d9f0838f99 765
tobyspark 1:f9fca21102e0 766 //// Task background things
tobyspark 33:e6672a9bd571 767 if ((osc || artNet) && rj45Mode == rj45Ethernet)
tobyspark 5:f8b285ca41ba 768 {
tobyspark 5:f8b285ca41ba 769 Net::poll();
tobyspark 5:f8b285ca41ba 770 }
tobyspark 5:f8b285ca41ba 771
tobyspark 5:f8b285ca41ba 772 //// RJ45 SWITCH
tobyspark 5:f8b285ca41ba 773
tobyspark 5:f8b285ca41ba 774 if (rj45ModeDIN != rj45Mode)
tobyspark 1:f9fca21102e0 775 {
tobyspark 23:909928cafb95 776 if (debug) debug->printf("Handling RJ45 mode change\r\n");
tobyspark 27:27851d3d2bba 777
tobyspark 5:f8b285ca41ba 778 // update state
tobyspark 5:f8b285ca41ba 779 rj45Mode = rj45ModeDIN;
tobyspark 27:27851d3d2bba 780
tobyspark 27:27851d3d2bba 781 setCommsMenuItems();
tobyspark 5:f8b285ca41ba 782
tobyspark 5:f8b285ca41ba 783 // cancel old comms
tobyspark 5:f8b285ca41ba 784 commsMode = commsNone;
tobyspark 5:f8b285ca41ba 785 commsMenu = commsMode;
tobyspark 5:f8b285ca41ba 786
tobyspark 5:f8b285ca41ba 787 // refresh display
tobyspark 23:909928cafb95 788 if (selectedMenu == &commsMenu)
tobyspark 23:909928cafb95 789 {
tobyspark 33:e6672a9bd571 790 screen.clearBufferRow(kMenuLine1);
tobyspark 33:e6672a9bd571 791 screen.clearBufferRow(kMenuLine2);
tobyspark 23:909928cafb95 792 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 23:909928cafb95 793 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 23:909928cafb95 794 }
tobyspark 5:f8b285ca41ba 795 if (rj45Mode == rj45Ethernet) screen.textToBuffer("RJ45: Ethernet Engaged", kCommsStatusLine);
tobyspark 5:f8b285ca41ba 796 if (rj45Mode == rj45DMX) screen.textToBuffer("RJ45: DMX Engaged", kCommsStatusLine);
tobyspark 1:f9fca21102e0 797 }
tobyspark 1:f9fca21102e0 798
tobyspark 0:87aab40d5806 799 //// MENU
tobyspark 0:87aab40d5806 800
tobyspark 0:87aab40d5806 801 int menuChange = menuEnc.getChange();
tobyspark 0:87aab40d5806 802
tobyspark 0:87aab40d5806 803 // Update GUI
tobyspark 0:87aab40d5806 804 if (menuChange != 0)
tobyspark 0:87aab40d5806 805 {
tobyspark 24:49c6624119ae 806 if (selectedMenu->selectedItem().handlingControls)
tobyspark 24:49c6624119ae 807 {
tobyspark 24:49c6624119ae 808 if (selectedMenu == &mixModeAdditiveMenu)
tobyspark 24:49c6624119ae 809 {
tobyspark 24:49c6624119ae 810 fadeCurve += menuChange * 0.05;
tobyspark 24:49c6624119ae 811 if (fadeCurve > 1.0f) fadeCurve = 1.0f;
tobyspark 24:49c6624119ae 812 if (fadeCurve < 0.0f) fadeCurve = 0.0f;
tobyspark 29:95a7efe30527 813
tobyspark 31:01845a2347ff 814 int newMixMode = (fadeCurve > 0.0f) ? mixAdditive: mixBlend;
tobyspark 31:01845a2347ff 815
tobyspark 31:01845a2347ff 816 if (newMixMode != mixMode)
tobyspark 31:01845a2347ff 817 {
tobyspark 31:01845a2347ff 818 mixMode = newMixMode;
tobyspark 35:d5d9f0838f99 819 updateMixMode = true;
tobyspark 31:01845a2347ff 820 }
tobyspark 29:95a7efe30527 821
tobyspark 24:49c6624119ae 822 screen.clearBufferRow(kMenuLine2);
tobyspark 29:95a7efe30527 823 screen.textToBuffer("Blend [ ----- ] Add", kMenuLine2);
tobyspark 29:95a7efe30527 824 screen.characterToBuffer('X', 38 + fadeCurve*20.0f, kMenuLine2);
tobyspark 24:49c6624119ae 825
tobyspark 31:01845a2347ff 826 if (debug) debug->printf("Fade curve changed by %i to %f \r\n", menuChange, fadeCurve);
tobyspark 24:49c6624119ae 827 }
tobyspark 36:8b5c75c8bc23 828 else if (selectedMenu == &mixModeKeyerMenuUpdate)
tobyspark 36:8b5c75c8bc23 829 {
tobyspark 36:8b5c75c8bc23 830 if (menuChange < 0)
tobyspark 36:8b5c75c8bc23 831 {
tobyspark 36:8b5c75c8bc23 832 settings.editingKeyerSetIndex = mixModeMenu.selectedIndex() - mixKeyStartIndex;
tobyspark 36:8b5c75c8bc23 833 screen.textToBuffer("[Yes/ ]", kMenuLine2);
tobyspark 36:8b5c75c8bc23 834 }
tobyspark 36:8b5c75c8bc23 835 else
tobyspark 36:8b5c75c8bc23 836 {
tobyspark 36:8b5c75c8bc23 837 settings.editingKeyerSetIndex = -1;
tobyspark 36:8b5c75c8bc23 838 screen.textToBuffer("[ /No]", kMenuLine2);
tobyspark 36:8b5c75c8bc23 839 }
tobyspark 36:8b5c75c8bc23 840 }
tobyspark 36:8b5c75c8bc23 841 else if (selectedMenu == &mixModeKeyerMenuMinY)
tobyspark 36:8b5c75c8bc23 842 {
tobyspark 36:8b5c75c8bc23 843 int value = settings.editingKeyerSetValue(SPKSettings::minY);
tobyspark 36:8b5c75c8bc23 844 value += menuChange;
tobyspark 36:8b5c75c8bc23 845 if (value < 0) value = 0;
tobyspark 36:8b5c75c8bc23 846 if (value > settings.editingKeyerSetValue(SPKSettings::maxY)) value = settings.editingKeyerSetValue(SPKSettings::maxY);
tobyspark 36:8b5c75c8bc23 847 settings.setEditingKeyerSetValue(SPKSettings::minY, value);
tobyspark 36:8b5c75c8bc23 848
tobyspark 36:8b5c75c8bc23 849 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 850
tobyspark 36:8b5c75c8bc23 851 char paramLine[kStringBufferLength];
tobyspark 37:744bef2e8be8 852 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][ / ][ / ]", value,
tobyspark 37:744bef2e8be8 853 settings.editingKeyerSetValue(SPKSettings::maxY));
tobyspark 36:8b5c75c8bc23 854 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 855
tobyspark 36:8b5c75c8bc23 856 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, value);
tobyspark 36:8b5c75c8bc23 857 }
tobyspark 36:8b5c75c8bc23 858 else if (selectedMenu == &mixModeKeyerMenuMaxY)
tobyspark 36:8b5c75c8bc23 859 {
tobyspark 36:8b5c75c8bc23 860 int value = settings.editingKeyerSetValue(SPKSettings::maxY);
tobyspark 36:8b5c75c8bc23 861 value += menuChange;
tobyspark 36:8b5c75c8bc23 862 if (value < 0) value = 0;
tobyspark 36:8b5c75c8bc23 863 if (value > 255) value = 255;
tobyspark 36:8b5c75c8bc23 864 settings.setEditingKeyerSetValue(SPKSettings::maxY, value);
tobyspark 36:8b5c75c8bc23 865
tobyspark 36:8b5c75c8bc23 866 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 867
tobyspark 36:8b5c75c8bc23 868 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 869 snprintf(paramLine, kStringBufferLength, "[ /%3i][ / ][ / ]", value);
tobyspark 36:8b5c75c8bc23 870 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 871
tobyspark 36:8b5c75c8bc23 872 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, value);
tobyspark 36:8b5c75c8bc23 873 }
tobyspark 36:8b5c75c8bc23 874 else if (selectedMenu == &mixModeKeyerMenuMinU)
tobyspark 36:8b5c75c8bc23 875 {
tobyspark 36:8b5c75c8bc23 876 int value = settings.editingKeyerSetValue(SPKSettings::minU);
tobyspark 36:8b5c75c8bc23 877 value += menuChange;
tobyspark 36:8b5c75c8bc23 878 if (value > settings.editingKeyerSetValue(SPKSettings::maxU)) value = settings.editingKeyerSetValue(SPKSettings::maxU);
tobyspark 36:8b5c75c8bc23 879 if (value > 255) value = 255;
tobyspark 36:8b5c75c8bc23 880 settings.setEditingKeyerSetValue(SPKSettings::minU, value);
tobyspark 36:8b5c75c8bc23 881
tobyspark 36:8b5c75c8bc23 882 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 883
tobyspark 36:8b5c75c8bc23 884 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 885 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][ / ]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 886 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 37:744bef2e8be8 887 value,
tobyspark 37:744bef2e8be8 888 settings.editingKeyerSetValue(SPKSettings::maxU));
tobyspark 36:8b5c75c8bc23 889 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 890
tobyspark 36:8b5c75c8bc23 891 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, value);
tobyspark 36:8b5c75c8bc23 892 }
tobyspark 36:8b5c75c8bc23 893 else if (selectedMenu == &mixModeKeyerMenuMaxU)
tobyspark 36:8b5c75c8bc23 894 {
tobyspark 36:8b5c75c8bc23 895 int value = settings.editingKeyerSetValue(SPKSettings::maxU);
tobyspark 36:8b5c75c8bc23 896 value += menuChange;
tobyspark 36:8b5c75c8bc23 897 if (value < 0) value = 0;
tobyspark 36:8b5c75c8bc23 898 if (value > 255) value = 255;
tobyspark 36:8b5c75c8bc23 899 settings.setEditingKeyerSetValue(SPKSettings::maxU, value);
tobyspark 36:8b5c75c8bc23 900
tobyspark 36:8b5c75c8bc23 901 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 902
tobyspark 36:8b5c75c8bc23 903 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 904 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][ /%3i][ / ]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 905 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 36:8b5c75c8bc23 906 value);
tobyspark 36:8b5c75c8bc23 907 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 908
tobyspark 36:8b5c75c8bc23 909 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, value);
tobyspark 36:8b5c75c8bc23 910 }
tobyspark 36:8b5c75c8bc23 911 else if (selectedMenu == &mixModeKeyerMenuMinV)
tobyspark 36:8b5c75c8bc23 912 {
tobyspark 36:8b5c75c8bc23 913 int value = settings.editingKeyerSetValue(SPKSettings::minV);
tobyspark 36:8b5c75c8bc23 914 value += menuChange;
tobyspark 36:8b5c75c8bc23 915 if (value > settings.editingKeyerSetValue(SPKSettings::maxV)) value = settings.editingKeyerSetValue(SPKSettings::maxV);
tobyspark 36:8b5c75c8bc23 916 if (value > 255) value = 255;
tobyspark 36:8b5c75c8bc23 917 settings.setEditingKeyerSetValue(SPKSettings::minV, value);
tobyspark 36:8b5c75c8bc23 918
tobyspark 36:8b5c75c8bc23 919 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 920
tobyspark 36:8b5c75c8bc23 921 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 922 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][%3i/%3i]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 923 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 36:8b5c75c8bc23 924 settings.editingKeyerSetValue(SPKSettings::minU),
tobyspark 37:744bef2e8be8 925 settings.editingKeyerSetValue(SPKSettings::maxU),
tobyspark 37:744bef2e8be8 926 value,
tobyspark 37:744bef2e8be8 927 settings.editingKeyerSetValue(SPKSettings::maxV));
tobyspark 36:8b5c75c8bc23 928 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 929
tobyspark 36:8b5c75c8bc23 930 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, value);
tobyspark 36:8b5c75c8bc23 931 }
tobyspark 36:8b5c75c8bc23 932 else if (selectedMenu == &mixModeKeyerMenuMaxV)
tobyspark 36:8b5c75c8bc23 933 {
tobyspark 36:8b5c75c8bc23 934 int value = settings.editingKeyerSetValue(SPKSettings::maxV);
tobyspark 36:8b5c75c8bc23 935 value += menuChange;
tobyspark 36:8b5c75c8bc23 936 if (value < 0) value = 0;
tobyspark 36:8b5c75c8bc23 937 if (value > 255) value = 255;
tobyspark 36:8b5c75c8bc23 938 settings.setEditingKeyerSetValue(SPKSettings::maxV, value);
tobyspark 36:8b5c75c8bc23 939
tobyspark 36:8b5c75c8bc23 940 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 941
tobyspark 36:8b5c75c8bc23 942 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 943 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][ /%3i]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 944 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 36:8b5c75c8bc23 945 settings.editingKeyerSetValue(SPKSettings::minU),
tobyspark 36:8b5c75c8bc23 946 settings.editingKeyerSetValue(SPKSettings::maxU),
tobyspark 36:8b5c75c8bc23 947 value);
tobyspark 36:8b5c75c8bc23 948 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 949
tobyspark 36:8b5c75c8bc23 950 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, value);
tobyspark 36:8b5c75c8bc23 951 }
tobyspark 24:49c6624119ae 952 }
tobyspark 24:49c6624119ae 953 else
tobyspark 24:49c6624119ae 954 {
tobyspark 24:49c6624119ae 955 if (debug) debug->printf("Menu changed by %i\r\n", menuChange);
tobyspark 24:49c6624119ae 956
tobyspark 24:49c6624119ae 957 *selectedMenu = selectedMenu->selectedIndex() + menuChange;
tobyspark 24:49c6624119ae 958
tobyspark 24:49c6624119ae 959 // update OLED line 2 here
tobyspark 24:49c6624119ae 960 screen.clearBufferRow(kMenuLine2);
tobyspark 24:49c6624119ae 961 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 24:49c6624119ae 962
tobyspark 24:49c6624119ae 963 if (debug) debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 24:49c6624119ae 964 }
tobyspark 0:87aab40d5806 965 }
tobyspark 0:87aab40d5806 966
tobyspark 0:87aab40d5806 967 // Action menu item
tobyspark 0:87aab40d5806 968 if (menuEnc.hasPressed())
tobyspark 0:87aab40d5806 969 {
tobyspark 0:87aab40d5806 970 if (debug) debug->printf("Action Menu Item!\r\n");
tobyspark 21:f9d63cb7cedb 971
tobyspark 0:87aab40d5806 972 // Are we changing menus?
tobyspark 23:909928cafb95 973 if (selectedMenu->selectedItem().type == SPKMenuItem::changesToMenu)
tobyspark 0:87aab40d5806 974 {
tobyspark 31:01845a2347ff 975 // If we're exiting the menu, we should set its selected index back to the menu's beginning...
tobyspark 31:01845a2347ff 976 SPKMenu* menuToReset = selectedMenu->selectedItem().payload.menu == &mainMenu? selectedMenu : NULL;
tobyspark 31:01845a2347ff 977
tobyspark 31:01845a2347ff 978 // point selected menu pointer to the new menu pointer
tobyspark 23:909928cafb95 979 selectedMenu = selectedMenu->selectedItem().payload.menu;
tobyspark 0:87aab40d5806 980
tobyspark 31:01845a2347ff 981 // ...doing this, of course, after we've used the value
tobyspark 31:01845a2347ff 982 if (menuToReset) *menuToReset = 0;
tobyspark 31:01845a2347ff 983
tobyspark 0:87aab40d5806 984 // update OLED lines 1&2
tobyspark 0:87aab40d5806 985 screen.clearBufferRow(kMenuLine1);
tobyspark 0:87aab40d5806 986 screen.clearBufferRow(kMenuLine2);
tobyspark 0:87aab40d5806 987 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 0:87aab40d5806 988 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 0:87aab40d5806 989
tobyspark 0:87aab40d5806 990 if (debug)
tobyspark 0:87aab40d5806 991 {
tobyspark 0:87aab40d5806 992 debug->printf("\r\n");
tobyspark 0:87aab40d5806 993 debug->printf("%s \r\n", selectedMenu->title.c_str());
tobyspark 0:87aab40d5806 994 debug->printf("%s \r\n", selectedMenu->selectedString().c_str());
tobyspark 0:87aab40d5806 995 }
tobyspark 24:49c6624119ae 996
tobyspark 24:49c6624119ae 997 // Are we changing menus that should have a command attached?
tobyspark 24:49c6624119ae 998 if (selectedMenu == &mixModeAdditiveMenu)
tobyspark 24:49c6624119ae 999 {
tobyspark 29:95a7efe30527 1000 screen.clearBufferRow(kMenuLine2);
tobyspark 29:95a7efe30527 1001 screen.textToBuffer("Blend [ ----- ] Add", kMenuLine2);
tobyspark 29:95a7efe30527 1002 screen.characterToBuffer('X', 38 + fadeCurve*20.0f, kMenuLine2);
tobyspark 29:95a7efe30527 1003
tobyspark 29:95a7efe30527 1004 mixMode = fadeCurve > 0 ? mixAdditive : mixBlend;
tobyspark 35:d5d9f0838f99 1005 updateMixMode = true;
tobyspark 24:49c6624119ae 1006 }
tobyspark 36:8b5c75c8bc23 1007 else if (selectedMenu == &mixModeKeyerMenuUpdate)
tobyspark 36:8b5c75c8bc23 1008 {
tobyspark 36:8b5c75c8bc23 1009 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 1010 if (settings.editingKeyerSetIndex == mixModeMenu.selectedIndex() - mixKeyStartIndex)
tobyspark 36:8b5c75c8bc23 1011 screen.textToBuffer("[Yes/ ]", kMenuLine2);
tobyspark 36:8b5c75c8bc23 1012 else
tobyspark 36:8b5c75c8bc23 1013 screen.textToBuffer("[ /No]", kMenuLine2);
tobyspark 36:8b5c75c8bc23 1014
tobyspark 36:8b5c75c8bc23 1015 mixMode = mixKey;
tobyspark 36:8b5c75c8bc23 1016 updateMixMode = true;
tobyspark 36:8b5c75c8bc23 1017 }
tobyspark 36:8b5c75c8bc23 1018 else if (selectedMenu == &mixModeKeyerMenuMinY)
tobyspark 36:8b5c75c8bc23 1019 {
tobyspark 36:8b5c75c8bc23 1020 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 1021 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 1022 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][ / ][ / ]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 1023 settings.editingKeyerSetValue(SPKSettings::maxY));
tobyspark 36:8b5c75c8bc23 1024 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 1025 }
tobyspark 36:8b5c75c8bc23 1026 else if (selectedMenu == &mixModeKeyerMenuMaxY)
tobyspark 36:8b5c75c8bc23 1027 {
tobyspark 36:8b5c75c8bc23 1028 // First, check outcome of menu that got us here: mixModeKeyerMenuUpdate
tobyspark 36:8b5c75c8bc23 1029 if (settings.editingKeyerSetIndex == -1)
tobyspark 36:8b5c75c8bc23 1030 {
tobyspark 36:8b5c75c8bc23 1031 selectedMenu = &mixModeMenu;
tobyspark 36:8b5c75c8bc23 1032
tobyspark 36:8b5c75c8bc23 1033 // update OLED lines 1&2
tobyspark 36:8b5c75c8bc23 1034 screen.clearBufferRow(kMenuLine1);
tobyspark 36:8b5c75c8bc23 1035 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 1036 screen.textToBuffer(selectedMenu->title, kMenuLine1);
tobyspark 36:8b5c75c8bc23 1037 screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2);
tobyspark 36:8b5c75c8bc23 1038 }
tobyspark 36:8b5c75c8bc23 1039 else
tobyspark 36:8b5c75c8bc23 1040 {
tobyspark 36:8b5c75c8bc23 1041 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 1042 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 1043 snprintf(paramLine, kStringBufferLength, "[ /%3i][ / ][ / ]", settings.editingKeyerSetValue(SPKSettings::maxY));
tobyspark 36:8b5c75c8bc23 1044 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 1045 }
tobyspark 36:8b5c75c8bc23 1046 }
tobyspark 36:8b5c75c8bc23 1047 else if (selectedMenu == &mixModeKeyerMenuMinU)
tobyspark 36:8b5c75c8bc23 1048 {
tobyspark 36:8b5c75c8bc23 1049 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 1050 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 1051 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][ / ]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 1052 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 36:8b5c75c8bc23 1053 settings.editingKeyerSetValue(SPKSettings::minU),
tobyspark 36:8b5c75c8bc23 1054 settings.editingKeyerSetValue(SPKSettings::maxU));
tobyspark 36:8b5c75c8bc23 1055 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 1056 }
tobyspark 36:8b5c75c8bc23 1057 else if (selectedMenu == &mixModeKeyerMenuMaxU)
tobyspark 36:8b5c75c8bc23 1058 {
tobyspark 36:8b5c75c8bc23 1059 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 1060 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 1061 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][ /%3i][ / ]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 1062 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 36:8b5c75c8bc23 1063 settings.editingKeyerSetValue(SPKSettings::maxU));
tobyspark 36:8b5c75c8bc23 1064 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 1065 }
tobyspark 36:8b5c75c8bc23 1066 else if (selectedMenu == &mixModeKeyerMenuMinV)
tobyspark 36:8b5c75c8bc23 1067 {
tobyspark 36:8b5c75c8bc23 1068 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 1069 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 1070 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][%3i/%3i]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 1071 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 36:8b5c75c8bc23 1072 settings.editingKeyerSetValue(SPKSettings::minU),
tobyspark 36:8b5c75c8bc23 1073 settings.editingKeyerSetValue(SPKSettings::maxU),
tobyspark 36:8b5c75c8bc23 1074 settings.editingKeyerSetValue(SPKSettings::minV),
tobyspark 36:8b5c75c8bc23 1075 settings.editingKeyerSetValue(SPKSettings::maxV));
tobyspark 36:8b5c75c8bc23 1076 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 1077 }
tobyspark 36:8b5c75c8bc23 1078 else if (selectedMenu == &mixModeKeyerMenuMaxV)
tobyspark 36:8b5c75c8bc23 1079 {
tobyspark 36:8b5c75c8bc23 1080 char paramLine[kStringBufferLength];
tobyspark 36:8b5c75c8bc23 1081 screen.clearBufferRow(kMenuLine2);
tobyspark 36:8b5c75c8bc23 1082 snprintf(paramLine, kStringBufferLength, "[%3i/%3i][%3i/%3i][ /%3i]", settings.editingKeyerSetValue(SPKSettings::minY),
tobyspark 36:8b5c75c8bc23 1083 settings.editingKeyerSetValue(SPKSettings::maxY),
tobyspark 36:8b5c75c8bc23 1084 settings.editingKeyerSetValue(SPKSettings::minU),
tobyspark 36:8b5c75c8bc23 1085 settings.editingKeyerSetValue(SPKSettings::maxU),
tobyspark 36:8b5c75c8bc23 1086 settings.editingKeyerSetValue(SPKSettings::maxV));
tobyspark 36:8b5c75c8bc23 1087 screen.textToBuffer(paramLine, kMenuLine2);
tobyspark 36:8b5c75c8bc23 1088 }
tobyspark 0:87aab40d5806 1089 }
tobyspark 0:87aab40d5806 1090 // With that out of the way, we should be actioning a specific menu's payload?
tobyspark 44:723e65413ebe 1091 else if (selectedMenu == &mixModeMenu)
tobyspark 44:723e65413ebe 1092 {
tobyspark 44:723e65413ebe 1093 // mixAdditive and mixKeyXYZ are now SPKMenus so are handled above.
tobyspark 44:723e65413ebe 1094 // This should only ever do mixBlend for non d-fuser firmware processors
tobyspark 44:723e65413ebe 1095 mixMode = mixModeMenu.selectedItem().payload.command[0];
tobyspark 44:723e65413ebe 1096 updateMixMode = true;
tobyspark 44:723e65413ebe 1097 }
tobyspark 0:87aab40d5806 1098 else if (selectedMenu == &resolutionMenu)
tobyspark 0:87aab40d5806 1099 {
tobyspark 44:723e65413ebe 1100 bool ok;
tobyspark 31:01845a2347ff 1101 int32_t slot = tvOneEDIDPassthrough ? EDIDPassthroughSlot : resolutionMenu.selectedItem().payload.command[1];
tobyspark 31:01845a2347ff 1102
tobyspark 44:723e65413ebe 1103 ok = tvOne.setResolution(resolutionMenu.selectedItem().payload.command[0], slot);
tobyspark 0:87aab40d5806 1104
tobyspark 35:d5d9f0838f99 1105 // Save new resolution and EDID into TV One unit for power-on. Cycling TV One power sometimes needed for EDID. Pffft.
tobyspark 44:723e65413ebe 1106 if (ok) tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1);
tobyspark 35:d5d9f0838f99 1107
tobyspark 25:3b519ef70341 1108 string sentOK;
tobyspark 0:87aab40d5806 1109 if (ok) sentOK = "Sent: ";
tobyspark 0:87aab40d5806 1110 else sentOK = "Send Error: ";
tobyspark 0:87aab40d5806 1111
tobyspark 26:0299f8760715 1112 char sentMSGBuffer[kStringBufferLength];
tobyspark 26:0299f8760715 1113 snprintf(sentMSGBuffer, kStringBufferLength,"Res %i, EDID %i", resolutionMenu.selectedItem().payload.command[0], resolutionMenu.selectedItem().payload.command[1]);
tobyspark 0:87aab40d5806 1114
tobyspark 1:f9fca21102e0 1115 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 25:3b519ef70341 1116 screen.textToBuffer(sentOK + sentMSGBuffer, kTVOneStatusLine);
tobyspark 0:87aab40d5806 1117
tobyspark 0:87aab40d5806 1118 if (debug) { debug->printf("Changing resolution"); }
tobyspark 0:87aab40d5806 1119 }
tobyspark 1:f9fca21102e0 1120 else if (selectedMenu == &commsMenu)
tobyspark 1:f9fca21102e0 1121 {
tobyspark 26:0299f8760715 1122 string commsTypeString = "Network:";
tobyspark 26:0299f8760715 1123 char commsStatusBuffer[kStringBufferLength] = "--";
tobyspark 1:f9fca21102e0 1124
tobyspark 1:f9fca21102e0 1125 // Tear down any existing comms
tobyspark 1:f9fca21102e0 1126 // This is the action of commsNone
tobyspark 1:f9fca21102e0 1127 // And also clears the way for other comms actions
tobyspark 26:0299f8760715 1128 commsMode = commsNone;
tobyspark 5:f8b285ca41ba 1129 if (osc) {delete osc; osc = NULL;}
tobyspark 5:f8b285ca41ba 1130 if (ethernet) {delete ethernet; ethernet = NULL;}
tobyspark 33:e6672a9bd571 1131 if (artNet)
tobyspark 33:e6672a9bd571 1132 {
tobyspark 33:e6672a9bd571 1133 artNet->ArtPollReply.NumPorts = 0;
tobyspark 33:e6672a9bd571 1134 strcpy(artNet->ArtPollReply.NodeReport, "Shutdown");
tobyspark 33:e6672a9bd571 1135 artNet->SendArtPollReply();
tobyspark 33:e6672a9bd571 1136 artNet->Done();
tobyspark 33:e6672a9bd571 1137 delete artNet;
tobyspark 33:e6672a9bd571 1138 artNet = NULL;
tobyspark 33:e6672a9bd571 1139 }
tobyspark 5:f8b285ca41ba 1140 if (dmx) {delete dmx; dmx = NULL;}
tobyspark 5:f8b285ca41ba 1141
tobyspark 5:f8b285ca41ba 1142 // Ensure we can't change to comms modes the hardware isn't switched to
tobyspark 23:909928cafb95 1143 if (rj45Mode == rj45DMX && (commsMenu.selectedItem().payload.command[0] == commsOSC || commsMenu.selectedItem().payload.command[0] == commsArtNet))
tobyspark 1:f9fca21102e0 1144 {
tobyspark 5:f8b285ca41ba 1145 commsTypeString = "RJ45 not in Ethernet mode";
tobyspark 5:f8b285ca41ba 1146 }
tobyspark 23:909928cafb95 1147 else if (rj45Mode == rj45Ethernet && (commsMenu.selectedItem().payload.command[0] == commsDMXIn || commsMenu.selectedItem().payload.command[0] == commsDMXOut))
tobyspark 5:f8b285ca41ba 1148 {
tobyspark 5:f8b285ca41ba 1149 commsTypeString = "RJ45 not in DMX mode";
tobyspark 5:f8b285ca41ba 1150 }
tobyspark 5:f8b285ca41ba 1151 // Action!
tobyspark 23:909928cafb95 1152 else if (commsMenu.selectedItem().payload.command[0] == commsOSC)
tobyspark 5:f8b285ca41ba 1153 {
tobyspark 5:f8b285ca41ba 1154 commsMode = commsOSC;
tobyspark 5:f8b285ca41ba 1155 commsTypeString = "OSC: ";
tobyspark 1:f9fca21102e0 1156
tobyspark 1:f9fca21102e0 1157 ethernet = new EthernetNetIf(
tobyspark 1:f9fca21102e0 1158 IpAddr(kOSCMbedIPAddress),
tobyspark 1:f9fca21102e0 1159 IpAddr(kOSCMbedSubnetMask),
tobyspark 1:f9fca21102e0 1160 IpAddr(kOSCMbedGateway),
tobyspark 1:f9fca21102e0 1161 IpAddr(kOSCMbedDNS)
tobyspark 1:f9fca21102e0 1162 );
tobyspark 3:033d2b7768f3 1163
tobyspark 1:f9fca21102e0 1164 EthernetErr ethError = ethernet->setup();
tobyspark 1:f9fca21102e0 1165 if(ethError)
tobyspark 1:f9fca21102e0 1166 {
tobyspark 1:f9fca21102e0 1167 if (debug) debug->printf("Ethernet setup error, %d", ethError);
tobyspark 26:0299f8760715 1168 snprintf(commsStatusBuffer, kStringBufferLength, "Ethernet setup failed");
tobyspark 5:f8b285ca41ba 1169 commsMenu = commsNone;
tobyspark 1:f9fca21102e0 1170 // break out of here. this setup should be a function that returns a boolean
tobyspark 1:f9fca21102e0 1171 }
tobyspark 1:f9fca21102e0 1172
tobyspark 1:f9fca21102e0 1173 osc = new OSCClass();
tobyspark 33:e6672a9bd571 1174 osc->setReceiveMessage(&receiveMessage);
tobyspark 1:f9fca21102e0 1175 osc->begin(kOSCMbedPort);
tobyspark 1:f9fca21102e0 1176
tobyspark 26:0299f8760715 1177 snprintf(commsStatusBuffer, kStringBufferLength, "Listening on %i", kOSCMbedPort);
tobyspark 1:f9fca21102e0 1178 }
tobyspark 23:909928cafb95 1179 else if (commsMenu.selectedItem().payload.command[0] == commsArtNet)
tobyspark 1:f9fca21102e0 1180 {
tobyspark 5:f8b285ca41ba 1181 commsMode = commsArtNet;
tobyspark 5:f8b285ca41ba 1182 commsTypeString = "ArtNet: ";
tobyspark 3:033d2b7768f3 1183
tobyspark 3:033d2b7768f3 1184 artNet = new DmxArtNet();
tobyspark 1:f9fca21102e0 1185
tobyspark 3:033d2b7768f3 1186 artNet->BindIpAddress = IpAddr(kArtNetBindIPAddress);
tobyspark 3:033d2b7768f3 1187 artNet->BCastAddress = IpAddr(kArtNetBroadcastAddress);
tobyspark 3:033d2b7768f3 1188
tobyspark 3:033d2b7768f3 1189 artNet->InitArtPollReplyDefaults();
tobyspark 3:033d2b7768f3 1190
tobyspark 33:e6672a9bd571 1191 artNet->ArtPollReply.PortType[0] = 128; // Bit 7 = Set is this channel can output data from the Art-Net Network.
tobyspark 33:e6672a9bd571 1192 artNet->ArtPollReply.GoodOutput[0] = 128; // Bit 7 = Set – Data is being transmitted.
tobyspark 33:e6672a9bd571 1193 artNet->ArtPollReply.PortType[2] = 64; // Bit 6 = Set if this channel can input onto the Art-NetNetwork.
tobyspark 33:e6672a9bd571 1194 artNet->ArtPollReply.GoodInput[2] = 128; // Bit 7 = Set – Data received.
tobyspark 3:033d2b7768f3 1195
tobyspark 3:033d2b7768f3 1196 artNet->Init();
tobyspark 3:033d2b7768f3 1197 artNet->SendArtPollReply(); // announce to art-net nodes
tobyspark 3:033d2b7768f3 1198
tobyspark 26:0299f8760715 1199 snprintf(commsStatusBuffer, kStringBufferLength, "Listening");
tobyspark 1:f9fca21102e0 1200 }
tobyspark 23:909928cafb95 1201 else if (commsMenu.selectedItem().payload.command[0] == commsDMXIn)
tobyspark 1:f9fca21102e0 1202 {
tobyspark 5:f8b285ca41ba 1203 commsMode = commsDMXIn;
tobyspark 5:f8b285ca41ba 1204 commsTypeString = "DMX In: ";
tobyspark 1:f9fca21102e0 1205
tobyspark 5:f8b285ca41ba 1206 dmxDirectionDOUT = 0;
tobyspark 5:f8b285ca41ba 1207
tobyspark 5:f8b285ca41ba 1208 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 1:f9fca21102e0 1209 }
tobyspark 23:909928cafb95 1210 else if (commsMenu.selectedItem().payload.command[0] == commsDMXOut)
tobyspark 5:f8b285ca41ba 1211 {
tobyspark 5:f8b285ca41ba 1212 commsMode = commsDMXOut;
tobyspark 5:f8b285ca41ba 1213 commsTypeString = "DMX Out: ";
tobyspark 5:f8b285ca41ba 1214
tobyspark 5:f8b285ca41ba 1215 dmxDirectionDOUT = 1;
tobyspark 5:f8b285ca41ba 1216
tobyspark 5:f8b285ca41ba 1217 dmx = new DMX(kMBED_RS485_TTLTX, kMBED_RS485_TTLRX);
tobyspark 5:f8b285ca41ba 1218 }
tobyspark 5:f8b285ca41ba 1219
tobyspark 1:f9fca21102e0 1220 screen.clearBufferRow(kCommsStatusLine);
tobyspark 25:3b519ef70341 1221 screen.textToBuffer(commsTypeString + commsStatusBuffer, kCommsStatusLine);
tobyspark 1:f9fca21102e0 1222 }
tobyspark 12:c270870bdd23 1223 else if (selectedMenu == &advancedMenu)
tobyspark 12:c270870bdd23 1224 {
tobyspark 23:909928cafb95 1225 if (advancedMenu.selectedItem().payload.command[0] == advancedHDCPOff)
tobyspark 12:c270870bdd23 1226 {
tobyspark 31:01845a2347ff 1227 bool ok;
tobyspark 12:c270870bdd23 1228
tobyspark 15:4b394c64b461 1229 ok = tvOne.setHDCPOn(false);
tobyspark 12:c270870bdd23 1230
tobyspark 12:c270870bdd23 1231 std::string sendOK = ok ? "Sent: HDCP Off" : "Send Error: HDCP Off";
tobyspark 12:c270870bdd23 1232
tobyspark 12:c270870bdd23 1233 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 12:c270870bdd23 1234 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 12:c270870bdd23 1235 }
tobyspark 23:909928cafb95 1236 else if (advancedMenu.selectedItem().payload.command[0] == advancedHDCPOn)
tobyspark 15:4b394c64b461 1237 {
tobyspark 31:01845a2347ff 1238 bool ok;
tobyspark 15:4b394c64b461 1239
tobyspark 15:4b394c64b461 1240 ok = tvOne.setHDCPOn(true);
tobyspark 15:4b394c64b461 1241
tobyspark 15:4b394c64b461 1242 std::string sendOK = ok ? "Sent: HDCP On" : "Send Error: HDCP On";
tobyspark 15:4b394c64b461 1243
tobyspark 15:4b394c64b461 1244 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 15:4b394c64b461 1245 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 15:4b394c64b461 1246 }
tobyspark 31:01845a2347ff 1247 else if (advancedMenu.selectedItem().payload.command[0] == advancedEDIDPassthrough)
tobyspark 31:01845a2347ff 1248 {
tobyspark 31:01845a2347ff 1249 tvOneEDIDPassthrough = true;
tobyspark 31:01845a2347ff 1250
tobyspark 31:01845a2347ff 1251 bool ok = true;
tobyspark 31:01845a2347ff 1252
tobyspark 31:01845a2347ff 1253 int32_t slot = tvOneEDIDPassthrough ? EDIDPassthroughSlot : resolutionMenu.selectedItem().payload.command[1];
tobyspark 31:01845a2347ff 1254
tobyspark 31:01845a2347ff 1255 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 1256 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 1257
tobyspark 31:01845a2347ff 1258 std::string sendOK = ok ? "Sent: EDID. Next:conform?" : "Send Error: EDID";
tobyspark 31:01845a2347ff 1259
tobyspark 31:01845a2347ff 1260 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 31:01845a2347ff 1261 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 31:01845a2347ff 1262 }
tobyspark 31:01845a2347ff 1263 else if (advancedMenu.selectedItem().payload.command[0] == advancedEDIDInternal)
tobyspark 31:01845a2347ff 1264 {
tobyspark 31:01845a2347ff 1265 tvOneEDIDPassthrough = false;
tobyspark 31:01845a2347ff 1266
tobyspark 31:01845a2347ff 1267 bool ok = true;
tobyspark 31:01845a2347ff 1268
tobyspark 31:01845a2347ff 1269 int32_t slot = tvOneEDIDPassthrough ? EDIDPassthroughSlot : resolutionMenu.selectedItem().payload.command[1];
tobyspark 31:01845a2347ff 1270
tobyspark 31:01845a2347ff 1271 ok = ok && tvOne.command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 1272 ok = ok && tvOne.command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceEDID, slot);
tobyspark 31:01845a2347ff 1273
tobyspark 31:01845a2347ff 1274 std::string sendOK = ok ? "Sent: EDID. Next:conform?" : "Send Error: EDID";
tobyspark 31:01845a2347ff 1275
tobyspark 31:01845a2347ff 1276 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 31:01845a2347ff 1277 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 31:01845a2347ff 1278 }
tobyspark 30:873979018850 1279 else if (advancedMenu.selectedItem().payload.command[0] == advancedTestSources)
tobyspark 34:69dfe64e7e6b 1280 {
tobyspark 34:69dfe64e7e6b 1281 tvOneRGB1Stable = false;
tobyspark 34:69dfe64e7e6b 1282 tvOneRGB2Stable = false;
tobyspark 34:69dfe64e7e6b 1283 handleTVOneSources();
tobyspark 29:95a7efe30527 1284 }
tobyspark 23:909928cafb95 1285 else if (advancedMenu.selectedItem().payload.command[0] == advancedConformProcessor)
tobyspark 17:fc68d40b8b1f 1286 {
tobyspark 20:8b92d7922c48 1287 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 41:00d1cd3b2af2 1288 screen.textToBuffer("Reverting...", kTVOneStatusLine);
tobyspark 41:00d1cd3b2af2 1289 screen.sendBuffer();
tobyspark 41:00d1cd3b2af2 1290
tobyspark 41:00d1cd3b2af2 1291 bool ok = conformProcessor();
tobyspark 41:00d1cd3b2af2 1292
tobyspark 41:00d1cd3b2af2 1293 std::string sendOK = ok ? "Reverting success" : "Send Error: Revert";
tobyspark 41:00d1cd3b2af2 1294
tobyspark 41:00d1cd3b2af2 1295 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 41:00d1cd3b2af2 1296 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 41:00d1cd3b2af2 1297 }
tobyspark 41:00d1cd3b2af2 1298 else if (advancedMenu.selectedItem().payload.command[0] == advancedConformUploadProcessor)
tobyspark 41:00d1cd3b2af2 1299 {
tobyspark 41:00d1cd3b2af2 1300 bool ok = true;
tobyspark 41:00d1cd3b2af2 1301
tobyspark 41:00d1cd3b2af2 1302 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 41:00d1cd3b2af2 1303 screen.textToBuffer("Uploading...", kTVOneStatusLine);
tobyspark 41:00d1cd3b2af2 1304 screen.sendBuffer();
tobyspark 41:00d1cd3b2af2 1305
tobyspark 41:00d1cd3b2af2 1306 ok = ok && uploadToProcessor();
tobyspark 41:00d1cd3b2af2 1307
tobyspark 41:00d1cd3b2af2 1308 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 20:8b92d7922c48 1309 screen.textToBuffer("Conforming...", kTVOneStatusLine);
tobyspark 20:8b92d7922c48 1310 screen.sendBuffer();
tobyspark 20:8b92d7922c48 1311
tobyspark 41:00d1cd3b2af2 1312 ok = ok && conformProcessor();
tobyspark 17:fc68d40b8b1f 1313
tobyspark 17:fc68d40b8b1f 1314 std::string sendOK = ok ? "Conform success" : "Send Error: Conform";
tobyspark 17:fc68d40b8b1f 1315
tobyspark 17:fc68d40b8b1f 1316 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 17:fc68d40b8b1f 1317 screen.textToBuffer(sendOK, kTVOneStatusLine);
tobyspark 17:fc68d40b8b1f 1318 }
tobyspark 23:909928cafb95 1319 else if (advancedMenu.selectedItem().payload.command[0] == advancedLoadDefaults)
tobyspark 16:52484666b323 1320 {
tobyspark 16:52484666b323 1321 settings.loadDefaults();
tobyspark 27:27851d3d2bba 1322 setMixModeMenuItems();
tobyspark 27:27851d3d2bba 1323 setResolutionMenuItems();
tobyspark 16:52484666b323 1324
tobyspark 16:52484666b323 1325 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 16:52484666b323 1326 screen.textToBuffer("Controller reverted", kTVOneStatusLine);
tobyspark 16:52484666b323 1327 }
tobyspark 23:909928cafb95 1328 else if (advancedMenu.selectedItem().payload.command[0] == advancedSetResolutions)
tobyspark 21:f9d63cb7cedb 1329 {
tobyspark 21:f9d63cb7cedb 1330 bool ok;
tobyspark 44:723e65413ebe 1331 ok = tvOne.uploadCustomResolutions();
tobyspark 21:f9d63cb7cedb 1332
tobyspark 21:f9d63cb7cedb 1333 screen.clearBufferRow(kTVOneStatusLine);
tobyspark 21:f9d63cb7cedb 1334 screen.textToBuffer(ok ? "Resolutions set" : "Res' could not be set", kTVOneStatusLine);
tobyspark 21:f9d63cb7cedb 1335 }
tobyspark 12:c270870bdd23 1336 }
tobyspark 0:87aab40d5806 1337 else
tobyspark 0:87aab40d5806 1338 {
tobyspark 0:87aab40d5806 1339 if (debug) { debug->printf("Warning: No action identified"); }
tobyspark 0:87aab40d5806 1340 }
tobyspark 0:87aab40d5806 1341 }
tobyspark 0:87aab40d5806 1342
tobyspark 34:69dfe64e7e6b 1343 // Send any updates to the display
tobyspark 34:69dfe64e7e6b 1344 screen.sendBuffer();
tobyspark 0:87aab40d5806 1345
tobyspark 5:f8b285ca41ba 1346 //// MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIX MIXMIX MIX MIXMIX MIX MIX MIX MIX MIXMIX MIX MIX
tobyspark 0:87aab40d5806 1347
tobyspark 0:87aab40d5806 1348 bool updateFade = false;
tobyspark 3:033d2b7768f3 1349 float xFade = 0;
tobyspark 3:033d2b7768f3 1350 float fadeUp = 1;
tobyspark 3:033d2b7768f3 1351
tobyspark 3:033d2b7768f3 1352 //// TASK: Process control surface
tobyspark 3:033d2b7768f3 1353
tobyspark 0:87aab40d5806 1354 // Get new states of tap buttons, remembering at end of loop() assign these current values to the previous variables
tobyspark 5:f8b285ca41ba 1355 const bool tapLeft = !tapLeftDIN;
tobyspark 5:f8b285ca41ba 1356 const bool tapRight = !tapRightDIN;
tobyspark 0:87aab40d5806 1357
tobyspark 17:fc68d40b8b1f 1358 // We're taking a further median of the AINs on top of mbed libs v29.
tobyspark 17:fc68d40b8b1f 1359 // This takes some values from last passes and most from now. With debug off, seem to need median size > 5
tobyspark 17:fc68d40b8b1f 1360 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1361 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1362 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1363 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1364 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1365 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1366 xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1367 fadeUpFilter.process(fadeUpAIN.read());
tobyspark 17:fc68d40b8b1f 1368 const float xFadeAINCached = xFadeFilter.process(xFadeAIN.read());
tobyspark 17:fc68d40b8b1f 1369 const float fadeUpAINCached = fadeUpFilter.process(fadeUpAIN.read());
tobyspark 0:87aab40d5806 1370
tobyspark 0:87aab40d5806 1371 // When a tap is depressed, we can ignore any move of the crossfader but not fade to black
tobyspark 0:87aab40d5806 1372 if (tapLeft || tapRight)
tobyspark 0:87aab40d5806 1373 {
tobyspark 5:f8b285ca41ba 1374 // If both are pressed, take to the one that is new, ie. not the first pressed.
tobyspark 0:87aab40d5806 1375 if (tapLeft && tapRight)
tobyspark 0:87aab40d5806 1376 {
tobyspark 5:f8b285ca41ba 1377 xFade = tapLeftWasFirstPressed ? 1 : 0;
tobyspark 0:87aab40d5806 1378 }
tobyspark 5:f8b285ca41ba 1379 // If just one is pressed, take to that and remember which is pressed
tobyspark 5:f8b285ca41ba 1380 else if (tapLeft)
tobyspark 5:f8b285ca41ba 1381 {
tobyspark 5:f8b285ca41ba 1382 xFade = 0;
tobyspark 5:f8b285ca41ba 1383 tapLeftWasFirstPressed = 1;
tobyspark 5:f8b285ca41ba 1384 }
tobyspark 5:f8b285ca41ba 1385 else if (tapRight)
tobyspark 5:f8b285ca41ba 1386 {
tobyspark 5:f8b285ca41ba 1387 xFade = 1;
tobyspark 5:f8b285ca41ba 1388 tapLeftWasFirstPressed = 0;
tobyspark 5:f8b285ca41ba 1389 }
tobyspark 5:f8b285ca41ba 1390 }
tobyspark 18:ebe5da639a6a 1391 else xFade = 1.0 - fadeCalc(xFadeAINCached, xFadeTolerance);
tobyspark 0:87aab40d5806 1392
tobyspark 0:87aab40d5806 1393 fadeUp = 1.0 - fadeCalc(fadeUpAINCached, fadeUpTolerance);
tobyspark 0:87aab40d5806 1394
tobyspark 33:e6672a9bd571 1395 //// TASK: Process Network Comms In, ie. modify TVOne state
tobyspark 5:f8b285ca41ba 1396 if (commsMode == commsOSC)
tobyspark 3:033d2b7768f3 1397 {
tobyspark 3:033d2b7768f3 1398 if (osc->newMessage)
tobyspark 3:033d2b7768f3 1399 {
tobyspark 3:033d2b7768f3 1400 osc->newMessage = false; // fixme!
tobyspark 33:e6672a9bd571 1401 processOSCIn(xFade, fadeUp);
tobyspark 3:033d2b7768f3 1402 }
tobyspark 3:033d2b7768f3 1403 }
tobyspark 3:033d2b7768f3 1404
tobyspark 5:f8b285ca41ba 1405 if (commsMode == commsArtNet)
tobyspark 3:033d2b7768f3 1406 {
tobyspark 33:e6672a9bd571 1407 if (artNet->Work()) processArtNetIn(xFade, fadeUp);
tobyspark 3:033d2b7768f3 1408 }
tobyspark 3:033d2b7768f3 1409
tobyspark 5:f8b285ca41ba 1410 if (commsMode == commsDMXIn)
tobyspark 5:f8b285ca41ba 1411 {
tobyspark 5:f8b285ca41ba 1412 processDMXIn(xFade, fadeUp);
tobyspark 5:f8b285ca41ba 1413 }
tobyspark 5:f8b285ca41ba 1414
tobyspark 5:f8b285ca41ba 1415 if (commsMode == commsDMXOut)
tobyspark 5:f8b285ca41ba 1416 {
tobyspark 5:f8b285ca41ba 1417 processDMXOut(xFade, fadeUp);
tobyspark 5:f8b285ca41ba 1418 }
tobyspark 0:87aab40d5806 1419
tobyspark 0:87aab40d5806 1420 // Calculate new A&B fade percents
tobyspark 0:87aab40d5806 1421 int newFadeAPercent = 0;
tobyspark 0:87aab40d5806 1422 int newFadeBPercent = 0;
tobyspark 0:87aab40d5806 1423
tobyspark 30:873979018850 1424 if (mixMode == mixBlend)
tobyspark 11:0783cfbeb746 1425 {
tobyspark 30:873979018850 1426 if (fadeUp < 1.0)
tobyspark 30:873979018850 1427 {
tobyspark 30:873979018850 1428 // we need to set fade level of both windows as there is no way AFAIK to implement fade to black as a further window on top of A&B
tobyspark 30:873979018850 1429 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 30:873979018850 1430 newFadeBPercent = xFade * fadeUp * 100.0;
tobyspark 30:873979018850 1431 }
tobyspark 30:873979018850 1432 else
tobyspark 30:873979018850 1433 {
tobyspark 30:873979018850 1434 // we can optimise and just fade A in and out over a fully up B, doubling the rate of fadeA commands sent.
tobyspark 30:873979018850 1435 newFadeAPercent = (1.0-xFade) * 100.0;
tobyspark 30:873979018850 1436 newFadeBPercent = 100.0;
tobyspark 30:873979018850 1437 }
tobyspark 11:0783cfbeb746 1438 }
tobyspark 15:4b394c64b461 1439 else if (mixMode == mixAdditive)
tobyspark 11:0783cfbeb746 1440 {
tobyspark 22:90054fe6d86c 1441 // we need to set fade level of both windows according to the fade curve profile
tobyspark 22:90054fe6d86c 1442 float newFadeA = (1.0-xFade) * (1.0 + fadeCurve);
tobyspark 22:90054fe6d86c 1443 float newFadeB = xFade * (1 + fadeCurve);
tobyspark 22:90054fe6d86c 1444 if (newFadeA > 1.0) newFadeA = 1.0;
tobyspark 22:90054fe6d86c 1445 if (newFadeB > 1.0) newFadeB = 1.0;
tobyspark 22:90054fe6d86c 1446
tobyspark 22:90054fe6d86c 1447 newFadeAPercent = newFadeA * fadeUp * 100.0;
tobyspark 22:90054fe6d86c 1448 newFadeBPercent = newFadeB * fadeUp * 100.0;
tobyspark 11:0783cfbeb746 1449 }
tobyspark 36:8b5c75c8bc23 1450 else if (mixMode >= mixKeyStartIndex)
tobyspark 11:0783cfbeb746 1451 {
tobyspark 0:87aab40d5806 1452 newFadeAPercent = (1.0-xFade) * fadeUp * 100.0;
tobyspark 0:87aab40d5806 1453 newFadeBPercent = fadeUp * 100.0;
tobyspark 0:87aab40d5806 1454 }
tobyspark 0:87aab40d5806 1455
tobyspark 17:fc68d40b8b1f 1456 //// TASK: Send to TVOne if percents have changed
tobyspark 17:fc68d40b8b1f 1457
tobyspark 17:fc68d40b8b1f 1458 // No amount of median filtering is stopping flipflopping between two adjacent percents, so...
tobyspark 17:fc68d40b8b1f 1459 bool fadeAPercentHasChanged;
tobyspark 17:fc68d40b8b1f 1460 bool fadeBPercentHasChanged;
tobyspark 17:fc68d40b8b1f 1461 if (oldFadeAPercent == newFadeAPercent && (newFadeAPercent == fadeAPercent - 1 || newFadeAPercent == fadeAPercent + 1))
tobyspark 17:fc68d40b8b1f 1462 fadeAPercentHasChanged = false;
tobyspark 17:fc68d40b8b1f 1463 else
tobyspark 17:fc68d40b8b1f 1464 fadeAPercentHasChanged = newFadeAPercent != fadeAPercent;
tobyspark 17:fc68d40b8b1f 1465 if (oldFadeBPercent == newFadeBPercent && (newFadeBPercent == fadeBPercent - 1 || newFadeBPercent == fadeBPercent + 1))
tobyspark 17:fc68d40b8b1f 1466 fadeBPercentHasChanged = false;
tobyspark 17:fc68d40b8b1f 1467 else
tobyspark 17:fc68d40b8b1f 1468 fadeBPercentHasChanged = newFadeBPercent != fadeBPercent;
tobyspark 17:fc68d40b8b1f 1469
tobyspark 35:d5d9f0838f99 1470 // If changing mixMode from additive, we want to do this before updating fade values
tobyspark 35:d5d9f0838f99 1471 if (updateMixMode && mixMode != mixAdditive) actionMixMode();
tobyspark 35:d5d9f0838f99 1472
tobyspark 9:f83eadd8917a 1473 // We want to send the higher first, otherwise black flashes can happen on taps
tobyspark 17:fc68d40b8b1f 1474 if (fadeAPercentHasChanged && newFadeAPercent >= newFadeBPercent)
tobyspark 8:d46cc49f0f37 1475 {
tobyspark 17:fc68d40b8b1f 1476 oldFadeAPercent = fadeAPercent;
tobyspark 0:87aab40d5806 1477 fadeAPercent = newFadeAPercent;
tobyspark 0:87aab40d5806 1478 updateFade = true;
tobyspark 0:87aab40d5806 1479
tobyspark 0:87aab40d5806 1480 fadeAPO = fadeAPercent / 100.0;
tobyspark 0:87aab40d5806 1481 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 0:87aab40d5806 1482 }
tobyspark 17:fc68d40b8b1f 1483 if (fadeBPercentHasChanged)
tobyspark 8:d46cc49f0f37 1484 {
tobyspark 17:fc68d40b8b1f 1485 oldFadeBPercent = fadeBPercent;
tobyspark 0:87aab40d5806 1486 fadeBPercent = newFadeBPercent;
tobyspark 0:87aab40d5806 1487 updateFade = true;
tobyspark 0:87aab40d5806 1488
tobyspark 0:87aab40d5806 1489 fadeBPO = fadeBPercent / 100.0;
tobyspark 0:87aab40d5806 1490 tvOne.command(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeBPercent);
tobyspark 0:87aab40d5806 1491 }
tobyspark 17:fc68d40b8b1f 1492 if (fadeAPercentHasChanged && newFadeAPercent < newFadeBPercent)
tobyspark 9:f83eadd8917a 1493 {
tobyspark 17:fc68d40b8b1f 1494 oldFadeAPercent = fadeAPercent;
tobyspark 9:f83eadd8917a 1495 fadeAPercent = newFadeAPercent;
tobyspark 9:f83eadd8917a 1496 updateFade = true;
tobyspark 9:f83eadd8917a 1497
tobyspark 9:f83eadd8917a 1498 fadeAPO = fadeAPercent / 100.0;
tobyspark 9:f83eadd8917a 1499 tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsMaxFadeLevel, fadeAPercent);
tobyspark 9:f83eadd8917a 1500 }
tobyspark 8:d46cc49f0f37 1501 if (updateFade && debug)
tobyspark 8:d46cc49f0f37 1502 {
tobyspark 0:87aab40d5806 1503 //debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAIN.read(), fadeUpAIN.read());
tobyspark 0:87aab40d5806 1504 debug->printf("xFade = %3f fadeUp = %3f \r\n", xFadeAINCached, fadeUpAINCached);
tobyspark 0:87aab40d5806 1505 debug->printf("xFade = %3f fadeUp = %3f fadeA% = %i fadeB% = %i \r\n", xFade, fadeUp, fadeAPercent, fadeBPercent);
tobyspark 18:ebe5da639a6a 1506 debug->printf("\r\n");
tobyspark 0:87aab40d5806 1507 }
tobyspark 30:873979018850 1508
tobyspark 35:d5d9f0838f99 1509 // If changing mixMode to additive, we want to do this before updating fade values
tobyspark 35:d5d9f0838f99 1510 if (updateMixMode && mixMode == mixAdditive) actionMixMode();
tobyspark 35:d5d9f0838f99 1511
tobyspark 33:e6672a9bd571 1512 //// TASK: Process Network Comms Out, ie. send out any fade updates
tobyspark 33:e6672a9bd571 1513 if (commsMode == commsOSC && updateFade)
tobyspark 33:e6672a9bd571 1514 {
tobyspark 33:e6672a9bd571 1515 processOSCOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1516 }
tobyspark 33:e6672a9bd571 1517
tobyspark 33:e6672a9bd571 1518 if (commsMode == commsArtNet && updateFade)
tobyspark 33:e6672a9bd571 1519 {
tobyspark 33:e6672a9bd571 1520 processArtNetOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1521 }
tobyspark 33:e6672a9bd571 1522
tobyspark 33:e6672a9bd571 1523 if (commsMode == commsDMXOut && updateFade)
tobyspark 33:e6672a9bd571 1524 {
tobyspark 33:e6672a9bd571 1525 processDMXOut(xFade, fadeUp);
tobyspark 33:e6672a9bd571 1526 }
tobyspark 33:e6672a9bd571 1527
tobyspark 34:69dfe64e7e6b 1528 // Housekeeping
tobyspark 34:69dfe64e7e6b 1529 if (tvOne.millisSinceLastCommandSent() > 1500)
tobyspark 30:873979018850 1530 {
tobyspark 34:69dfe64e7e6b 1531 // We should check up on any source that hasn't ever been stable
tobyspark 30:873979018850 1532 if (!tvOneRGB1Stable || !tvOneRGB2Stable) handleTVOneSources();
tobyspark 30:873979018850 1533 }
tobyspark 0:87aab40d5806 1534 }
tobyspark 30:873979018850 1535 }