2011年2月25日金曜日

もしもUndoがなかったら・・・

いまはも当たり前のように使っているUndo/Redo機能だけれど、
もしもこの機能がなかったらどうだろう?などと思ってしまった。

テキストエディタで一文字ずつ打ち込んだりDELしたりする程度なら直ぐに打ち直せるけど
(っていうか、結構typoは多い方だと思うので、しょっちゅうやってる?)
範囲を選択してまとめて削除なんて怖くてできなくなるのでしょうかね。
他にもEXCELでもCAD系ソフトでも何でも、大きな範囲を扱うときは
「本当にいいのか~。やっちゃうと元に戻せないよ~。いや、ファイルを保存しなければいいんだ。でもファイル開いてからかなりいろいろ変更したあとだよ。ゲー、アレを全部やり直すのか~。覚えてるかな~。」
なんてことになるんだろうな。そうなると、自衛手段としてこまめに名前を変えながらファイルセーブとかやってたでしょうか?
そう思うと、今更ながらほとんどすべてのソフトで当たり前のように使えているUndo/Redo機能は非常にありがたいものだな。

でもちょっと思い返してみると、その昔8bitのBASICマシンが憧れの的だった頃、ベーマガとか買ってはソースコードひたすら打ち込んでいたけれど、あのときはどうやっていたのだろうか、もう思い出せない。
Undo/Redoなんて高度な機能はあるはずもなく、Cut&Pasteすらあったかどうか記憶にないな。間違えてもUndoはできないから、BSやカーソルキーをひたすら連打して間違い部分を直していたのだろう。それでも楽しくやっていたものだったな。
というか当時のマシンは記録媒体と言えばテープだったので、今のような気軽に「保存」なんてできない。マシン語の打ち込みしても保存し忘れて実行してしまったらあっけなく暴走、何時間もかけて打ち込んだコードが全部パァ、なんてことも日常茶飯事だったから、画面上でのちょっとした打ち間違えを直すくらいは屁とも思っていなかったのだろう。

そういう意味では良い時代になったものだな・・・(歳がバレるな・・・)

2011年2月22日火曜日

WinUSBを使ったSET_INTERFACEリクエスト

WinUSBを使って、SET_INTERFACEリクエストを発行する方法を調べてみた。

--(ここから)--

// デバイスインターフェース名を使ってUSBデバイスを開く。
HANDLE hFile = CreateFile();


// WinUSBハンドルで開く
WINUSB_INTERFACE_HANDLE hWinUSB;
WinUsb_Initialize(hFile, hWinUSB);

// 特定のインターフェースを指すWinUSBハンドルを得る
WINUSB_INTERFACE_HANDLE hInterface;
WinUsb_GetAssociatedInterface(hWinUSB, インターフェース番号, &hInterface);


// SET_INTERFACEを実行する
WinUsb_SetCurrentAlternateSetting(hInterface, alternate番号);

--(ここまで)--

エラー処理や後始末はすべて省いた。
最後のWinUsb_SetCurrentAlternateSetting()呼び出しで、実際にUSBバス上でSET_INTERFACEリクエストのトランザクションが発生するとは限らない。SET_CONFIGURATIONリクエストを実行した段階で、すべてのインターフェースは最初のオルタネートが選択された状態になっているので、現在と同じオルタネート番号を指定しようとしても実際にはトランザクションは発生せず、関数はTRUEを返すだけのようだ。

ちなみに、WinUsb_ControlTransfer()関数を使って同じようにSET_INTERFACEリクエストを実行してみようとしたが、何故かwIndexに指定したインターフェース番号の下位8ビットが00hに変更されて送信されるのでインターフェース=0以外にはSET_INTERFACEリクエストを送れなかった。