Arduino Firmata on Ruby

必要ないsleep削って速くしたぜ!ってpull requestが来たんだけど、そのsleepは古いArduino(Duemillanove/Decimila等)をサポートするのに必要なんですって言ってrejectしようと思ったけどよく考えたら接続する前にUSBデバイスのファイル名でUNO以降/Duemillanove以前を判別できる事に気づいた。


このようにデバイス名でわかる。
Debian Linux(raspberry pi)の場合
/dev/ttyACM0 -> Leonard, Micro, UNO
/dev/ttyUSB0 -> Decimilla, Duemillanove


Mac OSXの場合
/dev/tty.usbmodem1234 -> Leonard, Micro, UNO
/dev/tty.usbserial-A1234 -> Decimilla, Duemillanove


新しいArduinoの場合、sleepを省略するようにした。
UNO以降のArduino + Ruby2.0の環境ではarduino_firmataの初期化プロセスが0.1秒ぐらいになった。Duemillanove以前のArduinoだったり、Ruby2.0以前の場合は3秒ぐらいかかる。


あと、at_exitを知らなかった。
at_exit使わずにtrapでSITHUPやSIGTERMを受信してたので、なんかシグナルを握りつぶしていたらしい。
Ruby exit, exit!, SystemExit and at_exit blunder | Big Fast Blog

このようにclass内でブロック渡ししておくと、プロセスが終了する時に呼び出される。

class MyClass
at_exit do
# threadを止めたり、シリアルポートを閉じる等の処理
end
end