Spis treści:
- Wymagania wstępne
- LeJOS 3.0 na Linuxie z konsoli. Pomocne skrypty.
- LeJOS 3.0 na Windowsie z linii poleceń.
- LeJOS 3.0 + Eclipse 3.2 + Eclipse plugin. Linux/Windows.
Wymagania wstępne
- Przede wszystkim znajomość Javy :-) Bez tego ani rusz.
- Znajomość środowiska Eclipse na poziomie podstawowym, jeżeli chce się go używać. Tutaj nie będzie żadnych informacji odnośnie jak używać środowiska Eclipse.
- Zainstalowana Java. Dodana do zmiennej PATH, oraz ustawiona zmienna CLASSPATH
- jeśli chcemy go używać, to zainstalowane środowisko Eclipse. No dobra instalacja to za mocne słowo, rozpakowane
LeJOS 3.0 na Linuxie z konsoli. Pomocne skrypty.
W tym przypadku poradziłem sobie kilkoma skryptami. Wszystkie skrypty, które przyjmują plik do kompilacji,uruchomienia,uploadu itp. jako parametr wymagają podania tylko nazwy tego pliku, bez rozszerzenia. U mnie skrypty i programy leżały w jednym katalogu, który był katalogiem biezącym dla wszystkich wydawanych poleceń. Stąd m.in. takie a nie inne wywołanie skryptu ustawiającego "środowisko".
Oto one wraz z opisem:
lejos-env.sh
Skrypt ustawia "środowisko" czyli zmienne potrzebne do działania wszystkich pozostałych.
LEJOS_HOME=/home/szimonek/LEGO-Mindstorm/Java/LeJOS/lejos
CLASSPATH=${CLASSPATH}:${LEJOS_HOME}/lib
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${LEJOS_HOME}/bin
PATH=${PATH}:${LEJOS_HOME}/bin
export RCXTTY=/dev/usb/legousbtower0
W moim przypadku używałem wieżyczki na USB. Ten skrypt jest wywoływany automatycznie z innych skryptów.lejos-javac.sh
Skrypt służący do kompilacji programu "desktopowego" napisanego w Javie.
#!/bin/bash
. ./lejos-env.sh
if [ $# -lt 1 ]; then
echo "Usage: $0 ProgramFileName"
echo "ProgramFileName (without .java extension)"
else
if [ -f "$1.java" ]; then
echo "Compiling $1.java -> $1.class"
javac $1.java
else
echo "$1.java doesn't exist!"
fi
fi
echo "Done."
Program "desktopowy" to np. serwerowa końcówka programu napisanego, wgranego i uruchomionego na RCX. Przydał mi się do testowania protokołów komunikacyjnych.Jest to zwykłe wywołanie javac, z dodatkowo wywołanym skryptem "środowiska", tak aby kompilator miał dostęp do biblikotek LeJOS-a.lejos-java.sh
Skrypt służący do uruchamiania programu "desktopowego" napisanego w Javie.
#!/bin/bash
. ./lejos-env.sh
if [ $# -lt 1 ]; then
echo "Usage: $0 ProgramFileName"
echo "ProgramFileName (without .class extension)"
else
if [ -f "$1.class" ]; then
echo "Running $1.class"
java -Djava.library.path=${LEJOS_HOME}/bin $1
else
echo "$1.class doesn't exist!"
fi
fi
echo "Done."
Jak w przypadku lejos-javac.sh jest to skrypt przeznaczony dla programów "desktopowych". Za jego pomocą uruchamiamy taki program. lejos-compile.sh
Skrypt służący do kompilacji programu dla RCX napisanego w Javie.
#!/bin/bash
. ./lejos-env.sh
if [ $# -lt 1 ]; then
echo "Usage: $0 ProgramFileName"
echo "ProgramFileName (without .java extension)"
else
if [ -f "$1.java" ]; then
echo "Compiling $1.java -> $1.class"
${LEJOS_HOME}/bin/lejosjc $1.java
else
echo "$1.java doesn't exist!"
fi
fi
echo "Done."
Skrypt służy do kompilacji modułów tworzonego programu. Używamy do kompilacji klas dodatkowych (nie zawierających metody main - czyli głównego programu) których nie da się samodzielnie zlinkować (są one linkowane w cały program za pomocą następnego skryptu).lejos-compileandlink.sh
Skrypt służący do kompilacji i zlinkowania programu dla RCX napisanego w Javie.
#!/bin/bash
. ./lejos-env.sh
if [ $# -lt 1 ]; then
echo "Usage: $0 ProgramFileName"
echo "ProgramFileName (without .java extension)"
else
if [ -f "$1.java" ]; then
echo "Compiling $1.java -> $1.class"
${LEJOS_HOME}/bin/lejosjc $1.java
if [ -f "$1.class" ]; then
echo "Linking $1.class -> $1.bin"
${LEJOS_HOME}/bin/lejoslink --verbose $@ -o $1.bin > $1.sig
else
echo "$1.class doesn't exist!"
fi
else
echo "$1.java doesn't exist!"
fi
fi
echo "Done."
Skrypt służy do kompilacji głównego programu tj. tego który zawiera publiczną statyczną metodę main(). Pamięaj Dżavisto młody, że metoda main() jest statyczna! Jaki to ma wpływ na używane pola klasy? Ten skrypt dodatkowo linkuje program w całość tworząc wynikowy plik binarny (.bin) do załadowania do RCX. Program może składać się tylko z jednego pliku zawierającego metodę main() i wtedy używamy tego skryptu do kompilacji i zlinkowania programu, albo składa się zkilku plików (programu i jego modułów - klas dodatkowych) wtedy moduły kompilujemy lejos-compile.sh, a program główny kompilujemy i linkujemy lejos-compileandlink.sh na samym końculejos-upload.sh
Skrypt służący do uploadu zlinkowanego programu do RCX
#!/bin/bash
. ./lejos-env.sh
if [ $# -lt 1 ]; then
echo "Usage: $0 ProgramFileName"
echo "ProgramFileName (without extension)"
else
if [ -f "$1.java" ]; then
echo "Uploading $1.bin"
${LEJOS_HOME}/bin/lejosdl $1.bin
else
echo "$1.bin doesn't exist!"
fi
fi
echo "Done."
Tu chyba też nie potrzeba dodatkowych wyjaśnień. Należy pamiętać aby wieżyczka widziała się z RCX i RCX był włączony :-)lejos-clean.sh
Skrypt do usuwania wszystkich plikół binarnych z bieżącego katalogu. Pozostawia źródła i skrypty.
#!/bin/bash echo "Purging old binary files: classess" rm -f *.class echo "Purging old binary files: bin files" rm -f *.bin echo "Purging old binary files: signature" rm -f *.sig echo "Purging backup files" rm -f *~ core echo "Done."Chyba nie wymaga dodatkowych wyjaśnień :-) Po pracy należy po sobie posprzątać. Po zabawie tym bardziej :-)
Pozostałe
To do czego nie napisałem skryptu to wgrywanie firmware LeJOS-a do RCX-a. Wykonuje się to przy użyciu moich skryptów w następujący sposób:
- Wywołujemy skrypt lejos-env.sh
- Uruchamiamy upload firmware (w moim przypadku tak się to uruchamia i cały proces wyświetla takie komunikaty jak poniżej):
$ firmdl -v /home/szimonek/LEGO-Mindstorm/Java/LeJOS/lejos/bin/lejos.srec read firmware srec 100% Segment 0: length = 14578 Segment 1: length = 2940 Installing firmware Loading native libs Deleting firmware Firmware deleted Downloading firmware Total image size = 17518 (18kB) 100% Firmware downloaded Unlocking firmware Firmware unlocked $
- Po takim wyniku jak powyżej powinniśmy usłyszeć charakterystyczne "pik-pik" z RCX, co sygnalizuje poprawnie odblokowanie RCX a sam RCX zostaje przebootowany na nowy firmware i zaczyna wyświetlać aktualną woltaż baterii.
LeJOS 3.0 na Windowsie z linii poleceń.
To mnie na dłuższą metę w ogole nie interesuje, ale postaram się napisać tu też parę słów.
Najważniejsze to po rozpakowaniu LeJOS do katalogu na dysku (powiedzmy że do c:\lejos) należy dodać katalog c:\lejos\bin do zmiennej PATH, oraz dodać katalog c:\lejos\lib do zmiennej CLASSPATH. Musimy także zdefiniować nową zmienną systemową RCXTTY która powinna mieć wartość COM1/COM2/COM3/COM4 w zależności od używanego portu szeregowego w przypadku wieżyczki szeregowej lub USB w przypadku wieżyczki podłączanej do USB.
Następnie firmware wgrywamy za pomocą polecenia: "firmdl.bat"
Kompilujemy programy za pomocą pliku wsadowego: "lejosjc.bat"
Linkujemy program wynikowy za pomocą pliku wsadowego: "lejoslink.bat"
Uploadujemy programy do RCX za pomocą pliku wsadowego: "lejosdl.bat"
I tyle... więcej mi się nie chciało. Znacznie ciekawszy jest następny punkt czyli:
LeJOS 3.0 + Eclipse 3.2 + Eclipse plugin. Linux/Windows.
Co potrzeba? Ano na pewno działające środowisko Eclipse. Ja opieram ten dokument na najaktualniejszej wersji (na chwilę pisanie tego dokumentu) Eclipse czyli wersję 3.2. W katalogu w którym mamy rozpakowanego Eclipse znajduje się podkatalog plugins/ Do tego podkatalogu rozpakowywujemy zawartość sciągnietej paczki z pluginem (plik się nazywa eclipse_leJOS3.zip). Po rozpakowaniu powstają nam w podkatalogu plugins/ trzy nowe podkatalogi:
- org.lejos_3.0.0/
- org.lejos.ldt.core_1.2.0/
- org.lejos.tools_1.2.0/
Następnie uruchamiamy Eclipse. Na pasku ikon powinna nam się pojawić nowa ikona, po której naciśnięciu następuje próba wgrania firmware do RCX. Analogicznie pojawia się nowy element w menu o nazwie leJOS posiadająćy jeden podelement "Install firmware".
Ale najpierw należy ustawić konfigurację. Wybieramy z menu "Window"->"Preferences..." i następnie z listy po lewej "LeJOS". Wybieramy port do którego podpięta jest wieżyczka oraz jeśli używamy Linuxa to odznaczamy "Fast mode". Klikamy Apply i OK.
Teraz jeśli używamy Linuxa, to trzeba jeszcze naprawić parę rzeczy bo inaczej po kliknięciu przycisku "Install firmware" dostaniemy po oczach jakimś błędem. Może nam wyskoczyć błąd, a na konsoli (jeśli uruchomiliśmy przezornie Eclipse z konsoli) dostaniemy podobny do poniższego komunikat:
Loading native libs Unable to load native libraries: /opt/Java/IDE/eclipse/plugins/org.lejos_3.0.0/os/linux/x86/libjirtrcx.so: libirtrcx.so: cannot open shared object file: No such file or directoryAby to naprawić dodajemy do pliku /etc/ld.so.conf pełną scieżkę do katalogu >...ścieżka do eclipse...</plugins/org.lejos_3.0.0/os/linux/x86 zapisujemy ten plik i uruchamiamy ldconfig
Drugi możliwy problem to użycie wieżyczki na USB. Dziwny jest ten plugin ponieważ nie można w nim poprawnie zdefiniować urządzenia dla USB. Są poprawne /dev/ttyS0-3 ale dla usb są jakieś dziwne usb0-3 nie wiadomo co z tym począć. W takim przypadku przy próbie komunikacji z RCX, dostanie się w Eclipse po oczach komunikatem "Tower error: open failure" a na konsoli zobaczymy np, taki tekst:
Loading native libs usb0: No such file or directoryJa nie znalazłem rozwiązania. Tylko atrapę. Sprawdziłem które z /dev/ttyS0-3 nie jest wykorzystywane w systemie (nie ma takiego urządzenia), zmieniłem nazwę jednego z tych niewykorzystywanych na /dev/ttyS1-orig (w moim przypadku ttyS1 nie istniał) i następnie podlinkowałem /dev/legousbtower0 jako /dev/ttyS1. I zadziałało.
Teraz możemy już kliknąć ikonę uploadu firmware. Firmware powinien poprawnie zostać wgrany.
Pod Windows także wystąpił u mnie jeden z powyższych błędów, a mianowicie brak wzajemnej widoczności bibliotek natywnych jirtrcx.dll oraz irtrcx.dll Pomogło przegranie obydwu tych bibliotek do katalogu C:\Windows\System32 Poza tym Eclipse miał jakiś dziwny problem z odblokowaniem firmware po uploadzie (u mnie upload firmware kończy się komunikatem "unlock firmware failed: Tower error: no response from rcx", ale firmware zostaje odblokowane i działa prawidłowo. Dziwne.
Tworzymy program.
Wybieramy z menu "File"->"New"->"Other..." następnie na liście odnajdujemy "leJOS" i po rozwinięciu wybieramy z niego "leJOS RCX project". Klikamy Next. W "Project Name" wpisujemy nazwę projektu i klikamy Finish. Odnajdujemy nasz projekt na "Package Explorer" i po jego rozwinięciu dodajemy nową klasę do niego wybierając z menu "File"->"New"->"Class". W nowo otwartym oknie "Source Folder:" powinien wskazywać na nasz nowy projekt, w "Name:" wpisujemy nazwę klasy a w "Package:" wpisujemy nazwę pakietu do którego ta klasa będzie należała (nie jest wskazane używanie domyślnego pakietu). Następnie zaznaczamy jeszcze "public static void main(String[] args)" i możemy zaznaczyć "Generate comments" i klikamy Finish.
Po napisaniu programu, zapisujemy go (jest automatycznie kompilowany) i wybieramy z menu "Run"->"Run...". Następnie dwuklik na "leJOS" tworzy nową konfigurację tego typu dla bieżącego projektu i możemy kliknąć "Run".
Tu pod linuxem dostaniemy zapewne błąd "class not found java/lang/Object.class" i niby pokazuje CLASSPATH a na niej plik classess.jar który zawierą tę wymaganą klasę, ale ścieżka wzkazuje na błędne położenie tego pliku!!! Po bliższym przyjrzeniu się temu potworkowi, wywnioskowałem że zostały tam sklejone dwie ścieżki: ścieżka do katalogu projektu ze ścieżką względną od katalogu domowego Eclipse do pliku classess.jar i tak samo w przypadku drugiego z plików LeJOS-a na CLASSPATH. Tu pomogło wejście do katalogu domowego projektu i stworzenie w nim odpowiedniego dowiązanie symbolicznego aby ścieżka zaczęła automagicznie być prawidłowa, ale przecież nie o takie wykorzystanie Eclipse tu chodzi (czyli nie o łatanie atrapami, błędów w pluginie)?
Pod Windows nie miałem takich frustrujących problemów ze ścieżkami. Po stworzeniu nowej konfiguracji i kliknięciu Run, program został prawidłowo zlinkowany i zuploadowany do RCX.
WNIOSEK (LINUX): POD LINUXEM DZIAŁA (UDAŁO MI SIĘ WGRAĆ FIRMWARE I NAPISAĆ I WGRAĆ PROGRAM DO RCX Z POZIOMU ECLIPSE, ALE WYMUSIŁO TO STWORZENIE 3 ATRAP W SYSTEMIE W TYM JEDNEJ ZALEŻNEJ OD PROJEKTU). WYMAGA TO JESZCZE WIELE PRACY OD DEVELOPERÓW :-( JAK NARAZIE TO UWAŻAM, ŻE JEDYNA SŁUSZNA DROGA TO SKRYPTY BASH-a :-)
WNIOSEK (WINDOWS):TEŻ WYSTĄPIŁY PROBLEMY I TO NIETRYWIALNE. ALE OGÓLNIE DZIAŁA I TO LEPIEJ NIŻ POD LINUXEM.
<EOT>
Moje strony o LEGO