try to fix network data transport (really need another socket)

This commit is contained in:
Edward Emelianov 2023-04-04 18:48:45 +03:00
parent 87e8120122
commit 8b6e7435e0
13 changed files with 192 additions and 113 deletions

View File

@ -18,6 +18,7 @@
#include <C/FlyCapture2_C.h> #include <C/FlyCapture2_C.h>
#include <C/FlyCapture2Defs_C.h> #include <C/FlyCapture2Defs_C.h>
#include <stdatomic.h>
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -33,6 +34,7 @@ static fc2PGRGuid guid;
static fc2Error err = FC2_ERROR_OK; static fc2Error err = FC2_ERROR_OK;
static int isopened = FALSE, is16bit = FALSE; static int isopened = FALSE, is16bit = FALSE;
static atomic_int canceled = 0;
static char camname[BUFSIZ] = {0}; static char camname[BUFSIZ] = {0};
#ifndef Stringify #ifndef Stringify
@ -287,6 +289,7 @@ rtn:
static int capture(IMG *ima){ static int capture(IMG *ima){
FNAME(); FNAME();
if(canceled) return FALSE;
if(!ima || !ima->data || !isopened) return FALSE; if(!ima || !ima->data || !isopened) return FALSE;
static int toohot = FALSE; static int toohot = FALSE;
float f; float f;
@ -432,12 +435,17 @@ static int shutter(_U_ shutter_op cmd){
return FALSE; return FALSE;
} }
static void capcancel(){
canceled = 1;
DBG("No capturing now");
}
static int ffalse(_U_ float f){ return FALSE; } static int ffalse(_U_ float f){ return FALSE; }
static int fpfalse(_U_ float *f){ return FALSE; } static int fpfalse(_U_ float *f){ return FALSE; }
static int ifalse(_U_ int i){ return FALSE; } static int ifalse(_U_ int i){ return FALSE; }
static int vtrue(){ return TRUE; } static int vtrue(){ return TRUE; }
static int ipfalse(_U_ int *i){ return FALSE; } static int ipfalse(_U_ int *i){ return FALSE; }
static void vstub(){ return ;} //static void vstub(){ return ;}
/* /*
* Global objects: camera, focuser and wheel * Global objects: camera, focuser and wheel
@ -447,7 +455,7 @@ Camera camera = {
.close = disconnect, .close = disconnect,
.pollcapture = pollcapt, .pollcapture = pollcapt,
.capture = capture, .capture = capture,
.cancel = vstub, .cancel = capcancel,
.startexposition = vtrue, .startexposition = vtrue,
// setters: // setters:
.setDevNo = setdevno, .setDevNo = setdevno,

View File

@ -211,14 +211,13 @@ 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}; long naxes[2] = {width, height}, tmpl;
double tmpd = 0.0; double tmpd = 0.0;
float tmpf = 0.0; float tmpf = 0.0;
int tmpi = 0; int tmpi = 0;
struct tm *tm_time; struct tm *tm_time;
char bufc[FLEN_CARD]; char bufc[FLEN_CARD];
time_t savetime = time(NULL); time_t savetime = time(NULL);
double dsavetime = dtime();
fitsfile *fp; fitsfile *fp;
fitserror = 0; fitserror = 0;
TRYFITS(fits_create_file, &fp, fnam); TRYFITS(fits_create_file, &fp, fnam);
@ -278,9 +277,10 @@ int saveFITS(IMG *img, char **outp){
// DATE / Creation date (YYYY-MM-DDThh:mm:ss, UTC) // DATE / Creation date (YYYY-MM-DDThh:mm:ss, UTC)
strftime(bufc, FLEN_VALUE, "%Y-%m-%dT%H:%M:%S", gmtime(&savetime)); strftime(bufc, FLEN_VALUE, "%Y-%m-%dT%H:%M:%S", gmtime(&savetime));
WRITEKEY(fp, TSTRING, "DATE", bufc, "Creation date (YYYY-MM-DDThh:mm:ss, UTC)"); WRITEKEY(fp, TSTRING, "DATE", bufc, "Creation date (YYYY-MM-DDThh:mm:ss, UTC)");
tmpl = (long) savetime;
tm_time = localtime(&savetime); tm_time = localtime(&savetime);
strftime(bufc, FLEN_VALUE, "File creation time (UNIX)", tm_time); strftime(bufc, FLEN_VALUE, "File creation time (UNIX)", tm_time);
WRITEKEY(fp, TDOUBLE, "UNIXTIME", &dsavetime, bufc); WRITEKEY(fp, TLONG, "UNIXTIME", &tmpl, bufc);
strftime(bufc, 80, "%Y/%m/%d", tm_time); strftime(bufc, 80, "%Y/%m/%d", tm_time);
// DATE-OBS / DATE (YYYY/MM/DD) OF OBS. // DATE-OBS / DATE (YYYY/MM/DD) OF OBS.
WRITEKEY(fp, TSTRING, "DATE-OBS", bufc, "DATE OF OBS. (YYYY/MM/DD, local)"); WRITEKEY(fp, TSTRING, "DATE-OBS", bufc, "DATE OF OBS. (YYYY/MM/DD, local)");
@ -718,8 +718,6 @@ int prepare_ccds(){
}else WARNX(_("Can't set brightness to %g"), GP->brightness); }else WARNX(_("Can't set brightness to %g"), GP->brightness);
} }
/*********************** expose control ***********************/ /*********************** expose control ***********************/
// cancel previous exp
camera->cancel();
if(GP->hbin < 1) GP->hbin = 1; if(GP->hbin < 1) GP->hbin = 1;
if(GP->vbin < 1) GP->vbin = 1; if(GP->vbin < 1) GP->vbin = 1;
if(!camera->setbin(GP->hbin, GP->vbin)){ if(!camera->setbin(GP->hbin, GP->vbin)){
@ -813,9 +811,11 @@ DBG("w=%d, h=%d", raw_width, raw_height);
closecam(); closecam();
} }
void cancel(){ // cancel expositions and close camera devise
void camstop(){
if(camera){ if(camera){
camera->cancel(); camera->cancel();
camera->close();
} }
} }
@ -855,16 +855,18 @@ eof:
* @return TRUE if new image available * @return TRUE if new image available
*/ */
int ccdcaptured(IMG **imgptr){ int ccdcaptured(IMG **imgptr){
static double tlast = 0.;
if(!imgptr) return FALSE; if(!imgptr) return FALSE;
static pthread_t grabthread = 0; static pthread_t grabthread = 0;
if(imgptr == (void*)-1){ // kill `grabnext` if(imgptr == (void*)-1){ // kill `grabnext`
DBG("Kill grabbing thread"); DBG("Wait for grabbing thread ends");
if(grabthread){ if(grabthread){
pthread_cancel(grabthread); //pthread_cancel(grabthread); - this kills some cameras
//pthread_timedjoin_np
pthread_join(grabthread, NULL); pthread_join(grabthread, NULL);
grabthread = 0; grabthread = 0;
} }
DBG("Killed"); DBG("OK");
return FALSE; return FALSE;
} }
frameformat fmt = camera->geometry; frameformat fmt = camera->geometry;
@ -879,20 +881,27 @@ int ccdcaptured(IMG **imgptr){
ima->h = raw_height; ima->h = raw_height;
*imgptr = ima; *imgptr = ima;
}else ima = *imgptr; }else ima = *imgptr;
if(!grabthread){ // start new grab if(!grabthread){ // start new grab
DBG("\n\n\nStart new grab"); DBG("\n\n\nStart new grab");
if(pthread_create(&grabthread, NULL, &grabnext, (void*)ima)){ if(pthread_create(&grabthread, NULL, &grabnext, (void*)ima)){
WARN("Can't create grabbing thread"); WARN("Can't create grabbing thread");
grabthread = 0; grabthread = 0;
} }
tlast = dtime();
}else{ // grab in process }else{ // grab in process
if(grabends){ // thread is dead if(grabends){ // thread is dead
DBG("Thread is dead"); DBG("Grab ends");
void *vr; void *vr;
pthread_join(grabthread, &vr); pthread_join(grabthread, &vr);
int retcode = *(int*)vr; int retcode = *(int*)vr;
DBG("retcode = %d", retcode); DBG("retcode = %d", retcode);
grabthread = 0; grabthread = 0;
if(GP->verbose > 1){
double t = dtime();
green("Framerate=%.2g\n", 1./(t-tlast));
tlast = t;
}
if(retcode) return TRUE; if(retcode) return TRUE;
} }
} }

