ArcetriAdaptiveOptics / plico_interferometer_server

MIT License
0 stars 1 forks source link

phasecam6110 doesn't need a server? #6

Open lbusoni opened 1 year ago

lbusoni commented 1 year ago

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

lbusoni commented 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.

ChiaraSelmi commented 1 year ago

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

Screenshot 2023-03-22 alle 20 45 50

NOTE: mettere le librerie json e urllib nell'install.py dava problemi quindi le ho tolte. Controllare se effettivamente servirà aggiungerle.