0.9 에 대한 이클립스 플러그인이 다행이 있었다.

플러그인 설치 주소는 다음과 같다.
http://lejos.sourceforge.net/tools/eclipse/plugin/nxj/

웹을 통해서 보면, 다음과 같이 2011년 6월 19일에 0.9 플러그인이 나왔음을 확인할 수 있다.


org.lejos.nxt.ldt.update-site

leJOS NXJ features for Eclipse

org.lejos.nxt leJOS NXJ Support
org.lejos.nxt.ldt.feature - 0.9.0.201106192010





설치를 완료후에 이클립스를 확인해본다..
메뉴에 변화가 있다. 펌웨어 관련한 것이니. 특별한 일이 아니면 쓰지 않는다.



그리고, preferences를 확인한다.  제대로 되었군~ 확인하면 된다.  특정 주소에 무엇인가를 하거라 실행 옵션 및 디버그 옵션을 제공해주고 있다.




이제 hello World을 실행해보자. new project 하면 LEJOS NXT Project를 생성할 수 있다. 그 것을 선택한다.
이름은 zzz로 한다.






Hello World.java 파일을 생성한다.


HelloWorld.java내용은 간단한다.


import lejos.nxt.*;
public class HelloWorld {
 public static void main(String[] args) {
  System.out.println("Hello World");
  Button.waitForPress();
 }
}


프로젝트 명에서 마우스 오른쪽 버튼을 눌러, Run AS -> LeJOS NXT 프로그램을 실행한다.


이클립스 콘솔창에 아래와 같이 뜨면서 어플리케이션이 NXT로 업로드 되고 실행된다.

program has been linked successfully
uploading ...
leJOS NXJ> Connected to NXT
leJOS NXJ> Upload successful in 936 milliseconds
program has been uploaded



만약 업로드를 실패하면 다음과 같이 출력된다.

 
program has been linked successfully
uploading ...
leJOS NXJ> Failed to open Unknown 0016530EA6F8
leJOS NXJ> Failed to connect to any NXT
No NXT found - is it switched on and plugged in (for USB)?
uploading the program failed with exit status 1


플러그인 소스를 본 적은 없지만 감으로 간단하게 원리를 살펴본다.

플러그인의 비밀은 그리 어렵지 않다. 컴파일 되게 API 셋을 제공한다.
LeJOS NXT Runtime에 해당되는 classes.jar가 project에 포함되게 한다.



프로젝트 정보의 Properties를 보면, LeJOS Project Builder라는 것이 있는데.  이것은 바로 NXT에서 실행가능한 파일 포맷,디버깅 가능 파일포맷으로 만들어주는 것일 것이다.



HelloWorld.nxd, HellowWorld.nxj 로 만들어진 것을 확인할 수 있다.

Run이 실행될 때는 이 파일들을 NXT로 전달하는 구조로 되어 있다.. (이 부분은 나중에 소스를 까면 봐야겠다.)

우선 간단하게 leJOS 개발환경을 구축해보았다. 이젠 API를 깊이 이해하면 끝~




Posted by 김용환 '김용환'


http://sourceforge.net/projects/lejos/files/lejos-NXJ-win32/0.9.0beta/
웹에 보면, lejos_NXJ_win32_0_9_0beta.zip  파일이 존재하는데. 이 녀석에 예제가 포함되어 있다.

압축을 풀고 나서, eclipse 에서 import 하면 간단한 테스트가 가능하다.
D:\LEGO\lejos\lejos_NXJ_win32_0_9_0beta\lejos_nxj\projects\org.lejos.example


Hello World 을 간단하게 출력하는 예제이다.

package org.lejos.example;
import lejos.nxt.*;
/**
 * Example leJOS Project with an ant build file
 *
 */
public class HelloWorld {
 public static void main(String[] args) {
  System.out.println("Hello World");
  Button.waitForPress();
 }
}



NXT의 전원을 켜고, ant build만 하면 오케이다.


ant 빌드 결과물이이다. build 결과물은 다음과 같다.


