Skip to content

Commit 5480f4c

Browse files
authored
Merge pull request #439 from aaronwmorris/dev
Add tables for RAW and FITS files
2 parents dd430c7 + 44316be commit 5480f4c

14 files changed

Lines changed: 655 additions & 80 deletions

File tree

indi_allsky/camera/indi.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -316,16 +316,16 @@ def getDeviceProperties(self, device):
316316

317317
# if p.getType() == PyIndi.INDI_TEXT:
318318
# for t in p.getText():
319-
# properties[name][t.name] = t.text
319+
# properties[name][t.getName()] = t.getText()
320320
# elif p.getType() == PyIndi.INDI_NUMBER:
321321
# for t in p.getNumber():
322-
# properties[name][t.name] = t.value
322+
# properties[name][t.getName()] = t.getValue()
323323
# elif p.getType() == PyIndi.INDI_SWITCH:
324324
# for t in p.getSwitch():
325-
# properties[name][t.name] = self.__state_to_str_s[t.s]
325+
# properties[name][t.getName()] = self.__state_to_str_s[t.getState()]
326326
# elif p.getType() == PyIndi.INDI_LIGHT:
327327
# for t in p.getLight():
328-
# properties[name][t.name] = self.__state_to_str_p[t.s]
328+
# properties[name][t.getName()] = self.__state_to_str_p[t.getState()]
329329
# elif p.getType() == PyIndi.INDI_BLOB:
330330
# pass
331331
# #for t in p.getBLOB():
@@ -729,7 +729,7 @@ def set_number(self, device, name, values, sync=True, timeout=None):
729729
#logger.info('Name: %s, values: %s', name, str(values))
730730
c = self.get_control(device, name, 'number')
731731
for control_name, index in self.__map_indexes(c, values.keys()).items():
732-
c[index].value = values[control_name]
732+
c[index].setValue(values[control_name])
733733

734734
self.sendNewNumber(c)
735735

