diff --git a/BASLER_cameras/basler.c b/BASLER_cameras/basler.c index 45e4b8d..8ff2958 100644 --- a/BASLER_cameras/basler.c +++ b/BASLER_cameras/basler.c @@ -24,6 +24,7 @@ #include "basestructs.h" #include "omp.h" +//#include "socket.h" // timestamp extern Camera camera; @@ -32,7 +33,7 @@ static int isopened = FALSE, is16bit = FALSE; static char camname[BUFSIZ] = {0}; static size_t payloadsize = 0; // size of imgBuf static unsigned char *imgBuf = NULL; -static uint32_t expostime = 0.; // current exposition time (in microseconds) +static uint32_t expostime = 0; // current exposition time (in microseconds) static PYLON_DEVICECALLBACK_HANDLE hCb; static int curhbin = 1, curvbin = 1; @@ -322,9 +323,11 @@ static int pollcapt(capture_status *st, float *remain){ static int capture(IMG *ima){ FNAME(); + //double __t0 = dtime(); if(!ima || !ima->data || !imgBuf || !isopened) return FALSE; static int toohot = FALSE; float_values f; + //TIMESTAMP("start capt"); if(!getFloat("DeviceTemperature", &f)) WARNX("Can't get temperature"); else{ DBG("Temperature: %.1f", f.val); @@ -338,17 +341,20 @@ static int capture(IMG *ima){ } PylonGrabResult_t grabResult; _Bool bufferReady; + //TIMESTAMP("grab single frame"); GENAPIC_RESULT res = PylonDeviceGrabSingleFrame(hDev, 0, imgBuf, payloadsize, - &grabResult, &bufferReady, 500 + (uint32_t)expostime); + &grabResult, &bufferReady, 1000 + expostime); + //TIMESTAMP("end of grabbing"); if(res != GENAPI_E_OK || !bufferReady){ WARNX("res != GENAPI_E_OK || !bufferReady"); return FALSE; } if(grabResult.Status != Grabbed){ - WARNX("grabResult.Status != Grabbed"); + WARNX("grabResult.Status != Grabbed (%d)", grabResult.Status); return FALSE; } int width = grabResult.SizeX, height = grabResult.SizeY, stride = grabResult.SizeX + grabResult.PaddingX; + //TIMESTAMP("start converting"); if(is16bit){ int s2 = stride<<1, w2 = width<<1; OMP_FOR() @@ -367,6 +373,7 @@ static int capture(IMG *ima){ } } } + //TIMESTAMP("image ready"); ima->bitpix = (is16bit) ? 16 : 8; return TRUE; } diff --git a/Dummy_cameras/dummyfunc.c b/Dummy_cameras/dummyfunc.c index 575b314..ccbae21 100644 --- a/Dummy_cameras/dummyfunc.c +++ b/Dummy_cameras/dummyfunc.c @@ -26,6 +26,7 @@ #include #include "basestructs.h" +#include "omp.h" extern Camera camera; extern Focuser focuser; @@ -67,12 +68,14 @@ static int startexp(){ static int camcapt(IMG *ima){ static int n = 0; if(!ima || !ima->data) return FALSE; - uint16_t *d = ima->data; - for(int y = 0; y < ima->h; ++y) + OMP_FOR() + for(int y = 0; y < ima->h; ++y){ + uint16_t *d = &ima->data[y*ima->w]; for(int x = 0; x < ima->w; ++x){ // sinusoide 100x200 //*d++ = (uint16_t)(((n+x)%100)/99.*65535.); *d++ = (uint16_t)((1 + sin((n+x) * M_PI/50)*sin((n+y) * M_PI/100))*32767.); } + } ++n; ima->bitpix = 16; return TRUE; diff --git a/ccdfunc.c b/ccdfunc.c index c6dc455..a1d08ae 100644 --- a/ccdfunc.c +++ b/ccdfunc.c @@ -28,6 +28,7 @@ #include "ccdfunc.h" #include "cmdlnopts.h" +#include "socket.h" #ifdef IMAGEVIEW #include "imageview.h" #endif @@ -774,24 +775,31 @@ DBG("w=%d, h=%d", raw_width, raw_height); IMG ima = {.data = img, .w = raw_width, .h = raw_height}; if(GP->nframes < 1) GP->nframes = 1; for(int j = 0; j < GP->nframes; ++j){ + TIMESTAMP("Start next cycle"); + TIMEINIT(); // Захват кадра %d\n verbose(1, _("Capture frame %d"), j); if(!camera->startexposition()){ WARNX(_("Can't start exposition")); break; } + TIMESTAMP("Check capture"); if(capt() != CAPTURE_READY){ WARNX(_("Can't capture image")); break; } verbose(2, _("Read grabbed image")); + TIMESTAMP("Read grabbed"); //if(!camera) return; if(!camera->capture(&ima)){ WARNX(_("Can't grab image")); break; } + TIMESTAMP("Calc stat"); calculate_stat(&ima); + TIMESTAMP("Save fits"); saveFITS(&ima, NULL); + TIMESTAMP("Ready"); if(GP->pause_len && j != (GP->nframes - 1)){ double delta, time1 = dtime() + GP->pause_len; while((delta = time1 - dtime()) > 0.){ @@ -821,30 +829,28 @@ void camstop(){ #ifdef IMAGEVIEW -static volatile int grabends = 1; +static volatile int grabno = 0, lastgrabno = 0, exitgrab = FALSE; static void *grabnext(void *arg){ FNAME(); - grabends = 0; - static int retval = FALSE; IMG *ima = (IMG*) arg; - DBG("nxt"); - if(!ima || !camera) goto eof; - if(!camera->startexposition()){ WARNX(_("Can't start exposition")); goto eof; } - capture_status cs; - DBG("Poll"); - while(!camera->pollcapture(&cs, NULL)){ - usleep(10000); - if(!camera) goto eof; - } - DBG("get"); - if(!camera->capture(ima)){ WARNX(_("Can't grab image")); goto eof; } - calculate_stat(ima); - retval = TRUE; - DBG("OK"); -eof: - grabends = 1; - pthread_exit((void*)&retval); - DBG("EXIT"); + do{ + if(exitgrab) return NULL; + TIMESTAMP("Start next exp"); + TIMEINIT(); + if(!ima || !camera) return NULL; + if(!camera->startexposition()){ WARNX(_("Can't start exposition")); continue; } + capture_status cs; + TIMESTAMP("Poll"); + while(!camera->pollcapture(&cs, NULL)){ + usleep(10000); + if(!camera) return NULL; + } + TIMESTAMP("get"); + if(!camera->capture(ima)){ WARNX(_("Can't grab image")); continue; } + //calculate_stat(ima); + TIMESTAMP("OK"); + ++grabno; + }while(1); } @@ -861,7 +867,8 @@ int ccdcaptured(IMG **imgptr){ if(imgptr == (void*)-1){ // kill `grabnext` DBG("Wait for grabbing thread ends"); if(grabthread){ - //pthread_cancel(grabthread); - this kills some cameras + exitgrab = TRUE; + //pthread_cancel(grabthread); // this kills some cameras //pthread_timedjoin_np pthread_join(grabthread, NULL); grabthread = 0; @@ -884,26 +891,30 @@ int ccdcaptured(IMG **imgptr){ }else ima = *imgptr; if(!grabthread){ // start new grab - DBG("\n\n\nStart new grab"); + TIMESTAMP("Start new grab"); + TIMEINIT(); if(pthread_create(&grabthread, NULL, &grabnext, (void*)ima)){ WARN("Can't create grabbing thread"); grabthread = 0; } tlast = dtime(); }else{ // grab in process - if(grabends){ // thread is dead - DBG("Grab ends"); - void *vr; - pthread_join(grabthread, &vr); - int retcode = *(int*)vr; - DBG("retcode = %d", retcode); - grabthread = 0; + if(grabno != lastgrabno){ // done + lastgrabno = grabno; + TIMESTAMP("Grab ends"); + //void *vr; + //pthread_join(grabthread, &vr); + //int retcode = *(int*)vr; + //DBG("retcode = %d", retcode); + //grabthread = 0; if(GP->verbose > 1){ double t = dtime(); - green("Framerate=%.2g\n", 1./(t-tlast)); + green("Framerate=%.2g (%g seconds for exp)\n", 1./(t-tlast), t-tlast); tlast = t; } - if(retcode) return TRUE; + //TIMESTAMP("Framerate"); + //if(retcode) + return TRUE; } } return FALSE; diff --git a/client.c b/client.c index e45d2e6..9c770c7 100644 --- a/client.c +++ b/client.c @@ -41,7 +41,7 @@ static int xc0,yc0,xc1,yc1; // current format #ifdef IMAGEVIEW static IMG ima = {0}; -static volatile atomic_int grabends = 0; +static volatile atomic_int grabno = 0, oldgrabno = 0; static int imdatalen = 0, imbufsz = 0; #endif @@ -74,6 +74,7 @@ static char *readmsg(int fd){ // parser of CCD server messages; return TRUE to exit from polling cycle of `getans` (if receive 'FAIL', 'OK' or 'BUSY') static int parseans(char *ans){ if(!ans) return FALSE; + TIMESTAMP("parseans() begin"); //DBG("Parsing of '%s'", ans); if(0 == strcmp(hresult2str(RESULT_BUSY), ans)){ WARNX("Server busy"); @@ -103,6 +104,7 @@ static int parseans(char *ans){ imdatalen = ima.w * ima.h * 2; } #endif + TIMESTAMP("parseans() end"); return FALSE; } @@ -119,7 +121,7 @@ static int getans(int sock, const char *msg){ } t0 = dtime(); ans = s; - DBG("Got from server: %s", ans); + TIMESTAMP("Got from server: %s", ans); verbose(1, "\t%s", ans); if(parseans(ans)){ if(msg && strncmp(ans, msg, strlen(msg))) continue; @@ -297,6 +299,7 @@ void init_grab_sock(int sock){ static void getimage(){ FNAME(); int sock = controlfd; + TIMESTAMP("Get image sizes"); SENDMSG(CMD_IMWIDTH); SENDMSG(CMD_IMHEIGHT); int imsock = open_socket(FALSE, GP->imageport, TRUE); @@ -310,6 +313,7 @@ static void getimage(){ int got = 0; while(dtime() - t0 < CLIENT_TIMEOUT){ if(!canberead(imsock)) continue; + TIMESTAMP("Read data"); uint8_t *target = ((uint8_t*)ima.data)+got; int rd = read(imsock, target, imdatalen - got); if(rd <= 0){ @@ -320,12 +324,12 @@ static void getimage(){ DBG("Read %d bytes; total read %d from %d; first: %x %x %x %x", rd, got, imdatalen, target[0], target[1], target[2], target[3]); if(got == imdatalen){ - DBG("Got image"); - grabends = 1; break; } } if(dtime() - t0 > CLIENT_TIMEOUT) WARNX("Timeout, image didn't received"); + TIMESTAMP("Got image"); + ++grabno; close(imsock); } @@ -334,10 +338,9 @@ static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net if(controlfd < 0) return NULL; int sock = controlfd; while(1){ - DBG("WAIT"); - while(grabends); // wait until image processed expstate = CAMERA_CAPTURE; - DBG("CAPT"); + TIMESTAMP("End of cycle, start new"); + TIMEINIT(); SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE); // start capture double timeout = GP->exptime + CLIENT_TIMEOUT, t0 = dtime(); useconds_t sleept = 500000; // 0.5s @@ -346,18 +349,18 @@ static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net if(sleept < 1000) sleept = 1000; } while(dtime() - t0 < timeout){ - DBG("SLEEP!"); + TIMESTAMP("Wait for exposition ends"); usleep(sleept); - //SENDMSG(CMD_EXPSTATE); + TIMESTAMP("check answer"); getans(sock, NULL); - DBG("EXPSTATE ===> %d", expstate); + TIMESTAMP("EXPSTATE ===> %d", expstate); if(expstate != CAMERA_CAPTURE) break; } if(dtime() - t0 >= timeout || expstate != CAMERA_FRAMERDY){ WARNX("Image wasn't received"); continue; } - DBG("Frame ready"); + TIMESTAMP("Frame ready"); getimage(); } return NULL; @@ -368,13 +371,13 @@ static void *waitimage(void _U_ *arg){ // passive waiting for next image if(controlfd < 0) return NULL; int sock = controlfd; while(1){ - while(grabends); // wait until image processed getans(sock, NULL); if(expstate != CAMERA_FRAMERDY){ usleep(1000); continue; } - DBG("Image can be downloaded"); + TIMESTAMP("End of cycle, start new"); + TIMEINIT(); getimage(); expstate = CAMERA_IDLE; } @@ -398,12 +401,14 @@ int sockcaptured(IMG **imgptr){ } if(!grabthread || pthread_kill(grabthread, 0)){ // start new grab if(GP->viewer){ + TIMEINIT(); DBG("\n\n\nStart new waiting"); if(pthread_create(&grabthread, NULL, &waitimage, NULL)){ WARN("Can't create waiting thread"); grabthread = 0; } }else{ + TIMEINIT(); DBG("\n\n\nStart new grab"); if(pthread_create(&grabthread, NULL, &grabnext, NULL)){ WARN("Can't create grabbing thread"); @@ -411,11 +416,11 @@ int sockcaptured(IMG **imgptr){ } } }else{ // grab in process - if(grabends){ // image is ready - DBG("Image ready"); + if(grabno != oldgrabno){ // image is ready + TIMESTAMP("Image ready"); if(*imgptr && (*imgptr != &ima)) free(*imgptr); *imgptr = &ima; - grabends = 0; + oldgrabno = grabno; return TRUE; } } diff --git a/imageview.c b/imageview.c index 6260e03..9ffd2bd 100644 --- a/imageview.c +++ b/imageview.c @@ -28,6 +28,7 @@ #include "imageview.h" #include "events.h" #include "omp.h" +//#include "socket.h" // for timestamp windowData *win = NULL; // main window (common variable for events.c) static pthread_t GLUTthread = 0; // main GLUT thread @@ -557,8 +558,10 @@ int viewer(imagefunc newimage){ } if((win->winevt & WINEVT_GETIMAGE) || !(win->winevt & WINEVT_PAUSE)){ if(newimage(&img)){ + //TIMESTAMP("got image -> change"); win->winevt &= ~WINEVT_GETIMAGE; change_displayed_image(img); // change image if refreshed + //TIMESTAMP("changed"); } } if(!win->winevt){ diff --git a/locale/ru/messages.po b/locale/ru/messages.po index ce3a2b3..b68c315 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: 2023-04-05 18:17+0300\n" +"POT-Creation-Date: 2023-04-06 15:51+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -253,346 +253,346 @@ msgstr "" msgid "Display image in OpenGL window" msgstr "" -#: ccdfunc.c:64 +#: ccdfunc.c:65 #, c-format msgid "Can't find plugin %s: %s" msgstr "" -#: ccdfunc.c:76 +#: ccdfunc.c:77 #, c-format msgid "Can't find focuser in plugin %s: %s" msgstr "" -#: ccdfunc.c:87 +#: ccdfunc.c:88 #, c-format msgid "Can't find camera in plugin %s: %s" msgstr "" -#: ccdfunc.c:98 +#: ccdfunc.c:99 #, c-format msgid "Can't find wheel in plugin %s: %s" msgstr "" -#: ccdfunc.c:184 +#: ccdfunc.c:185 msgid "Camera device unknown" msgstr "" #. п²п╣ п╪п╬пЁя┐ я│п╬я┘я─п╟п╫п╦я┌я▄ я└п╟п╧п╩ -#: ccdfunc.c:208 +#: ccdfunc.c:209 #, c-format msgid "Can't save file with prefix %s" msgstr "" -#: ccdfunc.c:356 +#: ccdfunc.c:357 #, c-format msgid "File saved as '%s'" msgstr "" -#: ccdfunc.c:365 +#: ccdfunc.c:366 msgid "Error saving file" msgstr "" -#: ccdfunc.c:405 +#: ccdfunc.c:406 #, c-format msgid "Image stat:\n" msgstr "" -#: ccdfunc.c:413 +#: ccdfunc.c:414 msgid "Focuser device not pointed" msgstr "" -#: ccdfunc.c:420 +#: ccdfunc.c:421 msgid "No focusers found" msgstr "" -#: ccdfunc.c:451 +#: ccdfunc.c:452 #, c-format msgid "Found %d focusers, you point number %d" msgstr "" -#: ccdfunc.c:455 +#: ccdfunc.c:456 msgid "Can't set active focuser number" msgstr "" -#: ccdfunc.c:469 +#: ccdfunc.c:470 msgid "Can't get focuser limit positions" msgstr "" -#: ccdfunc.c:476 +#: ccdfunc.c:477 msgid "Can't get current focuser position" msgstr "" -#: ccdfunc.c:490 +#: ccdfunc.c:491 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "" -#: ccdfunc.c:494 +#: ccdfunc.c:495 msgid "Can't home focuser" msgstr "" -#: ccdfunc.c:496 +#: ccdfunc.c:497 #, c-format msgid "Can't set position %g" msgstr "" -#: ccdfunc.c:504 +#: ccdfunc.c:505 msgid "Wheel device not pointed" msgstr "" -#: ccdfunc.c:511 +#: ccdfunc.c:512 msgid "No wheels found" msgstr "" -#: ccdfunc.c:542 +#: ccdfunc.c:543 #, c-format msgid "Found %d wheels, you point number %d" msgstr "" -#: ccdfunc.c:546 +#: ccdfunc.c:547 msgid "Can't set active wheel number" msgstr "" -#: ccdfunc.c:562 +#: ccdfunc.c:563 msgid "Can't get max wheel position" msgstr "" -#: ccdfunc.c:569 +#: ccdfunc.c:570 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "" -#: ccdfunc.c:573 +#: ccdfunc.c:574 #, c-format msgid "Can't set wheel position %d" msgstr "" -#: ccdfunc.c:590 +#: ccdfunc.c:591 #, c-format msgid "%.1f seconds till exposition ends" msgstr "" -#: ccdfunc.c:605 +#: ccdfunc.c:606 msgid "Camera device not pointed" msgstr "" -#: ccdfunc.c:612 ccdfunc.c:613 +#: ccdfunc.c:613 ccdfunc.c:614 msgid "No cameras found" msgstr "" -#: ccdfunc.c:643 +#: ccdfunc.c:644 #, c-format msgid "Found %d cameras, you point number %d" msgstr "" -#: ccdfunc.c:647 +#: ccdfunc.c:648 msgid "Can't set active camera number" msgstr "" -#: ccdfunc.c:653 +#: ccdfunc.c:654 msgid "Can't set fan speed" msgstr "" -#: ccdfunc.c:654 +#: ccdfunc.c:655 #, c-format msgid "Set fan speed to %d" msgstr "" -#: ccdfunc.c:659 +#: ccdfunc.c:660 #, c-format msgid "Camera model: %s" msgstr "" -#: ccdfunc.c:660 +#: ccdfunc.c:661 #, c-format msgid "Pixel size: %g x %g" msgstr "" -#: ccdfunc.c:666 +#: ccdfunc.c:667 #, c-format msgid "Full array: %s" msgstr "" -#: ccdfunc.c:669 +#: ccdfunc.c:670 #, c-format msgid "Field of view: %s" msgstr "" -#: ccdfunc.c:672 +#: ccdfunc.c:673 #, c-format msgid "Current format: %s" msgstr "" -#: ccdfunc.c:675 +#: ccdfunc.c:676 #, c-format msgid "Can't set T to %g degC" msgstr "" -#: ccdfunc.c:683 +#: ccdfunc.c:684 #, c-format msgid "Shutter command: %s\n" msgstr "" -#: ccdfunc.c:685 +#: ccdfunc.c:686 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "" #. "п÷п╬п©я▀я┌п╨п╟ я│п╨п╬п╫я└п╦пЁя┐я─п╦я─п╬п╡п╟я┌я▄ п©п╬я─я┌ I/O п╨п╟п╨ %d\n" -#: ccdfunc.c:689 +#: ccdfunc.c:690 #, c-format msgid "Try to configure I/O port as %d" msgstr "" -#: ccdfunc.c:691 +#: ccdfunc.c:692 msgid "Can't configure (unsupported?)" msgstr "" -#: ccdfunc.c:698 +#: ccdfunc.c:699 msgid "Can't get IOport state (unsupported?)" msgstr "" #. "п÷п╬п©я▀я┌п╨п╟ п╥п╟п©п╦я│п╦ %d п╡ п©п╬я─я┌ I/O\n" -#: ccdfunc.c:702 +#: ccdfunc.c:703 #, c-format msgid "Try to write %d to I/O port" msgstr "" -#: ccdfunc.c:704 +#: ccdfunc.c:705 msgid "Can't set IOport" msgstr "" -#: ccdfunc.c:711 -#, c-format -msgid "Set gain to %g" -msgstr "" - #: ccdfunc.c:712 #, c-format -msgid "Can't set gain to %g" +msgid "Set gain to %g" msgstr "" -#: ccdfunc.c:717 +#: ccdfunc.c:713 #, c-format -msgid "Set brightness to %g" +msgid "Can't set gain to %g" msgstr "" #: ccdfunc.c:718 #, c-format +msgid "Set brightness to %g" +msgstr "" + +#: ccdfunc.c:719 +#, c-format msgid "Can't set brightness to %g" msgstr "" -#: ccdfunc.c:724 server.c:227 +#: ccdfunc.c:725 server.c:234 #, c-format msgid "Can't set binning %dx%d" msgstr "" -#: ccdfunc.c:736 server.c:228 +#: ccdfunc.c:737 server.c:235 msgid "Can't set given geometry" msgstr "" -#: ccdfunc.c:740 +#: ccdfunc.c:741 #, c-format msgid "Can't set %d flushes" msgstr "" -#: ccdfunc.c:744 +#: ccdfunc.c:745 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "" -#: ccdfunc.c:747 +#: ccdfunc.c:748 msgid "Can't change frame type" msgstr "" -#: ccdfunc.c:750 +#: ccdfunc.c:751 msgid "Can't set bit depth" msgstr "" -#: ccdfunc.c:752 +#: ccdfunc.c:753 msgid "Can't set readout speed" msgstr "" -#: ccdfunc.c:753 +#: ccdfunc.c:754 #, c-format msgid "Readout mode: %s" msgstr "" -#: ccdfunc.c:754 +#: ccdfunc.c:755 msgid "Only show statistics" msgstr "" #. GET binning should be AFTER setgeometry! -#: ccdfunc.c:756 +#: ccdfunc.c:757 msgid "Can't get current binning" msgstr "" #. п≈п╟я┘п╡п╟я┌ п╨п╟п╢я─п╟ %d\n -#: ccdfunc.c:778 +#: ccdfunc.c:781 #, c-format msgid "Capture frame %d" msgstr "" -#: ccdfunc.c:780 ccdfunc.c:832 server.c:122 +#: ccdfunc.c:783 ccdfunc.c:841 server.c:122 msgid "Can't start exposition" msgstr "" -#: ccdfunc.c:784 +#: ccdfunc.c:788 msgid "Can't capture image" msgstr "" -#: ccdfunc.c:787 +#: ccdfunc.c:791 msgid "Read grabbed image" msgstr "" -#: ccdfunc.c:790 ccdfunc.c:840 +#: ccdfunc.c:795 ccdfunc.c:849 msgid "Can't grab image" msgstr "" #. %d я│п╣п╨я┐п╫п╢ п╢п╬ п╬п╨п╬п╫я┤п╟п╫п╦я▐ п©п╟я┐п╥я▀\n -#: ccdfunc.c:799 client.c:269 +#: ccdfunc.c:807 client.c:271 #, c-format msgid "%d seconds till pause ends\n" msgstr "" -#: server.c:165 +#: server.c:170 msgid "No camera device" msgstr "" -#: client.c:256 +#: client.c:258 msgid "Can't make exposition" msgstr "" -#: client.c:285 +#: client.c:287 msgid "Server timeout" msgstr "" -#: imageview.c:50 +#: imageview.c:51 msgid "Already initialized!" msgstr "" -#: imageview.c:286 +#: imageview.c:287 msgid "Can't init mutex!" msgstr "" -#: imageview.c:388 +#: imageview.c:389 #, c-format msgid "Histogram conversion: %s" msgstr "" -#: imageview.c:508 imageview.c:581 +#: imageview.c:509 imageview.c:584 #, c-format msgid "Equalization of histogram: %s" msgstr "" -#: imageview.c:508 imageview.c:581 +#: imageview.c:509 imageview.c:584 msgid "on" msgstr "" -#: imageview.c:508 imageview.c:581 +#: imageview.c:509 imageview.c:584 msgid "off" msgstr "" -#: imageview.c:547 +#: imageview.c:548 msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index 0f60760..598754f 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: 2023-04-05 18:17+0300\n" + "POT-Creation-Date: 2023-04-06 15:49+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,18 +16,18 @@ msgstr "Project-Id-Version: PACKAGE VERSION\n" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" -#: ccdfunc.c:590 +#: ccdfunc.c:591 #, c-format msgid "%.1f seconds till exposition ends" msgstr "%.1f секунд до окончания экспозиции" #. %d я│п╣п╨я┐п╫п╢ п╢п╬ п╬п╨п╬п╫я┤п╟п╫п╦я▐ п©п╟я┐п╥я▀\n -#: ccdfunc.c:799 client.c:269 +#: ccdfunc.c:807 client.c:271 #, c-format msgid "%d seconds till pause ends\n" msgstr "%d секунд до окончания паузы\n" -#: imageview.c:50 +#: imageview.c:51 msgid "Already initialized!" msgstr "Уже инициализировано!" @@ -39,191 +39,191 @@ msgstr " msgid "CMOS gain level" msgstr "уровень Gain CMOS" -#: ccdfunc.c:605 +#: ccdfunc.c:606 msgid "Camera device not pointed" msgstr "Устройство свеоприемника не подключено" -#: ccdfunc.c:184 +#: ccdfunc.c:185 msgid "Camera device unknown" msgstr "Устройство свеоприемника не опознано" -#: ccdfunc.c:659 +#: ccdfunc.c:660 #, c-format msgid "Camera model: %s" msgstr "Модель светоприемника: %s" -#: ccdfunc.c:784 +#: ccdfunc.c:788 msgid "Can't capture image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:747 +#: ccdfunc.c:748 msgid "Can't change frame type" msgstr "Не могу изменить тип кадра" -#: ccdfunc.c:691 +#: ccdfunc.c:692 msgid "Can't configure (unsupported?)" msgstr "Не могу сконфигурировать (опция не поддерживается?)" -#: ccdfunc.c:87 +#: ccdfunc.c:88 #, c-format msgid "Can't find camera in plugin %s: %s" msgstr "Не могу найти плагин камеры %s: %s" -#: ccdfunc.c:76 +#: ccdfunc.c:77 #, c-format msgid "Can't find focuser in plugin %s: %s" msgstr "Не могу найти плагин фокусера %s: %s" -#: ccdfunc.c:64 +#: ccdfunc.c:65 #, c-format msgid "Can't find plugin %s: %s" msgstr "Не могу найти плагин %s: %s" -#: ccdfunc.c:98 +#: ccdfunc.c:99 #, c-format msgid "Can't find wheel in plugin %s: %s" msgstr "Не могу найти плагин турели %s: %s" -#: ccdfunc.c:698 +#: ccdfunc.c:699 msgid "Can't get IOport state (unsupported?)" msgstr "Не могу получить состояние порта I/O (не поддерживается?)" #. GET binning should be AFTER setgeometry! -#: ccdfunc.c:756 +#: ccdfunc.c:757 msgid "Can't get current binning" msgstr "Не могу получить текущее значение биннинга" -#: ccdfunc.c:476 +#: ccdfunc.c:477 msgid "Can't get current focuser position" msgstr "Не могу определить текущую позицию фокусера" -#: ccdfunc.c:469 +#: ccdfunc.c:470 msgid "Can't get focuser limit positions" msgstr "Не могу определить предельную позицию фокусера" -#: ccdfunc.c:562 +#: ccdfunc.c:563 msgid "Can't get max wheel position" msgstr "Не могу определить предельную позицию колеса" -#: ccdfunc.c:790 ccdfunc.c:840 +#: ccdfunc.c:795 ccdfunc.c:849 msgid "Can't grab image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:494 +#: ccdfunc.c:495 msgid "Can't home focuser" msgstr "Не могу установить фокусер в нуль" -#: imageview.c:286 +#: imageview.c:287 msgid "Can't init mutex!" msgstr "Не могу инициализировать мьютекс!" -#: client.c:256 +#: client.c:258 msgid "Can't make exposition" msgstr "Не могу выполнить экспозицию" -#: imageview.c:547 +#: imageview.c:548 msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr "Не могу открыть окно OpenGL, отображение будет недоступно" -#: ccdfunc.c:685 +#: ccdfunc.c:686 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "Не могу выполнить команду затвора %s (не поддерживается?)" #. п²п╣ п╪п╬пЁя┐ я│п╬я┘я─п╟п╫п╦я┌я▄ я└п╟п╧п╩ -#: ccdfunc.c:208 +#: ccdfunc.c:209 #, c-format msgid "Can't save file with prefix %s" msgstr "Не могу сохранить файл с префиксом %s" -#: ccdfunc.c:740 +#: ccdfunc.c:741 #, c-format msgid "Can't set %d flushes" msgstr "Не могу установить %d сбросов" -#: ccdfunc.c:704 +#: ccdfunc.c:705 msgid "Can't set IOport" msgstr "Не могу поменять значения порта I/O" -#: ccdfunc.c:675 +#: ccdfunc.c:676 #, c-format msgid "Can't set T to %g degC" msgstr "Не могу установить температуру в %g градЦ" -#: ccdfunc.c:647 +#: ccdfunc.c:648 msgid "Can't set active camera number" msgstr "Не могу установить номер активной камеры" -#: ccdfunc.c:455 +#: ccdfunc.c:456 msgid "Can't set active focuser number" msgstr "Не могу установить номер активного фокусера" -#: ccdfunc.c:546 +#: ccdfunc.c:547 msgid "Can't set active wheel number" msgstr "Не могу установить номер активного колеса" -#: ccdfunc.c:724 server.c:227 +#: ccdfunc.c:725 server.c:234 #, c-format msgid "Can't set binning %dx%d" msgstr "Не могу установить биннинг %dx%d" -#: ccdfunc.c:750 +#: ccdfunc.c:751 msgid "Can't set bit depth" msgstr "Не могу установить разрядность АЦП" -#: ccdfunc.c:718 +#: ccdfunc.c:719 #, c-format msgid "Can't set brightness to %g" msgstr "Не могу установить яркость в %g" -#: ccdfunc.c:744 +#: ccdfunc.c:745 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "Не могу установить экспозицию в %f секунд" -#: ccdfunc.c:653 +#: ccdfunc.c:654 msgid "Can't set fan speed" msgstr "Не могу установить скорость вентиляторов" -#: ccdfunc.c:712 +#: ccdfunc.c:713 #, c-format msgid "Can't set gain to %g" msgstr "Не могу установить Gain в %g" -#: ccdfunc.c:736 server.c:228 +#: ccdfunc.c:737 server.c:235 msgid "Can't set given geometry" msgstr "Не могу установить геометрию" -#: ccdfunc.c:496 +#: ccdfunc.c:497 #, c-format msgid "Can't set position %g" msgstr "Не могу изменить позицию на %g" -#: ccdfunc.c:490 +#: ccdfunc.c:491 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "Не могу установить позицию %g: вне пределов [%g, %g]" -#: ccdfunc.c:752 +#: ccdfunc.c:753 msgid "Can't set readout speed" msgstr "Не могу установить скорость считывания" -#: ccdfunc.c:573 +#: ccdfunc.c:574 #, c-format msgid "Can't set wheel position %d" msgstr "Не могу установить положение колеса %d" -#: ccdfunc.c:780 ccdfunc.c:832 server.c:122 +#: ccdfunc.c:783 ccdfunc.c:841 server.c:122 msgid "Can't start exposition" msgstr "Не могу начать экспозицию" #. п≈п╟я┘п╡п╟я┌ п╨п╟п╢я─п╟ %d\n -#: ccdfunc.c:778 +#: ccdfunc.c:781 #, c-format msgid "Capture frame %d" msgstr "Захват кадра %d" -#: ccdfunc.c:672 +#: ccdfunc.c:673 #, c-format msgid "Current format: %s" msgstr "" @@ -232,55 +232,55 @@ msgstr "" msgid "Display image in OpenGL window" msgstr "Отображение изображения в окне OpenGL" -#: imageview.c:508 imageview.c:581 +#: imageview.c:509 imageview.c:584 #, c-format msgid "Equalization of histogram: %s" msgstr "Эквализация гистограммы: %s" -#: ccdfunc.c:365 +#: ccdfunc.c:366 msgid "Error saving file" msgstr "Ошибка сохранения файла" -#: ccdfunc.c:669 +#: ccdfunc.c:670 #, c-format msgid "Field of view: %s" msgstr "Поле зрения: %s" -#: ccdfunc.c:356 +#: ccdfunc.c:357 #, c-format msgid "File saved as '%s'" msgstr "Файл сохранен как '%s'" -#: ccdfunc.c:413 +#: ccdfunc.c:414 msgid "Focuser device not pointed" msgstr "Устройство фокусера не указано" -#: ccdfunc.c:643 +#: ccdfunc.c:644 #, c-format msgid "Found %d cameras, you point number %d" msgstr "Обнаружено %d камер, вы указали %d" -#: ccdfunc.c:451 +#: ccdfunc.c:452 #, c-format msgid "Found %d focusers, you point number %d" msgstr "Обнаружено %d фокусеров, вы указали %d" -#: ccdfunc.c:542 +#: ccdfunc.c:543 #, c-format msgid "Found %d wheels, you point number %d" msgstr "Обнаружено %d колес, вы указали %d" -#: ccdfunc.c:666 +#: ccdfunc.c:667 #, c-format msgid "Full array: %s" msgstr "Полный формат: %s" -#: imageview.c:388 +#: imageview.c:389 #, c-format msgid "Histogram conversion: %s" msgstr "Преобразование гистограммы: %s" -#: ccdfunc.c:405 +#: ccdfunc.c:406 #, c-format msgid "Image stat:\n" msgstr "Статистика по изображению: \n" @@ -289,23 +289,23 @@ msgstr " msgid "N flushes before exposing (default: 1)" msgstr "N засвечиваний перед экспозицией (по умолчанию: 1)" -#: server.c:165 +#: server.c:170 msgid "No camera device" msgstr "Не указано устройство камеры" -#: ccdfunc.c:612 ccdfunc.c:613 +#: ccdfunc.c:613 ccdfunc.c:614 msgid "No cameras found" msgstr "Камер не обнаружено" -#: ccdfunc.c:420 +#: ccdfunc.c:421 msgid "No focusers found" msgstr "Фокусеров не обнаружено" -#: ccdfunc.c:511 +#: ccdfunc.c:512 msgid "No wheels found" msgstr "Турелей не обнаружено" -#: ccdfunc.c:754 +#: ccdfunc.c:755 msgid "Only show statistics" msgstr "Только отобразить статистику" @@ -313,52 +313,52 @@ msgstr " msgid "PID file (default: " msgstr "PID-файл (по умолчанию: " -#: ccdfunc.c:660 +#: ccdfunc.c:661 #, c-format msgid "Pixel size: %g x %g" msgstr "Размер пикселя: %g x %g" -#: ccdfunc.c:787 +#: ccdfunc.c:791 msgid "Read grabbed image" msgstr "Считывание изображения" -#: ccdfunc.c:753 +#: ccdfunc.c:754 #, c-format msgid "Readout mode: %s" msgstr "Режим считывания: %s" -#: client.c:285 +#: client.c:287 msgid "Server timeout" msgstr "Таймаут сервера" -#: ccdfunc.c:717 +#: ccdfunc.c:718 #, c-format msgid "Set brightness to %g" msgstr "Установить яркость в %g" -#: ccdfunc.c:654 +#: ccdfunc.c:655 #, c-format msgid "Set fan speed to %d" msgstr "Не могу установить скорость вентиляторов в %d" -#: ccdfunc.c:711 +#: ccdfunc.c:712 #, c-format msgid "Set gain to %g" msgstr "Установить Gain в %g" -#: ccdfunc.c:683 +#: ccdfunc.c:684 #, c-format msgid "Shutter command: %s\n" msgstr "Команда затвора: %s\n" #. "п÷п╬п©я▀я┌п╨п╟ я│п╨п╬п╫я└п╦пЁя┐я─п╦я─п╬п╡п╟я┌я▄ п©п╬я─я┌ I/O п╨п╟п╨ %d\n" -#: ccdfunc.c:689 +#: ccdfunc.c:690 #, c-format msgid "Try to configure I/O port as %d" msgstr "Попытка сконфигурировать порт I/O как %d" #. "п÷п╬п©я▀я┌п╨п╟ п╥п╟п©п╦я│п╦ %d п╡ п©п╬я─я┌ I/O\n" -#: ccdfunc.c:702 +#: ccdfunc.c:703 #, c-format msgid "Try to write %d to I/O port" msgstr "Попытка записи %d в порт I/O" @@ -367,11 +367,11 @@ msgstr " msgid "UNIX socket name" msgstr "Имя UNIX-сокета" -#: ccdfunc.c:504 +#: ccdfunc.c:505 msgid "Wheel device not pointed" msgstr "Устройство турели не указано" -#: ccdfunc.c:569 +#: ccdfunc.c:570 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "Позиция колеса должна быть от 0 до %d" @@ -510,11 +510,11 @@ msgstr " msgid "observing program name" msgstr "название программы" -#: imageview.c:508 imageview.c:581 +#: imageview.c:509 imageview.c:584 msgid "off" msgstr "выкл" -#: imageview.c:508 imageview.c:581 +#: imageview.c:509 imageview.c:584 msgid "on" msgstr "вкл" diff --git a/server.c b/server.c index b7fdc5e..1fe5872 100644 --- a/server.c +++ b/server.c @@ -113,7 +113,7 @@ static void fixima(){ // functions for processCAM finite state machine static inline void cameraidlestate(){ // idle - wait for capture commands if(camflags & FLAG_STARTCAPTURE){ // start capturing - DBG("Start exposition"); + TIMESTAMP("Start exposition"); camflags &= ~(FLAG_STARTCAPTURE | FLAG_CANCEL); camstate = CAMERA_CAPTURE; fixima(); @@ -137,20 +137,25 @@ static inline void cameracapturestate(){ // capturing - wait for exposition ends capture_status cs; if(camera->pollcapture(&cs, &tremain)){ if(cs != CAPTURE_PROCESS){ - DBG("Capture ready"); + TIMESTAMP("Capture ready"); tremain = 0.; // now save frame if(!ima.data) LOGERR("Can't save image: not initialized"); else{ + TIMESTAMP("start capture"); if(!camera->capture(&ima)){ LOGERR("Can't capture image"); camstate = CAMERA_ERROR; return; }else{ - calculate_stat(&ima); + if(lastfile){ + TIMESTAMP("Calc stat"); + calculate_stat(&ima); + } if(saveFITS(&ima, &lastfile)){ DBG("LAST file name changed"); } + TIMESTAMP("Image saved"); } } camstate = CAMERA_FRAMERDY; @@ -221,6 +226,8 @@ static int camdevini(int n){ curformat = frmformatmax; DBG("\n\nGeometry format (offx/offy) w/h: (%d/%d) %d/%d", curformat.xoff, curformat.yoff, curformat.w, curformat.h); + curformat.xoff = 0; + curformat.yoff = 0; if(GP->hbin < 1) GP->hbin = 1; if(GP->vbin < 1) GP->vbin = 1; fixima(); @@ -560,6 +567,8 @@ static hresult expstatehandler(_U_ int fd, _U_ const char *key, _U_ const char * return RESULT_OK; } else if(n == CAMERA_CAPTURE){ // start exposition + TIMESTAMP("End of cycle - start new"); + TIMEINIT(); camflags |= FLAG_STARTCAPTURE; return RESULT_OK; } @@ -1028,6 +1037,7 @@ void server(int sock, int imsock){ close(client); DBG("%d closed", client); }else{WARN("accept()"); DBG("disconnected");} + TIMESTAMP("Image sent"); } if(poll_set[0].revents & POLLIN){ // check main for accept() struct sockaddr_in addr; @@ -1053,8 +1063,10 @@ void server(int sock, int imsock){ char buff[PATH_MAX+32]; snprintf(buff, PATH_MAX, CMD_EXPSTATE "=%d", camstate); DBG("Send %s to %d clients", buff, nfd - 2); - for(int i = 2; i < nfd; ++i) + for(int i = 2; i < nfd; ++i){ + TIMESTAMP("Send message that all ready"); sendstrmessage(poll_set[i].fd, buff); + } if(camstate == CAMERA_FRAMERDY){ // send to all last file name snprintf(buff, PATH_MAX+31, CMD_LASTFNAME "=%s", lastfile); for(int i = 2; i < nfd; ++i) diff --git a/socket.c b/socket.c index b9d4912..6f96248 100644 --- a/socket.c +++ b/socket.c @@ -34,6 +34,10 @@ #include "server.h" #include "socket.h" +#ifdef EBUG +double __t0 = 0.; +#endif + pthread_mutex_t locmutex = PTHREAD_MUTEX_INITIALIZER; // mutex for wheel/camera/focuser functions /** diff --git a/socket.h b/socket.h index f7877b0..d2d85a0 100644 --- a/socket.h +++ b/socket.h @@ -19,6 +19,7 @@ #pragma once #include #include +#include // max & min TCP socket port number #define PORTN_MAX (65535) @@ -37,6 +38,15 @@ // client will disconnect after this time from last server message #define CLIENT_TIMEOUT (3.0) +#ifdef EBUG +extern double __t0; +#define TIMEINIT() do{__t0 = dtime();}while(0) +#define TIMESTAMP(...) do{DBG(__VA_ARGS__); fprintf(stderr, COLOR_GREEN "%g" COLOR_OLD "\n", dtime()-__t0);}while(0) +#else +#define TIMEINIT() +#define TIMESTAMP() +#endif + extern pthread_mutex_t locmutex; typedef enum{