Сопряжение управления
Наличие нескольких телевизоров в сегодняшнем быту далеко не редкость. Телевизор в гостиной, DVD-проигрыватель, видеомагнитофон, телевизор на кухне, в спальне. Как лучше согласовать подключение всех источников видеосигнала, можно
посмотреть в Приложении. В системе «Умный дом» распределение видеосигнала по всем помещениям, естественно, сопровождается распределением управления (рис. 3.24). Как это может выглядеть?
Из приведенной схемы ясно, что DVD-проигрыватель, расположенный в гостиной, управляется дополнительно из спальни и кухни.
Не вдаваясь в детали устройства видеокоммутатора, я хочу предложить вам рассмотреть следующий сценарий.
Простуда уложила вас в постель. Пользуясь случаем, вы решили посмотреть новый фильм, который купили накануне. Уютно расположившись в спальне, вы смотрите фильм, а домашние, чтобы не беспокоить вас, досматривают очередную серию очередного сериала на кухне.
Ц ^............ ^ ^ .............. ^ ■ • U............. '^гЩ |
FMt ДО >И lj yir* Window І««) b'"P В ч[и|| [ТЩ Т fe, " * .................. , , ^... , „,, • # nntfimftdt) - „ - n" в* ІЗ І Рис. 3.23. Окончательный результат наблюдения |
Серия закончилась. Ваши домашние вспомнили о фильме, который собирались посмотреть вчера и даже установили в проигрыватель, но не успели посмотреть. Они нажимают на пульте управления кнопочку DVD и... Как и положено,
Рис. 3.24. Подключение DVD-проигрывателя ктелевизорам |
Команда power, воспроизводимая модулем излучения ИК-команд, выключит DVD-проигрыватель на самом интересном месте, когда интрига фильма заставляет вас забыть о простуде. Система «Умный дом» в данном случае позаботится о том, чтобы вам о ней напомнить.
Но я знаю, что вы человек предусмотрительный, и, хотя нет единого мнения, как лучше организовать работу устройств, управляемых из разных помещений, вы предусмотрели в программе управления подобную ситуацию, нарисовав, например, алгоритм управления, представленный на рис. 3.25.
Но к телевизору вы можете подключить и видеомагнитофон, а также использовать телевизор в качестве акустической зоны, подключая его к музыкальному центру. В этом случае алгоритм усложнится. Этому будет способствовать и наличие большого количества помещений с развитой системой средств управления и устройств, управляемых из разных помещений.
После завершения программы управления системой она приводится в действие. При этом трудно разобраться во всех сложных ситуациях. Конечно, вы постарались предусмотреть
Рис. 3.25. Алгоритм управления DVD-проигрывателем |
Все, когда разрабатывали алгоритм управления. Но все ли вы предусмотрели?
В аналогичной ситуации я поступаю следующим образом. Нарисовав алгоритм, я проверяю его с помощью вспомогательной программы, для создания которой можно использовать любую современную среду программирования. Я использовал Delphi и KDevelop с одинаковым успехом. Можно воспользоваться любой средой программирования и любым языком. Единственное, как мне кажется, важное условие - легкое создание графических примитивов и управление их свойствами. В данном случае программа не будет конечной целью, она - лишь средство избавить вас от сомнений в правильности принятого решения.
Программа, в сущности, описывает ваш алгоритм, а графическая часть изображает устройства управления, управляемые устройства, возможно, флаги и переменные. Выглядеть работающая программа может, как показано на рис. В.26.
На рис. 3.26 изображены устройства управления и управляемые устройства, которые при включении меняют цвет, флаги и т. д.
Рис.*3.26. Проверка алгоритма управления |
Ниже я привожу фрагмент программы, чтобы показать, что в ней используются только графические примитивы и изменение их свойств. Написать такую программу не составит труда.
Void test::cinTV_0NSlot() {
Cin_TV = true; cin_NTV = true; cin_AVproc = true;
Cin_AVproc_f->setBackgroundColor(,,Red,,); // AVprocessor Cinema cin_ntv_f->setBackgroundColor("Red"); // NTV Cinema cin_tv_f->setBackgroundColor("red"); extron_eqipl->setText ("EXTR0Nn NTV->Cinemaw) ; extron_eqipl->setBackgroundColor(wredn); // EXTRON NTV Cinema proj_equip->setText (n Project orn NTV-Composit") ; proj_equip->setBackgroundColor("red"); av_proc_equip->setBackgroundColor("red") ; av_proc_equip->setText ("AV Processorn NTV~3Dn);
Light->setBackgroundColor ("Black") ; }
Void test::cinTV_OffSlot() {if(cin_AVproc){ cin_AVproc = false;
Cin_AVproc_f->setBackgroundColor ("LightGrey"); // AVProcessor cin_TV =false;
Cin_tv_f->setText ("cin_TV");
Cin_tv_f->setBackgroundColor("LightGrey"); // TV
Cin_NTV = false;
Cin__ntv_f—>setText ("cin_NTV") ;
Cin_ntv_f->setBackgroundColor("LightGrey"); // NTV extron_eqipl->setText ("EXTRON") ; extron_eqipl->setBackgroundColor ("LightGrey") ; extron_eqipl->setText("EXTRONXn NTV->Cineman); //Extron Cinema proj_equip->setText ("ProjectorXn NTV-Composit") ; proj_equip->setBackgroundColor("LightGrey"); av_proc_equip->setText("AV Processorn NTV-3D"); av_proc_equip->setBackgroundColor ("LightGrey") ; Light->setBackgroundColor("White");
If (cin_DVD){ cin_DVD = false;
Cin_dvd_f->setBackgroundColor ("LightGrey"); / / DVD DVD_in__use = false;
Dvd_inuse_f->setBackgroundColor ("Yellow"); // DVD dvd_equip->setText ("DVD") ;
Dvd_equip->setBackgroundColor ("LightGrey") ; }
If (cin_VCR){ cin_VCR = false;
Vcr_equip->setBackgroundColor("LightGrey");
Vcr_equip->setText("VCR"); //VCR }
If (cin_CD){ cin_CD = false;
Cin_cd_f->setBackgroundColor("LightGrey"); //CD CD_in_use = false;
Cd_inuse_f->setBackgroundColor("Yellow"); //CD cd_equip->setText("CD");
Cd_equip->setBackgroundColor("LightGrey"); }
}
}
Void test::cinNTV_onSlot() {
If (cin_TV){ if (!cin_DVD){ cinJNITV = true;
Cin_ntv_f->setBackgroundColor("Red"); // NTV Cinema extron_eqipl->setText ("EXTRONXn NTV->Cinema") ; extron_eqipl->setBackgroundColor("red"); // EXTRON NTV Cinema
Proj_equip->setText("ProjectorXn NTV-Composit") ; proj_equip->setBackgroundColor("red"); av_proc_equip->setText("AV Processorn NTV-3D"); // 3D-
Sound }
Else {
Cin_NTV = true;
Cin. nt^f-^setBackgroundColorr'Red"); // NTV Cinema cin_DVD = false;
Cin_dvd_f->setBackgroundColor("LightGrey"); // DVD DVD_in_use = false;
Dvd_inuse_f->setBackgroundColor("Yellow"); // DVD extron_eqipl->setText ("EXTRONXn NTV->Cinema"); // Extron Cinema
Proj_equip->setText("Projectorn NTV-Composit"); av_proc_equip->setText ("AV ProcessorXn NTV-3D"); // 3D - "sound
Dvd_equip->setText("DVD");
Dvd_equip->setBackgroundColor("LightGrey"); // DVD }
} }
Void test::cinDVD_onSlot() {
If (cin_TV){
If (!DVD_in_use){ cin_NTV = false;
Cin_ntv_f->setBackgroundColor("Light Grey"); 11 DVD_in_use = true;
Dvd_inuse_f->setBackgroundColor("red"); // DVD cin_DVD = true;
Cin_dvd_f->setBackgroundColor("red"); // DVD dvd_equip->setBackgroundColor("red"); dvd_equip->setText("DVD for Cinema"); // ,DVD av_proc_equip->setText("AV ProcessorXn DVD-Dolby"); av_proc_equip->setBackgroundColor("Red"); // DVD DolbyDigital
Proj_equip->setText ("ProjectorXn DVD-S_video"); // DVD }
Else{
Cin_NTV = false;
Cin_ntv_E->setBackgroundColor("Light Grey"); // av_proc_equip->setText("DVD");
Av_proc_equip->setText("AV ProcessorXn DVD-Dolby"); // DVD DolbyDigital
Proj_equip->setText("ProjectorXn DVD-S_video"); // DVD }
Void test::cinDVD_offSlot() {if ((cin_TV)&&(IcinJVCR)&&(!cin_COMP)){ if (cin_DVD){ cin_NTV = true;
Cin_ntv_f->setBackgroundColor("Red"); // NTV Cinema cin_DVD = false;
Cin_dvd_f->setBackgroundColor("LightGrey"); // DVD DVD_in_use = false;
Dvd_inuse_f->setBackgroundColor("Yellow"); // DVD proj_equip->setText("ProjectorXn NTV-Composit"); av_proc_equip->setText ("AV ProcessorVn NTV-3D"); // 3D- sound
Dvd_equip->setText ("DVD") ;
Dvd_equip->setBackgroundColor("LightGrey"); // DVD }
При нажатии клавиши пультов управления я «включаю и выключаю» устройства (меняю цвет), устанавливаю и сбрасываю флаги - словом, контролирую свое нехитрое хозяйство.
Запустив программу, я начинаю беспорядочно щелкать по всем клавишам устройств управления. Моя задача - проверить, не возникает ли тупиковая ситуация, подобная описанной выше, при каких-либо управляющих сигналах. Используя этот нехитрый прием, я убедился, что допускал ошибки в алгоритмах даже после их тщательной проверки на бумаге. В первую очередь, это ошибки, которые я называю для себя ошибками последовательности действий. Описывая алгоритм, зачастую укрупняешь операции. Например, в алгоритме, приведенном выше, я записал включить DVD, установить флаг. В действительности команда включить DVD распадается на ряд команд, каждая из которых может ветвиться: вывести устройство из режима ожидания, открыть лоток для установки диска, закрыть лоток, включить меню, выбрать из меню режим просмотра и т. д. Каждому действию соответствует своя последовательность нажатия клавиш на пульте. Когда «крутишь» алгоритм на бумаге, легко проглядеть возможные ветвления и ошибки в последовательности. Особенно, если работа, как это часто бывает, происходит в условиях дефицита времени. Использование программы для проверки программы (возможно, есть математические методы, решающие эти проблемы, но нет времени с ними разобраться) позволяет до введения в систему неких действий проверить, не приведут ли они к нежелательным результатам. И удалить, как минимум, тупиковые ситуации.
Сами по себе эксперименты в этой области достаточно интересны. Но, если вы от экспериментов перешли к действиям, не забывайте, что выявление дефектов в действующей системе сложнее, чем на стадии проекта. Возвращаться к уже сделанному, когда первоначальный интерес сменился желанием пользоваться системой без проблем, совсем не хочется. А раздражение, которое может вызывать «поехавшая крыша Умного дома», не стоит нескольких дополнительных усилий, приложенных в начале работы.
Кроме того, вы все делаете для себя. Я уже говорил, что не все придерживаются точки зрение, что сопряжение управления следует делать. Вам тоже, возможно, это покажется лишним. Согласен. Но прием, о котором я рассказал, может быть полезен и в других случаях.