Это одна из моих историй успеха внедрения свободных технологий, и миграции, эмиграции, бегства от технологий мс безопасности:)
В этом тексте – в основном о том, какие несвязные անկապ технические задачи возникли по ходу, и их не менее несвязные решения:)
Итак, все началось с того, что у одного ученого есть свой know how – способ улавливать колебания земли, и, возможно, прогнозировать землетрясения. Для этого он установил в шахте, на глубине 60 метров под землей свой экспериментальный датчик, ну а чтобы снимать с него данные подключил систему к компьютеру.
Однако снимать данные в течение reasonably продолжительного времени не удавалось: компьютер подвисал примерно раз в два дня, ход эксперимента то и дело приостанавливался…
Еще очень давно я утверждал, что можно все очень красиво (мсье знает толк в извращениях) реализовать с использованием опен соурс, но у меня не хватало времени. Еще я резонно предвидел проблемы с конкретным железом, которое они используют. Этим летом все-таки взялся.
Что было раньше.
Не вдаваясь в детали скажу, что вначале была матрица.
Я немножко не о той матрице, где Нео тусовался. Конечно, все делается подручными срествами, и это матрица от обычной, очень старенькой веб камеры с почти стертой, загадочной надписью Enigma.
Причем, чтобы снять картинку с матрицы, парень, который все настроил до меня, не заморачивался с изучением WinAPI и сделал то, что можно назвать аналогом юникс скриптинга, но в графике: заставил работать несколько виндовс программ вместе и передавать инфу от одной к другой.
Правда, он не смог использовать потоки, пайпы, и все такое, и у человека, не знакомого с идеями юникс, перенаправлять, скажем, стдаут в стдин мысли возникнуть не могло. Если его не зовут Деннис Ричи, конечно.
Добавлю, что парень тоже был подручный, и не являлся it специалистом, и вообщем, совсем неплохо справился.
Итак, сначала он взял программу, которая показывает изображение с видео девайса, и умеет брать снапшоты, при нажатии на кнопочку. “Только вот кто будет на кнопку жать?” – спросите Вы. Оказывается, парень поступил очень остроумно, чтобы не сказать – неожиданно: он научился программно управлять курсором мыши, (кажется с помощью ЛабВью) и заставлял ее жать на кнопку через определенные промежутки времени 🙂
Картинка, снятая матрицей обрабатывалась в том же ЛабВью, что-то считала по какой-то формуле, и писала в файл. Затем файл с данными можно было открыть в Ориджине, и полюбоваться на графики.
Все бы хорошо, но ничто не работало так, как ожидается. Ну как всегда…
Во первых, постоянно загруженный ЛабВью, и программа захвата видео сьедали слишком много памяти. Во вторых, кто-то из них активно тек памятью, памяти становилось все меньше и меньше, пока компьютер не подвисал. Вообще, в виндовсе самом полно утечек, но они, конечно, не успели бы вешать машину так часто.
К тому времени, как я взялся за дело, было также решено наладить сеть с городом, чтобы не ехать каждый раз в обсерваторию.
Телефона рабочего там тоже не было, обсерватория с коммунистических времен заброшена, хорошо хоть электричество есть.
Вот ребята еще провели 200-300 метров utp из под земли наверх, к другому компьютеру, а к нему задумали подключить gprs модем 🙂
Для меня сразу стало очевидно, что таск на компьютере с веб камерой решается крутящимся маленьким консольным скриптиком, а сам компьютер можно впоследсвии быть заменить на маленькую встраиваемую плату на основе arm или 32-битного атмела.
Скриптик мог иметь вид типа
while (true)
{
getsnapshot()
./process » data.txt
sleep 3s;
}
Обратите внимание, этот скриптик, против ЛабВью, программы видеозахвата с превью и кнопками, экплорер, не говоря уже о графике, виндовс, который сьедает под 100мб озу…
Выяснилось, что getsnapshot легче всего реализуется с помощью консольной утиливы vidcat из пакета w3cam
vidcat -d /dev/video0 -d ppm -o tmp.ppm – с камерой встроенной в мой ноутбук заработало на ура
оставалось написать консольную программу для обработки полученных данных, что много времени не заняло, и разобраться с драйверами.
Как я и опасался, почти все железо не опознавалось стандартным ядром из Debian Etch:
- какие-то новые сетевые карты
- вебкамера
- гпрс модем
Проблема с сетевыми решилась проще всего – компиляцией новейшего на тот момент ядра – 2.6.26
Вебкамера под линукс не опознавалась (файл устройства /dev/video0 ) не создавался.
Посмотрел, что за камера, lsusb выводит
Bus 005 Device 002: ID 2770:913c NHJ, Ltd Argus DC-1730
Поискав в гугле argus dc-1730, нашел чипсет и следующие строки авторства Theodore Kilgore, с которым, как ни странно, меня уже судьба сводила: я с ним общался, когда помогал добавить поддержку своего Genius Smart 300 в libgphoto2, брал usb логи, компилировал и тестировал экспериментальный код в libgphoto
http://www.qbik.ch/usb/devices/showdev.php?id=2761
—
Yet another camera with an S&Q Technologies controller chip. Seems to work just fine with existing sq905 camlib, in libgphoto2. I will add it in the CVS version. Webcam support might possibly work with the sqcam driver, too, with tweaking.
—
Ага, значит драйвер чипа, хоть и для другой камеры есть!
Ищу драйвер, нахожу, пытаюсь скомпилировать:
cvs -z3 -d:pserver:anonymous@sqcam.cvs.sourceforge.net:/cvsroot/sqcam co -P sqcam26
cd sqcam26
make
конечно облом, не компилится.
Хммм…
Хорошо, смотрю мейкфайл, нахожу такой участок:
—
sq905.o : gamma.h
gamma.h : makegamma
./makegamma
makegamma : makegamma.c
gcc -std=c99 -o makegamma -lm makegamma.c
—
Пробую
# gcc -std=c99 -o makegamma -lm makegamma.c
запускаю полученную программу
# ./makegamma
и она создает gamma.h
Теперь вновь
make
и вновь облом – интерфейсы ядра успели сильно измениться, надо хакать драйвер
Хорошо, он опен соурс… поди заставь работать какой-нить закрытый win95 драйвер в висте…
Полный список изменений сам не помню, а скачать версию драйвера, которая работает с камерой Argus DC-1730 и компилится с ядром 2.6.26 можно тута.
Итак, драйвер скомпилился!
modprobe sqcam
ls -al /dev/vi…
Жму tab, tab, tab…
Опять облом, устройство не создается…
Я уже чуть было не забил на это дело, отошел от компьютера, покрутился…
и тут дошло, что вероятно драйвер просто не определил камеру так как не знает ее usb vendor и product id’s!
Осталось только поменять:
/*Define these values to match your device */
#define USB_SQCAM_VENDOR_ID 0x2770
#define USB_SQCAM_PRODUCT_ID 0x9120
product id на
#define USB_SQCAM_PRODUCT_ID 0x913c
rmmod sqcam
modprobe sqcam
УРRRRRRRRRRRRRRRRRаааааа – работает 🙂
vidcat -d /dev/video0 -f ppm -o a.ppm
Снимок благополучно сохраняется 😉
Оставалась проблема с gprs модемом siemens mc35i
Он в упор не опознавался, поискав в инете я выяснил, что модуль cp2101
(Silicon Labs CP2101/CP2102 RS232 serial adaptor driver)
должен создать устройство /dev/ttyUSB0
и нашел массу вопросов в форумах о том, что несмотря на то, что он должен, устройство все-таки не создается
Разумеется, после сходной возни с вебкамой я просмотрел исходники cp2101.c, недолго думая добавил usb id’s модема, и он разумеется определился!
Я даже позаботился о людях тщетно спрашивающих в форуме решение, и помог им
—
cd /usr/src/linux/drivers/usb/serial
nano cp2101.c find there a place with usb product and vendor id’s and add string with your device numbers
{USB_DEVICE(0x10c4, 0x8341)}, /* siemens mc35pu gprs modem*/
Then recompile the kernel and reboot. Find new/dev/ttyUSB0 file
—
Проблемы с железом, однако не прекратились…
Мало ли, что драйвера есть…
Я не говорю о том, что свет там регулярно вырубался, а упс-а не было… Нет, я расскажу другую историю –
про подвисания того самого gprs модема Siemens mc35i
Короче, модем подвисал почти каждый раз после дисконнекта. И единственный способ заставить его работать вновь – это обесточить, вытащить usb шнур, и пихнуть обратно.
– Ну и как я ему скажу, чтобы он шнур вытащил? – вопрошаю я окружающих, ждущих решения серьезных дядек
И тут кто-то, кажется Овик (art_green{.lj-user} ) догадался, как это сделать
– Норик, ты можешь на ком порт сигнал подать, ведь можешь правда? А я соберу схему, как ты подашь сигнал, модем обесточится.
– Нэт праблэм, Дарагой! – гаварю 🙂
Короче, ребята собрали схему (спорили на транзисторе или на реле ее делать), подключили один вывод от модемовского шнура к ком порту, а я добавил в скрипт подключения и отключения от инета
cat /dev/urandom > /dev/ttyS0
на некоторое время, дабы модем перегружать.
А далее уже все было хорошо… Хорошо, если не вспоминать о том, что материнка компьютера в шахте была влажной от сырости, пока он не сдох, если не вспоминать о перебоях с питанием, со проблемной связью из-за Виваселл, если всего этого не вспоминать, шалость, вроде удалась! 🙂