init on github

This commit is contained in:
eddyem 2015-07-23 13:51:09 +03:00
parent 35ec5278af
commit a84e6caf0c
15 changed files with 2917 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
*~
*.bak
*.bck
*.o
.hg*
.dropbox.attr

64
CMakeLists.txt Normal file
View File

@ -0,0 +1,64 @@
cmake_minimum_required(VERSION 2.6)
set(PROJ takepic)
project(${PROJ})
set(VERSION "0.2.0")
set(CMAKE_COLOR_MAKEFILE ON)
if(DEFINED DEBUG)
add_definitions(-DEBUG)
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}")
#aux_source_directory(. SOURCES)
set(SOURCES takepic.c usage.c)
if(NOT DEFINED NOBTA)
set(SOURCES ${SOURCES} bta_print.c)
add_definitions(-DUSE_BTA)
endif()
set(LCPATH locale/ru)
set(CFLAGS -O3 -Wall -Werror -W -std=c99)
set(PO_FILE ${LCPATH}/messages.po)
set(MO_FILE ${LCPATH}/LC_MESSAGES/${PROJ}.mo)
set(RU_FILE ${LCPATH}/ru.po)
find_package(PkgConfig REQUIRED)
set(MODULES cfitsio>=3.0 fli>=1.71)
if(DEFINED USEPNG)
set(MODULES ${MODULES} libpng>=1.2)
add_definitions(-DUSEPNG)
endif()
pkg_check_modules(${PROJ} REQUIRED ${MODULES})
if(DEFINED USERAW)
add_definitions(-DUSERAW)
endif()
add_executable(${PROJ} ${SOURCES} ${PO_FILE} ${MO_FILE})
target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES})
include_directories(${${PROJ}_INCLUDE_DIRS})
link_directories(${${PROJ}_LIBRARY_DIRS})
add_definitions(${CFLAGS} -DLOCALEDIR=\"${CMAKE_INSTALL_PREFIX}/share/locale\"
-DPACKAGE_VERSION=\"${VERSION}\" -DGETTEXT_PACKAGE=\"${PROJ}\")
# Installation of the program
INSTALL(FILES ${MO_FILE} DESTINATION "share/locale/ru/LC_MESSAGES")
#PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
INSTALL(TARGETS ${PROJ} DESTINATION "bin")
#PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
# Script to be executed at installation time (kind of post-intallation script) to
# change the right accesses on the installed files
#INSTALL(SCRIPT inst.cmake)
find_package(Gettext REQUIRED)
find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
if(NOT GETTEXT_XGETTEXT_EXECUTABLE OR NOT GETTEXT_MSGFMT_EXECUTABLE)
message(FATAL_ERROR "xgettext not found")
endif()
add_custom_command(
OUTPUT ${PO_FILE}
COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} --from-code=koi8-r ${SOURCES} -c -k_ -kN_ -o ${PO_FILE}
COMMAND sed 's/charset=UTF-8/charset=koi8-r/' ${PO_FILE} | enconv > tmp && mv -f tmp ${PO_FILE}
COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} -Uis ${RU_FILE} ${PO_FILE}
DEPENDS ${SOURCES})
add_custom_command(
OUTPUT ${MO_FILE}
COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ${RU_FILE} -o ${MO_FILE}
DEPENDS ${RU_FILE})

16
README Normal file
View File

@ -0,0 +1,16 @@
1. cmake .
2. make
3. [make install] or just copy file takepic wherever you want
File bta_print.c needed to fill specific FITS keys for BTA telescope
If your want use this outside SAO RAS localnet, write:
1. cmake -DNOBTA=1 .
2. make ...
If you wish to save not only FITS, define:
* -DUSERAW=1 to save raw data
* -DUSEPNG=1 to save png data
define
* -DEBUG=1 for debug info

157
README-func Normal file
View File

