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;
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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -22,7 +22,7 @@ msgid "%.1f seconds till exposition ends"
msgstr "%.1f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ"
#. %d Ñ<>екунд до окончаниÑ<C2B8> паузы\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 "×ËÌ"

5
main.c
View File

@ -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);
}

View File

@ -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);