In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Prototyping Lab: Recipe 29.5

Get Adobe Flash player
by kotobuki 17 Apr 2010
/**
 * Copyright kotobuki ( http://wonderfl.net/user/kotobuki )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/76I0
 */

package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.TimerEvent;
  import flash.text.TextField;
  import flash.text.TextFieldAutoSize;
  import flash.utils.Timer;

  import funnel.*;

  [SWF(backgroundColor="0x808080")]

  public class CalibrationByAverage extends Sprite {
    // Arduino
    private var arduino:Arduino;

    // 入力波形を表示するためのシグナルスコープ
    private var signalScope:SignalScope;

    // 光センサを接続したピン
    private var sensorPin:Pin;

    // 一定時間のキャリブレーションを行うためのタイマ
    private var calibrationTimer:Timer;

    // 状態やキャリブレーション結果を表示するためのテキストフィールド
    private var textField:TextField;

    public function CalibrationByAverage() {
      // Arduinoのインスタンスを生成し、sensorPinにアナログ入力0をセット
      arduino = new Arduino(Arduino.FIRMATA);
      sensorPin = arduino.analogPin(0);

      // シグナルスコープを生成してセット
      signalScope = new SignalScope(10, 10, 200, 
                                    "Brightness");
      this.addChild(signalScope);

      // テキストフィールドを生成してセット
      textField = new TextField();
      textField.x = 15;
      textField.y = 140;
      this.addChild(textField);

      // キャリブレーション区間を決めるためのタイマを生成
      // 5000ms後にonTimerCompleteが呼ばれるようにセット
      calibrationTimer = new Timer(5000, 1);
      calibrationTimer.addEventListener(
        TimerEvent.TIMER_COMPLETE, onTimerComplete);

      // テキストフィールドにキャリブレーション中であることを表示してタイマをスタート
      textField.text = "Calibrating...";
      textField.autoSize = TextFieldAutoSize.LEFT;
      calibrationTimer.start();

      // ENTER_FRAMEイベントに対するイベントリスナをセット
      this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    // タイマが完了したら以下を実行
    private function onTimerComplete(e:TimerEvent):void {
      // タイマを停止してイベントリスナを削除
      calibrationTimer.stop();
      calibrationTimer.removeEventListener(
        TimerEvent.TIMER_COMPLETE, onTimerComplete);

      // センサの平均値から閾値とヒステリシスを求める
      var threshold:Number = sensorPin.average * 0.9;
      var hysteresis:Number = 0;
      if (threshold > 0.5) {
        hysteresis = (1 - threshold) / 10;
      } else {
        hysteresis = (threshold) / 10;
      }

      // テキストフィールドの表示を更新
      textField.text = "Threshold = " + threshold.toFixed(3);
      textField.appendText(", Hysteresis = " 
                           + hysteresis.toFixed(3));

      // センサに求めた値を引数としたSetPointフィルタをセット
      sensorPin.addFilter(new SetPoint(
                          [threshold, hysteresis]));
    }

    // 毎フレームごとに以下を実行
    private function onEnterFrame(e:Event):void {
      // シグナルスコープの表示を更新
      signalScope.update(sensorPin);
    }
  }
}