Skip to content
Commits on Source (2)
...@@ -10,7 +10,6 @@ from flask import request ...@@ -10,7 +10,6 @@ from flask import request
# Custom modules # Custom modules
from config import constants from config import constants
from .baseresource import ResourceDev from .baseresource import ResourceDev
from .sequencer_instance import seq from .sequencer_instance import seq
...@@ -44,14 +43,15 @@ class FrameBinning(ResourceDev): ...@@ -44,14 +43,15 @@ class FrameBinning(ResourceDev):
class Cooler(ResourceDev): class Cooler(ResourceDev):
"""Manage the CCD cooler status""" """Manage the CCD cooler status"""
# def get(self): def get(self):
# """Check wether the CCD cooler is on or off.""" """Check wether the CCD cooler is on or off."""
# res = { res = {
# "response": self.dev.cooler, "raw": self.dev.cooler,
# "error": self.dev.error, "response": constants.on_off[self.dev.cooler],
# "timestamp": self.timestamp, "error": self.dev.error,
# } "timestamp": self.timestamp,
# return res }
return res
def put(self): def put(self):
"""Set on or off the CCD cooler.""" """Set on or off the CCD cooler."""
...@@ -139,7 +139,8 @@ class Filter(ResourceDev): ...@@ -139,7 +139,8 @@ class Filter(ResourceDev):
def get(self): def get(self):
"""Retrieve the current filter.""" """Retrieve the current filter."""
res = { res = {
"response": self.dev.filter, "raw": self.dev.filter,
"response": constants.filter_name[self.dev.filter],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -153,7 +154,8 @@ class FilterMovement(ResourceDev): ...@@ -153,7 +154,8 @@ class FilterMovement(ResourceDev):
def get(self): def get(self):
"""Check if the filter wheel is moving.""" """Check if the filter wheel is moving."""
res = { res = {
"response": self.dev.is_moving, "raw": self.dev.is_moving,
"response": constants.filter_state[self.dev.is_moving],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -310,8 +312,9 @@ class SnapshotState(ResourceDev): ...@@ -310,8 +312,9 @@ class SnapshotState(ResourceDev):
def get(self): def get(self):
"""Retrieve the status of the acquisition process.""" """Retrieve the status of the acquisition process."""
res = { res = {
"response": self.dev.state, "raw": self.dev.state,
"response": constants.camera_state[self.dev.state],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
# Third-party modules # Third-party modules
from flask import request from flask import request
# Custom modules
from config import constants
from .baseresource import ResourceDev from .baseresource import ResourceDev
...@@ -17,9 +19,10 @@ class Position(ResourceDev): ...@@ -17,9 +19,10 @@ class Position(ResourceDev):
'''Check the azimuth of the dome, and if '''Check the azimuth of the dome, and if
this corresponds to the parking position.''' this corresponds to the parking position.'''
res = { res = {
"raw": self.dev.is_parked,
"response": { "response": {
"azimuth": self.dev.azimuth, "azimuth": self.dev.azimuth,
"parked": self.dev.is_parked, "parked": constants.yes_no[self.dev.is_parked],
}, },
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
...@@ -34,13 +37,13 @@ class Shutter(ResourceDev): ...@@ -34,13 +37,13 @@ class Shutter(ResourceDev):
def get(self): def get(self):
'''Check the state of the dome shutter.''' '''Check the state of the dome shutter.'''
res = { res = {
"response": self.dev.shutter, "raw": self.dev.shutter,
"response": constants.open_state[self.dev.shutter],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
return res return res
# @api.route("/shutter/movement") # @api.route("/shutter/movement")
class ShutterMovement(ResourceDev): class ShutterMovement(ResourceDev):
'''Manage the movement of the dome shutter.''' '''Manage the movement of the dome shutter.'''
...@@ -51,7 +54,8 @@ class ShutterMovement(ResourceDev): ...@@ -51,7 +54,8 @@ class ShutterMovement(ResourceDev):
target = request.json target = request.json
self.dev.open = target self.dev.open = target
res = { res = {
"response": self.dev.open, "raw": self.dev.open,
"response": constants.open_state[self.open],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -76,7 +80,8 @@ class PositionSlaved(ResourceDev): ...@@ -76,7 +80,8 @@ class PositionSlaved(ResourceDev):
'''Check if the dome is slaved '''Check if the dome is slaved
to the telescope or not.''' to the telescope or not.'''
res = { res = {
"response": self.dev.slave, "raw": self.dev.slave,
"response": constants.yes_no[self.dev.slave],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -88,7 +93,8 @@ class PositionSlaved(ResourceDev): ...@@ -88,7 +93,8 @@ class PositionSlaved(ResourceDev):
slaved = request.json slaved = request.json
self.dev.slave = slaved self.dev.slave = slaved
res = { res = {
"response": self.dev.slave, "raw": self.dev.slave,
"response": constants.yes_no[self.dev.slave],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -119,7 +125,8 @@ class PositionMovement(ResourceDev): ...@@ -119,7 +125,8 @@ class PositionMovement(ResourceDev):
def get(self): def get(self):
'''Return if the dome is moving or not.''' '''Return if the dome is moving or not.'''
res = { res = {
"response": self.dev.is_moving, "raw": self.dev.is_moving,
"response": constants.yes_no[self.dev.is_moving],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -173,7 +180,8 @@ class Connection(ResourceDev): ...@@ -173,7 +180,8 @@ class Connection(ResourceDev):
'''check if the dome is connected to ASCOM.''' '''check if the dome is connected to ASCOM.'''
res = { res = {
"response": self.dev.connection, "raw": self.dev.connection,
"response": constants.yes_no[self.dev.connection],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -184,7 +192,8 @@ class Connection(ResourceDev): ...@@ -184,7 +192,8 @@ class Connection(ResourceDev):
connection = request.json connection = request.json
self.dev.connection = connection self.dev.connection = connection
res = { res = {
"response": self.dev.connection, "raw": self.dev.connection,
"response": constants.yes_no[self.dev.connection],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
......
...@@ -8,9 +8,10 @@ ...@@ -8,9 +8,10 @@
# Third-party modules # Third-party modules
from flask import request from flask import request
# Custom modules
from config import constants
from .baseresource import ResourceDev from .baseresource import ResourceDev
# @api.route("/dome/light") # @api.route("/dome/light")
# @api.route("/telescope/lamp") # @api.route("/telescope/lamp")
# @api.route("/camera/power") # @api.route("/camera/power")
...@@ -26,7 +27,8 @@ class State(ResourceDev): ...@@ -26,7 +27,8 @@ class State(ResourceDev):
def get(self): def get(self):
'''Check if the switch on or off.''' '''Check if the switch on or off.'''
res = { res = {
"response": self.dev.state, "raw": self.dev.state,
"response": constants.on_off[self.dev.state],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -38,7 +40,8 @@ class State(ResourceDev): ...@@ -38,7 +40,8 @@ class State(ResourceDev):
state = request.json state = request.json
self.dev.state = state self.dev.state = state
res = { res = {
"response": self.dev.state, "raw": self.dev.state,
"response": constants.on_off[self.dev.state],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
......
...@@ -10,8 +10,8 @@ from datetime import datetime ...@@ -10,8 +10,8 @@ from datetime import datetime
from flask import request from flask import request
# Custom modules # Custom modules
from config import constants
from utils.coordinates import to_hms, to_hms_dms, to_radec from utils.coordinates import to_hms, to_hms_dms, to_radec
from .baseresource import ResourceDev from .baseresource import ResourceDev
...@@ -196,7 +196,8 @@ class CoordinatesMovementAtpark(ResourceDev): ...@@ -196,7 +196,8 @@ class CoordinatesMovementAtpark(ResourceDev):
'''Send the telescope to park position.''' '''Send the telescope to park position.'''
parked = self.dev.park parked = self.dev.park
res = { res = {
"response": parked, "raw": parked,
"response": constants.yes_no[parked],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -265,7 +266,8 @@ class CoordinatesTracking(ResourceDev): ...@@ -265,7 +266,8 @@ class CoordinatesTracking(ResourceDev):
def get(self): def get(self):
'''Check if the telescope is tracking or not.''' '''Check if the telescope is tracking or not.'''
res = { res = {
"response": self.dev.tracking, "raw": self.dev.tracking,
"response": constants.yes_no[self.dev.tracking],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -291,7 +293,8 @@ class Connection(ResourceDev): ...@@ -291,7 +293,8 @@ class Connection(ResourceDev):
'''Check if the telescope is connected to ASCOM.''' '''Check if the telescope is connected to ASCOM.'''
res = { res = {
"response": self.dev.connection, "raw": self.dev.connection,
"response": constants.yes_no[self.dev.connection],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
...@@ -303,7 +306,8 @@ class Connection(ResourceDev): ...@@ -303,7 +306,8 @@ class Connection(ResourceDev):
connection = request.json connection = request.json
self.dev.connection = connection self.dev.connection = connection
res = { res = {
"response": self.dev.connection, "raw": self.dev.connection,
"response": constants.yes_no[self.dev.connection],
"error": self.dev.error, "error": self.dev.error,
"timestamp": self.timestamp, "timestamp": self.timestamp,
} }
......
...@@ -34,7 +34,7 @@ def get_status(namespace): ...@@ -34,7 +34,7 @@ def get_status(namespace):
res = client.get(power) res = client.get(power)
name = "-".join(power.split("/")[2:]) # "dome-shutter-movement" name = "-".join(power.split("/")[2:]) # "dome-shutter-movement"
endpoints[name] = res.get_json() endpoints[name] = res.get_json()
if not res.get_json()["response"]: if not res.get_json()["raw"]:
return endpoints return endpoints
for rule in app.url_map.iter_rules(): for rule in app.url_map.iter_rules():
......
...@@ -463,11 +463,11 @@ Control ...@@ -463,11 +463,11 @@ Control
</small> </small>
<small class="col text-success"> <small class="col text-success">
moving: moving:
<var data-status="camera-movement"></var> <var data-status="camera-filter-movement"></var>
</small> </small>
<small class="col text-success"> <small class="col text-success">
state: state:
<var data-status="camera-state"></var> <var data-status="camera-snapshot-state"></var>
</small> </small>
</aside> </aside>
......
...@@ -19,8 +19,8 @@ def enable(app): ...@@ -19,8 +19,8 @@ def enable(app):
app.register_blueprint(routes.web, url_prefix='/web') app.register_blueprint(routes.web, url_prefix='/web')
base_url = {"ext_base_url": "http://fork.orsa.unige.net:5533", # what form-crud needs base_url = {"ext_base_url": "http://fork.orsa.unige.net:5533", # what browser needs
"int_base_url": "http://10.185.119.108:5533"} # what instance needs "int_base_url": "http://10.185.119.108:5533"} # what server needs
# "int_base_url": "http://130.251.19.108:5533"} # from outside # "int_base_url": "http://130.251.19.108:5533"} # from outside
@app.context_processor @app.context_processor
......
...@@ -87,7 +87,6 @@ def tail_f(socketio, num_lines=30, sleep=0.25, once=False): ...@@ -87,7 +87,6 @@ def tail_f(socketio, num_lines=30, sleep=0.25, once=False):
status.last['new_lines'] = lines status.last['new_lines'] = lines
while not once: while not once:
socketio.sleep(sleep) # Sleep before checking again
current_size = os.path.getsize(filename) current_size = os.path.getsize(filename)
if current_size < file_size: if current_size < file_size:
file_size = 0 file_size = 0
...@@ -100,6 +99,7 @@ def tail_f(socketio, num_lines=30, sleep=0.25, once=False): ...@@ -100,6 +99,7 @@ def tail_f(socketio, num_lines=30, sleep=0.25, once=False):
if new_lines: if new_lines:
socketio.emit('new_lines', new_lines) socketio.emit('new_lines', new_lines)
status.last['new_lines'] = new_lines status.last['new_lines'] = new_lines
socketio.sleep(sleep) # Sleep before checking again
......
...@@ -7,19 +7,19 @@ ...@@ -7,19 +7,19 @@
$('[data-control="telescope-lamp"]').click(function(){ $('[data-control="telescope-lamp"]').click(function(){
$(this).crud("GET", "/api/telescope/lamp").then(function(e){ $(this).crud("GET", "/api/telescope/lamp").then(function(e){
$(this).crud("PUT", "/api/telescope/lamp", !e.response) $(this).crud("PUT", "/api/telescope/lamp", !e.raw)
}) })
}) })
$('[data-control="telescope-power"]').click(function(){ $('[data-control="telescope-power"]').click(function(){
$(this).crud("GET", "/api/telescope/power").then(function(e){ $(this).crud("GET", "/api/telescope/power").then(function(e){
$(this).crud("PUT", "/api/telescope/power", !e.response) $(this).crud("PUT", "/api/telescope/power", !e.raw)
}) })
}) })
$('[data-control="telescope-connection"]').click(function(){ $('[data-control="telescope-connection"]').click(function(){
$(this).crud("GET", "/api/telescope/connection").then(function(e){ $(this).crud("GET", "/api/telescope/connection").then(function(e){
$(this).crud("PUT", "/api/telescope/connection", !e.response) $(this).crud("PUT", "/api/telescope/connection", !e.raw)
}) })
}) })
...@@ -106,13 +106,13 @@ $("#coordinates-stop").on("click", function(){ ...@@ -106,13 +106,13 @@ $("#coordinates-stop").on("click", function(){
$('[data-control="dome-connection"]').click(function(){ $('[data-control="dome-connection"]').click(function(){
$(this).crud("GET", "/api/dome/connection").then(function(e){ $(this).crud("GET", "/api/dome/connection").then(function(e){
$(this).crud("PUT", "/api/dome/connection", !e.response) $(this).crud("PUT", "/api/dome/connection", !e.raw)
}) })
}) })
$('[data-control="dome-light"]').click(function(){ $('[data-control="dome-light"]').click(function(){
$(this).crud("GET", "/api/dome/light").then(function(e){ $(this).crud("GET", "/api/dome/light").then(function(e){
$(this).crud("PUT", "/api/dome/light", !e.response) $(this).crud("PUT", "/api/dome/light", !e.raw)
}) })
}) })
...@@ -156,7 +156,7 @@ $('[data-control="dome-shutter"]').click(function(){ ...@@ -156,7 +156,7 @@ $('[data-control="dome-shutter"]').click(function(){
$('[data-control="camera-power"]').click(function(){ $('[data-control="camera-power"]').click(function(){
$(this).crud("GET", "/api/camera/power").then(function(e){ $(this).crud("GET", "/api/camera/power").then(function(e){
$(this).crud("PUT", "/api/camera/power", !e.response) $(this).crud("PUT", "/api/camera/power", !e.raw)
}) })
}) })
......
////////////////// //////////////////
/// Connection /// Connection
////////////////// //////////////////
...@@ -42,7 +43,9 @@ socket.on("all-dome",function(e) { ...@@ -42,7 +43,9 @@ socket.on("all-dome",function(e) {
$("[data-status="+k+"-azimuth]").text(e[k].response.azimuth) $("[data-status="+k+"-azimuth]").text(e[k].response.azimuth)
$("[data-status="+k+"-parked]").text(e[k].response.parked) $("[data-status="+k+"-parked]").text(e[k].response.parked)
} }
// pulse(elem)
}); });
}); });
...@@ -77,6 +80,8 @@ socket.on("all-telescope",function(e) { ...@@ -77,6 +80,8 @@ socket.on("all-telescope",function(e) {
$("[data-status="+k+"-az]").text((e[k].response[1]*3600).toFixed(1)) $("[data-status="+k+"-az]").text((e[k].response[1]*3600).toFixed(1))
} }
// pulse(elem)
}) })
}); });
...@@ -85,8 +90,9 @@ socket.on("all-telescope",function(e) { ...@@ -85,8 +90,9 @@ socket.on("all-telescope",function(e) {
/// Camera stream /// Camera stream
////////////////// //////////////////
socket.on("all-camera",function(e) { socket.on("all-camera",function(e) {
//console.log(e) //console.log(e)
$.each(e, function(k,v){ $.each(e, function(k,v){
/// Depth 1 /// Depth 1
...@@ -218,3 +224,56 @@ socket.on("new_lines", function(lines) { ...@@ -218,3 +224,56 @@ socket.on("new_lines", function(lines) {
}) })
}); });
///////////////////////
/// Pulse on changes
///////////////////////
$(document).ready(function(){
// Select all elements with data-status attribute
const elements = document.querySelectorAll('[data-status]');
// Object to store previous text content of each element
const previousTextContent = {};
// Function to monitor text changes
function observeChanges(element) {
const observer = new MutationObserver(mutationsList => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
const previousText = previousTextContent[element.getAttribute('data-status')];
const currentText = element.textContent.trim();
if (previousText !== currentText) {
pulse($(element))
previousTextContent[element.getAttribute('data-status')] = currentText;
}
}
}
});
observer.observe(element, { subtree: true, childList: true });
}
// Apply observeChanges function to each element
elements.forEach(element => {
previousTextContent[element.getAttribute('data-status')] = element.textContent.trim();
observeChanges(element);
});
});
function pulse(selector) {
// var done = "bg-success"
// var delay = 200
selector.fadeTo('slow', 0.5, function() {
selector.fadeTo('slow', 1.0) //.removeClass(done);
});
// setTimeout(function() {
// selector.removeClass(done);
// }, delay);
}