View File

@ -29,7 +29,7 @@ void focusers();
void wheels(); void wheels();
int prepare_ccds(); int prepare_ccds();
void ccds(); void ccds();
void cancel(); void camstop();
int startCCD(void **dlh); int startCCD(void **dlh);
int startWheel(void **dlh); int startWheel(void **dlh);

119
client.c
View File

@ -33,6 +33,7 @@ static char sendbuf[BUFSIZ];
#define SENDMSG(...) do{snprintf(sendbuf, BUFSIZ-1, __VA_ARGS__); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf); getans(sock);}while(0) #define SENDMSG(...) do{snprintf(sendbuf, BUFSIZ-1, __VA_ARGS__); verbose(2, "\t> %s", sendbuf); sendstrmessage(sock, sendbuf); getans(sock);}while(0)
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
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
static IMG ima = {0}; static IMG ima = {0};
@ -110,6 +111,9 @@ static int parseans(char *ans){
}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);
}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);
} }
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
else if(0 == strcmp(CMD_IMWIDTH, ans)){ else if(0 == strcmp(CMD_IMWIDTH, ans)){
@ -165,13 +169,15 @@ static void send_headers(int sock){
// CCD/CMOS // CCD/CMOS
if(GP->X0 > -1 || GP->Y0 > -1 || GP->X1 > -1 || GP->Y1 > -1){ // set format if(GP->X0 > -1 || GP->Y0 > -1 || GP->X1 > -1 || GP->Y1 > -1){ // set format
SENDMSG(CMD_FRAMEMAX); SENDMSG(CMD_FRAMEMAX);
DBG("max format: (%d,%d)x(%d,%d)", xm0,ym0,xm1,ym1); SENDMSG(CMD_FRAMEFORMAT);
if(GP->X0 < 0) GP->X0 = xm0; // default values if(GP->X0 < 0) GP->X0 = xc0; // default values
else if(GP->X0 > xm1-1) GP->X0 = xm1-1; else if(GP->X0 > xm1-1) GP->X0 = xm1-1;
if(GP->Y0 < 0) GP->Y0 = ym0; if(GP->Y0 < 0) GP->Y0 = yc0;
else if(GP->Y0 > ym1-1) GP->Y0 = ym1-1; else if(GP->Y0 > ym1-1) GP->Y0 = ym1-1;
if(GP->X1 < GP->X0+1 || GP->X1 > xm1) GP->X1 = xm1; if(GP->X1 < GP->X0+1) GP->X1 = xc1;
if(GP->Y1 < GP->Y0+1 || GP->Y1 > ym1) GP->Y1 = ym1; else if(GP->X1 > xm1) GP->X1 = xm1;
if(GP->Y1 < GP->Y0+1) GP->Y1 = yc1;
else if(GP->Y1 > ym1) GP->Y1 = ym1;
DBG("set format: (%d,%d)x(%d,%d)", GP->X0,GP->X1,GP->Y0,GP->Y1); DBG("set format: (%d,%d)x(%d,%d)", GP->X0,GP->X1,GP->Y0,GP->Y1);
SENDMSG(CMD_FRAMEFORMAT "=%d,%d,%d,%d", GP->X0, GP->Y0, GP->X1, GP->Y1); SENDMSG(CMD_FRAMEFORMAT "=%d,%d,%d,%d", GP->X0, GP->Y0, GP->X1, GP->Y1);
} }
@ -245,7 +251,8 @@ void client(int sock){
else GP->waitexpend = TRUE; // N>1 - wait for exp ends else GP->waitexpend = TRUE; // N>1 - wait for exp ends
SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE); SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE);
}else{ }else{
while(getans(sock)); double t0 = dtime();
while(getans(sock) && dtime() - t0 < WAIT_TIMEOUT);
DBG("RETURN: no more data"); DBG("RETURN: no more data");
return; return;
} }
@ -306,15 +313,48 @@ void init_grab_sock(int sock){
send_headers(sock); send_headers(sock);
} }
static void getimage(){
int sock = grabsockfd;
SENDMSG(CMD_IMWIDTH);
SENDMSG(CMD_IMHEIGHT);
while(readmsg(sock)); // clear all incoming data
sendstrmessage(sock, CMD_GETIMAGE); // ask for image
if(imbufsz < imdatalen){
DBG("Reallocate memory from %d to %d", imbufsz, imdatalen);
ima.data = realloc(ima.data, imdatalen);
imbufsz = imdatalen;
}
double t0 = dtime();
int got = 0;
while(dtime() - t0 < CLIENT_TIMEOUT){
if(!canberead(sock)) continue;
uint8_t *target = ((uint8_t*)ima.data)+got;
int rd = read(sock, target, imdatalen - got);
if(rd <= 0){
WARNX("Server disconnected");
signals(1);
}
got += rd;
DBG("Read %d bytes; total read %d from %d; first: %x %x %x %x", rd, got, imdatalen, target[0],
target[1], target[2], target[3]);
if(got == imdatalen){
DBG("Got image");
grabends = 1;
break;
}
}
if(dtime() - t0 > CLIENT_TIMEOUT) WARNX("Timeout, image didn't received");
}
static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net
FNAME(); FNAME();
if(grabsockfd < 0) return NULL; if(grabsockfd < 0) return NULL;
int sock = grabsockfd; int sock = grabsockfd;
while(1){ while(1){
DBG("WAIT");
while(grabends); // wait until image processed while(grabends); // wait until image processed
SENDMSG(CMD_IMWIDTH);
SENDMSG(CMD_IMHEIGHT);
expstate = CAMERA_CAPTURE; expstate = CAMERA_CAPTURE;
DBG("CAPT");
SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE); // start capture SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE); // start capture
double timeout = GP->exptime + CLIENT_TIMEOUT, t0 = dtime(); double timeout = GP->exptime + CLIENT_TIMEOUT, t0 = dtime();
useconds_t sleept = 500000; // 0.5s useconds_t sleept = 500000; // 0.5s
@ -335,31 +375,23 @@ static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net
continue; continue;
} }
DBG("Frame ready"); DBG("Frame ready");
while(readmsg(sock)); // clear all incoming data getimage();
sendstrmessage(sock, CMD_GETIMAGE); // ask for image }
if(imbufsz < imdatalen){ return NULL;
DBG("Reallocate memory from %d to %d", imbufsz, imdatalen); }
ima.data = realloc(ima.data, imdatalen);
imbufsz = imdatalen; static void *waitimage(void _U_ *arg){ // passive waiting for next image
FNAME();
if(grabsockfd < 0) return NULL;
int sock = grabsockfd;
while(1){
while(grabends); // wait until image processed
getans(sock);
if(expstate != CAMERA_FRAMERDY){
usleep(1000);
continue;
} }
t0 = dtime(); getimage();
int got = 0;
while(dtime() - t0 < CLIENT_TIMEOUT){
if(!canberead(sock)) continue;
int rd = read(sock, ((uint8_t*)ima.data)+got, imdatalen - got);
if(rd <= 0){
WARNX("Server disconnected");
signals(1);
}
got += rd;
DBG("Read %d bytes; total read %d from %d", rd, got, imdatalen);
if(got == imdatalen){
DBG("Got image");
grabends = 1;
break;
}
}
if(dtime() - t0 > CLIENT_TIMEOUT) WARNX("Timeout, image didn't received");
} }
return NULL; return NULL;
} }
@ -370,24 +402,33 @@ int sockcaptured(IMG **imgptr){
static pthread_t grabthread = 0; static pthread_t grabthread = 0;
if(grabsockfd < 0) return FALSE; if(grabsockfd < 0) return FALSE;
if(imgptr == (void*)-1){ // kill `grabnext` if(imgptr == (void*)-1){ // kill `grabnext`
DBG("Kill grabbing thread"); DBG("Wait for grabbing thread");
if(grabthread){ if(grabthread){
pthread_cancel(grabthread); pthread_cancel(grabthread);
pthread_join(grabthread, NULL); pthread_join(grabthread, NULL);
grabthread = 0; grabthread = 0;
} }
DBG("Killed"); DBG("OK");
return FALSE; return FALSE;
} }
if(!grabthread){ // start new grab if(!grabthread){ // start new grab
DBG("\n\n\nStart new grab"); if(GP->viewer){
if(pthread_create(&grabthread, NULL, &grabnext, NULL)){ DBG("\n\n\nStart new waiting");
WARN("Can't create grabbing thread"); if(pthread_create(&grabthread, NULL, &waitimage, NULL)){
grabthread = 0; WARN("Can't create waiting thread");
} grabthread = 0;
}
}else{
DBG("\n\n\nStart new grab");
if(pthread_create(&grabthread, NULL, &grabnext, NULL)){
WARN("Can't create grabbing thread");
grabthread = 0;
}
}
}else{ // grab in process }else{ // grab in process
if(grabends){ // image is ready if(grabends){ // image is ready
DBG("Image ready"); DBG("Image ready");
grabthread = 0;
if(*imgptr && (*imgptr != &ima)) free(*imgptr); if(*imgptr && (*imgptr != &ima)) free(*imgptr);
*imgptr = &ima; *imgptr = &ima;
grabends = 0; grabends = 0;

View File

@ -101,6 +101,7 @@ myoption cmdlnopts[] = {
{"path", NEED_ARG, NULL, 0, arg_string, APTR(&G.path), N_("UNIX socket name")}, {"path", NEED_ARG, NULL, 0, arg_string, APTR(&G.path), N_("UNIX socket name")},
{"port", NEED_ARG, NULL, 0, arg_string, APTR(&G.port), N_("local INET socket port")}, {"port", NEED_ARG, NULL, 0, arg_string, APTR(&G.port), N_("local INET socket port")},
{"client", NO_ARGS, &G.client,1, arg_none, NULL, N_("run as client")}, {"client", NO_ARGS, &G.client,1, arg_none, NULL, N_("run as client")},
{"viewer", NO_ARGS, &G.viewer,1, arg_none, NULL, N_("passive viewer (only get last images)")},
{"pidfile", NEED_ARG, NULL, 0, arg_string, APTR(&G.pidfile), N_("PID file (default: " DEFAULT_PID_FILE ")")}, {"pidfile", NEED_ARG, NULL, 0, arg_string, APTR(&G.pidfile), N_("PID file (default: " DEFAULT_PID_FILE ")")},
{"restart", NO_ARGS, &G.restart,1, arg_none, NULL, N_("restart image server")}, {"restart", NO_ARGS, &G.restart,1, arg_none, NULL, N_("restart image server")},

View File

@ -42,8 +42,9 @@ typedef struct{
char **addhdr; // list of files from which to add header records char **addhdr; // list of files from which to add header records
int restart; // restart server int restart; // restart server
int waitexpend; // wait while exposition ends int waitexpend; // wait while exposition ends
int cancelexpose; // cancel exp int cancelexpose; // cancel exp (for Grasshopper - forbid forever)
int client; // run as client int client; // run as client
int viewer; // passive client (only get last images)
int listdevices; // list connected devices int listdevices; // list connected devices
int fanspeed; // fan speed: 0-2 int fanspeed; // fan speed: 0-2
int noflush; // turn off bg flushing int noflush; // turn off bg flushing

View File

@ -518,11 +518,11 @@ void closeGL(){
usleep(1000); usleep(1000);
if(!initialized) return; if(!initialized) return;
initialized = 0; initialized = 0;
cancel(); // cancel expositions camstop(); // cancel expositions
//DBG("Leave mainloop");
//glutLeaveMainLoop();
DBG("kill"); DBG("kill");
killwindow(); killwindow();
DBG("Leave mainloop");
glutLeaveMainLoop();
DBG("join"); DBG("join");
if(GLUTthread) pthread_join(GLUTthread, NULL); // wait while main thread exits if(GLUTthread) pthread_join(GLUTthread, NULL); // wait while main thread exits
DBG("main GL thread cancelled"); DBG("main GL thread cancelled");

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-02 12:50+0300\n" "POT-Creation-Date: 2023-04-04 18:42+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"
@ -234,14 +234,18 @@ msgid "run as client"
msgstr "" msgstr ""
#: cmdlnopts.c:104 #: cmdlnopts.c:104
msgid "PID file (default: " msgid "passive viewer (only get last images)"
msgstr "" msgstr ""
#: cmdlnopts.c:105 #: cmdlnopts.c:105
msgid "PID file (default: "
msgstr ""
#: cmdlnopts.c:106
msgid "restart image server" msgid "restart image server"
msgstr "" msgstr ""
#: cmdlnopts.c:108 #: cmdlnopts.c:109
msgid "Display image in OpenGL window" msgid "Display image in OpenGL window"
msgstr "" msgstr ""
@ -474,88 +478,88 @@ msgstr ""
msgid "Can't set brightness to %g" msgid "Can't set brightness to %g"
msgstr "" msgstr ""
#: ccdfunc.c:726 server.c:229 #: ccdfunc.c:724 server.c:228
#, c-format #, c-format
msgid "Can't set binning %dx%d" msgid "Can't set binning %dx%d"
msgstr "" msgstr ""
#: ccdfunc.c:738 server.c:230 #: ccdfunc.c:736 server.c:229
msgid "Can't set given geometry" msgid "Can't set given geometry"
msgstr "" msgstr ""
#: ccdfunc.c:742 #: ccdfunc.c:740
#, c-format #, c-format
msgid "Can't set %d flushes" msgid "Can't set %d flushes"
msgstr "" msgstr ""
#: ccdfunc.c:746 #: ccdfunc.c:744
#, c-format #, c-format
msgid "Can't set exposure time to %f seconds" msgid "Can't set exposure time to %f seconds"
msgstr "" msgstr ""
#: ccdfunc.c:749 #: ccdfunc.c:747
msgid "Can't change frame type" msgid "Can't change frame type"
msgstr "" msgstr ""
#: ccdfunc.c:752 #: ccdfunc.c:750
msgid "Can't set bit depth" msgid "Can't set bit depth"
msgstr "" msgstr ""
#: ccdfunc.c:754 #: ccdfunc.c:752
msgid "Can't set readout speed" msgid "Can't set readout speed"
msgstr "" msgstr ""
#: ccdfunc.c:755 #: ccdfunc.c:753
#, c-format #, c-format
msgid "Readout mode: %s" msgid "Readout mode: %s"
msgstr "" msgstr ""
#: ccdfunc.c:756 #: ccdfunc.c:754
msgid "Only show statistics" msgid "Only show statistics"
msgstr "" msgstr ""
#. GET binning should be AFTER setgeometry! #. GET binning should be AFTER setgeometry!
#: ccdfunc.c:758 #: ccdfunc.c:756
msgid "Can't get current binning" msgid "Can't get current binning"
msgstr "" msgstr ""
#. Захват кадра %d\n #. Захват кадра %d\n
#: ccdfunc.c:780 #: ccdfunc.c:778
#, c-format #, c-format
msgid "Capture frame %d" msgid "Capture frame %d"
msgstr "" msgstr ""
#: ccdfunc.c:782 ccdfunc.c:832 server.c:124 #: ccdfunc.c:780 ccdfunc.c:832 server.c:123
msgid "Can't start exposition" msgid "Can't start exposition"
msgstr "" msgstr ""
#: ccdfunc.c:786 #: ccdfunc.c:784
msgid "Can't capture image" msgid "Can't capture image"
msgstr "" msgstr ""
#: ccdfunc.c:789 #: ccdfunc.c:787
msgid "Read grabbed image" msgid "Read grabbed image"
msgstr "" msgstr ""
#: ccdfunc.c:792 ccdfunc.c:840 #: ccdfunc.c:790 ccdfunc.c:840
msgid "Can't grab image" msgid "Can't grab image"
msgstr "" msgstr ""
#. %d секунд до окончания паузы\n #. %d секунд до окончания паузы\n
#: ccdfunc.c:801 client.c:282 #: ccdfunc.c:799 client.c:289
#, c-format #, c-format
msgid "%d seconds till pause ends\n" msgid "%d seconds till pause ends\n"
msgstr "" msgstr ""
#: server.c:167 #: server.c:166
msgid "No camera device" msgid "No camera device"
msgstr "" msgstr ""
#: client.c:269 #: client.c:276
msgid "Can't make exposition" msgid "Can't make exposition"
msgstr "" msgstr ""
#: client.c:298 #: client.c:305
msgid "Server timeout" msgid "Server timeout"
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-02 12:50+0300\n" "POT-Creation-Date: 2023-04-04 18:23+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 я│п╣п╨я┐п╫п╢ п╢п╬ п╬п╨п╬п╫я┤п╟п╫п╦я▐ п©п╟я┐п╥я▀\n #. %d я│п╣п╨я┐п╫п╢ п╢п╬ п╬п╨п╬п╫я┤п╟п╫п╦я▐ п©п╟я┐п╥я▀\n
#: ccdfunc.c:801 client.c:282 #: ccdfunc.c:799 client.c:289
#, c-format #, c-format
msgid "%d seconds till pause ends\n" msgid "%d seconds till pause ends\n"
msgstr "%d секунд до окончания паузы\n" msgstr "%d секунд до окончания паузы\n"
@ -52,11 +52,11 @@ msgstr "
msgid "Camera model: %s" msgid "Camera model: %s"
msgstr "Модель светоприемника: %s" msgstr "Модель светоприемника: %s"
#: ccdfunc.c:786 #: ccdfunc.c:784
msgid "Can't capture image" msgid "Can't capture image"
msgstr "Не могу захватить изображение" msgstr "Не могу захватить изображение"
#: ccdfunc.c:749 #: ccdfunc.c:747
msgid "Can't change frame type" msgid "Can't change frame type"
msgstr "Не могу изменить тип кадра" msgstr "Не могу изменить тип кадра"
@ -89,7 +89,7 @@ msgid "Can't get IOport state (unsupported?)"
msgstr "Не могу получить состояние порта I/O (не поддерживается?)" msgstr "Не могу получить состояние порта I/O (не поддерживается?)"
#. GET binning should be AFTER setgeometry! #. GET binning should be AFTER setgeometry!
#: ccdfunc.c:758 #: ccdfunc.c:756
msgid "Can't get current binning" msgid "Can't get current binning"
msgstr "Не могу получить текущее значение биннинга" msgstr "Не могу получить текущее значение биннинга"
@ -105,7 +105,7 @@ msgstr "
msgid "Can't get max wheel position" msgid "Can't get max wheel position"
msgstr "Не могу определить предельную позицию колеса" msgstr "Не могу определить предельную позицию колеса"
#: ccdfunc.c:792 ccdfunc.c:840 #: ccdfunc.c:790 ccdfunc.c:840
msgid "Can't grab image" msgid "Can't grab image"
msgstr "Не могу захватить изображение" msgstr "Не могу захватить изображение"
@ -117,7 +117,7 @@ msgstr "
msgid "Can't init mutex!" msgid "Can't init mutex!"
msgstr "Не могу инициализировать мьютекс!" msgstr "Не могу инициализировать мьютекс!"
#: client.c:269 #: client.c:276
msgid "Can't make exposition" msgid "Can't make exposition"
msgstr "Не могу выполнить экспозицию" msgstr "Не могу выполнить экспозицию"
@ -136,7 +136,7 @@ msgstr "
msgid "Can't save file with prefix %s" msgid "Can't save file with prefix %s"
msgstr "Не могу сохранить файл с префиксом %s" msgstr "Не могу сохранить файл с префиксом %s"
#: ccdfunc.c:742 #: ccdfunc.c:740
#, c-format #, c-format
msgid "Can't set %d flushes" msgid "Can't set %d flushes"
msgstr "Не могу установить %d сбросов" msgstr "Не могу установить %d сбросов"
@ -162,12 +162,12 @@ msgstr "
msgid "Can't set active wheel number" msgid "Can't set active wheel number"
msgstr "Не могу установить номер активного колеса" msgstr "Не могу установить номер активного колеса"
#: ccdfunc.c:726 server.c:229 #: ccdfunc.c:724 server.c:228
#, c-format #, c-format
msgid "Can't set binning %dx%d" msgid "Can't set binning %dx%d"
msgstr "Не могу установить биннинг %dx%d" msgstr "Не могу установить биннинг %dx%d"
#: ccdfunc.c:752 #: ccdfunc.c:750
msgid "Can't set bit depth" msgid "Can't set bit depth"
msgstr "Не могу установить разрядность АЦП" msgstr "Не могу установить разрядность АЦП"
@ -176,7 +176,7 @@ msgstr "
msgid "Can't set brightness to %g" msgid "Can't set brightness to %g"
msgstr "Не могу установить яркость в %g" msgstr "Не могу установить яркость в %g"
#: ccdfunc.c:746 #: ccdfunc.c:744
#, c-format #, c-format
msgid "Can't set exposure time to %f seconds" msgid "Can't set exposure time to %f seconds"
msgstr "Не могу установить экспозицию в %f секунд" msgstr "Не могу установить экспозицию в %f секунд"
@ -190,7 +190,7 @@ msgstr "
msgid "Can't set gain to %g" msgid "Can't set gain to %g"
msgstr "Не могу установить Gain в %g" msgstr "Не могу установить Gain в %g"
#: ccdfunc.c:738 server.c:230 #: ccdfunc.c:736 server.c:229
msgid "Can't set given geometry" msgid "Can't set given geometry"
msgstr "Не могу установить геометрию" msgstr "Не могу установить геометрию"
@ -204,7 +204,7 @@ msgstr "
msgid "Can't set position %g: out of limits [%g, %g]" msgid "Can't set position %g: out of limits [%g, %g]"
msgstr "Не могу установить позицию %g: вне пределов [%g, %g]" msgstr "Не могу установить позицию %g: вне пределов [%g, %g]"
#: ccdfunc.c:754 #: ccdfunc.c:752
msgid "Can't set readout speed" msgid "Can't set readout speed"
msgstr "Не могу установить скорость считывания" msgstr "Не могу установить скорость считывания"
@ -213,12 +213,12 @@ msgstr "
msgid "Can't set wheel position %d" msgid "Can't set wheel position %d"
msgstr "Не могу установить положение колеса %d" msgstr "Не могу установить положение колеса %d"
#: ccdfunc.c:782 ccdfunc.c:832 server.c:124 #: ccdfunc.c:780 ccdfunc.c:832 server.c:123
msgid "Can't start exposition" msgid "Can't start exposition"
msgstr "Не могу начать экспозицию" msgstr "Не могу начать экспозицию"
#. п≈п╟я┘п╡п╟я┌ п╨п╟п╢я─п╟ %d\n #. п≈п╟я┘п╡п╟я┌ п╨п╟п╢я─п╟ %d\n
#: ccdfunc.c:780 #: ccdfunc.c:778
#, c-format #, c-format
msgid "Capture frame %d" msgid "Capture frame %d"
msgstr "Захват кадра %d" msgstr "Захват кадра %d"
@ -228,7 +228,7 @@ msgstr "
msgid "Current format: %s" msgid "Current format: %s"
msgstr "" msgstr ""
#: cmdlnopts.c:108 #: cmdlnopts.c:109
msgid "Display image in OpenGL window" msgid "Display image in OpenGL window"
msgstr "Отображение изображения в окне OpenGL" msgstr "Отображение изображения в окне OpenGL"
@ -289,7 +289,7 @@ msgstr "
msgid "N flushes before exposing (default: 1)" msgid "N flushes before exposing (default: 1)"
msgstr "N засвечиваний перед экспозицией (по умолчанию: 1)" msgstr "N засвечиваний перед экспозицией (по умолчанию: 1)"
#: server.c:167 #: server.c:166
msgid "No camera device" msgid "No camera device"
msgstr "Не указано устройство камеры" msgstr "Не указано устройство камеры"
@ -305,11 +305,11 @@ msgstr "
msgid "No wheels found" msgid "No wheels found"
msgstr "Турелей не обнаружено" msgstr "Турелей не обнаружено"
#: ccdfunc.c:756 #: ccdfunc.c:754
msgid "Only show statistics" msgid "Only show statistics"
msgstr "Только отобразить статистику" msgstr "Только отобразить статистику"
#: cmdlnopts.c:104 #: cmdlnopts.c:105
msgid "PID file (default: " msgid "PID file (default: "
msgstr "PID-файл (по умолчанию: " msgstr "PID-файл (по умолчанию: "
@ -318,16 +318,16 @@ msgstr "PID-
msgid "Pixel size: %g x %g" msgid "Pixel size: %g x %g"
msgstr "Размер пикселя: %g x %g" msgstr "Размер пикселя: %g x %g"
#: ccdfunc.c:789 #: ccdfunc.c:787
msgid "Read grabbed image" msgid "Read grabbed image"
msgstr "Считывание изображения" msgstr "Считывание изображения"
#: ccdfunc.c:755 #: ccdfunc.c:753
#, c-format #, c-format
msgid "Readout mode: %s" msgid "Readout mode: %s"
msgstr "Режим считывания: %s" msgstr "Режим считывания: %s"
#: client.c:298 #: client.c:305
msgid "Server timeout" msgid "Server timeout"
msgstr "Таймаут сервера" msgstr "Таймаут сервера"
@ -521,11 +521,15 @@ msgstr "
msgid "output file name" msgid "output file name"
msgstr "имя файла" msgstr "имя файла"
#: cmdlnopts.c:104
msgid "passive viewer (only get last images)"
msgstr ""
#: cmdlnopts.c:60 #: cmdlnopts.c:60
msgid "program author" msgid "program author"
msgstr "автор программы" msgstr "автор программы"
#: cmdlnopts.c:105 #: cmdlnopts.c:106
msgid "restart image server" msgid "restart image server"
msgstr "перезапуск сервера" msgstr "перезапуск сервера"

13
main.c
View File

@ -58,17 +58,16 @@ void signals(int signo){
// slave: cancel exposition // slave: cancel exposition
if(signo) WARNX("Get signal %d - exit", signo); if(signo) WARNX("Get signal %d - exit", signo);
if(!GP->client){ if(!GP->client){
DBG("Cancel capturing"); DBG("Cancel capturing and close all");
cancel(); camstop();
closewheel();
focclose();
} }
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
DBG("KILL GL"); DBG("KILL GL");
closeGL(); closeGL();
usleep(10000); usleep(10000);
#endif #endif
closewheel();
focclose();
closecam();
exit(signo); exit(signo);
} }
@ -87,6 +86,10 @@ int main(int argc, char **argv){
omp_set_num_threads(cpunumber); omp_set_num_threads(cpunumber);
*/ */
parse_args(argc, argv); parse_args(argc, argv);
if(GP->viewer){
GP->client = 1;
GP->showimage = 1;
}
if(GP->outfile && GP->outfileprefix) ERRX("Can't use outfile name and prefix together"); if(GP->outfile && GP->outfileprefix) ERRX("Can't use outfile name and prefix together");
if(GP->outfile && !GP->rewrite){ if(GP->outfile && !GP->rewrite){
struct stat filestat; struct stat filestat;

View File

@ -117,7 +117,6 @@ static inline void cameraidlestate(){ // idle - wait for capture commands
DBG("Start exposition"); DBG("Start exposition");
camflags &= ~(FLAG_STARTCAPTURE | FLAG_CANCEL); camflags &= ~(FLAG_STARTCAPTURE | FLAG_CANCEL);
camstate = CAMERA_CAPTURE; camstate = CAMERA_CAPTURE;
camera->cancel();
fixima(); fixima();
if(!camera->startexposition()){ if(!camera->startexposition()){
LOGERR("Can't start exposition"); LOGERR("Can't start exposition");
@ -515,9 +514,16 @@ static hresult brightnesshandler(_U_ int fd, _U_ const char *key, _U_ const char
static hresult formathandler(int fd, const char *key, const char *val){ static hresult formathandler(int fd, const char *key, const char *val){
char buf[64]; char buf[64];
frameformat fmt; frameformat fmt;
DBG("key=%s, val=%s", key, val);
if(val){ if(val){
if(0 == strcmp(key, CMD_FRAMEMAX)) return RESULT_BADKEY; // can't set maxformat if(0 == strcmp(key, CMD_FRAMEMAX)){
if(4 != sscanf(val, "%d,%d,%d,%d", &fmt.xoff, &fmt.yoff, &fmt.w, &fmt.h)) return RESULT_BADVAL; DBG("CANT SET MAXFORMAT");
return RESULT_BADKEY; // can't set maxformat
}
if(4 != sscanf(val, "%d,%d,%d,%d", &fmt.xoff, &fmt.yoff, &fmt.w, &fmt.h)){
DBG("Wrong format %s", val);
return RESULT_BADVAL;
}
fmt.w -= fmt.xoff; fmt.h -= fmt.yoff; fmt.w -= fmt.xoff; fmt.h -= fmt.yoff;
int r = camera->setgeometry(&fmt); int r = camera->setgeometry(&fmt);
if(!r) return RESULT_FAIL; if(!r) return RESULT_FAIL;
@ -894,7 +900,7 @@ static hresult imsizehandler(int fd, const char *key, _U_ const char *val){
if(0 == strcmp(key, CMD_IMHEIGHT)) snprintf(buf, 63, CMD_IMHEIGHT "=%d", ima.h); if(0 == strcmp(key, CMD_IMHEIGHT)) snprintf(buf, 63, CMD_IMHEIGHT "=%d", ima.h);
else snprintf(buf, 63, CMD_IMWIDTH "=%d", ima.w); else snprintf(buf, 63, CMD_IMWIDTH "=%d", ima.w);
if(!sendstrmessage(fd, buf)) return RESULT_DISCONNECTED; if(!sendstrmessage(fd, buf)) return RESULT_DISCONNECTED;
return RESULT_OK; return RESULT_SILENCE;
} }
// for setters: do nothing when camera not in idle state // for setters: do nothing when camera not in idle state

View File

@ -120,6 +120,7 @@ int start_socket(int isserver, char *path, int isnet){
else{ else{
#ifdef IMAGEVIEW #ifdef IMAGEVIEW
if(GP->showimage){ if(GP->showimage){
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
}else }else
@ -256,6 +257,7 @@ static int parsestring(int fd, handleritem *handlers, char *str){
return sendstrmessage(fd, hresult2str(r)); return sendstrmessage(fd, hresult2str(r));
} }
} }
DBG("Command not found!");
return sendstrmessage(fd, resmessages[RESULT_BADKEY]); return sendstrmessage(fd, resmessages[RESULT_BADKEY]);
} }

View File

@ -29,13 +29,13 @@
#define MAXCLIENTS (30) #define MAXCLIENTS (30)
// wait for mutex locking // wait for mutex locking
#define BUSY_TIMEOUT (0.3) #define BUSY_TIMEOUT (0.1)
// waiting for answer timeout // waiting for answer timeout
#define ANSWER_TIMEOUT (1.0) #define ANSWER_TIMEOUT (1.0)
// wait for exposition ends (between subsequent check calls) // wait for exposition ends (between subsequent check calls)
#define WAIT_TIMEOUT (2.0) #define WAIT_TIMEOUT (2.0)
// client will disconnect after this time from last server message // client will disconnect after this time from last server message
#define CLIENT_TIMEOUT (10.0) #define CLIENT_TIMEOUT (3.0)
extern pthread_mutex_t locmutex; extern pthread_mutex_t locmutex;