東芝から発売されているFlashAirを用いた開発を行う人々向けのまとめwikiです。※本wikiは東芝及びフィックスターズ、キオクシアとは何の関係もありません。お問合わせは管理者へお願いします。

概要

通常、長い時間がかかるスクリプトや、無限ループのスクリプトを動かした場合、
FlashAirの電源を入れ直す以外に止める方法はありませんが、
スクリプトに工夫をしておくことで、共有メモリから操作することができます。

※最新版のFTLEに同等機能が実装されました

よりコンパクトになったライブラリがあります
lib:breakable

注意

  • W-03ではWebサーバーの仕様上動作しません
  • InternetExplorerは対応してません(文法上の問題なので修正すれば動きます)

アニメ

※スマートフォンからだと右が切れやすいので、横画面か、タップしてご覧ください。

ライセンス

サンプル

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")

操作画面HTML

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>

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

スマートフォンの方は画面下部よりPC版に切り替えることをおすすめします

アクセス解析中

忍者アナライズ

GoogleAnalytics

編集にはIDが必要です