Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gpioInPort.onchange を削除可能にしたい (非関数の代入で止まるように) #32

Open
dynamis opened this issue Dec 6, 2020 · 1 comment

Comments

@dynamis
Copy link
Contributor

dynamis commented Dec 6, 2020

現状の polyfill コードでは onchange に関数を登録することは可能だが、削除する方法は提供されていないため、何もしない関数を代入するしか oncahnge の停止方法がない。これは通常の JS とは異なる挙動なので改善したい。

具体的には 1 度だけ onchange を検知して処理したい、処理後はハンドラを削除したい等というユースケースで実装に迷う。

https://github.com/chirimen-oh/chirimen-micro-bit/blob/master/polyfill/microBitBLE.js#L834-L841

        set onchange(value) {
          //          console.log("called setter: onchange:",value);
          onChangeFunc = value;
          changeMonitor();
        },
        get OnChangeFunc() {
          return onChangeFunc;
        },

普通に gpioInPort.onchage = null すると onChangeFunc に null が設定されるし changeMonitor も止まらないので。標準仕様的には null 以外でも 1 でも "text" でも非関数値を代入するとイベントハンドラは止まる。他にも delete するとかいろんな振る舞いに対して oncahnge イベントハンドラの仕様通り実装するのは大変だが、まずは、関数以外を代入したらイベントハンドラとしての振る舞いをしなくなるようにしたい。

@satakagi
Copy link
Collaborator

satakagi commented Dec 9, 2020

今の実装ではonchangeでnullを入れればchangeMonitor は止るようです。
null以外駄目(あ、あとfalseとか0でも良いかも)なので、作りが雑。どこかの機会に改良すべきですね。

main.js

var microBitBle;

var gpioPort2;

async function connect() {
  microBitBle = await microBitBleFactory.connect();
  msg.innerHTML = "micro:bit BLE接続しました。";
  var gpioAccess = await microBitBle.requestGPIOAccess();
  var mbGpioPorts = gpioAccess.ports;
  gpioPort2 = mbGpioPorts.get(2);
  await gpioPort2.export("in"); //port2 in
  sensing = true;
  gpioPort2.onchange = testChange;
}

async function disconnect() {
  await microBitBle.disconnect();
  msg.innerHTML = "micro:bit BLE接続を切断しました。";
}

function testChange(val) {
  msgTxt = val === 1 ? "High" : "Low"; // 条件 (三項) 演算子
  msg.innerHTML = msgTxt;
}

var sensing;
function switchSensing() {
  if (sensing == true) {
    gpioPort2.onchange = null;
    sensing = false;
  } else {
    gpioPort2.onchange = testChange;
    sensing = true;
  }
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title></title>
  </head>

  <script src="https://cdn.jsdelivr.net/npm/@chirimen/microbit"></script>

  <script src="main.js"></script>

  <body>
    <form name="js">
      <input type="button" value="Connect" onclick="connect();" />
      <input type="button" value="Disconnect" onclick="disconnect();" />
    </form>
    <hr />

    <div id="msg">---</div>

    <img src="imgs/GPIO0.png" width="400" />

    <input type="button" value="switchSensing" onclick="switchSensing();" />
  </body>
</html>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants