TDRのデータ取得／処理プログラムPowerMacバージョン変更履歴
          ---by apj　Ph.D



【ver1.20　Development】
◆ナショナルインスツルメンツ(NI)社のGPIBボードを使用できるように測定部分のコードを追加した。テストはPCI-GPIBを用いて、PowerMac7600/132で行った。
TDR_meas.cpを修正し最初にIOTECHかNI488のいずれがdefineされているかで条件コンパイルするように書き直した。プロジェクトにMacGPIB.shlbを加えた。またdecl.hをソースのフォルダに追加した。これにより、使う環境に応じていずれかをdefineして再コンパイルすることが必要になった。なお、ドライバなどはそれぞれの製品に応じてインストールすればよく、特別な作業は必要でない。
◆double *CHAN1(TDR.h)の実体を、TDR_admp.cpで確保していなかったため、ConnectionでGetMeomryを実行すると落ちるバグを修正した。
◆ユーザーズガイドの修正。文書をTeXになおした。ポストスクリプトかpdfファイルにて配布することにする。


【ver1.10　Development】
◆データ点を4096に変更したことで、東海大フォーマットを読むと、パラメータ設定で差のグラフを出したときに、ウィンドウの端1/4にしか表示されなくなってしまったので修正した。時間軸を０で埋めた後、1024点分しか数値を入れないようにした。これまではN_DATA分入れていた。
◆ConnectionメニューでGPIB経由でデータを転送したとき、転送終了時にファイルダイアログが自動で開くが、これをキャンセルすると全く同じダイアログがもう一回開いて、再度キャンセルしなければならなかった。これを１回キャンセルしたら出ないように修正した。
◆すでに存在するファイルを上書きしたとき（測定終了時時のみ。計算終了時はリソースフォークそのものを消去していたので大丈夫なはず）に、ファイルのアイコン(ICN#, ics# icl8, ics8, icl4, ics4, ID=-16455)が消されずに追加されて、同じidのものが増えていくのを修正。書き込む前にこのリソースの有無を確認し、すでに存在する場合は消去して再度書き出すようにした。
◆ 関数readHP54750AをTDR_file.cpに追加。HP54750Aが本体のFDに吐き出すファイルを直接読めるようにした。
これに伴い、OpenDialogのメニューにHP54750A dataを追加した。TDR_FRFLAG_HP54750A_Dを定義した。
◆TDR_readDatafile内部の処理の振り分けの全面改訂。特に波形を１つづつ読む部分は、以前にファイルをすべて登録してから一度に読み込むという仕様を反映して不必要に煩雑になっていたのを整理した。
◆TDR_PARAMETER構造体のメンバにtimebase_pointsとtimebase_lasttimeを追加した。
TDR_PREFS構造体にも同じものを追加した。これによってプレファレンスファイルが変更になった。
これらに値を入力するために、DLOG(215)、DITL(215)を追加した。参照のためにTDR_TIMEBASEDLG_IDをヘッダに追加した。このダイアログは、Datafile3ボタンで未知試料読み込みを指定し、かつファイルが HP54750Aのものである場合に表示される。また、誤入力などのための修正として、Settingsメニューの最後にTimebaseを追加した。入力された値が両方とも正の値であれば計算が行われ、時間軸が変更される。
	for(i = 0 ; i < pr->timebase_points ; i++){
		*(TA + i) = pr->timebase_lasttime / (double)(pr->timebase_points) * (double)i;
	}
で計算している。
◆計算で一部TDR_PARAMETEERS構造体のメンバdtを使っていたのを、時間軸の要素の差*(TA+1)-*(TA)で計算するようにした。パラメータ入力画面でdtは%8.4leとなっており、この画面から値を読みとりdtに代入するということが行われると、ある桁以下は無視されてしまう。これまでは時間軸が500点だったのでどの時間レンジでもdtは比較的桁数の小さな値であったが、２のｎ乗個の点がある場合は途中で打ち切ると、計算時に時間軸の誤差が入り込む可能性が大きい。倍精度で表現できるだけの精度を持たせるためにこの変更を行った。
◆Timebase入力ウィンドウにCancelボタンを追加
◆標準サンプルでConstantを選ぶと実部・虚部ともに０になっていたのを、全周波数範囲で実部は１、虚部は０を返すようにした。これは、空のセルの信号を測ったときに対応するためである。
◆測定時に装置から読み込むデータ点を、preambleに入っている点数分だけ読むようにした。
preambleの形式が同じなら、別の装置で時間軸の点数を可変にしても自動的に対応可能なようにした。
◆これに応じて、TDR_meas.h中の測定点の最大値N_GPIBDATAを4096に再定義した。
この値とTDR.h中のN_DATAが一致する必要がある。２カ所でデータブロックのサイズを管理する設計にしたのははっきり言って邪悪である。測定部分の分離を試みたのが裏目に出てしまった。
◆TDR.cp中のTDR_DoConnectMenuで、データをGPIBで転送した後の保存のところで、保存点数が500点固定になっていたのを、preambleの点数にするように修正した。
◆パラメータ入力時の時間間隔のフォーマットを%8.5leに変更した。
◆一括処理の際の時間間隔の比較は、倍精度実数の時間の値を、Ｃのフォーマット%8.5leで文字列にコピーして文字列の比較で行うようにした。これくらいの桁数の一致で一致と見てよいと考えた。HP54750では時間軸が可変であるが、この桁以下で時間間隔が異なるような違った測定はできない（はず）。
◆fileio.cpの関数 GetFileDateTimeを、作成日と修正日の両方を返すように修正した。これに伴って関連部分の修正を行った。
◆一括処理の際の日付チェック。preferenceの修正日とデータファイルの修正日を比べて、preferenceの方が古い場合に警告メッセージを出すようにした。
◆一括処理の際の日付チェック。Date2Secsで秒になおして比較するようにした。以前はフィールドごとの比較で実はバグがあった。
◆HP54750での動作確認。データフォーマットの指定や読み出しはHP54120と同じものが使用可能であることを確認した。なおマニュアルをざっとみた限りでは、異なっている部分も多いようである。compatibilityを保つようにHPが作ったらしい。
◆時間軸の作成。preambleの値を用いて、
	*(TA + i) = (double)i * pre1.xincrement;
をループで回して作成している。これが狂うと周波数軸が狂うのでcriticalな部分である。
◆標準サンプルの追加。
エタノールは、163-350Ｋで使用できる式として、
１） EtOH-fmax　
　　　 Ethanol　の　fmax vs Temperature(K)
　　　- J. Chem. Phys. vol 104, Feb. 1996, p2050　の table より
2)   EtOH-Static
          Ethanol　の　Dieletric permittivity at f=0 vs Temperatue(K)
         - CRC handbook of Chemistry  & Physics, 77th, p 6-187 より
