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
Diff: main.cpp
- Revision:
- 61:f0a42bfca816
- Parent:
- 60:13bc754cb76f
- Child:
- 62:523de36d2f88
--- a/main.cpp Tue Jun 25 02:10:38 2013 +0000 +++ b/main.cpp Fri Jul 26 12:46:58 2013 +0000 @@ -218,9 +218,6 @@ float oldFadeUp = 0; bool commsInActive = false; -// Key mode parameters -int keyerParamsSet = -1; // last keyParams index uploaded to unit - // TVOne input sources stable flag bool tvOneRGB1Stable = false; bool tvOneRGB2Stable = false; @@ -482,32 +479,6 @@ return ok; } -bool setKeyParamsTo(int index) -{ - // Only spend the time uploading six parameters if we need to - // Might want to bounds check here - - bool ok; - - if (index != keyerParamsSet) - { - ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, settings.keyerParamSet(index)[SPKSettings::minY]); - ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, settings.keyerParamSet(index)[SPKSettings::maxY]); - ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, settings.keyerParamSet(index)[SPKSettings::minU]); - ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, settings.keyerParamSet(index)[SPKSettings::maxU]); - ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, settings.keyerParamSet(index)[SPKSettings::minV]); - ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, settings.keyerParamSet(index)[SPKSettings::maxV]); - - keyerParamsSet = index; - } - else - { - ok = true; - } - - return ok; -} - void actionMixMode() { if (debug) debug->printf("Changing mix mode \r\n"); @@ -517,7 +488,7 @@ char sentMSGBuffer[kStringBufferLength]; // Set Keyer - if (mixMode < mixKey) + if (mixMode != mixKey) { // Set Keyer Off. Quicker to set and fail than to test for on and then turn off tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, false); @@ -545,18 +516,15 @@ } else { - int index = mixModeMenu.selectedIndex() - mixKeyStartIndex; - // Turn off Additive Mixing on output if (tvOne.getProcessorType().version == 423) { ok = tvOne.command(0, kTV1WindowIDA, 0x298, 0); } // Turn on Keyer - ok = ok && setKeyParamsTo(index); ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerEnable, true); - snprintf(sentMSGBuffer, kStringBufferLength, "Keyer On with %i", index); + snprintf(sentMSGBuffer, kStringBufferLength, "Key L over R"); } mixModeOld = mixMode; @@ -745,17 +713,24 @@ if (tvOne.getProcessorType().version == 423 || tvOne.getProcessorType().version == -1) { - mixModeMenu.addMenuItem(SPKMenuItem("Crossfade", &mixModeAdditiveMenu)); + mixModeAdditiveMenu.title = "Crossfade"; + mixModeMenu.addMenuItem(SPKMenuItem(mixModeAdditiveMenu.title, &mixModeAdditiveMenu)); } else { mixModeMenu.addMenuItem(SPKMenuItem("Blend", mixBlend)); } - for (int i=0; i < settings.keyerSetCount(); i++) - { - mixModeMenu.addMenuItem(SPKMenuItem(settings.keyerParamName(i), mixKeyStartIndex + i)); - } + mixModeMenu.addMenuItem(SPKMenuItem("Key: L over R", mixKey)); + mixModeMenu.addMenuItem(SPKMenuItem("Key: Tweak key values", &mixModeUpdateKeyMenu)); + + // Load in presets from settings. Index 0 is the "live" key read from TVOne, so we ignore here. + if (settings.keyerSetCount() > 1) + for (int i=1; i < settings.keyerSetCount(); i++) + { + mixModeMenu.addMenuItem(SPKMenuItem("Key Preset: " + settings.keyerParamName(i), mixKey + i)); + } + mixModeMenu.addMenuItem(SPKMenuItem("Back to Main Menu", &mainMenu)); } @@ -1024,70 +999,43 @@ void mixModeUpdateKeyMenuHandler(int menuChange, bool action) { static int actionCount = 0; - static int state = 0; if (action) actionCount++; - if (actionCount == 0) + if (actionCount == 0) { - screen.clearBufferRow(kMenuLine1); - screen.clearBufferRow(kMenuLine2); - screen.textToBuffer("Edit current key?", kMenuLine1); + settings.editingKeyerSetIndex = 0; + printf("about to load\r\n"); + bool ok; + int minY, maxY, minU, maxU, minV, maxV; + + ok = tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, minY); + ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, maxY); + ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, minU); + ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, maxU); + ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, minV); + ok = ok && tvOne.readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, maxV); - state += menuChange; - if (state > 2) state = 2; - if (state < 0) state = 0; + if (ok) + { + printf("%u %u %u %u", minY, maxY, minU, maxU); + settings.setEditingKeyerSetValue(SPKSettings::minY, minY); + settings.setEditingKeyerSetValue(SPKSettings::maxY, maxY); + settings.setEditingKeyerSetValue(SPKSettings::minU, minU); + settings.setEditingKeyerSetValue(SPKSettings::maxU, maxU); + settings.setEditingKeyerSetValue(SPKSettings::minV, minV); + settings.setEditingKeyerSetValue(SPKSettings::maxV, maxV); + } + else + { + printf("failed to load\r\n"); + tvOneStatusMessage.addMessage("Failed to read key values", kTVOneStatusMessageHoldTime); + } - switch (state) - { - case 0: screen.textToBuffer("[Tweak/ / ]", kMenuLine2); break; - case 1: screen.textToBuffer("[ /Start Over/ ]", kMenuLine2); break; - case 2: screen.textToBuffer("[ / /Cancel]", kMenuLine2); break; - } + actionCount = 1; } if (actionCount == 1) { - if (state == 0) - { - settings.editingKeyerSetIndex = mixModeMenu.selectedIndex() - mixKeyStartIndex; - actionCount++; - } - else if (state == 1) - { - settings.editingKeyerSetIndex = mixModeMenu.selectedIndex() - mixKeyStartIndex; - settings.setEditingKeyerSetValue(SPKSettings::minY, 0); - settings.setEditingKeyerSetValue(SPKSettings::maxY, 255); - settings.setEditingKeyerSetValue(SPKSettings::minU, 0); - settings.setEditingKeyerSetValue(SPKSettings::maxU, 255); - settings.setEditingKeyerSetValue(SPKSettings::minV, 0); - settings.setEditingKeyerSetValue(SPKSettings::maxV, 255); - tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, 0); - tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, 255); - tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, 0); - tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, 255); - tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, 0); - tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, 255); - actionCount++; - state = 0; - } - else if (state == 2) - { - settings.editingKeyerSetIndex = -1; - - // Get back to menu - actionCount = 0; - state = 0; - selectedMenu = &mixModeMenu; - screen.clearBufferRow(kMenuLine1); - screen.clearBufferRow(kMenuLine2); - screen.textToBuffer(selectedMenu->title, kMenuLine1); - screen.textToBuffer(selectedMenu->selectedString(), kMenuLine2); - - return; - } - } - if (actionCount == 2) - { int value = settings.editingKeyerSetValue(SPKSettings::maxY); value += menuChange; if (value < 0) value = 0; @@ -1104,7 +1052,7 @@ tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, value); } - else if (actionCount == 3) + else if (actionCount == 2) { int value = settings.editingKeyerSetValue(SPKSettings::minY); value += menuChange; @@ -1123,7 +1071,7 @@ tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, value); } - else if (actionCount == 4) + else if (actionCount == 3) { int value = settings.editingKeyerSetValue(SPKSettings::maxU); value += menuChange; @@ -1143,7 +1091,7 @@ tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, value); } - else if (actionCount == 5) + else if (actionCount == 4) { int value = settings.editingKeyerSetValue(SPKSettings::minU); value += menuChange; @@ -1164,7 +1112,7 @@ tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, value); } - else if (actionCount == 6) + else if (actionCount == 5) { int value = settings.editingKeyerSetValue(SPKSettings::maxV); value += menuChange; @@ -1186,7 +1134,7 @@ tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, value); } - else if (actionCount == 7) + else if (actionCount == 6) { int value = settings.editingKeyerSetValue(SPKSettings::minV); value += menuChange; @@ -1209,10 +1157,11 @@ tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, value); } - else if (actionCount == 8) + else if (actionCount == 7) { - // A save dialog would go here - + // Save settings + tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1); + // Get back to menu actionCount = 0; selectedMenu = &mixModeMenu; @@ -1251,9 +1200,7 @@ tvOneRGB1Stable = false; tvOneRGB2Stable = false; handleTVOneSources(); - - settings.editingKeyerSetIndex = -1; - keyerParamsSet = -1; + bool ok = settings.load(kSPKDFSettingsFilename); if (!ok) settings.loadDefaults(); @@ -1385,13 +1332,10 @@ // Set menu structure mixModeMenu.title = "Mix Mode"; + mixModeAdditiveMenu.addMenuItem(SPKMenuItem(&mixModeAdditiveMenuHandler)); + mixModeUpdateKeyMenu.addMenuItem(SPKMenuItem(&mixModeUpdateKeyMenuHandler)); + setMixModeMenuItems(); - - mixModeAdditiveMenu.title = "Crossfade"; - mixModeAdditiveMenu.addMenuItem(SPKMenuItem(&mixModeAdditiveMenuHandler)); - - mixModeUpdateKeyMenu.title = "Update Keyer Settings?"; - mixModeUpdateKeyMenu.addMenuItem(SPKMenuItem(&mixModeUpdateKeyMenuHandler)); resolutionMenu.title = "Resolution"; setResolutionMenuItems(); @@ -1561,23 +1505,41 @@ // With that out of the way, we should be actioning a specific menu's payload? else if (selectedMenu == &mixModeMenu) { - mixMode = mixModeMenu.selectedItem().payload.command[0]; - - // the spanner in the works: mixBlend and mixAdditive are now both index 0 in the menu - if (mixMode >= mixKeyStartIndex) + int mixModeMenuPayload = mixModeMenu.selectedItem().payload.command[0]; + + if (mixModeMenuPayload == mixAdditive) + { + // This will have been handled by the mixModeAdditiveMenuHandler + } + else if (mixModeMenuPayload == mixBlend) { - // adjust for the two-into-one spanner - mixMode += 1; + mixMode = mixBlend; + + if (mixMode == mixModeOld) tvOneStatusMessage.addMessage("Blend already active", kTVOneStatusMessageHoldTime); + } + else if (mixModeMenuPayload >= mixKey) + { + mixMode = mixKey; + + int keySetIndex = mixModeMenuPayload - mixKey; - // if its the second click on the keying mode, lets edit the parameters - if (mixMode == mixModeOld) + if (keySetIndex > 0) { - selectedMenu = &mixModeUpdateKeyMenu; + bool ok; + ok = tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinY, settings.keyerParamSet(keySetIndex)[SPKSettings::minY]); + ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxY, settings.keyerParamSet(keySetIndex)[SPKSettings::maxY]); + ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinU, settings.keyerParamSet(keySetIndex)[SPKSettings::minU]); + ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxU, settings.keyerParamSet(keySetIndex)[SPKSettings::maxU]); + ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMinV, settings.keyerParamSet(keySetIndex)[SPKSettings::minV]); + ok = ok && tvOne.command(0, kTV1WindowIDA, kTV1FunctionAdjustKeyerMaxV, settings.keyerParamSet(keySetIndex)[SPKSettings::maxV]); - screen.clearBufferRow(kMenuLine1); - screen.textToBuffer(selectedMenu->title, kMenuLine1); + tvOne.command(0, kTV1WindowIDA, kTV1FunctionPowerOnPresetStore, 1); - selectedMenu->selectedItem().payload.handler(0, false); + tvOneStatusMessage.addMessage(ok ? "Activated: " + settings.keyerParamName(keySetIndex) + " values" : "Send error: keyer values", kTVOneStatusMessageHoldTime); + } + else + { + if (mixMode == mixModeOld) tvOneStatusMessage.addMessage("Keying already active", kTVOneStatusMessageHoldTime); } } } @@ -1737,7 +1699,7 @@ std::string sendOK = ok ? "Conform success" : "Send Error: Conform"; - tvOneStatusMessage.addMessage(sendOK, kTVOneStatusMessageHoldTime); + tvOneStatusMessage.addMessage(sendOK, 30); } // else if (advancedMenu.selectedItem().payload.command[0] == advancedSetResolutions) // {