среда, 19 сентября 2012 г.



Работая в команде, мы пользуемся старым добрым SVN для контроля версий. Казалось бы, причём тут микроконтроллеры?
Как раз для сигнализации очередного коммита в репозиторий я и приспособил эту дивную штуковину.



Идея

Хотелось бы такое устройство, которое будет сигнализировать мелодией об очередном коммите в любой из наших репозиториев. Было бы неплохо, чтобы у каждого разработчика была своя уникальная мелодия, и всем было бы слышно, кто только что сделал очередной коммит.

Проект

В качестве веб фронтенда к SVN прикручен WebSVN, закрытый Basic-авторизацией. Таким образом мы можем получить доступ к списку проектов и их ревизиям. В свою очередь, нам необходим процесс, который по расписанию, например раз в минуту будет проверять репозитории проектов на предмет нового коммита. Так как ближе всего к рукам был PHP, решено было писать на нём. Рабочая система — Windows 7 с Apache 2.1 + PHP 5.3.6.
При обнаружении нового коммита, скрипт посылает на COM-порт управляющую команду устройству, о том что надо проиграть мелодию автора коммита.

Итак, у нас есть WebSVN:



Средствами PHP мы парсим список проектов и заглядываем в каждый проект:
index.php

Для того, чтобы авторизоваться через Basic Auth, воспользуемся функциями библиотеки CURL.
Ещё для разбора HTML воспользуемся DOMDocument и DOM.

Т.к. с DOM из PHP работать довольно муторно, а нам достаточно взять все ссылки, воспользуемся функцией dom2array():
functions.php dom2array()


У каждого проекта есть своя страничка, в которой указана последняя ревизия и её автор.



Используя всё тот же CURL, выковыриваем номер ревизии и её автора. Парсинг через explode() и strpos() ужасен, но на скорую руку потянет.
functions.php checkSVNCommit()


Реализация банальная и местами топорная, но прекрасно работает. Читаем из текстового файлика старую ревизию и сравниваем с текущей. Если различаются, записываем и бибикаем.

Первые подводные камни

Я был на 146% уверен, что работа с COM-портами не представляет сложности. Как оказалось, старый способ fopen(«COM6:», «w+») на Windows 7 уже не работает. Не хватает каких-то прав доступа. Кроме того даже если в консоли перенаправить вывод в порт, то опять возникнет ошибка доступа. Так что из cmd (bat) — файлов у нас тоже ничего не получится, и через exec() тоже не прокатит.
Крепкое гугление вывело меня на виндовое расширение — PHP Serial.
Подключается как и все расширения, довольно просто и работает как два пальца:
functions.php beep()


Бибикало с микроконтроллером

Настала очередь программировать LaunchPad. Возьмём Energia в качестве среды разработки.
В отличие от Arduino, для MSP430 не так очевидно, как работать с Serial port. Оказывается, сужествует библиотечка TimerSerial, которая является модификацией Arduino-вской базовой библиотеки Serial.
Немного усилий, и можно писать и читать в терминал.
Пример работы с терминалом


Эта простенькая программка читает символ и тут же пишет его обратно. Как бы эхо.

Подводные камни. Продолжение.

Так, с приёмом-передачей данных разобрались. Теперь бибикало.
Стандартная библиотека Tone, также как-то видоизменена в Energia. И самое неприятное, они никак не дружат с TimerSerial. Вероятно используются общие таймеры или ещё что-то в этом духе, но вместе их использовать не получилось.
Пришлось писать свой велосипед.

Приручаем бибикало


Все заморочки решены, осталось написать код. Вообщем-то остальное довольно просто.
Объединяем и получаем наш скетч:
commit_beep.ino


Подключаем, заливаем, открываем окошко терминала, пишем туда 1, и слушаем дефолтную мелодию.



Планировщик задач

Как ни странно, но мы будем использовать именно планировщик задач для фонового выполнения нашего PHP скрипта.

Напишем CMD-файлик, который вызывает PHP и сам скрипт:
D:\denwer\usr\bin\php5.exe D:\denwer\home\test\www\commit_beep\index.php

А чтобы это хозяйство не мозолило глаза чёрным окном консоли, воспользуемся нехитрой утилитой hidconот Андрея Гречкина.

Подключение планировщика:


Последние штрихи

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




Итоги

Один день на разработку от идеи до готового устройства. Интересная и увлекательная борьба с подводными камнями и знакомство с Energia и MSP430.
Бюджет проекта ~200-300 руб.

Исходники на github.

Update: Добавил поддержку RTTTL — мелодий в хардовом режиме UART.
Для того, чтобы включить хардовый режим, надо переткнуть перемычки RT/TX 
Исходники обновил.

Posted by Автор: mp3user на 01:26
Categories:

 

 
>