3) EtOH-infinite
          Ethanol　の　Dieletric permittivity at f=infinite vs Temperatue(K)
         -　263Kー323K　は　NIST　p２５　より
　　　　　at λ＝ 1.24 ( f = 24.2 GHz)
         -   130.6K-148.4K　は　別の論文　より（出処は後で）
プロパノールは、193-350Ｋで使用できる式として、
４） nPrOH-fmax　
　　　 1-Propanol　の　fmax vs Temperature(K)
　　　- J. Chem. Phys. vol 104, Feb. 1996, p2050　の table より
5)   nPrOH-Static
          1-Propanol　の　Dieletric permittivity at f=0 vs Temperatue(K)
         - CRC handbook of Chemistry  & Physics, 77th, p 6-188より
6)　 nPrOH-infinite
          1-Propanol　のDieletric permittivity at f=infinite vs Temperatue(K)
         -　263Kー323K　は　NIST　p２8　より
　　　　　at λ＝ 3 .08（10GHz 付近）
         -   117K-172.6K　は　別の論文　より（出処は後で）
◆測定時に起こりうるエラーチェックの追加。GetMemoryする直前にPreambleで得られた測定点数をN_GPIBDATAと比較し、これより多い点数であった場合はメッセージを出して測定しないようにした。Preambleのフォーマット変更などにより正しい点数が得られなかった場合への対処である。
◆とりあえずCodeWarrior Proでコンパイルが通るようにした。変更点は、Toolboxの関数の名前、ヘッダのインクルードのいくつかをやめた、complexはテンプレートを使うようにした、ANSIライブラリのかわりにMSLライブラリを使うようにした、printf系の関数でdoubleを渡すときには%leではなく%eを使うようにした（リソース中の定義も変更）。
◆ CodeWarrior Pro3でコンパイル。


