diff --git a/ccdfunc.c b/ccdfunc.c index 6ca0c92..2c9ac01 100644 --- a/ccdfunc.c +++ b/ccdfunc.c @@ -212,7 +212,7 @@ int saveFITS(IMG *img, char **outp){ } int width = img->w, height = img->h; void *data = (void*) img->data; - long naxes[2] = {width, height}, tmpl; + long naxes[2] = {width, height}; double tmpd = 0.0; float tmpf = 0.0; int tmpi = 0; diff --git a/client.c b/client.c index 1cd4b37..330b982 100644 --- a/client.c +++ b/client.c @@ -28,16 +28,17 @@ #include "ccdfunc.h" // framerate #include "client.h" #include "cmdlnopts.h" +#include "imageview.h" #include "server.h" // for common commands names #include "socket.h" static char sendbuf[BUFSIZ]; // send message and wait any answer -#define SENDMSG(...) do{snprintf(sendbuf, BUFSIZ-1, __VA_ARGS__); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf); getans(sock, NULL);}while(0) +#define SENDMSG(...) do{DBG("SENDMSG"); snprintf(sendbuf, BUFSIZ-1, __VA_ARGS__); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf); while(getans(sock, NULL));} while(0) // send message and wait answer starting with 'cmd' -#define SENDMSGW(cmd, ...) do{snprintf(sendbuf, BUFSIZ-1, cmd __VA_ARGS__); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf); getans(sock, cmd);}while(0) +#define SENDMSGW(cmd, ...) do{DBG("SENDMSGW"); snprintf(sendbuf, BUFSIZ-1, cmd __VA_ARGS__); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf);}while(!getans(sock, cmd)) // send command and wait for answer on it -#define SENDCMDW(cmd) do{strncpy(sendbuf, cmd, BUFSIZ-1); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf); getans(sock, cmd);}while(0) +#define SENDCMDW(cmd) do{DBG("SENDCMDW"); strncpy(sendbuf, cmd, BUFSIZ-1); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf);}while(!getans(sock, cmd)) static volatile atomic_int expstate = CAMERA_CAPTURE; static int xm0,ym0,xm1,ym1; // max format static int xc0,yc0,xc1,yc1; // current format @@ -89,22 +90,27 @@ static int parseans(char *ans){ if(0 == strcmp(CMD_EXPSTATE, ans)){ expstate = atoi(val); DBG("Exposition state: %d", expstate); + return TRUE; }else if(0 == strcmp(CMD_FRAMEMAX, ans)){ sscanf(val, "%d,%d,%d,%d", &xm0, &ym0, &xm1, &ym1); DBG("Got maxformat: %d,%d,%d,%d", xm0, ym0, xm1, ym1); + return TRUE; }else if(0 == strcmp(CMD_FRAMEFORMAT, ans)){ sscanf(val, "%d,%d,%d,%d", &xc0, &yc0, &xc1, &yc1); DBG("Got current format: %d,%d,%d,%d", xc0, yc0, xc1, yc1); + return TRUE; } #ifdef IMAGEVIEW else if(0 == strcmp(CMD_IMWIDTH, ans)){ ima.w = atoi(val); DBG("Get width: %d", ima.w); imdatalen = ima.w * ima.h * 2; + return TRUE; }else if(0 == strcmp(CMD_IMHEIGHT, ans)){ ima.h = atoi(val); DBG("Get height: %d", ima.h); imdatalen = ima.w * ima.h * 2; + return TRUE; } #endif //TIMESTAMP("parseans() end"); @@ -118,20 +124,24 @@ static int getans(int sock, const char *msg){ char *ans = NULL; while(dtime() - t0 < ANSWER_TIMEOUT){ char *s = readmsg(sock); - if(!s){ // buffer is empty, return last message or wait for it - if(ans) return TRUE; + if(!s) continue; + /*if(!s){ // buffer is empty, return last message or wait for it + if(ans) return (msg ? FALSE : TRUE); else continue; - } + }*/ t0 = dtime(); ans = s; TIMESTAMP("Got from server: %s", ans); verbose(1, "\t%s", ans); +DBG("1 msg-> %s, ans -> %s", msg, ans); if(parseans(ans)){ + DBG("2 msg-> %s, ans -> %s", msg, ans); if(msg && strncmp(ans, msg, strlen(msg))) continue; + DBG("BREAK"); break; } } - DBG("GETANS: timeout, ans: %s", ans); + DBG("GETANS: %s, %s", ans, (dtime()-t0 > ANSWER_TIMEOUT) ? "timeout" : "got answer"); return ((ans) ? TRUE : FALSE); } @@ -345,6 +355,8 @@ static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net if(controlfd < 0) return NULL; int sock = controlfd; while(1){ + DBG("xx"); + if(!getWin()) exit(1); expstate = CAMERA_CAPTURE; TIMESTAMP("End of cycle, start new #%d", grabno+1); TIMEINIT(); @@ -378,6 +390,7 @@ static void *waitimage(void _U_ *arg){ // passive waiting for next image if(controlfd < 0) return NULL; int sock = controlfd; while(1){ + if(!getWin()) exit(1); getans(sock, NULL); if(expstate != CAMERA_FRAMERDY){ usleep(1000); diff --git a/imageview.c b/imageview.c index 4e092cd..f2c6cc0 100644 --- a/imageview.c +++ b/imageview.c @@ -129,15 +129,12 @@ static void createWindow(){ DBG("Window opened"); } -static int killwindow(){ - if(!win) return 0; +static void killwindow(){ + if(!win) return; if(!win->killthread){ // say threads to die win->killthread = 1; } - //DBG("Lock mutex"); - //pthread_mutex_lock(&win->mutex); - //pthread_join(win->thread, NULL); // wait while thread dies if(win->menu){ DBG("Destroy menu"); glutDestroyMenu(win->menu); @@ -146,18 +143,25 @@ static int killwindow(){ glutDestroyWindow(win->ID); DBG("Delete textures"); glDeleteTextures(1, &(win->Tex)); - DBG("Cancel"); + if(GLUTthread){ + DBG("Leave mainloop"); + glutLeaveMainLoop(); + DBG("cancel GLUTthread"); + pthread_cancel(GLUTthread); + GLUTthread = 0; + } + DBG("main GL thread cancelled"); + initialized = 0; windowData *old = win; win = NULL; DBG("free(rawdata)"); FREE(old->image->rawdata); DBG("free(image)"); FREE(old->image); - //pthread_mutex_unlock(&old->mutex); DBG("free(win)"); FREE(old); DBG("return"); - return 1; + return; } /* @@ -525,20 +529,15 @@ static void* image_thread(void *data){ } #endif -void closeGL(){ - if(win) win->killthread = 1; - usleep(1000); +void closeGL(){ // killed by external signal or ctrl+c if(!initialized) return; - initialized = 0; + DBG("KILLL"); camstop(); // cancel expositions - //DBG("Leave mainloop"); - //glutLeaveMainLoop(); - DBG("kill"); - killwindow(); - DBG("join"); - if(GLUTthread) pthread_join(GLUTthread, NULL); // wait while main thread exits - DBG("main GL thread cancelled"); - usleep(1000); + win->killthread = 1; + while(initialized){ + usleep(100000); + if(initialized) killwindow(); // kill here, if `viewer` died + } } /** @@ -562,9 +561,11 @@ int viewer(imagefunc newimage){ IMG *img = NULL; //double t0 = dtime(); while(1){ - if(!win || win->killthread){ + if(!win || win->killthread){ // got kill from ctrl+q DBG("got killthread"); newimage((void*)-1); + DBG("kill"); + killwindow(); signals(0); // just run common cleaner return 0; } diff --git a/locale/ru/messages.po b/locale/ru/messages.po index 3648bda..7969e43 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-04-11 14:57+0300\n" +"POT-Creation-Date: 2023-05-06 14:36+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -546,7 +546,7 @@ msgid "Can't grab image" msgstr "" #. %d секунд до окончания паузы\n -#: ccdfunc.c:807 client.c:278 +#: ccdfunc.c:807 client.c:288 #, c-format msgid "%d seconds till pause ends\n" msgstr "" @@ -559,11 +559,11 @@ msgstr "" msgid "No camera device" msgstr "" -#: client.c:265 +#: client.c:275 msgid "Can't make exposition" msgstr "" -#: client.c:294 +#: client.c:304 msgid "Server timeout" msgstr "" @@ -571,28 +571,28 @@ msgstr "" msgid "Already initialized!" msgstr "" -#: imageview.c:287 +#: imageview.c:291 msgid "Can't init mutex!" msgstr "" -#: imageview.c:389 +#: imageview.c:393 #, c-format msgid "Histogram conversion: %s" msgstr "" -#: imageview.c:520 imageview.c:599 +#: imageview.c:524 imageview.c:600 #, c-format msgid "Equalization of histogram: %s" msgstr "" -#: imageview.c:520 imageview.c:599 +#: imageview.c:524 imageview.c:600 msgid "on" msgstr "" -#: imageview.c:520 imageview.c:599 +#: imageview.c:524 imageview.c:600 msgid "off" msgstr "" -#: imageview.c:559 +#: imageview.c:558 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 e7adef0..a33fab3 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-04-11 14:24+0300\n" + "POT-Creation-Date: 2023-05-06 14:36+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -22,7 +22,7 @@ msgid "%.1f seconds till exposition ends" msgstr "%.1f " #. %d секунд до окончания паузы\n -#: ccdfunc.c:807 client.c:278 +#: ccdfunc.c:807 client.c:288 #, c-format msgid "%d seconds till pause ends\n" msgstr "%d \n" @@ -113,15 +113,15 @@ msgstr " msgid "Can't home focuser" msgstr " " -#: imageview.c:287 +#: imageview.c:291 msgid "Can't init mutex!" msgstr " !" -#: client.c:265 +#: client.c:275 msgid "Can't make exposition" msgstr " " -#: imageview.c:559 +#: imageview.c:558 msgid "Can't open OpenGL window, image preview will be inaccessible" msgstr " OpenGL, " @@ -232,7 +232,7 @@ msgstr "" msgid "Display image in OpenGL window" msgstr " OpenGL" -#: imageview.c:520 imageview.c:599 +#: imageview.c:524 imageview.c:600 #, c-format msgid "Equalization of histogram: %s" msgstr " : %s" @@ -275,7 +275,7 @@ msgstr " msgid "Full array: %s" msgstr " : %s" -#: imageview.c:389 +#: imageview.c:393 #, c-format msgid "Histogram conversion: %s" msgstr " : %s" @@ -323,7 +323,7 @@ msgstr " msgid "Readout mode: %s" msgstr " : %s" -#: client.c:294 +#: client.c:304 msgid "Server timeout" msgstr " " @@ -510,11 +510,11 @@ msgstr " msgid "observing program name" msgstr " " -#: imageview.c:520 imageview.c:599 +#: imageview.c:524 imageview.c:600 msgid "off" msgstr "" -#: imageview.c:520 imageview.c:599 +#: imageview.c:524 imageview.c:600 msgid "on" msgstr "" diff --git a/main.c b/main.c index 91e780f..5078f9c 100644 --- a/main.c +++ b/main.c @@ -40,7 +40,8 @@ static int isserver = FALSE; static pid_t childpid = 0; void signals(int signo){ - if(signo) signal(signo, SIG_IGN); + //if(signo) signal(signo, SIG_IGN); + DBG("signo=%d", signo); if(childpid){ // master process if(signo == SIGUSR1){ // kill child kill(childpid, signo); @@ -62,8 +63,8 @@ void signals(int signo){ #ifdef IMAGEVIEW DBG("KILL GL"); closeGL(); - usleep(10000); #endif + DBG("exit(%d)", signo); exit(signo); } diff --git a/socket.c b/socket.c index c4da21a..cbb22ac 100644 --- a/socket.c +++ b/socket.c @@ -146,6 +146,7 @@ int start_socket(int isserver){ if(!GP->viewer && GP->exptime < 0.00001) ERRX("Need exposition time!"); init_grab_sock(sock); viewer(sockcaptured); // start viewer with socket client parser + DBG("done"); }else #endif client(sock);