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_


				
				

			

Leave a Reply