mirror of
https://github.com/eddyem/CCD_Capture.git
synced 2025-12-06 02:35:13 +03:00
fixed some bugs but still have a bug with exit from viewer mode
This commit is contained in:
parent
543a5a5b38
commit
aa8a3a30b1
@ -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;
|
||||
|
||||
27
client.c
27
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);
|
||||
|
||||
43
imageview.c
43
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;
|
||||
}
|
||||
|
||||
@ -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 ""
|
||||
|
||||
@ -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
5
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);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user