ターミナルからSDカードに書き込み
SakuLuaのプログラムを作っているときに、いちいちSAKURAボードからSDメモリカードを引き抜き、SDメモリカードに書き込んで、SAKURAボードに挿すという一連の手間が非常に面倒に感じてきます。
そこで、PCの端末からシリアル経由でSAKURAボードのSDメモリカードに書き込むLuaスクリプトを書いてみました。
このスクリプトはgithubにある/SakuLua/gr_Lua/Script_Sample/フォルダに入っています。
loader.lua
loader.luaを簡単に説明します。下記がloader.luaのソースです。
----LuaLoader fm="" Serial.print("\nInput Lua filename>") while(true)do repeat k = Serial.read() until(k>0) if(k==10)then break end fm=fm..string.format("%c",k) Serial.print(string.format("%c",k)) end fm = fm:gsub("^%s*(.-)%s*$", "%1") Serial.println("\nFilename:["..fm.."]") fp = 0 SD.open( fp, fm, 2 ) SD.write( fp, "--"..fm.."\n", fm:len()+3 ) eflg=0 while(true)do t=millis()+1000 repeat k = Serial.read() if(t<millis())then Serial.println("Close?(Enter)") repeat l = Serial.read() until(l>0) if(l==10)then eflg = 1 break else k=l end t=millis()+1000 end if(k==0)then k=10 end until(k>0) if(eflg==1)then break end SD.write( fp, string.format("%c",k), 1 ) Serial.print(string.format("%c",k)) end SD.close( fp ) sys.setrun(fm)
実行すると、Input Lua filename>と送信するLuaファイル名の入力待ちになります。
Input Lua filename>
SDメモリカードに保存したいファイル名を入力しください。ファイル名を入力してEnterキーを押すと、スクリプト入力モードになります。
Input Lua filename>test.lua Close?(Enter)
ここで、Luaスクリプトファイルを送信してください。送信が終了すると再びClose?(Enter)と聞いてくるので、Enterキーを押すとSDメモリカードにLuaスクリプトが書かれて実行されます。
Input Lua filename>test.lua Filename:[test.lua] Close?(Enter) ----test for i=1,10 do Serial.print(i.." ") end Close?(Enter)
ここでEnterを押します。
Input Lua filename>test.lua Filename:[test.lua] Close?(Enter) ----test for i=1,10 do Serial.println(i.." ") end Close?(Enter) 1 2 3 4 5 6 7 8 9 10 Input Lua filename>
loader.luaがsakulua.xmlに書かれていれば、Luaスクリプトの実行が終了すると再びLuaファイル待ちになります。
手入力も可能
loader.luaプログラムを見ても分かるように、Close?(Enter)を無視して手打ちを続ければ、スクリプトの手入力も可能です。
Input Lua filename>test.lua Filename:[test.lua] Close?(Enter) -- for i=1,10Close?(Enter) do Close?(Enter) Serial.println(Close?(Enter) i..Close?(Enter) "Close?(Enter) Close?(Enter) "..iClose?(Enter) )Close?(Enter) Close?(Enter) end Close?(Enter) 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
Close?(Enter)を回避しながら、無理やり手入力した例です(^^;。実際のプログラムは下記のようです。
-- for i=1,10 do Serial.println(i.." "..i) end
CTRL-Zか何かを終了コードにしてClose?(Enter)を消すのもありかもしれませんね。