【ver1.00　Development】
◆パラメータ入力画面内部設計変更。各要素をすべてリソースとして登録。
リソースタイプEdtI。TMPL ID=1200。画面のレイアウトを若干変更。
◆StandardGetFile, StandardPutFileのかわりにカスタムファイルを使うようにした。これに伴い、入力ファイルの形式の指定をパラメータ画面からはずした。
◆誘電率スペクトルの出力を、IgorProのWave形式を優先とした。また、
実部のWave Noteに処理パラメータが記入されるようにした。
デフォルトWave名は、WAVE_logf、WAVE_real、WAVE_imagである。
◆計算終了後に自動的にカスタムのPutFileが表示されるし、あらかじめ出力ファイルの指定をする必要もないので、"Output File"ボタンをパラメータ画面から
なくした。
◆"More Informations"ボタンもパラメータ画面からなくした。そのかわりShow
メニューから"More Informations"を選べるようにした。これに伴い、Showメニューの項目の順番を変更した。
◆パラメータ画面のプルダウンTime Scaleをなくした。そのかわりテキスト入力可能なTime Intervalを追加した。この項目は、これまでMore Informationsにあった。
これに伴い、More InformationsのTimeInterevalは無くなった。
◆コメントが入力できるようになった。255文字まで入力できる。
◆データ処理パラメータを、計算終了後、未知資料を含んだ反射波形のデータファイルのリソースフォークに保存するようにした。同じデータファイルに対して２回目の計算を行ったときは、ファイルの読み込みのときに前回の値をrestoreするかどうかきいてくる。
◆データ処理パラメータは、誘電率スペクトルのファイルがtextファイルの場合も誘電スペクトルのファイルのリソースフォークに保存される。Igor形式の場合は、Wave note に書き込まれるのでリソースには保存しない。
◆ファイルメニューに、Save SetteingsとLoad Settingsを追加した。これに伴い、初期設定フォルダに現在の処理パラメータを保存し、読み出しもできるようにした。
初期設定ファイルはTDRpreferenceである。クリエータ'TDRS'、タイプ'pref'。
◆複数ファイルの一括処理への対応のため、TDR_auto.cpを作成した。D&Dで起動されると、通常の読み込みの際のプリアンブルのチェックや処理パラメータの確認は行わず、ファイルを読み、計算を始める。
◆一括処理の際、計算のダイアログをモーダルダイアログにすると、パラメータ画面のupdateとのタイミングがあわなくて、ダイアログが消えてしまい計算が中断される。このため新たにTDR_calcdlg.cpにモードレスダイアログのハンドリングルーチンを作成し、ダイアログをモードレスとすることで正常動作するようになった。
◆処理パラメータ以外の環境設定も初期設定ファイルに書き込むようにした。showメニューの下のEnvironment Infoで見ることができる。
◆環境設定のうち、ファイルの形式は最も最近使用したものが記録され、終了時に初期設定ファイルに書き込まれる。これは一括処理の際に使用される。終了前に明示的にEnvironment Infoで設定し、その後ファイル入出力をせずに終了した場合、設定した値がTDRpreferenceに書き込まれる。
◆一括処理のときは、TDRpreference中の情報を使って計算をするので、パラメータを決めたら必ずSave Settingsを実行する必要がある。Save Settingsを実行しない限り、TDRpreferenceに処理パラメータが書き込まれることはない。
◆一括処理のときに、設定と異なった形式のファイルが与えられたときは処理を中断する。
◆一括処理のときに、設定と異なったSampling Intervalのファイルが与えられたときは処理を中断する。（TDRの処理では、時間間隔が異なればFTの周波数範囲が異なるのが普通である）
◆計算を行っている際に、カーソルを時計に変えるようにした。
◆計算のダイアログの中に、現在処理しているファイル名の項目をつけ加えた。
◆Save SetteingsとLoad Settingsの際のカーソルを時計に変えるようにした。
◆フリーウェアのSave a BNDL1.3を配布パッケージに含めた。
◆FT後にファイルを保存する際、異なったファイル形式でオーバーライトしてもアイコンが変わらなかった（クリエータ情報が変化しない）ので、保存の前に必ずファイルの消去を行うようにして、正しいクリエータとアイコン情報が保存されるようにした。
◆メニューバーの変更。
旧：File Edit Show Calculate Connect
新：File Edit Settings Brows Calculate Connect
とし、入力する部分と単に見るだけの部分を分離した。
◆Browseを作ったことにより、preamble,旧More Informationの表示の部分、standard samplle, spectrumの表示はBrowseの下になった。
◆Settingsは、旧ShowのParameter, Sample, Caliblation,旧More Information(新：Convergence Condition)、Environment Infoになった。
この変更に伴い、新たにDLOGリソースを作成した。
◆fileIO.cpに、ファイルの日付を得る関数を追加
◆初期設定ファイルの日付を得る関数を追加
◆終了時に環境を保存していたのをやめた。これは次の日付のチェックをするためである。
◆D&Dで始まった場合は、初期設定ファイルの日付とデータファイルの日付を調べて、初期設定ファイルの方が古いときは古いパラメータで処理するかどうか確認するダイアログを出すようにした。
◆baselineとcutoffの位置を、グラフ上で表示するようにした。あらかじめパラメータが設定されている場合（データファイルからrestoreした場合やLoad Settingsした場合）はその値が反映される。表示されている状態でmarkをクリックすると、設定値とグラフ上のマーカーの両方が消去される。
◆command＋マウスドラッグでマーキーを出し、そのサイズにグラフを拡大する機能をつけ加えた。option＋クリックで元に戻る。いずれもキーを押してからドラッグすること。ベースラインやカットオフを決めているときはできない。
◆測定で、オシロの各メモリを別々に読み出せるようにした。
◆Aboutの変更その１。Pictを作って表示するようにした。
◆カットオフ指定ウィンドウで、マウスカーソル位置がデータの何ポイント目にあたるかも表示するようにした。
◆マーキーを表示してドラッグしている間も、カーソル位置を表示するようにした。
◆マーカーを４点出したあとで、マウスでドラッグして好きな場所に移動できるようにした。
ただし、隣のマーカーを越えて動くことはできないし、画面上でマーカーは２ピクセルより近づけない。重なるとどうしようもないから。
◆マーカードラッグの最初に１ピクセル分表示がずれるバグを修正
◆マーカーの左右１ピクセルの範囲にポインタがヒットすればドラッグできるように修正
◆Environment Settingsを１回開かないとGPIBアドレスが設定されないというバグを修正。HandleでリソースEnvsをとったとき、存在しないならnilかどうかチェックしなければならないところをNULLかどうかチェックしていた間違いをなおした。
◆もし、prefarenceにEnvsがなかったとき、最低限の項目（GPIB、入力および出力ファイルの形式）をデフォルトに設定し、それ以外はprefrenceの値にするようにした。GPIBが正しく設定されないバグを修正。
◆測定装置のGPIBアドレスを変更したとき、プログラム側のSettingを変えることで対応できることを確認した。入力の形式は"6"でも"06"でもよい。
◆新しい計測用ドライバMacSCSI488を使用した際に、"ERROR 11 SEQUENCE-DATA HAS NOT BEEN READ"というエラーが出る。これはコマンドを送った後response　readyになっている状態で、responseを読まずに次のコマンドを送ると出る。そこで、データ転送後256文字の文字配列を用意しieeerdを呼ぶことで解決した。以前のバージョンでは出ていなかったがマニュアルにはこの記載があるので、ドライバの修正によりエラーを出すようになったものと思われる。この修正後、新旧両方のドライバで問題なく計測できることを確認した。
◆標準サンプルの計算ルーチンには、あらかじめ登録してあるテーブルの値ではなくそのインデックスを渡すようにした。
◆標準サンプルに項目を追加。U.Kaatze, J.Chem.Eng.Data, vol.34, No.4, 1989, 371-374の実験式を用いて水の標準値を計算できるようにした。これに伴いリソースと計算ルーチンの追加を行った。
◆Browseメニューで、標準サンプルを表示した状態で、FileからSaveを選ぶと、表示されている内容がテキストファイルに保存されるようになった。
◆ConnectionメニューにOperator Info項目を追加した。オペレータの名前とコメントを入力できる。オペレータの名前が空欄のままでは測定できない。ここで入力したコメントは、ファイルを読み込んだときにcomment欄にコピーされる。（TDR_OPINFO構造体）これに伴い、DLOGとDITL214番を定義した。
◆測定終了日時をデータファイルに記録するようにした。（TDR_OPINFO構造体）
◆計算開始時刻も得られるようにした。
◆オペレータの名前、測定終了時刻、計算開始時刻は、リソース中にあり、計算結果のファイルがIgor形式のときはWaveNoteに出力される。
◆オペレータの名前と測定時コメントは、プログラムを終了すると消滅する。プログラムを動かした最初の測定実行時に毎回指定する。
◆Igor形式の出力で、Wave名をBasename＋Numberにしたとき、wavenoteの書き込み先が存在しないwaveになるというバグを修正。
◆パラメータ入力画面のウィンドウサイズの最大値が小さめに設定されていて、resizeすると一部がはみ出すバグを修正。
◆FTのデータ点数が最大データ点数(N_DATAで定義)を越えた場合、エラーメッセージを出す。これは標準サンプルの計算でも同様。OKを選ぶと、打ち切られたところまで計算する。
◆Calculateメニューに標準サンプルの計算を追加。これを選ぶと、結果を表示するウィンドウが開く。
◆スペクトルの虚部のwaveにもwavenoteを書き込むようにした。
◆一括処理を組み込んで以来、処理パラメータを元のデータファイルに書き込めなくなっていたバグを修正した。
◆一括処理をさせるとフリーズするバグを修正。計算のダイアログ表示の前後のグラフポートの保存で、カレントの保存をせず初期化していないGrafPtrをSetしていたことが原因。
◆使用していない変数がかなりいろんな関数にあったので、少し消して整理した。
◆Load Settingsのたびにwaveの番号が元に戻ってしまうのは不便だということで、番号をプレファレンスに保存するかしないか選ぶチェックボックスを追加した。これに伴いEnvironmentダイアログのDITLの番号の変更、ダイアログルーチンのアイテムを扱っている部分の追加を行った。プレファレンスファイルに変更が生じた。
◆筑波大の新しい装置に対応するため、時間領域の波形を4096点まで増やした。
変数を配列で定義しておくとコンパイラが止まってしまうため、ポインタに変更した。関連する部分をすべて配列の要素へのアクセスからポインタによるアクセスに書き換えた。まだ直ってないところもあるかもしれない。
　これより、新しい機種のサポートを行うため、バージョンは1.10とする。

