rebuild code to run image viewer in standalone or client mode (not implemented yet)

This commit is contained in:
Edward Emelianov 2023-02-07 17:01:06 +03:00
parent 089370d276
commit 764aa50ccc
10 changed files with 428 additions and 339 deletions

203
ccdfunc.c
View File

@ -19,6 +19,7 @@
#include <dlfcn.h> // dlopen/close #include <dlfcn.h> // dlopen/close
#include <fitsio.h> #include <fitsio.h>
#include <math.h> #include <math.h>
#include <signal.h> // pthread_kill
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -424,11 +425,10 @@ int startFocuser(void **dlh){
return TRUE; return TRUE;
} }
void focclose(void *dlh){ void focclose(){
if(!dlh || !focuser) return; if(!focuser) return;
focuser->close(); focuser->close();
focuser = NULL; focuser = NULL;
//dlclose(dlh);
} }
/* /*
@ -497,7 +497,7 @@ void focusers(){
if(!focuser->setAbsPos(GP->async, tagpos)) WARNX(_("Can't set position %g"), tagpos); if(!focuser->setAbsPos(GP->async, tagpos)) WARNX(_("Can't set position %g"), tagpos);
} }
retn: retn:
focclose(dlh); focclose();
} }
int startWheel(void **dlh){ int startWheel(void **dlh){
@ -516,11 +516,10 @@ int startWheel(void **dlh){
return TRUE; return TRUE;
} }
void closewheel(void *dlh){ void closewheel(){
if(!dlh || !wheel) return; if(!wheel) return;
wheel->close(); wheel->close();
wheel = NULL; wheel = NULL;
//dlclose(dlh);
} }
/* /*
@ -574,7 +573,7 @@ void wheels(){
if(!wheel->setPos(pos)) if(!wheel->setPos(pos))
WARNX(_("Can't set wheel position %d"), pos); WARNX(_("Can't set wheel position %d"), pos);
retn: retn:
closewheel(dlh); closewheel();
} }
/* /*
static void closeall(){ static void closeall(){
@ -617,24 +616,19 @@ int startCCD(void **dlh){
return TRUE; return TRUE;
} }
void closecam(void *dlh){ void closecam(){
if(!dlh || !camera) return; if(!camera) return;
DBG("Close cam"); DBG("Close cam");
camera->close(); camera->close();
camera = NULL; camera = NULL;
DBG("close dlh");
//dlclose(dlh);
} }
/* // make base settings; return TRUE if all OK
* Find CCDs and work with each of them int prepare_ccds(){
*/
void ccds(){
FNAME(); FNAME();
float tmpf; int rtn = FALSE;
int tmpi;
void *dlh = NULL; void *dlh = NULL;
if(!startCCD(&dlh)) return; if(!startCCD(&dlh)) return FALSE;
if(GP->listdevices){ if(GP->listdevices){
for(int i = 0; i < camera->Ndevices; ++i){ for(int i = 0; i < camera->Ndevices; ++i){
if(!camera->setDevNo(i)) continue; if(!camera->setDevNo(i)) continue;
@ -681,6 +675,7 @@ void ccds(){
WARNX(_("Can't set T to %g degC"), GP->temperature); WARNX(_("Can't set T to %g degC"), GP->temperature);
verbose(3, "SetT=%.1f", GP->temperature); verbose(3, "SetT=%.1f", GP->temperature);
} }
float tmpf;
if(camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f", tmpf); if(camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f", tmpf);
if(camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f", tmpf); if(camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f", tmpf);
if(GP->shtr_cmd > -1 && GP->shtr_cmd < SHUTTER_AMOUNT){ if(GP->shtr_cmd > -1 && GP->shtr_cmd < SHUTTER_AMOUNT){
@ -695,6 +690,7 @@ void ccds(){
if(!camera->confio(GP->confio)) if(!camera->confio(GP->confio))
WARNX(_("Can't configure (unsupported?)")); WARNX(_("Can't configure (unsupported?)"));
} }
int tmpi;
if(GP->getio){ if(GP->getio){
if(camera->getio(&tmpi)) if(camera->getio(&tmpi))
verbose(0, "CCDIOPORT=0x%02X\n", tmpi); verbose(0, "CCDIOPORT=0x%02X\n", tmpi);
@ -761,23 +757,23 @@ void ccds(){
if(!camera->getbin(&GP->hbin, &GP->vbin)) // GET binning should be AFTER setgeometry! if(!camera->getbin(&GP->hbin, &GP->vbin)) // GET binning should be AFTER setgeometry!
WARNX(_("Can't get current binning")); WARNX(_("Can't get current binning"));
verbose(2, "Binning: %d x %d", GP->hbin, GP->vbin); verbose(2, "Binning: %d x %d", GP->hbin, GP->vbin);
int raw_width = fmt.w / GP->hbin, raw_height = fmt.h / GP->vbin; rtn = TRUE;
retn:
if(!rtn) closecam();
return rtn;
}
/*
* Main CCD process in standalone mode without viewer: get N images and save them
*/
void ccds(){
FNAME();
frameformat fmt = camera->geometry;
int raw_width = fmt.w / GP->hbin, raw_height = fmt.h / GP->vbin;
DBG("w=%d, h=%d", raw_width, raw_height);
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};
#ifdef IMAGEVIEW
windowData *mainwin = NULL;
if(GP->showimage){
imageview_init();
DBG("Create new win");
mainwin = createGLwin("Sample window", raw_width, raw_height, NULL);
if(!mainwin){
WARNX(_("Can't open OpenGL window, image preview will be inaccessible"));
}else
pthread_create(&mainwin->thread, NULL, &image_thread, (void*)&ima);
}
#endif
if(GP->nframes < 1) GP->nframes = 1; if(GP->nframes < 1) GP->nframes = 1;
for(int j = 0; j < GP->nframes; ++j){ for(int j = 0; j < GP->nframes; ++j){
// úÁÈ×ÁÔ ËÁÄÒÁ %d\n // úÁÈ×ÁÔ ËÁÄÒÁ %d\n
@ -797,44 +793,13 @@ void ccds(){
break; break;
} }
calculate_stat(&ima); calculate_stat(&ima);
#ifdef IMAGEVIEW saveFITS(&ima, NULL);
if(!GP->showimage){ // don't save all FITS files in imagev view mode
#endif
saveFITS(&ima, NULL);
#ifdef IMAGEVIEW
}
if(GP->showimage){ // display image
if((mainwin = getWin())){
DBG("change image");
change_displayed_image(mainwin, &ima);
while((mainwin = getWin())){ // test paused state & grabbing custom frames
if((mainwin->winevt & WINEVT_PAUSE) == 0) break;
if(mainwin->winevt & WINEVT_GETIMAGE){
mainwin->winevt &= ~WINEVT_GETIMAGE;
//if(!camera) return;
if(capt() != CAPTURE_READY){
WARNX(_("Can't capture image"));
}else{
//if(!camera) return;
if(!camera->capture(&ima)){
WARNX(_("Can't grab image"));
}
else{
calculate_stat(&ima);
change_displayed_image(mainwin, &ima);
}
}
}
usleep(10000);
}
}else break; // stop capturing when window closed
}
#endif
if(GP->pause_len && j != (GP->nframes - 1)){ if(GP->pause_len && j != (GP->nframes - 1)){
double delta, time1 = dtime() + GP->pause_len; double delta, time1 = dtime() + GP->pause_len;
while((delta = time1 - dtime()) > 0.){ while((delta = time1 - dtime()) > 0.){
// %d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n // %d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n
verbose(1, _("%d seconds till pause ends\n"), (int)delta); verbose(1, _("%d seconds till pause ends\n"), (int)delta);
float tmpf;
if(camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f\n", tmpf); if(camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f\n", tmpf);
if(camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f\n", tmpf); if(camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f\n", tmpf);
if(delta > 6.) sleep(5); if(delta > 6.) sleep(5);
@ -843,39 +808,9 @@ void ccds(){
} }
} }
} }
#ifdef IMAGEVIEW
if(GP->showimage){
if((mainwin = getWin())) mainwin->winevt |= WINEVT_PAUSE;
DBG("Waiting");
while((mainwin = getWin())){
//if(mainwin->killthread) break;
if(mainwin->winevt & WINEVT_GETIMAGE){
DBG("GRAB");
mainwin->winevt &= ~WINEVT_GETIMAGE;
//if(!camera) return;
if(capt() != CAPTURE_READY){
WARNX(_("Can't capture image"));
}else{
//if(!camera) return;
if(!camera->capture(&ima)){
WARNX(_("Can't grab image"));
}
else{
calculate_stat(&ima);
change_displayed_image(mainwin, &ima);
}
}
}
}
DBG("Close window");
usleep(10000);
}
#endif
DBG("FREE img"); DBG("FREE img");
FREE(img); FREE(img);
retn: closecam();
closecam(dlh);
DBG("closed -> out");
} }
void cancel(){ void cancel(){
@ -883,3 +818,79 @@ void cancel(){
camera->cancel(); camera->cancel();
} }
} }
static volatile int grabends = 1;
static void *grabnext(void *arg){
FNAME();
grabends = 0;
static int retval = FALSE;
IMG *ima = (IMG*) arg;
DBG("nxt");
if(!ima || !camera) goto eof;
if(!camera->startexposition()){ WARNX(_("Can't start exposition")); goto eof; }
capture_status cs;
DBG("Poll");
while(!camera->pollcapture(&cs, NULL)){
usleep(10000);
if(!camera) goto eof;
}
DBG("get");
if(!camera->capture(ima)){ WARNX(_("Can't grab image")); goto eof; }
calculate_stat(ima);
retval = TRUE;
DBG("OK");
eof:
grabends = 1;
pthread_exit((void*)&retval);
DBG("EXIT");
}
/**
* @brief ccdcaptured - get new image data for viewer
* @param img - pointer to IMG* (if IMG* is NULL, will be allocated here)
* @return TRUE if new image available
*/
int ccdcaptured(IMG **imgptr){
if(!imgptr) return FALSE;
static pthread_t grabthread = 0;
if(imgptr == (void*)-1){ // kill `grabnext`
DBG("Kill grabbing thread");
if(grabthread){
pthread_cancel(grabthread);
pthread_join(grabthread, NULL);
grabthread = 0;
}
DBG("Killed");
return FALSE;
}
frameformat fmt = camera->geometry;
int raw_width = fmt.w / GP->hbin, raw_height = fmt.h / GP->vbin;
IMG *ima = NULL;
if(!*imgptr){
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);
ima = MALLOC(IMG, 1);
ima->data = img;
ima->w = raw_width;
ima->h = raw_height;
*imgptr = ima;
}else ima = *imgptr;
if(!grabthread){ // start new grab
DBG("\n\n\nStart new grab");
if(pthread_create(&grabthread, NULL, &grabnext, (void*)ima)){
WARN("Can't create grabbing thread");
grabthread = 0;
}
}else{ // grab in process
if(grabends){ // thread is dead
DBG("Thread is dead");
void *vr;
pthread_join(grabthread, &vr);
int retcode = *(int*)vr;
DBG("retcode = %d", retcode);
grabthread = 0;
if(retcode) return TRUE;
}
}
return FALSE;
}

View File

@ -30,14 +30,16 @@ void calculate_stat(IMG *image);
int saveFITS(IMG *img, char **outp); // for imageview module int saveFITS(IMG *img, char **outp); // for imageview module
void focusers(); void focusers();
void wheels(); void wheels();
int prepare_ccds();
void ccds(); void ccds();
void cancel(); void cancel();
int startCCD(void **dlh); int startCCD(void **dlh);
int startWheel(void **dlh); int startWheel(void **dlh);
int startFocuser(void **dlh); int startFocuser(void **dlh);
void focclose(void *dlh); void focclose();
void closewheel(void *dlh); void closewheel();
void closecam(void *dlh); void closecam();
int ccdcaptured(IMG **img);
#endif // CCDFUNC_H__ #endif // CCDFUNC_H__

View File

@ -121,7 +121,7 @@ myoption cmdlnopts[] = {
*/ */
glob_pars *parse_args(int argc, char **argv){ glob_pars *parse_args(int argc, char **argv){
// format of help: "Usage: progname [args]\n" // format of help: "Usage: progname [args]\n"
change_helpstring("Usage: %s [args] [output file prefix]\nTo restart server kill it with SIGUSR1\n\tArgs are:\n"); change_helpstring("Usage: %s [args] [output file prefix or file/dir name to view]\nTo restart server kill it with SIGUSR1\n\tArgs are:\n");
// parse arguments // parse arguments
parseargs(&argc, &argv, cmdlnopts); parseargs(&argc, &argv, cmdlnopts);
if(help) showhelp(-1, cmdlnopts); if(help) showhelp(-1, cmdlnopts);

View File

@ -21,11 +21,12 @@
#include "events.h" #include "events.h"
#include "imageview.h" #include "imageview.h"
extern windowData *win;
/** /**
* manage pressed keys & menu items * manage pressed keys & menu items
*/ */
static void processKeybrd(unsigned char key, int mod, _U_ int x, _U_ int y){ static void processKeybrd(unsigned char key, int mod, _U_ int x, _U_ int y){
windowData *win = getWin();
if(!win) return; if(!win) return;
DBG("key=%d (%c), mod=%d", key, key, mod); DBG("key=%d (%c), mod=%d", key, key, mod);
if(mod == GLUT_ACTIVE_CTRL){ // 'a' == 1, 'b' == 2... if(mod == GLUT_ACTIVE_CTRL){ // 'a' == 1, 'b' == 2...
@ -102,7 +103,6 @@ void mousePressed(int key, int state, int x, int y){
// key: GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON // key: GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON
// state: GLUT_UP, GLUT_DOWN // state: GLUT_UP, GLUT_DOWN
int mod = glutGetModifiers() & 7; int mod = glutGetModifiers() & 7;
windowData *win = getWin();
if(!win) return; if(!win) return;
if(state == GLUT_DOWN){ if(state == GLUT_DOWN){
oldx = x; oldy = y; oldx = x; oldy = y;
@ -130,7 +130,6 @@ void mousePressed(int key, int state, int x, int y){
} }
void mouseMove(int x, int y){ void mouseMove(int x, int y){
windowData *win = getWin();
if(!win) return; if(!win) return;
if(movingwin){ if(movingwin){
float X, Y, nx, ny, w2, h2; float X, Y, nx, ny, w2, h2;
@ -183,7 +182,6 @@ static const menuentry entries[] = {
void createMenu(){ void createMenu(){
FNAME(); FNAME();
windowData *win = getWin();
if(!win) return; if(!win) return;
DBG("menu for win ID %d", win->ID); DBG("menu for win ID %d", win->ID);
glutSetWindow(win->ID); glutSetWindow(win->ID);

View File

@ -28,7 +28,7 @@
#include "imageview.h" #include "imageview.h"
#include "omp.h" #include "omp.h"
static windowData *win = NULL; // main window windowData *win = NULL; // main window (common variable for events.c)
static pthread_t GLUTthread = 0; // main GLUT thread static pthread_t GLUTthread = 0; // main GLUT thread
static int imequalize = TRUE; static int imequalize = TRUE;
static int initialized = 0; // ==1 if GLUT is initialized; ==0 after clear_GL_context static int initialized = 0; // ==1 if GLUT is initialized; ==0 after clear_GL_context
@ -38,6 +38,24 @@ static void createWindow();
static void RedrawWindow(); static void RedrawWindow();
static void Resize(int width, int height); static void Resize(int width, int height);
/**
* Init freeGLUT
*/
static void imageview_init(){
FNAME();
char *v[] = {"Image view window", NULL};
int c = 1;
if(initialized){
WARNX(_("Already initialized!"));
return;
}
XInitThreads(); // we need it for threaded windows
glutInit(&c, v);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
initialized = 1;
}
/** /**
* calculate window properties on creating & resizing * calculate window properties on creating & resizing
*/ */
@ -109,7 +127,7 @@ static void createWindow(){
DBG("Window opened"); DBG("Window opened");
} }
int killwindow(){ static int killwindow(){
if(!win) return 0; if(!win) return 0;
if(!win->killthread){ if(!win->killthread){
// say threads to die // say threads to die
@ -140,7 +158,8 @@ int killwindow(){
return 1; return 1;
} }
void renderBitmapString(float x, float y, void *font, char *string, GLubyte *color){ /*
static void renderBitmapString(float x, float y, void *font, char *string, GLubyte *color){
if(!initialized) return; if(!initialized) return;
char *c; char *c;
int x1=x, W=0; int x1=x, W=0;
@ -159,7 +178,7 @@ void renderBitmapString(float x, float y, void *font, char *string, GLubyte *col
//glutStrokeCharacter(GLUT_STROKE_ROMAN, *c); //glutStrokeCharacter(GLUT_STROKE_ROMAN, *c);
x1 = x1 + glutBitmapWidth(font,*c);// + 1; x1 = x1 + glutBitmapWidth(font,*c);// + 1;
} }
} }*/
static void RedrawWindow(){ static void RedrawWindow(){
//DBG("ini=%d, win=%s", initialized, win ? "yes" : "no"); //DBG("ini=%d, win=%s", initialized, win ? "yes" : "no");
@ -213,6 +232,7 @@ static void *Redraw(_U_ void *arg){
static void Resize(int width, int height){ static void Resize(int width, int height){
FNAME(); FNAME();
if(!initialized) return;
if(!initialized || !win || win->killthread) return; if(!initialized || !win || win->killthread) return;
glutReshapeWindow(width, height); glutReshapeWindow(width, height);
win->w = width; win->w = width;
@ -236,7 +256,7 @@ static void Resize(int width, int height){
* @param rawdata - NULL (then the memory will be allocated here with size w x h) * @param rawdata - NULL (then the memory will be allocated here with size w x h)
* or allocated outside data * or allocated outside data
*/ */
windowData *createGLwin(char *title, int w, int h, rawimage *rawdata){ static void createGLwin(char *title, int w, int h, rawimage *rawdata){
FNAME(); FNAME();
if(!initialized) imageview_init(); if(!initialized) imageview_init();
if(win) killwindow(); if(win) killwindow();
@ -255,58 +275,22 @@ windowData *createGLwin(char *title, int w, int h, rawimage *rawdata){
} }
} }
if(!raw || !raw->rawdata){ if(!raw || !raw->rawdata){
free(raw); FREE(raw);
return NULL; FREE(win);
return;
} }
win->title = strdup(title); win->title = strdup(title);
win->image = raw; win->image = raw;
if(pthread_mutex_init(&win->mutex, NULL)){ if(pthread_mutex_init(&win->mutex, NULL)){
WARN(_("Can't init mutex!")); WARN(_("Can't init mutex!"));
killwindow(); killwindow();
return NULL; return;
} }
win->w = w; win->w = w;
win->h = h; win->h = h;
pthread_create(&GLUTthread, NULL, &Redraw, NULL); pthread_create(&GLUTthread, NULL, &Redraw, NULL);
return win;
} }
/**
* Init freeGLUT
*/
void imageview_init(){
FNAME();
char *v[] = {"Image view window", NULL};
int c = 1;
if(initialized){
WARNX(_("Already initialized!"));
return;
}
XInitThreads(); // we need it for threaded windows
glutInit(&c, v);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
initialized = 1;
}
/**
* Close all opened windows and terminate main GLUT thread
*/
void clear_GL_context(){
FNAME();
if(!initialized) return;
initialized = 0;
cancel(); // cancel expositions
DBG("kill");
killwindow();
DBG("join");
DBG("Leave mainloop");
glutLeaveMainLoop();
if(GLUTthread) pthread_join(GLUTthread, NULL); // wait while main thread exits
DBG("main GL thread cancelled");
}
/* /*
* Coordinates transformation from CS of drawingArea into CS of picture * Coordinates transformation from CS of drawingArea into CS of picture
* x,y - pointer coordinates * x,y - pointer coordinates
@ -328,11 +312,6 @@ void conv_image_to_mouse_coords(float X, float Y,
*y = (int)roundf((window->y0 - Y) * a); *y = (int)roundf((window->y0 - Y) * a);
} }
windowData *getWin(){
return win;
}
/** /**
* Convert gray (unsigned short) into RGB components (GLubyte) * Convert gray (unsigned short) into RGB components (GLubyte)
* @argument L - gray level (0..1) * @argument L - gray level (0..1)
@ -451,12 +430,21 @@ static uint8_t *equalize(uint16_t *ori, int w, int h){
return retn; return retn;
} }
void change_displayed_image(windowData *win, IMG *img){ static void change_displayed_image(IMG *img){
if(!win || !win->image) return; if(!win || !win->image) return;
rawimage *im = win->image;
DBG("imh=%d, imw=%d, ch=%u, cw=%u", im->h, im->w, img->w, img->h);
pthread_mutex_lock(&win->mutex); pthread_mutex_lock(&win->mutex);
rawimage *im = win->image;
DBG("imh=%d, imw=%d, ch=%u, cw=%u", im->h, im->w, img->h, img->w);
int w = img->w, h = img->h, s = w*h; int w = img->w, h = img->h, s = w*h;
if(!im || (im->h != h) || (im->w != w)){ // realloc image to new size
DBG("\n\nRealloc rawdata");
if(im) FREE(im->rawdata);
else im = MALLOC(rawimage, 1);
im->rawdata = MALLOC(GLubyte, w*h*3);
im->h = h; im->w = w;
win->image = im;
DBG("win->image changed");
}
if(imequalize){ if(imequalize){
uint8_t *newima = equalize(img->data, w, h); uint8_t *newima = equalize(img->data, w, h);
GLubyte *dst = im->rawdata; GLubyte *dst = im->rawdata;
@ -490,11 +478,13 @@ void change_displayed_image(windowData *win, IMG *img){
pthread_mutex_unlock(&win->mutex); pthread_mutex_unlock(&win->mutex);
} }
void* image_thread(_U_ void *data){ #if 0
// thread for checking
static void* image_thread(void *data){
FNAME(); FNAME();
IMG *img = (IMG*) data; IMG *(*newimage)(const char *) = (IMG*(*)(const char*)) data;
IMG *img = NULL;
while(1){ while(1){
windowData *win = getWin();
if(!win || win->killthread){ if(!win || win->killthread){
DBG("got killthread"); DBG("got killthread");
clear_GL_context(); clear_GL_context();
@ -520,9 +510,77 @@ void* image_thread(_U_ void *data){
usleep(10000); usleep(10000);
} }
} }
#endif
void closeGL(){ void closeGL(){
windowData *win = getWin();
if(win) win->killthread = 1; if(win) win->killthread = 1;
while(getWin()) usleep(1000); usleep(1000);
if(!initialized) return;
initialized = 0;
cancel(); // cancel expositions
DBG("kill");
killwindow();
DBG("Leave mainloop");
glutLeaveMainLoop();
DBG("join");
if(GLUTthread) pthread_join(GLUTthread, NULL); // wait while main thread exits
DBG("main GL thread cancelled");
usleep(1000);
} }
/**
* @brief viewer - main viewer process
* @param newimage - image refresh function
* @return 0 if all OK
*/
int viewer(imagefunc newimage){
if(!newimage){
WARNX("No image changing function defined");
return 1;
}
imageview_init();
DBG("Create new win");
createGLwin("Sample window", 1024, 1024, NULL);
if(!win){
WARNX(_("Can't open OpenGL window, image preview will be inaccessible"));
return 1;
}
IMG *img = NULL;
while(1){
if(!win || win->killthread){
DBG("got killthread");
newimage((void*)-1);
signals(0); // just run common cleaner
return 0;
}
if((win->winevt & WINEVT_GETIMAGE) || !(win->winevt & WINEVT_PAUSE)){
if(newimage(&img)){
win->winevt &= ~WINEVT_GETIMAGE;
change_displayed_image(img); // change image if refreshed
}
}
if(!win->winevt){
usleep(10000);
continue;
}
if(win->winevt & WINEVT_SAVEIMAGE){ // save image
verbose(2, "Make screenshot\n");
saveFITS(img, NULL);
win->winevt &= ~WINEVT_SAVEIMAGE;
}
if(win->winevt & WINEVT_ROLLCOLORFUN){
roll_colorfun();
win->winevt &= ~WINEVT_ROLLCOLORFUN;
change_displayed_image(img);
}
if(win->winevt & WINEVT_EQUALIZE){
win->winevt &= ~WINEVT_EQUALIZE;
imequalize = !imequalize;
verbose(1, _("Equalization of histogram: %s"), imequalize ? N_("on") : N_("off"));
change_displayed_image(img);
}
}
}
// getter for events.c
windowData* getWin(){ return win;}

View File

@ -28,13 +28,6 @@
#include "ccdfunc.h" #include "ccdfunc.h"
#include "events.h" #include "events.h"
typedef struct{
GLubyte *rawdata; // raw image data
int w; // size of image
int h;
int changed; // == 1 if data was changed outside (to redraw)
} rawimage;
// events from menu: // events from menu:
// temporaly stop capture of regular sequence // temporaly stop capture of regular sequence
#define WINEVT_PAUSE (1<<0) #define WINEVT_PAUSE (1<<0)
@ -51,6 +44,14 @@ typedef struct{
#define WIN_FLIP_LR (1<<0) #define WIN_FLIP_LR (1<<0)
#define WIN_FLIP_UD (1<<1) #define WIN_FLIP_UD (1<<1)
// common structs with events.c
typedef struct{
GLubyte *rawdata; // raw image data
int w; // size of image
int h;
int changed; // == 1 if data was changed outside (to redraw)
} rawimage;
typedef struct{ typedef struct{
int ID; // identificator of OpenGL window int ID; // identificator of OpenGL window
char *title; // title of window char *title; // title of window
@ -69,25 +70,22 @@ typedef struct{
int killthread; // flag for killing data changing thread & also signal that there's no threads int killthread; // flag for killing data changing thread & also signal that there's no threads
} windowData; } windowData;
/*
typedef enum{ typedef enum{
INNER, INNER,
OPENGL OPENGL
} winIdType; } winIdType;
*/
void imageview_init();
void closeGL(); void closeGL();
windowData *createGLwin(char *title, int w, int h, rawimage *rawdata);
windowData *getWin();
int killwindow();
void renderBitmapString(float x, float y, void *font, char *string, GLubyte *color);
void clear_GL_context();
void calc_win_props(GLfloat *Wortho, GLfloat *Hortho); void calc_win_props(GLfloat *Wortho, GLfloat *Hortho);
void conv_mouse_to_image_coords(int x, int y, float *X, float *Y, windowData *window); void conv_mouse_to_image_coords(int x, int y, float *X, float *Y, windowData *window);
void conv_image_to_mouse_coords(float X, float Y, int *x, int *y, windowData *window); void conv_image_to_mouse_coords(float X, float Y, int *x, int *y, windowData *window);
windowData* getWin();
void* image_thread(void *data); typedef int (*imagefunc)(IMG**);
void change_displayed_image(windowData *win, IMG *img);
int viewer(imagefunc);
#endif // IMAGEVIEW_H__ #endif // IMAGEVIEW_H__

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-02-03 09:26+0300\n" "POT-Creation-Date: 2023-02-07 16:55+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"
@ -245,59 +245,59 @@ msgstr ""
msgid "Display image in OpenGL window" msgid "Display image in OpenGL window"
msgstr "" msgstr ""
#: ccdfunc.c:63 #: ccdfunc.c:64
#, c-format #, c-format
msgid "Can't find plugin %s: %s" msgid "Can't find plugin %s: %s"
msgstr "" msgstr ""
#: ccdfunc.c:75 #: ccdfunc.c:76
#, c-format #, c-format
msgid "Can't find focuser in plugin %s: %s" msgid "Can't find focuser in plugin %s: %s"
msgstr "" msgstr ""
#: ccdfunc.c:86 #: ccdfunc.c:87
#, c-format #, c-format
msgid "Can't find camera in plugin %s: %s" msgid "Can't find camera in plugin %s: %s"
msgstr "" msgstr ""
#: ccdfunc.c:97 #: ccdfunc.c:98
#, c-format #, c-format
msgid "Can't find wheel in plugin %s: %s" msgid "Can't find wheel in plugin %s: %s"
msgstr "" msgstr ""
#: ccdfunc.c:183 #: ccdfunc.c:184
msgid "Camera device unknown" msgid "Camera device unknown"
msgstr "" msgstr ""
#: ccdfunc.c:189 #: ccdfunc.c:190
msgid "Neither filename nor filename prefix pointed!" msgid "Neither filename nor filename prefix pointed!"
msgstr "" msgstr ""
#. Не могу сохранить файл #. Не могу сохранить файл
#: ccdfunc.c:208 #: ccdfunc.c:209
#, c-format #, c-format
msgid "Can't save file with prefix %s" msgid "Can't save file with prefix %s"
msgstr "" msgstr ""
#: ccdfunc.c:356 #: ccdfunc.c:357
#, c-format #, c-format
msgid "File saved as '%s'" msgid "File saved as '%s'"
msgstr "" msgstr ""
#: ccdfunc.c:365 #: ccdfunc.c:366
msgid "Error saving file" msgid "Error saving file"
msgstr "" msgstr ""
#: ccdfunc.c:405 #: ccdfunc.c:406
#, c-format #, c-format
msgid "Image stat:\n" msgid "Image stat:\n"
msgstr "" msgstr ""
#: ccdfunc.c:413 #: ccdfunc.c:414
msgid "Focuser device not pointed" msgid "Focuser device not pointed"
msgstr "" msgstr ""
#: ccdfunc.c:420 #: ccdfunc.c:421
msgid "No focusers found" msgid "No focusers found"
msgstr "" msgstr ""
@ -340,217 +340,213 @@ msgstr ""
msgid "No wheels found" msgid "No wheels found"
msgstr "" msgstr ""
#: ccdfunc.c:544 #: ccdfunc.c:543
#, c-format #, c-format
msgid "Found %d wheels, you point number %d" msgid "Found %d wheels, you point number %d"
msgstr "" msgstr ""
#: ccdfunc.c:548 #: ccdfunc.c:547
msgid "Can't set active wheel number" msgid "Can't set active wheel number"
msgstr "" msgstr ""
#: ccdfunc.c:564 #: ccdfunc.c:563
msgid "Can't get max wheel position" msgid "Can't get max wheel position"
msgstr "" msgstr ""
#: ccdfunc.c:571 #: ccdfunc.c:570
#, 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:575 #: ccdfunc.c:574
#, c-format #, c-format
msgid "Can't set wheel position %d" msgid "Can't set wheel position %d"
msgstr "" msgstr ""
#: ccdfunc.c:592 #: ccdfunc.c:591
#, c-format #, c-format
msgid "%.1f seconds till exposition ends" msgid "%.1f seconds till exposition ends"
msgstr "" msgstr ""
#: ccdfunc.c:606 #: ccdfunc.c:605
msgid "Camera device not pointed" msgid "Camera device not pointed"
msgstr "" msgstr ""
#: ccdfunc.c:613 ccdfunc.c:614 #: ccdfunc.c:612 ccdfunc.c:613
msgid "No cameras found" msgid "No cameras found"
msgstr "" msgstr ""
#: ccdfunc.c:649 #: ccdfunc.c:643
#, c-format #, c-format
msgid "Found %d cameras, you point number %d" msgid "Found %d cameras, you point number %d"
msgstr "" msgstr ""
#: ccdfunc.c:653 #: ccdfunc.c:647
msgid "Can't set active camera number" msgid "Can't set active camera number"
msgstr "" msgstr ""
#: ccdfunc.c:659 #: ccdfunc.c:653
msgid "Can't set fan speed" msgid "Can't set fan speed"
msgstr "" msgstr ""
#: ccdfunc.c:660 #: ccdfunc.c:654
#, c-format #, c-format
msgid "Set fan speed to %d" msgid "Set fan speed to %d"
msgstr "" msgstr ""
#: ccdfunc.c:665 #: ccdfunc.c:659
#, c-format #, c-format
msgid "Camera model: %s" msgid "Camera model: %s"
msgstr "" msgstr ""
#: ccdfunc.c:666 #: ccdfunc.c:660
#, c-format #, c-format
msgid "Pixel size: %g x %g" msgid "Pixel size: %g x %g"
msgstr "" msgstr ""
#: ccdfunc.c:672 #: ccdfunc.c:666
#, c-format #, c-format
msgid "Full array: %s" msgid "Full array: %s"
msgstr "" msgstr ""
#: ccdfunc.c:675 #: ccdfunc.c:669
#, c-format #, c-format
msgid "Field of view: %s" msgid "Field of view: %s"
msgstr "" msgstr ""
#: ccdfunc.c:678 #: ccdfunc.c:672
#, c-format #, c-format
msgid "Current format: %s" msgid "Current format: %s"
msgstr "" msgstr ""
#: ccdfunc.c:681 #: ccdfunc.c:675
#, c-format #, c-format
msgid "Can't set T to %g degC" msgid "Can't set T to %g degC"
msgstr "" msgstr ""
#: ccdfunc.c:688 #: ccdfunc.c:683
#, c-format #, c-format
msgid "Shutter command: %s\n" msgid "Shutter command: %s\n"
msgstr "" msgstr ""
#: ccdfunc.c:690 #: ccdfunc.c:685
#, 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:694 #: ccdfunc.c:689
#, 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:696 #: ccdfunc.c:691
msgid "Can't configure (unsupported?)" msgid "Can't configure (unsupported?)"
msgstr "" msgstr ""
#: ccdfunc.c:702 #: ccdfunc.c:698
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:706 #: ccdfunc.c:702
#, 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:708 #: ccdfunc.c:704
msgid "Can't set IOport" msgid "Can't set IOport"
msgstr "" msgstr ""
#: ccdfunc.c:715 #: ccdfunc.c:711
#, c-format #, c-format
msgid "Set gain to %g" msgid "Set gain to %g"
msgstr "" msgstr ""
#: ccdfunc.c:716 #: ccdfunc.c:712
#, c-format #, c-format
msgid "Can't set gain to %g" msgid "Can't set gain to %g"
msgstr "" msgstr ""
#: ccdfunc.c:721 #: ccdfunc.c:717
#, c-format #, c-format
msgid "Set brightness to %g" msgid "Set brightness to %g"
msgstr "" msgstr ""
#: ccdfunc.c:722 #: ccdfunc.c:718
#, c-format #, c-format
msgid "Can't set brightness to %g" msgid "Can't set brightness to %g"
msgstr "" msgstr ""
#: ccdfunc.c:730 server.c:223 #: ccdfunc.c:726 server.c:223
#, c-format #, c-format
msgid "Can't set binning %dx%d" msgid "Can't set binning %dx%d"
msgstr "" msgstr ""
#: ccdfunc.c:742 server.c:224 #: ccdfunc.c:738 server.c:224
msgid "Can't set given geometry" msgid "Can't set given geometry"
msgstr "" msgstr ""
#: ccdfunc.c:746 #: ccdfunc.c:742
#, c-format #, c-format
msgid "Can't set %d flushes" msgid "Can't set %d flushes"
msgstr "" msgstr ""
#: ccdfunc.c:750 #: ccdfunc.c:746
#, 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:753 #: ccdfunc.c:749
msgid "Can't change frame type" msgid "Can't change frame type"
msgstr "" msgstr ""
#: ccdfunc.c:756 #: ccdfunc.c:752
msgid "Can't set bit depth" msgid "Can't set bit depth"
msgstr "" msgstr ""
#: ccdfunc.c:758 #: ccdfunc.c:754
msgid "Can't set readout speed" msgid "Can't set readout speed"
msgstr "" msgstr ""
#: ccdfunc.c:759 #: ccdfunc.c:755
#, c-format #, c-format
msgid "Readout mode: %s" msgid "Readout mode: %s"
msgstr "" msgstr ""
#: ccdfunc.c:760 #: ccdfunc.c:756
msgid "Only show statistics" msgid "Only show statistics"
msgstr "" msgstr ""
#. GET binning should be AFTER setgeometry! #. GET binning should be AFTER setgeometry!
#: ccdfunc.c:762 #: ccdfunc.c:758
msgid "Can't get current binning" msgid "Can't get current binning"
msgstr "" msgstr ""
#: ccdfunc.c:776
msgid "Can't open OpenGL window, image preview will be inaccessible"
msgstr ""
#. Захват кадра %d\n #. Захват кадра %d\n
#: ccdfunc.c:784 #: ccdfunc.c:780
#, c-format #, c-format
msgid "Capture frame %d" msgid "Capture frame %d"
msgstr "" msgstr ""
#: ccdfunc.c:786 server.c:121 #: ccdfunc.c:782 ccdfunc.c:830 server.c:121
msgid "Can't start exposition" msgid "Can't start exposition"
msgstr "" msgstr ""
#: ccdfunc.c:790 ccdfunc.c:816 ccdfunc.c:857 #: ccdfunc.c:786
msgid "Can't capture image" msgid "Can't capture image"
msgstr "" msgstr ""
#: ccdfunc.c:793 #: ccdfunc.c:789
msgid "Read grabbed image" msgid "Read grabbed image"
msgstr "" msgstr ""
#: ccdfunc.c:796 ccdfunc.c:820 ccdfunc.c:861 #: ccdfunc.c:792 ccdfunc.c:838
msgid "Can't grab image" msgid "Can't grab image"
msgstr "" msgstr ""
#. %d секунд до окончания паузы\n #. %d секунд до окончания паузы\n
#: ccdfunc.c:837 client.c:260 #: ccdfunc.c:801 client.c:260
#, c-format #, c-format
msgid "%d seconds till pause ends\n" msgid "%d seconds till pause ends\n"
msgstr "" msgstr ""
@ -567,28 +563,32 @@ msgstr ""
msgid "Server timeout" msgid "Server timeout"
msgstr "" msgstr ""
#: imageview.c:264 #: imageview.c:49
msgid "Can't init mutex!"
msgstr ""
#: imageview.c:282
msgid "Already initialized!" msgid "Already initialized!"
msgstr "" msgstr ""
#: imageview.c:408 #: imageview.c:285
msgid "Can't init mutex!"
msgstr ""
#: imageview.c:387
#, c-format #, c-format
msgid "Histogram conversion: %s" msgid "Histogram conversion: %s"
msgstr "" msgstr ""
#: imageview.c:517 #: imageview.c:507 imageview.c:579
#, c-format #, c-format
msgid "Equalization of histogram: %s" msgid "Equalization of histogram: %s"
msgstr "" msgstr ""
#: imageview.c:517 #: imageview.c:507 imageview.c:579
msgid "on" msgid "on"
msgstr "" msgstr ""
#: imageview.c:517 #: imageview.c:507 imageview.c:579
msgid "off" msgid "off"
msgstr "" msgstr ""
#: imageview.c:545
msgid "Can't open OpenGL window, image preview will be inaccessible"
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-02-03 09:26+0300\n" "POT-Creation-Date: 2023-02-07 16:54+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,18 +16,18 @@ 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:592 #: ccdfunc.c:591
#, 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:837 client.c:260 #: ccdfunc.c:801 client.c:260
#, c-format #, c-format
msgid "%d seconds till pause ends\n" msgid "%d seconds till pause ends\n"
msgstr "%d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n" msgstr "%d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n"
#: imageview.c:282 #: imageview.c:49
msgid "Already initialized!" msgid "Already initialized!"
msgstr "õÖÅ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÎÏ!" msgstr "õÖÅ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÎÏ!"
@ -39,57 +39,57 @@ msgstr "
msgid "CMOS gain level" msgid "CMOS gain level"
msgstr "ÕÒÏ×ÅÎØ Gain CMOS" msgstr "ÕÒÏ×ÅÎØ Gain CMOS"
#: ccdfunc.c:606 #: ccdfunc.c:605
msgid "Camera device not pointed" msgid "Camera device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÐÏÄËÌÀÞÅÎÏ" msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÐÏÄËÌÀÞÅÎÏ"
#: ccdfunc.c:183 #: ccdfunc.c:184
msgid "Camera device unknown" msgid "Camera device unknown"
msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÏÐÏÚÎÁÎÏ" msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÏÐÏÚÎÁÎÏ"
#: ccdfunc.c:665 #: ccdfunc.c:659
#, c-format #, c-format
msgid "Camera model: %s" msgid "Camera model: %s"
msgstr "íÏÄÅÌØ Ó×ÅÔÏÐÒÉÅÍÎÉËÁ: %s" msgstr "íÏÄÅÌØ Ó×ÅÔÏÐÒÉÅÍÎÉËÁ: %s"
#: ccdfunc.c:790 ccdfunc.c:816 ccdfunc.c:857 #: ccdfunc.c:786
msgid "Can't capture image" msgid "Can't capture image"
msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ" msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ"
#: ccdfunc.c:753 #: ccdfunc.c:749
msgid "Can't change frame type" msgid "Can't change frame type"
msgstr "îÅ ÍÏÇÕ ÉÚÍÅÎÉÔØ ÔÉÐ ËÁÄÒÁ" msgstr "îÅ ÍÏÇÕ ÉÚÍÅÎÉÔØ ÔÉÐ ËÁÄÒÁ"
#: ccdfunc.c:696 #: ccdfunc.c:691
msgid "Can't configure (unsupported?)" msgid "Can't configure (unsupported?)"
msgstr "îÅ ÍÏÇÕ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ (ÏÐÃÉÑ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)" msgstr "îÅ ÍÏÇÕ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ (ÏÐÃÉÑ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)"
#: ccdfunc.c:86 #: ccdfunc.c:87
#, c-format #, c-format
msgid "Can't find camera in plugin %s: %s" msgid "Can't find camera in plugin %s: %s"
msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ËÁÍÅÒÙ %s: %s" msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ËÁÍÅÒÙ %s: %s"
#: ccdfunc.c:75 #: ccdfunc.c:76
#, c-format #, c-format
msgid "Can't find focuser in plugin %s: %s" msgid "Can't find focuser in plugin %s: %s"
msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ÆÏËÕÓÅÒÁ %s: %s" msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ÆÏËÕÓÅÒÁ %s: %s"
#: ccdfunc.c:63 #: ccdfunc.c:64
#, c-format #, c-format
msgid "Can't find plugin %s: %s" msgid "Can't find plugin %s: %s"
msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ %s: %s" msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ %s: %s"
#: ccdfunc.c:97 #: ccdfunc.c:98
#, c-format #, c-format
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:702 #: ccdfunc.c:698
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:762 #: ccdfunc.c:758
msgid "Can't get current binning" msgid "Can't get current binning"
msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÔÅËÕÝÅÅ ÚÎÁÞÅÎÉÅ ÂÉÎÎÉÎÇÁ" msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÔÅËÕÝÅÅ ÚÎÁÞÅÎÉÅ ÂÉÎÎÉÎÇÁ"
@ -101,11 +101,11 @@ msgstr "
msgid "Can't get focuser limit positions" msgid "Can't get focuser limit positions"
msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ÆÏËÕÓÅÒÁ" msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ÆÏËÕÓÅÒÁ"
#: ccdfunc.c:564 #: ccdfunc.c:563
msgid "Can't get max wheel position" msgid "Can't get max wheel position"
msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ËÏÌÅÓÁ" msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ËÏÌÅÓÁ"
#: ccdfunc.c:796 ccdfunc.c:820 ccdfunc.c:861 #: ccdfunc.c:792 ccdfunc.c:838
msgid "Can't grab image" msgid "Can't grab image"
msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ" msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ"
@ -113,7 +113,7 @@ msgstr "
msgid "Can't home focuser" msgid "Can't home focuser"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÆÏËÕÓÅÒ × ÎÕÌØ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÆÏËÕÓÅÒ × ÎÕÌØ"
#: imageview.c:264 #: imageview.c:285
msgid "Can't init mutex!" msgid "Can't init mutex!"
msgstr "îÅ ÍÏÇÕ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÍØÀÔÅËÓ!" msgstr "îÅ ÍÏÇÕ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÍØÀÔÅËÓ!"
@ -121,36 +121,36 @@ msgstr "
msgid "Can't make exposition" msgid "Can't make exposition"
msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ÜËÓÐÏÚÉÃÉÀ" msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ÜËÓÐÏÚÉÃÉÀ"
#: ccdfunc.c:776 #: imageview.c:545
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:690 #: ccdfunc.c:685
#, c-format #, c-format
msgid "Can't run shutter command %s (unsupported?)" msgid "Can't run shutter command %s (unsupported?)"
msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ËÏÍÁÎÄÕ ÚÁÔ×ÏÒÁ %s (ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)" msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ËÏÍÁÎÄÕ ÚÁÔ×ÏÒÁ %s (ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)"
#. Ð<>е могу Ñ<>охраниÑÑŒ файл #. Ð<>е могу Ñ<>охраниÑÑŒ файл
#: ccdfunc.c:208 #: ccdfunc.c:209
#, c-format #, c-format
msgid "Can't save file with prefix %s" msgid "Can't save file with prefix %s"
msgstr "îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ Ó ÐÒÅÆÉËÓÏÍ %s" msgstr "îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ Ó ÐÒÅÆÉËÓÏÍ %s"
#: ccdfunc.c:746 #: ccdfunc.c:742
#, c-format #, c-format
msgid "Can't set %d flushes" msgid "Can't set %d flushes"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ %d ÓÂÒÏÓÏ×" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ %d ÓÂÒÏÓÏ×"
#: ccdfunc.c:708 #: ccdfunc.c:704
msgid "Can't set IOport" msgid "Can't set IOport"
msgstr "îÅ ÍÏÇÕ ÐÏÍÅÎÑÔØ ÚÎÁÞÅÎÉÑ ÐÏÒÔÁ I/O" msgstr "îÅ ÍÏÇÕ ÐÏÍÅÎÑÔØ ÚÎÁÞÅÎÉÑ ÐÏÒÔÁ I/O"
#: ccdfunc.c:681 #: ccdfunc.c:675
#, 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:653 #: ccdfunc.c:647
msgid "Can't set active camera number" msgid "Can't set active camera number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÊ ËÁÍÅÒÙ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÊ ËÁÍÅÒÙ"
@ -158,39 +158,39 @@ msgstr "
msgid "Can't set active focuser number" msgid "Can't set active focuser number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ÆÏËÕÓÅÒÁ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ÆÏËÕÓÅÒÁ"
#: ccdfunc.c:548 #: ccdfunc.c:547
msgid "Can't set active wheel number" msgid "Can't set active wheel number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ËÏÌÅÓÁ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ËÏÌÅÓÁ"
#: ccdfunc.c:730 server.c:223 #: ccdfunc.c:726 server.c:223
#, 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:756 #: ccdfunc.c:752
msgid "Can't set bit depth" msgid "Can't set bit depth"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÒÁÚÒÑÄÎÏÓÔØ áãð" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÒÁÚÒÑÄÎÏÓÔØ áãð"
#: ccdfunc.c:722 #: ccdfunc.c:718
#, c-format #, c-format
msgid "Can't set brightness to %g" msgid "Can't set brightness to %g"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g"
#: ccdfunc.c:750 #: ccdfunc.c:746
#, 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:659 #: ccdfunc.c:653
msgid "Can't set fan speed" msgid "Can't set fan speed"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ×" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ×"
#: ccdfunc.c:716 #: ccdfunc.c:712
#, 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:742 server.c:224 #: ccdfunc.c:738 server.c:224
msgid "Can't set given geometry" msgid "Can't set given geometry"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÇÅÏÍÅÔÒÉÀ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÇÅÏÍÅÔÒÉÀ"
@ -204,26 +204,26 @@ msgstr "
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:758 #: ccdfunc.c:754
msgid "Can't set readout speed" msgid "Can't set readout speed"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ÓÞÉÔÙ×ÁÎÉÑ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ÓÞÉÔÙ×ÁÎÉÑ"
#: ccdfunc.c:575 #: ccdfunc.c:574
#, c-format #, c-format
msgid "Can't set wheel position %d" msgid "Can't set wheel position %d"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÐÏÌÏÖÅÎÉÅ ËÏÌÅÓÁ %d" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÐÏÌÏÖÅÎÉÅ ËÏÌÅÓÁ %d"
#: ccdfunc.c:786 server.c:121 #: ccdfunc.c:782 ccdfunc.c:830 server.c:121
msgid "Can't start exposition" msgid "Can't start exposition"
msgstr "îÅ ÍÏÇÕ ÎÁÞÁÔØ ÜËÓÐÏÚÉÃÉÀ" msgstr "îÅ ÍÏÇÕ ÎÁÞÁÔØ ÜËÓÐÏÚÉÃÉÀ"
#. Захват кадра %d\n #. Захват кадра %d\n
#: ccdfunc.c:784 #: ccdfunc.c:780
#, c-format #, c-format
msgid "Capture frame %d" msgid "Capture frame %d"
msgstr "úÁÈ×ÁÔ ËÁÄÒÁ %d" msgstr "úÁÈ×ÁÔ ËÁÄÒÁ %d"
#: ccdfunc.c:678 #: ccdfunc.c:672
#, c-format #, c-format
msgid "Current format: %s" msgid "Current format: %s"
msgstr "" msgstr ""
@ -232,30 +232,30 @@ msgstr ""
msgid "Display image in OpenGL window" msgid "Display image in OpenGL window"
msgstr "ïÔÏÂÒÁÖÅÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ × ÏËÎÅ OpenGL" msgstr "ïÔÏÂÒÁÖÅÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ × ÏËÎÅ OpenGL"
#: imageview.c:517 #: imageview.c:507 imageview.c:579
#, c-format #, c-format
msgid "Equalization of histogram: %s" msgid "Equalization of histogram: %s"
msgstr "üË×ÁÌÉÚÁÃÉÑ ÇÉÓÔÏÇÒÁÍÍÙ: %s" msgstr "üË×ÁÌÉÚÁÃÉÑ ÇÉÓÔÏÇÒÁÍÍÙ: %s"
#: ccdfunc.c:365 #: ccdfunc.c:366
msgid "Error saving file" msgid "Error saving file"
msgstr "ïÛÉÂËÁ ÓÏÈÒÁÎÅÎÉÑ ÆÁÊÌÁ" msgstr "ïÛÉÂËÁ ÓÏÈÒÁÎÅÎÉÑ ÆÁÊÌÁ"
#: ccdfunc.c:675 #: ccdfunc.c:669
#, c-format #, c-format
msgid "Field of view: %s" msgid "Field of view: %s"
msgstr "ðÏÌÅ ÚÒÅÎÉÑ: %s" msgstr "ðÏÌÅ ÚÒÅÎÉÑ: %s"
#: ccdfunc.c:356 #: ccdfunc.c:357
#, c-format #, c-format
msgid "File saved as '%s'" msgid "File saved as '%s'"
msgstr "æÁÊÌ ÓÏÈÒÁÎÅÎ ËÁË '%s'" msgstr "æÁÊÌ ÓÏÈÒÁÎÅÎ ËÁË '%s'"
#: ccdfunc.c:413 #: ccdfunc.c:414
msgid "Focuser device not pointed" msgid "Focuser device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï ÆÏËÕÓÅÒÁ ÎÅ ÕËÁÚÁÎÏ" msgstr "õÓÔÒÏÊÓÔ×Ï ÆÏËÕÓÅÒÁ ÎÅ ÕËÁÚÁÎÏ"
#: ccdfunc.c:649 #: ccdfunc.c:643
#, 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"
@ -265,22 +265,22 @@ msgstr "
msgid "Found %d focusers, you point number %d" msgid "Found %d focusers, you point number %d"
msgstr "ïÂÎÁÒÕÖÅÎÏ %d ÆÏËÕÓÅÒÏ×, ×Ù ÕËÁÚÁÌÉ %d" msgstr "ïÂÎÁÒÕÖÅÎÏ %d ÆÏËÕÓÅÒÏ×, ×Ù ÕËÁÚÁÌÉ %d"
#: ccdfunc.c:544 #: ccdfunc.c:543
#, 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:672 #: ccdfunc.c:666
#, c-format #, c-format
msgid "Full array: %s" msgid "Full array: %s"
msgstr "ðÏÌÎÙÊ ÆÏÒÍÁÔ: %s" msgstr "ðÏÌÎÙÊ ÆÏÒÍÁÔ: %s"
#: imageview.c:408 #: imageview.c:387
#, c-format #, c-format
msgid "Histogram conversion: %s" msgid "Histogram conversion: %s"
msgstr "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÇÉÓÔÏÇÒÁÍÍÙ: %s" msgstr "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÇÉÓÔÏÇÒÁÍÍÙ: %s"
#: ccdfunc.c:405 #: ccdfunc.c:406
#, c-format #, c-format
msgid "Image stat:\n" msgid "Image stat:\n"
msgstr "óÔÁÔÉÓÔÉËÁ ÐÏ ÉÚÏÂÒÁÖÅÎÉÀ: \n" msgstr "óÔÁÔÉÓÔÉËÁ ÐÏ ÉÚÏÂÒÁÖÅÎÉÀ: \n"
@ -289,7 +289,7 @@ msgstr "
msgid "N flushes before exposing (default: 1)" msgid "N flushes before exposing (default: 1)"
msgstr "N ÚÁÓ×ÅÞÉ×ÁÎÉÊ ÐÅÒÅÄ ÜËÓÐÏÚÉÃÉÅÊ (ÐÏ ÕÍÏÌÞÁÎÉÀ: 1)" msgstr "N ÚÁÓ×ÅÞÉ×ÁÎÉÊ ÐÅÒÅÄ ÜËÓÐÏÚÉÃÉÅÊ (ÐÏ ÕÍÏÌÞÁÎÉÀ: 1)"
#: ccdfunc.c:189 #: ccdfunc.c:190
msgid "Neither filename nor filename prefix pointed!" msgid "Neither filename nor filename prefix pointed!"
msgstr "îÉ ÉÍÑ ÆÁÊÌÁ, ÎÉ ÐÒÅÆÉËÓ ÎÅ ÕËÁÚÁÎÙ!" msgstr "îÉ ÉÍÑ ÆÁÊÌÁ, ÎÉ ÐÒÅÆÉËÓ ÎÅ ÕËÁÚÁÎÙ!"
@ -297,11 +297,11 @@ msgstr "
msgid "No camera device" msgid "No camera device"
msgstr "îÅ ÕËÁÚÁÎÏ ÕÓÔÒÏÊÓÔ×Ï ËÁÍÅÒÙ" msgstr "îÅ ÕËÁÚÁÎÏ ÕÓÔÒÏÊÓÔ×Ï ËÁÍÅÒÙ"
#: ccdfunc.c:613 ccdfunc.c:614 #: ccdfunc.c:612 ccdfunc.c:613
msgid "No cameras found" msgid "No cameras found"
msgstr "ëÁÍÅÒ ÎÅ ÏÂÎÁÒÕÖÅÎÏ" msgstr "ëÁÍÅÒ ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
#: ccdfunc.c:420 #: ccdfunc.c:421
msgid "No focusers found" msgid "No focusers found"
msgstr "æÏËÕÓÅÒÏ× ÎÅ ÏÂÎÁÒÕÖÅÎÏ" msgstr "æÏËÕÓÅÒÏ× ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
@ -309,7 +309,7 @@ msgstr "
msgid "No wheels found" msgid "No wheels found"
msgstr "ôÕÒÅÌÅÊ ÎÅ ÏÂÎÁÒÕÖÅÎÏ" msgstr "ôÕÒÅÌÅÊ ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
#: ccdfunc.c:760 #: ccdfunc.c:756
msgid "Only show statistics" msgid "Only show statistics"
msgstr "ôÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÁÔÉÓÔÉËÕ" msgstr "ôÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÁÔÉÓÔÉËÕ"
@ -317,16 +317,16 @@ msgstr "
msgid "PID file (default: " msgid "PID file (default: "
msgstr "PID-ÆÁÊÌ (ÐÏ ÕÍÏÌÞÁÎÉÀ: " msgstr "PID-ÆÁÊÌ (ÐÏ ÕÍÏÌÞÁÎÉÀ: "
#: ccdfunc.c:666 #: ccdfunc.c:660
#, 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:793 #: ccdfunc.c:789
msgid "Read grabbed image" msgid "Read grabbed image"
msgstr "óÞÉÔÙ×ÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ" msgstr "óÞÉÔÙ×ÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ"
#: ccdfunc.c:759 #: ccdfunc.c:755
#, c-format #, c-format
msgid "Readout mode: %s" msgid "Readout mode: %s"
msgstr "òÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ: %s" msgstr "òÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ: %s"
@ -335,34 +335,34 @@ msgstr "
msgid "Server timeout" msgid "Server timeout"
msgstr "ôÁÊÍÁÕÔ ÓÅÒ×ÅÒÁ" msgstr "ôÁÊÍÁÕÔ ÓÅÒ×ÅÒÁ"
#: ccdfunc.c:721 #: ccdfunc.c:717
#, c-format #, c-format
msgid "Set brightness to %g" msgid "Set brightness to %g"
msgstr "õÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g" msgstr "õÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g"
#: ccdfunc.c:660 #: ccdfunc.c:654
#, c-format #, c-format
msgid "Set fan speed to %d" msgid "Set fan speed to %d"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ× × %d" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ× × %d"
#: ccdfunc.c:715 #: ccdfunc.c:711
#, c-format #, c-format
msgid "Set gain to %g" msgid "Set gain to %g"
msgstr "õÓÔÁÎÏ×ÉÔØ Gain × %g" msgstr "õÓÔÁÎÏ×ÉÔØ Gain × %g"
#: ccdfunc.c:688 #: ccdfunc.c:683
#, c-format #, c-format
msgid "Shutter command: %s\n" msgid "Shutter command: %s\n"
msgstr "ëÏÍÁÎÄÁ ÚÁÔ×ÏÒÁ: %s\n" msgstr "ëÏÍÁÎÄÁ ÚÁÔ×ÏÒÁ: %s\n"
#. "Попытка Ñ<>конфигурироваÑÑŒ порт I/O как %d\n" #. "Попытка Ñ<>конфигурироваÑÑŒ порт I/O как %d\n"
#: ccdfunc.c:694 #: ccdfunc.c:689
#, 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:706 #: ccdfunc.c:702
#, 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"
@ -375,7 +375,7 @@ msgstr "
msgid "Wheel device not pointed" msgid "Wheel device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï ÔÕÒÅÌÉ ÎÅ ÕËÁÚÁÎÏ" msgstr "õÓÔÒÏÊÓÔ×Ï ÔÕÒÅÌÉ ÎÅ ÕËÁÚÁÎÏ"
#: ccdfunc.c:571 #: ccdfunc.c:570
#, 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"
@ -509,11 +509,11 @@ msgstr "
msgid "observing program name" msgid "observing program name"
msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ" msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ"
#: imageview.c:517 #: imageview.c:507 imageview.c:579
msgid "off" msgid "off"
msgstr "×ÙËÌ" msgstr "×ÙËÌ"
#: imageview.c:517 #: imageview.c:507 imageview.c:579
msgid "on" msgid "on"
msgstr "×ËÌ" msgstr "×ËÌ"

70
main.c
View File

@ -40,7 +40,7 @@ static int isserver = FALSE;
static pid_t childpid = 0; static pid_t childpid = 0;
void signals(int signo){ void signals(int signo){
signal(signo, SIG_IGN); if(signo) signal(signo, SIG_IGN);
if(childpid){ // master process if(childpid){ // master process
if(signo == SIGUSR1){ // kill child if(signo == SIGUSR1){ // kill child
kill(childpid, signo); kill(childpid, signo);
@ -56,7 +56,7 @@ void signals(int signo){
exit(signo); exit(signo);
} }
// slave: cancel exposition // slave: cancel exposition
WARNX("Get signal %d - exit", signo); if(signo) WARNX("Get signal %d - exit", signo);
if(!GP->client){ if(!GP->client){
DBG("Cancel capturing"); DBG("Cancel capturing");
cancel(); cancel();
@ -64,8 +64,11 @@ void signals(int signo){
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
DBG("KILL GL"); DBG("KILL GL");
closeGL(); closeGL();
usleep(100000); usleep(10000);
#endif #endif
closewheel();
focclose();
closecam();
exit(signo); exit(signo);
} }
@ -102,6 +105,8 @@ int main(int argc, char **argv){
if(!GP->client) isserver = TRUE; if(!GP->client) isserver = TRUE;
} }
if(GP->path && !GP->client) isserver = TRUE; if(GP->path && !GP->client) isserver = TRUE;
if(GP->client && (GP->commondev || GP->focuserdev || GP->cameradev || GP->wheeldev))
ERRX("Can't be client and standalone in same time!");
if(GP->logfile){ if(GP->logfile){
int lvl = LOGLEVEL_WARN + GP->verbose; int lvl = LOGLEVEL_WARN + GP->verbose;
DBG("level = %d", lvl); DBG("level = %d", lvl);
@ -119,31 +124,48 @@ int main(int argc, char **argv){
signal(SIGUSR1, signals); // restart server signal(SIGUSR1, signals); // restart server
// check for another running process in server and standalone mode // check for another running process in server and standalone mode
if(!GP->client) check4running(self, GP->pidfile); if(!GP->client) check4running(self, GP->pidfile);
if(!isserver && !GP->client){ // standalone mode if(!isserver){ // run in standalone or client mode
focusers(); int camerainit = FALSE;
wheels(); if(!GP->client){ // standalone mode
ccds(); focusers(); // run focusers and wheels before showimage
wheels();
camerainit = prepare_ccds();
}else{ // client mode
#ifdef IMAGEVIEW
if(GP->showimage) return viewer(NULL); // TODO
#endif
if(GP->path) return start_socket(isserver, GP->path, FALSE);
if(GP->port) return start_socket(isserver, GP->port, TRUE);
}
#ifdef IMAGEVIEW
if(GP->showimage){ // activate image vindow in capture or simple viewer mode
imagefunc imfn = NULL;
if(GP->cameradev || GP->commondev){if(camerainit) imfn = ccdcaptured;} // capture mode
else imfn = NULL; // TODO - simple file viewer
return viewer(imfn);
}
#endif
if(camerainit) ccds();
return 0; return 0;
} }
LOGMSG("Started"); LOGMSG("Started");
#ifndef EBUG #ifndef EBUG
if(isserver){ unsigned int pause = 5;
unsigned int pause = 5; while(1){
while(1){ childpid = fork();
childpid = fork(); if(childpid){ // master
if(childpid){ // master double t0 = dtime();
double t0 = dtime(); LOGMSG("Created child with pid %d", childpid);
LOGMSG("Created child with pid %d", childpid); wait(NULL);
wait(NULL); LOGERR("Child %d died", childpid);
LOGERR("Child %d died", childpid); if(dtime() - t0 < 1.) pause += 5;
if(dtime() - t0 < 1.) pause += 5; else pause = 1;
else pause = 1; if(pause > 900) pause = 900;
if(pause > 900) pause = 900; sleep(pause); // wait a little before respawn
sleep(pause); // wait a little before respawn }else{ // slave
}else{ // slave prctl(PR_SET_PDEATHSIG, SIGTERM); // send SIGTERM to child when parent dies
prctl(PR_SET_PDEATHSIG, SIGTERM); // send SIGTERM to child when parent dies break;
break;
}
} }
} }
#endif #endif

View File

@ -1009,7 +1009,7 @@ void server(int sock){
} }
focclose(focdev); focclose(focdev);
closewheel(wheeldev); closewheel(wheeldev);
closecam(camdev); closecam();
} }
/** /**