通常、長い時間がかかるスクリプトや、無限ループのスクリプトを動かした場合、
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>
コメントをかく