Showing posts with label howto. Show all posts
Showing posts with label howto. Show all posts

2013/03/13

Windows DLL + Wine = Linux Program

Өнгөрсөн жил роботоор оффис цэвэрлүүлдэг төсөл дээр ажиллав. Тоос сорогч чирсэн (200 мянган евроны үнэтэй) хүн шиг том робот оффисийн өрөө болгоноор шагайгаад шал хаагуур халтар байгааг камер ашиглаж computer vision-ы тусламжтайгаар тогтооно. Хэдэн зуун өрөөтэй оффис цэвэрлэх тул цаг болон мөнгөө хэмнэж зөвхөн тэр халтар болсон хэсгийн л тоосыг нь сорно. Тоос сорсныхоо дараа цэвэрхэн болсон эсэхийг шалгана. Хэрвээ хэд хэдэн удаа тоос сорсон ч гэсэн цэвэрхэн болохгүй бол 3D scanner-аар тэр бохирдсон хэсгийг хэмжинэ. Энэ хэмжилтийнхээ тусламжтайгаар зүгээр будаг болсон толбо уу эсвэл бохь наалдсан овойж товойсон бохирдолт уу гэх мэтээр ангилаад мэдээллийн сан руу хийнэ. Сүүлд нь 7 хоногт нэг удаа ч юм уу цэвэрлэгч ирээд тэр мэдээллийн сан дээр хадгалагдсан арилдаггүй толбуудыг арилгана.

Надаа 3D scanner-аар хэмжилт хийх ажил нь оногдов. Цаанаас нь Shapescan3D хэмээх scanner өгөв. Зөвхөн Windows дээр ашиглаж болдог эд аж. API гээд нэг header файл болон DLL library дагаж ирсэн байлаа. Бид нар робот програмчлахдаа Robot Operating System (ROS) гэж middleware ашигладаг, тэр нь зөвхөн Ubuntu дээр л ажиллана. Тэгээд scanner-аа Ubuntu дээр хэрхэн ажиллуулах вэ гэж баахан толгойгоо гашилгав. IDA ашиглаж dissassemble хийж үзсэн болов ч туршлага дутаад олигтой амжилт олсонгүй. Wireshark ашиглаж scanner болон компьютер хоорондох communication-ийг чагнаж үзэв. Binary protocol ашиглаж байсан учир бас л сүртэй амжилт гаргасангүй.

Тэгээд аргаа бараад Wine ашиглахаар шийдэв. Урьд нь Wine ашиглаж Windows программ ажилуулж үзэж байснаас өөрөө программ бичиж DLL library дуудаж үзэж байгаагүй тул болох эсэхийг нь сайн мэдэхгүй байв. Scanner-дагаж A3DSensor.dll болон A3DSenshor.h гэж файлууд дагаж ирсний header нь иймэрхүү функцүүдтэй:


Энэ функцуудыг Wine ашиглаад Linux программаас дуудчихвал хамаг юм болчих гээд байлаа. Интернэтээс олсон энэ зааврын дагуу хийж үзэхээр шийдэв. Санасныг бодоход хялбар юм байна. DLL файлаа LoadLibrary method ашиглаж санах ойруу хуулаад GetProcAddress method-ын тусламжтайгаар дуудах гэж байгаа method-уудыхаа хаягийг олдог аж. DLL library-гаа ашиглаж дууссаныхаа дараа FreeLibray method ашиглаж санах ойноосоо буцааж устгана. Энэ гурван method гурвуулаа Windows-API.

Хамгийн түрүүнд DLL library-аа санах ойд ачааллана:


GetProcAddress method ашиглаж байгаа тул дагаж ирсэн header файлыг шууд ашиглаж болохгүй. Тиймээс бүх method-уудаа бага зэрэг өөрчлөөд дахиж шинээр зарлана. Жишээ нь


гэсэн method-ыг доорх байдлаар зарлана:


Дараа нь энэ method-ыхоо хаягийг олох хэрэгтэй:


Ингэснийхээ дараагаар method-уудаа яаг Windows дээр яаж ашиглах ёстой тэрэн шиг нь ашиглах боломжтой болно.

Программ бүтнээрээ:


Wine суулгахад wineg++, winegcc гээд compiler-ууд дагаж ирдэг. Энэ compiler-ыхаа тусламжтайгаар программаа build хийнэ:
wineg++ shapescan3d.cpp
Үүссэн программаа Linux дээр дуудхад ингэж гарч ирж байна:
$ ./a.out
Version: 2500

Яаг энэ аргаар бусад бүх method-уудаа зарлаад scanner-аа 100% Linux дээр ашиглаж болдог болгов. Wine ашигласны нэг сайн чанар нь бичиж байгаа программандаа Linux-API, Windows-API дураараа хольж болдог юм байна. Тэгээд бичсэн программ маань Linux программ гэхэд ч хэцүү Windows программ гэхэд ч хэцүү hybrid юм болвоо хөөрхий :)

2010/06/10

Сериал портоор файл солилцох

Crosspost: http://embeddedsystem-mn.blogspot.com/2010/06/blog-post.html

Сүүлийн хэдэн хоног хамаг цагаа оцон шувуу үйлдлийн системтэй Artila PAC-5010 хэмээх ARM9 эмбэддэд хавтантай ноцолдож өнгөрөөв. Сэриал портоор (монголчууд COM порт гэж яриад заншсан болохоос биш жинхэнэ нэр нь UART/RS232 юм) холбогдоод шууд бүрхүүл рүү нь хандаж болдог аж. Ингэж холбогдон хавтангаа тохируулах явцад өөрийн төмрөөс хэдэн ширхэг файл хавтан уруугаа хуулах хэрэгтэй болов. Энэ тохиолдолд хамгийн амархан арга нь хавтангаа сүлжээнд холбоод FTP/SSH ашиглан хуулах юм. Харамсалтай нь ойр хавьд илүү switch байгаагүй тул сэриал портоор файлаа зөөхөөс өөр аргагүйд хүрэв. Ингээд Гүүгл ахаас асуугаад kermit гэж програм байдгийг мэдэж авлаа. Энэ програмыг 80 аад оны дундуур хоорондоо хол орших төмрүүдийг утасны сүлжээ ашиглан модемоор холбож хоорондоо файл солилцоход ашигладаг байжээ. Одоо бол эмбэддэд систэм уруу сэриал портоор файл солилцоход л ашигладаг юм байна. За ингээд kermit ашиглан хэрхэн файл хуулах талаар бичье: Эхлээд хэрэглэгчийн үндсэн хавтас дотор (эмбэддэд хавтан болон өөрийн төмөр дээр тус тус) .kermrc файл үүсгээд доорх текстийг хуулаад хадгалаарай.

set line /dev/ttyS0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
Эхний мөр нь ямар сэриал порт ашиглан холбогдох вэ гэдгийг заана. Би эмбэддэд хавтан дээрээ /dev/ttyS0 ыг харин төмөр дээрээ USB2Serial хувиргагч ашигласан тул /dev/ttyUSB0 гэж тус тус бичсэн. Бусад мөрүүдийг өөрчлөх хэрэггүй. Эмбэддэд хавтангийн бүрхүүл дээр kermit -r гэж бичсэний дараа KERMIT READY TO RECEIVE... гэж гарч ирэнгүүт тэрминал программаа хаагаарай (тэрминал программаа хаахгүй бол сэриал порт чинь чөлөөлөгдөхгүй). Одоо төмөр дээрээ kermit -s filename гэж бичвэл файл тань хавтан руу хуулагдаж эхэлнэ.