2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLをmruby、mruby/c、Arduinoのソースコードに変換

Posted at

はじめに

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 です。
テーブル名に指定したソースコードが生成されます。
実験的なツールのため予告なしに仕様変更することがあります。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?