Buildfile: D:\LEGO\lejos\lejos_NXJ_win32_0_9_0beta\lejos_nxj\projects\org.lejos.example\build.xml
clean:
      [delete] Deleting directory D:\LEGO\lejos\lejos_NXJ_win32_0_9_0beta\lejos_nxj\projects\org.lejos.example\build
compile:
       [mkdir] Created dir: D:\LEGO\lejos\lejos_NXJ_win32_0_9_0beta\lejos_nxj\projects\org.lejos.example\build
       [javac] Compiling 1 source file to D:\LEGO\lejos\lejos_NXJ_win32_0_9_0beta\lejos_nxj\projects\org.lejos.example\build
link:
        [java] Class 0: java.lang.Object
        [java] Class 1: java.lang.Throwable
        [java] Class 2: java.lang.Error
        [java] Class 3: java.lang.OutOfMemoryError
        [java] Class 4: boolean
        [java] Class 5: char
        [java] Class 6: float
        [java] Class 7: double
        [java] Class 8: byte
        [java] Class 9: short
        [java] Class 10: int
        [java] Class 11: long
        [java] Class 12: void
        [java] Class 13: java.lang.Object[]
        [java] Class 14: java.lang.NoSuchMethodError
        [java] Class 15: java.lang.StackOverflowError
        [java] Class 16: java.lang.NullPointerException
        [java] Class 17: boolean[]
        [java] Class 18: char[]
        [java] Class 19: float[]
        [java] Class 20: double[]
        [java] Class 21: byte[]
        [java] Class 22: short[]
        [java] Class 23: int[]
        [java] Class 24: long[]
        [java] Class 25: reserved
        [java] Class 26: java.lang.ClassCastException
        [java] Class 27: java.lang.ArithmeticException
        [java] Class 28: java.lang.ArrayIndexOutOfBoundsException
        [java] Class 29: java.lang.IllegalArgumentException
        [java] Class 30: java.lang.InterruptedException
        [java] Class 31: java.lang.IllegalStateException
        [java] Class 32: java.lang.IllegalMonitorStateException
        [java] Class 33: java.lang.ThreadDeath
        [java] Class 34: java.lang.ArrayStoreException
        [java] Class 35: java.lang.NegativeArraySizeException
        [java] Class 36: java.lang.Class
        [java] Class 37: java.lang.String
        [java] Class 38: java.lang.Cloneable
        [java] Class 39: java.lang.Thread
        [java] Class 40: org.lejos.example.HelloWorld
        [java] Class 41: lejos.nxt.VM
        [java] Class 42: java.lang.System
        [java] Class 43: java.lang.StringBuilder
        [java] Class 44: java.lang.Integer
        [java] Class 45: java.io.PrintStream
        [java] Class 46: java.lang.RuntimeException
        [java] Class 47: java.lang.Exception
        [java] Class 48: java.lang.IndexOutOfBoundsException
        [java] Class 49: java.lang.Character
        [java] Class 50: java.lang.StringIndexOutOfBoundsException
        [java] Class 51: java.lang.StringUtils
        [java] Class 52: java.lang.Runnable
        [java] Class 53: lejos.nxt.Button
        [java] Class 54: lejos.nxt.VM.VMImage
        [java] Class 55: lejos.nxt.VM.VMClone
        [java] Class 56: lejos.nxt.LCDOutputStream
        [java] Class 57: java.lang.Number
        [java] Class 58: java.lang.NumberFormatException
        [java] Class 59: java.io.OutputStream
        [java] Class 60: java.io.IOException
        [java] Class 61: lejos.nxt.NXTEvent
        [java] Class 62: lejos.nxt.Sound
        [java] Class 63: lejos.nxt.SystemSettings
        [java] Class 64: lejos.nxt.Button[]
        [java] Class 65: lejos.nxt.LCD
        [java] Class 66: lejos.nxt.Flash
        [java] Class 67: java.lang.String[]
        [java] Class 68: lejos.nxt.FlashError
        [java] Class 69: lejos.nxt.NXT
        [java] Method 0: java.lang.Object.<init>() PC 3256 Signature id 2
        [java] Method 1: java.lang.Object.getClass() PC 3257 Signature id 121
        [java] Method 2: java.lang.Object.toString() PC 3265 Signature id 123
        [java] Method 3: java.lang.Object.wait(long) Native id 7
        [java] Method 4: java.lang.Throwable.<init>() PC 3293 Signature id 2
        [java] Method 5: java.lang.Throwable.<init>(java.lang.String) PC 3303 Signature id 124
        [java] Method 6: java.lang.Throwable.getLocalizedMessage() PC 3318 Signature id 125
        [java] Method 7: java.lang.Throwable.getMessage() PC 3323 Signature id 29
        [java] Method 8: java.lang.Throwable.toString() PC 3328 Signature id 123
        [java] Method 9: java.lang.Throwable.fillInStackTrace() PC 3376 Signature id 126
        [java] Method 10: java.lang.Error.<init>(java.lang.String) PC 3389 Signature id 124
        [java] Method 11: java.lang.NullPointerException.<init>() PC 3395 Signature id 2
        [java] Method 12: java.lang.IllegalArgumentException.<init>(java.lang.String) PC 3400 Signature id 124
        [java] Method 13: java.lang.Class.isInterface() PC 3406 Signature id 133
        [java] Method 14: java.lang.Class.toString() PC 3423 Signature id 123
        [java] Method 15: java.lang.String.<init>(int) PC 3469 Signature id 128
        [java] Method 16: java.lang.String.<init>(char[]) PC 3481 Signature id 140
        [java] Method 17: java.lang.String.<init>(char[], int, int) PC 3490 Signature id 141
        [java] Method 18: java.lang.String.charAt(int) PC 3507 Signature id 145
        [java] Method 19: java.lang.String.equals(java.lang.Object) PC 3532 Signature id 120
        [java] Method 20: java.lang.String.length() PC 3604 Signature id 155
        [java] Method 21: java.lang.String.toString() PC 3610 Signature id 123
        [java] Method 22: java.lang.String.valueOf(java.lang.Object) PC 3612 Signature id 167
        [java] Method 23: java.lang.Thread.run() PC 3626 Signature id 1
        [java] Method 24: java.lang.Thread.currentThread() Native id 12
        [java] Method 25: java.lang.Thread.interrupt() Native id 15
        [java] Method 26: org.lejos.example.HelloWorld.main(java.lang.String[]) PC 3646 Signature id 0
        [java] Method 27: lejos.nxt.VM.<clinit> PC 3659 Signature id 3
        [java] Method 28: lejos.nxt.VM.<init>() PC 3678 Signature id 2
        [java] Method 29: lejos.nxt.VM.getVM() PC 3713 Signature id 175
        [java] Method 30: lejos.nxt.VM.memPeek(int, int, int) Native id 103
        [java] Method 31: lejos.nxt.VM.memCopy(java.lang.Object, int, int, int, int) Native id 104
        [java] Method 32: lejos.nxt.VM.getObjectAddress(java.lang.Object) Native id 105
        [java] Method 33: lejos.nxt.VM.memGetReference(int, int) Native id 106
        [java] Method 34: lejos.nxt.VM.memPeekByte(int, int) PC 3733 Signature id 176
        [java] Method 35: lejos.nxt.VM.memPeekShort(int, int) PC 3745 Signature id 177
        [java] Method 36: lejos.nxt.VM.memPeekInt(int, int) PC 3756 Signature id 178
        [java] Method 37: lejos.nxt.VM.getClassAddress(int) PC 3764 Signature id 179
        [java] Method 38: lejos.nxt.VM.getClassNo(java.lang.Object) PC 3780 Signature id 180
        [java] Method 39: lejos.nxt.VM.getClassNumber(java.lang.Class) PC 3807 Signature id 181
        [java] Method 40: lejos.nxt.VM.getClass(java.lang.Object) PC 3824 Signature id 183
        [java] Method 41: lejos.nxt.VM.createStackTrace(java.lang.Thread, java.lang.Object) Native id 114
        [java] Method 42: lejos.nxt.VM.access$100(java.lang.Object, int, int, int, int) PC 3840 Signature id 188
        [java] Method 43: java.lang.System.<clinit> PC 3850 Signature id 3
        [java] Method 44: java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int) Native id 24
        [java] Method 45: java.lang.System.currentTimeMillis() Native id 22
        [java] Method 46: java.lang.System.identityHashCode(java.lang.Object) PC 3885 Signature id 200
        [java] Method 47: java.lang.System.getDataAddress(java.lang.Object) Native id 8
        [java] Method 48: java.lang.StringBuilder.ensureCapacity(int) PC 3890 Signature id 201
        [java] Method 49: java.lang.StringBuilder.<init>() PC 3949 Signature id 2
        [java] Method 50: java.lang.StringBuilder.append(java.lang.String) PC 3967 Signature id 202
        [java] Method 51: java.lang.StringBuilder.append(int) PC 3973 Signature id 206
        [java] Method 52: java.lang.StringBuilder.appendInternal(java.lang.String) PC 4011 Signature id 207
        [java] Method 53: java.lang.StringBuilder.toString() PC 4062 Signature id 123
        [java] Method 54: java.lang.Integer.<clinit> PC 4079 Signature id 3
        [java] Method 55: java.lang.Integer.parseInt(java.lang.String) PC 4084 Signature id 212
        [java] Method 56: java.lang.Integer.parseInt(java.lang.String, int) PC 4091 Signature id 213
        [java] Method 57: java.lang.Integer.parseInt(java.lang.String, int, int, boolean, int) PC 4138 Signature id 214
        [java] Method 58: java.lang.Integer.toHexString(int) PC 4263 Signature id 216
        [java] Method 59: java.lang.Integer.toUnsignedString(int, int, int, int) PC 4273 Signature id 217
        [java] Method 60: java.io.PrintStream.<init>(java.io.OutputStream) PC 4321 Signature id 222
        [java] Method 61: java.io.PrintStream.write(int) PC 4331 Signature id 223
        [java] Method 62: java.io.PrintStream.flush() PC 4358 Signature id 224
        [java] Method 63: java.io.PrintStream.print0(java.lang.String) PC 4370 Signature id 225
        [java] Method 64: java.io.PrintStream.println0(java.lang.String) PC 4396 Signature id 226
        [java] Method 65: java.io.PrintStream.println(java.lang.String) PC 4412 Signature id 227
        [java] Method 66: java.lang.RuntimeException.<init>() PC 4421 Signature id 2
        [java] Method 67: java.lang.RuntimeException.<init>(java.lang.String) PC 4426 Signature id 124
        [java] Method 68: java.lang.Exception.<init>() PC 4432 Signature id 2
        [java] Method 69: java.lang.Exception.<init>(java.lang.String) PC 4437 Signature id 124
        [java] Method 70: java.lang.IndexOutOfBoundsException.<init>(java.lang.String) PC 4443 Signature id 124
        [java] Method 71: java.lang.Character.<clinit> PC 4449 Signature id 3
        [java] Method 72: java.lang.Character.digit(int, int) PC 4454 Signature id 221
        [java] Method 73: java.lang.Character.forDigit(int, int) PC 4532 Signature id 240
        [java] Method 74: java.lang.StringIndexOutOfBoundsException.<init>(int) PC 4579 Signature id 128
        [java] Method 75: java.lang.StringUtils.parseDigit(char, int) PC 4603 Signature id 245
        [java] Method 76: java.lang.StringUtils.throwNumberFormat(java.lang.String, int) PC 4625 Signature id 246
        [java] Method 77: java.lang.StringUtils.getIntChars(char[], int, int, int) PC 4661 Signature id 248
        [java] Method 78: java.lang.StringUtils.exactStringLength(int, int) PC 4713 Signature id 250
        [java] Method 79: lejos.nxt.Button.<clinit> PC 4736 Signature id 3
        [java] Method 80: lejos.nxt.Button.<init>(int) PC 4827 Signature id 128
        [java] Method 81: lejos.nxt.Button.waitAllReleased(lejos.nxt.NXTEvent, long) PC 4837 Signature id 262
        [java] Method 82: lejos.nxt.Button.waitForPress(int) PC 4869 Signature id 263
        [java] Method 83: lejos.nxt.Button.waitForPress() PC 4942 Signature id 264
        [java] Method 84: lejos.nxt.Button.getButtons() Native id 47
        [java] Method 85: lejos.nxt.Button.readButtons() PC 4947 Signature id 265
        [java] Method 86: lejos.nxt.Button.loadSettings() PC 4991 Signature id 267
        [java] Method 87: lejos.nxt.VM.VMImage.<init>(lejos.nxt.VM, int) PC 5065 Signature id 268
        [java] Method 88: lejos.nxt.VM.VMImage.<init>(lejos.nxt.VM, int, lejos.nxt.VM$1) PC 5079 Signature id 269
        [java] Method 89: lejos.nxt.VM.VMClone.update() PC 5086 Signature id 290
        [java] Method 90: lejos.nxt.VM.VMClone.<init>(int, int) PC 5102 Signature id 284
        [java] Method 91: lejos.nxt.VM.VMClone.<init>(int, int, lejos.nxt.VM$1) PC 5121 Signature id 286
        [java] Method 92: lejos.nxt.LCDOutputStream.<init>() PC 5128 Signature id 2
        [java] Method 93: lejos.nxt.LCDOutputStream.write(int) PC 5138 Signature id 223
        [java] Method 94: java.lang.NumberFormatException.<init>(java.lang.String) PC 5193 Signature id 124
        [java] Method 95: java.io.OutputStream.<init>() PC 5199 Signature id 2
        [java] Method 96: java.io.OutputStream.write(int) PC 0 Signature id 223
        [java] Method 97: java.io.OutputStream.flush() PC 5204 Signature id 224
        [java] Method 98: lejos.nxt.NXTEvent.<init>() PC 5205 Signature id 2
        [java] Method 99: lejos.nxt.NXTEvent.registerEvent() Native id 117
        [java] Method 100: lejos.nxt.NXTEvent.unregisterEvent() Native id 118
        [java] Method 101: lejos.nxt.NXTEvent.changeEvent(int, int) Native id 119
        [java] Method 102: lejos.nxt.NXTEvent.waitEvent(long) PC 5210 Signature id 311
        [java] Method 103: lejos.nxt.NXTEvent.waitEvent(int, long) PC 5411 Signature id 312
        [java] Method 104: lejos.nxt.NXTEvent.allocate(int, int, int) PC 5422 Signature id 317
        [java] Method 105: lejos.nxt.NXTEvent.free() PC 5472 Signature id 318
        [java] Method 106: lejos.nxt.Sound.<clinit> PC 5498 Signature id 3
        [java] Method 107: lejos.nxt.Sound.playFreq(int, int, int) Native id 55
        [java] Method 108: lejos.nxt.Sound.playTone(int, int, int) PC 5607 Signature id 325
        [java] Method 109: lejos.nxt.Sound.loadSettings() PC 5633 Signature id 267
        [java] Method 110: lejos.nxt.SystemSettings.<clinit> PC 5644 Signature id 3
        [java] Method 111: lejos.nxt.SystemSettings.getSlot(java.lang.String) PC 5756 Signature id 330
        [java] Method 112: lejos.nxt.SystemSettings.setSlot(int, java.lang.String) PC 5788 Signature id 331
        [java] Method 113: lejos.nxt.SystemSettings.getValue(int) PC 5864 Signature id 332
        [java] Method 114: lejos.nxt.SystemSettings.getStringSetting(java.lang.String, java.lang.String) PC 5936 Signature id 333
        [java] Method 115: lejos.nxt.SystemSettings.getIntSetting(java.lang.String, int) PC 5963 Signature id 334
        [java] Method 116: lejos.nxt.SystemSettings.setSetting(java.lang.String, java.lang.String) PC 5983 Signature id 335
        [java] Method 117: lejos.nxt.LCD.<clinit> PC 6015 Signature id 3
        [java] Method 118: lejos.nxt.LCD.bitBlt(byte[], int, int, int, int, int, int, int, int, int) PC 6032 Signature id 366
        [java] Method 119: lejos.nxt.LCD.drawChar(char, int, int) PC 6059 Signature id 367
        [java] Method 120: lejos.nxt.LCD.getDisplay() Native id 42
        [java] Method 121: lejos.nxt.LCD.getSystemFont() Native id 45
        [java] Method 122: lejos.nxt.LCD.bitBlt(byte[], int, int, int, int, byte[], int, int, int, int, int, int, int) Native id 44
        [java] Method 123: lejos.nxt.LCD.scroll() PC 6088 Signature id 369
        [java] Method 124: lejos.nxt.Flash.<clinit> PC 6128 Signature id 3
        [java] Method 125: lejos.nxt.Flash.flashReadPage(byte[], int) Native id 71
        [java] Method 126: lejos.nxt.Flash.flashWritePage(byte[], int) Native id 70
        [java] Method 127: lejos.nxt.Flash.readPage(byte[], int) PC 6141 Signature id 407
        [java] Method 128: lejos.nxt.Flash.writePage(byte[], int) PC 6160 Signature id 408
        [java] Method 129: lejos.nxt.FlashError.<init>(java.lang.String) PC 6247 Signature id 124
        [java] Method 130: lejos.nxt.NXT.getUserPages() Native id 94
        [java] Master record    : 20 bytes.
        [java] Class records    : 70 (840 bytes).
        [java] Field records    : 56 (56 bytes).
        [java] Static fields    : 29 (60 bytes).
        [java] Static state     : 29 (112 bytes).
        [java] Constant records : 36 (144 bytes).
        [java] Constant values  : 36 (476 bytes).
        [java] Method records   : 131 (1572 bytes).
        [java] Exception records: 10 (80 bytes).
        [java] Interface maps   : 2 (4 bytes).
        [java] Code             : 108 (3000 bytes).
        [java] Total            : 6256 bytes.
        [java] Run time options : EnableCompact
        [java] Constant loads   : 36N 10O 1W 35S
        [java] Static load/store: 3N 70O
        [java] Field  load/store: 1N 80O
