Умный дом

Программа для компьютера в KDevelop

Причина, по которой я хочу рассказать о другой среде про­граммирования, именно KDevelop, работающей с операци­онной системой Linux, - в ее большей доступности для мно­гих, чем Visual Basic. Эта среда программирования входит в состав многих Linux-дистрибутивов. Хотя она и не един­ственная в них.

Итак, я предполагаю работать с релейным модулем. По этой причине я программирую микроконтроллер соответствующим образом и загружаю на компьютере ASPLinux. Я уже говорил, что эта операционная система поставляется с огромным коли­чеством приложений, в частности, и для разработки программ.

Запускаем программу KDevelop. Моя версия в данный момент предоставляет в меню запуска возможность выб­рать язык программирования и вариант проекта, хотя это можно сделать и несколько позже. Итак, я запускаю KDevelop в разделе основного меню Приложения Разра­ботка KDevelop KDE/C++. Если это первый запуск, ни один проект не открывается, если повторный запуск, открывается последний проект, над которым вы работали. Для создания нового проекта предыдущий следует закрыть и выбрать в меню KDevelop Проект Новый проект (рис. П.8).

Файл Правка Вид Проект Оборка Отладка Сценарии Qmo Сервис Ьжтройка j

Sactanu»

А «і

ЕЙКОЕ

■*»Appicaflc framework KParts) IftKate plugin w»h con»o page ifcKFIepkigin -*lKHTMLP«rt plugin 4Ц Kicker Applet 3&KIO slave #KOicePart

^•Conqueror Navigation Panel Plugin &Noatun visuatoaflon plugin ^Score-based KMDI applcafen feSlmple DCOP server %Smple Designer based КОЕ Applcatton «Simple КОЕ Application fcY^ekm bynthatqcf Noabn

Импорт иэ КВе

_

[

□ □оказать все шаблоны проекта

FoonWvladn»/

Конечное расположение /homaMacfcntf (неверно)

- W'ya»»** Поиска»

.Заменить MKonsoie

АПР*ж*в«ЙР Просмотр различий О О Создать новый проект иэ шаблона

Рис. П.8. Создаем проект в KDevelop

В диалоговом окне выбираем С++ KDE Simple Designer based KDE Application, задаем имя проекта (в дан­ном случае - book) и место его расположения (в данном слу­чае - домашняя папка пользователя) - рис. П.9.

Теперь нам остается щелкнуть несколько раз кнопку Next, при этом можно сделать уточнения, относящиеся к проекту, но эти действия можно осуществить и позже. Заканчивается

Вид Проект Сборка Отладка Сценарии Окно Сервис Настройка Справка

Все проекты ДОраиное

Эйк0є

& Apple aOon framework (KParts)

Kale plugin w*h conig page ^KFileplugm ttKHTMLPart plugin ifcKicker Applet &KIO slave «.КОвсе Part

2«йл Ораека

®QQ Q

■ftKonqueror Navigation Panel Plugin &Noatun visualization plugin iatSconvbased KMDI application «.Simple PCOP server

^Simple КОЕ Application аУЦкт byrrthatqef Noatun «.Импорт из KBear

Оокаэать все шаблоны проекта

Jbook2

./home/vladimW

Имя приложения; Е«с положение: Конечное расположі

□ВЕЗ fern

•.Приложение 4 Просмотр различий О Сообщении # Vatgrind Щ Поиск в файлах iX Заменить]** Console] Создать новый проект из шаблона

Рис. П.9. Выбираем тип проекта в KDevelop

Оформление проекта, когда кнопка Next превращается в кнопку Готово, которую и щелкаем в последний раз, получая проект.

Щелкнув на правой инструментальной панели ярлычок Automake Manager, открываем окно менеджера, в котором можно открыть все файлы проекта и файлы заголовков двой­ным щелчком кнопки мышки. Я открыл файл bookwidgetbase. ui (рис. П.10).

Файл интересен тем, что относится к встроенному редак­тору интерфейса программы. Окно с кнопкой Click Me! по­явится после компиляции и сборки проекта при запуске про­граммы. Для компиляции и сборки сначала в основном меню выбираем Сборка Запустить automake и др... В нижней части открывается окно сообщений, где показывается про­цесс сборки (рис. П. 11).

Затем мне приходится сделать лишнее «телодвижение» - после одного из экспериментов в KDevelop с разными язы­ками программирования мне приходится поправлять файл configure. sh, который находится в папке проекта book.

Программа для компьютера в KDevelop

Рис. П. 10. Встроенный графический редактор KDevelop

T к д ft R у

M

Fe jl(noftincflon) Щ^ДОО iff С® ?> 6

Abook2xpp fenttwUgetbe^

•Dont target to fun /conDgure

•if you hevent done so In a while, run Усопідиге - help

£ jj фияожеш»-• ■ Просмотрржшичий < V«)grind.^ ^Поискефайлах^ уЗамениг»]*4 KoneotT.

