From a3134d31a822cc8b8794484e4824028157cab616 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 14 Jul 2026 15:51:23 +0300 Subject: [PATCH] some fixes (still have problems in client-server mode) --- TOUPCAM_cameras/toupcam.c | 44 ++- ccdcapture.c | 27 +- ccdfunc.c | 185 ++++++------ client.c | 85 +++--- cmdlnopts.c | 21 +- cmdlnopts.h | 9 + imageview.c | 17 +- locale/ru/messages.po | 581 ++++++++++++++++++++++++++++--------- locale/ru/ru.po | 593 +++++++++++++++++++++++++++++--------- main.c | 31 +- server.c | 60 ++-- 11 files changed, 1181 insertions(+), 472 deletions(-) diff --git a/TOUPCAM_cameras/toupcam.c b/TOUPCAM_cameras/toupcam.c index c299cc1..aa872a2 100644 --- a/TOUPCAM_cameras/toupcam.c +++ b/TOUPCAM_cameras/toupcam.c @@ -19,6 +19,7 @@ #include #include #include +#define TOUPCAM_HRESULT_ERRORCODE_NEEDED #include #include @@ -62,6 +63,28 @@ static double exptime = 0., starttime = 0.; // return constant string with error code description static const char *errcode(int ecode){ switch(ecode){ +#ifndef STR +#define STR(par) # par +#endif +#define ECASE(code) case code: return STR(code) + ECASE(S_OK); + ECASE(S_FALSE); + ECASE(E_UNEXPECTED); + ECASE(E_NOTIMPL); + ECASE(E_NOINTERFACE); + ECASE(E_ACCESSDENIED); + ECASE(E_OUTOFMEMORY); + ECASE(E_INVALIDARG); + ECASE(E_POINTER); + ECASE(E_FAIL); + ECASE(E_WRONG_THREAD); + ECASE(E_GEN_FAILURE); + ECASE(E_BUSY); + ECASE(E_PENDING); + ECASE(E_TIMEOUT); + ECASE(E_UNREACH); +#undef ECASE +#if 0 case 0: return "S_OK"; case 1: return "S_FALSE"; case 0x8000ffff: return "E_UNEXPECTED"; @@ -78,6 +101,7 @@ static const char *errcode(int ecode){ case 0x8000000a: return "E_PENDING"; case 0x8001011f: return "E_TIMEOUT"; case 0x80072743: return "E_UNREACH"; +#endif default: return "Unknown error"; } } @@ -88,7 +112,7 @@ static const char *errcode(int ecode){ static void camcancel(){ if(!toupcam.hcam) return; int e = Toupcam_Trigger(toupcam.hcam, 0); // stop triggering - if(e < 0) WARNX("Can't trigger 0: %s", errcode(e)); + if(e < 0 && e != E_UNEXPECTED) WARNX(_("Can't stop image triggering: %s"), errcode(e)); e = Toupcam_Stop(toupcam.hcam); if(e < 0) WARNX("Can't stop: %s", errcode(e)); toupcam.state = IM_SLEEP; @@ -371,7 +395,7 @@ static int camgetbrig(float *b){ if(Toupcam_get_Brightness(toupcam.hcam, &br) < 0) return FALSE; DBG("brightness=%d", br); if(b) *b = (float) br; - return FALSE; + return TRUE; } /** @@ -472,7 +496,7 @@ static int camgettc(float *t){ * @return FALSE if failed or no such property */ static int camgetth(float _U_ *t){ - TCHECK(); + //TCHECK(); return FALSE; } @@ -482,7 +506,7 @@ static int camgetth(float _U_ *t){ * @return FALSE if failed or no such property */ static int gettb(float _U_ *t){ - TCHECK(); + //TCHECK(); return FALSE; } @@ -548,6 +572,8 @@ static int camshutter(cc_shutter_op s){ */ static int camsetgeom(cc_frameformat *f){ TCHECK(); + if(!f) return FALSE; + // WARNX("Your ROI is: off - %dx%d, frame - %dx%d", f->xoff, f->yoff, f->w, f->h); if(Toupcam_put_Roi(toupcam.hcam, (unsigned) f->xoff, (unsigned) f->yoff, (unsigned) f->w, (unsigned) f->h) < 0) return FALSE; camera.geometry = *f; return TRUE; @@ -561,10 +587,10 @@ static int camsetgeom(cc_frameformat *f){ */ static int camgetnam(char *n, int l){ TCHECK(); - if(!toupcam.dev) return FALSE; + if(!toupcam.dev || !n || l < 1) return FALSE; DBG("name: %s, strncpy to %d buf", toupcam.dev->displayname, l); strncpy(n, toupcam.dev->displayname, l); - return FALSE; + return TRUE; } /** @@ -576,8 +602,8 @@ static int camgmg(float *mg){ TCHECK(); unsigned short gmin, gmax, gdef; if(Toupcam_get_ExpoAGainRange(toupcam.hcam, &gmin, &gmax, &gdef) < 0) return FALSE; - if(mg) *mg = gmax; - return FALSE; + if(mg) *mg = (float)gmax / 100.f; + return TRUE; } /** @@ -590,7 +616,7 @@ static int camggl(cc_frameformat *max, cc_frameformat _U_ *step){ TCHECK(); if(max) *max = camera.array; if(step) *step = (cc_frameformat){.w = 1, .h = 1, .xoff = 1, .yoff = 1}; - return FALSE; + return TRUE; } /** diff --git a/ccdcapture.c b/ccdcapture.c index 8110930..17a6a06 100644 --- a/ccdcapture.c +++ b/ccdcapture.c @@ -69,6 +69,7 @@ int cc_lock_shm(int isserver){ if(locked){ double t0 = sl_dtime(); while(sem_trywait(sem) && sl_dtime() - t0 < 0.1) sem_post(sem); // force locking + if(sl_dtime() - t0 >= 0.1) return FALSE; // can't lock - timeout } }else{ if(sem_timedwait(sem, &ts)){ @@ -90,7 +91,7 @@ void cc_unlock_shm(){ case EOVERFLOW: // already unlocked break; default: // not a valid? or other? - WARN("Can't unlock image semaphore"); + WARN(_("Can't unlock image semaphore")); LOGERR("Can't unlock image semaphore"); return; } @@ -147,20 +148,23 @@ int cc_open_socket(int isserver, char *path, int isnet){ }else{ DBG("UNIX socket"); char apath[128]; + int len = sizeof(sa_family_t); if(*path == 0){ DBG("convert name"); apath[0] = 0; strncpy(apath+1, path+1, 126); + len += strlen(path+1); }else if(strncmp("\\0", path, 2) == 0){ DBG("convert name"); apath[0] = 0; strncpy(apath+1, path+2, 126); + len += strlen(path+2); }else strcpy(apath, path); //unlink(apath); unaddr.sun_family = AF_UNIX; hints.ai_addr = (struct sockaddr*) &unaddr; hints.ai_addrlen = sizeof(unaddr); - memcpy(unaddr.sun_path, apath, 106); // if sun_path[0] == 0 we don't create a file + memcpy(unaddr.sun_path, apath, len); // if sun_path[0] == 0 we don't create a file hints.ai_family = AF_UNIX; hints.ai_socktype = SOCK_SEQPACKET; res = &hints; @@ -238,7 +242,8 @@ int cc_sendmessage(int fd, const char *msg, int l){ buflen = 1024 * (1 + l/1024); char *newbuf = realloc(tmpbuf, buflen); if(!newbuf){ - LOGERR("realloc())"); + WARN("realloc()"); + LOGERR("realloc()"); return FALSE; } tmpbuf = newbuf; @@ -335,7 +340,7 @@ cc_IMG *cc_getshm(key_t key, size_t imsize){ int flags = (imsize) ? IPC_CREAT | 0666 : 0; shmid = shmget(key, 0, flags); if(shmid < 0 && imsize == 0){ // no SHM segment for client - WARN("Can't get shared memory segment %d", key); + WARN(_("Can't get shared memory segment %d"), key); return NULL; } if(imsize){ // check if segment exists and its size equal to needs @@ -346,25 +351,25 @@ cc_IMG *cc_getshm(key_t key, size_t imsize){ } shmid = shmget(key, shmsize, flags); if(shmid < 0){ - WARN("Can't create shared memory segment %d", key); + WARN(_("Can't create shared memory segment %d"), key); return NULL; } }else{ #ifdef EBUG struct shmid_ds buf; - if(shmctl(shmid, IPC_STAT, &buf)) WARNX("Can't get SHM data"); + if(shmctl(shmid, IPC_STAT, &buf)) WARNX(_("Can't get SHM data")); else DBG("SHM size = %zd", buf.shm_segsz); #endif } flags = (imsize) ? 0 : SHM_RDONLY; // client opens memory in readonly mode cc_IMG *ptr = shmat(shmid, NULL, 0); if(ptr == (void*)-1){ - if(imsize) WARN("Can't attach SHM segment %d", key); + if(imsize) WARN(_("Can't attach SHM segment %d"), key); return NULL; } if(!imsize){ if(ptr->MAGICK != CC_SHM_MAGIC){ - WARNX("Shared memory %d isn't belongs to image server", key); + WARNX(_("Shared memory %d isn't belongs to image server"), key); shmdt(ptr); return NULL; } @@ -446,7 +451,7 @@ int cc_getNbytes(cc_IMG *image){ */ cc_strbuff *cc_strbufnew(size_t bufsize, size_t stringsize){ if(bufsize < 8 || stringsize < 8){ - WARNX("Need to allocate at least 8 bytes in buffers"); + WARNX(_("Need to allocate at least 8 bytes in buffers")); return NULL; } DBG("Allocate new string buffer with size %zd and string size %zd", bufsize, stringsize); @@ -629,7 +634,7 @@ static cc_hresult ask4cmd(int fd, cc_strbuff *buf, const char *cmdwargs){ if(r == 0) continue; else if(r < 0){ LOGERR("Socket disconnected"); - WARNX("Socket disconnected"); + WARNX(_("Socket disconnected")); ret = CC_RESULT_DISCONNECTED; goto rtn; } @@ -753,7 +758,7 @@ size_t cc_kwfromfile(cc_IMG *img, char *filename){ if(!img) return 0; sl_mmapbuf_t *buf = sl_mmap(filename); if(!buf || buf->len < 1){ - WARNX("Can't add FITS records from file %s", filename); + WARNX(_("Can't add FITS records from file %s"), filename); LOGWARN("Can't add FITS records from file %s", filename); return 0; } diff --git a/ccdfunc.c b/ccdfunc.c index c1b00dd..bfba9bb 100644 --- a/ccdfunc.c +++ b/ccdfunc.c @@ -106,14 +106,16 @@ do{ int status = 0, kt = 0; \ FORMKW("ORIGIN = 'SAO RAS' / Organization responsible for the data"); FORMKW("OBSERVAT = 'Special Astrophysical Observatory, Russia' / Observatory name"); FORMKW("INSTRUME = 'direct imaging' / Instrument"); - 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); + 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"); @@ -127,17 +129,19 @@ do{ int status = 0, kt = 0; \ FORMINT("STATMAX", img->max, "Max data value"); FORMFLT("STATAVR", img->avr, "Average data value"); FORMFLT("STATSTD", img->std, "Std. of data value"); - 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"); + 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); @@ -181,7 +185,7 @@ do{ int status = 0, kt = 0; \ 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->getModelName && camera->getModelName(bufc, FLEN_CARD)) + 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; @@ -195,7 +199,7 @@ int saveFITS(cc_IMG *img, char **outp){ char fnam[PATH_MAX+1]; if(!GP->outfile && !GP->outfileprefix){ LOGWARN("Image not saved: neither filename nor filename prefix pointed"); - WARNX("Image not saved: neither filename nor filename prefix pointed"); + WARNX(_("Image not saved: neither filename nor filename prefix pointed")); return FALSE; } if(GP->outfile){ // pointed specific output file name like "file.fits", check it @@ -206,7 +210,7 @@ int saveFITS(cc_IMG *img, char **outp){ }else{ // exists if(!GP->rewrite){ LOGERR("Can't save image: file %s exists", GP->outfile); - WARNX("File %s exists!", GP->outfile); + WARNX(_("File %s exists!"), GP->outfile); return FALSE; } snprintf(fnam, PATH_MAX, "!%s", GP->outfile); @@ -273,7 +277,7 @@ fits_write_history(fp, bufhdr->buf, &s); cloerr: if(fitserror == 0){ LOGMSG("Save file '%s'", fnam); - verbose(1, _("File saved as '%s'"), fnam); + verbose(VERBOSE_PRIMARY, _("File saved as '%s'"), fnam); DBG("file %s saved", fnam); if(outp){ FREE(*outp); @@ -346,14 +350,14 @@ void calculate_stat(cc_IMG *image){ cc_Focuser *startFocuser(){ if(!GP->focuserdev && !GP->commondev){ - verbose(3, _("Focuser device not pointed")); + verbose(VERBOSE_MESG, _("Focuser device not pointed")); return NULL; }else{ char *plugin = GP->commondev ? GP->commondev : GP->focuserdev; if(!(focuser = open_focuser(plugin))) return NULL; } if(!focuser->check()){ - verbose(3, _("No focusers found")); + verbose(VERBOSE_MESG, _("No focusers found")); focuser = NULL; return NULL; } @@ -377,7 +381,7 @@ void focusers(){ if(!focuser->setDevNo(i)) continue; char modname[256]; focuser->getModelName(modname, 255); - printf("Found focuser #%d: %s\n", i, modname); + verbose(VERBOSE_PRIMARY, _("Found focuser #%d: %s\n"), i, modname); } } int num = GP->focdevno; @@ -392,11 +396,11 @@ void focusers(){ } char buf[BUFSIZ]; if(focuser->getModelName(buf, BUFSIZ)){ - verbose(2, "Focuser model: %s", buf); + verbose(VERBOSE_SECONDARY, "Focuser model: %s", buf); } float t; if(focuser->getTbody(&t)){ - verbose(1, "FOCTEMP=%.1f", t); + verbose(VERBOSE_PRIMARY, "FOCTEMP=%.1f", t); DBG("FOCTEMP=%.1f", t); } float minpos, maxpos, curpos; @@ -404,14 +408,14 @@ void focusers(){ WARNX(_("Can't get focuser limit positions")); goto retn; } - verbose(1, "FOCMINPOS=%g", minpos); - verbose(1, "FOCMAXPOS=%g", maxpos); + verbose(VERBOSE_PRIMARY, "FOCMINPOS=%g", minpos); + verbose(VERBOSE_PRIMARY, "FOCMAXPOS=%g", maxpos); DBG("FOCMINPOS=%g, FOCMAXPOS=%g", minpos, maxpos); if(!focuser->getPos(&curpos)){ WARNX(_("Can't get current focuser position")); goto retn; } - verbose(1, "FOCPOS=%g", curpos); + verbose(VERBOSE_PRIMARY, "FOCPOS=%g", curpos); DBG("Curpos = %g", curpos); if(isnan(GP->gotopos) && isnan(GP->addsteps)) goto retn; // no focuser commands float tagpos = 0.; @@ -436,14 +440,14 @@ retn: cc_Wheel *startWheel(){ if(!GP->wheeldev && !GP->commondev){ - verbose(3, _("Wheel device not pointed")); + verbose(VERBOSE_MESG, _("Wheel device not pointed")); return NULL; }else{ char *plugin = GP->commondev ? GP->commondev : GP->wheeldev; if(!(wheel = open_wheel(plugin))) return NULL; } if(!wheel->check()){ - verbose(3, _("No wheels found")); + verbose(VERBOSE_MESG, _("No wheels found")); wheel = NULL; return NULL; } @@ -467,7 +471,7 @@ void wheels(){ if(!wheel->setDevNo(i)) continue; char modname[256]; wheel->getModelName(modname, 255); - printf("Found wheel #%d: %s\n", i, modname); + verbose(VERBOSE_PRIMARY, _("Found wheel #%d: %s\n"), i, modname); } } int num = GP->whldevno; @@ -482,21 +486,21 @@ void wheels(){ } char buf[BUFSIZ]; if(wheel->getModelName(buf, BUFSIZ)){ - verbose(2, "cc_Wheel model: %s", buf); + verbose(VERBOSE_SECONDARY, _("Wheel model: %s"), buf); } float t; if(wheel->getTbody(&t)){ - verbose(1, "WHEELTEMP=%.1f", t); + verbose(VERBOSE_PRIMARY, "WHEELTEMP=%.1f", t); } int pos, maxpos; if(wheel->getPos(&pos)){ - verbose(1, "WHEELPOS=%d", pos); - }else WARNX("Can't get current wheel position"); + 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(1, "WHEELMAXPOS=%d", maxpos); + verbose(VERBOSE_PRIMARY, "WHEELMAXPOS=%d", maxpos); pos = GP->setwheel; if(pos == -1) goto retn; // no wheel commands if(pos < 0 || pos > maxpos){ @@ -518,16 +522,16 @@ static void closeall(){ static cc_capture_status capt(){ cc_capture_status cs; float tremain, tmpf; - if(!camera->pollcapture){ + if(!camera || !camera->pollcapture){ WARNX(_("Camera plugin have no capture polling funtion.")); return CAPTURE_ABORTED; } while(camera->pollcapture(&cs, &tremain)){ if(cs != CAPTURE_PROCESS) break; if(tremain > 0.1){ - verbose(2, _("%.1f seconds till exposition ends"), tremain); - if(camera->getTcold && camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f", tmpf); - if(camera->getTbody && camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f", tmpf); + verbose(VERBOSE_SECONDARY, _("%.1f seconds till exposition ends"), tremain); + if(camera->getTcold && camera->getTcold(&tmpf)) verbose(VERBOSE_PRIMARY, "CCDTEMP=%.1f", tmpf); + if(camera->getTbody && camera->getTbody(&tmpf)) verbose(VERBOSE_PRIMARY, "BODYTEMP=%.1f", tmpf); } if(tremain > 6.) sleep(5); else if(tremain > 0.999999) sleep((int)(tremain+1e-6)); @@ -540,7 +544,7 @@ static cc_capture_status capt(){ cc_Camera *startCCD(){ if(!GP->cameradev && !GP->commondev){ - verbose(3, _("Camera device not pointed")); + verbose(VERBOSE_MESG, _("Camera device not pointed")); return NULL; }else{ char *plugin = GP->commondev ? GP->commondev : GP->cameradev; @@ -573,7 +577,7 @@ int prepare_ccds(){ if(camera->setDevNo && !camera->setDevNo(i)) continue; // if camera have no setDevNo function, it could have getModelName camera->getModelName(buf, BUFSIZ-1); - printf("Found camera #%d: %s\n", i, buf); + verbose(VERBOSE_PRIMARY, _("Found camera #%d: %s\n"), i, buf); } } int num = GP->camdevno; @@ -598,12 +602,12 @@ int prepare_ccds(){ DBG("got %s", *p); cc_charbufclr(b); cc_hresult r = camera->plugincmd(*p, b); - if(r == CC_RESULT_OK || r == CC_RESULT_SILENCE) green("Command '%s'", *p); + if(r == CC_RESULT_OK || r == CC_RESULT_SILENCE) green(_("Command '%s'"), *p); else{ stop = TRUE; - red("Command '%s'", *p); + red(_("Command '%s'"), *p); } - if(r != CC_RESULT_SILENCE) printf(" returns \"%s\"", cc_hresult2str(r)); + if(r != CC_RESULT_SILENCE) printf(_(" returns \"%s\""), cc_hresult2str(r)); if(b->buflen) printf("\n%s", b->buf); else printf("\n"); ++p; @@ -621,43 +625,60 @@ int prepare_ccds(){ else verbose(0, _("Set fan speed to %d"), GP->fanspeed); } } - int x0,x1, y0,y1; + int x0,x1, y0,y1; // will be inited here and used later if(camera->getModelName && camera->getModelName(buf, BUFSIZ)) - verbose(2, _("Camera model: %s"), buf); - verbose(2, _("Pixel size: %g x %g"), camera->pixX, camera->pixY); + verbose(VERBOSE_SECONDARY, _("Camera model: %s"), buf); + 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; snprintf(buf, BUFSIZ, "(%d, %d)(%d, %d)", x0, y0, x1, y1); - verbose(2, _("Full array: %s"), buf); + 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); - verbose(2, _("Field of view: %s"), buf); + 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); - verbose(2, _("Current format: %s"), buf); + verbose(VERBOSE_SECONDARY, _("Current format: %s"), buf); + cc_frameformat max, step; + if(camera->getgeomlimits && camera->getgeomlimits(&max, &step)){ + verbose(VERBOSE_SECONDARY, _("Maximal geometry (WxH): %dx%d"), max.w, max.h); + verbose(VERBOSE_SECONDARY, _("Minimal offset: %dx%d"), max.xoff, max.yoff); + verbose(VERBOSE_SECONDARY, _("Geometry steps: offset - %dx%d, size - %dx%d"), step.xoff, step.yoff, step.w, step.h); + } + int tmpi, tmpi1; + if(camera->getbin && camera->getbin(&tmpi, &tmpi1)) + verbose(VERBOSE_SECONDARY, _("Current binning: %d x %d"), tmpi, tmpi1); + uint8_t u8; + if(camera->getbitpix && camera->getbitpix(&u8)) + verbose(VERBOSE_SECONDARY, _("Current settings: %d bits per pixel"), u8); + float tmpf; + if(camera->getbrightness && camera->getbrightness(&tmpf)) + verbose(VERBOSE_SECONDARY, _("Current brightness: %g"), tmpf); + if(camera->getgain && camera->getgain(&tmpf)) + verbose(VERBOSE_SECONDARY, _("Current gain: %g"), &tmpf); + if(camera->getmaxgain && camera->getmaxgain(&tmpf)) + verbose(VERBOSE_SECONDARY, _("Maximal gain: %g"), tmpf); if(!isnan(GP->temperature)){ if(!camera->setT)WARNX(_("Camera plugin have no temperature setter")); else{if(!camera->setT((float)GP->temperature)) WARNX(_("Can't set T to %g degC"), GP->temperature); - else verbose(3, "SetT=%.1f", GP->temperature); + else verbose(VERBOSE_MESG, "SetT=%.1f", GP->temperature); } } - float tmpf; - if(camera->getTcold && camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f", tmpf); - if(camera->getTbody && camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f", tmpf); + if(camera->getTcold && camera->getTcold(&tmpf)) verbose(VERBOSE_PRIMARY, "CCDTEMP=%.1f", tmpf); + if(camera->getTbody && camera->getTbody(&tmpf)) verbose(VERBOSE_PRIMARY, "BODYTEMP=%.1f", tmpf); if(GP->shtr_cmd > -1 && GP->shtr_cmd < SHUTTER_AMOUNT){ const char *str[] = {"open", "close", "expose @high", "expose @low"}; - verbose(1, _("Shutter command: %s\n"), str[GP->shtr_cmd]); + verbose(VERBOSE_PRIMARY, _("Shutter command: %s\n"), str[GP->shtr_cmd]); if(!camera->shuttercmd || !camera->shuttercmd((cc_shutter_op)GP->shtr_cmd)) WARNX(_("Can't run shutter command %s (unsupported?)"), str[GP->shtr_cmd]); } if(GP->confio > -1){ - verbose(1, _("Try to configure I/O port as %d"), GP->confio); + verbose(VERBOSE_PRIMARY, _("Try to configure I/O port as %d"), GP->confio); if(!camera->confio || !camera->confio(GP->confio)) WARNX(_("Can't configure (unsupported?)")); } - int tmpi; if(GP->getio){ if(camera->getio && camera->getio(&tmpi)) verbose(0, "CCDIOPORT=0x%02X\n", tmpi); @@ -665,22 +686,22 @@ int prepare_ccds(){ WARNX(_("Can't get IOport state (unsupported?)")); } if(GP->setio > -1){ - verbose(1, _("Try to write %d to I/O port"), GP->setio); + verbose(VERBOSE_PRIMARY, _("Try to write %d to I/O port"), GP->setio); if(!camera->setio || !camera->setio(GP->setio)) - ERRX(_("Can't set IOport")); + WARNX(_("Can't set IOport")); } if(GP->exptime < 0.) goto retn; if(!isnan(GP->gain)){ DBG("Change gain to %g", GP->gain); if(camera->setgain && camera->setgain(GP->gain)){ if(camera->getgain) camera->getgain(&GP->gain); - verbose(1, _("Set gain to %g"), GP->gain); - }else ERRX(_("Can't set gain to %g"), GP->gain); + verbose(VERBOSE_PRIMARY, _("Set gain to %g"), GP->gain); + }else WARNX(_("Can't set gain to %g"), GP->gain); } if(!isnan(GP->brightness)){ if(camera->setbrightness && camera->setbrightness(GP->brightness)){ if(camera->getbrightness) camera->getbrightness(&GP->brightness); - verbose(1, _("Set brightness to %g"), GP->brightness); + verbose(VERBOSE_PRIMARY, _("Set brightness to %g"), GP->brightness); }else WARNX(_("Can't set brightness to %g"), GP->brightness); } /*********************** expose control ***********************/ @@ -700,11 +721,11 @@ int prepare_ccds(){ cc_frameformat fmt = {.w = GP->X1 - GP->X0, .h = GP->Y1 - GP->Y0, .xoff = GP->X0, .yoff = GP->Y0}; if(!camera->setgeometry || !camera->setgeometry(&fmt)) ERRX(_("Can't set given geometry")); - verbose(3, "Geometry: off=%d/%d, wh=%d/%d", fmt.xoff, fmt.yoff, fmt.w, fmt.h); + verbose(VERBOSE_MESG, "Geometry: off=%d/%d, wh=%d/%d", fmt.xoff, fmt.yoff, fmt.w, fmt.h); if(GP->nflushes > 0){ if(!camera->setnflushes || !camera->setnflushes(GP->nflushes)) WARNX(_("Can't set %d flushes"), GP->nflushes); - else verbose(3, "Nflushes=%d", GP->nflushes); + else verbose(VERBOSE_MESG, "Nflushes=%d", GP->nflushes); } if(!camera->setexp) ERRX(_("Camera plugin have no exposition setter")); if(!camera->setexp(GP->exptime)) @@ -717,12 +738,12 @@ int prepare_ccds(){ WARNX(_("Can't set bit depth")); if(!camera->setfastspeed || !camera->setfastspeed(GP->fast)) WARNX(_("Can't set readout speed")); - else verbose(1, _("Readout mode: %s"), GP->fast ? "fast" : "normal"); - if(!GP->outfile) verbose(1, _("Only show statistics")); + else verbose(VERBOSE_PRIMARY, _("Readout mode: %s"), GP->fast ? "fast" : "normal"); + if(!GP->outfile) verbose(VERBOSE_PRIMARY, _("Only show statistics")); // GET binning should be AFTER setgeometry! if(!camera->getbin || !camera->getbin(&GP->hbin, &GP->vbin)) WARNX(_("Can't get current binning")); - verbose(2, "Binning: %d x %d", GP->hbin, GP->vbin); + verbose(VERBOSE_SECONDARY, "Binning: %d x %d", GP->hbin, GP->vbin); rtn = TRUE; retn: if(!rtn) closecam(); @@ -736,7 +757,7 @@ void ccds(){ FNAME(); 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); + 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); @@ -746,7 +767,7 @@ DBG("w=%d, h=%d", raw_width, raw_height); for(int j = 0; j < GP->nframes; ++j){ TIMEINIT(); TIMESTAMP("Start next cycle"); - verbose(1, _("Capture frame %d"), j); + verbose(VERBOSE_PRIMARY, _("Capture frame %d"), j); if(!camera->startexposition) ERRX(_("Camera plugin have no function `start exposition`")); if(!camera->startexposition()){ WARNX(_("Can't start exposition")); @@ -757,7 +778,7 @@ DBG("w=%d, h=%d", raw_width, raw_height); WARNX(_("Can't capture image")); break; } - verbose(2, _("Read grabbed image")); + verbose(VERBOSE_SECONDARY, _("Read grabbed image")); TIMESTAMP("Read grabbed"); if(!camera->capture) ERRX(_("Camera plugin have no function `capture`")); if(!camera->capture(&ima)){ @@ -775,10 +796,10 @@ DBG("w=%d, h=%d", raw_width, raw_height); if(GP->pause_len && j != (GP->nframes - 1)){ double delta, time1 = sl_dtime() + GP->pause_len; while((delta = time1 - sl_dtime()) > 0.){ - verbose(1, _("%d seconds till pause ends\n"), (int)delta); + verbose(VERBOSE_PRIMARY, _("%d seconds till pause ends\n"), (int)delta); float tmpf; - if(camera->getTcold && camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f\n", tmpf); - if(camera->getTbody && camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f\n", tmpf); + if(camera->getTcold && camera->getTcold(&tmpf)) verbose(VERBOSE_PRIMARY, "CCDTEMP=%.1f\n", tmpf); + if(camera->getTbody && camera->getTbody(&tmpf)) verbose(VERBOSE_PRIMARY, "BODYTEMP=%.1f\n", tmpf); if(delta > 6.) sleep(5); else if(delta > 0.9) sleep((int)(delta+0.99)); else usleep((int)(delta*1e6 + 1)); @@ -810,7 +831,7 @@ void framerate(){ sumn = sumn - lastn[lastidx] + dT; lastn[lastidx] = dT; //for(int i = 0; i < NFRM; ++i) printf("last[%d]=%g\n", i, lastn[i]); - green("Framerate=%.2f (%g seconds for exp); mean framerate=%.2f\n", 1./dT, dT, NFRM/sumn); + verbose(VERBOSE_SECONDARY, _("Framerate=%.2f (%g seconds for exp); mean framerate=%.2f"), 1./dT, dT, NFRM/sumn); tlast = t; } @@ -888,7 +909,7 @@ int ccdcaptured(cc_IMG **imgptr){ TIMESTAMP("Start new grab"); TIMEINIT(); if(pthread_create(&grabthread, NULL, &grabnext, (void*)ima)){ - WARN("Can't create grabbing thread"); + WARN(_("Can't create grabbing thread")); grabthread = 0; } }else{ // grab in process @@ -919,11 +940,11 @@ int start_socket(int isserver){ int isnet = 0; if(GP->path) path = GP->path; else if(GP->port){ path = GP->port; isnet = 1; } - else ERRX("Point network port or UNIX-socket path"); + else ERRX(_("Point network port or UNIX-socket path")); int sock = cc_open_socket(isserver, path, isnet), imsock = -1; if(sock < 0){ LOGERR("Can't open socket"); - ERRX("start_socket(): can't open socket"); + ERRX(_("start_socket(): can't open socket")); } if(isserver){ imsock = cc_open_socket(TRUE, GP->imageport, 2); // image socket should be networked @@ -932,7 +953,7 @@ int start_socket(int isserver){ }else{ #ifdef IMAGEVIEW if(GP->showimage){ - if(!GP->viewer && GP->exptime < 0.00001) ERRX("Need exposition time!"); + if(!GP->viewer && GP->exptime < 0.00001) ERRX(_("Need exposition time!")); init_grab_sock(sock); viewer(sockcaptured); // start viewer with socket client parser DBG("done"); diff --git a/client.c b/client.c index aa928fb..a0978db 100644 --- a/client.c +++ b/client.c @@ -39,11 +39,11 @@ extern double answer_timeout; static char sendbuf[BUFSIZ]; static char *lastfilename = NULL; // send message and wait any answer -#define SENDMSG(...) do{DBG("SENDMSG"); snprintf(sendbuf, BUFSIZ-1, __VA_ARGS__); verbose(2, "\t> %s", sendbuf); if(!cc_sendstrmessage(sock, sendbuf)) ERRX("Server disconnected"); while(getans(sock, NULL));} while(0) +#define SENDMSG(...) do{DBG("SENDMSG"); snprintf(sendbuf, BUFSIZ-1, __VA_ARGS__); verbose(VERBOSE_SECONDARY, "\t> %s", sendbuf); if(!cc_sendstrmessage(sock, sendbuf)) ERRX(_("Server disconnected")); getans(sock, NULL);} while(0) // send message and wait answer starting with 'cmd' -#define SENDMSGW(cmd, ...) do{DBG("SENDMSGW"); snprintf(sendbuf, BUFSIZ-1, cmd __VA_ARGS__); verbose(2, "\t> %s", sendbuf); if(!cc_sendstrmessage(sock, sendbuf)) ERRX("Server disconnected");}while(!getans(sock, cmd)) +#define SENDMSGW(cmd, ...) do{DBG("SENDMSGW"); snprintf(sendbuf, BUFSIZ-1, cmd __VA_ARGS__); verbose(VERBOSE_SECONDARY, "\t> %s", sendbuf); if(!cc_sendstrmessage(sock, sendbuf)) ERRX(_("Server disconnected")); else getans(sock, cmd);}while(0) // send command and wait for answer on it -#define SENDCMDW(cmd) do{DBG("SENDCMDW"); strncpy(sendbuf, cmd, BUFSIZ-1); verbose(2, "\t> %s", sendbuf); if(!cc_sendstrmessage(sock, sendbuf)) ERRX("Server disconnected");}while(!getans(sock, cmd)) +#define SENDCMDW(cmd) do{DBG("SENDCMDW"); strncpy(sendbuf, cmd, BUFSIZ-1); verbose(VERBOSE_SECONDARY, "\t> %s", sendbuf); if(!cc_sendstrmessage(sock, sendbuf)) ERRX(_("Server disconnected")); else getans(sock, cmd);}while(0) static volatile atomic_int expstate = CAMERA_CAPTURE; static int xm0,ym0,xm1,ym1; // max format static int xc0,yc0,xc1,yc1; // current format @@ -54,7 +54,7 @@ static int oldgrabno = 0; static cc_IMG ima = {0}, *shmima = NULL; // ima - local storage, shmima - shm (if available) static size_t imbufsz = 0; // image buffer for allocated `ima` static uint8_t *imbuf = NULL; // we can't use shmima->data as it belongs to server, so we use `imbuf` and set ima.data = imbuf -static int current_image_number = -1; // for net-parser - last number of exposed image +static volatile atomic_int current_image_number = -1; // for net-parser - last number of exposed image #if 0 // read message from queue or file descriptor @@ -91,7 +91,7 @@ static cc_hresult parseans(char *ans){ for(cc_hresult res = CC_RESULT_BUSY; res < CC_RESULT_NUM; ++res){ const char *resmsg = cc_hresult2str(res); if(0 == strcmp(resmsg, ans)){ - verbose(1, "Server answered: %s", resmsg); + verbose(VERBOSE_PRIMARY, "Server answered: %s", resmsg); return res; } } @@ -110,7 +110,7 @@ static cc_hresult parseans(char *ans){ DBG("Got current format: %d,%d,%d,%d", xc0, yc0, xc1, yc1); return CC_RESULT_SILENCE; }else if(0 == CMP_ANS(CC_CMD_IMNUMBER, ans)){ - current_image_number = atoi(val); + atomic_store(¤t_image_number, atoi(val)); } //TIMESTAMP("parseans() end"); return CC_RESULT_SILENCE; // echo of sent command or something else @@ -147,7 +147,7 @@ static int getans(int sock, const char *msg){ tmout = answer_timeout; t0 = sl_dtime(); TIMESTAMP("Got from server: %s", ans); - verbose(1, "\t%s", ans); + verbose(VERBOSE_PRIMARY, "\t%s", ans); DBG("1 msg-> %s, ans -> %s", msg, ans); res = parseans(ans); DBG("2 msg-> %s, ans -> %s; result: %d", msg, ans, res); @@ -170,9 +170,9 @@ static int getans(int sock, const char *msg){ static void send_headers(int sock){ if(GP->plugincmd){ char **p = GP->plugincmd; - green("Send custom plugin commands\n"); + verbose(VERBOSE_PRIMARY, _("Send custom plugin commands\n")); while(p && *p){ - printf("\t%s\n", *p); + verbose(VERBOSE_PRIMARY, "\t%s\n", *p); SENDMSGW(CC_CMD_PLUGINCMD, "=%s", *p); ++p; } @@ -273,7 +273,7 @@ static int readNbytes(int fd, size_t N, uint8_t *buf){ ssize_t rd = read(fd, buf + got, need); if(rd <= 0){ if(errno == EAGAIN || errno == EWOULDBLOCK) continue; - WARNX("Server disconnected"); + WARNX(_("Server disconnected")); signals(1); } got += rd; need -= rd; @@ -304,7 +304,7 @@ static int getimage(int askheader){ usleep(100); } if(!shmlocked){ - WARNX("Can't lock shared memory"); + WARNX(_("Can't lock shared memory")); return FALSE; } memcpy(&ima, shmima, sizeof(cc_IMG)); @@ -313,19 +313,19 @@ static int getimage(int askheader){ DBG("Open socket @ %s", GP->imageport); imsock = cc_open_socket(FALSE, GP->imageport, TRUE); } - if(imsock < 0) ERRX("getimage(): can't open image transport socket"); + if(imsock < 0) ERRX(_("getimage(): can't open image transport socket")); // get image size if(!readNbytes(imsock, sizeof(cc_IMG), (uint8_t*)&ima)){ - WARNX("Can't read image header"); + WARNX(_("Can't read image header")); goto eofg; } } if(ima.MAGICK != CC_SHM_MAGIC){ - WARNX("Wrong image: bad magick"); + WARNX(_("Wrong image: bad magick")); goto eofg; } if(ima.bytelen < 1){ - WARNX("Wrong image size"); + WARNX(_("Wrong image size")); goto eofg; } DBG("bytelen=%zd, w=%d, h=%d; bitpix=%d", ima.bytelen, ima.w, ima.h, ima.bitpix); @@ -333,14 +333,22 @@ static int getimage(int askheader){ if(imbufsz < ima.bytelen){ size_t newsz = 1024 * (1 + ima.bytelen / 1024); DBG("Reallocate memory from %zd to %zd", imbufsz, newsz); - imbufsz = newsz; + uint8_t *b = imbuf; imbuf = realloc(imbuf, imbufsz); + if(imbuf){ + imbufsz = newsz; + DBG("Size after realloc: %zd", imbufsz); + }else{ + WARNX(_("Can't reallocate memory for image buffer")); + imbuf = b; + goto eofg; + } } ima.data = imbuf; // renew this value each time after getting `ima` from server TIMESTAMP("Start of data read"); if(shmima){ uint8_t *datastart = ((uint8_t*)shmima) + sizeof(cc_IMG); - DBG("first image byte: %d", *datastart); + DBG("first image byte: %d; bytelen: %zd", *datastart, ima.bytelen); memcpy(imbuf, datastart, ima.bytelen); TIMESTAMP("Got by shared memory"); if(!askheader){ @@ -350,7 +358,7 @@ static int getimage(int askheader){ ret = TRUE; }else{ if(!readNbytes(imsock, ima.bytelen, imbuf)){ - WARNX("Can't read image data"); + WARNX(_("Can't read image data")); goto eofg; } ret = TRUE; @@ -369,7 +377,7 @@ static int getimage(int askheader){ uint8_t card[FLEN_CARD]; for(size_t i = 0; i < ima.headerstrings; ++i){ if(!readNbytes(imsock, FLEN_CARD, card)){ - WARNX("Can't read full header, got %zd records from %zd", i, ima.headerstrings); + WARNX(_("Can't read full header, got %zd records from %zd"), i, ima.headerstrings); break; } memcpy(&ima.fitsheader[i], card, FLEN_CARD); @@ -399,14 +407,14 @@ static int curImNo(int sock){ } // no shared memory: try to get number over TCP SENDCMDW(CC_CMD_IMNUMBER); - return current_image_number; + return atomic_load(¤t_image_number); } void client(int sock){ - if(sock < 0) ERRX("Can't run without command socket"); + if(sock < 0) ERRX(_("Can't run without command socket")); if(!GP->forceimsock && !shmima){ // init shm buffer if user don't ask to force workign through image socket shmima = cc_getshm(GP->shmkey, 0); // try to init client shm - cc_init_sem(FALSE); + if(shmima) cc_init_sem(FALSE); DBG("Got access to shared memory: %s", shmima ? "OK" : "FAIL"); } if(GP->restart){ @@ -425,10 +433,10 @@ void client(int sock){ SENDMSGW(CC_CMD_EXPSTATE, "=%d", CAMERA_CAPTURE); // call to start capture } else return; // just send headers and exit double timeout = CC_CLIENT_TIMEOUT; - verbose(1, "Exposing frame 1..."); + verbose(VERBOSE_PRIMARY, _("Exposing frame 1...")); atomic_store(&expstate, CAMERA_CAPTURE); // could be changed earlier DBG("Current state: %d", atomic_load(&expstate)); - verbose(2, "Wait for exposition end"); + verbose(VERBOSE_PRIMARY, _("Wait for exposition end")); t0 = sl_dtime(); tw = tstart = t0; int lastImNo = curImNo(sock); @@ -436,19 +444,22 @@ void client(int sock){ if(sl_dtime() - tw > CC_WAIT_TIMEOUT){ SENDCMDW(CC_CMD_TREMAIN); // get remained time tw = sl_dtime(); + usleep(100000); } if(sl_dtime() - tstart < GP->exptime){ t0 = sl_dtime(); // refresh timeout until exp not ends + usleep(1000); continue; }else{ SENDCMDW(CC_CMD_EXPSTATE); + usleep(1000); } int curst = atomic_load(&expstate); DBG("Current state: %d", curst); if(curst == CAMERA_ERROR){ WARNX(_("Can't make exposition")); if(Nremain > 1){ - verbose(1, "Exposing frame %d...", nframe); + verbose(VERBOSE_PRIMARY, _("Exposing frame %d..."), nframe); SENDMSGW(CC_CMD_EXPSTATE, "=%d", CAMERA_CAPTURE); tstart = sl_dtime(); } @@ -459,16 +470,16 @@ void client(int sock){ int cur = curImNo(sock); DBG("Current state: %d, imno: %d", atomic_load(&expstate), cur); if(Nremain > 1){ // start next capture - verbose(1, "Exposing frame %d...", nframe); + verbose(VERBOSE_PRIMARY, _("Exposing frame %d..."), nframe); SENDMSGW(CC_CMD_EXPSTATE, "=%d", CAMERA_CAPTURE); tstart = sl_dtime(); } int failed = TRUE; if(lastImNo < cur){ lastImNo = cur; - verbose(2, "Frame ready, try to grab"); + verbose(VERBOSE_SECONDARY, _("Frame ready, try to grab")); if(!getimage(TRUE)){ - WARNX("Can't get next image"); + WARNX(_("Can't get next image")); }else{ if(saveFITS(&ima, &lastfilename)){ --Nremain; @@ -476,9 +487,9 @@ void client(int sock){ failed = FALSE; } } - }else verbose(2, "Got already saved image, wait next"); + }else verbose(VERBOSE_SECONDARY, _("Got already saved image, wait next")); if(failed && Nremain == 1){ // last image -> should re-expose - verbose(1, "Exposing frame %d...", nframe); + verbose(VERBOSE_PRIMARY, _("Exposing frame %d..."), nframe); SENDMSGW(CC_CMD_EXPSTATE, "=%d", CAMERA_CAPTURE); tstart = sl_dtime(); } @@ -488,14 +499,14 @@ void client(int sock){ while(1){ SENDCMDW(CC_CMD_CAMTEMPER); if((delta = time1 - sl_dtime()) < __FLT_EPSILON__) break; - if(delta > 1.) verbose(1, _("%d seconds till pause ends\n"), (int)delta); + if(delta > 1.) verbose(VERBOSE_PRIMARY, _("%d seconds till pause ends\n"), (int)delta); if(delta > 6.) sleep(5); else if(delta > 1.) sleep((int)delta); else usleep((int)(delta*1e6 + 1)); } } }else{ - DBG("All images saved -> exit"); + verbose(VERBOSE_SECONDARY, "Got all images, closing..."); break; } } @@ -506,7 +517,7 @@ void client(int sock){ #ifdef IMAGEVIEW static int controlfd = -1; // control socket FD void init_grab_sock(int sock){ - if(sock < 0) ERRX("Can't run without command socket"); + if(sock < 0) ERRX(_("Can't run without command socket")); controlfd = sock; send_headers(sock); if(!GP->forceimsock && !shmima){ // init shm buffer if user don't ask to work through image socket @@ -549,7 +560,7 @@ static void *grabnext(void _U_ *arg){ } int cur = curImNo(sock); if(sl_dtime() - t0 >= timeout || curst != CAMERA_FRAMERDY || cur <= lastImNo){ - WARNX("Image wasn't received, state: %d, waiting: %g, lastNo: %d, curNo: %d (timeout: %g)", curst, sl_dtime() - t0, lastImNo, cur, timeout); + WARNX(_("Image wasn't received, state: %d, waiting: %g, lastNo: %d, curNo: %d (timeout: %g)"), curst, sl_dtime() - t0, lastImNo, cur, timeout); continue; } lastImNo = cur; @@ -607,16 +618,16 @@ int sockcaptured(cc_IMG **imgptr){ if(!grabthread || pthread_kill(grabthread, 0)){ // start new grab if(GP->viewer){ TIMEINIT(); - DBG("\n\n\nStart new waiting"); + DBG("\n\n\nStart new capturing"); if(pthread_create(&grabthread, NULL, &waitimage, NULL)){ - WARN("Can't create waiting thread"); + WARN(_("Can't create capturing thread")); grabthread = 0; } }else{ TIMEINIT(); DBG("\n\n\nStart new grab"); if(pthread_create(&grabthread, NULL, &grabnext, NULL)){ - WARN("Can't create grabbing thread"); + WARN(_("Can't create capturing thread")); grabthread = 0; } } diff --git a/cmdlnopts.c b/cmdlnopts.c index 6efbfaf..aa85b08 100644 --- a/cmdlnopts.c +++ b/cmdlnopts.c @@ -1,4 +1,20 @@ - +/* + * This file is part of the CCD_Capture project. + * Copyright 2026 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include // NAN @@ -137,10 +153,11 @@ glob_pars *parse_args(int argc, char **argv){ // parse arguments sl_parseargs(&argc, &argv, cmdlnopts); if(help) sl_showhelp(-1, cmdlnopts); + if(G.verbose > VERBOSE_MESG) G.verbose = VERBOSE_MESG; if(argc > 0){ G.outfileprefix = strdup(argv[0]); if(argc > 1){ - WARNX("%d unused parameters:\n", argc - 1); + WARNX(_("%d unused parameters:\n"), argc - 1); for(int i = 1; i < argc; ++i) printf("\t%4d: %s\n", i, argv[i]); } diff --git a/cmdlnopts.h b/cmdlnopts.h index 4074a55..8ddcaaf 100644 --- a/cmdlnopts.h +++ b/cmdlnopts.h @@ -19,6 +19,15 @@ #pragma once #include +// verbose levels +enum{ + VERBOSE_NONE = 0, // show nothing + VERBOSE_PRIMARY, // only main messages + VERBOSE_SECONDARY, // also secondary messages + VERBOSE_MESG, // debug messages + VERBOSE_AMOUNT // just amount of levels +}; + /* * here are some typedef's for global data */ diff --git a/imageview.c b/imageview.c index 313eb86..e54ca3f 100644 --- a/imageview.c +++ b/imageview.c @@ -422,7 +422,7 @@ static void change_colorfun(colorfn_type f){ colorfun = linfun; cfn = "linear"; } - verbose(1, _("Histogram conversion: %s"), cfn); + verbose(VERBOSE_PRIMARY, _("Histogram conversion: %s"), cfn); } // cycle switch between palettes @@ -612,7 +612,7 @@ static void change_displayed_image(cc_IMG *img){ static size_t lastN = 0; ssize_t delta = img->imnumber - lastN; TIMESTAMP("Got image #%zd", img->imnumber); - if(delta > 0 && delta != 1) WARNX("Missed %zd images", delta-1); + if(delta > 0 && delta != 1) WARNX(_("Missed %zd images"), delta-1); lastN = img->imnumber; //pthread_mutex_lock(&win->mutex); rawimage *im = win->image; @@ -694,12 +694,12 @@ void closeGL(){ // killed by external signal or ctrl+c */ int viewer(imagefunc newimage){ if(!newimage){ - WARNX("No image changing function defined"); + WARNX(_("No image changing function defined")); return 1; } imageview_init(); DBG("Create new win"); - createGLwin("Sample window", 1024, 1024, NULL); + createGLwin("ccd_capture", 1024, 1024, NULL); if(!win){ WARNX(_("Can't open OpenGL window, image preview will be inaccessible")); return 1; @@ -731,7 +731,12 @@ int viewer(imagefunc newimage){ continue; } if(win->winevt & WINEVT_SAVEIMAGE){ // save image - verbose(2, "Make screenshot\n"); + verbose(VERBOSE_PRIMARY, _("Make screenshot")); + if(GP->outfile) GP->rewrite = TRUE; + else if(!GP->outfileprefix){ + GP->outfileprefix = strdup("ccd_capture-screenshot"); + verbose(VERBOSE_PRIMARY, _("Set output prefix to %s"), GP->outfileprefix); + } saveFITS(img, NULL); win->winevt &= ~WINEVT_SAVEIMAGE; } @@ -743,7 +748,7 @@ int viewer(imagefunc newimage){ if(win->winevt & WINEVT_EQUALIZE){ win->winevt &= ~WINEVT_EQUALIZE; imequalize = !imequalize; - verbose(1, _("Equalization of histogram: %s"), imequalize ? N_("on") : N_("off")); + verbose(VERBOSE_PRIMARY, _("Equalization of histogram: %s"), imequalize ? N_("on") : N_("off")); change_displayed_image(img); } } diff --git a/locale/ru/messages.po b/locale/ru/messages.po index c8da9e7..cadd8bc 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-06-08 17:06+0300\n" +"POT-Creation-Date: 2026-07-14 14:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,581 +17,863 @@ msgstr "" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" -#: cmdlnopts.c:48 +#: main.c:52 +#, c-format +msgid "Master killed with sig=%d" +msgstr "" + +#. slave: cancel exposition +#: main.c:57 +#, c-format +msgid "Get signal %d - exit" +msgstr "" + +#: main.c:91 +msgid "Can't use outfile name and prefix together" +msgstr "" + +#: main.c:94 ccdfunc.c:213 +#, c-format +msgid "File %s exists!" +msgstr "" + +#: main.c:97 +#, c-format +msgid "Can't set answer timeout to %g" +msgstr "" + +#: 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:106 +#, c-format +msgid "Wrong port value: %d" +msgstr "" + +#: main.c:119 +#, c-format +msgid "Set image port to %s\n" +msgstr "" + +#: main.c:122 +msgid "Can't be client and standalone in same time!" +msgstr "" + +#: main.c:127 +#, c-format +msgid "Log file %s @ level %d\n" +msgstr "" + +#: main.c:129 +msgid "Can't create log file" +msgstr "" + +#: cmdlnopts.c:64 msgid "common device plugin (e.g devfli.so)" msgstr "" -#: cmdlnopts.c:49 +#: cmdlnopts.c:65 msgid "custom camera device plugin command" msgstr "" -#: cmdlnopts.c:50 +#: cmdlnopts.c:66 msgid "camera device plugin (e.g. devfli.so)" msgstr "" -#: cmdlnopts.c:51 +#: cmdlnopts.c:67 msgid "focuser device plugin (e.g. devzwo.so)" msgstr "" -#: cmdlnopts.c:52 +#: cmdlnopts.c:68 msgid "wheel device plugin (e.g. devdummy.so)" msgstr "" -#: cmdlnopts.c:53 +#: cmdlnopts.c:69 msgid "list connected devices" msgstr "" -#: cmdlnopts.c:54 +#: cmdlnopts.c:70 msgid "camera device number (if many: 0, 1, 2 etc)" msgstr "" -#: cmdlnopts.c:55 +#: cmdlnopts.c:71 msgid "filter wheel device number (if many: 0, 1, 2 etc)" msgstr "" -#: cmdlnopts.c:56 +#: cmdlnopts.c:72 msgid "focuser device number (if many: 0, 1, 2 etc)" msgstr "" -#: cmdlnopts.c:57 +#: cmdlnopts.c:73 msgid "show this help" msgstr "" -#: cmdlnopts.c:58 +#: cmdlnopts.c:74 msgid "rewrite output file if exists" msgstr "" -#: cmdlnopts.c:59 +#: cmdlnopts.c:75 msgid "" "verbose level (-V - main messages, -VV - secondary messages, -VVV - debug)" msgstr "" -#: cmdlnopts.c:60 +#: cmdlnopts.c:76 msgid "not open shutter, when exposing (\"dark frames\")" msgstr "" -#: cmdlnopts.c:61 +#: cmdlnopts.c:77 msgid "run in 8-bit mode" msgstr "" -#: cmdlnopts.c:62 +#: cmdlnopts.c:78 msgid "fast readout mode" msgstr "" -#: cmdlnopts.c:63 +#: cmdlnopts.c:79 msgid "set CCD temperature to given value (degr C)" msgstr "" -#: cmdlnopts.c:64 +#: cmdlnopts.c:80 msgid "set fan speed (0 - off, 1 - low, 2 - high)" msgstr "" -#: cmdlnopts.c:66 +#: cmdlnopts.c:82 msgid "program author" msgstr "" -#: cmdlnopts.c:67 +#: cmdlnopts.c:83 msgid "object type (neon, object, flat etc)" msgstr "" -#: cmdlnopts.c:68 +#: cmdlnopts.c:84 msgid "instrument name" msgstr "" -#: cmdlnopts.c:69 +#: cmdlnopts.c:85 msgid "object name" msgstr "" -#: cmdlnopts.c:70 +#: cmdlnopts.c:86 msgid "observers' names" msgstr "" -#: cmdlnopts.c:71 +#: cmdlnopts.c:87 msgid "observing program name" msgstr "" -#: cmdlnopts.c:72 +#: cmdlnopts.c:88 msgid "add records to header from given file[s]" msgstr "" -#: cmdlnopts.c:73 +#: cmdlnopts.c:89 msgid "output file name" msgstr "" -#: cmdlnopts.c:75 +#: cmdlnopts.c:91 msgid "N flushes before exposing (default: 1)" msgstr "" -#: cmdlnopts.c:76 +#: cmdlnopts.c:92 msgid "horizontal binning to N pixels" msgstr "" -#: cmdlnopts.c:77 +#: cmdlnopts.c:93 msgid "vertical binning to N pixels" msgstr "" -#: cmdlnopts.c:78 +#: cmdlnopts.c:94 msgid "make series of N frames" msgstr "" -#: cmdlnopts.c:79 +#: cmdlnopts.c:95 msgid "make pause for N seconds between expositions" msgstr "" -#: cmdlnopts.c:80 +#: cmdlnopts.c:96 msgid "set exposure time to given value (seconds!)" msgstr "" -#: cmdlnopts.c:81 +#: cmdlnopts.c:97 msgid "cancel current exposition" msgstr "" -#: cmdlnopts.c:82 +#: cmdlnopts.c:98 msgid "" "absolute (not divided by binning!) frame X0 coordinate (-1 - all with " "overscan)" msgstr "" -#: cmdlnopts.c:83 +#: cmdlnopts.c:99 msgid "absolute frame Y0 coordinate (-1 - all with overscan)" msgstr "" -#: cmdlnopts.c:84 +#: cmdlnopts.c:100 msgid "absolute frame X1 coordinate (-1 - all with overscan)" msgstr "" -#: cmdlnopts.c:85 +#: cmdlnopts.c:101 msgid "absolute frame Y1 coordinate (-1 - all with overscan)" msgstr "" -#: cmdlnopts.c:87 +#: cmdlnopts.c:103 msgid "open shutter" msgstr "" -#: cmdlnopts.c:88 +#: cmdlnopts.c:104 msgid "close shutter" msgstr "" -#: cmdlnopts.c:89 +#: cmdlnopts.c:105 msgid "run exposition on LOW @ pin5 I/O port" msgstr "" -#: cmdlnopts.c:90 +#: cmdlnopts.c:106 msgid "run exposition on HIGH @ pin5 I/O port" msgstr "" -#: cmdlnopts.c:91 +#: cmdlnopts.c:107 msgid "get value of I/O port pins" msgstr "" -#: cmdlnopts.c:92 +#: cmdlnopts.c:108 msgid "move stepper motor asynchronous" msgstr "" -#: cmdlnopts.c:94 +#: cmdlnopts.c:110 msgid "set I/O port pins to given value (decimal number, pin1 is LSB)" msgstr "" -#: cmdlnopts.c:95 +#: cmdlnopts.c:111 msgid "" "configure I/O port pins to given value (decimal number, pin1 is LSB, 1 == " "output, 0 == input)" msgstr "" -#: cmdlnopts.c:97 +#: cmdlnopts.c:113 msgid "move focuser to absolute position, mm" msgstr "" -#: cmdlnopts.c:98 +#: cmdlnopts.c:114 msgid "move focuser to relative position, mm (only for standalone)" msgstr "" -#: cmdlnopts.c:100 +#: cmdlnopts.c:116 msgid "set wheel position" msgstr "" -#: cmdlnopts.c:102 +#: cmdlnopts.c:118 msgid "CMOS gain level" msgstr "" -#: cmdlnopts.c:103 +#: cmdlnopts.c:119 msgid "CMOS brightness level" msgstr "" -#: cmdlnopts.c:105 +#: cmdlnopts.c:121 msgid "logging file name (if run as server)" msgstr "" -#: cmdlnopts.c:106 +#: cmdlnopts.c:122 msgid "UNIX socket name (command socket)" msgstr "" -#: cmdlnopts.c:107 +#: cmdlnopts.c:123 msgid "local INET command socket port" msgstr "" -#: cmdlnopts.c:108 +#: cmdlnopts.c:124 msgid "INET image socket port" msgstr "" -#: cmdlnopts.c:109 +#: cmdlnopts.c:125 msgid "run as client" msgstr "" -#: cmdlnopts.c:110 +#: cmdlnopts.c:126 msgid "passive viewer (only get last images)" msgstr "" -#: cmdlnopts.c:111 +#: cmdlnopts.c:127 msgid "restart image server" msgstr "" -#: cmdlnopts.c:112 +#: cmdlnopts.c:128 msgid "network answer timeout (default: 0.1s)" msgstr "" -#: cmdlnopts.c:113 +#: cmdlnopts.c:129 msgid "" "get base information about connected hardware (also increasing text messages " "level to 2)" msgstr "" -#: cmdlnopts.c:115 +#: cmdlnopts.c:131 msgid "shared memory (with image data) key (default: 7777777)" msgstr "" -#: cmdlnopts.c:116 +#: cmdlnopts.c:132 msgid "force using image through socket transition even if can use SHM" msgstr "" -#: cmdlnopts.c:117 +#: cmdlnopts.c:133 msgid "start (!=0) or stop(==0) infinity capturing loop" msgstr "" -#: cmdlnopts.c:120 +#: cmdlnopts.c:136 msgid "Display image in OpenGL window" msgstr "" -#: ccdfunc.c:216 +#: cmdlnopts.c:160 +#, c-format +msgid "%d unused parameters:\n" +msgstr "" + +#: ccdfunc.c:202 +msgid "Image not saved: neither filename nor filename prefix pointed" +msgstr "" + +#: ccdfunc.c:220 #, c-format msgid "Can't save file with prefix %s" msgstr "" -#: ccdfunc.c:276 +#: ccdfunc.c:280 #, c-format msgid "File saved as '%s'" msgstr "" -#: ccdfunc.c:285 +#: ccdfunc.c:289 msgid "Error saving file" msgstr "" -#: ccdfunc.c:340 +#: ccdfunc.c:344 #, c-format msgid "Image stat:\n" msgstr "" -#: ccdfunc.c:349 +#: ccdfunc.c:353 msgid "Focuser device not pointed" msgstr "" -#: ccdfunc.c:356 +#: ccdfunc.c:360 msgid "No focusers found" msgstr "" -#: ccdfunc.c:386 +#: ccdfunc.c:384 +#, c-format +msgid "Found focuser #%d: %s\n" +msgstr "" + +#: ccdfunc.c:390 #, c-format msgid "Found %d focusers, you point number %d" msgstr "" -#: ccdfunc.c:390 +#: ccdfunc.c:394 msgid "Can't set active focuser number" msgstr "" -#: ccdfunc.c:404 +#: ccdfunc.c:408 msgid "Can't get focuser limit positions" msgstr "" -#: ccdfunc.c:411 +#: ccdfunc.c:415 msgid "Can't get current focuser position" msgstr "" -#: ccdfunc.c:425 +#: ccdfunc.c:429 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "" -#: ccdfunc.c:429 +#: ccdfunc.c:433 msgid "Can't home focuser" msgstr "" -#: ccdfunc.c:431 +#: ccdfunc.c:435 #, c-format msgid "Can't set position %g" msgstr "" -#: ccdfunc.c:439 +#: ccdfunc.c:443 msgid "Wheel device not pointed" msgstr "" -#: ccdfunc.c:446 +#: ccdfunc.c:450 msgid "No wheels found" msgstr "" -#: ccdfunc.c:476 +#: ccdfunc.c:474 +#, c-format +msgid "Found wheel #%d: %s\n" +msgstr "" + +#: ccdfunc.c:480 #, c-format msgid "Found %d wheels, you point number %d" msgstr "" -#: ccdfunc.c:480 +#: ccdfunc.c:484 msgid "Can't set active wheel number" msgstr "" -#: ccdfunc.c:496 -msgid "Can't get max wheel position" +#: ccdfunc.c:489 +#, c-format +msgid "Wheel model: %s" msgstr "" -#: ccdfunc.c:503 -#, c-format -msgid "Wheel position should be from 0 to %d" +#: ccdfunc.c:498 +msgid "Can't get current wheel position" +msgstr "" + +#: ccdfunc.c:500 +msgid "Can't get max wheel position" msgstr "" #: ccdfunc.c:507 #, c-format +msgid "Wheel position should be from 0 to %d" +msgstr "" + +#: ccdfunc.c:511 +#, c-format msgid "Can't set wheel position %d" msgstr "" -#: ccdfunc.c:522 +#: ccdfunc.c:526 msgid "Camera plugin have no capture polling funtion." msgstr "" -#: ccdfunc.c:528 +#: ccdfunc.c:532 #, c-format msgid "%.1f seconds till exposition ends" msgstr "" -#: ccdfunc.c:543 +#: ccdfunc.c:547 msgid "Camera device not pointed" msgstr "" -#: ccdfunc.c:550 ccdfunc.c:551 +#: ccdfunc.c:554 ccdfunc.c:555 msgid "No cameras found" msgstr "" -#: ccdfunc.c:571 +#: ccdfunc.c:575 msgid "Camera plugin have no model name getter" msgstr "" -#: ccdfunc.c:582 +#: ccdfunc.c:580 +#, c-format +msgid "Found camera #%d: %s\n" +msgstr "" + +#: ccdfunc.c:586 #, c-format msgid "Found %d cameras, you point number %d" msgstr "" -#: ccdfunc.c:586 +#: ccdfunc.c:590 msgid "Can't set active camera number" msgstr "" -#: ccdfunc.c:592 +#: ccdfunc.c:596 msgid "Camera plugin have no custom commands" msgstr "" -#: ccdfunc.c:617 -msgid "Camera plugin have no fun speed setter" +#: ccdfunc.c:605 ccdfunc.c:608 +#, c-format +msgid "Command '%s'" msgstr "" -#: ccdfunc.c:620 -msgid "Can't set fan speed" +#: ccdfunc.c:610 +#, c-format +msgid " returns \"%s\"" msgstr "" #: ccdfunc.c:621 +msgid "Camera plugin have no fun speed setter" +msgstr "" + +#: ccdfunc.c:624 +msgid "Can't set fan speed" +msgstr "" + +#: ccdfunc.c:625 #, c-format msgid "Set fan speed to %d" msgstr "" -#: ccdfunc.c:626 +#: ccdfunc.c:630 #, c-format msgid "Camera model: %s" msgstr "" -#: ccdfunc.c:627 +#: ccdfunc.c:631 #, c-format msgid "Pixel size: %g x %g" msgstr "" -#: ccdfunc.c:633 +#: ccdfunc.c:637 #, c-format msgid "Full array: %s" msgstr "" -#: ccdfunc.c:636 +#: ccdfunc.c:640 #, c-format msgid "Field of view: %s" msgstr "" -#: ccdfunc.c:639 +#: ccdfunc.c:643 #, c-format msgid "Current format: %s" msgstr "" -#: ccdfunc.c:641 +#: ccdfunc.c:646 +#, c-format +msgid "Maximal geometry (WxH): %dx%d" +msgstr "" + +#: ccdfunc.c:647 +#, c-format +msgid "Minimal offset: %dx%d" +msgstr "" + +#: ccdfunc.c:648 +#, c-format +msgid "Geometry steps: offset - %dx%d, size - %dx%d" +msgstr "" + +#: ccdfunc.c:652 +#, c-format +msgid "Current binning: %d x %d" +msgstr "" + +#: ccdfunc.c:655 +#, c-format +msgid "Current settings: %d bits per pixel" +msgstr "" + +#: ccdfunc.c:658 +#, c-format +msgid "Current brightness: %g" +msgstr "" + +#: ccdfunc.c:660 +#, c-format +msgid "Current gain: %g" +msgstr "" + +#: ccdfunc.c:662 +#, c-format +msgid "Maximal gain: %g" +msgstr "" + +#: ccdfunc.c:664 msgid "Camera plugin have no temperature setter" msgstr "" -#: ccdfunc.c:642 +#: ccdfunc.c:665 #, c-format msgid "Can't set T to %g degC" msgstr "" -#: ccdfunc.c:651 +#: ccdfunc.c:673 #, c-format msgid "Shutter command: %s\n" msgstr "" -#: ccdfunc.c:653 +#: ccdfunc.c:675 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "" -#: ccdfunc.c:656 +#: ccdfunc.c:678 #, c-format msgid "Try to configure I/O port as %d" msgstr "" -#: ccdfunc.c:658 +#: ccdfunc.c:680 msgid "Can't configure (unsupported?)" msgstr "" -#: ccdfunc.c:665 +#: ccdfunc.c:686 msgid "Can't get IOport state (unsupported?)" msgstr "" -#: ccdfunc.c:668 +#: ccdfunc.c:689 #, c-format msgid "Try to write %d to I/O port" msgstr "" -#: ccdfunc.c:670 +#: ccdfunc.c:691 msgid "Can't set IOport" msgstr "" -#: ccdfunc.c:677 +#: ccdfunc.c:698 #, c-format msgid "Set gain to %g" msgstr "" -#: ccdfunc.c:678 +#: ccdfunc.c:699 #, c-format msgid "Can't set gain to %g" msgstr "" -#: ccdfunc.c:683 +#: ccdfunc.c:704 #, c-format msgid "Set brightness to %g" msgstr "" -#: ccdfunc.c:684 +#: ccdfunc.c:705 #, c-format msgid "Can't set brightness to %g" msgstr "" -#: ccdfunc.c:690 server.c:330 +#: ccdfunc.c:711 server.c:330 #, c-format msgid "Can't set binning %dx%d" msgstr "" -#: ccdfunc.c:702 server.c:331 +#: ccdfunc.c:723 server.c:331 msgid "Can't set given geometry" msgstr "" -#: ccdfunc.c:706 +#: ccdfunc.c:727 #, c-format msgid "Can't set %d flushes" msgstr "" -#: ccdfunc.c:709 +#: ccdfunc.c:730 msgid "Camera plugin have no exposition setter" msgstr "" -#: ccdfunc.c:711 +#: ccdfunc.c:732 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "" -#: ccdfunc.c:714 +#: ccdfunc.c:735 msgid "Can't change frame type" msgstr "" -#: ccdfunc.c:717 +#: ccdfunc.c:738 msgid "Can't set bit depth" msgstr "" -#: ccdfunc.c:719 +#: ccdfunc.c:740 msgid "Can't set readout speed" msgstr "" -#: ccdfunc.c:720 +#: ccdfunc.c:741 #, c-format msgid "Readout mode: %s" msgstr "" -#: ccdfunc.c:721 +#: ccdfunc.c:742 msgid "Only show statistics" msgstr "" -#: ccdfunc.c:724 +#: ccdfunc.c:745 msgid "Can't get current binning" msgstr "" -#: ccdfunc.c:749 +#: ccdfunc.c:770 #, c-format msgid "Capture frame %d" msgstr "" -#: ccdfunc.c:750 ccdfunc.c:827 server.c:194 server.c:195 +#: ccdfunc.c:771 ccdfunc.c:848 server.c:195 msgid "Camera plugin have no function `start exposition`" msgstr "" -#: ccdfunc.c:752 ccdfunc.c:829 server.c:200 server.c:201 +#: ccdfunc.c:773 ccdfunc.c:850 server.c:201 msgid "Can't start exposition" msgstr "" -#: ccdfunc.c:757 +#: ccdfunc.c:778 msgid "Can't capture image" msgstr "" -#: ccdfunc.c:760 +#: ccdfunc.c:781 msgid "Read grabbed image" msgstr "" -#: ccdfunc.c:762 ccdfunc.c:842 server.c:218 server.c:219 +#: ccdfunc.c:783 ccdfunc.c:863 server.c:218 msgid "Camera plugin have no function `capture`" msgstr "" -#: ccdfunc.c:764 ccdfunc.c:843 +#: ccdfunc.c:785 ccdfunc.c:864 msgid "Can't grab image" msgstr "" -#: ccdfunc.c:778 client.c:491 +#: ccdfunc.c:799 client.c:499 #, c-format msgid "%d seconds till pause ends\n" msgstr "" -#: ccdfunc.c:840 +#. for(int i = 0; i < NFRM; ++i) printf("last[%d]=%g\n", i, lastn[i]); +#: ccdfunc.c:834 +#, c-format +msgid "Framerate=%.2f (%g seconds for exp); mean framerate=%.2f" +msgstr "" + +#: ccdfunc.c:861 msgid "Some error when capture" msgstr "" +#: ccdfunc.c:912 +msgid "Can't create grabbing thread" +msgstr "" + +#: ccdfunc.c:943 +msgid "Point network port or UNIX-socket path" +msgstr "" + +#: ccdfunc.c:947 +msgid "start_socket(): can't open socket" +msgstr "" + +#: ccdfunc.c:956 +msgid "Need exposition time!" +msgstr "" + +#: server.c:126 +msgid "Can't unlock socket mutex" +msgstr "" + +#: server.c:163 +msgid "Can't allocate memory for image" +msgstr "" + #: server.c:247 msgid "No camera device" msgstr "" -#: client.c:449 +#: server.c:1060 +msgid "server(): need at least command socket fd" +msgstr "" + +#: server.c:1061 +msgid "Server run without image transport socket" +msgstr "" + +#: server.c:1082 +msgid "No devices found" +msgstr "" + +#: server.c:1127 +msgid "Client wants an image, but there's no data" +msgstr "" + +#: server.c:1156 +msgid "Limit of connections reached" +msgstr "" + +#: server.c:1225 +#, c-format +msgid "Can't create %s" +msgstr "" + +#: server.c:1261 +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:276 +msgid "Server disconnected" +msgstr "" + +#: client.c:173 +msgid "Send custom plugin commands\n" +msgstr "" + +#: client.c:307 +msgid "Can't lock shared memory" +msgstr "" + +#: client.c:316 +msgid "getimage(): can't open image transport socket" +msgstr "" + +#: client.c:319 +msgid "Can't read image header" +msgstr "" + +#: client.c:324 +msgid "Wrong image: bad magick" +msgstr "" + +#: client.c:328 +msgid "Wrong image size" +msgstr "" + +#: client.c:342 +msgid "Can't reallocate memory for image buffer" +msgstr "" + +#: client.c:361 +msgid "Can't read image data" +msgstr "" + +#: client.c:380 +#, c-format +msgid "Can't read full header, got %zd records from %zd" +msgstr "" + +#: client.c:414 client.c:517 +msgid "Can't run without command socket" +msgstr "" + +#: client.c:436 +msgid "Exposing frame 1..." +msgstr "" + +#: client.c:439 +msgid "Wait for exposition end" +msgstr "" + +#: client.c:457 msgid "Can't make exposition" msgstr "" -#: client.c:503 +#. start next capture +#. last image -> should re-expose +#: client.c:459 client.c:470 client.c:489 +#, c-format +msgid "Exposing frame %d..." +msgstr "" + +#: client.c:477 +msgid "Frame ready, try to grab" +msgstr "" + +#: client.c:479 +msgid "Can't get next image" +msgstr "" + +#: client.c:487 +msgid "Got already saved image, wait next" +msgstr "" + +#: client.c:511 msgid "Server timeout" msgstr "" +#: client.c:560 +#, c-format +msgid "" +"Image wasn't received, state: %d, waiting: %g, lastNo: %d, curNo: %d " +"(timeout: %g)" +msgstr "" + +#: client.c:620 client.c:627 +msgid "Can't create capturing thread" +msgstr "" + #: imageview.c:51 msgid "Already initialized!" msgstr "" @@ -605,19 +887,38 @@ msgstr "" msgid "Histogram conversion: %s" msgstr "" +#: imageview.c:615 +#, c-format +msgid "Missed %zd images" +msgstr "" + +#: imageview.c:697 +msgid "No image changing function defined" +msgstr "" + #: imageview.c:704 msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr "" -#: imageview.c:746 +#. save image +#: imageview.c:734 +msgid "Make screenshot" +msgstr "" + +#: imageview.c:738 +#, c-format +msgid "Set output prefix to %s" +msgstr "" + +#: imageview.c:751 #, c-format msgid "Equalization of histogram: %s" msgstr "" -#: imageview.c:746 +#: imageview.c:751 msgid "on" msgstr "" -#: imageview.c:746 +#: imageview.c:751 msgid "off" msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index 2f47263..7ff737c 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-06-08 16:46+0300\n" + "POT-Creation-Date: 2026-07-14 14:45+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,113 +16,162 @@ msgstr "Project-Id-Version: PACKAGE VERSION\n" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" -#: ccdfunc.c:528 +#: ccdfunc.c:610 +#, c-format +msgid " returns \"%s\"" +msgstr "" + +#: ccdfunc.c:532 #, c-format msgid "%.1f seconds till exposition ends" msgstr "%.1f секунд до окончания экспозиции" -#: ccdfunc.c:778 client.c:491 +#: ccdfunc.c:799 client.c:499 #, c-format msgid "%d seconds till pause ends\n" msgstr "%d секунд до окончания паузы\n" +#: cmdlnopts.c:160 +#, c-format +msgid "%d unused parameters:\n" +msgstr "" + #: imageview.c:51 msgid "Already initialized!" msgstr "Уже инициализировано!" -#: cmdlnopts.c:103 +#: cmdlnopts.c:119 msgid "CMOS brightness level" msgstr "уровень яркости CMOS" -#: cmdlnopts.c:102 +#: cmdlnopts.c:118 msgid "CMOS gain level" msgstr "уровень Gain CMOS" -#: ccdfunc.c:543 +#: ccdfunc.c:547 msgid "Camera device not pointed" msgstr "Устройство свеоприемника не подключено" -#: ccdfunc.c:626 +#: ccdfunc.c:630 #, c-format msgid "Camera model: %s" msgstr "Модель светоприемника: %s" -#: ccdfunc.c:522 +#: ccdfunc.c:526 #, fuzzy msgid "Camera plugin have no capture polling funtion." msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:592 +#: ccdfunc.c:596 msgid "Camera plugin have no custom commands" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:709 +#: ccdfunc.c:730 #, fuzzy msgid "Camera plugin have no exposition setter" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:617 +#: ccdfunc.c:621 #, fuzzy msgid "Camera plugin have no fun speed setter" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:762 ccdfunc.c:842 server.c:218 server.c:219 +#: ccdfunc.c:783 ccdfunc.c:863 server.c:218 #, fuzzy msgid "Camera plugin have no function `capture`" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:750 ccdfunc.c:827 server.c:194 server.c:195 +#: ccdfunc.c:771 ccdfunc.c:848 server.c:195 #, fuzzy msgid "Camera plugin have no function `start exposition`" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:571 +#: ccdfunc.c:575 #, fuzzy msgid "Camera plugin have no model name getter" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:641 +#: ccdfunc.c:664 #, fuzzy msgid "Camera plugin have no temperature setter" msgstr "У плагина камеры нет особых команд" -#: ccdfunc.c:757 +#: server.c:163 +#, fuzzy +msgid "Can't allocate memory for image" +msgstr "Не могу захватить изображение" + +#: main.c:122 +msgid "Can't be client and standalone in same time!" +msgstr "" + +#: ccdfunc.c:778 msgid "Can't capture image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:714 +#: ccdfunc.c:735 msgid "Can't change frame type" msgstr "Не могу изменить тип кадра" -#: ccdfunc.c:658 +#: ccdfunc.c:680 msgid "Can't configure (unsupported?)" msgstr "Не могу сконфигурировать (опция не поддерживается?)" -#: ccdfunc.c:665 +#: server.c:1225 +#, fuzzy, c-format +msgid "Can't create %s" +msgstr "Не могу захватить изображение" + +#: client.c:620 client.c:627 +#, fuzzy +msgid "Can't create capturing thread" +msgstr "Не могу захватить изображение" + +#: ccdfunc.c:912 +#, fuzzy +msgid "Can't create grabbing thread" +msgstr "Не могу установить Gain в %g" + +#: main.c:129 +#, fuzzy +msgid "Can't create log file" +msgstr "Не могу захватить изображение" + +#: ccdfunc.c:686 msgid "Can't get IOport state (unsupported?)" msgstr "Не могу получить состояние порта I/O (не поддерживается?)" -#: ccdfunc.c:724 +#: ccdfunc.c:745 msgid "Can't get current binning" msgstr "Не могу получить текущее значение биннинга" -#: ccdfunc.c:411 +#: ccdfunc.c:415 msgid "Can't get current focuser position" msgstr "Не могу определить текущую позицию фокусера" -#: ccdfunc.c:404 +#: ccdfunc.c:498 +#, fuzzy +msgid "Can't get current wheel position" +msgstr "Не могу определить текущую позицию фокусера" + +#: ccdfunc.c:408 msgid "Can't get focuser limit positions" msgstr "Не могу определить предельную позицию фокусера" -#: ccdfunc.c:496 +#: ccdfunc.c:500 msgid "Can't get max wheel position" msgstr "Не могу определить предельную позицию колеса" -#: ccdfunc.c:764 ccdfunc.c:843 +#: client.c:479 +#, fuzzy +msgid "Can't get next image" +msgstr "Не могу захватить изображение" + +#: ccdfunc.c:785 ccdfunc.c:864 msgid "Can't grab image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:429 +#: ccdfunc.c:433 msgid "Can't home focuser" msgstr "Не могу установить фокусер в нуль" @@ -130,7 +179,17 @@ msgstr " msgid "Can't init mutex!" msgstr "Не могу инициализировать мьютекс!" -#: client.c:449 +#: server.c:1261 +#, fuzzy +msgid "Can't lock mutex" +msgstr "Не могу инициализировать мьютекс!" + +#: client.c:307 +#, fuzzy +msgid "Can't lock shared memory" +msgstr "Не могу захватить изображение" + +#: client.c:457 msgid "Can't make exposition" msgstr "Не могу выполнить экспозицию" @@ -138,500 +197,754 @@ msgstr " msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr "Не могу открыть окно OpenGL, отображение будет недоступно" -#: ccdfunc.c:653 +#: client.c:380 +#, c-format +msgid "Can't read full header, got %zd records from %zd" +msgstr "" + +#: client.c:361 +#, fuzzy +msgid "Can't read image data" +msgstr "Не могу захватить изображение" + +#: client.c:319 +#, fuzzy +msgid "Can't read image header" +msgstr "Не могу захватить изображение" + +#: client.c:342 +msgid "Can't reallocate memory for image buffer" +msgstr "" + +#: ccdfunc.c:675 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "Не могу выполнить команду затвора %s (не поддерживается?)" -#: ccdfunc.c:216 +#: client.c:414 client.c:517 +#, fuzzy +msgid "Can't run without command socket" +msgstr "Не могу выполнить команду затвора %s (не поддерживается?)" + +#: ccdfunc.c:220 #, c-format msgid "Can't save file with prefix %s" msgstr "Не могу сохранить файл с префиксом %s" -#: ccdfunc.c:706 +#: ccdfunc.c:727 #, c-format msgid "Can't set %d flushes" msgstr "Не могу установить %d сбросов" -#: ccdfunc.c:670 +#: ccdfunc.c:691 msgid "Can't set IOport" msgstr "Не могу поменять значения порта I/O" -#: ccdfunc.c:642 +#: ccdfunc.c:665 #, c-format msgid "Can't set T to %g degC" msgstr "Не могу установить температуру в %g градЦ" -#: ccdfunc.c:586 +#: ccdfunc.c:590 msgid "Can't set active camera number" msgstr "Не могу установить номер активной камеры" -#: ccdfunc.c:390 +#: ccdfunc.c:394 msgid "Can't set active focuser number" msgstr "Не могу установить номер активного фокусера" -#: ccdfunc.c:480 +#: ccdfunc.c:484 msgid "Can't set active wheel number" msgstr "Не могу установить номер активного колеса" -#: ccdfunc.c:690 server.c:330 +#: main.c:97 +#, fuzzy, c-format +msgid "Can't set answer timeout to %g" +msgstr "Не могу установить Gain в %g" + +#: ccdfunc.c:711 server.c:330 #, c-format msgid "Can't set binning %dx%d" msgstr "Не могу установить биннинг %dx%d" -#: ccdfunc.c:717 +#: ccdfunc.c:738 msgid "Can't set bit depth" msgstr "Не могу установить разрядность АЦП" -#: ccdfunc.c:684 +#: ccdfunc.c:705 #, c-format msgid "Can't set brightness to %g" msgstr "Не могу установить яркость в %g" -#: ccdfunc.c:711 +#: ccdfunc.c:732 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "Не могу установить экспозицию в %f секунд" -#: ccdfunc.c:620 +#: ccdfunc.c:624 msgid "Can't set fan speed" msgstr "Не могу установить скорость вентиляторов" -#: ccdfunc.c:678 +#: ccdfunc.c:699 #, c-format msgid "Can't set gain to %g" msgstr "Не могу установить Gain в %g" -#: ccdfunc.c:702 server.c:331 +#: ccdfunc.c:723 server.c:331 msgid "Can't set given geometry" msgstr "Не могу установить геометрию" -#: ccdfunc.c:431 +#: ccdfunc.c:435 #, c-format msgid "Can't set position %g" msgstr "Не могу изменить позицию на %g" -#: ccdfunc.c:425 +#: ccdfunc.c:429 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "Не могу установить позицию %g: вне пределов [%g, %g]" -#: ccdfunc.c:719 +#: ccdfunc.c:740 msgid "Can't set readout speed" msgstr "Не могу установить скорость считывания" -#: ccdfunc.c:507 +#: ccdfunc.c:511 #, c-format msgid "Can't set wheel position %d" msgstr "Не могу установить положение колеса %d" -#: ccdfunc.c:752 ccdfunc.c:829 server.c:200 server.c:201 +#: ccdfunc.c:773 ccdfunc.c:850 server.c:201 msgid "Can't start exposition" msgstr "Не могу начать экспозицию" -#: ccdfunc.c:749 +#: server.c:126 +#, fuzzy +msgid "Can't unlock socket mutex" +msgstr "Не могу инициализировать мьютекс!" + +#: main.c:91 +#, fuzzy +msgid "Can't use outfile name and prefix together" +msgstr "Не могу сохранить файл с префиксом %s" + +#: ccdfunc.c:770 #, c-format msgid "Capture frame %d" msgstr "Захват кадра %d" -#: ccdfunc.c:639 +#: server.c:1127 +msgid "Client wants an image, but there's no data" +msgstr "" + +#: ccdfunc.c:605 ccdfunc.c:608 +#, c-format +msgid "Command '%s'" +msgstr "" + +#: ccdfunc.c:652 +#, fuzzy, c-format +msgid "Current binning: %d x %d" +msgstr "Не могу установить биннинг %dx%d" + +#: ccdfunc.c:658 +#, fuzzy, c-format +msgid "Current brightness: %g" +msgstr "Установить яркость в %g" + +#: ccdfunc.c:643 #, c-format msgid "Current format: %s" msgstr "Текущий формат: %s" -#: cmdlnopts.c:120 +#: ccdfunc.c:660 +#, fuzzy, c-format +msgid "Current gain: %g" +msgstr "Текущий формат: %s" + +#: ccdfunc.c:655 +#, c-format +msgid "Current settings: %d bits per pixel" +msgstr "" + +#: cmdlnopts.c:136 msgid "Display image in OpenGL window" msgstr "отображение изображения в окне OpenGL" -#: imageview.c:746 +#: imageview.c:751 #, c-format msgid "Equalization of histogram: %s" msgstr "Эквализация гистограммы: %s" -#: ccdfunc.c:285 +#: ccdfunc.c:289 msgid "Error saving file" msgstr "Ошибка сохранения файла" -#: ccdfunc.c:636 +#. start next capture +#. last image -> should re-expose +#: client.c:459 client.c:470 client.c:489 +#, c-format +msgid "Exposing frame %d..." +msgstr "" + +#: client.c:436 +msgid "Exposing frame 1..." +msgstr "" + +#: ccdfunc.c:640 #, c-format msgid "Field of view: %s" msgstr "Поле зрения: %s" -#: ccdfunc.c:276 +#: main.c:94 ccdfunc.c:213 +#, c-format +msgid "File %s exists!" +msgstr "" + +#: ccdfunc.c:280 #, c-format msgid "File saved as '%s'" msgstr "Файл сохранен как '%s'" -#: ccdfunc.c:349 +#: ccdfunc.c:353 msgid "Focuser device not pointed" msgstr "Устройство фокусера не указано" -#: ccdfunc.c:582 +#: ccdfunc.c:586 #, c-format msgid "Found %d cameras, you point number %d" msgstr "Обнаружено %d камер, вы указали %d" -#: ccdfunc.c:386 +#: ccdfunc.c:390 #, c-format msgid "Found %d focusers, you point number %d" msgstr "Обнаружено %d фокусеров, вы указали %d" -#: ccdfunc.c:476 +#: ccdfunc.c:480 #, c-format msgid "Found %d wheels, you point number %d" msgstr "Обнаружено %d колес, вы указали %d" -#: ccdfunc.c:633 +#: ccdfunc.c:580 +#, c-format +msgid "Found camera #%d: %s\n" +msgstr "" + +#: ccdfunc.c:384 +#, c-format +msgid "Found focuser #%d: %s\n" +msgstr "" + +#: ccdfunc.c:474 +#, c-format +msgid "Found wheel #%d: %s\n" +msgstr "" + +#: client.c:477 +msgid "Frame ready, try to grab" +msgstr "" + +#. for(int i = 0; i < NFRM; ++i) printf("last[%d]=%g\n", i, lastn[i]); +#: ccdfunc.c:834 +#, c-format +msgid "Framerate=%.2f (%g seconds for exp); mean framerate=%.2f" +msgstr "" + +#: ccdfunc.c:637 #, c-format msgid "Full array: %s" msgstr "Полный формат: %s" +#: ccdfunc.c:648 +#, c-format +msgid "Geometry steps: offset - %dx%d, size - %dx%d" +msgstr "" + +#. slave: cancel exposition +#: main.c:57 +#, c-format +msgid "Get signal %d - exit" +msgstr "" + +#: client.c:487 +msgid "Got already saved image, wait next" +msgstr "" + #: imageview.c:425 #, c-format msgid "Histogram conversion: %s" msgstr "Преобразование гистограммы: %s" -#: cmdlnopts.c:108 +#: cmdlnopts.c:124 msgid "INET image socket port" msgstr "порт локального сетевого сокета передачи изображения" -#: ccdfunc.c:340 +#: ccdfunc.c:202 +msgid "Image not saved: neither filename nor filename prefix pointed" +msgstr "" + +#: ccdfunc.c:344 #, c-format msgid "Image stat:\n" msgstr "Статистика по изображению: \n" -#: cmdlnopts.c:75 +#: client.c:560 +#, c-format +msgid "Image wasn't received, state: %d, waiting: %g, lastNo: %d, curNo: %d " + "(timeout: %g)" +msgstr "" + +#: server.c:1156 +msgid "Limit of connections reached" +msgstr "" + +#: main.c:127 +#, c-format +msgid "Log file %s @ level %d\n" +msgstr "" + +#. save image +#: imageview.c:734 +msgid "Make screenshot" +msgstr "" + +#: main.c:52 +#, c-format +msgid "Master killed with sig=%d" +msgstr "" + +#: ccdfunc.c:662 +#, c-format +msgid "Maximal gain: %g" +msgstr "" + +#: ccdfunc.c:646 +#, c-format +msgid "Maximal geometry (WxH): %dx%d" +msgstr "" + +#: ccdfunc.c:647 +#, c-format +msgid "Minimal offset: %dx%d" +msgstr "" + +#: imageview.c:615 +#, c-format +msgid "Missed %zd images" +msgstr "" + +#: cmdlnopts.c:91 msgid "N flushes before exposing (default: 1)" msgstr "N засвечиваний перед экспозицией (по умолчанию: 1)" +#: ccdfunc.c:956 +msgid "Need exposition time!" +msgstr "" + #: server.c:247 msgid "No camera device" msgstr "Не указано устройство камеры" -#: ccdfunc.c:550 ccdfunc.c:551 +#: ccdfunc.c:554 ccdfunc.c:555 msgid "No cameras found" msgstr "Камер не обнаружено" -#: ccdfunc.c:356 +#: server.c:1082 +#, fuzzy +msgid "No devices found" +msgstr "Турелей не обнаружено" + +#: ccdfunc.c:360 msgid "No focusers found" msgstr "Фокусеров не обнаружено" -#: ccdfunc.c:446 +#: imageview.c:697 +msgid "No image changing function defined" +msgstr "" + +#: ccdfunc.c:450 msgid "No wheels found" msgstr "Турелей не обнаружено" -#: ccdfunc.c:721 +#: ccdfunc.c:742 msgid "Only show statistics" msgstr "Только отобразить статистику" -#: ccdfunc.c:627 +#: main.c:101 +msgid "Options `port` and `path` can't be used together! Point `port` for " + "TCP socket or `path` for UNIX." +msgstr "" + +#: ccdfunc.c:631 #, c-format msgid "Pixel size: %g x %g" msgstr "Размер пикселя: %g x %g" -#: ccdfunc.c:760 +#: ccdfunc.c:943 +msgid "Point network port or UNIX-socket path" +msgstr "" + +#: ccdfunc.c:781 msgid "Read grabbed image" msgstr "Считывание изображения" -#: ccdfunc.c:720 +#: ccdfunc.c:741 #, c-format msgid "Readout mode: %s" msgstr "Режим считывания: %s" -#: client.c:503 +#: client.c:173 +#, fuzzy +msgid "Send custom plugin commands\n" +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:276 +#, fuzzy +msgid "Server disconnected" +msgstr "Таймаут сервера" + +#: server.c:1061 +msgid "Server run without image transport socket" +msgstr "" + +#: client.c:511 msgid "Server timeout" msgstr "Таймаут сервера" -#: ccdfunc.c:683 +#: ccdfunc.c:704 #, c-format msgid "Set brightness to %g" msgstr "Установить яркость в %g" -#: ccdfunc.c:621 +#: ccdfunc.c:625 #, c-format msgid "Set fan speed to %d" msgstr "Не могу установить скорость вентиляторов в %d" -#: ccdfunc.c:677 +#: ccdfunc.c:698 #, c-format msgid "Set gain to %g" msgstr "Установить Gain в %g" -#: ccdfunc.c:651 +#: main.c:119 +#, fuzzy, c-format +msgid "Set image port to %s\n" +msgstr "Не могу установить скорость вентиляторов в %d" + +#: imageview.c:738 +#, c-format +msgid "Set output prefix to %s" +msgstr "" + +#: ccdfunc.c:673 #, c-format msgid "Shutter command: %s\n" msgstr "Команда затвора: %s\n" -#: ccdfunc.c:840 +#: ccdfunc.c:861 msgid "Some error when capture" msgstr "Ошибка при захвате" -#: ccdfunc.c:656 +#: ccdfunc.c:678 #, c-format msgid "Try to configure I/O port as %d" msgstr "Попытка сконфигурировать порт I/O как %d" -#: ccdfunc.c:668 +#: ccdfunc.c:689 #, c-format msgid "Try to write %d to I/O port" msgstr "Попытка записи %d в порт I/O" -#: cmdlnopts.c:106 +#: cmdlnopts.c:122 msgid "UNIX socket name (command socket)" msgstr "имя UNIX-сокета" -#: ccdfunc.c:439 +#: client.c:439 +#, fuzzy +msgid "Wait for exposition end" +msgstr "ждать, пока не кончится экспозиция" + +#: ccdfunc.c:443 msgid "Wheel device not pointed" msgstr "Устройство турели не указано" -#: ccdfunc.c:503 +#: ccdfunc.c:489 +#, fuzzy, c-format +msgid "Wheel model: %s" +msgstr "Модель светоприемника: %s" + +#: ccdfunc.c:507 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "Позиция колеса должна быть от 0 до %d" -#: cmdlnopts.c:82 +#: client.c:328 +msgid "Wrong image size" +msgstr "" + +#: client.c:324 +msgid "Wrong image: bad magick" +msgstr "" + +#: main.c:106 +#, c-format +msgid "Wrong port value: %d" +msgstr "" + +#: cmdlnopts.c:98 msgid "absolute (not divided by binning!) frame X0 coordinate (-1 - all " "with overscan)" msgstr "абсолютная (не деленная на биннинг!) координата X0 (-1 - включая " "оверскан)" -#: cmdlnopts.c:84 +#: cmdlnopts.c:100 msgid "absolute frame X1 coordinate (-1 - all with overscan)" msgstr "абсолютная координата X1 (-1 - включая оверскан)" -#: cmdlnopts.c:83 +#: cmdlnopts.c:99 msgid "absolute frame Y0 coordinate (-1 - all with overscan)" msgstr "абсолютная координата Y0 (-1 - включая оверскан)" -#: cmdlnopts.c:85 +#: cmdlnopts.c:101 msgid "absolute frame Y1 coordinate (-1 - all with overscan)" msgstr "абсолютная координата Y1 (-1 - включая оверскан)" -#: cmdlnopts.c:72 +#: cmdlnopts.c:88 msgid "add records to header from given file[s]" msgstr "добавить записи к шапке FITS-файла из заданных файлов" -#: cmdlnopts.c:54 +#: cmdlnopts.c:70 msgid "camera device number (if many: 0, 1, 2 etc)" msgstr "номер устройства камеры" -#: cmdlnopts.c:50 +#: cmdlnopts.c:66 msgid "camera device plugin (e.g. devfli.so)" msgstr "плагин камеры (например, devfli.so)" -#: cmdlnopts.c:81 +#: cmdlnopts.c:97 msgid "cancel current exposition" msgstr "отмена текущей экспозиции" -#: cmdlnopts.c:88 +#: cmdlnopts.c:104 msgid "close shutter" msgstr "закрыть затвор" -#: cmdlnopts.c:48 +#: cmdlnopts.c:64 msgid "common device plugin (e.g devfli.so)" msgstr "общий плагин для всех устройств (например, devfli.so)" -#: cmdlnopts.c:95 +#: cmdlnopts.c:111 msgid "configure I/O port pins to given value (decimal number, pin1 is LSB, " "1 == output, 0 == input)" msgstr "сконфигурировать порт I/O в заданное состояние (десятичное число, " "pin1 - младший бит, 1 - выход, 0 - вход)" -#: cmdlnopts.c:49 +#: cmdlnopts.c:65 msgid "custom camera device plugin command" msgstr "особые команды плагина камеры" -#: cmdlnopts.c:62 +#: cmdlnopts.c:78 msgid "fast readout mode" msgstr "быстрый режим считывания" -#: cmdlnopts.c:55 +#: cmdlnopts.c:71 msgid "filter wheel device number (if many: 0, 1, 2 etc)" msgstr "номер устройства турели" -#: cmdlnopts.c:56 +#: cmdlnopts.c:72 msgid "focuser device number (if many: 0, 1, 2 etc)" msgstr "номер устройства фокусера" -#: cmdlnopts.c:51 +#: cmdlnopts.c:67 msgid "focuser device plugin (e.g. devzwo.so)" msgstr "плагин фокусера (например, devzwo.so)" -#: cmdlnopts.c:116 +#: cmdlnopts.c:132 msgid "force using image through socket transition even if can use SHM" msgstr "принудительно брать изображения из сокета даже если возможно " "пользоваться разделяемой памятью" -#: cmdlnopts.c:113 +#: cmdlnopts.c:129 msgid "get base information about connected hardware (also increasing text " "messages level to 2)" msgstr "" -#: cmdlnopts.c:91 +#: cmdlnopts.c:107 msgid "get value of I/O port pins" msgstr "получить значение порта I/O" -#: cmdlnopts.c:76 +#: client.c:316 +msgid "getimage(): can't open image transport socket" +msgstr "" + +#: cmdlnopts.c:92 msgid "horizontal binning to N pixels" msgstr "горизонтальный биннинг в N пикселей" -#: cmdlnopts.c:68 +#: cmdlnopts.c:84 msgid "instrument name" msgstr "название прибора" -#: cmdlnopts.c:53 +#: cmdlnopts.c:69 msgid "list connected devices" msgstr "список подключенных устройств" -#: cmdlnopts.c:107 +#: cmdlnopts.c:123 msgid "local INET command socket port" msgstr "порт локального сетевого сокета" -#: cmdlnopts.c:105 +#: cmdlnopts.c:121 msgid "logging file name (if run as server)" msgstr "имя файла логгирования (если запущен сервер)" -#: cmdlnopts.c:79 +#: cmdlnopts.c:95 msgid "make pause for N seconds between expositions" msgstr "пауза в N секунд между экспозициями" -#: cmdlnopts.c:78 +#: cmdlnopts.c:94 msgid "make series of N frames" msgstr "последовательность из N кадров" -#: cmdlnopts.c:97 +#: cmdlnopts.c:113 msgid "move focuser to absolute position, mm" msgstr "переместить фокусер в абсолютное положение, мм" -#: cmdlnopts.c:98 +#: cmdlnopts.c:114 msgid "move focuser to relative position, mm (only for standalone)" msgstr "переместить фокусер в относительное положение, мм (не для сервер/" "клиент)" -#: cmdlnopts.c:92 +#: cmdlnopts.c:108 msgid "move stepper motor asynchronous" msgstr "асинхронное движение шагового двигателя" -#: cmdlnopts.c:112 +#: cmdlnopts.c:128 msgid "network answer timeout (default: 0.1s)" msgstr "" -#: cmdlnopts.c:60 +#: cmdlnopts.c:76 msgid "not open shutter, when exposing (\"dark frames\")" msgstr "не открывать затвор при экспозиции (\"темновые\")" -#: cmdlnopts.c:69 +#: cmdlnopts.c:85 msgid "object name" msgstr "название объекта" -#: cmdlnopts.c:67 +#: cmdlnopts.c:83 msgid "object type (neon, object, flat etc)" msgstr "тип объекта (neon, object, flat и т.д.)" -#: cmdlnopts.c:70 +#: cmdlnopts.c:86 msgid "observers' names" msgstr "имена наблюдателей" -#: cmdlnopts.c:71 +#: cmdlnopts.c:87 msgid "observing program name" msgstr "название программы" -#: imageview.c:746 +#: imageview.c:751 msgid "off" msgstr "выкл" -#: imageview.c:746 +#: imageview.c:751 msgid "on" msgstr "вкл" -#: cmdlnopts.c:87 +#: cmdlnopts.c:103 msgid "open shutter" msgstr "открыть затвор" -#: cmdlnopts.c:73 +#: cmdlnopts.c:89 msgid "output file name" msgstr "имя файла" -#: cmdlnopts.c:110 +#: cmdlnopts.c:126 msgid "passive viewer (only get last images)" msgstr "пассивный просмотр (только последние кадры)" -#: cmdlnopts.c:66 +#: cmdlnopts.c:82 msgid "program author" msgstr "автор программы" -#: cmdlnopts.c:111 +#: cmdlnopts.c:127 msgid "restart image server" msgstr "перезапуск сервера" -#: cmdlnopts.c:58 +#: cmdlnopts.c:74 msgid "rewrite output file if exists" msgstr "перезапись выходного файла" -#: cmdlnopts.c:109 +#: cmdlnopts.c:125 msgid "run as client" msgstr "запустить клиент" -#: cmdlnopts.c:90 +#: cmdlnopts.c:106 msgid "run exposition on HIGH @ pin5 I/O port" msgstr "запуск экспозиции по ВЫСОКОМУ сигналу на контакте 5 порта I/O" -#: cmdlnopts.c:89 +#: cmdlnopts.c:105 msgid "run exposition on LOW @ pin5 I/O port" msgstr "запуск экспозиции по НИЗКОМУ сигналу на контакте 5 порта I/O" -#: cmdlnopts.c:61 +#: cmdlnopts.c:77 msgid "run in 8-bit mode" msgstr "8-битный режим" -#: cmdlnopts.c:63 +#: server.c:1060 +msgid "server(): need at least command socket fd" +msgstr "" + +#: cmdlnopts.c:79 msgid "set CCD temperature to given value (degr C)" msgstr "установить температуру светоприемника (градЦ)" -#: cmdlnopts.c:94 +#: cmdlnopts.c:110 msgid "set I/O port pins to given value (decimal number, pin1 is LSB)" msgstr "установить порт I/O (десятичное число, pin1 - младший бит)" -#: cmdlnopts.c:80 +#: cmdlnopts.c:96 msgid "set exposure time to given value (seconds!)" msgstr "установить время экспозиции (секунды!)" -#: cmdlnopts.c:64 +#: cmdlnopts.c:80 msgid "set fan speed (0 - off, 1 - low, 2 - high)" msgstr "установить скорость вентилятора (0 - выкл, 1 - низкая, 2 - высокая)" -#: cmdlnopts.c:100 +#: cmdlnopts.c:116 msgid "set wheel position" msgstr "установить положение колеса" -#: cmdlnopts.c:115 +#: cmdlnopts.c:131 msgid "shared memory (with image data) key (default: 7777777)" msgstr "ключ разделяемой памяти с данными изображения (по умолчанию: 7777777)" -#: cmdlnopts.c:57 +#: cmdlnopts.c:73 msgid "show this help" msgstr "отобразить эту справку" -#: cmdlnopts.c:117 +#: cmdlnopts.c:133 msgid "start (!=0) or stop(==0) infinity capturing loop" msgstr "начать (!=0) или закончить (==0) бесконечный цикл захвата изображений" -#: cmdlnopts.c:59 +#: ccdfunc.c:947 +msgid "start_socket(): can't open socket" +msgstr "" + +#: cmdlnopts.c:75 #, fuzzy msgid "verbose level (-V - main messages, -VV - secondary messages, -VVV - " "debug)" msgstr "уровень болтливости (-V - сообщения, -VV - отладка, -VVV - все)" -#: cmdlnopts.c:77 +#: cmdlnopts.c:93 msgid "vertical binning to N pixels" msgstr "вертикальный биннинг в N пикселей" -#: cmdlnopts.c:52 +#: cmdlnopts.c:68 msgid "wheel device plugin (e.g. devdummy.so)" msgstr "плагин устройства турели (например, devdummy.so)" #~ msgid "Camera device unknown" #~ msgstr "Устройство свеоприемника не опознано" - -#~ msgid "wait while exposition ends" -#~ msgstr "ждать, пока не кончится экспозиция" diff --git a/main.c b/main.c index 50eda93..c7aceed 100644 --- a/main.c +++ b/main.c @@ -49,12 +49,12 @@ void signals(int signo){ signal(signo, signals); return; } - WARNX("Master killed with sig=%d", signo); + WARNX(_("Master killed with sig=%d"), signo); LOGERR("Master killed with sig=%d", signo); exit(signo); } // slave: cancel exposition - if(signo) WARNX("Get signal %d - exit", signo); + if(signo) WARNX(_("Get signal %d - exit"), signo); if(!GP->client){ DBG("Cancel capturing and close all"); stop_server(); @@ -88,47 +88,48 @@ int main(int argc, char **argv){ GP->client = 1; GP->showimage = 1; } - if(GP->outfile && GP->outfileprefix) ERRX("Can't use outfile name and prefix together"); + if(GP->outfile && GP->outfileprefix) ERRX(_("Can't use outfile name and prefix together")); if(GP->outfile && !GP->rewrite){ struct stat filestat; - if(0 == stat(GP->outfile, &filestat)) ERRX("File %s exists!", GP->outfile); + if(0 == stat(GP->outfile, &filestat)) ERRX(_("File %s exists!"), GP->outfile); } if(GP->anstmout > 0.){ - if(!cc_setAnsTmout(GP->anstmout)) ERRX("Can't set answer timeout to %g", GP->anstmout); + if(!cc_setAnsTmout(GP->anstmout)) ERRX(_("Can't set answer timeout to %g"), GP->anstmout); } if(GP->port){ if(GP->path){ - WARNX("Options `port` and `path` can't be used together! Point `port` for TCP socket or `path` for UNIX."); + WARNX(_("Options `port` and `path` can't be used together! Point `port` for TCP socket or `path` for UNIX.")); return 1; } int port = atoi(GP->port); if(port < CC_PORTN_MIN || port > CC_PORTN_MAX){ - WARNX("Wrong port value: %d", port); + WARNX(_("Wrong port value: %d"), port); return 1; } if(!GP->client) isserver = TRUE; } if(GP->path && !GP->client) isserver = TRUE; - if(!GP->path && !GP->port){ + /*if(!GP->path && !GP->port){ // standalone WARNX("Point one of options: `port` or `path` for command socket"); - } + }*/ if((isserver || GP->client) && !GP->imageport){ GP->imageport = MALLOC(char, 32); if(!GP->port) sprintf(GP->imageport, "12345"); else snprintf(GP->imageport, 31, "%d", 1+atoi(GP->port)); - printf("Set image port to %s\n", GP->imageport); + verbose(VERBOSE_PRIMARY, _("Set image port to %s\n"), GP->imageport); } if(GP->client && (GP->commondev || GP->focuserdev || GP->cameradev || GP->wheeldev)) - ERRX("Can't be client and standalone in same time!"); + ERRX(_("Can't be client and standalone in same time!")); if(GP->logfile){ - int lvl = LOGLEVEL_WARN + GP->verbose; + int lvl = LOGLEVEL_ERR + GP->verbose; DBG("level = %d", lvl); if(lvl > LOGLEVEL_ANY) lvl = LOGLEVEL_ANY; - verbose(1, "Log file %s @ level %d\n", GP->logfile, lvl); + verbose(VERBOSE_PRIMARY, _("Log file %s @ level %d\n"), GP->logfile, lvl); OPENLOG(GP->logfile, lvl, 1); - if(!sl_globlog) WARNX("Can't create log file"); + if(!sl_globlog) WARNX(_("Can't create log file")); } - if(GP->info && GP->verbose < 2) GP->verbose = 2; // increase verbose messages level for `info` + if(GP->info && GP->verbose < VERBOSE_SECONDARY) // increase verbose messages level for `info` + GP->verbose = VERBOSE_SECONDARY; signal(SIGINT, signals); signal(SIGQUIT, signals); signal(SIGABRT, signals); diff --git a/server.c b/server.c index c02ec63..ffc2828 100644 --- a/server.c +++ b/server.c @@ -123,7 +123,7 @@ static int lock(){ static void unlock(){ if(pthread_mutex_unlock(&locmutex)){ LOGERR("Can't unlock socket mutex"); - ERR("Can't unlock socket mutex"); + ERR(_("Can't unlock socket mutex")); } //DBG("UNLOCK()"); } @@ -160,7 +160,7 @@ static void fixima(){ // allocate memory for largest possible image if(!ima){ ima = cc_getshm(GP->shmkey, camera->array.h * camera->array.w * 2); - if(!ima) ERR("Can't allocate memory for image"); + if(!ima) ERR(_("Can't allocate memory for image")); // init shared semaphore cc_init_sem(TRUE); } @@ -191,13 +191,13 @@ static inline void cameraidlestate(){ // idle - wait for capture commands camstate = CAMERA_CAPTURE; fixima(); if(!camera->startexposition){ - LOGERR(_("Camera plugin have no function `start exposition`")); + LOGERR("Camera plugin have no function `start exposition`"); WARNX(_("Camera plugin have no function `start exposition`")); camstate = CAMERA_ERROR; return; } if(!camera->startexposition()){ - LOGERR(_("Can't start exposition")); + LOGERR("Can't start exposition"); WARNX(_("Can't start exposition")); camstate = CAMERA_ERROR; return; @@ -216,7 +216,7 @@ static inline void cameracapturestate(){ // capturing - wait for exposition ends TIMESTAMP("start capture"); if(!camera->capture){ WARNX(_("Camera plugin have no function `capture`")); - LOGERR(_("Camera plugin have no function `capture`")); + LOGERR("Camera plugin have no function `capture`"); camstate = CAMERA_ERROR; return; } @@ -1025,16 +1025,30 @@ static void *sendimage(void *C){ int client = *(int*)C; if(ima->h < 1 || ima->w < 1) return NULL; DBG("client fd: %d", client); + cc_lock_shm(TRUE); + cc_IMG *locimage = calloc(1, sizeof(cc_IMG)); + void *data = calloc(1, ima->bytelen); + if(!locimage || !data){ + cc_unlock_shm(); + if(data) free(data); + if(locimage) free(locimage); + return NULL; + } + memcpy(locimage, ima, sizeof(cc_IMG)); + memcpy(data, ima->data, ima->bytelen); + cc_unlock_shm(); do{ // send image body - if(!cc_senddata(client, ima, sizeof(cc_IMG))) break; + 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, ima->data, ima->bytelen)) break; + if(!cc_senddata(client, data, locimage->bytelen)) break; // send FITS header (client can close socket if don't need it) - for(size_t i = 0; i < ima->headerstrings; ++i){ // send header - if(!cc_senddata(client, &ima->fitsheader[i], FLEN_CARD)) break; + for(size_t i = 0; i < locimage->headerstrings; ++i){ // send header + if(!cc_senddata(client, &locimage->fitsheader[i], FLEN_CARD)) break; } }while(0); + free(locimage); + free(data); close(client); TIMESTAMP("Image sent"); DBG("%d closed", client); @@ -1043,8 +1057,8 @@ static void *sendimage(void *C){ void server(int sock, int imsock){ DBG("sockfd=%d, imsockfd=%d", sock, imsock); - if(sock < 0) ERRX("server(): need at least command socket fd"); - if(imsock < 0) WARNX("Server run without image transport socket"); + if(sock < 0) ERRX(_("server(): need at least command socket fd")); + if(imsock < 0) WARNX(_("Server run without image transport socket")); else if(listen(imsock, CC_MAXCLIENTS) == -1){ WARN("listen()"); LOGERR("server(): error in listen() for image socket"); @@ -1065,7 +1079,7 @@ void server(int sock, int imsock){ camdevini(0); if(ctr == 3){ LOGERR("server(): no devices found"); - WARNX("No devices found"); + WARNX(_("No devices found")); } // start camera thread pthread_t camthread; @@ -1110,7 +1124,7 @@ void server(int sock, int imsock){ // sending image could be a very long operation -> run it in separate thread if(client > -1){ if(ima->imnumber == 0){ - WARNX("Client wants an image, but there's no data"); + WARNX(_("Client wants an image, but there's no data")); close(client); }else{ pthread_t sendthread; @@ -1139,7 +1153,7 @@ void server(int sock, int imsock){ LOGMSG("SERVER got connection, fd=%d", client); if(nfd == CC_MAXCLIENTS + 1){ LOGWARN("Max amount of connections, disconnect fd=%d", client); - WARNX("Limit of connections reached"); + WARNX(_("Limit of connections reached")); close(client); }else{ memset(&poll_set[nfd], 0, sizeof(struct pollfd)); @@ -1149,20 +1163,6 @@ void server(int sock, int imsock){ } } } -#if 0 - // process some data & send messages to ALL - if(camstate == CAMERA_FRAMERDY || camstate == CAMERA_ERROR){ - DBG("new image: timestamp=%.1f, num=%zd", ima->timestamp, ima->imnumber); - char buff[PATH_MAX+32]; - snprintf(buff, PATH_MAX, CC_CMD_EXPSTATE "=%d", camstate); - DBG("Send %s to %d clients", buff, nfd - 2); - for(int i = 2; i < nfd; ++i){ - TIMESTAMP("Send message that all ready"); - cc_sendstrmessage(poll_set[i].fd, buff); - } - camstate = CAMERA_IDLE; - } -#endif // scan connections for(int fdidx = 2; fdidx < nfd; ++fdidx){ if((poll_set[fdidx].revents & POLLIN) == 0) continue; @@ -1222,7 +1222,7 @@ char *makeabspath(const char *path, int shouldbe){ if(shouldbe) return NULL; f = fopen(path, "a"); if(!f){ - WARN("Can't create %s", path); + WARN(_("Can't create %s"), path); return NULL; } unl = 1; @@ -1258,7 +1258,7 @@ static int parsestring(int fd, cc_handleritem *handlers, char *str){ do{ l = lock(); } while(!l && sl_dtime() - t0 < CC_BUSY_TIMEOUT); DBG("time: %g", sl_dtime() - t0); if(!l){ - WARN("Can't lock mutex"); //signals(1); + WARN(_("Can't lock mutex")); //signals(1); return CC_RESULT_BUSY; // long blocking work } r = h->chkfunction(val);