source: tools/vchvtest/HV.cc@ 200

Last change on this file since 200 was 200, checked in by ogrimm, 14 years ago
Added vchvtest to repository
  • Property svn:executable set to *
File size: 5.4 KB
Line 
1
2/********************************************************************\
3
4 Name: HV.cc
5
6 Created by: Sebastian Commichau, November 2008
7 commichau@phys.ethz.ch
8
9 Contents: Main class for HV supply
10
11\********************************************************************/
12
13#include "HV.h"
14
15extern bool Verbose;
16
17//
18// Constructor
19//
20HVBoard::HVBoard(int DeviceNumber, char *DeviceName) {
21
22 char Buffer[MAX_COM_SIZE];
23 struct termios tio;
24
25 fTimeOut = 1;
26 BoardNumber = DeviceNumber;
27 BoardName = DeviceName;
28 LastWrapCount = -1;
29
30 // Open device
31 snprintf(Buffer, MAX_COM_SIZE, "/dev/%s",DeviceName);
32 if ((fDescriptor = open(Buffer, O_RDWR|O_NOCTTY|O_NDELAY)) == -1) {
33 printf("Error: Could not open device #%d: %s (%d/%s)\n", DeviceNumber, DeviceName, errno, strerror(errno));
34 return;
35 }
36
37 // Get current serial port settings
38 if (tcgetattr(fDescriptor, &tio) == -1) {
39 printf("Error: tcgetattr() failed on device #%d: %s (%d/%s)\n", DeviceNumber, DeviceName, errno, strerror(errno));
40 return;
41 }
42
43 // Set baudrate and raw mode
44 if (cfsetspeed(&tio, BAUDRATE) == -1) printf("Error: Could not set baud rate of device #%d: %s (%d/%s)\n", DeviceNumber, DeviceName, errno, strerror(errno));
45 cfmakeraw(&tio);
46 if (tcsetattr(fDescriptor, TCSANOW, &tio ) == -1) printf("Error: tcsetattr() failed on device #%d: %s (%d/%s)\n", DeviceNumber, DeviceName, errno, strerror(errno));
47
48 return;
49}
50
51//
52// Destructor
53//
54HVBoard::~HVBoard() {
55
56 if(fDescriptor != -1) close(fDescriptor);
57}
58
59
60// Communicate: Write and read from HV Board until fTimeOut has been reached
61//
62// Returns: 0 error, 1 success, -1 fTimeOut exceeded
63int HVBoard::Communicate(unsigned char* wbuf, int Bytes) {
64
65 unsigned char rbuf[RBUF_LEN];
66 int ret;
67 fd_set SelectDescriptor;
68
69 Status.BoardNumber = -1;
70
71 // === Write data ===
72 ret = write(fDescriptor, wbuf, Bytes);
73 if (ret == -1) {
74 printf("Error: Could not write data (%d/%s)\n", errno, strerror(errno));
75 return 0;
76 }
77 else if (ret < Bytes) {
78 printf("Error: Could write only %d of %d bytes\n", ret, Bytes);
79 return 0;
80 }
81 if (Verbose) {
82 printf(" %d byte(s) written: ", Bytes);
83 for (int i=0; i<Bytes; i++) printf(" %#.2x", wbuf[i]);
84 printf("\n");
85 }
86
87 // === Try to read until time-out ===
88 FD_ZERO(&SelectDescriptor); FD_SET(fDescriptor, &SelectDescriptor);
89 struct timeval WaitTime = {(long) fTimeOut, (long) ((fTimeOut-(long) fTimeOut)*1e6)};
90 if (select(fDescriptor+1, &SelectDescriptor, NULL, NULL, &WaitTime)==-1) {
91 printf("Error with select() (%d/%s)\n", errno,strerror(errno));
92 return 0;
93 }
94
95 // Time-out expired?
96 if (!FD_ISSET(fDescriptor, &SelectDescriptor)) {
97 printf("Time-out of %.2f seconds expired while reading\n", fTimeOut);
98 return -1;
99 }
100
101 // Read error?
102 if ((ret = read(fDescriptor, rbuf, RBUF_LEN)) == -1) {
103 printf("Read error (%d/%s)\n", errno, strerror(errno));
104 return 0;
105 }
106 // Check wrap counter
107 if (LastWrapCount != -1) {
108 if ((LastWrapCount+1)%8 != (rbuf[0] & 0x70)>>4) {
109 printf("Warning: Wrap counter mismatch.\n");
110 }
111 }
112 LastWrapCount = (rbuf[0] & 0x70)>>4;
113
114 // Print result in hexadecimal and binary representation
115 if (Verbose) {
116 printf(" %d byte(s) read: ", ret);
117 for (int i=0; i<ret; i++) printf(" %#.2x ", rbuf[i]);
118 printf(" ");
119 for (int i=0; i<ret; i++) {
120 for (int j=7; j>=0; j--) {
121 printf("%c", (rbuf[i] & 1<<j)!=0 ? '1' : '0');
122 if (j == 4) printf(" ");
123 }
124 printf(" ");
125 }
126 printf("\n");
127 }
128
129 // Decode result if three bytes were returned
130 if (ret == 3) {
131 Status.BoardNumber = rbuf[2] & 0xf;
132 Status.Current = rbuf[1] + (rbuf[0]&15)*256;
133 Status.Overcurrent = rbuf[0] & 128;
134 Status.WrapCounter = (rbuf[0]>>4) & 7;
135 Status.Reset = rbuf[2] & 128;
136 Status.Acknowledge = !((rbuf[2] & 0x70) == 0x70);
137
138 if (Verbose) {
139 printf(" *** Board %d *** Current: %d\n"
140 "Overcurrent bit: %s Wrap counter: %d Reset bit: %s Status: %s\n",
141 Status.BoardNumber, Status.Current, Status.Overcurrent ? "set":"clear",
142 Status.WrapCounter, Status.Reset==false ? "clear": "set",
143 Status.Acknowledge ? "OK" : "No response");
144 }
145 }
146
147// if (ret == 3) {
148// printf(" *** Board %d *** Current: %d\n"
149// "Overcurrent bit: %s Wrap counter: %d Reset bit: %s Status: %s\n",
150// rbuf[2]&0xf, rbuf[1]+(rbuf[0]&15)*256,
151// rbuf[0]&128 ? "set":"clear", (rbuf[0]>>4)&7,
152// (rbuf[2]&128)==0 ? "clear": "set",
153// (rbuf[2]&0x70)==0x70 ? "No response": "OK");
154// }
155
156 return 1;
157}
158
159
160// System reset of HV board
161int HVBoard::SystemReset() {
162
163 unsigned char wbuf[] = {0,0,0};
164 return Communicate(wbuf, 3);
165}
166
167
168// Read channel status
169int HVBoard::ReadChannel(int Chain, int Channel) {
170
171 unsigned char wbuf[] = {1<<5 | Chain<<1 | (Channel&16)>>4, Channel<<4, 0};
172 return Communicate(wbuf, 3);
173}
174
175
176// Global set
177int HVBoard::GlobalSet(int Voltage) {
178
179 unsigned char wbuf[] = {1<<6 , Voltage>>8, Voltage};
180 return Communicate(wbuf, 3);
181}
182
183
184// Channel set
185int HVBoard::ChannelSet(int Chain, int Channel, int Voltage) {
186
187 unsigned char wbuf[] = {3<<5 | Chain<<1 | (Channel&16)>>4, Channel<<4 | Voltage>>8, Voltage};
188 return Communicate(wbuf, 3);
189}
190
191
192// Synchronize board
193bool HVBoard::SynchBoard() {
194
195 unsigned char wbuf = 0;
196 int trial = 0, ret;
197
198 while(++trial<=3) {
199 if((ret = Communicate(&wbuf, 1)) == 1) return true;
200 if (ret==0) break;
201 }
202 return false;
203}
Note: See TracBrowser for help on using the repository browser.