I Строка 3 Столбу 23 ВСТАВКА ОБЫЧНОЕ •

Рис. П.11. Окно процесса сборки проекта

Я открываю файл текстовым редактором, удаляю показанную часть текста почти в самом начале файла и сохраняю файл:

# Support unset when possible.

If ( (MAIL=60; unset MAIL) I I exit) >/dev/null 2>&1; then

As_unset=unset else

As_unset=false fi

Без этой операции появляются сообщения об ошибках при конфигурировании проекта, которое запускается в разделе основного меню Сборка Запустить configure. После завер­шения этого процесса можно запустить сборку Сборка Со­брать проект или сразу запустить программу Сборка Вы­полнить программу, что приведет к сборке проекта и запуску программы.

Есть еще один момент, который привел меня в замеша­тельство, но, возможно, это тоже результат моих экспери­ментов. Не получалась работа с графическим редактором интерфейса. Для его нормальной работы в опции проекта Проект Project Options Поддержка С++ на вкладке Автодополнение кода в части Code Complection Databases понадобилось с помощью кнопки Добавить добавить под­держку Qt (рис. П. 12).

После создания базы проблема перестала беспокоить. Qt, насколько я понимаю, - это мощная библиотека, поддержи­вающая графику. Разработана она фирмой Trolltech. Все гра­фические объекты интерфейса - объекты этой библиотеки. Но вернемся к проекту.

Если теперь щелкнуть кнопку появившегося окна book Click Me!, появится традиционное для языка С - Hello World! Таким образом, почти незаметно для себя мы написали пер­вую программу на языке С++, работающую с операционной системой Linux.

Теперь хотелось бы эту программу превратить в то, что нужно нам. Меня беспокоят некоторые аспекты пред­стоящей работы, но для начала я, выключив работающую

$айл Оряека Вид Проект Сборка Отдадса Сценарии Заклады» Окно Сервис Ьастройка Справка

Дааярг

...

250 ffl миллисекунд

93 • . жа символов иэ 6и( О Загрузка символов иэ люі

^ (по function)

Программа для компьютера в KDevelop

3 Поддержка С++

Общие

4

Fl6a>«e jfflt ]А»те-Яопоянениекада fcdeToaw доступа

Выбор библиотеки

^Управление вере - ОЗ ка символов иэ библиотеки KDE iba хранилище w

І Загрузка символов иэ любого каталога в хранилище к»

0

Документация проекта

Программа для компьютера в KDevelop

І^алить

J

Fmtel* •Oontferge •if you have Успей

ГШ Овт»

' Дале»» j Обмена

Л Приложение Просмотр различий 'фТЩЩт1!? Valgrind Поиск а файлах ^ ^ Ф Security Patterns 0 Точки останова ^сТав» 0 Проблемы Параметры проекта

Рис. П. 12. Добавление поддержки Qt

