From 39b39fd9480eaa490666aedabe38bfb8fa892513 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Fri, 24 Jul 2026 12:36:11 +0300 Subject: [PATCH] some more fixes (but still got problems) --- Astar_cameras/artifical_star.c | 16 +- ccdcapture.c | 74 +------ ccdcapture.h | 10 - ccdfunc.c | 247 ++++++--------------- ccdfunc.h | 5 +- client.c | 38 ++-- imageview.c | 4 + locale/ru/LC_MESSAGES/ccd_capture.mo | Bin 24522 -> 24496 bytes locale/ru/messages.po | 292 +++++++++++++------------ locale/ru/ru.po | 315 ++++++++++++++------------- main.c | 8 +- server.c | 51 ++--- 12 files changed, 459 insertions(+), 601 deletions(-) diff --git a/Astar_cameras/artifical_star.c b/Astar_cameras/artifical_star.c index a2439e3..2a903e1 100644 --- a/Astar_cameras/artifical_star.c +++ b/Astar_cameras/artifical_star.c @@ -287,8 +287,16 @@ static int camcapt(cc_IMG *ima){ ima->bitpix = bitpix; ima->w = camera.geometry.w; ima->h = camera.geometry.h; - ima->bytelen = ima->w*ima->h*cc_getNbytes(ima); - bzero(ima->data, ima->h*ima->w*cc_getNbytes(ima)); + size_t nbytes = cc_getNbytes(ima); + size_t bytelen = ima->w * ima->h * nbytes; + if(bytelen > ima->datasize){ + WARNX(_("Image size greater than buffer!")); + LOGWARN("ArtStar: Image size greater than buffer!"); + ima->h = ima->datasize / ima->w; + } + LOGDBG("ArtStar: create new artifical star image: %zdx%zd pix", ima->w, ima->h); + ima->bytelen = ima->w * ima->h * nbytes; + bzero(ima->data, ima->datasize); if(!star) ERRX(_("No star template - die")); if(bitpix == 16) gen16(ima); else gen8(ima); @@ -368,7 +376,9 @@ static int camsetgeom(cc_frameformat *f){ if(!f) return FALSE; if(f->xoff > ARRAYW-2 || f->yoff > ARRAYH-2) return FALSE; if(f->xoff < 0 || f->yoff < 0 || f->h < 0 || f->w < 0) return FALSE; - if(f->h + f->yoff > ARRAYH || f->w + f->xoff > ARRAYW) return FALSE; + if(f->h + f->yoff >= ARRAYH || f->w + f->xoff >= ARRAYW) return FALSE; + LOGDBG("ArtStar: geometry changed to: %zdx%zd (offset) - %zdx%zd (w/h)", + f->xoff, f->yoff, f->w, f->h); camera.geometry = *f; return TRUE; } diff --git a/ccdcapture.c b/ccdcapture.c index c2fdbf9..9260226 100644 --- a/ccdcapture.c +++ b/ccdcapture.c @@ -29,12 +29,6 @@ #include #include -#include "client.h" -#include "cmdlnopts.h" -#ifdef IMAGEVIEW -#include "imageview.h" -#endif -#include "server.h" #include "socket.h" #ifdef EBUG @@ -415,6 +409,7 @@ cc_IMG *cc_getshm(key_t key, size_t imsize){ bzero(ptr, sizeof(cc_IMG)); ptr->data = (void*)((uint8_t*)ptr + sizeof(cc_IMG)); ptr->MAGICK = CC_SHM_MAGIC; + ptr->datasize = imsize; return ptr; } @@ -840,44 +835,6 @@ int cc_kwfromfile(fitsfile *fp, char *filename){ return written; } -#if 0 -/** - * @brief cc_charbuf2kw - write all keywords from `b` to file `f` - * `b` should be prepared by cc_kwfromfile or similar - * @param b - buffer with '\n'-separated FITS keys - * @param f - file to write - * @return FALSE if failed - */ -int cc_charbuf2kw(cc_charbuff *b, fitsfile *f){ - if(!b || !f || !b->buflen) return FALSE; - char key[FLEN_KEYWORD + 1], card[FLEN_CARD+1]; // keyword to update - char *c = b->buf, *eof = b->buf + b->buflen; - while(c < eof){ - char *e = strchr(c, '\n'); - if(!e || e > eof) break; - //char *ek = strchr(c, ' '); - char *eq = strchr(c, '='); - //if(eq > ek) eq = ek; // if keyword is shorter than 8 letters - //size_t l = eq-c; if(l > FLEN_KEYWORD) l = FLEN_KEYWORD; - //memcpy(key, c, l); key[l] = 0; - memcpy(key, c, 8); key[8] = 0; - size_t l = e - c; if(l > FLEN_CARD) l = FLEN_CARD; - memcpy(card, c, l); card[l] = 0; - int status = 0; - if(eq - c == 8){ // key = val - DBG("Update key `%s` with `%s`", key, card); - fits_update_card(f, key, card, &status); - }else{ // comment etc - DBG("Write full record `%s`", card); - fits_write_record(f, card, &status); - } - if(status) fits_report_error(stderr, status); - c = e + 1; - } - return TRUE; -} -#endif - static size_t print_val(cc_partype_t t, void *val, char *buf, size_t bufl){ size_t l = 0; switch(t){ @@ -1065,7 +1022,7 @@ void cc_freeimage(cc_IMG **i){ */ int cc_copyimage(cc_IMG *dest, cc_IMG *src, int isshm){ FNAME(); - if(!src || !dest || !src->data) return FALSE; + if(!src || !dest || !src->data || src == dest) return FALSE; if(src->MAGICK != CC_SHM_MAGIC){ WARNX(_("Wrong image: bad magick (0x%X instead of 0x%X)"), src->MAGICK, CC_SHM_MAGIC); return FALSE; @@ -1075,6 +1032,8 @@ int cc_copyimage(cc_IMG *dest, cc_IMG *src, int isshm){ return FALSE; } DBG("Lock"); + if(isshm) cc_lock_shm(FALSE); + else pthread_mutex_lock(&src->mutex); pthread_mutex_lock(&dest->mutex); dest->MAGICK = CC_SHM_MAGIC; if(!dest->data || dest->datasize < src->bytelen){ @@ -1085,6 +1044,8 @@ int cc_copyimage(cc_IMG *dest, cc_IMG *src, int isshm){ LOGERR("realloc() failed"); WARN("realloc()"); pthread_mutex_unlock(&dest->mutex); + if(isshm) cc_unlock_shm(); + else pthread_mutex_unlock(&src->mutex); return FALSE; } dest->data = nxt; @@ -1092,30 +1053,13 @@ int cc_copyimage(cc_IMG *dest, cc_IMG *src, int isshm){ DBG("Success"); } 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); - COPY(w); - 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 + size_t oldsz = dest->datasize; 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); + dest->datasize = oldsz; void *srcdata = src->data; if(isshm){ srcdata = (void*)((uint8_t*)src + sizeof(cc_IMG)); @@ -1124,5 +1068,7 @@ int cc_copyimage(cc_IMG *dest, cc_IMG *src, int isshm){ memcpy(dest->data, srcdata, src->bytelen); DBG("All OK"); pthread_mutex_unlock(&dest->mutex); + if(isshm) cc_unlock_shm(); + else pthread_mutex_unlock(&src->mutex); return TRUE; } diff --git a/ccdcapture.h b/ccdcapture.h index 75a60e3..69642ec 100644 --- a/ccdcapture.h +++ b/ccdcapture.h @@ -293,16 +293,6 @@ 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" -#define CC_CMD_INSTRUMENT "instrument" -#define CC_CMD_OBSERVER "observer" -#define CC_CMD_OBJECT "object" -#define CC_CMD_PROGRAM "program" -#define CC_CMD_OBJTYPE "objtype" -#endif // focuser #define CC_CMD_FOCLIST "foclist" diff --git a/ccdfunc.c b/ccdfunc.c index f1df867..fba1aa9 100644 --- a/ccdfunc.c +++ b/ccdfunc.c @@ -18,7 +18,6 @@ #include #include -#include // pthread_kill #include #include #include @@ -31,7 +30,6 @@ #ifdef IMAGEVIEW #include "imageview.h" #endif -#include "omp.h" cc_Camera *camera = NULL; cc_Focuser *focuser = NULL; @@ -76,126 +74,6 @@ 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 - * @return img->headerstrings - */ -size_t fillFITSheader(cc_IMG *img){ - if(!img) return 0; - img->headerstrings = 0; - char card[FLEN_CARD], templ[2*FLEN_CARD], bufc[FLEN_CARD]; -#define FORMKW(in) \ -do{ int status = 0, kt = 0; \ - fits_parse_template(in, card, &kt, &status); \ - if(status) fits_report_error(stderr, status);\ - else 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) - calculate_stat(img); - float tmpf = 0.0; - int tmpi = 0; - FORMKW("ORIGIN = 'SAO RAS' / Organization responsible for the data"); - FORMKW("OBSERVAT = 'Special Astrophysical Observatory, Russia' / Observatory name"); - FORMKW("INSTRUME = 'direct imaging' / Instrument"); - if(camera){ - snprintf(templ, FLEN_CARD, "VIEWFLD = '(%d, %d)(%d, %d)' / Camera maximal field of view", camera->field.xoff, camera->field.yoff, - camera->field.xoff + camera->field.w, camera->field.yoff + camera->field.h); - FORMKW(templ); - snprintf(templ, FLEN_CARD, "ARRAYFLD = '(%d, %d)(%d, %d)' / Camera full array size (with overscans)", camera->array.xoff, camera->array.yoff, - camera->array.xoff + camera->array.w, camera->array.yoff + camera->array.h); - FORMKW(templ); - snprintf(templ, FLEN_CARD, "GEOMETRY = '(%d, %d)(%d, %d)' / Camera current frame geometry", camera->geometry.xoff, camera->geometry.yoff, - camera->geometry.xoff + camera->geometry.w, camera->geometry.yoff + camera->geometry.h); - } - FORMKW(templ); - if(GP->X0 > -1) FORMINT("X0", GP->X0, "Subframe left border without binning"); - if(GP->Y0 > -1) FORMINT("Y0", GP->Y0, "Subframe upper border without binning"); - if(GP->dark) sprintf(bufc, "dark"); - else if(GP->objtype) strncpy(bufc, GP->objtype, FLEN_CARD); - else sprintf(bufc, "light"); - FORMSTR("IMAGETYP", bufc, "Image type"); - FORMINT("DATAMIN", 0, "Min pixel value"); - FORMINT("DATAMAX", (1<bitpix) - 1, "Max pixel value"); - 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"); - if(camera){ - if(camera->getTcold && camera->getTcold(&tmpf)) - FORMFLT("CAMTEMP", tmpf, "Camera temperature at exp. end, degr C"); - if(camera->getTbody && camera->getTbody(&tmpf)) - FORMFLT("BODYTEMP", tmpf, "Camera body temperature at exp. end, degr C"); - if(camera->getThot && camera->getThot(&tmpf)) - FORMFLT("HOTTEMP", tmpf, "Camera peltier hot side temperature at exp. end, degr C"); - FORMFLT( "EXPTIME", GP->exptime, "Actual exposition time (sec)"); - if(camera->getgain && camera->getgain(&tmpf)) - FORMFLT("CAMGAIN", tmpf, "CMOS gain value"); - if(camera->getbrightness && camera->getbrightness(&tmpf)) - FORMFLT("CAMBRIGH", tmpf, "CMOS brightness value"); - } - - 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"); - // BINNING / Binning - snprintf(templ, FLEN_CARD, "BINNING = '%d x %d' / Binning (hbin x vbin)", GP->hbin, GP->vbin); - FORMKW(templ); - FORMINT("XBINNING", GP->hbin, "Binning factor used on X axis"); - FORMINT("YBINNING", GP->vbin, "Binning factor used on Y axis"); - if(focuser){ // there is a focuser device - add info - if(focuser->getModelName && focuser->getModelName(bufc, FLEN_CARD)) - FORMSTR("FOCUSER", bufc, "Focuser model"); - if(focuser->getPos && focuser->getPos(&tmpf)) - FORMFLT("FOCUS", tmpf, "Current focuser position, mm"); - if(focuser->getMinPos && focuser->getMinPos(&tmpf)) - FORMFLT("FOCMIN", tmpf, "Minimal focuser position, mm"); - if(focuser->getMaxPos && focuser->getMaxPos(&tmpf)) - FORMFLT("FOCMAX", tmpf, "Maximal focuser position, mm"); - if(focuser->getTbody && focuser->getTbody(&tmpf)) - FORMFLT("FOCTEMP", tmpf, "Focuser body temperature, degr C"); - } - if(wheel){ // there is a filter wheel device - add info - if(wheel->getModelName && wheel->getModelName(bufc, FLEN_CARD)){ - FORMSTR("WHEEL", bufc, "Filter wheel model"); - } - if(wheel->getPos && wheel->getPos(&tmpi)) - FORMINT("FILTER", tmpi, "Current filter number"); - if(wheel->getMaxPos && wheel->getMaxPos(&tmpi)) - FORMINT("FILTMAX", tmpi, "Amount of filter positions"); - if(wheel->getTbody && wheel->getTbody(&tmpf)) - FORMFLT("FILTTEMP", tmpf, "Filter wheel body temperature, degr C"); - } - if(GP->addhdr){ // add records from server-side files - char **nxtfile = GP->addhdr; - while(*nxtfile){ - cc_kwfromfile(img, *(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"); - if(camera && camera->getModelName && camera->getModelName(bufc, FLEN_CARD)) - FORMSTR("DETECTOR", bufc, "Detector model"); - 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 @@ -296,13 +174,13 @@ int saveFITS(cc_IMG *img, char **outp){ 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); + img->field.xoff + img->field.w - 1, img->field.yoff + img->field.h - 1); 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); + img->array.xoff + img->array.w - 1, img->array.yoff + img->array.h - 1); 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); + img->geometry.xoff + img->geometry.w - 1, img->geometry.yoff + img->geometry.h - 1); FORMKW(templ); FORMINT("X0", img->geometry.xoff, "Subframe left border without binning"); FORMINT("Y0", img->geometry.yoff, "Subframe upper border without binning"); @@ -358,12 +236,7 @@ int saveFITS(cc_IMG *img, char **outp){ // creation date/time int s = 0; fits_write_date(fp, &s); -/* -s = 0; -fits_write_comment(fp, bufhdr->buf, &s); -s = 0; -fits_write_history(fp, bufhdr->buf, &s); -*/ + tm_time = localtime(&savetime); WRITEKEY(fp, TDOUBLE, "UNIXTIME", &dsavetime, "File creation time (UNIX)"); strftime(bufc, FLEN_VALUE, "%Y/%m/%d", tm_time); @@ -378,6 +251,7 @@ 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); + cloerr: TRYFITS(fits_close_file, fp); pthread_mutex_unlock(&img->mutex); @@ -522,7 +396,7 @@ void focusers(){ verbose(VERBOSE_PRIMARY, _("Found focuser #%d: %s\n"), i, modname); } } - if(!setFocuserNo(GP->focdevno, NULL, NULL)) goto retn; + if(!setFocuserNo(GP->focdevno, NULL, NULL)) return; char buf[BUFSIZ]; if(focuser->getModelName(buf, BUFSIZ)){ verbose(VERBOSE_SECONDARY, "Focuser model: %s", buf); @@ -538,11 +412,11 @@ void focusers(){ DBG("FOCMINPOS=%g, FOCMAXPOS=%g", focminpos, focmaxpos); if(!focuser->getPos(&curpos)){ WARNX(_("Can't get current focuser position")); - goto retn; + return; } verbose(VERBOSE_PRIMARY, "FOCPOS=%g", curpos); DBG("Curpos = %g", curpos); - if(isnan(GP->gotopos) && isnan(GP->addsteps)) goto retn; // no focuser commands + if(isnan(GP->gotopos) && isnan(GP->addsteps)) return; // no focuser commands float tagpos = 0.; if(!isnan(GP->gotopos)){ // set absolute position tagpos = GP->gotopos; @@ -552,15 +426,13 @@ void focusers(){ DBG("tagpos: %g", tagpos); if(tagpos < focminpos || tagpos > focmaxpos){ WARNX(_("Can't set position %g: out of limits [%g, %g]"), tagpos, focminpos, focmaxpos); - goto retn; + return; } 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); } -retn: - focclose(); } cc_Wheel *startWheel(){ @@ -628,7 +500,10 @@ void wheels(){ verbose(VERBOSE_PRIMARY, _("Found wheel #%d: %s\n"), i, modname); } } - if(!setWheelNo(GP->whldevno, NULL)) goto retn; + if(!setWheelNo(GP->whldevno, NULL)){ + closewheel(); + return; + } char buf[BUFSIZ]; if(wheel->getModelName(buf, BUFSIZ)){ verbose(VERBOSE_SECONDARY, _("Wheel model: %s"), buf); @@ -643,22 +518,14 @@ void wheels(){ }else WARNX(_("Can't get current wheel position")); verbose(VERBOSE_PRIMARY, "WHEELMAXPOS=%d", wmaxpos); pos = GP->setwheel; - if(pos == -1) goto retn; // no wheel commands + if(pos == -1) return; // no wheel commands if(pos < 0 || pos > wmaxpos){ WARNX(_("Wheel position should be from 0 to %d"), wmaxpos); - goto retn; + return; } if(!wheel->setPos(pos)) WARNX(_("Can't set wheel position %d"), pos); -retn: - closewheel(); } -/* -static void closeall(){ - if(camera){camera->close(); camera = NULL;} - if(focuser){focuser->close(); focuser = NULL;} - if(wheel){wheel->close(); wheel = NULL;} -}*/ static cc_capture_status capt(){ cc_capture_status cs; @@ -772,15 +639,15 @@ int prepare_ccds(){ verbose(VERBOSE_SECONDARY, _("Pixel size: %g x %g"), camera->pixX, camera->pixY); x0 = camera->array.xoff; y0 = camera->array.yoff; - x1 = camera->array.xoff + camera->array.w; - y1 = camera->array.yoff + camera->array.h; + x1 = camera->array.xoff + camera->array.w - 1; + y1 = camera->array.yoff + camera->array.h - 1; snprintf(buf, BUFSIZ, "(%d, %d)(%d, %d)", x0, y0, x1, y1); verbose(VERBOSE_SECONDARY, _("Full array: %s"), buf); snprintf(buf, BUFSIZ, "(%d, %d)(%d, %d)", camera->field.xoff, camera->field.yoff, - camera->field.xoff + camera->field.w, camera->field.yoff + camera->field.h); + camera->field.xoff + camera->field.w - 1, camera->field.yoff + camera->field.h - 1); verbose(VERBOSE_SECONDARY, _("Field of view: %s"), buf); snprintf(buf, BUFSIZ, "(%d, %d)(%d, %d)", camera->geometry.xoff, camera->geometry.yoff, - camera->geometry.xoff + camera->geometry.w, camera->geometry.yoff + camera->geometry.h); + camera->geometry.xoff + camera->geometry.w - 1, camera->geometry.yoff + camera->geometry.h - 1); verbose(VERBOSE_SECONDARY, _("Current format: %s"), buf); cc_frameformat max, step; if(camera->getgeomlimits && camera->getgeomlimits(&max, &step)){ @@ -852,14 +719,14 @@ int prepare_ccds(){ WARNX(_("Can't set binning %dx%d"), GP->hbin, GP->vbin); if(camera->getbin) camera->getbin(&GP->hbin, &GP->vbin); } - if(GP->X0 < 0) GP->X0 = x0; // default values + if(GP->X0 < x0) GP->X0 = x0; // default values else if(GP->X0 > x1-1) GP->X0 = x1-1; - if(GP->Y0 < 0) GP->Y0 = y0; + if(GP->Y0 < y0) GP->Y0 = y0; else if(GP->Y0 > y1-1) GP->Y0 = y1-1; if(GP->X1 < GP->X0+1 || GP->X1 > x1) GP->X1 = x1; if(GP->Y1 < GP->Y0+1 || GP->Y1 > y1) GP->Y1 = y1; DBG("x1/x0: %d/%d", GP->X1, GP->X0); - cc_frameformat fmt = {.w = GP->X1 - GP->X0, .h = GP->Y1 - GP->Y0, .xoff = GP->X0, .yoff = GP->Y0}; + cc_frameformat fmt = {.w = GP->X1 - GP->X0 + 1, .h = GP->Y1 - GP->Y0 + 1, .xoff = GP->X0, .yoff = GP->Y0}; if(!camera->setgeometry || !camera->setgeometry(&fmt)) ERRX(_("Can't set given geometry")); verbose(VERBOSE_MESG, "Geometry: off=%d/%d, wh=%d/%d", fmt.xoff, fmt.yoff, fmt.w, fmt.h); @@ -891,6 +758,42 @@ retn: return rtn; } +/** + * @brief image_init_camdata - init image fields with base camera data + * @param img (io) - image + * @param cam etc - camera, focuser and wheel devices + * @return FALSE if failed + */ +int image_init_camdata(cc_IMG *ima){ + if(!ima ) return FALSE; + 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; + } + return TRUE; +} + +// fill base fields of fresh image void fill_image_fields(cc_IMG *ima){ if(!ima) return; ima->gotstat = 0; // fresh image without statistics - recalculate when save @@ -939,11 +842,14 @@ void ccds(){ cc_frameformat fmt = camera->geometry; int raw_width = fmt.w / GP->hbin, raw_height = fmt.h / GP->vbin; DBG("w=%d, h=%d", raw_width, raw_height); - // allocate maximum available memory - for 16bit image - uint16_t *img = MALLOC(uint16_t, raw_width * raw_height); - DBG("\n\nAllocated image 2x%dx%d=%d", raw_width, raw_height, 2 * raw_width * raw_height); - cc_IMG ima = {.data = img, .w = raw_width, .h = raw_height}; - if(!camera->getbitpix || !camera->getbitpix(&ima.bitpix)) ima.bitpix = 16; + uint8_t bitpix = 16; + if(camera->getbitpix) camera->getbitpix(&bitpix); + cc_IMG *image = cc_newimage(bitpix, raw_width, raw_height); + if(!image) ERRX(_("Can't allocate image memory")); + if(!image_init_camdata(image)) WARNX(_("Can't fill headers with camera data")); + image->exposure_time = GP->exptime; + image->bin_x = GP->hbin; + image->bin_y = GP->vbin; if(GP->nframes < 1) GP->nframes = 1; for(int j = 0; j < GP->nframes; ++j){ TIMEINIT(); @@ -962,17 +868,16 @@ void ccds(){ verbose(VERBOSE_SECONDARY, _("Read grabbed image")); TIMESTAMP("Read grabbed"); if(!camera->capture) ERRX(_("Camera plugin have no function `capture`")); - if(!camera->capture(&ima)){ + if(!camera->capture(image)){ WARNX(_("Can't grab image")); break; } - ima.timestamp = sl_dtime(); - ++ima.imnumber; - ima.gotstat = 0; + fill_image_fields(image); + ++image->imnumber; TIMESTAMP("Calc stat"); - calculate_stat(&ima); + calculate_stat(image); TIMESTAMP("Save fits"); - saveFITS(&ima, NULL); + saveFITS(image, NULL); TIMESTAMP("Ready"); if(GP->pause_len && j != (GP->nframes - 1)){ double delta, time1 = sl_dtime() + GP->pause_len; @@ -988,7 +893,7 @@ void ccds(){ } } DBG("FREE img"); - FREE(img); + cc_freeimage(&image); closecam(); } @@ -1049,8 +954,6 @@ static void *grabnext(void *arg){ return NULL; } - - /** * @brief ccdcaptured - get new image data for viewer * @param img - pointer to cc_IMG* (if cc_IMG* is NULL, will be allocated here) @@ -1064,16 +967,12 @@ int ccdcaptured(cc_IMG *imgptr){ DBG("Wait for grabbing thread ends"); if(grabthread){ exitgrab = TRUE; - //pthread_cancel(grabthread); // this kills some cameras - //pthread_timedjoin_np pthread_join(grabthread, NULL); grabthread = 0; } DBG("OK"); return FALSE; } - //cc_frameformat fmt = camera->geometry; - //int raw_width = fmt.w / GP->hbin, raw_height = fmt.h / GP->vbin; if(!grabthread){ // start new grab TIMESTAMP("Start new grab"); @@ -1084,8 +983,6 @@ int ccdcaptured(cc_IMG *imgptr){ } }else{ // grab in process if(imgptr->imnumber != lastgrabno){ // done - /*ssize_t delta = ima->imnumber - lastgrabno; - if(delta > 0 && delta != 1) WARNX("ccdcaptured(): missed %zd images", delta-1);*/ lastgrabno = imgptr->imnumber; TIMESTAMP("Got exp #%zd", lastgrabno); framerate(); diff --git a/ccdfunc.h b/ccdfunc.h index 07c6fac..1167aa3 100644 --- a/ccdfunc.h +++ b/ccdfunc.h @@ -26,10 +26,13 @@ extern cc_Wheel *wheel; void calculate_stat(cc_IMG *image); size_t fillFITSheader(cc_IMG *img); int saveFITS(cc_IMG *img, char **outp); // for imageview module + +void fill_image_fields(cc_IMG *ima); +int image_init_camdata(cc_IMG *ima); + void focusers(); void wheels(); int prepare_ccds(); -void fill_image_fields(cc_IMG *ima); void ccds(); void camstop(); diff --git a/client.c b/client.c index 30d6fad..9c05a77 100644 --- a/client.c +++ b/client.c @@ -263,17 +263,6 @@ 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); - CHKHDR(GP->instrument, CC_CMD_INSTRUMENT); - CHKHDR(GP->observers, CC_CMD_OBSERVER); - CHKHDR(GP->objname, CC_CMD_OBJECT); - CHKHDR(GP->prog_id, CC_CMD_PROGRAM); - CHKHDR(GP->objtype, CC_CMD_OBJTYPE); -#undef CHKHDR -#endif } /** @@ -284,11 +273,13 @@ static int readNbytes(int fd, size_t N, uint8_t *buf){ size_t got = 0, need = N; double t0 = sl_dtime(); while(sl_dtime() - t0 < CC_CLIENT_TIMEOUT /*&& sl_canread(fd)*/ && need){ + DBG("Try to read %zd bytes", need); ssize_t rd = read(fd, buf + got, need); - if(rd <= 0){ - if(errno == EAGAIN || errno == EWOULDBLOCK) continue; - WARNX(_("Server disconnected")); - signals(1); + DBG("readNbytes() got %zd; errno=%d", rd, errno); + if(rd == 0) return FALSE; // connection closed + if(rd < 0){ + if(errno == EAGAIN) continue; + ERR(_("Server disconnected")); } got += rd; need -= rd; t0 = sl_dtime(); @@ -369,14 +360,15 @@ static int getsocksizes(int *imsock){ } if(ima.MAGICK != CC_SHM_MAGIC || ima.bytelen < 1) return FALSE; // now copy fields -#define COPY(field) locima->field = ima.field; - COPY(timestamp); - COPY(bitpix); - COPY(w); - COPY(h); - COPY(bytelen); - COPY(imnumber); -#undef COPY + size_t oldsz = locima->datasize; + DBG("Copy %zd bytes of fields", offsetof(cc_IMG, end_of_copyable_data) - offsetof(cc_IMG, start_of_copyable_data)); + uint8_t *tagaddr = (uint8_t*)locima + offsetof(cc_IMG, start_of_copyable_data); + uint8_t *srcaddr = (uint8_t*)&ima + offsetof(cc_IMG, start_of_copyable_data); + memcpy(tagaddr, srcaddr, + offsetof(cc_IMG, end_of_copyable_data) - offsetof(cc_IMG, start_of_copyable_data)); + locima->datasize = oldsz; // restore size + DBG("image number: %zd, timestamp: %.3f; w/h: %d/%d", + locima->imnumber, locima->timestamp, locima->w, locima->h); return TRUE; } diff --git a/imageview.c b/imageview.c index 3b7613f..93dd24b 100644 --- a/imageview.c +++ b/imageview.c @@ -611,6 +611,7 @@ static void mkcuts(cc_IMG *img){ static void change_displayed_image(cc_IMG *img){ if(!win || !img) return; static size_t lastN = 0; + pthread_mutex_lock(&img->mutex); ssize_t delta = img->imnumber - lastN; TIMESTAMP("Got image #%zd", img->imnumber); if(delta > 0 && delta != 1) WARNX(_("Missed %zd images"), delta-1); @@ -626,6 +627,7 @@ static void change_displayed_image(cc_IMG *img){ WARN("realloc()"); LOGERR("Realloc() error"); win->image->rawdata = raw; + pthread_mutex_unlock(&img->mutex); return; } win->image->h = h; win->image->w = w; @@ -635,6 +637,7 @@ static void change_displayed_image(cc_IMG *img){ WARN("realloc()"); LOGERR("Realloc() error"); win->rawdata = raw; + pthread_mutex_unlock(&img->mutex); return; } DBG("win->image changed"); @@ -687,6 +690,7 @@ static void change_displayed_image(cc_IMG *img){ DBG("Unlock"); win->image->changed = 1; pthread_mutex_unlock(&win->mutex); + pthread_mutex_unlock(&img->mutex); } void closeGL(){ // killed by external signal or ctrl+c diff --git a/locale/ru/LC_MESSAGES/ccd_capture.mo b/locale/ru/LC_MESSAGES/ccd_capture.mo index 976c0c0303223ba2a935027eaf24d5f8d8226edf..a43b3e089bc59e245b29d26a7953bdfa91a60ab5 100644 GIT binary patch delta 1808 zcmXZce@sUw=hSMQOq>aV`4|G5g+wQ_RzKEBx5!aTx3l3l% z{S<1Ze(;{>Rv%{vF(oeur)J(|8Lt19x#VhBk>Xw|)gE_d8D0N&BK8h3gBp$|fcn0-oZsKbE3oX`{N2mxI(uN$5 z97SE|D=fs{u>i9zk;kzXb;1sO0>_Ze%Q0k=asxMGR)gE`K+WV4&#yg~FvR+@k++k) z(1&?=6MOJaT#p@3b0g3}t@_)@DalImy$c&q$Il?;B5O$3dEAD2ROzHk$8};pI;h2% z!aUZOD>O91yGY?nK82uX(~3KA5;Y^=Vg;sgE=3qdoybNluD7uSmyr6BLaxkl>_&b6 zK?*YM=LylF>U;+N& znN5WT=+~l!14t6(L<{+6({hgoy7RJD_m89xsYjVW-SJtp@K@xfioxZbLL2p({^(gr z6xu(8dW5%d1J-fJ^~eU%#1C-|UTY)&+iBeA!5lWSEq(ECG_Z`>bb>zAfrn88`vOnn zKX?&8Zg+nl?Vuj$&!A@JXXM7pa;}Dsvyi1^5-q&y(9jn$y1Z+L2k57e>`D>QaVqi} zGM8LHoj8-i(3&YlJ;Hv^L%4$eDNMt&s5|`(Gx0klDRK|>NS(TFcY>X$sdZ2nn8RUQ zz#+7Dy4UX{+Vn4?22}Er+kX@FC~xEISWMw)fbZcrUPV7{;as#IM>3ryi!|zZP}obw zqdmX=;ZWW~rePYT?+p6=y&*GH88oYcp>m(OsivYjV3wI?db6Dv4YtSak;HC$bWgm- z7m1G9@u;uU@I{7WyI-|O_PpT>$D+}_v0-bkJra$L8}Vd4<3- zjR~B?b=VjZ;Um3#aWCx8o9_WN9+wQ{Sn8x3*6*q10 z7CeT{^oyvOy6r!2+$dtxA4EQKp05LV6JwYqiUE8NwLg#OcVgV7(M#h))C|nuB(eo< zOvQBJI>qeWhRLl_y?$g&tV)R5id{|WAtbJ{vFi$4bORjjv-YL_X-V-_;263 zCZeUk4|V57wD3N*P4=Y~x8Y&jk0o4*)kLZDqWCDDz%_UpEAc97X>Q?iT*^U+vAzVn zh72HOl21_=`U$J?Ax2eU7@xol>I)0F8sA1XFSE!drAg-K+WVC-=BS#F(}OX zlAtllfN`wATet@w-YQay1>B31sHgrOQZ1<_-}`Yl>iiONTx28ZI*0wJhq#7x>AaV5 z6;7fa#v)d*zWh!@Bb?6x-~z~I)Y`m+yYM7xM*c)Cl|fxrOf;#>w4uA$^Vi4azx0*)L|KUf}4Ae5}X>7q4u^09EMbwP^ih4~S;K=Kay0INy zq`Yz!t8fV?Qw?JfGZ@2TND}39hy1g7DNlMkcW?#$apXM83Dg~5!x-MrrRAndD;~u$ zOyfVk?L?vdDby0)!8+{Xs%Xh3umLaNlXznX`QJ%n5!?9;_n{7ajJMRIgZhGT)QP82 z1N#A|@$pWPOL!Ue_ct@77fYy_DdS3TbEOh>UJhAXPGStNyZ(UMF8|u$1V0p!EK8K= zsEWLfyi>kKeQ}V3p=YKIwS-4~r*I+tD_D-#P3q4>Ak^lez diff --git a/locale/ru/messages.po b/locale/ru/messages.po index ff9df5b..fc7e6d2 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-23 17:35+0300\n" +"POT-Creation-Date: 2026-07-24 12:24+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -28,46 +28,46 @@ msgstr "" msgid "Get signal %d - exit" msgstr "" -#: main.c:91 +#: main.c:93 msgid "Can't use outfile name and prefix together" msgstr "" -#: main.c:94 ccdfunc.c:222 +#: main.c:96 ccdfunc.c:100 #, c-format msgid "File %s exists!" msgstr "" -#: main.c:97 +#: main.c:99 #, c-format msgid "Can't set answer timeout to %g" msgstr "" -#: main.c:101 +#: main.c:103 msgid "" "Options `port` and `path` can't be used together! Point `port` for TCP " "socket or `path` for UNIX." msgstr "" -#: main.c:106 +#: main.c:108 #, c-format msgid "Wrong port value: %d" msgstr "" -#: main.c:119 +#: main.c:121 #, c-format msgid "Set image port to %s\n" msgstr "" -#: main.c:122 +#: main.c:124 msgid "Can't be client and standalone in same time!" msgstr "" -#: main.c:127 +#: main.c:129 #, c-format msgid "Log file %s @ level %d\n" msgstr "" -#: main.c:129 +#: main.c:131 msgid "Can't create log file" msgstr "" @@ -331,422 +331,430 @@ msgstr "" msgid "%d unused parameters:\n" msgstr "" -#: ccdfunc.c:211 +#: ccdfunc.c:89 msgid "Image not saved: neither filename nor filename prefix pointed" msgstr "" -#: ccdfunc.c:230 +#: ccdfunc.c:108 #, c-format msgid "Can't save file with prefix %s" msgstr "" -#: ccdfunc.c:347 +#: ccdfunc.c:225 #, c-format msgid "Added 0 FITS records from %s" msgstr "" -#: ccdfunc.c:348 +#: ccdfunc.c:226 #, c-format msgid "Added %d FITS records from %s" msgstr "" -#: ccdfunc.c:386 +#: ccdfunc.c:260 #, c-format msgid "File saved as '%s'" msgstr "" -#: ccdfunc.c:395 +#: ccdfunc.c:269 #, c-format msgid "Error saving file %s" msgstr "" -#: ccdfunc.c:450 +#: ccdfunc.c:324 #, c-format msgid "Image stat:\n" msgstr "" -#: ccdfunc.c:459 +#: ccdfunc.c:333 msgid "Focuser device not pointed" msgstr "" -#: ccdfunc.c:466 +#: ccdfunc.c:340 msgid "No focusers found" msgstr "" -#: ccdfunc.c:484 +#: ccdfunc.c:358 #, c-format msgid "Found %d focusers, you point number %d" msgstr "" -#: ccdfunc.c:489 +#: ccdfunc.c:363 msgid "Can't set active focuser number" msgstr "" -#: ccdfunc.c:496 +#: ccdfunc.c:370 msgid "Can't get focuser limit positions" msgstr "" -#: ccdfunc.c:522 +#: ccdfunc.c:396 #, c-format msgid "Found focuser #%d: %s\n" msgstr "" -#: ccdfunc.c:540 +#: ccdfunc.c:414 msgid "Can't get current focuser position" msgstr "" -#: ccdfunc.c:554 +#: ccdfunc.c:428 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "" -#: ccdfunc.c:558 +#: ccdfunc.c:432 msgid "Can't home focuser" msgstr "" -#: ccdfunc.c:560 +#: ccdfunc.c:434 #, c-format msgid "Can't set position %g" msgstr "" -#: ccdfunc.c:568 +#: ccdfunc.c:440 msgid "Wheel device not pointed" msgstr "" -#: ccdfunc.c:575 +#: ccdfunc.c:447 msgid "No wheels found" msgstr "" -#: ccdfunc.c:592 +#: ccdfunc.c:464 #, c-format msgid "Found %d wheels, you point number %d" msgstr "" -#: ccdfunc.c:597 +#: ccdfunc.c:469 msgid "Can't set active wheel number" msgstr "" -#: ccdfunc.c:603 +#: ccdfunc.c:475 msgid "Can't get max wheel position" msgstr "" -#: ccdfunc.c:628 +#: ccdfunc.c:500 #, c-format msgid "Found wheel #%d: %s\n" msgstr "" -#: ccdfunc.c:634 +#: ccdfunc.c:509 #, c-format msgid "Wheel model: %s" msgstr "" -#: ccdfunc.c:643 +#: ccdfunc.c:518 msgid "Can't get current wheel position" msgstr "" -#: ccdfunc.c:648 +#: ccdfunc.c:523 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "" -#: ccdfunc.c:652 +#: ccdfunc.c:527 #, c-format msgid "Can't set wheel position %d" msgstr "" -#: ccdfunc.c:667 +#: ccdfunc.c:534 msgid "Camera plugin have no capture polling funtion." msgstr "" -#: ccdfunc.c:673 +#: ccdfunc.c:540 #, c-format msgid "%.1f seconds till exposition ends" msgstr "" -#: ccdfunc.c:688 +#: ccdfunc.c:555 msgid "Camera device not pointed" msgstr "" -#: ccdfunc.c:695 ccdfunc.c:696 +#: ccdfunc.c:562 ccdfunc.c:563 msgid "No cameras found" msgstr "" -#: ccdfunc.c:716 +#: ccdfunc.c:583 msgid "Camera plugin have no model name getter" msgstr "" -#: ccdfunc.c:721 +#: ccdfunc.c:588 #, c-format msgid "Found camera #%d: %s\n" msgstr "" -#: ccdfunc.c:727 +#: ccdfunc.c:594 #, c-format msgid "Found %d cameras, you point number %d" msgstr "" -#: ccdfunc.c:731 +#: ccdfunc.c:598 msgid "Can't set active camera number" msgstr "" -#: ccdfunc.c:737 +#: ccdfunc.c:604 msgid "Camera plugin have no custom commands" msgstr "" -#: ccdfunc.c:746 ccdfunc.c:749 +#: ccdfunc.c:613 ccdfunc.c:616 #, c-format msgid "Command '%s'" msgstr "" -#: ccdfunc.c:751 +#: ccdfunc.c:618 #, c-format msgid " returns \"%s\"" msgstr "" -#: ccdfunc.c:762 +#: ccdfunc.c:629 msgid "Camera plugin have no fun speed setter" msgstr "" -#: ccdfunc.c:765 +#: ccdfunc.c:632 msgid "Can't set fan speed" msgstr "" -#: ccdfunc.c:766 +#: ccdfunc.c:633 #, c-format msgid "Set fan speed to %d" msgstr "" -#: ccdfunc.c:771 +#: ccdfunc.c:638 #, c-format msgid "Camera model: %s" msgstr "" -#: ccdfunc.c:772 +#: ccdfunc.c:639 #, c-format msgid "Pixel size: %g x %g" msgstr "" -#: ccdfunc.c:778 +#: ccdfunc.c:645 #, c-format msgid "Full array: %s" msgstr "" -#: ccdfunc.c:781 +#: ccdfunc.c:648 #, c-format msgid "Field of view: %s" msgstr "" -#: ccdfunc.c:784 +#: ccdfunc.c:651 #, c-format msgid "Current format: %s" msgstr "" -#: ccdfunc.c:787 +#: ccdfunc.c:654 #, c-format msgid "Maximal geometry (WxH): %dx%d" msgstr "" -#: ccdfunc.c:788 +#: ccdfunc.c:655 #, c-format msgid "Minimal offset: %dx%d" msgstr "" -#: ccdfunc.c:789 +#: ccdfunc.c:656 #, c-format msgid "Geometry steps: offset - %dx%d, size - %dx%d" msgstr "" -#: ccdfunc.c:793 +#: ccdfunc.c:660 #, c-format msgid "Current binning: %d x %d" msgstr "" -#: ccdfunc.c:796 +#: ccdfunc.c:663 #, c-format msgid "Current settings: %d bits per pixel" msgstr "" -#: ccdfunc.c:799 +#: ccdfunc.c:666 #, c-format msgid "Current brightness: %g" msgstr "" -#: ccdfunc.c:801 +#: ccdfunc.c:668 #, c-format msgid "Current gain: %g" msgstr "" -#: ccdfunc.c:803 +#: ccdfunc.c:670 #, c-format msgid "Maximal gain: %g" msgstr "" -#: ccdfunc.c:805 +#: ccdfunc.c:672 msgid "Camera plugin have no temperature setter" msgstr "" -#: ccdfunc.c:806 +#: ccdfunc.c:673 #, c-format msgid "Can't set T to %g degC" msgstr "" -#: ccdfunc.c:814 +#: ccdfunc.c:681 #, c-format msgid "Shutter command: %s\n" msgstr "" -#: ccdfunc.c:816 +#: ccdfunc.c:683 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "" -#: ccdfunc.c:819 +#: ccdfunc.c:686 #, c-format msgid "Try to configure I/O port as %d" msgstr "" -#: ccdfunc.c:821 +#: ccdfunc.c:688 msgid "Can't configure (unsupported?)" msgstr "" -#: ccdfunc.c:827 +#: ccdfunc.c:694 msgid "Can't get IOport state (unsupported?)" msgstr "" -#: ccdfunc.c:830 +#: ccdfunc.c:697 #, c-format msgid "Try to write %d to I/O port" msgstr "" -#: ccdfunc.c:832 +#: ccdfunc.c:699 msgid "Can't set IOport" msgstr "" -#: ccdfunc.c:839 +#: ccdfunc.c:706 #, c-format msgid "Set gain to %g" msgstr "" -#: ccdfunc.c:840 +#: ccdfunc.c:707 #, c-format msgid "Can't set gain to %g" msgstr "" -#: ccdfunc.c:845 +#: ccdfunc.c:712 #, c-format msgid "Set brightness to %g" msgstr "" -#: ccdfunc.c:846 +#: ccdfunc.c:713 #, c-format msgid "Can't set brightness to %g" msgstr "" -#: ccdfunc.c:852 server.c:380 +#: ccdfunc.c:719 server.c:359 #, c-format msgid "Can't set binning %dx%d" msgstr "" -#: ccdfunc.c:864 server.c:381 +#: ccdfunc.c:731 server.c:361 msgid "Can't set given geometry" msgstr "" -#: ccdfunc.c:868 +#: ccdfunc.c:735 #, c-format msgid "Can't set %d flushes" msgstr "" -#: ccdfunc.c:871 +#: ccdfunc.c:738 msgid "Camera plugin have no exposition setter" msgstr "" -#: ccdfunc.c:873 +#: ccdfunc.c:740 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "" -#: ccdfunc.c:876 +#: ccdfunc.c:743 msgid "Can't change frame type" msgstr "" -#: ccdfunc.c:879 +#: ccdfunc.c:746 msgid "Can't set bit depth" msgstr "" -#: ccdfunc.c:881 +#: ccdfunc.c:748 msgid "Can't set readout speed" msgstr "" -#: ccdfunc.c:882 +#: ccdfunc.c:749 #, c-format msgid "Readout mode: %s" msgstr "" -#: ccdfunc.c:883 +#: ccdfunc.c:750 msgid "Only show statistics" msgstr "" -#: ccdfunc.c:886 +#: ccdfunc.c:753 msgid "Can't get current binning" msgstr "" -#: ccdfunc.c:951 +#: ccdfunc.c:848 +msgid "Can't allocate image memory" +msgstr "" + +#: ccdfunc.c:849 +msgid "Can't fill headers with camera data" +msgstr "" + +#: ccdfunc.c:857 #, c-format msgid "Capture frame %d" msgstr "" -#: ccdfunc.c:952 ccdfunc.c:1030 server.c:230 +#: ccdfunc.c:858 ccdfunc.c:935 server.c:209 msgid "Camera plugin have no function `start exposition`" msgstr "" -#: ccdfunc.c:954 ccdfunc.c:1032 server.c:235 +#: ccdfunc.c:860 ccdfunc.c:937 server.c:214 msgid "Can't start exposition" msgstr "" -#: ccdfunc.c:959 +#: ccdfunc.c:865 msgid "Can't capture image" msgstr "" -#: ccdfunc.c:962 +#: ccdfunc.c:868 msgid "Read grabbed image" msgstr "" -#: ccdfunc.c:964 ccdfunc.c:1043 server.c:269 +#: ccdfunc.c:870 ccdfunc.c:948 server.c:248 msgid "Camera plugin have no function `capture`" msgstr "" -#: ccdfunc.c:966 ccdfunc.c:1044 +#: ccdfunc.c:872 ccdfunc.c:949 msgid "Can't grab image" msgstr "" -#: ccdfunc.c:980 client.c:577 +#: ccdfunc.c:885 client.c:569 #, 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:1015 +#: ccdfunc.c:920 #, c-format msgid "Framerate=%.2f (%g seconds for exp); mean framerate=%.2f" msgstr "" -#: ccdfunc.c:1041 +#: ccdfunc.c:946 msgid "Some error when capture" msgstr "" -#: ccdfunc.c:1082 +#: ccdfunc.c:981 msgid "Can't create grabbing thread" msgstr "" -#: ccdfunc.c:1113 +#: ccdfunc.c:1010 msgid "Point network port or UNIX-socket path" msgstr "" -#: ccdfunc.c:1117 +#: ccdfunc.c:1014 msgid "start_socket(): can't open socket" msgstr "" -#: ccdfunc.c:1126 +#: ccdfunc.c:1023 msgid "Need exposition time!" msgstr "" @@ -758,51 +766,55 @@ msgstr "" msgid "Can't allocate memory for image" msgstr "" -#: server.c:243 +#: server.c:169 +msgid "Can't init camera data" +msgstr "" + +#: server.c:222 msgid "Camera disconnected" msgstr "" -#: server.c:249 +#: server.c:228 msgid "Something's wrong with camera" msgstr "" -#: server.c:297 +#: server.c:276 msgid "No camera device" msgstr "" -#: server.c:1099 +#: server.c:1088 msgid "server(): need at least command socket fd" msgstr "" -#: server.c:1100 +#: server.c:1089 msgid "Server run without image transport socket" msgstr "" -#: server.c:1131 +#: server.c:1120 msgid "No devices found" msgstr "" -#: server.c:1176 +#: server.c:1165 msgid "Client wants an image, but there's no data" msgstr "" -#: server.c:1205 +#: server.c:1194 msgid "Limit of connections reached" msgstr "" -#: server.c:1274 +#: server.c:1263 #, c-format msgid "Can't create %s" msgstr "" -#: server.c:1310 +#: server.c:1299 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:290 +#: client.c:42 client.c:44 client.c:46 client.c:282 msgid "Server disconnected" msgstr "" @@ -822,87 +834,87 @@ msgstr "" msgid "Send custom plugin commands\n" msgstr "" -#: client.c:342 +#: client.c:333 msgid "Can't lock shared memory" msgstr "" -#: client.c:361 +#: client.c:352 msgid "Can't open image transport socket" msgstr "" -#: client.c:367 +#: client.c:358 msgid "Can't read image header over socket" msgstr "" -#: client.c:400 client.c:430 +#: client.c:392 client.c:422 msgid "Can't read image data" msgstr "" -#: client.c:443 +#: client.c:435 msgid "Too many FITS headers, truncating" msgstr "" -#: client.c:454 +#: client.c:446 #, c-format msgid "Can't read full header, got %zd records from %zd" msgstr "" -#: client.c:470 +#: client.c:462 msgid "Still got old image" msgstr "" -#: client.c:495 client.c:595 +#: client.c:487 client.c:587 msgid "Can't run without command socket" msgstr "" -#: client.c:514 +#: client.c:506 msgid "Exposing frame 1..." msgstr "" -#: client.c:516 +#: client.c:508 msgid "Wait for exposition end" msgstr "" -#: client.c:535 +#: client.c:527 msgid "Can't make exposition" msgstr "" #. start next capture #. last image -> should re-expose -#: client.c:537 client.c:548 client.c:567 +#: client.c:529 client.c:540 client.c:559 #, c-format msgid "Exposing frame %d..." msgstr "" -#: client.c:555 +#: client.c:547 msgid "Frame ready, try to grab" msgstr "" #. TRUE -#: client.c:557 +#: client.c:549 msgid "Can't get next image" msgstr "" -#: client.c:565 +#: client.c:557 msgid "Got already saved image, wait next" msgstr "" -#: client.c:589 +#: client.c:581 msgid "Server timeout" msgstr "" -#: client.c:640 +#: client.c:632 msgid "Camera in error state" msgstr "" -#: client.c:642 +#: client.c:634 #, c-format msgid "" "Image wasn't received, state: %d, waiting: %g, lastNo: %d, curNo: %d " "(timeout: %g)" msgstr "" -#: client.c:702 client.c:709 +#: client.c:694 client.c:701 msgid "Can't create capturing thread" msgstr "" @@ -919,38 +931,38 @@ msgstr "" msgid "Histogram conversion: %s" msgstr "" -#: imageview.c:616 +#: imageview.c:617 #, c-format msgid "Missed %zd images" msgstr "" -#: imageview.c:711 +#: imageview.c:715 msgid "No image changing function defined" msgstr "" -#: imageview.c:718 +#: imageview.c:722 msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr "" #. save image -#: imageview.c:752 +#: imageview.c:756 msgid "Make screenshot" msgstr "" -#: imageview.c:756 +#: imageview.c:760 #, c-format msgid "Set output prefix to %s" msgstr "" -#: imageview.c:769 +#: imageview.c:773 #, c-format msgid "Equalization of histogram: %s" msgstr "" -#: imageview.c:769 +#: imageview.c:773 msgid "on" msgstr "" -#: imageview.c:769 +#: imageview.c:773 msgid "off" msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index 47df857..e2a288a 100644 --- a/locale/ru/ru.po +++ b/locale/ru/ru.po @@ -1,32 +1,31 @@ -# 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 , YEAR. +# Russian translation of ccd_capture messages. +# Copyright (C) 2026 +# This file is distributed under the same license as the ccd_capture package. +# Edward V. Emelianov , 2026. # #, fuzzy msgid "" -msgstr "Project-Id-Version: PACKAGE VERSION\n" +msgstr "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \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" - "Language: \n" + "POT-Creation-Date: 2026-07-24 12:15+0300\n" + "PO-Revision-Date: 2026-07-24 08:59+0300\n" + "Last-Translator: Edward V. Emelianov \n" + "Language: russian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" -#: ccdfunc.c:751 +#: ccdfunc.c:618 #, c-format msgid " returns \"%s\"" msgstr " возвращает \"%s\"" -#: ccdfunc.c:673 +#: ccdfunc.c:540 #, c-format msgid "%.1f seconds till exposition ends" msgstr "%.1f секунд до окончания экспозиции" -#: ccdfunc.c:980 client.c:577 +#: ccdfunc.c:885 client.c:569 #, c-format msgid "%d seconds till pause ends\n" msgstr "%d секунд до окончания паузы\n" @@ -36,12 +35,12 @@ msgstr "%d msgid "%d unused parameters:\n" msgstr "%d неиспользуемых параметров:\n" -#: ccdfunc.c:348 +#: ccdfunc.c:226 #, c-format msgid "Added %d FITS records from %s" msgstr "Добавлено %d записей FITS из %s" -#: ccdfunc.c:347 +#: ccdfunc.c:225 #, c-format msgid "Added 0 FITS records from %s" msgstr "Добавлено 0 записей FITS из %s" @@ -58,54 +57,54 @@ msgstr " msgid "CMOS gain level" msgstr "уровень Gain CMOS" -#: ccdfunc.c:688 +#: ccdfunc.c:555 msgid "Camera device not pointed" msgstr "Устройство свеоприемника не подключено" -#: server.c:243 +#: server.c:222 #, fuzzy msgid "Camera disconnected" msgstr "Таймаут сервера" -#: client.c:640 +#: client.c:632 msgid "Camera in error state" msgstr "Камера в состоянии ошибки" -#: ccdfunc.c:771 +#: ccdfunc.c:638 #, c-format msgid "Camera model: %s" msgstr "Модель светоприемника: %s" -#: ccdfunc.c:667 +#: ccdfunc.c:534 msgid "Camera plugin have no capture polling funtion." msgstr "У плагина камеры нет функции захвата изображений" -#: ccdfunc.c:737 +#: ccdfunc.c:604 msgid "Camera plugin have no custom commands" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:871 +#: ccdfunc.c:738 msgid "Camera plugin have no exposition setter" msgstr "У плагина камеры нет сеттера экспозиции" -#: ccdfunc.c:762 +#: ccdfunc.c:629 #, fuzzy msgid "Camera plugin have no fun speed setter" msgstr "У плагина камеры нет сеттера скорости вентилятора" -#: ccdfunc.c:964 ccdfunc.c:1043 server.c:269 +#: ccdfunc.c:870 ccdfunc.c:948 server.c:248 msgid "Camera plugin have no function `capture`" msgstr "У плагина камеры нет функции `capture`" -#: ccdfunc.c:952 ccdfunc.c:1030 server.c:230 +#: ccdfunc.c:858 ccdfunc.c:935 server.c:209 msgid "Camera plugin have no function `start exposition`" msgstr "У плагина камеры нет функции `start exposition`" -#: ccdfunc.c:716 +#: ccdfunc.c:583 msgid "Camera plugin have no model name getter" msgstr "У плагина камеры нет геттера названия модели" -#: ccdfunc.c:805 +#: ccdfunc.c:672 msgid "Camera plugin have no temperature setter" msgstr "У плагина камеры нет сеттера температуры" @@ -113,214 +112,229 @@ msgstr " msgid "Can't allocate buffer" msgstr "Не могу захватить изображение" +#: ccdfunc.c:848 +#, fuzzy +msgid "Can't allocate image memory" +msgstr "Не могу заблокировать разделяемую память" + #: server.c:167 msgid "Can't allocate memory for image" msgstr "Не могу выделить память для изображения" -#: main.c:122 +#: main.c:124 msgid "Can't be client and standalone in same time!" msgstr "Не могу одновременно быть клиентом и самостоятельным приложением!" -#: ccdfunc.c:959 +#: ccdfunc.c:865 msgid "Can't capture image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:876 +#: ccdfunc.c:743 msgid "Can't change frame type" msgstr "Не могу изменить тип кадра" -#: ccdfunc.c:821 +#: ccdfunc.c:688 msgid "Can't configure (unsupported?)" msgstr "Не могу сконфигурировать (опция не поддерживается?)" -#: server.c:1274 +#: server.c:1263 #, c-format msgid "Can't create %s" msgstr "Не могу создать %s" -#: client.c:702 client.c:709 +#: client.c:694 client.c:701 msgid "Can't create capturing thread" msgstr "Не могу создать поток захвата изображений" -#: ccdfunc.c:1082 +#: ccdfunc.c:981 msgid "Can't create grabbing thread" msgstr "Не могу создать поток захвата" -#: main.c:129 +#: main.c:131 msgid "Can't create log file" msgstr "Не могу создать лог-файл" -#: ccdfunc.c:827 +#: ccdfunc.c:849 +#, fuzzy +msgid "Can't fill headers with camera data" +msgstr "Не могу считать данные изображения" + +#: ccdfunc.c:694 msgid "Can't get IOport state (unsupported?)" msgstr "Не могу получить состояние порта I/O (не поддерживается?)" -#: ccdfunc.c:886 +#: ccdfunc.c:753 msgid "Can't get current binning" msgstr "Не могу получить текущее значение биннинга" -#: ccdfunc.c:540 +#: ccdfunc.c:414 msgid "Can't get current focuser position" msgstr "Не могу определить текущую позицию фокусера" -#: ccdfunc.c:643 +#: ccdfunc.c:518 msgid "Can't get current wheel position" msgstr "Не могу определить текущую позицию турели" -#: ccdfunc.c:496 +#: ccdfunc.c:370 msgid "Can't get focuser limit positions" msgstr "Не могу определить предельную позицию фокусера" -#: ccdfunc.c:603 +#: ccdfunc.c:475 msgid "Can't get max wheel position" msgstr "Не могу определить предельную позицию турели" #. TRUE -#: client.c:557 +#: client.c:549 msgid "Can't get next image" msgstr "Не могу получить очередное изображение" -#: ccdfunc.c:966 ccdfunc.c:1044 +#: ccdfunc.c:872 ccdfunc.c:949 msgid "Can't grab image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:558 +#: ccdfunc.c:432 msgid "Can't home focuser" msgstr "Не могу установить фокусер в нуль" +#: server.c:169 +#, fuzzy +msgid "Can't init camera data" +msgstr "Не могу инициализировать мьютекс!" + #: imageview.c:314 msgid "Can't init mutex!" msgstr "Не могу инициализировать мьютекс!" -#: server.c:1310 +#: server.c:1299 msgid "Can't lock mutex" msgstr "Не могу заблокировать мьютекс" -#: client.c:342 +#: client.c:333 msgid "Can't lock shared memory" msgstr "Не могу заблокировать разделяемую память" -#: client.c:535 +#: client.c:527 msgid "Can't make exposition" msgstr "Не могу выполнить экспозицию" -#: imageview.c:718 +#: imageview.c:722 msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr "Не могу открыть окно OpenGL, отображение будет недоступно" -#: client.c:361 +#: client.c:352 msgid "Can't open image transport socket" msgstr "Не могу открыть транспортный сокет" -#: client.c:454 +#: client.c:446 #, c-format msgid "Can't read full header, got %zd records from %zd" msgstr "Не могу считать весь залогово, получил лишь %zd записей из %zd" -#: client.c:400 client.c:430 +#: client.c:392 client.c:422 msgid "Can't read image data" msgstr "Не могу считать данные изображения" -#: client.c:367 +#: client.c:358 msgid "Can't read image header over socket" msgstr "Не могу считать заголовок изображения по сокету" -#: ccdfunc.c:816 +#: ccdfunc.c:683 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "Не могу выполнить команду затвора %s (не поддерживается?)" -#: client.c:495 client.c:595 +#: client.c:487 client.c:587 msgid "Can't run without command socket" msgstr "Не могу работать без командного сокета" -#: ccdfunc.c:230 +#: ccdfunc.c:108 #, c-format msgid "Can't save file with prefix %s" msgstr "Не могу сохранить файл с префиксом %s" -#: ccdfunc.c:868 +#: ccdfunc.c:735 #, c-format msgid "Can't set %d flushes" msgstr "Не могу установить %d сбросов" -#: ccdfunc.c:832 +#: ccdfunc.c:699 msgid "Can't set IOport" msgstr "Не могу поменять значения порта I/O" -#: ccdfunc.c:806 +#: ccdfunc.c:673 #, c-format msgid "Can't set T to %g degC" msgstr "Не могу установить температуру в %g градЦ" -#: ccdfunc.c:731 +#: ccdfunc.c:598 msgid "Can't set active camera number" msgstr "Не могу установить номер активной камеры" -#: ccdfunc.c:489 +#: ccdfunc.c:363 msgid "Can't set active focuser number" msgstr "Не могу установить номер активного фокусера" -#: ccdfunc.c:597 +#: ccdfunc.c:469 msgid "Can't set active wheel number" msgstr "Не могу установить номер активного колеса" -#: main.c:97 +#: main.c:99 #, c-format msgid "Can't set answer timeout to %g" msgstr "Не могу установить таймаут ответа в %g" -#: ccdfunc.c:852 server.c:380 +#: ccdfunc.c:719 server.c:359 #, c-format msgid "Can't set binning %dx%d" msgstr "Не могу установить биннинг %dx%d" -#: ccdfunc.c:879 +#: ccdfunc.c:746 msgid "Can't set bit depth" msgstr "Не могу установить разрядность АЦП" -#: ccdfunc.c:846 +#: ccdfunc.c:713 #, c-format msgid "Can't set brightness to %g" msgstr "Не могу установить яркость в %g" -#: ccdfunc.c:873 +#: ccdfunc.c:740 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "Не могу установить экспозицию в %f секунд" -#: ccdfunc.c:765 +#: ccdfunc.c:632 msgid "Can't set fan speed" msgstr "Не могу установить скорость вентиляторов" -#: ccdfunc.c:840 +#: ccdfunc.c:707 #, c-format msgid "Can't set gain to %g" msgstr "Не могу установить gain в %g" -#: ccdfunc.c:864 server.c:381 +#: ccdfunc.c:731 server.c:361 msgid "Can't set given geometry" msgstr "Не могу установить геометрию" -#: ccdfunc.c:560 +#: ccdfunc.c:434 #, c-format msgid "Can't set position %g" msgstr "Не могу изменить позицию на %g" -#: ccdfunc.c:554 +#: ccdfunc.c:428 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "Не могу установить позицию %g: вне пределов [%g, %g]" -#: ccdfunc.c:881 +#: ccdfunc.c:748 msgid "Can't set readout speed" msgstr "Не могу установить скорость считывания" -#: ccdfunc.c:652 +#: ccdfunc.c:527 #, c-format msgid "Can't set wheel position %d" msgstr "Не могу установить положение колеса %d" -#: ccdfunc.c:954 ccdfunc.c:1032 server.c:235 +#: ccdfunc.c:860 ccdfunc.c:937 server.c:214 msgid "Can't start exposition" msgstr "Не могу начать экспозицию" @@ -328,45 +342,45 @@ msgstr " msgid "Can't unlock socket mutex" msgstr "Не могу разблокировать мьютекс сокета" -#: main.c:91 +#: main.c:93 msgid "Can't use outfile name and prefix together" msgstr "Не могу одновременно использовать имя файла и префикс" -#: ccdfunc.c:951 +#: ccdfunc.c:857 #, c-format msgid "Capture frame %d" msgstr "Захват кадра %d" -#: server.c:1176 +#: server.c:1165 msgid "Client wants an image, but there's no data" msgstr "Клиент ждет изображения, но данные отсутствуют" -#: ccdfunc.c:746 ccdfunc.c:749 +#: ccdfunc.c:613 ccdfunc.c:616 #, c-format msgid "Command '%s'" msgstr "Команда '%s'" -#: ccdfunc.c:793 +#: ccdfunc.c:660 #, c-format msgid "Current binning: %d x %d" msgstr "Текущий биннинг: %d x %d" -#: ccdfunc.c:799 +#: ccdfunc.c:666 #, c-format msgid "Current brightness: %g" msgstr "Текущая яркость: %g" -#: ccdfunc.c:784 +#: ccdfunc.c:651 #, c-format msgid "Current format: %s" msgstr "Текущий формат: %s" -#: ccdfunc.c:801 +#: ccdfunc.c:668 #, c-format msgid "Current gain: %g" msgstr "Текущий gain: %s" -#: ccdfunc.c:796 +#: ccdfunc.c:663 #, c-format msgid "Current settings: %d bits per pixel" msgstr "Текущие настройки: %d бит на пиксель" @@ -375,93 +389,93 @@ msgstr " msgid "Display image in OpenGL window" msgstr "Отображение изображения в окне OpenGL" -#: imageview.c:769 +#: imageview.c:773 #, c-format msgid "Equalization of histogram: %s" msgstr "Эквализация гистограммы: %s" -#: ccdfunc.c:395 +#: ccdfunc.c:269 #, c-format msgid "Error saving file %s" msgstr "Ошибка сохранения файла %s" #. start next capture #. last image -> should re-expose -#: client.c:537 client.c:548 client.c:567 +#: client.c:529 client.c:540 client.c:559 #, c-format msgid "Exposing frame %d..." msgstr "Экспонирую кадр %d..." -#: client.c:514 +#: client.c:506 msgid "Exposing frame 1..." msgstr "Экспонирую кадр 1..." -#: ccdfunc.c:781 +#: ccdfunc.c:648 #, c-format msgid "Field of view: %s" msgstr "Поле зрения: %s" -#: main.c:94 ccdfunc.c:222 +#: main.c:96 ccdfunc.c:100 #, c-format msgid "File %s exists!" msgstr "Файл %s существует!" -#: ccdfunc.c:386 +#: ccdfunc.c:260 #, c-format msgid "File saved as '%s'" msgstr "Файл сохранен как '%s'" -#: ccdfunc.c:459 +#: ccdfunc.c:333 msgid "Focuser device not pointed" msgstr "Устройство фокусера не указано" -#: ccdfunc.c:727 +#: ccdfunc.c:594 #, c-format msgid "Found %d cameras, you point number %d" msgstr "Обнаружено %d камер, вы указали %d" -#: ccdfunc.c:484 +#: ccdfunc.c:358 #, c-format msgid "Found %d focusers, you point number %d" msgstr "Обнаружено %d фокусеров, вы указали %d" -#: ccdfunc.c:592 +#: ccdfunc.c:464 #, c-format msgid "Found %d wheels, you point number %d" msgstr "Обнаружено %d колес, вы указали %d" -#: ccdfunc.c:721 +#: ccdfunc.c:588 #, c-format msgid "Found camera #%d: %s\n" msgstr "Обнаружена камера номер %d: %s\n" -#: ccdfunc.c:522 +#: ccdfunc.c:396 #, c-format msgid "Found focuser #%d: %s\n" msgstr "Обнаружен фокусер номер %d: %s\n" -#: ccdfunc.c:628 +#: ccdfunc.c:500 #, c-format msgid "Found wheel #%d: %s\n" msgstr "Обнаружена турель номер %d: %s\n" -#: client.c:555 +#: client.c:547 msgid "Frame ready, try to grab" msgstr "Кадр готов, пытаюсь считать" #. for(int i = 0; i < NFRM; ++i) printf("last[%d]=%g\n", i, lastn[i]); -#: ccdfunc.c:1015 +#: ccdfunc.c:920 #, c-format msgid "Framerate=%.2f (%g seconds for exp); mean framerate=%.2f" msgstr "%.2f кадров в секунду (%g секунд на экспозицию); средняя скорость " "%.2f" -#: ccdfunc.c:778 +#: ccdfunc.c:645 #, c-format msgid "Full array: %s" msgstr "Полный формат: %s" -#: ccdfunc.c:789 +#: ccdfunc.c:656 #, c-format msgid "Geometry steps: offset - %dx%d, size - %dx%d" msgstr "Шаг измерения геометрии: смещения - %dx%d, размера - %dx%d" @@ -472,7 +486,7 @@ msgstr " msgid "Get signal %d - exit" msgstr "Полуен сигнал %d - выход" -#: client.c:565 +#: client.c:557 msgid "Got already saved image, wait next" msgstr "Получил уже сохраненное изображение, жду следующего" @@ -489,33 +503,33 @@ msgstr " msgid "INET image socket port" msgstr "порт локального сетевого сокета передачи изображения" -#: ccdfunc.c:211 +#: ccdfunc.c:89 msgid "Image not saved: neither filename nor filename prefix pointed" msgstr "Изображение не сохранено: не указано ни имени файла, ни префикса" -#: ccdfunc.c:450 +#: ccdfunc.c:324 #, c-format msgid "Image stat:\n" msgstr "Статистика по изображению: \n" -#: client.c:642 +#: client.c:634 #, c-format msgid "Image wasn't received, state: %d, waiting: %g, lastNo: %d, curNo: %d " "(timeout: %g)" msgstr "Изображение не было получено. Состояние: %d, ожидание: %g, последний " "номер: %d, текущий номер: %d (таймаут: %g)" -#: server.c:1205 +#: server.c:1194 msgid "Limit of connections reached" msgstr "Достигнут предел количества подключений" -#: main.c:127 +#: main.c:129 #, c-format msgid "Log file %s @ level %d\n" msgstr "Лог-файл %s с уровнем %d\n" #. save image -#: imageview.c:752 +#: imageview.c:756 msgid "Make screenshot" msgstr "Сделать скриншот" @@ -524,22 +538,22 @@ msgstr " msgid "Master killed with sig=%d" msgstr "Хозяин убит с сигналом %d" -#: ccdfunc.c:803 +#: ccdfunc.c:670 #, c-format msgid "Maximal gain: %g" msgstr "Наибольший gain: %g" -#: ccdfunc.c:787 +#: ccdfunc.c:654 #, c-format msgid "Maximal geometry (WxH): %dx%d" msgstr "Наибольшая геометрия (WxH): %dx%d" -#: ccdfunc.c:788 +#: ccdfunc.c:655 #, c-format msgid "Minimal offset: %dx%d" msgstr "Минимальное смещение: %dx%d" -#: imageview.c:616 +#: imageview.c:617 #, c-format msgid "Missed %zd images" msgstr "Пропущено %zd изображений" @@ -548,59 +562,59 @@ msgstr " msgid "N flushes before exposing (default: 1)" msgstr "N засвечиваний перед экспозицией (по умолчанию: 1)" -#: ccdfunc.c:1126 +#: ccdfunc.c:1023 msgid "Need exposition time!" msgstr "Укажите время экспозиции!" -#: server.c:297 +#: server.c:276 msgid "No camera device" msgstr "Не указано устройство камеры" -#: ccdfunc.c:695 ccdfunc.c:696 +#: ccdfunc.c:562 ccdfunc.c:563 msgid "No cameras found" msgstr "Камер не обнаружено" -#: server.c:1131 +#: server.c:1120 #, fuzzy msgid "No devices found" msgstr "Турелей не обнаружено" -#: ccdfunc.c:466 +#: ccdfunc.c:340 msgid "No focusers found" msgstr "Фокусеров не обнаружено" -#: imageview.c:711 +#: imageview.c:715 msgid "No image changing function defined" msgstr "Не определена функция, ответственная за смену изображений" -#: ccdfunc.c:575 +#: ccdfunc.c:447 msgid "No wheels found" msgstr "Турелей не обнаружено" -#: ccdfunc.c:883 +#: ccdfunc.c:750 msgid "Only show statistics" msgstr "Только отобразить статистику" -#: main.c:101 +#: main.c:103 msgid "Options `port` and `path` can't be used together! Point `port` for " "TCP socket or `path` for UNIX." msgstr "Опции `port` и `path` не могут использоваться совместно! Укажите " "`port` для TCP-сокетов или `path` для UNIX." -#: ccdfunc.c:772 +#: ccdfunc.c:639 #, c-format msgid "Pixel size: %g x %g" msgstr "Размер пикселя: %g x %g" -#: ccdfunc.c:1113 +#: ccdfunc.c:1010 msgid "Point network port or UNIX-socket path" msgstr "Укажите сетевой порт или путь к UNIX-сокету" -#: ccdfunc.c:962 +#: ccdfunc.c:868 msgid "Read grabbed image" msgstr "Считывание изображения" -#: ccdfunc.c:882 +#: ccdfunc.c:749 #, c-format msgid "Readout mode: %s" msgstr "Режим считывания: %s" @@ -612,7 +626,7 @@ 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:290 +#: client.c:42 client.c:44 client.c:46 client.c:282 msgid "Server disconnected" msgstr "Сервер отключен" @@ -620,66 +634,66 @@ msgstr " msgid "Server disconnected?" msgstr "Сервер отключен?" -#: server.c:1100 +#: server.c:1089 msgid "Server run without image transport socket" msgstr "Сервер запущен без транспортного сокета (только SHM)" -#: client.c:589 +#: client.c:581 msgid "Server timeout" msgstr "Таймаут сервера" -#: ccdfunc.c:845 +#: ccdfunc.c:712 #, c-format msgid "Set brightness to %g" msgstr "Установить яркость в %g" -#: ccdfunc.c:766 +#: ccdfunc.c:633 #, c-format msgid "Set fan speed to %d" msgstr "Не могу установить скорость вентиляторов в %d" -#: ccdfunc.c:839 +#: ccdfunc.c:706 #, c-format msgid "Set gain to %g" msgstr "Установить Gain в %g" -#: main.c:119 +#: main.c:121 #, c-format msgid "Set image port to %s\n" msgstr "Устанавливаю номер транспортного порта в %d\n" -#: imageview.c:756 +#: imageview.c:760 #, c-format msgid "Set output prefix to %s" msgstr "Устанавливаю выходной префикс в %s" -#: ccdfunc.c:814 +#: ccdfunc.c:681 #, c-format msgid "Shutter command: %s\n" msgstr "Команда затвора: %s\n" -#: ccdfunc.c:1041 +#: ccdfunc.c:946 msgid "Some error when capture" msgstr "Ошибка при захвате" -#: server.c:249 +#: server.c:228 msgid "Something's wrong with camera" msgstr "Что-то камере поплохело" -#: client.c:470 +#: client.c:462 msgid "Still got old image" msgstr "Все еще получаю старые изображения" -#: client.c:443 +#: client.c:435 msgid "Too many FITS headers, truncating" msgstr "Слишком много заголовков FITS, обрезаю" -#: ccdfunc.c:819 +#: ccdfunc.c:686 #, c-format msgid "Try to configure I/O port as %d" msgstr "Попытка сконфигурировать порт I/O как %d" -#: ccdfunc.c:830 +#: ccdfunc.c:697 #, c-format msgid "Try to write %d to I/O port" msgstr "Попытка записи %d в порт I/O" @@ -688,25 +702,25 @@ msgstr " msgid "UNIX socket name (command socket)" msgstr "имя UNIX-сокета" -#: client.c:516 +#: client.c:508 msgid "Wait for exposition end" msgstr "Жду, пока не кончится экспозиция" -#: ccdfunc.c:568 +#: ccdfunc.c:440 msgid "Wheel device not pointed" msgstr "Устройство турели не указано" -#: ccdfunc.c:634 +#: ccdfunc.c:509 #, fuzzy, c-format msgid "Wheel model: %s" msgstr "Модель светоприемника: %s" -#: ccdfunc.c:648 +#: ccdfunc.c:523 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "Позиция колеса должна быть от 0 до %d" -#: main.c:106 +#: main.c:108 #, c-format msgid "Wrong port value: %d" msgstr "Неправильный номер порта: %d" @@ -859,11 +873,11 @@ msgstr " msgid "observing program name" msgstr "название программы" -#: imageview.c:769 +#: imageview.c:773 msgid "off" msgstr "выкл" -#: imageview.c:769 +#: imageview.c:773 msgid "on" msgstr "вкл" @@ -907,7 +921,7 @@ msgstr " msgid "run in 8-bit mode" msgstr "8-битный режим" -#: server.c:1099 +#: server.c:1088 msgid "server(): need at least command socket fd" msgstr "server(): нужен как минимум дескриптор командного сокета" @@ -943,7 +957,7 @@ msgstr " msgid "start (!=0) or stop(==0) infinity capturing loop" msgstr "начать (!=0) или закончить (==0) бесконечный цикл захвата изображений" -#: ccdfunc.c:1117 +#: ccdfunc.c:1014 msgid "start_socket(): can't open socket" msgstr "start_socket(): не могу открыть сокет" @@ -960,6 +974,3 @@ msgstr " #: cmdlnopts.c:68 msgid "wheel device plugin (e.g. devdummy.so)" msgstr "плагин устройства турели (например, devdummy.so)" - -#~ msgid "Camera device unknown" -#~ msgstr "Устройство свеоприемника не опознано" diff --git a/main.c b/main.c index cc91190..2f093fc 100644 --- a/main.c +++ b/main.c @@ -61,11 +61,13 @@ void signals(int signo){ if(!GP->client){ DBG("Cancel capturing and close all"); stop_server(); - }else exit(signo); + }else{ #ifdef IMAGEVIEW DBG("KILL GL"); closeGL(); #endif + exit(signo); + } //DBG("exit(%d)", signo); //exit(signo); } @@ -156,7 +158,9 @@ int main(int argc, char **argv){ } #endif if(camerainit) ccds(); - signals(0); + closewheel(); + focclose(); + return 0; } LOGMSG("Started"); #ifndef EBUG diff --git a/server.c b/server.c index e5e0851..9fcc51d 100644 --- a/server.c +++ b/server.c @@ -165,33 +165,12 @@ static void fixima(){ size_t len = camera->array.h * camera->array.w * 2; ima = cc_getshm(GP->shmkey, len); if(!ima) ERR(_("Can't allocate memory for image")); - ima->datasize = ima->bytelen; + if(!image_init_camdata(ima)){ + WARNX(_("Can't init camera data")); + LOGWARN("Can't init camera data"); + } // 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); @@ -279,7 +258,7 @@ static inline void cameracapturestate(){ // capturing - wait for exposition ends return; } fill_image_fields(ima); - //fillFITSheader(ima); + LOGDBG("Captured new image %zdx%zd pix", ima->w, ima->h); ++ima->imnumber; // increment counter cc_unlock_shm(); LOGDBG("cameracapturestate(): SHM UNlocked"); @@ -378,7 +357,9 @@ static int camdevini(int n){ if(GP->vbin < 1) GP->vbin = 1; fixima(); if(!camera->setbin || !camera->setbin(GP->hbin, GP->vbin)) WARNX(_("Can't set binning %dx%d"), GP->hbin, GP->vbin); - if(!camera->setgeometry || !camera->setgeometry(&curformat)) WARNX(_("Can't set given geometry")); + if(!camera->setgeometry || !camera->setgeometry(&curformat)){ + WARNX(_("Can't set given geometry")); + }else curformat = camera->geometry; return TRUE; } @@ -616,7 +597,7 @@ static cc_hresult formathandler(int fd, const char *key, const char *val){ fmt.w -= fmt.xoff; fmt.h -= fmt.yoff; int r = camera->setgeometry(&fmt); if(!r) return CC_RESULT_FAIL; - curformat = fmt; + curformat = camera->geometry; DBG("curformat: w=%d, h=%d", curformat.w, curformat.h); //fixima(); } @@ -1069,7 +1050,7 @@ static void *sendimage(void *C){ close(client); return NULL; } - LOGDBG("sendimage(): SHM locked"); + LOGDBG("sendimage(): SHM locked; new image size: %dx%d", ima->w, ima->h); cc_IMG *locimage = cc_newimage(ima->bitpix, ima->w, ima->h); if(!locimage || !cc_copyimage(locimage, ima, FALSE)){ cc_unlock_shm(); @@ -1079,12 +1060,20 @@ static void *sendimage(void *C){ } cc_unlock_shm(); LOGDBG("sendimage(): SHM UNlocked"); + int sent_ok = TRUE; do{ // send image body - if(!cc_senddata(client, locimage, sizeof(cc_IMG))) break; + if(!cc_senddata(client, locimage, sizeof(cc_IMG))){ sent_ok = FALSE; break; } // send image itself (client can close socket if don't need image data) - if(!cc_senddata(client, locimage->data, locimage->bytelen)) break; + if(!cc_senddata(client, locimage->data, locimage->bytelen)){ sent_ok = FALSE; break; } }while(0); + if(!sent_ok){ + DBG("Some error occured during data transmission"); + close(client); + cc_freeimage(&locimage); + return NULL; + } + DBG("OK, wait until client receives data"); shutdown(client, SHUT_WR); // tell client we are closing socket recv(client, locimage->data, locimage->bytelen, MSG_NOSIGNAL); // block until client close his side cc_freeimage(&locimage);