blob: 3424d72c5b1b96a44dd2fd9d8a3f4723607b914d (
plain)
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
|
/**
*
* \file cpx.cpp
* \brief read and write DIO
*
* \author Manuel Traut
* \version 2006-10-06
*
*/
#include "cpx.h"
// Constructor: calls init
CPX::CPX(){
init();
std::cout<<"\n\n init ok\n\n";
}
// init: Memory Mapping, Setup Signal
int CPX::init(){
int fd_out = open(CPX_Input, O_RDWR | O_SYNC);
if (fd_out == -1){
std::cerr<<"PBCIO: open failed"<<std::endl;
return(-1);
}
std::cout<<"CPX_Output_1 opened\n";
// setup signal on interrupt
param.signal = 1001;
param.pid = getpid();
if (ioctl(fd_out, CPX_DIO_IOCTL_ADD_SIG, (void *) ¶m) == -1) {
std::cerr<<"signal map failed\n";
close(fd_out);
return(-1);
} else std::cout<<"signal map ok\n";
mapped_out = (u_char*) mmap (NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd_out, 0);
if (mapped_out == MAP_FAILED) {
std::cerr<<"PBCIO: mmap failed\n";
close (fd_out);
return(-2);
}
std::cout<<"mmap ok\n";
DOUT = (u_char *) mapped_out;
DIN = (u_char *) mapped_out;
return 0;
}
// returns value of specified port
short CPX::get(short port){
unsigned char value = 0;
switch(port){
case 1:
value = DIN[PORT1_IN];
break;
case 2:
value = DIN[PORT1_IN];
break;
case 3:
value = DIN[PORT1_IN];
break;
default:
std::cerr<<"portNo: "<<port<<" incorrect\n";
value = 0;
}
return (short) value;
}
// write value to specified port
void CPX::set(short port, short value){
switch(port){
case 1:
DOUT[PORT1_OUT] = value;
break;
case 2:
DOUT[PORT2_OUT] = value;
break;
case 3:
DOUT[PORT3_OUT] = value;
break;
default:
std::cerr<<"portNo: "<<port<<" incorrect\n";
}
}
|