shm to client; TODO: check new image by timestamp, not by control socket messages

This commit is contained in:
Edward Emelianov 2023-12-21 16:51:28 +03:00
parent 8132c07479
commit cfa057d0c1
12 changed files with 290 additions and 235 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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)");

View File

@ -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");

View File

@ -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")},

View File

@ -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

Binary file not shown.

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 Ñ<>екунд до окончаниÑ<C2B8> паузы\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"
#. "Попытка запиÑ<C2B8>и %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 "饉鹿 卿個景卦하 膽旽凜하 遝愾讀"

View File

@ -22,8 +22,6 @@
#include <poll.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/socket.h>
#include <usefull_macros.h>
@ -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);

View File

@ -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;
}

View File

@ -19,8 +19,12 @@
#pragma once
#include <pthread.h>
#include <stdint.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <usefull_macros.h>
#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);