summaryrefslogtreecommitdiff
path: root/quellcode/versuch4/cpx.cpp
blob: eebdc6586b87af71a5bf241ddf3f8a031d02dec6 (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
/**
 *
 * \file    cpx.cpp
 * \brief   read and write DIO
 *
 * \author  Manuel Traut
 * \version 2006-10-06
 *
 */

#include "cpx.h"

CPX::CPX(){
  init();
  std::cout<<"\n\n init ok\n\n";
}

int CPX::init(){

  int fd_out = open(CPX_Input, O_RDWR | O_SYNC);
  if (fd_out == -1){
      std::cout<<"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 *) &param) == -1) {
  std::cout<<"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::cout<<"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;
}

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::cout<<"portNo: "<<port<<" incorrect\n";
  }

  return (short) value;
}

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::cout<<"portNo: "<<port<<" incorrect\n";
  }
}