From 6c704fcf9b6e831762b7144bbaa93cbd98c815dd Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 23 Jul 2026 17:39:39 +0300 Subject: [PATCH] fixed some bugs; need to make more refactoring --- ccdcapture.c | 67 +++- ccdcapture.h | 60 +++- ccdfunc.c | 302 +++++++++++++---- ccdfunc.h | 3 + client.c | 12 +- imageview.c | 2 +- locale/ru/LC_MESSAGES/ccd_capture.mo | Bin 15224 -> 24522 bytes locale/ru/messages.po | 418 +++++++++++------------ locale/ru/ru.po | 477 +++++++++++++-------------- main.c | 3 + server.c | 124 ++++--- 11 files changed, 870 insertions(+), 598 deletions(-) diff --git a/ccdcapture.c b/ccdcapture.c index 1c20e5d..c2fdbf9 100644 --- a/ccdcapture.c +++ b/ccdcapture.c @@ -420,7 +420,7 @@ cc_IMG *cc_getshm(key_t key, size_t imsize){ // find plugin -void *open_plugin(const char *name){ +void *cc_open_plugin(const char *name){ DBG("try to open lib %s", name); void* dlh = dlopen(name, RTLD_NOLOAD); // library may be already opened if(!dlh){ @@ -434,9 +434,9 @@ void *open_plugin(const char *name){ return dlh; } -cc_Focuser *open_focuser(const char *pluginname){ +cc_Focuser *cc_open_focuser(const char *pluginname){ FNAME(); - void* dlh = open_plugin(pluginname); + void* dlh = cc_open_plugin(pluginname); if(!dlh) return NULL; cc_Focuser* f = (cc_Focuser*) dlsym(dlh, "focuser"); if(!f){ @@ -445,9 +445,9 @@ cc_Focuser *open_focuser(const char *pluginname){ } return f; } -cc_Camera *open_camera(const char *pluginname){ +cc_Camera *cc_open_camera(const char *pluginname){ FNAME(); - void* dlh = open_plugin(pluginname); + void* dlh = cc_open_plugin(pluginname); if(!dlh) return NULL; cc_Camera *c = (cc_Camera*) dlsym(dlh, "camera"); if(!c){ @@ -456,9 +456,9 @@ cc_Camera *open_camera(const char *pluginname){ } return c; } -cc_Wheel *open_wheel(const char *pluginname){ +cc_Wheel *cc_open_wheel(const char *pluginname){ FNAME(); - void* dlh = open_plugin(pluginname); + void* dlh = cc_open_plugin(pluginname); if(!dlh) return NULL; cc_Wheel *w = (cc_Wheel*) dlsym(dlh, "wheel"); if(!w){ @@ -768,6 +768,26 @@ cc_hresult cc_getfloat(int fd, cc_strbuff *cbuf, const char *cmd, float *val){ return r; } +/** + * @brief cc_addrecord - add pre-formated record to FITS file + * @param fp - pointer to FITS file + * @param rec - record to add + * @return + */ +int cc_addrecord(fitsfile *fp, char *rec){ + if(!fp || !rec) return -1; + char key[FLEN_KEYWORD]; + char *eq = strchr(rec, '='); + int status = 0; + if(eq){ // found 'key = value / comment' + size_t l = eq - rec; + if(l > FLEN_KEYWORD-1) l = FLEN_KEYWORD-1; + memcpy(key, rec, l); key[l] = 0; + fits_update_card(fp, key, rec, &status); + }else fits_write_record(fp, rec, &status); + if(status) fits_report_error(stderr, status); + return status; +} // get next record from external buffer, newlines==1 if every record ends with '\n' char *cc_nextkw(char *buf, char record[FLEN_CARD], int newlines){ @@ -787,12 +807,12 @@ char *cc_nextkw(char *buf, char record[FLEN_CARD], int newlines){ /** * @brief cc_kwfromfile - add records from file - * @param img - buffer to add + * @param fp - FITS file * @param filename - file name with FITS headers ('\n'-terminated or by 80 chars) - * @return amount of bytes added + * @return amount of records added */ -size_t cc_kwfromfile(cc_IMG *img, char *filename){ - if(!img) return 0; +int cc_kwfromfile(fitsfile *fp, char *filename){ + if(!fp || !filename) return 0; sl_mmapbuf_t *buf = sl_mmap(filename); if(!buf || buf->len < 1){ WARNX(_("Can't add FITS records from file %s"), filename); @@ -805,7 +825,7 @@ size_t cc_kwfromfile(cc_IMG *img, char *filename){ if(x && (x - data) < FLEN_CARD){ // we found newline -> this is a format with newlines newlines = 1; } - size_t written = 0; + int written = 0; do{ data = cc_nextkw(data, rec, newlines); if(data > eodata) break; @@ -813,10 +833,7 @@ size_t cc_kwfromfile(cc_IMG *img, char *filename){ fits_parse_template(rec, card, &kt, &status); if(status) fits_report_error(stderr, status); else{ - if(img->headerstrings < FITS_HEADER_STRINGS_MAX){ - ++written; - snprintf(img->fitsheader[img->headerstrings++], FLEN_CARD, "%s", card); - }else break; + if(0 == cc_addrecord(fp, card)) ++written; } }while(data && *data); sl_munmap(buf); @@ -1059,6 +1076,7 @@ int cc_copyimage(cc_IMG *dest, cc_IMG *src, int isshm){ } DBG("Lock"); pthread_mutex_lock(&dest->mutex); + dest->MAGICK = CC_SHM_MAGIC; if(!dest->data || dest->datasize < src->bytelen){ size_t newsz = 1024 * (1 + src->bytelen / 1024); DBG("resize from %zd to %zd bytes", dest->datasize, newsz); @@ -1073,7 +1091,8 @@ int cc_copyimage(cc_IMG *dest, cc_IMG *src, int isshm){ dest->datasize = newsz; DBG("Success"); } - DBG("Copy fields"); + DBG("Copy %zd bytes of fields", offsetof(cc_IMG, end_of_copyable_data) - offsetof(cc_IMG, start_of_copyable_data)); +#if 0 #define COPY(field) dest->field = src->field; COPY(timestamp); COPY(bitpix); @@ -1081,7 +1100,21 @@ int cc_copyimage(cc_IMG *dest, cc_IMG *src, int isshm){ COPY(h); COPY(bytelen); COPY(imnumber); + COPY(pixel_x); + COPY(pixel_y); + COPY(gain); + COPY(ccd_temp); + COPY(exposure_time); + COPY(bin_x); + COPY(bin_y); #undef COPY + memcpy(dest->model, src->model, MODELNM_SZ); +#endif + uint8_t *tagaddr = (uint8_t*)dest + offsetof(cc_IMG, start_of_copyable_data); + uint8_t *srcaddr = (uint8_t*)src + offsetof(cc_IMG, start_of_copyable_data); + memcpy(tagaddr, srcaddr, + offsetof(cc_IMG, end_of_copyable_data) - offsetof(cc_IMG, start_of_copyable_data)); + DBG("TS after copy: dest=%.5f, src=%.5f", dest->timestamp, src->timestamp); DBG("Copy %zd bytes of data", src->bytelen); void *srcdata = src->data; if(isshm){ diff --git a/ccdcapture.h b/ccdcapture.h index 3eb6f6a..75a60e3 100644 --- a/ccdcapture.h +++ b/ccdcapture.h @@ -33,10 +33,28 @@ // semaphore for SHM protection #define SEM_NAME "ccdcapture" +#define MODELNM_SZ 64 + +typedef union{ + struct{ + uint8_t dark : 1; // dark or light frame? + uint8_t havefocuser:1; // we have focuser device + uint8_t havewheel : 1; // have wheel device (TODO: what if we have more than one wheel?) + }; + uint8_t all; +} camflags_t; + +// format of single frame +typedef struct{ + int w; int h; // width & height + int xoff; int yoff; // X and Y offset +} cc_frameformat; + // base image parameters - sent by socket and stored in shared memory -typedef struct{ // __attribute__((packed)) +typedef struct { // __attribute__((packed)) uint32_t MAGICK; // magick (DEADBEEF) - to mark our shm pthread_mutex_t mutex; // mutex for working with image data + uint8_t start_of_copyable_data; // service field - start of copyable data double timestamp; // timestamp of image taken int w, h; // image size int gotstat; // stat counted @@ -46,10 +64,27 @@ typedef struct{ // __attribute__((packed)) uint8_t bitpix; // bits per pixel (8 or 16) uint16_t max, min; // min/max values float avr, std; // statistics - size_t headerstrings; // amount of records in header + // camera data (nan for float if camera have no such property) + camflags_t flags; // flags + float pixel_x, pixel_y; // pixel size, mkm + float gain, brightness; // current gain & brightness config + float ccd_temp; // cold side temperature + float tbody, thot; // camera body & hot Peltier temperatures + float exposure_time; // exposure time of given frame + uint16_t bin_x, bin_y; // binning + char model[MODELNM_SZ]; // camera model + cc_frameformat field, array, geometry; // copy of same `camera` fields + // focuser data + float focpos, focmin, focmax;// current, minimal and maximal F position + float foc_temp; // focuser temperature + char fmodel[MODELNM_SZ]; // focuser model + // wheel data + uint8_t wheelpos, wheelmax; // current and maximal wheel position + float wheel_temp; // wheel temperature + char wmodel[MODELNM_SZ]; // wheel model + uint8_t end_of_copyable_data; // service field - end of copyable data /* `data` is uint8_t or uint16_t depending on `bitpix` */ void *data; // pointer to data (next byte after this struct) - only for server - char fitsheader[FITS_HEADER_STRINGS_MAX][FLEN_CARD]; // FITS-header for given image } cc_IMG; typedef struct{ @@ -72,12 +107,6 @@ typedef struct{ #define cc_buff_trylock(b) pthread_mutex_trylock(&((b)->mutex)) #define cc_buff_unlock(b) pthread_mutex_unlock(&((b)->mutex)) -// format of single frame -typedef struct{ - int w; int h; // width & height - int xoff; int yoff; // X and Y offset -} cc_frameformat; - typedef enum{ SHUTTER_OPEN, // open shutter now SHUTTER_CLOSE, // close shutter now @@ -264,6 +293,7 @@ typedef enum{ #define CC_CMD_FASTSPD "fastspeed" #define CC_CMD_DARK "dark" #define CC_CMD_INFTY "infty" +#if 0 // FITS file keywords #define CC_CMD_GETHEADERS "getheaders" #define CC_CMD_AUTHOR "author" @@ -272,6 +302,7 @@ typedef enum{ #define CC_CMD_OBJECT "object" #define CC_CMD_PROGRAM "program" #define CC_CMD_OBJTYPE "objtype" +#endif // focuser #define CC_CMD_FOCLIST "foclist" @@ -311,10 +342,10 @@ typedef struct{ // custom plugin parameters cc_hresult cc_plugin_customcmd(const char *str, cc_parhandler_t *handlers, cc_charbuff *ans); -void *open_plugin(const char *name); -cc_Focuser *open_focuser(const char *pluginname); -cc_Camera *open_camera(const char *pluginname); -cc_Wheel *open_wheel(const char *pluginname); +void *cc_open_plugin(const char *name); +cc_Focuser *cc_open_focuser(const char *pluginname); +cc_Camera *cc_open_camera(const char *pluginname); +cc_Wheel *cc_open_wheel(const char *pluginname); cc_charbuff *cc_charbufnew(); int cc_charbuftest(cc_charbuff *b, size_t maxsize); @@ -351,8 +382,9 @@ cc_hresult cc_getint(int fd, cc_strbuff *cbuf, const char *cmd, int *val); cc_hresult cc_setfloat(int fd, cc_strbuff *cbuf, const char *cmd, float val); cc_hresult cc_getfloat(int fd, cc_strbuff *cbuf, const char *cmd, float *val); +int cc_addrecord(fitsfile *fp, char *rec); char *cc_nextkw(char *buf, char record[FLEN_CARD], int newlines); -size_t cc_kwfromfile(cc_IMG *img, char *filename); +int cc_kwfromfile(fitsfile *fp, char *filename); //int cc_charbuf2kw(cc_charbuff *b, fitsfile *f); void cc_init_sem(int isserver); diff --git a/ccdfunc.c b/ccdfunc.c index 329eeaa..f1df867 100644 --- a/ccdfunc.c +++ b/ccdfunc.c @@ -37,6 +37,9 @@ cc_Camera *camera = NULL; cc_Focuser *focuser = NULL; cc_Wheel *wheel = NULL; +static float focmaxpos = 0.f, focminpos = 0.f; // focuser extremal positions +static int wmaxpos = 0; // wheel max pos + static int fitserror = 0; #define TRYFITS(f, ...) \ @@ -63,8 +66,8 @@ static size_t curtime(char *s_time){ // current date/time // check if I can create file prefix_XXXX.fits static int check_filenameprefix(char *buff, int buflen){ - for(int num = 1; num < 10000; num++){ - if(snprintf(buff, buflen-1, "%s_%04d.fits", GP->outfileprefix, num) < 1) + for(int num = 1; num < 1000000; num++){ + if(snprintf(buff, buflen-1, "%s_%06d.fits", GP->outfileprefix, num) < 1) return FALSE; struct stat filestat; if(stat(buff, &filestat)) // no such file or can't stat() @@ -73,6 +76,7 @@ static int check_filenameprefix(char *buff, int buflen){ return FALSE; } +#if 0 /** * @brief fillFITSheader (server-side only!) - update img->fitsheader by image data and additional headers * @param img (io) - image to update @@ -86,7 +90,7 @@ size_t fillFITSheader(cc_IMG *img){ do{ int status = 0, kt = 0; \ fits_parse_template(in, card, &kt, &status); \ if(status) fits_report_error(stderr, status);\ - else if(img->headerstrings < FITS_HEADER_STRINGS_MAX) snprintf(img->fitsheader[img->headerstrings++], FLEN_CARD, "%s", card); \ + else addrecord(fp, card); \ }while(0) #define FORMINT(key, val, comment) do{ \ snprintf(templ, FLEN_CARD, "%s = %d / %s", key, val, comment); \ @@ -190,13 +194,17 @@ do{ int status = 0, kt = 0; \ if(GP->instrument) FORMSTR("INSTRUME", GP->instrument, "Instrument"); return img->headerstrings; } +#endif // save FITS file `img` into GP->outfile or GP->outfileprefix_XXXX.fits // if outp != NULL, put into it strdup() of last file name // return FALSE if failed int saveFITS(cc_IMG *img, char **outp){ int ret = FALSE; - if(!img || !img->data || !outp) return FALSE; + if(!img || !img->data){ + WARNX("Bad data"); + return FALSE; + } char fnam[PATH_MAX+1]; if(!GP->outfile && !GP->outfileprefix){ LOGWARN("Image not saved: neither filename nor filename prefix pointed"); @@ -216,17 +224,19 @@ int saveFITS(cc_IMG *img, char **outp){ } snprintf(fnam, PATH_MAX, "!%s", GP->outfile); } + DBG("Will save as %s", GP->outfile); }else{ // user pointed output file prefix if(!check_filenameprefix(fnam, PATH_MAX)){ WARNX(_("Can't save file with prefix %s"), GP->outfileprefix); LOGERR("Can't save image with prefix %s", GP->outfileprefix); + return FALSE; } + DBG("Will save with prefix %s", GP->outfileprefix); } pthread_mutex_lock(&img->mutex); int width = img->w, height = img->h; long naxes[2] = {width, height}; struct tm *tm_time; - char bufc[FLEN_CARD]; double dsavetime = sl_dtime(); time_t savetime = time(NULL); fitsfile *fp; @@ -238,19 +248,113 @@ int saveFITS(cc_IMG *img, char **outp){ else TRYFITS(fits_create_img, fp, USHORT_IMG, 2, naxes); if(fitserror) goto cloerr; // write header - char key[FLEN_KEYWORD]; - for(size_t i = 0; i < img->headerstrings; ++i){ - char *rec = img->fitsheader[i]; - char *eq = strchr(rec, '='); - int status = 0; - if(eq){ // found 'key = value / comment' - size_t l = eq - rec; - if(l > FLEN_KEYWORD-1) l = FLEN_KEYWORD-1; - memcpy(key, rec, l); key[l] = 0; - fits_update_card(fp, key, rec, &status); - }else fits_write_record(fp, rec, &status); - if(status) fits_report_error(stderr, status); + char card[FLEN_CARD], templ[2*FLEN_CARD], bufc[FLEN_CARD]; + calculate_stat(img); +#define FORMKW(in) \ + do{ int status = 0, kt = 0; \ + fits_parse_template(in, card, &kt, &status); \ + if(status) fits_report_error(stderr, status);\ + else cc_addrecord(fp, card); \ + }while(0) +#define FORMINT(key, val, comment) do{ \ + snprintf(templ, FLEN_CARD, "%s = %d / %s", key, val, comment); \ + FORMKW(templ); \ +}while(0) +#define FORMFLT(key, val, comment) do{ \ + snprintf(templ, FLEN_CARD, "%s = %g / %s", key, val, comment); \ + FORMKW(templ); \ +}while(0) +#define FORMSTR(key, val, comment) do{ \ + snprintf(templ, 2*FLEN_CARD, "%s = '%s' / %s", key, val, comment); \ + FORMKW(templ); \ +}while(0) + + FORMKW("ORIGIN = 'SAO RAS' / Organization responsible for the data"); + FORMKW("OBSERVAT = 'Special Astrophysical Observatory, Russia' / Observatory name"); + if(img->model[0]) FORMSTR("DETECTOR", img->model, "Detector model"); + if(GP->instrument) FORMSTR("INSTRUME", GP->instrument, "Instrument"); + else FORMKW("INSTRUME = 'direct imaging' / Instrument"); + FORMFLT("EXPTIME", img->exposure_time, "Actual exposition time (sec)"); + // BINNING / Binning + snprintf(templ, FLEN_CARD, "BINNING = '%d x %d' / Binning (hbin x vbin)", img->bin_x, img->bin_y); + FORMKW(templ); + FORMINT("XBINNING", img->bin_x, "Binning factor used on X axis"); + FORMINT("YBINNING", img->bin_y, "Binning factor used on Y axis"); + // pixel size + if(!isnan(img->pixel_x)){ + FORMFLT("PIXSIZEX", img->pixel_x, "Pixel size X (um)"); + if(!isnan(img->pixel_y)){ + FORMFLT("PIXSIZEY", img->pixel_y, "Pixel size Y (um)"); + snprintf(templ, FLEN_CARD, "PIXSIZE = '%.1f x %.1f' / Pixel size (h x v), um", img->pixel_x, img->pixel_y); + FORMKW(templ); + } } + // imtype + if(img->flags.dark) sprintf(bufc, "dark"); + else if(GP->objtype) strncpy(bufc, GP->objtype, FLEN_CARD); + else sprintf(bufc, "light"); + FORMSTR("IMAGETYP", bufc, "Image type"); + // geometry + snprintf(templ, FLEN_CARD, "VIEWFLD = '(%d, %d)(%d, %d)' / Camera maximal field of view", img->field.xoff, img->field.yoff, + img->field.xoff + img->field.w, img->field.yoff + img->field.h); + FORMKW(templ); + snprintf(templ, FLEN_CARD, "ARRAYFLD = '(%d, %d)(%d, %d)' / Camera full array size (with overscans)", img->array.xoff, img->array.yoff, + img->array.xoff + img->array.w, img->array.yoff + img->array.h); + FORMKW(templ); + snprintf(templ, FLEN_CARD, "GEOMETRY = '(%d, %d)(%d, %d)' / Camera current frame geometry", img->geometry.xoff, img->geometry.yoff, + img->geometry.xoff + img->geometry.w, img->geometry.yoff + img->geometry.h); + FORMKW(templ); + FORMINT("X0", img->geometry.xoff, "Subframe left border without binning"); + FORMINT("Y0", img->geometry.yoff, "Subframe upper border without binning"); + // stat + FORMINT("DATAMIN", 0, "Min pixel value"); + FORMINT("DATAMAX", (1<bitpix) - 1, "Max pixel value"); + if(img->gotstat){ + FORMINT("STATMIN", img->min, "Min data value"); + FORMINT("STATMAX", img->max, "Max data value"); + FORMFLT("STATAVR", img->avr, "Average data value"); + FORMFLT("STATSTD", img->std, "Std. of data value"); + } + // camera parameters + if(!isnan(img->gain)) FORMFLT("CAMGAIN", img->gain, "CMOS gain value"); + if(!isnan(img->brightness)) FORMFLT("CAMBRIGH", img->brightness, "CMOS brightness value"); + if(!isnan(img->ccd_temp)) FORMFLT("CAMTEMP", img->ccd_temp, "Camera temperature at exp. end, degr C"); + if(!isnan(img->tbody)) FORMFLT("BODYTEMP", img->tbody, "Camera body temperature at exp. end, degr C"); + if(!isnan(img->thot)) FORMFLT("HOTTEMP", img->thot, "Camera peltier hot side temperature at exp. end, degr C"); + // wheel + if(img->flags.havewheel){ + if(img->wmodel[0]) FORMSTR("WHEEL", img->wmodel, "Filter wheel model"); + if(img->wheelmax > 0) FORMINT("FILTMAX", img->wheelmax, "Amount of filter positions"); + FORMINT("FILTER", img->wheelpos, "Current filter position"); + if(!isnan(img->wheel_temp)) FORMFLT("FILTTEMP", img->wheel_temp, "Filter wheel body temperature, degr C"); + } + // focuser + if(img->flags.havefocuser){ + if(img->fmodel[0]) FORMSTR("FOCUSER", img->fmodel, "Focuser model"); + if(!isnan(img->focpos)) FORMFLT("FOCUS", img->focpos, "Current focuser position, mm"); + if(!isnan(img->focmin)) FORMFLT("FOCMIN", img->focmin, "Minimal focuser position, mm"); + if(!isnan(img->focmax)) FORMFLT("FOCMAX", img->focmax, "Maximal focuser position, mm"); + if(!isnan(img->foc_temp)) FORMFLT("FOCTEMP", img->foc_temp, "Focuser body temperature, degr C"); + } + snprintf(templ, 2*FLEN_CARD, "TIMESTAM = %.6f / Time of acquisition end (UNIX)", img->timestamp); + FORMKW(templ); + FORMINT("IMSEQNO", (int)img->imnumber, "Number of image in full sequence"); + + if(GP->addhdr){ // add records from server-side files + char **nxtfile = GP->addhdr; + while(*nxtfile){ + int got = cc_kwfromfile(fp, *nxtfile); + if(got == 0) WARNX(_("Added 0 FITS records from %s"), *nxtfile); + else verbose(VERBOSE_SECONDARY, _("Added %d FITS records from %s"), got, *nxtfile); + ++nxtfile; + } + } + // add these keywords after all to override records from files + if(GP->observers) FORMSTR("OBSERVER", GP->observers, "Observers"); + if(GP->prog_id) FORMSTR("PROG-ID", GP->prog_id, "Observation program identifier"); + if(GP->author) FORMSTR("AUTHOR", GP->author, "Author of the program"); + if(GP->objname) FORMSTR("OBJECT", GP->objname, "Object name"); + // creation date/time int s = 0; fits_write_date(fp, &s); @@ -274,9 +378,8 @@ fits_write_history(fp, bufhdr->buf, &s); //WRITEKEY(fp, TSTRING, "FILE", n, "Input file original name"); if(nbytes == 1) TRYFITS(fits_write_img, fp, TBYTE, 1, width * height, img->data); else TRYFITS(fits_write_img, fp, TUSHORT, 1, width * height, img->data); - if(fitserror) goto cloerr; - TRYFITS(fits_close_file, fp); cloerr: + TRYFITS(fits_close_file, fp); pthread_mutex_unlock(&img->mutex); if(fitserror == 0){ LOGMSG("Save file '%s'", fnam); @@ -289,7 +392,7 @@ cloerr: ret = TRUE; }else{ LOGERR("Can't save %s", fnam); - WARNX(_("Error saving file")); + WARNX(_("Error saving file %s"), fnam); fitserror = 0; } return ret; @@ -357,7 +460,7 @@ cc_Focuser *startFocuser(){ return NULL; }else{ char *plugin = GP->commondev ? GP->commondev : GP->focuserdev; - if(!(focuser = open_focuser(plugin))) return NULL; + if(!(focuser = cc_open_focuser(plugin))) return NULL; } if(!focuser->check()){ verbose(VERBOSE_MESG, _("No focusers found")); @@ -367,6 +470,38 @@ cc_Focuser *startFocuser(){ return focuser; } +/** + * @brief setFocuserNo - set active focuser device number + * @param num - new number + * @param min (o) - minimal position + * @param max (o) - maximal position + * @return FALSE if failed + */ +int setFocuserNo(int num, float *min, float *max){ + if(!focuser) return FALSE; + if(num < 0) num = 0; + if(num > focuser->Ndevices - 1){ + WARNX(_("Found %d focusers, you point number %d"), focuser->Ndevices, num); + LOGERR("Found %d focusers, user pointed number %d", focuser->Ndevices, num); + return FALSE; + } + if(!focuser->setDevNo(num)){ + WARNX(_("Can't set active focuser number")); + LOGERR("Can't set active focuser number"); + return FALSE; + } + LOGMSG("Set focuser device number to %d", num); + if(!focuser->getMinPos || !focuser->getMinPos(&focminpos) || + !focuser->getMaxPos || !focuser->getMaxPos(&focmaxpos)){ + WARNX(_("Can't get focuser limit positions")); + LOGWARN("Can't get focuser limit positions"); + }else{ + if(min) *min = focminpos; + if(max) *max = focmaxpos; + } + return TRUE; +} + void focclose(){ if(!focuser) return; focuser->close(); @@ -387,16 +522,7 @@ void focusers(){ verbose(VERBOSE_PRIMARY, _("Found focuser #%d: %s\n"), i, modname); } } - int num = GP->focdevno; - if(num < 0) num = 0; - if(num > focuser->Ndevices - 1){ - WARNX(_("Found %d focusers, you point number %d"), focuser->Ndevices, num); - goto retn; - } - if(!focuser->setDevNo(num)){ - WARNX(_("Can't set active focuser number")); - goto retn; - } + if(!setFocuserNo(GP->focdevno, NULL, NULL)) goto retn; char buf[BUFSIZ]; if(focuser->getModelName(buf, BUFSIZ)){ verbose(VERBOSE_SECONDARY, "Focuser model: %s", buf); @@ -406,14 +532,10 @@ void focusers(){ verbose(VERBOSE_PRIMARY, "FOCTEMP=%.1f", t); DBG("FOCTEMP=%.1f", t); } - float minpos, maxpos, curpos; - if(!focuser->getMinPos(&minpos) || !focuser->getMaxPos(&maxpos)){ - WARNX(_("Can't get focuser limit positions")); - goto retn; - } - verbose(VERBOSE_PRIMARY, "FOCMINPOS=%g", minpos); - verbose(VERBOSE_PRIMARY, "FOCMAXPOS=%g", maxpos); - DBG("FOCMINPOS=%g, FOCMAXPOS=%g", minpos, maxpos); + verbose(VERBOSE_PRIMARY, "FOCMINPOS=%g", focminpos); + verbose(VERBOSE_PRIMARY, "FOCMAXPOS=%g", focmaxpos); + float curpos; + DBG("FOCMINPOS=%g, FOCMAXPOS=%g", focminpos, focmaxpos); if(!focuser->getPos(&curpos)){ WARNX(_("Can't get current focuser position")); goto retn; @@ -428,11 +550,11 @@ void focusers(){ tagpos = curpos + GP->addsteps; } DBG("tagpos: %g", tagpos); - if(tagpos < minpos || tagpos > maxpos){ - WARNX(_("Can't set position %g: out of limits [%g, %g]"), tagpos, minpos, maxpos); + if(tagpos < focminpos || tagpos > focmaxpos){ + WARNX(_("Can't set position %g: out of limits [%g, %g]"), tagpos, focminpos, focmaxpos); goto retn; } - if(tagpos - minpos < __FLT_EPSILON__){ + if(tagpos - focminpos < __FLT_EPSILON__){ if(!focuser->home(GP->async)) WARNX(_("Can't home focuser")); }else{ if(!focuser->setAbsPos(GP->async, tagpos)) WARNX(_("Can't set position %g"), tagpos); @@ -447,7 +569,7 @@ cc_Wheel *startWheel(){ return NULL; }else{ char *plugin = GP->commondev ? GP->commondev : GP->wheeldev; - if(!(wheel = open_wheel(plugin))) return NULL; + if(!(wheel = cc_open_wheel(plugin))) return NULL; } if(!wheel->check()){ verbose(VERBOSE_MESG, _("No wheels found")); @@ -457,6 +579,35 @@ cc_Wheel *startWheel(){ return wheel; } +/** + * @brief setWheelNo - set number of active wheel + * @param num - number + * @param max (o) - if !NULL - maxpos + * @return FALSE if failed + */ +int setWheelNo(int num, int *max){ + if(!wheel) return FALSE; + if(num < 0) num = 0; + if(num > wheel->Ndevices - 1){ + WARNX(_("Found %d wheels, you point number %d"), wheel->Ndevices, num); + LOGERR("Found %d wheels, user pointed number %d", wheel->Ndevices, num); + return FALSE; + } + if(!wheel->setDevNo(num)){ + WARNX(_("Can't set active wheel number")); + LOGERR("Can't set active wheel number"); + return FALSE; + } + LOGMSG("Set wheel device number to %d", num); + if(!wheel->getMaxPos || !wheel->getMaxPos(&wmaxpos)){ + WARNX(_("Can't get max wheel position")); + LOGERR("Can't get max wheel position"); + }else{ + if(max) *max = wmaxpos; + } + return TRUE; +} + void closewheel(){ if(!wheel) return; wheel->close(); @@ -477,16 +628,7 @@ void wheels(){ verbose(VERBOSE_PRIMARY, _("Found wheel #%d: %s\n"), i, modname); } } - int num = GP->whldevno; - if(num < 0) num = 0; - if(num > wheel->Ndevices - 1){ - WARNX(_("Found %d wheels, you point number %d"), wheel->Ndevices, num); - goto retn; - } - if(!wheel->setDevNo(num)){ - WARNX(_("Can't set active wheel number")); - goto retn; - } + if(!setWheelNo(GP->whldevno, NULL)) goto retn; char buf[BUFSIZ]; if(wheel->getModelName(buf, BUFSIZ)){ verbose(VERBOSE_SECONDARY, _("Wheel model: %s"), buf); @@ -495,19 +637,15 @@ void wheels(){ if(wheel->getTbody(&t)){ verbose(VERBOSE_PRIMARY, "WHEELTEMP=%.1f", t); } - int pos, maxpos; + int pos; if(wheel->getPos(&pos)){ verbose(VERBOSE_PRIMARY, "WHEELPOS=%d", pos); }else WARNX(_("Can't get current wheel position")); - if(!wheel->getMaxPos(&maxpos)){ - WARNX(_("Can't get max wheel position")); - goto retn; - } - verbose(VERBOSE_PRIMARY, "WHEELMAXPOS=%d", maxpos); + verbose(VERBOSE_PRIMARY, "WHEELMAXPOS=%d", wmaxpos); pos = GP->setwheel; if(pos == -1) goto retn; // no wheel commands - if(pos < 0 || pos > maxpos){ - WARNX(_("Wheel position should be from 0 to %d"), maxpos); + if(pos < 0 || pos > wmaxpos){ + WARNX(_("Wheel position should be from 0 to %d"), wmaxpos); goto retn; } if(!wheel->setPos(pos)) @@ -551,7 +689,7 @@ cc_Camera *startCCD(){ return NULL; }else{ char *plugin = GP->commondev ? GP->commondev : GP->cameradev; - if(!(camera = open_camera(plugin))) return NULL; + if(!(camera = cc_open_camera(plugin))) return NULL; } if(!camera->check()){ WARNX(_("No cameras found")); @@ -753,6 +891,46 @@ retn: return rtn; } +void fill_image_fields(cc_IMG *ima){ + if(!ima) return; + ima->gotstat = 0; // fresh image without statistics - recalculate when save + ima->timestamp = sl_dtime(); // set timestamp + if(!camera->getgain || !camera->getgain(&ima->gain)) ima->gain = NAN; + if(!camera->getbrightness || !camera->getbrightness(&ima->brightness)) ima->brightness = NAN; + if(!camera->getTcold || !camera->getTcold(&ima->ccd_temp)){ + DBG("Can't get CCD temperature"); + ima->ccd_temp = NAN; + }else DBG("CCD Temperature=%g", ima->ccd_temp); + if(!camera->getTbody || !camera->getTbody(&ima->tbody)){ + DBG("Can't get body temperature"); + ima->tbody = NAN; + }else DBG("Body Temperature=%g", ima->tbody); + if(!camera->getThot || !camera->getThot(&ima->thot)){ + DBG("Can't get Thot"); + ima->thot = NAN; + }else DBG("Hot Temperature=%g", ima->thot); + ima->flags.dark = GP->dark; + ima->field = camera->field; + ima->array = camera->array; + ima->geometry = camera->geometry; + DBG("Geom: off(%d, %d), size(%d, %d)", ima->geometry.xoff, ima->geometry.yoff, + ima->geometry.w, ima->geometry.h); + if(wheel){ + int i; + ima->flags.havewheel = 1; + if(wheel->getPos(&i)) ima->wheelpos = (uint8_t) i; + ima->wheelmax = wmaxpos; + if(!wheel->getTbody || !wheel->getTbody(&ima->wheel_temp)) ima->wheel_temp = NAN; + } + if(focuser){ + ima->flags.havefocuser = 1; + ima->focmin = focminpos; + ima->focmax = focmaxpos; + if(!focuser->getPos || !focuser->getPos(&ima->focpos)) ima->focpos = NAN; + if(!focuser->getTbody || !focuser->getTbody(&ima->foc_temp)) ima->foc_temp = NAN; + } +} + /* * Main CCD process in standalone mode without viewer: get N images and save them */ diff --git a/ccdfunc.h b/ccdfunc.h index 971a136..07c6fac 100644 --- a/ccdfunc.h +++ b/ccdfunc.h @@ -29,12 +29,15 @@ int saveFITS(cc_IMG *img, char **outp); // for imageview module void focusers(); void wheels(); int prepare_ccds(); +void fill_image_fields(cc_IMG *ima); void ccds(); void camstop(); cc_Camera *startCCD(); cc_Wheel *startWheel(); +int setWheelNo(int num, int *max); cc_Focuser *startFocuser(); +int setFocuserNo(int num, float *min, float *max); void focclose(); void closewheel(); void closecam(); diff --git a/client.c b/client.c index afd4666..30d6fad 100644 --- a/client.c +++ b/client.c @@ -263,6 +263,7 @@ static void send_headers(int sock){ if(GP->dark) SENDMSGW(CC_CMD_DARK, "=1"); else SENDMSGW(CC_CMD_DARK, "=0"); } +#if 0 // FITS header keywords: #define CHKHDR(x, cmd) do{if(x) SENDMSG(cmd "=%s", x);}while(0) CHKHDR(GP->author, CC_CMD_AUTHOR); @@ -272,6 +273,7 @@ static void send_headers(int sock){ CHKHDR(GP->prog_id, CC_CMD_PROGRAM); CHKHDR(GP->objtype, CC_CMD_OBJTYPE); #undef CHKHDR +#endif } /** @@ -407,7 +409,7 @@ static int getsockimage(int *imsock){ * @param askheader == TRUE for storing FITS-header * @return FALSE if failed to catch image */ -static int getimage(int askheader){ +static int getimage(/*int askheader*/){ FNAME(); int imsock = -1, shmlocked = FALSE, ret = FALSE; static double oldtimestamp = -1.; @@ -434,6 +436,7 @@ static int getimage(int askheader){ oldtimestamp = locima->timestamp; atomic_store(&grabno, locima->imnumber); TIMESTAMP("Got image #%zd", locima->imnumber); +#if 0 if(askheader){ // read FITS-header for later saving if(shmima){ if(locima->headerstrings > FITS_HEADER_STRINGS_MAX){ @@ -463,6 +466,7 @@ static int getimage(int askheader){ } } }else locima->headerstrings = 0; +#endif }else WARNX(_("Still got old image")); eofg: if(imsock > -1) close(imsock); // reopen in next time in case of error @@ -549,7 +553,7 @@ void client(int sock){ if(lastImNo != cur){ lastImNo = cur; verbose(VERBOSE_SECONDARY, _("Frame ready, try to grab")); - if(!getimage(TRUE)){ + if(!getimage(/*TRUE*/)){ WARNX(_("Can't get next image")); }else{ if(saveFITS(locima, &lastfilename)){ @@ -640,7 +644,7 @@ static void *grabnext(void _U_ *arg){ } lastImNo = cur; TIMESTAMP("Frame ready (%d from start)", cur); - getimage(FALSE); + getimage(/*FALSE*/); } return NULL; } @@ -667,7 +671,7 @@ static void *waitimage(void _U_ *arg){ lastImNo = cur; TIMESTAMP("End of cycle #%d, start new", cur); TIMEINIT(); - getimage(FALSE); + getimage(/*FALSE*/); atomic_store(&expstate, CAMERA_IDLE); DBG("Current state: %d", atomic_load(&expstate)); } diff --git a/imageview.c b/imageview.c index 8f67f28..3b7613f 100644 --- a/imageview.c +++ b/imageview.c @@ -1,4 +1,4 @@ -/* + /* * This file is part of the CCD_Capture project. * Copyright 2022 Edward V. Emelianov . * diff --git a/locale/ru/LC_MESSAGES/ccd_capture.mo b/locale/ru/LC_MESSAGES/ccd_capture.mo index 198f5c32cc53c6fbef38149abdf963aec30490ff..976c0c0303223ba2a935027eaf24d5f8d8226edf 100644 GIT binary patch literal 24522 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 bYKBGkF8VnxdTjB?_-JMG2XS`h^85b-hLfY2 diff --git a/locale/ru/messages.po b/locale/ru/messages.po index 75441c9..ff9df5b 100644 --- a/locale/ru/messages.po +++ b/locale/ru/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-21 09:39+0300\n" +"POT-Creation-Date: 2026-07-23 17:35+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,57 +17,57 @@ msgstr "" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" -#: main.c:52 +#: main.c:55 #, c-format msgid "Master killed with sig=%d" msgstr "" #. slave: cancel exposition -#: main.c:57 +#: main.c:60 #, c-format msgid "Get signal %d - exit" msgstr "" -#: main.c:88 +#: main.c:91 msgid "Can't use outfile name and prefix together" msgstr "" -#: main.c:91 ccdfunc.c:214 +#: main.c:94 ccdfunc.c:222 #, c-format msgid "File %s exists!" msgstr "" -#: main.c:94 +#: main.c:97 #, c-format msgid "Can't set answer timeout to %g" msgstr "" -#: main.c:98 +#: main.c:101 msgid "" "Options `port` and `path` can't be used together! Point `port` for TCP " "socket or `path` for UNIX." msgstr "" -#: main.c:103 +#: main.c:106 #, c-format msgid "Wrong port value: %d" msgstr "" -#: main.c:116 +#: main.c:119 #, c-format msgid "Set image port to %s\n" msgstr "" -#: main.c:119 +#: main.c:122 msgid "Can't be client and standalone in same time!" msgstr "" -#: main.c:124 +#: main.c:127 #, c-format msgid "Log file %s @ level %d\n" msgstr "" -#: main.c:126 +#: main.c:129 msgid "Can't create log file" msgstr "" @@ -331,411 +331,422 @@ msgstr "" msgid "%d unused parameters:\n" msgstr "" -#: ccdfunc.c:203 +#: ccdfunc.c:211 msgid "Image not saved: neither filename nor filename prefix pointed" msgstr "" -#: ccdfunc.c:221 +#: ccdfunc.c:230 #, c-format msgid "Can't save file with prefix %s" msgstr "" -#: ccdfunc.c:283 +#: ccdfunc.c:347 +#, c-format +msgid "Added 0 FITS records from %s" +msgstr "" + +#: ccdfunc.c:348 +#, c-format +msgid "Added %d FITS records from %s" +msgstr "" + +#: ccdfunc.c:386 #, c-format msgid "File saved as '%s'" msgstr "" -#: ccdfunc.c:292 -msgid "Error saving file" +#: ccdfunc.c:395 +#, c-format +msgid "Error saving file %s" msgstr "" -#: ccdfunc.c:347 +#: ccdfunc.c:450 #, c-format msgid "Image stat:\n" msgstr "" -#: ccdfunc.c:356 +#: ccdfunc.c:459 msgid "Focuser device not pointed" msgstr "" -#: ccdfunc.c:363 +#: ccdfunc.c:466 msgid "No focusers found" msgstr "" -#: ccdfunc.c:387 -#, c-format -msgid "Found focuser #%d: %s\n" -msgstr "" - -#: ccdfunc.c:393 +#: ccdfunc.c:484 #, c-format msgid "Found %d focusers, you point number %d" msgstr "" -#: ccdfunc.c:397 +#: ccdfunc.c:489 msgid "Can't set active focuser number" msgstr "" -#: ccdfunc.c:411 +#: ccdfunc.c:496 msgid "Can't get focuser limit positions" msgstr "" -#: ccdfunc.c:418 +#: ccdfunc.c:522 +#, c-format +msgid "Found focuser #%d: %s\n" +msgstr "" + +#: ccdfunc.c:540 msgid "Can't get current focuser position" msgstr "" -#: ccdfunc.c:432 +#: ccdfunc.c:554 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "" -#: ccdfunc.c:436 +#: ccdfunc.c:558 msgid "Can't home focuser" msgstr "" -#: ccdfunc.c:438 +#: ccdfunc.c:560 #, c-format msgid "Can't set position %g" msgstr "" -#: ccdfunc.c:446 +#: ccdfunc.c:568 msgid "Wheel device not pointed" msgstr "" -#: ccdfunc.c:453 +#: ccdfunc.c:575 msgid "No wheels found" msgstr "" -#: ccdfunc.c:477 -#, c-format -msgid "Found wheel #%d: %s\n" -msgstr "" - -#: ccdfunc.c:483 +#: ccdfunc.c:592 #, c-format msgid "Found %d wheels, you point number %d" msgstr "" -#: ccdfunc.c:487 +#: ccdfunc.c:597 msgid "Can't set active wheel number" msgstr "" -#: ccdfunc.c:492 -#, c-format -msgid "Wheel model: %s" -msgstr "" - -#: ccdfunc.c:501 -msgid "Can't get current wheel position" -msgstr "" - -#: ccdfunc.c:503 +#: ccdfunc.c:603 msgid "Can't get max wheel position" msgstr "" -#: ccdfunc.c:510 -#, c-format -msgid "Wheel position should be from 0 to %d" -msgstr "" - -#: ccdfunc.c:514 -#, c-format -msgid "Can't set wheel position %d" -msgstr "" - -#: ccdfunc.c:529 -msgid "Camera plugin have no capture polling funtion." -msgstr "" - -#: ccdfunc.c:535 -#, c-format -msgid "%.1f seconds till exposition ends" -msgstr "" - -#: ccdfunc.c:550 -msgid "Camera device not pointed" -msgstr "" - -#: ccdfunc.c:557 ccdfunc.c:558 -msgid "No cameras found" -msgstr "" - -#: ccdfunc.c:578 -msgid "Camera plugin have no model name getter" -msgstr "" - -#: ccdfunc.c:583 -#, c-format -msgid "Found camera #%d: %s\n" -msgstr "" - -#: ccdfunc.c:589 -#, c-format -msgid "Found %d cameras, you point number %d" -msgstr "" - -#: ccdfunc.c:593 -msgid "Can't set active camera number" -msgstr "" - -#: ccdfunc.c:599 -msgid "Camera plugin have no custom commands" -msgstr "" - -#: ccdfunc.c:608 ccdfunc.c:611 -#, c-format -msgid "Command '%s'" -msgstr "" - -#: ccdfunc.c:613 -#, c-format -msgid " returns \"%s\"" -msgstr "" - -#: ccdfunc.c:624 -msgid "Camera plugin have no fun speed setter" -msgstr "" - -#: ccdfunc.c:627 -msgid "Can't set fan speed" -msgstr "" - #: ccdfunc.c:628 #, c-format -msgid "Set fan speed to %d" -msgstr "" - -#: ccdfunc.c:633 -#, c-format -msgid "Camera model: %s" +msgid "Found wheel #%d: %s\n" msgstr "" #: ccdfunc.c:634 #, c-format +msgid "Wheel model: %s" +msgstr "" + +#: ccdfunc.c:643 +msgid "Can't get current wheel position" +msgstr "" + +#: ccdfunc.c:648 +#, c-format +msgid "Wheel position should be from 0 to %d" +msgstr "" + +#: ccdfunc.c:652 +#, c-format +msgid "Can't set wheel position %d" +msgstr "" + +#: ccdfunc.c:667 +msgid "Camera plugin have no capture polling funtion." +msgstr "" + +#: ccdfunc.c:673 +#, c-format +msgid "%.1f seconds till exposition ends" +msgstr "" + +#: ccdfunc.c:688 +msgid "Camera device not pointed" +msgstr "" + +#: ccdfunc.c:695 ccdfunc.c:696 +msgid "No cameras found" +msgstr "" + +#: ccdfunc.c:716 +msgid "Camera plugin have no model name getter" +msgstr "" + +#: ccdfunc.c:721 +#, c-format +msgid "Found camera #%d: %s\n" +msgstr "" + +#: ccdfunc.c:727 +#, c-format +msgid "Found %d cameras, you point number %d" +msgstr "" + +#: ccdfunc.c:731 +msgid "Can't set active camera number" +msgstr "" + +#: ccdfunc.c:737 +msgid "Camera plugin have no custom commands" +msgstr "" + +#: ccdfunc.c:746 ccdfunc.c:749 +#, c-format +msgid "Command '%s'" +msgstr "" + +#: ccdfunc.c:751 +#, c-format +msgid " returns \"%s\"" +msgstr "" + +#: ccdfunc.c:762 +msgid "Camera plugin have no fun speed setter" +msgstr "" + +#: ccdfunc.c:765 +msgid "Can't set fan speed" +msgstr "" + +#: ccdfunc.c:766 +#, c-format +msgid "Set fan speed to %d" +msgstr "" + +#: ccdfunc.c:771 +#, c-format +msgid "Camera model: %s" +msgstr "" + +#: ccdfunc.c:772 +#, c-format msgid "Pixel size: %g x %g" msgstr "" -#: ccdfunc.c:640 +#: ccdfunc.c:778 #, c-format msgid "Full array: %s" msgstr "" -#: ccdfunc.c:643 +#: ccdfunc.c:781 #, c-format msgid "Field of view: %s" msgstr "" -#: ccdfunc.c:646 +#: ccdfunc.c:784 #, c-format msgid "Current format: %s" msgstr "" -#: ccdfunc.c:649 +#: ccdfunc.c:787 #, c-format msgid "Maximal geometry (WxH): %dx%d" msgstr "" -#: ccdfunc.c:650 +#: ccdfunc.c:788 #, c-format msgid "Minimal offset: %dx%d" msgstr "" -#: ccdfunc.c:651 +#: ccdfunc.c:789 #, c-format msgid "Geometry steps: offset - %dx%d, size - %dx%d" msgstr "" -#: ccdfunc.c:655 +#: ccdfunc.c:793 #, c-format msgid "Current binning: %d x %d" msgstr "" -#: ccdfunc.c:658 +#: ccdfunc.c:796 #, c-format msgid "Current settings: %d bits per pixel" msgstr "" -#: ccdfunc.c:661 +#: ccdfunc.c:799 #, c-format msgid "Current brightness: %g" msgstr "" -#: ccdfunc.c:663 +#: ccdfunc.c:801 #, c-format msgid "Current gain: %g" msgstr "" -#: ccdfunc.c:665 +#: ccdfunc.c:803 #, c-format msgid "Maximal gain: %g" msgstr "" -#: ccdfunc.c:667 +#: ccdfunc.c:805 msgid "Camera plugin have no temperature setter" msgstr "" -#: ccdfunc.c:668 +#: ccdfunc.c:806 #, c-format msgid "Can't set T to %g degC" msgstr "" -#: ccdfunc.c:676 +#: ccdfunc.c:814 #, c-format msgid "Shutter command: %s\n" msgstr "" -#: ccdfunc.c:678 +#: ccdfunc.c:816 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "" -#: ccdfunc.c:681 +#: ccdfunc.c:819 #, c-format msgid "Try to configure I/O port as %d" msgstr "" -#: ccdfunc.c:683 +#: ccdfunc.c:821 msgid "Can't configure (unsupported?)" msgstr "" -#: ccdfunc.c:689 +#: ccdfunc.c:827 msgid "Can't get IOport state (unsupported?)" msgstr "" -#: ccdfunc.c:692 +#: ccdfunc.c:830 #, c-format msgid "Try to write %d to I/O port" msgstr "" -#: ccdfunc.c:694 +#: ccdfunc.c:832 msgid "Can't set IOport" msgstr "" -#: ccdfunc.c:701 +#: ccdfunc.c:839 #, c-format msgid "Set gain to %g" msgstr "" -#: ccdfunc.c:702 +#: ccdfunc.c:840 #, c-format msgid "Can't set gain to %g" msgstr "" -#: ccdfunc.c:707 +#: ccdfunc.c:845 #, c-format msgid "Set brightness to %g" msgstr "" -#: ccdfunc.c:708 +#: ccdfunc.c:846 #, c-format msgid "Can't set brightness to %g" msgstr "" -#: ccdfunc.c:714 server.c:353 +#: ccdfunc.c:852 server.c:380 #, c-format msgid "Can't set binning %dx%d" msgstr "" -#: ccdfunc.c:726 server.c:354 +#: ccdfunc.c:864 server.c:381 msgid "Can't set given geometry" msgstr "" -#: ccdfunc.c:730 +#: ccdfunc.c:868 #, c-format msgid "Can't set %d flushes" msgstr "" -#: ccdfunc.c:733 +#: ccdfunc.c:871 msgid "Camera plugin have no exposition setter" msgstr "" -#: ccdfunc.c:735 +#: ccdfunc.c:873 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "" -#: ccdfunc.c:738 +#: ccdfunc.c:876 msgid "Can't change frame type" msgstr "" -#: ccdfunc.c:741 +#: ccdfunc.c:879 msgid "Can't set bit depth" msgstr "" -#: ccdfunc.c:743 +#: ccdfunc.c:881 msgid "Can't set readout speed" msgstr "" -#: ccdfunc.c:744 +#: ccdfunc.c:882 #, c-format msgid "Readout mode: %s" msgstr "" -#: ccdfunc.c:745 +#: ccdfunc.c:883 msgid "Only show statistics" msgstr "" -#: ccdfunc.c:748 +#: ccdfunc.c:886 msgid "Can't get current binning" msgstr "" -#: ccdfunc.c:773 +#: ccdfunc.c:951 #, c-format msgid "Capture frame %d" msgstr "" -#: ccdfunc.c:774 ccdfunc.c:852 server.c:203 +#: ccdfunc.c:952 ccdfunc.c:1030 server.c:230 msgid "Camera plugin have no function `start exposition`" msgstr "" -#: ccdfunc.c:776 ccdfunc.c:854 server.c:208 +#: ccdfunc.c:954 ccdfunc.c:1032 server.c:235 msgid "Can't start exposition" msgstr "" -#: ccdfunc.c:781 +#: ccdfunc.c:959 msgid "Can't capture image" msgstr "" -#: ccdfunc.c:784 +#: ccdfunc.c:962 msgid "Read grabbed image" msgstr "" -#: ccdfunc.c:786 ccdfunc.c:865 server.c:239 +#: ccdfunc.c:964 ccdfunc.c:1043 server.c:269 msgid "Camera plugin have no function `capture`" msgstr "" -#: ccdfunc.c:788 ccdfunc.c:866 +#: ccdfunc.c:966 ccdfunc.c:1044 msgid "Can't grab image" msgstr "" -#: ccdfunc.c:802 client.c:573 +#: ccdfunc.c:980 client.c:577 #, c-format msgid "%d seconds till pause ends\n" msgstr "" #. for(int i = 0; i < NFRM; ++i) printf("last[%d]=%g\n", i, lastn[i]); -#: ccdfunc.c:837 +#: ccdfunc.c:1015 #, c-format msgid "Framerate=%.2f (%g seconds for exp); mean framerate=%.2f" msgstr "" -#: ccdfunc.c:863 +#: ccdfunc.c:1041 msgid "Some error when capture" msgstr "" -#: ccdfunc.c:904 +#: ccdfunc.c:1082 msgid "Can't create grabbing thread" msgstr "" -#: ccdfunc.c:935 +#: ccdfunc.c:1113 msgid "Point network port or UNIX-socket path" msgstr "" -#: ccdfunc.c:939 +#: ccdfunc.c:1117 msgid "start_socket(): can't open socket" msgstr "" -#: ccdfunc.c:948 +#: ccdfunc.c:1126 msgid "Need exposition time!" msgstr "" @@ -747,51 +758,51 @@ msgstr "" msgid "Can't allocate memory for image" msgstr "" -#: server.c:216 +#: server.c:243 msgid "Camera disconnected" msgstr "" -#: server.c:222 +#: server.c:249 msgid "Something's wrong with camera" msgstr "" -#: server.c:270 +#: server.c:297 msgid "No camera device" msgstr "" -#: server.c:1092 +#: server.c:1099 msgid "server(): need at least command socket fd" msgstr "" -#: server.c:1093 +#: server.c:1100 msgid "Server run without image transport socket" msgstr "" -#: server.c:1115 +#: server.c:1131 msgid "No devices found" msgstr "" -#: server.c:1160 +#: server.c:1176 msgid "Client wants an image, but there's no data" msgstr "" -#: server.c:1189 +#: server.c:1205 msgid "Limit of connections reached" msgstr "" -#: server.c:1258 +#: server.c:1274 #, c-format msgid "Can't create %s" msgstr "" -#: server.c:1294 +#: server.c:1310 msgid "Can't lock mutex" msgstr "" #. send message and wait any answer #. send message and wait answer starting with 'cmd' #. send command and wait for answer on it -#: client.c:42 client.c:44 client.c:46 client.c:288 +#: client.c:42 client.c:44 client.c:46 client.c:290 msgid "Server disconnected" msgstr "" @@ -811,86 +822,87 @@ msgstr "" msgid "Send custom plugin commands\n" msgstr "" -#: client.c:340 +#: client.c:342 msgid "Can't lock shared memory" msgstr "" -#: client.c:359 +#: client.c:361 msgid "Can't open image transport socket" msgstr "" -#: client.c:365 +#: client.c:367 msgid "Can't read image header over socket" msgstr "" -#: client.c:398 client.c:428 +#: client.c:400 client.c:430 msgid "Can't read image data" msgstr "" -#: client.c:440 +#: client.c:443 msgid "Too many FITS headers, truncating" msgstr "" -#: client.c:451 +#: client.c:454 #, c-format msgid "Can't read full header, got %zd records from %zd" msgstr "" -#: client.c:466 +#: client.c:470 msgid "Still got old image" msgstr "" -#: client.c:491 client.c:591 +#: client.c:495 client.c:595 msgid "Can't run without command socket" msgstr "" -#: client.c:510 +#: client.c:514 msgid "Exposing frame 1..." msgstr "" -#: client.c:512 +#: client.c:516 msgid "Wait for exposition end" msgstr "" -#: client.c:531 +#: client.c:535 msgid "Can't make exposition" msgstr "" #. start next capture #. last image -> should re-expose -#: client.c:533 client.c:544 client.c:563 +#: client.c:537 client.c:548 client.c:567 #, c-format msgid "Exposing frame %d..." msgstr "" -#: client.c:551 +#: client.c:555 msgid "Frame ready, try to grab" msgstr "" -#: client.c:553 +#. TRUE +#: client.c:557 msgid "Can't get next image" msgstr "" -#: client.c:561 +#: client.c:565 msgid "Got already saved image, wait next" msgstr "" -#: client.c:585 +#: client.c:589 msgid "Server timeout" msgstr "" -#: client.c:636 +#: client.c:640 msgid "Camera in error state" msgstr "" -#: client.c:638 +#: client.c:642 #, c-format msgid "" "Image wasn't received, state: %d, waiting: %g, lastNo: %d, curNo: %d " "(timeout: %g)" msgstr "" -#: client.c:698 client.c:705 +#: client.c:702 client.c:709 msgid "Can't create capturing thread" msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index f7f05fe..47df857 100644 --- a/locale/ru/ru.po +++ b/locale/ru/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2026-07-21 09:39+0300\n" + "POT-Creation-Date: 2026-07-23 17:35+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,17 +16,17 @@ msgstr "Project-Id-Version: PACKAGE VERSION\n" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" -#: ccdfunc.c:613 +#: ccdfunc.c:751 #, c-format msgid " returns \"%s\"" -msgstr "" +msgstr " возвращает \"%s\"" -#: ccdfunc.c:535 +#: ccdfunc.c:673 #, c-format msgid "%.1f seconds till exposition ends" msgstr "%.1f секунд до окончания экспозиции" -#: ccdfunc.c:802 client.c:573 +#: ccdfunc.c:980 client.c:577 #, c-format msgid "%d seconds till pause ends\n" msgstr "%d секунд до окончания паузы\n" @@ -34,7 +34,17 @@ msgstr "%d #: cmdlnopts.c:160 #, c-format msgid "%d unused parameters:\n" -msgstr "" +msgstr "%d неиспользуемых параметров:\n" + +#: ccdfunc.c:348 +#, c-format +msgid "Added %d FITS records from %s" +msgstr "Добавлено %d записей FITS из %s" + +#: ccdfunc.c:347 +#, c-format +msgid "Added 0 FITS records from %s" +msgstr "Добавлено 0 записей FITS из %s" #: imageview.c:51 msgid "Already initialized!" @@ -48,144 +58,132 @@ msgstr " msgid "CMOS gain level" msgstr "уровень Gain CMOS" -#: ccdfunc.c:550 +#: ccdfunc.c:688 msgid "Camera device not pointed" msgstr "Устройство свеоприемника не подключено" -#: server.c:216 +#: server.c:243 #, fuzzy msgid "Camera disconnected" msgstr "Таймаут сервера" -#: client.c:636 +#: client.c:640 msgid "Camera in error state" -msgstr "" +msgstr "Камера в состоянии ошибки" -#: ccdfunc.c:633 +#: ccdfunc.c:771 #, c-format msgid "Camera model: %s" msgstr "Модель светоприемника: %s" -#: ccdfunc.c:529 -#, fuzzy +#: ccdfunc.c:667 msgid "Camera plugin have no capture polling funtion." -msgstr "У плагина камеры нет особых команд" +msgstr "У плагина камеры нет функции захвата изображений" -#: ccdfunc.c:599 +#: ccdfunc.c:737 msgid "Camera plugin have no custom commands" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:733 -#, fuzzy +#: ccdfunc.c:871 msgid "Camera plugin have no exposition setter" -msgstr "У плагина камеры нет особых команд" +msgstr "У плагина камеры нет сеттера экспозиции" -#: ccdfunc.c:624 +#: ccdfunc.c:762 #, fuzzy msgid "Camera plugin have no fun speed setter" -msgstr "У плагина камеры нет особых команд" +msgstr "У плагина камеры нет сеттера скорости вентилятора" -#: ccdfunc.c:786 ccdfunc.c:865 server.c:239 -#, fuzzy +#: ccdfunc.c:964 ccdfunc.c:1043 server.c:269 msgid "Camera plugin have no function `capture`" -msgstr "У плагина камеры нет особых команд" +msgstr "У плагина камеры нет функции `capture`" -#: ccdfunc.c:774 ccdfunc.c:852 server.c:203 -#, fuzzy +#: ccdfunc.c:952 ccdfunc.c:1030 server.c:230 msgid "Camera plugin have no function `start exposition`" -msgstr "У плагина камеры нет особых команд" +msgstr "У плагина камеры нет функции `start exposition`" -#: ccdfunc.c:578 -#, fuzzy +#: ccdfunc.c:716 msgid "Camera plugin have no model name getter" -msgstr "У плагина камеры нет особых команд" +msgstr "У плагина камеры нет геттера названия модели" -#: ccdfunc.c:667 -#, fuzzy +#: ccdfunc.c:805 msgid "Camera plugin have no temperature setter" -msgstr "У плагина камеры нет особых команд" +msgstr "У плагина камеры нет сеттера температуры" #: client.c:124 -#, fuzzy msgid "Can't allocate buffer" msgstr "Не могу захватить изображение" #: server.c:167 -#, fuzzy msgid "Can't allocate memory for image" -msgstr "Не могу захватить изображение" +msgstr "Не могу выделить память для изображения" -#: main.c:119 +#: main.c:122 msgid "Can't be client and standalone in same time!" -msgstr "" +msgstr "Не могу одновременно быть клиентом и самостоятельным приложением!" -#: ccdfunc.c:781 +#: ccdfunc.c:959 msgid "Can't capture image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:738 +#: ccdfunc.c:876 msgid "Can't change frame type" msgstr "Не могу изменить тип кадра" -#: ccdfunc.c:683 +#: ccdfunc.c:821 msgid "Can't configure (unsupported?)" msgstr "Не могу сконфигурировать (опция не поддерживается?)" -#: server.c:1258 -#, fuzzy, c-format +#: server.c:1274 +#, c-format msgid "Can't create %s" -msgstr "Не могу захватить изображение" +msgstr "Не могу создать %s" -#: client.c:698 client.c:705 -#, fuzzy +#: client.c:702 client.c:709 msgid "Can't create capturing thread" -msgstr "Не могу захватить изображение" +msgstr "Не могу создать поток захвата изображений" -#: ccdfunc.c:904 -#, fuzzy +#: ccdfunc.c:1082 msgid "Can't create grabbing thread" -msgstr "Не могу установить Gain в %g" +msgstr "Не могу создать поток захвата" -#: main.c:126 -#, fuzzy +#: main.c:129 msgid "Can't create log file" -msgstr "Не могу захватить изображение" +msgstr "Не могу создать лог-файл" -#: ccdfunc.c:689 +#: ccdfunc.c:827 msgid "Can't get IOport state (unsupported?)" msgstr "Не могу получить состояние порта I/O (не поддерживается?)" -#: ccdfunc.c:748 +#: ccdfunc.c:886 msgid "Can't get current binning" msgstr "Не могу получить текущее значение биннинга" -#: ccdfunc.c:418 +#: ccdfunc.c:540 msgid "Can't get current focuser position" msgstr "Не могу определить текущую позицию фокусера" -#: ccdfunc.c:501 -#, fuzzy +#: ccdfunc.c:643 msgid "Can't get current wheel position" -msgstr "Не могу определить текущую позицию фокусера" +msgstr "Не могу определить текущую позицию турели" -#: ccdfunc.c:411 +#: ccdfunc.c:496 msgid "Can't get focuser limit positions" msgstr "Не могу определить предельную позицию фокусера" -#: ccdfunc.c:503 +#: ccdfunc.c:603 msgid "Can't get max wheel position" -msgstr "Не могу определить предельную позицию колеса" +msgstr "Не могу определить предельную позицию турели" -#: client.c:553 -#, fuzzy +#. TRUE +#: client.c:557 msgid "Can't get next image" -msgstr "Не могу захватить изображение" +msgstr "Не могу получить очередное изображение" -#: ccdfunc.c:788 ccdfunc.c:866 +#: ccdfunc.c:966 ccdfunc.c:1044 msgid "Can't grab image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:436 +#: ccdfunc.c:558 msgid "Can't home focuser" msgstr "Не могу установить фокусер в нуль" @@ -193,17 +191,15 @@ msgstr " msgid "Can't init mutex!" msgstr "Не могу инициализировать мьютекс!" -#: server.c:1294 -#, fuzzy +#: server.c:1310 msgid "Can't lock mutex" -msgstr "Не могу инициализировать мьютекс!" +msgstr "Не могу заблокировать мьютекс" -#: client.c:340 -#, fuzzy +#: client.c:342 msgid "Can't lock shared memory" -msgstr "Не могу захватить изображение" +msgstr "Не могу заблокировать разделяемую память" -#: client.c:531 +#: client.c:535 msgid "Can't make exposition" msgstr "Не могу выполнить экспозицию" @@ -211,282 +207,278 @@ msgstr " msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr "Не могу открыть окно OpenGL, отображение будет недоступно" -#: client.c:359 -#, fuzzy +#: client.c:361 msgid "Can't open image transport socket" -msgstr "Не могу сконфигурировать (опция не поддерживается?)" +msgstr "Не могу открыть транспортный сокет" -#: client.c:451 +#: client.c:454 #, c-format msgid "Can't read full header, got %zd records from %zd" -msgstr "" +msgstr "Не могу считать весь залогово, получил лишь %zd записей из %zd" -#: client.c:398 client.c:428 -#, fuzzy +#: client.c:400 client.c:430 msgid "Can't read image data" -msgstr "Не могу захватить изображение" +msgstr "Не могу считать данные изображения" -#: client.c:365 -#, fuzzy +#: client.c:367 msgid "Can't read image header over socket" -msgstr "Не могу захватить изображение" +msgstr "Не могу считать заголовок изображения по сокету" -#: ccdfunc.c:678 +#: ccdfunc.c:816 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "Не могу выполнить команду затвора %s (не поддерживается?)" -#: client.c:491 client.c:591 -#, fuzzy +#: client.c:495 client.c:595 msgid "Can't run without command socket" -msgstr "Не могу выполнить команду затвора %s (не поддерживается?)" +msgstr "Не могу работать без командного сокета" -#: ccdfunc.c:221 +#: ccdfunc.c:230 #, c-format msgid "Can't save file with prefix %s" msgstr "Не могу сохранить файл с префиксом %s" -#: ccdfunc.c:730 +#: ccdfunc.c:868 #, c-format msgid "Can't set %d flushes" msgstr "Не могу установить %d сбросов" -#: ccdfunc.c:694 +#: ccdfunc.c:832 msgid "Can't set IOport" msgstr "Не могу поменять значения порта I/O" -#: ccdfunc.c:668 +#: ccdfunc.c:806 #, c-format msgid "Can't set T to %g degC" msgstr "Не могу установить температуру в %g градЦ" -#: ccdfunc.c:593 +#: ccdfunc.c:731 msgid "Can't set active camera number" msgstr "Не могу установить номер активной камеры" -#: ccdfunc.c:397 +#: ccdfunc.c:489 msgid "Can't set active focuser number" msgstr "Не могу установить номер активного фокусера" -#: ccdfunc.c:487 +#: ccdfunc.c:597 msgid "Can't set active wheel number" msgstr "Не могу установить номер активного колеса" -#: main.c:94 -#, fuzzy, c-format +#: main.c:97 +#, c-format msgid "Can't set answer timeout to %g" -msgstr "Не могу установить Gain в %g" +msgstr "Не могу установить таймаут ответа в %g" -#: ccdfunc.c:714 server.c:353 +#: ccdfunc.c:852 server.c:380 #, c-format msgid "Can't set binning %dx%d" msgstr "Не могу установить биннинг %dx%d" -#: ccdfunc.c:741 +#: ccdfunc.c:879 msgid "Can't set bit depth" msgstr "Не могу установить разрядность АЦП" -#: ccdfunc.c:708 +#: ccdfunc.c:846 #, c-format msgid "Can't set brightness to %g" msgstr "Не могу установить яркость в %g" -#: ccdfunc.c:735 +#: ccdfunc.c:873 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "Не могу установить экспозицию в %f секунд" -#: ccdfunc.c:627 +#: ccdfunc.c:765 msgid "Can't set fan speed" msgstr "Не могу установить скорость вентиляторов" -#: ccdfunc.c:702 +#: ccdfunc.c:840 #, c-format msgid "Can't set gain to %g" -msgstr "Не могу установить Gain в %g" +msgstr "Не могу установить gain в %g" -#: ccdfunc.c:726 server.c:354 +#: ccdfunc.c:864 server.c:381 msgid "Can't set given geometry" msgstr "Не могу установить геометрию" -#: ccdfunc.c:438 +#: ccdfunc.c:560 #, c-format msgid "Can't set position %g" msgstr "Не могу изменить позицию на %g" -#: ccdfunc.c:432 +#: ccdfunc.c:554 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "Не могу установить позицию %g: вне пределов [%g, %g]" -#: ccdfunc.c:743 +#: ccdfunc.c:881 msgid "Can't set readout speed" msgstr "Не могу установить скорость считывания" -#: ccdfunc.c:514 +#: ccdfunc.c:652 #, c-format msgid "Can't set wheel position %d" msgstr "Не могу установить положение колеса %d" -#: ccdfunc.c:776 ccdfunc.c:854 server.c:208 +#: ccdfunc.c:954 ccdfunc.c:1032 server.c:235 msgid "Can't start exposition" msgstr "Не могу начать экспозицию" #: server.c:129 -#, fuzzy msgid "Can't unlock socket mutex" -msgstr "Не могу инициализировать мьютекс!" +msgstr "Не могу разблокировать мьютекс сокета" -#: main.c:88 -#, fuzzy +#: main.c:91 msgid "Can't use outfile name and prefix together" -msgstr "Не могу сохранить файл с префиксом %s" +msgstr "Не могу одновременно использовать имя файла и префикс" -#: ccdfunc.c:773 +#: ccdfunc.c:951 #, c-format msgid "Capture frame %d" msgstr "Захват кадра %d" -#: server.c:1160 +#: server.c:1176 msgid "Client wants an image, but there's no data" -msgstr "" +msgstr "Клиент ждет изображения, но данные отсутствуют" -#: ccdfunc.c:608 ccdfunc.c:611 +#: ccdfunc.c:746 ccdfunc.c:749 #, c-format msgid "Command '%s'" -msgstr "" +msgstr "Команда '%s'" -#: ccdfunc.c:655 -#, fuzzy, c-format +#: ccdfunc.c:793 +#, c-format msgid "Current binning: %d x %d" -msgstr "Не могу установить биннинг %dx%d" +msgstr "Текущий биннинг: %d x %d" -#: ccdfunc.c:661 -#, fuzzy, c-format +#: ccdfunc.c:799 +#, c-format msgid "Current brightness: %g" -msgstr "Установить яркость в %g" +msgstr "Текущая яркость: %g" -#: ccdfunc.c:646 +#: ccdfunc.c:784 #, c-format msgid "Current format: %s" msgstr "Текущий формат: %s" -#: ccdfunc.c:663 -#, fuzzy, c-format +#: ccdfunc.c:801 +#, c-format msgid "Current gain: %g" -msgstr "Текущий формат: %s" +msgstr "Текущий gain: %s" -#: ccdfunc.c:658 +#: ccdfunc.c:796 #, c-format msgid "Current settings: %d bits per pixel" -msgstr "" +msgstr "Текущие настройки: %d бит на пиксель" #: cmdlnopts.c:136 msgid "Display image in OpenGL window" -msgstr "отображение изображения в окне OpenGL" +msgstr "Отображение изображения в окне OpenGL" #: imageview.c:769 #, c-format msgid "Equalization of histogram: %s" msgstr "Эквализация гистограммы: %s" -#: ccdfunc.c:292 -msgid "Error saving file" -msgstr "Ошибка сохранения файла" +#: ccdfunc.c:395 +#, c-format +msgid "Error saving file %s" +msgstr "Ошибка сохранения файла %s" #. start next capture #. last image -> should re-expose -#: client.c:533 client.c:544 client.c:563 +#: client.c:537 client.c:548 client.c:567 #, c-format msgid "Exposing frame %d..." -msgstr "" +msgstr "Экспонирую кадр %d..." -#: client.c:510 +#: client.c:514 msgid "Exposing frame 1..." -msgstr "" +msgstr "Экспонирую кадр 1..." -#: ccdfunc.c:643 +#: ccdfunc.c:781 #, c-format msgid "Field of view: %s" msgstr "Поле зрения: %s" -#: main.c:91 ccdfunc.c:214 +#: main.c:94 ccdfunc.c:222 #, c-format msgid "File %s exists!" -msgstr "" +msgstr "Файл %s существует!" -#: ccdfunc.c:283 +#: ccdfunc.c:386 #, c-format msgid "File saved as '%s'" msgstr "Файл сохранен как '%s'" -#: ccdfunc.c:356 +#: ccdfunc.c:459 msgid "Focuser device not pointed" msgstr "Устройство фокусера не указано" -#: ccdfunc.c:589 +#: ccdfunc.c:727 #, c-format msgid "Found %d cameras, you point number %d" msgstr "Обнаружено %d камер, вы указали %d" -#: ccdfunc.c:393 +#: ccdfunc.c:484 #, c-format msgid "Found %d focusers, you point number %d" msgstr "Обнаружено %d фокусеров, вы указали %d" -#: ccdfunc.c:483 +#: ccdfunc.c:592 #, c-format msgid "Found %d wheels, you point number %d" msgstr "Обнаружено %d колес, вы указали %d" -#: ccdfunc.c:583 +#: ccdfunc.c:721 #, c-format msgid "Found camera #%d: %s\n" -msgstr "" +msgstr "Обнаружена камера номер %d: %s\n" -#: ccdfunc.c:387 +#: ccdfunc.c:522 #, c-format msgid "Found focuser #%d: %s\n" -msgstr "" +msgstr "Обнаружен фокусер номер %d: %s\n" -#: ccdfunc.c:477 +#: ccdfunc.c:628 #, c-format msgid "Found wheel #%d: %s\n" -msgstr "" +msgstr "Обнаружена турель номер %d: %s\n" -#: client.c:551 +#: client.c:555 msgid "Frame ready, try to grab" -msgstr "" +msgstr "Кадр готов, пытаюсь считать" #. for(int i = 0; i < NFRM; ++i) printf("last[%d]=%g\n", i, lastn[i]); -#: ccdfunc.c:837 +#: ccdfunc.c:1015 #, c-format msgid "Framerate=%.2f (%g seconds for exp); mean framerate=%.2f" -msgstr "" +msgstr "%.2f кадров в секунду (%g секунд на экспозицию); средняя скорость " + "%.2f" -#: ccdfunc.c:640 +#: ccdfunc.c:778 #, c-format msgid "Full array: %s" msgstr "Полный формат: %s" -#: ccdfunc.c:651 +#: ccdfunc.c:789 #, c-format msgid "Geometry steps: offset - %dx%d, size - %dx%d" -msgstr "" +msgstr "Шаг измерения геометрии: смещения - %dx%d, размера - %dx%d" #. slave: cancel exposition -#: main.c:57 +#: main.c:60 #, c-format msgid "Get signal %d - exit" -msgstr "" +msgstr "Полуен сигнал %d - выход" -#: client.c:561 +#: client.c:565 msgid "Got already saved image, wait next" -msgstr "" +msgstr "Получил уже сохраненное изображение, жду следующего" #: client.c:157 msgid "Got empty string" -msgstr "" +msgstr "Получил пустую строку" #: imageview.c:427 #, c-format @@ -497,198 +489,197 @@ msgstr " msgid "INET image socket port" msgstr "порт локального сетевого сокета передачи изображения" -#: ccdfunc.c:203 +#: ccdfunc.c:211 msgid "Image not saved: neither filename nor filename prefix pointed" -msgstr "" +msgstr "Изображение не сохранено: не указано ни имени файла, ни префикса" -#: ccdfunc.c:347 +#: ccdfunc.c:450 #, c-format msgid "Image stat:\n" msgstr "Статистика по изображению: \n" -#: client.c:638 +#: client.c:642 #, c-format msgid "Image wasn't received, state: %d, waiting: %g, lastNo: %d, curNo: %d " "(timeout: %g)" -msgstr "" +msgstr "Изображение не было получено. Состояние: %d, ожидание: %g, последний " + "номер: %d, текущий номер: %d (таймаут: %g)" -#: server.c:1189 +#: server.c:1205 msgid "Limit of connections reached" -msgstr "" +msgstr "Достигнут предел количества подключений" -#: main.c:124 +#: main.c:127 #, c-format msgid "Log file %s @ level %d\n" -msgstr "" +msgstr "Лог-файл %s с уровнем %d\n" #. save image #: imageview.c:752 msgid "Make screenshot" -msgstr "" +msgstr "Сделать скриншот" -#: main.c:52 +#: main.c:55 #, c-format msgid "Master killed with sig=%d" -msgstr "" +msgstr "Хозяин убит с сигналом %d" -#: ccdfunc.c:665 +#: ccdfunc.c:803 #, c-format msgid "Maximal gain: %g" -msgstr "" +msgstr "Наибольший gain: %g" -#: ccdfunc.c:649 +#: ccdfunc.c:787 #, c-format msgid "Maximal geometry (WxH): %dx%d" -msgstr "" +msgstr "Наибольшая геометрия (WxH): %dx%d" -#: ccdfunc.c:650 +#: ccdfunc.c:788 #, c-format msgid "Minimal offset: %dx%d" -msgstr "" +msgstr "Минимальное смещение: %dx%d" #: imageview.c:616 #, c-format msgid "Missed %zd images" -msgstr "" +msgstr "Пропущено %zd изображений" #: cmdlnopts.c:91 msgid "N flushes before exposing (default: 1)" msgstr "N засвечиваний перед экспозицией (по умолчанию: 1)" -#: ccdfunc.c:948 +#: ccdfunc.c:1126 msgid "Need exposition time!" -msgstr "" +msgstr "Укажите время экспозиции!" -#: server.c:270 +#: server.c:297 msgid "No camera device" msgstr "Не указано устройство камеры" -#: ccdfunc.c:557 ccdfunc.c:558 +#: ccdfunc.c:695 ccdfunc.c:696 msgid "No cameras found" msgstr "Камер не обнаружено" -#: server.c:1115 +#: server.c:1131 #, fuzzy msgid "No devices found" msgstr "Турелей не обнаружено" -#: ccdfunc.c:363 +#: ccdfunc.c:466 msgid "No focusers found" msgstr "Фокусеров не обнаружено" #: imageview.c:711 msgid "No image changing function defined" -msgstr "" +msgstr "Не определена функция, ответственная за смену изображений" -#: ccdfunc.c:453 +#: ccdfunc.c:575 msgid "No wheels found" msgstr "Турелей не обнаружено" -#: ccdfunc.c:745 +#: ccdfunc.c:883 msgid "Only show statistics" msgstr "Только отобразить статистику" -#: main.c:98 +#: main.c:101 msgid "Options `port` and `path` can't be used together! Point `port` for " "TCP socket or `path` for UNIX." -msgstr "" +msgstr "Опции `port` и `path` не могут использоваться совместно! Укажите " + "`port` для TCP-сокетов или `path` для UNIX." -#: ccdfunc.c:634 +#: ccdfunc.c:772 #, c-format msgid "Pixel size: %g x %g" msgstr "Размер пикселя: %g x %g" -#: ccdfunc.c:935 +#: ccdfunc.c:1113 msgid "Point network port or UNIX-socket path" -msgstr "" +msgstr "Укажите сетевой порт или путь к UNIX-сокету" -#: ccdfunc.c:784 +#: ccdfunc.c:962 msgid "Read grabbed image" msgstr "Считывание изображения" -#: ccdfunc.c:744 +#: ccdfunc.c:882 #, c-format msgid "Readout mode: %s" msgstr "Режим считывания: %s" #: client.c:186 -#, fuzzy msgid "Send custom plugin commands\n" -msgstr "особые команды плагина камеры" +msgstr "Отправить особые команды плагина камеры\n" #. send message and wait any answer #. send message and wait answer starting with 'cmd' #. send command and wait for answer on it -#: client.c:42 client.c:44 client.c:46 client.c:288 -#, fuzzy +#: client.c:42 client.c:44 client.c:46 client.c:290 msgid "Server disconnected" -msgstr "Таймаут сервера" +msgstr "Сервер отключен" #: client.c:149 -#, fuzzy msgid "Server disconnected?" -msgstr "Таймаут сервера" +msgstr "Сервер отключен?" -#: server.c:1093 +#: server.c:1100 msgid "Server run without image transport socket" -msgstr "" +msgstr "Сервер запущен без транспортного сокета (только SHM)" -#: client.c:585 +#: client.c:589 msgid "Server timeout" msgstr "Таймаут сервера" -#: ccdfunc.c:707 +#: ccdfunc.c:845 #, c-format msgid "Set brightness to %g" msgstr "Установить яркость в %g" -#: ccdfunc.c:628 +#: ccdfunc.c:766 #, c-format msgid "Set fan speed to %d" msgstr "Не могу установить скорость вентиляторов в %d" -#: ccdfunc.c:701 +#: ccdfunc.c:839 #, c-format msgid "Set gain to %g" msgstr "Установить Gain в %g" -#: main.c:116 -#, fuzzy, c-format +#: main.c:119 +#, c-format msgid "Set image port to %s\n" -msgstr "Не могу установить скорость вентиляторов в %d" +msgstr "Устанавливаю номер транспортного порта в %d\n" #: imageview.c:756 #, c-format msgid "Set output prefix to %s" -msgstr "" +msgstr "Устанавливаю выходной префикс в %s" -#: ccdfunc.c:676 +#: ccdfunc.c:814 #, c-format msgid "Shutter command: %s\n" msgstr "Команда затвора: %s\n" -#: ccdfunc.c:863 +#: ccdfunc.c:1041 msgid "Some error when capture" msgstr "Ошибка при захвате" -#: server.c:222 +#: server.c:249 msgid "Something's wrong with camera" -msgstr "" +msgstr "Что-то камере поплохело" -#: client.c:466 +#: client.c:470 msgid "Still got old image" -msgstr "" +msgstr "Все еще получаю старые изображения" -#: client.c:440 +#: client.c:443 msgid "Too many FITS headers, truncating" -msgstr "" +msgstr "Слишком много заголовков FITS, обрезаю" -#: ccdfunc.c:681 +#: ccdfunc.c:819 #, c-format msgid "Try to configure I/O port as %d" msgstr "Попытка сконфигурировать порт I/O как %d" -#: ccdfunc.c:692 +#: ccdfunc.c:830 #, c-format msgid "Try to write %d to I/O port" msgstr "Попытка записи %d в порт I/O" @@ -697,29 +688,28 @@ msgstr " msgid "UNIX socket name (command socket)" msgstr "имя UNIX-сокета" -#: client.c:512 -#, fuzzy +#: client.c:516 msgid "Wait for exposition end" -msgstr "ждать, пока не кончится экспозиция" +msgstr "Жду, пока не кончится экспозиция" -#: ccdfunc.c:446 +#: ccdfunc.c:568 msgid "Wheel device not pointed" msgstr "Устройство турели не указано" -#: ccdfunc.c:492 +#: ccdfunc.c:634 #, fuzzy, c-format msgid "Wheel model: %s" msgstr "Модель светоприемника: %s" -#: ccdfunc.c:510 +#: ccdfunc.c:648 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "Позиция колеса должна быть от 0 до %d" -#: main.c:103 +#: main.c:106 #, c-format msgid "Wrong port value: %d" -msgstr "" +msgstr "Неправильный номер порта: %d" #: cmdlnopts.c:98 msgid "absolute (not divided by binning!) frame X0 coordinate (-1 - all " @@ -797,7 +787,8 @@ msgstr " #: cmdlnopts.c:129 msgid "get base information about connected hardware (also increasing text " "messages level to 2)" -msgstr "" +msgstr "получить базовую информацию о подключенном оборудовании (также " + "включая текстовые сообщения с уровнемя до 2)" #: cmdlnopts.c:107 msgid "get value of I/O port pins" @@ -846,7 +837,7 @@ msgstr " #: cmdlnopts.c:128 msgid "network answer timeout (default: 0.1s)" -msgstr "" +msgstr "таймаут ответа по сети (по умолчанию: 0.1с)" #: cmdlnopts.c:76 msgid "not open shutter, when exposing (\"dark frames\")" @@ -916,9 +907,9 @@ msgstr " msgid "run in 8-bit mode" msgstr "8-битный режим" -#: server.c:1092 +#: server.c:1099 msgid "server(): need at least command socket fd" -msgstr "" +msgstr "server(): нужен как минимум дескриптор командного сокета" #: cmdlnopts.c:79 msgid "set CCD temperature to given value (degr C)" @@ -952,9 +943,9 @@ msgstr " msgid "start (!=0) or stop(==0) infinity capturing loop" msgstr "начать (!=0) или закончить (==0) бесконечный цикл захвата изображений" -#: ccdfunc.c:939 +#: ccdfunc.c:1117 msgid "start_socket(): can't open socket" -msgstr "" +msgstr "start_socket(): не могу открыть сокет" #: cmdlnopts.c:75 #, fuzzy diff --git a/main.c b/main.c index fca1ee3..cc91190 100644 --- a/main.c +++ b/main.c @@ -40,6 +40,9 @@ static int isserver = FALSE; static pid_t childpid = 0; +// get struct size +//char (*__dummy)[sizeof(cc_IMG)] = 1; + void signals(int signo){ //if(signo) signal(signo, SIG_IGN); DBG("signo=%d", signo); diff --git a/server.c b/server.c index c34a12b..e5e0851 100644 --- a/server.c +++ b/server.c @@ -46,9 +46,9 @@ static cc_frameformat frmformatmax = {0}, curformat = {0}; // maximal format // image in shared memory static cc_IMG *ima = NULL; -static float focmaxpos = 0., focminpos = 0.; // focuser extremal positions -static int wmaxpos = 0.; // wheel max pos -static float tremain = 0.; // time when capture done +static float focmaxpos = 0.f, focminpos = 0.f; // focuser extremal positions +static int wmaxpos = 0; // wheel max pos +static float tremain = 0.f; // time when capture done // IPC key for shared memory (for client's getter) static key_t shmkey = IPC_PRIVATE; @@ -61,7 +61,7 @@ typedef struct{ // cat | awk '{print "{ " $3 ", \"\" }," }' | sort strpair allcommands[] = { - { CC_CMD_AUTHOR, "FITS 'AUTHOR' field" }, + //{ CC_CMD_AUTHOR, "FITS 'AUTHOR' field" }, { CC_CMD_BRIGHTNESS, "camera brightness" }, { CC_CMD_CAMDEVNO, "camera device number" }, { CC_CMD_CAMFLAGS, "get camflags (bits: 0-start capture, 1-cancel, 2-restart server"}, @@ -81,23 +81,23 @@ strpair allcommands[] = { { CC_CMD_FTEMP, "get focuser body temperature"}, { CC_CMD_FRAMEFORMAT, "camera frame format (X0,Y0,X1,Y1)" }, { CC_CMD_GAIN, "camera gain" }, - { CC_CMD_GETHEADERS, "get last file FITS headers" }, + //{ CC_CMD_GETHEADERS, "get last file FITS headers" }, { CC_CMD_HBIN, "horizontal binning" }, { CC_CMD_HELP, "show this help" }, { CC_CMD_IMHEIGHT, "last image height" }, { CC_CMD_IMNUMBER, "grabbed image number from server start"}, { CC_CMD_IMWIDTH, "last image width" }, { CC_CMD_INFTY, "an infinity loop taking images until there's connected clients" }, - { CC_CMD_INSTRUMENT, "FITS 'INSTRUME' field" }, + //{ CC_CMD_INSTRUMENT, "FITS 'INSTRUME' field" }, { CC_CMD_IO, "get/set camera IO" }, { CC_CMD_8BIT, "run in 8 bit mode instead of 16 bit" }, { CC_CMD_FRAMEMAX, "camera maximal available format" }, { CC_CMD_NFLUSHES, "camera number of preflushes" }, - { CC_CMD_OBJECT, "FITS 'OBJECT' field" }, - { CC_CMD_OBJTYPE, "FITS 'IMAGETYP' field" }, - { CC_CMD_OBSERVER, "FITS 'OBSERVER' field" }, + //{ CC_CMD_OBJECT, "FITS 'OBJECT' field" }, + //{ CC_CMD_OBJTYPE, "FITS 'IMAGETYP' field" }, + //{ CC_CMD_OBSERVER, "FITS 'OBSERVER' field" }, { CC_CMD_PLUGINCMD, "custom camera plugin command" }, - { CC_CMD_PROGRAM, "FITS 'PROG-ID' field" }, + //{ CC_CMD_PROGRAM, "FITS 'PROG-ID' field" }, { CC_CMD_RESTART, "restart server" }, { CC_CMD_SHMEMKEY, "get shared memory key" }, { CC_CMD_SHUTTER, "camera shutter's operations" }, @@ -106,7 +106,7 @@ strpair allcommands[] = { { CC_CMD_VBIN, "vertical binning" }, { CC_CMD_WDEVNO, "wheel device number" }, { CC_CMD_WLIST, "list all connected wheels" }, - { CC_CMD_WMAXPOS, "get maximap wheel position"}, + { CC_CMD_WMAXPOS, "get maximal wheel position"}, { CC_CMD_WPOS, "wheel position" }, { CC_CMD_WTEMP, "get wheel body temperature"}, {NULL, NULL}, @@ -168,6 +168,30 @@ static void fixima(){ ima->datasize = ima->bytelen; // init shared semaphore cc_init_sem(TRUE); + if(camera->getModelName){ + if(camera->getModelName(ima->model, MODELNM_SZ-1)) ima->model[MODELNM_SZ-1] = 0; + else ima->model[0] = 0; + } + ima->pixel_x = camera->pixX; + ima->pixel_y = camera->pixY; + // fill constant parameters + if(wheel){ + int i; + if(wheel->getModelName){ + if(wheel->getModelName(ima->wmodel, MODELNM_SZ-1)) ima->wmodel[MODELNM_SZ-1] = 0; + else ima->wmodel[0] = 0; + } + if(wheel->getMaxPos && wheel->getMaxPos(&i)) ima->wheelmax = i; + else ima->wheelmax = 0; + } + if(focuser){ + if(focuser->getModelName){ + if(focuser->getModelName(ima->fmodel, MODELNM_SZ-1)) ima->fmodel[MODELNM_SZ-1] = 0; + else ima->fmodel[0] = 0; + } + if(!focuser->getMinPos || !focuser->getMinPos(&ima->focmin)) ima->focmin = NAN; + if(!focuser->getMaxPos || !focuser->getMaxPos(&ima->focmax)) ima->focmax = NAN; + } } TIMESTAMP("Lock SHM image"); cc_lock_shm(TRUE); @@ -177,6 +201,9 @@ static void fixima(){ DBG("curformat: %dx%d", curformat.w, curformat.h); ima->h = raw_height; ima->w = raw_width; + ima->bin_x = GP->hbin; + ima->bin_y = GP->vbin; + ima->exposure_time = GP->exptime; if(!camera->getbitpix || !camera->getbitpix(&ima->bitpix)) ima->bitpix = 16; if(ima->bitpix < 8 || ima->bitpix > 16) ima->bitpix = 16; // use maximum in any strange cases DBG("bitpix=%d", ima->bitpix); @@ -232,8 +259,11 @@ static inline void cameracapturestate(){ // capturing - wait for exposition ends TIMESTAMP("Capture ready"); tremain = 0.; // now capture frame - if(!ima || !ima->data) LOGERR("Can't capture image: data not initialized"); - else{ + if(!ima || !ima->data){ + LOGERR("Can't capture image: data not initialized"); + camstate = CAMERA_ERROR; + return; + }else{ TIMESTAMP("start capture"); if(!camera->capture){ WARNX(_("Camera plugin have no function `capture`")); @@ -247,13 +277,10 @@ static inline void cameracapturestate(){ // capturing - wait for exposition ends LOGERR("Can't capture image"); camstate = CAMERA_ERROR; return; - }else{ - TIMESTAMP("Fill FITS header"); - ima->gotstat = 0; // fresh image without statistics - recalculate when save - ima->timestamp = sl_dtime(); // set timestamp - fillFITSheader(ima); - ++ima->imnumber; // increment counter } + fill_image_fields(ima); + //fillFITSheader(ima); + ++ima->imnumber; // increment counter cc_unlock_shm(); LOGDBG("cameracapturestate(): SHM UNlocked"); TIMESTAMP("Captured and unlocked"); @@ -354,29 +381,7 @@ static int camdevini(int n){ if(!camera->setgeometry || !camera->setgeometry(&curformat)) WARNX(_("Can't set given geometry")); return TRUE; } -static int focdevini(int n){ - if(!focuser) return FALSE; - if(!focuser->setDevNo(n)){ - LOGERR("Can't set active focuser number"); - return FALSE; - } - atomic_store(&focdevno, n); - LOGMSG("Set focuser device number to %d", n); - focuser->getMaxPos(&focmaxpos); - focuser->getMinPos(&focminpos); - return TRUE; -} -static int wheeldevini(int n){ - if(!wheel) return FALSE; - if(!wheel->setDevNo(n)){ - LOGERR("Can't set active wheel number"); - return FALSE; - } - atomic_store(&wheeldevno, n); - LOGMSG("Set wheel device number to %d", n); - wheel->getMaxPos(&wmaxpos); - return TRUE; -} + /******************************************************************************* *************************** Service handlers ********************************** @@ -727,6 +732,7 @@ static cc_hresult darkhandler(int fd, _U_ const char *key, const char *val){ if(!cc_sendstrmessage(fd, buf)) return CC_RESULT_DISCONNECTED; return CC_RESULT_SILENCE; } +#if 0 static cc_hresult FITSparhandler(int fd, const char *key, const char *val){ char buf[256], **fitskey = NULL; if(0 == strcmp(key, CC_CMD_AUTHOR)){ @@ -750,6 +756,7 @@ static cc_hresult FITSparhandler(int fd, const char *key, const char *val){ if(!cc_sendstrmessage(fd, buf)) return CC_RESULT_DISCONNECTED; return CC_RESULT_SILENCE; } +#endif /* static cc_hresult handler(_U_ int fd, _U_ const char *key, _U_ const char *val){ char buf[64]; @@ -795,7 +802,7 @@ static cc_hresult wsetNhandler(int fd, _U_ const char *key, const char *val){ if(num > wheel->Ndevices - 1 || num < 0){ return CC_RESULT_BADVAL; } - if(!wheeldevini(num)) return CC_RESULT_FAIL; + if(!setWheelNo(num, &wmaxpos)) return CC_RESULT_FAIL; } snprintf(buf, 63, CC_CMD_WDEVNO "=%d", atomic_load(&wheeldevno)); if(!cc_sendstrmessage(fd, buf)) return CC_RESULT_DISCONNECTED; @@ -867,7 +874,7 @@ static cc_hresult fsetNhandler(int fd, _U_ const char *key, const char *val){ if(num > focuser->Ndevices - 1 || num < 0){ return CC_RESULT_BADVAL; } - if(!focdevini(num)) return CC_RESULT_FAIL; + if(!setFocuserNo(num, &focminpos, &focmaxpos)) return CC_RESULT_FAIL; } snprintf(buf, 63, CC_CMD_FDEVNO "=%d", atomic_load(&focdevno)); if(!cc_sendstrmessage(fd, buf)) return CC_RESULT_DISCONNECTED; @@ -945,6 +952,7 @@ static cc_hresult pluginhandler(int fd, _U_ const char *key, const char *val){ return r; } +#if 0 // get headers static cc_hresult gethdrshandler(int fd, _U_ const char *key, _U_ const char *val){ if(!ima) return CC_RESULT_FAIL; @@ -958,6 +966,7 @@ static cc_hresult gethdrshandler(int fd, _U_ const char *key, _U_ const char *va } return CC_RESULT_SILENCE; } +#endif // for setters: do nothing when camera not in idle state static int CAMbusy(){ @@ -1020,6 +1029,7 @@ static cc_handleritem items[] = { {chkcc, inftyhandler, CC_CMD_INFTY}, {chkcc, pluginhandler, CC_CMD_PLUGINCMD}, {NULL, tremainhandler, CC_CMD_TREMAIN}, +#if 0 {chkcc, gethdrshandler, CC_CMD_GETHEADERS}, {NULL, FITSparhandler, CC_CMD_AUTHOR}, {NULL, FITSparhandler, CC_CMD_INSTRUMENT}, @@ -1027,6 +1037,7 @@ static cc_handleritem items[] = { {NULL, FITSparhandler, CC_CMD_OBJECT}, {NULL, FITSparhandler, CC_CMD_PROGRAM}, {NULL, FITSparhandler, CC_CMD_OBJTYPE}, +#endif {chkfoc, foclisthandler, CC_CMD_FOCLIST}, {chkfoc, fsetNhandler, CC_CMD_FDEVNO}, {chkfoc, fgotohandler, CC_CMD_FGOTO}, @@ -1073,10 +1084,6 @@ static void *sendimage(void *C){ if(!cc_senddata(client, locimage, sizeof(cc_IMG))) break; // send image itself (client can close socket if don't need image data) if(!cc_senddata(client, locimage->data, locimage->bytelen)) break; - // send FITS header (client can close socket if don't need it) - for(size_t i = 0; i < locimage->headerstrings; ++i){ // send header - if(!cc_senddata(client, &locimage->fitsheader[i], FLEN_CARD)) break; - } }while(0); shutdown(client, SHUT_WR); // tell client we are closing socket recv(client, locimage->data, locimage->bytelen, MSG_NOSIGNAL); // block until client close his side @@ -1104,12 +1111,21 @@ void server(int sock, int imsock){ TIMEINIT(); // init everything int ctr = 3; - if(startFocuser()) --ctr; - focdevini(0); - if(startWheel()) --ctr; - wheeldevini(0); - if(startCCD()) --ctr; - camdevini(0); + if(startFocuser()){ + --ctr; + if(GP->focdevno < 0) GP->focdevno = 0; + setFocuserNo(GP->focdevno, &focminpos, &focmaxpos); + } + if(startWheel()){ + --ctr; + if(GP->whldevno < 0) GP->whldevno = 0; + setWheelNo(GP->whldevno, &wmaxpos); + } + if(startCCD()){ + --ctr; + if(GP->camdevno < 0) GP->camdevno = 0; + camdevini(GP->camdevno); + } if(ctr == 3){ LOGERR("server(): no devices found"); ERRX(_("No devices found"));