SISO-LAB不定期TOPIC Mar.2004


2004/03/30

WideStdio、InspectorWindowでもカッコよく(裏技?)

本日は、最近発見した、ちょっとしたWideStudioの小技を紹介します。

へ、編集しちゃってもいいのかな?
20040330P00.JPG - 31,115BYTES

WideStudioでごちょごちょと、新SIPHA TERM画面を作っていますが、部品を作っているうちに、Inspector(アプリケーションビルダの左側に表示されてるオブジェクトのツリーウィンドウ)に並んでいるオブジェクトの順番が気に入らなくなることがありませんか?

どうも、作っている順番に表示されていくようでして、「あ、あのボタン忘れた」とか言って追加すると、下のほうに来てしまいます。実は、プロポをエミュレーションする画面を作っていたんですが、画面上のボタンの順番に並んでいないと、どうもやりにくい!というわけで、ちょちょっとWideStudioの定義ファイルをのぞいてみました。

ふむふむ。「ウィンドウ名.win」(たぶん、メインウィンドウと呼ばれる単位だと思います)というファイルにオブジェクト情報があるようですね。テキストファイルなので、エディタで「えい」と開けば内容を確認することができます。よくみると、この中に定義してある順番で表示されているようです。「#OBJ」で始まっている行が1オブジェクトの定義順のようです。

「むむむ、ひょっとしてこれの順番を入れ替えれば…」、たぶん正規技じゃないと思いますので、ファイルをコピってバックアップしておいてください。また、WideStudioは終了させておいてください。

WideStudioの動きを良く見ていると、このファイルをアプリケーションビルダでまず作り、ビルド時に、「ウィンドウ名.cpp」と「ウィンドウ名.h」いうファイルを自動生成し、この中にオブジェクト生成のソースコードが生成されるようですね。おまけ情報としては、これらのファイルをいくら編集しても、ビルドのたびに戻ってしまうのでダメ、ということになります。そっとしておいてあげましょう。 というわけで、「ウィンドウ名.win」の中身をエディタでちょいちょいと入れ替えてWideStudioを再起動…お、変わりました。これで、気にせずオブジェクトをぐいぐい追加できます(^^)。別に結果には何も影響を与えないのですが、気分気分!これで気分上々です。 というわけで、小技でした。

 WideStudio、オブジェクトがごちゃごちゃする時はFormに貼り付けちゃえ
20040330P01.JPG - 12,692BYTES部品化?ぽくもう1つ整理技です。いいのか悪いのかはよくわかんないんですが…1つのウィンドウにいろいろオブジェクトを貼り付けていくと、だんだん、Inspectorに表示される量も増えてきますし、なんだかわかんなくなってくる時があります。そんな時は、あらかじめWSCformを貼り付けておき、その上にボタンなどのオブジェクトを配置するといいです。

左の画面は、「プロポエミュレータ」を作ろうと思って作った画面なんですが、左右の9個組みボタンは、1つのFormオブジェクト上に配置してあります。こうすると、Inspectorには9個ずつ階層化して表示されるようになります。これだけでも結構気分がいいのですが、さらに!1つ作って、コピーすれば、もう1組の9個ボタンウィンドウを作れることが発覚。ぶらぼ〜!

そ、そして、まだ利点があります。全体の表示座標を変える時に「おお、Formに貼り付けておいてよかった〜」というのをさらに実感しました。う〜ん、楽チン。つ〜のも、それぞれのボタンの大きさはあまり変えないのですが、全体のレイアウトを見直すときに、表示座標を変えたいときがあります。実際にあったのは、大元のウィンドウサイズを変えたときです。「うぅ、でかかった」なんて時ウィンドウを小さくすると、全体の部品配置もバランスよく見直したりするわけですが、こんな時、Form上に配置してあると、Formの座標をずらすだけで、ボタンが9個組で移動してくれます。というのも、Form上に配置する場合、それぞれのボタン表示座標は、Formの左上が(0,0)の原点になります(各ボタンがFormの子供になるわけですね)。そんなわけで、Formさえ移動すればいいのです。 というわけで、いいか悪いか良くわからないですが、オススメ!のやり方です。

 

2004/03/29

週末は爆睡…

やっとこさ、出張から戻ってきました。な〜んか、今回の出張はやったらヘヴィ(今回始まったことではないですが)で、結局、週末はほとんど爆睡していました。それで、今朝、部屋の花が枯れていたことに気づいたと…あ〜、ヤダヤダ。心に余裕が無いっていやですね〜。

ロボット製作してる机も、ROBO-ONEが終わった時と同じで、全然片付けていないです。ROBO-ONEからもう2ヶ月。次は大丈夫かな?

GREAT MECHANICS
20040329P00.JPG - 18,650BYTES信頼のおける情報筋から得た情報によると、GREAT MECHANICSなる雑誌に「G-TUne」が載っているとの話なので、さっそく本屋へ探索に行きました。以前、見たことがあったので、心当たりのある本屋へ行ったら一発で見つかりました。おお、しっかり載っている!びっくりです。ありがとうございます。この方でしたか〜。記事をかかれている方もROBO-ONEにエントリーされていた方です。GREAT MECHANICSに載っている写真で改めて拝見させていただきましたが、この方も逆間接ロボットなんですね!目のように張られたシール、あれ、モンスターのやつなんでしょうか?それにしても、G-Tuneのこと、「バルキリーもまっさお」なんて誉めすぎですよん。お世辞でも涙でてしまいます(T_T)。

さて、今回のGREAT MECHANICS、「ザク」とかが一杯載っています。実は、ワタクシ、ガンダムがオンタイムな世代にも関わらず、ガンダムを見たことがありません。高校生になって、「マクロス」を観たぐらいです。いろいろ勉強になります。

せっかくの出張、ちょっと仕入れてきました。
20040329P01.JPG出先でGPの単4型ニッカド(300mAh)とUSB-シリアル通信ケーブルが安かったので、買ってみました。単4型ニッカドは、4本セットで売ってまして、日本円で約280円。とうわけで一本あたり70円。ニッケル水素は、秋月とかで買えますが、ニッカドは見かけた事が無く、テスト用に買ってみたかったんです。うちの近所では、なかなか安い単4ニッカドって売ってないんで。ちなみに、ニッケル水素の800mAhタイプもありましたが、結構高かったのでパス。知らないメーカーで750mAhが安かったのですが、それはやめておきました。

そして、USB-シリアル通信ケーブルですが、ちゃんと使えるのかな?まだテストはしていないのですが、これから試しに、H8/3664に接続してみようと思っています。2つあってもしょうがないので、使えるのを確認したら、友達に転売予定(笑)。

 

2004/03/24

EXCEL+VBも結構イケてて、目からウロコ

