change stored size (8/16 bit); allocate img for server in shared memory (TODO: add to client ability of reading from shm)

This commit is contained in:
Edward Emelianov 2023-12-14 16:55:03 +03:00
parent cb38636d78
commit 8132c07479
19 changed files with 637 additions and 395 deletions

View File

@ -293,10 +293,10 @@ static int setdevno(int N){
return TRUE; return TRUE;
} }
static int setbitdepth(int i){ static int setbitdepth(int depth){
#define MONON 4 #define MONON 4
const char *fmts[MONON] = {"Mono16", "Mono14", "Mono12", "Mono10"}; const char *fmts[MONON] = {"Mono16", "Mono14", "Mono12", "Mono10"};
if(i == 0){ // 8 bit if(depth == 0){ // 8 bit
if(!PylonDeviceFeatureIsAvailable( hDev, "EnumEntry_PixelFormat_Mono8" )) return FALSE; if(!PylonDeviceFeatureIsAvailable( hDev, "EnumEntry_PixelFormat_Mono8" )) return FALSE;
PYLONFN(PylonDeviceFeatureFromString, hDev, "PixelFormat", "Mono8"); PYLONFN(PylonDeviceFeatureFromString, hDev, "PixelFormat", "Mono8");
green("Pixel format: Mono8\n"); green("Pixel format: Mono8\n");
@ -370,21 +370,21 @@ static int capture(IMG *ima){
int width = grabResult.SizeX, height = grabResult.SizeY, stride = grabResult.SizeX + grabResult.PaddingX; int width = grabResult.SizeX, height = grabResult.SizeY, stride = grabResult.SizeX + grabResult.PaddingX;
//TIMESTAMP("start converting"); //TIMESTAMP("start converting");
if(is16bit){ if(is16bit){
int s2 = stride<<1, w2 = width<<1; int s2 = stride<<1;
OMP_FOR() OMP_FOR()
for(int y = 0; y < height; ++y){ for(int y = 0; y < height; ++y){
uint16_t *Out = &ima->data[y*width]; uint8_t *Out = &((uint8_t*)ima->data)[y*width];
const uint8_t *In = &imgBuf[y*s2]; const uint8_t *In = &imgBuf[y*s2];
memcpy(Out, In, w2); for(int x = 0; x < width; ++x){
*Out++ = *In; In += 2;
}
} }
}else{ }else{
OMP_FOR() OMP_FOR()
for(int y = 0; y < height; ++y){ for(int y = 0; y < height; ++y){
uint16_t *Out = &ima->data[y*width]; uint16_t *Out = &((uint16_t*)ima->data)[y*width];
const uint8_t *In = &imgBuf[y*stride]; const uint8_t *In = &imgBuf[y*stride];
for(int x = 0; x < width; ++x){ memcpy(Out, In, width);
*Out++ = *In++;
}
} }
} }
//TIMESTAMP("image ready"); //TIMESTAMP("image ready");

View File

@ -40,6 +40,7 @@ static float focuserpos = 1., brightness = 1., gain = 0.;
static float camtemp = -30., exptime = 0.; static float camtemp = -30., exptime = 0.;
static capture_status capstat = CAPTURE_NO; static capture_status capstat = CAPTURE_NO;
static double texpstart = 0.; static double texpstart = 0.;
static uint8_t bitpix = 16; // bit depth: 8 or 16
static int campoll(capture_status *st, float *remain){ static int campoll(capture_status *st, float *remain){
if(capstat != CAPTURE_PROCESS){ if(capstat != CAPTURE_PROCESS){
@ -68,16 +69,37 @@ static int startexp(){
static int camcapt(IMG *ima){ static int camcapt(IMG *ima){
static int n = 0; static int n = 0;
if(!ima || !ima->data) return FALSE; if(!ima || !ima->data) return FALSE;
if(bitpix == 16){
OMP_FOR() OMP_FOR()
for(int y = 0; y < ima->h; ++y){ for(int y = 0; y < ima->h; ++y){
uint16_t *d = &ima->data[y*ima->w]; uint16_t *d = &((uint16_t*)ima->data)[y*ima->w];
for(int x = 0; x < ima->w; ++x){ // sinusoide 100x200 for(int x = 0; x < ima->w; ++x){ // sinusoide 100x200
//*d++ = (uint16_t)(((n+x)%100)/99.*65535.); //*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.); *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
//*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.);
}
}
}
++n; ++n;
ima->bitpix = 16; ima->bitpix = bitpix;
return TRUE;
}
static int camsetbit(int b){
bitpix = (b) ? 16 : 8;
return TRUE;
}
static int camgetbp(uint8_t *bp){
if(bp) *bp = bitpix;
return TRUE; return TRUE;
} }
@ -105,7 +127,6 @@ static int camsetexp(float t){
exptime = t; exptime = t;
return TRUE; return TRUE;
} }
static int camsetgain(float g){ static int camsetgain(float g){
gain = g; gain = g;
return TRUE; return TRUE;
@ -261,11 +282,12 @@ __attribute__ ((visibility("default"))) Camera camera = {
.confio = istub, .confio = istub,
.setio = istub, .setio = istub,
.setframetype = istub, .setframetype = istub,
.setbitdepth = istub, .setbitdepth = camsetbit,
.setfastspeed = istub, .setfastspeed = istub,
.setgeometry = camsetgeom, .setgeometry = camsetgeom,
.setfanspeed = camfan, .setfanspeed = camfan,
// getters: // getters:
.getbitpix = camgetbp,
.getbrightness = camgetbrig, .getbrightness = camgetbrig,
.getModelName = camgetnam, .getModelName = camgetnam,
.getgain = camgetgain, .getgain = camgetgain,

View File

@ -463,7 +463,8 @@ retn:
static int fli_capt(IMG *ima){ static int fli_capt(IMG *ima){
if(!ima || !ima->data) return FALSE; if(!ima || !ima->data) return FALSE;
for(int row = 0; row < ima->h; row++){ for(int row = 0; row < ima->h; row++){
TRYFUNC(FLIGrabRow, camdev, &ima->data[row * ima->w], ima->w); void *ptr = (void*)((is16bit) ? ((uint16_t*)ima->data) + row * ima->w : ((uint8_t*)ima->data) + row * ima->w);
TRYFUNC(FLIGrabRow, camdev, ptr, ima->w);
if(fli_err) return FALSE; if(fli_err) return FALSE;
} }
ima->bitpix = is16bit ? 16 : 8; ima->bitpix = is16bit ? 16 : 8;

View File

@ -445,37 +445,28 @@ retn:
static int cam_capt(IMG *ima){ static int cam_capt(IMG *ima){
if(!handle || !pdata) return FALSE; if(!handle || !pdata) return FALSE;
if(!ima || !ima->data) return FALSE; if(!ima || !ima->data) return FALSE;
;
int bytes = ima->h*ima->w * 2, stbytes = stImageInfo.nWidth * stImageInfo.nHeight * 2;
if(bytes > pdatasz) bytes = pdatasz;
if(bytes != stbytes) WARNX("Different sizes of image buffer & grabbed image");
if(stbytes > bytes) bytes = stbytes;
DBG("Copy %d bytes (stbytes=%d)", bytes, stbytes);
MVCC_ENUMVALUE EnumValue; MVCC_ENUMVALUE EnumValue;
TRY(GetEnumValue, "PixelSize", &EnumValue); TRY(GetEnumValue, "PixelSize", &EnumValue);
DBG("PixelSize = %u", EnumValue.nCurValue); DBG("PixelSize = %u", EnumValue.nCurValue);
ONOK(){ ONOK(){
//green("pixsize=%d\n", EnumValue.nCurValue); int bytes = ima->h*ima->w * ((7 + ima->bitpix) / 8), stbytes = stImageInfo.nWidth * stImageInfo.nHeight;
if(EnumValue.nCurValue == 16){ if(EnumValue.nCurValue == 16){
memcpy(ima->data, pdata, bytes);
ima->bitpix = 12; ima->bitpix = 12;
return TRUE; stbytes *= 2;
}else if(EnumValue.nCurValue != 8){ }else if(EnumValue.nCurValue == 8){
ima->bitpix = 8;
}else{
WARNX("Unsupported pixel size"); WARNX("Unsupported pixel size");
return FALSE; return FALSE;
} }
} if(bytes > pdatasz) bytes = pdatasz;
// transform 8bits to 16 if(bytes != stbytes) WARNX("Different sizes of image buffer & grabbed image");
DBG("TRANSFORM 8 bit to 16"); DBG("Copy %d bytes (stbytes=%d)", bytes, stbytes);
bytes /= 2; memcpy(ima->data, pdata, bytes);
uint8_t *ptr = (uint8_t*) pdata;
OMP_FOR()
for(int i = 0; i < bytes; ++i){
ima->data[i] = (uint16_t) *ptr++;
}
ima->bitpix = 8;
return TRUE; return TRUE;
} }
return FALSE;
}
static int cam_modelname(char *buf, int bufsz){ static int cam_modelname(char *buf, int bufsz){
strncpy(buf, camname, bufsz); strncpy(buf, camname, bufsz);

View File

@ -101,7 +101,8 @@ static int campoll(capture_status *st, float *remain){
break; break;
default: // failed default: // failed
DBG("Failed: %d", s); DBG("Failed: %d", s);
*st = CAPTURE_ABORTED; //*st = CAPTURE_ABORTED;
*st = CAPTURE_READY;
} }
if(remain){ if(remain){
float diff = exptime - (dtime() - starttime); float diff = exptime - (dtime() - starttime);
@ -392,6 +393,7 @@ static int setfspd(int spd){ // set fast speed (0..3): 0 - 40% bandwidthovrl, 3
if(spd > 2) bw = 100.; if(spd > 2) bw = 100.;
else if(spd > 0) bw += 20. * spd; else if(spd > 0) bw += 20. * spd;
DBG("set BANDWIDTH to %g", bw); DBG("set BANDWIDTH to %g", bw);
zwo_setfloat(1, ASI_HIGH_SPEED_MODE);
if(ASI_SUCCESS != zwo_setfloat(bw, ASI_BANDWIDTHOVERLOAD)){ if(ASI_SUCCESS != zwo_setfloat(bw, ASI_BANDWIDTHOVERLOAD)){
DBG("Can't set"); DBG("Can't set");
return FALSE; return FALSE;

View File

@ -18,13 +18,22 @@
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> // for size_t
typedef struct{ // magic to mark our SHM
uint16_t *data; // image data #define SHM_MAGIC (0xdeadbeef)
// base image parameters - sent by socket and stored in shared memory
typedef struct __attribute__((packed, aligned(4))){
uint32_t MAGICK; // magick (DEADBEEF) - to mark our shm
double timestamp; // timestamp of image taken
uint8_t bitpix; // bits per pixel (8 or 16) uint8_t bitpix; // bits per pixel (8 or 16)
int w, h; // image size int w, h; // image size
uint16_t max, min; // min/max values uint16_t max, min; // min/max values
float avr, std; // statistics float avr, std; // statistics
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; } IMG;
// format of single frame // format of single frame
@ -78,12 +87,13 @@ typedef struct{
int (*confio)(int s); // configure IO-port int (*confio)(int s); // configure IO-port
int (*setio)(int s); // set IO-port to given state int (*setio)(int s); // set IO-port to given state
int (*setframetype)(int l); // set frametype: 1 - light, 0 - dark int (*setframetype)(int l); // set frametype: 1 - light, 0 - dark
int (*setbitdepth)(int h); // set bit depth: 1 - high, 0 - low int (*setbitdepth)(int h); // set bit depth : 1 - high (16 bit), 0 - low (8 bit)
int (*setfastspeed)(int s); // set readout speed: 1 - fast, 0 - low int (*setfastspeed)(int s); // set readout speed: 1 - fast, 0 - low
// geometry (if TRUE, all args are changed to suitable values) // geometry (if TRUE, all args are changed to suitable values)
int (*setgeometry)(frameformat *fmt); // set geometry in UNBINNED coordinates int (*setgeometry)(frameformat *fmt); // set geometry in UNBINNED coordinates
int (*setfanspeed)(fan_speed spd); // set fan speed int (*setfanspeed)(fan_speed spd); // set fan speed
// getters: // getters:
int (*getbitpix)(uint8_t *bp); // get bit depth in bits per pixel (8, 12, 16 etc)
int (*getbrightness)(float *b);// get brightnes level int (*getbrightness)(float *b);// get brightnes level
int (*getModelName)(char *n, int l);// string with model name (l - length of n in bytes) int (*getModelName)(char *n, int l);// string with model name (l - length of n in bytes)
int (*getgain)(float *g); // get gain value int (*getgain)(float *g); // get gain value

View File

@ -211,7 +211,6 @@ int saveFITS(IMG *img, char **outp){
} }
} }
int width = img->w, height = img->h; int width = img->w, height = img->h;
void *data = (void*) img->data;
long naxes[2] = {width, height}; long naxes[2] = {width, height};
double tmpd = 0.0; double tmpd = 0.0;
float tmpf = 0.0; float tmpf = 0.0;
@ -224,7 +223,9 @@ int saveFITS(IMG *img, char **outp){
fitserror = 0; fitserror = 0;
TRYFITS(fits_create_file, &fp, fnam); TRYFITS(fits_create_file, &fp, fnam);
if(fitserror) goto cloerr; if(fitserror) goto cloerr;
TRYFITS(fits_create_img, fp, USHORT_IMG, 2, naxes); int nbytes = getNbytes(img);
if(nbytes == 1) TRYFITS(fits_create_img, fp, BYTE_IMG, 2, naxes);
else TRYFITS(fits_create_img, fp, USHORT_IMG, 2, naxes);
if(fitserror) goto cloerr; if(fitserror) goto cloerr;
// ORIGIN / organization responsible for the data // ORIGIN / organization responsible for the data
WRITEKEY(fp, TSTRING, "ORIGIN", "SAO RAS", "organization responsible for the data"); WRITEKEY(fp, TSTRING, "ORIGIN", "SAO RAS", "organization responsible for the data");
@ -348,7 +349,8 @@ int saveFITS(IMG *img, char **outp){
// INSTRUME / Instrument // INSTRUME / Instrument
if(GP->instrument) if(GP->instrument)
WRITEKEY(fp, TSTRING, "INSTRUME", GP->instrument, "Instrument"); WRITEKEY(fp, TSTRING, "INSTRUME", GP->instrument, "Instrument");
TRYFITS(fits_write_img, fp, TUSHORT, 1, width * height, data); if(nbytes == 1) TRYFITS(fits_write_img, fp, TBYTE, 1, width * height, img->data);
else TRYFITS(fits_write_img, fp, TUSHORT, 1, width * height, img->data);
if(fitserror) goto cloerr; if(fitserror) goto cloerr;
TRYFITS(fits_close_file, fp); TRYFITS(fits_close_file, fp);
cloerr: cloerr:
@ -369,24 +371,23 @@ cloerr:
return ret; return ret;
} }
void calculate_stat(IMG *image){ static void stat8(IMG *image){
uint64_t Noverld = 0L, size = image->h*image->w;
double sum = 0., sum2 = 0.; double sum = 0., sum2 = 0.;
uint16_t max = 0, min = 65535; size_t size = image->w * image->h;
uint8_t max = 0, min = UINT8_MAX;
uint8_t *idata = (uint8_t*)image->data;
#pragma omp parallel #pragma omp parallel
{ {
uint16_t maxpriv = 0, minpriv = 65535; uint8_t maxpriv = 0, minpriv = UINT8_MAX;
uint64_t ovrpriv = 0;
double sumpriv = 0., sum2priv = 0.; double sumpriv = 0., sum2priv = 0.;
#pragma omp for nowait #pragma omp for nowait
for(uint64_t i = 0; i < size; ++i){ for(size_t i = 0; i < size; ++i){
uint16_t val = image->data[i]; uint8_t val = idata[i];
float pv = (float) val; float pv = (float) val;
sum += pv; sum += pv;
sum2 += (pv * pv); sum2 += (pv * pv);
if(max < val) max = val; if(max < val) max = val;
if(min > val) min = val; if(min > val) min = val;
if(val >= 65530) ovrpriv++;
} }
#pragma omp critical #pragma omp critical
{ {
@ -394,7 +395,6 @@ void calculate_stat(IMG *image){
if(min > minpriv) min = minpriv; if(min > minpriv) min = minpriv;
sum += sumpriv; sum += sumpriv;
sum2 += sum2priv; sum2 += sum2priv;
Noverld += ovrpriv;
} }
} }
double sz = (float)size; double sz = (float)size;
@ -402,10 +402,49 @@ void calculate_stat(IMG *image){
image->avr = avr; image->avr = avr;
image->std = sqrt(fabs(sum2/sz - avr*avr)); image->std = sqrt(fabs(sum2/sz - avr*avr));
image->max = max; image->min = min; image->max = max; image->min = min;
}
static void stat16(IMG *image){
double sum = 0., sum2 = 0.;
size_t size = image->w * image->h;
uint16_t max = 0, min = UINT16_MAX;
uint16_t *idata = (uint16_t*)image->data;
#pragma omp parallel
{
uint16_t maxpriv = 0, minpriv = UINT16_MAX;
double sumpriv = 0., sum2priv = 0.;
#pragma omp for nowait
for(size_t i = 0; i < size; ++i){
uint16_t val = idata[i];
float pv = (float) val;
sum += pv;
sum2 += (pv * pv);
if(max < val) max = val;
if(min > val) min = val;
}
#pragma omp critical
{
if(max < maxpriv) max = maxpriv;
if(min > minpriv) min = minpriv;
sum += sumpriv;
sum2 += sum2priv;
}
}
double sz = (float)size;
double avr = sum/sz;
image->avr = avr;
image->std = sqrt(fabs(sum2/sz - avr*avr));
image->max = max; image->min = min;
}
void calculate_stat(IMG *image){
int nbytes = ((7 + image->bitpix) / 8);
if(nbytes == 1) stat8(image);
else stat16(image);
if(GP->verbose){ if(GP->verbose){
printf(_("Image stat:\n")); printf(_("Image stat:\n"));
printf("avr = %.1f, std = %.1f, Noverload = %ld\n", avr, image->std, Noverld); printf("avr = %.1f, std = %.1f\n", image->avr, image->std);
printf("max = %u, min = %u, size = %ld\n", max, min, size); printf("max = %u, min = %u, size = %d pix\n", image->max, image->min, image->w * image->h);
} }
} }
@ -770,6 +809,7 @@ void ccds(){
frameformat fmt = camera->geometry; frameformat fmt = camera->geometry;
int raw_width = fmt.w / GP->hbin, raw_height = fmt.h / GP->vbin; int raw_width = fmt.w / GP->hbin, raw_height = fmt.h / GP->vbin;
DBG("w=%d, h=%d", raw_width, raw_height); DBG("w=%d, h=%d", raw_width, raw_height);
// allocate maximum available memory - for 16bit image
uint16_t *img = MALLOC(uint16_t, raw_width * raw_height); uint16_t *img = MALLOC(uint16_t, raw_width * raw_height);
DBG("\n\nAllocated image 2x%dx%d=%d", raw_width, raw_height, 2 * raw_width * raw_height); DBG("\n\nAllocated image 2x%dx%d=%d", raw_width, raw_height, 2 * raw_width * raw_height);
IMG ima = {.data = img, .w = raw_width, .h = raw_height}; IMG ima = {.data = img, .w = raw_width, .h = raw_height};
@ -827,6 +867,17 @@ void camstop(){
} }
} }
/**
* @brief getNbytes - calculate amount of bytes to store bitpix (1/2)
* @param image - image
* @return 1 for bitpix<8 or 2
*/
int getNbytes(IMG *image){
int n = (image->bitpix + 7) / 8;
if(n < 1) n = 1;
if(n > 2) n = 2;
return n;
}
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
#define NFRM (10) #define NFRM (10)

View File

@ -31,6 +31,8 @@ int prepare_ccds();
void ccds(); void ccds();
void camstop(); void camstop();
int getNbytes(IMG *image);
int startCCD(void **dlh); int startCCD(void **dlh);
int startWheel(void **dlh); int startWheel(void **dlh);
int startFocuser(void **dlh); int startFocuser(void **dlh);

View File

@ -46,7 +46,8 @@ static int xc0,yc0,xc1,yc1; // current format
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
static IMG ima = {0}; static IMG ima = {0};
static volatile atomic_int grabno = 0, oldgrabno = 0; static volatile atomic_int grabno = 0, oldgrabno = 0;
static int imdatalen = 0, imbufsz = 0; static size_t imbufsz = 0;
static uint8_t *imbuf = NULL;
#endif #endif
static char *readmsg(int fd){ static char *readmsg(int fd){
@ -100,6 +101,7 @@ static int parseans(char *ans){
DBG("Got current format: %d,%d,%d,%d", xc0, yc0, xc1, yc1); DBG("Got current format: %d,%d,%d,%d", xc0, yc0, xc1, yc1);
return TRUE; return TRUE;
} }
/*
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
else if(0 == strcmp(CMD_IMWIDTH, ans)){ else if(0 == strcmp(CMD_IMWIDTH, ans)){
ima.w = atoi(val); ima.w = atoi(val);
@ -113,6 +115,7 @@ static int parseans(char *ans){
return TRUE; return TRUE;
} }
#endif #endif
*/
//TIMESTAMP("parseans() end"); //TIMESTAMP("parseans() end");
return FALSE; return FALSE;
} }
@ -313,40 +316,56 @@ void init_grab_sock(int sock){
send_headers(sock); send_headers(sock);
} }
static void getimage(){ /**
FNAME(); * @brief readNbytes - read `N` bytes from descriptor `fd` into buffer *buf
int sock = controlfd; * @return false if failed
TIMESTAMP("Get image sizes"); */
SENDCMDW(CMD_IMWIDTH); static int readNbytes(int fd, size_t N, uint8_t *buf){
SENDCMDW(CMD_IMHEIGHT); size_t got = 0, need = N;
int imsock = open_socket(FALSE, GP->imageport, TRUE);
if(imsock < 0) ERRX("getimage(): can't open image transport socket");
if(imbufsz < imdatalen){
DBG("Reallocate memory from %d to %d", imbufsz, imdatalen);
ima.data = realloc(ima.data, imdatalen);
imbufsz = imdatalen;
}
double t0 = dtime(); double t0 = dtime();
int got = 0; while(dtime() - t0 < CLIENT_TIMEOUT && canberead(fd) && need){
TIMESTAMP("Start of data read"); ssize_t rd = read(fd, buf + got, need);
while(dtime() - t0 < CLIENT_TIMEOUT){
if(!canberead(imsock)) continue;
uint8_t *target = ((uint8_t*)ima.data)+got;
int rd = read(imsock, target, imdatalen - got);
if(rd <= 0){ if(rd <= 0){
WARNX("Server disconnected"); WARNX("Server disconnected");
signals(1); signals(1);
} }
got += rd; got += rd; need -= 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){
break;
} }
if(need) return FALSE; // didn't got whole packet
return TRUE;
}
static void getimage(){
FNAME();
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(ima.bytelen < 1){
WARNX("Wrong image size");
goto eofg;
}
if(imbufsz < ima.bytelen){
size_t newsz = 1024 * (1 + ima.bytelen / 1024);
DBG("Reallocate memory from %zd to %zd", imbufsz, newsz);
imbufsz = newsz;
imbuf = realloc(imbuf, imbufsz);
}
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(dtime() - t0 > CLIENT_TIMEOUT) WARNX("Timeout, image didn't received");
TIMESTAMP("Got image"); TIMESTAMP("Got image");
++grabno; ++grabno;
eofg:
close(imsock); close(imsock);
} }

View File

@ -30,6 +30,7 @@ static glob_pars G = {
.brightness = NAN, .gain = NAN, .brightness = NAN, .gain = NAN,
.setwheel = -1, .setwheel = -1,
.fanspeed = -1, .fanspeed = -1,
.shmkey = 7777777
}; };
/* /*
@ -102,6 +103,8 @@ myoption cmdlnopts[] = {
{"viewer", NO_ARGS, &G.viewer,1, arg_none, NULL, N_("passive viewer (only get last images)")}, {"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")}, {"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")},
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
{"display", NO_ARGS, NULL, 'D', arg_int, APTR(&G.showimage), N_("Display image in OpenGL window")}, {"display", NO_ARGS, NULL, 'D', arg_int, APTR(&G.showimage), N_("Display image in OpenGL window")},
#endif #endif

View File

@ -69,6 +69,7 @@ typedef struct{
int verbose; // each '-V' increases it int verbose; // each '-V' increases it
int rewrite; // rewrite file int rewrite; // rewrite file
int showimage; // show image preview int showimage; // show image preview
int shmkey; // shared memory (with image data) key
float gain; // gain level (only for CMOS) float gain; // gain level (only for CMOS)
float brightness; // brightness (only for CMOS) float brightness; // brightness (only for CMOS)
double exptime; // time of exposition in seconds double exptime; // time of exposition in seconds

View File

@ -427,6 +427,7 @@ static void roll_colorfun(){
if(t == COLORFN_MAX) t = COLORFN_BWLINEAR; if(t == COLORFN_MAX) t = COLORFN_BWLINEAR;
change_colorfun(t); change_colorfun(t);
} }
/* /*
no omp no omp
histo: 0.000675201s histo: 0.000675201s
@ -444,7 +445,7 @@ result: 0.0014689s
* @param w,h - image width and height * @param w,h - image width and height
* @return data allocated here * @return data allocated here
*/ */
static uint8_t *equalize(uint16_t *ori, int w, int h){ static uint8_t *equalize(IMG *img, int w, int h){
uint8_t *retn = MALLOC(uint8_t, w*h); uint8_t *retn = MALLOC(uint8_t, w*h);
double orig_hysto[0x10000] = {0.}; // original hystogram double orig_hysto[0x10000] = {0.}; // original hystogram
uint8_t eq_levls[0x10000] = {0}; // levels to convert: newpix = eq_levls[oldpix] uint8_t eq_levls[0x10000] = {0}; // levels to convert: newpix = eq_levls[oldpix]
@ -464,19 +465,39 @@ static uint8_t *equalize(uint16_t *ori, int w, int h){
for(int i = 0; i < 0x10000; ++i) orig_hysto[i] += histogram_private[i]; for(int i = 0; i < 0x10000; ++i) orig_hysto[i] += histogram_private[i];
} }
}*/ }*/
int bytes = getNbytes(img);
if(bytes == 1){
uint8_t *data = (uint8_t*) img->data;
for(int i = 0; i < s; ++i){ for(int i = 0; i < s; ++i){
++orig_hysto[ori[i]]; ++orig_hysto[data[i]];
} }
}else{
uint16_t *data = (uint16_t*) img->data;
for(int i = 0; i < s; ++i){
++orig_hysto[data[i]];
}
}
//WARNX("histo: %gs", dtime()-t0); //WARNX("histo: %gs", dtime()-t0);
int max = (bytes == 1) ? 0xff : 0xffff;
double part = (double)(s + 1) / 0x100, N = 0.; double part = (double)(s + 1) / 0x100, N = 0.;
for(int i = 0; i <= 0xffff; ++i){ for(int i = 0; i <= max; ++i){
N += orig_hysto[i]; N += orig_hysto[i];
eq_levls[i] = (uint8_t)(N/part); eq_levls[i] = (uint8_t)(N/part);
} }
//WARNX("equal: %gs", dtime()-t0); //WARNX("equal: %gs", dtime()-t0);
//OMP_FOR() -- takes the same time! //OMP_FOR() -- takes the same time!
if(bytes == 1){
uint8_t *data = (uint8_t*) img->data;
for(int i = 0; i < s; ++i){ for(int i = 0; i < s; ++i){
retn[i] = eq_levls[ori[i]]; retn[i] = eq_levls[data[i]];
}
}else{
uint16_t *data = (uint16_t*) img->data;
for(int i = 0; i < s; ++i){
retn[i] = eq_levls[data[i]];
}
} }
//WARNX("result: %gs", dtime()-t0); //WARNX("result: %gs", dtime()-t0);
return retn; return retn;
@ -493,20 +514,42 @@ cuts: 0.00188208s
*/ */
// count image cuts as [median-sigma median+5sigma] // count image cuts as [median-sigma median+5sigma]
static uint8_t *mkcuts(uint16_t *ori, int w, int h){ static uint8_t *mkcuts(IMG *img, int w, int h){
uint8_t *retn = MALLOC(uint8_t, w*h); uint8_t *retn = MALLOC(uint8_t, w*h);
int orig_hysto[0x10000] = {0.}; // original hystogram int orig_hysto[0x10000] = {0.}; // original hystogram
int s = w*h; int s = w*h;
double sum = 0., sum2 = 0.; double sum = 0., sum2 = 0.;
//double t0 = dtime(); int bytes = getNbytes(img);
if(bytes == 1){
uint8_t *data = (uint8_t*) img->data;
#pragma omp parallel
{
size_t histogram_private[0x100] = {0};
double sm = 0., sm2 = 0.;
#pragma omp for nowait
for(int i = 0; i < s; ++i){
++histogram_private[data[i]];
double b = data[i];
sm += b;
sm2 += b*b;
}
#pragma omp critical
{
for(int i = 0; i < 0x100; ++i) orig_hysto[i] += histogram_private[i];
sum += sm;
sum2 += sm2;
}
}
}else{
uint16_t *data = (uint16_t*) img->data;
#pragma omp parallel #pragma omp parallel
{ {
size_t histogram_private[0x10000] = {0}; size_t histogram_private[0x10000] = {0};
double sm = 0., sm2 = 0.; double sm = 0., sm2 = 0.;
#pragma omp for nowait #pragma omp for nowait
for(int i = 0; i < s; ++i){ for(int i = 0; i < s; ++i){
++histogram_private[ori[i]]; ++histogram_private[data[i]];
double b = ori[i]; double b = data[i];
sm += b; sm += b;
sm2 += b*b; sm2 += b*b;
} }
@ -517,37 +560,43 @@ static uint8_t *mkcuts(uint16_t *ori, int w, int h){
sum2 += sm2; sum2 += sm2;
} }
} }
/*
for(int i = 0; i < s; ++i){
double b = ori[i];
++orig_hysto[ori[i]];
sum += b;
sum2 += b*b;
} }
*/
//WARNX("histo: %gs", dtime()-t0); //WARNX("histo: %gs", dtime()-t0);
// get median level // get median level
int counts = s/2, median = 0; int counts = s/2, median = 0, max = (bytes == 1) ? 0xff : 0xffff;
for(; median < 0xffff; ++median){ for(; median < max; ++median){
if((counts -= orig_hysto[median]) < 0) break; if((counts -= orig_hysto[median]) < 0) break;
} }
sum /= s; sum /= s;
double sigma = sqrt(sum2/s - sum*sum); double sigma = sqrt(sum2/s - sum*sum);
int low = median - sigma, high = median + 5.*sigma; int low = median - sigma, high = median + 5.*sigma;
if(low < 0) low = 0; if(low < 0) low = 0;
if(high > 0xffff) high = 0xffff; if(high > max) high = max;
double A = 255./(high - low); double A = 255./(high - low);
DBG("Got: sigma=%.1f, low=%d, high=%d, A=%g", sigma, low, high, A); DBG("Got: sigma=%.1f, low=%d, high=%d, A=%g", sigma, low, high, A);
// now we can recalculate values: new = (old - low)*A // now we can recalculate values: new = (old - low)*A
//WARNX("stat: %gs", dtime()-t0); //WARNX("stat: %gs", dtime()-t0);
// DEBUG: 2ms without OMP; 0.7ms with // DEBUG: 2ms without OMP; 0.7ms with
if(bytes == 1){
uint8_t *data = (uint8_t*) img->data;
OMP_FOR() OMP_FOR()
for(int i = 0; i < s; ++i){ for(int i = 0; i < s; ++i){
uint16_t old = ori[i]; uint16_t old = data[i];
if(old > high){ retn[i] = 255; continue; } if(old > high){ retn[i] = 255; continue; }
else if(old < low){ retn[i] = 0; continue; } else if(old < low){ retn[i] = 0; continue; }
retn[i] = (uint8_t)(A*(old - low)); retn[i] = (uint8_t)(A*(old - low));
} }
}else{
uint16_t *data = (uint16_t*) img->data;
OMP_FOR()
for(int i = 0; i < s; ++i){
uint16_t old = data[i];
if(old > high){ retn[i] = 255; continue; }
else if(old < low){ retn[i] = 0; continue; }
retn[i] = (uint8_t)(A*(old - low));
}
}
//WARNX("cuts: %gs", dtime()-t0); //WARNX("cuts: %gs", dtime()-t0);
return retn; return retn;
} }
@ -569,10 +618,10 @@ static void change_displayed_image(IMG *img){
uint8_t *newima; uint8_t *newima;
if(imequalize){ if(imequalize){
DBG("equalize"); DBG("equalize");
newima = equalize(img->data, w, h); newima = equalize(img, w, h);
}else{ }else{
DBG("cuts"); DBG("cuts");
newima = mkcuts(img->data, w, h); newima = mkcuts(img, w, h);
} }
GLubyte *dst = im->rawdata; GLubyte *dst = im->rawdata;
//double t0 = dtime(); //double t0 = dtime();

Binary file not shown.

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-31 16:14+0300\n" "POT-Creation-Date: 2023-12-14 16:53+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,235 +17,239 @@ msgstr ""
"Content-Type: text/plain; charset=koi8-r\n" "Content-Type: text/plain; charset=koi8-r\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: cmdlnopts.c:40 #: cmdlnopts.c:41
msgid "common device plugin (e.g devfli.so)" msgid "common device plugin (e.g devfli.so)"
msgstr "" msgstr ""
#: cmdlnopts.c:41 #: cmdlnopts.c:42
msgid "camera device plugin (e.g. devfli.so)" msgid "camera device plugin (e.g. devfli.so)"
msgstr "" msgstr ""
#: cmdlnopts.c:42 #: cmdlnopts.c:43
msgid "focuser device plugin (e.g. devzwo.so)" msgid "focuser device plugin (e.g. devzwo.so)"
msgstr "" msgstr ""
#: cmdlnopts.c:43 #: cmdlnopts.c:44
msgid "wheel device plugin (e.g. devdummy.so)" msgid "wheel device plugin (e.g. devdummy.so)"
msgstr "" msgstr ""
#: cmdlnopts.c:44 #: cmdlnopts.c:45
msgid "list connected devices" msgid "list connected devices"
msgstr "" msgstr ""
#: cmdlnopts.c:45 #: cmdlnopts.c:46
msgid "camera device number (if many: 0, 1, 2 etc)" msgid "camera device number (if many: 0, 1, 2 etc)"
msgstr "" msgstr ""
#: cmdlnopts.c:46 #: cmdlnopts.c:47
msgid "filter wheel device number (if many: 0, 1, 2 etc)" msgid "filter wheel device number (if many: 0, 1, 2 etc)"
msgstr "" msgstr ""
#: cmdlnopts.c:47 #: cmdlnopts.c:48
msgid "focuser device number (if many: 0, 1, 2 etc)" msgid "focuser device number (if many: 0, 1, 2 etc)"
msgstr "" msgstr ""
#: cmdlnopts.c:48 #: cmdlnopts.c:49
msgid "show this help" msgid "show this help"
msgstr "" msgstr ""
#: cmdlnopts.c:49 #: cmdlnopts.c:50
msgid "rewrite output file if exists" msgid "rewrite output file if exists"
msgstr "" msgstr ""
#: cmdlnopts.c:50 #: cmdlnopts.c:51
msgid "verbose level (-V - messages, -VV - debug, -VVV - all shit)" msgid "verbose level (-V - messages, -VV - debug, -VVV - all shit)"
msgstr "" msgstr ""
#: cmdlnopts.c:51 #: cmdlnopts.c:52
msgid "not open shutter, when exposing (\"dark frames\")" msgid "not open shutter, when exposing (\"dark frames\")"
msgstr "" msgstr ""
#: cmdlnopts.c:52 #: cmdlnopts.c:53
msgid "run in 8-bit mode" msgid "run in 8-bit mode"
msgstr "" msgstr ""
#: cmdlnopts.c:53 #: cmdlnopts.c:54
msgid "fast readout mode" msgid "fast readout mode"
msgstr "" msgstr ""
#: cmdlnopts.c:54 #: cmdlnopts.c:55
msgid "set CCD temperature to given value (degr C)" msgid "set CCD temperature to given value (degr C)"
msgstr "" msgstr ""
#: cmdlnopts.c:55 #: cmdlnopts.c:56
msgid "set fan speed (0 - off, 1 - low, 2 - high)" msgid "set fan speed (0 - off, 1 - low, 2 - high)"
msgstr "" msgstr ""
#: cmdlnopts.c:57 #: cmdlnopts.c:58
msgid "program author" msgid "program author"
msgstr "" msgstr ""
#: cmdlnopts.c:58 #: cmdlnopts.c:59
msgid "object type (neon, object, flat etc)" msgid "object type (neon, object, flat etc)"
msgstr "" msgstr ""
#: cmdlnopts.c:59 #: cmdlnopts.c:60
msgid "instrument name" msgid "instrument name"
msgstr "" msgstr ""
#: cmdlnopts.c:60 #: cmdlnopts.c:61
msgid "object name" msgid "object name"
msgstr "" msgstr ""
#: cmdlnopts.c:61 #: cmdlnopts.c:62
msgid "observers' names" msgid "observers' names"
msgstr "" msgstr ""
#: cmdlnopts.c:62 #: cmdlnopts.c:63
msgid "observing program name" msgid "observing program name"
msgstr "" msgstr ""
#: cmdlnopts.c:63 #: cmdlnopts.c:64
msgid "add records to header from given file[s]" msgid "add records to header from given file[s]"
msgstr "" msgstr ""
#: cmdlnopts.c:64 #: cmdlnopts.c:65
msgid "output file name" msgid "output file name"
msgstr "" msgstr ""
#: cmdlnopts.c:65 #: cmdlnopts.c:66
msgid "wait while exposition ends" msgid "wait while exposition ends"
msgstr "" msgstr ""
#: cmdlnopts.c:67 #: cmdlnopts.c:68
msgid "N flushes before exposing (default: 1)" msgid "N flushes before exposing (default: 1)"
msgstr "" msgstr ""
#: cmdlnopts.c:68 #: cmdlnopts.c:69
msgid "horizontal binning to N pixels" msgid "horizontal binning to N pixels"
msgstr "" msgstr ""
#: cmdlnopts.c:69 #: cmdlnopts.c:70
msgid "vertical binning to N pixels" msgid "vertical binning to N pixels"
msgstr "" msgstr ""
#: cmdlnopts.c:70 #: cmdlnopts.c:71
msgid "make series of N frames" msgid "make series of N frames"
msgstr "" msgstr ""
#: cmdlnopts.c:71 #: cmdlnopts.c:72
msgid "make pause for N seconds between expositions" msgid "make pause for N seconds between expositions"
msgstr "" msgstr ""
#: cmdlnopts.c:72 #: cmdlnopts.c:73
msgid "set exposure time to given value (seconds!)" msgid "set exposure time to given value (seconds!)"
msgstr "" msgstr ""
#: cmdlnopts.c:73 #: cmdlnopts.c:74
msgid "cancel current exposition" msgid "cancel current exposition"
msgstr "" msgstr ""
#: cmdlnopts.c:74 #: cmdlnopts.c:75
msgid "" msgid ""
"absolute (not divided by binning!) frame X0 coordinate (-1 - all with " "absolute (not divided by binning!) frame X0 coordinate (-1 - all with "
"overscan)" "overscan)"
msgstr "" msgstr ""
#: cmdlnopts.c:75 #: cmdlnopts.c:76
msgid "absolute frame Y0 coordinate (-1 - all with overscan)" msgid "absolute frame Y0 coordinate (-1 - all with overscan)"
msgstr "" msgstr ""
#: cmdlnopts.c:76 #: cmdlnopts.c:77
msgid "absolute frame X1 coordinate (-1 - all with overscan)" msgid "absolute frame X1 coordinate (-1 - all with overscan)"
msgstr "" msgstr ""
#: cmdlnopts.c:77 #: cmdlnopts.c:78
msgid "absolute frame Y1 coordinate (-1 - all with overscan)" msgid "absolute frame Y1 coordinate (-1 - all with overscan)"
msgstr "" msgstr ""
#: cmdlnopts.c:79 #: cmdlnopts.c:80
msgid "open shutter" msgid "open shutter"
msgstr "" msgstr ""
#: cmdlnopts.c:80 #: cmdlnopts.c:81
msgid "close shutter" msgid "close shutter"
msgstr "" msgstr ""
#: cmdlnopts.c:81 #: cmdlnopts.c:82
msgid "run exposition on LOW @ pin5 I/O port" msgid "run exposition on LOW @ pin5 I/O port"
msgstr "" msgstr ""
#: cmdlnopts.c:82 #: cmdlnopts.c:83
msgid "run exposition on HIGH @ pin5 I/O port" msgid "run exposition on HIGH @ pin5 I/O port"
msgstr "" msgstr ""
#: cmdlnopts.c:83 #: cmdlnopts.c:84
msgid "get value of I/O port pins" msgid "get value of I/O port pins"
msgstr "" msgstr ""
#: cmdlnopts.c:84 #: cmdlnopts.c:85
msgid "move stepper motor asynchronous" msgid "move stepper motor asynchronous"
msgstr "" msgstr ""
#: cmdlnopts.c:86 #: cmdlnopts.c:87
msgid "set I/O port pins to given value (decimal number, pin1 is LSB)" msgid "set I/O port pins to given value (decimal number, pin1 is LSB)"
msgstr "" msgstr ""
#: cmdlnopts.c:87 #: cmdlnopts.c:88
msgid "" msgid ""
"configure I/O port pins to given value (decimal number, pin1 is LSB, 1 == " "configure I/O port pins to given value (decimal number, pin1 is LSB, 1 == "
"output, 0 == input)" "output, 0 == input)"
msgstr "" msgstr ""
#: cmdlnopts.c:89 #: cmdlnopts.c:90
msgid "move focuser to absolute position, mm" msgid "move focuser to absolute position, mm"
msgstr "" msgstr ""
#: cmdlnopts.c:90 #: cmdlnopts.c:91
msgid "move focuser to relative position, mm (only for standalone)" msgid "move focuser to relative position, mm (only for standalone)"
msgstr "" msgstr ""
#: cmdlnopts.c:92 #: cmdlnopts.c:93
msgid "set wheel position" msgid "set wheel position"
msgstr "" msgstr ""
#: cmdlnopts.c:94 #: cmdlnopts.c:95
msgid "CMOS gain level" msgid "CMOS gain level"
msgstr "" msgstr ""
#: cmdlnopts.c:95 #: cmdlnopts.c:96
msgid "CMOS brightness level" msgid "CMOS brightness level"
msgstr "" msgstr ""
#: cmdlnopts.c:97 #: cmdlnopts.c:98
msgid "logging file name (if run as server)" msgid "logging file name (if run as server)"
msgstr "" msgstr ""
#: cmdlnopts.c:98 #: cmdlnopts.c:99
msgid "UNIX socket name" msgid "UNIX socket name"
msgstr "" msgstr ""
#: cmdlnopts.c:99 #: cmdlnopts.c:100
msgid "local INET socket port" msgid "local INET socket port"
msgstr "" msgstr ""
#: cmdlnopts.c:100 #: cmdlnopts.c:101
msgid "local INET socket port to send/receive images" msgid "local INET socket port to send/receive images"
msgstr "" msgstr ""
#: cmdlnopts.c:101 #: cmdlnopts.c:102
msgid "run as client" msgid "run as client"
msgstr "" msgstr ""
#: cmdlnopts.c:102 #: cmdlnopts.c:103
msgid "passive viewer (only get last images)" msgid "passive viewer (only get last images)"
msgstr "" msgstr ""
#: cmdlnopts.c:103 #: cmdlnopts.c:104
msgid "restart image server" msgid "restart image server"
msgstr "" msgstr ""
#: cmdlnopts.c:106 #: cmdlnopts.c:106
msgid "shared memory (with image data) key (default: 7777777"
msgstr ""
#: cmdlnopts.c:109
msgid "Display image in OpenGL window" msgid "Display image in OpenGL window"
msgstr "" msgstr ""
@ -279,291 +283,291 @@ msgstr ""
msgid "Can't save file with prefix %s" msgid "Can't save file with prefix %s"
msgstr "" msgstr ""
#: ccdfunc.c:357 #: ccdfunc.c:359
#, c-format #, c-format
msgid "File saved as '%s'" msgid "File saved as '%s'"
msgstr "" msgstr ""
#: ccdfunc.c:366 #: ccdfunc.c:368
msgid "Error saving file" msgid "Error saving file"
msgstr "" msgstr ""
#: ccdfunc.c:406 #: ccdfunc.c:445
#, c-format #, c-format
msgid "Image stat:\n" msgid "Image stat:\n"
msgstr "" msgstr ""
#: ccdfunc.c:414 #: ccdfunc.c:453
msgid "Focuser device not pointed" msgid "Focuser device not pointed"
msgstr "" msgstr ""
#: ccdfunc.c:421 #: ccdfunc.c:460
msgid "No focusers found" msgid "No focusers found"
msgstr "" msgstr ""
#: ccdfunc.c:452
#, c-format
msgid "Found %d focusers, you point number %d"
msgstr ""
#: ccdfunc.c:456
msgid "Can't set active focuser number"
msgstr ""
#: ccdfunc.c:470
msgid "Can't get focuser limit positions"
msgstr ""
#: ccdfunc.c:477
msgid "Can't get current focuser position"
msgstr ""
#: ccdfunc.c:491 #: ccdfunc.c:491
#, c-format #, c-format
msgid "Can't set position %g: out of limits [%g, %g]" msgid "Found %d focusers, you point number %d"
msgstr "" msgstr ""
#: ccdfunc.c:495 #: ccdfunc.c:495
msgid "Can't set active focuser number"
msgstr ""
#: ccdfunc.c:509
msgid "Can't get focuser limit positions"
msgstr ""
#: ccdfunc.c:516
msgid "Can't get current focuser position"
msgstr ""
#: ccdfunc.c:530
#, c-format
msgid "Can't set position %g: out of limits [%g, %g]"
msgstr ""
#: ccdfunc.c:534
msgid "Can't home focuser" msgid "Can't home focuser"
msgstr "" msgstr ""
#: ccdfunc.c:497 #: ccdfunc.c:536
#, c-format #, c-format
msgid "Can't set position %g" msgid "Can't set position %g"
msgstr "" msgstr ""
#: ccdfunc.c:505 #: ccdfunc.c:544
msgid "Wheel device not pointed" msgid "Wheel device not pointed"
msgstr "" msgstr ""
#: ccdfunc.c:512 #: ccdfunc.c:551
msgid "No wheels found" msgid "No wheels found"
msgstr "" msgstr ""
#: ccdfunc.c:543 #: ccdfunc.c:582
#, c-format #, c-format
msgid "Found %d wheels, you point number %d" msgid "Found %d wheels, you point number %d"
msgstr "" msgstr ""
#: ccdfunc.c:547 #: ccdfunc.c:586
msgid "Can't set active wheel number" msgid "Can't set active wheel number"
msgstr "" msgstr ""
#: ccdfunc.c:563 #: ccdfunc.c:602
msgid "Can't get max wheel position" msgid "Can't get max wheel position"
msgstr "" msgstr ""
#: ccdfunc.c:570 #: ccdfunc.c:609
#, c-format #, c-format
msgid "Wheel position should be from 0 to %d" msgid "Wheel position should be from 0 to %d"
msgstr "" msgstr ""
#: ccdfunc.c:574 #: ccdfunc.c:613
#, c-format #, c-format
msgid "Can't set wheel position %d" msgid "Can't set wheel position %d"
msgstr "" msgstr ""
#: ccdfunc.c:591 #: ccdfunc.c:630
#, c-format #, c-format
msgid "%.1f seconds till exposition ends" msgid "%.1f seconds till exposition ends"
msgstr "" msgstr ""
#: ccdfunc.c:606 #: ccdfunc.c:645
msgid "Camera device not pointed" msgid "Camera device not pointed"
msgstr "" msgstr ""
#: ccdfunc.c:613 ccdfunc.c:614 #: ccdfunc.c:652 ccdfunc.c:653
msgid "No cameras found" msgid "No cameras found"
msgstr "" msgstr ""
#: ccdfunc.c:644 #: ccdfunc.c:683
#, c-format #, c-format
msgid "Found %d cameras, you point number %d" msgid "Found %d cameras, you point number %d"
msgstr "" msgstr ""
#: ccdfunc.c:648 #: ccdfunc.c:687
msgid "Can't set active camera number" msgid "Can't set active camera number"
msgstr "" msgstr ""
#: ccdfunc.c:654 #: ccdfunc.c:693
msgid "Can't set fan speed" msgid "Can't set fan speed"
msgstr "" msgstr ""
#: ccdfunc.c:655 #: ccdfunc.c:694
#, c-format #, c-format
msgid "Set fan speed to %d" msgid "Set fan speed to %d"
msgstr "" msgstr ""
#: ccdfunc.c:660 #: ccdfunc.c:699
#, c-format #, c-format
msgid "Camera model: %s" msgid "Camera model: %s"
msgstr "" msgstr ""
#: ccdfunc.c:661 #: ccdfunc.c:700
#, c-format #, c-format
msgid "Pixel size: %g x %g" msgid "Pixel size: %g x %g"
msgstr "" msgstr ""
#: ccdfunc.c:667 #: ccdfunc.c:706
#, c-format #, c-format
msgid "Full array: %s" msgid "Full array: %s"
msgstr "" msgstr ""
#: ccdfunc.c:670 #: ccdfunc.c:709
#, c-format #, c-format
msgid "Field of view: %s" msgid "Field of view: %s"
msgstr "" msgstr ""
#: ccdfunc.c:673 #: ccdfunc.c:712
#, c-format #, c-format
msgid "Current format: %s" msgid "Current format: %s"
msgstr "" msgstr ""
#: ccdfunc.c:676 #: ccdfunc.c:715
#, c-format #, c-format
msgid "Can't set T to %g degC" msgid "Can't set T to %g degC"
msgstr "" msgstr ""
#: ccdfunc.c:684 #: ccdfunc.c:723
#, c-format #, c-format
msgid "Shutter command: %s\n" msgid "Shutter command: %s\n"
msgstr "" msgstr ""
#: ccdfunc.c:686 #: ccdfunc.c:725
#, c-format #, c-format
msgid "Can't run shutter command %s (unsupported?)" msgid "Can't run shutter command %s (unsupported?)"
msgstr "" msgstr ""
#. "Попытка сконфигурировать порт I/O как %d\n" #. "Попытка сконфигурировать порт I/O как %d\n"
#: ccdfunc.c:690 #: ccdfunc.c:729
#, c-format #, c-format
msgid "Try to configure I/O port as %d" msgid "Try to configure I/O port as %d"
msgstr "" msgstr ""
#: ccdfunc.c:692 #: ccdfunc.c:731
msgid "Can't configure (unsupported?)" msgid "Can't configure (unsupported?)"
msgstr "" msgstr ""
#: ccdfunc.c:699 #: ccdfunc.c:738
msgid "Can't get IOport state (unsupported?)" msgid "Can't get IOport state (unsupported?)"
msgstr "" msgstr ""
#. "Попытка записи %d в порт I/O\n" #. "Попытка записи %d в порт I/O\n"
#: ccdfunc.c:703 #: ccdfunc.c:742
#, c-format #, c-format
msgid "Try to write %d to I/O port" msgid "Try to write %d to I/O port"
msgstr "" msgstr ""
#: ccdfunc.c:705 #: ccdfunc.c:744
msgid "Can't set IOport" msgid "Can't set IOport"
msgstr "" msgstr ""
#: ccdfunc.c:712 #: ccdfunc.c:751
#, c-format #, c-format
msgid "Set gain to %g" msgid "Set gain to %g"
msgstr "" msgstr ""
#: ccdfunc.c:713 #: ccdfunc.c:752
#, c-format #, c-format
msgid "Can't set gain to %g" msgid "Can't set gain to %g"
msgstr "" msgstr ""
#: ccdfunc.c:718 #: ccdfunc.c:757
#, c-format #, c-format
msgid "Set brightness to %g" msgid "Set brightness to %g"
msgstr "" msgstr ""
#: ccdfunc.c:719 #: ccdfunc.c:758
#, c-format #, c-format
msgid "Can't set brightness to %g" msgid "Can't set brightness to %g"
msgstr "" msgstr ""
#: ccdfunc.c:725 server.c:251 #: ccdfunc.c:764 server.c:312
#, c-format #, c-format
msgid "Can't set binning %dx%d" msgid "Can't set binning %dx%d"
msgstr "" msgstr ""
#: ccdfunc.c:737 server.c:252 #: ccdfunc.c:776 server.c:313
msgid "Can't set given geometry" msgid "Can't set given geometry"
msgstr "" msgstr ""
#: ccdfunc.c:741 #: ccdfunc.c:780
#, c-format #, c-format
msgid "Can't set %d flushes" msgid "Can't set %d flushes"
msgstr "" msgstr ""
#: ccdfunc.c:745 #: ccdfunc.c:784
#, c-format #, c-format
msgid "Can't set exposure time to %f seconds" msgid "Can't set exposure time to %f seconds"
msgstr "" msgstr ""
#: ccdfunc.c:748 #: ccdfunc.c:787
msgid "Can't change frame type" msgid "Can't change frame type"
msgstr "" msgstr ""
#: ccdfunc.c:751 #: ccdfunc.c:790
msgid "Can't set bit depth" msgid "Can't set bit depth"
msgstr "" msgstr ""
#: ccdfunc.c:753 #: ccdfunc.c:792
msgid "Can't set readout speed" msgid "Can't set readout speed"
msgstr "" msgstr ""
#: ccdfunc.c:754 #: ccdfunc.c:793
#, c-format #, c-format
msgid "Readout mode: %s" msgid "Readout mode: %s"
msgstr "" msgstr ""
#: ccdfunc.c:755 #: ccdfunc.c:794
msgid "Only show statistics" msgid "Only show statistics"
msgstr "" msgstr ""
#. GET binning should be AFTER setgeometry! #. GET binning should be AFTER setgeometry!
#: ccdfunc.c:757 #: ccdfunc.c:796
msgid "Can't get current binning" msgid "Can't get current binning"
msgstr "" msgstr ""
#. Захват кадра %d\n #. Захват кадра %d\n
#: ccdfunc.c:781 #: ccdfunc.c:821
#, c-format #, c-format
msgid "Capture frame %d" msgid "Capture frame %d"
msgstr "" msgstr ""
#: ccdfunc.c:783 ccdfunc.c:857 server.c:137 #: ccdfunc.c:823 ccdfunc.c:908 server.c:198
msgid "Can't start exposition" msgid "Can't start exposition"
msgstr "" msgstr ""
#: ccdfunc.c:788 #: ccdfunc.c:828
msgid "Can't capture image" msgid "Can't capture image"
msgstr "" msgstr ""
#: ccdfunc.c:791 #: ccdfunc.c:831
msgid "Read grabbed image" msgid "Read grabbed image"
msgstr "" msgstr ""
#: ccdfunc.c:795 ccdfunc.c:870 #: ccdfunc.c:835 ccdfunc.c:921
msgid "Can't grab image" msgid "Can't grab image"
msgstr "" msgstr ""
#. %d секунд до окончания паузы\n #. %d секунд до окончания паузы\n
#: ccdfunc.c:807 client.c:288 #: ccdfunc.c:847 client.c:291
#, c-format #, c-format
msgid "%d seconds till pause ends\n" msgid "%d seconds till pause ends\n"
msgstr "" msgstr ""
#: ccdfunc.c:868 #: ccdfunc.c:919
msgid "Some error when capture" msgid "Some error when capture"
msgstr "" msgstr ""
#: server.c:185 #: server.c:246
msgid "No camera device" msgid "No camera device"
msgstr "" msgstr ""
#: client.c:275 #: client.c:278
msgid "Can't make exposition" msgid "Can't make exposition"
msgstr "" msgstr ""
#: client.c:304 #: client.c:307
msgid "Server timeout" msgid "Server timeout"
msgstr "" msgstr ""
@ -580,19 +584,19 @@ msgstr ""
msgid "Histogram conversion: %s" msgid "Histogram conversion: %s"
msgstr "" msgstr ""
#: imageview.c:640 #: imageview.c:689
msgid "Can't open OpenGL window, image preview will be inaccessible" msgid "Can't open OpenGL window, image preview will be inaccessible"
msgstr "" msgstr ""
#: imageview.c:682 #: imageview.c:731
#, c-format #, c-format
msgid "Equalization of histogram: %s" msgid "Equalization of histogram: %s"
msgstr "" msgstr ""
#: imageview.c:682 #: imageview.c:731
msgid "on" msgid "on"
msgstr "" msgstr ""
#: imageview.c:682 #: imageview.c:731
msgid "off" msgid "off"
msgstr "" msgstr ""

View File

@ -7,7 +7,7 @@
msgid "" msgid ""
msgstr "Project-Id-Version: PACKAGE VERSION\n" msgstr "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-31 16:14+0300\n" "POT-Creation-Date: 2023-12-14 16:52+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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-Type: text/plain; charset=koi8-r\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: ccdfunc.c:591 #: ccdfunc.c:630
#, c-format #, c-format
msgid "%.1f seconds till exposition ends" msgid "%.1f seconds till exposition ends"
msgstr "%.1f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ" msgstr "%.1f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ"
#. %d Ñ<>екунд до окончаниÑ<C2B8> паузы\n #. %d Ñ<>екунд до окончаниÑ<C2B8> паузы\n
#: ccdfunc.c:807 client.c:288 #: ccdfunc.c:847 client.c:291
#, c-format #, c-format
msgid "%d seconds till pause ends\n" msgid "%d seconds till pause ends\n"
msgstr "%d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n" msgstr "%d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n"
@ -31,15 +31,15 @@ msgstr "%d
msgid "Already initialized!" msgid "Already initialized!"
msgstr "õÖÅ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÎÏ!" msgstr "õÖÅ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÎÏ!"
#: cmdlnopts.c:95 #: cmdlnopts.c:96
msgid "CMOS brightness level" msgid "CMOS brightness level"
msgstr "ÕÒÏ×ÅÎØ ÑÒËÏÓÔÉ CMOS" msgstr "ÕÒÏ×ÅÎØ ÑÒËÏÓÔÉ CMOS"
#: cmdlnopts.c:94 #: cmdlnopts.c:95
msgid "CMOS gain level" msgid "CMOS gain level"
msgstr "ÕÒÏ×ÅÎØ Gain CMOS" msgstr "ÕÒÏ×ÅÎØ Gain CMOS"
#: ccdfunc.c:606 #: ccdfunc.c:645
msgid "Camera device not pointed" msgid "Camera device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÐÏÄËÌÀÞÅÎÏ" msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÐÏÄËÌÀÞÅÎÏ"
@ -47,20 +47,20 @@ msgstr "
msgid "Camera device unknown" msgid "Camera device unknown"
msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÏÐÏÚÎÁÎÏ" msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÏÐÏÚÎÁÎÏ"
#: ccdfunc.c:660 #: ccdfunc.c:699
#, c-format #, c-format
msgid "Camera model: %s" msgid "Camera model: %s"
msgstr "íÏÄÅÌØ Ó×ÅÔÏÐÒÉÅÍÎÉËÁ: %s" msgstr "íÏÄÅÌØ Ó×ÅÔÏÐÒÉÅÍÎÉËÁ: %s"
#: ccdfunc.c:788 #: ccdfunc.c:828
msgid "Can't capture image" msgid "Can't capture image"
msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ" msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ"
#: ccdfunc.c:748 #: ccdfunc.c:787
msgid "Can't change frame type" msgid "Can't change frame type"
msgstr "îÅ ÍÏÇÕ ÉÚÍÅÎÉÔØ ÔÉÐ ËÁÄÒÁ" msgstr "îÅ ÍÏÇÕ ÉÚÍÅÎÉÔØ ÔÉÐ ËÁÄÒÁ"
#: ccdfunc.c:692 #: ccdfunc.c:731
msgid "Can't configure (unsupported?)" msgid "Can't configure (unsupported?)"
msgstr "îÅ ÍÏÇÕ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ (ÏÐÃÉÑ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)" msgstr "îÅ ÍÏÇÕ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ (ÏÐÃÉÑ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)"
@ -84,32 +84,32 @@ msgstr "
msgid "Can't find wheel in plugin %s: %s" msgid "Can't find wheel in plugin %s: %s"
msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ÔÕÒÅÌÉ %s: %s" msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ÔÕÒÅÌÉ %s: %s"
#: ccdfunc.c:699 #: ccdfunc.c:738
msgid "Can't get IOport state (unsupported?)" msgid "Can't get IOport state (unsupported?)"
msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÓÏÓÔÏÑÎÉÅ ÐÏÒÔÁ I/O (ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)" msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÓÏÓÔÏÑÎÉÅ ÐÏÒÔÁ I/O (ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)"
#. GET binning should be AFTER setgeometry! #. GET binning should be AFTER setgeometry!
#: ccdfunc.c:757 #: ccdfunc.c:796
msgid "Can't get current binning" msgid "Can't get current binning"
msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÔÅËÕÝÅÅ ÚÎÁÞÅÎÉÅ ÂÉÎÎÉÎÇÁ" msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÔÅËÕÝÅÅ ÚÎÁÞÅÎÉÅ ÂÉÎÎÉÎÇÁ"
#: ccdfunc.c:477 #: ccdfunc.c:516
msgid "Can't get current focuser position" msgid "Can't get current focuser position"
msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÔÅËÕÝÕÀ ÐÏÚÉÃÉÀ ÆÏËÕÓÅÒÁ" msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÔÅËÕÝÕÀ ÐÏÚÉÃÉÀ ÆÏËÕÓÅÒÁ"
#: ccdfunc.c:470 #: ccdfunc.c:509
msgid "Can't get focuser limit positions" msgid "Can't get focuser limit positions"
msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ÆÏËÕÓÅÒÁ" msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ÆÏËÕÓÅÒÁ"
#: ccdfunc.c:563 #: ccdfunc.c:602
msgid "Can't get max wheel position" msgid "Can't get max wheel position"
msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ËÏÌÅÓÁ" msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ËÏÌÅÓÁ"
#: ccdfunc.c:795 ccdfunc.c:870 #: ccdfunc.c:835 ccdfunc.c:921
msgid "Can't grab image" msgid "Can't grab image"
msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ" msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ"
#: ccdfunc.c:495 #: ccdfunc.c:534
msgid "Can't home focuser" msgid "Can't home focuser"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÆÏËÕÓÅÒ × ÎÕÌØ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÆÏËÕÓÅÒ × ÎÕÌØ"
@ -117,15 +117,15 @@ msgstr "
msgid "Can't init mutex!" msgid "Can't init mutex!"
msgstr "îÅ ÍÏÇÕ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÍØÀÔÅËÓ!" msgstr "îÅ ÍÏÇÕ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÍØÀÔÅËÓ!"
#: client.c:275 #: client.c:278
msgid "Can't make exposition" msgid "Can't make exposition"
msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ÜËÓÐÏÚÉÃÉÀ" msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ÜËÓÐÏÚÉÃÉÀ"
#: imageview.c:640 #: imageview.c:689
msgid "Can't open OpenGL window, image preview will be inaccessible" msgid "Can't open OpenGL window, image preview will be inaccessible"
msgstr "îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÏËÎÏ OpenGL, ÏÔÏÂÒÁÖÅÎÉÅ ÂÕÄÅÔ ÎÅÄÏÓÔÕÐÎÏ" msgstr "îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÏËÎÏ OpenGL, ÏÔÏÂÒÁÖÅÎÉÅ ÂÕÄÅÔ ÎÅÄÏÓÔÕÐÎÏ"
#: ccdfunc.c:686 #: ccdfunc.c:725
#, c-format #, c-format
msgid "Can't run shutter command %s (unsupported?)" msgid "Can't run shutter command %s (unsupported?)"
msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ËÏÍÁÎÄÕ ÚÁÔ×ÏÒÁ %s (ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)" msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ËÏÍÁÎÄÕ ÚÁÔ×ÏÒÁ %s (ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)"
@ -136,141 +136,141 @@ msgstr "
msgid "Can't save file with prefix %s" msgid "Can't save file with prefix %s"
msgstr "îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ Ó ÐÒÅÆÉËÓÏÍ %s" msgstr "îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ Ó ÐÒÅÆÉËÓÏÍ %s"
#: ccdfunc.c:741 #: ccdfunc.c:780
#, c-format #, c-format
msgid "Can't set %d flushes" msgid "Can't set %d flushes"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ %d ÓÂÒÏÓÏ×" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ %d ÓÂÒÏÓÏ×"
#: ccdfunc.c:705 #: ccdfunc.c:744
msgid "Can't set IOport" msgid "Can't set IOport"
msgstr "îÅ ÍÏÇÕ ÐÏÍÅÎÑÔØ ÚÎÁÞÅÎÉÑ ÐÏÒÔÁ I/O" msgstr "îÅ ÍÏÇÕ ÐÏÍÅÎÑÔØ ÚÎÁÞÅÎÉÑ ÐÏÒÔÁ I/O"
#: ccdfunc.c:676 #: ccdfunc.c:715
#, c-format #, c-format
msgid "Can't set T to %g degC" msgid "Can't set T to %g degC"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ × %g ÇÒÁÄã" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ × %g ÇÒÁÄã"
#: ccdfunc.c:648 #: ccdfunc.c:687
msgid "Can't set active camera number" msgid "Can't set active camera number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÊ ËÁÍÅÒÙ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÊ ËÁÍÅÒÙ"
#: ccdfunc.c:456 #: ccdfunc.c:495
msgid "Can't set active focuser number" msgid "Can't set active focuser number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ÆÏËÕÓÅÒÁ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ÆÏËÕÓÅÒÁ"
#: ccdfunc.c:547 #: ccdfunc.c:586
msgid "Can't set active wheel number" msgid "Can't set active wheel number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ËÏÌÅÓÁ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ËÏÌÅÓÁ"
#: ccdfunc.c:725 server.c:251 #: ccdfunc.c:764 server.c:312
#, c-format #, c-format
msgid "Can't set binning %dx%d" msgid "Can't set binning %dx%d"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÂÉÎÎÉÎÇ %dx%d" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÂÉÎÎÉÎÇ %dx%d"
#: ccdfunc.c:751 #: ccdfunc.c:790
msgid "Can't set bit depth" msgid "Can't set bit depth"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÒÁÚÒÑÄÎÏÓÔØ áãð" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÒÁÚÒÑÄÎÏÓÔØ áãð"
#: ccdfunc.c:719 #: ccdfunc.c:758
#, c-format #, c-format
msgid "Can't set brightness to %g" msgid "Can't set brightness to %g"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g"
#: ccdfunc.c:745 #: ccdfunc.c:784
#, c-format #, c-format
msgid "Can't set exposure time to %f seconds" msgid "Can't set exposure time to %f seconds"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÜËÓÐÏÚÉÃÉÀ × %f ÓÅËÕÎÄ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÜËÓÐÏÚÉÃÉÀ × %f ÓÅËÕÎÄ"
#: ccdfunc.c:654 #: ccdfunc.c:693
msgid "Can't set fan speed" msgid "Can't set fan speed"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ×" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ×"
#: ccdfunc.c:713 #: ccdfunc.c:752
#, c-format #, c-format
msgid "Can't set gain to %g" msgid "Can't set gain to %g"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ Gain × %g" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ Gain × %g"
#: ccdfunc.c:737 server.c:252 #: ccdfunc.c:776 server.c:313
msgid "Can't set given geometry" msgid "Can't set given geometry"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÇÅÏÍÅÔÒÉÀ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÇÅÏÍÅÔÒÉÀ"
#: ccdfunc.c:497 #: ccdfunc.c:536
#, c-format #, c-format
msgid "Can't set position %g" msgid "Can't set position %g"
msgstr "îÅ ÍÏÇÕ ÉÚÍÅÎÉÔØ ÐÏÚÉÃÉÀ ÎÁ %g" msgstr "îÅ ÍÏÇÕ ÉÚÍÅÎÉÔØ ÐÏÚÉÃÉÀ ÎÁ %g"
#: ccdfunc.c:491 #: ccdfunc.c:530
#, c-format #, c-format
msgid "Can't set position %g: out of limits [%g, %g]" msgid "Can't set position %g: out of limits [%g, %g]"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÐÏÚÉÃÉÀ %g: ×ÎÅ ÐÒÅÄÅÌÏ× [%g, %g]" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÐÏÚÉÃÉÀ %g: ×ÎÅ ÐÒÅÄÅÌÏ× [%g, %g]"
#: ccdfunc.c:753 #: ccdfunc.c:792
msgid "Can't set readout speed" msgid "Can't set readout speed"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ÓÞÉÔÙ×ÁÎÉÑ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ÓÞÉÔÙ×ÁÎÉÑ"
#: ccdfunc.c:574 #: ccdfunc.c:613
#, c-format #, c-format
msgid "Can't set wheel position %d" msgid "Can't set wheel position %d"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÐÏÌÏÖÅÎÉÅ ËÏÌÅÓÁ %d" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÐÏÌÏÖÅÎÉÅ ËÏÌÅÓÁ %d"
#: ccdfunc.c:783 ccdfunc.c:857 server.c:137 #: ccdfunc.c:823 ccdfunc.c:908 server.c:198
msgid "Can't start exposition" msgid "Can't start exposition"
msgstr "îÅ ÍÏÇÕ ÎÁÞÁÔØ ÜËÓÐÏÚÉÃÉÀ" msgstr "îÅ ÍÏÇÕ ÎÁÞÁÔØ ÜËÓÐÏÚÉÃÉÀ"
#. Захват кадра %d\n #. Захват кадра %d\n
#: ccdfunc.c:781 #: ccdfunc.c:821
#, c-format #, c-format
msgid "Capture frame %d" msgid "Capture frame %d"
msgstr "úÁÈ×ÁÔ ËÁÄÒÁ %d" msgstr "úÁÈ×ÁÔ ËÁÄÒÁ %d"
#: ccdfunc.c:673 #: ccdfunc.c:712
#, c-format #, c-format
msgid "Current format: %s" msgid "Current format: %s"
msgstr "" msgstr ""
#: cmdlnopts.c:106 #: cmdlnopts.c:109
msgid "Display image in OpenGL window" msgid "Display image in OpenGL window"
msgstr "ïÔÏÂÒÁÖÅÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ × ÏËÎÅ OpenGL" msgstr "ïÔÏÂÒÁÖÅÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ × ÏËÎÅ OpenGL"
#: imageview.c:682 #: imageview.c:731
#, c-format #, c-format
msgid "Equalization of histogram: %s" msgid "Equalization of histogram: %s"
msgstr "üË×ÁÌÉÚÁÃÉÑ ÇÉÓÔÏÇÒÁÍÍÙ: %s" msgstr "üË×ÁÌÉÚÁÃÉÑ ÇÉÓÔÏÇÒÁÍÍÙ: %s"
#: ccdfunc.c:366 #: ccdfunc.c:368
msgid "Error saving file" msgid "Error saving file"
msgstr "ïÛÉÂËÁ ÓÏÈÒÁÎÅÎÉÑ ÆÁÊÌÁ" msgstr "ïÛÉÂËÁ ÓÏÈÒÁÎÅÎÉÑ ÆÁÊÌÁ"
#: ccdfunc.c:670 #: ccdfunc.c:709
#, c-format #, c-format
msgid "Field of view: %s" msgid "Field of view: %s"
msgstr "ðÏÌÅ ÚÒÅÎÉÑ: %s" msgstr "ðÏÌÅ ÚÒÅÎÉÑ: %s"
#: ccdfunc.c:357 #: ccdfunc.c:359
#, c-format #, c-format
msgid "File saved as '%s'" msgid "File saved as '%s'"
msgstr "æÁÊÌ ÓÏÈÒÁÎÅÎ ËÁË '%s'" msgstr "æÁÊÌ ÓÏÈÒÁÎÅÎ ËÁË '%s'"
#: ccdfunc.c:414 #: ccdfunc.c:453
msgid "Focuser device not pointed" msgid "Focuser device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï ÆÏËÕÓÅÒÁ ÎÅ ÕËÁÚÁÎÏ" msgstr "õÓÔÒÏÊÓÔ×Ï ÆÏËÕÓÅÒÁ ÎÅ ÕËÁÚÁÎÏ"
#: ccdfunc.c:644 #: ccdfunc.c:683
#, c-format #, c-format
msgid "Found %d cameras, you point number %d" msgid "Found %d cameras, you point number %d"
msgstr "ïÂÎÁÒÕÖÅÎÏ %d ËÁÍÅÒ, ×Ù ÕËÁÚÁÌÉ %d" msgstr "ïÂÎÁÒÕÖÅÎÏ %d ËÁÍÅÒ, ×Ù ÕËÁÚÁÌÉ %d"
#: ccdfunc.c:452 #: ccdfunc.c:491
#, c-format #, c-format
msgid "Found %d focusers, you point number %d" msgid "Found %d focusers, you point number %d"
msgstr "ïÂÎÁÒÕÖÅÎÏ %d ÆÏËÕÓÅÒÏ×, ×Ù ÕËÁÚÁÌÉ %d" msgstr "ïÂÎÁÒÕÖÅÎÏ %d ÆÏËÕÓÅÒÏ×, ×Ù ÕËÁÚÁÌÉ %d"
#: ccdfunc.c:543 #: ccdfunc.c:582
#, c-format #, c-format
msgid "Found %d wheels, you point number %d" msgid "Found %d wheels, you point number %d"
msgstr "ïÂÎÁÒÕÖÅÎÏ %d ËÏÌÅÓ, ×Ù ÕËÁÚÁÌÉ %d" msgstr "ïÂÎÁÒÕÖÅÎÏ %d ËÏÌÅÓ, ×Ù ÕËÁÚÁÌÉ %d"
#: ccdfunc.c:667 #: ccdfunc.c:706
#, c-format #, c-format
msgid "Full array: %s" msgid "Full array: %s"
msgstr "ðÏÌÎÙÊ ÆÏÒÍÁÔ: %s" msgstr "ðÏÌÎÙÊ ÆÏÒÍÁÔ: %s"
@ -280,321 +280,325 @@ msgstr "
msgid "Histogram conversion: %s" msgid "Histogram conversion: %s"
msgstr "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÇÉÓÔÏÇÒÁÍÍÙ: %s" msgstr "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÇÉÓÔÏÇÒÁÍÍÙ: %s"
#: ccdfunc.c:406 #: ccdfunc.c:445
#, c-format #, c-format
msgid "Image stat:\n" msgid "Image stat:\n"
msgstr "óÔÁÔÉÓÔÉËÁ ÐÏ ÉÚÏÂÒÁÖÅÎÉÀ: \n" msgstr "óÔÁÔÉÓÔÉËÁ ÐÏ ÉÚÏÂÒÁÖÅÎÉÀ: \n"
#: cmdlnopts.c:67 #: cmdlnopts.c:68
msgid "N flushes before exposing (default: 1)" msgid "N flushes before exposing (default: 1)"
msgstr "N ÚÁÓ×ÅÞÉ×ÁÎÉÊ ÐÅÒÅÄ ÜËÓÐÏÚÉÃÉÅÊ (ÐÏ ÕÍÏÌÞÁÎÉÀ: 1)" msgstr "N ÚÁÓ×ÅÞÉ×ÁÎÉÊ ÐÅÒÅÄ ÜËÓÐÏÚÉÃÉÅÊ (ÐÏ ÕÍÏÌÞÁÎÉÀ: 1)"
#: server.c:185 #: server.c:246
msgid "No camera device" msgid "No camera device"
msgstr "îÅ ÕËÁÚÁÎÏ ÕÓÔÒÏÊÓÔ×Ï ËÁÍÅÒÙ" msgstr "îÅ ÕËÁÚÁÎÏ ÕÓÔÒÏÊÓÔ×Ï ËÁÍÅÒÙ"
#: ccdfunc.c:613 ccdfunc.c:614 #: ccdfunc.c:652 ccdfunc.c:653
msgid "No cameras found" msgid "No cameras found"
msgstr "ëÁÍÅÒ ÎÅ ÏÂÎÁÒÕÖÅÎÏ" msgstr "ëÁÍÅÒ ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
#: ccdfunc.c:421 #: ccdfunc.c:460
msgid "No focusers found" msgid "No focusers found"
msgstr "æÏËÕÓÅÒÏ× ÎÅ ÏÂÎÁÒÕÖÅÎÏ" msgstr "æÏËÕÓÅÒÏ× ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
#: ccdfunc.c:512 #: ccdfunc.c:551
msgid "No wheels found" msgid "No wheels found"
msgstr "ôÕÒÅÌÅÊ ÎÅ ÏÂÎÁÒÕÖÅÎÏ" msgstr "ôÕÒÅÌÅÊ ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
#: ccdfunc.c:755 #: ccdfunc.c:794
msgid "Only show statistics" msgid "Only show statistics"
msgstr "ôÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÁÔÉÓÔÉËÕ" msgstr "ôÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÁÔÉÓÔÉËÕ"
#: ccdfunc.c:661 #: ccdfunc.c:700
#, c-format #, c-format
msgid "Pixel size: %g x %g" msgid "Pixel size: %g x %g"
msgstr "òÁÚÍÅÒ ÐÉËÓÅÌÑ: %g x %g" msgstr "òÁÚÍÅÒ ÐÉËÓÅÌÑ: %g x %g"
#: ccdfunc.c:791 #: ccdfunc.c:831
msgid "Read grabbed image" msgid "Read grabbed image"
msgstr "óÞÉÔÙ×ÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ" msgstr "óÞÉÔÙ×ÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ"
#: ccdfunc.c:754 #: ccdfunc.c:793
#, c-format #, c-format
msgid "Readout mode: %s" msgid "Readout mode: %s"
msgstr "òÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ: %s" msgstr "òÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ: %s"
#: client.c:304 #: client.c:307
msgid "Server timeout" msgid "Server timeout"
msgstr "ôÁÊÍÁÕÔ ÓÅÒ×ÅÒÁ" msgstr "ôÁÊÍÁÕÔ ÓÅÒ×ÅÒÁ"
#: ccdfunc.c:718 #: ccdfunc.c:757
#, c-format #, c-format
msgid "Set brightness to %g" msgid "Set brightness to %g"
msgstr "õÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g" msgstr "õÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g"
#: ccdfunc.c:655 #: ccdfunc.c:694
#, c-format #, c-format
msgid "Set fan speed to %d" msgid "Set fan speed to %d"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ× × %d" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ× × %d"
#: ccdfunc.c:712 #: ccdfunc.c:751
#, c-format #, c-format
msgid "Set gain to %g" msgid "Set gain to %g"
msgstr "õÓÔÁÎÏ×ÉÔØ Gain × %g" msgstr "õÓÔÁÎÏ×ÉÔØ Gain × %g"
#: ccdfunc.c:684 #: ccdfunc.c:723
#, c-format #, c-format
msgid "Shutter command: %s\n" msgid "Shutter command: %s\n"
msgstr "ëÏÍÁÎÄÁ ÚÁÔ×ÏÒÁ: %s\n" msgstr "ëÏÍÁÎÄÁ ÚÁÔ×ÏÒÁ: %s\n"
#: ccdfunc.c:868 #: ccdfunc.c:919
msgid "Some error when capture" msgid "Some error when capture"
msgstr "" msgstr ""
#. "Попытка Ñ<>конфигурироваÑÑŒ порт I/O как %d\n" #. "Попытка Ñ<>конфигурироваÑÑŒ порт I/O как %d\n"
#: ccdfunc.c:690 #: ccdfunc.c:729
#, c-format #, c-format
msgid "Try to configure I/O port as %d" msgid "Try to configure I/O port as %d"
msgstr "ðÏÐÙÔËÁ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ ÐÏÒÔ I/O ËÁË %d" msgstr "ðÏÐÙÔËÁ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ ÐÏÒÔ I/O ËÁË %d"
#. "Попытка запиÑ<C2B8>и %d в порт I/O\n" #. "Попытка запиÑ<C2B8>и %d в порт I/O\n"
#: ccdfunc.c:703 #: ccdfunc.c:742
#, c-format #, c-format
msgid "Try to write %d to I/O port" msgid "Try to write %d to I/O port"
msgstr "ðÏÐÙÔËÁ ÚÁÐÉÓÉ %d × ÐÏÒÔ I/O" msgstr "ðÏÐÙÔËÁ ÚÁÐÉÓÉ %d × ÐÏÒÔ I/O"
#: cmdlnopts.c:98 #: cmdlnopts.c:99
msgid "UNIX socket name" msgid "UNIX socket name"
msgstr "éÍÑ UNIX-ÓÏËÅÔÁ" msgstr "éÍÑ UNIX-ÓÏËÅÔÁ"
#: ccdfunc.c:505 #: ccdfunc.c:544
msgid "Wheel device not pointed" msgid "Wheel device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï ÔÕÒÅÌÉ ÎÅ ÕËÁÚÁÎÏ" msgstr "õÓÔÒÏÊÓÔ×Ï ÔÕÒÅÌÉ ÎÅ ÕËÁÚÁÎÏ"
#: ccdfunc.c:570 #: ccdfunc.c:609
#, c-format #, c-format
msgid "Wheel position should be from 0 to %d" msgid "Wheel position should be from 0 to %d"
msgstr "ðÏÚÉÃÉÑ ËÏÌÅÓÁ ÄÏÌÖÎÁ ÂÙÔØ ÏÔ 0 ÄÏ %d" msgstr "ðÏÚÉÃÉÑ ËÏÌÅÓÁ ÄÏÌÖÎÁ ÂÙÔØ ÏÔ 0 ÄÏ %d"
#: cmdlnopts.c:74 #: cmdlnopts.c:75
msgid "absolute (not divided by binning!) frame X0 coordinate (-1 - all " msgid "absolute (not divided by binning!) frame X0 coordinate (-1 - all "
"with overscan)" "with overscan)"
msgstr "ÁÂÓÏÌÀÔÎÁÑ (ÎÅ ÄÅÌÅÎÎÁÑ ÎÁ ÂÉÎÎÉÎÇ!) ËÏÏÒÄÉÎÁÔÁ X0 (-1 - ×ËÌÀÞÁÑ " msgstr "ÁÂÓÏÌÀÔÎÁÑ (ÎÅ ÄÅÌÅÎÎÁÑ ÎÁ ÂÉÎÎÉÎÇ!) ËÏÏÒÄÉÎÁÔÁ X0 (-1 - ×ËÌÀÞÁÑ "
"Ï×ÅÒÓËÁÎ)" "Ï×ÅÒÓËÁÎ)"
#: cmdlnopts.c:76 #: cmdlnopts.c:77
msgid "absolute frame X1 coordinate (-1 - all with overscan)" msgid "absolute frame X1 coordinate (-1 - all with overscan)"
msgstr "ÁÂÓÏÌÀÔÎÁÑ ËÏÏÒÄÉÎÁÔÁ X1 (-1 - ×ËÌÀÞÁÑ Ï×ÅÒÓËÁÎ)" msgstr "ÁÂÓÏÌÀÔÎÁÑ ËÏÏÒÄÉÎÁÔÁ X1 (-1 - ×ËÌÀÞÁÑ Ï×ÅÒÓËÁÎ)"
#: cmdlnopts.c:75 #: cmdlnopts.c:76
msgid "absolute frame Y0 coordinate (-1 - all with overscan)" msgid "absolute frame Y0 coordinate (-1 - all with overscan)"
msgstr "ÁÂÓÏÌÀÔÎÁÑ ËÏÏÒÄÉÎÁÔÁ Y0 (-1 - ×ËÌÀÞÁÑ Ï×ÅÒÓËÁÎ)" msgstr "ÁÂÓÏÌÀÔÎÁÑ ËÏÏÒÄÉÎÁÔÁ Y0 (-1 - ×ËÌÀÞÁÑ Ï×ÅÒÓËÁÎ)"
#: cmdlnopts.c:77 #: cmdlnopts.c:78
msgid "absolute frame Y1 coordinate (-1 - all with overscan)" msgid "absolute frame Y1 coordinate (-1 - all with overscan)"
msgstr "ÁÂÓÏÌÀÔÎÁÑ ËÏÏÒÄÉÎÁÔÁ Y1 (-1 - ×ËÌÀÞÁÑ Ï×ÅÒÓËÁÎ)" msgstr "ÁÂÓÏÌÀÔÎÁÑ ËÏÏÒÄÉÎÁÔÁ Y1 (-1 - ×ËÌÀÞÁÑ Ï×ÅÒÓËÁÎ)"
#: cmdlnopts.c:63 #: cmdlnopts.c:64
msgid "add records to header from given file[s]" msgid "add records to header from given file[s]"
msgstr "ÄÏÂÁ×ÉÔØ ÚÁÐÉÓÉ Ë ÛÁÐËÅ FITS-ÆÁÊÌÁ ÉÚ ÚÁÄÁÎÎÙÈ ÆÁÊÌÏ×" msgstr "ÄÏÂÁ×ÉÔØ ÚÁÐÉÓÉ Ë ÛÁÐËÅ FITS-ÆÁÊÌÁ ÉÚ ÚÁÄÁÎÎÙÈ ÆÁÊÌÏ×"
#: cmdlnopts.c:45 #: cmdlnopts.c:46
msgid "camera device number (if many: 0, 1, 2 etc)" msgid "camera device number (if many: 0, 1, 2 etc)"
msgstr "ÎÏÍÅÒ ÕÓÔÒÏÊÓÔ×Á ËÁÍÅÒÙ" msgstr "ÎÏÍÅÒ ÕÓÔÒÏÊÓÔ×Á ËÁÍÅÒÙ"
#: cmdlnopts.c:41 #: cmdlnopts.c:42
msgid "camera device plugin (e.g. devfli.so)" msgid "camera device plugin (e.g. devfli.so)"
msgstr "ÐÌÁÇÉÎ ËÁÍÅÒÙ (ÎÁÐÒÉÍÅÒ, devfli.so)" msgstr "ÐÌÁÇÉÎ ËÁÍÅÒÙ (ÎÁÐÒÉÍÅÒ, devfli.so)"
#: cmdlnopts.c:73 #: cmdlnopts.c:74
msgid "cancel current exposition" msgid "cancel current exposition"
msgstr "ÏÔÍÅÎÁ ÔÅËÕÝÅÊ ÜËÓÐÏÚÉÃÉÉ" msgstr "ÏÔÍÅÎÁ ÔÅËÕÝÅÊ ÜËÓÐÏÚÉÃÉÉ"
#: cmdlnopts.c:80 #: cmdlnopts.c:81
msgid "close shutter" msgid "close shutter"
msgstr "ÚÁËÒÙÔØ ÚÁÔ×ÏÒ" msgstr "ÚÁËÒÙÔØ ÚÁÔ×ÏÒ"
#: cmdlnopts.c:40 #: cmdlnopts.c:41
msgid "common device plugin (e.g devfli.so)" msgid "common device plugin (e.g devfli.so)"
msgstr "ÏÂÝÉÊ ÐÌÁÇÉÎ ÄÌÑ ×ÓÅÈ ÕÓÔÒÏÊÓÔ× (ÎÁÐÒÉÍÅÒ, devfli.so)" msgstr "ÏÂÝÉÊ ÐÌÁÇÉÎ ÄÌÑ ×ÓÅÈ ÕÓÔÒÏÊÓÔ× (ÎÁÐÒÉÍÅÒ, devfli.so)"
#: cmdlnopts.c:87 #: cmdlnopts.c:88
msgid "configure I/O port pins to given value (decimal number, pin1 is LSB, " msgid "configure I/O port pins to given value (decimal number, pin1 is LSB, "
"1 == output, 0 == input)" "1 == output, 0 == input)"
msgstr "ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ ÐÏÒÔ I/O × ÚÁÄÁÎÎÏÅ ÓÏÓÔÏÑÎÉÅ (ÄÅÓÑÔÉÞÎÏÅ ÞÉÓÌÏ, " msgstr "ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ ÐÏÒÔ I/O × ÚÁÄÁÎÎÏÅ ÓÏÓÔÏÑÎÉÅ (ÄÅÓÑÔÉÞÎÏÅ ÞÉÓÌÏ, "
"pin1 - ÍÌÁÄÛÉÊ ÂÉÔ, 1 - ×ÙÈÏÄ, 0 - ×ÈÏÄ)" "pin1 - ÍÌÁÄÛÉÊ ÂÉÔ, 1 - ×ÙÈÏÄ, 0 - ×ÈÏÄ)"
#: cmdlnopts.c:53 #: cmdlnopts.c:54
msgid "fast readout mode" msgid "fast readout mode"
msgstr "ÂÙÓÔÒÙÊ ÒÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ" msgstr "ÂÙÓÔÒÙÊ ÒÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ"
#: cmdlnopts.c:46 #: cmdlnopts.c:47
msgid "filter wheel device number (if many: 0, 1, 2 etc)" msgid "filter wheel device number (if many: 0, 1, 2 etc)"
msgstr "ÎÏÍÅÒ ÕÓÔÒÏÊÓÔ×Á ÔÕÒÅÌÉ" msgstr "ÎÏÍÅÒ ÕÓÔÒÏÊÓÔ×Á ÔÕÒÅÌÉ"
#: cmdlnopts.c:47 #: cmdlnopts.c:48
msgid "focuser device number (if many: 0, 1, 2 etc)" msgid "focuser device number (if many: 0, 1, 2 etc)"
msgstr "ÎÏÍÅÒ ÕÓÔÒÏÊÓÔ×Á ÆÏËÕÓÅÒÁ" msgstr "ÎÏÍÅÒ ÕÓÔÒÏÊÓÔ×Á ÆÏËÕÓÅÒÁ"
#: cmdlnopts.c:42 #: cmdlnopts.c:43
msgid "focuser device plugin (e.g. devzwo.so)" msgid "focuser device plugin (e.g. devzwo.so)"
msgstr "ÐÌÁÇÉÎ ÆÏËÕÓÅÒÁ (ÎÁÐÒÉÍÅÒ, devzwo.so)" msgstr "ÐÌÁÇÉÎ ÆÏËÕÓÅÒÁ (ÎÁÐÒÉÍÅÒ, devzwo.so)"
#: cmdlnopts.c:83 #: cmdlnopts.c:84
msgid "get value of I/O port pins" msgid "get value of I/O port pins"
msgstr "ÐÏÌÕÞÉÔØ ÚÎÁÞÅÎÉÅ ÐÏÒÔÁ I/O" msgstr "ÐÏÌÕÞÉÔØ ÚÎÁÞÅÎÉÅ ÐÏÒÔÁ I/O"
#: cmdlnopts.c:68 #: cmdlnopts.c:69
msgid "horizontal binning to N pixels" msgid "horizontal binning to N pixels"
msgstr "ÇÏÒÉÚÏÎÔÁÌØÎÙÊ ÂÉÎÎÉÎÇ × N ÐÉËÓÅÌÅÊ" msgstr "ÇÏÒÉÚÏÎÔÁÌØÎÙÊ ÂÉÎÎÉÎÇ × N ÐÉËÓÅÌÅÊ"
#: cmdlnopts.c:59 #: cmdlnopts.c:60
msgid "instrument name" msgid "instrument name"
msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÉÂÏÒÁ" msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÉÂÏÒÁ"
#: cmdlnopts.c:44 #: cmdlnopts.c:45
msgid "list connected devices" msgid "list connected devices"
msgstr "ÓÐÉÓÏË ÐÏÄËÌÀÞÅÎÎÙÈ ÕÓÔÒÏÊÓÔ×" msgstr "ÓÐÉÓÏË ÐÏÄËÌÀÞÅÎÎÙÈ ÕÓÔÒÏÊÓÔ×"
#: cmdlnopts.c:99 #: cmdlnopts.c:100
msgid "local INET socket port" msgid "local INET socket port"
msgstr "ÐÏÒÔ ÌÏËÁÌØÎÏÇÏ ÓÅÔÅ×ÏÇÏ ÓÏËÅÔÁ" msgstr "ÐÏÒÔ ÌÏËÁÌØÎÏÇÏ ÓÅÔÅ×ÏÇÏ ÓÏËÅÔÁ"
#: cmdlnopts.c:100 #: cmdlnopts.c:101
#, fuzzy #, fuzzy
msgid "local INET socket port to send/receive images" msgid "local INET socket port to send/receive images"
msgstr "ÐÏÒÔ ÌÏËÁÌØÎÏÇÏ ÓÅÔÅ×ÏÇÏ ÓÏËÅÔÁ" msgstr "ÐÏÒÔ ÌÏËÁÌØÎÏÇÏ ÓÅÔÅ×ÏÇÏ ÓÏËÅÔÁ"
#: cmdlnopts.c:97 #: cmdlnopts.c:98
msgid "logging file name (if run as server)" msgid "logging file name (if run as server)"
msgstr "ÉÍÑ ÆÁÊÌÁ ÌÏÇÇÉÒÏ×ÁÎÉÑ (ÅÓÌÉ ÚÁÐÕÝÅÎ ÓÅÒ×ÅÒ)" msgstr "ÉÍÑ ÆÁÊÌÁ ÌÏÇÇÉÒÏ×ÁÎÉÑ (ÅÓÌÉ ÚÁÐÕÝÅÎ ÓÅÒ×ÅÒ)"
#: cmdlnopts.c:71 #: cmdlnopts.c:72
msgid "make pause for N seconds between expositions" msgid "make pause for N seconds between expositions"
msgstr "ÐÁÕÚÁ × N ÓÅËÕÎÄ ÍÅÖÄÕ ÜËÓÐÏÚÉÃÉÑÍÉ" msgstr "ÐÁÕÚÁ × N ÓÅËÕÎÄ ÍÅÖÄÕ ÜËÓÐÏÚÉÃÉÑÍÉ"
#: cmdlnopts.c:70 #: cmdlnopts.c:71
msgid "make series of N frames" msgid "make series of N frames"
msgstr "ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÉÚ N ËÁÄÒÏ×" msgstr "ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÉÚ N ËÁÄÒÏ×"
#: cmdlnopts.c:89 #: cmdlnopts.c:90
msgid "move focuser to absolute position, mm" msgid "move focuser to absolute position, mm"
msgstr "ÐÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓÅÒ × ÁÂÓÏÌÀÔÎÏÅ ÐÏÌÏÖÅÎÉÅ, ÍÍ" msgstr "ÐÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓÅÒ × ÁÂÓÏÌÀÔÎÏÅ ÐÏÌÏÖÅÎÉÅ, ÍÍ"
#: cmdlnopts.c:90 #: cmdlnopts.c:91
msgid "move focuser to relative position, mm (only for standalone)" msgid "move focuser to relative position, mm (only for standalone)"
msgstr "ÐÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓÅÒ × ÏÔÎÏÓÉÔÅÌØÎÏÅ ÐÏÌÏÖÅÎÉÅ, ÍÍ (ÎÅ ÄÌÑ ÓÅÒ×ÅÒ/" msgstr "ÐÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓÅÒ × ÏÔÎÏÓÉÔÅÌØÎÏÅ ÐÏÌÏÖÅÎÉÅ, ÍÍ (ÎÅ ÄÌÑ ÓÅÒ×ÅÒ/"
"ËÌÉÅÎÔ)" "ËÌÉÅÎÔ)"
#: cmdlnopts.c:84 #: cmdlnopts.c:85
msgid "move stepper motor asynchronous" msgid "move stepper motor asynchronous"
msgstr "ÁÓÉÎÈÒÏÎÎÏÅ Ä×ÉÖÅÎÉÅ ÛÁÇÏ×ÏÇÏ Ä×ÉÇÁÔÅÌÑ" msgstr "ÁÓÉÎÈÒÏÎÎÏÅ Ä×ÉÖÅÎÉÅ ÛÁÇÏ×ÏÇÏ Ä×ÉÇÁÔÅÌÑ"
#: cmdlnopts.c:51 #: cmdlnopts.c:52
msgid "not open shutter, when exposing (\"dark frames\")" msgid "not open shutter, when exposing (\"dark frames\")"
msgstr "ÎÅ ÏÔËÒÙ×ÁÔØ ÚÁÔ×ÏÒ ÐÒÉ ÜËÓÐÏÚÉÃÉÉ (\"ÔÅÍÎÏ×ÙÅ\")" msgstr "ÎÅ ÏÔËÒÙ×ÁÔØ ÚÁÔ×ÏÒ ÐÒÉ ÜËÓÐÏÚÉÃÉÉ (\"ÔÅÍÎÏ×ÙÅ\")"
#: cmdlnopts.c:60 #: cmdlnopts.c:61
msgid "object name" msgid "object name"
msgstr "ÎÁÚ×ÁÎÉÅ ÏÂßÅËÔÁ" msgstr "ÎÁÚ×ÁÎÉÅ ÏÂßÅËÔÁ"
#: cmdlnopts.c:58 #: cmdlnopts.c:59
msgid "object type (neon, object, flat etc)" msgid "object type (neon, object, flat etc)"
msgstr "ÔÉÐ ÏÂßÅËÔÁ (neon, object, flat É Ô.Ä.)" msgstr "ÔÉÐ ÏÂßÅËÔÁ (neon, object, flat É Ô.Ä.)"
#: cmdlnopts.c:61 #: cmdlnopts.c:62
msgid "observers' names" msgid "observers' names"
msgstr "ÉÍÅÎÁ ÎÁÂÌÀÄÁÔÅÌÅÊ" msgstr "ÉÍÅÎÁ ÎÁÂÌÀÄÁÔÅÌÅÊ"
#: cmdlnopts.c:62 #: cmdlnopts.c:63
msgid "observing program name" msgid "observing program name"
msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ" msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ"
#: imageview.c:682 #: imageview.c:731
msgid "off" msgid "off"
msgstr "×ÙËÌ" msgstr "×ÙËÌ"
#: imageview.c:682 #: imageview.c:731
msgid "on" msgid "on"
msgstr "×ËÌ" msgstr "×ËÌ"
#: cmdlnopts.c:79 #: cmdlnopts.c:80
msgid "open shutter" msgid "open shutter"
msgstr "ÏÔËÒÙÔØ ÚÁÔ×ÏÒ" msgstr "ÏÔËÒÙÔØ ÚÁÔ×ÏÒ"
#: cmdlnopts.c:64 #: cmdlnopts.c:65
msgid "output file name" msgid "output file name"
msgstr "ÉÍÑ ÆÁÊÌÁ" msgstr "ÉÍÑ ÆÁÊÌÁ"
#: cmdlnopts.c:102 #: cmdlnopts.c:103
msgid "passive viewer (only get last images)" msgid "passive viewer (only get last images)"
msgstr "" msgstr ""
#: cmdlnopts.c:57 #: cmdlnopts.c:58
msgid "program author" msgid "program author"
msgstr "Á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ" msgstr "Á×ÔÏÒ ÐÒÏÇÒÁÍÍÙ"
#: cmdlnopts.c:103 #: cmdlnopts.c:104
msgid "restart image server" msgid "restart image server"
msgstr "ÐÅÒÅÚÁÐÕÓË ÓÅÒ×ÅÒÁ" msgstr "ÐÅÒÅÚÁÐÕÓË ÓÅÒ×ÅÒÁ"
#: cmdlnopts.c:49 #: cmdlnopts.c:50
msgid "rewrite output file if exists" msgid "rewrite output file if exists"
msgstr "ÐÅÒÅÚÁÐÉÓØ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ" msgstr "ÐÅÒÅÚÁÐÉÓØ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ"
#: cmdlnopts.c:101 #: cmdlnopts.c:102
msgid "run as client" msgid "run as client"
msgstr "ÚÁÐÕÓÔÉÔØ ËÌÉÅÎÔ" msgstr "ÚÁÐÕÓÔÉÔØ ËÌÉÅÎÔ"
#: cmdlnopts.c:82 #: cmdlnopts.c:83
msgid "run exposition on HIGH @ pin5 I/O port" msgid "run exposition on HIGH @ pin5 I/O port"
msgstr "" msgstr ""
#: cmdlnopts.c:81 #: cmdlnopts.c:82
msgid "run exposition on LOW @ pin5 I/O port" msgid "run exposition on LOW @ pin5 I/O port"
msgstr "" msgstr ""
#: cmdlnopts.c:52 #: cmdlnopts.c:53
msgid "run in 8-bit mode" msgid "run in 8-bit mode"
msgstr "8-ÂÉÔÎÙÊ ÒÅÖÉÍ" msgstr "8-ÂÉÔÎÙÊ ÒÅÖÉÍ"
#: cmdlnopts.c:54 #: cmdlnopts.c:55
msgid "set CCD temperature to given value (degr C)" msgid "set CCD temperature to given value (degr C)"
msgstr "ÕÓÔÁÎÏ×ÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ Ó×ÅÔÏÐÒÉÅÍÎÉËÁ (ÇÒÁÄã)" msgstr "ÕÓÔÁÎÏ×ÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ Ó×ÅÔÏÐÒÉÅÍÎÉËÁ (ÇÒÁÄã)"
#: cmdlnopts.c:86 #: cmdlnopts.c:87
msgid "set I/O port pins to given value (decimal number, pin1 is LSB)" msgid "set I/O port pins to given value (decimal number, pin1 is LSB)"
msgstr "ÕÓÔÁÎÏ×ÉÔØ ÐÏÒÔ I/O (ÄÅÓÑÔÉÞÎÏÅ ÞÉÓÌÏ, pin1 - ÍÌÁÄÛÉÊ ÂÉÔ)" msgstr "ÕÓÔÁÎÏ×ÉÔØ ÐÏÒÔ I/O (ÄÅÓÑÔÉÞÎÏÅ ÞÉÓÌÏ, pin1 - ÍÌÁÄÛÉÊ ÂÉÔ)"
#: cmdlnopts.c:72 #: cmdlnopts.c:73
msgid "set exposure time to given value (seconds!)" msgid "set exposure time to given value (seconds!)"
msgstr "ÕÓÔÁÎÏ×ÉÔØ ×ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ (ÓÅËÕÎÄÙ!)" msgstr "ÕÓÔÁÎÏ×ÉÔØ ×ÒÅÍÑ ÜËÓÐÏÚÉÃÉÉ (ÓÅËÕÎÄÙ!)"
#: cmdlnopts.c:55 #: cmdlnopts.c:56
msgid "set fan speed (0 - off, 1 - low, 2 - high)" msgid "set fan speed (0 - off, 1 - low, 2 - high)"
msgstr "ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÁ (0 - ×ÙËÌ, 1 - ÎÉÚËÁÑ, 2 - ×ÙÓÏËÁÑ)" msgstr "ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÁ (0 - ×ÙËÌ, 1 - ÎÉÚËÁÑ, 2 - ×ÙÓÏËÁÑ)"
#: cmdlnopts.c:92 #: cmdlnopts.c:93
msgid "set wheel position" msgid "set wheel position"
msgstr "ÕÓÔÁÎÏ×ÉÔØ ÐÏÌÏÖÅÎÉÅ ËÏÌÅÓÁ" msgstr "ÕÓÔÁÎÏ×ÉÔØ ÐÏÌÏÖÅÎÉÅ ËÏÌÅÓÁ"
#: cmdlnopts.c:48 #: cmdlnopts.c:106
msgid "shared memory (with image data) key (default: 7777777"
msgstr ""
#: cmdlnopts.c:49
msgid "show this help" msgid "show this help"
msgstr "ÏÔÏÂÒÁÚÉÔØ ÜÔÕ ÓÐÒÁ×ËÕ" msgstr "ÏÔÏÂÒÁÚÉÔØ ÜÔÕ ÓÐÒÁ×ËÕ"
#: cmdlnopts.c:50 #: cmdlnopts.c:51
msgid "verbose level (-V - messages, -VV - debug, -VVV - all shit)" msgid "verbose level (-V - messages, -VV - debug, -VVV - all shit)"
msgstr "ÕÒÏ×ÅÎØ ÂÏÌÔÌÉ×ÏÓÔÉ (-V - ÓÏÏÂÝÅÎÉÑ, -VV - ÏÔÌÁÄËÁ, -VVV - ×ÓÅ)" msgstr "ÕÒÏ×ÅÎØ ÂÏÌÔÌÉ×ÏÓÔÉ (-V - ÓÏÏÂÝÅÎÉÑ, -VV - ÏÔÌÁÄËÁ, -VVV - ×ÓÅ)"
#: cmdlnopts.c:69 #: cmdlnopts.c:70
msgid "vertical binning to N pixels" msgid "vertical binning to N pixels"
msgstr "×ÅÒÔÉËÁÌØÎÙÊ ÂÉÎÎÉÎÇ × N ÐÉËÓÅÌÅÊ" msgstr "×ÅÒÔÉËÁÌØÎÙÊ ÂÉÎÎÉÎÇ × N ÐÉËÓÅÌÅÊ"
#: cmdlnopts.c:65 #: cmdlnopts.c:66
msgid "wait while exposition ends" msgid "wait while exposition ends"
msgstr "ÖÄÁÔØ, ÐÏËÁ ÎÅ ËÏÎÞÉÔÓÑ ÜËÓÐÏÚÉÃÉÑ" msgstr "ÖÄÁÔØ, ÐÏËÁ ÎÅ ËÏÎÞÉÔÓÑ ÜËÓÐÏÚÉÃÉÑ"
#: cmdlnopts.c:43 #: cmdlnopts.c:44
msgid "wheel device plugin (e.g. devdummy.so)" msgid "wheel device plugin (e.g. devdummy.so)"
msgstr "ÐÌÁÇÉÎ ÕÓÔÒÏÊÓÔ×Á ÔÕÒÅÌÉ (ÎÁÐÒÉÍÅÒ, devdummy.so)" msgstr "ÐÌÁÇÉÎ ÕÓÔÒÏÊÓÔ×Á ÔÕÒÅÌÉ (ÎÁÐÒÉÍÅÒ, devdummy.so)"

113
server.c
View File

@ -22,6 +22,8 @@
#include <poll.h> #include <poll.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <usefull_macros.h> #include <usefull_macros.h>
@ -46,6 +48,9 @@ static float focmaxpos = 0., focminpos = 0.; // focuser extremal positions
static int wmaxpos = 0.; // wheel max pos static int wmaxpos = 0.; // wheel max pos
static float tremain = 0.; // time when capture done static float tremain = 0.; // time when capture done
// IPC key for shared memory
static key_t shmkey = IPC_PRIVATE;
typedef struct{ typedef struct{
const char *key; const char *key;
const char *help; const char *help;
@ -88,6 +93,7 @@ strpair allcommands[] = {
{ CMD_PROGRAM, "FITS 'PROG-ID' field" }, { CMD_PROGRAM, "FITS 'PROG-ID' field" },
{ CMD_RESTART, "restart server" }, { CMD_RESTART, "restart server" },
{ CMD_REWRITE, "rewrite file (if give `filename`, not `filenameprefix`" }, { CMD_REWRITE, "rewrite file (if give `filename`, not `filenameprefix`" },
{ CMD_SHMEMKEY, "get shared memory key" },
{ CMD_SHUTTER, "camera shutter's operations" }, { CMD_SHUTTER, "camera shutter's operations" },
{ CMD_CAMTEMPER, "camera chip temperature" }, { CMD_CAMTEMPER, "camera chip temperature" },
{ CMD_TREMAIN, "time (in seconds) of exposition remained" }, { CMD_TREMAIN, "time (in seconds) of exposition remained" },
@ -112,16 +118,71 @@ static void unlock(){
if(pthread_mutex_unlock(&locmutex)) ERR("Can't unlock mutex"); if(pthread_mutex_unlock(&locmutex)) ERR("Can't unlock mutex");
} }
static IMG ima = {0}; 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(){ static void fixima(){
FNAME(); FNAME();
if(!camera) return; if(!camera) return;
int raw_width = curformat.w / GP->hbin, raw_height = curformat.h / GP->vbin; int raw_width = curformat.w / GP->hbin, raw_height = curformat.h / GP->vbin;
if(!ima.data) ima.data = MALLOC(uint16_t, camera->array.h * camera->array.w); // allocate memory for largest possible image
if(ima.data && raw_width == ima.w && raw_height == ima.h) return; // all OK 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
DBG("curformat: %dx%d", curformat.w, curformat.h); DBG("curformat: %dx%d", curformat.w, curformat.h);
ima.h = raw_height; ima->h = raw_height;
ima.w = raw_width; ima->w = raw_width;
if(!camera->getbitpix(&ima->bitpix)) ima->bitpix = 16;
if(ima->bitpix < 8 || ima->bitpix > 16) ima->bitpix = 16; // use maximum in any strange cases
ima->bytelen = raw_height * raw_width * getNbytes(ima);
DBG("new image: %dx%d", raw_width, raw_height); DBG("new image: %dx%d", raw_width, raw_height);
} }
@ -155,19 +216,19 @@ static inline void cameracapturestate(){ // capturing - wait for exposition ends
TIMESTAMP("Capture ready"); TIMESTAMP("Capture ready");
tremain = 0.; tremain = 0.;
// now save frame // now save frame
if(!ima.data) LOGERR("Can't save image: not initialized"); if(!ima->data) LOGERR("Can't save image: not initialized");
else{ else{
TIMESTAMP("start capture"); TIMESTAMP("start capture");
if(!camera->capture(&ima)){ if(!camera->capture(ima)){
LOGERR("Can't capture image"); LOGERR("Can't capture image");
camstate = CAMERA_ERROR; camstate = CAMERA_ERROR;
return; return;
}else{ }else{
if(lastfile){ if(lastfile){
TIMESTAMP("Calc stat"); TIMESTAMP("Calc stat");
calculate_stat(&ima); calculate_stat(ima);
} }
if(saveFITS(&ima, &lastfile)){ if(saveFITS(ima, &lastfile)){
DBG("LAST file name changed"); DBG("LAST file name changed");
} }
TIMESTAMP("Image saved"); TIMESTAMP("Image saved");
@ -287,6 +348,15 @@ static hresult restarthandler(_U_ int fd, _U_ const char *key, _U_ const char *v
/******************************************************************************* /*******************************************************************************
*************************** CCD/CMOS handlers ********************************* *************************** CCD/CMOS handlers *********************************
******************************************************************************/ ******************************************************************************/
// image size
static hresult imsizehandler(int fd, const char *key, _U_ const char *val){
char buf[64];
// send image width/height in pixels
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_SILENCE;
}
static hresult camlisthandler(int fd, _U_ const char *key, _U_ const char *val){ static hresult camlisthandler(int fd, _U_ const char *key, _U_ const char *val){
char buf[BUFSIZ], modname[256]; char buf[BUFSIZ], modname[256];
for(int i = 0; i < camera->Ndevices; ++i){ for(int i = 0; i < camera->Ndevices; ++i){
@ -910,11 +980,11 @@ static hresult helphandler(int fd, _U_ const char *key, _U_ const char *val){
return RESULT_SILENCE; return RESULT_SILENCE;
} }
static hresult imsizehandler(int fd, const char *key, _U_ const char *val){ // shared memory key
static hresult shmemkeyhandler(int fd, _U_ const char *key, _U_ const char *val){
char buf[64]; char buf[64];
// send image width/height in pixels if(shmkey == IPC_PRIVATE) return RESULT_FAIL;
if(0 == strcmp(key, CMD_IMHEIGHT)) snprintf(buf, 63, CMD_IMHEIGHT "=%d", ima.h); snprintf(buf, 63, CMD_SHMEMKEY "=%d", shmkey);
else snprintf(buf, 63, CMD_IMWIDTH "=%d", ima.w);
if(!sendstrmessage(fd, buf)) return RESULT_DISCONNECTED; if(!sendstrmessage(fd, buf)) return RESULT_DISCONNECTED;
return RESULT_SILENCE; return RESULT_SILENCE;
} }
@ -971,6 +1041,7 @@ static handleritem items[] = {
{chkcc, formathandler, CMD_FRAMEMAX}, {chkcc, formathandler, CMD_FRAMEMAX},
{chkcc, nflusheshandler, CMD_NFLUSHES}, {chkcc, nflusheshandler, CMD_NFLUSHES},
{chkcam, expstatehandler, CMD_EXPSTATE}, {chkcam, expstatehandler, CMD_EXPSTATE},
{chktrue,shmemkeyhandler, CMD_SHMEMKEY},
{chktrue,imsizehandler, CMD_IMWIDTH}, {chktrue,imsizehandler, CMD_IMWIDTH},
{chktrue,imsizehandler, CMD_IMHEIGHT}, {chktrue,imsizehandler, CMD_IMHEIGHT},
{chkcc, nameprefixhandler, CMD_FILENAMEPREFIX}, {chkcc, nameprefixhandler, CMD_FILENAMEPREFIX},
@ -998,6 +1069,17 @@ static handleritem items[] = {
#define CLBUFSZ BUFSIZ #define CLBUFSZ BUFSIZ
// send image as raw data
static void sendimage(int client){
if(ima->h < 1 || ima->w < 1) return;
senddata(client, ima, sizeof(IMG));
senddata(client, ima->data, ima->bytelen);
/*void *mem = malloc(ima->bytelen);
memcpy(mem, ima->data, ima->bytelen);
senddata(client, mem, ima->bytelen);
FREE(mem);*/
}
void server(int sock, int imsock){ void server(int sock, int imsock){
DBG("sockfd=%d, imsockfd=%d", sock, imsock); DBG("sockfd=%d, imsockfd=%d", sock, imsock);
if(sock < 0) ERRX("server(): need at least command socket fd"); if(sock < 0) ERRX("server(): need at least command socket fd");
@ -1046,9 +1128,7 @@ void server(int sock, int imsock){
DBG("client=%d", client); DBG("client=%d", client);
if(client > -1){ if(client > -1){
DBG("client fd: %d", client); DBG("client fd: %d", client);
// send image as raw data w*h*2 sendimage(client);
if(ima.data && ima.h > 0 && ima.w > 0)
sendimage(client, ima.data, 2*ima.h*ima.w);
close(client); close(client);
DBG("%d closed", client); DBG("%d closed", client);
}else{WARN("accept()"); DBG("disconnected");} }else{WARN("accept()"); DBG("disconnected");}
@ -1075,6 +1155,7 @@ void server(int sock, int imsock){
} }
// process some data & send messages to ALL // process some data & send messages to ALL
if(camstate == CAMERA_FRAMERDY || camstate == CAMERA_ERROR){ if(camstate == CAMERA_FRAMERDY || camstate == CAMERA_ERROR){
if(camstate == CAMERA_FRAMERDY) ima->timestamp = time(NULL); // set timestamp
char buff[PATH_MAX+32]; char buff[PATH_MAX+32];
snprintf(buff, PATH_MAX, CMD_EXPSTATE "=%d", camstate); snprintf(buff, PATH_MAX, CMD_EXPSTATE "=%d", camstate);
DBG("Send %s to %d clients", buff, nfd - 2); DBG("Send %s to %d clients", buff, nfd - 2);

View File

@ -40,6 +40,8 @@ char *makeabspath(const char *path, int shouldbe);
// get image size in pixels // get image size in pixels
#define CMD_IMWIDTH "imwidth" #define CMD_IMWIDTH "imwidth"
#define CMD_IMHEIGHT "imheight" #define CMD_IMHEIGHT "imheight"
// get shared memory key
#define CMD_SHMEMKEY "shmemkey"
// CCD/CMOS // CCD/CMOS
#define CMD_CAMLIST "camlist" #define CMD_CAMLIST "camlist"

View File

@ -161,13 +161,13 @@ int start_socket(int isserver){
} }
// send image data to client // send image data to client
int sendimage(int fd, uint16_t *data, int l){ int senddata(int fd, void *data, size_t l){
DBG("fd=%d, l=%d", fd, l); DBG("fd=%d, l=%zd", fd, l);
if(fd < 1 || !data || l < 1) return TRUE; // empty message if(fd < 1 || !data || l < 1) return TRUE; // empty message
DBG("send new image (size=%d) to fd %d", l, fd); DBG("send new data (size=%zd) to fd %d", l, fd);
//strncpy((char*)data, "TEST image data\n", 17); //strncpy((char*)data, "TEST image data\n", 17);
//l = 16; //l = 16;
if(l != send(fd, data, l, MSG_NOSIGNAL)){ if(l != (size_t)send(fd, data, l, MSG_NOSIGNAL)){
WARN("write()"); WARN("write()");
LOGWARN("write()"); LOGWARN("write()");
return FALSE; return FALSE;
@ -183,7 +183,7 @@ int sendmessage(int fd, const char *msg, int l){
static char *tmpbuf = NULL; static char *tmpbuf = NULL;
static int buflen = 0; static int buflen = 0;
if(l + 1 > buflen){ if(l + 1 > buflen){
buflen += 1024; buflen = 1024 * (1 + l/1024);
tmpbuf = realloc(tmpbuf, buflen); tmpbuf = realloc(tmpbuf, buflen);
} }
DBG("send to fd %d: %s [%d]", fd, msg, l); DBG("send to fd %d: %s [%d]", fd, msg, l);

View File

@ -71,7 +71,7 @@ typedef struct{
int open_socket(int isserver, char *path, int isnet); int open_socket(int isserver, char *path, int isnet);
int start_socket(int server); int start_socket(int server);
int sendimage(int fd, uint16_t *data, int l); int senddata(int fd, void *data, size_t l);
int sendmessage(int fd, const char *msg, int l); int sendmessage(int fd, const char *msg, int l);
int sendstrmessage(int fd, const char *msg); int sendstrmessage(int fd, const char *msg);
char *get_keyval(char *keyval); char *get_keyval(char *keyval);