富士通Q558/Vをキーボード無でも起動できるようにする

富士通Q558/Vではキーボードを差していないとbeep音が鳴って電源onしません。しかし、OS起動後はキーボードは抜いてもOKという妙な仕様。Q556も同様でした。ほとんどリモートディスクトップで使用しているので、起動毎にキーボードを差替えるのは不便し、新たにキーボードを購入するまでもない。

他のミニディスクトップでは、キーボード無しでも起動することに気づきました。このチェック機構は、Windowsの仕様ではないのですね。

よくよくみると BIOS の起動のタブに設定がありますね。

変更してみます。

これで課題は解消しました。

Eclipse Word Wrap Pluginの設定方法

上記タイトルの設定メモです。長すぎるコード行は問題ですが、横スクロールの手間も問題です。吊るしの状態だとword wrapは効かないみたいです。

http://dev.cdhq.de/eclipse/word-wrap/ に公開されているようです。Eclipce Market Place には入っていません。httpsでないのでブラウザから警告されますが開くしかありません。メニュー[ヘルプ] -> [新規ソフトウェアのインストール] に指定URLを入れても認識されなかったため、直接 .jar をダウンロードします。

以下の場所にコピーします。

その後、Eclipceをクリーン起動します。その後、以下のように認識されているか確認します。

java以外のユーザは以下りように初期設定が必要です。

なぜか編集メニューから行います。

以上です。尚、e2Studio でも同Pluginは動作しました。

Eclipse vim plugin の設定

上記タイトルの覚書です。

メニュー ヘルプ -> 新規ソフトウェアのインストールから以下のようにインストールします。

セキュリティ関係の問合せされます。これは答えないといけません。

もう一段問い合わせがあります。

Eclipseの再起動が求められるため、従います。

再起動後、プラグインを有効化します。

vi のコマンドキーと被るEclipseのショートカットキーは以下のように無効にします。

あとテキストドラッグを殺しておきます。

操作時の注意は、

  • / の検索時、検索文字をコピペするには、/ のフィールド内で右クリックメニューから貼付けを行う。Eclipceの編集メニューからの貼付けは効かない。
  • / の検索時、検索ヒットした語句がハイライトされない。
  • Ctrl + V による矩形選択ができない。(昔はできてたような)
  • Shift + G (最終行に飛ぶ)ができない。

VC++ CLIでよく忘れていること【随時更新中】

たまにVC++ CLI (.NETのC++) を使うと忘れているこのメモです。

「ライブラリ」でなく「追加の依存ファイル」と記述されている。Windows標準ライブラリなら「追加のライブラリディレクトリ」は設定しなくてよい。

win32APIやMFC特有の型WORDDWORDは、CLIでは追加includeが必要。

オブジェクトの頭^

Java、C#の感覚で書いてしまうとBuildエラーになり悩む。new でなく gcnew もであることもお忘れなく。

以下を選択。Publicメソッドを普通に書けば、C#等からも利用が可能。MFC ActiveX Controlのように特別な設定はいらない。

.NETクラスライブラリを使うとき

C#等から、CLIで生成したの.dllを使用時に「間違ったプログラムのフォーマットを読み込もうとしました。」とエラーが発生する場合、x86、x64を指定する。C#単体だと「Any CPU」でWindows上で動作するが、、、

オブジェクトの排他制御

MFCではなんとなくでよかったスレッド間のオブジェクト排他制御は、必須になります。デリゲートを使います。デリゲートは .NET 独自概念です。Swfitのとは違います。別スレッドで動作されるイベントの例です。排他ありと無で2分岐作ります。

	// 受信が別Threadのため、threadまたぎコントロールアクセスのため、
	// デリケード(オブジェクトとメソッドをカプセル化した型)を使う。

	// 「受信データ表示」デリゲート型
	// メソッドへの引数がデリゲート型の引数になります
		delegate void displayReceiveData_Delegate(void);	
		displayReceiveData_Delegate^ displayReceiveData_Obj;		// 「受信データ表示」デリゲート実体
		delegate void displayReceiveError_Delegate(System::IO::Ports::SerialError);
		displayReceiveError_Delegate^ displayReceiveError_Obj;		// 「受信エラー表示」デリゲート実体
		delegate void sendData_Delegate(void);	
		sendData_Delegate^ sendData_Obj;						// 「送信データ」デリゲート実体
		
/* ****************************************************************************
 * 機能名 : シリアルポート受信イベント
 * ***************************************************************************/
