էս քոդվիժն սի քմփայլերը ինչ ախմախ բան դուրս եկավ։
նեսթդ քոմենթը ինչ էր որ չկարողացան անել։ էդ որպես մասնագետ եմ ասում, երեք տող բան էր ավելանալու որ կարողանա պարս անել։
ու տենց
Это одна из моих историй успеха внедрения свободных технологий, и миграции, эмиграции, бегства от технологий мс безопасности:)
В этом тексте – в основном о том, какие несвязные անկապ технические задачи возникли по ходу, и их не менее несвязные решения:)
Итак, все началось с того, что у одного ученого есть свой 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
на некоторое время, дабы модем перегружать.
А далее уже все было хорошо… Хорошо, если не вспоминать о том, что материнка компьютера в шахте была влажной от сырости, пока он не сдох, если не вспоминать о перебоях с питанием, со проблемной связью из-за Виваселл, если всего этого не вспоминать, шалость, вроде удалась! 🙂