@ -0,0 +1,157 @@
// ÐÅÒÅÍÅÎÎÙÅ, ÔÉÐÙ
flidomain_t = METHOD | DEVICE;
// METHOD: FLIDOMAIN_PARALLEL_PORT, FLIDOMAIN_USB, FLIDOMAIN_SERIAL, FLIDOMAIN_INET;
// DEVICE: FLIDEVICE_CAMERA, FLIDOMAIN_FILTERWHEEL, FLIDOMAIN_FOCUSER.
fliframe_t = FLI_FRAME_TYPE_NORMAL ÉÌÉ FLI_FRAME_TYPE_DARK.
flibitdepth_t = FLI_MODE_8BIT ÉÌÉ FLI_MODE_16BIT.
flishutter_t = FLI_SHUTTER_CLOSE, FLI_SHUTTER_OPEN, FLI_SHUTTER_EXTERNAL_TRIGGER,
FLI_SHUTTER_EXTERNAL_TRIGGER_LOW, and FLI_SHUTTER_EXTERNAL_TRIGGER HIGH.
flibgflush_t = FLI_BGFLUSH_STOP and FLI_BGFLUSH_START.
flichannel_t = FLI_TEMPERATURE_INTERNAL and FLI_TEMPERATURE_EXTERNAL.
flidebug_t = FLIDEBUG_NONE, FLIDEBUG_INFO, FLIDEBUG_WARN, and FLIDEBUG_FAIL.
// ÆÕÎËÃÉÉ
LIBFLIAPI FLICancelExposure(flidev_t dev); // ÏÔÍÅÎÁ ÜËÓÐÏÚÉÃÉÉ
// return: 0 - ÕÓÐÅÈ, !0 - ÎÅÕÄÁÞÁ
LIBFLIAPI FLIClose(flidev_t dev); // ÚÁËÒÙÔØ ÕÓÔÒÏÊÓÔ×Ï
LIBFLIAPI FLIGetArrayArea(flidev_t dev,
long* ul_x, long* ul_y, long* lr_x, long* lr_y); // ÐÏÌÕÞÉÔØ ÒÁÚÍÅÒ ÆÒÅÊÍÁ
// ul_x, ul_y - ËÏÏÒÄÉÎÁÔÙ ×ÅÒÈÎÅÇÏ ÌÅ×ÏÇÏ ÕÇÌÁ
// lr_x, lr_y - Ë-ÔÙ ÐÒÁ×ÏÇÏ ÎÉÖÎÅÇÏ ÕÇÌÁ
LIBFLIAPI FLIFlushRow(flidev_t dev, long rows, long repeat); // ÓÂÒÏÓ ÒÑÄÏ×
// rows - ËÏÌ-×Ï ÒÑÄÏ× ÄÌÑ ÓÂÒÏÓÁ, repeat - ÓËÏÌØËÏ ÒÁÚ ÐÏÄÒÑÄ ÓÂÒÏÓÉÔØ
LIBFLIAPI FLIGetFWRevision(flidev_t dev, long* fwrev); // ×ÅÒÓÉÑ ÐÒÏÛÉ×ËÉ
LIBFLIAPI FLIGetHWRevision(flidev_t dev, long* hwrev); // ×ÅÒÓÉÑ ÖÅÌÅÚÁ
// fwrev - ×ÅÒÓÉÑ ÐÒÏÛÉ×ËÉ, hwrev - ×ÅÒÓÉÑ ÖÅÌÅÚÁ
LIBFLIAPI FLIGetLibVersion(char* ver, size_t len); // ×ÅÒÓÉÑ ÂÉÂÌÉÏÔÅËÉ
// ver - ÂÕÆÅÒ ÄÌÑ ×ÅÒÓÉÉ, len - ÅÇÏ ÄÌÉÎÁ
LIBFLIAPI FLIGetModel(flidev_t dev, char* model, size_t len); // ÉÍÑ ÍÏÄÅÌÉ
// model - ÂÕÆÅÒ, len - ÅÇÏ ÄÌÉÎÁ
LIBFLIAPI FLIGetPixelSize(flidev_t dev,
double* pixel x, double* pixel y); // ÒÁÚÍÅÒ ÐÉËÓÅÌÑ × ÍËÍ
LIBFLIAPI FLIGetVisibleArea(flidev_t dev,
long* ul_x, long* ul_y, long* lr_x, long* lr_y); // Ò-Ò ×ÉÄÉÍÏÊ ÏÂÌÁÓÔÉ
// Ë-ÔÙ ÁÎÁÌÏÇÉÞÎÏ FLIGetArrayArea
LIBFLIAPI FLIOpen(flidev_t* dev, char* name, flidomain_t domain); // ÏÔËÒÙÔØ
// name - ÉÍÑ ÉÝ FLIList()
LIBFLIAPI FLISetDebugLevel(char* host, flidebug_t level); // ÕÒÏ×ÅÎØ ÏÔÌÁÄËÉ
// host ÉÇÎÏÒÉÒÕÅÔÓÑ
LIBFLIAPI FLISetExposureTime(flidev_t dev, long exptime); // ×ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ
// exptime - × ÍÉÌÌÉÓÅËÕÎÄÁÈ
LIBFLIAPI FLISetHBin(flidev_t dev, long hbin); // ÇÏÒÉÚ. ÂÉÎÎÉÎÇ
LIBFLIAPI FLISetVBin(flidev_t dev, long vbin); // ×ÅÒÔ. ÂÉÎÎÉÎÇ
// hbin = 1..16, vbin = 1..16
LIBFLIAPI FLISetFrameType(flidev_t dev, fliframe_t frametype); // ÔÅÍÎÏ×ÏÊ ÉÌÉ ÏÂÙÞÎÙÊ
LIBFLIAPI FLISetImageArea(flidev_t dev,
long ul_x, long ul_y, long lr_x, long lr_y); // ÕÓÔÁÎÏ×ÉÔØ ÏÂÌÁÓÔØ Ë-Ô
// lr_x = ul_x+(lrx-ul_x)/hbin;
// lr_y = ul_y+(lry-ul_y)/vbin;
// lrx, lry - ÁÂÓ. ËÏÏÒÄÉÎÁÔÙ × ÖÅÌÁÅÍÏÊ ÏÂÌÁÓÔÉ
LIBFLIAPI FLIGetExposureStatus(flidev_t dev, long* timeleft);
// ×ÒÅÍÑ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ
LIBFLIAPI FLISetTemperature(flidev_t dev, double temperature); // ÚÁÄÁÔØ ô
// temperature - × ÇÒÁÄÕÓÁÈ ãÅÌØÓÉÑ, ÏÔ -55 ÄÏ +45
LIBFLIAPI FLIGetTemperature(flidev_t dev, double* temperature); // ÕÚÎÁÔØ ô
LIBFLIAPI FLIGrabRow(flidev_t dev, void* buff, size_t width); // ÓÞÉÔÁÔØ ÒÑÄ
// buff - ÂÕÆÅÒ, width - ÍÁËÓ. ÛÉÒÉÎÁ ÒÑÄÁ (ÒÁÚÍÅÒ ÂÕÆÅÒÁ)
// ÓÞÉÔÙ×ÁÅÔ ÏÞÅÒÅÄÎÏÊ ÒÑÄ Ó ËÁÍÅÒÙ
LIBFLIAPI FLIExposeFrame(flidev_t dev); // ÎÁÞÁÔØ ÎÁËÏÐÌÅÎÉÅ
LIBFLIAPI FLISetBitDepth(flidev_t dev, flibitdepth_t bitdepth); // ÚÁÄÁÔØ ÒÁÚÒÑÄÎÏÓÔØ
LIBFLIAPI FLISetNFlushes(flidev_t dev, long nflushes); // ÚÁÄÁÔØ ËÏÌ-×Ï ÓÂÒÏÓÏ×
// ÐÅÒÅÄ ÜËÓÐÏÚÉÃÉÅÊ
LIBFLIAPI FLIReadIOPort(flidev_t dev, long* ioportset); // ÓÞÉÔÁÔØ ÐÏÒÔ io
// ioportset - ÓÞÉÔÁÎÎÙÅ ÄÁÎÎÙÅ
LIBFLIAPI FLIWriteIOPort(flidev_t dev, long ioportset); // ÚÁÐÉÓÁÔØ × io
LIBFLIAPI FLIConfigureIOPort(flidev_t dev, long ioportset); // ÎÁÓÔÒÏÊËÁ
// ÆÕÎËÃÉÏÎÁÌ ËÁÖÄÏÇÏ ËÏÎÔÁËÔÁ ÐÏÒÔÁ io ÚÁ×ÉÓÉÔ ÏÔ ÚÎÁÞÅÎÉÑ ioportset
// 1 - ×ÙÈÏÄ, 0 - ×ÈÏÄ
LIBFLIAPI FLILockDevice(flidev_t dev); // ÂÌÏËÉÒÏ×ËÁ ÕÓÔÒÏÊÓÔ×Á
// ÄÌÑ ÏÂÅÓÐÅÞÅÎÉÑ ÍÏÎÏÐÏÌØÎÏÇÏ ÄÏÓÔÕÐÁ
LIBFLIAPI FLIUnlockDevice(flidev_t dev);
LIBFLIAPI FLIControlShutter(flidev_t dev, flishutter_t shutter); // ÚÁÔ×ÏÒ
// FLI_SHUTTER_EXTERNAL_TRIGGER_LOW É FLI_SHUTTER_EXTERNAL_TRIGGER
// ÚÁÐÕÓËÁÀÔ ÜËÓÐÏÚÉÃÉÀ ÐÒÉ ÎÁÌÉÞÉÉ ÌÏÇ. ÎÕÌÑ ÎÁ io0
// FLI_SHUTTER_EXTERNAL_TRIGGER_HIGH - ÚÁÐÕÓË ÜËÓÐ. ÎÁ ÌÏÇ1 ÎÁ io0
LIBFLIAPI FLIControlBackgroundFlush(flidev_t dev, flibgflush_t bgflush);
// ÆÏÎÏ×ÙÊ ÓÂÒÏÓ
LIBFLIAPI FLIList(flidomain_t domain, char*** names);
// ÓÐÉÓÏË ÕÓÔÒÏÊÓÔ× ÉÚ ÄÏÍÅÎÁ domain
LIBFLIAPI FLIFreeList(char** names); // ÏÞÉÓÔÉÔØ ÓÐÉÓÏË names
LIBFLIAPI FLISetFilterPos(flidev_t dev, long filter);
// ÕÓÔÁÎÏ×ÉÔØ ÆÉÌØÔÒ × ÐÏÚÉÃÉÀ filter
LIBFLIAPI FLIGetFilterPos(flidev_t dev, long* filter);
// ÔÅËÕÝÅÅ ÐÏÌÏÖÅÎÉÅ ÆÉÌØÔÒÁ
LIBFLIAPI FLIGetStepsRemaining(flidev_t dev, long* steps);
// ËÏÌÉÞÅÓÔ×Ï ÛÁÇÏ×, ÏÓÔÁ×ÛÉÈÓÑ ÄÏ ÎÁÚÎÁÞÅÎÎÏÊ ÐÏÚÉÃÉÉ
LIBFLIAPI FLIGetFilterCount(flidev_t dev, long* filter);
// ÕÚÎÁÔØ ËÏÌ-×Ï ÆÉÌØÔÒÏ×
LIBFLIAPI FLIStepMotorAsync(flidev_t dev, long steps);
LIBFLIAPI FLIStepMotor(flidev_t dev, long steps);
// ÐÅÒÅÄ×ÉÎÕÔØ ÔÕÒÅÌØ ÎÁ ÚÁÄÁÎÎÏÅ ËÏÌ-×Ï ÛÁÇÏ×
LIBFLIAPI FLIGetStepperPosition(flidev_t dev, long* position);
// ÔÅËÕÝÅÅ ÐÏÌÏÖÅÎÉÅ ûä
// ÆÕÎËÃÉÉ ÄÌÑ ÒÁÂÏÔÙ Ó ÆÏËÕÓÉÒÕÀÝÉÍ ÕÓÔÒÏÊÓÔ×ÏÍ
LIBFLIAPI FLIHomeFocuser(flidev_t dev);
LIBFLIAPI FLIGetFocuserExtent(flidev_t dev, long* extent);
LIBFLIAPI FLIReadTemperature(flidev_t dev, flichannel_t channel,
double* temperature);
LIBFLIAPI FLICreateList(flidomain_t domain); // ÓÏÚÄÁÔØ ÓÐÉÓÏË
LIBFLIAPI FLIDeleteList(void); // ÕÄÁÌÉÔØ ÓÐÉÓÏË
LIBFLIAPI FLIListFirst(flidomain_t* domain, char* filename,
size_t fnlen, char* name, size_t namelen); // ÐÏÌÕÞÉÔØ ÐÅÒ×ÏÅ ÕÓÔÒÏÊÓÔ×Ï ÉÚ ÓÐÉÓËÁ
// domain - ÄÏÍÅÎ ÕÓÔÒ-×Á;
// filename - ÉÍÑ ÆÁÊÌÁ ÕÓÔÒ-×Á;
// fnlen - ÄÌÉÎÁ ÂÕÆÅÒÁ ÉÍÅÎÉ ÆÁÊÌÁ;
// name - ÎÁÚ×ÁÎÉÅ ÕÓÔÒ-×Á;
// namelen - ÄÌÉÎÁ ÂÕÆÅÒÁ ÎÁÚ×ÁÎÉÑ
LIBFLIAPI FLIListNext(flidomain_t* domain, char* filename,
size_t fnlen, char* name, size_t namelen); // ÐÏÌÕÞÉÔØ ÓÌÅÄÕÀÝÅÅ ÕÓÔÒ-×Ï

138
bta_print.c Normal file
View File

@ -0,0 +1,138 @@
/* Print some BTA NewACS data (or write to file)
* Usage:
* bta_print [time_step] [file_name]
* Where:
* time_step - writing period in sec., >=1.0
* <1.0 - once and exit (default)
* file_name - name of file to write to,
* "-" - stdout (default)
*/
#include "bta_print.h"
#include "bta_shdata.h"
static char buf[1024];
char *time_asc(double t){
int h, m;
double s;
h = (int)(t/3600.);
m = (int)((t - (double)h*3600.)/60.);
s = t - (double)h*3600. - (double)m*60.;
h %= 24;
if(s>59) s=59;
sprintf(buf, "%dh:%02dm:%04.1fs", 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;
}
#define CMNTSZ 79
#define CMNT(...) snprintf(comment, CMNTSZ, __VA_ARGS__)
#define FTKEY(...) WRITEKEY(fp, __VA_ARGS__, comment)
void write_bta_data(fitsfile *fp){
char comment[CMNTSZ + 1];
char *val;
double dtmp;
int i;
get_shm_block(&sdat, ClientSide);
if(!check_shm_block(&sdat)) return;
// TELESCOP / Telescope name
CMNT("Telescope name");
FTKEY(TSTRING, "TELESCOP", "BTA 6m telescope");
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);
switch(Tel_Focus){
default:
case Prime :
val = "Prime";
// FOCUS / Focus of telescope (mm)
CMNT("Focus of telescope (mm)");
FTKEY(TDOUBLE, "VAL_F", &val_F);
break;
case Nasmyth1 : val = "Nasmyth1"; break;
case Nasmyth2 : val = "Nasmyth2"; break;
}
CMNT("Observation focus");
FTKEY(TSTRING, "FOCUS", val);
// EPOCH / Epoch of RA & DEC
time_t epoch = time(NULL);
strftime(comment, CMNTSZ, "%Y", gmtime(&epoch));
i = atoi(comment);
CMNT("Epoch of RA & DEC");
FTKEY(TINT, "EPOCH", &i);
CMNT("Current object R.A.: %s", time_asc(CurAlpha));
// RA / Right ascention (HH MM SS)
FTKEY(TDOUBLE, "RA", &CurAlpha);
// DEC / Declination (DD MM SS)
CMNT("Current object Decl.: %s", angle_asc(CurDelta));
FTKEY(TDOUBLE, "DEC", &CurDelta);
CMNT("Source R.A.: %s", time_asc(SrcAlpha));
FTKEY(TDOUBLE, "S_RA", &SrcAlpha);
CMNT("Source Decl.: %s", angle_asc(SrcDelta));
FTKEY(TDOUBLE, "S_DEC", &SrcDelta);
CMNT("Telescope R.A: %s", time_asc(val_Alp));
FTKEY(TDOUBLE, "T_RA", &val_Alp);
CMNT("Telescope Decl.: %s", angle_asc(val_Del));
FTKEY(TDOUBLE, "T_DEC", &val_Del);
// A / Azimuth
CMNT("Current object Azimuth: %s", angle_asc(tag_A));
FTKEY(TDOUBLE, "A", &tag_A);
// Z / Zenith distance
CMNT("Current object Zenith: %s", angle_asc(tag_Z));
FTKEY(TDOUBLE, "Z", &tag_Z);
// ROTANGLE / Field rotation angle
CMNT("Field rotation angle: %s", angle_asc(tag_P));
FTKEY(TDOUBLE, "ROTANGLE", &tag_P);
CMNT("Telescope A: %s", angle_asc(val_A));
FTKEY(TDOUBLE, "VAL_A", &val_A);
CMNT("Telescope Z: %s", angle_asc(val_Z));
FTKEY(TDOUBLE, "VAL_Z", &val_Z);
CMNT("Current P: %s", angle_asc(val_P));
FTKEY(TDOUBLE, "VAL_P", &val_P);
CMNT("Dome A: %s", angle_asc(val_D));
FTKEY(TDOUBLE, "VAL_D", &val_D);
// 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");
// PRESSURE / Pressure (mmHg)
FTKEY(TDOUBLE, "MIRRTEMP", &val_T3);
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);
}

