fixed some bugs but still have a bug with exit from viewer mode

This commit is contained in:
Edward Emelianov 2023-05-06 14:37:24 +03:00
parent 543a5a5b38
commit aa8a3a30b1
7 changed files with 67 additions and 51 deletions

View File

@ -212,7 +212,7 @@ int saveFITS(IMG *img, char **outp){
} }
int width = img->w, height = img->h; int width = img->w, height = img->h;
void *data = (void*) img->data; void *data = (void*) img->data;
long naxes[2] = {width, height}, tmpl; long naxes[2] = {width, height};
double tmpd = 0.0; double tmpd = 0.0;
float tmpf = 0.0; float tmpf = 0.0;
int tmpi = 0; int tmpi = 0;

View File

@ -28,16 +28,17 @@
#include "ccdfunc.h" // framerate #include "ccdfunc.h" // framerate
#include "client.h" #include "client.h"
#include "cmdlnopts.h" #include "cmdlnopts.h"
#include "imageview.h"
#include "server.h" // for common commands names #include "server.h" // for common commands names
#include "socket.h" #include "socket.h"
static char sendbuf[BUFSIZ]; static char sendbuf[BUFSIZ];
// send message and wait any answer // 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' // 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 // 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 volatile atomic_int expstate = CAMERA_CAPTURE;
static int xm0,ym0,xm1,ym1; // max format static int xm0,ym0,xm1,ym1; // max format
static int xc0,yc0,xc1,yc1; // current format static int xc0,yc0,xc1,yc1; // current format
@ -89,22 +90,27 @@ static int parseans(char *ans){
if(0 == strcmp(CMD_EXPSTATE, ans)){ if(0 == strcmp(CMD_EXPSTATE, ans)){
expstate = atoi(val); expstate = atoi(val);
DBG("Exposition state: %d", expstate); DBG("Exposition state: %d", expstate);
return TRUE;
}else if(0 == strcmp(CMD_FRAMEMAX, ans)){ }else if(0 == strcmp(CMD_FRAMEMAX, ans)){
sscanf(val, "%d,%d,%d,%d", &xm0, &ym0, &xm1, &ym1); sscanf(val, "%d,%d,%d,%d", &xm0, &ym0, &xm1, &ym1);
DBG("Got maxformat: %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)){ }else if(0 == strcmp(CMD_FRAMEFORMAT, ans)){
sscanf(val, "%d,%d,%d,%d", &xc0, &yc0, &xc1, &yc1); sscanf(val, "%d,%d,%d,%d", &xc0, &yc0, &xc1, &yc1);
DBG("Got current format: %d,%d,%d,%d", xc0, yc0, xc1, yc1); DBG("Got current format: %d,%d,%d,%d", xc0, yc0, xc1, yc1);
return TRUE;
} }
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
else if(0 == strcmp(CMD_IMWIDTH, ans)){ else if(0 == strcmp(CMD_IMWIDTH, ans)){
ima.w = atoi(val); ima.w = atoi(val);
DBG("Get width: %d", ima.w); DBG("Get width: %d", ima.w);
imdatalen = ima.w * ima.h * 2; imdatalen = ima.w * ima.h * 2;
return TRUE;
}else if(0 == strcmp(CMD_IMHEIGHT, ans)){ }else if(0 == strcmp(CMD_IMHEIGHT, ans)){
ima.h = atoi(val); ima.h = atoi(val);
DBG("Get height: %d", ima.h); DBG("Get height: %d", ima.h);
imdatalen = ima.w * ima.h * 2; imdatalen = ima.w * ima.h * 2;
return TRUE;
} }
#endif #endif
//TIMESTAMP("parseans() end"); //TIMESTAMP("parseans() end");
@ -118,20 +124,24 @@ static int getans(int sock, const char *msg){
char *ans = NULL; char *ans = NULL;
while(dtime() - t0 < ANSWER_TIMEOUT){ while(dtime() - t0 < ANSWER_TIMEOUT){
char *s = readmsg(sock); char *s = readmsg(sock);
if(!s){ // buffer is empty, return last message or wait for it if(!s) continue;
if(ans) return TRUE; /*if(!s){ // buffer is empty, return last message or wait for it
if(ans) return (msg ? FALSE : TRUE);
else continue; else continue;
} }*/
t0 = dtime(); t0 = dtime();
ans = s; ans = s;
TIMESTAMP("Got from server: %s", ans); TIMESTAMP("Got from server: %s", ans);
verbose(1, "\t%s", ans); verbose(1, "\t%s", ans);
DBG("1 msg-> %s, ans -> %s", msg, ans);
if(parseans(ans)){ if(parseans(ans)){
DBG("2 msg-> %s, ans -> %s", msg, ans);
if(msg && strncmp(ans, msg, strlen(msg))) continue; if(msg && strncmp(ans, msg, strlen(msg))) continue;
DBG("BREAK");
break; break;
} }
} }
DBG("GETANS: timeout, ans: %s", ans); DBG("GETANS: %s, %s", ans, (dtime()-t0 > ANSWER_TIMEOUT) ? "timeout" : "got answer");
return ((ans) ? TRUE : FALSE); 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; if(controlfd < 0) return NULL;
int sock = controlfd; int sock = controlfd;
while(1){ while(1){
DBG("xx");
if(!getWin()) exit(1);
expstate = CAMERA_CAPTURE; expstate = CAMERA_CAPTURE;
TIMESTAMP("End of cycle, start new #%d", grabno+1); TIMESTAMP("End of cycle, start new #%d", grabno+1);
TIMEINIT(); TIMEINIT();
@ -378,6 +390,7 @@ static void *waitimage(void _U_ *arg){ // passive waiting for next image
if(controlfd < 0) return NULL; if(controlfd < 0) return NULL;
int sock = controlfd; int sock = controlfd;
while(1){ while(1){
if(!getWin()) exit(1);
getans(sock, NULL); getans(sock, NULL);
if(expstate != CAMERA_FRAMERDY){ if(expstate != CAMERA_FRAMERDY){
usleep(1000); usleep(1000);

View File

@ -129,15 +129,12 @@ static void createWindow(){
DBG("Window opened"); DBG("Window opened");
} }
static int killwindow(){ static void killwindow(){
if(!win) return 0; if(!win) return;
if(!win->killthread){ if(!win->killthread){
// say threads to die // say threads to die
win->killthread = 1; win->killthread = 1;
} }
//DBG("Lock mutex");
//pthread_mutex_lock(&win->mutex);
//pthread_join(win->thread, NULL); // wait while thread dies
if(win->menu){ if(win->menu){
DBG("Destroy menu"); DBG("Destroy menu");
glutDestroyMenu(win->menu); glutDestroyMenu(win->menu);
@ -146,18 +143,25 @@ static int killwindow(){
glutDestroyWindow(win->ID); glutDestroyWindow(win->ID);
DBG("Delete textures"); DBG("Delete textures");
glDeleteTextures(1, &(win->Tex)); 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; windowData *old = win;
win = NULL; win = NULL;
DBG("free(rawdata)"); DBG("free(rawdata)");
FREE(old->image->rawdata); FREE(old->image->rawdata);
DBG("free(image)"); DBG("free(image)");
FREE(old->image); FREE(old->image);
//pthread_mutex_unlock(&old->mutex);
DBG("free(win)"); DBG("free(win)");
FREE(old); FREE(old);
DBG("return"); DBG("return");
return 1; return;
} }
/* /*
@ -525,20 +529,15 @@ static void* image_thread(void *data){
} }
#endif #endif
void closeGL(){ void closeGL(){ // killed by external signal or ctrl+c
if(win) win->killthread = 1;
usleep(1000);
if(!initialized) return; if(!initialized) return;
initialized = 0; DBG("KILLL");
camstop(); // cancel expositions camstop(); // cancel expositions
//DBG("Leave mainloop"); win->killthread = 1;
//glutLeaveMainLoop(); while(initialized){
DBG("kill"); usleep(100000);
killwindow(); if(initialized) killwindow(); // kill here, if `viewer` died
DBG("join"); }
if(GLUTthread) pthread_join(GLUTthread, NULL); // wait while main thread exits
DBG("main GL thread cancelled");
usleep(1000);
} }
/** /**
@ -562,9 +561,11 @@ int viewer(imagefunc newimage){
IMG *img = NULL; IMG *img = NULL;
//double t0 = dtime(); //double t0 = dtime();
while(1){ while(1){
if(!win || win->killthread){ if(!win || win->killthread){ // got kill from ctrl+q
DBG("got killthread"); DBG("got killthread");
newimage((void*)-1); newimage((void*)-1);
DBG("kill");
killwindow();
signals(0); // just run common cleaner signals(0); // just run common cleaner
return 0; return 0;
} }

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-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" "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"
@ -546,7 +546,7 @@ msgid "Can't grab image"
msgstr "" msgstr ""
#. %d секунд до окончания паузы\n #. %d секунд до окончания паузы\n
#: ccdfunc.c:807 client.c:278 #: ccdfunc.c:807 client.c:288
#, c-format #, c-format
msgid "%d seconds till pause ends\n" msgid "%d seconds till pause ends\n"
msgstr "" msgstr ""
@ -559,11 +559,11 @@ msgstr ""
msgid "No camera device" msgid "No camera device"
msgstr "" msgstr ""
#: client.c:265 #: client.c:275
msgid "Can't make exposition" msgid "Can't make exposition"
msgstr "" msgstr ""
#: client.c:294 #: client.c:304
msgid "Server timeout" msgid "Server timeout"
msgstr "" msgstr ""
@ -571,28 +571,28 @@ msgstr ""
msgid "Already initialized!" msgid "Already initialized!"
msgstr "" msgstr ""
#: imageview.c:287 #: imageview.c:291
msgid "Can't init mutex!" msgid "Can't init mutex!"
msgstr "" msgstr ""
#: imageview.c:389 #: imageview.c:393
#, c-format #, c-format
msgid "Histogram conversion: %s" msgid "Histogram conversion: %s"
msgstr "" msgstr ""
#: imageview.c:520 imageview.c:599 #: imageview.c:524 imageview.c:600
#, c-format #, c-format
msgid "Equalization of histogram: %s" msgid "Equalization of histogram: %s"
msgstr "" msgstr ""
#: imageview.c:520 imageview.c:599 #: imageview.c:524 imageview.c:600
msgid "on" msgid "on"
msgstr "" msgstr ""
#: imageview.c:520 imageview.c:599 #: imageview.c:524 imageview.c:600
msgid "off" msgid "off"
msgstr "" msgstr ""
#: imageview.c:559 #: imageview.c:558
msgid "Can't open OpenGL window, image preview will be inaccessible" msgid "Can't open OpenGL window, image preview will be inaccessible"
msgstr "" msgstr ""

View File

@ -7,7 +7,7 @@
msgid "" msgid ""
msgstr "Project-Id-Version: PACKAGE VERSION\n" msgstr "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-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" "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"
@ -22,7 +22,7 @@ msgid "%.1f seconds till exposition ends"
msgstr "%.1f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ" msgstr "%.1f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ"
#. %d Ñ<>екунд до окончаниÑ<C2B8> паузы\n #. %d Ñ<>екунд до окончаниÑ<C2B8> паузы\n
#: ccdfunc.c:807 client.c:278 #: ccdfunc.c:807 client.c:288
#, c-format #, c-format
msgid "%d seconds till pause ends\n" msgid "%d seconds till pause ends\n"
msgstr "%d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n" msgstr "%d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n"
@ -113,15 +113,15 @@ msgstr "
msgid "Can't home focuser" msgid "Can't home focuser"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÆÏËÕÓÅÒ × ÎÕÌØ" msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÆÏËÕÓÅÒ × ÎÕÌØ"
#: imageview.c:287 #: imageview.c:291
msgid "Can't init mutex!" msgid "Can't init mutex!"
msgstr "îÅ ÍÏÇÕ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÍØÀÔÅËÓ!" msgstr "îÅ ÍÏÇÕ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ ÍØÀÔÅËÓ!"
#: client.c:265 #: client.c:275
msgid "Can't make exposition" msgid "Can't make exposition"
msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ÜËÓÐÏÚÉÃÉÀ" msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ÜËÓÐÏÚÉÃÉÀ"
#: imageview.c:559 #: imageview.c:558
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, ÏÔÏÂÒÁÖÅÎÉÅ ÂÕÄÅÔ ÎÅÄÏÓÔÕÐÎÏ"
@ -232,7 +232,7 @@ msgstr ""
msgid "Display image in OpenGL window" msgid "Display image in OpenGL window"
msgstr "ïÔÏÂÒÁÖÅÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ × ÏËÎÅ OpenGL" msgstr "ïÔÏÂÒÁÖÅÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ × ÏËÎÅ OpenGL"
#: imageview.c:520 imageview.c:599 #: imageview.c:524 imageview.c:600
#, c-format #, c-format
msgid "Equalization of histogram: %s" msgid "Equalization of histogram: %s"
msgstr "üË×ÁÌÉÚÁÃÉÑ ÇÉÓÔÏÇÒÁÍÍÙ: %s" msgstr "üË×ÁÌÉÚÁÃÉÑ ÇÉÓÔÏÇÒÁÍÍÙ: %s"
@ -275,7 +275,7 @@ msgstr "
msgid "Full array: %s" msgid "Full array: %s"
msgstr "ðÏÌÎÙÊ ÆÏÒÍÁÔ: %s" msgstr "ðÏÌÎÙÊ ÆÏÒÍÁÔ: %s"
#: imageview.c:389 #: imageview.c:393
#, c-format #, c-format
msgid "Histogram conversion: %s" msgid "Histogram conversion: %s"
msgstr "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÇÉÓÔÏÇÒÁÍÍÙ: %s" msgstr "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÇÉÓÔÏÇÒÁÍÍÙ: %s"
@ -323,7 +323,7 @@ msgstr "
msgid "Readout mode: %s" msgid "Readout mode: %s"
msgstr "òÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ: %s" msgstr "òÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ: %s"
#: client.c:294 #: client.c:304
msgid "Server timeout" msgid "Server timeout"
msgstr "ôÁÊÍÁÕÔ ÓÅÒ×ÅÒÁ" msgstr "ôÁÊÍÁÕÔ ÓÅÒ×ÅÒÁ"
@ -510,11 +510,11 @@ msgstr "
msgid "observing program name" msgid "observing program name"
msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ" msgstr "ÎÁÚ×ÁÎÉÅ ÐÒÏÇÒÁÍÍÙ"
#: imageview.c:520 imageview.c:599 #: imageview.c:524 imageview.c:600
msgid "off" msgid "off"
msgstr "×ÙËÌ" msgstr "×ÙËÌ"
#: imageview.c:520 imageview.c:599 #: imageview.c:524 imageview.c:600
msgid "on" msgid "on"
msgstr "×ËÌ" msgstr "×ËÌ"

5
main.c
View File

@ -40,7 +40,8 @@ static int isserver = FALSE;
static pid_t childpid = 0; static pid_t childpid = 0;
void signals(int signo){ 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(childpid){ // master process
if(signo == SIGUSR1){ // kill child if(signo == SIGUSR1){ // kill child
kill(childpid, signo); kill(childpid, signo);
@ -62,8 +63,8 @@ void signals(int signo){
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
DBG("KILL GL"); DBG("KILL GL");
closeGL(); closeGL();
usleep(10000);
#endif #endif
DBG("exit(%d)", signo);
exit(signo); exit(signo);
} }

View File

@ -146,6 +146,7 @@ int start_socket(int isserver){
if(!GP->viewer && GP->exptime < 0.00001) ERRX("Need exposition time!"); if(!GP->viewer && GP->exptime < 0.00001) ERRX("Need exposition time!");
init_grab_sock(sock); init_grab_sock(sock);
viewer(sockcaptured); // start viewer with socket client parser viewer(sockcaptured); // start viewer with socket client parser
DBG("done");
}else }else
#endif #endif
client(sock); client(sock);