Hallo BlackJack,
ich denke auch, dass die Initialisierung nicht funktioniert, ich verstehe nur nicht so genau warum.
Der komplette C++ Code sieht folgendermaßen aus:
Code: Alles auswählen
#include "stdafx.h"
#include <windows.h>
#include "ImagerIPC2.h"
int main(int argc, char* argv[])
{
HANDLE hStdout;
bool frameInitialized = false, Connected = false, Stopped = false;
int FrameWidth, FrameHeight, FrameDepth, FrameSize;
void *FrameBuffer = NULL;
FrameMetadata Metadata;
const char s[] = {"open \0 closed\0 <-opening \0 closing-> \0 \0"};
if (InitImagerIPC(0) < 0) { printf("\nInit failed! Press Enter to exit..."); getchar(); return -1; }
if (RunImagerIPC(0) < 0) { printf("\nRun failed! Press Enter to exit..."); getchar(); ReleaseImagerIPC(0); return -1; }
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO CSBI;
GetConsoleScreenBufferInfo(hStdout, &CSBI); // memorize last cursor pos to repeat output
while(!GetAsyncKeyState(VK_ESCAPE) && !Stopped) // loop until ESC is pressed or stopped by server
{
WORD State = GetIPCState(0, true);
if(State & IPC_EVENT_SERVER_STOPPED) Stopped = true;
if(!Connected && (State & IPC_EVENT_INIT_COMPLETED)) Connected = true;
if((State & IPC_EVENT_FRAME_INIT) && (SUCCEEDED(GetFrameConfig(0, &FrameWidth, &FrameHeight, &FrameDepth))))
{
frameInitialized = true;
printf("------------------------------------------------------\nWidth,Height: (%d,%d)\n\n\n\n\n", FrameWidth, FrameHeight);
printf("------------------------------------------------------\nHit ESC to exit...\n");
CSBI.dwCursorPosition.Y += 2;
FrameSize = FrameWidth * FrameHeight * FrameDepth;
FrameBuffer = new char[FrameSize];
}
if(Connected && frameInitialized && (FrameBuffer != NULL) && GetFrameQueue(0))
if(SUCCEEDED(GetFrame(0, 0, FrameBuffer, FrameSize, &Metadata)))
{
SetConsoleCursorPosition(hStdout, CSBI.dwCursorPosition);
printf("Frame counter HW/SW: %d/%d\n", Metadata.CounterHW, Metadata.Counter);
printf("PIF DI:%d AI1:%d AI2:%d\n", (Metadata.PIFin[0] >> 15) == 0, Metadata.PIFin[0] & 0x3FF, Metadata.PIFin[1] & 0x3FF);
printf("Target-Temp: %3.1f\370C\n", (float)GetTempTarget(0));
printf("Flag: |%s| <-- Hit SPACE to renew flag\n", &s[min(int(Metadata.FlagState),4)*14]);
unsigned short* FB = ((unsigned short*)FrameBuffer);
printf("Frame: %hu",FB);
}
ImagerIPCProcessMessages(0);
if(GetAsyncKeyState(VK_SPACE)) // renew flag if SPACE is pressed
RenewFlag(0);
}
printf("\n "); // clear last line
if(Stopped)
{
printf("\nIPC stopped by server! Press Enter to exit...");
getchar();
}
if(FrameBuffer) delete [] FrameBuffer;
ReleaseImagerIPC(0);
return 0;
}
Meine Übersetzung sieht bis jetzt so aus:
Code: Alles auswählen
import ctypes
from ctypes import byref, HRESULT
from enum import Enum
IPC_EVENT_INIT_COMPLETED = 0x0001
IPC_EVENT_SERVER_STOPPED = 0x0002
IPC_EVENT_CONFIG_CHANGED = 0x0004
IPC_EVENT_FILE_CMD_READY = 0x0008
IPC_EVENT_FRAME_INIT = 0x0010
IPC_EVENT_VIS_FRAME_INIT = 0x0020
class TFlagState(Enum):
fsFlagOpen = 1
fsFlagClose = 2
fsFlagOpening = 3
fsFlagClosing = 4
fsError = 5
class FrameMetadata(ctypes.Structure):
_fields_ = [
('Size', ctypes.c_ushort),
('Counter', ctypes.c_uint),
('CounterHW', ctypes.c_uint),
('Timestamp', ctypes.c_longlong),
('TimestampMedia', ctypes.c_longlong),
('FlagState', ctypes.c_int),
('TempChip', ctypes.c_float),
('TempFlag', ctypes.c_float),
('TempBox', ctypes.c_float),
('PIFin', ctypes.c_int)
]
FrameCounter = ctypes.c_int()
FrameSize = ctypes.c_uint()
Metadata = FrameMetadata()
FrameBuffer = ctypes.c_void_p()
FrameWidth = ctypes.c_int()
FrameHeight = ctypes.c_int()
FrameDepth = ctypes.c_int()
State = ctypes.create_string_buffer(40)
OptrisDLL = ctypes.WinDLL("ImagerIPC2.dll")
#OptrisDLL = ctypes.cdll.LoadLibrary("ImagerIPC2.dll")
print OptrisDLL
GetFrame = OptrisDLL.GetFrame
GetFrame.restype = HRESULT
GetFrame.argtypes=[ctypes.c_ushort, ctypes.c_ushort, ctypes.c_void_p, ctypes.c_uint, ctypes.POINTER(FrameMetadata) ]
GetFrameConfig = OptrisDLL.GetFrameConfig
GetFrameConfig.restype = HRESULT
GetFrameConfig.argtypes = [ctypes.c_ushort, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)]
GetIPCState = OptrisDLL.GetIPCState
GetIPCState.restype = ctypes.c_ushort
GetIPCState.argtypes = [ctypes.c_ushort, ctypes.c_bool]
RunImagerIPC = OptrisDLL.RunImagerIPC
RunImagerIPC.restype = ctypes.HRESULT
RunImagerIPC.argtypes = [ctypes.c_ushort]
ReleaseImagerIPC = OptrisDLL.ReleaseImagerIPC
ReleaseImagerIPC.restype = ctypes.HRESULT
ReleaseImagerIPC.argtypes = [ctypes.c_ushort]
InitImagerIPC = OptrisDLL.InitImagerIPC
InitImagerIPC.restype = ctypes.HRESULT
InitImagerIPC.argtypes = [ctypes.c_ushort]
hr = -1
while (hr != 0):
hr = InitImagerIPC(0)
print "InitImagerIPC = %s"%hr
if (hr < 0):
ReleaseImagerIPC(0)
hr = RunImagerIPC(0)
print "RunImagerIPC = %s"%hr
if (hr < 0):
ReleaseImagerIPC(0)
while True:
State = GetIPCState(0, True)
print State
#if(State & IPC_EVENT_FRAME_INIT):
v = GetFrameConfig(0, byref(FrameWidth), byref(FrameHeight), byref(FrameDepth))
print v
FrameSize = FrameWidth * FrameHeight * FrameDepth
FrameBuffer = (ctypes.c_char * FrameSize)()
Frame = GetFrame(0, 0, byref(FrameBuffer), byref(FrameSize), byref(Metadata))
print 'Frame =%s'%Frame
Die Initialisierung gibt keine Fehlermeldung zurück, allerdings kann ich "State" nicht auslesen, da bekomme ich nur eine Null zurück anstelle eines Hex-Wertes den ich maskieren kann.