Commit 527116ca235e81f2d6b8d39cc373dbfdb95fd071

Authored by Alain Klotz
0 parents
Exists in master

first commit

.gitignore 0 → 100644
  1 +++ a/.gitignore
... ... @@ -0,0 +1,7 @@
  1 +__pycache__
  2 +de421.bsp
  3 +photometrie1.txt
  4 +requirements.txt
  5 +
  6 +# fichiers mac
  7 +.DS_Store
... ...
LICENCE 0 → 100644
  1 +++ a/LICENCE
... ... @@ -0,0 +1,31 @@
  1 +Copyright (c) 2022-2022, Astroguita Developers
  2 +
  3 +All rights reserved.
  4 +
  5 +Redistribution and use in source and binary forms,
  6 +with or without modification,
  7 +are permitted provided that the following conditions are met:
  8 +
  9 +Redistributions of source code must retain the above copyright notice,
  10 +this list of conditions and the following disclaimer.
  11 +
  12 +Redistributions in binary form must reproduce the above copyright notice,
  13 +this list of conditions and the following disclaimer in the documentation
  14 +and/or other materials provided with the distribution.
  15 +
  16 +Neither the name of the Astroguita Team nor the names of its contributors
  17 +may be used to endorse or promote products derived from this software
  18 +without specific prior written permission.
  19 +
  20 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21 +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  22 +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23 +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
  24 +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
  25 +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
  26 +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27 +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  28 +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  29 +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30 +POSSIBILITY OF SUCH DAMAGE.
  31 +
... ...
MANIFEST.in 0 → 100644
  1 +++ a/MANIFEST.in
... ... @@ -0,0 +1,2 @@
  1 +include README.md
  2 +include LICENSE
0 3 \ No newline at end of file
... ...
README.md 0 → 100644
  1 +++ a/README.md