Программу, возвращаюсь в редактор интерфейса к файлу bookwidgetbase. ui. С этой небольшой проблемой я столкнусь позже, но хочу устранить ее сейчас. Существо проблемы в том, что возникают некоторые неприятности с изменени­ем интерфейса, а, изменив интерфейс, я не смогу справить­ся с размерами окна при запуске программы. Окно останет­ся в том же первозданном виде, что и при первом запуске.

Основу интерфейса, как и в других средах программиро­вания, составляет форма, на которой размещаются кнопки, этикетки и т. д. - все составляющие формы. Кроме нее откры­та инструментальная панель (слева), менеджеры проекта, свойств формы и ее составляющих (справа).

Для устранения проблемы, вероятно, есть более правиль­ные пути, но я пошел следующим - щелкнув правой кнопкой мыши форму, в раскрывающемся меню выбирал пункт Разор­вать расположение.

Строка. 3 Столбец 23 ВСТАВКА ОБЫЧНОЕ ♦

Теперь я могу работать с формой. На форме в данный момент одна этикетка - label, и одна кнопка - button. Для начала я увеличу размер формы и поменяю местами компо­ненты, изменив их размер (рис. П. 13).

Программа для компьютера в KDevelop

Файл Правка Виа Проект Сборка Отдака Сценария Еослоложение Окно Сервис Цастроика Справка

SQQ&titGi 4

$ :;(no (uncson)" fcfr 3 5 О Q №№(??> ^ BE и III = 8 н I I M

Ft 1 , bookZxpp ^book2widgetba3e. g) |

.ss

«Пиюжаииа Просмотр рамичий ОСоо&цани* т Va^riod <4 Поиске фаимк Заменить ' ^CTees. O Проблемы

Рис. П. 13. Работа с формой в KDevelop

Кнопку я позже использую для работы с портом, а этикет­ку - для вывода сообщений о состоянии порта. Добавим раз­делители, как показано на рис. П. 14. Щелкнув правой кноп­кой мыши форму, выбираем в раскрывающемся меню Lay Out in a Grid. Теперь при запуске программы окно приобре­тает вид, который бы мне хотелось видеть.

Однако вернемся к проблемам, вызывающим у меня бес­покойство. Я бы сформулировал это так: «Плохо, когда забы­ваешь то, что не знаешь. Особенно, если забываешь, что ты этого не знаешь!».

Производственная необходимость некогда заставила меня обратиться к языку С++, на котором я написал небольшую программку. Для знакомства с языком я законспектировал оригинальную версию книги Липпмана «Основы С++». С тех пор прошло достаточно времени, чтобы я все забыл. По этой причине я добавлю «шпаргалку», постаравшись не использовать сложные синтаксические или программные конструкции.

E О Secuty Problems ©ТочюкостаковІ

Первое, что я запишу, поскольку всегда путаюсь.

Программа для компьютера в KDevelop

Рис. П. 14. Придание форме нужного вида Указатели в С.

Пусть мы имеем переменную с именем var типа int (целое): int var;

Теперь создадим другую переменную, которую назовем: int* p_var.

Появившаяся звездочка говорит, что переменная p_var - это указатель. Если теперь мы присвоим этой переменной следующее значение:

P_var = &var,

То в переменной p_var будет храниться адрес первой переменной. Положим, есть еще одна переменная:

Int new_var

Мы можем добавить к первой переменной единицу, присвоив ре­зультат новой переменной:

New_var = var + 1

Но в языке С то же можно записать, используя указатели new_var = *p_var + 1

Звездочка в данном случае говорит о том, что мы используем значе­ние переменной, адрес которой хранит переменная p_var.

Таким образом, &var - указывает, что используется адрес пере­менной var.

Int* p_var

P_var - это указатель, *p_var - показывает, что использует­ся значение переменной, на которую указывает p_var. Указатели могут указывать на переменные, функции, другие указатели и т. д.

Не знаю, поможет ли вам моя шпаргалка, но для себя я ее оставлю, тем более что в «С++» без звездочек, разбросанных по всему тексту, шагу не ступишь.