スライダーネタで、おかださん(OKADA Official Site)から、メールを頂きました。おかださんのモーションデータ作成ツールって、な、なんとExcel+VBなのね…。現物見て、びっくりしました。詳細は、おかださんのHPを参照してください。見ると、そうかExcelさえあれば、フリーツールと組み合わせて、いい感じのものができてしまうではないか〜というのがわかってしまいました。

実は、以前、ホームページの方は拝見させて頂いていたのですが、「VBで」というところだけ覚えていまして、Excelの方は忘れていました。「ロボット製作のページ」−「R2N-series製作日記」の下のほうにあります。ExcelからVBでシリアル通信ライブラリを呼び出して、User Formで作った操作画面です。よく考えると、これも結構、アリだなぁって思ってしまいました。ほら、Excelって、表計算ソフト。動作データって、ほとんど表だったり、計算いっぱいだったりするわけですし、初期データなどもセルに書いておいて、コアにシリアルでアクセス。実は、なかなか良いんではないかと、思うわけです。

ここから第2のポイントで、今日のお題なんですが、各スライドバーとその受け関数を、割と単調にコーディングされていまして、これについて、「簡単ではまった」(邪道と思いつつ始めたら、意外に簡単であったという意味だと思います)とのコメントを頂きました。そこで、SISOは考えました。

わらひは、いきなり複雑なことをやろうとしている気がする…

