From cfa057d0c161af54f2917f6e46a2bbdf333d3949 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 21 Dec 2023 16:51:28 +0300 Subject: [PATCH] shm to client; TODO: check new image by timestamp, not by control socket messages --- Dummy_cameras/dummyfunc.c | 17 +-- basestructs.h | 2 +- ccdfunc.c | 3 + client.c | 70 ++++++++---- cmdlnopts.c | 7 +- cmdlnopts.h | 1 + locale/ru/LC_MESSAGES/ccd_capture.mo | Bin 14380 -> 14223 bytes locale/ru/messages.po | 140 ++++++++++++------------ locale/ru/ru.po | 152 ++++++++++++++------------- server.c | 66 ++---------- socket.c | 59 ++++++++++- socket.h | 8 +- 12 files changed, 290 insertions(+), 235 deletions(-) diff --git a/Dummy_cameras/dummyfunc.c b/Dummy_cameras/dummyfunc.c index 73eaa98..798e87c 100644 --- a/Dummy_cameras/dummyfunc.c +++ b/Dummy_cameras/dummyfunc.c @@ -69,20 +69,24 @@ static int startexp(){ static int camcapt(IMG *ima){ static int n = 0; if(!ima || !ima->data) return FALSE; +#ifdef EBUG + double t0 = dtime(); +#endif + int y1 = ima->h * curvbin, x1 = ima->w * curhbin; if(bitpix == 16){ OMP_FOR() - for(int y = 0; y < ima->h; ++y){ - uint16_t *d = &((uint16_t*)ima->data)[y*ima->w]; - for(int x = 0; x < ima->w; ++x){ // sinusoide 100x200 + for(int y = 0; y < y1; y += curvbin){ + uint16_t *d = &((uint16_t*)ima->data)[y*ima->w/curvbin]; + for(int x = 0; x < x1; x += curhbin){ // 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.); } } }else{ OMP_FOR() - for(int y = 0; y < ima->h; ++y){ - uint8_t *d = &((uint8_t*)ima->data)[y*ima->w]; - for(int x = 0; x < ima->w; ++x){ // sinusoide 100x200 + for(int y = 0; y < y1; y += curvbin){ + uint8_t *d = &((uint8_t*)ima->data)[y*ima->w/curvbin]; + for(int x = 0; x < x1; x += curhbin){ // sinusoide 100x200 //*d++ = (uint16_t)(((n+x)%100)/99.*65535.); *d++ = (uint8_t)((1. + sin((n+x) * M_PI/50.)*sin((n+y) * M_PI/100.))*127.); } @@ -90,6 +94,7 @@ static int camcapt(IMG *ima){ } ++n; ima->bitpix = bitpix; + DBG("Time of capture: %g", dtime() - t0); return TRUE; } diff --git a/basestructs.h b/basestructs.h index 91e8a03..7dbcc47 100644 --- a/basestructs.h +++ b/basestructs.h @@ -31,7 +31,7 @@ typedef struct __attribute__((packed, aligned(4))){ int w, h; // image size uint16_t max, min; // min/max values float avr, std; // statistics - size_t bytelen; // size of image in bytes + size_t bytelen; // size of image in bytes void *data; // pointer to data (next byte after this struct) - only for server /* `data` is uint8_t or uint16_t depending on `bitpix` */ } IMG; diff --git a/ccdfunc.c b/ccdfunc.c index 85662e1..cc51618 100644 --- a/ccdfunc.c +++ b/ccdfunc.c @@ -210,6 +210,8 @@ int saveFITS(IMG *img, char **outp){ LOGERR("Can't save image with prefix %s", GP->outfileprefix); } } + calculate_stat(img); + int width = img->w, height = img->h; long naxes[2] = {width, height}; double tmpd = 0.0; @@ -283,6 +285,7 @@ int saveFITS(IMG *img, char **outp){ tm_time = localtime(&savetime); strftime(bufc, FLEN_VALUE, "File creation time (UNIX)", tm_time); WRITEKEY(fp, TDOUBLE, "UNIXTIME", &dsavetime, bufc); + WRITEKEY(fp, TDOUBLE, "TIMESTAM", &img->timestamp, "Time of acquisition end"); 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)"); diff --git a/client.c b/client.c index 758473e..c002ed9 100644 --- a/client.c +++ b/client.c @@ -44,9 +44,10 @@ static int xm0,ym0,xm1,ym1; // max format static int xc0,yc0,xc1,yc1; // current format #ifdef IMAGEVIEW -static IMG ima = {0}; static volatile atomic_int grabno = 0, oldgrabno = 0; -static size_t imbufsz = 0; +// IPC key for shared memory +static 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; #endif @@ -196,7 +197,7 @@ static void send_headers(int sock){ if(!isnan(GP->gain)) SENDMSGW(CMD_GAIN, "=%g", GP->gain); if(!isnan(GP->brightness)) SENDMSGW(CMD_BRIGHTNESS, "=%g", GP->brightness); if(GP->nflushes > 0) SENDMSGW(CMD_NFLUSHES, "=%d", GP->nflushes); - if(GP->outfile || GP->outfileprefix){ // exposition and reading control: only if start of exposition + if(GP->exptime > -DBL_EPSILON){ // exposition and reading control: only if start of exposition if(GP->_8bit) SENDMSGW(CMD_8BIT, "=1"); else SENDMSGW(CMD_8BIT, "=0"); if(GP->fast) SENDMSGW(CMD_FASTSPD, "=1"); @@ -278,8 +279,10 @@ void client(int sock){ WARNX(_("Can't make exposition")); continue; } - if(expstate != CAMERA_CAPTURE){ + //if(expstate != CAMERA_CAPTURE){ + if(expstate == CAMERA_FRAMERDY){ verbose(2, "Frame ready!"); + expstate = CAMERA_IDLE; if(Nremain){ verbose(1, "\n"); if(GP->pause_len > 0){ @@ -299,7 +302,7 @@ void client(int sock){ SENDMSGW(CMD_EXPSTATE, "=%d", CAMERA_CAPTURE); }else{ GP->waitexpend = 0; - timeout = WAIT_TIMEOUT; // wait for last file name + timeout = ANSWER_TIMEOUT; // wait for last file name } } } @@ -309,11 +312,14 @@ void client(int sock){ } #ifdef IMAGEVIEW -static int controlfd = -1; +static int controlfd = -1; // control socket FD void init_grab_sock(int sock){ 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 + shmima = getshm(GP->shmkey, 0); // try to init client shm + } } /** @@ -323,7 +329,7 @@ void init_grab_sock(int sock){ static int readNbytes(int fd, size_t N, uint8_t *buf){ size_t got = 0, need = N; double t0 = dtime(); - while(dtime() - t0 < CLIENT_TIMEOUT && canberead(fd) && need){ + while(dtime() - t0 < CLIENT_TIMEOUT /*&& canberead(fd)*/ && need){ ssize_t rd = read(fd, buf + got, need); if(rd <= 0){ WARNX("Server disconnected"); @@ -335,22 +341,33 @@ static int readNbytes(int fd, size_t N, uint8_t *buf){ return TRUE; } +/** + * @brief getimage - read image from shared memory or socket + */ static void getimage(){ FNAME(); + int imsock = -1; + static double oldtimestamp = -1.; TIMESTAMP("Get image sizes"); /*SENDCMDW(CMD_IMWIDTH); SENDCMDW(CMD_IMHEIGHT);*/ - int imsock = open_socket(FALSE, GP->imageport, TRUE); - if(imsock < 0) ERRX("getimage(): can't open image transport socket"); - // get image size - if(!readNbytes(imsock, sizeof(IMG), (uint8_t*)&ima)){ - WARNX("Can't read image header"); - goto eofg; + if(shmima){ // read image from shared memory + memcpy(&ima, shmima, sizeof(IMG)); + }else{ // get image by socket + imsock = open_socket(FALSE, GP->imageport, TRUE); + if(imsock < 0) ERRX("getimage(): can't open image transport socket"); + // get image size + if(!readNbytes(imsock, sizeof(IMG), (uint8_t*)&ima)){ + WARNX("Can't read image header"); + goto eofg; + } } if(ima.bytelen < 1){ WARNX("Wrong image size"); goto eofg; } + DBG("bytelen=%zd, w=%d, h=%d; bitpix=%d", ima.bytelen, ima.w, ima.h, ima.bitpix); + // realloc memory if needed if(imbufsz < ima.bytelen){ size_t newsz = 1024 * (1 + ima.bytelen / 1024); DBG("Reallocate memory from %zd to %zd", imbufsz, newsz); @@ -359,14 +376,24 @@ static void getimage(){ } ima.data = imbuf; // renew this value each time after getting `ima` from server TIMESTAMP("Start of data read"); - if(!readNbytes(imsock, ima.bytelen, imbuf)){ - WARNX("Can't read image data"); - goto eofg; + if(shmima){ + uint8_t *datastart = (uint8_t*)shmima + sizeof(IMG); + memcpy(imbuf, datastart, ima.bytelen); + TIMESTAMP("Got by shared memory"); + }else{ + if(!readNbytes(imsock, ima.bytelen, imbuf)){ + WARNX("Can't read image data"); + goto eofg; + } + TIMESTAMP("Got by socket"); } - TIMESTAMP("Got image"); - ++grabno; + if(ima.timestamp != oldtimestamp){ // test if image is really new + oldtimestamp = ima.timestamp; + TIMESTAMP("Got image"); + ++grabno; + }else WARNX("Still got old image"); eofg: - close(imsock); + if(!shmima) close(imsock); } static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net @@ -374,7 +401,6 @@ static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net if(controlfd < 0) return NULL; int sock = controlfd; while(1){ - DBG("xx"); if(!getWin()) exit(1); expstate = CAMERA_CAPTURE; TIMESTAMP("End of cycle, start new #%d", grabno+1); @@ -386,13 +412,15 @@ static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net sleept = (useconds_t)(GP->exptime * 500000.); if(sleept < 1000) sleept = 1000; } +// double exptime = GP->exptime; while(dtime() - t0 < timeout){ - TIMESTAMP("Wait for exposition ends"); + TIMESTAMP("Wait for exposition ends (%u us)", sleept); usleep(sleept); TIMESTAMP("check answer"); getans(sock, NULL); //TIMESTAMP("EXPSTATE ===> %d", expstate); if(expstate != CAMERA_CAPTURE) break; + if(dtime() - t0 < GP->exptime + 0.5) sleept = 1000; } if(dtime() - t0 >= timeout || expstate != CAMERA_FRAMERDY){ WARNX("Image wasn't received"); diff --git a/cmdlnopts.c b/cmdlnopts.c index fcbdd7b..8f92cb9 100644 --- a/cmdlnopts.c +++ b/cmdlnopts.c @@ -96,14 +96,15 @@ myoption cmdlnopts[] = { {"brightness",NEED_ARG, NULL, 0, arg_float, APTR(&G.brightness),N_("CMOS brightness level")}, {"logfile", NEED_ARG, NULL, 0, arg_string, APTR(&G.logfile), N_("logging file name (if run as server)")}, - {"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")}, - {"imageport",NEED_ARG, NULL, 0, arg_string, APTR(&G.imageport), N_("local INET socket port to send/receive images")}, + {"path", NEED_ARG, NULL, 0, arg_string, APTR(&G.path), N_("UNIX socket name (command socket)")}, + {"port", NEED_ARG, NULL, 0, arg_string, APTR(&G.port), N_("local INET command socket port")}, + {"imageport",NEED_ARG, NULL, 0, arg_string, APTR(&G.imageport), N_("INET image 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)")}, {"restart", NO_ARGS, &G.restart,1, arg_none, NULL, N_("restart image server")}, {"shmkey", NEED_ARG, NULL, 'k', arg_int, APTR(&G.shmkey), N_("shared memory (with image data) key (default: 7777777")}, + {"forceimsock",NO_ARGS, &G.forceimsock,1, arg_none, NULL, N_("force using image through socket transition even if can use SHM")}, #ifdef IMAGEVIEW {"display", NO_ARGS, NULL, 'D', arg_int, APTR(&G.showimage), N_("Display image in OpenGL window")}, diff --git a/cmdlnopts.h b/cmdlnopts.h index 25a477d..d60c463 100644 --- a/cmdlnopts.h +++ b/cmdlnopts.h @@ -70,6 +70,7 @@ typedef struct{ int rewrite; // rewrite file int showimage; // show image preview int shmkey; // shared memory (with image data) key + int forceimsock; // force using image through socket transition even if can use SHM float gain; // gain level (only for CMOS) float brightness; // brightness (only for CMOS) double exptime; // time of exposition in seconds diff --git a/locale/ru/LC_MESSAGES/ccd_capture.mo b/locale/ru/LC_MESSAGES/ccd_capture.mo index 610c50fca1ed43cfb9bcb2018fe9b42388dda949..9e0b9c9b94add7debbc0e8a97e186a2e951b7d14 100644 GIT binary patch delta 2605 zcmX}sdrZ}39LMo57r7ij@W?sGO9Y~!aw@~pAOrzLK>-s2#N?LXB~wT!CDYR%=0>%# zIFc@H{b4h6R4U6{%k1`#nXV0{UCb6Pm!qw@nzb3(`*Zl&v-3T#=l7i7@40-R=Xd(s zd)fk5+>w1o*+tw%#7COFi~mIPMLFg&n})}6Dh^^Y{*E4uj5ABbDL5H3QSFN{30LDp z+=M<1;N7?n)48;hRHoDL9Zteg)PUZ2vwJWb)o}yzfNe+pegHM$)2M;IM>me(1pF5@ zk)#B(1(<<;T#K4O4<<9dy+=hIe1TpZa&8#GRIXj)%~CKEwSp4Vikff=cA_TQUS`FZ)`?lT2k*sGs0{p)O#YR^cs58WpNU%e64aK|pgP=)daxI@ zcV|!&xP-Ylidta~56!_kiIrY#y&zmc8;$I91c(kr*aLoH`h@&-bAG~n$ei7 zc~NJ~pS%Fq3QLnIxJY)n7hp!sV#9C(unr890ne$!F*bGy4_Q zp?-W27NWMG1N9mnL~gM&Sc>0bF{ZP@I^`SiVSEiAzzf)bw=oAB7(Gw#|9&b;?M2iN z5iGM6^H68v5U#{OuojEirz(5{HNXwb!`b9NAJ^kNJd7=P8P{Q9npqJZ!G~}J^Y#9x z@o%z>hDKbDM^OXb#BwZQxuKO{0oNCt>qP#w^xRS`!(P~&-}>=Wc;m-(v1C{7&N zwmKw9)`d&(Al{ExQ3Jc_tN=^=UE{!RHWq#=c0HScLw`pO#8* z>bMeh7Pg`WdVrbT~Ia=WkfuoKavf>x|r0Qc4}J*Mhz8hmX`N8p~OcLKB9|QL@XdQykF*BbLq&53njQ3 zpCpuI72Xkhg6JT^i6r7NB92%`upgllq2#GNN{lB;2<34#p%c|fEF~fc{wIT%Vza87 zsOuCZ5-Qqgl~qIrp?68gT`#FN&r7J36VDOP5LJZA^J7?Bu-@e_-ps zv7S(=C-mo-MpP0iIyNfBL=CZG;Jm9ndZ5Bx88Pso=PgfgFvBy@?SFOLKuy-gsQ&=e CoCDkd delta 2776 zcmY+_drZ}39LMnoA>@|a4jjze!SKe(3y~HGM75)!Tv9x8!o&y=QWO+Rqw)uKab=DS z-CSES|4?+(K@!ozApfY=KlMAUthr&Bwq+M<%0IEydVh{T=X&Os*Yo@?&*l3(zhh_f z=@#o!Qp6EMX(y&DB8)jBqxeIyV~k11AWp-Z=)(9|V^S~!<1rVf;wtBQ9VXCj!(=>w zZtTXHIEb^2vCIW3_j2KHOv4#*w+38>b7%)p9q&b6Fh`yHL#PRlq6V74B#gb=m_(e3 zn&1-5!xiYomr)bwMHl0nuc)YlE0~Jo&I7SijG09{6KCKm)Cw9=D{9Ak@Gxqkz0URT zP#L<0TF}3!iMUDALR^UIX9G@SeA7xr19ze(asopsLJfQYwW4vyNFLHk(@+!eq9(8c z=VB9PU>7pB`3N~imx1k2^Ks|pLHNbJy zb046d`_j2S>RkUFmB}z())`7iy`P^%{x!2QE@%Y}SdIsADULcO)2rIWI3F$4UY2+vO!8^J}UJAR0ejVwr0QMd#H{F zP#s)E?d4=1(nMzAa`d5A+<}Yn7;?T%5cU2jDg%=&-llGnF&r~-5-vjRRTk>O0#vHY zk;$8C)Y)i7t@sdXh25ykypIJq>a?em=1kf}NK#EJsz2*BDw^>T)aMjLW#T$2GtuPL z9mZ#b>ad8L*|;CI6+@`c@+$I*nal{sh6PS-< zsMOA6dAhzD>+x08+4v3D;Bxk<5)Wbp{)`$RhrH+G4lKZ4T#DDR4l_K)Y{u8|QGNe^ zQF(w1+5F7ug+^S3J-8Zgpav{pnWgv^hE{@wv{U)@Qo9oMUMH5|MbygYvEiD4-|+yh zr+pra7~iCEa+InX)M4pCvT44@LcD=ln9Y7DGxf-Bn75Hz<}@l(-(W7r&C|*_^{Dn6 zNYcz_sEJ-dZQ(Tb&w7GNITg+D6f!CEBWj?C1-JG%3zyNZLft=vI%FRri!?u>28iT@ zQ8gL37R!*Vn`20_%z0daS8)+~z0UVvMQ@rwD;DA@Y{y?wd%Km{$Pve6@>)&10X5Oj zQ7gNNI$U0Q=bV`*F@SsUEC!K(<`vSc_xcx;f4wlqh2@w?L+w)jJc4^sEBF*2!ZFly zQ`rxl2|pHM59fUJx1ruUiu7&Hp*sE(bvEKjrv_YrHE5wye;Ie+eD;$^jr9%{w!?glbvS|gd^VBK zhw)u3!%+;wdZLxsN@$|$RHcQ8AyU+!Y$HmEID#+QY$0@5RdhI=(p4T6owJk1E`qs* zincPeeW+|l5N_fH;xQtR(45=54n-yBzeG)+4XOWM*-k5i*yCJvIVL$a;Kr`YQQnlN zs1-X`Z?m~8J=$%pb(*^!Igg>Vug4}rsaN5P3T5wEoJ1rLej=7=B-q{1IZ;Mc)(}&O zBBGqwKUkN2O6X_=hhFDnjs zTAORP*6;Fcuh~}LKRu};+*MoC|y(3 zdmy;a?(0wVp1dn}#2yZ|2lsjGq0pT^dnov({R#Dcd)UL{dUU`(d*{NP_Xn5!5cwa0 C7D%fA diff --git a/locale/ru/messages.po b/locale/ru/messages.po index 048947b..5ce6694 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-12-14 16:53+0300\n" +"POT-Creation-Date: 2023-12-21 16:46+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -222,15 +222,15 @@ msgid "logging file name (if run as server)" msgstr "" #: cmdlnopts.c:99 -msgid "UNIX socket name" +msgid "UNIX socket name (command socket)" msgstr "" #: cmdlnopts.c:100 -msgid "local INET socket port" +msgid "local INET command socket port" msgstr "" #: cmdlnopts.c:101 -msgid "local INET socket port to send/receive images" +msgid "INET image socket port" msgstr "" #: cmdlnopts.c:102 @@ -249,7 +249,11 @@ msgstr "" msgid "shared memory (with image data) key (default: 7777777" msgstr "" -#: cmdlnopts.c:109 +#: cmdlnopts.c:107 +msgid "force using image through socket transition even if can use SHM" +msgstr "" + +#: cmdlnopts.c:110 msgid "Display image in OpenGL window" msgstr "" @@ -283,291 +287,291 @@ msgstr "" msgid "Can't save file with prefix %s" msgstr "" -#: ccdfunc.c:359 +#: ccdfunc.c:362 #, c-format msgid "File saved as '%s'" msgstr "" -#: ccdfunc.c:368 +#: ccdfunc.c:371 msgid "Error saving file" msgstr "" -#: ccdfunc.c:445 +#: ccdfunc.c:448 #, c-format msgid "Image stat:\n" msgstr "" -#: ccdfunc.c:453 +#: ccdfunc.c:456 msgid "Focuser device not pointed" msgstr "" -#: ccdfunc.c:460 +#: ccdfunc.c:463 msgid "No focusers found" msgstr "" -#: ccdfunc.c:491 +#: ccdfunc.c:494 #, c-format msgid "Found %d focusers, you point number %d" msgstr "" -#: ccdfunc.c:495 +#: ccdfunc.c:498 msgid "Can't set active focuser number" msgstr "" -#: ccdfunc.c:509 +#: ccdfunc.c:512 msgid "Can't get focuser limit positions" msgstr "" -#: ccdfunc.c:516 +#: ccdfunc.c:519 msgid "Can't get current focuser position" msgstr "" -#: ccdfunc.c:530 +#: ccdfunc.c:533 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr "" -#: ccdfunc.c:534 +#: ccdfunc.c:537 msgid "Can't home focuser" msgstr "" -#: ccdfunc.c:536 +#: ccdfunc.c:539 #, c-format msgid "Can't set position %g" msgstr "" -#: ccdfunc.c:544 +#: ccdfunc.c:547 msgid "Wheel device not pointed" msgstr "" -#: ccdfunc.c:551 +#: ccdfunc.c:554 msgid "No wheels found" msgstr "" -#: ccdfunc.c:582 +#: ccdfunc.c:585 #, c-format msgid "Found %d wheels, you point number %d" msgstr "" -#: ccdfunc.c:586 +#: ccdfunc.c:589 msgid "Can't set active wheel number" msgstr "" -#: ccdfunc.c:602 +#: ccdfunc.c:605 msgid "Can't get max wheel position" msgstr "" -#: ccdfunc.c:609 +#: ccdfunc.c:612 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "" -#: ccdfunc.c:613 +#: ccdfunc.c:616 #, c-format msgid "Can't set wheel position %d" msgstr "" -#: ccdfunc.c:630 +#: ccdfunc.c:633 #, c-format msgid "%.1f seconds till exposition ends" msgstr "" -#: ccdfunc.c:645 +#: ccdfunc.c:648 msgid "Camera device not pointed" msgstr "" -#: ccdfunc.c:652 ccdfunc.c:653 +#: ccdfunc.c:655 ccdfunc.c:656 msgid "No cameras found" msgstr "" -#: ccdfunc.c:683 +#: ccdfunc.c:686 #, c-format msgid "Found %d cameras, you point number %d" msgstr "" -#: ccdfunc.c:687 +#: ccdfunc.c:690 msgid "Can't set active camera number" msgstr "" -#: ccdfunc.c:693 +#: ccdfunc.c:696 msgid "Can't set fan speed" msgstr "" -#: ccdfunc.c:694 +#: ccdfunc.c:697 #, c-format msgid "Set fan speed to %d" msgstr "" -#: ccdfunc.c:699 +#: ccdfunc.c:702 #, c-format msgid "Camera model: %s" msgstr "" -#: ccdfunc.c:700 +#: ccdfunc.c:703 #, c-format msgid "Pixel size: %g x %g" msgstr "" -#: ccdfunc.c:706 +#: ccdfunc.c:709 #, c-format msgid "Full array: %s" msgstr "" -#: ccdfunc.c:709 +#: ccdfunc.c:712 #, c-format msgid "Field of view: %s" msgstr "" -#: ccdfunc.c:712 +#: ccdfunc.c:715 #, c-format msgid "Current format: %s" msgstr "" -#: ccdfunc.c:715 +#: ccdfunc.c:718 #, c-format msgid "Can't set T to %g degC" msgstr "" -#: ccdfunc.c:723 +#: ccdfunc.c:726 #, c-format msgid "Shutter command: %s\n" msgstr "" -#: ccdfunc.c:725 +#: ccdfunc.c:728 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "" #. "Попытка сконфигурировать порт I/O как %d\n" -#: ccdfunc.c:729 +#: ccdfunc.c:732 #, c-format msgid "Try to configure I/O port as %d" msgstr "" -#: ccdfunc.c:731 +#: ccdfunc.c:734 msgid "Can't configure (unsupported?)" msgstr "" -#: ccdfunc.c:738 +#: ccdfunc.c:741 msgid "Can't get IOport state (unsupported?)" msgstr "" #. "Попытка записи %d в порт I/O\n" -#: ccdfunc.c:742 +#: ccdfunc.c:745 #, c-format msgid "Try to write %d to I/O port" msgstr "" -#: ccdfunc.c:744 +#: ccdfunc.c:747 msgid "Can't set IOport" msgstr "" -#: ccdfunc.c:751 +#: ccdfunc.c:754 #, c-format msgid "Set gain to %g" msgstr "" -#: ccdfunc.c:752 +#: ccdfunc.c:755 #, c-format msgid "Can't set gain to %g" msgstr "" -#: ccdfunc.c:757 +#: ccdfunc.c:760 #, c-format msgid "Set brightness to %g" msgstr "" -#: ccdfunc.c:758 +#: ccdfunc.c:761 #, c-format msgid "Can't set brightness to %g" msgstr "" -#: ccdfunc.c:764 server.c:312 +#: ccdfunc.c:767 server.c:262 #, c-format msgid "Can't set binning %dx%d" msgstr "" -#: ccdfunc.c:776 server.c:313 +#: ccdfunc.c:779 server.c:263 msgid "Can't set given geometry" msgstr "" -#: ccdfunc.c:780 +#: ccdfunc.c:783 #, c-format msgid "Can't set %d flushes" msgstr "" -#: ccdfunc.c:784 +#: ccdfunc.c:787 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "" -#: ccdfunc.c:787 +#: ccdfunc.c:790 msgid "Can't change frame type" msgstr "" -#: ccdfunc.c:790 +#: ccdfunc.c:793 msgid "Can't set bit depth" msgstr "" -#: ccdfunc.c:792 +#: ccdfunc.c:795 msgid "Can't set readout speed" msgstr "" -#: ccdfunc.c:793 +#: ccdfunc.c:796 #, c-format msgid "Readout mode: %s" msgstr "" -#: ccdfunc.c:794 +#: ccdfunc.c:797 msgid "Only show statistics" msgstr "" #. GET binning should be AFTER setgeometry! -#: ccdfunc.c:796 +#: ccdfunc.c:799 msgid "Can't get current binning" msgstr "" #. Захват кадра %d\n -#: ccdfunc.c:821 +#: ccdfunc.c:824 #, c-format msgid "Capture frame %d" msgstr "" -#: ccdfunc.c:823 ccdfunc.c:908 server.c:198 +#: ccdfunc.c:826 ccdfunc.c:911 server.c:148 msgid "Can't start exposition" msgstr "" -#: ccdfunc.c:828 +#: ccdfunc.c:831 msgid "Can't capture image" msgstr "" -#: ccdfunc.c:831 +#: ccdfunc.c:834 msgid "Read grabbed image" msgstr "" -#: ccdfunc.c:835 ccdfunc.c:921 +#: ccdfunc.c:838 ccdfunc.c:924 msgid "Can't grab image" msgstr "" #. %d секунд до окончания паузы\n -#: ccdfunc.c:847 client.c:291 +#: ccdfunc.c:850 client.c:294 #, c-format msgid "%d seconds till pause ends\n" msgstr "" -#: ccdfunc.c:919 +#: ccdfunc.c:922 msgid "Some error when capture" msgstr "" -#: server.c:246 +#: server.c:196 msgid "No camera device" msgstr "" -#: client.c:278 +#: client.c:279 msgid "Can't make exposition" msgstr "" -#: client.c:307 +#: client.c:310 msgid "Server timeout" msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index d5dc058..4331cbc 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-12-14 16:52+0300\n" + "POT-Creation-Date: 2023-12-21 16:40+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,13 +16,13 @@ msgstr "Project-Id-Version: PACKAGE VERSION\n" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" -#: ccdfunc.c:630 +#: ccdfunc.c:633 #, c-format msgid "%.1f seconds till exposition ends" msgstr "%.1f " #. %d секунд до окончания паузы\n -#: ccdfunc.c:847 client.c:291 +#: ccdfunc.c:850 client.c:294 #, c-format msgid "%d seconds till pause ends\n" msgstr "%d \n" @@ -39,7 +39,7 @@ msgstr " msgid "CMOS gain level" msgstr " Gain CMOS" -#: ccdfunc.c:645 +#: ccdfunc.c:648 msgid "Camera device not pointed" msgstr " " @@ -47,20 +47,20 @@ msgstr " msgid "Camera device unknown" msgstr " " -#: ccdfunc.c:699 +#: ccdfunc.c:702 #, c-format msgid "Camera model: %s" msgstr " : %s" -#: ccdfunc.c:828 +#: ccdfunc.c:831 msgid "Can't capture image" msgstr " " -#: ccdfunc.c:787 +#: ccdfunc.c:790 msgid "Can't change frame type" msgstr " " -#: ccdfunc.c:731 +#: ccdfunc.c:734 msgid "Can't configure (unsupported?)" msgstr " ( ?)" @@ -84,32 +84,32 @@ msgstr " msgid "Can't find wheel in plugin %s: %s" msgstr " %s: %s" -#: ccdfunc.c:738 +#: ccdfunc.c:741 msgid "Can't get IOport state (unsupported?)" msgstr " I/O ( ?)" #. GET binning should be AFTER setgeometry! -#: ccdfunc.c:796 +#: ccdfunc.c:799 msgid "Can't get current binning" msgstr " " -#: ccdfunc.c:516 +#: ccdfunc.c:519 msgid "Can't get current focuser position" msgstr " " -#: ccdfunc.c:509 +#: ccdfunc.c:512 msgid "Can't get focuser limit positions" msgstr " " -#: ccdfunc.c:602 +#: ccdfunc.c:605 msgid "Can't get max wheel position" msgstr " " -#: ccdfunc.c:835 ccdfunc.c:921 +#: ccdfunc.c:838 ccdfunc.c:924 msgid "Can't grab image" msgstr " " -#: ccdfunc.c:534 +#: ccdfunc.c:537 msgid "Can't home focuser" msgstr " " @@ -117,7 +117,7 @@ msgstr " msgid "Can't init mutex!" msgstr " !" -#: client.c:278 +#: client.c:279 msgid "Can't make exposition" msgstr " " @@ -125,7 +125,7 @@ msgstr " msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr " OpenGL, " -#: ccdfunc.c:725 +#: ccdfunc.c:728 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr " %s ( ?)" @@ -136,99 +136,99 @@ msgstr " msgid "Can't save file with prefix %s" msgstr " %s" -#: ccdfunc.c:780 +#: ccdfunc.c:783 #, c-format msgid "Can't set %d flushes" msgstr " %d " -#: ccdfunc.c:744 +#: ccdfunc.c:747 msgid "Can't set IOport" msgstr " I/O" -#: ccdfunc.c:715 +#: ccdfunc.c:718 #, c-format msgid "Can't set T to %g degC" msgstr " %g " -#: ccdfunc.c:687 +#: ccdfunc.c:690 msgid "Can't set active camera number" msgstr " " -#: ccdfunc.c:495 +#: ccdfunc.c:498 msgid "Can't set active focuser number" msgstr " " -#: ccdfunc.c:586 +#: ccdfunc.c:589 msgid "Can't set active wheel number" msgstr " " -#: ccdfunc.c:764 server.c:312 +#: ccdfunc.c:767 server.c:262 #, c-format msgid "Can't set binning %dx%d" msgstr " %dx%d" -#: ccdfunc.c:790 +#: ccdfunc.c:793 msgid "Can't set bit depth" msgstr " " -#: ccdfunc.c:758 +#: ccdfunc.c:761 #, c-format msgid "Can't set brightness to %g" msgstr " %g" -#: ccdfunc.c:784 +#: ccdfunc.c:787 #, c-format msgid "Can't set exposure time to %f seconds" msgstr " %f " -#: ccdfunc.c:693 +#: ccdfunc.c:696 msgid "Can't set fan speed" msgstr " " -#: ccdfunc.c:752 +#: ccdfunc.c:755 #, c-format msgid "Can't set gain to %g" msgstr " Gain %g" -#: ccdfunc.c:776 server.c:313 +#: ccdfunc.c:779 server.c:263 msgid "Can't set given geometry" msgstr " " -#: ccdfunc.c:536 +#: ccdfunc.c:539 #, c-format msgid "Can't set position %g" msgstr " %g" -#: ccdfunc.c:530 +#: ccdfunc.c:533 #, c-format msgid "Can't set position %g: out of limits [%g, %g]" msgstr " %g: [%g, %g]" -#: ccdfunc.c:792 +#: ccdfunc.c:795 msgid "Can't set readout speed" msgstr " " -#: ccdfunc.c:613 +#: ccdfunc.c:616 #, c-format msgid "Can't set wheel position %d" msgstr " %d" -#: ccdfunc.c:823 ccdfunc.c:908 server.c:198 +#: ccdfunc.c:826 ccdfunc.c:911 server.c:148 msgid "Can't start exposition" msgstr " " #. Захват кадра %d\n -#: ccdfunc.c:821 +#: ccdfunc.c:824 #, c-format msgid "Capture frame %d" msgstr " %d" -#: ccdfunc.c:712 +#: ccdfunc.c:715 #, c-format msgid "Current format: %s" msgstr "" -#: cmdlnopts.c:109 +#: cmdlnopts.c:110 msgid "Display image in OpenGL window" msgstr " OpenGL" @@ -237,40 +237,40 @@ msgstr " msgid "Equalization of histogram: %s" msgstr " : %s" -#: ccdfunc.c:368 +#: ccdfunc.c:371 msgid "Error saving file" msgstr " " -#: ccdfunc.c:709 +#: ccdfunc.c:712 #, c-format msgid "Field of view: %s" msgstr " : %s" -#: ccdfunc.c:359 +#: ccdfunc.c:362 #, c-format msgid "File saved as '%s'" msgstr " '%s'" -#: ccdfunc.c:453 +#: ccdfunc.c:456 msgid "Focuser device not pointed" msgstr " " -#: ccdfunc.c:683 +#: ccdfunc.c:686 #, c-format msgid "Found %d cameras, you point number %d" msgstr " %d , %d" -#: ccdfunc.c:491 +#: ccdfunc.c:494 #, c-format msgid "Found %d focusers, you point number %d" msgstr " %d , %d" -#: ccdfunc.c:582 +#: ccdfunc.c:585 #, c-format msgid "Found %d wheels, you point number %d" msgstr " %d , %d" -#: ccdfunc.c:706 +#: ccdfunc.c:709 #, c-format msgid "Full array: %s" msgstr " : %s" @@ -280,7 +280,12 @@ msgstr " msgid "Histogram conversion: %s" msgstr " : %s" -#: ccdfunc.c:445 +#: cmdlnopts.c:101 +#, fuzzy +msgid "INET image socket port" +msgstr " " + +#: ccdfunc.c:448 #, c-format msgid "Image stat:\n" msgstr " : \n" @@ -289,89 +294,90 @@ msgstr " msgid "N flushes before exposing (default: 1)" msgstr "N ( : 1)" -#: server.c:246 +#: server.c:196 msgid "No camera device" msgstr " " -#: ccdfunc.c:652 ccdfunc.c:653 +#: ccdfunc.c:655 ccdfunc.c:656 msgid "No cameras found" msgstr " " -#: ccdfunc.c:460 +#: ccdfunc.c:463 msgid "No focusers found" msgstr " " -#: ccdfunc.c:551 +#: ccdfunc.c:554 msgid "No wheels found" msgstr " " -#: ccdfunc.c:794 +#: ccdfunc.c:797 msgid "Only show statistics" msgstr " " -#: ccdfunc.c:700 +#: ccdfunc.c:703 #, c-format msgid "Pixel size: %g x %g" msgstr " : %g x %g" -#: ccdfunc.c:831 +#: ccdfunc.c:834 msgid "Read grabbed image" msgstr " " -#: ccdfunc.c:793 +#: ccdfunc.c:796 #, c-format msgid "Readout mode: %s" msgstr " : %s" -#: client.c:307 +#: client.c:310 msgid "Server timeout" msgstr " " -#: ccdfunc.c:757 +#: ccdfunc.c:760 #, c-format msgid "Set brightness to %g" msgstr " %g" -#: ccdfunc.c:694 +#: ccdfunc.c:697 #, c-format msgid "Set fan speed to %d" msgstr " %d" -#: ccdfunc.c:751 +#: ccdfunc.c:754 #, c-format msgid "Set gain to %g" msgstr " Gain %g" -#: ccdfunc.c:723 +#: ccdfunc.c:726 #, c-format msgid "Shutter command: %s\n" msgstr " : %s\n" -#: ccdfunc.c:919 +#: ccdfunc.c:922 msgid "Some error when capture" msgstr "" #. "Попытка сконфигурировать порт I/O как %d\n" -#: ccdfunc.c:729 +#: ccdfunc.c:732 #, c-format msgid "Try to configure I/O port as %d" msgstr " I/O %d" #. "Попытка записи %d в порт I/O\n" -#: ccdfunc.c:742 +#: ccdfunc.c:745 #, c-format msgid "Try to write %d to I/O port" msgstr " %d I/O" #: cmdlnopts.c:99 -msgid "UNIX socket name" +#, fuzzy +msgid "UNIX socket name (command socket)" msgstr " UNIX-" -#: ccdfunc.c:544 +#: ccdfunc.c:547 msgid "Wheel device not pointed" msgstr " " -#: ccdfunc.c:609 +#: ccdfunc.c:612 #, c-format msgid "Wheel position should be from 0 to %d" msgstr " 0 %d" @@ -440,6 +446,10 @@ msgstr " msgid "focuser device plugin (e.g. devzwo.so)" msgstr " (, devzwo.so)" +#: cmdlnopts.c:107 +msgid "force using image through socket transition even if can use SHM" +msgstr "" + #: cmdlnopts.c:84 msgid "get value of I/O port pins" msgstr " I/O" @@ -457,12 +467,8 @@ msgid "list connected devices" msgstr " " #: cmdlnopts.c:100 -msgid "local INET socket port" -msgstr " " - -#: cmdlnopts.c:101 #, fuzzy -msgid "local INET socket port to send/receive images" +msgid "local INET command socket port" msgstr " " #: cmdlnopts.c:98 @@ -607,3 +613,7 @@ msgstr " #~ msgid "PID file (default: " #~ msgstr "PID- ( : " + +#, fuzzy +#~ msgid "local INET socket port to send/receive images" +#~ msgstr " " diff --git a/server.c b/server.c index 3ea18b2..d7555e1 100644 --- a/server.c +++ b/server.c @@ -22,8 +22,6 @@ #include #include #include -#include -#include #include #include @@ -120,55 +118,6 @@ static void unlock(){ static IMG *ima = NULL; -/** - * @brief getshm - get shared memory segment for image - * @param imsize - size of image data (in bytes) - * @return - */ -static IMG *getshm(key_t key, size_t imsize){ - size_t shmsize = sizeof(IMG) + imsize; - shmsize = 1024 * (1 + shmsize / 1024); - DBG("Allocate %zd bytes in shared memory", shmsize); - int shmid = -1; - int flags = (imsize) ? IPC_CREAT | 0666 : 0; - shmid = shmget(key, 0, flags); - if(shmid < 0){ - WARN("Can't get shared memory segment %d", key); - return NULL; - } - if(imsize){ // check if segment exists and its size equal to needs - struct shmid_ds buf; - if(shmctl(shmid, IPC_STAT, &buf) > -1 && shmsize != buf.shm_segsz){ // remove already existing segment - DBG("Need to remove already existing segment"); - shmctl(shmid, IPC_RMID, NULL); - } - shmid = shmget(key, shmsize, flags); - if(shmid < 0){ - WARN("Can't create shared memory segment %d", key); - return NULL; - } - } - flags = (imsize) ? 0 : SHM_RDONLY; // client opens memory in readonly mode - IMG *ptr = shmat(shmid, NULL, flags); - if(ptr == (void*)-1){ - WARN("Can't attach SHM segment %d", key); - return NULL; - } - if(!imsize){ - if(ptr->MAGICK != SHM_MAGIC){ - WARNX("Shared memory %d isn't belongs to image server", key); - shmdt(ptr); - return NULL; - } - return ptr; - } - bzero(ptr, sizeof(IMG)); - ptr->data = (void*)((uint8_t*)ptr + sizeof(IMG)); - ptr->MAGICK = SHM_MAGIC; - shmkey = key; - return ptr; -} - static void fixima(){ FNAME(); if(!camera) return; @@ -176,7 +125,8 @@ static void fixima(){ // allocate memory for largest possible image if(!ima) ima = getshm(GP->shmkey, camera->array.h * camera->array.w * 2); if(!ima) ERRX("Can't allocate memory for image"); - if(raw_width == ima->w && raw_height == ima->h) return; // all OK + shmkey = GP->shmkey; + //if(raw_width == ima->w && raw_height == ima->h) return; // all OK DBG("curformat: %dx%d", curformat.w, curformat.h); ima->h = raw_height; ima->w = raw_width; @@ -224,10 +174,10 @@ static inline void cameracapturestate(){ // capturing - wait for exposition ends camstate = CAMERA_ERROR; return; }else{ - if(lastfile){ + /*if(lastfile){ (move calcstat into savefits) TIMESTAMP("Calc stat"); calculate_stat(ima); - } + }*/ if(saveFITS(ima, &lastfile)){ DBG("LAST file name changed"); } @@ -677,9 +627,9 @@ static hresult _8bithandler(int fd, _U_ const char *key, const char *val){ if(val){ int s = atoi(val); if(s != 0 && s != 1) return RESULT_BADVAL; + if(!camera->setbitdepth(!s)) return RESULT_FAIL; + fixima(); GP->_8bit = s; - s = !s; - if(!camera->setbitdepth(s)) return RESULT_FAIL; } snprintf(buf, 63, CMD_8BIT "=%d", GP->_8bit); if(!sendstrmessage(fd, buf)) return RESULT_DISCONNECTED; @@ -1155,7 +1105,7 @@ void server(int sock, int imsock){ } // process some data & send messages to ALL if(camstate == CAMERA_FRAMERDY || camstate == CAMERA_ERROR){ - if(camstate == CAMERA_FRAMERDY) ima->timestamp = time(NULL); // set timestamp + if(camstate == CAMERA_FRAMERDY) ima->timestamp = dtime(); // set timestamp char buff[PATH_MAX+32]; snprintf(buff, PATH_MAX, CMD_EXPSTATE "=%d", camstate); DBG("Send %s to %d clients", buff, nfd - 2); @@ -1163,7 +1113,7 @@ void server(int sock, int imsock){ TIMESTAMP("Send message that all ready"); sendstrmessage(poll_set[i].fd, buff); } - if(camstate == CAMERA_FRAMERDY){ // send to all last file name + if(camstate == CAMERA_FRAMERDY && (GP->outfile || GP->outfileprefix)){ // send to all last file name if file saved snprintf(buff, PATH_MAX+31, CMD_LASTFNAME "=%s", lastfile); for(int i = 2; i < nfd; ++i) sendstrmessage(poll_set[i].fd, buff); diff --git a/socket.c b/socket.c index 253ea4f..7cf1a7c 100644 --- a/socket.c +++ b/socket.c @@ -42,7 +42,7 @@ double __t0 = 0.; * @brief open_socket - create socket and open it * @param isserver - TRUE for server, FALSE for client * @param path - UNIX-socket path or local INET socket port - * @param isnet - TRUE for INET socket, FALSE for UNIX + * @param isnet - 1/2 for INET socket (1 - localhost, 2 - network), 0 for UNIX * @return socket FD or -1 if failed */ int open_socket(int isserver, char *path, int isnet){ @@ -57,7 +57,8 @@ int open_socket(int isserver, char *path, int isnet){ hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; - if(getaddrinfo("127.0.0.1", path, &hints, &res) != 0){ + const char *node = (isnet == 2) ? NULL : "127.0.0.1"; + if(getaddrinfo(node, path, &hints, &res) != 0){ ERR("getaddrinfo"); } }else{ @@ -128,9 +129,9 @@ int open_socket(int isserver, char *path, int isnet){ */ int start_socket(int isserver){ char *path = NULL; - int isnet = FALSE; + int isnet = 0; if(GP->path) path = GP->path; - else if(GP->port){ path = GP->port; isnet = TRUE; } + else if(GP->port){ path = GP->port; isnet = 1; } else ERRX("Point network port or UNIX-socket path"); int sock = open_socket(isserver, path, isnet), imsock = -1; if(sock < 0){ @@ -138,7 +139,7 @@ int start_socket(int isserver){ ERRX("start_socket(): can't open socket"); } if(isserver){ - imsock = open_socket(TRUE, GP->imageport, TRUE); + imsock = open_socket(TRUE, GP->imageport, 2); // image socket should be networked server(sock, imsock); }else{ #ifdef IMAGEVIEW @@ -276,3 +277,51 @@ int canberead(int fd){ } return 0; } + +/** + * @brief getshm - get shared memory segment for image + * @param imsize - size of image data (in bytes): if !=0 allocate as server, else - as client (readonly) + * @return pointer to shared memory region or NULL if failed + */ +IMG *getshm(key_t key, size_t imsize){ + size_t shmsize = sizeof(IMG) + imsize; + shmsize = 1024 * (1 + shmsize / 1024); + DBG("Allocate %zd bytes in shared memory", shmsize); + int shmid = -1; + int flags = (imsize) ? IPC_CREAT | 0666 : 0; + shmid = shmget(key, 0, flags); + if(shmid < 0){ + if(imsize) WARN("Can't get shared memory segment %d", key); // suppress warnings for client + return NULL; + } + if(imsize){ // check if segment exists and its size equal to needs + struct shmid_ds buf; + if(shmctl(shmid, IPC_STAT, &buf) > -1 && shmsize != buf.shm_segsz){ // remove already existing segment + DBG("Need to remove already existing segment"); + shmctl(shmid, IPC_RMID, NULL); + } + shmid = shmget(key, shmsize, flags); + if(shmid < 0){ + WARN("Can't create shared memory segment %d", key); + return NULL; + } + } + flags = (imsize) ? 0 : SHM_RDONLY; // client opens memory in readonly mode + IMG *ptr = shmat(shmid, NULL, flags); + if(ptr == (void*)-1){ + if(imsize) WARN("Can't attach SHM segment %d", key); + return NULL; + } + if(!imsize){ + if(ptr->MAGICK != SHM_MAGIC){ + WARNX("Shared memory %d isn't belongs to image server", key); + shmdt(ptr); + return NULL; + } + return ptr; + } + bzero(ptr, sizeof(IMG)); + ptr->data = (void*)((uint8_t*)ptr + sizeof(IMG)); + ptr->MAGICK = SHM_MAGIC; + return ptr; +} diff --git a/socket.h b/socket.h index 0d7764b..283935f 100644 --- a/socket.h +++ b/socket.h @@ -19,8 +19,12 @@ #pragma once #include #include +#include +#include #include +#include "basestructs.h" + // max & min TCP socket port number #define PORTN_MAX (65535) #define PORTN_MIN (1024) @@ -32,7 +36,7 @@ // wait for mutex locking #define BUSY_TIMEOUT (1.0) // waiting for answer timeout -#define ANSWER_TIMEOUT (0.1) +#define ANSWER_TIMEOUT (0.001) // wait for exposition ends (between subsequent check calls) #define WAIT_TIMEOUT (2.0) // client will disconnect after this time from last server message @@ -75,5 +79,5 @@ int senddata(int fd, void *data, size_t l); int sendmessage(int fd, const char *msg, int l); int sendstrmessage(int fd, const char *msg); char *get_keyval(char *keyval); - +IMG *getshm(key_t key, size_t imsize); int canberead(int fd);