uploadandrun:
        [java] Found NXT: NXT 0016530EA6F8
        [java] leJOS NXJ> Connected to NXT
        [java] leJOS NXJ> Upload successful in 922 milliseconds
BUILD SUCCESSFUL
Total time: 3 seconds



build.xml 파일을 보면,
jvm 에서 실행할 수 있도록 기본 java binary 클래스들과 HelloWorld.class를 묶어 만든 HelloWorld.nxd 파일을  NXT로 다운로드 하는 구조로 되어 있는 것 같다. Littel Endian 설정도 눈에 보인다.  나중에 시간되는 대로 소스를 함 봐야겠다.

컴파일 -> lejos.pc.tools.NXJLink ->  lejos.pc.tools.NXJUpload 


NXT 결과물을 본다. Hello World 가 제대로 출력되었는지 확인가능하다.




내일은 몽땅 다 읽어봐야지.
http://www.docstoc.com/docs/2133860/The-leJOS-NXJ-Tutorial

Posted by 김용환 '김용환'
LabView라는 프로그램이 있긴 한데, 천천히 해도 될 것 같아서, 딴 것을 써보려고 한다.


nxt 프로그래밍 소프트웨어를 써보려고 한다.

http://www.teamhassenplug.org/NXT/NXTSoftware.html



여기서 유난히 내 눈을 띠는 것은 leJOS NXJ 이다.
자바 버전이라거 그런가? ㅎㅎㅎ 2011년 5월 6일 0.9가 릴리즈 되면서 약간 기대가 된다.
http://lejos.sourceforge.net/


최신 0.9는 여기서 다운받을 수 있다.
http://sourceforge.net/projects/lejos/files/lejos-NXJ-win32/0.9.0beta/

튜토리얼은 여기서 볼 수 있다.
http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/Intro.htm#1


설치는 아래와 같이 한다.
http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/GettingStartedWindows.htm



nxj를 함 실행해보자. 알아서 path까지 잡아주었다.



NXT에 보니 메뉴도 달라져 보인다.
http://lejos.sourceforge.net/nxt/nxj/tutorial/MenuSystem/MenuSystem.htm


문서를 죽 읽어본다.
http://lejos.sourceforge.net/nxt/nxj/tutorial/index.htm


내일 테스트해야지.
Posted by 김용환 '김용환'