Infrarot-Kamera VarioCAM und das SDK

Das Software Development Kit (SDK) zur Infrarot-Kamera VarioCAM der Firma Infratec GmbH ist vorrangig für Delphi-Entwickler geschrieben. Hier wird die noch kostenlose Version 2 vom Oktober 2004 verwendet.

Ich verwendete hier Microsoft Visual Studio 6.0 mit C++. Mit neueren C-Compilern geht's aber auch.

Statisches Binden (macht weniger Arbeit)

Weil eine .LIB-Datei fehlt, lässt sich die zu verwendende IRBGRAB.DLL nicht in Visual C statisch einbinden, und man hat eine Menge Arbeit mit GetProcAddress()-Aufrufen. Die mitgelieferte Header-Datei IRBGRAB.H enthält keine _stdcall-Aufrufkonventionsfestlegung und ist damit in Projekten mit _cdecl- oder _fastcall-Aufrufkonvention nicht verwendbar (d.h. das Programm wird korrekt compiliert, stürzt aber „rätselhafterweise“ irgendwo ab). Ein typischer Fremdkörper mal wieder.

Hier die notwendigen Dateien für statisches Binden zur IRBGRAB.DLL:

Außerdem hilft _declspec(dllimport), Kode zu sparen.
Die Verknüpfungen zur DLL sind allesamt nach Nummer, nicht nach Name. Die resultierende Kodegröße ist zudem geringer. Allerdings darf Infratec die Ordinalzahlen nicht ändern!

Richtige Lösung: Da frage ich mich die ganze Zeit, warum der MSVC-Linker nicht gleich DLLs linken kann, anstelle diese umständlichen LIB-Dateien zu handhaben.

Hat man eine .EXE compiliert, die statisch mit IRBGRAB.DLL verbunden ist, muss diese DLL:

Die wenigsten Probleme bereitet die erste Lösung. Zu beachten ist, dass die davon abhängigen DLLs VARIOCAM.DLL und C3POWER.DLL sich ebenfalls im o.a. Verzeichnissen befinden müssen! Die Datei MSVCP60.DLL befindet sich oftmals schon im Windows-Verzeichnis.

Der Pfad zur IRBGRAB.INI

Um die .INI-Datei gleich neben die .EXE legen zu können, ist folgende Vorgehensweise zweckmäßig und Kode sparend:

#include <shlwapi.h>
#define elemof(x) (sizeof(x)/sizeof(*(x)))
...
 char IniFileName[MAX_PATH], *p;
 GetModuleFileNameA(0, IniFileName, elemof(IniFileName));
 p = PathFindFileNameA(IniFileName);
 lstrcpynA(p, IniFileName+elemof(IniFileName)-p, "IrbGrab.ini");
...

Dieses Kode-Schnipsel ist extra auf ANSI getrimmt, weil der INI-Dateiname nicht in Unicode übergeben werden kann. Damit sind Probleme vorprogrammiert, wenn der Verzeichnispfad Sonderzeichen enthält, die nicht Bestandteil der aktuellen OEM-Kodeseite sind (bspw. chinesische Zeichen im deutschen Windows). Bedanken Sie sich für diesen Bug bei den Entwickern bei Infratec.

Ein einfaches Beispielprogramm

Das mitgelieferte Demo-Programm wurde für die permanente Bildwiedergabe in doppelter Größe per Timer umgestrickt. Dazu wurde eine Farbpalette geladen, die sich derzeit fest an folgender Stelle befinden muss: "c:/Programme/IRBIS_professional_2.2/col/ThvVario.col"

Das Programm ist keinesfalls ausgereift! Es ist eine Lügendetektor-Scherzanwendung, bei der der Fragesteller unauffällig am Mausrad die angezeigte Gesichtstemperatur modifizieren kann.

Bildschirm-Schnappschuss. Ähnlichkeiten mit dem Programm Irbis-Online sind beabsichtigt

Das Programm zum Download und zur Einsicht.

Übrigens ist der Quelltext noch vor der „Erfindung“ der msvcrt-light.lib erstellt: Die für die Anzeige von Gleitkommazahlen schwerlich ersetzbare msvcrt.dll wird per LoadLibrary + GetProcAddress eingebunden.

Kamera defekt

Eines Tages ging das FireWire-Interface nicht mehr. Die Kamera wurde zur Reparatur eingeschickt. Das war lange her, vielleicht 2010.

Anschlussbelegung des Kabels

Jetzt wieder das gleiche Symptom. Vermutlich wurde damals nur der Firewire-Chip gewechselt, das kann ich auch. Wenn man den noch bekommt. Alles in allem ist Firewire eine schlechte Marotte von hochpreisigen Kameras, damals () schon und heute erst recht. Dazu kommt noch die Infratec-Marotte mit den hochpreisigen und nicht standardgemäßen Lemo-Steckern. Dazu der Murks mit den Nicht-System-Treibern. Viele Gründe um USB zu bevorzugen und dabei die Kompatibilität zur Infratec-Software zu verlieren (und diese neu zu schreiben) …

231115: Ursache: Nicht (nur) das FireWire-Interface ist kaputt, sondern im „Netzteil“ (Stromversorgungsblock) gibt es einen Kurzschluss im Schaltkreis LM5642 zwischen Pin 8 (Masse) und Pin 16 (faktisch Ausgangsspannung). Sicherungen allesamt heil. Vermutet und ausgelötet wurden zunächst:

  1. Ausgangselko (zerstörend ausgebohrt um nicht die Platine oder mit Heißluft Nachbarelkos zu beschädigen)
  2. Ausgangskondensator (SMD, mit 2 Lötkolben)
  3. MOSFET IRLTS6342 (ebenfalls mit 2 Lötkolben)

Schließlich wurde der Schaltkreis (4) mit Heißluft unter Abdeckung der Elkos ausgelötet, und der Kurzschluss verschwand von der Platine.

Fotos