@@ -745,15 +745,15 @@ def set_switch(self, device, name, on_switches=[], off_switches=[], sync=True, t
745745
is_exclusive = c.getRule() == PyIndi.ISR_ATMOST1 or c.getRule() == PyIndi.ISR_1OFMANY
746746
if is_exclusive :
747747
on_switches = on_switches[0:1]
748-
off_switches = [s.name for s in c if s.name not in on_switches]
748+
off_switches = [s.getName() for s in c if s.getName() not in on_switches]
749749

750750
for index in range(0, len(c)):
751751
current_state = c[index].getState()
752752
new_state = current_state
753753

754-
if c[index].name in on_switches:
754+
if c[index].getName() in on_switches:
755755
new_state = PyIndi.ISS_ON
756-
elif is_exclusive or c[index].name in off_switches:
756+
elif is_exclusive or c[index].getName() in off_switches:
757757
new_state = PyIndi.ISS_OFF
758758

759759
c[index].setState(new_state)
@@ -766,7 +766,7 @@ def set_switch(self, device, name, on_switches=[], off_switches=[], sync=True, t
766766
def set_text(self, device, control_name, values, sync=True, timeout=None):
767767
c = self.get_control(device, control_name, 'text')
768768
for control_name, index in self.__map_indexes(c, values.keys()).items():
769-
c[index].text = values[control_name]
769+
c[index].setText(values[control_name])
770770

771771
self.sendNewText(c)
772772

@@ -777,19 +777,19 @@ def set_text(self, device, control_name, values, sync=True, timeout=None):
777777

778778

779779
def values(self, device, ctl_name, ctl_type):
780-
return dict(map(lambda c: (c.name, c.value), self.get_control(device, ctl_name, ctl_type)))
780+
return dict(map(lambda c: (c.getName(), c.getValue()), self.get_control(device, ctl_name, ctl_type)))
781781

782782

783783
def switch_values(self, device, name, ctl=None):
784784
return self.__control2dict(device, name, 'switch', lambda c: {'value': c.getState() == PyIndi.ISS_ON}, ctl)
785785

786786

787787
def text_values(self, device, name, ctl=None):
788-
return self.__control2dict(device, name, 'text', lambda c: {'value': c.text}, ctl)
788+
return self.__control2dict(device, name, 'text', lambda c: {'value': c.getText()}, ctl)
789789

790790

791791
def number_values(self, device, name, ctl=None):
792-
return self.__control2dict(device, name, 'text', lambda c: {'value': c.value, 'min': c.min, 'max': c.max, 'step': c.step, 'format': c.format}, ctl)
792+
return self.__control2dict(device, name, 'text', lambda c: {'value': c.getValue(), 'min': c.min, 'max': c.max, 'step': c.step, 'format': c.format}, ctl)
793793

794794

795795
def light_values(self, device, name, ctl=None):
@@ -830,15 +830,15 @@ def __wait_for_ctl_statuses(self, ctl, statuses=[PyIndi.IPS_OK, PyIndi.IPS_IDLE]
830830
def __map_indexes(self, ctl, values):
831831
result = {}
832832
for i, c in enumerate(ctl):
833-
#logger.info('Value name: %s', c.name) # useful to find value names
834-
if c.name in values:
835-
result[c.name] = i
833+
#logger.info('Value name: %s', c.getName()) # useful to find value names
834+
if c.getName() in values:
835+
result[c.getName()] = i
836836
return result
837837

838838

839839
def __control2dict(self, device, control_name, control_type, transform, control=None):
840840
def get_dict(element):
841-
dest = {'name': element.name, 'label': element.label}
841+
dest = {'name': element.getName(), 'label': element.getLabel()}
842842
dest.update(transform(element))
843843
return dest
844844

indi_allsky/flask/forms.py

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from sqlalchemy import func
3131
#from sqlalchemy.types import DateTime
3232
#from sqlalchemy.types import Date
33-
#from sqlalchemy.orm.exc import NoResultFound
33+
from sqlalchemy.orm.exc import NoResultFound
3434

3535
from flask import current_app as app
3636

@@ -40,6 +40,8 @@
4040
from .models import IndiAllSkyDbKeogramTable
4141
from .models import IndiAllSkyDbStarTrailsTable
4242
from .models import IndiAllSkyDbStarTrailsVideoTable
43+
from .models import IndiAllSkyDbFitsImageTable
44+
from .models import IndiAllSkyDbRawImageTable
4345

4446
from . import db
4547

@@ -1384,6 +1386,8 @@ class IndiAllskyImageViewer(FlaskForm):
13841386
DAY_SELECT = SelectField('Day', choices=[], validators=[])
13851387
HOUR_SELECT = SelectField('Hour', choices=[], validators=[])
13861388
IMG_SELECT = SelectField('Image', choices=[], validators=[])
1389+
FITS_SELECT = SelectField('FITS', choices=[], validators=[]) # hidden
1390+
RAW_SELECT = SelectField('RAW', choices=[], validators=[]) # hidden
13871391
FILTER_DETECTIONS = BooleanField('Detections')
13881392

13891393

@@ -1508,26 +1512,51 @@ def getImages(self, year, month, day, hour):
15081512
.filter(createDate_hour == hour)\
15091513
.order_by(IndiAllSkyDbImageTable.createDate.desc())
15101514

1511-
images_choices = []
1512-
for i in images_query:
1515+
images_choices = list()
1516+
fits_choices = list()
1517+
raw_choices = list()
1518+
for i, img in enumerate(images_query):
15131519
try:
1514-
uri = i.getUri()
1520+
uri = img.getUri()
15151521
except ValueError as e:
15161522
app.logger.error('Error determining relative file name: %s', str(e))
15171523
continue
15181524

1519-
if i.detections:
1520-
entry_str = '{0:s} [*]'.format(i.createDate.strftime('%H:%M:%S'))
1525+
if img.detections:
1526+
entry_str = '{0:s} [*]'.format(img.createDate.strftime('%H:%M:%S'))
15211527
else:
1522-
entry_str = i.createDate.strftime('%H:%M:%S')
1528+
entry_str = img.createDate.strftime('%H:%M:%S')
15231529

1524-
entry = (str(uri), entry_str)
1530+
images_choices.append((str(uri), entry_str))
15251531

1526-
images_choices.append(entry)
15271532

1533+
# look for fits
1534+
try:
1535+
fits_image = IndiAllSkyDbFitsImageTable.query\
1536+
.filter(IndiAllSkyDbFitsImageTable.createDate == img.createDate)\
1537+
.one()
1538+
1539+
fits_select = (str(fits_image.getUri()), i)
1540+
except NoResultFound:
1541+
fits_select = ('None', str(i))
1542+
1543+
fits_choices.append(fits_select)
15281544

1529-
return images_choices
15301545

1546+
# look for raw
1547+
try:
1548+
fits_image = IndiAllSkyDbRawImageTable.query\
1549+
.filter(IndiAllSkyDbRawImageTable.createDate == img.createDate)\
1550+
.one()
1551+
1552+
raw_select = (str(fits_image.getUri()), i)
1553+
except NoResultFound:
1554+
raw_select = ('None', i)
1555+
1556+
raw_choices.append(raw_select)
1557+
1558+
1559+
return images_choices, fits_choices, raw_choices
15311560

15321561

15331562

@@ -1548,6 +1577,8 @@ def __init__(self, *args, **kwargs):
15481577
self.DAY_SELECT.choices = (('', 'None'),)
15491578
self.HOUR_SELECT.choices = (('', 'None'),)
15501579
self.IMG_SELECT.choices = (('', 'None'),)
1580+
self.FITS_SELECT.choices = (('', 'None'),)
1581+
self.RAW_SELECT.choices = (('', 'None'),)
15511582

15521583
return
15531584

@@ -1564,7 +1595,11 @@ def __init__(self, *args, **kwargs):
15641595
self.MONTH_SELECT.choices = self.getMonths(year)
15651596
self.DAY_SELECT.choices = self.getDays(year, month)
15661597
self.HOUR_SELECT.choices = self.getHours(year, month, day)
1567-
self.IMG_SELECT.choices = self.getImages(year, month, day, hour)
1598+
1599+
img_select, fits_select, raw_select = self.getImages(year, month, day, hour)
1600+
self.IMG_SELECT.choices = img_select
1601+
self.FITS_SELECT.choices = fits_select
1602+
self.RAW_SELECT.choices = raw_select
15681603

15691604
dates_elapsed_s = time.time() - dates_start
15701605
app.logger.info('Dates processed in %0.4f s', dates_elapsed_s)

indi_allsky/flask/miscDb.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from .models import IndiAllSkyDbKeogramTable
1414
from .models import IndiAllSkyDbStarTrailsTable
1515
from .models import IndiAllSkyDbStarTrailsVideoTable
16+
from .models import IndiAllSkyDbFitsImageTable
17+
from .models import IndiAllSkyDbRawImageTable
1618

1719
from sqlalchemy.orm.exc import NoResultFound
1820

@@ -358,6 +360,84 @@ def addStarTrailVideo(self, filename, camera_id, dayDate, timeofday='night'):
358360
return startrail_video
359361

360362

363+
def addFitsImage(self, filename, camera_id, createDate, exposure, gain, binmode, night=True):
364+
if not filename:
365+
return
366+
367+
p_filename = Path(filename)
368+
if not p_filename.exists():
369+
logger.warning('File not found: %s', p_filename)
370+
371+
372+
if night:
373+
# day date for night is offset by 12 hours
374+
dayDate = (createDate - datetime.timedelta(hours=12)).date()
375+
else:
376+
dayDate = createDate.date()
377+
378+
379+
logger.info('Adding fits image %s to DB', filename)
380+
381+
382+
filename_str = str(filename) # might be a pathlib object
383+
384+
385+
fits_image = IndiAllSkyDbFitsImageTable(
386+
camera_id=camera_id,
387+
filename=filename_str,
388+
createDate=createDate,
389+
exposure=exposure,
390+
gain=gain,
391+
binmode=binmode,
392+
dayDate=dayDate,
393+
night=night,
394+
)
395+
396+
db.session.add(fits_image)
397+
db.session.commit()
398+
399+
return fits_image
400+
401+
402+
def addRawImage(self, filename, camera_id, createDate, exposure, gain, binmode, night=True):
403+
if not filename:
404+
return
405+
406+
p_filename = Path(filename)
407+
if not p_filename.exists():
408+
logger.warning('File not found: %s', p_filename)
409+
410+
411+
if night:
412+
# day date for night is offset by 12 hours
413+
dayDate = (createDate - datetime.timedelta(hours=12)).date()
414+
else:
415+
dayDate = createDate.date()
416+
417+
418+
logger.info('Adding raw image %s to DB', filename)
419+
420+
421+
filename_str = str(filename) # might be a pathlib object
422+
423+
424+
fits_image = IndiAllSkyDbRawImageTable(
425+
camera_id=camera_id,
426+
filename=filename_str,
427+
createDate=createDate,
428+
exposure=exposure,
429+
gain=gain,
430+
binmode=binmode,
431+
dayDate=dayDate,
432+
night=night,
433+
)
434+
435+
db.session.add(fits_image)
436+
db.session.commit()
437+
438+
return fits_image
439+
440+
361441
def addUploadedFlag(self, entry):
362442
entry.uploaded = True
363443
db.session.commit()

0 commit comments

Comments
 (0)