diff --git a/ccdfunc.c b/ccdfunc.c index 84d4e45..adad194 100644 --- a/ccdfunc.c +++ b/ccdfunc.c @@ -19,6 +19,7 @@ #include // dlopen/close #include #include +#include // pthread_kill #include #include #include @@ -424,11 +425,10 @@ int startFocuser(void **dlh){ return TRUE; } -void focclose(void *dlh){ - if(!dlh || !focuser) return; +void focclose(){ + if(!focuser) return; focuser->close(); focuser = NULL; - //dlclose(dlh); } /* @@ -497,7 +497,7 @@ void focusers(){ if(!focuser->setAbsPos(GP->async, tagpos)) WARNX(_("Can't set position %g"), tagpos); } retn: - focclose(dlh); + focclose(); } int startWheel(void **dlh){ @@ -516,11 +516,10 @@ int startWheel(void **dlh){ return TRUE; } -void closewheel(void *dlh){ - if(!dlh || !wheel) return; +void closewheel(){ + if(!wheel) return; wheel->close(); wheel = NULL; - //dlclose(dlh); } /* @@ -574,7 +573,7 @@ void wheels(){ if(!wheel->setPos(pos)) WARNX(_("Can't set wheel position %d"), pos); retn: - closewheel(dlh); + closewheel(); } /* static void closeall(){ @@ -617,24 +616,19 @@ int startCCD(void **dlh){ return TRUE; } -void closecam(void *dlh){ - if(!dlh || !camera) return; +void closecam(){ + if(!camera) return; DBG("Close cam"); camera->close(); camera = NULL; - DBG("close dlh"); - //dlclose(dlh); } -/* - * Find CCDs and work with each of them - */ -void ccds(){ +// make base settings; return TRUE if all OK +int prepare_ccds(){ FNAME(); - float tmpf; - int tmpi; + int rtn = FALSE; void *dlh = NULL; - if(!startCCD(&dlh)) return; + if(!startCCD(&dlh)) return FALSE; if(GP->listdevices){ for(int i = 0; i < camera->Ndevices; ++i){ if(!camera->setDevNo(i)) continue; @@ -681,6 +675,7 @@ void ccds(){ WARNX(_("Can't set T to %g degC"), GP->temperature); verbose(3, "SetT=%.1f", GP->temperature); } + float tmpf; if(camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f", tmpf); if(camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f", tmpf); if(GP->shtr_cmd > -1 && GP->shtr_cmd < SHUTTER_AMOUNT){ @@ -695,6 +690,7 @@ void ccds(){ if(!camera->confio(GP->confio)) WARNX(_("Can't configure (unsupported?)")); } + int tmpi; if(GP->getio){ if(camera->getio(&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! WARNX(_("Can't get current binning")); 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); 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}; -#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; for(int j = 0; j < GP->nframes; ++j){ // Захват кадра %d\n @@ -797,44 +793,13 @@ void ccds(){ break; } calculate_stat(&ima); -#ifdef IMAGEVIEW - 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 + saveFITS(&ima, NULL); if(GP->pause_len && j != (GP->nframes - 1)){ double delta, time1 = dtime() + GP->pause_len; while((delta = time1 - dtime()) > 0.){ // %d секунд до окончания паузы\n verbose(1, _("%d seconds till pause ends\n"), (int)delta); + float tmpf; if(camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f\n", tmpf); if(camera->getTbody(&tmpf)) verbose(1, "BODYTEMP=%.1f\n", tmpf); 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"); FREE(img); -retn: - closecam(dlh); - DBG("closed -> out"); + closecam(); } void cancel(){ @@ -883,3 +818,79 @@ void 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; +} diff --git a/ccdfunc.h b/ccdfunc.h index b747cce..18b6976 100644 --- a/ccdfunc.h +++ b/ccdfunc.h @@ -30,14 +30,16 @@ void calculate_stat(IMG *image); int saveFITS(IMG *img, char **outp); // for imageview module void focusers(); void wheels(); +int prepare_ccds(); void ccds(); void cancel(); int startCCD(void **dlh); int startWheel(void **dlh); int startFocuser(void **dlh); -void focclose(void *dlh); -void closewheel(void *dlh); -void closecam(void *dlh); +void focclose(); +void closewheel(); +void closecam(); +int ccdcaptured(IMG **img); #endif // CCDFUNC_H__ diff --git a/cmdlnopts.c b/cmdlnopts.c index daf7675..1c9daa5 100644 --- a/cmdlnopts.c +++ b/cmdlnopts.c @@ -121,7 +121,7 @@ myoption cmdlnopts[] = { */ glob_pars *parse_args(int argc, char **argv){ // 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 parseargs(&argc, &argv, cmdlnopts); if(help) showhelp(-1, cmdlnopts); diff --git a/events.c b/events.c index 4dc8746..3761d24 100644 --- a/events.c +++ b/events.c @@ -21,11 +21,12 @@ #include "events.h" #include "imageview.h" +extern windowData *win; + /** * manage pressed keys & menu items */ static void processKeybrd(unsigned char key, int mod, _U_ int x, _U_ int y){ - windowData *win = getWin(); if(!win) return; DBG("key=%d (%c), mod=%d", key, key, mod); 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 // state: GLUT_UP, GLUT_DOWN int mod = glutGetModifiers() & 7; - windowData *win = getWin(); if(!win) return; if(state == GLUT_DOWN){ oldx = x; oldy = y; @@ -130,7 +130,6 @@ void mousePressed(int key, int state, int x, int y){ } void mouseMove(int x, int y){ - windowData *win = getWin(); if(!win) return; if(movingwin){ float X, Y, nx, ny, w2, h2; @@ -183,7 +182,6 @@ static const menuentry entries[] = { void createMenu(){ FNAME(); - windowData *win = getWin(); if(!win) return; DBG("menu for win ID %d", win->ID); glutSetWindow(win->ID); diff --git a/imageview.c b/imageview.c index d7d4f56..cd2ecf0 100644 --- a/imageview.c +++ b/imageview.c @@ -28,7 +28,7 @@ #include "imageview.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 int imequalize = TRUE; 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 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 */ @@ -109,7 +127,7 @@ static void createWindow(){ DBG("Window opened"); } -int killwindow(){ +static int killwindow(){ if(!win) return 0; if(!win->killthread){ // say threads to die @@ -140,7 +158,8 @@ int killwindow(){ 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; char *c; 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); x1 = x1 + glutBitmapWidth(font,*c);// + 1; } -} +}*/ static void RedrawWindow(){ //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){ FNAME(); + if(!initialized) return; if(!initialized || !win || win->killthread) return; glutReshapeWindow(width, height); 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) * 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(); if(!initialized) imageview_init(); if(win) killwindow(); @@ -255,58 +275,22 @@ windowData *createGLwin(char *title, int w, int h, rawimage *rawdata){ } } if(!raw || !raw->rawdata){ - free(raw); - return NULL; + FREE(raw); + FREE(win); + return; } win->title = strdup(title); win->image = raw; if(pthread_mutex_init(&win->mutex, NULL)){ WARN(_("Can't init mutex!")); killwindow(); - return NULL; + return; } win->w = w; win->h = h; 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 * 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); } - -windowData *getWin(){ - return win; -} - /** * Convert gray (unsigned short) into RGB components (GLubyte) * @argument L - gray level (0..1) @@ -451,12 +430,21 @@ static uint8_t *equalize(uint16_t *ori, int w, int h){ return retn; } -void change_displayed_image(windowData *win, IMG *img){ +static void change_displayed_image(IMG *img){ 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); + 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; + 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){ uint8_t *newima = equalize(img->data, w, h); GLubyte *dst = im->rawdata; @@ -490,11 +478,13 @@ void change_displayed_image(windowData *win, IMG *img){ pthread_mutex_unlock(&win->mutex); } -void* image_thread(_U_ void *data){ +#if 0 +// thread for checking +static void* image_thread(void *data){ FNAME(); - IMG *img = (IMG*) data; + IMG *(*newimage)(const char *) = (IMG*(*)(const char*)) data; + IMG *img = NULL; while(1){ - windowData *win = getWin(); if(!win || win->killthread){ DBG("got killthread"); clear_GL_context(); @@ -520,9 +510,77 @@ void* image_thread(_U_ void *data){ usleep(10000); } } +#endif void closeGL(){ - windowData *win = getWin(); 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;} diff --git a/imageview.h b/imageview.h index 51d56ca..9a41767 100644 --- a/imageview.h +++ b/imageview.h @@ -28,13 +28,6 @@ #include "ccdfunc.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: // temporaly stop capture of regular sequence #define WINEVT_PAUSE (1<<0) @@ -51,6 +44,14 @@ typedef struct{ #define WIN_FLIP_LR (1<<0) #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{ int ID; // identificator of OpenGL 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 } windowData; +/* typedef enum{ INNER, OPENGL } winIdType; - -void imageview_init(); +*/ 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 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); +windowData* getWin(); -void* image_thread(void *data); -void change_displayed_image(windowData *win, IMG *img); +typedef int (*imagefunc)(IMG**); + +int viewer(imagefunc); #endif // IMAGEVIEW_H__ diff --git a/locale/ru/messages.po b/locale/ru/messages.po index f97493d..02a82ff 100644 --- a/locale/ru/messages.po +++ b/locale/ru/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -245,59 +245,59 @@ msgstr "" msgid "Display image in OpenGL window" msgstr "" -#: ccdfunc.c:63 +#: ccdfunc.c:64 #, c-format msgid "Can't find plugin %s: %s" msgstr "" -#: ccdfunc.c:75 +#: ccdfunc.c:76 #, c-format msgid "Can't find focuser in plugin %s: %s" msgstr "" -#: ccdfunc.c:86 +#: ccdfunc.c:87 #, c-format msgid "Can't find camera in plugin %s: %s" msgstr "" -#: ccdfunc.c:97 +#: ccdfunc.c:98 #, c-format msgid "Can't find wheel in plugin %s: %s" msgstr "" -#: ccdfunc.c:183 +#: ccdfunc.c:184 msgid "Camera device unknown" msgstr "" -#: ccdfunc.c:189 +#: ccdfunc.c:190 msgid "Neither filename nor filename prefix pointed!" msgstr "" #. п²п╣ п╪п╬пЁя┐ я│п╬я┘я─п╟п╫п╦я┌я▄ я└п╟п╧п╩ -#: ccdfunc.c:208 +#: ccdfunc.c:209 #, c-format msgid "Can't save file with prefix %s" msgstr "" -#: ccdfunc.c:356 +#: ccdfunc.c:357 #, c-format msgid "File saved as '%s'" msgstr "" -#: ccdfunc.c:365 +#: ccdfunc.c:366 msgid "Error saving file" msgstr "" -#: ccdfunc.c:405 +#: ccdfunc.c:406 #, c-format msgid "Image stat:\n" msgstr "" -#: ccdfunc.c:413 +#: ccdfunc.c:414 msgid "Focuser device not pointed" msgstr "" -#: ccdfunc.c:420 +#: ccdfunc.c:421 msgid "No focusers found" msgstr "" @@ -340,217 +340,213 @@ msgstr "" msgid "No wheels found" msgstr "" -#: ccdfunc.c:544 +#: ccdfunc.c:543 #, c-format msgid "Found %d wheels, you point number %d" msgstr "" -#: ccdfunc.c:548 +#: ccdfunc.c:547 msgid "Can't set active wheel number" msgstr "" -#: ccdfunc.c:564 +#: ccdfunc.c:563 msgid "Can't get max wheel position" msgstr "" -#: ccdfunc.c:571 +#: ccdfunc.c:570 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "" -#: ccdfunc.c:575 +#: ccdfunc.c:574 #, c-format msgid "Can't set wheel position %d" msgstr "" -#: ccdfunc.c:592 +#: ccdfunc.c:591 #, c-format msgid "%.1f seconds till exposition ends" msgstr "" -#: ccdfunc.c:606 +#: ccdfunc.c:605 msgid "Camera device not pointed" msgstr "" -#: ccdfunc.c:613 ccdfunc.c:614 +#: ccdfunc.c:612 ccdfunc.c:613 msgid "No cameras found" msgstr "" -#: ccdfunc.c:649 +#: ccdfunc.c:643 #, c-format msgid "Found %d cameras, you point number %d" msgstr "" -#: ccdfunc.c:653 +#: ccdfunc.c:647 msgid "Can't set active camera number" msgstr "" -#: ccdfunc.c:659 +#: ccdfunc.c:653 msgid "Can't set fan speed" msgstr "" -#: ccdfunc.c:660 +#: ccdfunc.c:654 #, c-format msgid "Set fan speed to %d" msgstr "" -#: ccdfunc.c:665 +#: ccdfunc.c:659 #, c-format msgid "Camera model: %s" msgstr "" -#: ccdfunc.c:666 +#: ccdfunc.c:660 #, c-format msgid "Pixel size: %g x %g" msgstr "" -#: ccdfunc.c:672 +#: ccdfunc.c:666 #, c-format msgid "Full array: %s" msgstr "" -#: ccdfunc.c:675 +#: ccdfunc.c:669 #, c-format msgid "Field of view: %s" msgstr "" -#: ccdfunc.c:678 +#: ccdfunc.c:672 #, c-format msgid "Current format: %s" msgstr "" -#: ccdfunc.c:681 +#: ccdfunc.c:675 #, c-format msgid "Can't set T to %g degC" msgstr "" -#: ccdfunc.c:688 +#: ccdfunc.c:683 #, c-format msgid "Shutter command: %s\n" msgstr "" -#: ccdfunc.c:690 +#: ccdfunc.c:685 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "" #. "п÷п╬п©я▀я┌п╨п╟ я│п╨п╬п╫я└п╦пЁя┐я─п╦я─п╬п╡п╟я┌я▄ п©п╬я─я┌ I/O п╨п╟п╨ %d\n" -#: ccdfunc.c:694 +#: ccdfunc.c:689 #, c-format msgid "Try to configure I/O port as %d" msgstr "" -#: ccdfunc.c:696 +#: ccdfunc.c:691 msgid "Can't configure (unsupported?)" msgstr "" -#: ccdfunc.c:702 +#: ccdfunc.c:698 msgid "Can't get IOport state (unsupported?)" msgstr "" #. "п÷п╬п©я▀я┌п╨п╟ п╥п╟п©п╦я│п╦ %d п╡ п©п╬я─я┌ I/O\n" -#: ccdfunc.c:706 +#: ccdfunc.c:702 #, c-format msgid "Try to write %d to I/O port" msgstr "" -#: ccdfunc.c:708 +#: ccdfunc.c:704 msgid "Can't set IOport" msgstr "" -#: ccdfunc.c:715 +#: ccdfunc.c:711 #, c-format msgid "Set gain to %g" msgstr "" -#: ccdfunc.c:716 +#: ccdfunc.c:712 #, c-format msgid "Can't set gain to %g" msgstr "" -#: ccdfunc.c:721 +#: ccdfunc.c:717 #, c-format msgid "Set brightness to %g" msgstr "" -#: ccdfunc.c:722 +#: ccdfunc.c:718 #, c-format msgid "Can't set brightness to %g" msgstr "" -#: ccdfunc.c:730 server.c:223 +#: ccdfunc.c:726 server.c:223 #, c-format msgid "Can't set binning %dx%d" msgstr "" -#: ccdfunc.c:742 server.c:224 +#: ccdfunc.c:738 server.c:224 msgid "Can't set given geometry" msgstr "" -#: ccdfunc.c:746 +#: ccdfunc.c:742 #, c-format msgid "Can't set %d flushes" msgstr "" -#: ccdfunc.c:750 +#: ccdfunc.c:746 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "" -#: ccdfunc.c:753 +#: ccdfunc.c:749 msgid "Can't change frame type" msgstr "" -#: ccdfunc.c:756 +#: ccdfunc.c:752 msgid "Can't set bit depth" msgstr "" -#: ccdfunc.c:758 +#: ccdfunc.c:754 msgid "Can't set readout speed" msgstr "" -#: ccdfunc.c:759 +#: ccdfunc.c:755 #, c-format msgid "Readout mode: %s" msgstr "" -#: ccdfunc.c:760 +#: ccdfunc.c:756 msgid "Only show statistics" msgstr "" #. GET binning should be AFTER setgeometry! -#: ccdfunc.c:762 +#: ccdfunc.c:758 msgid "Can't get current binning" msgstr "" -#: ccdfunc.c:776 -msgid "Can't open OpenGL window, image preview will be inaccessible" -msgstr "" - #. п≈п╟я┘п╡п╟я┌ п╨п╟п╢я─п╟ %d\n -#: ccdfunc.c:784 +#: ccdfunc.c:780 #, c-format msgid "Capture frame %d" msgstr "" -#: ccdfunc.c:786 server.c:121 +#: ccdfunc.c:782 ccdfunc.c:830 server.c:121 msgid "Can't start exposition" msgstr "" -#: ccdfunc.c:790 ccdfunc.c:816 ccdfunc.c:857 +#: ccdfunc.c:786 msgid "Can't capture image" msgstr "" -#: ccdfunc.c:793 +#: ccdfunc.c:789 msgid "Read grabbed image" msgstr "" -#: ccdfunc.c:796 ccdfunc.c:820 ccdfunc.c:861 +#: ccdfunc.c:792 ccdfunc.c:838 msgid "Can't grab image" msgstr "" #. %d я│п╣п╨я┐п╫п╢ п╢п╬ п╬п╨п╬п╫я┤п╟п╫п╦я▐ п©п╟я┐п╥я▀\n -#: ccdfunc.c:837 client.c:260 +#: ccdfunc.c:801 client.c:260 #, c-format msgid "%d seconds till pause ends\n" msgstr "" @@ -567,28 +563,32 @@ msgstr "" msgid "Server timeout" msgstr "" -#: imageview.c:264 -msgid "Can't init mutex!" -msgstr "" - -#: imageview.c:282 +#: imageview.c:49 msgid "Already initialized!" msgstr "" -#: imageview.c:408 +#: imageview.c:285 +msgid "Can't init mutex!" +msgstr "" + +#: imageview.c:387 #, c-format msgid "Histogram conversion: %s" msgstr "" -#: imageview.c:517 +#: imageview.c:507 imageview.c:579 #, c-format msgid "Equalization of histogram: %s" msgstr "" -#: imageview.c:517 +#: imageview.c:507 imageview.c:579 msgid "on" msgstr "" -#: imageview.c:517 +#: imageview.c:507 imageview.c:579 msgid "off" msgstr "" + +#: imageview.c:545 +msgid "Can't open OpenGL window, image preview will be inaccessible" +msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index ed7df68..35c9f25 100644 --- a/locale/ru/ru.po +++ b/locale/ru/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2023-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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,18 +16,18 @@ msgstr "Project-Id-Version: PACKAGE VERSION\n" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" -#: ccdfunc.c:592 +#: ccdfunc.c:591 #, c-format msgid "%.1f seconds till exposition ends" msgstr "%.1f секунд до окончания экспозиции" #. %d я│п╣п╨я┐п╫п╢ п╢п╬ п╬п╨п╬п╫я┤п╟п╫п╦я▐ п©п╟я┐п╥я▀\n -#: ccdfunc.c:837 client.c:260 +#: ccdfunc.c:801 client.c:260 #, c-format msgid "%d seconds till pause ends\n" msgstr "%d секунд до окончания паузы\n" -#: imageview.c:282 +#: imageview.c:49 msgid "Already initialized!" msgstr "Уже инициализировано!" @@ -39,57 +39,57 @@ msgstr " msgid "CMOS gain level" msgstr "уровень Gain CMOS" -#: ccdfunc.c:606 +#: ccdfunc.c:605 msgid "Camera device not pointed" msgstr "Устройство свеоприемника не подключено" -#: ccdfunc.c:183 +#: ccdfunc.c:184 msgid "Camera device unknown" msgstr "Устройство свеоприемника не опознано" -#: ccdfunc.c:665 +#: ccdfunc.c:659 #, c-format msgid "Camera model: %s" msgstr "Модель светоприемника: %s" -#: ccdfunc.c:790 ccdfunc.c:816 ccdfunc.c:857 +#: ccdfunc.c:786 msgid "Can't capture image" msgstr "Не могу захватить изображение" -#: ccdfunc.c:753 +#: ccdfunc.c:749 msgid "Can't change frame type" msgstr "Не могу изменить тип кадра" -#: ccdfunc.c:696 +#: ccdfunc.c:691 msgid "Can't configure (unsupported?)" msgstr "Не могу сконфигурировать (опция не поддерживается?)" -#: ccdfunc.c:86 +#: ccdfunc.c:87 #, c-format msgid "Can't find camera in plugin %s: %s" msgstr "Не могу найти плагин камеры %s: %s" -#: ccdfunc.c:75 +#: ccdfunc.c:76 #, c-format msgid "Can't find focuser in plugin %s: %s" msgstr "Не могу найти плагин фокусера %s: %s" -#: ccdfunc.c:63 +#: ccdfunc.c:64 #, c-format msgid "Can't find plugin %s: %s" msgstr "Не могу найти плагин %s: %s" -#: ccdfunc.c:97 +#: ccdfunc.c:98 #, c-format msgid "Can't find wheel in plugin %s: %s" msgstr "Не могу найти плагин турели %s: %s" -#: ccdfunc.c:702 +#: ccdfunc.c:698 msgid "Can't get IOport state (unsupported?)" msgstr "Не могу получить состояние порта I/O (не поддерживается?)" #. GET binning should be AFTER setgeometry! -#: ccdfunc.c:762 +#: ccdfunc.c:758 msgid "Can't get current binning" msgstr "Не могу получить текущее значение биннинга" @@ -101,11 +101,11 @@ msgstr " msgid "Can't get focuser limit positions" msgstr "Не могу определить предельную позицию фокусера" -#: ccdfunc.c:564 +#: ccdfunc.c:563 msgid "Can't get max wheel position" msgstr "Не могу определить предельную позицию колеса" -#: ccdfunc.c:796 ccdfunc.c:820 ccdfunc.c:861 +#: ccdfunc.c:792 ccdfunc.c:838 msgid "Can't grab image" msgstr "Не могу захватить изображение" @@ -113,7 +113,7 @@ msgstr " msgid "Can't home focuser" msgstr "Не могу установить фокусер в нуль" -#: imageview.c:264 +#: imageview.c:285 msgid "Can't init mutex!" msgstr "Не могу инициализировать мьютекс!" @@ -121,36 +121,36 @@ msgstr " msgid "Can't make exposition" msgstr "Не могу выполнить экспозицию" -#: ccdfunc.c:776 +#: imageview.c:545 msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr "Не могу открыть окно OpenGL, отображение будет недоступно" -#: ccdfunc.c:690 +#: ccdfunc.c:685 #, c-format msgid "Can't run shutter command %s (unsupported?)" msgstr "Не могу выполнить команду затвора %s (не поддерживается?)" #. п²п╣ п╪п╬пЁя┐ я│п╬я┘я─п╟п╫п╦я┌я▄ я└п╟п╧п╩ -#: ccdfunc.c:208 +#: ccdfunc.c:209 #, c-format msgid "Can't save file with prefix %s" msgstr "Не могу сохранить файл с префиксом %s" -#: ccdfunc.c:746 +#: ccdfunc.c:742 #, c-format msgid "Can't set %d flushes" msgstr "Не могу установить %d сбросов" -#: ccdfunc.c:708 +#: ccdfunc.c:704 msgid "Can't set IOport" msgstr "Не могу поменять значения порта I/O" -#: ccdfunc.c:681 +#: ccdfunc.c:675 #, c-format msgid "Can't set T to %g degC" msgstr "Не могу установить температуру в %g градЦ" -#: ccdfunc.c:653 +#: ccdfunc.c:647 msgid "Can't set active camera number" msgstr "Не могу установить номер активной камеры" @@ -158,39 +158,39 @@ msgstr " msgid "Can't set active focuser number" msgstr "Не могу установить номер активного фокусера" -#: ccdfunc.c:548 +#: ccdfunc.c:547 msgid "Can't set active wheel number" msgstr "Не могу установить номер активного колеса" -#: ccdfunc.c:730 server.c:223 +#: ccdfunc.c:726 server.c:223 #, c-format msgid "Can't set binning %dx%d" msgstr "Не могу установить биннинг %dx%d" -#: ccdfunc.c:756 +#: ccdfunc.c:752 msgid "Can't set bit depth" msgstr "Не могу установить разрядность АЦП" -#: ccdfunc.c:722 +#: ccdfunc.c:718 #, c-format msgid "Can't set brightness to %g" msgstr "Не могу установить яркость в %g" -#: ccdfunc.c:750 +#: ccdfunc.c:746 #, c-format msgid "Can't set exposure time to %f seconds" msgstr "Не могу установить экспозицию в %f секунд" -#: ccdfunc.c:659 +#: ccdfunc.c:653 msgid "Can't set fan speed" msgstr "Не могу установить скорость вентиляторов" -#: ccdfunc.c:716 +#: ccdfunc.c:712 #, c-format msgid "Can't set gain to %g" msgstr "Не могу установить Gain в %g" -#: ccdfunc.c:742 server.c:224 +#: ccdfunc.c:738 server.c:224 msgid "Can't set given geometry" msgstr "Не могу установить геометрию" @@ -204,26 +204,26 @@ msgstr " msgid "Can't set position %g: out of limits [%g, %g]" msgstr "Не могу установить позицию %g: вне пределов [%g, %g]" -#: ccdfunc.c:758 +#: ccdfunc.c:754 msgid "Can't set readout speed" msgstr "Не могу установить скорость считывания" -#: ccdfunc.c:575 +#: ccdfunc.c:574 #, c-format msgid "Can't set wheel position %d" msgstr "Не могу установить положение колеса %d" -#: ccdfunc.c:786 server.c:121 +#: ccdfunc.c:782 ccdfunc.c:830 server.c:121 msgid "Can't start exposition" msgstr "Не могу начать экспозицию" #. п≈п╟я┘п╡п╟я┌ п╨п╟п╢я─п╟ %d\n -#: ccdfunc.c:784 +#: ccdfunc.c:780 #, c-format msgid "Capture frame %d" msgstr "Захват кадра %d" -#: ccdfunc.c:678 +#: ccdfunc.c:672 #, c-format msgid "Current format: %s" msgstr "" @@ -232,30 +232,30 @@ msgstr "" msgid "Display image in OpenGL window" msgstr "Отображение изображения в окне OpenGL" -#: imageview.c:517 +#: imageview.c:507 imageview.c:579 #, c-format msgid "Equalization of histogram: %s" msgstr "Эквализация гистограммы: %s" -#: ccdfunc.c:365 +#: ccdfunc.c:366 msgid "Error saving file" msgstr "Ошибка сохранения файла" -#: ccdfunc.c:675 +#: ccdfunc.c:669 #, c-format msgid "Field of view: %s" msgstr "Поле зрения: %s" -#: ccdfunc.c:356 +#: ccdfunc.c:357 #, c-format msgid "File saved as '%s'" msgstr "Файл сохранен как '%s'" -#: ccdfunc.c:413 +#: ccdfunc.c:414 msgid "Focuser device not pointed" msgstr "Устройство фокусера не указано" -#: ccdfunc.c:649 +#: ccdfunc.c:643 #, c-format msgid "Found %d cameras, you point number %d" msgstr "Обнаружено %d камер, вы указали %d" @@ -265,22 +265,22 @@ msgstr " msgid "Found %d focusers, you point number %d" msgstr "Обнаружено %d фокусеров, вы указали %d" -#: ccdfunc.c:544 +#: ccdfunc.c:543 #, c-format msgid "Found %d wheels, you point number %d" msgstr "Обнаружено %d колес, вы указали %d" -#: ccdfunc.c:672 +#: ccdfunc.c:666 #, c-format msgid "Full array: %s" msgstr "Полный формат: %s" -#: imageview.c:408 +#: imageview.c:387 #, c-format msgid "Histogram conversion: %s" msgstr "Преобразование гистограммы: %s" -#: ccdfunc.c:405 +#: ccdfunc.c:406 #, c-format msgid "Image stat:\n" msgstr "Статистика по изображению: \n" @@ -289,7 +289,7 @@ msgstr " msgid "N flushes before exposing (default: 1)" msgstr "N засвечиваний перед экспозицией (по умолчанию: 1)" -#: ccdfunc.c:189 +#: ccdfunc.c:190 msgid "Neither filename nor filename prefix pointed!" msgstr "Ни имя файла, ни префикс не указаны!" @@ -297,11 +297,11 @@ msgstr " msgid "No camera device" msgstr "Не указано устройство камеры" -#: ccdfunc.c:613 ccdfunc.c:614 +#: ccdfunc.c:612 ccdfunc.c:613 msgid "No cameras found" msgstr "Камер не обнаружено" -#: ccdfunc.c:420 +#: ccdfunc.c:421 msgid "No focusers found" msgstr "Фокусеров не обнаружено" @@ -309,7 +309,7 @@ msgstr " msgid "No wheels found" msgstr "Турелей не обнаружено" -#: ccdfunc.c:760 +#: ccdfunc.c:756 msgid "Only show statistics" msgstr "Только отобразить статистику" @@ -317,16 +317,16 @@ msgstr " msgid "PID file (default: " msgstr "PID-файл (по умолчанию: " -#: ccdfunc.c:666 +#: ccdfunc.c:660 #, c-format msgid "Pixel size: %g x %g" msgstr "Размер пикселя: %g x %g" -#: ccdfunc.c:793 +#: ccdfunc.c:789 msgid "Read grabbed image" msgstr "Считывание изображения" -#: ccdfunc.c:759 +#: ccdfunc.c:755 #, c-format msgid "Readout mode: %s" msgstr "Режим считывания: %s" @@ -335,34 +335,34 @@ msgstr " msgid "Server timeout" msgstr "Таймаут сервера" -#: ccdfunc.c:721 +#: ccdfunc.c:717 #, c-format msgid "Set brightness to %g" msgstr "Установить яркость в %g" -#: ccdfunc.c:660 +#: ccdfunc.c:654 #, c-format msgid "Set fan speed to %d" msgstr "Не могу установить скорость вентиляторов в %d" -#: ccdfunc.c:715 +#: ccdfunc.c:711 #, c-format msgid "Set gain to %g" msgstr "Установить Gain в %g" -#: ccdfunc.c:688 +#: ccdfunc.c:683 #, c-format msgid "Shutter command: %s\n" msgstr "Команда затвора: %s\n" #. "п÷п╬п©я▀я┌п╨п╟ я│п╨п╬п╫я└п╦пЁя┐я─п╦я─п╬п╡п╟я┌я▄ п©п╬я─я┌ I/O п╨п╟п╨ %d\n" -#: ccdfunc.c:694 +#: ccdfunc.c:689 #, c-format msgid "Try to configure I/O port as %d" msgstr "Попытка сконфигурировать порт I/O как %d" #. "п÷п╬п©я▀я┌п╨п╟ п╥п╟п©п╦я│п╦ %d п╡ п©п╬я─я┌ I/O\n" -#: ccdfunc.c:706 +#: ccdfunc.c:702 #, c-format msgid "Try to write %d to I/O port" msgstr "Попытка записи %d в порт I/O" @@ -375,7 +375,7 @@ msgstr " msgid "Wheel device not pointed" msgstr "Устройство турели не указано" -#: ccdfunc.c:571 +#: ccdfunc.c:570 #, c-format msgid "Wheel position should be from 0 to %d" msgstr "Позиция колеса должна быть от 0 до %d" @@ -509,11 +509,11 @@ msgstr " msgid "observing program name" msgstr "название программы" -#: imageview.c:517 +#: imageview.c:507 imageview.c:579 msgid "off" msgstr "выкл" -#: imageview.c:517 +#: imageview.c:507 imageview.c:579 msgid "on" msgstr "вкл" diff --git a/main.c b/main.c index 8f47a22..ef51fd0 100644 --- a/main.c +++ b/main.c @@ -40,7 +40,7 @@ static int isserver = FALSE; static pid_t childpid = 0; void signals(int signo){ - signal(signo, SIG_IGN); + if(signo) signal(signo, SIG_IGN); if(childpid){ // master process if(signo == SIGUSR1){ // kill child kill(childpid, signo); @@ -56,7 +56,7 @@ void signals(int signo){ exit(signo); } // slave: cancel exposition - WARNX("Get signal %d - exit", signo); + if(signo) WARNX("Get signal %d - exit", signo); if(!GP->client){ DBG("Cancel capturing"); cancel(); @@ -64,8 +64,11 @@ void signals(int signo){ #ifdef IMAGEVIEW DBG("KILL GL"); closeGL(); - usleep(100000); + usleep(10000); #endif + closewheel(); + focclose(); + closecam(); exit(signo); } @@ -102,6 +105,8 @@ int main(int argc, char **argv){ if(!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){ int lvl = LOGLEVEL_WARN + GP->verbose; DBG("level = %d", lvl); @@ -119,31 +124,48 @@ int main(int argc, char **argv){ signal(SIGUSR1, signals); // restart server // check for another running process in server and standalone mode if(!GP->client) check4running(self, GP->pidfile); - if(!isserver && !GP->client){ // standalone mode - focusers(); - wheels(); - ccds(); + if(!isserver){ // run in standalone or client mode + int camerainit = FALSE; + if(!GP->client){ // standalone mode + 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; } LOGMSG("Started"); #ifndef EBUG - if(isserver){ - unsigned int pause = 5; - while(1){ - childpid = fork(); - if(childpid){ // master - double t0 = dtime(); - LOGMSG("Created child with pid %d", childpid); - wait(NULL); - LOGERR("Child %d died", childpid); - if(dtime() - t0 < 1.) pause += 5; - else pause = 1; - if(pause > 900) pause = 900; - sleep(pause); // wait a little before respawn - }else{ // slave - prctl(PR_SET_PDEATHSIG, SIGTERM); // send SIGTERM to child when parent dies - break; - } + unsigned int pause = 5; + while(1){ + childpid = fork(); + if(childpid){ // master + double t0 = dtime(); + LOGMSG("Created child with pid %d", childpid); + wait(NULL); + LOGERR("Child %d died", childpid); + if(dtime() - t0 < 1.) pause += 5; + else pause = 1; + if(pause > 900) pause = 900; + sleep(pause); // wait a little before respawn + }else{ // slave + prctl(PR_SET_PDEATHSIG, SIGTERM); // send SIGTERM to child when parent dies + break; } } #endif diff --git a/server.c b/server.c index 8534959..180d1f0 100644 --- a/server.c +++ b/server.c @@ -1009,7 +1009,7 @@ void server(int sock){ } focclose(focdev); closewheel(wheeldev); - closecam(camdev); + closecam(); } /**