mirror of
https://github.com/eddyem/CCD_Capture.git
synced 2025-12-06 02:35:13 +03:00
try to fix network data transport (really need another socket)
This commit is contained in:
parent
87e8120122
commit
8b6e7435e0
@ -18,6 +18,7 @@
|
||||
|
||||
#include <C/FlyCapture2_C.h>
|
||||
#include <C/FlyCapture2Defs_C.h>
|
||||
#include <stdatomic.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -33,6 +34,7 @@ static fc2PGRGuid guid;
|
||||
static fc2Error err = FC2_ERROR_OK;
|
||||
|
||||
static int isopened = FALSE, is16bit = FALSE;
|
||||
static atomic_int canceled = 0;
|
||||
static char camname[BUFSIZ] = {0};
|
||||
|
||||
#ifndef Stringify
|
||||
@ -287,6 +289,7 @@ rtn:
|
||||
|
||||
static int capture(IMG *ima){
|
||||
FNAME();
|
||||
if(canceled) return FALSE;
|
||||
if(!ima || !ima->data || !isopened) return FALSE;
|
||||
static int toohot = FALSE;
|
||||
float f;
|
||||
@ -432,12 +435,17 @@ static int shutter(_U_ shutter_op cmd){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void capcancel(){
|
||||
canceled = 1;
|
||||
DBG("No capturing now");
|
||||
}
|
||||
|
||||
static int ffalse(_U_ float f){ return FALSE; }
|
||||
static int fpfalse(_U_ float *f){ return FALSE; }
|
||||
static int ifalse(_U_ int i){ return FALSE; }
|
||||
static int vtrue(){ return TRUE; }
|
||||
static int ipfalse(_U_ int *i){ return FALSE; }
|
||||
static void vstub(){ return ;}
|
||||
//static void vstub(){ return ;}
|
||||
|
||||
/*
|
||||
* Global objects: camera, focuser and wheel
|
||||
@ -447,7 +455,7 @@ Camera camera = {
|
||||
.close = disconnect,
|
||||
.pollcapture = pollcapt,
|
||||
.capture = capture,
|
||||
.cancel = vstub,
|
||||
.cancel = capcancel,
|
||||
.startexposition = vtrue,
|
||||
// setters:
|
||||
.setDevNo = setdevno,
|
||||
|
||||
31
ccdfunc.c
31
ccdfunc.c
@ -211,14 +211,13 @@ int saveFITS(IMG *img, char **outp){
|
||||
}
|
||||
int width = img->w, height = img->h;
|
||||
void *data = (void*) img->data;
|
||||
long naxes[2] = {width, height};
|
||||
long naxes[2] = {width, height}, tmpl;
|
||||
double tmpd = 0.0;
|
||||
float tmpf = 0.0;
|
||||
int tmpi = 0;
|
||||
struct tm *tm_time;
|
||||
char bufc[FLEN_CARD];
|
||||
time_t savetime = time(NULL);
|
||||
double dsavetime = dtime();
|
||||
fitsfile *fp;
|
||||
fitserror = 0;
|
||||
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)
|
||||
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)");
|
||||
tmpl = (long) savetime;
|
||||
tm_time = localtime(&savetime);
|
||||
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);
|
||||
// DATE-OBS / DATE (YYYY/MM/DD) OF OBS.
|
||||
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);
|
||||
}
|
||||
/*********************** expose control ***********************/
|
||||
// cancel previous exp
|
||||
camera->cancel();
|
||||
if(GP->hbin < 1) GP->hbin = 1;
|
||||
if(GP->vbin < 1) GP->vbin = 1;
|
||||
if(!camera->setbin(GP->hbin, GP->vbin)){
|
||||
@ -813,9 +811,11 @@ DBG("w=%d, h=%d", raw_width, raw_height);
|
||||
closecam();
|
||||
}
|
||||
|
||||
void cancel(){
|
||||
// cancel expositions and close camera devise
|
||||
void camstop(){
|
||||
if(camera){
|
||||
camera->cancel();
|
||||
camera->close();
|
||||
}
|
||||
}
|
||||
|
||||
@ -855,16 +855,18 @@ eof:
|
||||
* @return TRUE if new image available
|
||||
*/
|
||||
int ccdcaptured(IMG **imgptr){
|
||||
static double tlast = 0.;
|
||||
if(!imgptr) return FALSE;
|
||||
static pthread_t grabthread = 0;
|
||||
if(imgptr == (void*)-1){ // kill `grabnext`
|
||||
DBG("Kill grabbing thread");
|
||||
DBG("Wait for grabbing thread ends");
|
||||
if(grabthread){
|
||||
pthread_cancel(grabthread);
|
||||
//pthread_cancel(grabthread); - this kills some cameras
|
||||
//pthread_timedjoin_np
|
||||
pthread_join(grabthread, NULL);
|
||||
grabthread = 0;
|
||||
}
|
||||
DBG("Killed");
|
||||
DBG("OK");
|
||||
return FALSE;
|
||||
}
|
||||
frameformat fmt = camera->geometry;
|
||||
@ -879,20 +881,27 @@ int ccdcaptured(IMG **imgptr){
|
||||
ima->h = raw_height;
|
||||
*imgptr = ima;
|
||||
}else ima = *imgptr;
|
||||
|
||||
if(!grabthread){ // start new grab
|
||||
DBG("\n\n\nStart new grab");
|
||||
if(pthread_create(&grabthread, NULL, &grabnext, (void*)ima)){
|
||||
WARN("Can't create grabbing thread");
|
||||
grabthread = 0;
|
||||
}
|
||||
}
|
||||
tlast = dtime();
|
||||
}else{ // grab in process
|
||||
if(grabends){ // thread is dead
|
||||
DBG("Thread is dead");
|
||||
DBG("Grab ends");
|
||||
void *vr;
|
||||
pthread_join(grabthread, &vr);
|
||||
int retcode = *(int*)vr;
|
||||
DBG("retcode = %d", retcode);
|
||||
grabthread = 0;
|
||||
if(GP->verbose > 1){
|
||||
double t = dtime();
|
||||
green("Framerate=%.2g\n", 1./(t-tlast));
|
||||
tlast = t;
|
||||
}
|
||||
if(retcode) return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,7 +29,7 @@ void focusers();
|
||||
void wheels();
|
||||
int prepare_ccds();
|
||||
void ccds();
|
||||
void cancel();
|
||||
void camstop();
|
||||
|
||||
int startCCD(void **dlh);
|
||||
int startWheel(void **dlh);
|
||||
|
||||
119
client.c
119
client.c
@ -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)
|
||||
static volatile atomic_int expstate = CAMERA_CAPTURE;
|
||||
static int xm0,ym0,xm1,ym1; // max format
|
||||
static int xc0,yc0,xc1,yc1; // current format
|
||||
|
||||
#ifdef IMAGEVIEW
|
||||
static IMG ima = {0};
|
||||
@ -110,6 +111,9 @@ static int parseans(char *ans){
|
||||
}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);
|
||||
}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
|
||||
else if(0 == strcmp(CMD_IMWIDTH, ans)){
|
||||
@ -165,13 +169,15 @@ static void send_headers(int sock){
|
||||
// CCD/CMOS
|
||||
if(GP->X0 > -1 || GP->Y0 > -1 || GP->X1 > -1 || GP->Y1 > -1){ // set format
|
||||
SENDMSG(CMD_FRAMEMAX);
|
||||
DBG("max format: (%d,%d)x(%d,%d)", xm0,ym0,xm1,ym1);
|
||||
if(GP->X0 < 0) GP->X0 = xm0; // default values
|
||||
SENDMSG(CMD_FRAMEFORMAT);
|
||||
if(GP->X0 < 0) GP->X0 = xc0; // default values
|
||||
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;
|
||||
if(GP->X1 < GP->X0+1 || GP->X1 > xm1) GP->X1 = xm1;
|
||||
if(GP->Y1 < GP->Y0+1 || GP->Y1 > ym1) GP->Y1 = ym1;
|
||||
if(GP->X1 < GP->X0+1) GP->X1 = xc1;
|
||||
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);
|
||||
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
|
||||
SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE);
|
||||
}else{
|
||||
while(getans(sock));
|
||||
double t0 = dtime();
|
||||
while(getans(sock) && dtime() - t0 < WAIT_TIMEOUT);
|
||||
DBG("RETURN: no more data");
|
||||
return;
|
||||
}
|
||||
@ -306,15 +313,48 @@ void init_grab_sock(int 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
|
||||
FNAME();
|
||||
if(grabsockfd < 0) return NULL;
|
||||
int sock = grabsockfd;
|
||||
while(1){
|
||||
DBG("WAIT");
|
||||
while(grabends); // wait until image processed
|
||||
SENDMSG(CMD_IMWIDTH);
|
||||
SENDMSG(CMD_IMHEIGHT);
|
||||
expstate = CAMERA_CAPTURE;
|
||||
DBG("CAPT");
|
||||
SENDMSG(CMD_EXPSTATE "=%d", CAMERA_CAPTURE); // start capture
|
||||
double timeout = GP->exptime + CLIENT_TIMEOUT, t0 = dtime();
|
||||
useconds_t sleept = 500000; // 0.5s
|
||||
@ -335,31 +375,23 @@ static void *grabnext(void _U_ *arg){ // daemon grabbing images through the net
|
||||
continue;
|
||||
}
|
||||
DBG("Frame ready");
|
||||
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;
|
||||
getimage();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
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();
|
||||
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");
|
||||
getimage();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -370,24 +402,33 @@ int sockcaptured(IMG **imgptr){
|
||||
static pthread_t grabthread = 0;
|
||||
if(grabsockfd < 0) return FALSE;
|
||||
if(imgptr == (void*)-1){ // kill `grabnext`
|
||||
DBG("Kill grabbing thread");
|
||||
DBG("Wait for grabbing thread");
|
||||
if(grabthread){
|
||||
pthread_cancel(grabthread);
|
||||
pthread_join(grabthread, NULL);
|
||||
grabthread = 0;
|
||||
}
|
||||
DBG("Killed");
|
||||
DBG("OK");
|
||||
return FALSE;
|
||||
}
|
||||
if(!grabthread){ // start new grab
|
||||
DBG("\n\n\nStart new grab");
|
||||
if(pthread_create(&grabthread, NULL, &grabnext, NULL)){
|
||||
WARN("Can't create grabbing thread");
|
||||
grabthread = 0;
|
||||
}
|
||||
if(GP->viewer){
|
||||
DBG("\n\n\nStart new waiting");
|
||||
if(pthread_create(&grabthread, NULL, &waitimage, NULL)){
|
||||
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
|
||||
if(grabends){ // image is ready
|
||||
DBG("Image ready");
|
||||
grabthread = 0;
|
||||
if(*imgptr && (*imgptr != &ima)) free(*imgptr);
|
||||
*imgptr = &ima;
|
||||
grabends = 0;
|
||||
|
||||
@ -101,6 +101,7 @@ myoption cmdlnopts[] = {
|
||||
{"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")},
|
||||
{"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 ")")},
|
||||
{"restart", NO_ARGS, &G.restart,1, arg_none, NULL, N_("restart image server")},
|
||||
|
||||
|
||||
@ -42,8 +42,9 @@ typedef struct{
|
||||
char **addhdr; // list of files from which to add header records
|
||||
int restart; // restart server
|
||||
int waitexpend; // wait while exposition ends
|
||||
int cancelexpose; // cancel exp
|
||||
int cancelexpose; // cancel exp (for Grasshopper - forbid forever)
|
||||
int client; // run as client
|
||||
int viewer; // passive client (only get last images)
|
||||
int listdevices; // list connected devices
|
||||
int fanspeed; // fan speed: 0-2
|
||||
int noflush; // turn off bg flushing
|
||||
|
||||
@ -518,11 +518,11 @@ void closeGL(){
|
||||
usleep(1000);
|
||||
if(!initialized) return;
|
||||
initialized = 0;
|
||||
cancel(); // cancel expositions
|
||||
camstop(); // cancel expositions
|
||||
//DBG("Leave mainloop");
|
||||
//glutLeaveMainLoop();
|
||||
DBG("kill");
|
||||
killwindow();
|
||||
DBG("Leave mainloop");
|
||||
glutLeaveMainLoop();
|
||||
DBG("join");
|
||||
if(GLUTthread) pthread_join(GLUTthread, NULL); // wait while main thread exits
|
||||
DBG("main GL thread cancelled");
|
||||
|
||||
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -234,14 +234,18 @@ msgid "run as client"
|
||||
msgstr ""
|
||||
|
||||
#: cmdlnopts.c:104
|
||||
msgid "PID file (default: "
|
||||
msgid "passive viewer (only get last images)"
|
||||
msgstr ""
|
||||
|
||||
#: cmdlnopts.c:105
|
||||
msgid "PID file (default: "
|
||||
msgstr ""
|
||||
|
||||
#: cmdlnopts.c:106
|
||||
msgid "restart image server"
|
||||
msgstr ""
|
||||
|
||||
#: cmdlnopts.c:108
|
||||
#: cmdlnopts.c:109
|
||||
msgid "Display image in OpenGL window"
|
||||
msgstr ""
|
||||
|
||||
@ -474,88 +478,88 @@ msgstr ""
|
||||
msgid "Can't set brightness to %g"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:726 server.c:229
|
||||
#: ccdfunc.c:724 server.c:228
|
||||
#, c-format
|
||||
msgid "Can't set binning %dx%d"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:738 server.c:230
|
||||
#: ccdfunc.c:736 server.c:229
|
||||
msgid "Can't set given geometry"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:742
|
||||
#: ccdfunc.c:740
|
||||
#, c-format
|
||||
msgid "Can't set %d flushes"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:746
|
||||
#: ccdfunc.c:744
|
||||
#, c-format
|
||||
msgid "Can't set exposure time to %f seconds"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:749
|
||||
#: ccdfunc.c:747
|
||||
msgid "Can't change frame type"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:752
|
||||
#: ccdfunc.c:750
|
||||
msgid "Can't set bit depth"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:754
|
||||
#: ccdfunc.c:752
|
||||
msgid "Can't set readout speed"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:755
|
||||
#: ccdfunc.c:753
|
||||
#, c-format
|
||||
msgid "Readout mode: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:756
|
||||
#: ccdfunc.c:754
|
||||
msgid "Only show statistics"
|
||||
msgstr ""
|
||||
|
||||
#. GET binning should be AFTER setgeometry!
|
||||
#: ccdfunc.c:758
|
||||
#: ccdfunc.c:756
|
||||
msgid "Can't get current binning"
|
||||
msgstr ""
|
||||
|
||||
#. Захват кадра %d\n
|
||||
#: ccdfunc.c:780
|
||||
#: ccdfunc.c:778
|
||||
#, c-format
|
||||
msgid "Capture frame %d"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:782 ccdfunc.c:832 server.c:124
|
||||
#: ccdfunc.c:780 ccdfunc.c:832 server.c:123
|
||||
msgid "Can't start exposition"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:786
|
||||
#: ccdfunc.c:784
|
||||
msgid "Can't capture image"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:789
|
||||
#: ccdfunc.c:787
|
||||
msgid "Read grabbed image"
|
||||
msgstr ""
|
||||
|
||||
#: ccdfunc.c:792 ccdfunc.c:840
|
||||
#: ccdfunc.c:790 ccdfunc.c:840
|
||||
msgid "Can't grab image"
|
||||
msgstr ""
|
||||
|
||||
#. %d секунд до окончания паузы\n
|
||||
#: ccdfunc.c:801 client.c:282
|
||||
#: ccdfunc.c:799 client.c:289
|
||||
#, c-format
|
||||
msgid "%d seconds till pause ends\n"
|
||||
msgstr ""
|
||||
|
||||
#: server.c:167
|
||||
#: server.c:166
|
||||
msgid "No camera device"
|
||||
msgstr ""
|
||||
|
||||
#: client.c:269
|
||||
#: client.c:276
|
||||
msgid "Can't make exposition"
|
||||
msgstr ""
|
||||
|
||||
#: client.c:298
|
||||
#: client.c:305
|
||||
msgid "Server timeout"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
msgid ""
|
||||
msgstr "Project-Id-Version: PACKAGE VERSION\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"
|
||||
"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 я│п╣п╨я┐п╫п╢ п╢п╬ п╬п╨п╬п╫я┤п╟п╫п╦я▐ п©п╟я┐п╥я▀\n
|
||||
#: ccdfunc.c:801 client.c:282
|
||||
#: ccdfunc.c:799 client.c:289
|
||||
#, c-format
|
||||
msgid "%d seconds till pause ends\n"
|
||||
msgstr "%d секунд до окончания паузы\n"
|
||||
@ -52,11 +52,11 @@ msgstr "
|
||||
msgid "Camera model: %s"
|
||||
msgstr "Модель светоприемника: %s"
|
||||
|
||||
#: ccdfunc.c:786
|
||||
#: ccdfunc.c:784
|
||||
msgid "Can't capture image"
|
||||
msgstr "Не могу захватить изображение"
|
||||
|
||||
#: ccdfunc.c:749
|
||||
#: ccdfunc.c:747
|
||||
msgid "Can't change frame type"
|
||||
msgstr "Не могу изменить тип кадра"
|
||||
|
||||
@ -89,7 +89,7 @@ msgid "Can't get IOport state (unsupported?)"
|
||||
msgstr "Не могу получить состояние порта I/O (не поддерживается?)"
|
||||
|
||||
#. GET binning should be AFTER setgeometry!
|
||||
#: ccdfunc.c:758
|
||||
#: ccdfunc.c:756
|
||||
msgid "Can't get current binning"
|
||||
msgstr "Не могу получить текущее значение биннинга"
|
||||
|
||||
@ -105,7 +105,7 @@ msgstr "
|
||||
msgid "Can't get max wheel position"
|
||||
msgstr "Не могу определить предельную позицию колеса"
|
||||
|
||||
#: ccdfunc.c:792 ccdfunc.c:840
|
||||
#: ccdfunc.c:790 ccdfunc.c:840
|
||||
msgid "Can't grab image"
|
||||
msgstr "Не могу захватить изображение"
|
||||
|
||||
@ -117,7 +117,7 @@ msgstr "
|
||||
msgid "Can't init mutex!"
|
||||
msgstr "Не могу инициализировать мьютекс!"
|
||||
|
||||
#: client.c:269
|
||||
#: client.c:276
|
||||
msgid "Can't make exposition"
|
||||
msgstr "Не могу выполнить экспозицию"
|
||||
|
||||
@ -136,7 +136,7 @@ msgstr "
|
||||
msgid "Can't save file with prefix %s"
|
||||
msgstr "Не могу сохранить файл с префиксом %s"
|
||||
|
||||
#: ccdfunc.c:742
|
||||
#: ccdfunc.c:740
|
||||
#, c-format
|
||||
msgid "Can't set %d flushes"
|
||||
msgstr "Не могу установить %d сбросов"
|
||||
@ -162,12 +162,12 @@ msgstr "
|
||||
msgid "Can't set active wheel number"
|
||||
msgstr "Не могу установить номер активного колеса"
|
||||
|
||||
#: ccdfunc.c:726 server.c:229
|
||||
#: ccdfunc.c:724 server.c:228
|
||||
#, c-format
|
||||
msgid "Can't set binning %dx%d"
|
||||
msgstr "Не могу установить биннинг %dx%d"
|
||||
|
||||
#: ccdfunc.c:752
|
||||
#: ccdfunc.c:750
|
||||
msgid "Can't set bit depth"
|
||||
msgstr "Не могу установить разрядность АЦП"
|
||||
|
||||
@ -176,7 +176,7 @@ msgstr "
|
||||
msgid "Can't set brightness to %g"
|
||||
msgstr "Не могу установить яркость в %g"
|
||||
|
||||
#: ccdfunc.c:746
|
||||
#: ccdfunc.c:744
|
||||
#, c-format
|
||||
msgid "Can't set exposure time to %f seconds"
|
||||
msgstr "Не могу установить экспозицию в %f секунд"
|
||||
@ -190,7 +190,7 @@ msgstr "
|
||||
msgid "Can't set gain to %g"
|
||||
msgstr "Не могу установить Gain в %g"
|
||||
|
||||
#: ccdfunc.c:738 server.c:230
|
||||
#: ccdfunc.c:736 server.c:229
|
||||
msgid "Can't set given geometry"
|
||||
msgstr "Не могу установить геометрию"
|
||||
|
||||
@ -204,7 +204,7 @@ msgstr "
|
||||
msgid "Can't set position %g: out of limits [%g, %g]"
|
||||
msgstr "Не могу установить позицию %g: вне пределов [%g, %g]"
|
||||
|
||||
#: ccdfunc.c:754
|
||||
#: ccdfunc.c:752
|
||||
msgid "Can't set readout speed"
|
||||
msgstr "Не могу установить скорость считывания"
|
||||
|
||||
@ -213,12 +213,12 @@ msgstr "
|
||||
msgid "Can't set wheel position %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"
|
||||
msgstr "Не могу начать экспозицию"
|
||||
|
||||
#. п≈п╟я┘п╡п╟я┌ п╨п╟п╢я─п╟ %d\n
|
||||
#: ccdfunc.c:780
|
||||
#: ccdfunc.c:778
|
||||
#, c-format
|
||||
msgid "Capture frame %d"
|
||||
msgstr "Захват кадра %d"
|
||||
@ -228,7 +228,7 @@ msgstr "
|
||||
msgid "Current format: %s"
|
||||
msgstr ""
|
||||
|
||||
#: cmdlnopts.c:108
|
||||
#: cmdlnopts.c:109
|
||||
msgid "Display image in OpenGL window"
|
||||
msgstr "Отображение изображения в окне OpenGL"
|
||||
|
||||
@ -289,7 +289,7 @@ msgstr "
|
||||
msgid "N flushes before exposing (default: 1)"
|
||||
msgstr "N засвечиваний перед экспозицией (по умолчанию: 1)"
|
||||
|
||||
#: server.c:167
|
||||
#: server.c:166
|
||||
msgid "No camera device"
|
||||
msgstr "Не указано устройство камеры"
|
||||
|
||||
@ -305,11 +305,11 @@ msgstr "
|
||||
msgid "No wheels found"
|
||||
msgstr "Турелей не обнаружено"
|
||||
|
||||
#: ccdfunc.c:756
|
||||
#: ccdfunc.c:754
|
||||
msgid "Only show statistics"
|
||||
msgstr "Только отобразить статистику"
|
||||
|
||||
#: cmdlnopts.c:104
|
||||
#: cmdlnopts.c:105
|
||||
msgid "PID file (default: "
|
||||
msgstr "PID-файл (по умолчанию: "
|
||||
|
||||
@ -318,16 +318,16 @@ msgstr "PID-
|
||||
msgid "Pixel size: %g x %g"
|
||||
msgstr "Размер пикселя: %g x %g"
|
||||
|
||||
#: ccdfunc.c:789
|
||||
#: ccdfunc.c:787
|
||||
msgid "Read grabbed image"
|
||||
msgstr "Считывание изображения"
|
||||
|
||||
#: ccdfunc.c:755
|
||||
#: ccdfunc.c:753
|
||||
#, c-format
|
||||
msgid "Readout mode: %s"
|
||||
msgstr "Режим считывания: %s"
|
||||
|
||||
#: client.c:298
|
||||
#: client.c:305
|
||||
msgid "Server timeout"
|
||||
msgstr "Таймаут сервера"
|
||||
|
||||
@ -521,11 +521,15 @@ msgstr "
|
||||
msgid "output file name"
|
||||
msgstr "имя файла"
|
||||
|
||||
#: cmdlnopts.c:104
|
||||
msgid "passive viewer (only get last images)"
|
||||
msgstr ""
|
||||
|
||||
#: cmdlnopts.c:60
|
||||
msgid "program author"
|
||||
msgstr "автор программы"
|
||||
|
||||
#: cmdlnopts.c:105
|
||||
#: cmdlnopts.c:106
|
||||
msgid "restart image server"
|
||||
msgstr "перезапуск сервера"
|
||||
|
||||
|
||||
13
main.c
13
main.c
@ -58,17 +58,16 @@ void signals(int signo){
|
||||
// slave: cancel exposition
|
||||
if(signo) WARNX("Get signal %d - exit", signo);
|
||||
if(!GP->client){
|
||||
DBG("Cancel capturing");
|
||||
cancel();
|
||||
DBG("Cancel capturing and close all");
|
||||
camstop();
|
||||
closewheel();
|
||||
focclose();
|
||||
}
|
||||
#ifdef IMAGEVIEW
|
||||
DBG("KILL GL");
|
||||
closeGL();
|
||||
usleep(10000);
|
||||
#endif
|
||||
closewheel();
|
||||
focclose();
|
||||
closecam();
|
||||
exit(signo);
|
||||
}
|
||||
|
||||
@ -87,6 +86,10 @@ int main(int argc, char **argv){
|
||||
omp_set_num_threads(cpunumber);
|
||||
*/
|
||||
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->rewrite){
|
||||
struct stat filestat;
|
||||
|
||||
14
server.c
14
server.c
@ -117,7 +117,6 @@ static inline void cameraidlestate(){ // idle - wait for capture commands
|
||||
DBG("Start exposition");
|
||||
camflags &= ~(FLAG_STARTCAPTURE | FLAG_CANCEL);
|
||||
camstate = CAMERA_CAPTURE;
|
||||
camera->cancel();
|
||||
fixima();
|
||||
if(!camera->startexposition()){
|
||||
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){
|
||||
char buf[64];
|
||||
frameformat fmt;
|
||||
DBG("key=%s, val=%s", key, val);
|
||||
if(val){
|
||||
if(0 == strcmp(key, CMD_FRAMEMAX)) return RESULT_BADKEY; // can't set maxformat
|
||||
if(4 != sscanf(val, "%d,%d,%d,%d", &fmt.xoff, &fmt.yoff, &fmt.w, &fmt.h)) return RESULT_BADVAL;
|
||||
if(0 == strcmp(key, CMD_FRAMEMAX)){
|
||||
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;
|
||||
int r = camera->setgeometry(&fmt);
|
||||
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);
|
||||
else snprintf(buf, 63, CMD_IMWIDTH "=%d", ima.w);
|
||||
if(!sendstrmessage(fd, buf)) return RESULT_DISCONNECTED;
|
||||
return RESULT_OK;
|
||||
return RESULT_SILENCE;
|
||||
}
|
||||
|
||||
// for setters: do nothing when camera not in idle state
|
||||
|
||||
2
socket.c
2
socket.c
@ -120,6 +120,7 @@ int start_socket(int isserver, char *path, int isnet){
|
||||
else{
|
||||
#ifdef IMAGEVIEW
|
||||
if(GP->showimage){
|
||||
if(!GP->viewer && GP->exptime < 0.00001) ERRX("Need exposition time!");
|
||||
init_grab_sock(sock);
|
||||
viewer(sockcaptured); // start viewer with socket client parser
|
||||
}else
|
||||
@ -256,6 +257,7 @@ static int parsestring(int fd, handleritem *handlers, char *str){
|
||||
return sendstrmessage(fd, hresult2str(r));
|
||||
}
|
||||
}
|
||||
DBG("Command not found!");
|
||||
return sendstrmessage(fd, resmessages[RESULT_BADKEY]);
|
||||
}
|
||||
|
||||
|
||||
4
socket.h
4
socket.h
@ -29,13 +29,13 @@
|
||||
#define MAXCLIENTS (30)
|
||||
|
||||
// wait for mutex locking
|
||||
#define BUSY_TIMEOUT (0.3)
|
||||
#define BUSY_TIMEOUT (0.1)
|
||||
// waiting for answer timeout
|
||||
#define ANSWER_TIMEOUT (1.0)
|
||||
// wait for exposition ends (between subsequent check calls)
|
||||
#define WAIT_TIMEOUT (2.0)
|
||||
// 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;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user