private: System::Void serialPort1_DataReceived(
   System::Object^ sender, 
   System::IO::Ports::SerialDataReceivedEventArgs^ e
) {

	if ( dgrdReceive->InvokeRequired ) {		// thread排他が必要か判別
		// 「受信データ表示」デリゲート実体を確保。
		// デリゲートのメソッドは、Formのメソッドとして宣言し、
		// form実体と、メソッド型を、デリゲートに割り当てる。
		// &はC++時のおまじない的記述。C#では不要らしい。
		displayReceiveData_Obj = gcnew displayReceiveData_Delegate(this, &Form1::displayReceiveData);

		// デリゲートを排他ありで呼び出す
		this->Invoke(this->displayReceiveData_Obj);
	}
	else {
		displayReceiveData();			// 受信値表示
	}

			if ( serialPort1->IsOpen ) {
				if ( dgrdReceive->InvokeRequired ) {		// thread排他が必要か判別
					sendData_Obj = gcnew sendData_Delegate(this, &Form1::SendData);
					// デリゲートを排他ありで呼び出す
					this->Invoke(this->sendData_Obj);
				}
				else {
					SendData();			// 次の送信
				}
			}
	}

シリアルポートの受信などトラフィックの高いデリケートの場合、デッドロック的な事象が発生するようです。その場合は、

		formatReceiveData_Obj = gcnew formatReceiveData_Delegate(this, &Form1::formatReceiveData);

		// デリゲートを排他無しで呼び出す
		// Invokeでは大量受信後、Close でフリーズしてしまう。
		this->BeginInvoke( this->formatReceiveData_Obj );

宣言時は、

	array <String^,2/*次元数*/>^	recvFormatedData;	
	recvFormatedData = gcnew array<String^,2/*次元数*/>( 1/*行*/, 3/*列*/ );

参照時

recvFormatedData[ num, 0 ] =
		System::String::Format("{0:00}:{1:00}:{2:00}.{3:000} ",
			DateTime::Now.Hour, DateTime::Now.Minute,  DateTime::Now.Second, 
			DateTime::Now.Millisecond );
recvFormatedData[ num, 1 ] = data1;
recvFormatedData[ num, 2 ] = data2;

拡大はできないので、BACKコピーして、新しくnewして中身を転記する。

	// CLIでは多次元arrayの拡大はできないため、新しく作ってコピーする。
	array <String^,2/*次元数*/>^	backData;
	backData = (array <String^,2/*次元数*/>^)recvFormatedData->Clone();

	recvFormatedData = gcnew array<String^,2/*次元数*/>( num+1/*行*/, 3/*列*/ );

	for( int i = 0; i < num; i++ ) {
		recvFormatedData[ num, 0 ] = backData[ num, 0 ];
		recvFormatedData[ num, 1 ] = backData[ num, 1 ];
		recvFormatedData[ num, 2 ] = backData[ num, 2 ];
	}

配列数取得時は、

		// 未表示データ行数 ( [0]は配列保持用の空Record )
		int datanum = recvFormatedData->GetLength( 0 /*次元数*/ );

  • 意図せずUIダブルクリックしないように注意する。ダブルクリックでイベント自動追加され、要らないのでUndoするとFormが壊れる。イベント自動追加は無効に設定できるようにしてほしいものです。
  • UIを別frameに移動するとき、切取り -> 貼付け すると壊れる。ドラック移動だけで別frameの子供に移動できる。

・GridViewのvalueは == で文字列判定してもbuildエラーはでないが、ToString() で判定が必要。

	/* Value == でbuildエラーはでないがToStringが必要。*/
	if ( _dgrdSend->Rows[ nowRow ]->HeaderCell->Value->ToString() != "none" ) { 
				found = true;
			

以降、随時追加中...

2000年以前用FIATダイアグツールを日本語化+αを試す4: FT232Rで7812bpsを生成可能か?

前記事では時間精度を向上させましたが、ECUから常に応答をえられるようにはなりませんでした。今回は特殊な通信速度7812bpsが生成できているか検証します。

実は、ディスククトップ機などPCに搭載されたリアルRS232Cでは通信速度は、4800,9600,19200,38400 … と定められた数値しか指定できません。Win32APIに数値は指定できますが作用しません。

しかしFT232Rなど仮想COMタイプではそれが可能な場合があります。FTDI社のドキュメント:AN232B-05_BaudRates をみると通信速度の計算式が記載されており、特に定まった通信速度ではないようですが具体例は未記載でよくわかりません。試してみるしかないようです。

まず IAW-SCAN2 のコードに記載されていた 7680bps を試します。手法は弊方のシリアル通信汎用アプリ(いちおうms storeで公開中)から 0x00 を送信し、オシロスコープでK-LINEの信号幅を計測します。

下図(小さくて分かりにくいですが)は 7680bps0x00 を送信し、その幅を計測した結果です。 0x00 は信号上はLowとなりStopBitとあわせると9bitの幅となり、通信速度から1bit幅を乗じると期待値は1,152msとなります。実測は1,170ms なので、指定通信速度は生成できているようです。


ECUメーカの指定値 7812bps も試してみます。こちらはFT232Rの内部分周的に変わらないかとおもいましたが、実測は1,158ms となり期待値に近づきました。しかしながら 7680bps 時の実測1,170ms でも誤差1%なので通信するには問題ないハズです。


以上のようにBaudRateは正しく生成できていますが、未だECUから常時応答が得られません。何か特殊なセキュリティがあるのでしょうか? 次記事につづきます。