#pragma warning( disable : 4201)
#define _FILESYSTEMFSCTL_
#include <config.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <winioctl.h>
#include "hopf_PCI_io.h"
#include <stddef.h>
#define ATL_PASSTHROUGH_READ_TOSIZE 3*sizeof(ULONG)
#define ATL_PASSTHROUGH_READ_FROMSIZE 0
#define IOCTL_ATLSOFT_PASSTHROUGH_READ CTL_CODE( \
FILE_DEVICE_UNKNOWN, \
0x805, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
HANDLE hDevice = NULL;
HANDLE hRdEvent;
OVERLAPPED Rdoverlapped;
OVERLAPPED *pRdOverlapped;
ULONG iobuffer[256];
DWORD cbReturned;
BOOL HaveBoard = FALSE;
struct{
ULONG region;
ULONG offset;
ULONG count;
}io_params;
BOOL OpenHopfDevice()
{
OSVERSIONINFO VersionInfo;
ULONG deviceNumber;
CHAR deviceName[255];
VersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&VersionInfo);
switch(VersionInfo.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS: return(FALSE); break;
case VER_PLATFORM_WIN32_NT: deviceNumber=0;
sprintf(deviceName,"\\\\.\\hclk6039%d",deviceNumber+1);
hDevice=CreateFile(
deviceName,
GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_WRITE|FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_OVERLAPPED,
NULL);
break;
default:
hDevice=INVALID_HANDLE_VALUE;
break;
}
if ( hDevice == INVALID_HANDLE_VALUE ) {
return(FALSE); }
hRdEvent=CreateEvent(NULL, TRUE,
FALSE,
NULL);
if ( hRdEvent == INVALID_HANDLE_VALUE )
return(FALSE);
pRdOverlapped=&Rdoverlapped;
pRdOverlapped->hEvent=hRdEvent;
HaveBoard = TRUE;
return TRUE;
}
BOOL CloseHopfDevice(){
CloseHandle(hRdEvent); if (CloseHandle(hDevice)==TRUE) {
return TRUE;
}
return FALSE;
}
void ReadHopfDevice(){
if (HaveBoard){
DeviceIoControl(hDevice, IOCTL_ATLSOFT_PASSTHROUGH_READ, &io_params,ATL_PASSTHROUGH_READ_TOSIZE,
iobuffer,ATL_PASSTHROUGH_READ_FROMSIZE+io_params.count*sizeof(ULONG),&cbReturned, pRdOverlapped);
}
}
void GetHardwareData(LPDWORD Data32,WORD Ofs)
{
io_params.region = 1;
io_params.offset = Ofs;
io_params.count =1;
ReadHopfDevice();
*Data32 = iobuffer[0];
return;
}
void GetHopfTime(LPHOPFTIME Data,DWORD Offset)
{
io_params.region = 1;
io_params.offset = Offset;
io_params.count =4;
ReadHopfDevice();
Data->wHour = 0;
Data->wMinute = 0;
Data->wSecond = 0;
while (iobuffer[0] >= (60 * 60 * 1000)) {
iobuffer[0] = iobuffer[0] - 60*60 *1000;
Data->wHour++;
}
while (iobuffer[0] >= (60 * 1000)) {
iobuffer[0] = iobuffer[0] - 60 *1000;
Data->wMinute++;
}
while (iobuffer[0] >= (1000)) {
iobuffer[0] = iobuffer[0] - 1000;
Data->wSecond++;
}
Data->wMilliseconds = LOWORD(iobuffer[0]);
Data->wDay = HIBYTE(HIWORD(iobuffer[1]));
Data->wMonth = LOBYTE(HIWORD(iobuffer[1]));
Data->wYear = LOWORD(iobuffer[1]);
Data->wDayOfWeek = HIBYTE(HIWORD(iobuffer[2]));
if (Data->wDayOfWeek == 7) Data->wDayOfWeek = 0;
io_params.region = 1;
io_params.offset += 0x08;
io_params.count =1;
ReadHopfDevice();
Data->wStatus = LOBYTE(HIWORD(iobuffer[0]));
return;
}
void GetHopfLocalTime(LPHOPFTIME Data)
{
DWORD Offset = 0;
GetHopfTime(Data,Offset);
return;
}
void GetHopfSystemTime(LPHOPFTIME Data)
{
DWORD Offset = 0x10;
GetHopfTime(Data,Offset);
return;
}
void GetSatData(LPSATSTAT Data)
{
io_params.region = 1;
io_params.offset = 0xb0;
io_params.count =5;
ReadHopfDevice();
Data->wVisible= HIBYTE(HIWORD(iobuffer[0]));
Data->wMode = LOBYTE(LOWORD(iobuffer[0]));
Data->wSat0 = HIBYTE(HIWORD(iobuffer[1]));
Data->wRat0 = LOBYTE(HIWORD(iobuffer[1]));
Data->wSat1 = HIBYTE(LOWORD(iobuffer[1]));
Data->wRat1 = LOBYTE(LOWORD(iobuffer[1]));
Data->wSat2 = HIBYTE(HIWORD(iobuffer[2]));
Data->wRat2 = LOBYTE(HIWORD(iobuffer[2]));
Data->wSat3 = HIBYTE(LOWORD(iobuffer[2]));
Data->wRat3 = LOBYTE(LOWORD(iobuffer[2]));
Data->wSat4 = HIBYTE(HIWORD(iobuffer[3]));
Data->wRat4 = LOBYTE(HIWORD(iobuffer[3]));
Data->wSat5 = HIBYTE(LOWORD(iobuffer[3]));
Data->wRat5 = LOBYTE(LOWORD(iobuffer[3]));
Data->wSat6 = HIBYTE(HIWORD(iobuffer[4]));
Data->wRat6 = LOBYTE(HIWORD(iobuffer[4]));
Data->wSat7 = HIBYTE(LOWORD(iobuffer[4]));
Data->wRat7 = LOBYTE(LOWORD(iobuffer[4]));
return;
}
void GetDiffTime(LPLONG Data)
{
io_params.region = 1;
io_params.offset = 0x0c;
io_params.count =1;
ReadHopfDevice();
*Data = iobuffer[0];
return;
}
void GetPosition(LPGPSPOS Data){
io_params.region = 1;
io_params.offset = 0x90; io_params.count = 1;
ReadHopfDevice();
Data->wLongitude = iobuffer[0]; io_params.region = 1;
io_params.offset = 0xa0; io_params.count = 1;
ReadHopfDevice();
Data->wLatitude = iobuffer[0];
Data->wAltitude = 0;
return;
}
void GetHardwareVersion(LPCLOCKVER Data){
int i;
io_params.region = 1;
io_params.offset = 0x50;
io_params.count =12;
ReadHopfDevice();
strcpy(Data->cVersion,"");
iobuffer[13] =0;
for (i=0; i < 13; i++){
Data->cVersion[i * 4 ] = HIBYTE(HIWORD(iobuffer[i]));
Data->cVersion[i * 4 + 1] = LOBYTE(HIWORD(iobuffer[i]));
Data->cVersion[i * 4 + 2] = HIBYTE(LOWORD(iobuffer[i]));
Data->cVersion[i * 4 + 3] = LOBYTE(LOWORD(iobuffer[i]));
}
}
void GetDCFAntenne(LPDCFANTENNE Data){
io_params.region = 1;
io_params.offset = 0xcc; io_params.count = 1;
ReadHopfDevice();
Data->bStatus1 = HIBYTE(HIWORD(iobuffer[0])); Data->bStatus = LOBYTE(HIWORD(iobuffer[0])); Data->wAntValue = LOWORD(iobuffer[0]);
return;
}