8
bta_print.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef __BTA_PRINT_H__
#define __BTA_PRINT_H__
#include "takepic.h"
void write_bta_data(fitsfile *fp);
#endif // __BTA_PRINT_H__

1159
bta_shdata.h Normal file

File diff suppressed because it is too large Load Diff

BIN
extern/fliusb-1.3.tgz vendored Normal file

Binary file not shown.

BIN
extern/libfli-1.104.tgz vendored Normal file

Binary file not shown.

Binary file not shown.

401
locale/ru/ru.po Normal file
View File

@ -0,0 +1,401 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-28 09:54+0400\n"
"PO-Revision-Date: 2011-06-28 09:22+0300\n"
"Last-Translator: Edward V. Emelianov <eddy@sao.ru>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=koi8-r\n"
"Content-Transfer-Encoding: 8bit\n"
#. "\tïÐÃÉÉ:\n"
#: usage.c:78
#, c-format
msgid "\tOptions:\n"
msgstr "\tïÐÃÉÉ:\n"
#. %.3f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ\n
#: takepic.c:166
#, c-format
msgid "%.3f seconds till exposition ends\n"
msgstr "%.3f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ\n"
#. %d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n
#: takepic.c:220
#, c-format
msgid "%d seconds till pause ends\n"
msgstr "%d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n"
#. ðÏÌÅ ÉÚÏÂÒÁÖÅÎÉÑ: (%ld, %ld)(%ld, %ld)
#: takepic.c:125
#, c-format
msgid "Array field: (%ld, %ld)(%ld, %ld)"
msgstr "ðÏÌÅ ÉÚÏÂÒÁÖÅÎÉÑ: (%ld, %ld)(%ld, %ld)"
#. îÁÞÉÎÁÀ ÜËÓÐÏÚÉÃÉÀ %dÍÓ, ×ÒÅÍÑ: %s, ÆÁÊÌ: %s.%d.%d\n
#: takepic.c:160
#, c-format
msgid "Begin exposition %dms, exptime: %s, filename: %s.%d.%d\n"
msgstr "îÁÞÉÎÁÀ ÜËÓÐÏÚÉÃÉÀ %dÍÓ, ×ÒÅÍÑ: %s, ÆÁÊÌ: %s.%d.%d\n"
#. ëÁÍÅÒÁ '%s' ÉÚ ÄÏÍÅÎÁ %s
#: takepic.c:101
#, c-format
msgid "Camera '%s', domain %s"
msgstr "ëÁÍÅÒÁ '%s' ÉÚ ÄÏÍÅÎÁ %s"
#. îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÆÁÊÌ ÖÕÒÎÁÌÁ ÓÔÁÔÉÓÔÉËÉ
#: takepic.c:89
msgid "Can't open statistics log file"
msgstr "îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÖÕÒÎÁÌ ÓÔÁÔÉÓÔÉËÉ"
#. îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÆÁÊÌ ÖÕÒÎÁÌÁ ÔÅÍÐÅÒÁÔÕÒ
#: takepic.c:80
msgid "Can't open temperature log file"
msgstr "îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÖÕÒÎÁÌ ÔÅÍÐÅÒÁÔÕÒ"
#. îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ
#: takepic.c:199
msgid "Can't save file"
msgstr "îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ"
#. úÁÈ×ÁÔ ËÁÄÒÁ %d\n
#: takepic.c:155
#, c-format
msgid "Capture frame %d\n"
msgstr "úÁÈ×ÁÔ ËÁÄÒÁ %d\n"
#. "óßÅÍËÁ ÔÅÍÎÏ×ÙÈ"
#: usage.c:193
msgid "Dark frames"
msgstr "óßÅÍËÁ ÔÅÍÎÏ×ÙÈ"
#. "÷ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ: %dÍÓ"
#: usage.c:296
#, c-format
msgid "Exposure time: %dms"
msgstr "÷ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ: %dÍÓ"
#. ÷ÉÄÉÍÏÅ ÐÏÌÅ: %s
#: takepic.c:120
#, c-format
msgid "Field of view: %s"
msgstr "÷ÉÄÉÍÏÅ ÐÏÌÅ: %s"
#. æÁÊÌ ÚÁÐÉÓÁÎ × '%s'
#: takepic.c:203
#, c-format
msgid "File saved as '%s'"
msgstr "æÁÊÌ ÚÁÐÉÓÁÎ × '%s'"
#. ðÏÌÎÏÅ ÖÕÒÎÁÌÉÒÏ×ÁÎÉÅ ÓÔÁÔÉÓÔÉËÉ ÂÅÚ ÓÏÈÒÁÎÅÎÉÑ ÉÚÏÂÒÁÖÅÎÉÊ
#: usage.c:225
msgid "Full statistics logging without saving images"
msgstr "ðÏÌÎÏÅ ÖÕÒÎÁÌÉÒÏ×ÁÎÉÅ ÓÔÁÔÉÓÔÉËÉ ÂÅÚ ÓÏÈÒÁÎÅÎÉÑ ÉÚÏÂÒÁÖÅÎÉÊ"
#. áÐÐ. ×ÅÒÓÉÑ: %ld
#: takepic.c:110
#, c-format
msgid "HW revision: %ld"
msgstr "áÐÐ. ×ÅÒÓÉÑ: %ld"
#. "çÏÒ. ÂÉÎÎÉÎÇ: %d"
#: usage.c:209
#, c-format
msgid "Horisontal binning: %d"
msgstr "çÏÒ. ÂÉÎÎÉÎÇ: %d"
#. "éÇÎÏÒÉÒÕÀ ÁÒÇÕÍÅÎÔ[Ù]:\n"
#: usage.c:327
#, c-format
msgid "Ignore argument[s]:\n"
msgstr "éÇÎÏÒÉÒÕÀ ÁÒÇÕÍÅÎÔ[Ù]:\n"
#. óÔÁÔÉÓÔÉËÁ ÐÏ ÉÚÏÂÒÁÖÅÎÉÀ\n
#: takepic.c:470
#, c-format
msgid "Image stat:\n"
msgstr "óÔÁÔÉÓÔÉËÁ ÐÏ ÉÚÏÂÒÁÖÅÎÉÀ\n"
#. "ôÉÐ ÉÚÏÂÒÁÖÅÎÉÑ - %s"
#: usage.c:214
#, c-format
msgid "Image type - %s"
msgstr "ôÉÐ ÉÚÏÂÒÁÖÅÎÉÑ - %s"
#. ôÅÍÐÅÒÁÔÕÒÁ (×ÎÕÔÒ.): %f
#: takepic.c:141
#, c-format
msgid "Inner temperature: %f"
msgstr "ôÅÍÐÅÒÁÔÕÒÁ (×ÎÕÔÒ.): %f"
#. "îÁÚ×ÁÎÉÅ ÐÒÉÂÏÒÁ - %s"
#: usage.c:219
#, c-format
msgid "Instrument name - %s"
msgstr "îÁÚ×ÁÎÉÅ ÐÒÉÂÏÒÁ - %s"
#. ÷ÅÒÓÉÑ ÂÉÂÌÉÏÔÅËÉ '%s'
#: takepic.c:75
#, c-format
msgid "Library version '%s'"
msgstr "÷ÅÒÓÉÑ ÂÉÂÌÉÏÔÅËÉ '%s'"
#. íÏÄÅÌØ:\t\t%s
#: takepic.c:106
#, c-format
msgid "Model:\t\t%s"
msgstr "íÏÄÅÌØ:\t\t%s"
#. "N ÓÂÒÏÓÏ× ÐÅÒÅÄ ÜËÓÐÏÚÉÃÉÅÊ"
#: usage.c:87
msgid "N flushes before exposing"
msgstr "N ÓÂÒÏÓÏ× ÐÅÒÅÄ ÜËÓÐÏÚÉÃÉÅÊ"
#. ëÁÍÅÒÙ ÎÅ ÎÁÊÄÅÎÙ!\n
#: takepic.c:286
msgid "No cameras found!\n"
msgstr "ëÁÍÅÒÙ ÎÅ ÎÁÊÄÅÎÙ!\n"
#. "éÍÑ ÏÂßÅËÔÁ - %s"
#: usage.c:243
#, c-format
msgid "Object name - %s"
msgstr "éÍÑ ÏÂßÅËÔÁ - %s"
#. "îÁÂÌÀÄÁÔÅÌÉ: %s"
#: usage.c:248
#, c-format
msgid "Observers: %s"
msgstr "îÁÂÌÀÄÁÔÅÌÉ: %s"
#. ôÅÍÐÅÒÁÔÕÒÁ (×ÎÅÛÎ.): %f
#: takepic.c:144
#, c-format
msgid "Outern temperature: %f"
msgstr "ôÅÍÐÅÒÁÔÕÒÁ (×ÎÅÛÎ.): %f"
#. "îÅÔ ÐÒÅÆÉËÓÁ ÉÍÅÎÉ ×ÙÈÏÄÎÙÈ ÆÁÊÌÏ×"
#: usage.c:316
msgid "Output file names prefix is absent"
msgstr "îÅÔ ÐÒÅÆÉËÓÁ ÉÍÅÎÉ ×ÙÈÏÄÎÙÈ ÆÁÊÌÏ×"
#. "ðÁÕÚÁ: %dÓ"
#: usage.c:261
#, c-format
msgid "Pause: %ds"
msgstr "ðÁÕÚÁ: %dÓ"
#. òÁÚÍÅÒ ÐÉËÓÅÌÑ: %g x %g
#: takepic.c:116
#, c-format
msgid "Pixel size: %g x %g"
msgstr "òÁÚÍÅÒ ÐÉËÓÅÌÑ: %g x %g"
#. "á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ: %s"
#: usage.c:188
#, c-format
msgid "Program author: %s"
msgstr "á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ: %s"
#. "îÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ: %s"
#: usage.c:253
#, c-format
msgid "Program name: %s"
msgstr "îÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ: %s"
#. óÞÉÔÙ×ÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ:
#: takepic.c:179
#, c-format
msgid "Read image: "
msgstr "óÞÉÔÙ×ÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ: "
#. ðÒÏÇÒ. ×ÅÒÓÉÑ: %ld
#: takepic.c:113
#, c-format
msgid "SW revision: %ld"
msgstr "ðÒÏÇÒ. ×ÅÒÓÉÑ: %ld"
#. "óÏÈÒÁÎÅÎÉÅ ÖÕÒÎÁÌÁ ÔÅÍÐÅÒÁÔÕÒ"
#: usage.c:230
msgid "Save temperature log"
msgstr "óÏÈÒÁÎÅÎÉÅ ÖÕÒÎÁÌÁ ÔÅÍÐÅÒÁÔÕÒ"
#. "óÅÒÉÑ ÉÚ %d ËÁÄÒÏ×"
#: usage.c:238
#, c-format
msgid "Series of %d frames"
msgstr "óÅÒÉÑ ÉÚ %d ËÁÄÒÏ×"
#. "õÓÔÁÎÏ×ÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ: %.3f"
#: usage.c:280
#, c-format
msgid "Set temperature: %.3f"
msgstr "õÓÔÁÎÏ×ÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ: %.3f"
#. "éÓÐÏÌØÚÏ×ÁÎÉÅ:\t%s [ÏÐÃÉÉ] <ÐÒÅÆÉËÓ ×ÙÈÏÄÎÙÈ ÆÁÊÌÏ×>\n"
#: usage.c:75
#, c-format
msgid "Usage:\t%s [options] <output files prefix>\n"
msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ:\t%s [ÏÐÃÉÉ] <ÐÒÅÆÉËÓ ×ÙÈÏÄÎÙÈ ÆÁÊÌÏ×>\n"
#. "÷ÅÒÔ. ÂÉÎÎÉÎÇ: %d"
#: usage.c:288
#, c-format
msgid "Vertical binning: %d"
msgstr "÷ÅÒÔ. ÂÉÎÎÉÎÇ: %d"
#. "îÅ×ÅÒÎÙÊ"
#: usage.c:206 usage.c:285
msgid "Wrong"
msgstr "îÅ×ÅÒÎÙÊ"
#. "îÅ×ÅÒÎÏÅ ×ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ: %s"
#: usage.c:293
#, c-format
msgid "Wrong exposure time: %s"
msgstr "îÅ×ÅÒÎÏÅ ×ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ: %s"
#. "îÅ×ÅÒÎÏÅ ËÏÌ-×Ï ËÁÄÒÏ×: %s"
#: usage.c:235
#, c-format
msgid "Wrong frames number in series: %s"
msgstr "îÅ×ÅÒÎÏÅ ËÏÌ-×Ï ËÁÄÒÏ×: %s"
#. "îÅ×ÅÒÎÁÑ ÎÉÖÎÑÑ ÇÒÁÎÉÃÁ: %s"
#: usage.c:54
#, c-format
msgid "Wrong lower border: %s"
msgstr "îÅ×ÅÒÎÁÑ ÎÉÖÎÑÑ ÇÒÁÎÉÃÁ: %s"
#. "îÅ×ÅÒÎÁÑ ÐÁÕÚÁ: %s"
#: usage.c:258
#, c-format
msgid "Wrong pause length: %s"
msgstr "îÅ×ÅÒÎÁÑ ÐÁÕÚÁ: %s"
#. "îÅ×ÅÒÎÏÅ ÚÎÁÞÅÎÉÅ ÔÅÍÐÅÒÁÔÕÒÙ: %s (ÄÏÌÖÎÏ ÂÙÔØ ÏÔ -55 ÄÏ 30)"
#: usage.c:276
#, c-format
msgid "Wrong temperature: %s (must be from -55 to 30)"
msgstr "îÅ×ÅÒÎÏÅ ÚÎÁÞÅÎÉÅ ÔÅÍÐÅÒÁÔÕÒÙ: %s (ÄÏÌÖÎÏ ÂÙÔØ ÏÔ -55 ÄÏ 30)"
#. "îÅ×ÅÒÎÁÑ ×ÅÒÈÎÑÑ ÇÒÁÎÉÃÁ: %s"
#: usage.c:59
#, c-format
msgid "Wrong upper border: %s"
msgstr "îÅ×ÅÒÎÁÑ ×ÅÒÈÎÑÑ ÇÒÁÎÉÃÁ: %s"
#. "äÉÁÐÁÚÏÎ ÐÏ X: [%d, %d]"
#: usage.c:301
#, c-format
msgid "X range: [%d, %d]"
msgstr "äÉÁÐÁÚÏÎ ÐÏ X: [%d, %d]"
#. "äÉÁÐÁÚÏÎ ÐÏ Y: [%d, %d]"
#: usage.c:306
#, c-format
msgid "Y range: [%d, %d]"
msgstr "äÉÁÐÁÚÏÎ ÐÏ Y: [%d, %d]"
#. ÄÁÔÁ/×ÒÅÍÑ
#: takepic.c:171 takepic.c:225
msgid "date/time"
msgstr "ÄÁÔÁ/×ÒÅÍÑ"
#. "ÎÅ ÓÏÈÒÁÎÑÔØ ÉÚÏÂÒÁÖÅÎÉÑ, ÌÉÛØ ×ÅÓÔÉ ÚÁÐÉÓØ ÓÔÁÔÉÓÔËÉ"
#: usage.c:99
msgid "don't save images, only make all-stat log"
msgstr "ÎÅ ÓÏÈÒÁÎÑÔØ ÉÚÏÂÒÁÖÅÎÉÑ, ÌÉÛØ ×ÅÓÔÉ ÚÁÐÉÓØ ÓÔÁÔÉÓÔËÉ"
#. "ÂÉÎÎÉÎÇ N ÐÉËÓÅÌÅÊ ÐÏ ÇÏÒÉÚÏÎÔÁÌÉ"
#: usage.c:90
msgid "horizontal binning to N pixels"
msgstr "ÂÉÎÎÉÎÇ N ÐÉËÓÅÌÅÊ ÐÏ ÇÏÒÉÚÏÎÔÁÌÉ"
#. "ÔÉÐ ÉÚÏÂÒÁÖÅÎÉÑ"
#: usage.c:93
msgid "image type"
msgstr "ÔÉÐ ÉÚÏÂÒÁÖÅÎÉÑ"
#. "ÎÁÚ×ÁÎÉÅ ÐÒÉÂÏÒÁ"
#: usage.c:96
msgid "instrument name"
msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÉÂÏÒÁ"
#. "×ÙÄÅÒÖÁÔØ ptime ÓÅËÕÎÄ ÍÅÖÄÕ ÜËÓÐÏÚÉÃÉÑÍÉ"
#: usage.c:117
msgid "make pause for ptime seconds between expositions"
msgstr "×ÙÄÅÒÖÁÔØ ptime ÓÅËÕÎÄ ÍÅÖÄÕ ÜËÓÐÏÚÉÃÉÑÍÉ"
#. "N ËÁÄÒÏ× × ÓÅÒÉÉ"
#: usage.c:105
msgid "make series of N frames"
msgstr "N ËÁÄÒÏ× × ÓÅÒÉÉ"
#. "×ÅÓÔÉ ÚÁÐÉÓØ ÒÁÂÏÞÉÈ ÔÅÍÐÅÒÁÔÕÒ × ÆÁÊÌ temp_log"
#: usage.c:102
msgid "make temperatures logging to file temp_log"
msgstr "×ÅÓÔÉ ÚÁÐÉÓØ ÒÁÂÏÞÉÈ ÔÅÍÐÅÒÁÔÕÒ × ÆÁÊÌ temp_log"
#. "ÎÅ ÏÔËÒÙ×ÁÔØ ÚÁÔ×ÏÒ ÐÒÉ ÜËÓÐÏÚÉÃÉÉ (\"ÔÅÍÎÏ×ÙÅ\")"
#: usage.c:84
msgid "not open shutter, when exposing (\"dark frames\")"
msgstr "ÎÅ ÏÔËÒÙ×ÁÔØ ÚÁÔ×ÏÒ ÐÒÉ ÜËÓÐÏÚÉÃÉÉ (\"ÔÅÍÎÏ×ÙÅ\")"
#. "ÎÅ ÓÏÈÒÁÎÑÔØ ÉÚÏÂÒÁÖÅÎÉÅ, Á ÔÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÁÔÉÓÔÉËÕ"
#: usage.c:120
msgid "not save image, just show statistics"
msgstr "ÎÅ ÓÏÈÒÁÎÑÔØ ÉÚÏÂÒÁÖÅÎÉÅ, Á ÔÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÁÔÉÓÔÉËÕ"
#. "ÎÁÚ×ÁÎÉÅ ÏÂßÅËÔÁ"
#: usage.c:108
msgid "object name"
msgstr "ÎÁÚ×ÁÎÉÅ ÏÂßÅËÔÁ"
#. "ÉÍÅÎÁ ÎÁÂÌÀÄÁÔÅÌÅÊ"
#: usage.c:111
msgid "observers' names"
msgstr "ÉÍÅÎÁ ÎÁÂÌÀÄÁÔÅÌÅÊ"
#. "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ ÎÁÂÌÀÄÅÎÉÊ"
#: usage.c:114
msgid "observing program name"
msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ ÎÁÂÌÀÄÅÎÉÊ"
#. "ÔÏÌØËÏ ÚÁÄÁÔØ/ÐÏÌÕÞÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ"
#. "ÔÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ/ÚÁÄÁÔØ ÔÅÍÐÅÒÁÔÕÒÕ"
#: usage.c:123 usage.c:270
msgid "only set/get temperature"
msgstr "ÔÏÌØËÏ ÚÁÄÁÔØ/ÐÏÌÕÞÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ"
#. "Á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ"
#: usage.c:81
msgid "program author"
msgstr "Á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ"
#. "×ÙÂÒÁÔØ ÄÉÁÐÁÚÏÎ ÄÌÑ ÓÞÉÔÙ×ÁÎÉÑ"
#: usage.c:135 usage.c:138
msgid "select clip region"
msgstr "×ÙÂÒÁÔØ ÄÉÁÐÁÚÏÎ ÄÌÑ ÓÞÉÔÙ×ÁÎÉÑ"
#. "×ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ exptime ÍÓ"
#: usage.c:132
msgid "set exposure time to exptime ms"
msgstr "×ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ exptime ÍÓ"
#. "ÚÁÄÁÔØ ÒÁÂÏÞÕÀ ÔÅÍÐÅÒÁÔÕÒÕ degr ÇÒÁÄÕÓÏ×"
#: usage.c:126
msgid "set work temperature to degr C"
msgstr "ÚÁÄÁÔØ ÒÁÂÏÞÕÀ ÔÅÍÐÅÒÁÔÕÒÕ degr ÇÒÁÄÕÓÏ×"
#. "ÂÉÎÎÉÎÇ N ÐÉËÓÅÌÅÊ ÐÏ ×ÅÒÔÉËÁÌÉ"
#: usage.c:129
msgid "vertical binning to N pixels"
msgstr "ÂÉÎÎÉÎÇ N ÐÉËÓÅÌÅÊ ÐÏ ×ÅÒÔÉËÁÌÉ"

