通常、長い時間がかかるスクリプトや、無限ループのスクリプトを動かした場合、
FlashAirの電源を入れ直す以外に止める方法はありませんが、
スクリプトに工夫をしておくことで、共有メモリから操作することができます。
※最新版のFTLEに同等機能が実装されました
よりコンパクトになったライブラリがあります
→lib:breakable
FlashAirの電源を入れ直す以外に止める方法はありませんが、
スクリプトに工夫をしておくことで、共有メモリから操作することができます。
※最新版のFTLEに同等機能が実装されました
よりコンパクトになったライブラリがあります
→lib:breakable
print "HTTP/1.1 200 OK"
print ""
--初期状態に設定
fa.sharedmemory("write", 0x00, 0x07, "RUNNING")
for i=0,10 do
--現在の状態を出力
msg = string.format("Hello!! %d",i);
fa.sharedmemory("write", 0x10, 0xFF, msg)
print(msg)
--ブレーク情報を受信してループを抜ける
if(fa.sharedmemory("read", 0x00, 0x07, "") == "BREAKIT")then
break
end
--Webサーバーに余裕が必要なため適度なSleepを入れる
sleep(500)
end
--終了状態を告知
fa.sharedmemory("write", 0x00, 0x07, "STOPPED")
FlashAir上に予め書き込んでおいてください。
<!DOCTYPE html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Shared Memory Breaker</title>
</head>
<body>
<table>
<th colspan="2" width="500" bgcolor="#ffd3d3">
Shared Memory Breaker
</th>
<tr>
<td colspan="2" width="500" height="100" bgcolor="#ffd3d3">
<input type="button" style="width:100%; height:100%;" onclick="breaker()"value="BREAK">
</td>
</tr>
<tr bgcolor="#ffd3d3">
<td align="right" width="200">
Break Respons:
</td>
<td>
<span id="res"></span>
</td>
</tr>
<tr bgcolor="#accaf9" width="200">
<td align="right">
Running Status:
</td>
<td>
<span id="stat"></span>
</td>
</tr>
<tr bgcolor="#abf9b3" width="200">
<td align="right">
Message:
</td>
<td>
<span id="msg"></span>
</td>
</tr>
<tr bgcolor="#f9eaab" width="200">
<td align="right">
Communication Status:
</td>
<td>
<span id="ind"></span>
</td>
</tr>
</table>
<script>
var indicator_cnt=0;
function get(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.setRequestHeader("If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT");
xhr.timeout=3000;
xhr.onload = () => {
if (xhr.status == 200) {
resolve(xhr.responseText);
}else {
reject(Error(xhr.statusText));
}
};
xhr.onerror = () => reject(Error(xhr.statusText));
xhr.send();
});
};
function comm(url,elementName)
{
//document.getElementById(elementName).innerHTML = "";
get(url).then((dat) => {
document.getElementById(elementName).innerHTML = dat;
indicator();
}).catch((reason) => {
document.getElementById(elementName).innerHTML = reason;
});
}
function breaker()
{
comm("/command.cgi?op=131&ADDR=0x00&LEN=0x07&DATA=BREAKIT","res");
}
function getStat()
{
comm("/command.cgi?op=130&ADDR=0x00&LEN=0x07","stat");
getMsg();
}
function getMsg()
{
comm("/command.cgi?op=130&ADDR=0x10&LEN=0xFF","msg");
}
function indicator()
{
indicator_cnt++;
switch(indicator_cnt){
case 3: document.getElementById( "ind" ).innerHTML = "−";break;
case 6: document.getElementById( "ind" ).innerHTML = "/";break;
case 9: document.getElementById( "ind" ).innerHTML = "|";break;
case 12: document.getElementById( "ind" ).innerHTML = "\"; indicator_cnt=0; break;
}
}
setInterval(getStat,500);
</script>
</body>
</html>


コメントをかく