Added documentation

This commit is contained in:
Edward Emelianov 2021-10-29 20:40:38 +03:00
parent 39b9cee77c
commit b2a3d68513
10 changed files with 471 additions and 41 deletions

0
LocCorr/DEBUG.log.analyze Executable file → Normal file
View File

View File

@ -29,8 +29,8 @@ static char *conffile = NULL; // configuration file name
configuration theconf = { configuration theconf = {
.maxUsteps=DEFAULT_MAXUSTEPS, .maxUsteps=DEFAULT_MAXUSTEPS,
.maxVsteps=DEFAULT_MAXVSTEPS, .maxVsteps=DEFAULT_MAXVSTEPS,
.maxFpos=Fmaxsteps, .maxFpos=Fmaxsteps-1,
.minFpos=0, .minFpos=-Fmaxsteps+1,
.minarea=DEFAULT_MINAREA, .minarea=DEFAULT_MINAREA,
.maxarea=DEFAULT_MAXAREA, .maxarea=DEFAULT_MAXAREA,
.maxwh = 1.1, .maxwh = 1.1,
@ -52,9 +52,9 @@ configuration theconf = {
.xtarget=-1, .xtarget=-1,
.ytarget=-1, .ytarget=-1,
.throwpart=DEFAULT_THROWPART, .throwpart=DEFAULT_THROWPART,
.maxexp=EXPOS_MAX + DBL_EPSILON, .maxexp=EXPOS_MAX - 1.,
.minexp=EXPOS_MIN - DBL_EPSILON, .minexp=EXPOS_MIN + DBL_EPSILON,
.fixedexp=EXPOS_MIN, .fixedexp=EXPOS_MIN*2,
.gain = 20., .gain = 20.,
.intensthres=DEFAULT_INTENSTHRES, .intensthres=DEFAULT_INTENSTHRES,
.medseed=MIN_MEDIAN_SEED, .medseed=MIN_MEDIAN_SEED,

Binary file not shown.

View File

@ -1,13 +1,16 @@
\documentclass[a4paper,12pt]{extarticle} \documentclass[a4paper,12pt]{extarticle}
\usepackage{/home/eddy/ed} \usepackage{/home/eddy/ed}
\usepackage{afterpage}
\usepackage{longtable}
\def\t#1{\texttt{#1}} \def\t#1{\texttt{#1}}
\def\look#1{(см.\,стр.\,\pageref{#1}, п.\,\ref{#1})} \def\look#1{(см.\,стр.\,\pageref{#1}, п.\,\ref{#1})}
\nocolon \nocolon
\author{Емельянов Э.~В. \and Фатхуллин Т.~А.}
\title{Система управления оптоволоконным спектрографом 1-м телескопа} \title{Система управления оптоволоконным спектрографом 1-м телескопа}
\begin{document} \begin{document}
\maketitle \maketitle\tableofcontents
\section{Описание} \section{Описание}
Основой системы управления прибором является мини-компьютер под управлением ОС Gentoo Linux, расположенного Основой системы управления прибором является мини-компьютер под управлением ОС Gentoo Linux, расположенного
на подвесной части. В подвесной части расположены три шаговых двигателя (управляются по CAN-шине): управление на подвесной части. В подвесной части расположены три шаговых двигателя (управляются по CAN-шине): управление
@ -25,6 +28,16 @@
Данный демон\footnote{\url{https://github.com/eddyem/astrovideoguide_v3/tree/main/LocCorr}} предназначен для анализа Данный демон\footnote{\url{https://github.com/eddyem/astrovideoguide_v3/tree/main/LocCorr}} предназначен для анализа
изображений, определения координат центроидов и выдачи управляющих сигналов на корректирующую аппаратуру. изображений, определения координат центроидов и выдачи управляющих сигналов на корректирующую аппаратуру.
Для сборки утилиты используется \t{cmake}: в рабочей директории проекта создается поддиректория, далее в ней
необходимо запустить \t{cmake ..}, после чего~-- \t{make} и \t{su -c "make install"}. Утилита имеет следующие зависимости:
\begin{description}
\item[libusefull\_macros] библиотека\footnote{\url{https://github.com/eddyem/snippets\_library}} с функциями парсинга
командной строки, отладочными макросами, логгированием и т.п.;
\item[libcfitsio] для работы с FITS-файлами;
\item[libflycapture и libflycapture-c] поддержка светоприемников Grasshopper;
\item[набор библиотек pylonbase] поддержка светоприемников Basler.
\end{description}
В качестве входных изображений могут быть файлы формата FITS, JPEG или PNG (посредством \t{inotify} производится В качестве входных изображений могут быть файлы формата FITS, JPEG или PNG (посредством \t{inotify} производится
мониторинг обновления одного файла либо появления новых файлов в указанной директории), CMOS-светоприемники мониторинг обновления одного файла либо появления новых файлов в указанной директории), CMOS-светоприемники
Basler или Grasshopper. Возможно добавление других источников, для этого необходимо в директории проекта создать Basler или Grasshopper. Возможно добавление других источников, для этого необходимо в директории проекта создать
@ -70,36 +83,63 @@ Basler
\subsubsection{Аргументы командной строки демона} \subsubsection{Аргументы командной строки демона}
\begin{description} \begin{description}
\item[-A, --maxarea=arg] максимальная площадь (в пикселях) объекта (по умолчанию~150000); \item[-A, --maxarea=arg]
\item[-C, --canport=arg] порт локального сервера \t{canserver} (по умолчанию~4444); максимальная площадь (в пикселях) объекта (по умолчанию~150000);
\item[-D, --ndilat=arg] количество дилатаций при обработке изображения (по умолчанию~2); \item[-C, --canport=arg]
\item[-E, --neros=arg] количество эрозий при обработке изображения (по умолчанию~2); порт локального сервера \t{canserver} (по умолчанию~4444);
\item[-H, --height=arg] высота рабочего участка изображения; \item[-D, --ndilat=arg]
\item[-I, --minarea=arg] минимальная площадь (в пикселях) объекта (по умолчанию~400); количество дилатаций при обработке изображения (по умолчанию~2);
\item[-L, --logXY=arg] файл для логгирования вычисленных координат центроидов; \item[-E, --neros=arg]
\item[-N, --naverage=arg] количество изображений для вычисления средних координат центроида (от~1 до~25); количество эрозий при обработке изображения (по умолчанию~2);
\item[-P, --pidfile=arg] файл с PID сервера (по умолчанию \t{/tmp/loccorr.pid}); \item[-H, --height=arg]
\item[-T, --intthres=arg] порог яркости изображений при сортировке ($(I_1-I_2)/(I_1+I_2)$, по умолчанию~0.01) высота рабочего участка изображения;
\item[-W, --width=arg] ширина рабочего участка изображения; \item[-I, --minarea=arg]
\item[-X, --xtarget=arg] координата~$X$ цели (оптоволокна, щели); минимальная площадь (в пикселях) объекта (по умолчанию~400);
\item[-Y, --ytarget=arg] координата~$Y$ цели; \item[-L, --logXY=arg]
\item[-b, --blackp=arg] доля пикселей с низкой интенсивностью, которая будет отброшена при эквализации гистограммы файл для логгирования вычисленных координат центроидов;
\item[-N, --naverage=arg]
количество изображений для вычисления средних координат центроида (от~1 до~25);
\item[-P, --pidfile=arg]
файл с PID сервера (по умолчанию \t{/tmp/loccorr.pid});
\item[-T, --intthres=arg]
порог яркости изображений при сортировке ($(I_1-I_2)/(I_1+I_2)$, по умолчанию~0.01)
\item[-W, --width=arg]
ширина рабочего участка изображения;
\item[-X, --xtarget=arg]
координата~$X$ цели (оптоволокна, щели);
\item[-Y, --ytarget=arg]
координата~$Y$ цели;
\item[-b, --blackp=arg]
доля пикселей с низкой интенсивностью, которая будет отброшена при эквализации гистограммы
(если включена эквализация обработанного кадра); (если включена эквализация обработанного кадра);
\item[-c, --confname=arg] имя файла конфигурации (по умолчанию \t{loccorr.conf}); \item[-c, --confname=arg]
\item[-e, --equalize] выполнять эквализацию обработанного кадра; имя файла конфигурации (по умолчанию \t{loccorr.conf});
\item[-h, --help] вызвать данную справку; \item[-e, --equalize]
\item[-i, --input=arg] название объекта для мониторинга новых изображений (имя файла или директории, выполнять эквализацию обработанного кадра;
\item[-h, --help]
вызвать данную справку;
\item[-i, --input=arg]
название объекта для мониторинга новых изображений (имя файла или директории,
<<grasshopper>> или <<basler>> при захвате с КМОП-камеры); <<grasshopper>> или <<basler>> при захвате с КМОП-камеры);
\item[-j, --jpegout=arg] название файла, куда будет записано обработанное изображение (по умолчанию \item[-j, --jpegout=arg]
название файла, куда будет записано обработанное изображение (по умолчанию
\t{./outpWcrosses.jpg}); \t{./outpWcrosses.jpg});
\item[-l, --logfile=arg] файл, в который будет вестись логгирование; \item[-l, --logfile=arg]
\item[-p, --proc=arg] имя модуля процессинга коррекций (<<pusirobo>>); файл, в который будет вестись логгирование;
\item[-v, --verbose] повысить уровень информативности логгирования (каждый~\t{-v} повышает на~1); \item[-p, --proc=arg]
\item[-x, --xoff=arg] сдвиг по оси~$X$ рабочего участка изображения; имя модуля процессинга коррекций (<<pusirobo>>);
\item[-y, --yoff=arg] сдвиг по оси~$Y$ рабочего участка изображения; \item[-v, --verbose]
\item[--ioport=arg] номер порта сокета для подключения управления (по умолчанию 12345); повысить уровень информативности логгирования (каждый~\t{-v} повышает на~1);
\item[--maxexp=arg] максимальная экспозиция (в миллисекундах, по умолчанию 500); \item[-x, --xoff=arg]
\item[--minexp=arg] минимальная экспозиция (в миллисекундах, по умолчанию 0.001). сдвиг по оси~$X$ рабочего участка изображения;
\item[-y, --yoff=arg]
сдвиг по оси~$Y$ рабочего участка изображения;
\item[--ioport=arg]
номер порта сокета для подключения управления (по умолчанию 12345);
\item[--maxexp=arg]
максимальная экспозиция (в миллисекундах, по умолчанию 500);
\item[--minexp=arg]
минимальная экспозиция (в миллисекундах, по умолчанию 0.001).
\end{description} \end{description}
\subsubsection{Конфигурационные параметры} \subsubsection{Конфигурационные параметры}
@ -281,7 +321,8 @@ relay=newval - Send relay commands (Rx=0/1, PWMX=0..255)
\t{moveU} и \t{moveV}~--- относительные значения. Если требуемое значение за диапазоном перемещения, будет \t{moveU} и \t{moveV}~--- относительные значения. Если требуемое значение за диапазоном перемещения, будет
возвращено \t{FAILED}. возвращено \t{FAILED}.
\subsubsection{Калибровка корректора положения звезды}
\subsubsection{Калибровка корректора положения звезды}
Калибровка выполняется автоматически в режиме \t{stpstate=setup}. Для начала ее проведения необходимо установить Калибровка выполняется автоматически в режиме \t{stpstate=setup}. Для начала ее проведения необходимо установить
все подвижки в среднее положение, навести телескоп на относительно яркую звезду, сфокусироваться телескопом, все подвижки в среднее положение, навести телескоп на относительно яркую звезду, сфокусироваться телескопом,
установить звезду как можно более близко к метке рабочего оптоволокна и включить процедуру калибровки. установить звезду как можно более близко к метке рабочего оптоволокна и включить процедуру калибровки.
@ -396,8 +437,13 @@ $$
разные порты USB. В случае, если базовое устройство перестанет корректно работать, автоматически произойдет разные порты USB. В случае, если базовое устройство перестанет корректно работать, автоматически произойдет
переподключение к резервному. переподключение к резервному.
Компилируется при помощи \t{cmake}. Из внешних зависимостей имеет лишь библиотеку
\t{libusefull\_macros}\footnote{\url{https://github.com/eddyem/snippets\_library}} .
\subsubsection{Аргументы командной строки} \subsubsection{Аргументы командной строки}
\begin{description}
\begin{description}
\item[-P, --pid=arg] PID устройства преобразователя; \item[-P, --pid=arg] PID устройства преобразователя;
\item[-V, --vid=arg] VID устройства; \item[-V, --vid=arg] VID устройства;
\item[-e, --echo] включить опцию <<эха>> введенных пользователем команд; \item[-e, --echo] включить опцию <<эха>> введенных пользователем команд;
@ -408,7 +454,8 @@ $$
\item[-s, --speed=arg] скорость соединения по CAN-шине (в бодах); \item[-s, --speed=arg] скорость соединения по CAN-шине (в бодах);
\item[-v, --verbose] повысить уровень подробностей логгирования (каждая \t{-v} повышает уровень на 1); \item[-v, --verbose] повысить уровень подробностей логгирования (каждая \t{-v} повышает уровень на 1);
\item[--pidfile=arg] имя PID-файла процесса (по умолчанию: \t{/tmp/canserver.pid}). \item[--pidfile=arg] имя PID-файла процесса (по умолчанию: \t{/tmp/canserver.pid}).
\end{description}
\end{description}
\subsubsection{Сетевой протокол} \subsubsection{Сетевой протокол}
В целях безопасности сетевое соединение для подключения клиентов открывается исключительно на локальном В целях безопасности сетевое соединение для подключения клиентов открывается исключительно на локальном
@ -543,8 +590,11 @@ application because of the present device state'
всем подключенным клиентам. всем подключенным клиентам.
%\subsection{Демон \t{spec\_server}} \subsection{Демон \t{spec\_server}}
%ТИМУР? \input{spec_server.tex}
\subsection{Интерфейс наблюдателя}
\input{webinterface.tex}
\section{Электронные компоненты} \section{Электронные компоненты}
\subsection{Преобразователь USB--CAN}\label{canusb} \subsection{Преобразователь USB--CAN}\label{canusb}
@ -718,4 +768,41 @@ typedef enum{
запуска микроконтроллера (little endian \t{uint32\_t}). запуска микроконтроллера (little endian \t{uint32\_t}).
\end{description} \end{description}
\section{Запуск утилит в автоматическом режиме}
Управляющий узлами спектрографа мини-ПК установлен на подвесной части. При подключении к новой сети
необходимо сначала сконфигурировать сетевой интерфейс. По умолчанию LAN1 настроен на IP \t{192.168.3.226/23} с
шлюзом \t{192.168.2.11} и DNS \t{192.168.2.111}. Интерфейс LAN2 настроен на \t{10.0.0.1/8} и может использоваться для
диагностических целей. Пароль корневого пользователя: \t{root@spec}, пароль пользователя \t{eddy}, под которым
запускаются сервисы: \t{eddy@spec}.
Для того, чтобы сервисы запускались автоматически, в \t{/etc/local.d} находится скрипт \t{utils.start}:
\begin{verbatim}
#!/bin/sh
CONFDIR="/etc/spectrograph"
LOGDIR="/var/log/spectrograph"
sudo -u eddy /home/eddy/Doc/Pusirobo/canserver/mk/canserver \
-l ${LOGDIR}/canserver.log -vv -s 250 2>/dev/null >/dev/null &
sleep 1
sudo -u eddy /home/eddy/Doc/LocCorr_new/mk/loccorr -vv -i basler \
-p pusirobo -c ${CONFDIR}/loccorr.conf -L
${LOGDIR}/XY.log -l ${LOGDIR}/loccorr.log -j /dev/shm/image.jpg \
2>/dev/null >/dev/null &
sleep 1
sudo -u eddy /home/timur/PROGRAMS/C++/build-INASAN-SPEC/spec_server \
${CONFDIR}/server-config.dat 2>/dev/null >/dev/null &
\end{verbatim}
Конфигурационные файлы находятся в каталоге \t{/etc/spectrograph}, логгирование производится в каталог
\t{/var/log/spectrograph}. Для ротации логов настроен logrotate. Его конфигурация располагается в файле
\t{/etc/logrotate.d/spectrograph}:
\begin{verbatim}
/var/log/spectrograph/*.log {
size 1M
rotate 10
compress
notifempty
missingok
}
\end{verbatim}
\end{document} \end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 KiB

BIN
LocCorr/doc/obs-iface.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 KiB

242
LocCorr/doc/spec_server.tex Normal file
View File

@ -0,0 +1,242 @@
%
% spec_server package description
%
Демон \t{spec\_server} представляет собой \t{HTTP(S)/Websocket} сервер и, соответственно, является
серверной частью программного пакета интерфейсов наблюдателя и состояния спектрографа.
Данный программный пакет реализован на языках \t{C++} (\t{spec\_server})
и \t{Javascript}, \t{HTML}, \t{CSS} для клиентской части.
Сетевая (\t{HTTP(S)/WebSocket} сервер, связь с демоном \t{loccorr}) часть демона реализована с помощью сторонних библиотек
\verb|IXWebsocket|\footnote{\url{https://machinezone.github.io/IXWebSocket/}} и
\verb|ASIO|\footnote{\url{https://think-async.com}}. Кроме того, дополнительно были использованы сторонние библиотеки
\verb|spdlog|\footnote{\url{https://github.com/gabime/spdlog}}, \verb|fmtlib|\footnote{\url{https://github.com/fmtlib/fmt})}
и \verb|OpenSSL|\footnote{\url{https://github.com/fmtlib/fmt}}.
\begin{table}[t]
\caption{Ключи командной строки демона \t{spec\_server}}\label{specserv_cmdkey}
% \begin{tabular}{ll}
\begin{tabular}{p{0.45\textwidth}p{0.45\textwidth}}
\hline\hline
Ключ & описание \\
\hline
\verb|-h| & распечатать в устройство стандартного вывода краткую справку и выйти\\
&\\
\verb|-d [config-filename]| & записать параметры конфигурации по умолчанию в файл
\verb|config-filename| и выйти. Если \verb|config-filename| не задан,
то будет использовано имя по умолчанию \verb|server-config.dat|\\
\hline\hline
\end{tabular}
\end{table}
Для старта демона необходимо выполнить команду:
\begin{verbatim}
spec_server [cfg-filename] [-h] [-d] [dump-config-filename]
\end{verbatim}
Предполагается, что у пользователя есть права на запуск бинарного файла \t{spec\_server} и путь к этому
файлу есть в переменной среды \verb|PATH|.
В Таблице~\ref{specserv_cmdkey} представлены опциональные ключи командной строки, которые принимает исполняемый
файл демона в качестве параметров. Необязательным позиционным параметром запуска
демона является имя файла, в котором заданы параметры конфигурации. Например, следующая командная строка
запускает демон с конфигурационными параметрами в файле \verb|/etc/server-config.dat|:
\begin{verbatim}
spec_server /etc/server-config.dat
\end{verbatim}
\afterpage{%
\begin{longtable}{p{0.2\textwidth}p{0.15\textwidth}p{0.5\textwidth}}
\caption{Параметры конфигурации демона \t{spec\_server}}
\label{specserv_params}\\
% \begin{tabular}{lll}
\hline\hline
имя параметра & тип & описание \\
\hline
\t{caFile} & строка & полное имя файла доверенного корневого сертификата. Специальные значения: \\
& & \t{SYSTEM} -- использовать системное хранилище доверенных корневых сертификатов; \\
& & \t{NONE} -- отключить верификацию сертификатов сетевого соединения. \\
& & По умолчанию -- пустая строка (не использовать корневой сертификат) \\
& & \\
\t{certFile} & строка & полное имя файла \t{SSL}-сертификата демона. По умолчанию -- пустая строка (не
использовать протокол \t{HTTPS}) \\
& & \\
\t{certKeyFile} & строка & полное имя файла ключа \t{SSL}-сертификата демона. По умолчанию -- пустая
строка (не использовать протокол \t{HTTPS}) \\
& & \\
\t{http\_host} & строка & \t{IP}-адрес сетевого интерфейса для прослушивания входящих \t{HTTP(S)}
соединений. \\
& & По умолчанию 0.0.0.0 \\
& & \\
\t{http\_path} & строка & полный путь к каталогу файловой системы где хранятся \t{HTML}, \t{Javascript} и
\t{CSS} файлы интерфейса наблюдателя. \\
& & По умолчанию -- пустая строка (текущий каталог) \\
& & \\
\t{http\_port} & целое число & номер порта для входящих \t{HTTP(S)} соединений. По умолчанию 8080 \\
& & \\
\t{log\_filename} & строка & полное имя лог-файла демона.Параметр может иметь специальные значения
\t{stdout} и
\t{stderr} для логирования в стандартные устройства вывода и ошибок соответственно.
Если значение пустая строка, то логирование будет отключено \\
& & \\
\t{log\_level} & строка & уровень логирования. Возможные значения (регистр не важен):
\t{TRACE}, \t{DEBUG}, \t{INFO}, \t{WARN}, \t{ERROR}, \t{CRITICAL}, \t{OFF}. По умолчанию задано \t{INFO}\\
& & \\
\t{logrot\_num} & целое число & количество сохраняемых лог-файлов, если задано ротирование. Если
больше 0, то логирование
будет выполняться по принципу ротирования файлов по достижению заданного максимального размера файла.
По умолчанию 0 -- ротирование отключено \\
& & \\
\t{logrot\_size} & целое число & максимальный размер лог-файла в случае включенного ротирования.
Размер задается в байтах. По умолчанию 10485760 (10 мегабайт)\\
& & \\
\t{obs\_timeout} & целое число & таймаут бездействия соединения для интерфейса наблюдателя. Время
задается в минутах.
По умолчанию 60 ({\bf не реализовано!!!}) \\
& & \\
\t{passwd\_hash} & 16-ричное число & \t{SHA-256} хэш-сумма строки пароля авторизации для интерфейса
наблюдателя.
По умолчанию значение соответствует паролю \t{123} \\
& & \\
\t{ping\_int} & целое число & ``пинг-понг'' интервал для \t{Websocket} соединений. Время задается в
секундах.
По умолчанию 45 \\
& & \\
\t{specdev\_port} & целое число & номер порта для сетевого соединения с демоном \t{loccorr}. По
умолчанию 12345 \\
& & \\
\t{specdev\_rtimeout} & целое число & таймаут для операций чтения из сокета для сетевого соединения с
демоном \t{loccorr}.
Время задается в миллисекундах. По умолчанию 1000 \\
& & \\
\t{specdev\_wtimeout} & целое число & таймаут для операций записи в сокет для сетевого соединения с
демоном \t{loccorr}.
Время задается в миллисекундах. По умолчанию 1000 \\
& & \\
\t{view\_timeout} & целое число & таймаут бездействия соединения для интерфейса просмотра состояния
спектрографа.
Время задается в минутах. По умолчанию 60 ({\bf не реализовано!!!}) \\
& & \\
\t{websock\_host} & строка & \t{IP}-адрес сетевого интерфейса для прослушивания входящих \t{Websocket}
соединений. По умолчанию 0.0.0.0 \\
& & \\
\t{websock\_port} & целое число & номер порта для входящих \t{Websocket} соединений. По умолчанию 8888 \\
\hline\hline
% \end{tabular}
\end{longtable}
}
При старте демон \t{spec\_server} начинает прослушивать заданные в конфигурации порты для входящих
\t{HTTP(S)} и \t{Websocket} соединений, а затем пытается выполнить сетевое соединение с демоном \t{loccorr}.
Если заданный пользователем файл конфигурации не найден или у пользователя нет прав на его чтение, то демон
аварийно завершает работу.
Функционирование демона полностью задается параметрами в конфигурационном файле. Конфигурационный файл
имеет текстовый формат, параметры задаются парой ``ключ -- значение'' как \verb|key=value|, в каждой строке
может присутствовать только одна пара ``ключ -- значение'', строки начинающиеся с символа \verb|#| являются
комментариями и игнорируются, пустые (содержащие только пробелы) строки также игнорируются.
В паре \verb|key=value| ``\verb|value|'' может быть пустой строкой, что означает ``параметр имеет специальное значение''
(см. Таблицу~\ref{specserv_params}). В Таблице~\ref{specserv_params} описаны возможные параметры
конфигурации демона \t{spec\_server}. Файлы сертификатов и их ключей должны быть в \t{PEM}-формате.
Критичным для работы интерфейса пользователя является параметр \verb|http_path|, задающий
корневой каталог в файловой системе ОС управляющего компьютера, в котором хранятся необходимые
\verb|HTML|, \verb|CSS| и \verb|Javascript| файлы. Главный \verb|HTML| файл интерфейса (\verb|observer.html|)
предполагает жестко заданную структуру содержимого корневого каталога. Положим, что пользователь в своем конфигурационном
файле определил его как \verb|http_path = /etc/fiber_spec_cfg|, тогда его содержимое должно выглядеть
следующим образом:
\begin{verbatim}
/etc/fiber_spec_cfg/
js/
uikit-icons.min.js
uikit.min.js
css/
uikit.min.css
index.html
observer.html
viewer.html
start-disp.jpg
init_connection.js
observer_handlers.js
observer_websocket_handler.js
\end{verbatim}
\begin{table}[t]
\caption{Состав программного пакета \t{spec\_server}}\label{specserv_files}
% \begin{tabular}{ll}
\begin{tabular}{p{0.45\textwidth}p{0.45\textwidth}}
\hline\hline
Имя файла & описание \\
\hline
\verb|spec_server| & исполняемый файл \t{HTTP(S)/Websocket} сервера \\
& \\
\verb|index.html| & \t{HTML} индекс-файл \t{HTTP(S)}-сервера \\
& \\
\verb|observer.html| & \t{HTML} файл интерфейса наблюдателя \\
& \\
\verb|viewer.html| & \t{HTML} файл интерфейса состояния спектрографа ({\bfв разработке!!!})\\
& \\
\verb|start-disp.jpg| & \t{JPEG} файл стартового изображения подсмотра волокна \\
& \\
\verb|init_connection.js| & \t{Javascript} файлы логики интерфейса наблюдателя \\
\verb|observer_handlers.js| & \\
\verb|observer_websocket_handler.js| & \\
& \\
\verb|uikit-icons.min.js| & \t{Javascript} файлы библиотеки \t{UIkit} \\
\verb|uikit.min.js| & \\
& \\
\verb|uikit.min.css| & \t{CSS} файл библиотеки \t{UIkit} \\
\hline\hline
\end{tabular}
\end{table}
Состав и краткое описание файлов программного пакета представлены в Таблице~\ref{specserv_files}.
Для авторизации наблюдателя при начальной загрузке интерфейса потребуется ввод пароля. \verb|SHA-256| хэш-сумма
пароля задается в конфигурации ключом \verb|passwd_hash|. Чтобы сгенерировать хэш-сумму можно, например, воспользоваться
стандартной \verb|GNU| утилитой \verb|Linux| ОС \verb|sha256sum|:
\begin{verbatim}
echo -n "obs-password-here" | sha256sum
\end{verbatim}
Полученная сумма прописывается в конфигурационом файле как
\begin{verbatim}
passwd_hash=82774de1a23f679abab412e24279157fa99c44f3ff400d09d45d4d01e64fce60
\end{verbatim}
(без пробелов после символа '\verb|=|'!!!). {\bf Важно: } в текущей реализации демона \t{loccorr} возможно лишь единственное
соединение к интерфейсу наблюдателя. Если одно уже открыто, то всем остальным будет отказано в доступе.
Для обеспечения сетевой безопасности демон \t{spec\_server} может работать
как \verb|HTTPS| сервер и, в этой конфигурации, использовать \verb|TLS|-шифрование для \verb|Websocket| соединений. Возможны несколько
вариантов конфигурирования \verb|HTTPS| сервера (\verb|TLS|-шифрования). Краткое описание вариантов можно просмотреть на странице библиотеки
\verb|IXWebsocket|\footnote{\url{https://machinezone.github.io/IXWebSocket/usage/\#tls-support-and-configuration}}. Отметим
здесь, что наиболее простой вариант это использование доверенного (подписанного доверенным центром
сертификации) сертификата сервера,
тогда параметры конфигурации могут быть заданы следующим образом:
\begin{verbatim}
caFile = SYSTEM
certFile = server-crt.pem
certKeyFile = server-key.pem
\end{verbatim}
Если используется так называемый самоподписанный сертификат, то конфигурация может быть задана как:
\begin{verbatim}
caFile = NONE
certFile = server-crt.pem
certKeyFile = server-key.pem
\end{verbatim}
Однако, такая конфигурация потребует дополнительных настроек в используемых интернет-браузерах (потребуется разрешить
браузеру использовать соединения защищенные недоверенным сертификатом и т.д.).
Демон \t{spec\_server} обрабатывает 4 сигнала ОС: \verb|SIGINT|, \verb|SIGTERM|, \verb|SIGUSR1| и \verb|SIGUSR2|. Первые два
предназначены для останова \t{HTTP(S)/WebSocket} сервера и выхода демона в ОС. \verb|SIGUSR1| используется для
рестарта \t{HTTP(S)/WebSocket} сервера (с закрытием всех активных браузерных соединений) и реинициализации соединения
с \t{loccorr} демоном. При получении сигнала \verb|SIGUSR2| демон только реинициализирует соединение с \t{loccorr} демоном.
Например, для останова демона нужно выполнить команду
\begin{verbatim}
killall -TERM spec_server
\end{verbatim}
Остальные варианты обработки сигналов могут быть полезны, например, в случае аварийного перезапуска \t{loccorr} демона.
Например, следующая команда запросит демон \t{spec\_server} закрыть существующее и открыть новое сетевое соединение с
демоном \t{loccorr}:
\begin{verbatim}
killall -USR2 spec_server
\end{verbatim}

View File

@ -0,0 +1,99 @@
\begin{figure}[t]
\centering
\includegraphics[width=0.97\textwidth]{obs-iface-login.png}
\caption{Окно авторизиции наблюдателя}\label{obs-iface-login}
\end{figure}
\begin{figure}[t]
\centering
\includegraphics[width=0.97\textwidth]{obs-iface.png}
\caption{Интерфейс наблюдателя}\label{obs-iface}
\end{figure}
\begin{figure}[t]
\centering
\includegraphics[width=0.97\textwidth]{obs-iface-menu.png}
\caption{Главное меню интерфейса наблюдателя}\label{obs-iface-menu}
\end{figure}
Интерфейс наблюдателя (далее по тексту \verb|ИН|) предназначен для установки режимов и контроля работы
элементов оптоволоконного спектрографа, а
именно, \verb|ИН| позволяет управлять узлом подсмотра оптического волокна и узлами стационарной части спектрографа.
Концептуально \verb|ИН| является графическим интерфейсом пользователя для демона \t{loccorr} и реализует его возможности
в рамках его системы команд (см. выше по тексту).
Программно \verb|ИН| реализован как \verb|Web|-интерфейс на языках \verb|HTML|, \verb|CSS| и \verb|Javascript|.
В текущей реализации \verb|ИН| авторы использовали стороннюю \verb|CSS/Javascript| библиотеку для создания \verb|Web|-интерфейсов
\verb|UIkit|\footnote{\url{https://getuikit.com/}}. Тестирование работы \verb|ИН| проводилось в браузерах на основе движков
отображения веб-страниц и
\verb|Javascript| \verb|Chromium/V8| (google-chrome и vivaldi) и \verb|Quantum/SpiderMonkey| (firefox). Таким образом работа в других браузерах,
например internet explorer, не гарантируется.
Формирование универсальной ссылки ресурса (\verb|URL|) на главную страницу \verb|ИН| зависит от сетевого имени (или \verb|IP|-адреса) управляющего компьютера,
настроек безопасности и порта \verb|HTTP(S)|-сервера указанных в конфигурации демона \t{spec\_server} (см. выше). Например, \verb|IP|-адрес управляющего
компьютера \verb|192.168.3.226|, \verb|http_port=8080| и \verb|TLS|-шифрование отключено, тогда \verb|URL| должен быть установлен как
\verb|http://192.168.3.226:8080|. При указании правильного \verb|URL| браузер должен
отобразить страницу авторизации. На Рисунке~\ref{obs-iface-login} показан пример начальной страницы авторизации наблюдателя.
На этой странице нужно выбрать тип соединения \verb|Observer| или \verb|Viewer| и ввести пароль, чья хэш-сумма задана в конфигурации
демона \t{spec\_server}. В случае успешной авторизации браузер перенаправит пользователя в интерфейс наблюдателя.
На Рисунке~\ref{obs-iface} показан возможный вид \verb|ИН|. Конкретный начальный вид элементов интерфейса может меняться в зависимости
от состояния узлов спектрографа. В левом верхнем углу интерфейса находится кнопка главного меню.
Логически \verb|ИН| разделен на две больших части: верхняя -- управление узлом подсмотра оптического
волокна и гидированием (подвесная часть спектрографа, далее \verb|ПЧ|), нижняя -- управление узлами стационарной части (далее \verb|СЧ|),
а также вывод некоторой информации (логирование) в процессе работы.
Главное меню \verb|ИН| (см. Рисунок~\ref{obs-iface-menu}) содержит следующие пункты: \verb|Reconnect| -- рестарт сетевого соединения с
демоном \t{loccorr}; \verb|Re-read settings| -- запросить текущую конфигурацию демона \t{loccorr}; \verb|Exit| -- выйти из интерфейса на
страницу авторизации.
Элементы интерфейса \verb|ПЧ| сгруппированы в две панели. Левая панель содержит
текущее изображение поля гидирования, кнопок старта/останова процесса гидирования (\t{"START GUIDING"}\ и \t{"STOP
GUIDING"}) и
установки координатных подвижек волокна и фокусировочного механизма в центральное положение ("\verb|GO TO CENTER|").
Отметим, что в случае потери соединения с демоном \t{loccorr} или сбоя в его функционале
(например, сбой детектора подсмотра) в панели будет отображается статическое изображение с надписью
\t{"DISCONNECTED"}. В процессе
гидирования в верхней части изображения поля гидирования отображаются текущие измеренные координаты объекта гидирования (или [-1, -1]
если автоматический поиск объекта и вычисление его центра закончились с ошибкой), разница между ними и текущим центром волокна
($dX = X_{obj} - X_{fiber}$, $dY = Y_{obj} - Y_{fiber}$), а так же статус процесса гидирования.
Правая панель предназначена для управления фокусом изображения объекта гидирования,
выполнения калибровочных измерений для механизма гидирования, контроля параметров накопления для детектора подсмотра и
алгоритма вычислений в процессе гидирования. Фокусировка может выполняться как ползунком (быстро и грубо), так и кнопками "\verb|+|"\ "\verb|-|"\
(с шагом 2 единицы) или полем ввода для точного позиционирования фокусера. Кнопка "\verb|INIT DEVICE|"\ предназначена для запуска процесса
калибровочных измерений для механизма гидирования (см, описание демона \t{loccorr}). Переключатель "\verb|Fiber lighting|"\ служит для
включения/отключения подсветки оптического волокна (\verb|OFF| - выключено, \verb|ON| - включено).
Кнопка "\verb|GET CENTER|"\ предназначена для измерения центра изображения торца оптического волокна. Заметим, что такие измерения
имеют смысл только при включённой подсветке волокна! Поля ввода с меткой "\verb|Fiber center|"\ содержат текущие координаты X и Y центра
торца оптического волокна. Кнопка "\verb|SEND|"\ предназначена для установки в настройках демона \t{loccorr} текущего положения центра
волокна. Посылаются координаты отображаемые в данный момент в полях ввода "\verb|Fiber center|". Связка элементов "\verb|Fiber center|"\ и
"\verb|SEND|"\ позволяют интерактивно в процессе наблюдений или калибровки задавать центр волокна. Для этого можно ввести координаты
непосредственно в полях ввода или же кликнуть левой кнопкой мыши в нужной точке текущего изображения поля гидирования в левой панели интерфейса.
Во втором случае координаты на изображении,
соответствующие указателю мыши в момент нажатия левой кнопки мыши, отобразятся в полях ввода \verb|Fiber center|". {\bf Важно}, смена координат центра
волокна в настройках демона \t{loccorr} будет иметь место только после нажатия кнопки "\verb|SEND|"!!! Чтобы восстановить текущие координаты
центра волокна из настроек демона \t{loccorr} нужно в главном меню \verb|ИН| выбрать пункт "\verb|Re-read settings|".
Для настройки параметров экспозиции детектора подсмотра \verb|ИН| содержит следующие элементы: выпадающий список "\verb|Exposure|", поля ввода
"\verb|Min|", "\verb|Max|"\ и "\verb|Gain (dB)|". Выпадающий список "\verb|Exposure|"\ имеет два пункта: "\verb|Range|"\ и "\verb|Fixed|".
В первом случае алгоритм гидирования сам подбирает оптимальную экспозицию в диапазоне, указанном в полях ввода "\verb|Min|", "\verb|Max|"\
(экспозиции указываются в миллисекундах), поле ввода "\verb|Gain (dB)|"\ недоступно для редактирования и лишь отображает текущее значение.
В режиме "\verb|Fixed|"\ вместо "\verb|Min|", "\verb|Max|"\ отображается поле ввода "\verb|Value|", в котором наблюдатель задаёт
фиксированную экспозицию (в миллисекундах), а также становится доступна регулировка усиления в поле "\verb|Gain (dB)|". Для настройки алгоритма
гидирования наблюдатель может воспользоваться элементами "\verb|Guiding to|"\ и "\verb|N aver|". Первый -- выпадающий список с пунктами:
"\verb|Closest|"\ и "\verb|Brightest|". В режиме "\verb|Closest|"\ гидирование начинается с захвата ближайшего к центру волокна объекта,
в режиме "\verb|Brightest|"\ алгоритм оценивает яркость объектов в поле и начинает гидирование по ярчайшему из них. Очевидно, что данный вид настройки
востребован только в случае присутствия нескольких объектов в поле гида. Поле ввода "\verb|N aver|"\ задаёт количество изображений используемых
для вычисления их среднего в процессе оценки центра объекта гидирования. Для настройки отображения поля гидирования служит элемент ``флажок''.
"\verb|Equalization|". Если данный элемент находится в состоянии ``отмечено'', то изображение поля гида будет эквализовано, то есть значения
пикселей будут преобразованы из исходных в соответствии в вычисленной гистограммой. Данная настройка не влияет на алгоритм гидирования, а
служит только для удобства отображения. Некоторые элементы интерфейса управления подвесной частью спектрографа могут отображаться в режиме
мигания. Это элементы-кнопки \verb|GO TO CENTER|"\ и "\verb|INIT DEVICE|", а также все элементы управления фокусировкой. Режим мигания
означает, что координатные подвижки волокна или фокусировочного механизма находятся в движении. В любой момент движение подвижек может
быть остановлено нажатием кнопки "\verb|STOP GUIDING|"\ (интерфейс посылает демону \t{loccorr} команду \verb|stpstate=relax|).
В нижней левой части \verb|ИН| находится панель, которая отображает различную отладочную информацию. Настоятельно рекомендуется
следить за этими сообщениями. Сообщения выводимые шрифтом чёрного цвета являются информационными, светло коричневого -- предупреждения, и
красного -- ошибки.
Нижняя правая часть \verb|ИН| -- элементы управления стационарной части. Переключатели "\verb|Flat-field|"\ и "\verb|ThAr|"\ управляют
калибровочными лампами, соответственно, плоского поля и торий-аргона (\verb|OFF| - выключено, \verb|ON| - включено).

View File

@ -33,11 +33,13 @@
#include "socket.h" #include "socket.h"
static InputType tp; static InputType tp;
static pid_t childpid;
/** /**
* We REDEFINE the default WEAK function of signal processing * We REDEFINE the default WEAK function of signal processing
*/ */
void signals(int sig){ void signals(int sig){
if(childpid) exit(sig); // father -> do nothin @ end
if(sig){ if(sig){
signal(sig, SIG_IGN); signal(sig, SIG_IGN);
DBG("Get signal %d.", sig); DBG("Get signal %d.", sig);
@ -192,7 +194,7 @@ int main(int argc, char *argv[]){
signal(SIGQUIT, signals); // ctrl+\ - quit signal(SIGQUIT, signals); // ctrl+\ - quit
signal(SIGTSTP, SIG_IGN); // ignore ctrl+Z signal(SIGTSTP, SIG_IGN); // ignore ctrl+Z
while(1){ // guard for dead processes while(1){ // guard for dead processes
pid_t childpid = fork(); childpid = fork();
if(childpid){ // father if(childpid){ // father
LOGMSG("create child with PID %d\n", childpid); LOGMSG("create child with PID %d\n", childpid);
DBG("Created child with PID %d\n", childpid); DBG("Created child with PID %d\n", childpid);