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/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,

View File

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

View File

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

107
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)
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();
}
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);
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;
}
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
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;

View File

@ -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")},

View File

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

View File

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

View File

@ -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 ""

View File

@ -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
View File

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

View File

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

View File

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

View File

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