はじめに
SQLをmruby、mruby/c、Arduinoのソースコードに変換するツールを作りました。
オリジナルは2015年に作成したツールでそのときはSQLにArduinoのソースコードに変換するだけでした。
基本的な考え方はsql2arduinoコンパイラを作った話に書いてます。
ガイド
今回はRubyで実装しました。
最終的なソースコードはGitHubにあります。
例えば、SELECT din11 FROM mruby WHERE ((din1 = 0 AND din2 <= 1) OR din3 <> 9)
のようなSQLは、次のようなmrubyのソースコードに変換されます。
mruby、mruby/cのCommon I/O APIに対応しています。
GPIO.setmode(11, GPIO::IN)
GPIO.setmode(1, GPIO::IN)
GPIO.setmode(2, GPIO::IN)
GPIO.setmode(3, GPIO::IN)
uart1 = UART.new(1)
while 1 do
din11 = GPIO.read(11)
din1 = GPIO.read(1)
din2 = GPIO.read(2)
din3 = GPIO.read(3)
if ((din1 == 0 && din2 <= 1) || din3 != 9)
uart1.puts("din11=#{din11}")
end
end
sleep
関数を実現するためにRSLEEP
というキーワードを追加しました。
例えば、SELECT din11 FROM mruby WHERE ((din1 = 0 AND din2 <= 1) OR din3 <> 9) RSLEEP 100
のようなSQLは、次のようなmrubyのソースコードに変換されます。
GPIO.setmode(11, GPIO::IN)
GPIO.setmode(1, GPIO::IN)
GPIO.setmode(2, GPIO::IN)
GPIO.setmode(3, GPIO::IN)
uart1 = UART.new(1)
while 1 do
din11 = GPIO.read(11)
din1 = GPIO.read(1)
din2 = GPIO.read(2)
din3 = GPIO.read(3)
if ((din1 == 0 && din2 <= 1) || din3 != 9)
uart1.puts("din11=#{din11}")
end
sleep(100)
end
生成されたソースコードをみるとsleep(100)
とうコードが追加されています。
SELECT文だけをサポートしています。
列名に指定できる値は、din1 ~ din20、ain1 ~ ain20 です。din はデジタルピン、ain はアナログピンに対応します。
テーブル名に指定できる値は、mruby または arduino です。
テーブル名に指定したソースコードが生成されます。
実験的なツールのため予告なしに仕様変更することがあります。