503
takepic.c Normal file
View File

@ -0,0 +1,503 @@
#include "takepic.h"
#include "usage.h"
#ifdef USE_BTA
#include "bta_print.h"
#endif
#include <locale.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#ifdef USEPNG
int writepng(char *filename, int width, int height, void *data);
#endif /* USEPNG */
#define BUFF_SIZ 4096
#define TMBUFSIZ 40 // ÄÌÉÎÁ ÂÕÆÅÒÁ ÄÌÑ ÓÔÒÏËÉ Ó ×ÒÅÍÅÎÅÍ
char tm_buf[TMBUFSIZ]; // ÂÕÆÅÒ ÄÌÑ ÓÔÒÏËÉ Ó ×ÒÅÍÅÎÅÍ
u_int16_t max=0, min=65535; // ÜËÓÔÒÅÍÁÌØÎÙÅ ÚÎÁÞÅÎÉÑ ÔÅËÕÝÅÇÏ ÉÚÏÂÒÁÖÅÎÉÑ
double avr, std; // ÓÒÅÄÎÅÅ ÚÎÁÞÅÎÉÅ É ÓÒÅÄÎÅË×ÁÄÒÁÔÉÞÅÓËÏÅ ÏÔËÌÏÎÅÎÉÅ ÔÅËÕÝÅÇÏ ÉÚÏÂÒ.
char *camera = NULL, viewfield[80];
double pixX, pixY; // ÒÁÚÍÅÒ ÐÉËÓÅÌÑ
int numcams = 0;
void print_stat(u_int16_t *img, long size, FILE* f);
int itime(){ // ÕÓÌ. ×ÒÅÍÑ × ÓÅËÕÎÄÁÈ
struct timeval ct;
gettimeofday(&ct, NULL);
return (ct.tv_sec);
}
int time0;
int ltime(){ // ×ÒÅÍÑ, ÐÒÏÛÅÄÛÅÅ Ó ÍÏÍÅÎÔÁ ÚÁÐÕÓËÁ ÐÒÏÇÒÁÍÍÙ
return(itime()-time0);
}
size_t curtime(char *s_time){ // ÓÔÒÏËÁ - ÔÅËÕÝÅÅ ×ÒÅÍÑ/ÄÁÔÁ
time_t tm = time(NULL);
return strftime(s_time, TMBUFSIZ, "%d/%m/%Y,%H:%M:%S", localtime(&tm));
}
double t_ext, t_int; // ×ÎÅÛÎÑÑ Ô., Ô. ËÁÍÅÒÙ (+ ÎÁ ËÏÎÅà ÜËÓÐÏÚÉÃÉÉ)
time_t expStartsAt; // ×ÒÅÍÑ ÎÁÞÁÌÁ ÜËÓÐÏÚÉÃÉÉ (time_t)
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)) // ÆÁÊÌÁ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ
return 1;
}
return 0;
}
int main(int argc, char **argv){
int i; // ÄÌÑ ÃÉËÌÏ×
FILE *f_tlog = NULL;// ÆÁÊÌ, × ËÏÔÏÒÙÊ ÂÕÄÅÔ ÚÁÐÉÓÙ×ÁÔØÓÑ ÖÕÒÎÁÌ ÔÅÍÐÅÒÁÔÕÒ
FILE *f_statlog = NULL; // ÆÁÊÌ ÄÌÑ ÓÔÁÔÉÓÔÉËÉ × ÒÅÖÉÍÅ "ÔÏÌØËÏ ÓÔÁÔÉÓÔÉËÁ"
char libver[LIBVERSIZ]; // ÂÕÆÅÒ ÄÌÑ ×ÅÒÓÉÉ ÂÉÂÌÉÏÔÅËÉ fli
cam_t *cam = NULL; // ÓÐÉÓÏË ËÁÍÅÒ
setlocale(LC_ALL, getenv("LC_ALL"));
setlocale(LC_NUMERIC, "C");
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
//bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);
parse_args(argc, argv);
//TRYFUNC(FLISetDebugLevel, NULL /* "NO HOST" */, FLIDEBUG_ALL);
TRYFUNC(FLISetDebugLevel, NULL, FLIDEBUG_NONE);
TRYFUNC(FLIGetLibVersion, libver, LIBVERSIZ);
// ÷ÅÒÓÉÑ ÂÉÂÌÉÏÔÅËÉ '%s'
info(_("Library version '%s'"), libver);
findcams(FLIDOMAIN_USB, &cam);
if(save_Tlog){
f_tlog = fopen("temp_log", "a");
// îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÆÁÊÌ ÖÕÒÎÁÌÁ ÔÅÍÐÅÒÁÔÕÒ
if(!f_tlog) err(1, _("Can't open temperature log file"));
fprintf(f_tlog, "\n\n\n");
}
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");
}
i = 0;
for (i = 0; i < numcams; i++){
long x0,x1, y0,y1, row, img_rows, row_width, ltmp, img_size;
flidev_t dev;
char buff[BUFF_SIZ];
u_int16_t *img;
int j;
// ëÁÍÅÒÁ '%s' ÉÚ ÄÏÍÅÎÁ %s
info(_("Camera '%s', domain %s"), cam[i].name, cam[i].dname);
TRYFUNC(FLIOpen, &dev, cam[i].name, FLIDEVICE_CAMERA | cam[i].domain);
if(r) continue;
TRYFUNC(FLIGetModel, dev, buff, BUFF_SIZ);
// íÏÄÅÌØ:\t\t%s
info(_("Model:\t\t%s"), buff);
camera = strdup(buff);
TRYFUNC(FLIGetHWRevision, dev, &ltmp);
// áÐÐ. ×ÅÒÓÉÑ: %ld
info(_("HW revision: %ld"), ltmp);
TRYFUNC(FLIGetFWRevision, dev, &ltmp);
// ðÒÏÇÒ. ×ÅÒÓÉÑ: %ld
info(_("SW revision: %ld"), ltmp);
TRYFUNC(FLIGetPixelSize, dev, &pixX, &pixY);
// òÁÚÍÅÒ ÐÉËÓÅÌÑ: %g x %g
info(_("Pixel size: %g x %g"), pixX, pixY);
TRYFUNC(FLIGetVisibleArea, dev, &x0, &y0, &x1, &y1);
snprintf(viewfield, 79, "(%ld, %ld)(%ld, %ld)", x0, y0, x1, y1);
// ÷ÉÄÉÍÏÅ ÐÏÌÅ: %s
info(_("Field of view: %s"), viewfield);
if(X1 > x1) X1 = x1;
if(Y1 > y1) Y1 = y1;
TRYFUNC(FLIGetArrayArea, dev, &x0, &y0, &x1, &y1);
// ðÏÌÅ ÉÚÏÂÒÁÖÅÎÉÑ: (%ld, %ld)(%ld, %ld)
info(_("Array field: (%ld, %ld)(%ld, %ld)"), x0, y0, x1, y1);
TRYFUNC(FLISetHBin, dev, hbin);
TRYFUNC(FLISetVBin, dev, vbin);
if(X0 == -1) X0 = x0; // ÚÁÄÁÅÍ ÚÎÁÞÅÎÉÑ ÐÏ ÕÍÏÌÞÁÎÉÀ
if(Y0 == -1) Y0 = y0;
if(X1 == -1) X1 = x1;
if(Y1 == -1) Y1 = y1;
row_width = (X1 - X0) / hbin;
img_rows = (Y1 - Y0) / vbin;
//TRYFUNC(FLISetImageArea, dev, ltmp, tmp2, tmp3, tmp4);
TRYFUNC(FLISetImageArea, dev, X0, Y0,
X0 + (X1 - X0) / hbin, Y0 + (Y1 - Y0) / vbin);
TRYFUNC(FLISetNFlushes, dev, flushes);
if(set_T) TRYFUNC(FLISetTemperature, dev, temperature);
TRYFUNC(FLIGetTemperature, dev, &t_int);
// ôÅÍÐÅÒÁÔÕÒÁ (×ÎÕÔÒ.): %f
info(_("Inner temperature: %f"), t_int);
TRYFUNC(FLIReadTemperature, dev, FLI_TEMPERATURE_EXTERNAL, &t_ext);
// ôÅÍÐÅÒÁÔÕÒÁ (×ÎÅÛÎ.): %f
info(_("Outern temperature: %f"), t_ext);
if(only_T) continue;
TRYFUNC(FLISetExposureTime, dev, exptime);
TRYFUNC(FLISetFrameType, dev, frametype);
//TRYFUNC(FLISetBitDepth, dev, FLI_MODE_16BIT);
img_size = img_rows * row_width * sizeof(u_int16_t);
if((img = malloc(img_size)) == NULL) err(1, "malloc() failed");
for (j = 0; j < pics; j ++){
TRYFUNC(FLIGetTemperature, dev, &temperature); // ÔÅÍÐÅÒÁÔÕÒÁ ÄÏ ÎÁÞÁÌÁ ÜËÓÐÏÚÉÃÉÉ
printf("\n\n");
// úÁÈ×ÁÔ ËÁÄÒÁ %d\n
printf(_("Capture frame %d\n"), j);
TRYFUNC(FLIExposeFrame, dev);
expStartsAt = time(NULL); // ×ÒÅÍÑ ÎÁÞÁÌÁ ÜËÓÐÏÚÉÃÉÉ
if(save_Tlog) if(curtime(tm_buf))
// îÁÞÉÎÁÀ ÜËÓÐÏÚÉÃÉÀ %dÍÓ, ×ÒÅÍÑ: %s, ÆÁÊÌ: %s.%d.%d\n
fprintf(f_tlog, _("Begin exposition %dms, exptime: %s, filename: %s.%d.%d\n"),
exptime, tm_buf, outfile, i, j);
do{
TRYFUNC(FLIGetExposureStatus, dev, &ltmp);
if(r) break;
// %.3f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ\n
printf(_("%.3f seconds till exposition ends\n"), ((float)ltmp) / 1000.);
TRYFUNC(FLIGetTemperature, dev, &t_int);
TRYFUNC(FLIReadTemperature, dev, FLI_TEMPERATURE_EXTERNAL, &t_ext);
if(curtime(tm_buf)){
// ÄÁÔÁ/×ÒÅÍÑ
printf("%s: %s\tText=%.2f\tTint=%.2f\n", _("date/time"), tm_buf, t_ext, t_int);
if(save_Tlog) fprintf(f_tlog, "%s\t\t%.5f\t\t%.5f\n", tm_buf, t_ext, t_int);
}
else info("curtime() error");
if(ltmp > 10000) sleep(10);
else usleep(ltmp * 1000);
}while(ltmp);
// óÞÉÔÙ×ÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ:
printf(_("Read image: "));
int portion = 0;
for (row = 0; row < img_rows; row++){
TRYFUNC(FLIGrabRow, dev, &img[row * row_width], row_width);
if(r) break;
int progress = (int)(((float)row / (float)img_rows) * 100.);
if(progress/5 > portion){
if((++portion)%2) printf("..");
else printf("%d%%", portion*5);
fflush(stdout);
}
}
printf("100%%\n");
curtime(tm_buf);
if(f_statlog)
fprintf(f_statlog, "%s\t%ld\t%g\t%.2f\t%.2f\t", tm_buf, time(NULL), exptime/1000., t_int, t_ext);
print_stat(img, row_width * img_rows, f_statlog);
inline void WRITEIMG(int (*writefn)(char*,int,int,void*), char *ext){
if(!check_filename(buff, outfile, ext))
// îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ
err(1, _("Can't save file"));
else{
TRYFUNC(writefn, buff, row_width, img_rows, img);
// æÁÊÌ ÚÁÐÉÓÁÎ × '%s'
if (r == 0) info(_("File saved as '%s'"), buff);
}
}
if(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);
TRYFUNC(FLIGetTemperature, dev, &t_int);
TRYFUNC(FLIReadTemperature, dev, FLI_TEMPERATURE_EXTERNAL, &t_ext);
if(curtime(tm_buf)){
// ÄÁÔÁ/×ÒÅÍÑ
printf("%s: %s\tText=%.2f\tTint=%.2f\n", _("date/time"), tm_buf, t_ext, t_int);
if(save_Tlog) fprintf(f_tlog, "%s\t\t%.5f\t\t%.5f\n", tm_buf, t_ext, t_int);
}
else info("curtime() error");
if(delta > 10) sleep(10);
else sleep(delta);
}
}
}
free(camera);
free(img);
TRYFUNC(FLIClose, dev);
}
for (i = 0; i < numcams; i++)
free(cam[i].name);
free(cam);
if(f_tlog) fclose(f_tlog);
if(f_statlog) fclose(f_statlog);
exit(0);
}
void findcams(flidomain_t domain, cam_t **cam){
long r;
char **tmplist;
TRYFUNC(FLIList, domain | FLIDEVICE_CAMERA, &tmplist);
if (tmplist != NULL && tmplist[0] != NULL){
int i, cams = 0;
for (i = 0; tmplist[i] != NULL; i++) cams++;
if ((*cam = realloc(*cam, (numcams + cams) * sizeof(cam_t))) == NULL)
err(1, "realloc() failed");
for (i = 0; tmplist[i] != NULL; i++) {
int j;
cam_t *tmpcam = *cam + i;
for (j = 0; tmplist[i][j] != '\0'; j++)
if (tmplist[i][j] == ';'){
tmplist[i][j] = '\0';
break;
}
tmpcam->domain = domain;
switch (domain){
case FLIDOMAIN_PARALLEL_PORT:
tmpcam->dname = "parallel port";
break;
case FLIDOMAIN_USB:
tmpcam->dname = "USB";
break;
case FLIDOMAIN_SERIAL:
tmpcam->dname = "serial";
break;
case FLIDOMAIN_INET:
tmpcam->dname = "inet";
break;
default:
tmpcam->dname = "Unknown domain";
break;
}
tmpcam->name = strdup(tmplist[i]);
}
numcams += cams;
}
// ëÁÍÅÒÙ ÎÅ ÎÁÊÄÅÎÙ!\n
else info(_("No cameras found!\n"));
TRYFUNC(FLIFreeList, tmplist);
return;
}
#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(u_int16_t);
if ((err = write(fd, data, size)) != size){
warn("write() failed");
err = -errno;
}
else err = 0;
close(fd);
return err;
}
#endif // USERAW
/*
* ÷ ÛÁÐËÅ ÄÏÌÖÎÙ ÂÙÔØ:
* RATE / Readout rate (KPix/sec)
* GAIN / gain, e/ADU
* SEEING / Seeing ('')
* IMSCALE / Image scale (''/pix x ''/pix)
* CLOUDS / Clouds (%)
*/
int writefits(char *filename, int width, int height, void *data){
long naxes[2] = {width, height}, startTime;
double tmp = 0.0;
struct tm *tm_starttime;
char buf[80];
time_t savetime = time(NULL);
fitsfile *fp;
TRYFITS(fits_create_file, &fp, filename);
TRYFITS(fits_create_img, fp, USHORT_IMG, 2, naxes);
// FILE / Input file original name
WRITEKEY(fp, TSTRING, "FILE", filename, "Input file original name");
// ORIGIN / organization responsible for the data
WRITEKEY(fp, TSTRING, "ORIGIN", "SAO RAS", "organization responsible for the data");
// OBSERVAT / Observatory name
WRITEKEY(fp, TSTRING, "OBSERVAT", "Special Astrophysical Observatory, Russia", "Observatory name");
// DETECTOR / detector
if(camera){
WRITEKEY(fp, TSTRING, "DETECTOR", camera, "Detector model");
}
// INSTRUME / Instrument
if(instrument){
WRITEKEY(fp, TSTRING, "INSTRUME", instrument, "Instrument");
}else
WRITEKEY(fp, TSTRING, "INSTRUME", "direct imaging", "Instrument");
// BZERO / zero point in scaling equation
//WRITEKEY(fp, TDOUBLE, "BZERO", &tmp, "zero point in scaling equation");
// BSCALE / linear factor in scaling equation
//tmp = 1.0; WRITEKEY(fp, TDOUBLE, "BSCALE", &tmp, "linear factor in scaling equation");
snprintf(buf, 79, "%.g x %.g", pixX, pixY);
// PXSIZE / pixel size
WRITEKEY(fp, TSTRING, "PXSIZE", buf, "Pixel size in m");
WRITEKEY(fp, TSTRING, "VIEW_FIELD", viewfield, "Camera field of view");
// CRVAL1, CRVAL2 / Offset in X, Y
if(X0) WRITEKEY(fp, TINT, "CRVAL1", &X0, "Offset in X");
if(Y0) WRITEKEY(fp, TINT, "CRVAL2", &Y0, "Offset in Y");
if(exptime == 0) sprintf(buf, "bias");
else if(frametype == FLI_FRAME_TYPE_DARK) sprintf(buf, "dark");
else if(objtype) strncpy(buf, objtype, 79);
else sprintf(buf, "object");
// IMAGETYP / object, flat, dark, bias, scan, eta, neon, push
WRITEKEY(fp, TSTRING, "IMAGETYP", buf, "Image type");
// DATAMAX, DATAMIN / Max,min pixel value
WRITEKEY(fp, TUSHORT, "DATAMAX", &max, "Max pixel value");
WRITEKEY(fp, TUSHORT, "DATAMIN", &min, "Min pixel value");
WRITEKEY(fp, TDOUBLE, "DATAAVR", &avr, "Average pixel value");
WRITEKEY(fp, TDOUBLE, "DATASTD", &std, "Standart deviation of pixel value");
WRITEKEY(fp, TDOUBLE, "TEMP0", &temperature, "Camera temperature at exp. start (degr C)");
WRITEKEY(fp, TDOUBLE, "TEMP1", &t_int, "Camera temperature at exp. end (degr C)");
WRITEKEY(fp, TDOUBLE, "TEMPBODY", &t_ext, "Camera body temperature at exp. end (degr C)");
tmp = (temperature + t_int) / 2. + 273.15;
// CAMTEMP / Camera temperature (K)
WRITEKEY(fp, TDOUBLE, "CAMTEMP", &tmp, "Camera temperature (K)");
tmp = (double)exptime / 1000.;
// EXPTIME / actual exposition time (sec)
WRITEKEY(fp, 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(fp, TSTRING, "DATE", buf, "Creation date (YYYY-MM-DDThh:mm:ss, UTC)");
startTime = (long)expStartsAt;
tm_starttime = localtime(&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/%d", tm_starttime);
// DATE-OBS / DATE (YYYY/MM/DD) OF OBS.
WRITEKEY(fp, TSTRING, "DATE-OBS", buf, "DATE OF OBS. (YYYY/MM/DD, local)");
strftime(buf, 79, "%H:%M:%S", tm_starttime);
// START / Measurement start time (local) (hh:mm:ss)
WRITEKEY(fp, TSTRING, "START", buf, "Measurement start time (hh:mm:ss, local)");
// OBJECT / Object name
if(objname){
WRITEKEY(fp, TSTRING, "OBJECT", objname, "Object name");
}
// BINNING / Binning
if(hbin != 1 || vbin != 1){
snprintf(buf, 79, "%d x %d", hbin, vbin);
WRITEKEY(fp, TSTRING, "BINNING", buf, "Binning (hbin x vbin)");
}
// OBSERVER / Observers
if(observers){
WRITEKEY(fp, TSTRING, "OBSERVER", observers, "Observers");
}
// PROG-ID / Observation program identifier
if(prog_id){
WRITEKEY(fp, TSTRING, "PROG-ID", prog_id, "Observation program identifier");
}
// AUTHOR / Author of the program
if(author){
WRITEKEY(fp, TSTRING, "AUTHOR", author, "Author of the program");
}
#ifdef USE_BTA
write_bta_data(fp);
#endif
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, Z_BEST_COMPRESSION);
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;
}
#endif /* USEPNG */
void print_stat(u_int16_t *img, long size, FILE *f){
long i, Noverld = 0L, N = 0L;
double pv, sum=0., sum2=0., sz = (double)size, tres;
u_int16_t *ptr = img, val;
max = 0; min = 65535;
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 >= 65530) 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;
// IÓÒÅÄÎÅÅ, IÓÉÇÍÁ, NÐÅÒÅËÏÐ
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; // ÐÏÒÏÇ ÐÏ ÍÁËÓÉÍÕÍÕ - 3 ÓÉÇÍÙ
for(i = 0; i < size; i++, ptr++){
val = *ptr;
pv = (double) val;
if(pv > tres){
Noverld++; // ÔÅÐÅÒØ ÜÔÏ - ËÏÌ-×Ï ÓÌÉÛËÏÍ ÑÒËÉÈ ÐÉËÓÅÌÅÊ
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));
// NÂÏÌØÛÅ3ÓÉÇÍ, IÓÒÅÄÎÅÅ × ÐÒÅÄÅÌÁÈ 3ÓÉÇÍ, IÓÉÇÍÁ × ÐÒÅÄÅÌÁÈ 3ÓÉÇÍ
fprintf(f, "%ld\t%.3f\t%.3f\n", Noverld, avr, std);
fflush(f);
printf("Novr3 = %ld\n", Noverld);
}

