diff --git a/GRH_cameras/grasshopper.c b/GRH_cameras/grasshopper.c index 153283f..93046f0 100644 --- a/GRH_cameras/grasshopper.c +++ b/GRH_cameras/grasshopper.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -33,6 +34,7 @@ static fc2PGRGuid guid; static fc2Error err = FC2_ERROR_OK; static int isopened = FALSE, is16bit = FALSE; +static atomic_int canceled = 0; static char camname[BUFSIZ] = {0}; #ifndef Stringify @@ -287,6 +289,7 @@ rtn: static int capture(IMG *ima){ FNAME(); + if(canceled) return FALSE; if(!ima || !ima->data || !isopened) return FALSE; static int toohot = FALSE; float f; @@ -432,12 +435,17 @@ static int shutter(_U_ shutter_op cmd){ return FALSE; } +static void capcancel(){ + canceled = 1; + DBG("No capturing now"); +} + static int ffalse(_U_ float f){ return FALSE; } static int fpfalse(_U_ float *f){ return FALSE; } static int ifalse(_U_ int i){ return FALSE; } static int vtrue(){ return TRUE; } static int ipfalse(_U_ int *i){ return FALSE; } -static void vstub(){ return ;} +//static void vstub(){ return ;} /* * Global objects: camera, focuser and wheel @@ -447,7 +455,7 @@ Camera camera = { .close = disconnect, .pollcapture = pollcapt, .capture = capture, - .cancel = vstub, + .cancel = capcancel, .startexposition = vtrue, // setters: .setDevNo = setdevno, diff --git a/ccdfunc.c b/ccdfunc.c index 34925ee..0a4df23 100644 --- a/ccdfunc.c +++ b/ccdfunc.c @@ -211,14 +211,13 @@ int saveFITS(IMG *img, char **outp){ } int width = img->w, height = img->h; void *data = (void*) img->data; - long naxes[2] = {width, height}; + long naxes[2] = {width, height}, tmpl; double tmpd = 0.0; float tmpf = 0.0; int tmpi = 0; struct tm *tm_time; char bufc[FLEN_CARD]; time_t savetime = time(NULL); - double dsavetime = dtime(); fitsfile *fp; fitserror = 0; TRYFITS(fits_create_file, &fp, fnam); @@ -278,9 +277,10 @@ int saveFITS(IMG *img, char **outp){ // DATE / Creation date (YYYY-MM-DDThh:mm:ss, UTC) strftime(bufc, FLEN_VALUE, "%Y-%m-%dT%H:%M:%S", gmtime(&savetime)); WRITEKEY(fp, TSTRING, "DATE", bufc, "Creation date (YYYY-MM-DDThh:mm:ss, UTC)"); + tmpl = (long) savetime; tm_time = localtime(&savetime); strftime(bufc, FLEN_VALUE, "File creation time (UNIX)", tm_time); - WRITEKEY(fp, TDOUBLE, "UNIXTIME", &dsavetime, bufc); + WRITEKEY(fp, TLONG, "UNIXTIME", &tmpl, bufc); strftime(bufc, 80, "%Y/%m/%d", tm_time); // DATE-OBS / DATE (YYYY/MM/DD) OF OBS. WRITEKEY(fp, TSTRING, "DATE-OBS", bufc, "DATE OF OBS. (YYYY/MM/DD, local)"); @@ -718,8 +718,6 @@ int prepare_ccds(){ }else WARNX(_("Can't set brightness to %g"), GP->brightness); } /*********************** expose control ***********************/ - // cancel previous exp - camera->cancel(); if(GP->hbin < 1) GP->hbin = 1; if(GP->vbin < 1) GP->vbin = 1; if(!camera->setbin(GP->hbin, GP->vbin)){ @@ -813,9 +811,11 @@ DBG("w=%d, h=%d", raw_width, raw_height); closecam(); } -void cancel(){ +// cancel expositions and close camera devise +void camstop(){ if(camera){ camera->cancel(); + camera->close(); } } @@ -855,16 +855,18 @@ eof: * @return TRUE if new image available */ int ccdcaptured(IMG **imgptr){ + static double tlast = 0.; if(!imgptr) return FALSE; static pthread_t grabthread = 0; if(imgptr == (void*)-1){ // kill `grabnext` - DBG("Kill grabbing thread"); + DBG("Wait for grabbing thread ends"); if(grabthread){ - pthread_cancel(grabthread); + //pthread_cancel(grabthread); - this kills some cameras + //pthread_timedjoin_np pthread_join(grabthread, NULL); grabthread = 0; } - DBG("Killed"); + DBG("OK"); return FALSE; } frameformat fmt = camera->geometry; @@ -879,20 +881,27 @@ int ccdcaptured(IMG **imgptr){ ima->h = raw_height; *imgptr = ima; }else ima = *imgptr; + if(!grabthread){ // start new grab DBG("\n\n\nStart new grab"); 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("Thread is dead"); + DBG("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)); + tlast = t; + } if(retcode) return TRUE; } } diff --git a/ccdfunc.h b/ccdfunc.h index debf9da..dbd2583 100644 --- a/ccdfunc.h +++ b/ccdfunc.h @@ -29,7 +29,7 @@ void focusers(); void wheels(); int prepare_ccds(); void ccds(); -void cancel(); +void camstop(); int startCCD(void **dlh); int startWheel(void **dlh); diff --git a/client.c b/client.c index 554fb99..ec9cc62 100644 --- a/client.c +++ b/client.c @@ -33,6 +33,7 @@ static char sendbuf[BUFSIZ]; #define SENDMSG(...) do{snprintf(sendbuf, BUFSIZ-1, __VA_ARGS__); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf); getans(sock);}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 #ifdef IMAGEVIEW static IMG ima = {0}; @@ -110,6 +111,9 @@ static int parseans(char *ans){ }else if(0 == strcmp(CMD_FRAMEMAX, ans)){ sscanf(val, "%d,%d,%d,%d", &xm0, &ym0, &xm1, &ym1); DBG("Got maxformat: %d,%d,%d,%d", xm0, ym0, xm1, ym1); + }else if(0 == strcmp(CMD_FRAMEFORMAT, ans)){ + sscanf(val, "%d,%d,%d,%d", &xc0, &yc0, &xc1, &yc1); + DBG("Got current format: %d,%d,%d,%d", xc0, yc0, xc1, yc1); } #ifdef IMAGEVIEW else if(0 == strcmp(CMD_IMWIDTH, ans)){ @@ -165,13 +169,15 @@ static void send_headers(int sock){ // CCD/CMOS if(GP->X0 > -1 || GP->Y0 > -1 || GP->X1 > -1 || GP->Y1 > -1){ // set format SENDMSG(CMD_FRAMEMAX); - DBG("max format: (%d,%d)x(%d,%d)", xm0,ym0,xm1,ym1); - if(GP->X0 < 0) GP->X0 = xm0; // default values + SENDMSG(CMD_FRAMEFORMAT); + if(GP->X0 < 0) GP->X0 = xc0; // default values else if(GP->X0 > xm1-1) GP->X0 = xm1-1; - if(GP->Y0 < 0) GP->Y0 = ym0; + if(GP->Y0 < 0) GP->Y0 = yc0; else if(GP->Y0 > ym1-1) GP->Y0 = ym1-1; - if(GP->X1 < GP->X0+1 || GP->X1 > xm1) GP->X1 = xm1; - if(GP->Y1 < GP->Y0+1 || GP->Y1 > ym1) GP->Y1 = ym1; + if(GP->X1 < GP->X0+1) GP->X1 = xc1; + else if(GP->X1 > xm1) GP->X1 = xm1; + if(GP->Y1 < GP->Y0+1) GP->Y1 = yc1; + else if(GP->Y1 > ym1) GP->Y1 = ym1; DBG("set format: (%d,%d)x(%d,%d)", GP->X0,GP->X1,GP->Y0,GP->Y1); SENDMSG(CMD_FRAMEFORMAT "=%d,%d,%d,%d", GP->X0, GP->Y0, GP->X1, GP->Y1); } @@ -245,7 +251,8 @@ void client(int sock){ else GP->waitexpend = TRUE; // N>1 - wait for exp ends SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE); }else{ - while(getans(sock)); + double t0 = dtime(); + while(getans(sock) && dtime() - t0 < WAIT_TIMEOUT); DBG("RETURN: no more data"); return; } @@ -306,15 +313,48 @@ void init_grab_sock(int sock){ send_headers(sock); } +static void getimage(){ + int sock = grabsockfd; + SENDMSG(CMD_IMWIDTH); + SENDMSG(CMD_IMHEIGHT); + while(readmsg(sock)); // clear all incoming data + sendstrmessage(sock, CMD_GETIMAGE); // ask for image + if(imbufsz < imdatalen){ + DBG("Reallocate memory from %d to %d", imbufsz, imdatalen); + ima.data = realloc(ima.data, imdatalen); + imbufsz = imdatalen; + } + double t0 = dtime(); + int got = 0; + while(dtime() - t0 < CLIENT_TIMEOUT){ + if(!canberead(sock)) continue; + uint8_t *target = ((uint8_t*)ima.data)+got; + int rd = read(sock, target, imdatalen - got); + if(rd <= 0){ + WARNX("Server disconnected"); + signals(1); + } + got += rd; + 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"); +} + static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net FNAME(); if(grabsockfd < 0) return NULL; int sock = grabsockfd; while(1){ + DBG("WAIT"); while(grabends); // wait until image processed - SENDMSG(CMD_IMWIDTH); - SENDMSG(CMD_IMHEIGHT); expstate = CAMERA_CAPTURE; + DBG("CAPT"); SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE); // start capture double timeout = GP->exptime + CLIENT_TIMEOUT, t0 = dtime(); useconds_t sleept = 500000; // 0.5s @@ -335,31 +375,23 @@ static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net continue; } DBG("Frame ready"); - while(readmsg(sock)); // clear all incoming data - sendstrmessage(sock, CMD_GETIMAGE); // ask for image - if(imbufsz < imdatalen){ - DBG("Reallocate memory from %d to %d", imbufsz, imdatalen); - ima.data = realloc(ima.data, imdatalen); - imbufsz = imdatalen; + getimage(); + } + return NULL; +} + +static void *waitimage(void _U_ *arg){ // passive waiting for next image + FNAME(); + if(grabsockfd < 0) return NULL; + int sock = grabsockfd; + while(1){ + while(grabends); // wait until image processed + getans(sock); + if(expstate != CAMERA_FRAMERDY){ + usleep(1000); + continue; } - t0 = dtime(); - int got = 0; - while(dtime() - t0 < CLIENT_TIMEOUT){ - if(!canberead(sock)) continue; - int rd = read(sock, ((uint8_t*)ima.data)+got, imdatalen - got); - if(rd <= 0){ - WARNX("Server disconnected"); - signals(1); - } - got += rd; - DBG("Read %d bytes; total read %d from %d", rd, got, imdatalen); - if(got == imdatalen){ - DBG("Got image"); - grabends = 1; - break; - } - } - if(dtime() - t0 > CLIENT_TIMEOUT) WARNX("Timeout, image didn't received"); + getimage(); } return NULL; } @@ -370,24 +402,33 @@ int sockcaptured(IMG **imgptr){ static pthread_t grabthread = 0; if(grabsockfd < 0) return FALSE; if(imgptr == (void*)-1){ // kill `grabnext` - DBG("Kill grabbing thread"); + DBG("Wait for grabbing thread"); if(grabthread){ pthread_cancel(grabthread); pthread_join(grabthread, NULL); grabthread = 0; } - DBG("Killed"); + DBG("OK"); return FALSE; } if(!grabthread){ // start new grab - DBG("\n\n\nStart new grab"); - if(pthread_create(&grabthread, NULL, &grabnext, NULL)){ - WARN("Can't create grabbing thread"); - grabthread = 0; - } + if(GP->viewer){ + DBG("\n\n\nStart new waiting"); + if(pthread_create(&grabthread, NULL, &waitimage, NULL)){ + WARN("Can't create waiting thread"); + grabthread = 0; + } + }else{ + DBG("\n\n\nStart new grab"); + if(pthread_create(&grabthread, NULL, &grabnext, NULL)){ + WARN("Can't create grabbing thread"); + grabthread = 0; + } + } }else{ // grab in process if(grabends){ // image is ready DBG("Image ready"); + grabthread = 0; if(*imgptr && (*imgptr != &ima)) free(*imgptr); *imgptr = &ima; grabends = 0; diff --git a/cmdlnopts.c b/cmdlnopts.c index 1c9daa5..5243c9a 100644 --- a/cmdlnopts.c +++ b/cmdlnopts.c @@ -101,6 +101,7 @@ myoption cmdlnopts[] = { {"path", NEED_ARG, NULL, 0, arg_string, APTR(&G.path), N_("UNIX socket name")}, {"port", NEED_ARG, NULL, 0, arg_string, APTR(&G.port), N_("local INET socket port")}, {"client", NO_ARGS, &G.client,1, arg_none, NULL, N_("run as client")}, + {"viewer", NO_ARGS, &G.viewer,1, arg_none, NULL, N_("passive viewer (only get last images)")}, {"pidfile", NEED_ARG, NULL, 0, arg_string, APTR(&G.pidfile), N_("PID file (default: " DEFAULT_PID_FILE ")")}, {"restart", NO_ARGS, &G.restart,1, arg_none, NULL, N_("restart image server")}, diff --git a/cmdlnopts.h b/cmdlnopts.h index 9331444..c36994f 100644 --- a/cmdlnopts.h +++ b/cmdlnopts.h @@ -42,8 +42,9 @@ typedef struct{ char **addhdr; // list of files from which to add header records int restart; // restart server int waitexpend; // wait while exposition ends - int cancelexpose; // cancel exp + int cancelexpose; // cancel exp (for Grasshopper - forbid forever) int client; // run as client + int viewer; // passive client (only get last images) int listdevices; // list connected devices int fanspeed; // fan speed: 0-2 int noflush; // turn off bg flushing diff --git a/imageview.c b/imageview.c index 36a947c..6260e03 100644 --- a/imageview.c +++ b/imageview.c @@ -518,11 +518,11 @@ void closeGL(){ usleep(1000); if(!initialized) return; initialized = 0; - cancel(); // cancel expositions + camstop(); // cancel expositions + //DBG("Leave mainloop"); + //glutLeaveMainLoop(); DBG("kill"); killwindow(); - DBG("Leave mainloop"); - glutLeaveMainLoop(); DBG("join"); if(GLUTthread) pthread_join(GLUTthread, NULL); // wait while main thread exits DBG("main GL thread cancelled"); diff --git a/locale/ru/messages.po b/locale/ru/messages.po index 107b7cf..739120f 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-02 12:50+0300\n" +"POT-Creation-Date: 2023-04-04 18:42+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -234,14 +234,18 @@ msgid "run as client" msgstr "" #: cmdlnopts.c:104 -msgid "PID file (default: " +msgid "passive viewer (only get last images)" msgstr "" #: cmdlnopts.c:105 +msgid "PID file (default: " +msgstr "" + +#: cmdlnopts.c:106 msgid "restart image server" msgstr "" -#: cmdlnopts.c:108 +#: cmdlnopts.c:109 msgid "Display image in OpenGL window" msgstr "" @@ -474,88 +478,88 @@ msgstr "" msgid "Can't set brightness to %g" msgstr "" -#: ccdfunc.c:726 server.c:229 +#: ccdfunc.c:724 server.c:228 #, c-format msgid "Can't set binning %dx%d" msgstr "" -#: ccdfunc.c:738 server.c:230 +#: ccdfunc.c:736 server.c:229 msgid "Can't set given geometry" msgstr "" -#: ccdfunc.c:742 +#: ccdfunc.c:740 #, c-format msgid "Can't set %d flushes" msgstr "" -#: ccdfunc.c:746 +#: ccdfunc.c:744 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "" -#: ccdfunc.c:749 +#: ccdfunc.c:747 msgid "Can't change frame type" msgstr "" -#: ccdfunc.c:752 +#: ccdfunc.c:750 msgid "Can't set bit depth" msgstr "" -#: ccdfunc.c:754 +#: ccdfunc.c:752 msgid "Can't set readout speed" msgstr "" -#: ccdfunc.c:755 +#: ccdfunc.c:753 #, c-format msgid "Readout mode: %s" msgstr "" -#: ccdfunc.c:756 +#: ccdfunc.c:754 msgid "Only show statistics" msgstr "" #. GET binning should be AFTER setgeometry! -#: ccdfunc.c:758 +#: ccdfunc.c:756 msgid "Can't get current binning" msgstr "" #. Захват кадра %d\n -#: ccdfunc.c:780 +#: ccdfunc.c:778 #, c-format msgid "Capture frame %d" msgstr "" -#: ccdfunc.c:782 ccdfunc.c:832 server.c:124 +#: ccdfunc.c:780 ccdfunc.c:832 server.c:123 msgid "Can't start exposition" msgstr "" -#: ccdfunc.c:786 +#: ccdfunc.c:784 msgid "Can't capture image" msgstr "" -#: ccdfunc.c:789 +#: ccdfunc.c:787 msgid "Read grabbed image" msgstr "" -#: ccdfunc.c:792 ccdfunc.c:840 +#: ccdfunc.c:790 ccdfunc.c:840 msgid "Can't grab image" msgstr "" #. %d секунд до окончания паузы\n -#: ccdfunc.c:801 client.c:282 +#: ccdfunc.c:799 client.c:289 #, c-format msgid "%d seconds till pause ends\n" msgstr "" -#: server.c:167 +#: server.c:166 msgid "No camera device" msgstr "" -#: client.c:269 +#: client.c:276 msgid "Can't make exposition" msgstr "" -#: client.c:298 +#: client.c:305 msgid "Server timeout" msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index 8a825e7..6f6b6bc 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-02 12:50+0300\n" + "POT-Creation-Date: 2023-04-04 18:23+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -22,7 +22,7 @@ msgid "%.1f seconds till exposition ends" msgstr "%.1f " #. %d секунд до окончания паузы\n -#: ccdfunc.c:801 client.c:282 +#: ccdfunc.c:799 client.c:289 #, c-format msgid "%d seconds till pause ends\n" msgstr "%d \n" @@ -52,11 +52,11 @@ msgstr " msgid "Camera model: %s" msgstr " : %s" -#: ccdfunc.c:786 +#: ccdfunc.c:784 msgid "Can't capture image" msgstr " " -#: ccdfunc.c:749 +#: ccdfunc.c:747 msgid "Can't change frame type" msgstr " " @@ -89,7 +89,7 @@ msgid "Can't get IOport state (unsupported?)" msgstr " I/O ( ?)" #. GET binning should be AFTER setgeometry! -#: ccdfunc.c:758 +#: ccdfunc.c:756 msgid "Can't get current binning" msgstr " " @@ -105,7 +105,7 @@ msgstr " msgid "Can't get max wheel position" msgstr " " -#: ccdfunc.c:792 ccdfunc.c:840 +#: ccdfunc.c:790 ccdfunc.c:840 msgid "Can't grab image" msgstr " " @@ -117,7 +117,7 @@ msgstr " msgid "Can't init mutex!" msgstr " !" -#: client.c:269 +#: client.c:276 msgid "Can't make exposition" msgstr " " @@ -136,7 +136,7 @@ msgstr " msgid "Can't save file with prefix %s" msgstr " %s" -#: ccdfunc.c:742 +#: ccdfunc.c:740 #, c-format msgid "Can't set %d flushes" msgstr " %d " @@ -162,12 +162,12 @@ msgstr " msgid "Can't set active wheel number" msgstr " " -#: ccdfunc.c:726 server.c:229 +#: ccdfunc.c:724 server.c:228 #, c-format msgid "Can't set binning %dx%d" msgstr " %dx%d" -#: ccdfunc.c:752 +#: ccdfunc.c:750 msgid "Can't set bit depth" msgstr " " @@ -176,7 +176,7 @@ msgstr " msgid "Can't set brightness to %g" msgstr " %g" -#: ccdfunc.c:746 +#: ccdfunc.c:744 #, c-format msgid "Can't set exposure time to %f seconds" msgstr " %f " @@ -190,7 +190,7 @@ msgstr " msgid "Can't set gain to %g" msgstr " Gain %g" -#: ccdfunc.c:738 server.c:230 +#: ccdfunc.c:736 server.c:229 msgid "Can't set given geometry" msgstr " " @@ -204,7 +204,7 @@ msgstr " msgid "Can't set position %g: out of limits [%g, %g]" msgstr " %g: [%g, %g]" -#: ccdfunc.c:754 +#: ccdfunc.c:752 msgid "Can't set readout speed" msgstr " " @@ -213,12 +213,12 @@ msgstr " msgid "Can't set wheel position %d" msgstr " %d" -#: ccdfunc.c:782 ccdfunc.c:832 server.c:124 +#: ccdfunc.c:780 ccdfunc.c:832 server.c:123 msgid "Can't start exposition" msgstr " " #. Захват кадра %d\n -#: ccdfunc.c:780 +#: ccdfunc.c:778 #, c-format msgid "Capture frame %d" msgstr " %d" @@ -228,7 +228,7 @@ msgstr " msgid "Current format: %s" msgstr "" -#: cmdlnopts.c:108 +#: cmdlnopts.c:109 msgid "Display image in OpenGL window" msgstr " OpenGL" @@ -289,7 +289,7 @@ msgstr " msgid "N flushes before exposing (default: 1)" msgstr "N ( : 1)" -#: server.c:167 +#: server.c:166 msgid "No camera device" msgstr " " @@ -305,11 +305,11 @@ msgstr " msgid "No wheels found" msgstr " " -#: ccdfunc.c:756 +#: ccdfunc.c:754 msgid "Only show statistics" msgstr " " -#: cmdlnopts.c:104 +#: cmdlnopts.c:105 msgid "PID file (default: " msgstr "PID- ( : " @@ -318,16 +318,16 @@ msgstr "PID- msgid "Pixel size: %g x %g" msgstr " : %g x %g" -#: ccdfunc.c:789 +#: ccdfunc.c:787 msgid "Read grabbed image" msgstr " " -#: ccdfunc.c:755 +#: ccdfunc.c:753 #, c-format msgid "Readout mode: %s" msgstr " : %s" -#: client.c:298 +#: client.c:305 msgid "Server timeout" msgstr " " @@ -521,11 +521,15 @@ msgstr " msgid "output file name" msgstr " " +#: cmdlnopts.c:104 +msgid "passive viewer (only get last images)" +msgstr "" + #: cmdlnopts.c:60 msgid "program author" msgstr " " -#: cmdlnopts.c:105 +#: cmdlnopts.c:106 msgid "restart image server" msgstr " " diff --git a/main.c b/main.c index c0bda22..3889ed2 100644 --- a/main.c +++ b/main.c @@ -58,17 +58,16 @@ void signals(int signo){ // slave: cancel exposition if(signo) WARNX("Get signal %d - exit", signo); if(!GP->client){ - DBG("Cancel capturing"); - cancel(); + DBG("Cancel capturing and close all"); + camstop(); + closewheel(); + focclose(); } #ifdef IMAGEVIEW DBG("KILL GL"); closeGL(); usleep(10000); #endif - closewheel(); - focclose(); - closecam(); exit(signo); } @@ -87,6 +86,10 @@ int main(int argc, char **argv){ omp_set_num_threads(cpunumber); */ parse_args(argc, argv); + if(GP->viewer){ + GP->client = 1; + GP->showimage = 1; + } if(GP->outfile && GP->outfileprefix) ERRX("Can't use outfile name and prefix together"); if(GP->outfile && !GP->rewrite){ struct stat filestat; diff --git a/server.c b/server.c index 0fbb1ca..3ff36a9 100644 --- a/server.c +++ b/server.c @@ -117,7 +117,6 @@ static inline void cameraidlestate(){ // idle - wait for capture commands DBG("Start exposition"); camflags &= ~(FLAG_STARTCAPTURE | FLAG_CANCEL); camstate = CAMERA_CAPTURE; - camera->cancel(); fixima(); if(!camera->startexposition()){ LOGERR("Can't start exposition"); @@ -515,9 +514,16 @@ static hresult brightnesshandler(_U_ int fd, _U_ const char *key, _U_ const char static hresult formathandler(int fd, const char *key, const char *val){ char buf[64]; frameformat fmt; + DBG("key=%s, val=%s", key, val); if(val){ - if(0 == strcmp(key, CMD_FRAMEMAX)) return RESULT_BADKEY; // can't set maxformat - if(4 != sscanf(val, "%d,%d,%d,%d", &fmt.xoff, &fmt.yoff, &fmt.w, &fmt.h)) return RESULT_BADVAL; + if(0 == strcmp(key, CMD_FRAMEMAX)){ + DBG("CANT SET MAXFORMAT"); + return RESULT_BADKEY; // can't set maxformat + } + if(4 != sscanf(val, "%d,%d,%d,%d", &fmt.xoff, &fmt.yoff, &fmt.w, &fmt.h)){ + DBG("Wrong format %s", val); + return RESULT_BADVAL; + } fmt.w -= fmt.xoff; fmt.h -= fmt.yoff; int r = camera->setgeometry(&fmt); if(!r) return RESULT_FAIL; @@ -894,7 +900,7 @@ static hresult imsizehandler(int fd, const char *key, _U_ const char *val){ if(0 == strcmp(key, CMD_IMHEIGHT)) snprintf(buf, 63, CMD_IMHEIGHT "=%d", ima.h); else snprintf(buf, 63, CMD_IMWIDTH "=%d", ima.w); if(!sendstrmessage(fd, buf)) return RESULT_DISCONNECTED; - return RESULT_OK; + return RESULT_SILENCE; } // for setters: do nothing when camera not in idle state diff --git a/socket.c b/socket.c index 139308f..b785305 100644 --- a/socket.c +++ b/socket.c @@ -120,6 +120,7 @@ int start_socket(int isserver, char *path, int isnet){ else{ #ifdef IMAGEVIEW if(GP->showimage){ + if(!GP->viewer && GP->exptime < 0.00001) ERRX("Need exposition time!"); init_grab_sock(sock); viewer(sockcaptured); // start viewer with socket client parser }else @@ -256,6 +257,7 @@ static int parsestring(int fd, handleritem *handlers, char *str){ return sendstrmessage(fd, hresult2str(r)); } } + DBG("Command not found!"); return sendstrmessage(fd, resmessages[RESULT_BADKEY]); } diff --git a/socket.h b/socket.h index 71c1e8b..9903ae4 100644 --- a/socket.h +++ b/socket.h @@ -29,13 +29,13 @@ #define MAXCLIENTS (30) // wait for mutex locking -#define BUSY_TIMEOUT (0.3) +#define BUSY_TIMEOUT (0.1) // waiting for answer timeout #define ANSWER_TIMEOUT (1.0) // wait for exposition ends (between subsequent check calls) #define WAIT_TIMEOUT (2.0) // client will disconnect after this time from last server message -#define CLIENT_TIMEOUT (10.0) +#define CLIENT_TIMEOUT (3.0) extern pthread_mutex_t locmutex;