diff --git a/LocCorr/DEBUG.log.analyze b/LocCorr/DEBUG.log.analyze old mode 100755 new mode 100644 diff --git a/LocCorr/config.c b/LocCorr/config.c index 7576bcd..072305e 100644 --- a/LocCorr/config.c +++ b/LocCorr/config.c @@ -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, diff --git a/LocCorr/doc/LCdoc.pdf b/LocCorr/doc/LCdoc.pdf index 664ebfa..18f1010 100644 Binary files a/LocCorr/doc/LCdoc.pdf and b/LocCorr/doc/LCdoc.pdf differ diff --git a/LocCorr/doc/LCdoc.tex b/LocCorr/doc/LCdoc.tex index 08140bd..f077ca9 100644 --- a/LocCorr/doc/LCdoc.tex +++ b/LocCorr/doc/LCdoc.tex @@ -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] +название объекта для мониторинга новых изображений (имя файла или директории, <> или <> при захвате с КМОП-камеры); - \item[-j, --jpegout=arg] название файла, куда будет записано обработанное изображение (по умолчанию + \item[-j, --jpegout=arg] +название файла, куда будет записано обработанное изображение (по умолчанию \t{./outpWcrosses.jpg}); - \item[-l, --logfile=arg] файл, в который будет вестись логгирование; - \item[-p, --proc=arg] имя модуля процессинга коррекций (<>); - \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] +имя модуля процессинга коррекций (<>); + \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,7 +321,8 @@ relay=newval - Send relay commands (Rx=0/1, PWMX=0..255) \t{moveU} и \t{moveV}~--- относительные значения. Если требуемое значение за диапазоном перемещения, будет возвращено \t{FAILED}. - \subsubsection{Калибровка корректора положения звезды} + +\subsubsection{Калибровка корректора положения звезды} Калибровка выполняется автоматически в режиме \t{stpstate=setup}. Для начала ее проведения необходимо установить все подвижки в среднее положение, навести телескоп на относительно яркую звезду, сфокусироваться телескопом, установить звезду как можно более близко к метке рабочего оптоволокна и включить процедуру калибровки. @@ -396,9 +437,14 @@ $$ разные порты USB. В случае, если базовое устройство перестанет корректно работать, автоматически произойдет переподключение к резервному. +Компилируется при помощи \t{cmake}. Из внешних зависимостей имеет лишь библиотеку +\t{libusefull\_macros}\footnote{\url{https://github.com/eddyem/snippets\_library}} . + \subsubsection{Аргументы командной строки} - \begin{description} - \item[-P, --pid=arg] PID устройства преобразователя; + +\begin{description} + + \item[-P, --pid=arg] PID устройства преобразователя; \item[-V, --vid=arg] VID устройства; \item[-e, --echo] включить опцию <<эха>> введенных пользователем команд; \item[-i, --device=arg] название файла устройства преобразователя; @@ -408,7 +454,8 @@ $$ \item[-s, --speed=arg] скорость соединения по CAN-шине (в бодах); \item[-v, --verbose] повысить уровень подробностей логгирования (каждая \t{-v} повышает уровень на 1); \item[--pidfile=arg] имя PID-файла процесса (по умолчанию: \t{/tmp/canserver.pid}). - \end{description} + +\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} -\end{document} +\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} \ No newline at end of file diff --git a/LocCorr/doc/obs-iface-login.png b/LocCorr/doc/obs-iface-login.png new file mode 100644 index 0000000..59e8aba Binary files /dev/null and b/LocCorr/doc/obs-iface-login.png differ diff --git a/LocCorr/doc/obs-iface-menu.png b/LocCorr/doc/obs-iface-menu.png new file mode 100644 index 0000000..2bfe8f1 Binary files /dev/null and b/LocCorr/doc/obs-iface-menu.png differ diff --git a/LocCorr/doc/obs-iface.png b/LocCorr/doc/obs-iface.png new file mode 100644 index 0000000..497647b Binary files /dev/null and b/LocCorr/doc/obs-iface.png differ diff --git a/LocCorr/doc/spec_server.tex b/LocCorr/doc/spec_server.tex new file mode 100644 index 0000000..4a269d5 --- /dev/null +++ b/LocCorr/doc/spec_server.tex @@ -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} + diff --git a/LocCorr/doc/webinterface.tex b/LocCorr/doc/webinterface.tex new file mode 100644 index 0000000..550a30b --- /dev/null +++ b/LocCorr/doc/webinterface.tex @@ -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| - включено). + diff --git a/LocCorr/main.c b/LocCorr/main.c index ff96947..f02ba07 100644 --- a/LocCorr/main.c +++ b/LocCorr/main.c @@ -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);