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

breakable

無限ループや、長時間の動作を続けるスクリプトを途中で中断できるようにします。
※最新版FTLEのdebugモードに同等の機能が内蔵されています。

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

注意

  • 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は使うスクリプトに合わせて適切に設定してください。
  • sleepや、requestなどの時間のかかる動作が多い場合は少なめに、あるいは1に。
  • 単純計算やファイル操作など、とにかく計算量・操作量が多い場合は、1000や10000など大きな値に。

putMessage()を使うとメッセージを送信できます。

以下に無限にカウントアップするサンプルを示します。
require "/breakable" --コレだけ

i=0
while true do
	putMessage(i) --オマケ(現在状態を表示できます)
	print(i)
	i=i+1
end

breakable.lua

以下を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

以下を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>

コメントをかく


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

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

Menu

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

アクセス解析中

忍者アナライズ

GoogleAnalytics

編集にはIDが必要です