Еще одна деталь. Когда я впервые столкнулся с KDevelop, это была версия без интегрированного в нее редактора интер­фейса. Для этих целей использовалась отдельная программа Qt Designer (она и сейчас входит в дистрибутив). И это не единственная возможность создать графический интерфейс, как и KDevelop не единственная среда разработки на языке С. Объединение программы на языке С++ и графического интер­фейса выглядело несколько иначе, что заставляет меня, как мне кажется, сейчас делать много ненужного. Но я не собира­юсь поразить воображение пользователей необычным дизай­ном программы, по причине чего не хочу пока разбираться с этим вопросом. В памяти осталось, что Qt Designer использу­ет понятие слотов. В моем представлении, слот - нечто вроде гнезда, в которое вставляется модуль, как в материнскую плату вставляется модуль памяти. Используется и понятие сигналов, что для меня равносильно понятию использования выводов разъема. Через его выводы модуль получает сигналы от мате­ринской платы или сам передает сигналы материнской плате.

И, действительно, открыв в KDevelop файлы bookwidgetxpp и bookwidget. h, в последней находим слот:

Public slots:

/* $ PUBLIC_SLOTS$ */

Virtual void button_clicked();

А в первой находим сигнал, относящийся к этому слоту:

Void bookWidget::button_clicked() {

If ( label->text().isEmpty() ) {

Label->setText( - Hello World!" );

}

Else {

Label->clear();

} }

Этим для начала я и воспользуюсь, хотя, подозреваю, есть более простые способы реализовать то, что мне надо. В первую очередь я хочу переименовать кнопку из button в port_open. Я делаю это на вкладке bookwidgetbase. ui. В Object Explorer выбираю button, а в Property Editor в графе name меняю имя с button на port__open. Щелчком правой кнопки мыши откры­ваю меню, выбираю Слоты, где меняю имя слота. Повторяю это, выбирая Соединения, где в разделе слот указываю новое имя. Затем меняю, чтобы не путаться в файлах. срр и. h имя:

Void bookWidget::port_open_clicked() virtual void port_open_clicked();

Сохраняю эти файлы. Пытаюсь сохранить файл bookwidgetbase. ui, но он не хочет сохраняться. Тогда в выпа­дающем меню формы выбираю Разорвать расположение, сохраняю файл и повторяю Lay Out in a Grid, сохраняя файл.

В итоге проект собирается и запускается. В редакторе ин­терфейса я добавляю кнопки, которые называю port_close и ButtonGroup (и то, и другое из меню Common Widgets сле­ва). Текст группы кнопок я меняю на Гостиная (двойной щел­чок текста на форме открывает редактор текста). Пока не за­был, я вношу добавления в файлы bookwidget. cpp:

Void bookWidget: :port_close_clicked() {};

И bookwidget. h:

Virtual void port_close_clicked();

Затем открываю в редакторе интерфейса раздел Слоты и добавляю новый слот с помощью кнопки Добавить функ­цию:

Рогt_c1osе_сlicked()

Отказываюсь генерировать новый класс. Добавляю новое соединение с помощью раздела Соединения и кнопки Но­вое, щелкая левой кнопкой мыши ячейки таблицы:

Sender - port_close Сигнал - clicked() Receiver - bookwidgetbase Слот - port_close_clicked()

И все сохраняю.

Для завершения этого этапа работы я добавляю еще две кнопки Свет включить, Свет выключить и из раздела инст­рументального меню Display этикетку PixmapLabel. Их я пока не оформляю. С PixmapLabel история простая - я попытался сделать включение и выключение ламп, как это делал в Visual Basic, но не получилось. Я не стал на этом «зацикливаться» и решил обойти проблему. В графическом редакторе KolourPaint я делаю полоску 850x80, которую закрашиваю в желтый цвет, а картинку сохраняю как light (рисунок Portable Pixmap) в папке проекта. Теперь картинку по умолчанию я поменяю на свой рисунок, который и будет изображать включенный свет (рис. П.15).

Под кнопкой Свет выключить на основной форме я рас­положил еще одну TextLabel, которую назвал answer. Ее я предполагаю использовать для получения ответа от релей­ного модуля для запроса статуса реле.

Вот, собственно, что я предполагал сделать в графичес­ком плане. И хотя по дороге я несколько раз наступал на грабли, это были еще не «те» грабли.

С самого начала меня беспокоила и продолжает беспоко­ить сейчас возможность работы с СОМ-портом. Среда про­граммирования в явном виде не предоставляет мне такой возможности, как это было в Visual Basic. Первое, что прихо­дит в голову, - поискать в Интернете. И не напрасно. Я нахо­жу пакет qextserialport -0.9.0, автор которого:

І Правка Вид Dpoerr Сборка Отдадка Сценарии £асположаниа Qkmo Сдоис Цастоойка Ставка

~ ЩДЗО Q <S її т т Ш Л Н I щ: и

Программа для компьютера в KDevelop

Рис. П. 15. Изображение включенного света в программе

class Posix_QextSerialPort version 0.-70 (pre-alpha) author Wayne Roth

Предлагает исходные тексты классов объектов для кросс- платформенного применения при работе с последователь­ным портом.

С объектами разных классов мы, в сущности, уже рабо­тали, когда создавали интерфейс. Почитав у Липпмана то, что относится к классовой сущности языка С++, я в какой - то мере осознал, что класс - это классно. Но как применить наверняка очень полезное и грамотное творение Вэйна Рота к моей простенькой программе, я понять не могу. Однако почти уверен, что есть разные пути и способы, и по­чти уверен, что я их не знаю. Для начала я просто создаю собственный класс, который добавляю в программу. Посколь­ку этот механизм работает, я, не мудрствуя лукаво, добавляю в программу исходные тексты программы, написанные Вэй - ном Ротом. Для моих целей хватает posix_qextserialport и qextserialbase. Я добавляю в проект и файлы заголов­ков, и основные файлы.

Второй, быть может не менее важный для меня момент осознания, - куда и что добавлять? Я понимаю, что следует записать:

#include <posix_qextserialport. h> #include <qextserialbase. h>

Но куда? И опять я, не мудрствуя лукаво, добавляю эти записи в файл, где происходят все события моей программы, - bookwidget. cpp и его файл заголовка. Не знаю, насколько это правильно, но это срабатывает. Программа транслируется без ошибок, проект собирается. Кстати, проект, который я собирал, я назвал так же, как в Visual Basic - barby (по име­ни богатой куклы - Barbie).

К этому проекту и обратимся в дальнейшем. Его графический интерфейс выглядит практически так же, как выше приведен­ный. Файл barbywidget. cpp (аналогично файлу bookwidgetxpp) выглядит следующим образом.

Умный дом

Вторая версия основной программы на языке С++

/****************^ * TOC o "1-3" h z Copyright (С) 2006 by Vladimir Gololobov * * vgololobov@yandex. ru * * * * This program is free software; you can redistribute it …

Циклы

Циклы выполняют выражения или блоки выражений до тех пор, пока выражение условия не становится истинным. Наша программа требует двух циклов (один вложен в дру­гой). Пока пользователь желает угадывать последовательно­сти: { …

Две полезные схемы

Первая схема относится к настенному выключателю, работа­ющему по протоколу XI0. Что полезного можно почерпнуть из этой схемы? Например, организацию сканирования сети и управления триаком. Схему я привожу, как она сохранилась …

Как с нами связаться:

Украина:
г.Александрия
тел./факс +38 05235  77193 Бухгалтерия
+38 050 512 11 94 — гл. инженер-менеджер (продажи всего оборудования)

+38 050 457 13 30 — Рашид - продажи новинок
e-mail: msd@inbox.ru
msd@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

Оперативная связь

Укажите свой телефон или адрес эл. почты — наш менеджер перезвонит Вам в удобное для Вас время.