- W-04のデバッグライブラリ機能を使用しているため、W-03では動作しません。
- そもそもW-03ではWebサーバーの仕様上動作しません
- 関数フックを利用しているため、Lua実行機能の性能が低下します。
- フックを使わずチェックポイントを指定したい場合はLua:実行中の停止と取得をご利用ください。
- 共有メモリの前半を専有します。使用量は最高で1bitまで圧縮可能ですので、適時改造してご利用ください。
breakable.luaとbreaker.htmをFlashAir上に書き込んでおき、
使いたいスクリプトの1行目にrequire "/breakable"を追記するだけで利用できます。
止めるにはhttp://flashair/breaker.htmを開き、BREAKボタンを押してください。
breakable_BREAK_LINEは使うスクリプトに合わせて適切に設定してください。
putMessage()を使うとメッセージを送信できます。
以下に無限にカウントアップするサンプルを示します。
使いたいスクリプトの1行目にrequire "/breakable"を追記するだけで利用できます。
止めるにはhttp://flashair/breaker.htmを開き、BREAKボタンを押してください。
breakable_BREAK_LINEは使うスクリプトに合わせて適切に設定してください。
- sleepや、requestなどの時間のかかる動作が多い場合は少なめに、あるいは1に。
- 単純計算やファイル操作など、とにかく計算量・操作量が多い場合は、1000や10000など大きな値に。
putMessage()を使うとメッセージを送信できます。
以下に無限にカウントアップするサンプルを示します。
require "/breakable" --コレだけ i=0 while true do putMessage(i) --オマケ(現在状態を表示できます) print(i) i=i+1 end
以下をbreakable.luaとして保存してください。
local breakable_BREAK_LINE = 10; --フック間隔。大きければ大きいほど性能低下が起きにくい
function breakable_hooker(stat,line)
--Breakチェック
if(fa.sharedmemory("read", 0x00, 0x07, "") == "BREAKIT")then
error("breakable: Break!!");
end
--強制Sleep(0でも意味がある)
sleep(0)
end
function breakable_init()
--初期状態に設定
fa.sharedmemory("write", 0x00, 0x07, "RUNNING")
--フックを設定。プログラムがBREAK_LINE行実行されるごとにブレークチェック
debug.sethook(breakable_hooker, "l",breakable_BREAK_LINE);
end
function putMessage(msg)
fa.sharedmemory("write", 0x10, 0xFF, msg)
end
breakable_init();
以下をbreaker.htmとして保存してください
<!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>


コメントをかく