コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

ターミナルから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)を消すのもありかもしれませんね。