ふじ@メガネボーイズのメモのような日記 RSSフィード

2008-09-08

RCX上の時間と実時間

RCX上の時間と実時間には大きなずれがあると思っていたけど、僕が使っているRCXでは、ほとんど同じみたい。

RCX上の時間で50秒ほど走った後にビープ音が鳴るようにして、測定した結果を以下に示します(ストップウォッチで記録した時間)。

  • 1回目=50.44秒
  • 2回目=50.59秒
  • 3回目=50.45秒
  • 4回目=50.57秒
  • 5回目=50.54秒

2008-07-23

Singletonの実装

最初の壁

最初はクラススコープの変数としてインスタンスを定義していた。

RunningFactory RunningFactory::instance;
RunningFactory* RunningFactory::getInstance()
{
	return &instance;
}

何故か動作がおかしい(暴走する)。原因不明。

(C++を理解できていないのかも。どなたか分かる方がいらっしゃいましたら、コメントをいただけると幸いです)

2つ目の壁

次に、関数内のstatic変数でインスタンスを定義してみた。

RunningFactory* RunningFactory::getInstance()
{
	static RunningFactory instance;
	return &instance;
}

コンパイル(リンク?)時にatexitが定義されていないというエラーが出た。

(関数内static変数はインスタンスを破棄するために内部的にatexit関数を使っているのかも)

Webを調べてみると、またもやclayfishさんのブログ「yagihiro output」内に記事を見つけた。

http://d.hatena.ne.jp/clayfish/20070505

ありがたい。

最終的に

newしたインスタンスが最後までdeleteされないことを承知の上でGoFのSingletonにするか、

クラスが増えることを覚悟してSingletonDestroyerを導入するか。

【Object-Oriented & Java maneuver 別室 Singletonパターン】 http://www.02.246.ne.jp/~torutk/cxx/designpattern/singleton.html

とりあえず、GoFのSingletonで動作に問題がないことは確認済み。

fuji_tttfuji_ttt2008/07/23 19:57Destroyerクラスが1つ増えるぐらい気にしなくていいか。
どのドメインに所属させるか悩ましいけど(初期化用のドメインを作ったほうがいいかも)。

skelton_boyskelton_boy2008/07/23 19:59deleteすることは考えなくてもいいんじゃないでしょうか?電源リセットできるし。

ちなみに、走行するレベルにはなりましたか?

fuji_tttfuji_ttt2008/07/23 20:11じゃ、deleteは考えずに。
走るよー。>> ちなみに、走行するレベルにはなりましたか?

2008-05-04

RCXから送ったデータをPC側で受信させる方法

(その1)lxファイルをRCXへロードする時に使っている関数を利用(BrickOSの一式に含まれているものだけで作成)

以下の情報をもとにすればPC側で受信するようなツールが作成できるでしょう。

※自分でデバイスファイルをCreateFile&ReadFileして、<sys/lnp.h>の関数を使えばPC側でも受信できるようである。

(受信というか、受信データの分解とハンドラの呼び出しをしてくれる。)


(その2)lnpdをカスタマイズして利用

多分、シリアルIRタワーのみを想定しているので、USBのタワーを利用するにはカスタマイズが必要ではないかと思います。

あくまでも多分だけど。これ以上は調べないつもり。

あっ、あとCygwinで動かすのに苦労するかも。


(その3)lnphostのAPIを利用

USBのタワーも使えるし、APIが非常にすっきりとしていて使いやすそう。

必要な情報がそろってる。↓

http://lnphost.sourceforge.net/api.html


実装方針

(その3)の方法で作ってみます。

skelton_boyskelton_boy2008/05/05 00:04その1とかって自己満な感じよね。通信させることより、LEGO側でデータ取得、PC側でデータ収集とかの処理に専念できる方を進めた方がいいよね。

fuji_tttfuji_ttt2008/05/05 11:23lnphostが見つかっていること、スケジュールを考慮する必要があるチームの取り組みであることから、その3で進めるべきでしょう。

2008-05-03

RCXとPC間の通信手段

lnphostが使えそう

以下のlnphostが使いやすそうです。

http://lnphost.sourceforge.net/index.html

PC側はlnphost付属のパケットモニタを使ってもよいし、

APIを使って自分で作ってもよいだろうね。

ロボコン用の環境を構築済みなら簡単に利用できます。


導入手順


動作確認手順

RCX側のプログラムを適当に作成(BrickOSの通信用関数を使えばよい)&ロード&実行する。

//------------------------------------------------------------------------------
// Main.cpp
// メイン関数
//------------------------------------------------------------------------------
#include <dkey.h>
#include <lnp/lnp.h>
//------------------------------------------------------------------------------
int main()
{
	int mode = 0;
	while ( KEY_VIEW != dkey_pressed(KEY_VIEW) ) {
		msleep(200);
		switch (mode) {
		case 0 :
			send_msg('a');
			mode = 1;
			break;
		case 1 :
			send_msg('b');
			mode = 0;
			break;
		}
	}
	return 0;
}
//------------------------------------------------------------------------------

Cygwin上でlnphost付属のパケットモニタを実行する(-dオプションでデバイス名に「//./legotower1」を指定する)。

f:id:fuji_ttt:20080502235246j:image

skelton_boyskelton_boy2008/05/03 00:33とりあえずは、見た目はおいといて、それっぽく使えるもの作ろうぜ!データをCSV形式とかに変換できて、Excelでうんにゃらかんにゃらできればいいんじゃね?