inpout32.dllをVCで使うためのヘッダファイル
USB版コマコンをつくって検証とかしてみたところ、求める精度(60F/sの完全制御)には到達できないと判断したのでUSBは捨てて、原点に立ち返ってパラレルポートを使って制御することに。USB版も安定して1F単位で動いてると見えてたんですが、数百フレームぶっ続けで実行させてるとふらつきが出まくるのでここはやっぱり同期信号をトリガにして作るのが結局正解だろうということで、ね。
まず、同期信号が入力されたのを検出するためにとりあえずinpout32で入力ポートのデータをチェックできるアプリを作成っと。
というわけで、inpout32.dllをVC++2005 ExpressEditionで使うときに突貫で書いたヘッダファイルの中身を公開。
まあ、ぶっちゃけ内容はCPANのDevice::ParallelPortをぱくって参考に機能をマネッコしたというのはバレバレですかね。
一応、namespaceとか使ってみましたがこういう使い方でいいんだろうか…と不安になる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | /* inpout32 library header */ #ifndef _INPOUT_ #define _INPOUT_ // inpout32.dll // function short _stdcall Inp32(short PortAddress); void _stdcall Out32(short PortAddress, short data); // namespace inpout namespace inpout { // ParallelPort I/O Class class ParallelPort { public: short DataAddress; short StatusAddress; short ControlAddress; ParallelPort(void); ParallelPort(short); int GetByte(int); int GetBit(int); int GetData(); int GetStatus(); int GetControl(); void SetData(unsigned char); void SetControl(unsigned char); void SetStatus(unsigned char); void SetBit(int,int); int BitFromByte(int,int); }; // constructor ParallelPort::ParallelPort(){ // DEFAULT DataAddress = 0x378; StatusAddress = 0x379; ControlAddress = 0x37a; } // OVERRIDE CONSTRUCTOR ANY ADDRESS ParallelPort::ParallelPort(short NewAddress){ DataAddress = NewAddress; StatusAddress = NewAddress+1; ControlAddress = NewAddress+2; } int ParallelPort::BitFromByte(int Byte,int Bit){ if( Byte & (1 < < Bit)){ return 1; }else{ return 0; } } // inpout::ParallelPort I/O Functions // Get... methods // 入力系関数 // GetBit(int BitNumber), GetByte(int ByteNumber) // GetData(void), GetStatus(void), GetControl(void) int ParallelPort::GetByte(int ByteNumber){ // avaliable value is only {0,1,2} if( ByteNumber > 3 || ByteNumber < 0 ){ ByteNumber = 0; } return Inp32(ParallelPort::DataAddress + ByteNumber); } int ParallelPort::GetBit(int BitNumber) { int Byte = Inp32(ParallelPort::DataAddress + int(BitNumber/8)); return BitFromByte(Byte, BitNumber % 8); } // DATA REGISTER int ParallelPort::GetData() { return Inp32(ParallelPort::DataAddress); } // STATUS REGISTER int ParallelPort::GetStatus() { return Inp32(ParallelPort::StatusAddress); } // CONTROL REGISTER int ParallelPort::GetControl() { return Inp32(ParallelPort::ControlAddress); } // Set*() method // 出力系関数 // SetData(uc Data), SetStatus(uc Status), SetControl(uc Control) void ParallelPort::SetData(unsigned char Data) { Out32(ParallelPort::DataAddress, Data); } void ParallelPort::SetStatus(unsigned char Status) { Out32(ParallelPort::StatusAddress, Status); } void ParallelPort::SetControl(unsigned char Control) { Out32(ParallelPort::ControlAddress, Control); } // SetBit(int BitNumber), void ParallelPort::SetBit(int BitNumber, int Val) { // BitNumber's value between 0 to 23, then execute int Byte; // buffer Current data int Bit; // レジスタの現在値 Byte = ParallelPort::GetByte( int(BitNumber/8) ); Bit = BitNumber - int(BitNumber/8)* 8; if(Val == 1){ // Bit:ON -> OR 1 Out32(ParallelPort::DataAddress + int(BitNumber/8), Byte | (1 < < Bit) ) ; }else{// Bit:OFF -> AND 0 // AND (任意の1ビットをONにして反転) Out32(ParallelPort::DataAddress + int(BitNumber/8), Byte & ( ~ (1 < < Bit ) ) ); } } }; #endif _INPOUT_ |