遥かへのスピードランナー

シリコンバレーでAndroidアプリの開発してます。コンピュータービジョン・3D・アルゴリズム界隈にもたまに出現します。

IS01専用Androidアプリ「LEDモールス」を公開しました

ものすごく久しぶりのブログになってしまいましたが生きてます。
最近は社内でスマートフォン関連の開発をやってまして、どっぷりとAndroidに浸かっています。
機種依存やら何やらに悩まされたり、Android開発の奥深さに毎度唸らされる毎日です。

で、今日はシャープとアンドロイダーが開催した「SHARP Androidアプリ開発 テクニカルセッション」というセミナーにいってきました。これはメーカーの開発者の方がいる中で、皆PC持参でひたすら実機を触るという素晴らしいイベント(※講演もありました)だったのですが、このセミナー中に1個お遊びのアプリを作ってみたので公開します。

LEDフラッシュでモールス信号を発信できるアプリです。
LEDの制御はIS01専用(というかシャープ専用)の拡張APIなので、いまのところIS01しか動きませんが、船舶間での通信、難破・遭難時の救難信号、符号理論の勉強などに是非ご活用ください!

というわけで僕はAndroid端末を持っていないので本当に公開できているか分からないのですが、「LEDモールス」という名前でマーケット公開中です。ダウンロードは(多分)↓こちらから。

【LEDモールス】(IS01専用アプリ)
http://market.android.com/search?q=org.firemobilesimulator.morse

適当なソースコードなのでさらしておきます。

package org.firemobilesimulator.morse;

import java.util.Hashtable;

import jp.co.sharp.android.hardware.FlashLight;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class TopActivity extends Activity {
    private static final String TAG = "Morse";

    private static final int INTERVAL = 1000;

    private static final int LONG = 1000;

    private static final int SHORT = 200;

    private EditText mEditText;

    private static Hashtable<String, String> mTable;
    static {
        mTable = new Hashtable<String, String>();
        mTable.put("A", "・−");
        mTable.put("B", "−・・・");
        mTable.put("C", "−・−・");
        mTable.put("D", "−・・");
        mTable.put("E", "・");
        mTable.put("F", "・・−・");
        mTable.put("G", "−−・");
        mTable.put("H", "・・・・");
        mTable.put("I", "・・");
        mTable.put("J", "・−−−");
        mTable.put("K", "−・−");
        mTable.put("L", "・−・・");
        mTable.put("M", "−−");
        mTable.put("N", "−・");
        mTable.put("O", "−−−");
        mTable.put("P", "・−−・");
        mTable.put("Q", "−−・−");
        mTable.put("R", "・−・");
        mTable.put("S", "・・・");
        mTable.put("T", "−");
        mTable.put("U", "・・−");
        mTable.put("V", "・・・−");
        mTable.put("W", "・−−");
        mTable.put("X", "−・・−");
        mTable.put("Y", "−・−−");
        mTable.put("Z", "−−・・");
        mTable.put("1", "・−−−−");
        mTable.put("2", "・・−−−");
        mTable.put("3", "・・・−−");
        mTable.put("4", "・・・・−");
        mTable.put("5", "・・・・・");
        mTable.put("6", "−・・・・");
        mTable.put("7", "−−・・・");
        mTable.put("8", "−−−・・");
        mTable.put("9", "−−−−・");
        mTable.put("0", "−−−−−");
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mEditText = (EditText) findViewById(R.id.input);
    }

    public void morse(View view) {
        Editable edit = mEditText.getText();
        String s = edit.toString();
        FlashLight mFlashLight = new FlashLight();
        // 通常の点灯時は、ライトの色のみ指定します
        int len = s.length();
        for (int i = 0; i < len; i++) {
            String oneChar = s.substring(i, i + 1).toUpperCase();
            Log.d(TAG, "morse:" + oneChar);
            String code = mTable.get(oneChar);
            if (code != null) {
                int codeLen = code.length();
                for (int j = 0; j < codeLen; j++) {

                    char c = code.charAt(j);
                    int time = 0;
                    switch (c) {
                    case '−':
                        time = LONG;
                        break;
                    case '・':
                        time = SHORT;
                        break;
                    }
                    mFlashLight.setFlashLightOn(FlashLight.LIGHT_COLOR_WHITE);
                    try {
                        Thread.sleep(time);
                        mFlashLight.setFlashLightOff();
                        Thread.sleep(INTERVAL);
                    } catch (InterruptedException e) {
                        Log.e(TAG, "sleep error", e);
                    }
                }
            } else {
                Log.w(TAG, "Unknown Character");
            }
        }
        Toast.makeText(this, "モールス信号を発信しました", Toast.LENGTH_LONG);
    }
}