95
takepic.h Normal file
View File

@ -0,0 +1,95 @@
#ifndef __TAKEPIC_H__
#define __TAKEPIC_H__
#define _XOPEN_SOURCE 501
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <err.h>
#include <limits.h>
#include <errno.h>
#include <math.h>
#include <stdbool.h>
#include <fitsio.h>
#include <libintl.h>
#ifdef USEPNG
#include <png.h>
#endif /* USEPNG */
#include "libfli.h"
#ifndef GETTEXT_PACKAGE
#define GETTEXT_PACKAGE "takepic"
#endif
#ifndef LOCALEDIR
#define LOCALEDIR "./locale"
#endif
#define _(String) gettext(String)
#define gettext_noop(String) String
#define N_(String) gettext_noop(String)
// ÒÅÖÉÍ ÏÔÌÁÄËÉ, -DEBUG
#ifdef EBUG
#define RED "\033[1;32;41m"
#define GREEN "\033[5;30;42m"
#define OLDCOLOR "\033[0;0;0m"
#define FNAME() fprintf(stderr, "\n%s (%s, line %d)\n", __func__, __FILE__, __LINE__)
#define DBG(...) do{fprintf(stderr, "%s (%s, line %d): ", __func__, __FILE__, __LINE__); \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\n");} while(0)
#else
#define FNAME() do{}while(0)
#define DBG(...) do{}while(0)
#endif //EBUG
extern const char *__progname;
#define info(format, args...) do{ \
printf("%s: ", __progname); \
printf(format, ## args); \
printf("\n");}while(0)
#define warnc(c, format, args...) \
warnx(format ": %s", ## args, strerror(c))
long r;
#define TRYFUNC(f, ...) \
do{ if((r = f(__VA_ARGS__))) \
warnc(-r, #f "() failed"); \
}while(0)
#define LIBVERSIZ 1024
typedef struct{
flidomain_t domain;
char *dname;
char *name;
}cam_t;
void findcams(flidomain_t domain, cam_t **cam);
#ifdef USERAW
int writeraw(char *filename, int width, int height, void *data);
#endif // USERAW
#define TRYFITS(f, ...) \
do{ int status = 0; \
f(__VA_ARGS__, &status); \
if (status){ \
fits_report_error(stderr, status); \
return -1;} \
}while(0)
#define WRITEKEY(...) \
do{ int status = 0; \
fits_write_key(__VA_ARGS__, &status); \
if(status) fits_report_error(stderr, status);\
}while(0)
int writefits(char *filename, int width, int height, void *data);
#endif // __TAKEPIC_H__

331
usage.c Normal file
View File

@ -0,0 +1,331 @@
#include "usage.h"
char
*objname = NULL // ÉÍÑ ÏÂßÅËÔÁ
,*outfile = NULL // ÐÒÅÆÉËÓ ÉÍÅÎÉ ÆÁÊÌÁ ÄÌÑ ÚÁÐÉÓÉ raw/fits
,*objtype = NULL // ÔÉÐ ËÁÄÒÁ (ÐÏ ÕÍÏÌÞÁÎÉÀ - object, ÐÒÉ -d - dark)
,*instrument = NULL // ÎÁÚ×ÁÎÉÅ ÐÒÉÂÏÒÁ (ÐÏ ÕÍÏÌÞÁÎÉÀ - "direct imaging")
,*observers = NULL // ÎÁÂÌÀÄÁÔÅÌÉ
,*prog_id = NULL // ÉÍÑ ÐÒÏÇÒÁÍÍÙ
,*author = NULL // Á×ÔÏÒ
;
int
exptime = 500 // ×ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ (× ÍÓ)
,pics = 1 // ËÏÌ-×Ï ÓÎÉÍÁÅÍÙÈ ËÁÄÒÏ×
,hbin = 1 // ÇÏÒÉÚÏÎÔÁÌØÎÙÊ ÂÉÎÎÉÎÇ
,vbin = 1 // ×ÅÒÔÉËÁÌØÎÙÊ ÂÉÎÎÉÎÇ
,X0=-1,Y0=-1 // ËÏÏÒÄÉÎÁÔÙ ×ÅÒÈÎÅÇÏ ÌÅ×ÏÇÏ ÕÇÌÁ ÓÞÉÔÙ×ÁÅÍÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ
// -1 - ×ÓÑ ÏÂÌÁÓÔØ, × Ô.Þ. "Ï×ÅÒÓËÁÎ"
,X1=-1,Y1=-1 // ËÏÏÒÄÉÎÁÔÙ ÐÒÁ×ÏÇÏ ÎÉÖÎÅÇÏ ÕÇÌÁ ÓÞÉÔÙ×ÁÅÍÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ
,flushes = 1 // ËÏÌ-×Ï ÓÂÒÏÓÏ×
,pause_len = 0 // ÐÒÏÄÏÌÖÉÔÅÌØÎÏÓÔØ ÐÁÕÚÙ (× Ó) ÍÅÖÄÕ ËÁÄÒÁÍÉ
;
double temperature = -20.; // ÔÅÍÐÅÒÁÔÕÒÁ (ËÏÔÏÒÕÀ ÚÁÄÁÔØ, ÐÏÔÏÍ - ÎÁ ÎÁÞÁÌÏ ÜËÓÐ.)
fliframe_t frametype = FLI_FRAME_TYPE_NORMAL; // ÔÉÐ ÆÒÅÊÍÁ (ÏÂÙÞÎÙÊ ÉÌÉ ÔÅÍÎÏ×ÏÊ)
bool
only_T = FALSE // ÔÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ - É ×ÙÊÔÉ
,set_T = FALSE // ÚÁÄÁÔØ ÎÕÖÎÕÀ ÔÅÍÐÅÒÁÔÕÒÕ
,save_Tlog = FALSE // ÓÏÈÒÁÎÑÔØ ÖÕÒÎÁÌ ÔÅÍÐÅÒÁÔÕÒ
,save_image = TRUE // ÓÏÈÒÁÎÑÔØ ÉÚÏÂÒÁÖÅÎÉÅ
,stat_logging = FALSE // ÐÏÌÎÏÅ ÌÏÇÇÉÒÏ×ÁÎÉÅ ÓÔÁÔÉÓÔÉËÉ
;
int myatoi(int *num, const char *str){ // "ÁËËÕÒÁÔÎÙÊ" 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;
}
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);
}
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>\n"),
__progname);
// "\tïÐÃÉÉ:\n"
printf(_("\tOptions:\n"));
printf("\t-A,\t--author=author\t\t%s\n",
// "Á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ"
_("program author"));
printf("\t-d,\t--dark\t\t\t%s\n",
// "ÎÅ ÏÔËÒÙ×ÁÔØ ÚÁÔ×ÏÒ ÐÒÉ ÜËÓÐÏÚÉÃÉÉ (\"ÔÅÍÎÏ×ÙÅ\")"
_("not open shutter, when exposing (\"dark frames\")"));
printf("\t-f,\t--flushes=N\t\t%s\n",
// "N ÓÂÒÏÓÏ× ÐÅÒÅÄ ÜËÓÐÏÚÉÃÉÅÊ"
_("N flushes before exposing"));
printf("\t-h,\t--hbin=N\t\t%s\n",
// "ÂÉÎÎÉÎÇ N ÐÉËÓÅÌÅÊ ÐÏ ÇÏÒÉÚÏÎÔÁÌÉ"
_("horizontal binning to N pixels"));
printf("\t-I,\t--image-type=type\t%s\n",
// "ÔÉÐ ÉÚÏÂÒÁÖÅÎÉÑ"
_("image type"));
printf("\t-i,\t--instrument=instr\t%s\n",
// "ÎÁÚ×ÁÎÉÅ ÐÒÉÂÏÒÁ"
_("instrument name"));
printf("\t-L,\t--log-only\t\t%s\n",
// "ÎÅ ÓÏÈÒÁÎÑÔØ ÉÚÏÂÒÁÖÅÎÉÑ, ÌÉÛØ ×ÅÓÔÉ ÚÁÐÉÓØ ÓÔÁÔÉÓÔËÉ"
_("don't save images, only make all-stat log"));
printf("\t-l,\t--tlog\t\t\t%s\n",
// "×ÅÓÔÉ ÚÁÐÉÓØ ÒÁÂÏÞÉÈ ÔÅÍÐÅÒÁÔÕÒ × ÆÁÊÌ temp_log"
_("make temperatures logging to file temp_log"));
printf("\t-n,\t--nframes=N\t\t%s\n",
// "N ËÁÄÒÏ× × ÓÅÒÉÉ"
_("make series of N frames"));
printf("\t-O,\t--object=obj\t\t%s\n",
// "ÎÁÚ×ÁÎÉÅ ÏÂßÅËÔÁ"
_("object name"));
printf("\t-o,\t--observer=obs\t\t%s\n",
// "ÉÍÅÎÁ ÎÁÂÌÀÄÁÔÅÌÅÊ"
_("observers' names"));
printf("\t-P,\t--prog-id=prname\t%s\n",
// "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ ÎÁÂÌÀÄÅÎÉÊ"
_("observing program name"));
printf("\t-p,\t--pause-len=ptime\t%s\n",
// "×ÙÄÅÒÖÁÔØ ptime ÓÅËÕÎÄ ÍÅÖÄÕ ÜËÓÐÏÚÉÃÉÑÍÉ"
_("make pause for ptime seconds between expositions"));
printf("\t-s,\t--only-stat\t\t%s\n",
// "ÎÅ ÓÏÈÒÁÎÑÔØ ÉÚÏÂÒÁÖÅÎÉÅ, Á ÔÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÁÔÉÓÔÉËÕ"
_("not save image, just show statistics"));
printf("\t-T,\t--only-temp\t\t%s\n",
// "ÔÏÌØËÏ ÚÁÄÁÔØ/ÐÏÌÕÞÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ"
_("only set/get temperature"));
printf("\t-t,\t--set-temp=degr\t\t%s\n",
// "ÚÁÄÁÔØ ÒÁÂÏÞÕÀ ÔÅÍÐÅÒÁÔÕÒÕ degr ÇÒÁÄÕÓÏ×"
_("set work temperature to degr C"));
printf("\t-v,\t--vbin=N\t\t%s\n",
// "ÂÉÎÎÉÎÇ N ÐÉËÓÅÌÅÊ ÐÏ ×ÅÒÔÉËÁÌÉ"
_("vertical binning to N pixels"));
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"));
exit(0);
}
void parse_args(int argc, char **argv){
int i;
char short_options[] = "A:df:h:I:i:Lln:O:o:P:p:sTt:v:x:X:Y:";
struct option long_options[] = {
/* { name, has_arg, flag, val }, ÇÄÅ:
* name - ÉÍÑ "ÄÌÉÎÎÏÇÏ" ÐÁÒÁÍÅÔÒÁ
* has_arg = 0 - ÎÅÔ ÁÒÇÕÍÅÎÔÁ, 1 - ÏÂÑÚÁÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ, 2 - ÎÅÏÂÑÚÁÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ
* flag = NULL ÄÌÑ ×ÏÚ×ÒÁÔÁ val, ÕËÁÚÁÔÅÌØ ÎÁ ÐÅÒÅÍÅÎÎÕÀ int - ÄÌÑ ÐÒÉÓ×ÏÅÎÉÑ ÅÊ
* ÚÎÁÞÅÎÉÑ val (× ÜÔÏÍ ÓÌÕÞÁÅ ÆÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ 0)
* val - ×ÏÚ×ÒÁÝÁÅÍÏÅ ÚÎÁÞÅÎÉÅ getopt_long ÉÌÉ ÚÎÁÞÅÎÉÅ, ÐÒÉÓ×ÁÅÍÏÅ ÕËÁÚÁÔÅÌÀ flag
* !!! ÐÏÓÌÅÄÎÑÑ ÓÔÒÏËÁ - ÞÅÔÙÒÅ ÎÕÌÑ
*/
{"author", 1, 0, 'A'},
{"dark", 0, 0, 'd'},
{"flushes", 1, 0, 'f'},
{"hbin", 1, 0, 'h'},
{"image-type", 1, 0, 'I'},
{"instrument", 1, 0, 'i'},
{"log-only", 0, 0, 'L'},
{"tlog", 0, 0, 'l'},
{"nframes", 1, 0, 'n'},
{"object", 1, 0, 'O'},
{"observers", 1, 0, 'o'},
{"prog-id", 1, 0, 'P'},
{"pause-len", 1, 0, 'p'},
{"only-stat", 0, 0, 's'},
{"only-temp", 0, 0, 'T'},
{"set-temp", 1, 0, 't'},
{"vbin", 1, 0, 'v'},
{"exp", 1, 0, 'x'},
{"xclip", 1, 0, 'X'},
{"yclip", 1, 0, 'Y'},
{ 0, 0, 0, 0 }
};
/* "ÄÌÉÎÎÙÅ" É "ËÏÒÏÔËÉÅ" ÐÁÒÁÍÅÔÒÙ getopt_long ÎÅ ÄÏÌÖÎÙ ÓÏ×ÐÁÄÁÔØ
* (ÌÉÛØ ÅÓÌÉ "ÄÌÉÎÎÙÊ" ÄÏÌÖÅÎ ÚÎÁÞÉÔØ ÔÏ ÖÅ, ÞÔÏ "ËÏÒÏÔËÉÊ", ÄÌÑ ÎÅÇÏ
* ÄÏÌÖÎÏ ÂÙÔØ flag = NULL, val = ÚÎÁÞÅÎÉÅ ËÏÒÏÔËÏÇÏ
*/
while (1){
int opt;
if((opt = getopt_long(argc, argv, short_options,
long_options, NULL)) == -1) break;
switch(opt){
case 'A':
author = strdup(optarg);
// "á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ: %s"
info(_("Program author: %s"), author);
break;
case 'd':
frametype = FLI_FRAME_TYPE_DARK;
// "óßÅÍËÁ ÔÅÍÎÏ×ÙÈ"
info(_("Dark frames"));
break;
case 'f':
if (myatoi(&flushes, optarg) || flushes < 0){
// "îÅ×ÅÒÎÏÅ ËÏÌ-×Ï ÓÂÒÏÓÏ×: %s"
usage("Wrong flushes number: %s", optarg);
}
// "ëÏÌ-×Ï ÓÂÒÏÓÏ×: %d"
info("Flushes number: %d", flushes);
break;
case 'h':
if (myatoi(&hbin, optarg) || hbin < 1 || hbin > 16){
// "îÅ×ÅÒÎÙÊ"
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;
save_image = FALSE;
// ðÏÌÎÏÅ ÖÕÒÎÁÌÉÒÏ×ÁÎÉÅ ÓÔÁÔÉÓÔÉËÉ ÂÅÚ ÓÏÈÒÁÎÅÎÉÑ ÉÚÏÂÒÁÖÅÎÉÊ
info(_("Full statistics logging without saving images"));
break;
case 'l':
save_Tlog = TRUE;
// "óÏÈÒÁÎÅÎÉÅ ÖÕÒÎÁÌÁ ÔÅÍÐÅÒÁÔÕÒ"
info(_("Save temperature log"));
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':
objname = strdup(optarg);
// "éÍÑ ÏÂßÅËÔÁ - %s"
info(_("Object name - %s"), objname);
break;
case 'o':
observers = strdup(optarg);
// "îÁÂÌÀÄÁÔÅÌÉ: %s"
info(_("Observers: %s"), observers);
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 's':
save_image = FALSE;
break;
case 'T':
only_T = TRUE;
save_image = FALSE;
// "ÔÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ/ÚÁÄÁÔØ ÔÅÍÐÅÒÁÔÕÒÕ"
info(_("only set/get temperature"));
break;
case 't':
temperature = atof(optarg);
if(temperature < -55. || temperature > 30.){
// "îÅ×ÅÒÎÏÅ ÚÎÁÞÅÎÉÅ ÔÅÍÐÅÒÁÔÕÒÙ: %s (ÄÏÌÖÎÏ ÂÙÔØ ÏÔ -55 ÄÏ 30)"
usage(_("Wrong temperature: %s (must be from -55 to 30)"), optarg);
}
set_T = TRUE;
// "õÓÔÁÎÏ×ÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ: %.3f"
info(_("Set temperature: %.3f"), temperature);
break;
case 'v':
if (myatoi(&vbin, optarg) || vbin < 1 || vbin > 16){
// "îÅ×ÅÒÎÙÊ"
usage("%s vbin: %s", _("Wrong"), optarg);
}
// "÷ÅÒÔ. ÂÉÎÎÉÎÇ: %d"
info(_("Vertical binning: %d"), vbin);
break;
case 'x':
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);
}
}
argc -= optind;
argv += optind;
if(argc == 0 && save_image){
// "îÅÔ ÐÒÅÆÉËÓÁ ÉÍÅÎÉ ×ÙÈÏÄÎÙÈ ÆÁÊÌÏ×"
usage(_("Output file names prefix is absent"));
}
else{ if(argc != 0){
outfile = argv[0];
argc--;
argv++;
}
else outfile = strdup("nofile");
}
if(argc > 0){
// "éÇÎÏÒÉÒÕÀ ÁÒÇÕÍÅÎÔ[Ù]:\n"
printf(_("Ignore argument[s]:\n"));
}
for (i = 0; i < argc; i++)
warnx("%s ", argv[i]);
}

39
usage.h Normal file
View File

@ -0,0 +1,39 @@
#ifndef __USAGE_H__
#define __USAGE_H__
#include "takepic.h"
#include <getopt.h>
#include <stdarg.h>
extern int
exptime // время экспозиции (в мс)
,pics // кол-во снимаемых кадров
,hbin // горизонтальный биннинг
,vbin // вертикальный биннинг
,X0, X1, Y0, Y1 // координаты выбранного окна
,flushes // кол-во сбросов
,pause_len // продолжительность паузы (в с) между кадрами
;
extern double temperature; // температура (которую задать, потом - на начало эксп.)
extern fliframe_t frametype; // тип фрейма (обычный или темновой)
extern bool
only_T // только отобразить температуру - и выйти
,set_T // задать нужную температуру
,save_Tlog // сохранять журнал температур
,save_image // сохранять изображение
,stat_logging // полное логгирование статистики
;
extern char *objname // имя объекта
,*outfile // префикс имени файла для записи raw/fits
,*objtype // тип изображения
,*instrument // название прибора (по умолчанию - "direct imaging")
,*observers // наблюдатели
,*prog_id // имя программы
,*author // автор
;
void usage(char *fmt, ...);
void parse_args(int argc, char **argv);
#endif // __USAGE_H__