Virtual Serial Podrt Driver na ratunek!

Znalazłem wirtualny sterownik dla portów szeregowych i okazało się, że działa całkiem dobrze :) DosBOX otwiera go bez najmniejszych problemów. Program czytający dane z /dev/input/mice też otworzył go bez problemu. Po krótce - moje starania nie poszły na marnę.

Uruchomiłem więc czym prędzej The Settlers 2 i włączyłem grę na 2 graczy. Przepisywanie danych oczywiście działa bez zarzutu jednak niespecjalnie tak jakbym tego chciał ;) Myszka drugiego gracza w S2 zaczęła się poruszać bardzo chaotycznie.

Przypuszczam, że problemem jest inne kodowanie danych myszy USB oraz COM więc będę musiał coś wymyślić. Wie ktoś może jak wygląda takie kodowanie dla myszy na COM oraz myszy na USB? Znając format danych bez problemu mógłbym napisać programik który robi co trzeba…

Gdyby ktoś wiedział proszę o informacje, a sam w tym czasie poszperam w Google ;)

Napisane w Bez Kategorii. Tagi: . Komentarzy: 2 »

Linux, DosBox i /dev/ttyS0

Jak wiadomo - programista nie pracoholik - grać musi. Co należy jednak zrobić gdy jego sprzęt nie daje mu do końca takiej możliwości?

Wbrew pozorom, nie chodzi wcale o granie w super-wypasionego MMORPG’a - chodzi o grę starą i niemalże zapomnianą: The Settlers 2. Jaki więc mam problem skoro bóg zesłał programistów, którzy napisali DosBOX’a nawet na Linuksa?

Problemem jest gra na dwóch graczy. Każdy kto grał w The Settlers 2 wie o co chodzi - trzeba podłączyć 2 myszki, z czego co najmniej jedna musi być na porcie szeregowym (COM). Niby nic, ale co jeśli nie ma takiego portu? ^^ Np. ja w moim laptopie go nie mam i tutaj zaczynają się schody.

Poszperałem trochę w internecie i znalazłem informację, że porty szeregowe w linuksie reprezentowane są przez pliki /dev/ttyS* ( * - numer portu 0-3 [odpowiednio COM1-4] ). Istotne też, aby pamiętać, że ‘S’ ma być duże ;) Znalazłem taki port u siebie w katalogu /dev jednak nie mam pojęcia co mogę z tym zrobić dalej skoro nie mam takiego portu fizycznie? ^^

Napisałem nawet program który czyta dane z portu myszy ( /dev/input/mouse* ) i wysyła je na /dev/ttyS0 ale niestety sam DosBOX nie chce czytać tego portu zwracając przy starcie komunikat o błędzie:

Serial1: Opening /dev/ttyS0
tcgetattr failed with error 5.

Nie mam zielonego pojęcia co oznacza kod 5 bo nie mogłem znaleźć tego w internecie, ale pewnie ma to związek z brakiem fizycznego portu rs232 w moim laptopie.

Nasuwa mi się na myśl tylko jedna rzecz - jakiś wirtualny port szeregowy. Pytanie tylko czy to podziała… Może ktoś ma jakiś pomysł co do tego? Jestem otwarty na pomysły :)

Nowe rzeczy

Projektowanie aplikacji/biblioteki od nowa - jeśli napisało się ją już wcześniej, ma swoje ogromne zalety. Można poprawić wszelkie niedoróbki i usprawnić to co usprawnienia wymagało.

Przykładem takiego usprawnienia jest wreszcie napisany przeze mnie (jednak jeszcze nie do końca) Resource Manager. Zastosowanych kilka reguł OOP-u i już mamy całkiem fajny kawałek kodu, który jednocześnie daje się rozszerzać bez większych problemów.

Aktualnie Resource Manager składa się z dwóch części - menedżera zasobów oraz fabryki zasobów. Fabrykę można uczyć tworzenia nowych zasobów w trakcie działania programu więc programista używający AGE będzie mógł sam dodać nowy typ zasobu w zależności od potrzeb.

Obiekty tworzy się za pomocą linii tekstowych postaci:

{resource type} "{resource name}" "{resource arguments}"