【ver0.90B】
◆古いファイル入出力ルーチンを使っていたfileutils.cpを捨てて、system7以降のファイル入出力ルーチンを使うものに書き換えた。Macは基本的にファイルはブロックリード／ライトなので、一行入出力ルーチンを自作し、またバッファリングも行っている。
◆パラメータ入力用ウィンドウが若干小さかったので、大きくした。
◆CWはプリコンパイルヘッダが使用できる関係で、Macのツールボックス用のヘッダを明示的にincludeする必要がなくなったので、includeの部分を消去した。
◆アップルメニューのAbout TDRで、ウィンドウのドラッグなどができないのにタイトルのついたウィンドウが使用されていたので、これをタイトル無しにした。
◆CodeWarriorのバージョンアップに伴い、CW8でコンパイルした
◆ckactive()中にexit()が残っている。今の所これによると見られるトラブルは無いが、ExitToShell()に書き換えるべきか？
◆54101Tのキャリブレーションとセットアップをするルーチンを、説明書を見て
作成してあったが、全く使わなかった上にキャリブレーションに至っては途中で止まってしまう。そのためメニューから削除し、関数も消去した。
◆TDR_connect.cpの関数のうち、isr(),ec(),showIeeeMsg()はTDR_meas.cpでも
使用していて、TDR_connect.cp中からこれらを呼んでいる関数はどこにも使われて
いないことになっていた。これらの３つの関数をTDR_meas.cpに移し、TDR_connect.cpをプロジェクトから消去した。
◆isr()中で、意味のないステータスバイトのチェックをしていた。マニュアルの記載にそのまま従ったが、別のデジボルの例であった。
その部分を消去し、グローバル変数を介してステータスバイトの値を返すように
書き換えた。
◆関数ec()は何もする必要がないので、空の関数とした。
◆IeeeIO.cp,IeeeIO.hの中でextern "C"にする条件のマクロの__cplusplusの綴りが
__cpulseplusとなっていたのを修正した。
◆IeeeIO.cp,IeeeIO.hの中の宣言を、
extern int	ieeeprtf(char *format,...);		とextern int	ieeescnf(char *format,...);		
に改めた。可変個の変数を取る場合は、ANSI Cでは１つ目の引数の後に","が必要である
が、C++ではあってもなくてもよい。
◆HP54121Tに送るコマンドで、";"と":"が間違っている部分があった。測定は可能だが、オシロにエラーが表示される。これを修正した。
◆東海大フォーマットのデータを読み込んだとき、プリアンブル情報が無いために時間
軸の情報が０になっていた。実際にはデータファイルの最初にサンプリング間隔が入って
いるので、これを正しく利用するようにした。
◆preambleが無い場合、サンプリング間隔を設定するようにメッセージを出していた
が、単にpreambleが無いということのみ表示するようにした。
◆ベースラインとカットオフを決める時のマウスカーソルの形状の変更。

【ver0.80B】
◆Symantec C++ から、CW6でコンパイルできるように_Cdeclされていた部分を修正した。
◆PPCへの移植に伴い、UniversalHeaderを使用するように変更した。
◆IeeeIOの可変個の引数をとる部分の宣言は、apjもこれまでに使ったことがなく、たまたまテストもしていないので動作は保証しない。ただ、通常のデータの送受信はできている。
◆計測のルーチンIeeeIOとTDR_measは、以前はCでコンパイルしていたが、C++のコンパイラを通るように修正し、すべてのソースファイルをC++でコンパイルするようにした。