mirror of
https://github.com/eddyem/astrovideoguide_v3.git
synced 2025-12-06 02:35:11 +03:00
Added documentation
This commit is contained in:
parent
39b9cee77c
commit
b2a3d68513
0
LocCorr/DEBUG.log.analyze
Executable file → Normal file
0
LocCorr/DEBUG.log.analyze
Executable file → Normal file
@ -29,8 +29,8 @@ static char *conffile = NULL; // configuration file name
|
||||
configuration theconf = {
|
||||
.maxUsteps=DEFAULT_MAXUSTEPS,
|
||||
.maxVsteps=DEFAULT_MAXVSTEPS,
|
||||
.maxFpos=Fmaxsteps,
|
||||
.minFpos=0,
|
||||
.maxFpos=Fmaxsteps-1,
|
||||
.minFpos=-Fmaxsteps+1,
|
||||
.minarea=DEFAULT_MINAREA,
|
||||
.maxarea=DEFAULT_MAXAREA,
|
||||
.maxwh = 1.1,
|
||||
@ -52,9 +52,9 @@ configuration theconf = {
|
||||
.xtarget=-1,
|
||||
.ytarget=-1,
|
||||
.throwpart=DEFAULT_THROWPART,
|
||||
.maxexp=EXPOS_MAX + DBL_EPSILON,
|
||||
.minexp=EXPOS_MIN - DBL_EPSILON,
|
||||
.fixedexp=EXPOS_MIN,
|
||||
.maxexp=EXPOS_MAX - 1.,
|
||||
.minexp=EXPOS_MIN + DBL_EPSILON,
|
||||
.fixedexp=EXPOS_MIN*2,
|
||||
.gain = 20.,
|
||||
.intensthres=DEFAULT_INTENSTHRES,
|
||||
.medseed=MIN_MEDIAN_SEED,
|
||||
|
||||
Binary file not shown.
@ -1,13 +1,16 @@
|
||||
\documentclass[a4paper,12pt]{extarticle}
|
||||
\usepackage{/home/eddy/ed}
|
||||
\usepackage{afterpage}
|
||||
\usepackage{longtable}
|
||||
|
||||
\def\t#1{\texttt{#1}}
|
||||
\def\look#1{(см.\,стр.\,\pageref{#1}, п.\,\ref{#1})}
|
||||
\nocolon
|
||||
|
||||
\author{Емельянов Э.~В. \and Фатхуллин Т.~А.}
|
||||
\title{Система управления оптоволоконным спектрографом 1-м телескопа}
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\maketitle\tableofcontents
|
||||
\section{Описание}
|
||||
Основой системы управления прибором является мини-компьютер под управлением ОС Gentoo Linux, расположенного
|
||||
на подвесной части. В подвесной части расположены три шаговых двигателя (управляются по CAN-шине): управление
|
||||
@ -25,6 +28,16 @@
|
||||
Данный демон\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} производится
|
||||
мониторинг обновления одного файла либо появления новых файлов в указанной директории), CMOS-светоприемники
|
||||
Basler или Grasshopper. Возможно добавление других источников, для этого необходимо в директории проекта создать
|
||||
@ -70,36 +83,63 @@ Basler
|
||||
|
||||
\subsubsection{Аргументы командной строки демона}
|
||||
\begin{description}
|
||||
\item[-A, --maxarea=arg]
максимальная площадь (в пикселях) объекта (по умолчанию~150000);
|
||||
\item[-C, --canport=arg]
порт локального сервера \t{canserver} (по умолчанию~4444);
|
||||
\item[-D, --ndilat=arg]
количество дилатаций при обработке изображения (по умолчанию~2);
|
||||
\item[-E, --neros=arg]
количество эрозий при обработке изображения (по умолчанию~2);
|
||||
\item[-H, --height=arg]
высота рабочего участка изображения;
|
||||
\item[-I, --minarea=arg]
минимальная площадь (в пикселях) объекта (по умолчанию~400);
|
||||
\item[-L, --logXY=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[-A, --maxarea=arg]
|
||||
максимальная площадь (в пикселях) объекта (по умолчанию~150000);
|
||||
\item[-C, --canport=arg]
|
||||
порт локального сервера \t{canserver} (по умолчанию~4444);
|
||||
\item[-D, --ndilat=arg]
|
||||
количество дилатаций при обработке изображения (по умолчанию~2);
|
||||
\item[-E, --neros=arg]
|
||||
количество эрозий при обработке изображения (по умолчанию~2);
|
||||
\item[-H, --height=arg]
|
||||
высота рабочего участка изображения;
|
||||
\item[-I, --minarea=arg]
|
||||
минимальная площадь (в пикселях) объекта (по умолчанию~400);
|
||||
\item[-L, --logXY=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[-e, --equalize]
выполнять эквализацию обработанного кадра;
|
||||
\item[-h, --help]
вызвать данную справку;
|
||||
\item[-i, --input=arg]
название объекта для мониторинга новых изображений (имя файла или директории,
|
||||
\item[-c, --confname=arg]
|
||||
имя файла конфигурации (по умолчанию \t{loccorr.conf});
|
||||
\item[-e, --equalize]
|
||||
выполнять эквализацию обработанного кадра;
|
||||
\item[-h, --help]
|
||||
вызвать данную справку;
|
||||
\item[-i, --input=arg]
|
||||
название объекта для мониторинга новых изображений (имя файла или директории,
|
||||
<<grasshopper>> или <<basler>> при захвате с КМОП-камеры);
|
||||
\item[-j, --jpegout=arg]
название файла, куда будет записано обработанное изображение (по умолчанию
|
||||
\item[-j, --jpegout=arg]
|
||||
название файла, куда будет записано обработанное изображение (по умолчанию
|
||||
\t{./outpWcrosses.jpg});
|
||||
\item[-l, --logfile=arg]
файл, в который будет вестись логгирование;
|
||||
\item[-p, --proc=arg]
имя модуля процессинга коррекций (<<pusirobo>>);
|
||||
\item[-v, --verbose]
повысить уровень информативности логгирования (каждый~\t{-v} повышает на~1);
|
||||
\item[-x, --xoff=arg]
сдвиг по оси~$X$ рабочего участка изображения;
|
||||
\item[-y, --yoff=arg]
сдвиг по оси~$Y$ рабочего участка изображения;
|
||||
\item[--ioport=arg]
номер порта сокета для подключения управления (по умолчанию 12345);
|
||||
\item[--maxexp=arg]
максимальная экспозиция (в миллисекундах, по умолчанию 500);
|
||||
\item[--minexp=arg]
минимальная экспозиция (в миллисекундах, по умолчанию 0.001).
|
||||
\item[-l, --logfile=arg]
|
||||
файл, в который будет вестись логгирование;
|
||||
\item[-p, --proc=arg]
|
||||
имя модуля процессинга коррекций (<<pusirobo>>);
|
||||
\item[-v, --verbose]
|
||||
повысить уровень информативности логгирования (каждый~\t{-v} повышает на~1);
|
||||
\item[-x, --xoff=arg]
|
||||
сдвиг по оси~$X$ рабочего участка изображения;
|
||||
\item[-y, --yoff=arg]
|
||||
сдвиг по оси~$Y$ рабочего участка изображения;
|
||||
\item[--ioport=arg]
|
||||
номер порта сокета для подключения управления (по умолчанию 12345);
|
||||
\item[--maxexp=arg]
|
||||
максимальная экспозиция (в миллисекундах, по умолчанию 500);
|
||||
\item[--minexp=arg]
|
||||
минимальная экспозиция (в миллисекундах, по умолчанию 0.001).
|
||||
\end{description}
|
||||
|
||||
\subsubsection{Конфигурационные параметры}
|
||||
@ -281,6 +321,7 @@ relay=newval - Send relay commands (Rx=0/1, PWMX=0..255)
|
||||
\t{moveU} и \t{moveV}~--- относительные значения. Если требуемое значение за диапазоном перемещения, будет
|
||||
возвращено \t{FAILED}.
|
||||
|
||||
|
||||
\subsubsection{Калибровка корректора положения звезды}
|
||||
Калибровка выполняется автоматически в режиме \t{stpstate=setup}. Для начала ее проведения необходимо установить
|
||||
все подвижки в среднее положение, навести телескоп на относительно яркую звезду, сфокусироваться телескопом,
|
||||
@ -396,8 +437,13 @@ $$
|
||||
разные порты USB. В случае, если базовое устройство перестанет корректно работать, автоматически произойдет
|
||||
переподключение к резервному.
|
||||
|
||||
Компилируется при помощи \t{cmake}. Из внешних зависимостей имеет лишь библиотеку
|
||||
\t{libusefull\_macros}\footnote{\url{https://github.com/eddyem/snippets\_library}} .
|
||||
|
||||
\subsubsection{Аргументы командной строки}
|
||||
|
||||
\begin{description}
|
||||
|
||||
\item[-P, --pid=arg] PID устройства преобразователя;
|
||||
\item[-V, --vid=arg] VID устройства;
|
||||
\item[-e, --echo] включить опцию <<эха>> введенных пользователем команд;
|
||||
@ -408,6 +454,7 @@ $$
|
||||
\item[-s, --speed=arg] скорость соединения по CAN-шине (в бодах);
|
||||
\item[-v, --verbose] повысить уровень подробностей логгирования (каждая \t{-v} повышает уровень на 1);
|
||||
\item[--pidfile=arg] имя PID-файла процесса (по умолчанию: \t{/tmp/canserver.pid}).
|
||||
|
||||
\end{description}
|
||||
|
||||
\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{Электронные компоненты}
|
||||
\subsection{Преобразователь USB--CAN}\label{canusb}
|
||||
@ -718,4 +768,41 @@ typedef enum{
|
||||
запуска микроконтроллера (little endian \t{uint32\_t}).
|
||||
\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}
|
||||
BIN
LocCorr/doc/obs-iface-login.png
Normal file
BIN
LocCorr/doc/obs-iface-login.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
BIN
LocCorr/doc/obs-iface-menu.png
Normal file
BIN
LocCorr/doc/obs-iface-menu.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 552 KiB |
BIN
LocCorr/doc/obs-iface.png
Normal file
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
242
LocCorr/doc/spec_server.tex
Normal 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}
|
||||
|
||||
99
LocCorr/doc/webinterface.tex
Normal file
99
LocCorr/doc/webinterface.tex
Normal 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| - включено).
|
||||
|
||||
@ -33,11 +33,13 @@
|
||||
#include "socket.h"
|
||||
|
||||
static InputType tp;
|
||||
static pid_t childpid;
|
||||
|
||||
/**
|
||||
* We REDEFINE the default WEAK function of signal processing
|
||||
*/
|
||||
void signals(int sig){
|
||||
if(childpid) exit(sig); // father -> do nothin @ end
|
||||
if(sig){
|
||||
signal(sig, SIG_IGN);
|
||||
DBG("Get signal %d.", sig);
|
||||
@ -192,7 +194,7 @@ int main(int argc, char *argv[]){
|
||||
signal(SIGQUIT, signals); // ctrl+\ - quit
|
||||
signal(SIGTSTP, SIG_IGN); // ignore ctrl+Z
|
||||
while(1){ // guard for dead processes
|
||||
pid_t childpid = fork();
|
||||
childpid = fork();
|
||||
if(childpid){ // father
|
||||
LOGMSG("create child with PID %d\n", childpid);
|
||||
DBG("Created child with PID %d\n", childpid);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user