Форум » » Реализация очереди включения и выключения » Ответить

Реализация очереди включения и выключения

iBumzeR: Доброго дня уважаемые специалисты! Дано Процессор - PRO3 Дискуссионная система - Shure DIS 5900 Микрофоны Shure - 22 шт. Камера Sony SRG120 Во время настройки наведения камеры на нужные микрофоны столкнулся с такой трудностью. Не получается реализовать очередь, т.е. логика такова при включении микрофона №1 на место делегата №1 направляется камера, при включении микрофона №2 направляется на делегата№ 2, при включении микрофона №3 соответственно на делегата №3. Данная логика исправно работает все замечательно. Далее должна вступать логика очереди при выключении микрофона №3 камера должна автоматически перейти на делегата №2, т.к. он был предыдущим оратором. В случае если микрофон №2 был выключен раньше активного, камера после выключения микрофона №3 должна перейти на делегата №1. Логика по сути напоминает элемент FIFO Queue, но он не подходит т.к. в самом названии (First-In-First-Out) Queue, а надо First-In-Last-Out. Есть идея реализации через Clock Driver, запоминать время момента включения микрофона, а в последующем сравнивать числа, кто больше тот пресет и вызывать. Но довольно массивная логика и есть уязвимости как минимум при переходе с 23:59:59 на 00:00:01, т.е. в полночь. Подскажите, кто реализовывал данную функцию или свежим и опытным взглядом может чего подсказать.

Ответов - 2

Admin: Вот здесь тема поднималась

Viacheslav Alekseev: На SIMPL+ легко можно сделать очередь. Зачем мучаться с SIMPL? Вот такую написал я. На вход подается состояние микрофона (MicState - у меня оно аналог, т.к. принимает несколько значений. Можно переделать на DIGITAL) Если микрофон включился, вызывается Preset для этого микрофона. При выключении микрофона происходит действие в зависимости от того, какой микрофон выключился (последний или кто-то в середине), и от параметра USE_DEFAULT и USE_QUEUE: если стоит USE_QUEUE - то при выключении микрофона, камера возвращается на предыдущий в очереди пресет, если стоит USE_DEFAULT - очередь не используется, камера всегда возвращается на пресет Default (общий вид, например). PresetNone вызывается, когда последний микрофон выключился. Туда тоже можно общий вид настроить. Код: [pre2] /******************************************************************************************* SIMPL+ Module Information (Fill in comments below) *******************************************************************************************/ /* Dealer Name: Ascreen System Name: System Number: Programmer: v.alekseev Comments: Auto AIM with Queue */ /******************************************************************************************* Compiler Directives (Uncomment and declare compiler directives as needed) *******************************************************************************************/ // #ENABLE_DYNAMIC #SYMBOL_NAME "MicAutoAim" // #HINT "" // #DEFINE_CONSTANT // #CATEGORY "" #CATEGORY "20" // Conferencing // #DEFAULT_VOLATILE // #PRINT_TO_TRACE // #DIGITAL_EXPAND // #ANALOG_SERIAL_EXPAND // #OUTPUT_SHIFT // #HELP_PDF_FILE "" #DEFAULT_NONVOLATILE #ENABLE_STACK_CHECKING #ENABLE_TRACE DIGITAL_INPUT _skip_; DIGITAL_INPUT Enable, ResetQueue; ANALOG_INPUT MicState[255]; // ANALOG_INPUT // STRING_INPUT // BUFFER_INPUT DIGITAL_OUTPUT _skip_; DIGITAL_OUTPUT PresetNone; DIGITAL_OUTPUT PresetDefault; DIGITAL_OUTPUT Preset[255]; //queue of turned on mics INTEGER Queue[255]; //indicates the last element of queue INTEGER g_iLastQueueIndex; INTEGER CanWork; INTEGER_PARAMETER USEQUEUE; #BEGIN_PARAMETER_PROPERTIES USEQUEUE propValidUnits = unitDecimal; propDefaultValue = 1d; propList = { 0d , "Use Default" } , { 1d , "Use Queue" }; #END_PARAMETER_PROPERTIES //******************************************************************************************* PUSH ResetQueue { g_iLastQueueIndex = 0; } //******************************************************************************************* PUSH Enable { if (g_iLastQueueIndex != 0) //we have working mics, let's aim on the last of them { pulse(1, Preset[Queue[g_iLastQueueIndex]]); } } CHANGE MicState { INTEGER iMicNumber, i, a, found; if (CanWork = 0) return; if (Enable = 0) return; iMicNumber = GetLastModifiedArrayIndex(); if (MicState[iMicNumber] = 1) //turned on { g_iLastQueueIndex = g_iLastQueueIndex + 1; //add to list of turned on Queue[g_iLastQueueIndex] = iMicNumber; pulse(1, Preset[iMicNumber]); } else if (MicState[iMicNumber] = 0) //turned off { if (iMicNumber = Queue[g_iLastQueueIndex]) //it was last turned on mic { if (g_iLastQueueIndex = 1) pulse(1, PresetNone); //we had only 1 turned on mic else { if (USEQUEUE = 1) pulse(1, Preset[Queue[g_iLastQueueIndex-1]]); //pulse previous who is turned on else pulse(1, PresetDefault); //pulse some default preset } } //remove it from queue of turned on mics found = 0; for (i=1 to g_iLastQueueIndex) //find it in queue { if (Queue = iMicNumber) { found = 1; break; //found } } //decrease last index and move the rest of queue to the left if (found = 1) { g_iLastQueueIndex = g_iLastQueueIndex - 1; for(a=i to g_iLastQueueIndex) { Queue[a] = Queue[a+1]; } } } } //******************************************************************************************* Function Main() { CanWork = 0; g_iLastQueueIndex = 0; WaitForInitializationComplete(); CanWork = 1; } [/pre2]



полная версия страницы