12
12
* Ignore nonstandard extension warning.
13
13
* This happens when including winioctl.h
15
#pragma warning( disable : 4201)
15
#pragma warning(disable: 4201)
16
16
#define _FILESYSTEMFSCTL_
18
18
#include <config.h>
19
19
#include <windows.h>
21
21
#include <stdlib.h>
22
23
#include <winioctl.h>
23
24
#include "hopf_PCI_io.h"
27
#define ATL_PASSTHROUGH_READ_TOSIZE 3*sizeof(ULONG)
28
#define ATL_PASSTHROUGH_READ_FROMSIZE 0
29
#define IOCTL_ATLSOFT_PASSTHROUGH_READ CTL_CODE( \
27
#define ATL_PASSTHROUGH_READ_TOSIZE (3 * sizeof(ULONG))
28
#define ATL_PASSTHROUGH_READ_FROMSIZE 0
29
#define IOCTL_ATLSOFT_PASSTHROUGH_READ CTL_CODE( \
30
30
FILE_DEVICE_UNKNOWN, \
36
36
HANDLE hDevice = NULL; // this is the handle to the PCI Device
39
OVERLAPPED Rdoverlapped;
40
OVERLAPPED *pRdOverlapped;
44
BOOL HaveBoard = FALSE;
39
OVERLAPPED Rdoverlapped;
40
OVERLAPPED * pRdOverlapped;
44
BOOL HaveBoard = FALSE;
54
OSVERSIONINFO VersionInfo;
58
VersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
59
GetVersionEx(&VersionInfo);
60
switch(VersionInfo.dwPlatformId)
62
case VER_PLATFORM_WIN32_WINDOWS: // Win95/98
63
return(FALSE); // "NTP does not support Win 95-98."
66
case VER_PLATFORM_WIN32_NT: // WinNT
68
sprintf(deviceName,"\\\\.\\hclk6039%d",deviceNumber+1);
71
GENERIC_WRITE|GENERIC_READ,
72
FILE_SHARE_WRITE|FILE_SHARE_READ,
75
FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_OVERLAPPED,
80
hDevice=INVALID_HANDLE_VALUE;
85
if ( hDevice == INVALID_HANDLE_VALUE ) // the system didn't return a handle
87
return(FALSE); //"A handle to the driver could not be obtained properly"
90
hRdEvent=CreateEvent(NULL, // an event to be used for async transfers
95
if ( hRdEvent == INVALID_HANDLE_VALUE )
96
return(FALSE); // the system didn't return a handle
98
pRdOverlapped=&Rdoverlapped;
99
pRdOverlapped->hEvent=hRdEvent;
56
OSVERSIONINFO VersionInfo;
60
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
61
GetVersionEx(&VersionInfo);
62
switch (VersionInfo.dwPlatformId) {
64
case VER_PLATFORM_WIN32_WINDOWS: // Win95/98
65
return FALSE; // "NTP does not support Win 95-98."
68
case VER_PLATFORM_WIN32_NT: // WinNT
70
snprintf(deviceName, sizeof(deviceName),
71
"\\\\.\\hclk6039%d", deviceNumber + 1);
74
GENERIC_WRITE | GENERIC_READ,
75
FILE_SHARE_WRITE | FILE_SHARE_READ,
78
FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_OVERLAPPED,
83
hDevice = INVALID_HANDLE_VALUE;
87
if (INVALID_HANDLE_VALUE == hDevice) // the system didn't return a handle
88
return FALSE; //"A handle to the driver could not be obtained properly"
90
// an event to be used for async transfers
91
hRdEvent = CreateEvent(
97
if (INVALID_HANDLE_VALUE == hRdEvent)
98
return FALSE; // the system didn't return a handle
100
pRdOverlapped = &Rdoverlapped;
101
pRdOverlapped->hEvent = hRdEvent;
101
103
HaveBoard = TRUE; // board installed and we have access
104
106
} // end of OpenHopfDevice()
107
BOOL CloseHopfDevice(){
110
CloseHopfDevice(void)
109
112
CloseHandle(hRdEvent);// When done, close the handle to the driver
110
if (CloseHandle(hDevice)==TRUE) // unlink the driver using a CloseHandle call
114
return FALSE; // "The driver handle could not be unlinked properly"
114
return CloseHandle(hDevice);
116
115
} // end of CloseHopfDevice()
119
void ReadHopfDevice(){
122
DeviceIoControl(hDevice, IOCTL_ATLSOFT_PASSTHROUGH_READ, &io_params,ATL_PASSTHROUGH_READ_TOSIZE,
123
iobuffer,ATL_PASSTHROUGH_READ_FROMSIZE+io_params.count*sizeof(ULONG),&cbReturned, pRdOverlapped);
126
IOCTL_ATLSOFT_PASSTHROUGH_READ,
128
ATL_PASSTHROUGH_READ_TOSIZE,
130
ATL_PASSTHROUGH_READ_FROMSIZE
131
+ io_params.count * sizeof(ULONG),
130
void GetHardwareData(LPDWORD Data32,WORD Ofs)
132
144
io_params.region = 1;
133
145
io_params.offset = Ofs;
135
147
ReadHopfDevice();
136
148
*Data32 = iobuffer[0];
141
void GetHopfTime(LPHOPFTIME Data,DWORD Offset)
143
158
io_params.region = 1;
144
159
io_params.offset = Offset;
147
162
ReadHopfDevice();
150
165
Data->wMinute = 0;
151
166
Data->wSecond = 0;
152
while (iobuffer[0] >= (60 * 60 * 1000)) {
153
iobuffer[0] = iobuffer[0] - 60*60 *1000;
167
while (iobuffer[0] >= 60 * 60 * 1000) {
168
iobuffer[0] = iobuffer[0] - 60 * 60 * 1000;
156
while (iobuffer[0] >= (60 * 1000)) {
157
iobuffer[0] = iobuffer[0] - 60 *1000;
171
while (iobuffer[0] >= 60 * 1000) {
172
iobuffer[0] = iobuffer[0] - 60 * 1000;
160
while (iobuffer[0] >= (1000)) {
175
while (iobuffer[0] >= 1000) {
161
176
iobuffer[0] = iobuffer[0] - 1000;
164
179
Data->wMilliseconds = LOWORD(iobuffer[0]);
165
180
Data->wDay = HIBYTE(HIWORD(iobuffer[1]));
166
181
Data->wMonth = LOBYTE(HIWORD(iobuffer[1]));
172
187
io_params.region = 1;
173
188
io_params.offset += 0x08;
176
191
ReadHopfDevice();
178
193
Data->wStatus = LOBYTE(HIWORD(iobuffer[0]));
183
void GetHopfLocalTime(LPHOPFTIME Data)
185
202
DWORD Offset = 0;
186
GetHopfTime(Data,Offset);
204
GetHopfTime(Data, Offset);
191
void GetHopfSystemTime(LPHOPFTIME Data)
193
213
DWORD Offset = 0x10;
194
GetHopfTime(Data,Offset);
215
GetHopfTime(Data,Offset);
199
void GetSatData(LPSATSTAT Data)
201
224
io_params.region = 1;
202
225
io_params.offset = 0xb0;
205
228
ReadHopfDevice();
207
Data->wVisible= HIBYTE(HIWORD(iobuffer[0]));
208
Data->wMode = LOBYTE(LOWORD(iobuffer[0]));
209
Data->wSat0 = HIBYTE(HIWORD(iobuffer[1]));
210
Data->wRat0 = LOBYTE(HIWORD(iobuffer[1]));
211
Data->wSat1 = HIBYTE(LOWORD(iobuffer[1]));
212
Data->wRat1 = LOBYTE(LOWORD(iobuffer[1]));
213
Data->wSat2 = HIBYTE(HIWORD(iobuffer[2]));
214
Data->wRat2 = LOBYTE(HIWORD(iobuffer[2]));
215
Data->wSat3 = HIBYTE(LOWORD(iobuffer[2]));
216
Data->wRat3 = LOBYTE(LOWORD(iobuffer[2]));
217
Data->wSat4 = HIBYTE(HIWORD(iobuffer[3]));
218
Data->wRat4 = LOBYTE(HIWORD(iobuffer[3]));
219
Data->wSat5 = HIBYTE(LOWORD(iobuffer[3]));
220
Data->wRat5 = LOBYTE(LOWORD(iobuffer[3]));
221
Data->wSat6 = HIBYTE(HIWORD(iobuffer[4]));
222
Data->wRat6 = LOBYTE(HIWORD(iobuffer[4]));
223
Data->wSat7 = HIBYTE(LOWORD(iobuffer[4]));
224
Data->wRat7 = LOBYTE(LOWORD(iobuffer[4]));
230
Data->wVisible = HIBYTE(HIWORD(iobuffer[0]));
231
Data->wMode = LOBYTE(LOWORD(iobuffer[0]));
232
Data->wSat0 = HIBYTE(HIWORD(iobuffer[1]));
233
Data->wRat0 = LOBYTE(HIWORD(iobuffer[1]));
234
Data->wSat1 = HIBYTE(LOWORD(iobuffer[1]));
235
Data->wRat1 = LOBYTE(LOWORD(iobuffer[1]));
236
Data->wSat2 = HIBYTE(HIWORD(iobuffer[2]));
237
Data->wRat2 = LOBYTE(HIWORD(iobuffer[2]));
238
Data->wSat3 = HIBYTE(LOWORD(iobuffer[2]));
239
Data->wRat3 = LOBYTE(LOWORD(iobuffer[2]));
240
Data->wSat4 = HIBYTE(HIWORD(iobuffer[3]));
241
Data->wRat4 = LOBYTE(HIWORD(iobuffer[3]));
242
Data->wSat5 = HIBYTE(LOWORD(iobuffer[3]));
243
Data->wRat5 = LOBYTE(LOWORD(iobuffer[3]));
244
Data->wSat6 = HIBYTE(HIWORD(iobuffer[4]));
245
Data->wRat6 = LOBYTE(HIWORD(iobuffer[4]));
246
Data->wSat7 = HIBYTE(LOWORD(iobuffer[4]));
247
Data->wRat7 = LOBYTE(LOWORD(iobuffer[4]));
229
void GetDiffTime(LPLONG Data)
231
256
io_params.region = 1;
232
257
io_params.offset = 0x0c;
235
260
ReadHopfDevice();
241
void GetPosition(LPGPSPOS Data){
242
271
io_params.region = 1;
243
272
io_params.offset = 0x90; // Positionsdaten L�nge
244
273
io_params.count = 1;
246
275
ReadHopfDevice();
248
Data->wLongitude = iobuffer[0]; //in Millisekunden
277
Data->wLongitude = iobuffer[0]; //in Millisekunden
249
278
io_params.region = 1;
250
279
io_params.offset = 0xa0; // Positionsdaten Breite
251
280
io_params.count = 1;
255
284
Data->wLatitude = iobuffer[0];
256
285
Data->wAltitude = 0;
260
void GetHardwareVersion(LPCLOCKVER Data){
262
296
io_params.region = 1;
263
297
io_params.offset = 0x50;
298
io_params.count = 12;
266
300
ReadHopfDevice();
268
strcpy(Data->cVersion,"");
270
for (i=0; i < 13; i++){
302
Data->cVersion[0] = '\0';
304
for (i = 0; i < 13; i++) {
271
305
Data->cVersion[i * 4 ] = HIBYTE(HIWORD(iobuffer[i]));
272
306
Data->cVersion[i * 4 + 1] = LOBYTE(HIWORD(iobuffer[i]));
273
307
Data->cVersion[i * 4 + 2] = HIBYTE(LOWORD(iobuffer[i]));
278
void GetDCFAntenne(LPDCFANTENNE Data){
279
318
io_params.region = 1;
280
io_params.offset = 0xcc; //
319
io_params.offset = 0xcc;
281
320
io_params.count = 1;
283
322
ReadHopfDevice();
284
Data->bStatus1 = HIBYTE(HIWORD(iobuffer[0])); //
285
Data->bStatus = LOBYTE(HIWORD(iobuffer[0])); //
286
Data->wAntValue = LOWORD(iobuffer[0]);
323
Data->bStatus1 = HIBYTE(HIWORD(iobuffer[0]));
324
Data->bStatus = LOBYTE(HIWORD(iobuffer[0]));
325
Data->wAntValue = LOWORD(iobuffer[0]);