Przy czym: {resource type} jest nazwą typu zasobu (np. texture, sample itp.), {resource name} jest nazwą zasobu używaną do zidentyfikowania go przez Resource Manager’a. Ostatni argument {resource arguments} jest już argumentem zależnym od typu zasobu jaki dodajemy. Przykładowo dla tekstury będzie to tylko ścieżka do obrazka.

Kolejną dobrą wiadomością jest to, że udało mi się zmusić AGE do odtwarzania utworów. Tutaj mamy dwie możliwości:

  • odtwarzanie sampli (w kółko lub pojedyńczo)
  • odtwarzanie całych utworów

O ile odtwarzanie sampli jest raczej prostą sprawą - załadować, włączyć i gra - o tyle utwory są zorganizowane trochę inaczej. Otóż utwory można ładować za pomocą ageMusicPlayer. Ten to również obiekt pozwala wybrać i zacząć odtwarzanie losowego utworu załadowanego do listy lub też odtwarzanie utworu o konkretnym numerze. Opcjonalnie można także ustawić losowanie następnego (innego niż przed chwilą grał) utworku. W ten sposób otrzymujemy coś na kształt MP3 player’a ^^

Klasy od dźwięku wymagają jeszcze drobnych usprawnień i kosmetycznych zmian, ale już potrafią zrobić trochę hałasu :)

To właściwie tyle z rzeczy które ostatnio robiłem. Teraz powinienem dopracować menedżer zasobów oraz odtwarzanie dźwięku, a później… to się jeszcze zobaczy ^^

Napisane w Programowanie. Tagi: . Bez komentarzy

AGE

Niestety nie było mnie stać na wymyślenie jakiegoś ciekawego tytułu notki więc niestety jest jaki jest… Ale nie tytuł jest najważniejszy! Zebraliśmy się tutaj, aby dowiedzieć się czegoś na temat tego co dzieje się z AGE.

Na początek - postanowiłem wreszcie porzucić zestaw GEdit+Makefile na rzecz środowiska Code::Blocks. Na początku w GEdicie było fajnie, ale niestety w miarę jak rozrastał się projekt przestał mi wystarczać taki zestaw ^^

Drugą, równie ważną, sprawą, jest to, że sprawdziłem wczoraj wieczorem (ok - w nocy) czy AGE skompiluje się pod Windowsem. Bałem się, że nie będzie to należało do przyjemnych doświadczeń. Jak się okazało - nie taki diabeł straszny jak go malują :) Najwięcej czasu zajęło mi ściąganie bibliotek SDL oraz Code::Blocks pod windowsa ;) Potem stworzyłem projekt, dodałem pliki z kodem źródłowym i włączyłem kompilację. Wyrzucił kilka warning’ów odnośnie porównywania signed-unsigned, i jeden błąd.

Okazało, się że w użyłem w jednym miejscu nazwy jaka istniała już jako definicja preprocesora w windows.h. Na szczęście poprawienie tego stanu rzeczy nie zajęło więcej niż minutę. Ponowna próba kompilacji i…. udało się :) AGE skompilowało się na Windows z drobnymi poprawkami!

Okazuje się, że decyzja o użyciu SDL+OpenGL była całkiem dobra - przynajmniej względem przenośności kodu. Osiągnąłem całkiem zadowalające efekty dość niskim kosztem.

Ech.. uruchomienie tego samego kodu i zobaczenie go w akcji w 2 systemach sprawia ogromną radochę ;) Polecam wszystkim wypróbowanie ^^

Raport z pola bitwy: AGE

Ostatnio niewiele miewam czasu na programowanie dla siebie więc i postęp prac jest raczej marny. Główna zmiana jaka nastąpiła to pozbycie się GLUT na rzecz SDL do spółki z OpenGL. Postanowiłem wykorzystać jednak SDL ze względu na to, że mam więcej dane z urzędu bez straty wieloplatformowości.

Druga rzecz, o której wypadałoby napisać to dodanie (w końcu) wczytywania tekstur oraz renderowania ich jako obrazków na ekranie. Jak widać na załączonym obrazku (^^) działa ona całkiem dobrze.

