Skip to content
Commits on Source (10)
......@@ -646,7 +646,7 @@ int SeqDataMgr::SetFitsValues(fitsfile *fptr)
fits_write_key(fptr, TFLOAT, "MOONANGLEAZ ", &tenv.moon_az, "'ddd.ddd' Moon Azimuth angle at start [deg]", &FitStatus);
fits_write_key(fptr, TFLOAT, "SUNANGLEALT ", &tenv.sun_alt, "'ddd.ddd' Sun Altitude angle at start [deg]", &FitStatus);
fits_write_key(fptr, TFLOAT, "SUNANGLEAZ ", &tenv.sun_az, "'ddd.ddd' Sun Azimuth angle at start [deg]", &FitStatus);
fits_write_key(fptr, TFLOAT, "PARANGLE ", &tenv.parallactic_angle, "'ddd.d' Parallactic angle at start [deg]", &FitStatus);
fits_write_key(fptr, TFLOAT, "PARANGLE ", &tenv.parallactic_angle, "'ddd.d' Parallactic angle at end [deg]", &FitStatus);
fits_write_key(fptr, TSTRING, "PARAANG ", TBD, "Parallactic angle, degs", &FitStatus);
// fits_write_key(fptr, TFLOAT, "POSANGLE ", &tenv.pos_angle, "'ddd.d' Telescope position angle [deg]", &FitStatus);
// fits_write_key(fptr, TFLOAT, "ROTANGLE ", &tenv.rot_angle, "'dd.d' Telescope rotator angle [deg]", &FitStatus);
......@@ -1027,14 +1027,14 @@ int SeqDataMgr::SetFitsValues(fitsfile *fptr)
intValue = su::convertStringToType<int>(m_rtcKeywords["TTDMMODESNUM"]);
fits_write_key(fptr, TINT, "TTDMMODESNUM", &intValue, "number of modes in zonal influence matrix", &FitStatus);
fits_write_key(fptr, TSTRING, "TTPIXELGAINFILE", su::get_char_star(m_rtcKeywords["TTPIXELGAINFILE"]), "Gain factor for each pixel in which the centroid is calculated", &FitStatus);
intValue = su::convertStringToType<int>(m_rtcKeywords["TTPIXELENABLED"]);
fits_write_key(fptr, TLOGICAL,"TTPIXELENABLED", &intValue, "Enable saving frames on memory", &FitStatus);
intValue = su::convertStringToType<int>(m_rtcKeywords["TTPIXELDECIMATION"]);
fits_write_key(fptr, TINT, "TTPIXELDECIMATION", &intValue, "Frame saving decimation factor", &FitStatus);
intValue = su::convertStringToType<int>(m_rtcKeywords["TTDIAGENABLED"]);
fits_write_key(fptr, TLOGICAL,"TTDIAGENABLED", &intValue, "Diagnostic enabled", &FitStatus);
intValue = su::convertStringToType<int>(m_rtcKeywords["TTDIAGDECIMATION"]);
fits_write_key(fptr, TINT, "TTDIAGDECIMATION", &intValue, "TipTilt diagnostic decimation factor", &FitStatus);
// intValue = su::convertStringToType<int>(m_rtcKeywords["TTPIXELENABLED"]);
// fits_write_key(fptr, TLOGICAL,"TTPIXELENABLED", &intValue, "Enable saving frames on memory", &FitStatus);
// intValue = su::convertStringToType<int>(m_rtcKeywords["TTPIXELDECIMATION"]);
// fits_write_key(fptr, TINT, "TTPIXELDECIMATION", &intValue, "Frame saving decimation factor", &FitStatus);
// intValue = su::convertStringToType<int>(m_rtcKeywords["TTDIAGENABLED"]);
// fits_write_key(fptr, TLOGICAL,"TTDIAGENABLED", &intValue, "Diagnostic enabled", &FitStatus);
// intValue = su::convertStringToType<int>(m_rtcKeywords["TTDIAGDECIMATION"]);
// fits_write_key(fptr, TINT, "TTDIAGDECIMATION", &intValue, "TipTilt diagnostic decimation factor", &FitStatus);
fits_write_record(fptr, " ------------------------------------------------------------------------", &FitStatus);
int WCSAXES = 2;
......
......@@ -511,9 +511,13 @@ class RtcObject(object):
"TTUPDATEBIAS" : "true",
"TTTESTTIME" : "1000000",
}
if float(ufun.get_status_by_name(self.obsController, ['rtc_cred_freq'])[0]) < 10 :
rtc_s["TTTESTTIME"]="20000000"
status, filename = self.obsController.RTCTTTeccamExpose(rtc_s)
return filename
return status, filename
def load_dark(self, name):
"""Load a dark file"""
......
......@@ -98,7 +98,12 @@ class Dark(Resource):
return RTC.load_dark(name)
def post(self):
return RTC.new_dark()
status, filename = RTC.new_dark()
if not status:
return status, 200
else:
return status, 400
# def delete(self):
# subtract = api.payload
......
......@@ -447,6 +447,19 @@
<form id="f-pid" class="col mt-2">
<div class="row">
<!-- <div class="col-1 col-form-label"> -->
<!-- <label class="form-check-label" for="min_val_thrs"> -->
<!-- Min Val Thrs: -->
<!-- </label> -->
<!-- </div> -->
<!-- <div class="col"> -->
<!-- <div class="btn-group w-100"> -->
<!-- <input class="form-control" id="min_val_thrs" value="0" name="min_val_thrs" type="number"> -->
<!-- <button id="update-thrs" class="btn btn-outline-primary " type="submit" >Set</button> -->
<!-- </div> -->
<!-- </div> -->
<div class="col-2 col-form-label">
<label class="form-check-label" for="pid">
PID:
......@@ -458,8 +471,8 @@
<input class="form-control" id="TTPIDKP" value="1" name="pid_input" type="number">
<input class="form-control" id="TTPIDKI" value="1000" name="pid_input" type="number">
<input class="form-control" id="TTPIDKD" value="0" name="pid_input" type="number">
<input class="form-control" id="TTPIDTF" value="1000" name="pid_input" type="number" disabled>
<input class="form-control" id="TTPIDTS" value="1000" name="pid_input" type="number" disabled>
<input class="form-control" id="TTPIDTF" value="0.001" name="pid_input" type="number" disabled>
<input class="form-control" id="TTPIDTS" value="0.001" name="pid_input" type="number" disabled>
<button id="update-pid" class="btn btn-outline-primary " type="submit" >Set</button>
</div>
</div>
......@@ -828,6 +841,13 @@
]
$(this).crud("PUT", "/api/rtc/pid", pid)
})
// $("#update-thrs").click(function(e){
// e.preventDefault()
// var thrs = $("#min_val_thrs").val(),
// ]
// //$(this).crud("PUT", "/api/rtc/pid/", thrs)
// })
$("#move-zonal").click(function(e){
......
# server.py
from flask import Flask, render_template
from flask_socketio import SocketIO
import numpy as np
import json
app = Flask(__name__)
socketio = SocketIO(app,
async_mode='threading',
)
# Function to generate a random NumPy matrix
def generate_matrix():
return np.random.rand(3, 3)
# Function to send the matrix to the client
def send_matrix():
matrix = generate_matrix()
matrix_json = json.dumps(matrix.tolist())
socketio.emit('matrix', matrix_json)
# Background thread to send the matrix every 5 seconds
def background_thread():
while True:
send_matrix()
socketio.sleep(5)
# Route for the HTML page
@app.route('/')
def index():
return render_template('index.html')
# Socket.IO event handlers
@socketio.on('connect')
def handle_connect():
print('Client connected')
@socketio.on('disconnect')
def handle_disconnect():
print('Client disconnected')
@socketio.on('message')
def handle_message(message):
print('Received message:', message)
if __name__ == '__main__':
socketio.start_background_task(target=background_thread)
socketio.run(app, host="0.0.0.0", port=5002)
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask-SocketIO Example</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.4.0/socket.io.js"></script>
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script> -->
<script>
// Connect to Socket.IO server
// var socket = io.connect('http://' + document.domain + ':' + location.port);
const socket = io.connect({
// transports: ['websocket'],
});
// Event handlers
socket.on('connect', () => {
console.log('Connected');
});
socket.on('disconnect', () => {
console.log('Disconnected');
});
socket.on('message', (data) => {
console.log('Received message:', data);
});
socket.on('matrix', function(matrix_json) {
var matrix = JSON.parse(matrix_json);
console.log('Received matrix:');
console.log(matrix);
});
// // Example: Sending a message
// function sendMessage() {
// const message = document.getElementById('message').value;
// socket.emit('message', message);
// }
</script>
</head>
<body>
<input type="text" id="message" placeholder="Type a message...">
<button onclick="sendMessage()">Send</button>
</body>
</html>
......@@ -4,6 +4,6 @@
Name of this template without extension
</name>
<description>
NCPA estimation using Trial and Error approach. Baseline setup is 11 steps per mode, with steps of 0.01um RMS shape of DM, NDIT=5. SP Lyot stop is inserted. The template doesn't make any instrument setup. For internal fiber use it with PaB filter inserted.
NCPA estimation using Trial and Error approach. Baseline setup is 11 steps per mode, with steps of 0.01um RMS shape of DM, NDIT=5. SP Lyot stop is inserted. The template doesn't make any instrument setup except for scientific filters. For internal fiber use it with PaB filter inserted. At the end of the template it asks the user if accept the obtained modes and save them or if quit without saving them.
</description>
</doc>
......@@ -22,6 +22,8 @@
<InstrumentSetup>
<STEPS>5</STEPS>
<SCI_FILT_W1>HOLE</SCI_FILT_W1>
<SCI_FILT_W2>HOLE</SCI_FILT_W2>
</InstrumentSetup>
<TelescopeSetup>
......
......@@ -21,8 +21,10 @@
</DetectorSetup>
<InstrumentSetup>
<ADC_Mode>OFF</ADC_Mode>
<!-- <ADC_Mode>OFF</ADC_Mode> -->
<STEPS>11</STEPS>
<SCI_FILT_W1>HOLE<SCI_FILT_W1>
<SCI_FILT_W2>HOLE<SCI_FILT_W2>
</InstrumentSetup>
<TelescopeSetup>
......
......@@ -114,5 +114,21 @@ class SHARKNIR_cal_Flux_MaskRemoval(SHINSApp):
# self.status = obsController.RTCTTCloseLoop()
# logger.info("Close internal TT loop ... DONE")
saly = aly(camera='HAWAII H-2RG')
saly.detector.setCrop(3)
saly.detector.setStackType('CDS')
im_arr = []
for image_name in self.filenames:
logger.debug("reading {}".format(image_name))
img_ = read_image(fitsDir+image_name, saly.detector)
im_arr.append(img_)
meaned = np.mean(np.asarray(im_arr), 0)
saly.PSFNoCoro.LoadImage(meaned)
saly.PSFNoCoro.removeHotPixels(verbose=True)
saly.PSFNoCoro.calculate_bkg()
self.tpl_output = {
uvars.tpl_output_names["sasha_flux"] : np.round(saly.PSFNoCoro.flux, 2),
uvars.tpl_output_names["sasha_max"] : np.max(saly.PSFNoCoro.image),
uvars.tpl_output_names["sasha_min"] : np.min(saly.PSFNoCoro.image)
}
......@@ -335,6 +335,51 @@ class SHARKNIR_cal_tec_NCPA_trial(SHINSApp):
fast_mode_enabled = False
logger.info("Trial and Error Fast Mode DISABLED")
##################
# PAUSE / RESUME #
##################
self.paragraph("CONTINUE and SAVE modes vector or STOP and NOT SAVE")
#self.paused = True
logger.warning("From WEB INTERFACE: Continue if you agree to save; Stop otherwise.")
logger.warning("From COMMAND LINE: Resume if you agree to save; Quit otherwise.")
print("(R)esume, (Q)uit")
import sys
from select import select
timeout = 2
answer = None
print("Enter something:"),
self.paused = True
while self.paused==True and self.aborted==False:
rlist, _, _ = select([sys.stdin], [], [], timeout)
if rlist:
answer = sys.stdin.readline()
print(answer)
else:
print("still waiting...")
if answer:
if answer.lower().startswith('r'):
self.paused = False
pass
if answer.lower().startswith('q'):
self.paused = False
self.aborted = True
self.abort()
return
else:
pass
###########################
# Save NCPA vector modes #
###########################
ufun.save_ncpa(os=obsController)
opt_ee_array = [np.round(ee, 3) for ee in opt_ee_array]
self.tpl_output = {
uvars.tpl_output_names["final_ee"] : metric,
......
......@@ -88,9 +88,9 @@ def handler_for_run(run):
logger.error("RUN: Exception: {}".format(type(e).__name__))
logger.error(e)
print(this.name)
if this.name == "SHARKNIR_cal_tec_NCPA_trial":
this.obsController.unsetFlags(8,0)
logger.debug("Fits Fast Saving Mode DISABLED")
#if this.name == "SHARKNIR_cal_tec_NCPA_trial":
this.obsController.unsetFlags(8,0)
logger.debug("Fits Fast Saving Mode DISABLED")
#raise e
......