1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

IchigoJamAdvent Calendar 2022

Day 9

IchigoJam web で BTN にチェックが入っていても BTN() が 0 を返す場合がある

Posted at

IchigoJam web

IchigoJam web by jig.jp では、「I/O」をクリックすると入出力端子の状態を確認・操作できるUIが出てくる。
ここにはチェックボックスがあり、チェックを入れるとHIGH、チェックを外すとLOWを入力することを表す。
ここには、「BTN IN9」と書かれた項目もある。

BTN()

IchigoJam BASIC の BTN() は、ボタンが押されているとき1、押されていないとき0を返すとされる関数である。

IchigoJam BASIC リファレンス ver 1.4

ボタンが押されていれば1、そうでないとき0を返す(数:0(付属ボタン)/UP/DOWN/RIGHT/LEFT/SPACE/X(88)、省略で0、-1でビットパターンで返す)

IchigoJam BASIC 1.4 コマンド一覧

ボタンが押されていれば1、そうでないとき0を返す(数:0(付属ボタン)/UP/DOWN/RIGHT/LEFT/SPACE/X(88)、省略で0、-1でビットパターンで返す)

IchigoJam-BASIC/BTN.txt at master · fu-sen/IchigoJam-BASIC

ボタンが押されている状態の場合は 1、押されていなければ 0 を返します。

BTN にチェックが入っていても BTN() が 0 を返した

「BTN IN9」の下のチェックボックスにチェックを入れ、インタラクティブ (RUN で実行していない) モードで ?BTN() を入力して BTN() の返り値を表示してみると、0 と表示された。
?IN(9) も試してみたが、これも0 が表示された。
以下のプログラムを RUN して試すと、チェックボックスの状態がきちんと反映された。

10 CLS
20 LOCATE0,0
30 ?DEC$(BTN(),5)
40 ?DEC$(IN(9),5)
50 GOTO20

例えば ?IN(1) は、RUN を用いなくてもチェックボックスの状態が反映された。

不都合の正体

実は、IchigoJam web の BTN()IN(9) は、このチェックボックス以外にマウスクリックの入力も受け付ける。
そして、チェックボックスを操作した後にマウスクリックをすると、マウスクリックによる入力がチェックボックスより優先されるため、BTN()IN(9) の返り値がチェックボックスの状態と合わなくなるようである。
実際、マウスクリックを押したまま ?BTN() を実行すると、RUN を使わなくても 1 が表示された。

BTN() の動作がリファレンスに反する

「BTN IN9」のチェックボックスをオンにした後、マウスクリックをせずに ?BTN() を実行すると、1023 が表示された。
…そう、1023が表示されたのである!
リファレンスによれば、BTN()はボタンが押されていれば1、そうでなければ0を返すはずなのに!!
嘘つき!!!

先日紹介したWAITTICK() で用いる時間の単位が通常より長い上、WAITTICK() で時間の単位が異なる件といい、IchigoJam web はリファレンスに反する動作をしがちのようだ。
イースターエッグかな?
作者の方針は知らないが、私はこんなものは求めていない。
実機とwebで異なる挙動をするのはいいが、リファレンス、もしくは『🍓🅱️ IchigoJam BASIC コマンド一覧 command reference (Japanese)』に明示しておいてほしい。

改善策の検討

まず、「マウスクリックでの操作が BTN IN9 のチェックボックスに反映されてほしい」と考えた。
しかし、前述の通り、マウスクリックで操作した場合は BTN()1 を返すが、チェックボックスで操作した場合は BTN()リファレンスに反して 1023 を返すのである。
チェックボックスをマウスクリックに同期させた場合、1 を返すべきか 1023 を返すべきかわからなくなるかもしれない。
…と思ったが、さらに考えると、「マウスクリックされたらそれに合わせてチェックボックスの状態を変化させる」だけで、「チェックボックスが操作されたらそれに合わせてマウスクリックの状態を変化させる」わけではないので、通常のマウスクリックによる操作と同様に 1 を返すのが妥当そうである。

これはあくまで自分の意見であり、作者は他の意見を持つ可能性がある。

証拠動画

わかりやすいよう、開発者ツールから以下のコードを実行し、マウスクリックの状態を表示させた状態で動画を撮影した。

e = document.createElement("span");
e.setAttribute("style", "position: fixed; top: 1em; left: 1em;");
document.addEventListener("mousedown", function() {
	e.innerHTML = "クリック ON";
});
document.addEventListener("mouseup", function() {
	e.innerHTML = "クリック OFF";
});
e.innerHTML = "クリック OFF";
document.body.appendChild(e);

おわりに

※この記事は執筆時点での情報に基づく。
※IchigoJamはjig.jpの登録商標です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?