Compare commits
23 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0626f26fea | ||
|
2a3032d4e7 | ||
|
1fbdae751c | ||
|
7ec82f80d1 | ||
39a3e8913f | |||
|
74f2be739d | ||
|
8200022240 | ||
|
3784fc13f6 | ||
|
e11169ae7f | ||
f58e5e5e81 | |||
|
1d605fe1af | ||
|
8b7b5c9816 | ||
3794431fd3 | |||
4208f5eb79 | |||
a58cc1b5c0 | |||
44072438eb | |||
d06748f486 | |||
5168d4e2e5 | |||
e136533b57 | |||
03cbb257e3 | |||
766680a8dc | |||
30007ff93f | |||
|
5430d0503f |
4
.gitignore
vendored
4
.gitignore
vendored
@ -3,6 +3,9 @@ __pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
#visual studio
|
||||
.vs/
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
@ -127,6 +130,7 @@ venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
scada-marmi/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
|
251
LICENSE
Normal file
251
LICENSE
Normal file
@ -0,0 +1,251 @@
|
||||
?<html>
|
||||
<head>
|
||||
<title>The Code Project Open License (CPOL)</title>
|
||||
<Style>
|
||||
BODY, P, TD { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt }
|
||||
H1,H2,H3,H4,H5 { color: #ff9900; font-weight: bold; }
|
||||
H1 { font-size: 14pt;color:black }
|
||||
H2 { font-size: 13pt; }
|
||||
H3 { font-size: 12pt; }
|
||||
H4 { font-size: 10pt; color: black; }
|
||||
PRE { BACKGROUND-COLOR: #FBEDBB; FONT-FAMILY: "Courier New", Courier, mono; WHITE-SPACE: pre; }
|
||||
CODE { COLOR: #990000; FONT-FAMILY: "Courier New", Courier, mono; }
|
||||
.SpacedList li { padding: 5px 0px 5px 0px;}
|
||||
</style>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF" color=#000000>
|
||||
|
||||
<h1>The Code Project Open License (CPOL) 1.02</h1>
|
||||
<br />
|
||||
|
||||
<center>
|
||||
<div style="text-align: left; border: 2px solid #000000; width: 660; background-color: #FFFFD9; padding: 20px;">
|
||||
|
||||
<h2>Preamble</h2>
|
||||
<p>
|
||||
This License governs Your use of the Work. This License is intended to allow developers
|
||||
to use the Source Code and Executable Files provided as part of the Work in any
|
||||
application in any form.
|
||||
</p>
|
||||
<p>
|
||||
The main points subject to the terms of the License are:</p>
|
||||
<ul>
|
||||
<li>Source Code and Executable Files can be used in commercial applications;</li>
|
||||
<li>Source Code and Executable Files can be redistributed; and</li>
|
||||
<li>Source Code can be modified to create derivative works.</li>
|
||||
<li>No claim of suitability, guarantee, or any warranty whatsoever is provided. The software is
|
||||
provided "as-is".</li>
|
||||
<li>The Article accompanying the Work may not be distributed or republished without the
|
||||
Author's consent</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
This License is entered between You, the individual or other entity reading or otherwise
|
||||
making use of the Work licensed pursuant to this License and the individual or other
|
||||
entity which offers the Work under the terms of this License ("Author").</p>
|
||||
|
||||
<h2>License</h2>
|
||||
<p>
|
||||
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CODE PROJECT OPEN
|
||||
LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE
|
||||
LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT
|
||||
LAW IS PROHIBITED.</p>
|
||||
<p>
|
||||
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE TO BE
|
||||
BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS CONTAINED HEREIN
|
||||
IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. IF YOU DO NOT
|
||||
AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS LICENSE, YOU CANNOT MAKE ANY
|
||||
USE OF THE WORK.</p>
|
||||
|
||||
<ol class="SpacedList">
|
||||
<li><strong>Definitions.</strong>
|
||||
|
||||
<ol class="SpacedList" style="list-style-type: lower-alpha;">
|
||||
<li><strong>"Articles"</strong> means, collectively, all articles written by Author
|
||||
which describes how the Source Code and Executable Files for the Work may be used
|
||||
by a user.</li>
|
||||
<li><b>"Author"</b> means the individual or entity that offers the Work under the terms
|
||||
of this License.<strong></strong></li>
|
||||
<li><strong>"Derivative Work"</strong> means a work based upon the Work or upon the
|
||||
Work and other pre-existing works.</li>
|
||||
<li><b>"Executable Files"</b> refer to the executables, binary files, configuration
|
||||
and any required data files included in the Work.</li>
|
||||
<li>"<b>Publisher</b>" means the provider of the website, magazine, CD-ROM, DVD or other
|
||||
medium from or by which the Work is obtained by You.</li>
|
||||
<li><b>"Source Code"</b> refers to the collection of source code and configuration files
|
||||
used to create the Executable Files.</li>
|
||||
<li><b>"Standard Version"</b> refers to such a Work if it has not been modified, or
|
||||
has been modified in accordance with the consent of the Author, such consent being
|
||||
in the full discretion of the Author. </li>
|
||||
<li><b>"Work"</b> refers to the collection of files distributed by the Publisher, including
|
||||
the Source Code, Executable Files, binaries, data files, documentation, whitepapers
|
||||
and the Articles. </li>
|
||||
<li><b>"You"</b> is you, an individual or entity wishing to use the Work and exercise
|
||||
your rights under this License.
|
||||
</li>
|
||||
</ol>
|
||||
</li>
|
||||
|
||||
<li><strong>Fair Use/Fair Use Rights.</strong> Nothing in this License is intended to
|
||||
reduce, limit, or restrict any rights arising from fair use, fair dealing, first
|
||||
sale or other limitations on the exclusive rights of the copyright owner under copyright
|
||||
law or other applicable laws.
|
||||
</li>
|
||||
|
||||
<li><strong>License Grant.</strong> Subject to the terms and conditions of this License,
|
||||
the Author hereby grants You a worldwide, royalty-free, non-exclusive, perpetual
|
||||
(for the duration of the applicable copyright) license to exercise the rights in
|
||||
the Work as stated below:
|
||||
|
||||
<ol class="SpacedList" style="list-style-type: lower-alpha;">
|
||||
<li>You may use the standard version of the Source Code or Executable Files in Your
|
||||
own applications. </li>
|
||||
<li>You may apply bug fixes, portability fixes and other modifications obtained from
|
||||
the Public Domain or from the Author. A Work modified in such a way shall still
|
||||
be considered the standard version and will be subject to this License.</li>
|
||||
<li>You may otherwise modify Your copy of this Work (excluding the Articles) in any
|
||||
way to create a Derivative Work, provided that You insert a prominent notice in
|
||||
each changed file stating how, when and where You changed that file.</li>
|
||||
<li>You may distribute the standard version of the Executable Files and Source Code
|
||||
or Derivative Work in aggregate with other (possibly commercial) programs as part
|
||||
of a larger (possibly commercial) software distribution. </li>
|
||||
<li>The Articles discussing the Work published in any form by the author may not be
|
||||
distributed or republished without the Author's consent. The author retains
|
||||
copyright to any such Articles. You may use the Executable Files and Source Code
|
||||
pursuant to this License but you may not repost or republish or otherwise distribute
|
||||
or make available the Articles, without the prior written consent of the Author.</li>
|
||||
</ol>
|
||||
|
||||
Any subroutines or modules supplied by You and linked into the Source Code or Executable
|
||||
Files of this Work shall not be considered part of this Work and will not be subject
|
||||
to the terms of this License.
|
||||
</li>
|
||||
|
||||
<li><strong>Patent License.</strong> Subject to the terms and conditions of this License,
|
||||
each Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
|
||||
irrevocable (except as stated in this section) patent license to make, have made, use, import,
|
||||
and otherwise transfer the Work.</li>
|
||||
|
||||
<li><strong>Restrictions.</strong> The license granted in Section 3 above is expressly
|
||||
made subject to and limited by the following restrictions:
|
||||
|
||||
<ol class="SpacedList" style="list-style-type: lower-alpha;">
|
||||
<li>You agree not to remove any of the original copyright, patent, trademark, and
|
||||
attribution notices and associated disclaimers that may appear in the Source Code
|
||||
or Executable Files. </li>
|
||||
<li>You agree not to advertise or in any way imply that this Work is a product of Your
|
||||
own. </li>
|
||||
<li>The name of the Author may not be used to endorse or promote products derived from
|
||||
the Work without the prior written consent of the Author.</li>
|
||||
<li>You agree not to sell, lease, or rent any part of the Work. This does not restrict
|
||||
you from including the Work or any part of the Work inside a larger software
|
||||
distribution that itself is being sold. The Work by itself, though, cannot be sold,
|
||||
leased or rented.</li>
|
||||
<li>You may distribute the Executable Files and Source Code only under the terms of
|
||||
this License, and You must include a copy of, or the Uniform Resource Identifier
|
||||
for, this License with every copy of the Executable Files or Source Code You distribute
|
||||
and ensure that anyone receiving such Executable Files and Source Code agrees that
|
||||
the terms of this License apply to such Executable Files and/or Source Code. You
|
||||
may not offer or impose any terms on the Work that alter or restrict the terms of
|
||||
this License or the recipients' exercise of the rights granted hereunder. You
|
||||
may not sublicense the Work. You must keep intact all notices that refer to this
|
||||
License and to the disclaimer of warranties. You may not distribute the Executable
|
||||
Files or Source Code with any technological measures that control access or use
|
||||
of the Work in a manner inconsistent with the terms of this License. </li>
|
||||
<li>You agree not to use the Work for illegal, immoral or improper purposes, or on pages
|
||||
containing illegal, immoral or improper material. The Work is subject to applicable
|
||||
export laws. You agree to comply with all such laws and regulations that may apply
|
||||
to the Work after Your receipt of the Work.
|
||||
</li>
|
||||
</ol>
|
||||
</li>
|
||||
|
||||
<li><strong>Representations, Warranties and Disclaimer.</strong> THIS WORK IS PROVIDED
|
||||
"AS IS", "WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES
|
||||
OR CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, INCLUDING
|
||||
COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. AUTHOR EXPRESSLY
|
||||
DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES OR CONDITIONS, INCLUDING
|
||||
WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF MERCHANTABILITY, MERCHANTABLE QUALITY
|
||||
OR FITNESS FOR A PARTICULAR PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT,
|
||||
OR THAT THE WORK (OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF
|
||||
VIRUSES. YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE
|
||||
WORKS.
|
||||
</li>
|
||||
|
||||
<li><b>Indemnity. </b>You agree to defend, indemnify and hold harmless the Author and
|
||||
the Publisher from and against any claims, suits, losses, damages, liabilities,
|
||||
costs, and expenses (including reasonable legal or attorneys’ fees) resulting from
|
||||
or relating to any use of the Work by You.
|
||||
</li>
|
||||
|
||||
<li><strong>Limitation on Liability.</strong> EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
|
||||
LAW, IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL
|
||||
THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
|
||||
ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, EVEN IF THE AUTHOR
|
||||
OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
</li>
|
||||
|
||||
<li><strong>Termination.</strong>
|
||||
|
||||
<ol style="list-style-type: lower-alpha;">
|
||||
<li>This License and the rights granted hereunder will terminate automatically upon
|
||||
any breach by You of any term of this License. Individuals or entities who have
|
||||
received Derivative Works from You under this License, however, will not have their
|
||||
licenses terminated provided such individuals or entities remain in full compliance
|
||||
with those licenses. Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination
|
||||
of this License. </li>
|
||||
|
||||
<li>If You bring a copyright, trademark, patent or any other infringement claim against
|
||||
any contributor over infringements You claim are made by the Work, your License
|
||||
from such contributor to the Work ends automatically.</li>
|
||||
|
||||
<li>Subject to the above terms and conditions, this License is perpetual (for the duration
|
||||
of the applicable copyright in the Work). Notwithstanding the above, the Author
|
||||
reserves the right to release the Work under different license terms or to stop
|
||||
distributing the Work at any time; provided, however that any such election will
|
||||
not serve to withdraw this License (or any other license that has been, or is required
|
||||
to be, granted under the terms of this License), and this License will continue
|
||||
in full force and effect unless terminated as stated above.
|
||||
</li>
|
||||
</ol>
|
||||
</li>
|
||||
|
||||
<li><strong>Publisher</strong>. The parties hereby confirm that the Publisher shall
|
||||
not, under any circumstances, be responsible for and shall not have any liability
|
||||
in respect of the subject matter of this License. The Publisher makes no warranty
|
||||
whatsoever in connection with the Work and shall not be liable to You or any party
|
||||
on any legal theory for any damages whatsoever, including without limitation any
|
||||
general, special, incidental or consequential damages arising in connection to this
|
||||
license. The Publisher reserves the right to cease making the Work available to
|
||||
You at any time without notice</li>
|
||||
|
||||
<li><strong>Miscellaneous</strong>
|
||||
|
||||
<ol class="SpacedList" style="list-style-type: lower-alpha;">
|
||||
<li>This License shall be governed by the laws of the location of the head office of
|
||||
the Author or if the Author is an individual, the laws of location of the principal
|
||||
place of residence of the Author.</li>
|
||||
<li>If any provision of this License is invalid or unenforceable under applicable law,
|
||||
it shall not affect the validity or enforceability of the remainder of the terms
|
||||
of this License, and without further action by the parties to this License, such
|
||||
provision shall be reformed to the minimum extent necessary to make such provision
|
||||
valid and enforceable. </li>
|
||||
<li>No term or provision of this License shall be deemed waived and no breach consented
|
||||
to unless such waiver or consent shall be in writing and signed by the party to
|
||||
be charged with such waiver or consent. </li>
|
||||
<li>This License constitutes the entire agreement between the parties with respect to
|
||||
the Work licensed herein. There are no understandings, agreements or representations
|
||||
with respect to the Work not specified herein. The Author shall not be bound by
|
||||
any additional provisions that may appear in any communication from You. This License
|
||||
may not be modified without the mutual written agreement of the Author and You.
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
</div>
|
||||
</center>
|
||||
|
||||
</body>
|
||||
</html>
|
17
README.md
17
README.md
@ -1,2 +1,19 @@
|
||||
# advanced-python-homework-2023
|
||||
|
||||
# Окружение
|
||||
|
||||
Чтобы развернуть окружение для разработки с помощью conda:
|
||||
|
||||
conda env create -f environment.yml
|
||||
|
||||
conda activate scada-marmi
|
||||
|
||||
# Sphinx
|
||||
|
||||
sphinx-quickstart docs
|
||||
|
||||
sphinx-build -M html docs/source/ docs/build/
|
||||
|
||||
cd docs
|
||||
|
||||
./make html
|
||||
|
@ -0,0 +1,14 @@
|
||||
"""
|
||||
SCADA (Supervisory Control And Data Acquisition)
|
||||
|
||||
SCADA-системы нужны для организации сбора данных в реальном времени,
|
||||
диспетчерского контроля и автоматизации технологических процессов.
|
||||
|
||||
SCADA-системы решают следующие задачи:
|
||||
Обмен данными и их обработка в реальном времени.
|
||||
Логическое управление.
|
||||
Отображение информации на экране монитора в удобной и понятной для человека форме.
|
||||
Ведение базы данных с технологической информацией.
|
||||
Аварийная сигнализация и управление служебными сообщениями о неполадках.
|
||||
Подготовка и генерирование отчетов о ходе технологического процесса.
|
||||
"""
|
20
docs/Makefile
Normal file
20
docs/Makefile
Normal file
@ -0,0 +1,20 @@
|
||||
# Minimal makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line, and also
|
||||
# from the environment for the first two.
|
||||
SPHINXOPTS ?=
|
||||
SPHINXBUILD ?= sphinx-build
|
||||
SOURCEDIR = source
|
||||
BUILDDIR = build
|
||||
|
||||
# Put it first so that "make" without argument is like "make help".
|
||||
help:
|
||||
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||
|
||||
.PHONY: help Makefile
|
||||
|
||||
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||
%: Makefile
|
||||
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
35
docs/make.bat
Normal file
35
docs/make.bat
Normal file
@ -0,0 +1,35 @@
|
||||
@ECHO OFF
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=sphinx-build
|
||||
)
|
||||
set SOURCEDIR=source
|
||||
set BUILDDIR=build
|
||||
|
||||
%SPHINXBUILD% >NUL 2>NUL
|
||||
if errorlevel 9009 (
|
||||
echo.
|
||||
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
||||
echo.installed, then set the SPHINXBUILD environment variable to point
|
||||
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
||||
echo.may add the Sphinx directory to PATH.
|
||||
echo.
|
||||
echo.If you don't have Sphinx installed, grab it from
|
||||
echo.https://www.sphinx-doc.org/
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
||||
goto end
|
||||
|
||||
:help
|
||||
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
||||
|
||||
:end
|
||||
popd
|
54
docs/source/conf.py
Normal file
54
docs/source/conf.py
Normal file
@ -0,0 +1,54 @@
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# This file only contains a selection of the most common options. For a full
|
||||
# list see the documentation:
|
||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
# import os
|
||||
# import sys
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = 'scada'
|
||||
copyright = '2023, marmi'
|
||||
author = 'marmi'
|
||||
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.autodoc',
|
||||
'sphinx.ext.autosummary',
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = []
|
||||
|
||||
|
||||
# -- Options for HTML output -------------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'alabaster'
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
33
docs/source/index.rst
Normal file
33
docs/source/index.rst
Normal file
@ -0,0 +1,33 @@
|
||||
.. scada documentation master file, created by
|
||||
sphinx-quickstart on Thu Sep 28 15:37:18 2023.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
Welcome to scada's documentation!
|
||||
=================================
|
||||
**Scada** is my project. It offers a *simple* and
|
||||
*intuitive* interface.
|
||||
|
||||
.. note::
|
||||
|
||||
This project is under active development.
|
||||
|
||||
you can use the package ``controls``:
|
||||
|
||||
.. automodule: controls/__init__.py
|
||||
:members:
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Contents:
|
||||
|
||||
|
||||
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
13
environment.yml
Normal file
13
environment.yml
Normal file
@ -0,0 +1,13 @@
|
||||
# To set up a development environment using conda run:
|
||||
#
|
||||
# conda env create -f environment.yml
|
||||
# conda activate scada-marmi
|
||||
#
|
||||
name: scada-marmi
|
||||
channels:
|
||||
- conda-forge
|
||||
- anaconda
|
||||
dependencies:
|
||||
- sphinx
|
||||
- pylint
|
||||
- mypy
|
@ -1,9 +1,12 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional, Collection, Any
|
||||
from abc import abstractmethod
|
||||
from abc import ABC, abstractmethod
|
||||
from enum import IntEnum
|
||||
|
||||
class DeviceLifecycleState:
|
||||
pass # TODO(Homework #3)
|
||||
class DeviceLifecycleState(IntEnum):
|
||||
INIT = 0
|
||||
OPEN = 1
|
||||
CLOSE = 2
|
||||
|
||||
|
||||
class DevaceError(Exception):
|
||||
@ -33,8 +36,8 @@ class ActionDescriptor:
|
||||
info: Optional[str] = None
|
||||
|
||||
|
||||
class Device:
|
||||
# TODO(Homework #3)
|
||||
class Device(ABC):
|
||||
|
||||
_state = DeviceLifecycleState.INIT
|
||||
|
||||
@property
|
||||
@ -43,10 +46,14 @@ class Device:
|
||||
|
||||
def close(self):
|
||||
self._state = DeviceLifecycleState.CLOSE
|
||||
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def trait_descriptors(self) -> Collection[TraitDescriptor]:
|
||||
pass
|
||||
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def action_descriptors(self) -> Collection[ActionDescriptor]:
|
||||
pass
|
||||
|
@ -1,8 +1,77 @@
|
||||
import time
|
||||
from turtle import Turtle
|
||||
from controls.device import SynchronyDevice
|
||||
from equipment.device import SynchronyDevice
|
||||
from equipment.device import Device
|
||||
import inspect
|
||||
from typing import Optional, Collection, Any
|
||||
|
||||
class TurtleDevice(SynchronyDevice):
|
||||
pass # TODO(Homework #3)
|
||||
def open(self):
|
||||
super().open()
|
||||
self.turtle = Turtle()
|
||||
|
||||
def close (self):
|
||||
super().close()
|
||||
del self.turtle
|
||||
|
||||
@property
|
||||
def trait_descriptors(self):
|
||||
l = list()
|
||||
for i in inspect.getmembers(TurtleDevice):
|
||||
if not (i[0].startswith("__") or i[0].startswith("_")) and not inspect.isfunction(i[1]):
|
||||
l.append(i[0])
|
||||
return l
|
||||
|
||||
@property
|
||||
def action_descriptors(self):
|
||||
l = list()
|
||||
#print(inspect.getmembers(TurtleDevice))
|
||||
#for i in dir(TurtleDevice):
|
||||
# # print(type(getattr(TurtleDevice(), i))=='method')
|
||||
# # if not i.startswith("__") and type(getattr(TurtleDevice(), i)) == types.MethodType:
|
||||
# if not i.startswith("__") and inspect.isroutine(inspect.getattr_static(TurtleDevice, i)):
|
||||
# sig = inspect.signature(getattr(TurtleDevice, i))
|
||||
# l.append(i + " " + str(sig))
|
||||
#return l
|
||||
for i in inspect.getmembers(TurtleDevice):
|
||||
# print(type(getattr(TurtleDevice, i)))
|
||||
# print(type(getattr(TurtleDevice(), i))=='method')
|
||||
if not (i[0].startswith("__") or i[0].startswith("_")) and inspect.isfunction(i[1]):
|
||||
sig = inspect.signature(getattr(TurtleDevice, i[0]))
|
||||
l.append(i[0]+str(sig))
|
||||
return l
|
||||
|
||||
def execute(self, action_name: str, *args, **kwargs):
|
||||
"""Execute action `action_name`, using `args` and `kwargs` as action argument."""
|
||||
if self.state == 1:
|
||||
f = getattr(self.turtle, action_name)
|
||||
f(int(*args), **kwargs)
|
||||
else:
|
||||
print("It's not opened")
|
||||
self.open()
|
||||
#time.sleep(30)
|
||||
f = getattr(self.turtle, action_name)
|
||||
f(int(*args), **kwargs)
|
||||
|
||||
def read(self, trait_name: str):
|
||||
"""Read physical state of trait `trait_name` from device."""
|
||||
return getattr(self.turtle, trait_name)
|
||||
|
||||
def write(self, trait_name: str, value: Any) -> bool:
|
||||
"""Pass `value` to trait `trait_name` of device."""
|
||||
setattr(self.turtle, trait_name, value)
|
||||
|
||||
def invalidate(self, trait_name: str):
|
||||
"""Invalidate logical state of trait `trait_name`"""
|
||||
if self.read(trait_name) == self.__getitem__(trait_name):
|
||||
print("Everything's okey")
|
||||
else:
|
||||
print(f"Something went wrong with {trait_name}.")
|
||||
|
||||
def __getitem__(self, trait_name: str) -> Optional[Any]:
|
||||
"""Return logical state of trait `trait_name`."""
|
||||
return getattr(self, trait_name)
|
||||
|
||||
#print(inspect.getmembers(Turtle))
|
||||
#t = TurtleDevice()
|
||||
#print(t.execute("forward", 3))
|
||||
|
@ -1,5 +1,9 @@
|
||||
import cmd
|
||||
import threading
|
||||
from threading import Thread
|
||||
from threading import Event
|
||||
import argparse
|
||||
import time
|
||||
|
||||
from queue import Queue
|
||||
|
||||
@ -7,11 +11,29 @@ from equipment.turtle_device import TurtleDevice
|
||||
|
||||
|
||||
class TurtleDeviceThread(threading.Thread):
|
||||
# TODO(Homework 4)
|
||||
|
||||
# TODO(Homework 4) \begin
|
||||
def __message_processing__(self):
|
||||
while True:
|
||||
new_message = self.queue.get()
|
||||
#print(type(new_message))
|
||||
#print(new_message)
|
||||
#print("Name and args of action are {}".format(new_message))
|
||||
self.device.execute(*new_message)
|
||||
#time.sleep(30)
|
||||
self.queue.task_done()
|
||||
if self.event.is_set():
|
||||
break
|
||||
def __message_thread__(self):
|
||||
thread = Thread(target = self.__message_processing__, daemon=True)
|
||||
thread.start()
|
||||
# TODO(Homework 4) \end
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.device = TurtleDevice()
|
||||
self.queue = Queue()
|
||||
self.event = Event()
|
||||
|
||||
|
||||
class NoBlockingTurtleShell(cmd.Cmd):
|
||||
@ -20,14 +42,24 @@ class NoBlockingTurtleShell(cmd.Cmd):
|
||||
file = None
|
||||
|
||||
def __init__(self, turtle_thread: TurtleDeviceThread):
|
||||
pass # TODO(Homework 4)
|
||||
# TODO(Homework 4) \begin
|
||||
super(NoBlockingTurtleShell, self).__init__()
|
||||
turtle_thread.__message_thread__()
|
||||
# TODO(Homework 4) \end
|
||||
|
||||
def do_execute(self, arg):
|
||||
pass # TODO(Homework 4)
|
||||
# TODO(Homework 4) \begin
|
||||
turtle_thread.queue.put(parse(arg))
|
||||
# TODO(Homework 4) \end
|
||||
|
||||
def do_exit(self, arg):
|
||||
pass # TODO(Homework 4)
|
||||
# TODO(Homework 4) \begin
|
||||
turtle_thread.event.set()
|
||||
# TODO(Homework 4) \end
|
||||
|
||||
def parse(arg):
|
||||
'Convert a series of zero or more numbers to an argument tuple'
|
||||
return tuple(arg.split())
|
||||
|
||||
if __name__ == '__main__':
|
||||
turtle_thread = TurtleDeviceThread()
|
||||
|
10
setup.py
Normal file
10
setup.py
Normal file
@ -0,0 +1,10 @@
|
||||
setup(
|
||||
name='first_project',
|
||||
version='0.0.0',
|
||||
description='This is my first project',
|
||||
author='MarMi',
|
||||
author_email='mikhailycheva.mv@phystech.edu',
|
||||
url="https://git.sciprog.center/marmi/advanced-python-homework-2023-marmi.git",
|
||||
license="CPOL",
|
||||
packages=find_packages(include=['controls']),
|
||||
)
|
@ -10,6 +10,7 @@ class TurtleShell(cmd.Cmd):
|
||||
# ----- basic turtle commands -----
|
||||
def do_forward(self, arg):
|
||||
'Move the turtle forward by the specified distance: FORWARD 10'
|
||||
|
||||
forward(*parse(arg))
|
||||
def do_right(self, arg):
|
||||
'Turn turtle right by given number of degrees: RIGHT 20'
|
||||
|
Loading…
Reference in New Issue
Block a user