64-bitars windows, parallelportar och Virtual Reality

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
engywook
Inlägg: 30
Blev medlem: 5 maj 2009, 17:45:40

64-bitars windows, parallelportar och Virtual Reality

Inlägg av engywook »

Hej,

Jag har fått i uppdrag att hjälpa några forskare att sätta upp ett Virtual Reality labb. Kruxet är att de har utrustning som tar emot triggers på en parallellports data pins. Detta för att korrelera vid vilken del av experimentet utrustningen ger utslag. De har några experiment de vill "översätta" till VR.

Det jag vill göra är att skicka triggers med ett program skrivet i Visual C++ på 64 bitars Windows 7 eller 10. Jag har främst programmerat på Linux förut och har dålig koll på hur Windows funkar på låg nivå. Jag har undersökt lite och det verkar som att efter Windows NT la man till lite säkerhetsfunktioner som gör att vanliga program inte direkt kan skriva till I/O portar. Då behöver man en speciell drivrutein.

Det verkar vara speciellt jobbigt på 64-bitars fronten då någon "PortTalk" drivrutein inte finns. Moderna datorer har sällan parallellportar på moderkortet, vilket även är sant för mitt fall. De har ett PCI-Express kort istället. Detta verkar göra saker ännu värre. Jag hittade en annan drivrutein/dll, inpout32, men enligt chrome och firefox har deras sida logix4u.net malware. Jag har lite svårt att för att ladda hem saker på randomsidor på internet, speciellt när det inte är mina datorer och där det kan finnas känslig information.

Är det någon som har tips för hur jag bäst löser det här? Jag har tänkt på att skriva en egen drivrutein men det skulle nog ta lång tid då jag inte är van vid windows. Dokumentationen på msdn.microsoft.com om IOCTL är i mina otränade windowsögon ganska dålig.

Den utrustning jag försöker skicka triggers till är en Biopac STP100C https://www.biopac.com/product/isolated ... nterfaces/

Tack på förhand!
Daniel
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: 64-bitars windows, parallelportar och Virtual Reality

Inlägg av Lennart Aspenryd »

Häng inte upp dig på parallellporten! Det verkar ju som enheten tar emot 8 bitar, men inte som ett kommando.
Då kan du mata porten på annat sätt, via en Arduino kanske! Eller?
engywook
Inlägg: 30
Blev medlem: 5 maj 2009, 17:45:40

Re: 64-bitars windows, parallelportar och Virtual Reality

Inlägg av engywook »

Nä, kanske inte. Men det bör vara så låg latens som möjligt då det är typ EEG som ska mätas. Jag kanske borde utveckla lite. Unreal Engine står för VR delen och jag vill skicka de här trigger signalerna därifrån. Unreal Engine använder Visual C++.
Användarvisningsbild
tecno
Inlägg: 27037
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: 64-bitars windows, parallelportar och Virtual Reality

Inlägg av tecno »

Du får allt kliva ner på 32bitars OS om du ska köra Pport.
engywook
Inlägg: 30
Blev medlem: 5 maj 2009, 17:45:40

Re: 64-bitars windows, parallelportar och Virtual Reality

Inlägg av engywook »

UE4 stöder inte 32-bitars OS. Unity kanske gör det.
hh
Inlägg: 322
Blev medlem: 9 maj 2006, 12:37:32
Ort: Karis, Finland

Re: 64-bitars windows, parallelportar och Virtual Reality

Inlägg av hh »

Jag har ett gammalt projekt som använt logix4u:s inpout32 på XP i snart ett decennium utan problem. Nu börjar det vara akut att uppdatrera så jag tänkte försöka med motsvarande från http://www.highrez.co.uk/downloads/inpout32/ . Få se hur det går.
engywook
Inlägg: 30
Blev medlem: 5 maj 2009, 17:45:40

Re: 64-bitars windows, parallelportar och Virtual Reality

Inlägg av engywook »

Jepp, highrez.co.uk löste biffen för mig.

Header.h

Kod: Markera allt

#pragma once

#include "windows.h"
#include "inpout32.h"

static USHORT parallelPort = 0x0000;
// Set port to write to and find out if driver is availiable
bool setupParallelPort(USHORT port) {
	parallelPort = port;
	return IsXP64Bit() && IsInpOutDriverOpen();
}

void triggerParallelPort(USHORT trigger) {
	if (parallelPort != 0x0000) {
		DlPortWritePortUshort(parallelPort, trigger);
		Sleep(50);
		DlPortWritePortUshort(parallelPort, 0x0000);
	}
}
test.cpp

Kod: Markera allt

#include "stdafx.h"
#include "Header.h"
#include <iostream>


int main()
{
	printf("Hello\n");

	int hej;
	std::cin >> hej;

	setupParallelPort(0xE010);
	USHORT pins = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128;
	for (int i = 0; i < 1000; ++i) {
		triggerParallelPort(pins);
		Sleep(1000);
	}
	
	std::cin >> hej;
    return 0;
} 
Skriv svar