From ec25bc36c7fe7c2e982227563db78c7e28fe00a2 Mon Sep 17 00:00:00 2001 From: eddyem Date: Thu, 23 Jan 2020 17:33:32 +0300 Subject: [PATCH] fix some bugs --- Apogee_control.cflags | 1 + Apogee_control.config | 7 + Apogee_control.creator | 1 + Apogee_control.creator.user | 256 +++++ Apogee_control.cxxflags | 1 + Apogee_control.files | 16 + Apogee_control.includes | 2 + CMakeLists.txt | 54 +- bta_print.c | 565 +++++----- bta_print.h | 2 + bta_shdata.c | 345 ++++++ bta_shdata.h | 1795 +++++++++++++----------------- camtools.c | 636 +++++------ camtools.h | 25 +- defhdrs.c | 653 +++++------ image_view_module/CMakeLists.txt | 4 +- image_view_module/imageview.c | 537 ++++----- netcamID | 1 + takepic.c | 1265 +++++++++++---------- takepic.h | 48 +- usage.c | 1089 +++++++++--------- 21 files changed, 3849 insertions(+), 3454 deletions(-) create mode 100644 Apogee_control.cflags create mode 100644 Apogee_control.config create mode 100644 Apogee_control.creator create mode 100644 Apogee_control.creator.user create mode 100644 Apogee_control.cxxflags create mode 100644 Apogee_control.files create mode 100644 Apogee_control.includes create mode 100644 bta_shdata.c create mode 100644 netcamID diff --git a/Apogee_control.cflags b/Apogee_control.cflags new file mode 100644 index 0000000..68d5165 --- /dev/null +++ b/Apogee_control.cflags @@ -0,0 +1 @@ +-std=c17 \ No newline at end of file diff --git a/Apogee_control.config b/Apogee_control.config new file mode 100644 index 0000000..95f54b6 --- /dev/null +++ b/Apogee_control.config @@ -0,0 +1,7 @@ +// Add predefined macros for your project here. For example: +// #define THE_ANSWER 42 + +#define IMAGEVIEW +#define EBUG +#define USEPNG +#define USERAW diff --git a/Apogee_control.creator b/Apogee_control.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/Apogee_control.creator @@ -0,0 +1 @@ +[General] diff --git a/Apogee_control.creator.user b/Apogee_control.creator.user new file mode 100644 index 0000000..506e68e --- /dev/null +++ b/Apogee_control.creator.user @@ -0,0 +1,256 @@ + + + + + + EnvironmentId + {cf63021e-ef53-49b0-b03b-2f2570cdf3b6} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + KOI8-R + false + 4 + false + 80 + true + true + 1 + false + false + 1 + true + true + 0 + 8 + true + 2 + true + true + true + true + + + + ProjectExplorer.Project.PluginSettings + + + false + {44e88e9a-8179-42ea-8aad-1bea96363cc6} + true + {44e88e9a-8179-42ea-8aad-1bea96363cc6} + + /home/eddy/tmp/apogee_control/Apogee_control.creator + + + + true + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + {91347f2c-5221-46a7-80b1-0a054ca02f79} + 1 + 0 + 0 + + /home/eddy/tmp/apogee_control + + + + all + + false + + + false + true + Сборка + + GenericProjectManager.GenericMakeStep + + 1 + Сборка + + ProjectExplorer.BuildSteps.Build + + + + + clean + + false + + + false + true + Сборка + + GenericProjectManager.GenericMakeStep + + 1 + Очистка + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + По умолчанию + По умолчанию + GenericProjectManager.GenericBuildConfiguration + + + /home/eddy/tmp/apogee_control + + + + all + + false + + + false + true + Сборка + + GenericProjectManager.GenericMakeStep + + 1 + Сборка + + ProjectExplorer.BuildSteps.Build + + + + + clean + + false + + + false + true + Сборка + + GenericProjectManager.GenericMakeStep + + 1 + Очистка + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + cmake + cmake + GenericProjectManager.GenericBuildConfiguration + + 2 + + + 0 + Развёртывание + + ProjectExplorer.BuildSteps.Deploy + + 1 + Конфигурация развёртывания + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + Особая программа + + ProjectExplorer.CustomExecutableRunConfiguration + + 3768 + false + true + false + false + true + + + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/Apogee_control.cxxflags b/Apogee_control.cxxflags new file mode 100644 index 0000000..6435dfc --- /dev/null +++ b/Apogee_control.cxxflags @@ -0,0 +1 @@ +-std=c++17 \ No newline at end of file diff --git a/Apogee_control.files b/Apogee_control.files new file mode 100644 index 0000000..d8301ec --- /dev/null +++ b/Apogee_control.files @@ -0,0 +1,16 @@ +airmass.c +am.c +bta_print.c +bta_print.h +bta_shdata.c +bta_shdata.h +camtools.c +camtools.h +defhdrs.c +defhdrs.h +macros.c +macros.h +takepic.c +takepic.h +usage.c +usage.h diff --git a/Apogee_control.includes b/Apogee_control.includes new file mode 100644 index 0000000..59d5959 --- /dev/null +++ b/Apogee_control.includes @@ -0,0 +1,2 @@ +. +./image_view_module diff --git a/CMakeLists.txt b/CMakeLists.txt index 18077d2..dc5d3f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,25 +1,24 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 2.6) set(PROJ apogee_control) +project(${PROJ}) set(VERSION "0.2.0") set(CMAKE_COLOR_MAKEFILE ON) -#set(CMAKE_VERBOSE_MAKEFILE ON) if(DEFINED EBUG) add_definitions(-DEBUG) + set(CFLAGS ${CFLAGS} -Werror) + message("CFLAGS: ${CFLAGS}") + set(CMAKE_VERBOSE_MAKEFILE ON) endif() - - -project(${PROJ} VERSION ${PROJ_VERSION} LANGUAGES C CXX) - -#if(DEFINED CMAKE_INSTALL_PREFIX AND CMAKE_INSTALL_PREFIX MATCHES "/usr/local") -# set(CMAKE_INSTALL_PREFIX "/usr") -#endif() - +if(DEFINED CMAKE_INSTALL_PREFIX AND CMAKE_INSTALL_PREFIX MATCHES "/usr/local") + set(CMAKE_INSTALL_PREFIX "/usr") +endif() +message("Install dir prefix: ${CMAKE_INSTALL_PREFIX}") if(NOT DEFINED LOCALEDIR) set(LOCALEDIR ${CMAKE_INSTALL_PREFIX}/share/locale) endif() set(SOURCES defhdrs.c takepic.c usage.c camtools.c am.c macros.c) -if(DEFINED USE_BTA AND USE_BTA STREQUAL "yes") - set(SOURCES ${SOURCES} bta_print.c) +if(NOT DEFINED NOBTA) + set(SOURCES ${SOURCES} bta_print.c bta_shdata.c) add_definitions(-DUSE_BTA) endif() if(DEFINED TELALT) @@ -45,26 +44,26 @@ endif() add_definitions(-DTHREAD_NUMBER=${PROCESSOR_COUNT}) message("In multithreaded operations will use ${PROCESSOR_COUNT} threads") set(LCPATH ${CMAKE_CURRENT_SOURCE_DIR}/locale/ru) -set(CFLAGS -O2 -Wextra -Wall -Werror -W -std=gnu99) +set(CFLAGS ${CFLAGS} -O2 -Wextra -Wall -W -std=gnu99) +#set(CFLAGS ${CFLAGS} -O2 -std=gnu99) set(PO_FILE ${LCPATH}/messages.po) set(MO_FILE ${LCPATH}/LC_MESSAGES/${PROJ}.mo) set(RU_FILE ${LCPATH}/ru.po) + +add_executable(${PROJ} ${SOURCES} ${PO_FILE} ${MO_FILE}) + find_package(PkgConfig REQUIRED) - -# find CFITSIO -SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) -FIND_PACKAGE(CFITSIO REQUIRED) - -set(MODULES apogeec>=1.71 libusb>=0.1.10) -if(DEFINED USE_BTA AND USE_BTA STREQUAL "yes") - set(MODULES ${MODULES} sla) +set(MODULES cfitsio>=3.0 apogeec>=1.71 libusb>=0.1.10) +if(NOT DEFINED NOBTA) + #set(MODULES ${MODULES} sla) + target_link_libraries(${PROJ} crypt sofa_c) endif() -if(DEFINED USE_PNG AND USE_PNG STREQUAL "yes") +if(DEFINED USEPNG) set(MODULES ${MODULES} libpng>=1.2) add_definitions(-DUSEPNG) endif() pkg_check_modules(${PROJ} REQUIRED ${MODULES}) -if(DEFINED USE_RAW AND USE_RAW STREQUAL "yes") +if(DEFINED USERAW) add_definitions(-DUSERAW) endif() @@ -75,23 +74,22 @@ if(OPENMP_FOUND) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") endif() -add_executable(${PROJ} ${SOURCES} ${PO_FILE} ${MO_FILE}) -include_directories(${${PROJ}_INCLUDE_DIRS} ${CFITSIO_INCLUDE_DIR} image_view_module) +include_directories(${${PROJ}_INCLUDE_DIRS} image_view_module) link_directories(${${PROJ}_LIBRARY_DIRS}) add_definitions(${CFLAGS} -DLOCALEDIR=\"${LOCALEDIR}\" -DPACKAGE_VERSION=\"${VERSION}\" -DGETTEXT_PACKAGE=\"${PROJ}\" -DPROJNAME=\"${PROJ}\") -if(DEFINED USE_IMAGEVIEW AND USE_IMAGEVIEW STREQUAL "yes") +if(NOT DEFINED NOIMAGEVIEW) add_subdirectory(image_view_module) endif() if(IMAGEVIEW_FOUND) message("Found OpenGL. Will use ${IMLIB} to show data") find_package(X11 REQUIRED) - target_link_libraries(${PROJ} ${IMLIB} ${X11_LIBRARIES} ${${PROJ}_LIBRARIES} ${CFITSIO_LIBRARIES} -lm) + target_link_libraries(${PROJ} ${X11_LIBRARIES} ${${PROJ}_LIBRARIES} -lm ${IMLIB}) add_definitions(-DIMAGEVIEW) else() message("Will compile without image view module") - target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES} ${CFITSIO_LIBRARIES} -lm) + target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES} -lm) endif() # Installation of the program diff --git a/bta_print.c b/bta_print.c index 9999842..ab9334c 100644 --- a/bta_print.c +++ b/bta_print.c @@ -28,38 +28,67 @@ * file_name - name of file to write to, * "-" - stdout (default) */ -#include "bta_shdata.h" -#include "takepic.h" -#include "camtools.h" #include "bta_print.h" -#include "macros.h" -#include "usage.h" // command line parameters +#include "bta_shdata.h" +#include "camtools.h" #include "defhdrs.h" -#include // SLA macros +#include "macros.h" +#include "takepic.h" +#include "usage.h" // command line parameters +#include +//#include // SLA macros + +#ifndef DR2S +#define DR2S 1.3750987083139757010431557155385240879777313391975e4 +#endif +/* extern void sla_amp(double*, double*, double*, double*, double*, double*); void slaamp(double ra, double da, double date, double eq, double *rm, double *dm ){ - double r = ra, d = da, mjd = date, equi = eq; - sla_amp(&r, &d, &mjd, &equi, rm, dm); + double r = ra, d = da, mjd = date, equi = eq; + sla_amp(&r, &d, &mjd, &equi, rm, dm); } const double jd0 = 2400000.5; // JD for MJD==0 +*/ /** * convert apparent coordinates (nowadays) to mean (JD2000) * appRA, appDecl in seconds * r, d in seconds */ -void calc_mean(double appRA, double appDecl, double *r, double *d){ - double ra, dec; - appRA *= DS2R; - appDecl *= DAS2R; - //DBG("appRa: %g, appDecl: %g", appRA, appDecl); - double mjd = JDate - jd0; - slaamp(appRA, appDecl, mjd, 2000.0, &ra, &dec); - ra *= DR2S; - dec *= DR2AS; - if(r) *r = ra; - if(d) *d = dec; +void calc_mean(double appRA, double appDecl, double *r, double *dc){ + double ra=0., dec=0., utc1, utc2, tai1, tai2, tt1, tt2, fd, eo, ri; + int y, m, d, H, M; + DBG("appRa: %g'', appDecl'': %g", appRA, appDecl); + appRA *= DS2R; + appDecl *= DAS2R; +/* double mjd = JDate - jd0; + slaamp(appRA, appDecl, mjd, 2000.0, &ra, &dec); + ra *= DR2S; + dec *= DR2AS; + DBG("SLALIB: r=%g'', d=%g''", ra, dec); + ra = 0.; dec = 0.;*/ +// SOFA +#define SOFA(f, ...) do{if(f(__VA_ARGS__)){WARNX("Error in " #f); goto rtn;}}while(0) + // 1. convert system JDate to UTC + SOFA(iauJd2cal, JDate, 0., &y, &m, &d, &fd); + fd *= 24.; + H = (int)fd; + fd = (fd - H)*60.; + M = (int)fd; + fd = (fd - M)*60.; + SOFA(iauDtf2d, "UTC", y, m, d, H, M, fd, &utc1, &utc2); + SOFA(iauUtctai, utc1, utc2, &tai1, &tai2); + SOFA(iauTaitt, tai1, tai2, &tt1, &tt2); + iauAtic13(appRA, appDecl, tt1, tt2, &ri, &dec, &eo); + ra = iauAnp(ri + eo); + ra *= DR2S; + dec *= DR2AS; + DBG("SOFA: r=%g'', d=%g''", ra, dec); +#undef SOFA +rtn: + if(r) *r = ra; + if(dc) *dc = dec; } char comment[FLEN_CARD]; @@ -67,291 +96,291 @@ char comment[FLEN_CARD]; #define FTKEY(...) WRITEKEY(__VA_ARGS__, comment) #define WRITEHIST(fp) \ do{ if(test_headers){printf("HISTORY: %s\n", comment);}else{ \ - int status = 0; \ - fits_write_history(fp, comment, &status); \ - if(status) fits_report_error(stderr, status);\ + int status = 0; \ + fits_write_history(fp, comment, &status); \ + if(status) fits_report_error(stderr, status);\ }}while(0) int shm_ready = FALSE; // BTA shm_get // calculate airmass extern void calc_airmass( - // in - double daynum, // Day number from beginning of year, 0 = midnight Jan 1 - double relhumid,// Relative humidity in percent - double p0, // local pressure in mmHg - double t0, // temperature in kelvins - double z, // zenith distance in degr - // out - double *am, // AIRMASS - double *acd, // column density - double *wcd, // water vapor column density - double *wam // water vapor airmass + // in + double daynum, // Day number from beginning of year, 0 = midnight Jan 1 + double relhumid,// Relative humidity in percent + double p0, // local pressure in mmHg + double t0, // temperature in kelvins + double z, // zenith distance in degr + // out + double *am, // AIRMASS + double *acd, // column density + double *wcd, // water vapor column density + double *wam // water vapor airmass ); static char buf[1024]; char *time_asc(double t){ - int h, m; - double s; - char *str = ""; - h = (int)(t/3600.); - if(t < 0.){ t = -t; str = "-";} - m = (int)((t - (double)h*3600.)/60.); - s = t - (double)h*3600. - (double)m*60.; - h %= 24; - if(s>59) s=59; - sprintf(buf, "%s%dh:%02dm:%04.1fs", str, h,m,s); - return buf; + int h, m; + double s; + char *str = ""; + h = (int)(t/3600.); + if(t < 0.){ t = -t; str = "-";} + m = (int)((t - (double)h*3600.)/60.); + s = t - (double)h*3600. - (double)m*60.; + h %= 24; + if(s>59) s=59; + sprintf(buf, "%s%dh:%02dm:%04.1fs", str, h,m,s); + return buf; } char *angle_asc(double a){ - char s; - int d, min; - double sec; - if (a >= 0.) - s = '+'; - else{ - s = '-'; a = -a; - } - d = (int)(a/3600.); - min = (int)((a - (double)d*3600.)/60.); - sec = a - (double)d*3600. - (double)min*60.; - d %= 360; - if(sec>59.9) sec=59.9; - sprintf(buf, "%c%d:%02d':%04.1f''", s,d,min,sec); - return buf; + char s; + int d, min; + double sec; + if (a >= 0.) + s = '+'; + else{ + s = '-'; a = -a; + } + d = (int)(a/3600.); + min = (int)((a - (double)d*3600.)/60.); + sec = a - (double)d*3600. - (double)min*60.; + d %= 360; + if(sec>59.9) sec=59.9; + sprintf(buf, "%c%d:%02d':%04.1f''", s,d,min,sec); + return buf; } typedef struct{ - double JD; // JDate - double Azimuth; // val_A - double Zenith; // val_Z - double P2; // val_P - double Wind; // val_Wnd - //double Tmir; // + double JD; // JDate + double Azimuth; // val_A + double Zenith; // val_Z + double P2; // val_P + double Wind; // val_Wnd + //double Tmir; // } BTA_PARAMS; typedef struct _BTA_Que{ - BTA_PARAMS *data; - struct _BTA_Que *next; - struct _BTA_Que *last; + BTA_PARAMS *data; + struct _BTA_Que *next; + struct _BTA_Que *last; } BTA_Queue; void write_bta_queue(fitsfile *fp); BTA_Queue *bta_queue = NULL; void write_bta_data(fitsfile *fp){ - char *val; - double dtmp; - //char buf[FLEN_CARD]; - time_t t_now = time(NULL); - struct tm *tm_ut, *tm_loc; - tm_ut = gmtime(&t_now); - tm_loc = localtime(&t_now); - if(!shm_ready){ - if(!get_shm_block(&sdat, ClientSide)) return; - else shm_ready = TRUE; - } - if(!check_shm_block(&sdat)) return; - /* - * Observatory parameters - */ - // TELESCOP / Telescope name - CMNT("Telescope name"); - FTKEY(TSTRING, "TELESCOP", "BTA 6m telescope"); - // ORIGIN / organization responsible for the data - CMNT("organization responsible for the data"); - FTKEY(TSTRING, "ORIGIN", "SAO RAS"); - // OBSERVAT / Observatory name - CMNT("Observatory name"); - FTKEY(TSTRING, "OBSERVAT", "Special Astrophysical Observatory, Russia"); - // placement - CMNT("Observatory altitude, m"); - dtmp = TELALT; FTKEY(TDOUBLE, "ALT_OBS", &dtmp); - CMNT("Observatory longitude, degr"); - dtmp = TELLONG; FTKEY(TDOUBLE, "LONG_OBS", &dtmp); - CMNT("Observatory lattitude, degr"); - dtmp = TELLAT; FTKEY(TDOUBLE, "LAT_OBS", &dtmp); - /* - * Times - */ - dtmp = S_time-EE_time; - // ST / sidereal time (hh:mm:ss.ms) - CMNT("Sidereal time: %s", time_asc(dtmp)); - FTKEY(TDOUBLE, "ST", &dtmp); - // UT / universal time (hh:mm:ss.ms) - CMNT("Universal time: %s", time_asc(M_time)); - FTKEY(TDOUBLE, "UT", &M_time); - CMNT("Julian date"); - FTKEY(TDOUBLE, "JD", &JDate); - /* - * Telescope parameters - */ - switch(Tel_Focus){ - case Nasmyth1 : val = "Nasmyth1"; break; - case Nasmyth2 : val = "Nasmyth2"; break; - default : val = "Prime"; break; - } - // FOCUS / Focus of telescope (mm) - CMNT("Observation focus"); - FTKEY(TSTRING, "FOCUS", val); - // VAL_F / focus value - CMNT("Focus value (mm)"); - FTKEY(TDOUBLE, "VAL_F", &val_F); - // EQUINOX / Epoch of RA & DEC - dtmp = 1900 + tm_ut->tm_year + tm_ut->tm_yday / 365.2422; - CMNT("Epoch of RA & DEC"); - FTKEY(TDOUBLE, "EQUINOX", &dtmp); - CMNT("Current object R.A.: %s", time_asc(CurAlpha)); - // RA / Right ascention (H.H) - dtmp = CurAlpha / 3600.; FTKEY(TDOUBLE, "RA", &dtmp); - // DEC / Declination (D.D) - CMNT("Current object Decl.: %s", angle_asc(CurDelta)); - dtmp = CurDelta / 3600.; FTKEY(TDOUBLE, "DEC", &dtmp); - CMNT("Source R.A.: %s", time_asc(SrcAlpha)); - dtmp = SrcAlpha / 3600.; FTKEY(TDOUBLE, "S_RA", &dtmp); - CMNT("Source Decl.: %s", angle_asc(SrcDelta)); - dtmp = SrcDelta / 3600.; FTKEY(TDOUBLE, "S_DEC", &dtmp); - CMNT("Telescope R.A: %s", time_asc(val_Alp)); - dtmp = val_Alp / 3600.; FTKEY(TDOUBLE, "T_RA", &dtmp); - CMNT("Telescope Decl.: %s", angle_asc(val_Del)); - dtmp = val_Del / 3600.; FTKEY(TDOUBLE, "T_DEC", &dtmp); - double a2000, d2000; - calc_mean(InpAlpha, InpDelta, &a2000, &d2000); - CMNT("R.A. given by user (for J2000): %s", time_asc(a2000)); - dtmp = a2000 / 3600.; - FTKEY(TDOUBLE, "INPRA0", &dtmp); - CMNT("Decl. given by user (for J2000): %s", angle_asc(d2000)); - dtmp = d2000 / 3600; - FTKEY(TDOUBLE, "INPDEC0", &dtmp); - calc_mean(CurAlpha, CurDelta, &a2000, &d2000); - CMNT("Current R.A. (for J2000): %s", time_asc(a2000)); - dtmp = a2000 / 3600.; - FTKEY(TDOUBLE, "CURRA0", &dtmp); - CMNT("Current Decl. (for J2000): %s", angle_asc(d2000)); - dtmp = d2000 / 3600; - FTKEY(TDOUBLE, "CURDEC0", &dtmp); - // A / Azimuth - CMNT("Current object Azimuth: %s", angle_asc(tag_A)); - dtmp = tag_A / 3600.; FTKEY(TDOUBLE, "A", &dtmp); - // Z / Zenith distance - CMNT("Current object Zenith: %s", angle_asc(tag_Z)); - dtmp = tag_Z / 3600.; FTKEY(TDOUBLE, "Z", &dtmp); - // PARANGLE / Parallactic angle - CMNT("Parallactic angle: %s", angle_asc(tag_P)); - dtmp = tag_P / 3600.;FTKEY(TDOUBLE, "PARANGLE", &dtmp); + char *val; + double dtmp; + //char buf[FLEN_CARD]; + time_t t_now = time(NULL); + struct tm *tm_ut, *tm_loc; + tm_ut = gmtime(&t_now); + tm_loc = localtime(&t_now); + if(!shm_ready){ + if(!get_shm_block(&sdat, ClientSide)) return; + else shm_ready = TRUE; + } + if(!check_shm_block(&sdat)) return; + /* + * Observatory parameters + */ + // TELESCOP / Telescope name + CMNT("Telescope name"); + FTKEY(TSTRING, "TELESCOP", "BTA 6m telescope"); + // ORIGIN / organization responsible for the data + CMNT("organization responsible for the data"); + FTKEY(TSTRING, "ORIGIN", "SAO RAS"); + // OBSERVAT / Observatory name + CMNT("Observatory name"); + FTKEY(TSTRING, "OBSERVAT", "Special Astrophysical Observatory, Russia"); + // placement + CMNT("Observatory altitude, m"); + dtmp = TELALT; FTKEY(TDOUBLE, "ALT_OBS", &dtmp); + CMNT("Observatory longitude, degr"); + dtmp = TELLONG; FTKEY(TDOUBLE, "LONG_OBS", &dtmp); + CMNT("Observatory lattitude, degr"); + dtmp = TELLAT; FTKEY(TDOUBLE, "LAT_OBS", &dtmp); + /* + * Times + */ + dtmp = S_time-EE_time; + // ST / sidereal time (hh:mm:ss.ms) + CMNT("Sidereal time: %s", time_asc(dtmp)); + FTKEY(TDOUBLE, "ST", &dtmp); + // UT / universal time (hh:mm:ss.ms) + CMNT("Universal time: %s", time_asc(M_time)); + FTKEY(TDOUBLE, "UT", &M_time); + CMNT("Julian date"); + FTKEY(TDOUBLE, "JD", &JDate); + /* + * Telescope parameters + */ + switch(Tel_Focus){ + case Nasmyth1 : val = "Nasmyth1"; break; + case Nasmyth2 : val = "Nasmyth2"; break; + default : val = "Prime"; break; + } + // FOCUS / Focus of telescope (mm) + CMNT("Observation focus"); + FTKEY(TSTRING, "FOCUS", val); + // VAL_F / focus value + CMNT("Focus value (mm)"); + FTKEY(TDOUBLE, "VAL_F", &val_F); + // EQUINOX / Epoch of RA & DEC + dtmp = 1900 + tm_ut->tm_year + tm_ut->tm_yday / 365.2422; + CMNT("Epoch of RA & DEC"); + FTKEY(TDOUBLE, "EQUINOX", &dtmp); + CMNT("Current object R.A.: %s", time_asc(CurAlpha)); + // RA / Right ascention (H.H) + dtmp = CurAlpha / 3600.; FTKEY(TDOUBLE, "RA", &dtmp); + // DEC / Declination (D.D) + CMNT("Current object Decl.: %s", angle_asc(CurDelta)); + dtmp = CurDelta / 3600.; FTKEY(TDOUBLE, "DEC", &dtmp); + CMNT("Source R.A.: %s", time_asc(SrcAlpha)); + dtmp = SrcAlpha / 3600.; FTKEY(TDOUBLE, "S_RA", &dtmp); + CMNT("Source Decl.: %s", angle_asc(SrcDelta)); + dtmp = SrcDelta / 3600.; FTKEY(TDOUBLE, "S_DEC", &dtmp); + CMNT("Telescope R.A: %s", time_asc(val_Alp)); + dtmp = val_Alp / 3600.; FTKEY(TDOUBLE, "T_RA", &dtmp); + CMNT("Telescope Decl.: %s", angle_asc(val_Del)); + dtmp = val_Del / 3600.; FTKEY(TDOUBLE, "T_DEC", &dtmp); + double a2000, d2000; + calc_mean(InpAlpha, InpDelta, &a2000, &d2000); + CMNT("R.A. given by user (for J2000): %s", time_asc(a2000)); + dtmp = a2000 / 3600.; + FTKEY(TDOUBLE, "INPRA0", &dtmp); + CMNT("Decl. given by user (for J2000): %s", angle_asc(d2000)); + dtmp = d2000 / 3600; + FTKEY(TDOUBLE, "INPDEC0", &dtmp); + calc_mean(CurAlpha, CurDelta, &a2000, &d2000); + CMNT("Current R.A. (for J2000): %s", time_asc(a2000)); + dtmp = a2000 / 3600.; + FTKEY(TDOUBLE, "CURRA0", &dtmp); + CMNT("Current Decl. (for J2000): %s", angle_asc(d2000)); + dtmp = d2000 / 3600; + FTKEY(TDOUBLE, "CURDEC0", &dtmp); + // A / Azimuth + CMNT("Current object Azimuth: %s", angle_asc(tag_A)); + dtmp = tag_A / 3600.; FTKEY(TDOUBLE, "A", &dtmp); + // Z / Zenith distance + CMNT("Current object Zenith: %s", angle_asc(tag_Z)); + dtmp = tag_Z / 3600.; FTKEY(TDOUBLE, "Z", &dtmp); + // PARANGLE / Parallactic angle + CMNT("Parallactic angle: %s", angle_asc(tag_P)); + dtmp = tag_P / 3600.;FTKEY(TDOUBLE, "PARANGLE", &dtmp); - CMNT("Telescope A: %s", angle_asc(val_A)); - dtmp = val_A / 3600.; FTKEY(TDOUBLE, "VAL_A", &dtmp); - CMNT("Telescope Z: %s", angle_asc(val_Z)); - dtmp = val_Z / 3600.; FTKEY(TDOUBLE, "VAL_Z", &dtmp); - CMNT("Current P2 value: %s", angle_asc(val_P)); - dtmp = val_P / 3600.; FTKEY(TDOUBLE, "VAL_P", &dtmp); + CMNT("Telescope A: %s", angle_asc(val_A)); + dtmp = val_A / 3600.; FTKEY(TDOUBLE, "VAL_A", &dtmp); + CMNT("Telescope Z: %s", angle_asc(val_Z)); + dtmp = val_Z / 3600.; FTKEY(TDOUBLE, "VAL_Z", &dtmp); + CMNT("Current P2 value: %s", angle_asc(val_P)); + dtmp = val_P / 3600.; FTKEY(TDOUBLE, "VAL_P", &dtmp); - CMNT("Dome A: %s", angle_asc(val_D)); - dtmp = val_D / 3600.; FTKEY(TDOUBLE, "VAL_D", &dtmp); - // OUTTEMP / Out temperature (C) - CMNT("Outern temperature, degC"); - FTKEY(TDOUBLE, "OUTTEMP", &val_T1); - // DOMETEMP / Dome temperature (C) - CMNT("In-dome temperature, degC"); - FTKEY(TDOUBLE, "DOMETEMP", &val_T2); - // MIRRTEMP / Mirror temperature (C) - CMNT("Mirror temperature, degC"); - FTKEY(TDOUBLE, "MIRRTEMP", &val_T3); - // PRESSURE / Pressure (mmHg) - CMNT("Pressure, mmHg"); - FTKEY(TDOUBLE, "PRESSURE", &val_B); - // WIND / Wind speed (m/s) - CMNT("Wind speed, m/s"); - FTKEY(TDOUBLE, "WIND", &val_Wnd); - CMNT("Humidity, %%"); - FTKEY(TDOUBLE, "HUM", &val_Hmd); - /* - * Airmass calculation - * by Reed D. Meyer - */ - double am, acd, wcd, wam; - dtmp = tm_loc->tm_yday; // current day of year - calc_airmass(dtmp, val_Hmd, val_B, val_T1+273.15, val_Z/3600., &am, &acd, &wcd, &wam); - //printf("am=%g, acd=%g, wcd=%g, wam=%g\n", am,acd,wcd,wam); - CMNT("Air mass by Reed D. Meyer"); - FTKEY(TDOUBLE, "AIRMASS", &am); - CMNT("Water vapour air mass by Reed D. Meyer"); - FTKEY(TDOUBLE, "WVAM", &wam); - CMNT("Atm. column density by Reed D. Meyer, g/cm^2"); - FTKEY(TDOUBLE, "ATMDENS", &acd); - CMNT("WV column density by Reed D. Meyer, g/cm^2"); - FTKEY(TDOUBLE, "WVDENS", &wcd); - // if bta_queue nonempty write its data to HISTORY section - if(bta_queue) write_bta_queue(fp); + CMNT("Dome A: %s", angle_asc(val_D)); + dtmp = val_D / 3600.; FTKEY(TDOUBLE, "VAL_D", &dtmp); + // OUTTEMP / Out temperature (C) + CMNT("Outern temperature, degC"); + FTKEY(TDOUBLE, "OUTTEMP", &val_T1); + // DOMETEMP / Dome temperature (C) + CMNT("In-dome temperature, degC"); + FTKEY(TDOUBLE, "DOMETEMP", &val_T2); + // MIRRTEMP / Mirror temperature (C) + CMNT("Mirror temperature, degC"); + FTKEY(TDOUBLE, "MIRRTEMP", &val_T3); + // PRESSURE / Pressure (mmHg) + CMNT("Pressure, mmHg"); + FTKEY(TDOUBLE, "PRESSURE", &val_B); + // WIND / Wind speed (m/s) + CMNT("Wind speed, m/s"); + FTKEY(TDOUBLE, "WIND", &val_Wnd); + CMNT("Humidity, %%"); + FTKEY(TDOUBLE, "HUM", &val_Hmd); + /* + * Airmass calculation + * by Reed D. Meyer + */ + double am, acd, wcd, wam; + dtmp = tm_loc->tm_yday; // current day of year + calc_airmass(dtmp, val_Hmd, val_B, val_T1+273.15, val_Z/3600., &am, &acd, &wcd, &wam); + //printf("am=%g, acd=%g, wcd=%g, wam=%g\n", am,acd,wcd,wam); + CMNT("Air mass by Reed D. Meyer"); + FTKEY(TDOUBLE, "AIRMASS", &am); + CMNT("Water vapour air mass by Reed D. Meyer"); + FTKEY(TDOUBLE, "WVAM", &wam); + CMNT("Atm. column density by Reed D. Meyer, g/cm^2"); + FTKEY(TDOUBLE, "ATMDENS", &acd); + CMNT("WV column density by Reed D. Meyer, g/cm^2"); + FTKEY(TDOUBLE, "WVDENS", &wcd); + // if bta_queue nonempty write its data to HISTORY section + if(bta_queue) write_bta_queue(fp); } // get parameters int get_params(BTA_PARAMS *P){ - if(!shm_ready){ - if(!get_shm_block(&sdat, ClientSide)) return -1; - else shm_ready = TRUE; - } - if(!check_shm_block(&sdat)) return -1; - P->JD = JDate; - P->Azimuth = val_A; - P->Zenith = val_Z; - P->P2 = val_P; - P->Wind = val_Wnd; - return 0; + if(!shm_ready){ + if(!get_shm_block(&sdat, ClientSide)) return -1; + else shm_ready = TRUE; + } + if(!check_shm_block(&sdat)) return -1; + P->JD = JDate; + P->Azimuth = val_A; + P->Zenith = val_Z; + P->P2 = val_P; + P->Wind = val_Wnd; + return 0; } int push_param(){ - DBG("Try to push parameter"); - if(!shm_ready){ - if(!get_shm_block(&sdat, ClientSide)) return -4; - else shm_ready = TRUE; - } - if(!check_shm_block(&sdat)) return -3; - BTA_PARAMS *Par = calloc(1, sizeof(BTA_PARAMS)); - BTA_Queue *qcur = calloc(1, sizeof(BTA_Queue)); - if(!Par || !qcur){ - free(Par); - free(qcur); - return -2; // malloc error - } - if(get_params(Par)){ - free(Par); - free(qcur); - return -1; // error getting parameters - } - qcur->data = Par; - qcur->next = NULL; - qcur->last = qcur; - if(!bta_queue){ // initialisation of que - bta_queue = qcur; - }else{ // variable que initialized previously - bta_queue->last->next = qcur; - bta_queue->last = qcur; - } - return 0; + DBG("Try to push parameter"); + if(!shm_ready){ + if(!get_shm_block(&sdat, ClientSide)) return -4; + else shm_ready = TRUE; + } + if(!check_shm_block(&sdat)) return -3; + BTA_PARAMS *Par = calloc(1, sizeof(BTA_PARAMS)); + BTA_Queue *qcur = calloc(1, sizeof(BTA_Queue)); + if(!Par || !qcur){ + free(Par); + free(qcur); + return -2; // malloc error + } + if(get_params(Par)){ + free(Par); + free(qcur); + return -1; // error getting parameters + } + qcur->data = Par; + qcur->next = NULL; + qcur->last = qcur; + if(!bta_queue){ // initialisation of que + bta_queue = qcur; + }else{ // variable que initialized previously + bta_queue->last->next = qcur; + bta_queue->last = qcur; + } + return 0; } void write_bta_queue(fitsfile *fp){ #define HISTRY(...) do{CMNT(__VA_ARGS__); WRITEHIST(fp);}while(0) - if(!bta_queue || !fp) return; - BTA_Queue *cur = bta_queue, *ptr; - BTA_PARAMS *P; - int i = 0; - do{ - P = cur->data; - ptr = cur; - HISTRY("Data record # %d", i); - HISTRY("JD = %.8f / Julian date", P->JD); - HISTRY("T_AZ = %.8f / Telescope Az: %s", P->Azimuth / 3600., angle_asc(P->Azimuth)); - HISTRY("T_ZD = %.8f / Telescope ZD: %s", P->Zenith / 3600., angle_asc(P->Zenith)); - HISTRY("T_P2 = %.8f / Current P: %s", P->P2 / 3600., angle_asc(P->P2)); - HISTRY("WIND = %.2f / Wind speed, m/s", P->Wind); - i++; - cur = cur->next; - free(P); - free(ptr); - bta_queue = cur; - }while(cur); + if(!bta_queue || !fp) return; + BTA_Queue *cur = bta_queue, *ptr; + BTA_PARAMS *P; + int i = 0; + do{ + P = cur->data; + ptr = cur; + HISTRY("Data record # %d", i); + HISTRY("JD = %.8f / Julian date", P->JD); + HISTRY("T_AZ = %.8f / Telescope Az: %s", P->Azimuth / 3600., angle_asc(P->Azimuth)); + HISTRY("T_ZD = %.8f / Telescope ZD: %s", P->Zenith / 3600., angle_asc(P->Zenith)); + HISTRY("T_P2 = %.8f / Current P: %s", P->P2 / 3600., angle_asc(P->P2)); + HISTRY("WIND = %.2f / Wind speed, m/s", P->Wind); + i++; + cur = cur->next; + free(P); + free(ptr); + bta_queue = cur; + }while(cur); } diff --git a/bta_print.h b/bta_print.h index 657786a..b9f9669 100644 --- a/bta_print.h +++ b/bta_print.h @@ -23,6 +23,8 @@ #ifndef __BTA_PRINT_H__ #define __BTA_PRINT_H__ +#include + void write_bta_data(fitsfile *fp); int push_param(); diff --git a/bta_shdata.c b/bta_shdata.c new file mode 100644 index 0000000..97ddcb0 --- /dev/null +++ b/bta_shdata.c @@ -0,0 +1,345 @@ +#include +#include "bta_shdata.h" +#include "usefull_macros.h" + +#pragma pack(push, 4) +// Main command channel (level 5) +struct CMD_Queue mcmd = {{"Mcmd"}, 0200,0,-1,0}; +// Operator command channel (level 4) +struct CMD_Queue ocmd = {{"Ocmd"}, 0200,0,-1,0}; +// User command channel (level 2/3) +struct CMD_Queue ucmd = {{"Ucmd"}, 0200,0,-1,0}; + +#define MSGLEN (80) +static char msg[MSGLEN]; +#define PERR(...) do{snprintf(msg, MSGLEN, __VA_ARGS__); perror(msg);} while(0) + +#ifndef BTA_MODULE +struct BTA_Data *sdt; +struct BTA_Local *sdtl; + +struct SHM_Block sdat = { + {"Sdat"}, + sizeof(struct BTA_Data), + 2048,0444, + SHM_RDONLY, + bta_data_init, + bta_data_check, + bta_data_close, + ClientSide,-1,NULL +}; + +int snd_id = -1; // client sender ID +int cmd_src_pid = 0; // next command source PID +uint32_t cmd_src_ip = 0;// next command source IP + +/** + * Init data + */ +void bta_data_init() { + sdt = (struct BTA_Data *)sdat.addr; + sdtl = (struct BTA_Local *)(sdat.addr+sizeof(struct BTA_Data)); + if(sdat.side == ClientSide) { + if(sdt->magic != sdat.key.code) { + WARN("Wrong shared data (maybe server turned off)"); + } + if(sdt->version == 0) { + WARN("Null shared data version (maybe server turned off)"); + } + else if(sdt->version != BTA_Data_Ver) { + WARN("Wrong shared data version: I'am - %d, but server - %d ...", + BTA_Data_Ver, sdt->version ); + } + if(sdt->size != sdat.size) { + if(sdt->size > sdat.size) { + WARN("Wrong shared area size: I needs - %d, but server - %d ...", + sdat.size, sdt->size ); + } else { + WARN("Attention! Too little shared data structure!"); + WARN("I needs - %d, but server gives only %d ...", + sdat.size, sdt->size ); + WARN("May be server's version too old!?"); + } + } + return; + } + /* ServerSide */ + if(sdt->magic == sdat.key.code && + sdt->version == BTA_Data_Ver && + sdt->size == sdat.size) + return; + memset(sdat.addr, 0, sdat.maxsize); + sdt->magic = sdat.key.code; + sdt->version = BTA_Data_Ver; + sdt->size = sdat.size; + Tel_Hardware = Hard_On; + Pos_Corr = PC_On; + TrkOk_Mode = UseDiffVel | UseDiffAZ ; + inp_B = 591.; + Pressure = 595.; + PEP_code_A = 0x002aaa; + PEP_code_Z = 0x002aaa; + PEP_code_P = 0x002aaa; + PEP_code_F = 0x002aaa; + PEP_code_D = 0x002aaa; + DomeSEW_N = 1; +} + +int bta_data_check() { + return( (sdt->magic == sdat.key.code) && (sdt->version == BTA_Data_Ver) ); +} + +void bta_data_close() { + if(sdat.side == ServerSide) { + sdt->magic = 0; + sdt->version = 0; + } +} + +/** + * Allocate shared memory segment + */ +int get_shm_block(struct SHM_Block *sb, int server) { + int getsize = (server)? sb->maxsize : sb->size; + // first try to find existing one + sb->id = shmget(sb->key.code, getsize, sb->mode); + if(sb->id < 0 && errno == ENOENT && server){ + // if no - try to create a new one + int cresize = sb->maxsize; + if(sb->size > cresize){ + WARN("Wrong shm maxsize(%d) < realsize(%d)",sb->maxsize,sb->size); + cresize = sb->size; + } + sb->id = shmget(sb->key.code, cresize, IPC_CREAT|IPC_EXCL|sb->mode); + } + if(sb->id < 0){ + if(server) + PERR("Can't create shared memory segment '%s'",sb->key.name); + else + PERR("Can't find shared segment '%s' (maybe no server process) ",sb->key.name); + return 0; + } + // attach it to our memory space + sb->addr = (unsigned char *) shmat(sb->id, NULL, sb->atflag); + if((long)sb->addr == -1){ + PERR("Can't attach shared memory segment '%s'",sb->key.name); + return 0; + } + if(server && (shmctl(sb->id, SHM_LOCK, NULL) < 0)){ + PERR("Can't prevents swapping of shared memory segment '%s'",sb->key.name); + return 0; + } + DBG("Create & attach shared memory segment '%s' %dbytes", sb->key.name, sb->size); + sb->side = server; + if(sb->init != NULL) + sb->init(); + return 1; +} + +int close_shm_block(struct SHM_Block *sb){ + int ret; + if(sb->close != NULL) + sb->close(); + if(sb->side == ServerSide) { + // ret = shmctl(sb->id, SHM_UNLOCK, NULL); + ret = shmctl(sb->id, IPC_RMID, NULL); + } + ret = shmdt (sb->addr); + return(ret); +} + +/** + * Create|Find command queue + */ +void get_cmd_queue(struct CMD_Queue *cq, int server){ + if (!server && cq->id >= 0) { //if already in use set current + snd_id = cq->id; + return; + } + // first try to find existing one + cq->id = msgget(cq->key.code, cq->mode); + // if no - try to create a new one + if(cq->id<0 && errno == ENOENT && server) + cq->id = msgget(cq->key.code, IPC_CREAT|IPC_EXCL|cq->mode); + if(cq->id<0){ + if(server) + PERR("Can't create comand queue '%s'",cq->key.name); + else + PERR("Can't find comand queue '%s' (maybe no server process) ",cq->key.name); + return; + } + cq->side = server; + if(server){ + char buf[120]; + while(msgrcv(cq->id, (struct msgbuf *)buf, 112, 0, IPC_NOWAIT) > 0); + }else + snd_id = cq->id; + cq->acckey = 0; +} + +#endif // BTA_MODULE + + +int check_shm_block(struct SHM_Block *sb) { + if(sb->check) + return(sb->check()); + else return(0); +} + +/** + * Set access key in current channel + */ +void set_acckey(uint32_t newkey){ + if(snd_id < 0) return; + if(ucmd.id == snd_id) ucmd.acckey = newkey; + else if(ocmd.id == snd_id) ocmd.acckey = newkey; + else if(mcmd.id == snd_id) mcmd.acckey = newkey; +} + +/** + * Setup source data for one following command if default values + * (IP == 0 - local, PID = current) not suits + */ +void set_cmd_src(uint32_t ip, int pid) { + cmd_src_pid = pid; + cmd_src_ip = ip; +} + +#pragma pack(push, 4) +/** + * Send client commands to server + */ +void send_cmd(int cmd_code, char *buf, int size) { + struct my_msgbuf mbuf; + if(snd_id < 0) return; + if(size > 100) size = 100; + if(cmd_code > 0) + mbuf.mtype = cmd_code; + else + return; + if(ucmd.id == snd_id) mbuf.acckey = ucmd.acckey; + else if(ocmd.id == snd_id) mbuf.acckey = ocmd.acckey; + else if(mcmd.id == snd_id) mbuf.acckey = mcmd.acckey; + + mbuf.src_pid = cmd_src_pid ? cmd_src_pid : getpid(); + mbuf.src_ip = cmd_src_ip; + cmd_src_pid = cmd_src_ip = 0; + + if(size > 0) + memcpy(mbuf.mtext, buf, size); + else { + mbuf.mtext[0] = 0; + size = 1; + } + msgsnd(snd_id, (struct msgbuf *)&mbuf, size+12, IPC_NOWAIT); +} + +void send_cmd_noarg(int cmd_code) { + send_cmd(cmd_code, NULL, 0); +} +void send_cmd_str(int cmd_code, char *arg) { + send_cmd(cmd_code, arg, strlen(arg)+1); +} +void send_cmd_i1(int cmd_code, int32_t arg1) { + send_cmd(cmd_code, (char *)&arg1, sizeof(int32_t)); +} +void send_cmd_i2(int cmd_code, int32_t arg1, int32_t arg2) { + int32_t ibuf[2]; + ibuf[0] = arg1; + ibuf[1] = arg2; + send_cmd(cmd_code, (char *)ibuf, 2*sizeof(int32_t)); +} +void send_cmd_i3(int cmd_code, int32_t arg1, int32_t arg2, int32_t arg3) { + int32_t ibuf[3]; + ibuf[0] = arg1; + ibuf[1] = arg2; + ibuf[2] = arg3; + send_cmd(cmd_code, (char *)ibuf, 3*sizeof(int32_t)); +} +void send_cmd_i4(int cmd_code, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4) { + int32_t ibuf[4]; + ibuf[0] = arg1; + ibuf[1] = arg2; + ibuf[2] = arg3; + ibuf[3] = arg4; + send_cmd(cmd_code, (char *)ibuf, 4*sizeof(int32_t)); +} +void send_cmd_d1(int32_t cmd_code, double arg1) { + send_cmd(cmd_code, (char *)&arg1, sizeof(double)); +} +void send_cmd_d2(int cmd_code, double arg1, double arg2) { + double dbuf[2]; + dbuf[0] = arg1; + dbuf[1] = arg2; + send_cmd(cmd_code, (char *)dbuf, 2*sizeof(double)); +} +void send_cmd_i1d1(int cmd_code, int32_t arg1, double arg2) { + struct { + int32_t ival; + double dval; + } buf; + buf.ival = arg1; + buf.dval = arg2; + send_cmd(cmd_code, (char *)&buf, sizeof(buf)); +} +void send_cmd_i2d1(int cmd_code, int32_t arg1, int32_t arg2, double arg3) { + struct { + int32_t ival[2]; + double dval; + } buf; + buf.ival[0] = arg1; + buf.ival[1] = arg2; + buf.dval = arg3; + send_cmd(cmd_code, (char *)&buf, sizeof(buf)); +} +void send_cmd_i3d1(int cmd_code, int32_t arg1, int32_t arg2, int32_t arg3, double arg4) { + struct { + int32_t ival[3]; + double dval; + } buf; + buf.ival[0] = arg1; + buf.ival[1] = arg2; + buf.ival[2] = arg3; + buf.dval = arg4; + send_cmd(cmd_code, (char *)&buf, sizeof(buf)); +} + +void encode_lev_passwd(char *passwd, int nlev, uint32_t *keylev, uint32_t *codlev){ + char salt[4]; + char *encr; + union { + uint32_t ui; + char c[4]; + } key, cod; + sprintf(salt,"L%1d",nlev); + encr = (char *)crypt(passwd, salt); + cod.c[0] = encr[2]; + key.c[0] = encr[3]; + cod.c[1] = encr[4]; + key.c[1] = encr[5]; + cod.c[2] = encr[6]; + key.c[2] = encr[7]; + cod.c[3] = encr[8]; + key.c[3] = encr[9]; + *keylev = key.ui; + *codlev = cod.ui; +} + +int find_lev_passwd(char *passwd, uint32_t *keylev, uint32_t *codlev){ + int nlev; + for(nlev = 5; nlev > 0; --nlev){ + encode_lev_passwd(passwd, nlev, keylev, codlev); + if(*codlev == code_Lev(nlev)) break; + } + return(nlev); +} + +int check_lev_passwd(char *passwd){ + uint32_t keylev,codlev; + int nlev; + nlev = find_lev_passwd(passwd, &keylev, &codlev); + if(nlev > 0) set_acckey(keylev); + return(nlev); +} + +#pragma pack(pop) diff --git a/bta_shdata.h b/bta_shdata.h index 131e5bc..fbbdcf3 100644 --- a/bta_shdata.h +++ b/bta_shdata.h @@ -2,11 +2,6 @@ #ifndef __BTA_SHDATA_H__ #define __BTA_SHDATA_H__ -#define _XOPEN_SOURCE 501 -/* */ -/* : */ -/* BTA_MODULE - - . C- ( .) */ -/* SHM_OLD_SIZE - - */ #include #include #include @@ -17,601 +12,620 @@ #include #include -#pragma GCC diagnostic ignored "-Wunused-function" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-braces" -#pragma GCC diagnostic ignored "-Wsequence-point" -#pragma GCC diagnostic ignored "-Wpointer-to-int-cast" -#pragma GCC diagnostic ignored "-Wimplicit-function-declaration" - -//#define int __int32_t -#define uint __uint32_t - -struct SHM_Block { /* */ +#pragma pack(push, 4) +/* + * Shared memory block + */ +struct SHM_Block { union { - char name[5]; /* */ - key_t code; + char name[5]; // memory segment identificator + key_t code; } key; - int size; /* */ - int maxsize; /* (" " ) */ - int mode; /* (rwxrwxrwx) */ - int atflag; /* (SHM_RDONLY 0) */ - void (*init)(); /* */ - int (*check)(); /* */ - void (*close)(); /* */ - int side; /* : / */ - int id; /* */ - unsigned char *addr; /* */ + int32_t size; // size of memory used + int32_t maxsize; // size when created + int32_t mode; // access mode (rwxrwxrwx) + int32_t atflag; // connection mode (SHM_RDONLY or 0) + void (*init)(); // init function + int32_t (*check)(); // test function + void (*close)(); // deinit function + int32_t side; // connection type: client/server + int32_t id; // connection identificator + uint8_t *addr; // connection address }; -struct CMD_Queue { /* () */ +extern struct SHM_Block sdat; + +/* + * Command queue descriptor + */ +struct CMD_Queue { union { - char name[5]; /* */ - key_t code; + char name[5]; // queue key + key_t code; } key; - int mode; /* (rwxrwxrwx) */ - int side; /* : / (Sender/Receiver)*/ - int id; /* */ - uint acckey; /* ( ->) */ + int32_t mode; // access mode (rwxrwxrwx) + int32_t side; // connection type (Sender/Receiver - server/client) + int32_t id; // connection identificator + uint32_t acckey; // access key (for transmission from client to server) }; -#ifndef BTA_MODULE -/* (Level5)*/ -struct CMD_Queue mcmd = {{'M','c','m','d',0},0200,0,-1,0}; -/* () (Level4)*/ -struct CMD_Queue ocmd = {{'O','c','m','d',0},0200,0,-1,0}; -/* () (Level2/3)*/ -struct CMD_Queue ucmd = {{'U','c','m','d',0},0200,0,-1,0}; -#else extern struct CMD_Queue mcmd; extern struct CMD_Queue ocmd; extern struct CMD_Queue ucmd; -#endif -static void send_cmd_noarg(int); -static void send_cmd_str(int, char *); -static void send_cmd_i1(int, int); -static void send_cmd_i2(int, int, int); -static void send_cmd_i3(int, int, int, int); -static void send_cmd_i4(int, int, int, int, int); -static void send_cmd_d1(int, double); -static void send_cmd_d2(int, double, double); -static void send_cmd_i1d1(int, int, double); -static void send_cmd_i2d1(int, int, int, double); -static void send_cmd_i3d1(int, int, int, int, double); +void send_cmd_noarg(int); +void send_cmd_str(int, char *); +void send_cmd_i1(int, int32_t); +void send_cmd_i2(int, int32_t, int32_t); +void send_cmd_i3(int, int32_t, int32_t, int32_t); +void send_cmd_i4(int, int32_t, int32_t, int32_t, int32_t); +void send_cmd_d1(int, double); +void send_cmd_d2(int, double, double); +void send_cmd_i1d1(int, int32_t, double); +void send_cmd_i2d1(int, int32_t, int32_t, double); +void send_cmd_i3d1(int, int32_t, int32_t, int32_t, double); -/* */ -/* */ -#define StopTel 1 /* */ -#define StopTeleskope() send_cmd_noarg( 1 ) /* . */ -#define StartHS 2 /* */ -#define StartHightSpeed() send_cmd_noarg( 2 ) /* /*/ -#define StartLS 3 /* */ -#define StartLowSpeed() send_cmd_noarg( 3 ) /* /*/ -#define SetTmr 4 /* . Ch7_15 SysTimer */ -#define SetTimerMode(T) send_cmd_i1 ( 4, (int)(T)) /* .. */ -#define SetModMod 5 /* . */ -#define SetModelMode(M) send_cmd_i1 ( 5, (int)(M)) /* .. */ -#define SetCodA 6 /* A */ -#define SetPKN_A(iA,sA) send_cmd_i2 ( 6, (int)(iA),(int)(sA)) /* /*/ -#define SetCodZ 7 /* Z */ -#define SetPKN_Z(iZ) send_cmd_i1 ( 7, (int)(iZ)) /* /*/ -#define SetCodP 8 /* P */ -#define SetPKN_P(iP) send_cmd_i1 ( 8, (int)(iP)) /* /*/ -#define SetVA 9 /* . A */ -#define SetSpeedA(vA) send_cmd_d1 ( 9, (double)(vA)) /* /*/ -#define SetVZ 10 /* . Z */ -#define SetSpeedZ(vZ) send_cmd_d1 (10, (double)(vZ)) /* /*/ -#define SetVP 11 /* . P */ -#define SetSpeedP(vP) send_cmd_d1 (11, (double)(vP)) /* /*/ -#define SetAD 12 /* . R.A. Decl */ -#define SetRADec(Alp,Del) send_cmd_d2 (12, (double)(Alp),(double)(Del))/* .*/ -#define SetAZ 13 /* . ..*/ -#define SetAzimZ(A,Z) send_cmd_d2 (13, (double)(A),(double)(Z))/* .*/ -#define GoToAD 14 /* ( R.A. Decl)*/ -#define GoToObject() send_cmd_noarg(14 ) /* . */ -#define MoveToAD 15 /* ( R.A. Decl)*/ -#define MoveToObject() send_cmd_noarg(15 ) /* .*/ -#define GoToAZ 16 /* ( A Z)*/ -#define GoToAzimZ() send_cmd_noarg(16 ) /* . */ -#define WriteAZ 17 /* A Z FullModel*/ -#define WriteModelAZ() send_cmd_noarg(17 ) /* . */ -#define SetModP 18 /* . P2 */ -#define SetPMode(pmod) send_cmd_i1 (18, (int)(pmod)) /* .*/ -#define P2Move 19 /* ./. (+-1,0) P2 */ -#define MoveP2(dir) send_cmd_i1 (19, (int)(dir)) /* .*/ -#define FocMove 20 /* ./. (+-2,+-1,0) */ -#define MoveFocus(speed,time) send_cmd_i1d1(20,(int)(speed),(double)(time)) /* .*/ -#define UsePCorr 21 /* () */ -#define SwitchPosCorr(pc_flag) send_cmd_i1 (21, (int)(pc_flag)) /* . */ -#define SetTrkFlags 22 /* . */ -#define SetTrkOkMode(trk_flags) send_cmd_i1 (22, (int)(trk_flags)) /* .*/ -#define SetTFoc 23 /* .: 0-, 1-1, 2-2 */ -#define SetTelFocus(N) send_cmd_i1 ( 23, (int)(N)) /* . */ -#define SetVAD 24 /* ...- R.A. Decl */ -#define SetVelAD(VAlp,VDel) send_cmd_d2 (24, (double)(VAlp),(double)(VDel))/* .*/ -#define SetRevA 25 /* . "" */ -#define SetAzRevers(amod) send_cmd_i1 (25, (int)(amod)) /* .*/ -#define SetVP2 26 /* ...- P2 ( ) */ -#define SetVelP2(vP2) send_cmd_d1 (26, (double)(vP2)) /* .*/ -#define SetTarg 27 /* . */ -#define SetSysTarg(Targ) send_cmd_i1 (27, (int)(Targ)) /* .*/ -#define SendMsg 28 /* ( ) */ -#define SendMessage(Mesg) send_cmd_str (28, (char *)(Mesg)) /* .*/ -#define CorrAD 29 /* R.A. Decl */ -#define DoADcorr(dAlp,dDel) send_cmd_d2 (29, (double)(dAlp),(double)(dDel))/* .*/ -#define CorrAZ 30 /* A Z*/ -#define DoAZcorr(dA,dZ) send_cmd_d2 (30, (double)(dA),(double)(dZ))/* .*/ -#define SetVCAZ 31 /* .. A Z*/ -#define SetVCorr(vA,vZ) send_cmd_d2 (31, (double)(vA),(double)(vZ))/* .*/ -#define P2MoveTo 32 /* P2 */ -#define MoveP2To(vP2,time) send_cmd_d2 (32, (double)(vP2),(double)(time))/* .*/ -#define GoToTD 33 /* ( t Decl)*/ -#define GoToSat() send_cmd_noarg (33 ) /* ..*/ -#define MoveToTD 34 /* ( t Decl)*/ -#define MoveToSat() send_cmd_noarg (34 ) /* .*/ -#define NullCom 35 /* ( ?) */ -#define SyncCom() send_cmd_noarg (35 ) /* . */ -#define StartTel 36 /* "" */ -#define StartTeleskope() send_cmd_noarg(36 ) /* . */ -#define SetTMod 37 /* . */ -#define SetTelMode(M) send_cmd_i1 ( 37, (int)(M)) /* .. */ -#define TelOn 38 /* . , ..*/ -#define TeleskopeOn() send_cmd_noarg(38 ) /* .. */ -#define SetModD 39 /* . */ -#define SetDomeMode(dmod) send_cmd_i1 (39, (int)(dmod)) /* ..*/ -#define DomeMove 40 /* ./. (+-1+-2,+-3,0) */ -#define MoveDome(speed,time) send_cmd_i1d1(40,(int)(speed),(double)(time)) /* .*/ -#define SetPass 41 /* . */ -#define SetPasswd(LPass) send_cmd_str (41, (char *)(LPass)) /* ..*/ -#define SetLevC 42 /* . */ -#define SetLevCode(Nlev,Cod) send_cmd_i2(42, (int)(Nlev),(int)(Cod)) /* ..*/ -#define SetLevK 43 /* . */ -#define SetLevKey(Nlev,Key) send_cmd_i2(43, (int)(Nlev),(int)(Key)) /* ..*/ -#define SetNet 44 /* . */ -#define SetNetAcc(Mask,Addr) send_cmd_i2(44, (int)(Mask),(int)(Addr)) /* ..*/ -#define SetMet 45 /* */ -#define SetMeteo(m_id,m_val) send_cmd_i1d1(45,(int)(m_id),(double)(m_val)) /* .*/ -#define TurnMetOff 46 /* . */ -#define TurnMeteoOff(m_id) send_cmd_i1 (46, (int)(m_id)) /* .*/ -#define SetDUT1 47 /* ..(IERS DUT1=UT1-UTC) */ -#define SetDtime(dT) send_cmd_d1 (47, (double)(dT)) /* ..*/ -#define SetPM 48 /* ..(IERS polar motion)*/ -#define SetPolMot(Xp,Yp) send_cmd_d2 (48, (double)(Xp),(double)(Yp)) /* ..*/ -#define GetSEW 49 /* SEW */ -#define GetSEWparam(Ndrv,Indx,Cnt) send_cmd_i3(49,(int)(Ndrv),(int)(Indx),(int)(Cnt)) /* M..*/ -#define PutSEW 50 /* SEW */ -#define PutSEWparam(Ndrv,Indx,Key,Val) send_cmd_i4(50,(int)(Ndrv),(int)(Indx),(int)(Key),(int)(Val)) /* M..*/ -#define SetLocks 51 /* */ -#define SetLockFlags(f) send_cmd_i1 (SetLocks, (int)(f)) /* M..*/ -#define ClearLocks 52 /* */ -#define ClearLockFlags(f) send_cmd_i1 (ClearLocks, (int)(f)) /* M..*/ -#define SetRKbits 53 /* . PEP-RK */ -#define AddRKbits(f) send_cmd_i1 (SetRKbits, (int)(f)) /* M..*/ -#define ClrRKbits 54 /* . PEP-RK */ -#define ClearRKbits(f) send_cmd_i1 (ClrRKbits, (int)(f)) /* M..*/ -#define SetSEWnd 55 /* . SEW- ( )*/ -#define SetDomeDrive(ND) send_cmd_i1 (SetSEWnd, (int)(ND)) /* ..*/ -#define SEWsDome 56 /* ./. SEW- */ -#define DomeSEW(OnOff) send_cmd_i1 (SEWsDome, (int)(OnOff)) /* ..*/ +/******************************************************************************* +* Command list * +*******************************************************************************/ +/* name code args type */ +// Stop telescope +#define StopTel 1 +#define StopTeleskope() send_cmd_noarg( 1 ) +// High/low speed +#define StartHS 2 +#define StartHighSpeed() send_cmd_noarg( 2 ) +#define StartLS 3 +#define StartLowSpeed() send_cmd_noarg( 3 ) +// Timer setup (Ch7_15 or SysTimer) +#define SetTmr 4 +#define SetTimerMode(T) send_cmd_i1 ( 4, (int)(T)) +// Simulation (modeling) mode +#define SetModMod 5 +#define SetModelMode(M) send_cmd_i1 ( 5, (int)(M)) +// Azimuth speed code +#define SetCodA 6 +#define SetPKN_A(iA,sA) send_cmd_i2 ( 6, (int)(iA),(int)(sA)) +// Zenith speed code +#define SetCodZ 7 +#define SetPKN_Z(iZ) send_cmd_i1 ( 7, (int)(iZ)) +// Parangle speed code +#define SetCodP 8 +#define SetPKN_P(iP) send_cmd_i1 ( 8, (int)(iP)) +// Set Az velocity +#define SetVA 9 +#define SetSpeedA(vA) send_cmd_d1 ( 9, (double)(vA)) +// Set Z velocity +#define SetVZ 10 +#define SetSpeedZ(vZ) send_cmd_d1 (10, (double)(vZ)) +// Set P velocity +#define SetVP 11 +#define SetSpeedP(vP) send_cmd_d1 (11, (double)(vP)) +// Set new polar coordinates +#define SetAD 12 +#define SetRADec(Alp,Del) send_cmd_d2 (12, (double)(Alp),(double)(Del)) +// Set new azimutal coordinates +#define SetAZ 13 +#define SetAzimZ(A,Z) send_cmd_d2 (13, (double)(A),(double)(Z)) +// Goto new object by polar coords +#define GoToAD 14 +#define GoToObject() send_cmd_noarg(14 ) +// Start steering to object by polar coords +#define MoveToAD 15 +#define MoveToObject() send_cmd_noarg(15 ) +// Go to object by azimutal coords +#define GoToAZ 16 +#define GoToAzimZ() send_cmd_noarg(16 ) +// Set A&Z for simulation +#define WriteAZ 17 +#define WriteModelAZ() send_cmd_noarg(17 ) +// Set P2 mode +#define SetModP 18 +#define SetPMode(pmod) send_cmd_i1 (18, (int)(pmod)) +// Move(+-1)/Stop(0) P2 +#define P2Move 19 +#define MoveP2(dir) send_cmd_i1 (19, (int)(dir)) +// Move(+-2,+-1)/Stop(0) focus +#define FocMove 20 +#define MoveFocus(speed,time) send_cmd_i1d1(20,(int)(speed),(double)(time)) +// Use/don't use pointing correction system +#define UsePCorr 21 +#define SwitchPosCorr(pc_flag) send_cmd_i1 (21, (int)(pc_flag)) +// Tracking flags +#define SetTrkFlags 22 +#define SetTrkOkMode(trk_flags) send_cmd_i1 (22, (int)(trk_flags)) +// Set focus (0 - primary, 1 - N1, 2 - N2) +#define SetTFoc 23 +#define SetTelFocus(N) send_cmd_i1 ( 23, (int)(N)) +// Set intrinsic move parameters by RA/Decl +#define SetVAD 24 +#define SetVelAD(VAlp,VDel) send_cmd_d2 (24, (double)(VAlp),(double)(VDel)) +// Reverse Azimuth direction when pointing +#define SetRevA 25 +#define SetAzRevers(amod) send_cmd_i1 (25, (int)(amod)) +// Set P2 velocity +#define SetVP2 26 +#define SetVelP2(vP2) send_cmd_d1 (26, (double)(vP2)) +// Set pointing target +#define SetTarg 27 +#define SetSysTarg(Targ) send_cmd_i1 (27, (int)(Targ)) +// Send message to all clients (+write into protocol) +#define SendMsg 28 +#define SendMessage(Mesg) send_cmd_str (28, (char *)(Mesg)) +// RA/Decl user correction +#define CorrAD 29 +#define DoADcorr(dAlp,dDel) send_cmd_d2 (29, (double)(dAlp),(double)(dDel)) +// A/Z user correction +#define CorrAZ 30 +#define DoAZcorr(dA,dZ) send_cmd_d2 (30, (double)(dA),(double)(dZ)) +// sec A/Z user correction speed +#define SetVCAZ 31 +#define SetVCorr(vA,vZ) send_cmd_d2 (31, (double)(vA),(double)(vZ)) +// move P2 with given velocity for a given time +#define P2MoveTo 32 +#define MoveP2To(vP2,time) send_cmd_d2 (32, (double)(vP2),(double)(time)) +// Go to t/Decl position +#define GoToTD 33 +#define GoToSat() send_cmd_noarg (33 ) +// Move to t/Decl +#define MoveToTD 34 +#define MoveToSat() send_cmd_noarg (34 ) +// Empty command for synchronisation +#define NullCom 35 +#define SyncCom() send_cmd_noarg (35 ) +// Button "Start" +#define StartTel 36 +#define StartTeleskope() send_cmd_noarg(36 ) +// Set telescope mode +#define SetTMod 37 +#define SetTelMode(M) send_cmd_i1 ( 37, (int)(M)) +// Turn telescope on (oil etc) +#define TelOn 38 +#define TeleskopeOn() send_cmd_noarg(38 ) +// Dome mode +#define SetModD 39 +#define SetDomeMode(dmod) send_cmd_i1 (39, (int)(dmod)) +// Move(+-3,+-2,+-1)/Stop(0) dome +#define DomeMove 40 +#define MoveDome(speed,time) send_cmd_i1d1(40,(int)(speed),(double)(time)) +// Set account password +#define SetPass 41 +#define SetPasswd(LPass) send_cmd_str (41, (char *)(LPass)) +// Set code of access level +#define SetLevC 42 +#define SetLevCode(Nlev,Cod) send_cmd_i2(42, (int)(Nlev),(int)(Cod)) +// Set key for access level +#define SetLevK 43 +#define SetLevKey(Nlev,Key) send_cmd_i2(43, (int)(Nlev),(int)(Key)) +// Setup network +#define SetNet 44 +#define SetNetAcc(Mask,Addr) send_cmd_i2(44, (int)(Mask),(int)(Addr)) +// Input meteo data +#define SetMet 45 +#define SetMeteo(m_id,m_val) send_cmd_i1d1(45,(int)(m_id),(double)(m_val)) +// Cancel meteo data +#define TurnMetOff 46 +#define TurnMeteoOff(m_id) send_cmd_i1 (46, (int)(m_id)) +// Set time correction (IERS DUT1=UT1-UTC) +#define SetDUT1 47 +#define SetDtime(dT) send_cmd_d1 (47, (double)(dT)) +// Set polar motion (IERS polar motion) +#define SetPM 48 +#define SetPolMot(Xp,Yp) send_cmd_d2 (48, (double)(Xp),(double)(Yp)) +// Get SEW parameter +#define GetSEW 49 +#define GetSEWparam(Ndrv,Indx,Cnt) send_cmd_i3(49,(int)(Ndrv),(int)(Indx),(int)(Cnt)) +// Set SEW parameter +#define PutSEW 50 +#define PutSEWparam(Ndrv,Indx,Key,Val) send_cmd_i4(50,(int)(Ndrv),(int)(Indx),(int)(Key),(int)(Val)) +// Set lock flags +#define SetLocks 51 +#define SetLockFlags(f) send_cmd_i1 (SetLocks, (int)(f)) +// Clear lock flags +#define ClearLocks 52 +#define ClearLockFlags(f) send_cmd_i1 (ClearLocks, (int)(f)) +// Set PEP-RK bits +#define SetRKbits 53 +#define AddRKbits(f) send_cmd_i1 (SetRKbits, (int)(f)) +// Clear PEP-RK bits +#define ClrRKbits 54 +#define ClearRKbits(f) send_cmd_i1 (ClrRKbits, (int)(f)) +// Set SEW dome motor number (for indication) +#define SetSEWnd 55 +#define SetDomeDrive(ND) send_cmd_i1 (SetSEWnd, (int)(ND)) +// Turn SEW controllers of dome on/off +#define SEWsDome 56 +#define DomeSEW(OnOff) send_cmd_i1 (SEWsDome, (int)(OnOff)) -/* ( " ") */ -#define BTA_Data_Ver 2 -#pragma pack(4) -//struct __attribute__((packed)) BTA_Data { -struct BTA_Data { - int magic; /* */ - int version; /* = BTA_Data_Ver*/ - int size; /* = sizeof(struct BTA_Data)*/ - int pid; -#define ServPID (sdt->pid) /* .. */ +/******************************************************************************* +* BTA data structure definitions * +*******************************************************************************/ - /* */ - int model; -#define UseModel (sdt->model) /* */ -#define NoModel 0 /* */ -#define CheckModel 1 /* */ -#define DriveModel 2 /* "" */ -#define FullModel 3 /* */ - int timer; -#define ClockType (sdt->timer) /* */ -#define Ch7_15 0 /* . . 7-15 */ -#define SysTimer 1 /* ( ) */ -#define ExtSynchro 2 /* (bta_time xntpd)*/ - int system; -#define Sys_Mode (sdt->system) /* */ -#define SysStop 0 /* */ -#define SysWait 1 /* () */ -#define SysPointAZ 2 /* ( A Z)*/ -#define SysPointAD 3 /* ( R.A. Decl)*/ -#define SysTrkStop 4 /* : */ -#define SysTrkStart 5 /* : . ()*/ -#define SysTrkMove 6 /* : */ -#define SysTrkSeek 7 /* : */ -#define SysTrkOk 8 /* : */ -#define SysTrkCorr 9 /* : */ -#define SysTest 10 /* */ - int sys_target; -#define Sys_Target (sdt->sys_target) /* */ -#define TagPosition 0 /* A/Z */ -#define TagObject 1 /* Alpha/Delta */ -#define TagNest 2 /* "" */ -#define TagZenith 3 /* "" */ -#define TagHorizon 4 /* "" */ -#define TagStatObj 5 /* "" t/Delta */ - - int tel_focus; -#define Tel_Focus (sdt->tel_focus) /* : 0-, 1-1, 2-2 */ -#define Prime 0 -#define Nasmyth1 1 -#define Nasmyth2 2 - double pc_coeff[8]; -#define PosCor_Coeff (sdt->pc_coeff) /* - . */ - - /* */ -#define Stopping 0 /* */ -#define Pointing 1 /* */ -#define Tracking 2 /* */ - int tel_state; -#define Tel_State (sdt->tel_state) /* */ - int req_state; -#define Req_State (sdt->req_state) /* */ - int tel_hard_state; -#define Tel_Hardware (sdt->tel_hard_state) /* */ -#define Hard_Off 0 /* */ -#define Hard_On 1 /* */ - - /* */ - int tel_mode; -#define Tel_Mode (sdt->tel_mode) -#define Automatic 0 /* "" - */ -#define Manual 1 /* "/.." - :*/ -#define ZenHor 2 /* "-" - Z<5 Z>80*/ -#define A_Move 4 /* A */ -#define Z_Move 8 /* --- "" --- Z */ -#define Balance 0x10 /* */ - - /* ./. "" */ - int az_mode; -#define Az_Mode (sdt->az_mode) -#define Rev_Off 0 /* */ -#define Rev_On 1 /* 360. */ - - /* P2 */ - int p2_state; -#define P2_State (sdt->p2_state) /* P2 */ -#define P2_Off 0 /* */ -#define P2_On 1 /* */ -#define P2_Plus 2 /* + */ -#define P2_Minus -2 /* - */ - int p2_req_mode; -#define P2_Mode (sdt->p2_req_mode) /* P2 (: /)*/ - - /* */ - int focus_state; -#define Foc_State (sdt->focus_state) -#define Foc_Off 0 /* */ -#define Foc_Lplus 1 /* . + */ -#define Foc_Lminus -1 /* . - */ -#define Foc_Hplus 2 /* + */ -#define Foc_Hminus -2 /* - */ - - /* */ - int dome_state; -#define Dome_State (sdt->dome_state) -#define D_On 7 /* */ -#define D_Off 0 /* */ -#define D_Lplus 1 /* . + */ -#define D_Lminus -1 /* . - */ -#define D_Mplus 2 /* .. + */ -#define D_Mminus -2 /* .. - */ -#define D_Hplus 3 /* + */ -#define D_Hminus -3 /* - */ - -/* () */ - int pcor_mode; -#define Pos_Corr (sdt->pcor_mode) /* A/Z: /*/ -#define PC_Off 0 /* . */ -#define PC_On 1 /* . */ - -/* /. */ - int trkok_mode; -#define TrkOk_Mode (sdt->trkok_mode) -#define UseDiffVel 1 /* & (~)*/ -#define UseDiffAZ 2 /* ( ..) */ -#define UseDFlt 4 /* . */ - - /* */ - double i_alpha, i_delta; -#define InpAlpha (sdt->i_alpha) /* R.A. (sec) */ -#define InpDelta (sdt->i_delta) /* -- " -- Decl. (") */ - double s_alpha, s_delta; -#define SrcAlpha (sdt->s_alpha) /* R.A. (sec) */ -#define SrcDelta (sdt->s_delta) /* -- " -- Decl. (") */ - double v_alpha, v_delta; -#define VelAlpha (sdt->v_alpha) /* ..- R.A. (sec/) */ -#define VelDelta (sdt->v_delta) /* -- " -- Decl. ("/) */ - double i_azim, i_zdist; -#define InpAzim (sdt->i_azim) /* (") */ -#define InpZdist (sdt->i_zdist) /* -- " -- .. (") */ - - /* */ - double c_alpha, c_delta; -#define CurAlpha (sdt->c_alpha) /* R.A. (sec) */ -#define CurDelta (sdt->c_delta) /* -- " -- Decl. (") */ - double tag_a, tag_z, tag_p; -#define tag_A (sdt->tag_a) /* A (") */ -#define tag_Z (sdt->tag_z) /* - " - Z (") - " - */ -#define tag_P (sdt->tag_p) /* - " - P (") - " - */ - double pcor_a, pcor_z, refr_z; -#define pos_cor_A (sdt->pcor_a) /* A (") */ -#define pos_cor_Z (sdt->pcor_z) /* - " - - " - Z (") */ -#define refract_Z (sdt->refr_z) /* (") */ - double tcor_a, tcor_z, tref_z; -#define tel_cor_A (sdt->tcor_a) /* . A (") */ -#define tel_cor_Z (sdt->tcor_z) /* - " - - " - - " - Z (") */ -#define tel_ref_Z (sdt->tref_z) /* . (") */ - double diff_a, diff_z, diff_p; -#define Diff_A (sdt->diff_a) /* -( ) A (") */ -#define Diff_Z (sdt->diff_z) /* - " - - " - Z (") */ -#define Diff_P (sdt->diff_p) /* - " - - " - P (") */ - double vbasea,vbasez,vbasep; -#define vel_objA (sdt->vbasea) /* A ("/) */ -#define vel_objZ (sdt->vbasez) /* - " - - " - Z - " - */ -#define vel_objP (sdt->vbasep) /* - " - - " - P - " - */ - double diffva,diffvz,diffvp; -#define diff_vA (sdt->diffva) /* */ -#define diff_vZ (sdt->diffvz) /* -- "" -- -- "" -- Z */ -#define diff_vP (sdt->diffvp) /* -- "" -- -- "" -- P */ - double speeda,speedz,speedp; -#define speedA (sdt->speeda) /* A ("/) */ -#define speedZ (sdt->speedz) /* - " - Z - " - */ -#define speedP (sdt->speedp) /* - " - P - " - */ - double m_time_precip; -#define Precip_time (sdt->m_time_precip)/* (precipitations)*/ - unsigned char reserve[16]; -#define Reserve (sdt->reserve) /* */ - double rspeeda, rspeedz, rspeedp; -#define req_speedA (sdt->rspeeda) /* ("/) A */ -#define req_speedZ (sdt->rspeedz) /* - " - Z */ -#define req_speedP (sdt->rspeedp) /* - " - P */ - double simvela, simvelz, simvelp, simvelf, simveld; -#define mod_vel_A (sdt->simvela) /* A ("/) */ -#define mod_vel_Z (sdt->simvelz) /* - " - Z - " - */ -#define mod_vel_P (sdt->simvelp) /* - " - P - " - */ -#define mod_vel_F (sdt->simvelf) /* - " - F - " - */ -#define mod_vel_D (sdt->simvelf) /* - " - D - " - */ - - - /* */ - uint kost; -#define code_KOST (sdt->kost) /* . */ - /* 0x8000 - */ - /* 0x4000 - . */ - /* 0x2000 - */ - /* 0x1000 - P2 .*/ - /* 0x01F0 - .. 0.2 0.4 1.0 2.0 5.0("/) */ - /* 0x000F - .. +Z -Z +A -A */ - double m_time, s_time, l_time; -#define M_time (sdt->m_time) /* ( UTC!)*/ -#define S_time (sdt->s_time) /* */ -#define L_time (sdt->l_time) /* */ - uint ppndd_a, ppndd_z, ppndd_p, ppndd_b; -#define ppndd_A (sdt->ppndd_a) /* ( ) A */ -#define ppndd_Z (sdt->ppndd_z) /* - "" - Z */ -#define ppndd_P (sdt->ppndd_p) /* - "" - P */ -#define ppndd_B (sdt->ppndd_b) /* */ - uint dup_a, dup_z, dup_p, dup_f, dup_d; -#define dup_A (sdt->dup_a) /* ( ) A */ -#define dup_Z (sdt->dup_z) /* - "" - Z */ -#define dup_P (sdt->dup_p) /* - "" - P */ -#define dup_F (sdt->dup_f) /* */ -#define dup_D (sdt->dup_d) /* */ - uint low_a, low_z, low_p, low_f, low_d; -#define low_A (sdt->low_a) /* 14- . A */ -#define low_Z (sdt->low_z) /* - "" - Z */ -#define low_P (sdt->low_p) /* - "" - P */ -#define low_F (sdt->low_f) /* */ -#define low_D (sdt->low_d) /* */ - uint code_a, code_z, code_p, code_b, code_f, code_d; -#define code_A (sdt->code_a) /* 23- . A */ -#define code_Z (sdt->code_z) /* - "" - Z */ -#define code_P (sdt->code_p) /* - "" - P */ -#define code_B (sdt->code_b) /* */ -#define code_F (sdt->code_f) /* */ -#define code_D (sdt->code_d) /* */ - uint adc[8]; -#define ADC(N) (sdt->adc[(N)]) /* 8- PCL818 */ -#define code_T1 ADC(0) /* . */ -#define code_T2 ADC(1) /* .*/ -#define code_T3 ADC(2) /* */ -#define code_Wnd ADC(3) /* */ - double val_a, val_z, val_p, val_b, val_f, val_d; - double val_t1, val_t2, val_t3, val_wnd; -#define val_A (sdt->val_a) /* A (") */ -#define val_Z (sdt->val_z) /* - " - Z (") */ -#define val_P (sdt->val_p) /* - " - P (") */ -#define val_B (sdt->val_b) /* e (...)*/ -#define val_F (sdt->val_f) /* () */ -#define val_D (sdt->val_d) /* (") */ -#define val_T1 (sdt->val_t1) /* . (.)*/ -#define val_T2 (sdt->val_t2) /* .(.)*/ -#define val_T3 (sdt->val_t3) /* (.)*/ -#define val_Wnd (sdt->val_wnd) /* (/)*/ - double val_alp, val_del; -#define val_Alp (sdt->val_alp) /* R.A. (sec) */ -#define val_Del (sdt->val_del) /* -- " -- Decl. (") */ - - double vel_a, vel_z, vel_p, vel_f, vel_d; -#define vel_A (sdt->vel_a) /* A ("/) */ -#define vel_Z (sdt->vel_z) /* - " - Z - " - */ -#define vel_P (sdt->vel_p) /* - " - P - " - */ -#define vel_F (sdt->vel_f) /* - " - F - " - */ -#define vel_D (sdt->vel_d) /* - " - D - " - */ - - /* */ +#define ServPID (sdt->pid) // PID of main program +// model +#define UseModel (sdt->model) // model variants +enum{ + NoModel = 0 // OFF + ,CheckModel // control motors by model + ,DriveModel // "blind" management without real sensors + ,FullModel // full model without telescope +}; +// timer +#define ClockType (sdt->timer) // which timer to use +enum{ + Ch7_15 = 0 // Inner timer with synchronisation by CH7_15 + ,SysTimer // System timer (synchronisation unknown) + ,ExtSynchro // External synchronisation (bta_time or xntpd) +}; +// system +#define Sys_Mode (sdt->system) // main system mode +enum{ + SysStop = 0 // Stop + ,SysWait // Wait for start (pointing) + ,SysPointAZ // Pointing by A/Z + ,SysPointAD // Pointing by RA/Decl + ,SysTrkStop // Tracking stop + ,SysTrkStart // Start tracking (acceleration to nominal velocity) + ,SysTrkMove // Tracking move to object + ,SysTrkSeek // Tracking in seeking mode + ,SysTrkOk // Tracking OK + ,SysTrkCorr // Correction of tracking position + ,SysTest // Test +}; +// sys_target +#define Sys_Target (sdt->sys_target) // system pointing target +enum{ + TagPosition = 0 // point by A/Z + ,TagObject // point by RA/Decl + ,TagNest // point to "nest" + ,TagZenith // point to zenith + ,TagHorizon // point to horizon + ,TagStatObj // point to statinary object (t/Decl) +}; +// tel_focus +#define Tel_Focus (sdt->tel_focus) // telescope focus type +enum{ + Prime = 0 + ,Nasmyth1 + ,Nasmyth2 +}; +// PCS +#define PosCor_Coeff (sdt->pc_coeff) // pointing correction system coefficients +// tel_state +#define Tel_State (sdt->tel_state) // telescope state +#define Req_State (sdt->req_state) // required state +enum{ + Stopping = 0 + ,Pointing + ,Tracking +}; +// tel_hard_state +#define Tel_Hardware (sdt->tel_hard_state) // Power state +enum{ + Hard_Off = 0 + ,Hard_On +}; +// tel_mode +#define Tel_Mode (sdt->tel_mode) // telescope mode +enum{ + Automatic = 0 // Automatic (normal) mode + ,Manual = 1 // manual mode + ,ZenHor = 2 // work when Z<5 || Z>80 + ,A_Move = 4 // hand move by A + ,Z_Move = 8 // hand move by Z + ,Balance =0x10// balancing +}; +// az_mode +#define Az_Mode (sdt->az_mode) // azimuth reverce +enum{ + Rev_Off = 0 // move by nearest way + ,Rev_On // move by longest way +}; +// p2_state +#define P2_State (sdt->p2_state) // P2 motor state +#define P2_Mode (sdt->p2_req_mode) +enum{ + P2_Off = 0 // Stop + ,P2_On // Guiding + ,P2_Plus // Move to + + ,P2_Minus = -2 // Move to - +}; +// focus_state +#define Foc_State (sdt->focus_state) // focus motor state +enum{ + Foc_Hminus = -2// fast "-" move + ,Foc_Lminus // slow "-" move + ,Foc_Off // Off + ,Foc_Lplus // slow "+" move + ,Foc_Hplus // fast "+" move +}; +// dome_state +#define Dome_State (sdt->dome_state) // dome motors state +enum{ + D_Hminus = -3 // speeds: low, medium, high + ,D_Mminus + ,D_Lminus + ,D_Off // off + ,D_Lplus + ,D_Mplus + ,D_Hplus + ,D_On = 7 // auto +}; +// pcor_mode +#define Pos_Corr (sdt->pcor_mode) // pointing correction mode +enum{ + PC_Off = 0 + ,PC_On +}; +// trkok_mode +#define TrkOk_Mode (sdt->trkok_mode) // tracking mode +enum{ + UseDiffVel = 1 // Isodrome (correction by real motors speed) + ,UseDiffAZ = 2 // Tracking by coordinate difference + ,UseDFlt = 4 // Turn on digital filter +}; +// input RA/Decl values +#define InpAlpha (sdt->i_alpha) +#define InpDelta (sdt->i_delta) +// current source RA/Decl values +#define SrcAlpha (sdt->s_alpha) +#define SrcDelta (sdt->s_delta) +// intrinsic object velocity +#define VelAlpha (sdt->v_alpha) +#define VelDelta (sdt->v_delta) +// input A/Z values +#define InpAzim (sdt->i_azim) +#define InpZdist (sdt->i_zdist) +// calculated values +#define CurAlpha (sdt->c_alpha) +#define CurDelta (sdt->c_delta) +// current values (from sensors) +#define tag_A (sdt->tag_a) +#define tag_Z (sdt->tag_z) +#define tag_P (sdt->tag_p) + // calculated corrections +#define pos_cor_A (sdt->pcor_a) +#define pos_cor_Z (sdt->pcor_z) +#define refract_Z (sdt->refr_z) +// reverse calculation corr. +#define tel_cor_A (sdt->tcor_a) +#define tel_cor_Z (sdt->tcor_z) +#define tel_ref_Z (sdt->tref_z) +// coords difference +#define Diff_A (sdt->diff_a) +#define Diff_Z (sdt->diff_z) +#define Diff_P (sdt->diff_p) +// base object velocity +#define vel_objA (sdt->vbasea) +#define vel_objZ (sdt->vbasez) +#define vel_objP (sdt->vbasep) +// correction by real speed +#define diff_vA (sdt->diffva) +#define diff_vZ (sdt->diffvz) +#define diff_vP (sdt->diffvp) +// motor speed +#define speedA (sdt->speeda) +#define speedZ (sdt->speedz) +#define speedP (sdt->speedp) +// last precipitation time +#define Precip_time (sdt->m_time_precip) +// reserved +#define Reserve (sdt->reserve) +// real motor speed (''/sec) +#define req_speedA (sdt->rspeeda) +#define req_speedZ (sdt->rspeedz) +#define req_speedP (sdt->rspeedp) +// model speed +#define mod_vel_A (sdt->simvela) +#define mod_vel_Z (sdt->simvelz) +#define mod_vel_P (sdt->simvelp) +#define mod_vel_F (sdt->simvelf) +#define mod_vel_D (sdt->simvelf) +// telescope & hand correction state +/* + * 0x8000 - + * 0x4000 - . + * 0x2000 - + * 0x1000 - P2 . + * 0x01F0 - .. 0.2 0.4 1.0 2.0 5.0("/) + * 0x000F - .. +Z -Z +A -A + */ +#define code_KOST (sdt->kost) +// different time (UTC, stellar, local) +#define M_time (sdt->m_time) +#define S_time (sdt->s_time) +#define L_time (sdt->l_time) +// PPNDD sensor (rough) code +#define ppndd_A (sdt->ppndd_a) +#define ppndd_Z (sdt->ppndd_z) +#define ppndd_P (sdt->ppndd_p) +#define ppndd_B (sdt->ppndd_b) // atm. pressure +// DUP sensor (precise) code (Gray code) +#define dup_A (sdt->dup_a) +#define dup_Z (sdt->dup_z) +#define dup_P (sdt->dup_p) +#define dup_F (sdt->dup_f) +#define dup_D (sdt->dup_d) +// binary 14-digit precise code +#define low_A (sdt->low_a) +#define low_Z (sdt->low_z) +#define low_P (sdt->low_p) +#define low_F (sdt->low_f) +#define low_D (sdt->low_d) +// binary 23-digit rough code +#define code_A (sdt->code_a) +#define code_Z (sdt->code_z) +#define code_P (sdt->code_p) +#define code_B (sdt->code_b) +#define code_F (sdt->code_f) +#define code_D (sdt->code_d) +// ADC PCL818 (8-channel) codes +#define ADC(N) (sdt->adc[(N)]) +#define code_T1 ADC(0) // External temperature code +#define code_T2 ADC(1) // In-dome temperature code +#define code_T3 ADC(2) // Mirror temperature code +#define code_Wnd ADC(3) // Wind speed code +// calculated values +#define val_A (sdt->val_a) // A, '' +#define val_Z (sdt->val_z) // Z, '' +#define val_P (sdt->val_p) // P, '' +#define val_B (sdt->val_b) // atm. pressure, mm.hg. +#define val_F (sdt->val_f) // focus, mm +#define val_D (sdt->val_d) // Dome Az, '' +#define val_T1 (sdt->val_t1) // ext. T, degrC +#define val_T2 (sdt->val_t2) // in-dome T, degrC +#define val_T3 (sdt->val_t3) // mirror T, degrC +#define val_Wnd (sdt->val_wnd) // wind speed, m/s +// RA/Decl calculated by A/Z +#define val_Alp (sdt->val_alp) +#define val_Del (sdt->val_del) +// measured speed +#define vel_A (sdt->vel_a) +#define vel_Z (sdt->vel_z) +#define vel_P (sdt->vel_p) +#define vel_F (sdt->vel_f) +#define vel_D (sdt->vel_d) +// system messages queue #define MesgNum 3 #define MesgLen 39 - //struct __attribute__((packed)) SysMesg { - struct SysMesg { - int seq_num; - char type; -#define MesgEmpty 0 -#define MesgInfor 1 -#define MesgWarn 2 -#define MesgFault 3 -#define MesgLog 4 - char text[MesgLen]; - } sys_msg_buf[MesgNum]; +// message type +enum{ + MesgEmpty = 0 + ,MesgInfor + ,MesgWarn + ,MesgFault + ,MesgLog +}; #define Sys_Mesg(N) (sdt->sys_msg_buf[N]) - - /* */ - /* */ - uint code_lev1,code_lev2,code_lev3,code_lev4,code_lev5; -#define code_Lev1 (sdt->code_lev1) /* " " - */ -#define code_Lev2 (sdt->code_lev2) /* " " - + */ -#define code_Lev3 (sdt->code_lev3) /* " " - + A/Z--, .P2/F */ -#define code_Lev4 (sdt->code_lev4) /* "" - + / ., */ -#define code_Lev5 (sdt->code_lev5) /* " " - */ - /* */ - uint netmask, netaddr, acsmask, acsaddr; -#define NetMask (sdt->netmask) /* (: 255.255.255.0) */ -#define NetWork (sdt->netaddr) /* (: 192.168.3.0) */ -#define ACSMask (sdt->acsmask) /* - (: 255.255.255.0) */ -#define ACSNet (sdt->acsaddr) /* - (: 192.168.13.0) */ - - /* - */ - int meteo_stat; -#define MeteoMode (sdt->meteo_stat) /* */ -#define INPUT_B 1 /* *//* */ -#define INPUT_T1 2 /* T- */ -#define INPUT_T2 4 /* T- */ -#define INPUT_T3 8 /* T- */ -#define INPUT_WND 0x10 /* */ -#define INPUT_HMD 0x20 /* */ -#define SENSOR_B (INPUT_B <<8) /* - (e.g. CAN-)*/ +// access levels +#define code_Lev1 (sdt->code_lev[0]) // remote observer - only information +#define code_Lev2 (sdt->code_lev[1]) // local observer - input coordinates +#define code_Lev3 (sdt->code_lev[2]) // main observer - correction by A/Z, P2/F management +#define code_Lev4 (sdt->code_lev[3]) // operator - start/stop telescope, testing +#define code_Lev5 (sdt->code_lev[4]) // main operator - full access +#define code_Lev(x) (sdt->code_lev[(x-1)]) +// network settings +#define NetMask (sdt->netmask) // subnet mask (usually 255.255.255.0) +#define NetWork (sdt->netaddr) // subnet address (for ex.: 192.168.3.0) +#define ACSMask (sdt->acsmask) // ACS network mask (for ex.: 255.255.255.0) +#define ACSNet (sdt->acsaddr) // ACS subnet address (for ex.: 192.168.13.0) +// meteo data +#define MeteoMode (sdt->meteo_stat) +enum{ + INPUT_B = 1 // pressure + ,INPUT_T1 = 2 // external T + ,INPUT_T2 = 4 // in-dome T + ,INPUT_T3 = 8 // mirror T + ,INPUT_WND = 0x10 // wind speed + ,INPUT_HMD = 0x20 // humidity +}; +#define SENSOR_B (INPUT_B <<8) // external data flags #define SENSOR_T1 (INPUT_T1 <<8) #define SENSOR_T2 (INPUT_T2 <<8) #define SENSOR_T3 (INPUT_T3 <<8) #define SENSOR_WND (INPUT_WND<<8) #define SENSOR_HMD (INPUT_HMD<<8) -#define ADC_B (INPUT_B <<16) /* . */ +#define ADC_B (INPUT_B <<16) // reading from ADC flags #define ADC_T1 (INPUT_T1 <<16) #define ADC_T2 (INPUT_T2 <<16) #define ADC_T3 (INPUT_T3 <<16) #define ADC_WND (INPUT_WND<<16) #define ADC_HMD (INPUT_HMD<<16) -#define NET_B (INPUT_B <<24) /* */ +#define NET_B (INPUT_B <<24) // got by network flags #define NET_T1 (INPUT_T1 <<24) #define NET_WND (INPUT_WND<<24) #define NET_HMD (INPUT_HMD<<24) - double inp_b, inp_t1, inp_t2, inp_t3, inp_wnd; -#define inp_B (sdt->inp_b) /* e (...)*/ -#define inp_T1 (sdt->inp_t1) /* . (.)*/ -#define inp_T2 (sdt->inp_t2) /* .(.)*/ -#define inp_T3 (sdt->inp_t3) /* (.)*/ -#define inp_Wnd (sdt->inp_wnd) /* (/)*/ - - double temper, press; -#define Temper (sdt->temper) /* */ -#define Pressure (sdt->press) /* */ - double m_time10, m_time15; -#define Wnd10_time (sdt->m_time10) /* >=10/*/ -#define Wnd15_time (sdt->m_time15) /* - " - - " - - " - >=15/*/ - - /* IERS DUT1 (: ftp://maia.usno.navy.mil/ser7/ser7.dat) */ - double dut1; -#define DUT1 (sdt->dut1) /* . : DUT1 = UT1-UTC */ - - double a_time, z_time, p_time; -#define A_time (sdt->a_time) /* A */ -#define Z_time (sdt->z_time) /* - " - - " - - " - Z */ -#define P_time (sdt->p_time) /* - " - - " - - " - P */ - - double speedain, speedzin, speedpin; -#define speedAin (sdt->speedain) /* - A */ -#define speedZin (sdt->speedzin) /* - Z */ -#define speedPin (sdt->speedpin) /* - P2*/ - - double acc_a, acc_z, acc_p, acc_f, acc_d; -#define acc_A (sdt->acc_a) /* A ("/^2) */ -#define acc_Z (sdt->acc_z) /* - " - Z - " - */ -#define acc_P (sdt->acc_p) /* - " - P - " - */ -#define acc_F (sdt->acc_f) /* - " - F - " - */ -#define acc_D (sdt->acc_d) /* - " - D - " - */ - - uint code_sew; -#define code_SEW (sdt->code_sew) /* . SEW- */ - -/* SEW- */ -//struct __attribute__((packed)) SEWdata { -struct SEWdata { - int status; - double set_speed; - double mes_speed; - double current; - int index; - union { - unsigned char b[4]; - __uint32_t l; - } value; -} sewdrv[3]; -#define statusSEW(Drv) (sdt->sewdrv[(Drv)-1].status) /* */ +// input meteo values +#define inp_B (sdt->inp_b) // atm.pressure (mm.hg) +#define inp_T1 (sdt->inp_t1) // ext T +#define inp_T2 (sdt->inp_t2) // in-dome T +#define inp_T3 (sdt->inp_t3) // mirror T +#define inp_Wnd (sdt->inp_wnd) // wind +// values used for refraction calculation +#define Temper (sdt->temper) +#define Pressure (sdt->press) +// last wind gust time +#define Wnd10_time (sdt->m_time10) +#define Wnd15_time (sdt->m_time15) +// IERS DUT1 +#define DUT1 (sdt->dut1) +// sensors reading time +#define A_time (sdt->a_time) +#define Z_time (sdt->z_time) +#define P_time (sdt->p_time) +// input speeds +#define speedAin (sdt->speedain) +#define speedZin (sdt->speedzin) +#define speedPin (sdt->speedpin) +// acceleration (''/sec^2) +#define acc_A (sdt->acc_a) +#define acc_Z (sdt->acc_z) +#define acc_P (sdt->acc_p) +#define acc_F (sdt->acc_f) +#define acc_D (sdt->acc_d) +// SEW code +#define code_SEW (sdt->code_sew) +// sew data +#define statusSEW(Drv) (sdt->sewdrv[(Drv)-1].status) #define statusSEW1 (sdt->sewdrv[0].status) #define statusSEW2 (sdt->sewdrv[1].status) #define statusSEW3 (sdt->sewdrv[2].status) -#define speedSEW(Drv) (sdt->sewdrv[(Drv)-1].set_speed) /* */ -#define speedSEW1 (sdt->sewdrv[0].set_speed) /* / (rpm)*/ +#define speedSEW(Drv) (sdt->sewdrv[(Drv)-1].set_speed) +#define speedSEW1 (sdt->sewdrv[0].set_speed) #define speedSEW2 (sdt->sewdrv[1].set_speed) #define speedSEW3 (sdt->sewdrv[2].set_speed) -#define vel_SEW(Drv) (sdt->sewdrv[(Drv)-1].mes_speed) /* */ -#define vel_SEW1 (sdt->sewdrv[0].mes_speed) /* / (rpm)*/ +#define vel_SEW(Drv) (sdt->sewdrv[(Drv)-1].mes_speed) +#define vel_SEW1 (sdt->sewdrv[0].mes_speed) #define vel_SEW2 (sdt->sewdrv[1].mes_speed) #define vel_SEW3 (sdt->sewdrv[2].mes_speed) -#define currentSEW(Drv) (sdt->sewdrv[(Drv)-1].current) /* ()*/ +#define currentSEW(Drv) (sdt->sewdrv[(Drv)-1].current) #define currentSEW1 (sdt->sewdrv[0].current) #define currentSEW2 (sdt->sewdrv[1].current) #define currentSEW3 (sdt->sewdrv[2].current) -#define indexSEW(Drv) (sdt->sewdrv[(Drv)-1].index) /* */ +#define indexSEW(Drv) (sdt->sewdrv[(Drv)-1].index) #define indexSEW1 (sdt->sewdrv[0].index) #define indexSEW2 (sdt->sewdrv[1].index) #define indexSEW3 (sdt->sewdrv[2].index) -#define valueSEW(Drv) (sdt->sewdrv[(Drv)-1].value.l) /* */ +#define valueSEW(Drv) (sdt->sewdrv[(Drv)-1].value.l) #define valueSEW1 (sdt->sewdrv[0].value.l) #define valueSEW2 (sdt->sewdrv[1].value.l) #define valueSEW3 (sdt->sewdrv[2].value.l) -#define bvalSEW(Drv,Nb) (sdt->sewdrv[(Drv)-1].value.b[Nb]) /* */ - -/* PEP- */ - uint pep_code_a, pep_code_z, pep_code_p; -#define PEP_code_A (sdt->pep_code_a) /* 23- . A */ -#define PEP_code_Z (sdt->pep_code_z) /* - "" - Z */ -#define PEP_code_P (sdt->pep_code_p) /* - "" - P */ - uint pep_sw_a, pep_sw_z, pep_sw_p; -#define switch_A (sdt->pep_sw_a) /* */ -#define Sw_minus_A 1 /* (. code_KOST&0x8000)*/ -#define Sw_plus240_A 2 /* "+240" */ -#define Sw_minus240_A 4 /* "-240" */ -#define Sw_minus45_A 8 /* " " (~-46)*/ -#define switch_Z (sdt->pep_sw_z) /* Z */ -#define Sw_0_Z 0x01 /* "0" */ -#define Sw_5_Z 0x02 /* "5" */ -#define Sw_20_Z 0x04 /* "20" */ -#define Sw_60_Z 0x08 /* "60" */ -#define Sw_80_Z 0x10 /* "80" */ -#define Sw_90_Z 0x20 /* "90" */ -#define switch_P (sdt->pep_sw_p) /* - "" - */ -#define Sw_No_P 0x00 /* " " */ -#define Sw_22_P 0x01 /* "22" */ -#define Sw_89_P 0x02 /* "89" */ -#define Sw_Sm_P 0x80 /* */ - uint pep_code_f, pep_code_d, pep_code_ri, pep_code_ro; -#define PEP_code_F (sdt->pep_code_f) /* */ -#define PEP_code_D (sdt->pep_code_d) /* */ -#define PEP_code_Rin (sdt->pep_code_ri)/* */ -#define PEP_code_Rout (sdt->pep_code_ro)/* */ - unsigned char pep_on[10]; /* PEP- */ +#define bvalSEW(Drv,Nb) (sdt->sewdrv[(Drv)-1].value.b[Nb]) +// 23-digit PEP-controllers code +#define PEP_code_A (sdt->pep_code_a) +#define PEP_code_Z (sdt->pep_code_z) +#define PEP_code_P (sdt->pep_code_p) +// PEP end-switches code +#define switch_A (sdt->pep_sw_a) +enum{ + Sw_minus_A = 1 // negative A value + ,Sw_plus240_A = 2 // end switch +240degr + ,Sw_minus240_A = 4 // end switch -240degr + ,Sw_minus45_A = 8 // "horizon" end switch +}; +#define switch_Z (sdt->pep_sw_z) +enum{ + Sw_0_Z = 1 + ,Sw_5_Z = 2 + ,Sw_20_Z = 4 + ,Sw_60_Z = 8 + ,Sw_80_Z = 0x10 + ,Sw_90_Z = 0x20 +}; +#define switch_P (sdt->pep_sw_p) +enum{ + Sw_No_P = 0 // no switches + ,Sw_22_P = 1 // 22degr + ,Sw_89_P = 2 // 89degr + ,Sw_Sm_P = 0x80 // Primary focus smoke sensor +}; +// PEP codes +#define PEP_code_F (sdt->pep_code_f) +#define PEP_code_D (sdt->pep_code_d) +#define PEP_code_Rin (sdt->pep_code_ri) +#define PEP_code_Rout (sdt->pep_code_ro) +// PEP flags #define PEP_A_On (sdt->pep_on[0]) #define PEP_A_Off (PEP_A_On==0) #define PEP_Z_On (sdt->pep_on[1]) @@ -628,532 +642,209 @@ struct SEWdata { #define PEP_K_On (sdt->pep_on[6]) #define PEP_K_Off ((PEP_K_On&1)==0) #define PEP_K_Inp ((PEP_K_On&2)!=0) - - /* IERS polar motion (: ftp://maia.usno.navy.mil/ser7/ser7.dat) */ - double xpol, ypol; -#define polarX (sdt->xpol) /* X-a . */ -#define polarY (sdt->ypol) /* Y-a . */ - - double jdate, eetime; -#define JDate (sdt->jdate) /* */ -#define EE_time (sdt->eetime) /* ... "Equation of the Equinoxes" */ - - /* - */ - double val_hmd, inp_hmd; -#define val_Hmd (sdt->val_hmd) /* (%) */ -#define inp_Hmd (sdt->val_hmd) /* */ - - /* () */ - double worm_a, worm_z; -#define worm_A (sdt->worm_a) /* A () */ -#define worm_Z (sdt->worm_z) /* Z () */ - - /* */ - __uint32_t lock_flags; +// IERS polar motion +#define polarX (sdt->xpol) +#define polarY (sdt->ypol) +// current Julian date, sidereal time correction by "Equation of the Equinoxes" +#define JDate (sdt->jdate) +#define EE_time (sdt->eetime) +// humidity value (%%) & hand input +#define val_Hmd (sdt->val_hmd) +#define inp_Hmd (sdt->val_hmd) +// worm position, mkm +#define worm_A (sdt->worm_a) +#define worm_Z (sdt->worm_z) +// locking flags #define LockFlags (sdt->lock_flags) -#define Lock_A 0x01 -#define Lock_Z 0x02 -#define Lock_P 0x04 -#define Lock_F 0x08 -#define Lock_D 0x10 +enum{ + Lock_A = 1 + ,Lock_Z = 2 + ,Lock_P = 4 + ,Lock_F = 8 + ,Lock_D = 0x10 +}; #define A_Locked (LockFlags&Lock_A) #define Z_Locked (LockFlags&Lock_Z) #define P_Locked (LockFlags&Lock_P) #define F_Locked (LockFlags&Lock_F) #define D_Locked (LockFlags&Lock_D) - - /* ( - SEW-)*/ - int sew_dome_speed; /* Dome_State */ -#define Dome_Speed (sdt->sew_dome_speed) /* .. D_Lplus,D_Lminus,.... */ - -/* SEW- ( )*/ - int sew_dome_num; +// SEW dome divers speed +#define Dome_Speed (sdt->sew_dome_speed) +// SEW dome drive number (for indication) #define DomeSEW_N (sdt->sew_dome_num) - -/* (DomeSEW_N) SEW- */ -struct SEWdata sewdomedrv; -#define statusSEWD (sdt->sewdomedrv.status) /* */ -#define speedSEWD (sdt->sewdomedrv.set_speed) /* / (rpm)*/ +// SEW dome driver parameters +#define statusSEWD (sdt->sewdomedrv.status) // controller status +#define speedSEWD (sdt->sewdomedrv.set_speed) // speed, rpm #define vel_SEWD (sdt->sewdomedrv.mes_speed) /* / (rpm)*/ -#define currentSEWD (sdt->sewdomedrv.current) /* ()*/ -#define indexSEWD (sdt->sewdomedrv.index) /* */ -#define valueSEWD (sdt->sewdomedrv.value.l) /* */ - -/* PEP- */ - uint pep_code_di, pep_code_do; -#define PEP_code_Din (sdt->pep_code_di) /* PEP- */ +#define currentSEWD (sdt->sewdomedrv.current) // current, A +#define indexSEWD (sdt->sewdomedrv.index) // parameter index +#define valueSEWD (sdt->sewdomedrv.value.l) // parameter value +// dome PEP codes +#define PEP_code_Din (sdt->pep_code_di) // data in #define PEP_Dome_SEW_Ok 0x200 #define PEP_Dome_Cable_Ok 0x100 -#define PEP_code_Dout (sdt->pep_code_do) /* PEP- */ -#define PEP_Dome_SEW_On 0x10 -#define PEP_Dome_SEW_Off 0x20 +#define PEP_code_Dout (sdt->pep_code_do) // data out +#define PEP_Dome_SEW_On 0x10 +#define PEP_Dome_SEW_Off 0x20 + +/******************************************************************************* +* BTA data structure * +*******************************************************************************/ + +#define BTA_Data_Ver 2 +struct BTA_Data { + int32_t magic; // magic value + int32_t version; // BTA_Data_Ver + int32_t size; // sizeof(struct BTA_Data) + int32_t pid; // main process PID + int32_t model; // model modes + int32_t timer; // timer selected + int32_t system; // main system mode + int32_t sys_target; // system pointing target + int32_t tel_focus; // telescope focus type + double pc_coeff[8]; // pointing correction system coefficients + int32_t tel_state; // telescope state + int32_t req_state; // new (required) state + int32_t tel_hard_state; // Power state + int32_t tel_mode; // telescope mode + int32_t az_mode; // azimuth reverce + int32_t p2_state; // P2 motor state + int32_t p2_req_mode; // P2 required state + int32_t focus_state; // focus motor state + int32_t dome_state; // dome motors state + int32_t pcor_mode; // pointing correction mode + int32_t trkok_mode; // tracking mode + double i_alpha, i_delta; // input values + double s_alpha, s_delta; // source + double v_alpha, v_delta; // intrinsic vel. + double i_azim, i_zdist; // input A/Z + double c_alpha, c_delta; // calculated values + double tag_a, tag_z, tag_p; // current values (from sensors) + double pcor_a, pcor_z, refr_z; // calculated corrections + double tcor_a, tcor_z, tref_z; // reverse calculation corr. + double diff_a, diff_z, diff_p; // coords difference + double vbasea,vbasez,vbasep; // base object velocity + double diffva,diffvz,diffvp; // correction by real speed + double speeda,speedz,speedp; // motor speed + double m_time_precip; // last precipitation time + uint8_t reserve[16]; // reserved + double rspeeda, rspeedz, rspeedp; // real motor speed (''/sec) + double simvela, simvelz, simvelp, simvelf, simveld; // model speed + uint32_t kost; // telescope & hand correction state + double m_time, s_time, l_time; // different time (UTC, stellar, local) + uint32_t ppndd_a, ppndd_z, ppndd_p, ppndd_b; // PPNDD sensor (rough) code + uint32_t dup_a, dup_z, dup_p, dup_f, dup_d; // DUP sensor (precise) code (Gray code) + uint32_t low_a, low_z, low_p, low_f, low_d; // binary 14-digit precise code + uint32_t code_a, code_z, code_p, code_b, code_f, code_d; // binary 23-digit rough code + uint32_t adc[8]; // ADC PCL818 (8-channel) codes + double val_a, val_z, val_p, val_b, val_f, val_d; + double val_t1, val_t2, val_t3, val_wnd; // calculated values + double val_alp, val_del; // RA/Decl calculated by A/Z + double vel_a, vel_z, vel_p, vel_f, vel_d; // measured speed + // system messages queue + struct SysMesg { + int32_t seq_num; + char type; // message type + char text[MesgLen]; // message itself + } sys_msg_buf[MesgNum]; + // access levels + uint32_t code_lev[5]; + // network settings + uint32_t netmask, netaddr, acsmask, acsaddr; + int32_t meteo_stat; // meteo data + double inp_b, inp_t1, inp_t2, inp_t3, inp_wnd; // input meteo values + double temper, press; // values used for refraction calculation + double m_time10, m_time15; // last wind gust time + double dut1; // IERS DUT1 (src: ftp://maia.usno.navy.mil/ser7/ser7.dat), DUT1 = UT1-UTC + double a_time, z_time, p_time; // sensors reading time + double speedain, speedzin, speedpin; // input speeds + double acc_a, acc_z, acc_p, acc_f, acc_d; // acceleration (''/sec^2) + uint32_t code_sew; // SEW code + struct SEWdata { // sew data + int32_t status; + double set_speed; // target speed, rpm + double mes_speed; // measured speed, rpm + double current; // measured current, A + int32_t index; // parameter number + union{ // parameter code + uint8_t b[4]; + uint32_t l; + } value; + } sewdrv[3]; + uint32_t pep_code_a, pep_code_z, pep_code_p; // 23-digit PEP-controllers code + uint32_t pep_sw_a, pep_sw_z, pep_sw_p; // PEP end-switches code + uint32_t pep_code_f, pep_code_d, pep_code_ri, pep_code_ro; // PEP codes + uint8_t pep_on[10]; // PEP flags + double xpol, ypol; // IERS polar motion (src: ftp://maia.usno.navy.mil/ser7/ser7.dat) + double jdate, eetime; // current Julian date, sidereal time correction by "Equation of the Equinoxes" + double val_hmd, inp_hmd; // humidity value (%%) & hand input + double worm_a, worm_z; // worm position, mkm + /* */ + uint32_t lock_flags; // locking flags + int32_t sew_dome_speed; // SEW dome divers speed: D_Lplus, D_Hminus etc + int32_t sew_dome_num; // SEW dome drive number (for indication) + struct SEWdata sewdomedrv; // SEW dome driver parameters + uint32_t pep_code_di, pep_code_do; // dome PEP codes }; -#ifndef BTA_MODULE -struct BTA_Data *sdt; -#else extern struct BTA_Data *sdt; -#endif -struct BTA_Local { /* */ - unsigned char reserve[120]; /* */ - /* ( 1500 ) */ - double pr_oil_a,pr_oil_z,pr_oil_t; -#define PressOilA (sdtl->pr_oil_a) /* A () */ -#define PressOilZ (sdtl->pr_oil_z) /* Z () */ -#define PressOilTank (sdtl->pr_oil_t) /* () */ - double t_oil_1,t_oil_2; -#define OilTemper1 (sdtl->t_oil_1) /* */ -#define OilTemper2 (sdtl->t_oil_2) /* */ +/******************************************************************************* +* Local data structure * +*******************************************************************************/ +// Oil pressure, MPa +#define PressOilA (sdtl->pr_oil_a) +#define PressOilZ (sdtl->pr_oil_z) +#define PressOilTank (sdtl->pr_oil_t) +// Oil themperature, degrC +#define OilTemper1 (sdtl->t_oil_1) // oil +#define OilTemper2 (sdtl->t_oil_2) // water + +// Local data structure +struct BTA_Local { + uint8_t reserve[120]; // reserved data + double pr_oil_a,pr_oil_z,pr_oil_t; // Oil pressure + double t_oil_1,t_oil_2; // Oil themperature +}; + +/** + * Message buffer structure + */ +struct my_msgbuf { + int32_t mtype; // message type + uint32_t acckey; // client access key + uint32_t src_pid; // source PID + uint32_t src_ip; // IP of command source or 0 for local + char mtext[100]; // message itself }; -#ifndef BTA_MODULE -struct BTA_Local *sdtl; /* , */ -#else extern struct BTA_Local *sdtl; -#endif +extern int snd_id; +extern int cmd_src_pid; +extern uint32_t cmd_src_ip; #define ClientSide 0 #define ServerSide 1 #ifndef BTA_MODULE -static void bta_data_init(); -static int bta_data_check(); -static void bta_data_close(); - -/* (" ") */ -struct SHM_Block sdat = { -{'S','d','a','t',0},sizeof(struct BTA_Data),2048,0444,SHM_RDONLY,bta_data_init,bta_data_check,bta_data_close,0,-1,NULL -}; -#else -extern struct SHM_Block sdat; +void bta_data_init(); +int bta_data_check(); +void bta_data_close(); +int get_shm_block(struct SHM_Block *sb, int server); +int close_shm_block(struct SHM_Block *sb); +void get_cmd_queue(struct CMD_Queue *cq, int server); #endif -#ifndef BTA_MODULE -/* ( " ") */ -static void bta_data_init() { - int i; - sdt = (struct BTA_Data *)sdat.addr; - sdtl = (struct BTA_Local *)(sdat.addr+sizeof(struct BTA_Data)); - if(sdat.side == ClientSide) { - if(sdt->magic != sdat.key.code) { - fprintf(stderr,"Wrong shared data (maybe server turned off)\n"); - /*exit(1);*/ - } - if(sdt->version == 0) { - fprintf(stderr,"Null shared data version (maybe server turned off)\n"); - /*exit(1);*/ - } - else if(sdt->version != BTA_Data_Ver) { - fprintf(stderr,"Wrong shared data version: I'am - %d, but server - %d ...\n", - BTA_Data_Ver, sdt->version ); - /*exit(1);*/ - } - if(sdt->size != sdat.size) { - if(sdt->size > sdat.size) { - /* */ - fprintf(stderr,"Wrong shared area size: I needs - %d, but server - %d ...\n", - sdat.size, sdt->size ); - } else { - /* "" */ - /* ! */ - fprintf(stderr,"Attention! Too little shared data structure!\n"); - sleep(1); - fprintf(stderr,"I needs - %d, but server gives only %d ...\n", - sdat.size, sdt->size ); - sleep(1); - fprintf(stderr,"May be server's version too old!?\n"); - /* exit(1); */ +int check_shm_block(struct SHM_Block *sb); - } - } - return; - } - /* ServerSide */ - if(sdt->magic != sdat.key.code || - sdt->version != BTA_Data_Ver || - sdt->size != sdat.size) { +void encode_lev_passwd(char *passwd, int nlev, uint32_t *keylev, uint32_t *codlev); +int find_lev_passwd(char *passwd, uint32_t *keylev, uint32_t *codlev); +int check_lev_passwd(char *passwd); +void set_acckey(uint32_t newkey); - for(i=0; imagic = sdat.key.code; - sdt->version = BTA_Data_Ver; - sdt->size = sdat.size; - ServPID = 0; - UseModel = NoModel; - ClockType = Ch7_15; - Sys_Mode = SysStop; - Sys_Target = TagPosition; - Tel_Focus = Prime; - Tel_Hardware = Hard_On; - Tel_Mode = Automatic; - Az_Mode = Rev_Off; - P2_State = P2_Mode = P2_Off; - Foc_State = Foc_Off; - Dome_State = D_Off; - Pos_Corr = PC_On; - TrkOk_Mode = UseDiffVel | UseDiffAZ ; - InpAlpha=InpDelta= 0.; - SrcAlpha=SrcDelta= 0.; - VelAlpha=VelDelta= 0.; - CurAlpha=CurDelta= 0.; - InpAzim=InpZdist = 0.; - Diff_A=Diff_Z=Diff_P=0.0; - pos_cor_A=pos_cor_Z=refract_Z = 0.; - tel_cor_A=tel_cor_Z=tel_ref_Z = 0.; - vel_objA=vel_objZ=vel_objP = 0.; - diff_vA=diff_vZ=diff_vP=0.; - speedA = speedZ = speedP = 0.; - req_speedA = req_speedZ = req_speedP = 0.; - mod_vel_A=mod_vel_Z=mod_vel_P=mod_vel_F=mod_vel_D=0.; - code_KOST = 0; - M_time = S_time = L_time = 0.; - ppndd_A=ppndd_Z=ppndd_P=ppndd_B=0; - dup_A=dup_Z=dup_P=dup_F=dup_D=0; - low_A=low_Z=low_P=low_F=low_D=0; - code_A=code_Z=code_P=code_B=code_F=code_D=code_T1=code_T2=code_T3=code_Wnd=0; - val_A=val_Z=val_P=val_B=val_F=val_D=val_T1=val_T2=val_T3=val_Wnd=val_Alp=val_Del=0.; - vel_A=vel_Z=vel_P=vel_F=vel_D=0.; - for(i=0; imagic == sdat.key.code) && (sdt->version == BTA_Data_Ver) ); -} -static void bta_data_close() { - if(sdat.side == ServerSide) { - sdt->magic = 0; - sdt->version = 0; - } -} - -/* ??? */ -/*struct SHM_Block info = {{'I','n','f','o',0},1024,1024,0444,SHM_RDONLY,NULL,NULL,NULL,0,-1,NULL};*/ - -/* Allocate shared memory segment */ -static int get_shm_block( struct SHM_Block *sb, int server) { - int getsize = (server)? sb->maxsize : sb->size; - - /* first try to find existing one */ - sb->id = shmget(sb->key.code, getsize, sb->mode); - - if (sb->id<0 && errno==ENOENT && server) { - /* if no - try to create a new one */ - int cresize = sb->maxsize; - if(sb->size > cresize) { - fprintf(stderr,"Wrong shm maxsize(%d) < realsize(%d)\n",sb->maxsize,sb->size); - cresize = sb->size; - } - sb->id = shmget(sb->key.code, cresize, IPC_CREAT|IPC_EXCL|sb->mode); - } - if (sb->id<0) { - char msg[80]; - if(server) - sprintf(msg,"Can't create shared memory segment '%s'",sb->key.name); - else - sprintf(msg,"Can't find shared segment '%s' (maybe no server process) ",sb->key.name); - perror(msg); - return 0; - } - /* attach it to our memory space */ - sb->addr = (unsigned char *)shmat ( sb->id, NULL, sb->atflag ); - - if ((int)(sb->addr) == -1) { - char msg[80]; - sprintf(msg,"Can't attach shared memory segment '%s'",sb->key.name); - perror(msg); - return 0; - } - if(server) { - if(shmctl(sb->id, SHM_LOCK, NULL) < 0) { - char msg[80]; - sprintf(msg,"Can't prevents swapping of shared memory segment '%s'",sb->key.name); - perror(msg); - return 0; - } - } - fprintf(stderr,"Create&attach shared memory segment '%s' %dbytes at %x \n", - sb->key.name, sb->size, (uint)sb->addr); - - sb->side = server; - - if(sb->init!=NULL) - sb->init(); - return 1; -} -static int close_shm_block( struct SHM_Block *sb) { - int ret; - if(sb->close != NULL) - sb->close(); - if(sb->side == ServerSide) { -// ret = shmctl(sb->id, SHM_UNLOCK, NULL); - ret = shmctl(sb->id, IPC_RMID, NULL); - } - ret = shmdt (sb->addr); - return(ret); -} -#endif - -static int check_shm_block( struct SHM_Block *sb) { - if(sb->check != NULL) - return(sb->check()); - else return(0); -} - -#ifndef BTA_MODULE -int snd_id=-1; /* ( ?) */ -int cmd_src_pid=0; /* . */ -__uint32_t cmd_src_ip=0; /* IP-. . */ -#else -extern int snd_id; -extern int cmd_src_pid; -extern __uint32_t cmd_src_ip; -#endif - -#ifndef BTA_MODULE -/* Create|Find command queue */ -static void get_cmd_queue( struct CMD_Queue *cq, int server) { - if (!server && cq->id>=0) { /* if already in use */ - snd_id = cq->id; /* set current... */ - return; - } - /* first try to find existing one */ - cq->id = msgget(cq->key.code, cq->mode); - if (cq->id<0 && errno==ENOENT && server) - /* if no - try to create a new one */ - cq->id = msgget(cq->key.code, IPC_CREAT|IPC_EXCL|cq->mode); - if (cq->id<0) { - char msg[80]; - if(server) - sprintf(msg,"Can't create comand queue '%s'",cq->key.name); - else - sprintf(msg,"Can't find comand queue '%s' (maybe no server process) ",cq->key.name); - perror(msg); - return; - } - cq->side = server; - if (server) { - char buf[120]; /* */ - while(msgrcv(cq->id, (struct msgbuf *)buf, 112, 0, IPC_NOWAIT)>0); - } else - snd_id = cq->id; - cq->acckey = 0; -} -#endif - -/* . */ -static void set_acckey(uint newkey) { - if (snd_id<0) return; - if(ucmd.id==snd_id) ucmd.acckey=newkey; - else if(ocmd.id==snd_id) ocmd.acckey=newkey; - else if(mcmd.id==snd_id) mcmd.acckey=newkey; -} - -/* . */ -/* : IP=0( ) PID . */ -static void set_cmd_src(__uint32_t ip, int pid) { - cmd_src_pid = pid; - cmd_src_ip = ip; -} - -/* */ -struct my_msgbuf { - __int32_t mtype; /* type of message */ - __uint32_t acckey; /* */ - __uint32_t src_pid; /* */ - __uint32_t src_ip; /* IP-. , =0 - */ - char mtext[100]; /* message text */ -}; -/* */ -static void send_cmd(int cmd_code, char *buf, int size) { - struct my_msgbuf mbuf; - - if (snd_id<0) return; - if (size>100) size=100; - if (cmd_code>0) - mbuf.mtype = cmd_code; - else - return; - if(ucmd.id==snd_id) mbuf.acckey=ucmd.acckey; - else if(ocmd.id==snd_id) mbuf.acckey=ocmd.acckey; - else if(mcmd.id==snd_id) mbuf.acckey=mcmd.acckey; - - mbuf.src_pid = cmd_src_pid? cmd_src_pid : getpid(); - mbuf.src_ip = cmd_src_ip; - cmd_src_pid = cmd_src_ip = 0; - - if(size>0) - memcpy( mbuf.mtext, buf, size); - else { - mbuf.mtext[0] = 0; - size = 1; - } - msgsnd( snd_id, (struct msgbuf *)&mbuf, size+12, IPC_NOWAIT); -} -static void send_cmd_noarg(int cmd_code) { - send_cmd(cmd_code, NULL, 0); -} -static void send_cmd_str(int cmd_code, char *arg) { - send_cmd(cmd_code, arg, strlen(arg)+1); -} -static void send_cmd_i1(int cmd_code, int arg1) { - send_cmd(cmd_code, (char *)&arg1, sizeof(int)); -} -static void send_cmd_i2(int cmd_code, int arg1, int arg2) { - int ibuf[2]; - ibuf[0] = arg1; - ibuf[1] = arg2; - send_cmd(cmd_code, (char *)ibuf, 2*sizeof(int)); -} -static void send_cmd_i3(int cmd_code, int arg1, int arg2, int arg3) { - int ibuf[3]; - ibuf[0] = arg1; - ibuf[1] = arg2; - ibuf[2] = arg3; - send_cmd(cmd_code, (char *)ibuf, 3*sizeof(int)); -} -static void send_cmd_i4(int cmd_code, int arg1, int arg2, int arg3, int arg4) { - int ibuf[4]; - ibuf[0] = arg1; - ibuf[1] = arg2; - ibuf[2] = arg3; - ibuf[3] = arg4; - send_cmd(cmd_code, (char *)ibuf, 4*sizeof(int)); -} -static void send_cmd_d1(int cmd_code, double arg1) { - send_cmd(cmd_code, (char *)&arg1, sizeof(double)); -} -static void send_cmd_d2(int cmd_code, double arg1, double arg2) { - double dbuf[2]; - dbuf[0] = arg1; - dbuf[1] = arg2; - send_cmd(cmd_code, (char *)dbuf, 2*sizeof(double)); -} -static void send_cmd_i1d1(int cmd_code, int arg1, double arg2) { - struct { - int ival; - double dval; - } buf; - buf.ival = arg1; - buf.dval = arg2; - send_cmd(cmd_code, (char *)&buf, sizeof(buf)); -} -static void send_cmd_i2d1(int cmd_code, int arg1, int arg2, double arg3) { - struct { - int ival[2]; - double dval; - } buf; - buf.ival[0] = arg1; - buf.ival[1] = arg2; - buf.dval = arg3; - send_cmd(cmd_code, (char *)&buf, sizeof(buf)); -} -static void send_cmd_i3d1(int cmd_code, int arg1, int arg2, int arg3, double arg4) { - struct { - int ival[3]; - double dval; - } buf; - buf.ival[0] = arg1; - buf.ival[1] = arg2; - buf.ival[2] = arg3; - buf.dval = arg4; - send_cmd(cmd_code, (char *)&buf, sizeof(buf)); -} - -static void encode_lev_passwd(char *passwd, int nlev, uint *keylev, uint *codlev) { - char salt[4]; - char *encr; - union { - uint ui; - char c[4]; - } key,cod; - sprintf(salt,"L%1d",nlev); - encr = (char *)crypt(passwd, salt); - cod.c[0] = encr[2]; - key.c[0] = encr[3]; - cod.c[1] = encr[4]; - key.c[1] = encr[5]; - cod.c[2] = encr[6]; - key.c[2] = encr[7]; - cod.c[3] = encr[8]; - key.c[3] = encr[9]; - *keylev = key.ui; - *codlev = cod.ui; -} - -static int find_lev_passwd(char *passwd, uint *keylev, uint *codlev) { - int nlev; - for(nlev=5; nlev>0; nlev--) { - encode_lev_passwd(passwd, nlev, keylev, codlev); - if(nlev == 1 && code_Lev1 == *codlev) break; - if(nlev == 2 && code_Lev2 == *codlev) break; - if(nlev == 3 && code_Lev3 == *codlev) break; - if(nlev == 4 && code_Lev4 == *codlev) break; - if(nlev == 5 && code_Lev5 == *codlev) break; - } - return(nlev); -} - -static int check_lev_passwd(char *passwd) { - uint keylev,codlev; - int nlev; - nlev = find_lev_passwd(passwd, &keylev, &codlev); - if(nlev>0) set_acckey(keylev); - return(nlev); -} - -#pragma GCC diagnostic pop +// restore packing +#pragma pack(pop) +//#pragma GCC diagnostic pop #endif // __BTA_SHDATA_H__ diff --git a/camtools.c b/camtools.c index d02ca83..5cf21c9 100644 --- a/camtools.c +++ b/camtools.c @@ -37,114 +37,114 @@ double avr, std; // average value and standard deviation * if user set option fan-speed=F, then speed would be set to F * if onoff == FALSE, try to set speed according to hot Peltier temperature * if onoff == TRUE, set speed=3, if cooler is on, else set speed=0 - */ + * void AutoadjustFanSpeed(bool onoff){ - int Mode = 3, curMode, stat; - double temp, HotTemp; - stat = ApnGlueGetTemp(&temp); - curMode = ApnGlueGetFan(); - HotTemp = ApnGlueGetHotTemp(); - if(fanspd != -1){ - ApnGlueSetFan(fanspd); - } - if(HotTemp < -30.){ // -255. - there's no thermometer on hot side - // " \"\" " - info(_("Your camera have no hot temperature sensor\n")); - return; - } - if(onoff){ // quit, set speed according cooler status - if(!stat && HotTemp < 30.) Mode = 0; // cooler is off -> turn fans off - }else{ - if(HotTemp < 20.) Mode = 0; - else if(HotTemp < 25.) Mode = 1; - else if(HotTemp < 30.) Mode = 2; - } - if(Mode == curMode) return; - ApnGlueSetFan(Mode); - if(ApnGlueGetFan() == Mode) - // " %d\n" - info(_("Set fan speed %d\n"), Mode); - else - // " !\n" - ERR("Can't set fan speed\n"); -} + int Mode = 3, curMode, stat; + double temp, HotTemp; + stat = ApnGlueGetTemp(&temp); + curMode = ApnGlueGetFan(); + HotTemp = ApnGlueGetHotTemp(); + if(fanspd != -1){ + ApnGlueSetFan(fanspd); + } + if(HotTemp < -30.){ // -255. - there's no thermometer on hot side + // " \"\" " + info(_("Your camera have no hot temperature sensor\n")); + return; + } + if(onoff){ // quit, set speed according cooler status + if(!stat && HotTemp < 30.) Mode = 0; // cooler is off -> turn fans off + }else{ + if(HotTemp < 20.) Mode = 0; + else if(HotTemp < 25.) Mode = 1; + else if(HotTemp < 30.) Mode = 2; + } + if(Mode == curMode) return; + ApnGlueSetFan(Mode); + if(ApnGlueGetFan() == Mode) + // " %d\n" + info(_("Set fan speed %d\n"), Mode); + else + // " !\n" + ERR("Can't set fan speed\n"); +}*/ double printCoolerStat(double *t_ext){ - double temp, extemp, settemp; - char *s; - int stat = ApnGlueGetTemp(&temp); - extemp = ApnGlueGetHotTemp(); - if(ApnGlueReadSetPoint(&settemp, NULL)){ - // " : %g\n" - info(_("Cooler setpoint: %g\n"), settemp); - } - switch(stat){ - case 0: - // " " - s = _("Cooler is off"); break; - case 1: - // " " - s = _("Go to setpoint"); break; - case 2: - // " " - s = _("Keeping setpoint"); break; - default: - // " " - s = _("Unknown status"); - } - info("%s, T=%g, Thot=%g\n", s, temp, extemp); - if(t_ext) *t_ext = extemp; - return temp; + double temp, extemp, settemp; + char *s; + int stat = ApnGlueGetTemp(&temp); + extemp = ApnGlueGetHotTemp(); + if(ApnGlueReadSetPoint(&settemp, NULL)){ + // " : %g\n" + info(_("Cooler setpoint: %g\n"), settemp); + } + switch(stat){ + case 0: + // " " + s = _("Cooler is off"); break; + case 1: + // " " + s = _("Go to setpoint"); break; + case 2: + // " " + s = _("Keeping setpoint"); break; + default: + // " " + s = _("Unknown status"); + } + info("%s, T=%g, Thot=%g\n", s, temp, extemp); + if(t_ext) *t_ext = extemp; + return temp; } void print_stat(unsigned short *img, long size, FILE *f){ - long i, Noverld = 0L, N = 0L; - double pv, sum=0., sum2=0., sz = (double)size, tres; - unsigned short *ptr = img, val, valoverld; - max = 0; min = 65535; - if(twelveBit) min = 4095; - valoverld = min - 5; - for(i = 0; i < size; i++, ptr++){ - val = *ptr; - pv = (double) val; - sum += pv; - sum2 += (pv * pv); - if(max < val) max = val; - if(min > val) min = val; - if(val >= valoverld) Noverld++; - } - // " :\n" - printf(_("Image stat:\n")); - avr = sum/sz; - printf("avr = %.1f, std = %.1f, Noverload = %ld\n", avr, - std = sqrt(fabs(sum2/sz - avr*avr)), Noverld); - printf("max = %u, min = %u, size = %ld\n", max, min, size); - if(!f) return; - // full statistics - fprintf(f, "%d\t%d\t%.3f\t%.3f\t%ld\t", max, min, avr, std, Noverld); - Noverld = 0L; - ptr = img; sum = 0.; sum2 = 0.; - tres = avr + 3. * std; // max treshold == 3sigma - for(i = 0; i < size; i++, ptr++){ - val = *ptr; - pv = (double) val; - if(pv > tres){ - Noverld++; // now this is an amount of overload pixels - continue; - } - sum += pv; - sum2 += (pv * pv); - N++; - } - if(N == 0L){ - fprintf(f, "err\n"); - return; - } - sz = (double)N; - avr = sum/sz; std = sqrt(fabs(sum2/sz - avr*avr)); - fprintf(f, "%ld\t%.3f\t%.3f\n", Noverld, avr, std); - fflush(f); - printf("Novr3 = %ld\n", Noverld); + long i, Noverld = 0L, N = 0L; + double pv, sum=0., sum2=0., sz = (double)size, tres; + unsigned short *ptr = img, val, valoverld; + max = 0; min = 65535; + if(twelveBit) min = 4095; + valoverld = min - 5; + for(i = 0; i < size; i++, ptr++){ + val = *ptr; + pv = (double) val; + sum += pv; + sum2 += (pv * pv); + if(max < val) max = val; + if(min > val) min = val; + if(val >= valoverld) Noverld++; + } + // " :\n" + printf(_("Image stat:\n")); + avr = sum/sz; + printf("avr = %.1f, std = %.1f, Noverload = %ld\n", avr, + std = sqrt(fabs(sum2/sz - avr*avr)), Noverld); + printf("max = %u, min = %u, size = %ld\n", max, min, size); + if(!f) return; + // full statistics + fprintf(f, "%d\t%d\t%.3f\t%.3f\t%ld\t", max, min, avr, std, Noverld); + Noverld = 0L; + ptr = img; sum = 0.; sum2 = 0.; + tres = avr + 3. * std; // max treshold == 3sigma + for(i = 0; i < size; i++, ptr++){ + val = *ptr; + pv = (double) val; + if(pv > tres){ + Noverld++; // now this is an amount of overload pixels + continue; + } + sum += pv; + sum2 += (pv * pv); + N++; + } + if(N == 0L){ + fprintf(f, "err\n"); + return; + } + sz = (double)N; + avr = sum/sz; std = sqrt(fabs(sum2/sz - avr*avr)); + fprintf(f, "%ld\t%.3f\t%.3f\n", Noverld, avr, std); + fflush(f); + printf("Novr3 = %ld\n", Noverld); } @@ -162,171 +162,171 @@ void print_stat(unsigned short *img, long size, FILE *f){ int writefits(char *filename, int width, int height, void *data){ - long naxes[2] = {width, height};//, startTime; - double tmp = 0.0; - unsigned short ustmp; - struct tm *tm_starttime; - char buf[80]; - time_t savetime = time(NULL); - fitsfile *fp = NULL; - TRYFITS(fits_create_file, &fp, filename); - TRYFITS(fits_create_img, fp, USHORT_IMG, 2, naxes); - // FILE / Input file original name - WRITEKEY(TSTRING, "FILE", filename, "Input file original name"); - /* - * Detector parameters - */ - // DETECTOR / detector - if(camera){ - WRITEKEY(TSTRING, "DETECTOR", camera, "Detector model"); - } - // SENSOR / sensor - if(sensor){ - WRITEKEY(TSTRING, "SENSOR", sensor, "Camera sensor model"); - } - // INSTRUME / Instrument - if(instrument){ - WRITEKEY(TSTRING, "INSTRUME", instrument, "Instrument"); - }else - WRITEKEY(TSTRING, "INSTRUME", "direct imaging", "Instrument"); - snprintf(buf, 79, "%.g x %.g", pixX, pixY); - // PXSIZE / pixel size - WRITEKEY(TSTRING, "PXSIZE", buf, "Pixel size in mkm"); - // XPIXELSZ, YPIXELSZ -- the same - WRITEKEY(TDOUBLE, "XPIXELSZ", &pixX, "X pixel size in mkm"); - WRITEKEY(TDOUBLE, "YPIXELSZ", &pixY, "Y pixel size in mkm"); - WRITEKEY(TSTRING, "VIEWFLD", viewfield, "Camera field of view"); - if(exptime == 0) sprintf(buf, "bias"); - else if(shutter == 0) sprintf(buf, "dark"); - else if(objtype) strncpy(buf, objtype, 79); - else sprintf(buf, "object"); - // IMAGETYP / object, flat, dark, bias, scan, eta, neon, push - WRITEKEY(TSTRING, "IMAGETYP", buf, "Image type"); - // DATAMAX, DATAMIN / Max,min pixel value - ustmp = ((twelveBit) ? 4095 : 65535); - WRITEKEY(TUSHORT, "DATAMAX", &ustmp, "Max pixel value"); - ustmp = 0; - WRITEKEY(TUSHORT, "DATAMIN", &ustmp, "Min pixel value"); - // Some Statistics - WRITEKEY(TUSHORT, "STATMAX", &max, "Max data value"); - WRITEKEY(TUSHORT, "STATMIN", &min, "Min data value"); - WRITEKEY(TDOUBLE, "STATAVR", &avr, "Average data value"); - WRITEKEY(TDOUBLE, "STATSTD", &std, "Standart deviation of data value"); - // Temperatures - WRITEKEY(TDOUBLE, "TEMP0", &temperature, "Camera temperature at exp. start (degr C)"); - WRITEKEY(TDOUBLE, "TEMP1", &t_int, "Camera temperature at exp. end (degr C)"); - if(t_ext > -30.) // there's a hot temp sensor - WRITEKEY(TDOUBLE, "TEMPBODY", &t_ext, "Camera body temperature at exp. end (degr C)"); - tmp = (temperature + t_int) / 2. + 273.15; - // CAMTEMP / Camera temperature (K) - WRITEKEY(TDOUBLE, "CAMTEMP", &tmp, "Camera temperature (K)"); - tmp = (double)exptime / 1000.; - // EXPTIME / actual exposition time (sec) - WRITEKEY(TDOUBLE, "EXPTIME", &tmp, "actual exposition time (sec)"); - // DATE / Creation date (YYYY-MM-DDThh:mm:ss, UTC) - strftime(buf, 79, "%Y-%m-%dT%H:%M:%S", gmtime(&savetime)); - WRITEKEY(TSTRING, "DATE", buf, "Creation date (YYYY-MM-DDThh:mm:ss, UTC)"); - tm_starttime = localtime(&expStartsAt); - /* - * startTime = (long)expStartsAt; - * strftime(buf, 79, "exposition starts at %d/%m/%Y, %H:%M:%S (local)", tm_starttime); - * WRITEKEY(fp, TLONG, "UNIXTIME", &startTime, buf); - */ - strftime(buf, 79, "%Y-%m-%dT%H:%M:%S", tm_starttime); - // DATE-OBS / DATE OF OBS. - WRITEKEY(TSTRING, "DATE-OBS", buf, "DATE OF OBS. (YYYY-MM-DDThh:mm:ss, local)"); - /* - * // START / Measurement start time (local) (hh:mm:ss) - * strftime(buf, 79, "%H:%M:%S", tm_starttime); - * WRITEKEY(fp, TSTRING, "START", buf, "Measurement start time (hh:mm:ss, local)"); - */ - // OBJECT / Object name - if(objname){ - WRITEKEY(TSTRING, "OBJECT", objname, "Object name"); - } - // BINNING / Binning - if(hbin != 1 || vbin != 1){ - snprintf(buf, 79, "%d x %d", hbin, vbin); - WRITEKEY(TSTRING, "BINNING", buf, "Binning (hbin x vbin)"); - } - WRITEKEY(TINT, "XBIN", &hbin, "Horizontal binning"); - WRITEKEY(TINT, "YBIN", &vbin, "Vertical binning"); - // OBSERVER / Observers - if(observers){ - WRITEKEY(TSTRING, "OBSERVER", observers, "Observers"); - } - // PROG-ID / Observation program identifier - if(prog_id){ - WRITEKEY(TSTRING, "PROG-ID", prog_id, "Observation program identifier"); - } - // AUTHOR / Author of the program - if(author){ - WRITEKEY(TSTRING, "AUTHOR", author, "Author of the program"); - } + long naxes[2] = {width, height};//, startTime; + double tmp = 0.0; + unsigned short ustmp; + struct tm *tm_starttime; + char buf[80]; + time_t savetime = time(NULL); + fitsfile *fp = NULL; + TRYFITS(fits_create_file, &fp, filename); + TRYFITS(fits_create_img, fp, USHORT_IMG, 2, naxes); + // FILE / Input file original name + WRITEKEY(TSTRING, "FILE", filename, "Input file original name"); + /* + * Detector parameters + */ + // DETECTOR / detector + if(camera){ + WRITEKEY(TSTRING, "DETECTOR", camera, "Detector model"); + } + // SENSOR / sensor + if(sensor){ + WRITEKEY(TSTRING, "SENSOR", sensor, "Camera sensor model"); + } + // INSTRUME / Instrument + if(instrument){ + WRITEKEY(TSTRING, "INSTRUME", instrument, "Instrument"); + }else + WRITEKEY(TSTRING, "INSTRUME", "direct imaging", "Instrument"); + snprintf(buf, 79, "%.g x %.g", pixX, pixY); + // PXSIZE / pixel size + WRITEKEY(TSTRING, "PXSIZE", buf, "Pixel size in mkm"); + // XPIXELSZ, YPIXELSZ -- the same + WRITEKEY(TDOUBLE, "XPIXELSZ", &pixX, "X pixel size in mkm"); + WRITEKEY(TDOUBLE, "YPIXELSZ", &pixY, "Y pixel size in mkm"); + WRITEKEY(TSTRING, "VIEWFLD", viewfield, "Camera field of view"); + if(exptime == 0) sprintf(buf, "bias"); + else if(shutter == 0) sprintf(buf, "dark"); + else if(objtype) strncpy(buf, objtype, 79); + else sprintf(buf, "object"); + // IMAGETYP / object, flat, dark, bias, scan, eta, neon, push + WRITEKEY(TSTRING, "IMAGETYP", buf, "Image type"); + // DATAMAX, DATAMIN / Max,min pixel value + ustmp = ((twelveBit) ? 4095 : 65535); + WRITEKEY(TUSHORT, "DATAMAX", &ustmp, "Max pixel value"); + ustmp = 0; + WRITEKEY(TUSHORT, "DATAMIN", &ustmp, "Min pixel value"); + // Some Statistics + WRITEKEY(TUSHORT, "STATMAX", &max, "Max data value"); + WRITEKEY(TUSHORT, "STATMIN", &min, "Min data value"); + WRITEKEY(TDOUBLE, "STATAVR", &avr, "Average data value"); + WRITEKEY(TDOUBLE, "STATSTD", &std, "Standart deviation of data value"); + // Temperatures + WRITEKEY(TDOUBLE, "TEMP0", &temperature, "Camera temperature at exp. start (degr C)"); + WRITEKEY(TDOUBLE, "TEMP1", &t_int, "Camera temperature at exp. end (degr C)"); + if(t_ext > -30.) // there's a hot temp sensor + WRITEKEY(TDOUBLE, "TEMPBODY", &t_ext, "Camera body temperature at exp. end (degr C)"); + tmp = (temperature + t_int) / 2. + 273.15; + // CAMTEMP / Camera temperature (K) + WRITEKEY(TDOUBLE, "CAMTEMP", &tmp, "Camera temperature (K)"); + tmp = (double)exptime / 1000.; + // EXPTIME / actual exposition time (sec) + WRITEKEY(TDOUBLE, "EXPTIME", &tmp, "actual exposition time (sec)"); + // DATE / Creation date (YYYY-MM-DDThh:mm:ss, UTC) + strftime(buf, 79, "%Y-%m-%dT%H:%M:%S", gmtime(&savetime)); + WRITEKEY(TSTRING, "DATE", buf, "Creation date (YYYY-MM-DDThh:mm:ss, UTC)"); + tm_starttime = localtime(&expStartsAt); + /* + * startTime = (long)expStartsAt; + * strftime(buf, 79, "exposition starts at %d/%m/%Y, %H:%M:%S (local)", tm_starttime); + * WRITEKEY(fp, TLONG, "UNIXTIME", &startTime, buf); + */ + strftime(buf, 79, "%Y-%m-%dT%H:%M:%S", tm_starttime); + // DATE-OBS / DATE OF OBS. + WRITEKEY(TSTRING, "DATE-OBS", buf, "DATE OF OBS. (YYYY-MM-DDThh:mm:ss, local)"); + /* + * // START / Measurement start time (local) (hh:mm:ss) + * strftime(buf, 79, "%H:%M:%S", tm_starttime); + * WRITEKEY(fp, TSTRING, "START", buf, "Measurement start time (hh:mm:ss, local)"); + */ + // OBJECT / Object name + if(objname){ + WRITEKEY(TSTRING, "OBJECT", objname, "Object name"); + } + // BINNING / Binning + if(hbin != 1 || vbin != 1){ + snprintf(buf, 79, "%d x %d", hbin, vbin); + WRITEKEY(TSTRING, "BINNING", buf, "Binning (hbin x vbin)"); + } + WRITEKEY(TINT, "XBIN", &hbin, "Horizontal binning"); + WRITEKEY(TINT, "YBIN", &vbin, "Vertical binning"); + // OBSERVER / Observers + if(observers){ + WRITEKEY(TSTRING, "OBSERVER", observers, "Observers"); + } + // PROG-ID / Observation program identifier + if(prog_id){ + WRITEKEY(TSTRING, "PROG-ID", prog_id, "Observation program identifier"); + } + // AUTHOR / Author of the program + if(author){ + WRITEKEY(TSTRING, "AUTHOR", author, "Author of the program"); + } #ifdef USE_BTA - write_bta_data(fp); + write_bta_data(fp); #endif - check_wcs(); - write_list(fp); - TRYFITS(fits_write_img, fp, TUSHORT, 1, width * height, data); - TRYFITS(fits_close_file, fp); - return 0; + check_wcs(); + write_list(fp); + TRYFITS(fits_write_img, fp, TUSHORT, 1, width * height, data); + TRYFITS(fits_close_file, fp); + return 0; } #ifdef USEPNG int writepng(char *filename, int width, int height, void *data){ - int err; - FILE *fp = NULL; - png_structp pngptr = NULL; - png_infop infoptr = NULL; - void *row; - if ((fp = fopen(filename, "wb")) == NULL){ - err = -errno; - goto done; - } - if ((pngptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL)) == NULL){ - err = -ENOMEM; - goto done; - } - if ((infoptr = png_create_info_struct(pngptr)) == NULL){ - err = -ENOMEM; - goto done; - } - png_init_io(pngptr, fp); - png_set_compression_level(pngptr, 6); - png_set_IHDR(pngptr, infoptr, width, height, 16, PNG_COLOR_TYPE_GRAY, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT); - png_write_info(pngptr, infoptr); - png_set_swap(pngptr); - for(row = data; height > 0; row += width * sizeof(u_int16_t), height--) - png_write_row(pngptr, row); - png_write_end(pngptr, infoptr); - err = 0; - done: - if(fp) fclose(fp); - if(pngptr) png_destroy_write_struct(&pngptr, &infoptr); - return err; + int err; + FILE *fp = NULL; + png_structp pngptr = NULL; + png_infop infoptr = NULL; + png_const_bytep row = data + (height-1)*width*sizeof(u_int16_t); + if ((fp = fopen(filename, "wb")) == NULL){ + err = -errno; + goto done; + } + if ((pngptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL)) == NULL){ + err = -ENOMEM; + goto done; + } + if ((infoptr = png_create_info_struct(pngptr)) == NULL){ + err = -ENOMEM; + goto done; + } + png_init_io(pngptr, fp); + png_set_compression_level(pngptr, 5); + png_set_IHDR(pngptr, infoptr, width, height, 16, PNG_COLOR_TYPE_GRAY, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + png_write_info(pngptr, infoptr); + png_set_swap(pngptr); + for(; height > 0; row -= width * sizeof(u_int16_t), height--) + png_write_row(pngptr, row); + png_write_end(pngptr, infoptr); + err = 0; + done: + if(fp) fclose(fp); + if(pngptr) png_destroy_write_struct(&pngptr, &infoptr); + return err; } #endif /* USEPNG */ #ifdef USERAW int writeraw(char *filename, int width, int height, void *data){ - int fd, size, err; - if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, - S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH )) == -1){ - warn("open(%s) failed", filename); - return -errno; - } - size = width * height * sizeof(unsigned short); - if ((err = write(fd, data, size)) != size){ - warn("write() failed"); - err = -errno; - } - else err = 0; - close(fd); - return err; + int fd, size, err; + if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH )) == -1){ + warn("open(%s) failed", filename); + return -errno; + } + size = width * height * sizeof(unsigned short); + if ((err = write(fd, data, size)) != size){ + warn("write() failed"); + err = -errno; + } + else err = 0; + close(fd); + return err; } #endif // USERAW @@ -339,51 +339,51 @@ int writeraw(char *filename, int width, int height, void *data){ * @argument rgb - rgb array (GLubyte [3]) */ void gray2rgb(double gray, GLubyte *rgb){ - int i = gray * 4.; - double x = (gray - (double)i * .25) * 4.; - GLubyte r = 0, g = 0, b = 0; - //r = g = b = (gray < 1) ? gray * 256 : 255; - switch(i){ - case 0: - g = (GLubyte)(255. * x); - b = 255; - break; - case 1: - g = 255; - b = (GLubyte)(255. * (1. - x)); - break; - case 2: - r = (GLubyte)(255. * x); - g = 255; - break; - case 3: - r = 255; - g = (GLubyte)(255. * (1. - x)); - break; - default: - r = 255; - } - *rgb++ = r; - *rgb++ = g; - *rgb = b; + int i = gray * 4.; + double x = (gray - (double)i * .25) * 4.; + GLubyte r = 0, g = 0, b = 0; + //r = g = b = (gray < 1) ? gray * 256 : 255; + switch(i){ + case 0: + g = (GLubyte)(255. * x); + b = 255; + break; + case 1: + g = 255; + b = (GLubyte)(255. * (1. - x)); + break; + case 2: + r = (GLubyte)(255. * x); + g = 255; + break; + case 3: + r = 255; + g = (GLubyte)(255. * (1. - x)); + break; + default: + r = 255; + } + *rgb++ = r; + *rgb++ = g; + *rgb = b; } -double linfun(double arg){ return arg; } // bung for PREVIEW_LINEAR -double logfun(double arg){ return log(1.+arg); } // for PREVIEW_LOG -double (*colorfun)(double) = linfun; // default function to convert color +static double linfun(double arg){ return arg; } // bung for PREVIEW_LINEAR +static double logfun(double arg){ return log(1.+arg); } // for PREVIEW_LOG +static double (*colorfun)(double) = linfun; // default function to convert color void change_colorfun(colorfn_type f){ - switch (f){ - case COLORFN_LINEAR: - colorfun = linfun; - break; - case COLORFN_LOG: - colorfun = logfun; - break; - default: // sqrt - colorfun = sqrt; - } + switch (f){ + case COLORFN_LINEAR: + colorfun = linfun; + break; + case COLORFN_LOG: + colorfun = logfun; + break; + default: // sqrt + colorfun = sqrt; + } } /** @@ -393,28 +393,28 @@ void change_colorfun(colorfn_type f){ * array dst should have size w*h*3 */ void convert_grayimage(unsigned short *src, GLubyte *dst, int w, int h){ - FNAME(); - int x, y, S = w*h; - unsigned short *ptr = src; - double avr, wd, max, min; - avr = max = min = (double)*src; - for(x = 1; x < S; x++, ptr++){ - double pix = (double) *ptr; - if(pix > max) max = pix; - if(pix < min) min = pix; - avr += pix; - } - avr /= (double)S; - wd = max - min; - if(wd > DBL_EPSILON) avr = (avr - min) / wd; // normal average by preview - if(avr < 0.6) wd *= avr + 0.2; - if(wd < DBL_EPSILON) wd = 1.; - DBG("stat: sz=(%dx%d) avr=%g wd=%g max=%g min=%g", w,h,avr, wd, max, min); - for(y = 0; y < h; y++){ - for(x = 0; x < w; x++, dst += 3, src++){ - gray2rgb(colorfun((*src - min) / wd), dst); - } - } + FNAME(); + int x, y, S = w*h; + unsigned short *ptr = src; + double avr, wd, max, min; + avr = max = min = (double)*src; + for(x = 1; x < S; x++, ptr++){ + double pix = (double) *ptr; + if(pix > max) max = pix; + if(pix < min) min = pix; + avr += pix; + } + avr /= (double)S; + wd = max - min; + if(wd > DBL_EPSILON) avr = (avr - min) / wd; // normal average by preview + if(avr < 0.6) wd *= avr + 0.2; + if(wd < DBL_EPSILON) wd = 1.; + DBG("stat: sz=(%dx%d) avr=%g wd=%g max=%g min=%g", w,h,avr, wd, max, min); + for(y = 0; y < h; y++){ + for(x = 0; x < w; x++, dst += 3, src++){ + gray2rgb(colorfun((*src - min) / wd), dst); + } + } } #endif // IMAGEVIEW diff --git a/camtools.h b/camtools.h index b11ec9a..57a3125 100644 --- a/camtools.h +++ b/camtools.h @@ -23,17 +23,20 @@ #ifndef __CAMTOOLS_H__ #define __CAMTOOLS_H__ +#include +#include + #define TRYFITS(f, ...) \ do{if(!test_headers){ int status = 0; \ - f(__VA_ARGS__, &status); \ - if (status){ \ - fits_report_error(stderr, status); \ - return -1;} \ + f(__VA_ARGS__, &status); \ + if (status){ \ + fits_report_error(stderr, status); \ + return -1;} \ }}while(0) #define WRITEKEY(...) do{add_fits_header(__VA_ARGS__);}while(0) void print_fits_header(fitsfile *fptr, int datatype, char *keyname, - void *value, char *comment); + void *value, char *comment); extern char *camera, *sensor, viewfield[]; extern double pixX, pixY, t_ext, t_int; @@ -42,7 +45,7 @@ extern double avr, std; extern time_t expStartsAt; -void AutoadjustFanSpeed(bool onoff); +//void AutoadjustFanSpeed(bool onoff); double printCoolerStat(double *t_ext); void print_stat(unsigned short *img, long size, FILE* f); @@ -57,16 +60,16 @@ int writeraw(char *filename, int width, int height, void *data); #endif // USERAW #ifdef IMAGEVIEW -#include -#include #include +#include +#include #include // functions for converting grayscale value into colour typedef enum{ - COLORFN_LINEAR, // linear - COLORFN_LOG, // ln - COLORFN_SQRT // sqrt + COLORFN_LINEAR, // linear + COLORFN_LOG, // ln + COLORFN_SQRT // sqrt } colorfn_type; void change_colorfun(colorfn_type f); diff --git a/defhdrs.c b/defhdrs.c index 9551ab2..b917237 100644 --- a/defhdrs.c +++ b/defhdrs.c @@ -32,17 +32,16 @@ YPIXELSZ IMSCALE */ #define _GNU_SOURCE -#include -#include -#include -#include #include +#include +#include +#include +#include - -#include "defhdrs.h" -#include "usage.h" -#include "macros.h" #include "camtools.h" +#include "defhdrs.h" +#include "macros.h" +#include "usage.h" // global keylist static KeyList *FITS_keys = NULL; @@ -50,30 +49,30 @@ double crval1 = -5e5, crval2 = -5e5, crpix1 = -5e5, crpix2 = -5e5; double CD[2][2] = {{0.,0.}, {0.,0.}}; void get_defhdrs(char *fname){ - mmapbuf *mmb = NULL; - if(!fname){ // find in default file: ~/$DEFCONF - const char *homedir; - if ((homedir = getenv("HOME")) == NULL){ - homedir = getpwuid(getuid())->pw_dir; - } - size_t L = strlen(homedir) + strlen(DEFCONF) + 2; - fname = malloc(L); - snprintf(fname, L, "%s/%s", homedir, DEFCONF); - mmb = My_mmap(fname); - FREE(fname); - }else mmb = My_mmap(fname); - if(!mmb) return; - char *hdrs = strdup(mmb->data); - My_munmap(mmb); - char *nl = NULL; - while((nl = strchr(hdrs, '\n'))){ - *nl = 0; - list_add_record(&FITS_keys, hdrs, 1); - hdrs = nl + 1; - } - if(*hdrs){ // last line in file didn't have newline - list_add_record(&FITS_keys, hdrs, 1); - } + mmapbuf *mmb = NULL; + if(!fname){ // find in default file: ~/$DEFCONF + const char *homedir; + if ((homedir = getenv("HOME")) == NULL){ + homedir = getpwuid(getuid())->pw_dir; + } + size_t L = strlen(homedir) + strlen(DEFCONF) + 2; + fname = malloc(L); + snprintf(fname, L, "%s/%s", homedir, DEFCONF); + mmb = My_mmap(fname); + FREE(fname); + }else mmb = My_mmap(fname); + if(!mmb) return; + char *hdrs = strdup(mmb->data); + My_munmap(mmb); + char *nl = NULL; + while((nl = strchr(hdrs, '\n'))){ + *nl = 0; + list_add_record(&FITS_keys, hdrs, 1); + hdrs = nl + 1; + } + if(*hdrs){ // last line in file didn't have newline + list_add_record(&FITS_keys, hdrs, 1); + } } /** @@ -81,33 +80,33 @@ void get_defhdrs(char *fname){ * something like `apogee_control filename "KEY1 = VAL1 / comment" "KEYn = VALn / comment" */ void add_morehdrs(int argc, char **argv){ - int i; - char buf[FLEN_CARD]; - for(i = 0; i < argc; ++i){ // we should override parameters from default configuration file - char *dup = strdup(argv[i]); - char *eq = strchr(dup, '='); - if(eq){ - *(eq++) = 0; - KeyList *found = list_find_key(FITS_keys, dup); - if(found) list_modify_key(FITS_keys, dup, eq, 2); // comments (if exists in new header) will be override too - else{ - snprintf(buf, FLEN_CARD, "%-8s= %s", dup, eq); - list_add_record(&FITS_keys, buf, 2); - } - }else{ // comment or something else - list_add_record(&FITS_keys, dup, 2); - } - FREE(dup); - } + int i; + char buf[FLEN_CARD]; + for(i = 0; i < argc; ++i){ // we should override parameters from default configuration file + char *dup = strdup(argv[i]); + char *eq = strchr(dup, '='); + if(eq){ + *(eq++) = 0; + KeyList *found = list_find_key(FITS_keys, dup); + if(found) list_modify_key(FITS_keys, dup, eq, 2); // comments (if exists in new header) will be override too + else{ + snprintf(buf, FLEN_CARD, "%-8s= %s", dup, eq); + list_add_record(&FITS_keys, buf, 2); + } + }else{ // comment or something else + list_add_record(&FITS_keys, dup, 2); + } + FREE(dup); + } } KeyList *list_get_end(KeyList *list){ - if(!list) return NULL; - KeyList *first = list; - if(list->last) return list->last; - while(list->next) list = list->next; - first->last = list; - return list; + if(!list) return NULL; + KeyList *first = list; + if(list->last) return list->last; + while(list->next) list = list->next; + first->last = list; + return list; } /** @@ -118,49 +117,49 @@ KeyList *list_get_end(KeyList *list){ * @return pointer to created node */ KeyList *list_add_record(KeyList **list, char *rec, int immutable){ - KeyList *node, *last; - if((node = (KeyList*) MALLOC(KeyList, 1)) == 0) return NULL; // allocation error - node->record = strdup(rec); // insert data - node->immutable = immutable; - //DBG("add record %s", rec); - if(!node->record){ - /// " " - WARNX(_("Can't copy data")); - return NULL; - } - if(list){ - if(*list){ // there was root node - search last - last = list_get_end(*list); - last->next = node; // insert pointer to new node into last element in list - (*list)->last = node; - // DBG("last node %s", (*list)->last->record); - }else *list = node; - } - return node; + KeyList *node, *last; + if((node = (KeyList*) MALLOC(KeyList, 1)) == 0) return NULL; // allocation error + node->record = strdup(rec); // insert data + node->immutable = immutable; + //DBG("add record %s", rec); + if(!node->record){ + /// " " + WARNX(_("Can't copy data")); + return NULL; + } + if(list){ + if(*list){ // there was root node - search last + last = list_get_end(*list); + last->next = node; // insert pointer to new node into last element in list + (*list)->last = node; + // DBG("last node %s", (*list)->last->record); + }else *list = node; + } + return node; } // compare keywords from `list` and `keyname` int compare_keyw(KeyList *list, char *keyname){ - if(!list || !keyname || !list->record) return 0; - size_t L = strlen(keyname); - if(strncmp(list->record, keyname, L) == 0){ // key found - char *ltr = list->record + L; - while(*ltr == ' ') ++ltr; // omit spaces - if(*ltr == '=') return 1; // only if there's equal sign after keyname! - } - return 0; + if(!list || !keyname || !list->record) return 0; + size_t L = strlen(keyname); + if(strncmp(list->record, keyname, L) == 0){ // key found + char *ltr = list->record + L; + while(*ltr == ' ') ++ltr; // omit spaces + if(*ltr == '=') return 1; // only if there's equal sign after keyname! + } + return 0; } /** * return record with given key or NULL */ KeyList *list_find_key(KeyList *list, char *keyname){ - if(!list || !keyname) return NULL; - do{ - if(compare_keyw(list, keyname)) return list; - list = list->next; - }while(list); - return NULL; + if(!list || !keyname) return NULL; + do{ + if(compare_keyw(list, keyname)) return list; + list = list->next; + }while(list); + return NULL; } /** @@ -168,24 +167,24 @@ KeyList *list_find_key(KeyList *list, char *keyname){ * @return NULL if not found or strdup`ed value */ char *list_find_keyval(KeyList *l, char *key){ - KeyList *list = list_find_key(l, key); - if(!list) return NULL; - char *rec = strdup(list->record); - char *val = strchr(rec, '='); - *val++ = 0; - char *com = strchr(val, '/'); - if(com) *com = 0; - char *retval = strdup(val); - FREE(rec); - return retval; + KeyList *list = list_find_key(l, key); + if(!list) return NULL; + char *rec = strdup(list->record); + char *val = strchr(rec, '='); + *val++ = 0; + char *com = strchr(val, '/'); + if(com) *com = 0; + char *retval = strdup(val); + FREE(rec); + return retval; } int getdoubleval(double *val, KeyList *list, char *key){ - char *v = list_find_keyval(list, key); - if(!v) return 0; - *val = strtod(v, NULL); - FREE(v); - return 1; + char *v = list_find_keyval(list, key); + if(!v) return 0; + *val = strtod(v, NULL); + FREE(v); + return 1; } /** @@ -193,140 +192,148 @@ int getdoubleval(double *val, KeyList *list, char *key){ * return NULL if given key is absent */ KeyList *list_modify_key(KeyList *list, char *key, char *newval, int immutable){ - char buf[FLEN_CARD]; - KeyList *rec = list_find_key(list, key); - if(!rec) return NULL; - if(rec->immutable > immutable) return NULL; // not modify immutable records - rec->immutable = immutable; - newval = strdup(newval); - char *comnt = strchr(newval, '/'); - if(comnt){ - *(comnt++) = 0; - }else{ - comnt = strchr(rec->record, '/'); - if(comnt) ++comnt; - } - if(comnt){ - snprintf(buf, FLEN_CARD, "%-8s= %-21s/%s", key, newval, comnt); - }else{ - snprintf(buf, FLEN_CARD, "%-8s= %s", key, newval); - } - FREE(rec->record); - FREE(newval); - DBG("modify record %s", buf); - rec->record = strdup(buf); - return rec; + char buf[FLEN_CARD]; + KeyList *rec = list_find_key(list, key); + if(!rec) return NULL; + if(rec->immutable > immutable) return NULL; // not modify immutable records + rec->immutable = immutable; + newval = strdup(newval); + char *comnt = strchr(newval, '/'); + if(comnt){ + *(comnt++) = 0; + }else{ + comnt = strchr(rec->record, '/'); + if(comnt) ++comnt; + } + if(comnt){ + snprintf(buf, FLEN_CARD, "%-8s= %-21s/%s", key, newval, comnt); + }else{ + snprintf(buf, FLEN_CARD, "%-8s= %s", key, newval); + } + FREE(rec->record); + FREE(newval); + DBG("modify record %s", buf); + rec->record = strdup(buf); + return rec; } void add_fits_header(int datatype, char *keyname, void *value, char *comment){ - void _ub(char* r, void* p){snprintf(r, FLEN_CARD, "%20hhu", *(unsigned char*)p);} - void _b(char* r, void* p){snprintf(r, FLEN_CARD, "%20hhd", *(char*)p);} - void _us(char* r, void* p){snprintf(r, FLEN_CARD, "%20hu", *(unsigned short*)p);} - void _ui(char* r, void* p){snprintf(r, FLEN_CARD, "%20u", *(unsigned int*)p);} - void _ul(char* r, void* p){snprintf(r, FLEN_CARD, "%20lu", *(unsigned long*)p);} - void _s(char* r, void* p){snprintf(r, FLEN_CARD, "%20hd", *(short*)p);} - void _i(char* r, void* p){snprintf(r, FLEN_CARD, "%20d", *(int*)p);} - void _l(char* r, void* p){snprintf(r, FLEN_CARD, "%20ld", *(long*)p);} - void _ll(char* r, void* p){snprintf(r, FLEN_CARD, "%20lld", *(long long*)p);} - void _f(char* r, void* p){snprintf(r, FLEN_CARD, "%20.8f", *(float*)p);} - void _d(char* r, void* p){snprintf(r, FLEN_CARD, "%20.8f", *(double*)p);} - void _fc(char* r, void* p){snprintf(r, FLEN_CARD, "(%.8f, %.8f)", - ((float*)p)[0], ((float*)p)[1]);} - void _dc(char* r, void* p){snprintf(r, FLEN_CARD, "(%.8f, %.8f)", - ((double*)p)[0], ((double*)p)[1]);} - void _log(char* r, void* p){snprintf(r, FLEN_CARD, "'%s'", (int*)p ? "true" : "false");} - void _str(char* r, void* p){snprintf(r, FLEN_CARD, "'%s'", (char*)p);} - void _unk(char* r, void* p __attribute((unused))){sprintf(r, "unknown datatype");} - char tmp[FLEN_CARD], res[FLEN_CARD]; - void (*__)(char*, void*); - switch(datatype){ - case TBIT: - case TBYTE: __ = _ub; break; - case TSBYTE: __ = _b; break; - case TUSHORT: __ = _us; break; - case TUINT: __ = _ui; break; - case TULONG: __ = _ul; break; - case TSHORT: __ = _s; break; - case TINT: __ = _i; break; - case TLONG: __ = _l; break; - case TLONGLONG: __ = _ll; break; - case TFLOAT: __ = _f; break; - case TDOUBLE: __ = _d; break; - case TCOMPLEX: __ = _fc; break; - case TDBLCOMPLEX: __ = _dc; break; - case TLOGICAL: __ = _log; break; - case TSTRING: __ = _str; break; - default: __ = _unk; - } - __(res, value); - KeyList *rec = list_find_key(FITS_keys, keyname); - if(rec){ - if(comment){ - if(strlen(res) < 21) - snprintf(tmp, FLEN_CARD, "%-21s / %s", res, comment); - else - snprintf(tmp, FLEN_CARD, "%s / %s", res, comment); - }else snprintf(tmp, FLEN_CARD, "%s", res); - list_modify_key(FITS_keys, keyname, tmp, 0); - }else{ - if(strlen(res) < 21) - snprintf(tmp, FLEN_CARD, "%-8s= %-20s", keyname, res); - else - snprintf(tmp, FLEN_CARD, "%-8s=%s", keyname, res); - snprintf(res, FLEN_CARD, "%s / %s", tmp, comment); - list_add_record(&FITS_keys, res, 0); - } + void _ub(char* r, void* p){snprintf(r, FLEN_CARD, "%20hhu", *(unsigned char*)p);} + void _b(char* r, void* p){snprintf(r, FLEN_CARD, "%20hhd", *(char*)p);} + void _us(char* r, void* p){snprintf(r, FLEN_CARD, "%20hu", *(unsigned short*)p);} + void _ui(char* r, void* p){snprintf(r, FLEN_CARD, "%20u", *(unsigned int*)p);} + void _ul(char* r, void* p){snprintf(r, FLEN_CARD, "%20lu", *(unsigned long*)p);} + void _s(char* r, void* p){snprintf(r, FLEN_CARD, "%20hd", *(short*)p);} + void _i(char* r, void* p){snprintf(r, FLEN_CARD, "%20d", *(int*)p);} + void _l(char* r, void* p){snprintf(r, FLEN_CARD, "%20ld", *(long*)p);} + void _ll(char* r, void* p){snprintf(r, FLEN_CARD, "%20lld", *(long long*)p);} + void _f(char* r, void* p){snprintf(r, FLEN_CARD, "%20.8f", *(float*)p);} + void _d(char* r, void* p){snprintf(r, FLEN_CARD, "%20.8f", *(double*)p);} + void _fc(char* r, void* p){snprintf(r, FLEN_CARD, "(%.8f, %.8f)", + ((float*)p)[0], ((float*)p)[1]);} + void _dc(char* r, void* p){snprintf(r, FLEN_CARD, "(%.8f, %.8f)", + ((double*)p)[0], ((double*)p)[1]);} + void _log(char* r, void* p){snprintf(r, FLEN_CARD, "'%s'", (int*)p ? "true" : "false");} + void _str(char* r, void* p){snprintf(r, FLEN_CARD, "'%s'", (char*)p);} + void _unk(char* r, void* p __attribute((unused))){sprintf(r, "unknown datatype");} + char tmp[FLEN_CARD*2], res[FLEN_CARD]; + void (*__)(char*, void*); + switch(datatype){ + case TBIT: + case TBYTE: __ = _ub; break; + case TSBYTE: __ = _b; break; + case TUSHORT: __ = _us; break; + case TUINT: __ = _ui; break; + case TULONG: __ = _ul; break; + case TSHORT: __ = _s; break; + case TINT: __ = _i; break; + case TLONG: __ = _l; break; + case TLONGLONG: __ = _ll; break; + case TFLOAT: __ = _f; break; + case TDOUBLE: __ = _d; break; + case TCOMPLEX: __ = _fc; break; + case TDBLCOMPLEX: __ = _dc; break; + case TLOGICAL: __ = _log; break; + case TSTRING: __ = _str; break; + default: __ = _unk; + } + __(res, value); + KeyList *rec = list_find_key(FITS_keys, keyname); + if(rec){ + if(comment){ + if(strlen(res) < 21) + snprintf(tmp, sizeof(tmp), "%-21s / %s", res, comment); + else + snprintf(tmp, sizeof(tmp), "%s / %s", res, comment); + }else snprintf(tmp, sizeof(tmp), "%s", res); + tmp[FLEN_CARD-1] = 0; + list_modify_key(FITS_keys, keyname, tmp, 0); + }else{ + if(comment){ + if(strlen(res) < 21) + snprintf(tmp, sizeof(tmp), "%-8s= %-20s / %s", keyname, res, comment); + else + snprintf(tmp, sizeof(tmp), "%-8s=%s / %s", keyname, res, comment); + }else{ + if(strlen(res) < 21) + snprintf(tmp, sizeof(tmp), "%-8s= %-20s", keyname, res); + else + snprintf(tmp, sizeof(tmp), "%-8s=%s", keyname, res); + } + tmp[FLEN_CARD-1] = 0; + list_add_record(&FITS_keys, tmp, 0); + } } /** * free list memory & set it to NULL */ void list_free(KeyList **list){ - KeyList *node = *list, *next; - if(!list || !*list) return; - do{ - next = node->next; - FREE(node->record); - free(node); - node = next; - }while(node); - *list = NULL; + KeyList *node = *list, *next; + if(!list || !*list) return; + do{ + next = node->next; + FREE(node->record); + free(node); + node = next; + }while(node); + *list = NULL; } void free_fits_list(){ list_free(&FITS_keys); } /* void list_print(KeyList *list){ - while(list){ - printf("%s\n", list->record); - list = list->next; - } + while(list){ + printf("%s\n", list->record); + list = list->next; + } } void show_list(){ - list_print(FITS_keys); + list_print(FITS_keys); } */ void write_list(fitsfile *fp){ - if(FITS_keys){ // there's keys - KeyList *records = FITS_keys; - while(records){ - char *rec = records->record; - records = records->next; - if(strncmp(rec, "SIMPLE", 6) == 0 || strncmp(rec, "EXTEND", 6) == 0) // key "file does conform ..." - continue; - // comment of obligatory key in FITS head - else if(strncmp(rec, "COMMENT FITS", 14) == 0 || strncmp(rec, "COMMENT and Astrophysics", 26) == 0) - continue; - else if(strncmp(rec, "NAXIS", 5) == 0 || strncmp(rec, "BITPIX", 6) == 0) // NAXIS, NAXISxxx, BITPIX - continue; - if(!test_headers){ - int status = 0; - fits_write_record(fp, rec, &status); - if(status) fits_report_error(stderr, status); - }else - printf("%s\n", rec); - } - } + if(FITS_keys){ // there's keys + KeyList *records = FITS_keys; + while(records){ + char *rec = records->record; + records = records->next; + if(strncmp(rec, "SIMPLE", 6) == 0 || strncmp(rec, "EXTEND", 6) == 0) // key "file does conform ..." + continue; + // comment of obligatory key in FITS head + else if(strncmp(rec, "COMMENT FITS", 14) == 0 || strncmp(rec, "COMMENT and Astrophysics", 26) == 0) + continue; + else if(strncmp(rec, "NAXIS", 5) == 0 || strncmp(rec, "BITPIX", 6) == 0) // NAXIS, NAXISxxx, BITPIX + continue; + if(!test_headers){ + int status = 0; + fits_write_record(fp, rec, &status); + if(status) fits_report_error(stderr, status); + }else + printf("%s\n", rec); + } + } } static int wcs_rdy = 0; @@ -334,114 +341,114 @@ static int wcs_rdy = 0; * Check if user tell some information about WCS and add it into headers */ void check_wcs(){ - double cd = -5e5, crot = -5e5, rot0 = -5e5; - char buf[FLEN_CARD]; - // first correct scale: user value SCALE will fix parameter imscale - if(imscale < 0.) getdoubleval(&imscale, FITS_keys, "SCALE"); - if(imscale < 0.){ - imscale = 180.*3600./M_PI / TELFOCUS / 1000000. * sqrt(pixX*pixY); // default system value - } - snprintf(buf, FLEN_CARD, "%.4f x %.4f", imscale * hbin, imscale * vbin); - WRITEKEY(TSTRING, "IMSCALE", buf, "image scale (''/Pix x ''/Pix)"); + double cd = -5e5, crot = -5e5, rot0 = -5e5; + char buf[FLEN_CARD]; + // first correct scale: user value SCALE will fix parameter imscale + if(imscale < 0.) getdoubleval(&imscale, FITS_keys, "SCALE"); + if(imscale < 0.){ + imscale = 180.*3600./M_PI / TELFOCUS / 1000000. * sqrt(pixX*pixY); // default system value + } + snprintf(buf, FLEN_CARD, "%.4f x %.4f", imscale * hbin, imscale * vbin); + WRITEKEY(TSTRING, "IMSCALE", buf, "image scale (''/Pix x ''/Pix)"); - int cnt = getdoubleval(&crval1, FITS_keys, "CRVAL1"); - cnt += getdoubleval(&crval2, FITS_keys, "CRVAL1"); - cnt += getdoubleval(&crpix1, FITS_keys, "CRPIX1"); - cnt += getdoubleval(&crpix2, FITS_keys, "CRPIX2"); - cnt += getdoubleval(&cd, FITS_keys, "CD1_1"); - cnt += getdoubleval(&crot, FITS_keys, "CROTA2"); - cnt += getdoubleval(&rot0, FITS_keys, "ROT0"); - if(!cnt) return; - wcs_rdy = 1; - int wcs = 2; - WRITEKEY(TINT, "WCSAXIS", &wcs, "Number of WCS axes"); - WRITEKEY(TSTRING, "CTYPE1", "RA---TAN", "RA-Gnomic projection"); - WRITEKEY(TSTRING, "CUNIT1", "deg", "RA units - degrees"); - WRITEKEY(TSTRING, "CTYPE2", "DEC---TAN", "Decl-Gnomic projection"); - WRITEKEY(TSTRING, "CUNIT2", "deg", "Decl units - degrees"); - // CRVAL1 = / RA of reference pixel - if(crval1 > -4e-5) - WRITEKEY(TDOUBLE, "CRVAL1", &crval1, "RA of reference pixel"); - else crval1 = 0; - // CRVAL2 = / Decl of reference pixel - if(crval2 > -4e-5) - WRITEKEY(TDOUBLE, "CRVAL2", &crval2, "Decl of reference pixel"); - else crval2 = 0; - //CRPIX1 = / X reference pixel - if(crpix1 > -4e-5) - WRITEKEY(TDOUBLE, "CRPIX1", &crpix1, "X reference pixel"); - else crpix1 = 0; - //CRPIX2 = / Y reference pixel - if(crpix2 > -4e-5) - WRITEKEY(TDOUBLE, "CRPIX2", &crpix2, "Y reference pixel"); - else crpix2 = 0; - cnt = 0; - if(cd > -4e5){ - ++cnt; - WRITEKEY(TDOUBLE, "CD1_1", &cd, "rotation matrix coefficient [1,1]"); - CD[0][0] = cd; - } - if(getdoubleval(&cd, FITS_keys, "CD1_2")){ - ++cnt; - WRITEKEY(TDOUBLE, "CD1_2", &cd, "rotation matrix coefficient [1,2]"); - CD[0][1] = cd; - } - if(getdoubleval(&cd, FITS_keys, "CD2_1")){ - ++cnt; - WRITEKEY(TDOUBLE, "CD2_1", &cd, "rotation matrix coefficient [2,1]"); - CD[1][0] = cd; - } - if(getdoubleval(&cd, FITS_keys, "CD2_2")){ - ++cnt; - WRITEKEY(TDOUBLE, "CD2_2", &cd, "rotation matrix coefficient [2,2]"); - CD[1][1] = cd; - } - if(cnt == 4) return; - // no coefficients - use CROTA & CDELT - cnt = 0; - if(crot > -4e5){ - ++cnt; - DBG("crot: %g", crot); - WRITEKEY(TDOUBLE, "CROTA2", &crot, "North rotation angle"); - } - if(getdoubleval(&crot, FITS_keys, "CDELT1")){ - ++cnt; - WRITEKEY(TDOUBLE, "CDELT1", &crot, "X axis scale"); - getdoubleval(&crot, FITS_keys, "CDELT2"); - WRITEKEY(TDOUBLE, "CDELT2", &crot, "Y axis scale"); // use CDELT1 if user omits CDELT2 - } - if(cnt == 2) return; - // still no coefficients - try to calculate CDx_x by user data - double parangle, rotangle; - if(rot0 < -4e5) return; // no values - if(!getdoubleval(¶ngle, FITS_keys, "PARANGLE")) return; - if(!getdoubleval(&rotangle, FITS_keys, "VAL_P")) return; - double s, c, scx = imscale / 3600. * hbin, scy = imscale / 3600. * vbin; - if(rot0 < 0){ // left-handed - crot = (-rot0 + parangle - rotangle)*M_PI/180; - sincos(crot, &s, &c); - CD[0][0] = -scx * c; CD[0][1] = scy * s; - CD[1][0] = scx * s; CD[1][1] = scy * c; - }else{ // right-handed - crot = (rot0 - parangle + rotangle)*M_PI/180; - sincos(crot, &s, &c); - CD[0][0] = scx * c; CD[0][1] = -scy * s; - CD[1][0] = scx * s; CD[1][1] = scy * c; - } - WRITEKEY(TDOUBLE, "CD1_1", &CD[0][0], "rotation matrix coefficient [1,1]"); - WRITEKEY(TDOUBLE, "CD1_2", &CD[0][1], "rotation matrix coefficient [1,2]"); - WRITEKEY(TDOUBLE, "CD2_1", &CD[1][0], "rotation matrix coefficient [2,1]"); - WRITEKEY(TDOUBLE, "CD2_2", &CD[1][1], "rotation matrix coefficient [2,2]"); + int cnt = getdoubleval(&crval1, FITS_keys, "CRVAL1"); + cnt += getdoubleval(&crval2, FITS_keys, "CRVAL1"); + cnt += getdoubleval(&crpix1, FITS_keys, "CRPIX1"); + cnt += getdoubleval(&crpix2, FITS_keys, "CRPIX2"); + cnt += getdoubleval(&cd, FITS_keys, "CD1_1"); + cnt += getdoubleval(&crot, FITS_keys, "CROTA2"); + cnt += getdoubleval(&rot0, FITS_keys, "ROT0"); + if(!cnt) return; + wcs_rdy = 1; + int wcs = 2; + WRITEKEY(TINT, "WCSAXIS", &wcs, "Number of WCS axes"); + WRITEKEY(TSTRING, "CTYPE1", "RA---TAN", "RA-Gnomic projection"); + WRITEKEY(TSTRING, "CUNIT1", "deg", "RA units - degrees"); + WRITEKEY(TSTRING, "CTYPE2", "DEC---TAN", "Decl-Gnomic projection"); + WRITEKEY(TSTRING, "CUNIT2", "deg", "Decl units - degrees"); + // CRVAL1 = / RA of reference pixel + if(crval1 > -4e-5) + WRITEKEY(TDOUBLE, "CRVAL1", &crval1, "RA of reference pixel"); + else crval1 = 0; + // CRVAL2 = / Decl of reference pixel + if(crval2 > -4e-5) + WRITEKEY(TDOUBLE, "CRVAL2", &crval2, "Decl of reference pixel"); + else crval2 = 0; + //CRPIX1 = / X reference pixel + if(crpix1 > -4e-5) + WRITEKEY(TDOUBLE, "CRPIX1", &crpix1, "X reference pixel"); + else crpix1 = 0; + //CRPIX2 = / Y reference pixel + if(crpix2 > -4e-5) + WRITEKEY(TDOUBLE, "CRPIX2", &crpix2, "Y reference pixel"); + else crpix2 = 0; + cnt = 0; + if(cd > -4e5){ + ++cnt; + WRITEKEY(TDOUBLE, "CD1_1", &cd, "rotation matrix coefficient [1,1]"); + CD[0][0] = cd; + } + if(getdoubleval(&cd, FITS_keys, "CD1_2")){ + ++cnt; + WRITEKEY(TDOUBLE, "CD1_2", &cd, "rotation matrix coefficient [1,2]"); + CD[0][1] = cd; + } + if(getdoubleval(&cd, FITS_keys, "CD2_1")){ + ++cnt; + WRITEKEY(TDOUBLE, "CD2_1", &cd, "rotation matrix coefficient [2,1]"); + CD[1][0] = cd; + } + if(getdoubleval(&cd, FITS_keys, "CD2_2")){ + ++cnt; + WRITEKEY(TDOUBLE, "CD2_2", &cd, "rotation matrix coefficient [2,2]"); + CD[1][1] = cd; + } + if(cnt == 4) return; + // no coefficients - use CROTA & CDELT + cnt = 0; + if(crot > -4e5){ + ++cnt; + DBG("crot: %g", crot); + WRITEKEY(TDOUBLE, "CROTA2", &crot, "North rotation angle"); + } + if(getdoubleval(&crot, FITS_keys, "CDELT1")){ + ++cnt; + WRITEKEY(TDOUBLE, "CDELT1", &crot, "X axis scale"); + getdoubleval(&crot, FITS_keys, "CDELT2"); + WRITEKEY(TDOUBLE, "CDELT2", &crot, "Y axis scale"); // use CDELT1 if user omits CDELT2 + } + if(cnt == 2) return; + // still no coefficients - try to calculate CDx_x by user data + double parangle, rotangle; + if(rot0 < -4e5) return; // no values + if(!getdoubleval(¶ngle, FITS_keys, "PARANGLE")) return; + if(!getdoubleval(&rotangle, FITS_keys, "VAL_P")) return; + double s, c, scx = imscale / 3600. * hbin, scy = imscale / 3600. * vbin; + if(rot0 < 0){ // left-handed + crot = (-rot0 + parangle - rotangle)*M_PI/180; + sincos(crot, &s, &c); + CD[0][0] = -scx * c; CD[0][1] = scy * s; + CD[1][0] = scx * s; CD[1][1] = scy * c; + }else{ // right-handed + crot = (rot0 - parangle + rotangle)*M_PI/180; + sincos(crot, &s, &c); + CD[0][0] = scx * c; CD[0][1] = -scy * s; + CD[1][0] = scx * s; CD[1][1] = scy * c; + } + WRITEKEY(TDOUBLE, "CD1_1", &CD[0][0], "rotation matrix coefficient [1,1]"); + WRITEKEY(TDOUBLE, "CD1_2", &CD[0][1], "rotation matrix coefficient [1,2]"); + WRITEKEY(TDOUBLE, "CD2_1", &CD[1][0], "rotation matrix coefficient [2,1]"); + WRITEKEY(TDOUBLE, "CD2_2", &CD[1][1], "rotation matrix coefficient [2,2]"); } // function for events.c - recalculate coordinates on image into WCS void calc_coords(float x, float y, double *alpha, double *delta){ - double ra, dec, dx = x - crpix1, dy = y - crpix2; - if(!wcs_rdy){*alpha = 5e6; *delta = 5e6; return; } - ra = crval1 + dx * CD[0][0] + dy * CD[0][1]; - dec = crval2 + dx * CD[1][0] + dy * CD[1][1]; - DBG("ra=%g, dec=%g", ra,dec); - if(alpha) *alpha = ra * 3600.; // hrsec - if(delta) *delta = dec * 3600.; // arcsec - DBG("ra=%g, dec=%g", *alpha, *delta); + double ra, dec, dx = x - crpix1, dy = y - crpix2; + if(!wcs_rdy){*alpha = 5e6; *delta = 5e6; return; } + ra = crval1 + dx * CD[0][0] + dy * CD[0][1]; + dec = crval2 + dx * CD[1][0] + dy * CD[1][1]; + DBG("ra=%g, dec=%g", ra,dec); + if(alpha) *alpha = ra * 3600.; // hrsec + if(delta) *delta = dec * 3600.; // arcsec + DBG("ra=%g, dec=%g", *alpha, *delta); } diff --git a/image_view_module/CMakeLists.txt b/image_view_module/CMakeLists.txt index bc8ed00..9228c1c 100644 --- a/image_view_module/CMakeLists.txt +++ b/image_view_module/CMakeLists.txt @@ -29,7 +29,7 @@ aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} IMSOURCES) find_package(PkgConfig REQUIRED) find_package(OpenGL) find_package(GLUT) -find_package(X11) +find_package(X11 REQUIRED) if(NOT GLUT_FOUND OR NOT OPENGL_FOUND OR NOT X11_FOUND) message("GLUT library not found, image view won't be available") @@ -143,7 +143,7 @@ else() ) endif(NOT DEFINED NOGETTEXT) endif(NOT DEFINED STANDALONE) -target_link_libraries(${IMLIB} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} -lm -lpthread) +target_link_libraries(${IMLIB} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${X11_LIBRARIES} -lm -lpthread) include_directories(${${IMLIB}_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR} ${GLUT_INCLUDE_DIR} ..) link_directories(${${IMLIB}_LIBRARY_DIRS}) endif(NOT GLUT_FOUND OR NOT OPENGL_FOUND OR NOT X11_FOUND) diff --git a/image_view_module/imageview.c b/image_view_module/imageview.c index 5a527c0..8067e41 100644 --- a/image_view_module/imageview.c +++ b/image_view_module/imageview.c @@ -40,92 +40,92 @@ void Resize(int width, int height); * calculate window properties on creating & resizing */ void calc_win_props(windowData *win, GLfloat *Wortho, GLfloat *Hortho){ - if(!win || ! win->image) return; - double a, A, w, h, W, H; - double Zoom = win->zoom; - w = (double)win->image->w / 2.; - h = (double)win->image->h / 2.; - W = (double)win->w; - H = (double)win->h; - A = W / H; - a = w / h; - if(A > a){ // now W & H are parameters for glOrtho - win->Daspect = h / H * 2.; - W = h * A; H = h; - }else{ - win->Daspect = w / W * 2.; - H = w / A; W = w; - } - if(Wortho) *Wortho = W; - if(Hortho) *Hortho = H; - // calculate coordinates of center - win->x0 = W/Zoom - w + win->x / Zoom; - win->y0 = H / Zoom + h - win->y / Zoom; + if(!win || ! win->image) return; + double a, A, w, h, W, H; + double Zoom = win->zoom; + w = (double)win->image->w / 2.; + h = (double)win->image->h / 2.; + W = (double)win->w; + H = (double)win->h; + A = W / H; + a = w / h; + if(A > a){ // now W & H are parameters for glOrtho + win->Daspect = h / H * 2.; + W = h * A; H = h; + }else{ + win->Daspect = w / W * 2.; + H = w / A; W = w; + } + if(Wortho) *Wortho = W; + if(Hortho) *Hortho = H; + // calculate coordinates of center + win->x0 = W/Zoom - w + win->x / Zoom; + win->y0 = H / Zoom + h - win->y / Zoom; } /** * create window & run main loop */ void createWindow(windowData *win){ - FNAME(); - if(!initialized) return; - if(!win) return; - int w = win->w, h = win->h; - DBG("create window with title %s", win->title); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - glutInitWindowSize(w, h); - win->GL_ID = glutCreateWindow(win->title); - DBG("created GL_ID=%d", win->GL_ID); - glutReshapeFunc(Resize); - glutDisplayFunc(RedrawWindow); - glutKeyboardFunc(keyPressed); - glutSpecialFunc(keySpPressed); - glutMouseFunc(mousePressed); - glutMotionFunc(mouseMove); - glutIdleFunc(NULL); - DBG("init textures"); - glGenTextures(1, &(win->Tex)); - win->zoom = 1.; - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, win->Tex); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + FNAME(); + if(!initialized) return; + if(!win) return; + int w = win->w, h = win->h; + DBG("create window with title %s", win->title); + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); + glutInitWindowSize(w, h); + win->GL_ID = glutCreateWindow(win->title); + DBG("created GL_ID=%d", win->GL_ID); + glutReshapeFunc(Resize); + glutDisplayFunc(RedrawWindow); + glutKeyboardFunc(keyPressed); + glutSpecialFunc(keySpPressed); + glutMouseFunc(mousePressed); + glutMotionFunc(mouseMove); + glutIdleFunc(NULL); + DBG("init textures"); + glGenTextures(1, &(win->Tex)); + win->zoom = 1.; + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, win->Tex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, win->image->w, win->image->h, 0, - GL_RGB, GL_UNSIGNED_BYTE, win->image->rawdata); - glDisable(GL_TEXTURE_2D); - totWindows++; - createMenu(win->GL_ID); - DBG("OK, total opened windows: %d", totWindows); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, win->image->w, win->image->h, 0, + GL_RGB, GL_UNSIGNED_BYTE, win->image->rawdata); + glDisable(GL_TEXTURE_2D); + totWindows++; + createMenu(win->GL_ID); + DBG("OK, total opened windows: %d", totWindows); } int killwindow(int GL_ID){ - DBG("try to kill win GL_ID=%d", GL_ID); - windowData *win; - win = searchWindow_byGLID(GL_ID); - if(!win) return 0; - glutSetWindow(GL_ID); // obviously set window (for closing from menu) - if(!win->killthread){ - pthread_mutex_lock(&win->mutex); - // say changed thread to die - win->killthread = 1; - pthread_mutex_unlock(&win->mutex); - DBG("wait for changed thread"); - pthread_join(win->thread, NULL); // wait while thread dies - } - if(win->menu) glutDestroyMenu(win->menu); - glutDestroyWindow(win->GL_ID); - win->GL_ID = 0; // reset for forEachWindow() - DBG("destroy texture %d", win->Tex); - glDeleteTextures(1, &(win->Tex)); - glFinish(); - if(!removeWindow(win->ID)) WARNX(_("Error removing from list")); - totWindows--; - return 1; + DBG("try to kill win GL_ID=%d", GL_ID); + windowData *win; + win = searchWindow_byGLID(GL_ID); + if(!win) return 0; + glutSetWindow(GL_ID); // obviously set window (for closing from menu) + if(!win->killthread){ + pthread_mutex_lock(&win->mutex); + // say changed thread to die + win->killthread = 1; + pthread_mutex_unlock(&win->mutex); + DBG("wait for changed thread"); + pthread_join(win->thread, NULL); // wait while thread dies + } + if(win->menu) glutDestroyMenu(win->menu); + glutDestroyWindow(win->GL_ID); + win->GL_ID = 0; // reset for forEachWindow() + DBG("destroy texture %d", win->Tex); + glDeleteTextures(1, &(win->Tex)); + glFinish(); + if(!removeWindow(win->ID)) WARNX(_("Error removing from list")); + totWindows--; + return 1; } /** @@ -135,89 +135,90 @@ int killwindow(int GL_ID){ * @return 1 in case of OK, 0 if fault */ int destroyWindow(int window, winIdType type){ - if(!initialized) return 0; - int r = 0; - DBG("lock"); - pthread_mutex_lock(&winini_mutex); - DBG("locked"); - if(type == INNER){ - windowData *win = searchWindow(window); - if(win) r = killwindow(win->GL_ID); - }else - r = killwindow(window); - pthread_mutex_unlock(&winini_mutex); - DBG("window killed"); - return r; + if(!initialized) return 0; + int r = 0; + DBG("lock"); + pthread_mutex_lock(&winini_mutex); + DBG("locked"); + if(type == INNER){ + windowData *win = searchWindow(window); + if(win) r = killwindow(win->GL_ID); + }else + r = killwindow(window); + pthread_mutex_unlock(&winini_mutex); + DBG("window killed"); + return r; } /** * asynchroneous destroying - for using from menu */ void destroyWindow_async(int window_GL_ID){ - pthread_mutex_lock(&winini_mutex); - wannakill_GL_ID = window_GL_ID; - pthread_mutex_unlock(&winini_mutex); + pthread_mutex_lock(&winini_mutex); + wannakill_GL_ID = window_GL_ID; + pthread_mutex_unlock(&winini_mutex); } void renderBitmapString(float x, float y, void *font, char *string, GLubyte *color){ - if(!initialized) return; - char *c; - int x1=x, W=0; - for(c = string; *c; c++){ - W += glutBitmapWidth(font,*c);// + 1; - } - x1 -= W/2; - glColor3ubv(color); - glLoadIdentity(); - glTranslatef(0.,0., -150); - //glTranslatef(x,y, -4000.); - for (c = string; *c != '\0'; c++){ - glColor3ubv(color); - glRasterPos2f(x1,y); - glutBitmapCharacter(font, *c); - //glutStrokeCharacter(GLUT_STROKE_ROMAN, *c); - x1 = x1 + glutBitmapWidth(font,*c);// + 1; - } + if(!initialized) return; + char *c; + int x1=x, W=0; + for(c = string; *c; c++){ + W += glutBitmapWidth(font,*c);// + 1; + } + x1 -= W/2; + glColor3ubv(color); + glLoadIdentity(); + glTranslatef(0.,0., -150); + //glTranslatef(x,y, -4000.); + for (c = string; *c != '\0'; c++){ + glColor3ubv(color); + glRasterPos2f(x1,y); + glutBitmapCharacter(font, *c); + //glutStrokeCharacter(GLUT_STROKE_ROMAN, *c); + x1 = x1 + glutBitmapWidth(font,*c);// + 1; + } } void redisplay(int GL_ID){ - if(!initialized) return; - glutSetWindow(GL_ID); - glutPostRedisplay(); + if(!initialized) return; + glutSetWindow(GL_ID); + glutPostRedisplay(); } void RedrawWindow(){ - if(!initialized) return; - int window; - window = glutGetWindow(); - windowData *win = searchWindow_byGLID(window); - if(!win) return; - if(pthread_mutex_trylock(&win->mutex) != 0) return; - int w = win->image->w, h = win->image->h; - glClearColor(0.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glLoadIdentity(); - glTranslatef(win->x, win->y, 0.); - glScalef(-win->zoom, -win->zoom, 1.); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, win->Tex); - if(win->image->changed){ - DBG("change texture as image have been changed"); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, win->image->rawdata); - win->image->changed = 0; - } - w /= 2.; h /= 2.; - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(-w, -h ); - glTexCoord2f(1.0f, 0.0f); glVertex2f( w, -h ); - glTexCoord2f(1.0f, 1.0f); glVertex2f( w, h ); - glTexCoord2f(0.0f, 1.0f); glVertex2f(-w, h ); - glEnd(); - glDisable(GL_TEXTURE_2D); - glFinish(); - glutSwapBuffers(); - pthread_mutex_unlock(&win->mutex); + if(!initialized) return; + int window; + window = glutGetWindow(); + windowData *win = searchWindow_byGLID(window); + if(!win) return; + if(pthread_mutex_trylock(&win->mutex) != 0) return; + int w = win->image->w, h = win->image->h; + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity(); + glTranslatef(win->x, win->y, 0.); + glScalef(-win->zoom, -win->zoom, 1.); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, win->Tex); + if(win->image->changed){ + DBG("change texture as image have been changed"); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, win->image->rawdata); + win->image->changed = 0; + } + w /= 2.; h /= 2.; + glBegin(GL_QUADS); + glTexCoord2f(1.0f, 1.0f); glVertex2f( -w, -h ); // top right + glTexCoord2f(1.0f, 0.0f); glVertex2f( -w, h ); // bottom right + glTexCoord2f(0.0f, 0.0f); glVertex2f(w, h ); // bottom left + glTexCoord2f(0.0f, 1.0f); glVertex2f(w, -h ); // top left + + glEnd(); + glDisable(GL_TEXTURE_2D); + glFinish(); + glutSwapBuffers(); + pthread_mutex_unlock(&win->mutex); } /** @@ -225,49 +226,49 @@ void RedrawWindow(){ * waits for global signals to create windows & make other actions */ void *Redraw(_U_ void *arg){ - while(1){ - pthread_mutex_lock(&winini_mutex); - if(!initialized){ - DBG("!initialized"); - pthread_mutex_unlock(&winini_mutex); - pthread_exit(NULL); - } - if(wannacreate){ // someone asks to create window - DBG("call for window creating, id: %d", wininiptr->ID); - createWindow(wininiptr); - DBG("done!"); - wininiptr = NULL; - wannacreate = 0; - } - if(wannakill_GL_ID){ - usleep(10000); // wait a little to be sure that caller is closed - killwindow(wannakill_GL_ID); - wannakill_GL_ID = 0; - } - forEachWindow(redisplay); - pthread_mutex_unlock(&winini_mutex); - if(totWindows) glutMainLoopEvent(); // process actions if there are windows - usleep(10000); - } - return NULL; + while(1){ + pthread_mutex_lock(&winini_mutex); + if(!initialized){ + DBG("!initialized"); + pthread_mutex_unlock(&winini_mutex); + pthread_exit(NULL); + } + if(wannacreate){ // someone asks to create window + DBG("call for window creating, id: %d", wininiptr->ID); + createWindow(wininiptr); + DBG("done!"); + wininiptr = NULL; + wannacreate = 0; + } + if(wannakill_GL_ID){ + usleep(10000); // wait a little to be sure that caller is closed + killwindow(wannakill_GL_ID); + wannakill_GL_ID = 0; + } + forEachWindow(redisplay); + pthread_mutex_unlock(&winini_mutex); + if(totWindows) glutMainLoopEvent(); // process actions if there are windows + usleep(10000); + } + return NULL; } void Resize(int width, int height){ - if(!initialized) return; - int window = glutGetWindow(); - windowData *win = searchWindow_byGLID(window); - if(!win) return; - glutReshapeWindow(width, height); - win->w = width; - win->h = height; - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - GLfloat W, H; - calc_win_props(win, &W, &H); - glOrtho(-W,W, -H,H, -1., 1.); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); + if(!initialized) return; + int window = glutGetWindow(); + windowData *win = searchWindow_byGLID(window); + if(!win) return; + glutReshapeWindow(width, height); + win->w = width; + win->h = height; + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + GLfloat W, H; + calc_win_props(win, &W, &H); + glOrtho(-W,W, -H,H, -1., 1.); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); } /** @@ -280,96 +281,96 @@ void Resize(int width, int height){ * or allocated outside data */ windowData *createGLwin(char *title, int w, int h, rawimage *rawdata){ - FNAME(); - if(!initialized) return NULL; - windowData *win = MALLOC(windowData, 1); - if(!addWindow(win)){ - FREE(win); - return NULL; - } - rawimage *raw; - if(rawdata){ - raw = rawdata; - }else{ - raw = MALLOC(rawimage, 1); - if(raw){ - raw->rawdata = MALLOC(GLubyte, w*h*3); - raw->w = w; - raw->h = h; - raw->changed = 1; - // raw->protected is zero automatically - } - } - if(!raw || !raw->rawdata){ - free(raw); - return NULL; - } - win->title = strdup(title); - win->image = raw; - if(pthread_mutex_init(&win->mutex, NULL)){ - WARN(_("Can't init mutex!")); - removeWindow(win->ID); - return NULL; - } - win->w = w; - win->h = h; - win->zoom = 1.; - while(wannacreate); // wait if there was another creating - pthread_mutex_lock(&winini_mutex); - wininiptr = win; - wannacreate = 1; - pthread_mutex_unlock(&winini_mutex); - DBG("wait for creatin"); - while(wannacreate); // wait until window created from main thread - DBG("window created"); - return win; + FNAME(); + if(!initialized) return NULL; + windowData *win = MALLOC(windowData, 1); + if(!addWindow(win)){ + FREE(win); + return NULL; + } + rawimage *raw; + if(rawdata){ + raw = rawdata; + }else{ + raw = MALLOC(rawimage, 1); + if(raw){ + raw->rawdata = MALLOC(GLubyte, w*h*3); + raw->w = w; + raw->h = h; + raw->changed = 1; + // raw->protected is zero automatically + } + } + if(!raw || !raw->rawdata){ + free(raw); + return NULL; + } + win->title = strdup(title); + win->image = raw; + if(pthread_mutex_init(&win->mutex, NULL)){ + WARN(_("Can't init mutex!")); + removeWindow(win->ID); + return NULL; + } + win->w = w; + win->h = h; + win->zoom = 1.; + while(wannacreate); // wait if there was another creating + pthread_mutex_lock(&winini_mutex); + wininiptr = win; + wannacreate = 1; + pthread_mutex_unlock(&winini_mutex); + DBG("wait for creatin"); + while(wannacreate); // wait until window created from main thread + DBG("window created"); + return win; } /** * Init freeGLUT */ void imageview_init(){ - FNAME(); - char *v[] = {PROJNAME, NULL}; - int c = 1; - static int glutnotinited = 1; - if(initialized){ - // " !" - WARNX(_("Already initialized!")); - return; - } - if(glutnotinited){ - DBG("init"); - XInitThreads(); // we need it for threaded windows - glutInit(&c, v); - glutnotinited = 0; - } - glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION); - pthread_create(&GLUTthread, NULL, &Redraw, NULL); - initialized = 1; + FNAME(); + char *v[] = {PROJNAME, NULL}; + int c = 1; + static int glutnotinited = 1; + if(initialized){ + // " !" + WARNX(_("Already initialized!")); + return; + } + if(glutnotinited){ + DBG("init"); + XInitThreads(); // we need it for threaded windows + glutInit(&c, v); + glutnotinited = 0; + } + glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION); + pthread_create(&GLUTthread, NULL, &Redraw, NULL); + initialized = 1; } void killwindow_v(int GL_ID){ - DBG("GL_ID: %d", GL_ID); - killwindow(GL_ID); + DBG("GL_ID: %d", GL_ID); + killwindow(GL_ID); } /** * Close all opened windows and terminate main GLUT thread */ void clear_GL_context(){ - FNAME(); - if(!initialized) return; - DBG("lock"); - pthread_mutex_lock(&winini_mutex); - initialized = 0; - DBG("locked"); - // kill main GLUT thread - pthread_mutex_unlock(&winini_mutex); - forEachWindow(killwindow_v); - DBG("join"); - pthread_join(GLUTthread, NULL); // wait while main thread exits - DBG("main GL thread cancelled"); + FNAME(); + if(!initialized) return; + DBG("lock"); + pthread_mutex_lock(&winini_mutex); + initialized = 0; + DBG("locked"); + // kill main GLUT thread + pthread_mutex_unlock(&winini_mutex); + forEachWindow(killwindow_v); + DBG("join"); + pthread_join(GLUTthread, NULL); // wait while main thread exits + DBG("main GL thread cancelled"); } @@ -379,21 +380,21 @@ void clear_GL_context(){ * X,Y - coordinates of appropriate point at picture */ void conv_mouse_to_image_coords(int x, int y, - float *X, float *Y, - windowData *window){ - float a = window->Daspect / window->zoom; - *X = x * a - window->x0; - *Y = window->y0 - y * a; + float *X, float *Y, + windowData *window){ + float a = window->Daspect / window->zoom; + *X = x * a - window->x0; + *Y = window->y0 - y * a; } void conv_image_to_mouse_coords(float X, float Y, - int *x, int *y, - windowData *window){ - float a = window->zoom / window->Daspect; - *x = (X + window->x0) * a; - *y = (window->y0 - Y) * a; + int *x, int *y, + windowData *window){ + float a = window->zoom / window->Daspect; + *x = (X + window->x0) * a; + *y = (window->y0 - Y) * a; } int get_windows_amount(){ - return totWindows; + return totWindows; } diff --git a/netcamID b/netcamID new file mode 100644 index 0000000..860b6ba --- /dev/null +++ b/netcamID @@ -0,0 +1 @@ +apogee_control -M interface=ethernet,deviceType=camera,address=192.168.99.121,port=80,mac=000951ffffff81ffffffed22,interfaceStatus=Available,id=0x1a3,firmwareRev=0x132,model=Aspen-16M diff --git a/takepic.c b/takepic.c index d1aeadd..1c1c068 100644 --- a/takepic.c +++ b/takepic.c @@ -19,35 +19,35 @@ * MA 02110-1301, USA. */ -#include "takepic.h" -#include -#include #include #include - -#include -#include #include +#include +#include +#include +#include -#include "defhdrs.h" -#include "usage.h" -#include "camtools.h" #ifdef USE_BTA #include "bta_print.h" #endif -#include "macros.h" +#include "camtools.h" +#include "defhdrs.h" #ifdef IMAGEVIEW #include "imageview.h" #endif +#include "macros.h" +#include "takepic.h" +#include "usage.h" + #define BUFF_SIZ 4096 #define PROC_BASE "/proc" #define TMBUFSIZ 40 // time string buffer length -char *pidfilename = "/tmp/apogee_control.pid"; // pidfile +static char *pidfilename = "/tmp/apogee_control.pid"; // pidfile -char tm_buf[TMBUFSIZ]; // time string buffer +static char tm_buf[TMBUFSIZ]; // time string buffer char *camera = NULL, *sensor = NULL, viewfield[80]; double pixX, pixY; // pixel size @@ -57,677 +57,710 @@ int test_headers = 0; // don't even try to open camera device, just show FITS ke double t_ext, t_int; // hot & cold side temperatures time_t expStartsAt; // time of exposition start (time_t) -int itime(){ // time in seconds to count intervals - struct timeval ct; - gettimeofday(&ct, NULL); - return (ct.tv_sec); +static int itime(){ // time in seconds to count intervals + struct timeval ct; + gettimeofday(&ct, NULL); + return (ct.tv_sec); } -int time0; -int ltime(){ // time since last time0 reinitialising - return(itime()-time0); +static int time0; +static int ltime(){ // time since last time0 reinitialising + return(itime()-time0); } // return string with current date/time -size_t curtime(char *s_time){ - time_t tm = time(NULL); - size_t s = strftime(s_time, TMBUFSIZ, "%d/%m/%Y,%H:%M:%S", localtime(&tm)); - if(!s) info("curtime() error"); - return s; +static size_t curtime(char *s_time){ + time_t tm = time(NULL); + size_t s = strftime(s_time, TMBUFSIZ, "%d/%m/%Y,%H:%M:%S", localtime(&tm)); + if(!s) info("curtime() error"); + return s; } // find the first non-exists filename & put it into buff -int check_filename(char *buff, char *outfile, char *ext){ - struct stat filestat; - int num; - for(num = 1; num < 10000; num++){ - if(snprintf(buff, BUFF_SIZ, "%s_%04d.%s", outfile, num, ext) < 1) - return 0; - if(stat(buff, &filestat)) // OK, file not exists - return 1; - } - return 0; +static int check_filename(char *buff, char *outfile, char *ext){ + struct stat filestat; + int num; + for(num = 1; num < 10000; num++){ + if(snprintf(buff, BUFF_SIZ, "%s_%04d.%s", outfile, num, ext) < 1) + return 0; + if(stat(buff, &filestat)) // OK, file not exists + return 1; + } + return 0; } -void reset_usb_port(int pid, int vid){ - int fd, rc; - char buf[256], *d = NULL, *f = NULL; - struct usb_bus *bus; - struct usb_device *dev; - int found = 0; - usb_init(); - usb_find_busses(); - usb_find_devices(); - for(bus = usb_busses; bus && !found; bus = bus->next) { - for(dev = bus->devices; dev && !found; dev = dev->next) { - if (dev->descriptor.idVendor == vid && dev->descriptor.idProduct == pid){ - found = 1; - d = bus->dirname; - f = dev->filename; - } - } - } - if(!found){ - // " " - ERR(_("Device not found")); - return; - } - DBG("found camera device, reseting"); - snprintf(buf, 255, "/dev/bus/usb/%s/%s", d,f); - fd = open(buf, O_WRONLY); - if (fd < 0) { - // " %s: %s" - ERR(_("Can't open device file %s: %s"), buf, strerror(errno)); - return; - } - info("Resetting USB device %s", buf); - rc = ioctl(fd, USBDEVFS_RESET, 0); - if (rc < 0) { - // " ioctl" - perror(_("Error in ioctl")); - return; - } - close(fd); +static void reset_usb_port(int pid, int vid){ + int fd, rc; + char buf[FILENAME_MAX*3], *d = NULL, *f = NULL; + struct usb_bus *bus; + struct usb_device *dev; + int found = 0; + usb_init(); + usb_find_busses(); + usb_find_devices(); + for(bus = usb_busses; bus && !found; bus = bus->next) { + for(dev = bus->devices; dev && !found; dev = dev->next) { + if (dev->descriptor.idVendor == vid && dev->descriptor.idProduct == pid){ + found = 1; + d = bus->dirname; + f = dev->filename; + } + } + } + if(!found){ + // " " + ERR(_("Device not found")); + return; + } + DBG("found camera device, reseting"); + snprintf(buf, sizeof(buf), "/dev/bus/usb/%s/%s", d,f); + fd = open(buf, O_WRONLY); + if (fd < 0){ + // " %s: %s" + ERR(_("Can't open device file %s: %s"), buf, strerror(errno)); + return; + } + info("Resetting USB device %s", buf); + rc = ioctl(fd, USBDEVFS_RESET, 0); + if (rc < 0) { + // " ioctl" + perror(_("Error in ioctl")); + return; + } + close(fd); } // quit by signal static void signals(int sig){ - int u; - // " %d, .\n" - printf(_("Get signal %d, quit.\n"), sig); - u = unlink(pidfilename); - // " PID-" - if(u == -1) perror(_("Can't delete PIDfile")); - ApnGlueWheelClose(); - DBG("wheel closed"); -// ApnGlueExpAbort(); // this function stubs all! -// DBG("exp aborted"); - ApnGlueClose(); - DBG("device closed"); - #ifdef IMAGEVIEW - clear_GL_context(); - #endif - exit(sig); + int u; + // " %d, .\n" + if(sig){ + signal(sig, signals); + printf(_("Get signal %d, quit.\n"), sig); + } + u = unlink(pidfilename); + // " PID-" + if(u == -1) perror(_("Can't delete PIDfile")); + ApnGlueWheelClose(); + DBG("wheel closed"); + ApnGlueExpAbort(); // this function stubs all! + DBG("exp aborted"); + ApnGlueClose(); + DBG("device closed"); + #ifdef IMAGEVIEW + clear_GL_context(); + #endif + exit(sig); } -int sigcounter = 3; +static int sigcounter = 3; static void cnt_signals(int sig){ - --sigcounter; - if(sigcounter != 0){ - // " Ctrl+C %d [], \n" - printf(_("Press Ctrl+C %d time[s] more to interrupt reading\n"), sigcounter); - signal(SIGINT, cnt_signals); - }else{ - signals(sig); - } + --sigcounter; + if(sigcounter){ + // " Ctrl+C %d [], \n" + printf(_("Press Ctrl+C %d time[s] more to interrupt reading\n"), sigcounter); + signal(SIGINT, cnt_signals); + }else{ + signals(sig); + } } // Try to ignore all signals exept SIGINT, which is counted -void ignore_signals(){ - sigcounter = 3; - for(int _=0; _<256; _++) - signal(_, SIG_IGN); - signal(SIGINT, cnt_signals); +static void ignore_signals(){ + sigcounter = 3; + for(int _=0; _<256; _++) + signal(_, SIG_IGN); + signal(SIGINT, cnt_signals); } // We must take care about signals to avoid ctrl+C problems -void catch_signals(){ - for(int _=0; _<256; _++) - signal(_, SIG_IGN); - signal(SIGTERM, signals); // kill (-15) - quit - signal(SIGHUP, signals); // hup - quit - signal(SIGINT, signals); // ctrl+C - quit - signal(SIGQUIT, signals); // ctrl+\ - quit - //signal(SIGTSTP, SIG_IGN); // ignore ctrl+Z +static void catch_signals(){ + for(int _=0; _<256; _++) + signal(_, SIG_IGN); + signal(SIGTERM, signals); // kill (-15) - quit + signal(SIGHUP, signals); // hup - quit + signal(SIGINT, signals); // ctrl+C - quit + signal(SIGQUIT, signals); // ctrl+\ - quit + //signal(SIGTSTP, SIG_IGN); // ignore ctrl+Z } - +/* void restore_signals(){ - sigcounter = 3; - for(int _=0; _<256; _++) - signal(_, SIG_DFL); - unlink(pidfilename); -} + sigcounter = 3; + for(int _=0; _<256; _++) + signal(_, SIG_DFL); + unlink(pidfilename); +}*/ // check for running process -void check4running(){ - // get process name from /proc - int readname(char *name, pid_t pid){ - char *pp = name, byte, path[256]; - int cntr = 0, file; - snprintf (path, 255, PROC_BASE "/%d/cmdline", pid); - file = open(path, O_RDONLY); - if(file == -1) return 0; - do{ - if(read(file, &byte, 1) != 1) break; - if (byte != '/') *pp++ = byte; - else pp = name; - } - while(byte != EOF && byte != 0 && cntr++ < 255); - name[255] = 0; - close(file); - return 1; - } - DIR *dir; - FILE* pidfile; - struct dirent *de; - struct stat s_buf; - pid_t pid, self, run = 0; - char name[256], myname[256]; - if (!(dir = opendir(PROC_BASE))){ // open /proc dir - perror(PROC_BASE); - exit(1); - } - self = getpid(); // self PID - if(stat(pidfilename, &s_buf) == 0){ // PID file exists - pidfile = fopen(pidfilename, "r"); - if(1 == fscanf(pidfile, "%d", &run)){ // get PID of (possibly) running process - if(readname(name, run) && strncmp(name, myname, 255) == 0){ - // " (pid=%d), .\n" - ERR(_("\nFound running process (pid=%d), exit.\n"), run); - exit(7); - } - } - fclose(pidfile); - } - // there's no PID file or it's old - readname(myname, self); // self name - while ((de = readdir (dir)) != NULL){ // scan /proc - if (!(pid = (pid_t) atoi (de->d_name)) || pid == self) - continue; - readname(name, pid); // get process name - if(strncmp(name, myname, 255) == 0){ - // " (pid=%d), .\n" - ERR(_("\nFound running process (pid=%d), exit.\n"), pid); - exit(7); - } - } - closedir(dir); - unlink(pidfilename); // try to remove pidfilename - DBG("my PID: %d\n", self); - pidfile = fopen(pidfilename, "w"); - fprintf(pidfile, "%d\n", self); // write into pidfilename the pid - fclose(pidfile); +static void check4running(){ + // get process name from /proc + int readname(char *name, pid_t pid){ + char *pp = name, byte, path[256]; + int cntr = 0, file; + snprintf (path, 255, PROC_BASE "/%d/cmdline", pid); + file = open(path, O_RDONLY); + if(file == -1) return 0; + do{ + if(read(file, &byte, 1) != 1) break; + if (byte != '/') *pp++ = byte; + else pp = name; + } + while(byte != EOF && byte != 0 && cntr++ < 255); + name[255] = 0; + close(file); + return 1; + } + DIR *dir; + FILE* pidfile; + struct dirent *de; + struct stat s_buf; + pid_t pid, self, run = 0; + char name[256], myname[256]; + if (!(dir = opendir(PROC_BASE))){ // open /proc dir + perror(PROC_BASE); + exit(1); + } + self = getpid(); // self PID + if(stat(pidfilename, &s_buf) == 0){ // PID file exists + pidfile = fopen(pidfilename, "r"); + if(1 == fscanf(pidfile, "%d", &run)){ // get PID of (possibly) running process + if(readname(name, run) && strncmp(name, myname, 255) == 0){ + // " (pid=%d), .\n" + ERR(_("\nFound running process (pid=%d), exit.\n"), run); + exit(7); + } + } + fclose(pidfile); + } + // there's no PID file or it's old + readname(myname, self); // self name + while ((de = readdir (dir)) != NULL){ // scan /proc + if (!(pid = (pid_t) atoi (de->d_name)) || pid == self) + continue; + readname(name, pid); // get process name + if(strncmp(name, myname, 255) == 0){ + // " (pid=%d), .\n" + ERR(_("\nFound running process (pid=%d), exit.\n"), pid); + exit(7); + } + } + closedir(dir); + unlink(pidfilename); // try to remove pidfilename + DBG("my PID: %d\n", self); + pidfile = fopen(pidfilename, "w"); + fprintf(pidfile, "%d\n", self); // write into pidfilename the pid + fclose(pidfile); } // Work with turret -void parse_turret_args(){ - int maxPos, curPos; - if(ApnGlueWheelOpen(Nwheel, Apn_Filter_FW50_7S)){ - // " " - ERR(_("Can't open turret")); - return; - } - DBG("get max pos"); - maxPos = ApnGlueWheelGetMaxPos(); - curPos = ApnGlueWheelGetPos(); - // " (MAX) (CUR) :\n" - printf(_("Turret MAXimum position and CURrent position:\n")); - printf("MAX=%d, CUR=%d\n", maxPos, curPos); - if(wheelPos == 0) goto wheelret; - if(wheelPos > maxPos){ - // " " - ERR(_("Required position greater then max")); - goto wheelret; - } - if(ApnGlueWheelSetPos(wheelPos)){ - // " " - ERR(_("Can't move turret")); - goto wheelret; - } - if(ApnGlueWheelGetStatus()){ - // " " - printf(_("Wait, while turret is moving ")); - while(ApnGlueWheelGetStatus()){ - printf("."); fflush(NULL); - sleep(1); - } - } - printf("\n"); +static void parse_turret_args(){ + int maxPos, curPos; + if(ApnGlueWheelOpen(Nwheel, Apn_Filter_FW50_7S)){ + // " " + ERR(_("Can't open turret")); + return; + } + DBG("get max pos"); + maxPos = ApnGlueWheelGetMaxPos(); + curPos = ApnGlueWheelGetPos(); + // " (MAX) (CUR) :\n" + printf(_("Turret MAXimum position and CURrent position:\n")); + printf("MAX=%d, CUR=%d\n", maxPos, curPos); + if(wheelPos == 0) goto wheelret; + if(wheelPos > maxPos){ + // " " + ERR(_("Required position greater then max")); + goto wheelret; + } + if(ApnGlueWheelSetPos(wheelPos)){ + // " " + ERR(_("Can't move turret")); + goto wheelret; + } + if(ApnGlueWheelGetStatus()){ + // " " + printf(_("Wait, while turret is moving ")); + while(ApnGlueWheelGetStatus()){ + printf("."); fflush(NULL); + sleep(1); + } + } + printf("\n"); wheelret: - ApnGlueWheelClose(); + ApnGlueWheelClose(); } #ifdef IMAGEVIEW -void change_displayed_image(unsigned short *buf, windowData *win){ - FNAME(); - if(!win) return; - pthread_mutex_lock(&win->mutex); - int w = win->image->w, h = win->image->h; - static GLubyte i = 0; - GLubyte *raw = win->image->rawdata; - DBG("image size: %dx%d",w,h); - convert_grayimage(buf, raw, w, h); - win->image->changed = 1; - pthread_mutex_unlock(&win->mutex); - i++; +static void change_displayed_image(unsigned short *buf, windowData *win){ + FNAME(); + if(!win) return; + pthread_mutex_lock(&win->mutex); + int w = win->image->w, h = win->image->h; + static GLubyte i = 0; + GLubyte *raw = win->image->rawdata; + DBG("image size: %dx%d",w,h); + convert_grayimage(buf, raw, w, h); + win->image->changed = 1; + pthread_mutex_unlock(&win->mutex); + i++; } #endif int main(int argc, char **argv){ - int i; //cycles - int pid = -1, vid = -1; // device pid/vid - FILE *f_tlog = NULL; // temperature logging file - FILE *f_statlog = NULL; // stat file - int roih=0, roiw=0, osh=0, osw=0, binh=0, binw=0, shtr=0; // camera parameters - char whynot[BUFF_SIZ]; // temporary buffer for error texts - int imW=1024, imH=1024; // real (with binning) image size - unsigned short *buf = NULL; // image buffer - double mintemp=0.; + int i; //cycles + int pid = -1, vid = -1; // device pid/vid + FILE *f_tlog = NULL; // temperature logging file + FILE *f_statlog = NULL; // stat file + int roih=0, roiw=0, osh=0, osw=0, binh=0, binw=0, shtr=0; // camera parameters + char whynot[BUFF_SIZ]; // temporary buffer for error texts + int imW=1024, imH=1024; // real (with binning) image size + unsigned short *buf = NULL; // image buffer + double mintemp=0.; #ifdef IMAGEVIEW - windowData *mainwin = NULL; - rawimage im; + windowData *mainwin = NULL; + rawimage im; #endif - initial_setup(); // setup for macros.c - parse_args(argc, argv); + initial_setup(); // setup for macros.c + parse_args(argc, argv); - catch_signals(); - // Check whether there's no concurrents - check4running(); + catch_signals(); + // Check whether there's no concurrents + check4running(); - if(test_headers){ - writefits(NULL, imW, imH, NULL); - return(0); - } - if(fake) test_headers = 1; + if(test_headers){ + writefits(NULL, imW, imH, NULL); + return(0); + } + if(fake) test_headers = 1; // Begin of non-fake block -------> - if(!fake){ - // Turret block - if(open_turret) parse_turret_args(); - if(only_turret){ - // " , " - info(_("Expose parameters aren't specified, exit")); - goto returning; - } + if(!fake){ + // Turret block + if(open_turret) parse_turret_args(); + if(only_turret){ + // " , " + info(_("Expose parameters aren't specified, exit")); + goto returning; + } - // And camera block - // First - open camera devise - if(subnet) ApnGlueSetSubnet(subnet); // set subnet name if there's an ethernet camera - if(cammsgid) ApnGlueSetMsgId(cammsgid); // set msgid given by user - if(ApnGlueOpen(Ncam)){ - // " , " - ERR(_("Can't open camera device, exit")); - if(ApnGlueIsEthernet()){ - // " -" - info(_("Try to reboot camera from web-interface")); - } - exit(9); - } + // And camera block + // First - open camera devise + if(subnet) ApnGlueSetSubnet(subnet); // set subnet name if there's an ethernet camera + if(cammsgid) ApnGlueSetMsgId(cammsgid); // set msgid given by user + if(ApnGlueOpen(Ncam)){ + // " , " + ERR(_("Can't open camera device, exit")); + if(ApnGlueIsEthernet()){ + // " -" + info(_("Try to reboot camera from web-interface")); + } + exit(9); + } DBG("open %d", Ncam); - ApnGlueGetName(&sensor, &camera); - camera = strdup(camera); sensor = strdup(sensor); - // " '%s' '%s'" - info(_("Find camera '%s' with sensor '%s'"), camera, sensor); + // ApnGlueGetName(&sensor, &camera); + // camera = strdup(camera); sensor = strdup(sensor); - bug. it shows a shit! + // " '%s' '%s'" - // " USB: " - char *msg = NULL; - msg = ApnGlueGetInfo(&pid, &vid); - if(msg){ - printf("\n Camera info:\n%s\n", msg); - free(msg); - } + char *msg = NULL; + char *findnm(const char *nm){ + char *f = strstr(msg, nm); + DBG("f=%s", f); + if(!f) return NULL; + f += strlen(nm); + DBG("f=%s", f); + char *e = strchr(f, '\n'); + DBG("e=%s", e); + size_t l = (e) ? (size_t)(e-f) : strlen(f); + char *r = MALLOC(char, l+1); + snprintf(r, l, f); + DBG("r=%s", r); + return r; + } + msg = ApnGlueGetInfo(&pid, &vid); + if(msg){ + //printf("\n Camera info:\n%s\n", msg); + camera = findnm("Model: "); + sensor = findnm("Sensor: "); + info(_("Camera '%s' with sensor '%s' detected"), camera, sensor); + free(msg); + } - // Second - check whether we want do a simple power operations - if(StopRes){ - switch(StopRes){ - case Reset: - ApnGlueReset(); - if(pid > 0 && vid > 0) - reset_usb_port(pid, vid); - break; - case Sleep: - if(ApnGluePowerDown()) - // " !" - ERR(_("Error: sleepless night!")); - break; - default: - ApnGluePowerResume(); - } - goto returning; - } - // And then we can do other work - if(save_Tlog){ - struct stat s; - char print_hdr = 1; - if(stat("temp_log", &s) == 0) print_hdr = 0; - f_tlog = fopen("temp_log", "a"); - // " " - if(!f_tlog) err(1, _("Can't open temperature log file")); - if(print_hdr) - fprintf(f_tlog, "Time\t\t\tUnix time\tTint\tText\tStatus (eXp, Idle)\n"); - //fprintf(f_tlog, "\n\n\n"); - } - // Shutter - if(Shtr != -1) - ApnGlueOpenShutter(Shtr); - if(stat_logging){ - struct stat s; - char print_hdr = 1; - if(stat("stat_log", &s) == 0) print_hdr = 0; - f_statlog = fopen("stat_log", "a"); - // " " - if(!f_statlog) err(1, _("Can't open statistics log file")); - if(print_hdr) - fprintf(f_statlog, "Time\t\t\tUnix time\tTexp\tTint\tText\tImax\tImin\tIavr\tIstd\tNover\tN>3std\tIavr3\t\tIstd3\n"); - } - //ApnGlueSetFan(3); - ApnGlueGetMaxValues (NULL, &roiw, &roih, &osw, &osh, &binw, &binh, - &shtr, &mintemp); - ApnGlueGetGeom(&pixX, &pixY); - // "\n " - printf(_("\nThe shutter is ")); - if(ApnGlueReadShutter()) - // "\n" - printf(_("open\n")); - else - // "\n" - printf(_("closed\n")); - printCoolerStat(NULL); + // Second - check whether we want do a simple power operations + if(StopRes){ + switch(StopRes){ + case Reset: + ApnGlueReset(); + if(pid > 0 && vid > 0) + reset_usb_port(pid, vid); + break; + case Sleep: + if(ApnGluePowerDown()) + // " !" + ERR(_("Error: sleepless night!")); + break; + default: + ApnGluePowerResume(); + } + goto returning; + } - if(set_T){ - if(cooler_off){ - ApnGlueSetTemp(0); - // " " - info(_("Switch cooler off")); - }else{ - if(temperature >= mintemp){ - if(temperature == 0) temperature += DBL_EPSILON; // remove problem of zero temperature - ApnGlueSetTemp(temperature); - // " " - info(_("Changing of cooler setpoint")); - }else - // " " - info(_("The temperature setpoint is too low")); - } - } + // And then we can do other work + if(save_Tlog){ + struct stat s; + char print_hdr = 1; + if(stat("temp_log", &s) == 0) print_hdr = 0; + f_tlog = fopen("temp_log", "a"); + // " " + if(!f_tlog) err(1, _("Can't open temperature log file")); + if(print_hdr) + fprintf(f_tlog, "Time\t\t\tUnix time\tTint\tText\tStatus (eXp, Idle)\n"); + //fprintf(f_tlog, "\n\n\n"); + } + // Shutter + if(Shtr != -1) + ApnGlueOpenShutter(Shtr); + if(stat_logging){ + struct stat s; + char print_hdr = 1; + if(stat("stat_log", &s) == 0) print_hdr = 0; + f_statlog = fopen("stat_log", "a"); + // " " + if(!f_statlog) err(1, _("Can't open statistics log file")); + if(print_hdr) + fprintf(f_statlog, "Time\t\t\tUnix time\tTexp\tTint\tText\tImax\tImin\tIavr\tIstd\tNover\tN>3std\tIavr3\t\tIstd3\n"); + } + ApnGlueGetMaxValues(NULL, &roiw, &roih, &osw, &osh, &binw, &binh, + &shtr, &mintemp); + info(_("Max binning: %dx%d\n"), binw, binh); + DBG("Shtr = %d, mintemp = %g", shtr, mintemp); + ApnGlueGetGeom(&pixX, &pixY); + // "\n " + printf(_("\nThe shutter is ")); + if(ApnGlueReadShutter()) + // "\n" + printf(_("open\n")); + else + // "\n" + printf(_("closed\n")); + printCoolerStat(NULL); - if(only_T || exptime < 0) goto returning; + if(set_T){ + if(cooler_off){ + ApnGlueSetTemp(0); + // " " + info(_("Switch cooler off")); + }else{ + if(temperature >= mintemp){ + if(temperature == 0.) temperature += 2.*DBL_EPSILON; // remove problem of zero temperature + ApnGlueSetTemp(temperature); + // " " + info(_("Changing of cooler setpoint")); + }else + // " " + info(_("The temperature setpoint is too low")); + } + } - // : %g x %g - //info(_("Pixel size: %g x %g"), pixX, pixY); + if(fanspd > -1){ + ApnGlueSetFan(fanspd); + if(ApnGlueGetFan() == fanspd) + // " %d\n" + info(_("Set fan speed %d\n"), fanspd); + else + // " !\n" + ERR("Can't set fan speed\n"); + } - snprintf(viewfield, 79, "(0, %d)(0, %d)", roiw, roih); - // " : %s" - info(_("Field of view: %s"), viewfield); - // " : (0, %d)(0, %d)" - info(_("Array field: (0, %d)(0, %d)"), roiw+osw, roih+osh); + if(only_T || exptime < 0) goto returning; - if(X0 == -1) X0 = 0; // default parameters - if(Y0 == -1) Y0 = 0; - if(X1 == -1 || X1 > roiw) X1 = roiw; - if(Y1 == -1 || Y1 > roih) Y1 = roih; - if(X0 != 0 || X1 != roiw) osw = 0; // check overskan - if(Y0 != 0 || Y1 != roih) osh = 0; - if(hbin > binw) hbin = binw; - if(vbin > binh) vbin = binh; + // : %g x %g + //info(_("Pixel size: %g x %g"), pixX, pixY); + --roiw; + --roih; + snprintf(viewfield, 79, "(0, %d)(0, %d)", roiw-osw, roih-osh); + // " : %s" + info(_("Field of view: %s"), viewfield); + // " : (0, %d)(0, %d)" + info(_("Array field: (0, %d)(0, %d)"), roiw, roih); - AutoadjustFanSpeed(FALSE); - if(noflash) ApnGluePreFlash(0); - if(noclean) ApnGlueDisablePostExpFlushing(1); - if(twelveBit) - ApnGlueSetDatabits(Apn_Resolution_TwelveBit); - else - ApnGlueSetDatabits(Apn_Resolution_SixteenBit); + if(X0 == -1) X0 = 0; // default parameters + if(Y0 == -1) Y0 = 0; + if(X1 == -1 || X1 > roiw) X1 = roiw; + if(Y1 == -1 || Y1 > roih) Y1 = roih; + // check overskan + if(X0 != 0 || X1 != roiw){ + if(X1 == roiw) X1 -= osw; + osw = 0; + } + if(Y0 != 0 || Y1 != roih){ + if(Y1 == roih) Y1 -= osh; + osh = 0; + } + if(hbin > binw) hbin = binw; + if(vbin > binh) vbin = binh; - if(ROspeed) ApnGlueSetSpeed(ROspeed); + //AutoadjustFanSpeed(FALSE); + if(noflash) ApnGluePreFlash(0); + if(noclean) ApnGlueDisablePostExpFlushing(1); + if(twelveBit) + ApnGlueSetDatabits(Apn_Resolution_TwelveBit); + else + ApnGlueSetDatabits(Apn_Resolution_SixteenBit); - if(pre_exp){// pre-expose - // " " - info(_("Pre-expose")); - double E = 0.; - if(!twelveBit) - ApnGlueSetDatabits(Apn_Resolution_TwelveBit); - if(ApnGlueSetExpGeom(roiw, roih, 0, 0, 8, 8, - 0, 0, &imW, &imH, whynot)){ - // " : %s" - ERR("Can't set readout parameters: %s", whynot); - goto returning; - } - int L = imW*imH; - buf = (unsigned short*) calloc(L, sizeof(unsigned short)); - if(!buf){ - // " !" - ERR(_("malloc() failed!")); - } - if(ApnGlueStartExp(&E, 0)){ - if(pid > 0 && vid > 0) - reset_usb_port(pid, vid); - // " !" - if(ApnGlueStartExp(&E, 0)) ERR("Error exposing frame!"); - } - ignore_signals(); - if(ApnGlueReadPixels(buf, L, whynot)){ - // " : %s\n" - ERR(_("Readout error: %s\n"), whynot); - } - free(buf); - // restore signals - catch_signals(); - if(!twelveBit) - ApnGlueSetDatabits(Apn_Resolution_SixteenBit); - } - if(ApnGlueSetExpGeom(X1-X0, Y1-Y0, osw, osh, hbin, vbin, - X0, Y0, &imW, &imH, whynot)){ - // " : %s" - ERR("Can't set readout parameters: %s", whynot); - goto returning; - } - } // <------ end of non-fake block - DBG("geomery: %dx%d", imW, imH); - int L = imW*imH; - buf = (unsigned short*) calloc(L, sizeof(unsigned short)); - if(!buf){ - // " !" - ERR(_("malloc() failed!")); - } + if(ROspeed) ApnGlueSetSpeed(ROspeed); + + if(pre_exp){// pre-expose + // " " + info(_("Pre-expose")); + double E = 0.; + if(!twelveBit) + ApnGlueSetDatabits(Apn_Resolution_TwelveBit); + if(ApnGlueSetExpGeom(8, 8, 0, 0, 8, 8, 0, 0, &imW, &imH, whynot)){ + // " : %s" + ERR("Can't set readout parameters: %s", whynot); + goto returning; + } + int L = imW*imH; + buf = (unsigned short*) calloc(L, sizeof(unsigned short)); + if(!buf){ + // " !" + ERR(_("malloc() failed!")); + } + if(ApnGlueStartExp(&E, 0)){ + if(pid > 0 && vid > 0) + reset_usb_port(pid, vid); + // " !" + if(ApnGlueStartExp(&E, 0)) ERR("Error exposing pre-exp frame!"); + } + ignore_signals(); + if(ApnGlueReadPixels(buf, L, whynot)){ + // " : %s\n" + ERR(_("Readout error: %s\n"), whynot); + } + free(buf); + // restore signals + catch_signals(); + if(!twelveBit) + ApnGlueSetDatabits(Apn_Resolution_SixteenBit); + } + if(ApnGlueSetExpGeom(X1-X0-1, Y1-Y0+1, osw, osh, hbin, vbin, + X0, Y0, &imW, &imH, whynot)){ + DBG("ApnGlueSetExpGeom(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %s)", X1-X0+1, Y1-Y0+1, osw, osh, hbin, vbin, + X0, Y0, imW, imH, whynot); + // " : %s" + ERR("Can't set readout parameters: %s", whynot); + goto returning; + } + DBG("ApnGlueSetExpGeom(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %s)", X1-X0+1, Y1-Y0+1, osw, osh, hbin, vbin, + X0, Y0, imW, imH, whynot); + } // <------ end of non-fake block + DBG("geomery: %dx%d", imW, imH); + int L = imW*imH; + buf = (unsigned short*) calloc(L, sizeof(unsigned short)); + if(!buf){ + // " !" + ERR(_("malloc() failed!")); + } #ifdef IMAGEVIEW - // start image view module if not need to save image or manually defined displaying - if(fake || !save_image || show_image){ - imageview_init(); - im.protected = 1; - im.rawdata = MALLOC(GLubyte, imW*imH*3); - if(!im.rawdata) ERR("Can't allocate memory"); - im.w = imW; im.h = imH; - } + // start image view module if not need to save image or manually defined displaying + if(fake || !save_image || show_image){ + imageview_init(); + im.protected = 1; + im.rawdata = MALLOC(GLubyte, imW*imH*3); + if(!im.rawdata) ERR("Can't allocate memory"); + im.w = imW; im.h = imH; + } #endif - if(fake) pics = 0; - DBG("start %d expositions", pics); - for (i = 0; i < pics; i++){ - DBG("spd"); - AutoadjustFanSpeed(FALSE); - DBG("cooler"); - temperature = printCoolerStat(NULL); - double E; - int I; - if(exptime > -1){ // do expositions only if there is -x key - E = (double) exptime / 1000.; - I = (int) E; - ignore_signals(); - DBG("start exp"); - if(ApnGlueStartExp(&E, shutter)){ - if(pid > 0 && vid > 0) - reset_usb_port(pid, vid); - // " !" - if(ApnGlueStartExp(&E, shutter)) ERR("Error exposing frame!"); - } - DBG("Exposing"); + if(fake) pics = 0; + DBG("start %d expositions", pics); + for (i = 0; i < pics; i++){ + /*DBG("spd"); + AutoadjustFanSpeed(FALSE); + DBG("cooler");*/ + temperature = printCoolerStat(NULL); + double E; + int I; + if(exptime > -1){ // do expositions only if there is -x key + E = (double) exptime / 1000.; + I = (int) E; + ignore_signals(); + DBG("start exp"); + if(ApnGlueStartExp(&E, shutter)){ + DBG("pid=%d, vid=%d", pid, vid); + if(pid > 0 && vid > 0) + reset_usb_port(pid, vid); + // " !" + if(ApnGlueStartExp(&E, shutter)) ERR("Error exposing frame!"); + } + DBG("Exposing"); #ifdef USE_BTA - if(histry) push_param(); + if(histry) push_param(); #endif - //exptime = (int)(E*1000.); - printf("\n\n"); - // " %d, - %g \n" - printf(_("Capture frame %d, exp time - %g sec\n"), i, E); - expStartsAt = time(NULL); // - /*if(save_Tlog) if(curtime(tm_buf)) - // " %d- ; : %g, : %s, : %s\n" - fprintf(f_tlog, _("Begin exposition of %dth frame; exp length: %gs, start time: %s, filename: %s\n"), - i, E, tm_buf, outfile);*/ - time0 = itime(); - do{ - // %.3f \n - //printf(_("%.3f seconds till exposition ends\n"), ((float)ltmp) / 1000.); - t_int = printCoolerStat(&t_ext); - if(save_Tlog && curtime(tm_buf)){ - fprintf(f_tlog, "%s\t%ld\t%.2f\t%.2f\tX\n", tm_buf, time(NULL), t_int, t_ext); - } - AutoadjustFanSpeed(FALSE); - int tt = ltime(); - printf("%d sec\n", tt); - if(I - tt > time_interval){ - sleep(time_interval); + //exptime = (int)(E*1000.); + printf("\n\n"); + // " %d, - %g \n" + printf(_("Capture frame %d, exp time - %g sec\n"), i, E); + expStartsAt = time(NULL); // + /*if(save_Tlog) if(curtime(tm_buf)) + // " %d- ; : %g, : %s, : %s\n" + fprintf(f_tlog, _("Begin exposition of %dth frame; exp length: %gs, start time: %s, filename: %s\n"), + i, E, tm_buf, outfile);*/ + time0 = itime(); + do{ + // %.3f \n + //printf(_("%.3f seconds till exposition ends\n"), ((float)ltmp) / 1000.); + t_int = printCoolerStat(&t_ext); + if(save_Tlog && curtime(tm_buf)){ + fprintf(f_tlog, "%s\t%ld\t%.2f\t%.2f\tX\n", tm_buf, time(NULL), t_int, t_ext); + } + //AutoadjustFanSpeed(FALSE); + int tt = ltime(); + printf("%d sec\n", tt); + if(I - tt > time_interval){ + sleep(time_interval); #ifdef USE_BTA - if(histry) push_param(); + if(histry) push_param(); #endif - }else while(!ApnGlueExpDone()) usleep(100000); // make 100ms error - }while(!ApnGlueExpDone()); - DBG("exp done"); + }else while(!ApnGlueExpDone()) usleep(100000); // make 100ms error + }while(!ApnGlueExpDone()); + DBG("exp done"); #ifdef USE_BTA - if(histry) push_param(); + if(histry) push_param(); #endif - // " :" - printf(_("Read image: ")); - fflush(stdout); - // try to ignore signals for this long operation - ignore_signals(); - if(ApnGlueReadPixels(buf, L, whynot)){ - // " : %s\n" - ERR(_("Readout error: %s\n"), whynot); - catch_signals(); - continue; - } - // mirror image if needed - if(flipX){ // mirror vertically (around X axe) - unsigned short *newbuf = MALLOC(unsigned short, imW*imH); - OMP_FOR() - for(int _row = 0; _row < imH; _row++){ - unsigned short *optr = &newbuf[_row*imW], *iptr = &buf[(imH-1-_row)*imW]; - for(int _pix = 0; _pix < imW; _pix++) - *optr++ = *iptr++; - } - FREE(buf); - buf = newbuf; - } - if(flipY){ // mirror horizontally (around Y axe) - unsigned short *newbuf = MALLOC(unsigned short, imW*imH); - OMP_FOR() - for(int _row = 0; _row < imH; _row++){ - unsigned short *optr = &newbuf[_row*imW], *iptr = &buf[(_row+1)*imW-1]; - for(int _pix = 0; _pix < imW; _pix++) - *optr++ = *iptr--; - } - FREE(buf); - buf = newbuf; - } - // restore signals - catch_signals(); - t_int = printCoolerStat(&t_ext); - if(f_statlog && curtime(tm_buf)) - fprintf(f_statlog, "%s\t%ld\t%g\t%.2f\t%.2f\t", tm_buf, - time(NULL), E, t_int, t_ext); - print_stat(buf, L, f_statlog); + // " :" + printf(_("Read image: ")); + fflush(stdout); + // try to ignore signals for this long operation + ignore_signals(); + if(ApnGlueReadPixels(buf, L, whynot)){ + // " : %s\n" + ERR(_("Readout error: %s\n"), whynot); + catch_signals(); + continue; + } + // mirror image if needed + if(flipX){ // mirror vertically (around X axe) + unsigned short *newbuf = MALLOC(unsigned short, imW*imH); + OMP_FOR() + for(int _row = 0; _row < imH; _row++){ + unsigned short *optr = &newbuf[_row*imW], *iptr = &buf[(imH-1-_row)*imW]; + for(int _pix = 0; _pix < imW; _pix++) + *optr++ = *iptr++; + } + FREE(buf); + buf = newbuf; + } + if(flipY){ // mirror horizontally (around Y axe) + unsigned short *newbuf = MALLOC(unsigned short, imW*imH); + OMP_FOR() + for(int _row = 0; _row < imH; _row++){ + unsigned short *optr = &newbuf[_row*imW], *iptr = &buf[(_row+1)*imW-1]; + for(int _pix = 0; _pix < imW; _pix++) + *optr++ = *iptr--; + } + FREE(buf); + buf = newbuf; + } + // restore signals + catch_signals(); + t_int = printCoolerStat(&t_ext); + if(f_statlog && curtime(tm_buf)) + fprintf(f_statlog, "%s\t%ld\t%g\t%.2f\t%.2f\t", tm_buf, + time(NULL), E, t_int, t_ext); + print_stat(buf, L, f_statlog); #ifdef IMAGEVIEW - if(!save_image || show_image){ - // build FITS headers tree for viewer - #ifdef USE_BTA - write_bta_data(NULL); - #endif - check_wcs(); - if(!get_windows_amount() || !mainwin){ - mainwin = createGLwin("Sample window", 400, 400, &im); - if(!mainwin){ - // " OpenGL, !" - info(_("Can't open OpenGL window, image preview will be inaccessible")); - }else{ - mainwin->killthread = 1; - } - } - } - if(get_windows_amount() && mainwin){ - DBG("change image"); - change_displayed_image(buf, mainwin); - } + if(!save_image || show_image){ + // build FITS headers tree for viewer + #ifdef USE_BTA + write_bta_data(NULL); + #endif + check_wcs(); + if(!get_windows_amount() || !mainwin){ + mainwin = createGLwin("Sample window", 400, 400, &im); + if(!mainwin){ + // " OpenGL, !" + info(_("Can't open OpenGL window, image preview will be inaccessible")); + }else{ + mainwin->killthread = 1; + } + } + } + if(get_windows_amount() && mainwin){ + DBG("change image"); + change_displayed_image(buf, mainwin); + } #endif - inline void WRITEIMG(int (*writefn)(char*,int,int,void*), char *ext){ - if(!check_filename(whynot, outfile, ext)) - // " " - err(1, _("Can't save file")); - else{ - int r = writefn(whynot, imW, imH, buf); - // " '%s'" - if (r == 0) info(_("File saved as '%s'"), whynot); - } - } - if(save_image){ - DBG("save image"); - #ifdef USERAW - WRITEIMG(writeraw, "raw"); - #endif // USERAW - WRITEIMG(writefits, "fit"); - #ifdef USEPNG - WRITEIMG(writepng, "png"); - #endif /* USEPNG */ - } - } - if(pause_len){ - int delta; - time0 = itime(); - while((delta = pause_len - ltime()) > 0){ - // "%d \n" - printf(_("%d seconds till pause ends\n"), delta); - temperature = printCoolerStat(&t_ext); - if(save_Tlog && curtime(tm_buf)){ - fprintf(f_tlog, "%s\t%ld\t%.2f\t%.2f\tI\n", tm_buf, time(NULL), temperature, t_ext); - } - AutoadjustFanSpeed(FALSE); - if(delta > 10) sleep(10); - else sleep(delta); - } - } - fflush(NULL); - } + inline void WRITEIMG(int (*writefn)(char*,int,int,void*), char *ext){ + if(!check_filename(whynot, outfile, ext)) + // " " + err(1, _("Can't save file")); + else{ + int r = writefn(whynot, imW, imH, buf); + // " '%s'" + if (r == 0) info(_("File saved as '%s'"), whynot); + } + } + if(save_image){ + DBG("save image"); + #ifdef USERAW + WRITEIMG(writeraw, "raw"); + #endif // USERAW + WRITEIMG(writefits, "fit"); + #ifdef USEPNG + WRITEIMG(writepng, "png"); + #endif /* USEPNG */ + } + } + if(pause_len){ + int delta; + time0 = itime(); + while((delta = pause_len - ltime()) > 0){ + // "%d \n" + printf(_("%d seconds till pause ends\n"), delta); + temperature = printCoolerStat(&t_ext); + if(save_Tlog && curtime(tm_buf)){ + fprintf(f_tlog, "%s\t%ld\t%.2f\t%.2f\tI\n", tm_buf, time(NULL), temperature, t_ext); + } + //AutoadjustFanSpeed(FALSE); + if(delta > 10) sleep(10); + else sleep(delta); + } + } + fflush(NULL); + } #ifdef IMAGEVIEW - if(fake){ - writefits(NULL, imW, imH, NULL); - if(!get_windows_amount() || !mainwin){ - mainwin = createGLwin("Sample window", 400, 400, &im); - if(!mainwin){ - // " OpenGL, !" - info(_("Can't open OpenGL window, image preview will be inaccessible")); - }else{ - mainwin->killthread = 1; - } - } - if(get_windows_amount() && mainwin){ - DBG("change image"); - change_displayed_image(buf, mainwin); - } - } + if(fake){ + writefits(NULL, imW, imH, NULL); + if(!get_windows_amount() || !mainwin){ + mainwin = createGLwin("Sample window", 400, 400, &im); + if(!mainwin){ + // " OpenGL, !" + info(_("Can't open OpenGL window, image preview will be inaccessible")); + }else{ + mainwin->killthread = 1; + } + } + if(get_windows_amount() && mainwin){ + DBG("change image"); + change_displayed_image(buf, mainwin); + } + } #endif returning: - if(!only_turret){ - if(!fake){ - // set fan speed to 0 or 3 according cooler status - AutoadjustFanSpeed(TRUE); - DBG("abort exp"); - ApnGlueExpAbort(); - DBG("close"); - ApnGlueClose(); - restore_signals(); - DBG("free buffers & close files"); - free(buf); - free_fits_list(); - if(f_tlog) fclose(f_tlog); - if(f_statlog) fclose(f_statlog); - } + if(!only_turret){ #ifdef IMAGEVIEW - DBG("test for GL window"); - if(mainwin){ //window was created - wait for manual close - DBG("wait for window closing"); - while(get_windows_amount()){ - usleep(50000); - } - FREE(im.rawdata); - } + DBG("test for GL window"); + if(mainwin){ //window was created - wait for manual close + DBG("wait for window closing"); + while(get_windows_amount()){ + usleep(50000); + } + FREE(im.rawdata); + } #endif - } - return 0; + if(!fake){ + if(f_tlog) fclose(f_tlog); + if(f_statlog) fclose(f_statlog); + signals(0); + } + } + return 0; } diff --git a/takepic.h b/takepic.h index 646afc4..b789ac2 100644 --- a/takepic.h +++ b/takepic.h @@ -24,28 +24,28 @@ #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 501 #endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef USEPNG #include #endif /* USEPNG */ +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include #ifndef GETTEXT_PACKAGE #define GETTEXT_PACKAGE "apogee_control" @@ -61,16 +61,16 @@ * BTA focal ratio 24.024 m */ #ifndef TELLAT - #define TELLAT (43.6535278) + #define TELLAT (43.6535278) #endif #ifndef TELLONG - #define TELLONG (41.44143375) + #define TELLONG (41.44143375) #endif #ifndef TELALT - #define TELALT (2070.0) + #define TELALT (2070.0) #endif #ifndef TELFOCUS - #define TELFOCUS (24.024) + #define TELFOCUS (24.024) #endif // filename for default headers (in ~) #ifndef DEFCONF @@ -80,8 +80,8 @@ extern int test_headers; extern const char *__progname; #define info(format, args...) do{ \ - printf("%s: ", __progname); \ - printf(format, ## args); \ - printf("\n");}while(0) + printf("%s: ", __progname); \ + printf(format, ## args); \ + printf("\n");}while(0) #endif // __TAKEPIC_H__ diff --git a/usage.c b/usage.c index fecf276..82bde12 100644 --- a/usage.c +++ b/usage.c @@ -25,267 +25,268 @@ Apn_Filter Tturret = Apn_Filter_FW50_7S; // turrer type int - TurretPos = 0 // turret setposition - ,wheelPos = 0 // turret position - ,Nwheel = 1 // turret number + TurretPos = 0 // turret setposition + ,wheelPos = 0 // turret position + ,Nwheel = 1 // turret number ; unsigned short - ROspeed = 0 // readout speed + ROspeed = 0 // readout speed ; char - *objname = NULL // object name - ,*outfile = NULL // filename prefix - ,*objtype = NULL // frame type (default - object, when -d - dark) - ,*instrument = NULL // instrument name (default - "direct imaging") - ,*observers = NULL // observers name - ,*prog_id = NULL // program identificator - ,*author = NULL // author of program - ,*subnet = NULL // subnet for ethernet camera discovery - ,*cammsgid = NULL // MSG-ID of camera - ,*defhdr_filename = NULL // name of file with default headers + *objname = NULL // object name + ,*outfile = NULL // filename prefix + ,*objtype = NULL // frame type (default - object, when -d - dark) + ,*instrument = NULL // instrument name (default - "direct imaging") + ,*observers = NULL // observers name + ,*prog_id = NULL // program identificator + ,*author = NULL // author of program + ,*subnet = NULL // subnet for ethernet camera discovery + ,*cammsgid = NULL // MSG-ID of camera + ,*defhdr_filename = NULL // name of file with default headers ; int - exptime = -1 // exposition time (in ms), -1 means no exposition - ,fanspd = -1 // set fan speed (default - auto) - ,time_interval = 10 // interval between sequential logging - ,pics = 1 // number of frames per run - ,Ncam = 1 // camera number (if many) - ,hbin = 1 // horizontal binning - ,vbin = 1 // vertical binning - ,X0=-1,Y0=-1 // top left corner coordinates - ,X1=-1,Y1=-1 // right bottom corner coordinates - // if ==-1 - all, including overscan - ,pause_len = 0 // pause length (in s) between frames - ,pre_exp = 0 // pre-expose - ,StopRes = 0 // reset (1), sleep (2), awake (3) - ,Shtr = -1 // shutter: -1 -- no action or SHUTTER_OPEN/SHUTTER_CLOSE - ,noclean = 0 // don't flush camera after exp - ,twelveBit = 0 // 12-bit ADC - ,fake = 0 // fake image - ,flipX = 0 // flip image around X axe (vertical flip) - ,flipY = 0 // flip image around Y axe (horizontal flip) - ,histry = 0 // write history at expositions + exptime = -1 // exposition time (in ms), -1 means no exposition + ,fanspd = -1 // set fan speed (default - auto) + ,time_interval = 10 // interval between sequential logging + ,pics = 1 // number of frames per run + ,Ncam = 1 // camera number (if many) + ,hbin = 1 // horizontal binning + ,vbin = 1 // vertical binning + ,X0=-1,Y0=-1 // top left corner coordinates + ,X1=-1,Y1=-1 // right bottom corner coordinates + // if ==-1 - all, including overscan + ,pause_len = 0 // pause length (in s) between frames + ,pre_exp = 0 // pre-expose + ,StopRes = 0 // reset (1), sleep (2), awake (3) + ,Shtr = -1 // shutter: -1 -- no action or SHUTTER_OPEN/SHUTTER_CLOSE + ,noclean = 0 // don't flush camera after exp + ,twelveBit = 0 // 12-bit ADC + ,fake = 0 // fake image + ,flipX = 0 // flip image around X axe (vertical flip) + ,flipY = 0 // flip image around Y axe (horizontal flip) + ,histry = 0 // write history at expositions ; double - temperature = -25. // setpoint of temperature - ,imscale = -1. // image scale (''/pix) given by user + temperature = -25. // setpoint of temperature + ,imscale = -1. // image scale (''/pix) given by user ; int shutter = 1; // object frame == 1, dark frame == 0 bool - only_T = FALSE // only show temperature - ,noflash = FALSE // don't flash before exposition - ,set_T = FALSE // set temperature - ,cooler_off = FALSE // set cooler off - ,save_Tlog = FALSE // save temperature log - ,save_image = TRUE // save image into file - ,stat_logging = FALSE // full stat log - ,only_turret = TRUE // only move turret - ,open_turret = FALSE // work with turret + only_T = FALSE // only show temperature + ,noflash = FALSE // don't flash before exposition + ,set_T = FALSE // set temperature + ,cooler_off = FALSE // set cooler off + ,save_Tlog = FALSE // save temperature log + ,save_image = TRUE // save image into file + ,stat_logging = FALSE // full stat log + ,only_turret = TRUE // only move turret + ,open_turret = FALSE // work with turret #ifdef IMAGEVIEW - ,show_image = FALSE // show image on webgl window + ,show_image = FALSE // show image on webgl window #endif ; int myatoi(int *num, const char *str){ // "careful" atoi - long tmp; - char *endptr; - tmp = strtol(str, &endptr, 0); - if (*str == '\0' || *endptr != '\0' || tmp < INT_MIN || tmp > INT_MAX){ - return -1; - } - *num = (int)tmp; - return 0; + if(!num || !str) return -1; + long tmp; + char *endptr; + tmp = strtol(str, &endptr, 0); + if (*str == '\0' || *endptr != '\0' || tmp < INT_MIN || tmp > INT_MAX){ + return -1; + } + *num = (int)tmp; + return 0; } void getrange(int *X0, int *X1, char *arg){ - char *a = NULL, *pair; - pair = strdup(arg); - if((a = strchr(pair, ','))){ - *a = 0; - a++; - } - if(myatoi(X0, pair) || *X0 < 0){ - // " : %s" - usage(_("Wrong lower border: %s"), pair); - } - if(a){ - if(myatoi(X1, a) || *X1 < 0 || *X1 <= *X0){ - // " : %s" - usage(_("Wrong upper border: %s"), pair); - } - } - free(pair); + char *a = NULL, *pair; + pair = strdup(arg); + if((a = strchr(pair, ','))){ + *a = 0; + a++; + } + if(myatoi(X0, pair) || *X0 < 0){ + // " : %s" + usage(_("Wrong lower border: %s"), pair); + } + if(a){ + if(myatoi(X1, a) || *X1 < 0 || *X1 <= *X0){ + // " : %s" + usage(_("Wrong upper border: %s"), pair); + } + } + free(pair); } void usage(char *fmt, ...){ - va_list ap; - va_start(ap, fmt); - printf("\n"); - if (fmt != NULL){ - vprintf(fmt, ap); - printf("\n\n"); - } - va_end(ap); - // ":\t%s [] [ ]\n" - printf(_("Usage:\t%s [options] [output files prefix] [additional headers]\n"), - __progname); - // "\t:\n" - printf(_("\tOptions:\n")); - printf("\t-A,\t--author=author\t\t%s\n", - // " " - _("program author")); - printf("\t-b,\t--defhdr=filename\t%s\n", - // " " - _("file with default headers")); - printf("\t-B,\t--observer=obs\t\t%s\n", - // " " - _("observers' names")); - printf("\t-c,\t--cooler-off\t\t%s\n", - // " " - _("set cooler off")); - printf("\t-C,\t--imscale\t\t%s\n", - // " " - _("image scale without binning")); - printf("\t-d,\t--dark\t\t\t%s\n", - // " (\"\")" - _("not open shutter when exposing (\"dark frames\")")); - printf("\t-D,\t--display-image\t\t%s\n", - // " " - _("display last image")); - printf("\t-E,\t--ether-subnet\t\t%s\n", - // " ethernet-" - _("subnet fot ethernet camera discovery")); - printf("\t-f,\t--no-flash\t\t%s\n", - // " " - _("don't flash CCD chip before expose")); - printf("\t-F,\t--fan-speed=F\t\t%s\n", - // " F (0..3)" - _("set fan speed to F (0..3)")); - printf("\t-g,\t--wheel-get\t\t%s\n", - // - _("get turret's parameters")); - printf("\t-G,\t--wheel-go=N\t\t%s\n", - // N- - _("set turret to Nth position")); - printf("\t-h,\t--hbin=N\t\t%s\n", - // " N " - _("horizontal binning to N pixels")); - printf("\t-H,\t--time-interval=T\t%s\n", - // " HISTORY ( )" - _("time interval between sequential writings to log & HISTORY (in seconds)")); - printf("\t-i,\t--instrument=instr\t%s\n", - // " " - _("instrument name")); - printf("\t-I,\t--image-type=type\t%s\n", - // " " - _("image type")); - printf("\t-l,\t--tlog\t\t\t%s\n", - // " temp_log" - _("make temperatures logging to file temp_log")); - printf("\t-L,\t--log-only\t\t%s\n", - // " , " - _("don't save images, only make all-stat log")); - printf("\t-M,\t--msg-id\t\t%s\n", - // " MSG-ID" - _("open camera by its MSG-ID")); - printf("\t-n,\t--nframes=N\t\t%s\n", - // "N " - _("make series of N frames")); - printf("\t-N,\t--ncam=N\t\t%s\n", - // " N- " - _("work with Nth camera")); - printf("\t-o,\t--outfile=prefix\t%s\n", - // " " - _("output filename prefix")); - printf("\t-O,\t--object=obj\t\t%s\n", - // " " - _("object name")); - printf("\t-p,\t--pause-len=ptime\t%s\n", - // " ptime " - _("make pause for ptime seconds between expositions")); - printf("\t-P,\t--prog-id=prname\t%s\n", - // " " - _("observing program name")); - printf("\t-r,\t--speed-set=N\t\t%s\n", - // " N" - _("set readout speed to N")); - printf("\t-R,\t--reset\t\t\t%s\n", - // " " - _("full reset")); - printf("\t-s,\t--only-stat\t\t%s\n", - // " , " - _("not save image, just show statistics")); - printf("\t-S,\t--sleep\t\t\t%s\n", - // " " - _("go to sleeping mode")); - printf("\t-t,\t--set-temp=degr\t\t%s\n", - // " degr " - _("set work temperature to degr C")); - printf("\t-T,\t--only-temp\t\t%s\n", - // " / " - _("only set/get temperature")); - printf("\t-v,\t--vbin=N\t\t%s\n", - // " N " - _("vertical binning to N pixels")); - printf("\t-w,\t--wheel-num=N\t\t%s\n", - // N - _("set turret's number to N")); - printf("\t-W,\t--wakeup\t\t%s\n", - // " " - _("resume system")); - printf("\t-x,\t--exp=exptime\t\t%s\n", - // " exptime " - _("set exposure time to exptime ms")); - printf("\t-X,\t--xclip=X0[,X1]\t\t%s [X0:X1]\n", - // " " - _("select clip region")); - printf("\t-Y,\t--xclip=Y0[,Y1]\t\t%s [Y0:Y1]\n", - // " " - _("select clip region")); - // ONLY LONG - printf("\t\t--fakeimg\t\t%s\n", - // " OpenGL " - _("Test OpenGL window (without image exposure)")); - printf("\t\t--flipX\t\t\t%s\n", - // " ( X)" - _("flip image vertically (around X axe)")); - printf("\t\t--flipY\t\t\t%s\n", - // " ( Y)" - _("flip image horizontally (around Y axe)")); - printf("\t\t--noclean\t\t%s\n", - // " " - _("don't flush ccd after expose")); - printf("\t\t--pre-exp\t\t%s\n", - // " " - _("make a preliminary zero exposition for cleaning CCD")); - printf("\t\t--shutter-open\t\t%s\n", - // " " - _("open shutter")); - printf("\t\t--shutter-close\t\t%s\n", - // " " - _("close shutter")); - printf("\t\t--test-headers\t\t%s\n", - // " , FITS" - _("don't open camera device, just show FITS header")); - printf("\t\t--twelve-bit\t\t%s\n", - // " 12- " - _("work in a 12-bit ADC mode")); - printf("\t\t--write-history\t\t%s\n", - // " " - _("write telescope parameters into history")); - exit(0); + va_list ap; + va_start(ap, fmt); + printf("\n"); + if (fmt != NULL){ + vprintf(fmt, ap); + printf("\n\n"); + } + va_end(ap); + // ":\t%s []\n" + printf(_("Usage:\t%s [options]\n"), + __progname); + // "\t:\n" + printf(_("\tOptions:\n")); + printf("\t-A,\t--author=author\t\t%s\n", + // " " + _("program author")); + printf("\t-b,\t--defhdr=filename\t%s\n", + // " " + _("file with default headers")); + printf("\t-B,\t--observer=obs\t\t%s\n", + // " " + _("observers' names")); + printf("\t-c,\t--cooler-off\t\t%s\n", + // " " + _("set cooler off")); + printf("\t-C,\t--imscale\t\t%s\n", + // " " + _("image scale without binning")); + printf("\t-d,\t--dark\t\t\t%s\n", + // " (\"\")" + _("not open shutter when exposing (\"dark frames\")")); + printf("\t-D,\t--display-image\t\t%s\n", + // " " + _("display last image")); + printf("\t-E,\t--ether-subnet\t\t%s\n", + // " ethernet-" + _("subnet fot ethernet camera discovery")); + printf("\t-f,\t--no-flash\t\t%s\n", + // " " + _("don't flash CCD chip before expose")); + printf("\t-F,\t--fan-speed=F\t\t%s\n", + // " F (0..3)" + _("set fan speed to F (0..3)")); + printf("\t-g,\t--wheel-get\t\t%s\n", + // + _("get turret's parameters")); + printf("\t-G,\t--wheel-go=N\t\t%s\n", + // N- + _("set turret to Nth position")); + printf("\t-h,\t--hbin=N\t\t%s\n", + // " N " + _("horizontal binning to N pixels")); + printf("\t-H,\t--time-interval=T\t%s\n", + // " HISTORY ( )" + _("time interval between sequential writings to log & HISTORY (in seconds)")); + printf("\t-i,\t--instrument=instr\t%s\n", + // " " + _("instrument name")); + printf("\t-I,\t--image-type=type\t%s\n", + // " " + _("image type")); + printf("\t-l,\t--tlog\t\t\t%s\n", + // " temp_log" + _("make temperatures logging to file temp_log")); + printf("\t-L,\t--log-only\t\t%s\n", + // " , " + _("don't save images, only make all-stat log")); + printf("\t-M,\t--msg-id\t\t%s\n", + // " MSG-ID" + _("open camera by its MSG-ID")); + printf("\t-n,\t--nframes=N\t\t%s\n", + // "N " + _("make series of N frames")); + printf("\t-N,\t--ncam=N\t\t%s\n", + // " N- " + _("work with Nth camera")); + printf("\t-o,\t--outfile=prefix\t%s\n", + // " " + _("output filename prefix")); + printf("\t-O,\t--object=obj\t\t%s\n", + // " " + _("object name")); + printf("\t-p,\t--pause-len=ptime\t%s\n", + // " ptime " + _("make pause for ptime seconds between expositions")); + printf("\t-P,\t--prog-id=prname\t%s\n", + // " " + _("observing program name")); + printf("\t-r,\t--speed-set=N\t\t%s\n", + // " N" + _("set readout speed to N")); + printf("\t-R,\t--reset\t\t\t%s\n", + // " " + _("full reset")); + printf("\t-s,\t--only-stat\t\t%s\n", + // " , " + _("not save image, just show statistics")); + printf("\t-S,\t--sleep\t\t\t%s\n", + // " " + _("go to sleeping mode")); + printf("\t-t,\t--set-temp=degr\t\t%s\n", + // " degr " + _("set work temperature to degr C")); + printf("\t-T,\t--only-temp\t\t%s\n", + // " / " + _("only set/get temperature")); + printf("\t-v,\t--vbin=N\t\t%s\n", + // " N " + _("vertical binning to N pixels")); + printf("\t-w,\t--wheel-num=N\t\t%s\n", + // N + _("set turret's number to N")); + printf("\t-W,\t--wakeup\t\t%s\n", + // " " + _("resume system")); + printf("\t-x,\t--exp=exptime\t\t%s\n", + // " exptime " + _("set exposure time to exptime ms")); + printf("\t-X,\t--xclip=X0[,X1]\t\t%s [X0:X1]\n", + // " " + _("select clip region")); + printf("\t-Y,\t--xclip=Y0[,Y1]\t\t%s [Y0:Y1]\n", + // " " + _("select clip region")); + // ONLY LONG + printf("\t\t--fakeimg\t\t%s\n", + // " OpenGL " + _("Test OpenGL window (without image exposure)")); + printf("\t\t--flipX\t\t\t%s\n", + // " ( X)" + _("flip image vertically (around X axe)")); + printf("\t\t--flipY\t\t\t%s\n", + // " ( Y)" + _("flip image horizontally (around Y axe)")); + printf("\t\t--noclean\t\t%s\n", + // " " + _("don't flush ccd after expose")); + printf("\t\t--pre-exp\t\t%s\n", + // " " + _("make a preliminary zero exposition for cleaning CCD")); + printf("\t\t--shutter-open\t\t%s\n", + // " " + _("open shutter")); + printf("\t\t--shutter-close\t\t%s\n", + // " " + _("close shutter")); + printf("\t\t--test-headers\t\t%s\n", + // " , FITS" + _("don't open camera device, just show FITS header")); + printf("\t\t--twelve-bit\t\t%s\n", + // " 12- " + _("work in a 12-bit ADC mode")); + printf("\t\t--write-history\t\t%s\n", + // " " + _("write telescope parameters into history")); + exit(0); } void parse_args(int argc, char **argv){ - FNAME(); - int i; - char short_options[] = "A:b:B:cC:dDE:fF:gG:H:h:I:i:LlM:N:n:O:o:P:p:Rr:SsTt:v:Ww:x:X:Y:"; - struct option long_options[] = { + FNAME(); + int i; + char short_options[] = "A:b:B:cC:dDE:fF:gG:H:h:I:i:LlM:N:n:O:o:P:p:Rr:SsTt:v:Ww:x:X:Y:"; + struct option long_options[] = { /* { name, has_arg, flag, val }, : * name - name of long parameter * has_arg = 0 - no argument, 1 - need argument, 2 - unnesessary argument @@ -294,320 +295,320 @@ void parse_args(int argc, char **argv){ * val - getopt_long return value or value, flag setting to * !!! last string - for zeros !!! */ - {"author", 1, 0, 'A'}, - {"defhdr", 1, 0, 'b'}, - {"observers", 1, 0, 'B'}, - {"cooler-off", 0, 0, 'c'}, - {"imscale", 1, 0, 'C'}, - {"dark", 0, 0, 'd'}, - {"display-image",0, 0, 'D'}, - {"ether-subnet",1, 0, 'E'}, - {"no-flash", 0, 0, 'f'}, - {"fan-speed", 1, 0, 'F'}, - {"wheel-get", 0, 0, 'g'}, - {"wheel-go", 1, 0, 'G'}, - {"time-interval",1, 0, 'H'}, - {"hbin", 1, 0, 'h'}, - {"image-type", 1, 0, 'I'}, - {"instrument", 1, 0, 'i'}, - {"log-only", 0, 0, 'L'}, - {"tlog", 0, 0, 'l'}, - {"msg-id", 1, 0, 'M'}, - {"ncam", 1, 0, 'N'}, - {"nframes", 1, 0, 'n'}, - {"outfile", 1, 0, 'o'}, - {"object", 1, 0, 'O'}, - {"prog-id", 1, 0, 'P'}, - {"pause-len", 1, 0, 'p'}, - {"reset", 0, 0, 'R'}, - {"speed-set", 1, 0, 'r'}, - {"sleep", 0, 0, 'S'}, - {"only-stat", 0, 0, 's'}, - {"only-temp", 0, 0, 'T'}, - {"set-temp", 1, 0, 't'}, - {"vbin", 1, 0, 'v'}, - {"wheel-num", 1, 0, 'w'}, - {"wakeup", 0, 0, 'W'}, - {"exp", 1, 0, 'x'}, - {"xclip", 1, 0, 'X'}, - {"yclip", 1, 0, 'Y'}, - // options, that have no short analogs: - {"fakeimg", 0, &fake, 1}, - {"flipX", 0, &flipX, 1}, - {"flipY", 0, &flipY, 1}, - {"noclean", 0, &noclean, 1}, - {"shutter-open", 0, &Shtr, 1}, - {"shutter-close", 0, &Shtr, 0}, - {"test-headers", 0, &test_headers, 1}, - {"twelve-bit", 0, &twelveBit, 1}, - {"pre-exp", 0, &pre_exp, 1}, - {"write-history", 0, &histry, 1}, - { 0, 0, 0, 0 } - }; - if(argc == 1){ - // " " - usage(_("Any parameters are absent")); - } - while (1){ - int opt; - if((opt = getopt_long(argc, argv, short_options, - long_options, NULL)) == -1) break; - switch(opt){ - case 0: // only long option - break; - case 'A': - author = strdup(optarg); - // " : %s" - info(_("Program author: %s"), author); - break; - case 'b': - defhdr_filename = strdup(optarg); - break; - case 'B': - observers = strdup(optarg); - // ": %s" - info(_("Observers: %s"), observers); - break; - case 'c': - only_turret = FALSE; - set_T = TRUE; - // " " - info(_("Set cooler off")); - cooler_off = TRUE; - break; - case 'C': - imscale = atof(optarg); - if(imscale < 0.){ - // "IMSCALE " - usage(_("IMSCALE should be greater than zero")); - } - break; - case 'd': - shutter = 0; - // " " - info(_("Dark frames")); - break; - case 'D': + {"author", 1, 0, 'A'}, + {"defhdr", 1, 0, 'b'}, + {"observers", 1, 0, 'B'}, + {"cooler-off", 0, 0, 'c'}, + {"imscale", 1, 0, 'C'}, + {"dark", 0, 0, 'd'}, + {"display-image",0, 0, 'D'}, + {"ether-subnet",1, 0, 'E'}, + {"no-flash", 0, 0, 'f'}, + {"fan-speed", 1, 0, 'F'}, + {"wheel-get", 0, 0, 'g'}, + {"wheel-go", 1, 0, 'G'}, + {"time-interval",1, 0, 'H'}, + {"hbin", 1, 0, 'h'}, + {"image-type", 1, 0, 'I'}, + {"instrument", 1, 0, 'i'}, + {"log-only", 0, 0, 'L'}, + {"tlog", 0, 0, 'l'}, + {"msg-id", 1, 0, 'M'}, + {"ncam", 1, 0, 'N'}, + {"nframes", 1, 0, 'n'}, + {"outfile", 1, 0, 'o'}, + {"object", 1, 0, 'O'}, + {"prog-id", 1, 0, 'P'}, + {"pause-len", 1, 0, 'p'}, + {"reset", 0, 0, 'R'}, + {"speed-set", 1, 0, 'r'}, + {"sleep", 0, 0, 'S'}, + {"only-stat", 0, 0, 's'}, + {"only-temp", 0, 0, 'T'}, + {"set-temp", 1, 0, 't'}, + {"vbin", 1, 0, 'v'}, + {"wheel-num", 1, 0, 'w'}, + {"wakeup", 0, 0, 'W'}, + {"exp", 1, 0, 'x'}, + {"xclip", 1, 0, 'X'}, + {"yclip", 1, 0, 'Y'}, + // options, that have no short analogs: + {"fakeimg", 0, &fake, 1}, + {"flipX", 0, &flipX, 1}, + {"flipY", 0, &flipY, 1}, + {"noclean", 0, &noclean, 1}, + {"shutter-open", 0, &Shtr, 1}, + {"shutter-close", 0, &Shtr, 0}, + {"test-headers", 0, &test_headers, 1}, + {"twelve-bit", 0, &twelveBit, 1}, + {"pre-exp", 0, &pre_exp, 1}, + {"write-history", 0, &histry, 1}, + { 0, 0, 0, 0 } + }; + if(argc == 1){ + // " " + usage(_("Any parameters are absent")); + } + while (1){ + int opt; + if((opt = getopt_long(argc, argv, short_options, + long_options, NULL)) == -1) break; + switch(opt){ + case 0: // only long option + break; + case 'A': + author = strdup(optarg); + // " : %s" + info(_("Program author: %s"), author); + break; + case 'b': + defhdr_filename = strdup(optarg); + break; + case 'B': + observers = strdup(optarg); + // ": %s" + info(_("Observers: %s"), observers); + break; + case 'c': + only_turret = FALSE; + set_T = TRUE; + // " " + info(_("Set cooler off")); + cooler_off = TRUE; + break; + case 'C': + imscale = atof(optarg); + if(imscale < 0.){ + // "IMSCALE " + usage(_("IMSCALE should be greater than zero")); + } + break; + case 'd': + shutter = 0; + // " " + info(_("Dark frames")); + break; + case 'D': #ifdef IMAGEVIEW - show_image = TRUE; - // " " - info(_("Will show images")); + show_image = TRUE; + // " " + info(_("Will show images")); #else - ERR("%s was compiled without OpenGL support!", __progname); + ERR("%s was compiled without OpenGL support!", __progname); #endif - break; - case 'E': - subnet = strdup(optarg); - // ": %s" - info(_("Subnet: %s"), subnet); - break; - case 'f': - noflash = TRUE; - // " " - info(_("No pre-expose flash")); - break; - case 'F': - if(myatoi(&fanspd, optarg) || fanspd > 3 || fanspd < 0) - // " 0..3" - usage(_("Fan speed should be in interval 0..3")); - // " %d" - info(_("Fan speed would be set to %d"), fanspd); - only_turret = FALSE; - break; - case 'g': - open_turret = TRUE; - // " " - info(_("Get turret's info")); - break; - case 'G': - open_turret = TRUE; - if(myatoi(&wheelPos, optarg) || wheelPos < 1) - // " 0" - usage(_("Position number should be positive value")); - // " %d" - info(_("Move turret into %d"), wheelPos); - break; - case 'H': - if(myatoi(&time_interval, optarg) || time_interval < 1) - // " time-interval " - usage(_("Value of time-interval must be non-zero positive")); - // " %d " - info(_("Set logging interval to %d seconds"), time_interval); - break; - case 'h': - if (myatoi(&hbin, optarg) || hbin < 1){ - // "" - usage("%s hbin: %s", _("Wrong"), optarg); - } - // ". : %d" - info(_("Horisontal binning: %d"), hbin); - break; - case 'I': - objtype = strdup(optarg); - // " - %s" - info(_("Image type - %s"), objtype); - break; - case 'i': - instrument = strdup(optarg); - // " - %s" - info(_("Instrument name - %s"), instrument); - break; - case 'L': - stat_logging = TRUE; - // - info(_("Full statistics logging")); - break; - case 'l': - save_Tlog = TRUE; - only_turret = FALSE; - // " " - info(_("Save temperature log")); - break; - case 'M': - cammsgid = strdup(optarg); - info("CAMMSGID: %s", cammsgid); - break; - case 'N': - only_turret = FALSE; - if (myatoi(&Ncam, optarg) || Ncam < 1){ - // " : %s" - usage(_("Wrong camera number: %s"), optarg); - } - // " %d" - info(_("Open camera number %d"), Ncam); - break; - case 'n': - if (myatoi(&pics, optarg) || pics <= 0){ - // " - : %s" - usage(_("Wrong frames number in series: %s"), optarg); - } - // " %d " - info(_("Series of %d frames"), pics); - break; - case 'o': - outfile = strdup(optarg); - // " " - info(_("Output filename prefix: %s"), outfile); - break; - case 'O': - objname = strdup(optarg); - // " - %s" - info(_("Object name - %s"), objname); - break; - case 'P': - prog_id = strdup(optarg); - // " : %s" - info(_("Program name: %s"), prog_id); - break; - case 'p': - if (myatoi(&pause_len, optarg) || pause_len < 0){ - // " : %s" - usage(_("Wrong pause length: %s"), optarg); - } - // ": %d" - info(_("Pause: %ds"), pause_len); - break; - case 'r': - if (myatoi(&i, optarg) || i < 1 || i > USHRT_MAX){ - // " - !" - usage(_("Readout speed should be unsigned int!")); - } - ROspeed = (unsigned short) i; - break; - case 'R': - only_turret = FALSE; - StopRes = Reset; - // " " - info(_("Reset")); - break; - case 'S': - only_turret = FALSE; - StopRes = Sleep; - // " " - info(_("Go to sleep")); - break; - case 's': - save_image = FALSE; - break; - case 'T': - only_T = TRUE; - only_turret = FALSE; - save_image = FALSE; - // " / " - info(_("only set/get temperature")); - break; - case 't': - only_turret = FALSE; - temperature = atof(optarg); - if(temperature < -35. || temperature > 30.){ - // " : %s ( -35 30)" - usage(_("Wrong temperature: %s (must be from -35 to 30)"), optarg); - } - set_T = TRUE; - // " : %.3f" - info(_("Set temperature: %.3f"), temperature); - break; - case 'v': - if (myatoi(&vbin, optarg) || vbin < 1){ - // "" - usage("%s vbin: %s", _("Wrong"), optarg); - } - // ". : %d" - info(_("Vertical binning: %d"), vbin); - break; - case 'w': - open_turret = TRUE; - if(myatoi(&Nwheel, optarg) || Nwheel < 1) - // " 0" - usage(_("Turret number should be positive value")); - // " %d" - info(_("Work with turret %d"), Nwheel); - break; - case 'W': - only_turret = FALSE; - StopRes = Wake; - // " " - info(_("Wakeup camera")); - break; - case 'x': - only_turret = FALSE; - if (myatoi(&exptime, optarg) || exptime < 0){ - // " : %s" - usage(_("Wrong exposure time: %s"), optarg); - } - // " : %d" - info(_("Exposure time: %dms"), exptime); - break; - case 'X': - getrange(&X0, &X1, optarg); - // " X: [%d, %d]" - info(_("X range: [%d, %d]"), X0, X1); - break; - case 'Y': - getrange(&Y0, &Y1, optarg); - // " Y: [%d, %d]" - info(_("Y range: [%d, %d]"), Y0, Y1); - break; - default: - usage(NULL); - } - } - if(fake){ - only_turret = FALSE; - save_image = FALSE; - } - argc -= optind; - argv += optind; - if(outfile == NULL){ - save_image = FALSE; - } - get_defhdrs(defhdr_filename); - if(argc > 0){ // additional headers - // " : " - info(_("Additional headers: ")); - for (i = 0; i < argc; i++) - info("%s ", argv[i]); - add_morehdrs(argc, argv); - } - if(Shtr != -1) only_turret = FALSE; + break; + case 'E': + subnet = strdup(optarg); + // ": %s" + info(_("Subnet: %s"), subnet); + break; + case 'f': + noflash = TRUE; + // " " + info(_("No pre-expose flash")); + break; + case 'F': + if(myatoi(&fanspd, optarg) || fanspd > 3 || fanspd < 0) + // " 0..3" + usage(_("Fan speed should be in interval 0..3")); + // " %d" + info(_("Fan speed would be set to %d"), fanspd); + only_turret = FALSE; + break; + case 'g': + open_turret = TRUE; + // " " + info(_("Get turret's info")); + break; + case 'G': + open_turret = TRUE; + if(myatoi(&wheelPos, optarg) || wheelPos < 1) + // " 0" + usage(_("Position number should be positive value")); + // " %d" + info(_("Move turret into %d"), wheelPos); + break; + case 'H': + if(myatoi(&time_interval, optarg) || time_interval < 1) + // " time-interval " + usage(_("Value of time-interval must be non-zero positive")); + // " %d " + info(_("Set logging interval to %d seconds"), time_interval); + break; + case 'h': + if (myatoi(&hbin, optarg) || hbin < 1){ + // "" + usage("%s hbin: %s", _("Wrong"), optarg); + } + // ". : %d" + info(_("Horisontal binning: %d"), hbin); + break; + case 'I': + objtype = strdup(optarg); + // " - %s" + info(_("Image type - %s"), objtype); + break; + case 'i': + instrument = strdup(optarg); + // " - %s" + info(_("Instrument name - %s"), instrument); + break; + case 'L': + stat_logging = TRUE; + // + info(_("Full statistics logging")); + break; + case 'l': + save_Tlog = TRUE; + only_turret = FALSE; + // " " + info(_("Save temperature log")); + break; + case 'M': + cammsgid = strdup(optarg); + info("CAMMSGID: %s", cammsgid); + break; + case 'N': + only_turret = FALSE; + if (myatoi(&Ncam, optarg) || Ncam < 1){ + // " : %s" + usage(_("Wrong camera number: %s"), optarg); + } + // " %d" + info(_("Open camera number %d"), Ncam); + break; + case 'n': + if (myatoi(&pics, optarg) || pics <= 0){ + // " - : %s" + usage(_("Wrong frames number in series: %s"), optarg); + } + // " %d " + info(_("Series of %d frames"), pics); + break; + case 'o': + outfile = strdup(optarg); + // " " + info(_("Output filename prefix: %s"), outfile); + break; + case 'O': + objname = strdup(optarg); + // " - %s" + info(_("Object name - %s"), objname); + break; + case 'P': + prog_id = strdup(optarg); + // " : %s" + info(_("Program name: %s"), prog_id); + break; + case 'p': + if (myatoi(&pause_len, optarg) || pause_len < 0){ + // " : %s" + usage(_("Wrong pause length: %s"), optarg); + } + // ": %d" + info(_("Pause: %ds"), pause_len); + break; + case 'r': + if (myatoi(&i, optarg) || i < 1 || i > USHRT_MAX){ + // " - !" + usage(_("Readout speed should be unsigned int!")); + } + ROspeed = (unsigned short) i; + break; + case 'R': + only_turret = FALSE; + StopRes = Reset; + // " " + info(_("Reset")); + break; + case 'S': + only_turret = FALSE; + StopRes = Sleep; + // " " + info(_("Go to sleep")); + break; + case 's': + save_image = FALSE; + break; + case 'T': + only_T = TRUE; + only_turret = FALSE; + save_image = FALSE; + // " / " + info(_("only set/get temperature")); + break; + case 't': + only_turret = FALSE; + temperature = atof(optarg); + if(temperature < -35. || temperature > 30.){ + // " : %s ( -35 30)" + usage(_("Wrong temperature: %s (must be from -35 to 30)"), optarg); + } + set_T = TRUE; + // " : %.3f" + info(_("Set temperature: %.3f"), temperature); + break; + case 'v': + if (myatoi(&vbin, optarg) || vbin < 1){ + // "" + usage("%s vbin: %s", _("Wrong"), optarg); + } + // ". : %d" + info(_("Vertical binning: %d"), vbin); + break; + case 'w': + open_turret = TRUE; + if(myatoi(&Nwheel, optarg) || Nwheel < 1) + // " 0" + usage(_("Turret number should be positive value")); + // " %d" + info(_("Work with turret %d"), Nwheel); + break; + case 'W': + only_turret = FALSE; + StopRes = Wake; + // " " + info(_("Wakeup camera")); + break; + case 'x': + only_turret = FALSE; + if (myatoi(&exptime, optarg) || exptime < 0){ + // " : %s" + usage(_("Wrong exposure time: %s"), optarg); + } + // " : %d" + info(_("Exposure time: %dms"), exptime); + break; + case 'X': + getrange(&X0, &X1, optarg); + // " X: [%d, %d]" + info(_("X range: [%d, %d]"), X0, X1); + break; + case 'Y': + getrange(&Y0, &Y1, optarg); + // " Y: [%d, %d]" + info(_("Y range: [%d, %d]"), Y0, Y1); + break; + default: + usage(NULL); + } + } + if(fake){ + only_turret = FALSE; + save_image = FALSE; + } + argc -= optind; + argv += optind; + if(outfile == NULL){ + save_image = FALSE; + } + get_defhdrs(defhdr_filename); + if(argc > 0){ // additional headers + // " : " + info(_("Additional headers: ")); + for (i = 0; i < argc; i++) + info("%s ", argv[i]); + add_morehdrs(argc, argv); + } + if(Shtr != -1) only_turret = FALSE; }