W kwestii wydajności - to jest jeszcze do poprawy :) W tej chwili przy rozdzielczości 640×480 renderowanie 500 takich kwadracików spowalnia AGE do ~45 FPS. Nie jest źle, ale sądzę, że może być lepiej - to wymaga głębszej analizy tego co się dzieje podczas rysowania ;)

Następnym moim krokiem będzie dodanie większej ilości obsługiwanych formatów plików. Aktualnie działa tylko BMP, a to nie jest szczyt marzeń ;) Nie wiem jeszcze czym powinienem zająć się dalej - menedżer zasobów czy obsługa dźwięku? Skłaniam się w stronę dźwięku, ale to głównie dlatego, że menedżer zasobów to poważna sprawa, a aktualnie nie chce mi się specjalnie nad tym myśleć :P

Jaką decyzje podjąłem dowiecie się w następnym odcinku… :)

Napisane w Programowanie. Tagi: . Komentarzy: 7 »

Wierszydła

Dzisiaj rozmawiałem ze swoją lubą za pośrednictwem internetu, jak to często czynię kiedy nie da się inaczej. W pewnym momencie, wpadła ona na pomysł napisania jakiegoś wierszyka o kodzie. Zapaliła się do tego i już po kilku sekundach podała mi gotowy wiersz o następującej treści:

Kod (by Lymha)

O wielki kompilatorze!
Jesteś niczym bezkresne morze.
Gubię się czasem wśród wysokich twych fal,
gdy kolejny error czerwieni się cał.
Szukam wtem zmory, co psuje me plany,
przecinek, średnik, zielone banany.
Komentarz niejasny, same ciemności,
Cóż to za funkcja, czemu tu gości?
Chaos pochłonął cały mój kod,
Nic już nie zmienię, wielki mój błąd,
Oglądam tańczące z nawiasami kolory,
main, swap i inne potwory.
I gdy szanse moje spadły do zera,
mina programisty - bohatera!
Odnalazłem źródło mych kłopotów,
powód jakże niskich lotów,
Kropka miast średnika,
I fałszywa gra muzyka!
bałaganu narobiłem, mówiąc wykrętnie,
lecz triumfalnie, skompilował bezbłędnie!

Można go znaleźć także pod adresem: http://lymha.deviantart.com/art/Kod-82931771

W trakcie dalszej rozmowy naszło mnie na napisanie czegoś na temat konfiguracji sieci w Linux-ie (nie chciałem być gorszy :P). Zajęło mi to nieco dłużej bo nie mam specjalnie lekkości pisania takich rzeczy, ale wyszło mi coś takiego:

Sieć (by Moriturius)

Pod Linux’em chciałem raz,
pooglądać stronek garść.
Zatem config czekał mnie,
co miał zająć minut dwie.

Rozpocząłem więc przygodę,
razem z man-em ruszam w drogę.
wireless-tools’y potrzebuję,
więc je sobie apt-get’uję.

Gdzieś na forum mi gadają,
że mad-wifi radę dają.
Ściągam i mam sprawdzić chęć,
nadal mi nie działa sieć!

Na ndiswrapper’a pora,
choć odradzają potwora.
Tenże jednak bardzo dobrze,
rządzi kartą sieci mądrze.

Tyle zachodu - tylko po co?
By oglądać baby nocą…

Jak widać różne pary zakochanych mają różne zboczenia, zwrotnice, if-y i switch-e. Jedni piszą do siebie o miłości, a inni, napełniając się wzajemnie natchnieniem, tworzą wiersze o kodzie bądź instalowaniu sterowników WiFi… Jakież to romantyczne, prawda? :)

Napisane w Humor. Bez komentarzy

AGE pod Linuxa, vol. 2

Mimo iż sądziłem, że nie będę pisał wszystkiego od nowa - rzeczywistość chciała inaczej. Po obejrzeniu tego co miałem napisane stwierdziłem że strasznym bezsensem byłoby używanie tego kodu drugi raz skoro jest napisany jakby moja mama mówiła do mnie za młodu w Pascalu.

Straszliwy i wszechobecny bałagan nakłonił mnie do podzielenia wszystkiego na odpowiednie namespace typu: core, video, io, system… etc. Oczywiście wszystko to zamknięte jest w namespace-u age. Popełniłem także coś co tygryski lubią najbardziej - napisałem własne klasy do obsługi list i do obsługi łańcuchów znaków.