といわけで、WideSudioでも、同じようなことができるというのをおかださんにアピールしつつ、こっそりExcel路線もおもしろいと思いつつ、単純なスライドバーの生成をやります(最初からそうしなさいって感じですよね〜)。ひょっとしたら、正式採用かな?ま、今は、小手試し期間です(^^;

単純にサーボ制御用スライドバーを作るには?
20040324P00.JPGとにかく、左のようなウィンドウを作りましょう。ちょと見にくいですが、左上に「トグルスイッチ」、右に「ボタン」、下に「スライダー」が貼ってあります。それが2組貼ってあります。「オブジェクトボックス」からぽいぽいすればできます。大きさ、デザインは好みでOKです。名称は、それぞれ以下のようにしました。

トグル:tglServoDegCtl00、tglServoDegCtl01
ボタン:btnServoDegCtl00、btnServoDegCtl01
スライダ:sldServoDegCtl00、sldServoDegCtl01

前回、ボタンではなく、ラベルを使用していたのですが、今は、気分でボタンにしています。「押すと原点復帰」とかしたらおもしろいかな?と思いまして。また、ボタンだと、ラベルと違って表示にグラデーションが使えるので、デザイン的な理由もあったりします(笑)。

後は、スライダにVALUE-CHのイベントプロシージャをつけます。1つめは、SDCmovSlider00、2つめはSDCmovSlider01とします。そうすると、ソースコードが生成されます。SDCmovSlider00を例に…

まずは#includeの次に、

#include <WSCvbtn.h>
extern WSCvbtn* btnServoDegCtl00;

を追加します。次に、関数の中身として、次の1行を追加します。

btnServoDegCtl00->setProperty( WSNlabelString, (int)object->getProperty( WSNvalue ));

20040324P01.JPGSDCmovSlider01の方も同様にしてください(ただし00は01にしてくださいね)。これで、スライダを動かすと、ボタン上の数値がぐりぐり変わるソフトができます。サーボの個数分だけ、これを繰り返して作ればOKです。一見大変そうですが、やってみると、それほどでもないです。う〜む。意外でした。あれこれ考えるよりは楽かも。しかも、WideStudioは、プロパティで「ユーザー設定値」というのが設定できるので、これを駆使すればさらに楽ができるかも…。んで、できあがりはこんな感じです。

ところで、以前、スプラッシュウィンドウの時に紹介した、ウィンドウにグラフィックファイルを貼り付ける機能の話、覚えていますか?あれとこれを組み合わせると、お楽しみの…これができます。う〜ん、なかなかきれいにできました。

20040324P02.JPG

 

2004/03/21

WideStudio、どうやって画像埋め込む?

相変わらず異国の地のSISOです。ああ、思えば、ROBO-ONEが終わって約2ヶ月。ほとんどこんな生活をしております。しかも、先日、熱がでて寝込んでしまいました。こっちのメンバーにヘルプしてもらって初めて異国の病院に行きました。行ってみたら、全然日本と変わりませんでした。もっと早く行けばよかった。診断結果はただの風邪でした。今は、微妙にフラフラする気もしますが、久しぶりにたくさん寝ているので、そのせいかもしれません。というわけで、時間を見つけてWideStudioです。

なぜ、今、WideStudioか?それはですね、「仕事のおかげでロボットに触れない」→「時間が無い」→「いじける」→「引きこもる」…ではつまらないので、時間が無いのならば、時間をかけずに完成できるよう、開発環境を整えておく!という、非常に前向きなような、そうでないような、しょうがないからそうしているような作戦なのです。ほら、かっちょよくて使いやすいエディタとかあれば、動作データもさくさくできるかもしれないでしょ〜。

う〜む、画像が表示されない…
今日、WideStudioのアプリ作成練習しているフォルダ名を変更したんです。そしたらスプラッシュウィンドウに表示していたビットマップファイルが???表示されなくなってしまいました。ちょっと試してみたら、実行ファイルの中に画像データとかが入る訳ではないようで、プロパティで指定しているファイルを読み込むようになっているようです。

20040321P00.JPG - 6,742BYTESというわけで、とりあえずフルパスで記述していた画像ファイルのパスを相対(というかディレクトリ情報を抜いた)パスに変えました。左の画像は、WideStudioのアプリケーションビルダでプロパティを表示したところです。これで、とりあえず、実行ファイルと画像ファイルを同じフォルダに置いておけばいつも表示されるようになりました。

これ、実行ファイルに入れてしまう方法って無いんでしょうか?また調べてみようとは思いますが、これはこれで、ビルド無しで画像が入れ替えれていいような気がします。でも入れたいな〜。どなたかご存知じゃないでしょうか???

く、クラスってどうやって追加するの?
こ、これがわかりません。普通にCの関数として、コードを足していくのはわかるのですが、クラス(ただのクラス)を追加しようとしたら、ソースコード中の"class"宣言をしているところで、コンパイルが引っかかってしまいます(invalid use of undefined type `struct <anonymous>って言われるんです)。WideStudioって、C++ライブラリ上でC関数を構築していくようなイメージがあるから、classを入れようとすると、何かおまじないがいるのかなぁ…。

ま、まさか、これがおまじないか…

SACdefFileというクラスを定義しようとしていたんですが、これのソースファイルをSACdefFile.h、SACdefFile.cppとしていました。そしたら上記のエラーに引っかかっていたんですが、これを、SSACdefFile.hとSSACdefFile.cppにしたら通ってしまいました。ソースファイル名の頭に「S」を追加して、名前を変えてみたわけです。不思議です。でも、SACdefFileSrc.h、SACdefFileSrc.cppとやってもダメなんですよね〜。お作法かなぁ。

ちなみに、自分で独自に作成したソースコードをコンパイルの対象に入れるには、「プロジェクト」−「プロジェクトの設定」にて「コンパイル」タブを開いて、「追加オブジェクト」にオブジェクトファイル名を追加すればいいです。先の、SSACdefFileの例で行くと、SSACdefFile.oと書いてやればOKです(「SSACdefFile.cpp」では無いのでご注意)。

ファイルの内容をリスト表示
20040321P01.JPG - 23,098BYTESというわけで、せこせこと作っていたのは、テキストファイルを読み込んでリスト表示するだけのプログラム。いやいや、これが将来は、定義ファイルを読み込むプログラムに発展していくわけでして(^^;。

んでまあ、とりあえず、ファイルを読み込んでWSClistDataクラスにWSCstringをがばがばとnewしてくっつけて読み込んでやって、それを試しにWSClistで表示してみたら、左上のようになってしまいました。なんか変でしょ?表示がかけています。これは悩みました。なぜだろう?なぜだろう?

実は、ファイルから読み込んだ時に、「改行コード」が入ったままになっていて、それをWSClistにそのままaddItem()していました。もし、同じような表示になった方がいましたら、「改行コードを削除」してやればOKですよ。んで、左下になりました。

ちなみに、改行コードを削除するには、WSCstringクラスに便利な関数がありまして、delLineFeed()で一発で外れます。なかなか便利です。

setPropertyはすごい!
もう1つおまけなんですが、前回、紹介したスライドバーの動的生成のところで、スライドバー実行関数をお見せしましたが、あの中で、ラベルに数値表示するために、数値を文字列変換しているところがありましたが、その後の調べで、あれは無くてもいいことがわかりました。直接、setProperty()で数値を指定すると、ちゃんと文字列として設定してくれます。C++の、なんとかっていう機能(すいません、忘れました)ですね!というわけで、以下のようになります。

void STM_opeSlideServoDeg( WSCbase* object )
{
  int   nIdx, nDeg;

  nDeg = object->getProperty( WSNvalue );
  nIdx = object->getProperty(WSNuserValue);
  STM_aplblServoDeg[nIdx]->setProperty( WSNlabelString, nDeg );
}

 

2004/03/16

やっぱこれが欲しい!WideStudioでスライドバーを動的生成

WideStudioでスライドバー、しかも動的生成
20040316P00.JPG - 10,190BYTES…と書くと、すごそうだけど、将来きっとすごくなる機能の基礎技術研究として「スライドバーの動的生成」とイベントプロシージャの割り当てににチャレンジしてみました。う〜ん、よくわからないので、本を読むのとプログラマだったころの経験から、ごちゃごちゃと1時間半。ようやくできました。

画像で見ると、「トグルスイッチ」、「ラベル」、「スライドバー」という3つの部品で構成されている塊が、4つ表示されているのがわかると思います。これらは、アプリケーションビルダで作ったのではなく、プログラムにて動的に生成しており、スライドバーを動かすとその値がラベルに反映されるようになっています。さてさて、どうやって作ったかを解説してみたいと思います。いつもながら思うのですが、わかっている人には「しょうもないコード」です。でも、これもまたワタクシメの歴史なので、笑って許してください。

■まずはインクルードファイルとその他準備
とりあえず、アプリケーションビルダで何かウィンドウを作ります。このウィンドウの上に部品を並べるプログラムを書くことにします。そして、INITIALIZEトリガの実行関数を作ります。名前はなんでも好きなものをつけてください。今回は、この実行関数の中で生成することにします。というわけで生成されたコードの、#includeが並んでいる下に、今回、生成する部品である、トグルスイッチ(WSCvtoggle.h)、ラベル(WSCvlabel.h)、スライダ(WSCvslider.h)をインクルードするようにします。

  #include <WSCvtoggle.h>
  #include <WSCvlabel.h>
  #include <WSCvslider.h>

次に、トグルスイッチなどを生成した時に、実体を管理するためのポインタ配列を作ります。管理する対象は、「トグル」、「ラベル」、「スライダ」ですので、それぞれのクラスのポインタ配列とします。また、「何個管理する」といった情報は、あちこちで使いますので、#defineしておきます。そんなわけで、上記の#includeにつづいて、以下のようなソースを書きます。

  #define NUM_MAX 4
  WSCvtoggle* STM_aptglServoPls[NUM_MAX];
  WSCvlabel* STM_aplblServoDeg[NUM_MAX];
  WSCvslider* STM_apsldServoDeg[NUM_MAX];

まあ、こんな風に、いきなりグローバルにするとかっていうのは、なんとなく気が引けますが、他のサンプルとかを見ている限りではよさそう(WideStudioの中では悪くない?)な気がしますので、よしとします。相変わらず、お作法がつかめていませんが、こんな感じでしょう。余談ですが、イメージ的には、「C++クラスライブラリをベースとして、それをCでお気軽に呼び出して使う世界」な気がします。とても現実的で、とっかかりがいい感じですが、本当のところはどうなんでしょう?

■INITIALIZEの実行関数に生成機能を組み込む!(とりあえず)
今回は、INITIALIZEの実行関数に生成機能を組み込むことにしました。実際にアプリを組み出すと、違う場所の方がいいこともあるのですが、「基礎技術研究」ということで、一番お手軽な場所にしました。INITIALIZEの実行関数名は、initMain()にしてみました。中身は、NUM_MAX回ループして各部品を生成するだけです。というわけで、最初に書くコードはこんな感じです。ループして、カウンタに応じた名前(SERVO-00〜03)を作ります。

  int  nCnt;
  char szServoName[64];

  for( nCnt = 0; nCnt < NUM_MAX; nCnt++ ){
    sprintf( szServoName, "SERVO-%02d", nCnt );
    // ここからいろいろ書き足します。
  }

■部品の動的生成
それでは、まずはトグルスイッチの動的生成からいってみようと思います。

  STM_aptglServoPls[nCnt] = new WSCvtoggle( object, szServoName );
  STM_aptglServoPls[nCnt]->initialize();

このあたりは、サンプルソースを見て、「う〜ん、こうかなぁ」とやってみました。本を読むと「生成したらとにかくinitialize()」と、非常に楽しい文章で説明されています。さらに、WSCvtoggleのnewする時のパラメータ、まだよくわかっていません。どっかに少しだけ書いてあったような気がするのですが、1つめは親となるオブジェクト、2つめは「名称」だと思います。だとすると、1つずつ、名前を変えないといけないような気もするのですが、動的に生成する場合は、問題にならないようです(アプリケーションビルダでは、ソースを自動生成する都合上のものかな)。 そして、WSNuserValueを設定します。一見、何につかえるかわからないプロパティですが、ここに数値を入れておくと、後で取り出して使うことができます。イベントプロシージャの実行関数を1つで書いてしまう場合、この数値を使って識別をさせることができますので、ちゃんと数値を設定することにします。

  STM_aptglServoPls[nCnt]->setProperty( WSNuserValue, nCnt );

後は表示名です。このプロパティに設定した文字列が、トグルスイッチのところに表示されます。

  STM_aptglServoPls[nCnt]->setProperty( WSNlabelString, szServoName );

最後に、表示サイズや表示位置を設定します。ループにあわせて、Y座標がずれるようにしてあります。このあたりは趣味の問題なので、好きなように設定すればよいと思います。どれがどの値かは、アプリケーションビルダで試しに1つ部品を作ってみて、プロパティでいじくって確認してみてください。

  STM_aptglServoPls[nCnt]->setProperty( WSNx, 0);
  STM_aptglServoPls[nCnt]->setProperty( WSNy, nCnt*40 );
  STM_aptglServoPls[nCnt]->setProperty( WSNwidth, 100 );
  STM_aptglServoPls[nCnt]->setProperty( WSNheight, 18);
  STM_aptglServoPls[nCnt]->setProperty( WSNindicatorSize, 16 );
  STM_aptglServoPls[nCnt]->setProperty( WSNshadowThickness, 0 );

おっと。最後の最後に、「表示!」します。

  STM_aptglServoPls[nCnt]->setVisible(True);

同様に、ラベル、スライダも設定します。設定しているのは表示系ばかりですので、それぞれのプロパティについては、アプリケーションビルダで1つ作ってみて、確認してください。というわけで、以下のようになりました。

  STM_aplblServoDeg[nCnt] = new WSCvlabel( object, szServoName );
  STM_aplblServoDeg[nCnt]->initialize();
  STM_aplblServoDeg[nCnt]->setProperty( WSNuserValue, nCnt );
  STM_aplblServoDeg[nCnt]->setProperty( WSNlabelString, "0" );
  STM_aplblServoDeg[nCnt]->setProperty( WSNx, 100 );
  STM_aplblServoDeg[nCnt]->setProperty( WSNy, nCnt*40 );
  STM_aplblServoDeg[nCnt]->setProperty( WSNwidth, 50 );
  STM_aplblServoDeg[nCnt]->setProperty( WSNheight, 18);
  STM_aplblServoDeg[nCnt]->setProperty( WSNshadowThickness, 0);
  STM_aplblServoDeg[nCnt]->setVisible(True);

  STM_apsldServoDeg[nCnt] = new WSCvslider( object, szServoName );
  STM_apsldServoDeg[nCnt]->initialize();
  STM_apsldServoDeg[nCnt]->setProperty( WSNuserValue, nCnt );
  STM_apsldServoDeg[nCnt]->setProperty( WSNx, 0 );
  STM_apsldServoDeg[nCnt]->setProperty( WSNy, nCnt*40+18 );
  STM_apsldServoDeg[nCnt]->setProperty( WSNwidth, 150 );
  STM_apsldServoDeg[nCnt]->setProperty( WSNheight, 18);
  STM_apsldServoDeg[nCnt]->setProperty( WSNsliderSize, 16 );
  STM_apsldServoDeg[nCnt]->setProperty( WSNmaximum, 127 );
  STM_apsldServoDeg[nCnt]->setProperty( WSNminimum, -127);
  STM_apsldServoDeg[nCnt]->setProperty( WSNdragInterval, 1 );
  STM_apsldServoDeg[nCnt]->setProperty( WSNvalue, 0 );
  STM_apsldServoDeg[nCnt]->setVisible(True);

■イベントプロシージャの割り当て
さて、ここからが問題です(いや、今までの部分も難しかったんですが…)。スライダを動かしたら、ラベルに表示されている値を更新するという機能を付け加えます。いわゆるアレです。スライダをつまんで動かすと、スライダ位置を数値表示するやつです。普通にアプリケーションビルダから作る場合は、スライダからの「数値変化(WSEV_VALUE_CH)」のトリガを使って、ラベルの値を更新すればよいことになります。これと同じ事をすればよいのですが… 通常、実行関数はアプリケーションビルダから生成します。プロシージャイベントを作って、イベント決めて、云々すると、雛型のソースコードが生成されます。なにがわからなかったって、これを「手で勝手に作っていいものか?」ということに悩みました。 本を読んでいると、「作ってください」とは書いてあるのですが、どうやって作れとは書いてないんです。かといって、アプリケーションビルダからこういうものを作る機能も無さそうですし。というわけで、勇気を振り絞って、手で作りました。先に作りました、initMainのソースコードにちょこちょこっと追加しました。

 まずは、実行関数の方です。割と一般的で、普通のスライダサンプルプログラムもこんな感じだと思います。

void STM_opeSlideServoDeg( WSCbase* object )
{
  char  szDeg[64];
  int   nIdx, nDeg;

  nDeg = object->getProperty( WSNvalue );
  sprintf( szDeg, "%d", nDeg );
  nIdx = object->getProperty(WSNuserValue);
  STM_aplblServoDeg[nIdx]->setProperty( WSNlabelString, szDeg );
}

中身は簡単なものですが、先に説明しましたWSNuserValueが活躍しているのがわかると思います。この実行関数は、すべてのスライダから呼び出されます。そのため、どの人から呼び出されたかを認識しないといけないです。この行です。

  nDeg = object->getProperty( WSNvalue );

この実行関数が呼び出されるとき、objectという変数が渡されますが、これが、この関数を呼び出したオブジェクト(このケースの場合、具体的にはスライダのオブジェクトの1つ)のポインタになります。先の初期化で、WSNvalueに、固有の識別番号を入れていますので、これを取り出すことによってどのスライダから呼び出されたかがわかります。

よって、どのラベルを更新するかわかることになりますね! さて、この実行関数を、WSEV_VALUE_CHイベントが発生した時に呼び出されるように、生成したスライダオブジェクトに割り当てます。それには、以下のように、プロシージャを名称とトリガから生成、生成したプロシージャに実行関数を割り当て、そしてスライダにこれを追加するという形になります。

  WSCprocedure* ep = new WSCprocedure( "SERVO_DEG", WSEV_VALUE_CH );
  ep->setFunction( STM_opeSlideServoDeg, "STM_opeSlideServoDeg" );
  STM_apsldServoDeg[nCnt]->addProcedure( ep );

これをforループの、スライダを生成した後に実行するようにすればOKです。これで「スライダを動かすとラベルの値が変わる」という部品を、動的に生成することができるようになりました。それぞれの部品の表示位置や制御対象とするサーボの情報などを、定義ファイルとかで与えて、SIPHA-COREと通信できるようにすれば…うふっ。 

 

2004/03/12

WideStudioでメニュー付きウィンドウにハマル

うぅ、相変わらず出先のSISOです(しかも、いつもに増して忙しい)。トランジスタ技術(H8のおまけ付き)は、友人にメールして買ってもらいました(3冊程)。たぶん、シリアル通信のレベルコンバータは買わないといけなさそうです(って、買った人はきっと、もう確認されてますよね〜)。そういえば、GOLDENWORKSさんのところで、基板で売っているUSB-SERIALコンバータが紹介されていましたが、あれに一緒に組み込んじゃって、マイコンアクセス専用にしちゃってもよさそうですね〜。んで、ついでにUSBから5V取り出してマイコンに供給したらモバイルですね!電車の中でも、飛行機の中でもマイコンソフトを開発できそうです。今度やってみよう。

WideStudioでメニュー
20040312P00.JPG - 3,922BYTES実は、はまりました。^^; ウィンドウにメニューを追加するには、まず、WSCmenuAreaを追加します。これだけでは、プルダウンメニュー…Windowsで、アプリケーションの上の方についてる、クリックするとびよーんと出てくるメニュー…は出ません。これに、WSCpulldownMenuをさらに追加します。この操作は、どちらもアプリケーションビルダのオブジェクトボックスから操作して追加できます。

 

■ALT+Fでメニューが開かない…うぅ、マニュアル読みなさいって感じ。
20040312P01.JPG - 10,194BYTESFile(F)なんてやってみたんですが、ALT+Fでメニューが開きませぬ。うう。VCとかだと、FILE(&F)とか書くと、ショートカットキーになるんですが、違うようです…とマニュアルと本を読むこと10分。WSCpulldownMenuに「ショートカット」というプロパティがあるのを発見。ここに文字を設定しないといけないんですね〜。ここに「F」と書いておけばいいんですね!これでOKです。

 

■メニューに関連付けた実行関数が呼び出せない…うぅ、やっぱりマニュアル(以下略)
さて、というわけで、WSCpulldownMenuにプロシージャを追加(トリガは「NONE」とするようです)し、このWSCpulldownMenuのプロパティである「メニュー項目」に、「項目の表示文字列:実行イベントプロシージャ名:ショートカットキー,...」といった感じで書いて…と。ん?これで呼び出しができるのハズなのですが、書いてみたら、何も動かない…うぅ、どうして???と思ったら、「プロシージャ名」を書かないといけないんですね。「実行関数名」を書いてしまいました。みなさん、あそこに書くのは「実行関数名」ではなく、「プロシージャ名」です。マニュアルをよく読みなさい!って感じですね〜。でも、VC++とかやってる人は、結構、勘違いするんじゃないかな〜って思います。

2004/03/08

SIPHA-COREソフトウェアテクニック解説

ROBO-ONE Special MAGI優勝記念企画
MAGIの優勝記念で何かしよう何かしようと思ってて、考えてみていたんですが、G-Tuneの場合、変型することと、H8/3664マイコン1つで、一通りのことをこなしている点で、結構、評価いただいているかな〜って思いまして、SIPHA-COREのソフトウェアテクニック解説をしようと思います。変型は…割と直感的なものが多くて、うまく解説できないんで、すいません(^^;。しかも、「記念企画」とかいいながら、あまり万人向け内容では無いと思います…でも、SIPHA-CORE開発につぎ込んだ、数々のアイデア?(そんなにあるかな)を、惜しげもなく、どどんと公開してしまいます。

SIPHA-COREの制御周期
SIPHA-COREは、基本的に、20msecに一周する制御周期を持っています。この周期は、動作データの時間概念の基準となっているものです。1周期は、2つのフェイズによって構成されています。1つは、「サーボ制御信号出力フェイズ」、2つめは「計算、ROMアクセスフェイズ」です。サーボ制御出力フェイズでは、SIPHA-COREは5回にわけて18本分のサーボ制御信号を出力します。出力は、タイマWを使用している関係上、4つの制御信号を1つのタイミングで出力し、4、4、4、4、2という順番で出力します。このあたりは、ま〜、普通なんですが、後の説明に必要なんで、覚えておいてくださいね。図に描くと、こんな感じです。

GT2004F_SOFTARCH_SCCYCLE.JPG - 50,604BYTES

サーボ制御信号の出力
H8/3664は、いくつかのタイマがあるのですが、サーボ制御にはタイマWを使用しています。これを使って、2.5、2.5、2.5、2.5、2.5、7.5msecという感じでタイマー割り込みをかけ、2.5msecの割り込みのところでサーボ制御信号を出し、7.5msecのところで、シリアルEEPROMへのアクセス、サーボ軌道計算等を行っています。タイマVは、後で解説しますが、R/C受信機のパルス幅と加速度センサのパルス幅カウントに使用しています。

タイマWには、ジェネラルレジスタと呼ばれる4つのレジスタがあり、タイマ値とのコンペアによって割り込みをかける機能があります。タイマWのオーバーフローによってサーボ制御信号をONし、コンペアマッチ割り込みによってOFFしています。そういった意味では、コンペアマッチ割り込みがぶつかった時に、若干サーボがプルプルしますが、実際のところ、うちのサーボでは、問題になるほどプルプルしません。というのは、OFFする処理をすごく簡単な処理にしているからです。具体的には、あっさりと…

IO.PDR1.BYTE &= 0x03;
TW.TSRW.BIT.IMFA = 0;    // 割り込みフラグクリア

といったコードになっています。ピンアサインメント考える時に、こういうシンプルなコードでクリアできるように考慮しました。

シリアル通信
シリアル通信は割り込みを使用せず、スキャンする形で実装しています。これもすべてはサーボ制御信号を正確にするためです。また、ユーザインターフェイス用のソースコードは実装していません。基本的には、メモリ書き込み、読み出し、シリアルEEPROM書き込み、読み出し用の通信手順が用意されているだけです。パソコンから操作する場合、SIPHA-TERMによって、メモリを書き込むことで操作を行っています。この方式を採用している理由は、ROMエリアの節約のためです。メニューなどをシリアル通信によって実装する場合、その表示データはすべてROMに書き込まれるわけですが、これがなかなかメモリ食いです。そんなわけで、さっぱりとやめてしまい、モニタのようなプログラムだけを実装することにしました。ユーザインターフェイス的な要素は、SIPHA-TERM側(パソコン)の方に持たせています(それでもオプティマイズして19Kバイトぐらいあります。三角関数とかを載せているためです)。

通常のメモリ読み書きは、サーボなどを制御していても実行できるようになっています。実際の処理は「計算、ROMアクセスフェイズ」のみで行っています。シリアル通信は、サーボプルプルを防ぐために、割り込みは使用せず、「計算、ROMアクセスフェイズ」の中で、レジスタをチェックすることで行っています。

パソコンとの間は、完全に1バイトずつのハンドシェイク(受信したよ、送ったよと、1バイトずつやる)にて行っています。そのため、データの取りこぼし無く、「計算、ROMアクセスフェイズ」の時間のみを使って通信できるのですが、実は、かなりスループットが良くないです。それでも、制御中でもサーボ指示値などを取り出せるメリットは大きいです。また、実質転送レートは「その他フェイズ」の処理あまり時間に左右されます。最悪ケースで、1制御周期で1バイト、つまり50バイト/秒になることもありますが、データを厳選していれば実用範囲です。転送可能量は、その時々の「計算、ROMアクセスフェイズ」で使用した時間によって変わります。

また、シリアルEEPROMを書き込むときだけは、サーボ制御信号などの処理を全て停止させています。実用上、ぐいぐいロボットを動かしている時に、データ書きとかできなくても困らないので、問題は無いです。

R/C受信機の取り込み
R/C受信機は、もともと、サーボ制御信号を出力するものですので、当然、16msec〜20msecぐらいの周期で、サーボ制御パルスと同じような信号がでてきます。タイマVにて、0.128msecでオーバーフローするようにして、信号がHighになっている時に、何回オーバーフローしたかを計測しています。というわけで、プロポのスティックを動かした時、9〜14カウントぐらいの変化を得ることができます。この数値から、しきい値によって、それぞれのプロポスティックの位置を上中下に分けています。

さて、これをどうやってリアルタイムに取り込んでいるかといいますと、この図を見てください。

GT2004F_SOFTARCH_RCANALYZE.JPG - 37,352BYTES

R/C受信機の信号は、こんなふうに、少しずれて出力されていますが、ここの話では全然関係ないです(笑)。ウソを書くわけにもいかないので、リアルに書かせていただきました。先に書きましたように、「タイマVオーバーフロー時に、信号がHighになっていたらカウントアップ」という処理をひたすらするソースコードがあります。普通に考えると、HIGHの時、ず〜っとカウントアップ、LOWの時はカウントアップしない…よってまたHIGHになるとカウントアップ…じゃあ、全然、パルス幅がわからない!となってしまいます。

しかし、上の図をよく見てみると…サーボと同じで、パルスが出力されるとその後、大体、14msecぐらいのお休みがあります。これに目をつけました。SIPHA-COREの制御周期タイミングは、2.5msec、2.5msec、2.5msec、2.5msec、2.5msec、7.5msecです。この間隔でカウントアップされている値をチェックすると、「前回チェックした時と同じ時」=「LOWになっている時」ということになります。つまり、シンプルで短い処理である「HIGHならひたすらカウントアップ」という処理をさせておくだけで、制御周期タイミング時にチェックすると、R/C受信機信号の幅を取得できるわけです。具体的には、制御周期タイミングの方で

  前回と同じ値かチェック
  同じ値なら、それをR/C受信機値として、カウンタをクリア

という処理をします。制御周期タイミングでの処理は、実は比較的、時間が延びたりしても問題がありません。なぜならば、この間はサーボ制御信号を出力していないですし、また実際にはタイマWを止めてしまっています。よって、割と複雑な処理を書いても、プルプルには全く影響はなく、また、全体のパフォーマンスにもそれほど影響が無いです。そんなわけで、制御周期タイミングの割り込み(タイマWのオーバーフロー)では、割と時間がかかるこういった判断の部分を書き、その他の割り込みでは、極力シンプルにしています。この速度(0.128msec)で割り込みをかけると、処理能力がだいたい70〜80%程度になります。そんなわけで、割り込み側の処理を、極力軽くするのは大切なことだと思います。

ところで、これだけだと、実は、サーボ制御信号のOFFタイミングとタイマVの割り込みが一緒に入った時に、サーボがとてもプルプルしてしまいます。ここが最も悩んだところです。いくらタイマV割り込み処理をがんばったとこで効果なく、レジスタ退避をすっとばすなどのウルトラC技を使わないとこれを回避することはできませんが、結構、簡単な方法でこれをクリアしました。それは「タイマVの割り込みを使わない」ということです。「計算、ROMアクセスフェイズ」では、タイマVの割り込みを使ってカウントアップし、「サーボ制御信号出力フェイズ」では割り込みを使わず、メインの方にぐるぐる回りでタイマWのOVFをチェックするようにし、これでカウントアップします。サーボ制御信号OFF処理にとって、自分以外の割り込みは深刻ですが、逆に、0.128msec間隔程度の処理からみれば、サーボ制御信号OFF処理なんて誤差の範囲です。こうしてめでたくリアルタイムにR/C受信機信号を取り込めるようになったのでした。加速度センサも同じアルゴリズムで取り込みを行っています。

シリアルEEPROMアクセスのチューニングポイント
GDLについているライブラリをチューニングさせていただいて使用しています。以前、報告しましたように、そのまま使うと、10バイトぐらいのデータをアクセスしまくるような感じで使用する場合、結構時間がかかります(とは言ってもmsecオーダーですが)ので、どのようにチューニングしたかといいますと…

  チューニング対象は、読み込みの EEPROM_BlockRead()
  EEPROM_BlockRead()内の初期化処理を、別関数化
  EEPROM_BlockRead()する前に、初期化関数を実行
  違うアドレスが欲しい時は、そのままEEPROM_BlockRead()をする。

こんな感じです。SIPHA-COREでは、制御周期の空き時間を使ってEEPROMにアクセスしているため、まとめて取れる時間が少なく、一度に読み出すデータ数を少なくしてマメに読み出す、というスタイルを取っています。そのため、一気に読み込む場合のスループットは、オリジナルのものでも変わりません。しかし、マメに読み出す、アクセスアドレスを変える、といった使い方をする場合、非常に効果があります。具体的な部分は探してみてください。
ヒントは…

  アイドルチェック
  ポート初期化
  IICバスBUSYチェック

  ACKBの処理と停止処理

を初期化関数にまとめ、EEPROM_BlockRead()からはずすことです(そのまんまですね…)。イメージ的には、ファイルオープン/クローズな感じです。

使ってみて思ったのは、今のアクセス方法ですと、どうしてもまとまった時間を作らないといけないので、処理全体からみると、ちょっと足かせ気味です。う〜む、これからどうしましょう。

今後の展開
もう、これで手の内は全部明かした〜!って感じですが、いかがでしたでしょうか?コントローラ自作派の方へ、少しでも参考になればと思います。また、説明内容ですが、H8/3664に限定したものではなく、どのマイコンでも実装可能なものだと思います。

そして、今回のネタはばらしてしまいましたので…SIPHA-COREも、次へのステップへの進んでいくのです(SISO = 切羽詰らないとやらないヒト)。

 

2004/03/07

G-Tune 2004Fの詳細アップ

G-Tune 2004F 詳細写真
GT2004F_BOTTOM_S.JPG以前、撮っておいたG-Tuneの写真を整理して、 詳細解説の方にアップしました。ちなみに左の写真は、G-Tune 2004Fを下から見たところです。

左側に写っているのがS03Tなんですが、とりつけステーがゆがんでいるのがわかると思います。今回の加工で、精度だすのが難しかったのが、サーボケースへの穴あけでした。今後、もう少しやり方を考えていこうと思っています。今回は、簡単に「型」みたいなものを用意してやっていたんですが、次回は、「サーボがはまる型」を用意して、それで穴あけ位置合わせをしようと思っています。

個人的には、肉抜き用の穴と、サーボケーブルの引っ張り出しの場所が、さりげなく一致させているあたりが、設計的にスマートでオシャレだなんて思っているのですが、いかがでしょうか?

ロボット系リンクページ作りました
だいぶ遅くなってしまいましたが、ロボット系リンクページ作りました。まずは、リンクしてくださっている方々とショップ関係をアップさせていただきました。 今後、自分がよく拝見させて頂いている方も、追加させていただきたいと思っていますので、またご挨拶に伺います。よろしくです。

 

2004/03/04

WideStudioでスプラッシュウィンドウらしきもの

WideStudioでスプラッシュ!
20040304P00.JPG - 12,853BYTESWideStudio、ちょっとプログラム作ってみました。とはいっても、「Helloなんとか」じゃないですよ。スプラッシュウィンドウもどき?(なのか本物なのかよくわかりませんが)を作ってみました。最初は違うだろ〜と声が聞こえてきそうですが、まずは形からです(笑)。かっこよくないといけませんから。

せっかくなので、オンラインマニュアルを読めばわかることはおいといて、ポイントを紹介させていただきます。

作ったものは…起動すると、メインのウィンドウ以外にもう1つ、起動表示用のビットマップを貼ったウィンドウを開き、1.5秒後に自動的に閉じるものです。よくアプリケーションでありますよね?起動するときに製品名とか表示されて、後ろでアプリケーションが起動処理をするやつ。アレです。いまのところ、これだ!という方法が良くわからないので、スプラッシュ風っていうのが正解なんでしょうか?

こんなふうに作ってみました。まずはアプリケーソンビルダを使います。

  1. プロジェクトを新規作成する。
  2. 新規ウィンドウを作る(SiphaMainと命名)。
  3. スプラッシュ表示用に普通にウィンドウを追加する(WinStartupSplashと命名)。
  4. スプラッシュ表示ウィンドウのプロパティをいじる。
      X/Y座標…適当
      横/縦幅…ビットマップファイルのサイズに合わせる。
      「背景画」…ビットマップファイルのファイルパス
      「タイトル属性」…枠
  5. スプラッシュ表示ウィンドウに「タイマー」を追加する(TimerExitSplashと命名)。
  6. タイマのプロパティをいじる。
      時間間隔…1500(たぶん、msecってことだと思うので、1.5秒だと思います)。
      継続…False(ウィンドウを閉じるために一発動けばいいので)
ここまでがWideStudioを操作して作った部分です。さて次はソースコード追加ですが、すべて「プロシージャ」から追加しています。やっていることですが、起動すると当然メインウィンドウが開きます。この時の、メインウィンドウの初期化イベントにて、スプラッシュウィンドウを開きます。次に、スプラッシュウィンドウの初期化イベントで、スプラッシュウィンドウ自身の位置を、デスクトップ中央に移動してタイマスタートします。んで、タイムアップしたらスプラッシュウィンドウ自身を、自分で見えなくします。
  1. SiphaMainにプロシージャ追加します。
      プロシージャ名称:StartUp(適当)、トリガ:INITIALIZE、関数名:ShowSplashWin
    この中でスプラッシュウィンドウを外部宣言。
      #include <WSCwindow.h>
      extern WSCwindow* WinStartupSplash;
    そして関数の中でスプラッシュウィンドウのプロパティを操作して「表示」にします。
      WinStartupSplash->setProperty(WSNvis, True );
  2. WinStartupSplashに、タイマ起動のためのプロシージャを追加します。
      プロシージャ名称:タイマ操作(適当)、トリガ:INITIALIZE、関数名:TimerStart
    この中で、タイマクラスを外部宣言します。
      #include <WSCvtimer.h>
      extern WSCvtimer* TimerExitSplash;
    そして、タイマクラスのプロパティを操作してスタートさせます。
      TimerExitSplash->setProperty( WSNrunning, True );
  3. WinStartupSplashに、ウィンドウを中央に持ってくるためのプロシージャを追加します。
      プロシージャ名称:ウィンドウ移動(適当)、トリガ:INITIALIZE、関数名:MoveWinStartupSplash
    WSappDevクラスのヘッダをインクルードします。これは、アプリケーションクラスと呼ばれるクラスで、WideStudioで作ったアプリケーションに必ずついてるクラスのようです。このクラスには、ディスプレイのサイズ情報とかも入っていますので、これを取得するのが目的です。
      #include <WSDappDev.h>
    そして、ウィンドウを操作するプログラムを書きます。ディスプレイのサイズと、スプラッシュウィンドウのサイズから、中央に表示するための座標を計算し、自分の座標を操作します。
      int nWSNx, nWSNy, nWork;

      WSDappDev* app = WSGIappDev();  // アプリケーションクラスの取得

      // スプラッシュウィンドウを中央に表示するための、ウィンドウ左上座標の計算
      nWSNx = app->getWidth()/2 - (int)(object->getProperty( WSNwidth ))/2;
      nWSNy = app->getHeight()/2 - (int)(object->getProperty( WSNheight ))/2;

      // ウィンドウを計算結果位置に移動する。
      object->setProperty( WSNx, nWSNx );
      object->setProperty( WSNy, nWSNy );
  4. 最後に、TimerExitSplashにプロシージャ追加します。タイムアップは、ACTIVATEでトリガがかかります。
      プロシージャ名称:OpeWindow(適当)、トリガ:ACTIVATE、関数名:CloseStartupSplash
    そして、WinStartupSplashウィンドウにアクセスするため、外部宣言を行います。…んでも、ここのところ、もっと違うやり方があるかもしれません。ちょっとこれは強引な気がします。
      #include <WSCwindow.h>
      extern WSCwindow* WinStartupSplash;
    んで、プロパティを操作して、非表示にします。これで「タイムアップでウィンドウが消える」という動作ができます。
      WinStartupSplash->setProperty( WSNvis, False );

こうやって考えてみると、実は、タイマのスタートって、INITIALIZEでかけてるのってまずいのかな?スプラッシュなので、構わないって感じですけど。ウィンドウが開いてからカウント開始するのが正しそうなので、別のトリガがいいのかもしれません。というわけで、さっそく「EXPOSE」に変えてみました。これは描画された時に発生するトリガです。「ウィンドウ表示=最初の描画が行われる→EXPOSEが発生する」と思いまして。このあたり、アプリケーションビルダでやると、めちゃ簡単です。マウスでちょいちょい。んで「実行」…あ、いい感じですね。スプラッシュの時はどっちでもいいんでしょうが、普通の時はこの方が良さそうです。

というわけでわかったこと。

  • タイマ
    タイマ(WSCvtimer)は、setPropertyでスタートするとスタートする。
    タイマ(WSCvtimer)は、インターバルと一発のモードがある。
    タイマ(WSCvtimer)は、タイムアップでACTIVATEが発生する。

  • ディスプレイサイズ
    ディスプレイのサイズは、WSDappDevクラスから取得する。
    WSDappDevクラスは、グローバルな関数のWSGIappDev()でポインタを取得してから使用する。

  • getProperty()で値取得後の使用方法
    getProperty()で得てすぐ使おうとする場合は、単なる代入にするとか、ちゃんと型をキャストしないとダメ(これ、すごくはまりました。オペレータ演算子が思っていたのと違っていました)
    nWSNx = app->getWidth()/2 - (int)(object->getProperty( WSNwidth ))/2;…OK
    nWSNx = app->getWidth()/2 - object->getProperty( WSNwidth )/2;…NG

  • プログラミングについて
    −C++ベースだと思うのですが、実際に自分でコーディングする起動関数とかは、クラスではなさそう。
    −同じトリガに対して、いくつもトリガ関数を書くことができる。
    −各クラスの実体は、グローバルに宣言されている模様。
    −起動関数は、起動関数ごとにソースファイルができていくので、起動元のオブジェクト名などを短くしたような名前などを使用することで、ユニークになるよう意識した方が良さそう。
    −起動関数を、アプリケーションビルダから削除したからといって、作られたファイルが削除されるわけではない。
    −起動関数の名前は、WideStudioとかにありそうな名前を使うと、ビルドできないような…。
    −プロシージャ名称は日本語が使える。けど、何に影響(効果)しているのかはよくわからない。単なる整理のためなんだろうか? 
    −表示するウィンドウの右下に斜線がつく。リサイズできないウィンドウを作っても斜線がつく。これはいったいなんだろう?
  • 「ビルド」−「実行」とすると、作ったアプリケーションを実行できるけど、アプリの方で操作して終了すると、「ビルド」メニューの中身が、いつまでも「実行中止」になったまま。さみしい。

相変わらず、プロシージャの「プロシージャ名称」の意味がわからず、適当に名前付けていたりします。お作法は、今日の分に関してはだいぶわかってきたのですが、依然、やりたいことについてはわかっていないです。

ONO様…本の読破ですが、最初は「うっ」っと思いました。でも、最初…斜め読み、2回目は割とまじめ、後は必要に応じて、と読んでいたら、結構、楽しく読めましたよ。個人的には、もうちょっと仙人の会話が欲しかったです。すべてはわかりませんが、とっかかりと、大雑把な概念を理解するのであれば、なかなか良い本だと思います。

それにしても、ここはどこだ?日本語が通じないぞ?というわけで、これから数日は、WideStudioネタになるかな(笑)。

ではでは!

2004/03/02

MAGI、ROBO-ONE Special優勝、おめでとうございます!

ROBO-ONE SpecialでZIPPONさんのMAGI、優勝しました。おめでとうございます!いや〜、すごいですね〜!というわけで、普段、めったに買わないビールを買って、家で乾杯!です。記念企画とかやろうかなぁ。

そんなわけで、3月
あっというまにあれから一ヶ月経過。大会の後、そのまま出張に行って、なんだかんだと仕事は忙しいし、帰宅すると0時前が多いし、なんか疲れが取れないし、とまあ、ぼちぼちっと今までやったことを整理したりしてたわけなんですが、MAGI優勝!と聞いて、急に気力アップ!「忙しい忙しい」などとぼやいているだけでは、何も進みません。ああ、もう何かしたくてしょうがないです。さあ、何からやろう?よし、まずはSIPHA-COREのバグ取り!G-Tune 2004Fを100%の状態にすることから始めることにします。おっとその前に、今日は、G-Tune 2004Fの整理中のデータもアップしておきました。そのうち、各部の構造とかもアップします。

というわけで
かといって、デバッグばっかりしていても何なんで、新しいことということで、まずはWideStudioです。というわけで「WideStudioのオフィシャルプログラミングガイド」読破しました。理解のやり方は人それぞれだと思うのですが、自分としては、まずは何か固まったもの(書籍とか、って意味)をががんと斜め読みするのが好きです。んで、わからなければ何度か読みなおして世界観の理解です。やはり、こういう隠蔽化されたものには、それぞれの世界観というか、スタイルが存在します。これさえ理解すれば、後はなんとかなるってもんです。

何気にわかってきたような気がするので、試しに、SIPHA-TERMの作り直しを兼ねて、見てくれから作ってみようと思います。というか、ユーザインターフェイスの作り方しかわかりませんでした ^^;。イマイチ、イベントプロシージャ構成の概念(というか必要性)が理解できていません。プロシージャ、トリガ、起動関数、これらの中で、トリガと起動関数の必要性はよくわかるんですが、プロシージャ(プロシージャ名)ってなんで必要なんだろう???なんかこれは日本語名にしてもいいところを見ると、便宜上、区別するためだけに存在するもんだろうか?あと、普通にクラス(シリアル通信クラスとか)を追加する場合、どういう方法がベターなんでしょう???

でも、これでプログラムとか公開できれば、ここを見ににきてくださっているみなさんにも、気軽にお勧めできます。なんといっても無償ですから。なんか作ったら、バシバシとアップしますね。

 


Back Number of SISO-LAB FUTEIKI TOPIC
2004 Jan. Feb. Mar. Apr. May. Jun. Jul. Aug. Sep. Oct. Nov. Dec.
2003 Jan. Feb. Mar. Apr. May. Jun. Jul. Aug. Sep. Oct. Nov. Dec.

Top Page