3 * Read data from a hopf PCI clock using the ATLSoft WinNT driver.
5 * Date: 21.03.2000 Revision: 01.10
7 * Copyright (C) 1999, 2000 by Bernd Altmeier altmeier@ATLSoft.de
12 * Ignore nonstandard extension warning.
13 * This happens when including winioctl.h
15 #pragma warning( disable : 4201)
16 #define _FILESYSTEMFSCTL_
23 #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( \
30 FILE_DEVICE_UNKNOWN, \
36 HANDLE hDevice = NULL; // this is the handle to the PCI Device
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;
101 HaveBoard = TRUE; // board installed and we have access
104 } // end of OpenHopfDevice()
107 BOOL CloseHopfDevice(){
109 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"
116 } // 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);
130 void GetHardwareData(LPDWORD Data32,WORD Ofs)
132 io_params.region = 1;
133 io_params.offset = Ofs;
136 *Data32 = iobuffer[0];
141 void GetHopfTime(LPHOPFTIME Data,DWORD Offset)
143 io_params.region = 1;
144 io_params.offset = Offset;
152 while (iobuffer[0] >= (60 * 60 * 1000)) {
153 iobuffer[0] = iobuffer[0] - 60*60 *1000;
156 while (iobuffer[0] >= (60 * 1000)) {
157 iobuffer[0] = iobuffer[0] - 60 *1000;
160 while (iobuffer[0] >= (1000)) {
161 iobuffer[0] = iobuffer[0] - 1000;
164 Data->wMilliseconds = LOWORD(iobuffer[0]);
165 Data->wDay = HIBYTE(HIWORD(iobuffer[1]));
166 Data->wMonth = LOBYTE(HIWORD(iobuffer[1]));
167 Data->wYear = LOWORD(iobuffer[1]);
168 Data->wDayOfWeek = HIBYTE(HIWORD(iobuffer[2]));
169 if (Data->wDayOfWeek == 7) // Dow Korrektur
170 Data->wDayOfWeek = 0;
172 io_params.region = 1;
173 io_params.offset += 0x08;
178 Data->wStatus = LOBYTE(HIWORD(iobuffer[0]));
183 void GetHopfLocalTime(LPHOPFTIME Data)
186 GetHopfTime(Data,Offset);
191 void GetHopfSystemTime(LPHOPFTIME Data)
194 GetHopfTime(Data,Offset);
199 void GetSatData(LPSATSTAT Data)
201 io_params.region = 1;
202 io_params.offset = 0xb0;
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]));
229 void GetDiffTime(LPLONG Data)
231 io_params.region = 1;
232 io_params.offset = 0x0c;
241 void GetPosition(LPGPSPOS Data){
242 io_params.region = 1;
243 io_params.offset = 0x90; // Positionsdaten Länge
248 Data->wLongitude = iobuffer[0]; //in Millisekunden
249 io_params.region = 1;
250 io_params.offset = 0xa0; // Positionsdaten Breite
255 Data->wLatitude = iobuffer[0];
260 void GetHardwareVersion(LPCLOCKVER Data){
262 io_params.region = 1;
263 io_params.offset = 0x50;
268 strcpy(Data->cVersion,"");
270 for (i=0; i < 13; i++){
271 Data->cVersion[i * 4 ] = HIBYTE(HIWORD(iobuffer[i]));
272 Data->cVersion[i * 4 + 1] = LOBYTE(HIWORD(iobuffer[i]));
273 Data->cVersion[i * 4 + 2] = HIBYTE(LOWORD(iobuffer[i]));
274 Data->cVersion[i * 4 + 3] = LOBYTE(LOWORD(iobuffer[i]));
278 void GetDCFAntenne(LPDCFANTENNE Data){
279 io_params.region = 1;
280 io_params.offset = 0xcc; //
284 Data->bStatus1 = HIBYTE(HIWORD(iobuffer[0])); //
285 Data->bStatus = LOBYTE(HIWORD(iobuffer[0])); //
286 Data->wAntValue = LOWORD(iobuffer[0]);