PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Programmierer gesucht (externer Programmaufruf)


Sailor Moon
2013-01-12, 20:45:41
Hallo zusammen,

ich entwickle gerade eine erweiterte Version eines Bildschirmtestprogramms vglb. dem UDACT (http://www.ugra.de/ugra-display-analysis-and-certification-tool.phtml) bzw. der derzeit von PRAD verwendeten Lösung. Um nicht generell auf herstellerseitige SDKs zur Sondenansteuerung angewiesen zu sein, sollen die Messdaten via Argyll - Spotread (http://argyllcms.com/doc/spotread.html) an das Programm übermittelt werden. Das Tool von Graeme Gill basiert auf eigenen Treibern.

Spotread ist kommandozeilenbasiert und liefert in einem sehr simplen Ablauf die notwendigen Daten. Der Aufruf via Processbuilder oder weiter gekapselt durch Apache Commons Exec (http://commons.apache.org/exec/) und das Auslesen der ersten Ausgaben gelingen auch wunderbar, aber ich scheitere an der Übergabe nachfolgender Befehle ("Press... to...") an das Programm (via OutputStream). Gleichzeitig ist der in einem eigenen Thread laufende "Ausleser" (InputStreamReader) nach Erreichen der ersten "Benutzereingabe-Warteposition" auch nicht mehr "ready".

Ich habe da jetzt schon eine Weile experimentiert, aber mir fehlt da auch die absolute Erfahrung, außerdem müssen weitere Teile des Programm fertiggeschrieben werden, und ich habe aktuell auch beruflich viel zu tun. Daher möchte ich diesen Teil gerne auslagern.

Gesucht ist eine Java-Klasse, die mit Spotread kommuniziert und die XYZ-Normfarbwerte der Messung als float[3] Array zurückliefert. Denkbar wäre also:

public interface Spotread {

public void init(String command) throws SpotreadException;
public boolean connection();
public void calibrate() throws SpotreadException;
public boolean ready();
public void triggerMeasurement() throws SpotreadException;
public float[/*3*/] getTriStimulus() throws SpotreadException;
public void quit();
}


Mit init(String command) würde Spotread über das übergebene Kommando (z.B. "/lib/spotread.exe -d -y l") aufgerufen.

connection liefert true zurück, wenn Spotread läuft

calibrate() bestätigt die erste Benutzereingabe ("needs a calibration before continuing...hit any key to coninue...")

ready() liefert true zurück, wenn die Kalibration funktioniert hat ("Calibration complete")

triggerMeasurement() führt eine Messung durch ("...any other key to take a reading"); die XYZ-Normfarbwerte werden auf der Konsole ausgegeben und können ausgelesen werden ("Result is XYZ:..."); Spotread kann beliebig viele Messungen ausführen, die aktuelle Messung sollte intern gespeichert und über

public float[/*3*/] getTriStimulus() ausgeben werden. Danach würde von mir wieder triggerMeasurement() ausgeführt etc.

public void quit(); beendet spotread ("Hit ESC or Q to exit") und damit auch die Java-Verbindung zum Programm.

Die Exception Klasse nimmt ggf. Ausnahmen auf. Das ist aber erstmal nicht entscheidend. Mir reicht auch eine Lösung ohne Exception-Handling, zumal Argylls Spotreas auch recht straigtforward ist.

Anbei mal die Kommandozeilenausgabe von Spotread zur besseren Veranschaulichung.

http://foto.arcor-online.net/palb/alben/69/1896769/3230626631306465.jpg

http://foto.arcor-online.net/palb/alben/69/1896769/3964373661383934.jpg

http://foto.arcor-online.net/palb/alben/69/1896769/3366613564646561.jpg

http://foto.arcor-online.net/palb/alben/69/1896769/3862363032376630.jpg

Eigentlich müsste das möglich sein. Kenntnisse in Farbmetrik, Messtechnik etc. sind nicht erforderlich (der für die jweilige Sonde notwendige Aufrufparameter kommt vom Programm), es geht nur um das Auslesen der Ausgaben und das Weiterleiten von Kommandos. Der Quellcode von Spotread (falls da etwas haken sollte) ist offen. Messgerät kann zu Testzwecken zur Verfügung gestellt werden.

Ich will hier keine LowCost-Lösung forcieren, d.h. die Problemlösung wäre mir schon etwas wert. Bezgl. des Stundensatzes bzw. Pauschalpreis bin ich flexibel (erwarte da keine "Studenten-/ Schülerpreise"), da bitte ich um entsprechende Kontaktaufnahme bzw. weitere Abklärung von Details.

Demirug
2013-01-12, 21:28:36
Ich habe mal kurz in den Sourcecode von diesem Spotread geschaut. Das ist so ziemlich das übelste was ich bisher gesehen haben. Das OutputStream nicht funktioniert liegt daran das die Eingaben mit getch gelesen werden was nicht über stdio sondern über den Inputcontext der Konsole geht. Die Lösungen um das von einem anderen Process aus Fernzusteuern sind alle etwas hacky.

Das beste wäre wahrscheinlich den Code von Spotread etwas anzupassen das es vollständig mit stdio arbeiten kann.

Pinoccio
2013-01-12, 21:52:03
Unter *x würde ich Expect (http://en.wikipedia.org/wiki/Expect) empfehlen. Falls das eine Alternative ist, spotread scheint es jedenfalls auch für Linux zu geben.
mfg

Gast
2013-01-12, 21:58:38
Unter *x gibts auch kein conio.h/getch(), d.h. da sollte auch die stdio-Lösung in Java problemlos funktionieren.

Sailor Moon
2013-01-12, 22:40:02
Schonmal ein großes Dankeschön für die Hinweise!

Wenn es im einfachsten Fall mit einer kleinen Anpassung von Spotread getan ist, wäre ich über eine entsprechende Rekompilierung sehr dankbar (wie gesagt, kostenlos muss und soll in diesem Fall gar nichts sein).

Idealerweise würde jemand die oben angesprochene Steuerungsklasse implementieren (ggf. mit Spotread-Änderung, wenn sonst zu aufwändig oder "fragil"). Falls das aufgrund eines (vermutlich) vglw. geringen Zeitaufwands zu unattraktiv erscheint, ist mir ein Pauschalangebot auch sehr willkommen.

Sailor Moon
2013-01-13, 21:17:25
So, unabhängig vom weiter bestehenden Angebot habe ich mal etwas mit der Robot Klasse experimentiert. Ich stoße aber, unabhängig von erkannten oder nicht erkannten Eingaben auf das Problem, dass der Auslesethread, der die Ausgaben des Programms in einer Schleife abfängt (bytesRead > 0), "steht", sobald die erste Benutzereingabe erwartet wird (erstes Bild oben). Der zugehörige InputStreamReader ist nicht mehr "ready". Selbst wenn ein Kommando erkannt würde, sähe ich mich jetzt dem Problem gegenüber, dass einfach keine Programmausgaben mehr erfasst würden. Oder liegt das alleine darin begründet, dass die Kommandos eben nicht registriert werden und ich den InputStreamReader, wenn wirklich neue Ausgaben seitens Spotread erzeugt würden, wieder "reaktivieren" könnte?