... ... @@ -0,0 +1,40 @@
  1 +# Guitastro Camera BASLER library
  2 +
  3 +GUITAstro stands for General Use of Instruments and Telescopes in ASTROnomy.
  4 +
  5 +GuitAstro is a Python module that provides classes and methods to write easily Python scripts for astronomical observations.
  6 +
  7 +[GIT repository: https://gitlab.irap.omp.eu/guitastrolib/guitastro.git](https://gitlab.irap.omp.eu/guitastrolib/guitastro.git)
  8 +
  9 +Guitastro Camera BASLER complete Guitastro to provide access to BASLER camera drivers:
  10 +
  11 +[GIT repository: https://gitlab.irap.omp.eu/guitastrolib/guitastro_device_deltatau.git](https://gitlab.irap.omp.eu/guitastrolib/guitastro_device_deltatau.git)
  12 +
  13 +## Few basic examples of use
  14 +
  15 +First example: To connect a DeltaTau controler and slew a telescope:
  16 +```
  17 +import guitastro
  18 +import guitastro_device_deltatau
  19 +
  20 +dev = guitastro_device_deltatau.Device_Deltatau()
  21 +dev.open(False)
  22 +dev.commandstring("mount SET target 'RADEC 12h56m -10d23m'")
  23 +dev.commandstring("mount DO RADEC_GOTO")
  24 +```
  25 +
  26 +## Guitastro functionalities
  27 +
  28 +GuitAstro device DeltaTau wraps the driver functions dispatched into the classe:
  29 +
  30 +- **Device_Deltatau**: Manage device DeltaTau drivers.
  31 +
  32 +This class inheritate from the classes Component* of Guitastro.
  33 +As a consequece, it is needed to install Guitastro before using Guitastro DeltaTau.
  34 +
  35 +A complete documentation can be generated from .rst files in the folder doc/doc_rst
  36 +
  37 +## Support and contact
  38 +
  39 +The main author is alain.klotz@irap.omp.eu
  40 +
... ...
docs/.gitignore 0 → 100644
  1 +++ a/docs/.gitignore
... ... @@ -0,0 +1 @@
  1 +build
... ...
docs/Makefile 0 → 100644
  1 +++ a/docs/Makefile
... ... @@ -0,0 +1,20 @@
  1 +# Minimal makefile for Sphinx documentation
  2 +#
  3 +
  4 +# You can set these variables from the command line, and also
  5 +# from the environment for the first two.
  6 +SPHINXOPTS ?=
  7 +SPHINXBUILD ?= sphinx-build
  8 +SOURCEDIR = source
  9 +BUILDDIR = build
  10 +
  11 +# Put it first so that "make" without argument is like "make help".
  12 +help:
  13 + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
  14 +
  15 +.PHONY: help Makefile
  16 +
  17 +# Catch-all target: route all unknown targets to Sphinx using the new
  18 +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
  19 +%: Makefile
  20 + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
... ...
docs/make.bat 0 → 100644
  1 +++ a/docs/make.bat
... ... @@ -0,0 +1,49 @@
  1 +@echo off
  2 +
  3 +echo This batch must be launched with PowerShell in administrator mode.
  4 +call :ResolvePath path_guitastro %cd%\..
  5 +echo Guitastro Camera ASCOM in the directory %path_guitastro%
  6 +
  7 +rem Search where is Anaconda
  8 +set path_anacondas=c:\Users\%USERNAME%\Anaconda3 C:\ProgramData\Anaconda3
  9 +for %%p in (%path_anacondas%) do (
  10 + rem echo %%p
  11 + if exist %%p (
  12 + rem file exists
  13 + set path_anaconda=%%p
  14 + )
  15 +)
  16 +echo Anaconda found in the directory %path_anaconda%
  17 +
  18 +rem pyreverse
  19 +set pyreverse=%path_anaconda%\Scripts\pyreverse
  20 +echo ===== Analyze source code with %pyreverse%
  21 +echo cd %path_guitastro%\src
  22 +cd %path_guitastro%\src
  23 +echo %pyreverse% -p guitastro_device_deltatau -o png guitastro_device_deltatau
  24 +%pyreverse% -p guitastro_device_deltatau -o png guitastro_device_deltatau
  25 +echo move classes_guitastro_device_deltatau.png %path_guitastro%\docs\source\doc_images\generated
  26 +move classes_guitastro_device_deltatau.png %path_guitastro%\docs\source\doc_images\generated
  27 +echo move packages_guitastro_device_deltatau.png %path_guitastro%\docs\source\doc_images\generated
  28 +move packages_guitastro_device_deltatau.png %path_guitastro%\docs\source\doc_images\generated
  29 +
  30 +rem sphinx
  31 +echo Compile doc with sphinx
  32 +set sphinx=%path_anaconda%\Scripts\sphinx-build.exe
  33 +echo ===== Compile doc with %sphinx%
  34 +echo cd %path_guitastro%\docs
  35 +cd %path_guitastro%\docs
  36 +echo %sphinx% -b html .\source .\build\html
  37 +%sphinx% -b html .\source .\build\html
  38 +%sphinx% -b pdf .\source .\build\pdf
  39 +
  40 +exit /b
  41 +rem === Functions ===
  42 +
  43 +rem Resolve path to absolute.
  44 +rem Param 1: Name of output variable.
  45 +rem Param 2: Path to resolve.
  46 +rem Return: Resolved absolute path.
  47 +:ResolvePath
  48 + set %1=%~dpfn2
  49 + exit /b
... ...
docs/make_doc 0 → 100644
  1 +++ a/docs/make_doc
... ... @@ -0,0 +1,29 @@
  1 +#!/bin/bash
  2 +
  3 +# Step 1) (if not done) change the file attribute:
  4 +# > chmod +x make_doc
  5 +# Step 2) execute the file:
  6 +# > ./make_doc
  7 +
  8 +echo
  9 +echo "-- generating guitastro_device_deltatau UML class diagrams (with pyreverse)"
  10 +echo
  11 +cd ../src
  12 +pyreverse -p guitastro_device_deltatau -o png guitastro_device_deltatau
  13 +mv classes_guitastro_device_deltatau.png ../docs/source/doc_images/generated/
  14 +mv packages_guitastro_device_deltatau.png ../docs/source/doc_images/generated/
  15 +
  16 +cd ../docs
  17 +
  18 +echo
  19 +echo "-- Generating guitastro_device_deltatau API doc in HTML format (from RST with sphinx)"
  20 +echo "-- You can open this doc by pointing your browser to docs/build/html/index.html (from guitastro_device_deltatau dir)"
  21 +echo
  22 +sphinx-build -b html ./source/ ./build/html/
  23 +
  24 +echo
  25 +echo "-- Generating guitastro_device_deltatau API doc in PDF format (from RST with sphinx)"
  26 +echo "-- You can open this doc by opening docs/build/pdf/guitastro_device_deltatau.pdf (from guitastro_device_deltatau dir)"
  27 +echo
  28 +sphinx-build -b pdf ./source/ ./build/pdf/
  29 +
... ...
docs/source/autodoc_guitastro.rst 0 → 100644
  1 +++ a/docs/source/autodoc_guitastro.rst
... ... @@ -0,0 +1,17 @@
  1 +*************************************
  2 +Classes for GuitAstro Device DeltaTau
  3 +*************************************
  4 +
  5 +This section is the documentation for developpers of classes related to GuitAstro Device DeltaTau.
  6 +
  7 +This page is generated according the docstrings of the python code.
  8 +It displays only public methods of classes.
  9 +
  10 +.. image:: doc_images/generated/classes_guitastro_device_deltatau.png
  11 +
  12 +.. image:: doc_images/generated/packages_guitastro_device_deltatau.png
  13 +
  14 +Module guitastro_device_deltatau
  15 +================================
  16 +
  17 +.. automodule:: guitastro_device_deltatau
... ...
docs/source/conf.py 0 → 100644
  1 +++ a/docs/source/conf.py
... ... @@ -0,0 +1,385 @@
  1 +# astromecca documentation build configuration file, created by
  2 +# sphinx-quickstart on Sun Jun 26 00:00:43 2016.
  3 +#
  4 +# This file is execfile()d with the current directory set to its
  5 +# containing dir.
  6 +#
  7 +# Note that not all possible configuration values are present in this
  8 +# autogenerated file.
  9 +#
  10 +# All configuration values have a default; values that are commented out
  11 +# serve to show the default.
  12 +
  13 +# If extensions (or modules to document with autodoc) are in another directory,
  14 +# add these directories to sys.path here. If the directory is relative to the
  15 +# documentation root, use os.path.abspath to make it absolute, like shown here.
  16 +#
  17 +# import os
  18 +# import sys
  19 +# sys.path.insert(0, os.path.abspath('.'))
  20 +
  21 +# -- General configuration ------------------------------------------------
  22 +
  23 +# If your documentation needs a minimal Sphinx version, state it here.
  24 +#
  25 +# needs_sphinx = '1.0'
  26 +
  27 +# Add any Sphinx extension module names here, as strings. They can be
  28 +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
  29 +# ones.
  30 +extensions = []
  31 +
  32 +# Add any paths that contain templates here, relative to this directory.
  33 +templates_path = ['_templates']
  34 +
  35 +# The suffix(es) of source filenames.
  36 +# You can specify multiple suffix as a list of string:
  37 +#
  38 +# source_suffix = ['.rst', '.md']
  39 +source_suffix = '.rst'
  40 +
  41 +# The encoding of source files.
  42 +#
  43 +# source_encoding = 'utf-8-sig'
  44 +
  45 +# The master toctree document.
  46 +master_doc = 'index'
  47 +
  48 +# General information about the project.
  49 +project = u'GuitAstro Device DeltaTau'
  50 +copyright = u'2022, IRAP'
  51 +author = u'A. Klotz'
  52 +
  53 +# The version info for the project you're documenting, acts as replacement for
  54 +# |version| and |release|, also used in various other places throughout the
  55 +# built documents.
  56 +#
  57 +# The short X.Y version.
  58 +version = u'1.0'
  59 +# The full version, including alpha/beta/rc tags.
  60 +release = u'1.0.0'
  61 +
  62 +# The language for content autogenerated by Sphinx. Refer to documentation
  63 +# for a list of supported languages.
  64 +#
  65 +# This is also used if you do content translation via gettext catalogs.
  66 +# Usually you set "language" from the command line for these cases.
  67 +language = 'en'
  68 +
  69 +# There are two options for replacing |today|: either, you set today to some
  70 +# non-false value, then it is used:
  71 +#
  72 +# today = ''
  73 +#
  74 +# Else, today_fmt is used as the format for a strftime call.
  75 +#
  76 +# today_fmt = '%B %d, %Y'
  77 +
  78 +# List of patterns, relative to source directory, that match files and
  79 +# directories to ignore when looking for source files.
  80 +# These patterns also affect html_static_path and html_extra_path
  81 +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
  82 +
  83 +# The reST default role (used for this markup: `text`) to use for all
  84 +# documents.
  85 +#
  86 +# default_role = None
  87 +
  88 +# If true, '()' will be appended to :func: etc. cross-reference text.
  89 +#
  90 +# add_function_parentheses = True
  91 +
  92 +# If true, the current module name will be prepended to all description
  93 +# unit titles (such as .. function::).
  94 +#
  95 +# add_module_names = True
  96 +
  97 +# If true, sectionauthor and moduleauthor directives will be shown in the
  98 +# output. They are ignored by default.
  99 +#
  100 +# show_authors = False
  101 +
  102 +# The name of the Pygments (syntax highlighting) style to use.
  103 +pygments_style = 'sphinx'
  104 +
  105 +# A list of ignored prefixes for module index sorting.
  106 +# modindex_common_prefix = []
  107 +
  108 +# If true, keep warnings as "system message" paragraphs in the built documents.
  109 +# keep_warnings = False
  110 +
  111 +# If true, `todo` and `todoList` produce output, else they produce nothing.
  112 +todo_include_todos = False
  113 +
  114 +
  115 +# -- Options for HTML output ----------------------------------------------
  116 +
  117 +# The theme to use for HTML and HTML Help pages. See the documentation for
  118 +# a list of builtin themes.
  119 +#
  120 +html_theme = 'alabaster'
  121 +
  122 +# Theme options are theme-specific and customize the look and feel of a theme
  123 +# further. For a list of options available for each theme, see the
  124 +# documentation.
  125 +#
  126 +# html_theme_options = {}
  127 +
  128 +# Add any paths that contain custom themes here, relative to this directory.
  129 +# html_theme_path = []
  130 +
  131 +# The name for this set of Sphinx documents.
  132 +# "<project> v<release> documentation" by default.
  133 +#
  134 +# html_title = u'astromecca vastromecca'
  135 +
  136 +# A shorter title for the navigation bar. Default is the same as html_title.
  137 +#
  138 +# html_short_title = None
  139 +
  140 +# The name of an image file (relative to this directory) to place at the top
  141 +# of the sidebar.
  142 +#
  143 +# html_logo = None
  144 +
  145 +# The name of an image file (relative to this directory) to use as a favicon of
  146 +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
  147 +# pixels large.
  148 +#
  149 +# html_favicon = None
  150 +
  151 +# Add any paths that contain custom static files (such as style sheets) here,
  152 +# relative to this directory. They are copied after the builtin static files,
  153 +# so a file named "default.css" will overwrite the builtin "default.css".
  154 +# html_static_path = ['_static']
  155 +
  156 +# Add any extra paths that contain custom files (such as robots.txt or
  157 +# .htaccess) here, relative to this directory. These files are copied
  158 +# directly to the root of the documentation.
  159 +#
  160 +# html_extra_path = []
  161 +
  162 +# If not None, a 'Last updated on:' timestamp is inserted at every page
  163 +# bottom, using the given strftime format.
  164 +# The empty string is equivalent to '%b %d, %Y'.
  165 +#
  166 +# html_last_updated_fmt = None
  167 +
  168 +# Custom sidebar templates, maps document names to template names.
  169 +#
  170 +# html_sidebars = {}
  171 +
  172 +# Additional templates that should be rendered to pages, maps page names to
  173 +# template names.
  174 +#
  175 +# html_additional_pages = {}
  176 +
  177 +# If false, no module index is generated.
  178 +#
  179 +# html_domain_indices = True
  180 +
  181 +# If false, no index is generated.
  182 +#
  183 +# html_use_index = True
  184 +
  185 +# If true, the index is split into individual pages for each letter.
  186 +#
  187 +# html_split_index = False
  188 +
  189 +# If true, links to the reST sources are added to the pages.
  190 +#
  191 +# html_show_sourcelink = True
  192 +
  193 +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
  194 +#
  195 +# html_show_sphinx = True
  196 +
  197 +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
  198 +#
  199 +# html_show_copyright = True
  200 +
  201 +# If true, an OpenSearch description file will be output, and all pages will
  202 +# contain a <link> tag referring to it. The value of this option must be the
  203 +# base URL from which the finished HTML is served.
  204 +#
  205 +# html_use_opensearch = ''
  206 +
  207 +# This is the file name suffix for HTML files (e.g. ".xhtml").
  208 +# html_file_suffix = None
  209 +
  210 +# Language to be used for generating the HTML full-text search index.
  211 +# Sphinx supports the following languages:
  212 +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
  213 +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
  214 +#
  215 +# html_search_language = 'en'
  216 +
  217 +# A dictionary with options for the search language support, empty by default.
  218 +# 'ja' uses this config value.
  219 +# 'zh' user can custom change `jieba` dictionary path.
  220 +#
  221 +# html_search_options = {'type': 'default'}
  222 +
  223 +# The name of a javascript file (relative to the configuration directory) that
  224 +# implements a search results scorer. If empty, the default will be used.
  225 +#
  226 +# html_search_scorer = 'scorer.js'
  227 +
  228 +# Output file base name for HTML help builder.
  229 +htmlhelp_basename = 'guitastro_device_deltatau'
  230 +
  231 +# -- Options for LaTeX output ---------------------------------------------
  232 +
  233 +latex_elements = {
  234 + # The paper size ('letterpaper' or 'a4paper').
  235 + #
  236 + # 'papersize': 'letterpaper',
  237 +
  238 + # The font size ('10pt', '11pt' or '12pt').
  239 + #
  240 + # 'pointsize': '10pt',
  241 +
  242 + # Additional stuff for the LaTeX preamble.
  243 + #
  244 + # 'preamble': '',
  245 +
  246 + # Latex figure (float) alignment
  247 + #
  248 + # 'figure_align': 'htbp',
  249 +}
  250 +
  251 +# Grouping the document tree into LaTeX files. List of tuples
  252 +# (source start file, target name, title,
  253 +# author, documentclass [howto, manual, or own class]).
  254 +latex_documents = [
  255 + (master_doc, 'guitastro_device_deltatau.tex', u'Guitastro Device DeltaTau Documentation',
  256 + u'guitastro_device_deltatau', 'manual'),
  257 +]
  258 +
  259 +# The name of an image file (relative to this directory) to place at the top of
  260 +# the title page.
  261 +#
  262 +# latex_logo = None
  263 +
  264 +# If true, show page references after internal links.
  265 +#
  266 +# latex_show_pagerefs = False
  267 +
  268 +# If true, show URL addresses after external links.
  269 +#
  270 +# latex_show_urls = False
  271 +
  272 +# Documents to append as an appendix to all manuals.
  273 +#
  274 +# latex_appendices = []
  275 +
  276 +# If false, no module index is generated.
  277 +#
  278 +# latex_domain_indices = True
  279 +
  280 +
  281 +# -- Options for manual page output ---------------------------------------
  282 +
  283 +# One entry per manual page. List of tuples
  284 +# (source start file, name, description, authors, manual section).
  285 +man_pages = [
  286 + (master_doc, 'guitastro_device_deltatau', u'guitastro Device DeltaTau Documentation',
  287 + [author], 1)
  288 +]
  289 +
  290 +# If true, show URL addresses after external links.
  291 +#
  292 +# man_show_urls = False
  293 +
  294 +
  295 +# -- Options for Texinfo output -------------------------------------------
  296 +
  297 +# Grouping the document tree into Texinfo files. List of tuples
  298 +# (source start file, target name, title, author,
  299 +# dir menu entry, description, category)
  300 +texinfo_documents = [
  301 + (master_doc, 'guitastro_device_deltatau', u'guitastro Device DeltaTau Documentation',
  302 + author, 'guitastro_device_deltatau', 'One line description of project.',
  303 + 'Miscellaneous'),
  304 +]
  305 +
  306 +# Documents to append as an appendix to all manuals.
  307 +#
  308 +# texinfo_appendices = []
  309 +
  310 +# If false, no module index is generated.
  311 +#
  312 +# texinfo_domain_indices = True
  313 +
  314 +# How to display URL addresses: 'footnote', 'no', or 'inline'.
  315 +#
  316 +# texinfo_show_urls = 'footnote'
  317 +
  318 +# If true, do not generate a @detailmenu in the "Top" node's menu.
  319 +#
  320 +# texinfo_no_detailmenu = False
  321 +
  322 +# -- A random example -----------------------------------------------------
  323 +
  324 +import sys, os
  325 +sys.path.insert(0, os.path.abspath('../../src'))
  326 +sys.path.insert(0, os.path.abspath('../../../guitastro/src')) # guitastro must be also present
  327 +print(f"============ sys.path={sys.path}")
  328 +# exclude_patterns = ['zzz']
  329 +
  330 +numfig = True
  331 +#language = 'ja'
  332 +
  333 +extensions.append('sphinx.ext.todo')
  334 +extensions.append('sphinx.ext.autodoc')
  335 +#extensions.append('sphinx.ext.autosummary')
  336 +extensions.append('sphinx.ext.intersphinx')
  337 +extensions.append('sphinx.ext.mathjax')
  338 +extensions.append('sphinx.ext.viewcode')
  339 +extensions.append('sphinx.ext.graphviz')
  340 +try:
  341 + extensions.append('sphinx_pyreverse')
  342 +except ModuleNotFoundError:
  343 + pass # pip install sphinx_pyreverse
  344 +
  345 +try:
  346 + import rst2pdf
  347 + extensions.append('rst2pdf.pdfbuilder')
  348 +except ModuleNotFoundError:
  349 + pass # no rst2pdf for you
  350 +extensions.append('sphinx.ext.napoleon')
  351 +# Napoleon settings
  352 +napoleon_google_docstring = True
  353 +napoleon_numpy_docstring = True
  354 +napoleon_include_init_with_doc = False
  355 +napoleon_include_private_with_doc = False
  356 +napoleon_include_special_with_doc = True
  357 +napoleon_use_admonition_for_examples = False
  358 +napoleon_use_admonition_for_notes = False
  359 +napoleon_use_admonition_for_references = False
  360 +napoleon_use_ivar = False
  361 +napoleon_use_param = True
  362 +napoleon_use_rtype = True
  363 +napoleon_preprocess_types = False
  364 +napoleon_type_aliases = None
  365 +napoleon_attr_annotations = True
  366 +
  367 +autodoc_typehints = "description"
  368 +
  369 +pdf_documents = [
  370 + ('index', u'guitastro_device_deltatau', u'Guitastro Device DeltaTau', u'Alain Klotz'),
  371 +]
  372 +
  373 +pdf_documents = [('index', u'guitastro_device_deltatau', u'Guitastro Device DeltaTau', u'Alain Klotz')]
  374 +
  375 +# A comma-separated list of custom stylesheets. Example:
  376 +pdf_stylesheets = ['sphinx', 'kerning', 'a4', 'twocolumn']
  377 +
  378 +# pip install sphinx rst2pdf build pdf docs
  379 +pdf_use_index = False
  380 +
  381 +autosummary_generate = True
  382 +html_theme = 'default'
  383 +#html_theme = "nature"
  384 +#html_theme = "alabaster"
  385 +#source_suffix = ['.rst', '.txt']
... ...
docs/source/doc_images/.gitignore 0 → 100644
  1 +++ a/docs/source/doc_images/.gitignore
... ... @@ -0,0 +1,2 @@
  1 +classes_guitastro.png
  2 +packages_guitastro.png
0 3 \ No newline at end of file
... ...
docs/source/doc_images/deltatau1.jpg 0 → 100644

19 KB

docs/source/doc_images/generated/.gitignore 0 → 100644
  1 +++ a/docs/source/doc_images/generated/.gitignore
... ... @@ -0,0 +1,2 @@
  1 +*
  2 +!.gitignore
... ...
docs/source/generate_documentation.rst 0 → 100644
  1 +++ a/docs/source/generate_documentation.rst
... ... @@ -0,0 +1,74 @@
  1 +********************************************
  2 +Generate this documentation
  3 +********************************************
  4 +
  5 +This documentation is generated by the use of Sphinx and Pyreverse.
  6 +Sphinx uses the `Restructured Text format <https://en.wikipedia.org/wiki/ReStructuredText>`_.
  7 +The following links gives some informations about the syntax:
  8 +
  9 + * `Tutorial Sphinx 1 <https://deusyss.developpez.com/tutoriels/Python/SphinxDoc/>`_.
  10 + * `Tutorial Sphinx 2 <https://www.mankier.com/1/sphinx-all>`_.
  11 + * `Tutorial documentation <https://www.codeflow.site/fr/article/documenting-python-code>`_.
  12 + * `Tutorial reST <https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html>`_.
  13 + * `Tutorial Napoleon extension <https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html#module-sphinx.ext.napoleon>`_.
  14 + * `Pandoc to convert many formats into reST <https://pandoc.org/>`_.
  15 +
  16 +Installation of Sphinx and Pyreverse
  17 +***********************************************
  18 +
  19 +For Linux users
  20 +===============
  21 +
  22 +.. code-block:: bash
  23 +
  24 + sudo apt-get install graphviz graphviz-dev
  25 + cd ~/Documents/guitastro/install
  26 + python3 -m pip install -r requirements_dev.txt
  27 +
  28 +For Windows users
  29 +=================
  30 +
  31 +First you must download and install `Graphviz <https://graphviz.org/>`_.
  32 +
  33 +Open a Powershell as administrator.
  34 +A quick way to open Powershell as administrator is
  35 +Win+R (execute commands) and put:
  36 +
  37 +.. code-block:: bash
  38 +
  39 + powershell Start-Process powershell -Verb runAs
  40 +
  41 +Then, in the Powershell terminal:
  42 +
  43 +.. code-block:: bash
  44 +
  45 + cd C:\Users\xxx\Documents\guitastro\install
  46 + python -m pip install -r requirements_dev.txt
  47 +
  48 +Generate the documentation
  49 +***********************************************
  50 +
  51 +To generate the documentation you must use the doc_rst batch. It starts to execute pyreverse
  52 +and then sphinx.
  53 +
  54 +Procedure for Linux. Open a terminal:
  55 +
  56 +.. code-block:: bash
  57 +
  58 + cd ~/Documents/guitastro/doc/doc_rst/
  59 + ./make_doc
  60 +
  61 +make_doc will generate UML diagrams from the Python code, the html and the PDF documentations.
  62 +To generate only html and pdf documentation, you can use:
  63 +
  64 +.. code-block:: bash
  65 +
  66 + cd ~/Documents/guitastro/doc/doc_rst/
  67 + make html
  68 +
  69 +Procedure for Windows. Open a PowerShell as administrator:
  70 +
  71 +.. code-block:: bash
  72 +
  73 + cd C:\Users\xxx\Documents\guitastro\doc\doc_rst
  74 + .\make_doc
... ...
docs/source/guitastro_examples.rst 0 → 100644
  1 +++ a/docs/source/guitastro_examples.rst
... ... @@ -0,0 +1,53 @@
  1 +********************************************
  2 +Guitastro Device DeltaTau examples
  3 +********************************************
  4 +
  5 +
  6 +To execute the simple tests, first open a Python console and import guitastro and guitastro_device_deltatau:
  7 +
  8 +For Linux:
  9 +
  10 +.. code-block:: bash
  11 +
  12 + cd ~/Documents/guitastro_device_deltatau/src
  13 + python3
  14 +
  15 +.. code-block:: python
  16 +
  17 + >>> import guitastro
  18 + >>> import guitastro_device_deltatau
  19 +
  20 +For Windows (using powershell):
  21 +
  22 +.. code-block:: bash
  23 +
  24 + cd C:\Users\xxx\Documents\guitastro_device_deltatau\src
  25 + python
  26 +
  27 +.. code-block:: python
  28 +
  29 + >>> import guitastro
  30 + >>> import guitastro_device_deltatau
  31 +
  32 +
  33 +1. List Components of a device
  34 +**************************************
  35 +
  36 +.. code-block:: python
  37 +
  38 + >>> dev = guitastro_device_deltatau.Device_Deltatau("TCA")
  39 + >>> print("Components are:")
  40 + >>> for key, val in dev.components().items():
  41 + >>> print(f" * {key} of type {val[0]}")
  42 +
  43 +2. Open the connection and send commands
  44 +******************************************
  45 +
  46 +.. code-block:: python
  47 +
  48 + >>> dev = guitastro_device_deltatau.Device_Deltatau("TCA")
  49 + >>> dev.open(False)
  50 + >>> dev.commandstring("mount SET target 'RADEC 12h56m -10d23m'")
  51 + >>> dev.commandstring("mount DO RADEC_GOTO")
  52 + >>> res = dev.commandstring("mount GET motion")
  53 + >>> res = dev.commandstring("focuser GET motion")
... ...
docs/source/guitastro_simple_examples.rst 0 → 100644
  1 +++ a/docs/source/guitastro_simple_examples.rst
... ... @@ -0,0 +1,53 @@
  1 +********************************************
  2 +Guitastro Device DeltaTau simple examples
  3 +********************************************
  4 +
  5 +
  6 +To execute the simple tests, first open a Python console and import guitastro and guitastro_device_deltatau:
  7 +
  8 +For Linux:
  9 +
  10 +.. code-block:: bash
  11 +
  12 + cd ~/Documents/guitastro_device_deltatau/src
  13 + python3
  14 +
  15 +.. code-block:: python
  16 +
  17 + >>> import guitastro
  18 + >>> import guitastro_device_deltatau
  19 +
  20 +For Windows (using powershell):
  21 +
  22 +.. code-block:: bash
  23 +
  24 + cd C:\Users\xxx\Documents\guitastro_device_deltatau\src
  25 + python
  26 +
  27 +.. code-block:: python
  28 +
  29 + >>> import guitastro
  30 + >>> import guitastro_device_deltatau
  31 +
  32 +
  33 +1. List Components of a device
  34 +**************************************
  35 +
  36 +.. code-block:: python
  37 +
  38 + >>> dev = guitastro_device_deltatau.Device_Deltatau("TCA")
  39 + >>> print("Components are:")
  40 + >>> for key, val in dev.components().items():
  41 + >>> print(f" * {key} of type {val[0]}")
  42 +
  43 +2. Open the connection and send commands
  44 +******************************************
  45 +
  46 +.. code-block:: python
  47 +
  48 + >>> dev = guitastro_device_deltatau.Device_Deltatau("TCA")
  49 + >>> dev.open(False)
  50 + >>> dev.commandstring("mount SET target 'RADEC 12h56m -10d23m'")
  51 + >>> dev.commandstring("mount DO RADEC_GOTO")
  52 + >>> res = dev.commandstring("mount GET motion")
  53 + >>> res = dev.commandstring("focuser GET motion")
... ...
docs/source/index.rst 0 → 100644
  1 +++ a/docs/source/index.rst
... ... @@ -0,0 +1,81 @@
  1 +*************************************************************
  2 +Welcome in the GuitAstro Device DeltaTau module documentation
  3 +*************************************************************
  4 +
  5 +1. What is GuitAstro Device DeltaTau?
  6 +*************************************
  7 +
  8 +GuitAstro is a Python module that provides classes and methods
  9 +to write scripts for astronomical observations. GuitAstro wraps
  10 +the classical astronomical Python modules (AstroPy, etc.) and
  11 +adds functionalities.
  12 +
  13 +All information are provided in the Git repository `https://gitlab.irap.omp.eu/aklotz/guitastro.git <https://gitlab.irap.omp.eu/aklotz/guitastro.git>`_.
  14 +
  15 +GuitAstro Device DeltaTau is a complement of GuitAstro to add
  16 +the class device_deltatau. By this way, it is possible to
  17 +use mount, filter wheel and focuser driven by DeltaTau.
  18 +
  19 +`DeltaTau <http://www.observatorysciences.co.uk/deltatau.php/>`_ provides a motion controler between application
  20 +(as GuitAstro) to drive telescope motors.
  21 +
  22 +.. figure:: doc_images/deltatau1.jpg
  23 + :height: 100px
  24 + :align: center
  25 +
  26 + DeltaTau Logo.
  27 +
  28 +2. Installation of Guitastro Device DeltaTau
  29 +*********************************************
  30 +
  31 +See the documentation of `GuitAstro <https://gitlab.irap.omp.eu/aklotz/guitastro.git>`_.
  32 +The principles are exactly the same. The main folder guitastro_device_deltatau must lie at
  33 +the same tree level than guitastro as shown below:
  34 +
  35 +.. code-block:: bash
  36 +
  37 + guitastro_packages/
  38 + |---guitastro/
  39 + | ...
  40 + |---guitastro_device_deltatau/
  41 + | ...
  42 +
  43 +3. External resources
  44 +*********************
  45 +
  46 +No external source is needed.
  47 +
  48 +4. Some very simple tests
  49 +*************************
  50 +
  51 +.. toctree::
  52 + :maxdepth: 3
  53 +
  54 + guitastro_simple_examples
  55 +
  56 +5. Example collection
  57 +*********************
  58 +
  59 +.. toctree::
  60 + :maxdepth: 3
  61 +
  62 + guitastro_examples
  63 +
  64 +6. Class and method documentation
  65 +***********************************
  66 +
  67 +For developers of Python code of GuitAstro:
  68 +
  69 +.. toctree::
  70 + :maxdepth: 3
  71 +
  72 + generate_documentation
  73 +
  74 +The classes of GuitAstro Devices DeltaTau.
  75 +
  76 +.. toctree::
  77 + :maxdepth: 3
  78 +
  79 + autodoc_guitastro
  80 +
  81 +
... ...
setup.py 0 → 100644
  1 +++ a/setup.py
... ... @@ -0,0 +1,79 @@
  1 +#!/usr/bin/env python
  2 +# -*- coding: utf-8 -*-
  3 +#
  4 +# === To install with setup.py
  5 +# git https://gitlab.irap.omp.eu/aklotz/guitastro_camera_basler.git
  6 +# cd guitastro_camera_basler
  7 +# python setup.py install
  8 +#
  9 +# === To check it is installed:
  10 +# Windows: pip freeze | findstr guitastro_camera_basler
  11 +# Linux: pip freeze | grep guitastro_camera_basler
  12 +#
  13 +# === To uninstall:
  14 +# pip uninstall guitastro_camera_basler
  15 +#
  16 +from setuptools import setup, find_packages
  17 +import os
  18 +
  19 +__version__ = '0.1'
  20 +python_cmd='python'
  21 +
  22 +def copy_file(file_in, file_out):
  23 + # used by generate_requirements
  24 + with open(file_in, 'r') as fid:
  25 + lines = fid.readlines()
  26 + with open(file_out, 'w') as fid:
  27 + fid.writelines(lines)
  28 +
  29 +def compile_requirements(python_cmd='python', requirement_in_file='requirements.in'):
  30 + # used by generate_requirements
  31 + os.system('python -m pip install --no-input pip-tools')
  32 + import piptools
  33 + #infile = os.path.join(os.getcwd(), requirement_in_file)
  34 + command = f"{python_cmd} -m piptools compile {requirement_in_file}"
  35 + print(f"compile_requirements: {command}")
  36 + os.system(command)
  37 + root, ext = os.path.splitext(requirement_in_file)
  38 + requirement_file = root + ".txt"
  39 + print(f"compile_requirements: {requirement_file} is generated.")
  40 + return requirement_file
  41 +
  42 +def read_requirements(requirement_file='requirements.txt'):
  43 + # used by generate_requirements
  44 + requirements = []
  45 + with open(requirement_file, 'r') as fid:
  46 + lines = fid.readlines()
  47 + for line in lines:
  48 + line = line.strip()
  49 + if len(line) < 1:
  50 + continue
  51 + if line[0] == "#":
  52 + continue
  53 + requirements.append(line)
  54 + return requirements
  55 +
  56 +def generate_requirements(python_cmd='python', requirement_gen = 'requirements'):
  57 + # copy .in from install
  58 + requirement_in_file = requirement_gen + ".in"
  59 + copy_file(os.path.join('install', requirement_in_file), requirement_in_file)
  60 + # compile .in
  61 + requirement_file = compile_requirements(python_cmd, requirement_in_file)
  62 + # read .txt
  63 + requirements = read_requirements(requirement_file)
  64 + os.remove(requirement_in_file)
  65 + return requirements
  66 +
  67 +requirements = generate_requirements(python_cmd, 'requirements')
  68 +
  69 +setup(
  70 + name='guitastro_camera_basler',
  71 + version=__version__,
  72 + description='General Use of Instruments and Telescopes in ASTROnomy Camera BALSER',
  73 + author='Alain klotz',
  74 + author_email='aklotz@irap.omp.eu',
  75 + url='https://gitlab.irap.omp.eu/aklotz/guitastro_camera_basler.git',
  76 + install_requires=requirements,
  77 + package_dir = {'': 'src'},
  78 + packages=['guitastro_camera_basler'],
  79 +)
... ...
src/guitastro_device_deltatau/__init__.py 0 → 100644
  1 +++ a/src/guitastro_device_deltatau/__init__.py
... ... @@ -0,0 +1,15 @@
  1 +"""
  2 +guitastro_device_deltatau.device_deltatau
  3 +-------------------------------------------
  4 +.. automodule:: guitastro_device_deltatau.device_deltatau
  5 + :members:
  6 +
  7 +"""
  8 +from __future__ import (absolute_import, division, print_function,
  9 + unicode_literals)
  10 +
  11 +import glob
  12 +import os
  13 +
  14 +from .device_deltatau import Device_Deltatau
  15 +
... ...
src/guitastro_device_deltatau/component_detector_focuser_deltatau.py 0 → 100644
  1 +++ a/src/guitastro_device_deltatau/component_detector_focuser_deltatau.py
... ... @@ -0,0 +1,88 @@
  1 +# -*- coding: utf-8 -*-
  2 +import os
  3 +import sys
  4 +
  5 +try:
  6 + # guitastro is installed with setup.py
  7 + from guitastro import ComponentDetectorFocuser, ComponentException
  8 +except:
  9 + # guitastro is installed with only requirements.in
  10 + # guitastro_camera_* folders must be copied at the same root folder than guitastro
  11 + pwd = os.getcwd()
  12 + short_paths = ['../../../guitastro/src']
  13 + for short_path in short_paths:
  14 + path = os.path.abspath(os.path.join(pwd, short_path))
  15 + if path not in sys.path:
  16 + sys.path.insert(0, path)
  17 + from guitastro.component import ComponentException
  18 + from guitastro.component_detector_focuser import ComponentDetectorFocuser
  19 +
  20 +# #####################################################################
  21 +# #####################################################################
  22 +# #####################################################################
  23 +# Class Component Detector Focuser DeltaTau
  24 +# #####################################################################
  25 +# #####################################################################
  26 +# #####################################################################
  27 +
  28 +class ComponentDetectorFocuserDeltatau(ComponentDetectorFocuser):
  29 + """Component for Detector focuser Deltatau
  30 +
  31 + Usage : ComponentDetectorFocuserDeltatau("Z", name="test")
  32 + """
  33 +
  34 + def _my_do(self, *args, **kwargs):
  35 + value = None
  36 + operation = args[0].upper()
  37 + operations = list(self.prop()['DO'].keys())
  38 + if operation not in operations:
  39 + msg = f"{operation} not found amongst {operations}"
  40 + raise ComponentException(ComponentException.ERR_OPERATION_NOT_FOUND, msg)
  41 + # ---
  42 + axis_foc = self._param["CONTROLLER_FOCUS_ID"]
  43 + if operation == "GOTO":
  44 + self._verify_chan()
  45 + target = float(args[1])
  46 + # transform to native command to start the goto
  47 + cmd = f"#{axis_foc}p={target}"
  48 + self.log = cmd
  49 + self._chan.put_chan(cmd)
  50 + # Launch a thread to wait the end of pointing and trig the drift
  51 + elif operation == "COORD":
  52 + # transform to native command to get coords
  53 + cmd = f"#{axis_foc}p"
  54 + self.log = cmd
  55 + value = float(self._chan.put_chan(cmd))
  56 + if operation == "STOP":
  57 + self._verify_chan()
  58 + # transform to native command to stop
  59 + cmd = f"#{axis_foc}k"
  60 + self.log = cmd
  61 + self._chan.put_chan(cmd)
  62 + return value
  63 +
  64 +# #####################################################################
  65 +# #####################################################################
  66 +# #####################################################################
  67 +# Main
  68 +# #####################################################################
  69 +# #####################################################################
  70 +# #####################################################################
  71 +
  72 +if __name__ == "__main__":
  73 + default = 0
  74 + example = input(f"Select the example (0 to 0) ({default}) ")
  75 + try:
  76 + example = int(example)
  77 + except:
  78 + example = default
  79 +
  80 + print("Example = {}".format(example))
  81 +
  82 + if example == 0:
  83 + """
  84 + Basic example
  85 + """
  86 + comp = ComponentDetectorFocuserDeltatau("Z", name="test")
  87 + comp.verbose = 1
  88 + res = comp.command("DO", "STOP")
... ...
src/guitastro_device_deltatau/component_mount_pointing_deltatau.py 0 → 100644
  1 +++ a/src/guitastro_device_deltatau/component_mount_pointing_deltatau.py
... ... @@ -0,0 +1,94 @@
  1 +# -*- coding: utf-8 -*-
  2 +import os
  3 +import sys
  4 +
  5 +try:
  6 + # guitastro is installed with setup.py
  7 + from guitastro import ComponentMountPointing, ComponentException
  8 +except:
  9 + # guitastro is installed with only requirements.in
  10 + # guitastro_camera_* folders must be copied at the same root folder than guitastro
  11 + pwd = os.getcwd()
  12 + short_paths = ['../../../guitastro/src']
  13 + for short_path in short_paths:
  14 + path = os.path.abspath(os.path.join(pwd, short_path))
  15 + if path not in sys.path:
  16 + sys.path.insert(0, path)
  17 + from guitastro.component import ComponentException
  18 + from guitastro.component_mount_pointing import ComponentMountPointing
  19 +
  20 +# #####################################################################
  21 +# #####################################################################
  22 +# #####################################################################
  23 +# Class Component Mount Pointing DeltaTau
  24 +# #####################################################################
  25 +# #####################################################################
  26 +# #####################################################################
  27 +
  28 +class ComponentMountPointingDeltatau(ComponentMountPointing):
  29 + """Component for Mount Pointing Deltatau
  30 +
  31 + Usage : ComponentMountPointingDeltatau("HADEC", name="test")
  32 + """
  33 +
  34 + def _my_do(self, *args, **kwargs):
  35 + value = None
  36 + operation = args[0].upper()
  37 + operations = list(self.prop()['DO'].keys())
  38 + if operation not in operations:
  39 + msg = f"{operation} not found amongst {operations}"
  40 + raise ComponentException(ComponentException.ERR_OPERATION_NOT_FOUND, msg)
  41 + # ---
  42 + axis_ha = self._param["CONTROLLER_BASE_ID"]
  43 + axis_dec = self._param["CONTROLLER_POLAR_ID"]
  44 + if operation == "RADEC_GOTO":
  45 + self._verify_chan()
  46 + #target = self._param["target"]
  47 + ra, dec, equinox, epoch, dra, ddec = kwargs['computed']
  48 + # transform to native command to start the goto
  49 + cmd = f"#{axis_ha}p=123456 #{axis_dec}p=123456"
  50 + self.log = cmd
  51 + self._chan.put_chan(cmd)
  52 + # Launch a thread to wait the end of pointing and trig the drift
  53 + elif operation == "RADEC_COORD":
  54 + # transform to native command to get coords
  55 + cmd = f"#{axis_ha}p #{axis_dec}p"
  56 + self.log = cmd
  57 + values = self._chan.put_chan(cmd)
  58 + ha_adu = float(values[0])
  59 + dec_adu = float(values[1])
  60 + value = f"{ha_adu} {dec_adu}"
  61 + value = "12h00m45.78s -06d55m23.2s"
  62 + if operation == "STOP":
  63 + self._verify_chan()
  64 + # transform to native command to stop
  65 + cmd = f"#{axis_ha}k #{axis_dec}k"
  66 + self.log = cmd
  67 + self._chan.put_chan(cmd)
  68 + return value
  69 +
  70 +# #####################################################################
  71 +# #####################################################################
  72 +# #####################################################################
  73 +# Main
  74 +# #####################################################################
  75 +# #####################################################################
  76 +# #####################################################################
  77 +
  78 +if __name__ == "__main__":
  79 + default = 0
  80 + example = input(f"Select the example (0 to 0) ({default}) ")
  81 + try:
  82 + example = int(example)
  83 + except:
  84 + example = default
  85 +
  86 + print("Example = {}".format(example))
  87 +
  88 + if example == 0:
  89 + """
  90 + Basic example
  91 + """
  92 + comp = ComponentMountPointingDeltatau("HADEC", name="test")
  93 + comp.verbose = 1
  94 + res = comp.command("DO", "STOP")
... ...
src/guitastro_device_deltatau/device_deltatau.py 0 → 100644
  1 +++ a/src/guitastro_device_deltatau/device_deltatau.py
... ... @@ -0,0 +1,244 @@
  1 +# -*- coding: utf-8 -*-
  2 +import os
  3 +import sys
  4 +import shlex
  5 +
  6 +try:
  7 + from .component_detector_focuser_deltatau import ComponentDetectorFocuserDeltatau
  8 +except:
  9 + from component_detector_focuser_deltatau import ComponentDetectorFocuserDeltatau
  10 +
  11 +try:
  12 + from .component_mount_pointing_deltatau import ComponentMountPointingDeltatau
  13 +except:
  14 + from component_mount_pointing_deltatau import ComponentMountPointingDeltatau
  15 +
  16 +try:
  17 + # guitastro is installed with setup.py
  18 + from guitastro import Communication, GuitastroException, GuitastroTools, Ephemeris
  19 +except:
  20 + # guitastro is installed with only requirements.in
  21 + # guitastro_camera_* folders must be copied at the same root folder than guitastro
  22 + pwd = os.getcwd()
  23 + short_paths = ['../../../guitastro/src']
  24 + for short_path in short_paths:
  25 + path = os.path.abspath(os.path.join(pwd, short_path))
  26 + if path not in sys.path:
  27 + sys.path.insert(0, path)
  28 + from guitastro.communications import Communication
  29 + from guitastro.guitastrotools import GuitastroException, GuitastroTools
  30 + from guitastro.ephemeris import Ephemeris
  31 +
  32 +# #####################################################################
  33 +# #####################################################################
  34 +# #####################################################################
  35 +# Class Device_Deltatau
  36 +# #####################################################################
  37 +# #####################################################################
  38 +# #####################################################################
  39 +
  40 +class Device_DeltatauException(GuitastroException):
  41 +
  42 + ERR_FILE_NOT_EXISTS = 0
  43 + ERR_COMMAND = 1
  44 + ERR_COMPONENT_NOT_FOUND = 2
  45 +
  46 + errors = [""]*3
  47 + errors[ERR_FILE_NOT_EXISTS] = "The named file was not found"
  48 + errors[ERR_COMMAND] = "Command error"
  49 + errors[ERR_COMPONENT_NOT_FOUND] = "Component not found"
  50 +
  51 +
  52 +class Device_Deltatau(Device_DeltatauException, GuitastroTools):
  53 + """Driver for device DeltaTau
  54 +
  55 + All commands are linked to the same communication channel
  56 + """
  57 +
  58 + _real = False
  59 + _chan = None
  60 +
  61 +# =====================================================================
  62 +# =====================================================================
  63 +# Private methods
  64 +# =====================================================================
  65 +# =====================================================================
  66 +
  67 +# =====================================================================
  68 +# =====================================================================
  69 +# Methods for experimented users (debug, etc)
  70 +# =====================================================================
  71 +# =====================================================================
  72 +
  73 +# =====================================================================
  74 +# =====================================================================
  75 +# Methods for users
  76 +# =====================================================================
  77 +# =====================================================================
  78 +
  79 + def open(self, real:bool):
  80 + self._real = real
  81 + if self._chan == None:
  82 + host = dev._unit_params["HOST"]
  83 + port = dev._unit_params["PORT"]
  84 + chan = Communication("TCP", HOSTNAME = host, PORT = port, DELAY_PUT_READ = 0.1, REAL = real)
  85 + chan.open_chan()
  86 + self._chan = chan
  87 + # - set the channel to all components
  88 + components = self.components(True)
  89 + for component in components:
  90 + self._comp[component].channel = chan
  91 +
  92 + def close(self):
  93 + if self._real == True:
  94 + del(self._chan)
  95 + self._chan = None
  96 + # - reset the channel to all components
  97 + components = self.components(True)
  98 + for component in components:
  99 + self._comp[component].channel = None
  100 +
  101 + def components(self, just_names: bool=False):
  102 + """ Return a dictionary of components
  103 +
  104 + The key is the name of the component.
  105 + The value is a tupple:
  106 +
  107 + * category
  108 + * Python access to the object
  109 +
  110 + """
  111 + if just_names==True:
  112 + return list(self._comp.keys())
  113 + dico = {}
  114 + for name, comp in self._comp.items():
  115 + category = comp.category
  116 + dico[name] = (category, comp)
  117 + return dico
  118 +
  119 + def commandstring(self, cmd:str):
  120 + """Execute a command as a string entry
  121 + """
  122 + cmds = shlex.split(cmd)
  123 + component_name = cmds[0]
  124 + action = cmds[1].upper()
  125 + args = cmds[2:]
  126 + return self.command(component_name, action, *args)
  127 +
  128 + def command(self, component_name:str, action:str, *args, **kwargs):
  129 + """Execute a command as a string entry
  130 + """
  131 + components = self.components(True)
  132 + if component_name not in components:
  133 + msg = f"Component {component_name} not found amongst {components}"
  134 + raise Device_DeltatauException(Device_DeltatauException.ERR_COMPONENT_NOT_FOUND, msg)
  135 + try:
  136 + result = self._comp[component_name].command(action, *args, **kwargs)
  137 + except:
  138 + msg = f"Problem with component {component_name} command {action} {args} {kwargs}"
  139 + raise Device_DeltatauException(Device_DeltatauException.ERR_COMMAND, msg)
  140 + return result
  141 +
  142 +# =====================================================================
  143 +# =====================================================================
  144 +# Special methods
  145 +# =====================================================================
  146 +# =====================================================================
  147 +
  148 + def __init__(self, *args, **kwargs):
  149 + """
  150 + Conversion from Uniform Python object into protocol language
  151 + Usage : Mountastro("HADEC", name="SCX11")
  152 + """
  153 + # === Decode params
  154 + # --- Use the __init__ of the parent class Mountastro
  155 + #super(Device_Deltatau,self).__init__(*args, **kwargs)
  156 + # --- Special params for this mount
  157 + # --- Dicos of optional and mandatory parameters
  158 + params_optional = {}
  159 + # --- special SCX11 for TALK function
  160 + params_optional["NAME"] = (str, "Unknown")
  161 + params_optional["CONTROLLER_BASE_ID"] = (int, 1)
  162 + params_optional["CONTROLLER_POLAR_ID"] = (int, 2)
  163 + params_optional["CONTROLLER_FOCUS_ID"] = (int, 3)
  164 + params_optional["CONTROLLER_FILTER_ID"] = (int, 4)
  165 +
  166 + # --- Dico of unit_types and their parameters
  167 + unit_types = {}
  168 + # --- unit choice
  169 + unit_types["TCA"] = {"MANDATORY" : {}, "OPTIONAL" : {"HOST":[str,"192.168.30.41"], "PORT":[int,1025]} }
  170 + unit_types["TCH"] = {"MANDATORY" : {}, "OPTIONAL" : {"HOST":[str,"192.168.10.46"], "PORT":[int,1025]} }
  171 + # --- Decode args and kwargs parameters
  172 + self._unit_params = self.decode_args_kwargs(0, unit_types, params_optional, *args, **kwargs)
  173 + # ===
  174 + self.unit_type = self._unit_params["SELECTED_ARG"]
  175 + name = self._unit_params["NAME"]
  176 + # --- init ephemeris
  177 + eph = Ephemeris()
  178 + if self.unit_type=="TCA":
  179 + eph.set_home("910")
  180 + name = self.unit_type
  181 + lim_inf = 1000
  182 + lim_sup = 33000
  183 + elif self.unit_type=="TCH":
  184 + eph.set_home("262")
  185 + name = self.unit_type
  186 + lim_inf = 1000
  187 + lim_sup = 33000
  188 + else:
  189 + name = self._unit_params["NAME"]
  190 + lim_inf = 1000
  191 + lim_sup = 33000
  192 + # === Instanciate components of the device
  193 + self._comp = {}
  194 + # --- init component detector focuser
  195 + self._comp["focuser"] = ComponentDetectorFocuserDeltatau("Z", name=name, model="Umac", manufacturer="DeltaTau", description="4 axis controler", lim_inf=lim_inf, lim_sup=lim_sup)
  196 + self._comp["focuser"].command("SET", "lim_inf", lim_inf)
  197 + self._comp["focuser"].command("SET", "lim_sup", lim_sup)
  198 + self._comp["focuser"].command("SET", "CONTROLLER_FOCUS_ID", self._unit_params["CONTROLLER_FOCUS_ID"])
  199 + # --- init component mount pointing
  200 + self._comp["mount"] = ComponentMountPointingDeltatau("HADEC", name=name, model="Umac", manufacturer="DeltaTau", description="4 axis controler", configuration="fork")
  201 + self._comp["mount"]._eph.set_home(eph.home.gps)
  202 + self._comp["mount"].command("SET", "CONTROLLER_BASE_ID", self._unit_params["CONTROLLER_BASE_ID"])
  203 + self._comp["mount"].command("SET", "CONTROLLER_POLAR_ID", self._unit_params["CONTROLLER_POLAR_ID"])
  204 +
  205 + def __del__(self):
  206 + try:
  207 + self.close()
  208 + except:
  209 + pass
  210 +
  211 +# #####################################################################
  212 +# #####################################################################
  213 +# #####################################################################
  214 +# Main
  215 +# #####################################################################
  216 +# #####################################################################
  217 +# #####################################################################
  218 +
  219 +if __name__ == "__main__":
  220 + default = 0
  221 + example = input(f"Select the example (0 to 0) ({default}) ")
  222 + try:
  223 + example = int(example)
  224 + except:
  225 + example = default
  226 +
  227 + print("Example = {}".format(example))
  228 +
  229 + if example == 0:
  230 + """
  231 + Basic example
  232 + """
  233 + #home = Home("GPS 2.0375 E 43.6443484725 136.9")
  234 + #site = Siteobs(home)
  235 + dev = Device_Deltatau("TCA")
  236 + print("Components are:")
  237 + for key, val in dev.components().items():
  238 + print(f" * {key} of type {val[0]}")
  239 + dev.open(False)
  240 + dev.commandstring("mount SET target 'RADEC 12h56m -10d23m'")
  241 + dev.commandstring("mount DO RADEC_GOTO")
  242 + res = dev.commandstring("mount GET motion")
  243 + res = dev.commandstring("focuser GET motion")
  244 +
... ...