Open lbusoni opened 1 year ago
Riguardo alla necessità del server: è una limitazione di plico.
Alcuni direbbero che è una feature. In pratica ci sono 2 cose pallose dal punto di vista dell'utente 1) devi far partire un processo in più (il server) e 2) devi sapere ip e porta del server
Sul 2) si potrebbe lavorare a livello del plico per avere una roba tipo autodiscovery e rendere la connessione più automatica Su 1) c'è poco da fare. Non è neanche tanto la palla di scrivere il codice del 6110 (quello lo devi fare anche se usi un approccio con solo il cliente): è antipatico dover installare, modificare il file di configurazione e far partire il server.
Però con il server hai dei vantaggi. Ad esempio, si può fare qualcosa di un poco più complicato rispetto a quello che fa ora PhaseCam6110.wavefront() tipo salvare roba sul server mentre il tuo client va avanti a fare altre cose (acquisizioni lunghe). O anche gestire concorrenza di altri clienti: il server decide chi agisce sul 4D. Insomma, robetta.... Magari se ne può fare a meno?
In questo caso sarebbe carino avere una soluzione con il solo cliente, che però rimanga per l'utilizzatore della forma
from plico_interferometer import interferometer
ip = '123.123.123.123' # ip of PhaseCam6110, not of the server
i6110 = interferometer(ip)
Here some magic has to happen, in such a way that i6110 is NOT an instance of InterferometerClient but instead is an instance of a new PhaseCam6110Client class inheriting from AbstractInterferometerClient
Then, one can go on like usual
wf = i6110.wavefront(how_many=10)
assert(isinstance(wf, numpy.masked.array))
To implement that, interferometer() must become much smarter: try to connect to the other side and understand if there is a zmq-based server or the PhaseCam server (or something else). Then it can create the corresponding client and return it to the caller.
Implementato un primo step nel branch 4SightFocusWCF del plico_interferometer
Ho aggiunto una cartella devices (allo stesso livello del client) dove ho messo il file di interfacciamento con l'interferometro: il vecchio file i4d6110 si chiama ora WCF_interface_for_4SightFocus.py. L'oggetto interferometro non viene instanziato da InterferometerClient, ma tramite la classe interferometer_WCF_client che segue la classe astratta standard. Nell'init ho aggiunto la nuova definizione per l'interferometro. I comandi per l'utente sono adesso
from plico_interferometer import interferometer_4SightFocus_client
interf = interferometer_4SightFocus_client(ipaddr, port) #del 4d, non del server appunto
Ho installato il branch sul pc della torre di M4 dove adesso è attaccato il 6110 ed il codice funziona
NOTE: mettere le librerie json e urllib nell'install.py dava problemi quindi le ho tolte. Controllare se effettivamente servirà aggiungerle.
PhaseCam6110 has natively an interface to request measurements and set parameters implemented in i4d_6110.py
The server is not needed, but currently plico doesn't allow for such a scheme, and plico_interferometer.interferometer() ALWAYS returns an object that interfaces to a server via zmq rpc, not to the 6110 via its dedicated API Let's just discuss possible workarounds, pros and cons