arduino와 processing을 연동 하면서, processing 언어가 어떻게 자바로 바뀌는지 궁금했다.

export application 하니 win32, win64 에서 동작할 수 있도록 코드가 생성된다. windows32 디렉토리와 window64 디렉토리가 생기고, 각각 lib, source 디렉토리와 serial 통신이 가능한 dll파일과 exe 파일이 생긴다. 

자바소스는 source디렉토리에 보니 processing언어로 된 원래 코드와 변환된 자바 코드가 있다. 

기존 코드는 다음과 같다. 

 import processing.serial.*;
 Serial port;


boolean button = false;

int x = 150;
int y = 150;
int w = 100;
int h = 75;

void setup() {
  size(400,400); 
  
  // 디버그 
 println("Available serial ports:");
 println(Serial.list());
 // 내 pc 에는 Serial 내부 구조의 1번에 com3로 연결된 아두이노가 있다. 
  port = new Serial(this, Serial.list()[1], 9600);  
}

void draw() {
  if (button) {
    background(255);
    stroke(0);
  } else {
    background(0);
    stroke(255);
  }
  
  fill(175);
  rect(x,y,w,h);
}


void mousePressed() {
  if (mouseX > x && mouseX < x+w && mouseY > y && mouseY < y+h) {
    button = !button;
  }  

// 버튼의 값이 true이면 led을 끼고, false이면 led를 끈다.
  if (button == true) {
    // turn on led
     port.write(255);
  } else {
    // turn off led
    port.write(0);
  }
}
 


자동으로 변환된 자바 코드이다. 


import processing.core.*; 
import processing.xml.*; 

import processing.serial.*; 

import java.applet.*; 
import java.awt.Dimension; 
import java.awt.Frame; 
import java.awt.event.MouseEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.FocusEvent; 
import java.awt.Image; 
import java.io.*; 
import java.net.*; 
import java.text.*; 
import java.util.*; 
import java.util.zip.*; 
import java.util.regex.*; 

public class sketch_dec08a extends PApplet {

 
 Serial port;


boolean button = false;

int x = 150;
int y = 150;
int w = 100;
int h = 75;

public void setup() {
  size(400,400); 
  
  // \ub514\ubc84\uadf8 
 println("Available serial ports:");
 println(Serial.list());
 // \ub0b4 pc \uc5d0\ub294 Serial \ub0b4\ubd80 \uad6c\uc870\uc758 1\ubc88\uc5d0 com3\ub85c \uc5f0\uacb0\ub41c \uc544\ub450\uc774\ub178\uac00 \uc788\ub2e4. 
  port = new Serial(this, Serial.list()[1], 9600);  
}

public void draw() {
  if (button) {
    background(255);
    stroke(0);
  } else {
    background(0);
    stroke(255);
  }
  
  fill(175);
  rect(x,y,w,h);
}

public void mousePressed() {
  if (mouseX > x && mouseX < x+w && mouseY > y && mouseY < y+h) {
    button = !button;
  }  
  
  if (button == true) {
    // turn on led
     port.write(255);
  } else {
    // turn off led
    port.write(0);
  }
}

  static public void main(String args[]) {
    PApplet.main(new String[] { "--bgcolor=#F0F0F0", "sketch_dec08a" });
  }
}




PApplet을 상속받은 클래스를 하나 만들고, PApplet의 method를 override 하도록 되어 있다. 
이렇게 만들어진 PApplet 을 바로 쓰면 애플릿으로 바로 쓸 수 있고,
main 메서드만 추가하면 어플리케이션처럼 쓸 수 있도록 짜 있다. 전형적인 어플 개방 방식을 쓰고 있다.  


lib/core.jar 파일에 processing.core.JApplet 클래스가 존재한다.  JApplet 클래스는 java.awt.Applet 을 상속하고, java.awt의 이벤트 계열 리스너와 쓰레드를 상속해서 쓰고 있다. 

public class PApplet extends Applet  implements PConstants, Runnable, MouseListener, MouseMotionListener, KeyListener, FocusListener {
...
}

lib/args.txt 파일을 보니, 클래스이름과 jar 파일 classpath가 적힌 것 같다. 

lib/RXTXcomm.jar 파일을 살펴보니. gnu.io 패키지를 가지고 있다. serial 통신을 지원하는 library인데 정체가 무엇일까 하는 생각이 들었다. http://users.frii.com/jarvi/rxtx/ 웹 페이지에 자세한 설명이 있다. 이 라이브러리는 LGPL 라이선스 이고 java에서 사용할 수 있도록 만들어진 serial, parallel 통신 library이다. 
이 페이지는 old 해졌고, http://rxtx.qbang.org/wiki/index.php/Main_Page 페이지가 최신 소개 페이지이다. 
serial port 통신에 대한 얘기들과 예제들이 있다. java로 쉽게 개발할 수 있도록 고생하셨다. 짝짝~


생각보다 processing의 원리가 무척 간단하다는 생각이 들었다. 단순히 java 언어로 변환하고, library만 지원하는 구조가 아닌가 생각이 든다. 그래서 예술가들이 processing 언어를 쓰는 것 같다. 

Posted by 김용환 '김용환'

댓글을 달아 주세요