- 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>
コメントをかく