Aktualnie zakodzone i działające rzeczy to:

  • ageString
  • ageList<>
  • ageLog - to jest jeszcze ro rozbudowania
  • i/o klawiatury oraz myszy
  • ageTaskManager oraz ageTask - klasa bazowa dla tasków menu albo samej gry
  • ageVector - do obsługi wektorów
  • ageMatrix - do obsługi macierzy
  • ageRect - reprezentacja prostokąta + kilka funkcji takich jak Intersection czy Union
  • wyświetlanie linii, krzywych, prostokątów oraz zamalowanych prostokątów w różnych kolorach

Następną rzeczą do zrobienia jest wreszcie jakieś ładowanie tekstur, menedżer zasobów i jakaś klasa do wyświetlania obrazków na ekranie ^^. Warto byłoby także dodać jakąś obsługę wyświetlania tekstu.

Z takimi planami na przyszłość muszę jednak poczekać bo nadchodzi kolokwium z Analizy Matematycznej i Systemów Operacyjnych…

AGE pod Linuxa

Jako, że ostatnio korzystam z Ubuntu, a kod z MS VC++2k8 używający DX9 jest średnio chętny do działania w tym środowisku, postanowiłem napisać AGE w pewnym sensie od nowa.

Nie jest to oczywiście takie zupełnie “od nowa” ale czeka mnie dużo pracy, ponieważ chcę na początek pogrupować klasy w jakieś moduły i dodać trochę zalet obiektowości. Dodatkowo mam plan aby kod, który napiszę działał także pod Windows.

Oczywiście wykorzystam do tego celu OpenGL i wątpię abym zrobił możliwość wyboru pomiędzy OpenGL a DX pod Windows - tak jak to jest np. w Irrlichcie. Chcę po prostu wykorzystać to czego się nauczyłem podczas programowania AGE do tego aby zaprogramować je jeszcze raz, tylko że lepiej :)

Pierwsze testy pisania aplikacji OpenGL dla Linuxa mam już za sobą (ech te kolorowe trójkąty :D). Teraz czeka mnie raczej praca bardziej projektowa niż kodowanie, ale postaram się ciągnąć jakoś oba w miarę równolegle aby praca szła szybciej.

Wish me luck ^^

Oswajanie wxWidgets

W związku z zainteresowaniem się systemem Linux odkryłem, że moje zdolności programowania okienek w Win32 są raczej zbędne :) Potrafię co prawda zmusić do pracy Qt, ale ma on dziwną licencję której fajniej byłoby uniknąć ;)

Z powyższego rozumowania można wyciągnąć tylko jeden wniosek - czas zająć się wxWidgets. Kiedy rozpocząłem pisanie pierwszych programów od razu przypomniało mi się, dlaczego wolałem Qt… Po prostu jego dokumentacja jest wygodniejsza w użyciu i wszystkie informacje są w jednym miejscu. Jesli chodzi o dokumentację wxWidgets… lepiej pominąć tą kwesię zgrabnym milczeniem.

Ja oczywiście nie zamierzam tego robić. Dokumentacja pierwszych wersji była bardzo niewygodna w użyciu i wszystko opisane było raczej oszczędnymi słowami :) O ile w Qt wystarczylo mi przeczytanie kilku krótkich tutoriali aby załapać ogólną zasadę działania i dalej radzić sobie juz z pomocą dokumentacji o tyle w wxWidgets było to bardzo trudne, a nawet ocierało się o niemożliwość.

Na szczęście tera - po kilku ładnych latach - kiedy wxWidgets doczekało się wersji 2.9 dokumentacja jest lepsza. Nie mówię oczywiscie, że dobra, ale już zdecydowanie lepsza. Największą trudność sprawia mi znajdowanie eventów generowanych przez poszczególne kontrolki.

Tak czy inaczej - programować w tym już się da i nawet zrobiłem Linuxową wersję mojego programu OGame Transporter :)  Po powrocie do domu zapewne będę dalej kombinował jak sobie uprościc życie - ale czy nie to robią wszyscy programiści? ^^