add custom plugin commands; start developing 'artifical star' plugin to generate 'vagrant stars'

This commit is contained in:
Edward Emelianov 2024-02-07 17:01:58 +03:00
parent 869421d52f
commit 0f4fcf5015
13 changed files with 780 additions and 277 deletions

View File

@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.20)
set(CCDLIB devastar)
SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
find_package(PkgConfig REQUIRED)
pkg_check_modules(${CCDLIB} REQUIRED usefull_macros improc)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SRC)
include_directories(${${CCDLIB}_INCLUDE_DIRS} ..)
link_directories(${${CCDLIB}_LIBRARY_DIRS})
add_library(${CCDLIB} SHARED ${SRC})
target_link_libraries(${CCDLIB} ${${CCDLIB}_LIBRARIES} -fPIC)
install(TARGETS ${CCDLIB} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

View File

@ -0,0 +1,385 @@
/*
* This file is part of the CCD_Capture project.
* Copyright 2022 Edward V. Emelianov <edward.emelianoff@gmail.com>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <fcntl.h>
#include <improclib.h>
#include <limits.h>
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <usefull_macros.h>
#include "ccdcapture.h"
#include "omp.h"
extern cc_Camera camera;
extern cc_Focuser focuser;
extern cc_Wheel wheel;
static const int filtermax = 5;
static const float focmaxpos = 10.;
static int curhbin = 1, curvbin = 1;
static int filterpos = 0;
static float focuserpos = 1., brightness = 1., gain = 0.;
static float camtemp = -30., exptime = 0.;
static cc_capture_status capstat = CAPTURE_NO;
static double texpstart = 0.;
static uint8_t bitpix = 16; // bit depth: 8 or 16
typedef struct{
int width; int height; // size of field where the 'star' can move
int x0; int y0; // center of star field in array coordinates
double fwhm; // stars FWHM, arcsec
double scale; // CCD scale: arcsec/pix
double mag; // star magnitude: 0m is 16384 ADUs per second per arcsec^2
} settings_t;
static settings_t settings = {
.width = 500, .height = 500,
.x0 = 512, .y0 = 512,
.fwhm = 1.5, .scale = 0.03, .mag = 10.
};
// min/max for parameters
static const int wmin = 100, hmin = 100;
static const double fwhmmin = 0.1, fwhmmax = 10., scalemin = 0.001, scalemax = 3600., magmin = -30., magmax = 30.;
static int campoll(cc_capture_status *st, float *remain){
if(capstat != CAPTURE_PROCESS){
if(st) *st = capstat;
if(remain) *remain = 0.;
return TRUE;
}
if(dtime() - texpstart > exptime){
if(st) *st = CAPTURE_READY;
if(remain) *remain = 0.;
capstat = CAPTURE_NO;
return TRUE;
}
if(st) *st = capstat;
if(remain) *remain = exptime + texpstart - dtime();
return TRUE;
}
static int startexp(){
if(capstat == CAPTURE_PROCESS) return FALSE;
capstat = CAPTURE_PROCESS;
texpstart = dtime();
return TRUE;
}
static void gen16(cc_IMG *ima){
static int n = 0;
int y1 = ima->h * curvbin, x1 = ima->w * curhbin;
OMP_FOR()
for(int y = 0; y < y1; y += curvbin){
uint16_t *d = &((uint16_t*)ima->data)[y*ima->w/curvbin];
for(int x = 0; x < x1; x += curhbin){ // sinusoide 100x200
//*d++ = (uint16_t)(((n+x)%100)/99.*65535.);
*d++ = (uint16_t)((1. + sin((n+x) * (2.*M_PI)/11.)*sin((n+y) * (2.*M_PI)/22.))*32767.);
}
}
++n;
}
static void gen8(cc_IMG *ima){
static int n = 0;
int y1 = ima->h * curvbin, x1 = ima->w * curhbin;
OMP_FOR()
for(int y = 0; y < y1; y += curvbin){
uint8_t *d = &((uint8_t*)ima->data)[y*ima->w/curvbin];
for(int x = 0; x < x1; x += curhbin){ // sinusoide 100x200
//*d++ = (uint16_t)(((n+x)%100)/99.*65535.);
*d++ = (uint8_t)((1. + sin((n+x) * (2.*M_PI)/11.)*sin((n+y) * (2.*M_PI)/22.))*127.);
}
}
++n;
}
static int camcapt(cc_IMG *ima){
if(!ima || !ima->data) return FALSE;
#ifdef EBUG
double t0 = dtime();
#endif
ima->bitpix = bitpix;
bzero(ima->data, ima->h*ima->w*cc_getNbytes(ima));
if(bitpix == 16) gen16(ima);
else gen8(ima);
DBG("Time of capture: %g", dtime() - t0);
return TRUE;
}
static int camsetbit(int b){
bitpix = (b) ? 16 : 8;
return TRUE;
}
static int camgetbp(uint8_t *bp){
if(bp) *bp = bitpix;
return TRUE;
}
static void camcancel(){
capstat = CAPTURE_NO;
}
static int setdevno(int n){
if(n) return FALSE;
return TRUE;
}
static int camsetbrig(float b){
brightness = b;
return TRUE;
}
static int camgetbrig(float *b){
if(!b) return FALSE;
*b = brightness;
return TRUE;
}
static int camsetexp(float t){
exptime = t;
return TRUE;
}
static int camsetgain(float g){
gain = g;
return TRUE;
}
static int camgetgain(float *g){
if(g) *g = gain;
return TRUE;
}
static int camsett(float t){
camtemp = t;
return TRUE;
}
static int camgett(float *t){
if(t) *t = camtemp;
return TRUE;
}
static int gett(float *t){
if(t) *t = M_PI;
return TRUE;
}
static int camsetbin(int h, int v){
DBG("set bin %dx%d", h, v);
curhbin = h; curvbin = v;
return TRUE;
}
static int camshutter(_U_ cc_shutter_op s){
return TRUE;
}
static int camsetgeom(cc_frameformat *f){
if(!f) return FALSE;
camera.geometry = *f;
return TRUE;
}
static int camgetnam(char *n, int l){
strncpy(n, "Dummy camera", l);
return TRUE;
}
static int camgmg(float *mg){
if(mg) *mg = 10.;
return TRUE;
}
static int camggl(cc_frameformat *max, cc_frameformat *step){
if(max) *max = camera.array;
if(step) *step = (cc_frameformat){1,1,1,1};
return TRUE;
}
static int camgetbin(int *binh, int *binv){
if(binh) *binh = curhbin;
if(binv) *binv = curvbin;
return TRUE;
}
static int camgetio(int *io){
if(io) *io = 0xDEADBEEF;
return TRUE;
}
static int camfan(_U_ cc_fan_speed spd){return TRUE;}
static int focsetpos(_U_ int a, float n){
if(n < 0. || n > focmaxpos) return FALSE;
focuserpos = n;
return TRUE;
}
static int fochome(_U_ int a){
focuserpos = 0.;
return TRUE;
}
static int focgetnam(char *n, int l){
strncpy(n, "Dummy focuser", l);
return TRUE;
}
static int focpos(float *p){
if(p) *p = focuserpos;
return TRUE;
}
static int focMp(float *p){
if(p) *p = focmaxpos;
return TRUE;
}
static int focmp(float *p){
if(p) *p = 0.;
return TRUE;
}
static int whlsetpos(int n){
if(n >= filtermax || n < 0) return FALSE;
filterpos = n;
return TRUE;
}
static int whlgetpos(int *n){
if(n) *n = filterpos;
return TRUE;
}
static int whlgmp(int *n){
if(n) *n = filtermax;
return TRUE;
}
static int whlgetnam(char *n, int l){
strncpy(n, "Dummy filter wheel", l);
return TRUE;
}
// cmd, help, handler, ptr, min, max, type
static cc_parhandler_t handlers[] = {
{"width", "width of star moving field", NULL, (void*)&settings.width, (void*)&wmin, NULL, CC_PAR_INT},
{"height", "height of star moving field", NULL, (void*)&settings.height, (void*)&hmin, NULL, CC_PAR_INT},
{"xc", "x center of field in array coordinates", NULL, (void*)&settings.x0, NULL, NULL, CC_PAR_INT},
{"yc", "y center of field in array coordinates", NULL, (void*)&settings.y0, NULL, NULL, CC_PAR_INT},
{"fwhm", "star FWHM, arcsec", NULL, (void*)&settings.fwhm, (void*)&fwhmmin, (void*)&fwhmmax, CC_PAR_DOUBLE},
{"scale", "CCD scale: arcsec/pix", NULL, (void*)&settings.scale, (void*)&scalemin, (void*)&scalemax, CC_PAR_DOUBLE},
{"mag", "star magnitude: 0m is 16384 ADUs per second per arcsec^2", NULL, (void*)&settings.mag, (void*)&magmin, (void*)&magmax, CC_PAR_DOUBLE},
//{"", "", NULL, (void*)&, (void*)&, (void*)&settings., CC_PAR_DOUBLE},
CC_PARHANDLER_END
};
static cc_hresult plugincmd(const char *str, cc_charbuff *buf){
return cc_plugin_customcmd(str, handlers, buf);
}
static int stub(){
return TRUE;
}
static void vstub(){
FNAME();
return;
}
static int istub(_U_ int N){return TRUE;}
/*
* Global objects: camera, focuser and wheel
*/
__attribute__ ((visibility("default"))) cc_Camera camera = {
.check = stub,
.Ndevices = 1,
.close = vstub,
.pollcapture = campoll,
.capture = camcapt,
.cancel = camcancel,
.startexposition = startexp,
.plugincmd = plugincmd,
// setters:
.setDevNo = setdevno,
.setbrightness = camsetbrig,
.setexp = camsetexp,
.setgain = camsetgain,
.setT = camsett,
.setbin = camsetbin,
.setnflushes = istub,
.shuttercmd = camshutter,
.confio = istub,
.setio = istub,
.setframetype = istub,
.setbitdepth = camsetbit,
.setfastspeed = istub,
.setgeometry = camsetgeom,
.setfanspeed = camfan,
// getters:
.getbitpix = camgetbp,
.getbrightness = camgetbrig,
.getModelName = camgetnam,
.getgain = camgetgain,
.getmaxgain = camgmg,
.getgeomlimits = camggl,
.getTcold = camgett,
.getThot = camgett,
.getTbody = gett,
.getbin = camgetbin,
.getio = camgetio,
.pixX = 10.,
.pixY = 10.,
.field = (cc_frameformat){.h = 1024, .w = 1024, .xoff = 10, .yoff = 10},
.array = (cc_frameformat){.h = 1050, .w = 1050, .xoff = 0, .yoff = 0},
.geometry = {0},
};
__attribute__ ((visibility("default"))) cc_Focuser focuser = {
.check = stub,
.Ndevices = 1,
.close = vstub,
// setters:
.setDevNo = setdevno,
.setAbsPos = focsetpos,
.home = fochome,
// getters:
.getModelName = focgetnam,
.getTbody = gett,
.getPos = focpos,
.getMaxPos = focMp,
.getMinPos = focmp,
};
__attribute__ ((visibility("default"))) cc_Wheel wheel = {
.check = stub,
.Ndevices = 1,
.close = vstub,
// setters
.setDevNo = setdevno,
.setPos = whlsetpos,
// getters
.getModelName = whlgetnam,
.getTbody = gett,
.getPos = whlgetpos,
.getMaxPos = whlgmp,
};

View File

@ -15,7 +15,8 @@ message("VER: ${VERSION}")
# list of options
option(DEBUG "Compile in debug mode" OFF)
option(IMAGEVIEW "Build with imageview module" OFF)
option(DUMMY "Dummy camera plugin" ON)
option(IMAGEVIEW "Build with imageview module" ON)
option(ZWO "Add support of ZWO cameras" OFF)
option(FLI "Add support of FLI cameras" OFF)
option(BASLER "Add support of BASLER cameras" OFF)
@ -23,6 +24,7 @@ option(HIKROBOT "Add support of HIKROBOT cameras" OFF)
option(FLYCAP "Add support of Grasshopper FlyCap cameras" OFF)
option(APOGEE "Add support of Apogee cameras" OFF)
option(EXAMPLES "Some examples" OFF)
option(ASTAR "Artifical star plugin" OFF)
# default flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W -Wextra -fno-builtin-strlen")
@ -75,6 +77,7 @@ if(OPENMP_FOUND)
add_definitions(-DOMP_FOUND)
endif()
# view image in OpenGL window
if(IMAGEVIEW)
list(APPEND SOURCES events.c imageview.c)
find_package(OpenGL REQUIRED)
@ -84,9 +87,13 @@ if(IMAGEVIEW)
list(APPEND ${PROJ}_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
add_definitions(-DIMAGEVIEW)
endif()
add_subdirectory(Dummy_cameras)
# Dummy and artifical star plugins
if(DUMMY)
add_subdirectory(Dummy_cameras)
endif()
if(ASTAR)
add_subdirectory(Astar_cameras)
endif()
# additional modules with CCD/CMOS support
if(ZWO)
add_subdirectory(ZWO_cameras)

View File

@ -43,6 +43,7 @@ static double texpstart = 0.;
static uint8_t bitpix = 16; // bit depth: 8 or 16
// sinusoide periods
static double sinPx = 100., sinPy = 200.;
static const double sinmin = 1.;
static int campoll(cc_capture_status *st, float *remain){
if(capstat != CAPTURE_PROCESS){
@ -256,35 +257,27 @@ static int whlgetnam(char *n, int l){
return TRUE;
}
static const char* const helpmsg =
"Dummy camera custom plugin commands:\n"
"\tpx - set/get sin period over X axis (pix)\n"
"\tpy - -//- over Y axis\n"
;
static const char* const pmust = "Period must be not less than 1";
static const char *plugincmd(const char *str){
static char ans[BUFSIZ+1];
snprintf(ans, BUFSIZ, "%s", str);
char *val = cc_get_keyval(ans);
if(val){ // setters
if(0 == strcmp("px", ans)){
double f = atof(val);
if(f < 1.) return pmust;
sinPx = f;
}else if(0 == strcmp("py", ans)){
double f = atof(val);
if(f < 1.) return pmust;
sinPy = f;
}
} // getters/return
if(0 == strcmp("px", ans)){
snprintf(ans, BUFSIZ, "px=%g", sinPx);
return (const char*) ans;
}else if(0 == strcmp("py", ans)){
snprintf(ans, BUFSIZ, "yx=%g", sinPy);
return (const char*) ans;
}
return helpmsg;
/*
static int checker(const char *str, cc_charbuff *ans){
char *eq = strchr(str, '=');
if(eq){
float x = (float)atof(eq+1);
if(x < 1.){if(ans) cc_charbufaddline(ans, "Value must be >= 1.");}
else return TRUE;
}else return TRUE; // getter
return FALSE;
}*/
// cmd, help, handler, ptr, type
static cc_parhandler_t handlers[] = {
{"px", "set/get sin period over X axis (pix)", NULL, (void*)&sinPx, (void*)&sinmin, NULL, CC_PAR_DOUBLE},
{"py", "set/get sin period over Y axis (pix)", NULL, (void*)&sinPy, (void*)&sinmin, NULL, CC_PAR_DOUBLE},
CC_PARHANDLER_END
};
static cc_hresult plugincmd(const char *str, cc_charbuff *buf){
return cc_plugin_customcmd(str, handlers, buf);
}
static int stub(){

View File

@ -189,8 +189,6 @@ static const char *resmessages[RESULT_NUM] = {
[RESULT_FAIL] = "FAIL",
[RESULT_BADVAL] = "BADVAL",
[RESULT_BADKEY] = "BADKEY",
// [RESULT_SILENCE] = NULL, // nothing to send
// [RESULT_DISCONNECTED] = NULL, // not to send
};
const char *cc_hresult2str(cc_hresult r){
@ -732,3 +730,123 @@ int cc_charbuf2kw(cc_charbuff *b, fitsfile *f){
}
return TRUE;
}
static size_t print_val(cc_partype_t t, void *val, char *buf, size_t bufl){
size_t l = 0;
switch(t){
case CC_PAR_INT:
l = snprintf(buf, bufl, "%d", *(int*)val);
break;
case CC_PAR_FLOAT:
l = snprintf(buf, bufl, "%g", *(float*)val);
break;
case CC_PAR_DOUBLE:
l = snprintf(buf, bufl, "%g", *(double*)val);
break;
default:
l = snprintf(buf, bufl, "hoojnya");
break;
}
return l;
}
/**
* @brief cc_plugin_customcmd - common handler for custom plugin commands
* @param str - string like "par" (getter/cmd) or "par=val" (setter)
* @param handlers - NULL-terminated array of handlers for custom commands
* @param ans - buffer for output string
* @return RESULT_OK if all OK or error code
*/
cc_hresult cc_plugin_customcmd(const char *str, cc_parhandler_t *handlers, cc_charbuff *ans){
if(!str || !handlers) return RESULT_FAIL;
char key[256];
snprintf(key, 255, "%s", str);
char *val = cc_get_keyval(key);
cc_parhandler_t *phptr = handlers;
cc_hresult result = RESULT_BADKEY;
char buf[512];
#define ADDL(...) do{if(ans){size_t l = snprintf(bptr, L, __VA_ARGS__); bptr += l; L -= l;}}while(0)
#define PRINTVAL(v) do{if(ans){size_t l = print_val(phptr->type, phptr->v, bptr, L); bptr += l; L -= l;}}while(0)
while(phptr->cmd){
if(0 == strcmp(key, phptr->cmd)){
char *bptr = buf; size_t L = 511;
result = RESULT_OK;
if(phptr->checker) result = phptr->checker(str, ans);
if(phptr->ptr){ // setter/getter
if(val){if(result == RESULT_OK){// setter: change value only if [handler] returns OK (`handler` could be value checker)
int ival; float fval; double dval;
#define UPDATE_VAL(type, val, pr) do{ \
if(phptr->max && val > *(type*)phptr->max){ADDL("max=" pr, *(type*)phptr->max); result = RESULT_BADVAL;} \
if(phptr->min && val < *(type*)phptr->min){ADDL("min=" pr, *(type*)phptr->min); result = RESULT_BADVAL;} \
if(result == RESULT_OK) *(type*)phptr->ptr = val; \
}while(0)
switch(phptr->type){
case CC_PAR_INT:
ival = atoi(val);
UPDATE_VAL(int, ival, "%d");
break;
case CC_PAR_FLOAT:
fval = (float)atof(val);
UPDATE_VAL(float, fval, "%g");
break;
case CC_PAR_DOUBLE:
dval = atof(val);
UPDATE_VAL(double, dval, "%g");
break;
default:
result = RESULT_FAIL;
}
#undef UPDATE_VAL
}}else result = RESULT_SILENCE; // getter - don't show "OK"
DBG("res=%d", result);
if(result == RESULT_SILENCE || result == RESULT_OK){
ADDL("%s=", phptr->cmd);
PRINTVAL(ptr);
}
if(ans) cc_charbufaddline(ans, buf);
}
break;
}
++phptr;
}
if(ans && result == RESULT_BADKEY){ // cmd not found - display full help
cc_charbufaddline(ans, "Custom plugin commands:\n");
phptr = handlers;
while(phptr->cmd){
char *bptr = buf; size_t L = 511;
ADDL("\t%s", phptr->cmd);
if(phptr->ptr){
ADDL(" = (");
switch(phptr->type){
case CC_PAR_INT:
ADDL("int");
break;
case CC_PAR_FLOAT:
ADDL("float");
break;
case CC_PAR_DOUBLE:
ADDL("double");
break;
default:
ADDL("undefined");
}
ADDL(")");
if(phptr->min || phptr->max){
ADDL(" [");
if(phptr->min) PRINTVAL(min);
else ADDL("-inf");
ADDL(", ");
if(phptr->max) PRINTVAL(max);
else ADDL("inf");
ADDL("]");
}
}
ADDL(" - ");
ADDL("%s\n", phptr->helpstring);
cc_charbufaddline(ans, buf);
++phptr;
}
}
#undef ADDL
return result;
}

View File

@ -41,6 +41,26 @@ typedef struct __attribute__((packed, aligned(4))){
/* `data` is uint8_t or uint16_t depending on `bitpix` */
} cc_IMG;
typedef struct{
char* buf; // databuffer
size_t bufsize; // size of `buf`
size_t buflen; // current buffer length
char *string; // last \n-ended string from `buf`
size_t strlen; // max length of `string`
pthread_mutex_t mutex; // mutex for atomic data access
} cc_strbuff;
typedef struct{
char* buf; // databuffer
size_t bufsize; // size of `buf`
size_t buflen; // current buffer length
pthread_mutex_t mutex; // mutex for atomic data access
} cc_charbuff;
#define cc_buff_lock(b) pthread_mutex_lock(&((b)->mutex))
#define cc_buff_trylock(b) pthread_mutex_trylock(&((b)->mutex))
#define cc_buff_unlock(b) pthread_mutex_unlock(&((b)->mutex))
// format of single frame
typedef struct{
int w; int h; // width & height
@ -70,6 +90,17 @@ typedef enum{
FAN_HIGH,
} cc_fan_speed;
typedef enum{
RESULT_OK, // 0: all OK
RESULT_BUSY, // 1: camera busy and no setters can be done
RESULT_FAIL, // 2: failed running command
RESULT_BADVAL, // 3: bad key's value
RESULT_BADKEY, // 4: bad key
RESULT_SILENCE, // 5: send nothing to client
RESULT_DISCONNECTED,// 6: client disconnected
RESULT_NUM
} cc_hresult;
// all setters and getters of Camera, Focuser and cc_Wheel should return TRUE if success or FALSE if failed or unsupported
// camera
typedef struct{
@ -110,10 +141,10 @@ typedef struct{
int (*getTbody)(float *t); // body T
int (*getbin)(int *binh, int *binv);
int (*getio)(int *s); // get IO-port state
const char* (*plugincmd)(const char *str); // custom camera plugin command (get string as input, send string as output or NULL if failed)
cc_hresult (*plugincmd)(const char *str, cc_charbuff *ans); // custom camera plugin command (get string as input, send string as output or NULL if failed)
float pixX, pixY; // pixel size in um
cc_frameformat field; // max field of view
cc_frameformat array; // array format
cc_frameformat field; // max field of view (full CCD field without overscans)
cc_frameformat array; // array format (with overscans)
cc_frameformat geometry; // current geometry settings (as in setgeometry)
} cc_Camera;
@ -165,17 +196,6 @@ typedef struct{
// client will disconnect after this time from last server message
#define CC_CLIENT_TIMEOUT (3.0)
typedef enum{
RESULT_OK, // 0: all OK
RESULT_BUSY, // 1: camera busy and no setters can be done
RESULT_FAIL, // 2: failed running command
RESULT_BADVAL, // 3: bad key's value
RESULT_BADKEY, // 4: bad key
RESULT_SILENCE, // 5: send nothing to client
RESULT_DISCONNECTED,// 6: client disconnected
RESULT_NUM
} cc_hresult;
// fd - socket fd to send private messages, key, val - key and its value
typedef cc_hresult (*cc_mesghandler)(int fd, const char *key, const char *val);
@ -254,25 +274,26 @@ typedef enum{
#define CC_CMD_WDEVNO "wdevno"
#define CC_CMD_WPOS "wpos"
typedef struct{
char* buf; // databuffer
size_t bufsize; // size of `buf`
size_t buflen; // current buffer length
char *string; // last \n-ended string from `buf`
size_t strlen; // max length of `string`
pthread_mutex_t mutex; // mutex for atomic data access
} cc_strbuff;
typedef enum{ // parameter type
CC_PAR_INT,
CC_PAR_FLOAT,
CC_PAR_DOUBLE,
} cc_partype_t;
typedef struct{
char* buf; // databuffer
size_t bufsize; // size of `buf`
size_t buflen; // current buffer length
pthread_mutex_t mutex; // mutex for atomic data access
} cc_charbuff;
typedef struct{ // custom plugin parameters
const char *cmd; // text parameter/command
const char *helpstring; // help string for this parameter
cc_hresult (*checker)(const char *str, cc_charbuff *ans); // value checker or custom handler (if don't satisfy common getter/setter); return possible answer in `ans`
void *ptr; // pointer to variable (if exists)
void *min; // min/max values of `ptr` (or NULL if don't need to check)
void *max;
cc_partype_t type; // argument type
} cc_parhandler_t;
#define cc_buff_lock(b) pthread_mutex_lock(&b->mutex)
#define cc_buff_trylock(b) pthread_mutex_trylock(&b->mutex)
#define cc_buff_unlock(b) pthread_mutex_unlock(&b->mutex)
// this record should be last in cc_parhandler_t array for `cc_plugin_customcmd`
#define CC_PARHANDLER_END {0}
cc_hresult cc_plugin_customcmd(const char *str, cc_parhandler_t *handlers, cc_charbuff *ans);
cc_Focuser *open_focuser(const char *pluginname);
cc_Camera *open_camera(const char *pluginname);

View File

@ -217,7 +217,6 @@ int saveFITS(cc_IMG *img, char **outp){
}
}else{ // user pointed output file prefix
if(!check_filenameprefix(fnam, PATH_MAX)){
// îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ
WARNX(_("Can't save file with prefix %s"), GP->outfileprefix);
LOGERR("Can't save image with prefix %s", GP->outfileprefix);
}
@ -453,7 +452,7 @@ retn:
cc_Wheel *startWheel(){
if(!GP->wheeldev && !GP->commondev){
verbose(3, _("cc_Wheel device not pointed"));
verbose(3, _("Wheel device not pointed"));
return NULL;
}else{
char *plugin = GP->commondev ? GP->commondev : GP->wheeldev;
@ -518,7 +517,7 @@ void wheels(){
pos = GP->setwheel;
if(pos == -1) goto retn; // no wheel commands
if(pos < 0 || pos > maxpos){
WARNX(_("cc_Wheel position should be from 0 to %d"), maxpos);
WARNX(_("Wheel position should be from 0 to %d"), maxpos);
goto retn;
}
if(!wheel->setPos(pos))
@ -605,11 +604,19 @@ int prepare_ccds(){
if(!camera->plugincmd) WARNX(_("Camera plugin have no custom commands"));
else{
char **p = GP->plugincmd;
cc_charbuff *b = cc_charbufnew();
DBG("got %s", *p);
while(p && *p){
printf("Command: %s\nAnswer: %s\n", *p, camera->plugincmd(*p));
cc_charbufclr(b);
cc_hresult r = camera->plugincmd(*p, b);
if(r == RESULT_OK || r == RESULT_SILENCE) green("Command '%s'", *p);
else red("Command '%s'", *p);
if(r != RESULT_SILENCE) printf(" returns \"%s\"", cc_hresult2str(r));
if(b->buflen) printf("\n%s", b->buf);
else printf("\n");
++p;
}
cc_charbufdel(&b);
}
}
if(GP->fanspeed > -1){
@ -650,7 +657,6 @@ int prepare_ccds(){
WARNX(_("Can't run shutter command %s (unsupported?)"), str[GP->shtr_cmd]);
}
if(GP->confio > -1){
// "ðÏÐÙÔËÁ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ ÐÏÒÔ I/O ËÁË %d\n"
verbose(1, _("Try to configure I/O port as %d"), GP->confio);
if(!camera->confio(GP->confio))
WARNX(_("Can't configure (unsupported?)"));
@ -663,7 +669,6 @@ int prepare_ccds(){
WARNX(_("Can't get IOport state (unsupported?)"));
}
if(GP->setio > -1){
// "ðÏÐÙÔËÁ ÚÁÐÉÓÉ %d × ÐÏÒÔ I/O\n"
verbose(1, _("Try to write %d to I/O port"), GP->setio);
if(!camera->setio(GP->setio))
WARNX(_("Can't set IOport"));
@ -717,7 +722,8 @@ int prepare_ccds(){
WARNX(_("Can't set readout speed"));
else verbose(1, _("Readout mode: %s"), GP->fast ? "fast" : "normal");
if(!GP->outfile) verbose(1, _("Only show statistics"));
if(!camera->getbin(&GP->hbin, &GP->vbin)) // GET binning should be AFTER setgeometry!
// GET binning should be AFTER setgeometry!
if(!camera->getbin(&GP->hbin, &GP->vbin))
WARNX(_("Can't get current binning"));
verbose(2, "Binning: %d x %d", GP->hbin, GP->vbin);
rtn = TRUE;
@ -742,7 +748,6 @@ DBG("w=%d, h=%d", raw_width, raw_height);
for(int j = 0; j < GP->nframes; ++j){
TIMESTAMP("Start next cycle");
TIMEINIT();
// úÁÈ×ÁÔ ËÁÄÒÁ %d\n
verbose(1, _("Capture frame %d"), j);
if(!camera->startexposition()){
WARNX(_("Can't start exposition"));
@ -769,7 +774,6 @@ DBG("w=%d, h=%d", raw_width, raw_height);
if(GP->pause_len && j != (GP->nframes - 1)){
double delta, time1 = dtime() + GP->pause_len;
while((delta = time1 - dtime()) > 0.){
// %d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n
verbose(1, _("%d seconds till pause ends\n"), (int)delta);
float tmpf;
if(camera->getTcold(&tmpf)) verbose(1, "CCDTEMP=%.1f\n", tmpf);

View File

@ -267,7 +267,6 @@ void client(int sock){
while(1){
SENDCMDW(CC_CMD_CAMTEMPER);
if((delta = time1 - dtime()) < __FLT_EPSILON__) break;
// %d секунд до окончания паузы\n
if(delta > 1.) verbose(1, _("%d seconds till pause ends\n"), (int)delta);
if(delta > 6.) sleep(5);
else if(delta > 1.) sleep((int)delta);

View File

@ -111,7 +111,7 @@ myoption cmdlnopts[] = {
{"restart", NO_ARGS, &G.restart,1, arg_none, NULL, N_("restart image server")},
{"shmkey", NEED_ARG, NULL, 'k', arg_int, APTR(&G.shmkey), N_("shared memory (with image data) key (default: 7777777)")},
{"forceimsock",NO_ARGS, &G.forceimsock,1, arg_none, NULL, N_("force using image through socket transition even if can use SHM)")},
{"forceimsock",NO_ARGS, &G.forceimsock,1, arg_none, NULL, N_("force using image through socket transition even if can use SHM")},
{"infty", NEED_ARG, NULL, NA, arg_int, APTR(&G.infty), N_("start (!=0) or stop(==0) infinity capturing loop")},
#ifdef IMAGEVIEW

Binary file not shown.

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-01 14:36+0300\n"
"POT-Creation-Date: 2024-02-07 17:00+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"
@ -254,7 +254,7 @@ msgid "shared memory (with image data) key (default: 7777777)"
msgstr ""
#: cmdlnopts.c:114
msgid "force using image through socket transition even if can use SHM)"
msgid "force using image through socket transition even if can use SHM"
msgstr ""
#: cmdlnopts.c:115
@ -269,289 +269,283 @@ msgstr ""
msgid "Camera device unknown"
msgstr ""
#. Не могу сохранить файл
#: ccdfunc.c:221
#: ccdfunc.c:220
#, c-format
msgid "Can't save file with prefix %s"
msgstr ""
#: ccdfunc.c:269
#: ccdfunc.c:268
#, c-format
msgid "File saved as '%s'"
msgstr ""
#: ccdfunc.c:278
#: ccdfunc.c:277
msgid "Error saving file"
msgstr ""
#: ccdfunc.c:356
#: ccdfunc.c:355
#, c-format
msgid "Image stat:\n"
msgstr ""
#: ccdfunc.c:365
#: ccdfunc.c:364
msgid "Focuser device not pointed"
msgstr ""
#: ccdfunc.c:372
#: ccdfunc.c:371
msgid "No focusers found"
msgstr ""
#: ccdfunc.c:403
#: ccdfunc.c:402
#, c-format
msgid "Found %d focusers, you point number %d"
msgstr ""
#: ccdfunc.c:407
#: ccdfunc.c:406
msgid "Can't set active focuser number"
msgstr ""
#: ccdfunc.c:421
#: ccdfunc.c:420
msgid "Can't get focuser limit positions"
msgstr ""
#: ccdfunc.c:428
#: ccdfunc.c:427
msgid "Can't get current focuser position"
msgstr ""
#: ccdfunc.c:442
#: ccdfunc.c:441
#, c-format
msgid "Can't set position %g: out of limits [%g, %g]"
msgstr ""
#: ccdfunc.c:446
#: ccdfunc.c:445
msgid "Can't home focuser"
msgstr ""
#: ccdfunc.c:448
#: ccdfunc.c:447
#, c-format
msgid "Can't set position %g"
msgstr ""
#: ccdfunc.c:456
msgid "cc_Wheel device not pointed"
#: ccdfunc.c:455
msgid "Wheel device not pointed"
msgstr ""
#: ccdfunc.c:463
#: ccdfunc.c:462
msgid "No wheels found"
msgstr ""
#: ccdfunc.c:494
#: ccdfunc.c:493
#, c-format
msgid "Found %d wheels, you point number %d"
msgstr ""
#: ccdfunc.c:498
#: ccdfunc.c:497
msgid "Can't set active wheel number"
msgstr ""
#: ccdfunc.c:514
#: ccdfunc.c:513
msgid "Can't get max wheel position"
msgstr ""
#: ccdfunc.c:521
#: ccdfunc.c:520
#, c-format
msgid "cc_Wheel position should be from 0 to %d"
msgid "Wheel position should be from 0 to %d"
msgstr ""
#: ccdfunc.c:525
#: ccdfunc.c:524
#, c-format
msgid "Can't set wheel position %d"
msgstr ""
#: ccdfunc.c:542
#: ccdfunc.c:541
#, c-format
msgid "%.1f seconds till exposition ends"
msgstr ""
#: ccdfunc.c:557
#: ccdfunc.c:556
msgid "Camera device not pointed"
msgstr ""
#: ccdfunc.c:564 ccdfunc.c:565
#: ccdfunc.c:563 ccdfunc.c:564
msgid "No cameras found"
msgstr ""
#: ccdfunc.c:595
#: ccdfunc.c:594
#, c-format
msgid "Found %d cameras, you point number %d"
msgstr ""
#: ccdfunc.c:599
#: ccdfunc.c:598
msgid "Can't set active camera number"
msgstr ""
#: ccdfunc.c:605
#: ccdfunc.c:604
msgid "Camera plugin have no custom commands"
msgstr ""
#: ccdfunc.c:618
#: ccdfunc.c:625
msgid "Can't set fan speed"
msgstr ""
#: ccdfunc.c:619
#: ccdfunc.c:626
#, c-format
msgid "Set fan speed to %d"
msgstr ""
#: ccdfunc.c:624
#: ccdfunc.c:631
#, c-format
msgid "Camera model: %s"
msgstr ""
#: ccdfunc.c:625
#: ccdfunc.c:632
#, c-format
msgid "Pixel size: %g x %g"
msgstr ""
#: ccdfunc.c:631
#: ccdfunc.c:638
#, c-format
msgid "Full array: %s"
msgstr ""
#: ccdfunc.c:634
#: ccdfunc.c:641
#, c-format
msgid "Field of view: %s"
msgstr ""
#: ccdfunc.c:637
#: ccdfunc.c:644
#, c-format
msgid "Current format: %s"
msgstr ""
#: ccdfunc.c:640
#: ccdfunc.c:647
#, c-format
msgid "Can't set T to %g degC"
msgstr ""
#: ccdfunc.c:648
#: ccdfunc.c:655
#, c-format
msgid "Shutter command: %s\n"
msgstr ""
#: ccdfunc.c:650
#: ccdfunc.c:657
#, c-format
msgid "Can't run shutter command %s (unsupported?)"
msgstr ""
#. "Попытка сконфигурировать порт I/O как %d\n"
#: ccdfunc.c:654
#: ccdfunc.c:660
#, c-format
msgid "Try to configure I/O port as %d"
msgstr ""
#: ccdfunc.c:656
#: ccdfunc.c:662
msgid "Can't configure (unsupported?)"
msgstr ""
#: ccdfunc.c:663
#: ccdfunc.c:669
msgid "Can't get IOport state (unsupported?)"
msgstr ""
#. "Попытка записи %d в порт I/O\n"
#: ccdfunc.c:667
#: ccdfunc.c:672
#, c-format
msgid "Try to write %d to I/O port"
msgstr ""
#: ccdfunc.c:669
#: ccdfunc.c:674
msgid "Can't set IOport"
msgstr ""
#: ccdfunc.c:676
#: ccdfunc.c:681
#, c-format
msgid "Set gain to %g"
msgstr ""
#: ccdfunc.c:677
#: ccdfunc.c:682
#, c-format
msgid "Can't set gain to %g"
msgstr ""
#: ccdfunc.c:682
#: ccdfunc.c:687
#, c-format
msgid "Set brightness to %g"
msgstr ""
#: ccdfunc.c:683
#: ccdfunc.c:688
#, c-format
msgid "Can't set brightness to %g"
msgstr ""
#: ccdfunc.c:689 server.c:265
#: ccdfunc.c:694 server.c:265
#, c-format
msgid "Can't set binning %dx%d"
msgstr ""
#: ccdfunc.c:701 server.c:266
#: ccdfunc.c:706 server.c:266
msgid "Can't set given geometry"
msgstr ""
#: ccdfunc.c:705
#: ccdfunc.c:710
#, c-format
msgid "Can't set %d flushes"
msgstr ""
#: ccdfunc.c:709
#: ccdfunc.c:714
#, c-format
msgid "Can't set exposure time to %f seconds"
msgstr ""
#: ccdfunc.c:712
#: ccdfunc.c:717
msgid "Can't change frame type"
msgstr ""
#: ccdfunc.c:715
#: ccdfunc.c:720
msgid "Can't set bit depth"
msgstr ""
#: ccdfunc.c:717
#: ccdfunc.c:722
msgid "Can't set readout speed"
msgstr ""
#: ccdfunc.c:718
#: ccdfunc.c:723
#, c-format
msgid "Readout mode: %s"
msgstr ""
#: ccdfunc.c:719
#: ccdfunc.c:724
msgid "Only show statistics"
msgstr ""
#. GET binning should be AFTER setgeometry!
#: ccdfunc.c:721
#: ccdfunc.c:727
msgid "Can't get current binning"
msgstr ""
#. Захват кадра %d\n
#: ccdfunc.c:746
#: ccdfunc.c:751
#, c-format
msgid "Capture frame %d"
msgstr ""
#: ccdfunc.c:748 ccdfunc.c:823 server.c:150
#: ccdfunc.c:753 ccdfunc.c:827 server.c:150
msgid "Can't start exposition"
msgstr ""
#: ccdfunc.c:753
#: ccdfunc.c:758
msgid "Can't capture image"
msgstr ""
#: ccdfunc.c:756
#: ccdfunc.c:761
msgid "Read grabbed image"
msgstr ""
#: ccdfunc.c:760 ccdfunc.c:836
#: ccdfunc.c:765 ccdfunc.c:840
msgid "Can't grab image"
msgstr ""
#. %d секунд до окончания паузы\n
#: ccdfunc.c:773 client.c:271
#: ccdfunc.c:777 client.c:270
#, c-format
msgid "%d seconds till pause ends\n"
msgstr ""
#: ccdfunc.c:834
#: ccdfunc.c:838
msgid "Some error when capture"
msgstr ""
@ -563,7 +557,7 @@ msgstr ""
msgid "Can't make exposition"
msgstr ""
#: client.c:287
#: client.c:286
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: 2024-02-01 14:35+0300\n"
"POT-Creation-Date: 2024-02-07 17:00+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"
@ -16,13 +16,12 @@ msgstr "Project-Id-Version: PACKAGE VERSION\n"
"Content-Type: text/plain; charset=koi8-r\n"
"Content-Transfer-Encoding: 8bit\n"
#: ccdfunc.c:542
#: ccdfunc.c:541
#, c-format
msgid "%.1f seconds till exposition ends"
msgstr "%.1f ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÜËÓÐÏÚÉÃÉÉ"
#. %d Ñ<>екунд до окончаниÑ<C2B8> паузы\n
#: ccdfunc.c:773 client.c:271
#: ccdfunc.c:777 client.c:270
#, c-format
msgid "%d seconds till pause ends\n"
msgstr "%d ÓÅËÕÎÄ ÄÏ ÏËÏÎÞÁÎÉÑ ÐÁÕÚÙ\n"
@ -39,7 +38,7 @@ msgstr "
msgid "CMOS gain level"
msgstr "ÕÒÏ×ÅÎØ Gain CMOS"
#: ccdfunc.c:557
#: ccdfunc.c:556
msgid "Camera device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÐÏÄËÌÀÞÅÎÏ"
@ -47,53 +46,52 @@ msgstr "
msgid "Camera device unknown"
msgstr "õÓÔÒÏÊÓÔ×Ï Ó×ÅÏÐÒÉÅÍÎÉËÁ ÎÅ ÏÐÏÚÎÁÎÏ"
#: ccdfunc.c:624
#: ccdfunc.c:631
#, c-format
msgid "Camera model: %s"
msgstr "íÏÄÅÌØ Ó×ÅÔÏÐÒÉÅÍÎÉËÁ: %s"
#: ccdfunc.c:605
#: ccdfunc.c:604
msgid "Camera plugin have no custom commands"
msgstr ""
msgstr "У плагина камеры нет особых команд"
#: ccdfunc.c:753
#: ccdfunc.c:758
msgid "Can't capture image"
msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ"
#: ccdfunc.c:712
#: ccdfunc.c:717
msgid "Can't change frame type"
msgstr "îÅ ÍÏÇÕ ÉÚÍÅÎÉÔØ ÔÉÐ ËÁÄÒÁ"
#: ccdfunc.c:656
#: ccdfunc.c:662
msgid "Can't configure (unsupported?)"
msgstr "îÅ ÍÏÇÕ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ (ÏÐÃÉÑ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)"
#: ccdfunc.c:663
#: ccdfunc.c:669
msgid "Can't get IOport state (unsupported?)"
msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÓÏÓÔÏÑÎÉÅ ÐÏÒÔÁ I/O (ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)"
#. GET binning should be AFTER setgeometry!
#: ccdfunc.c:721
#: ccdfunc.c:727
msgid "Can't get current binning"
msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÔÅËÕÝÅÅ ÚÎÁÞÅÎÉÅ ÂÉÎÎÉÎÇÁ"
#: ccdfunc.c:428
#: ccdfunc.c:427
msgid "Can't get current focuser position"
msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÔÅËÕÝÕÀ ÐÏÚÉÃÉÀ ÆÏËÕÓÅÒÁ"
#: ccdfunc.c:421
#: ccdfunc.c:420
msgid "Can't get focuser limit positions"
msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ÆÏËÕÓÅÒÁ"
#: ccdfunc.c:514
#: ccdfunc.c:513
msgid "Can't get max wheel position"
msgstr "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÐÒÅÄÅÌØÎÕÀ ÐÏÚÉÃÉÀ ËÏÌÅÓÁ"
#: ccdfunc.c:760 ccdfunc.c:836
#: ccdfunc.c:765 ccdfunc.c:840
msgid "Can't grab image"
msgstr "îÅ ÍÏÇÕ ÚÁÈ×ÁÔÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ"
#: ccdfunc.c:446
#: ccdfunc.c:445
msgid "Can't home focuser"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÆÏËÕÓÅÒ × ÎÕÌØ"
@ -109,152 +107,150 @@ msgstr "
msgid "Can't open OpenGL window, image preview will be inaccessible"
msgstr "îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÏËÎÏ OpenGL, ÏÔÏÂÒÁÖÅÎÉÅ ÂÕÄÅÔ ÎÅÄÏÓÔÕÐÎÏ"
#: ccdfunc.c:650
#: ccdfunc.c:657
#, c-format
msgid "Can't run shutter command %s (unsupported?)"
msgstr "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ËÏÍÁÎÄÕ ÚÁÔ×ÏÒÁ %s (ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ?)"
#. Ð<>е могу Ñ<>охраниÑÑŒ файл
#: ccdfunc.c:221
#: ccdfunc.c:220
#, c-format
msgid "Can't save file with prefix %s"
msgstr "îÅ ÍÏÇÕ ÓÏÈÒÁÎÉÔØ ÆÁÊÌ Ó ÐÒÅÆÉËÓÏÍ %s"
#: ccdfunc.c:705
#: ccdfunc.c:710
#, c-format
msgid "Can't set %d flushes"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ %d ÓÂÒÏÓÏ×"
#: ccdfunc.c:669
#: ccdfunc.c:674
msgid "Can't set IOport"
msgstr "îÅ ÍÏÇÕ ÐÏÍÅÎÑÔØ ÚÎÁÞÅÎÉÑ ÐÏÒÔÁ I/O"
#: ccdfunc.c:640
#: ccdfunc.c:647
#, c-format
msgid "Can't set T to %g degC"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÔÅÍÐÅÒÁÔÕÒÕ × %g ÇÒÁÄã"
#: ccdfunc.c:599
#: ccdfunc.c:598
msgid "Can't set active camera number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÊ ËÁÍÅÒÙ"
#: ccdfunc.c:407
#: ccdfunc.c:406
msgid "Can't set active focuser number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ÆÏËÕÓÅÒÁ"
#: ccdfunc.c:498
#: ccdfunc.c:497
msgid "Can't set active wheel number"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÏÍÅÒ ÁËÔÉ×ÎÏÇÏ ËÏÌÅÓÁ"
#: ccdfunc.c:689 server.c:265
#: ccdfunc.c:694 server.c:265
#, c-format
msgid "Can't set binning %dx%d"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÂÉÎÎÉÎÇ %dx%d"
#: ccdfunc.c:715
#: ccdfunc.c:720
msgid "Can't set bit depth"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÒÁÚÒÑÄÎÏÓÔØ áãð"
#: ccdfunc.c:683
#: ccdfunc.c:688
#, c-format
msgid "Can't set brightness to %g"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g"
#: ccdfunc.c:709
#: ccdfunc.c:714
#, c-format
msgid "Can't set exposure time to %f seconds"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÜËÓÐÏÚÉÃÉÀ × %f ÓÅËÕÎÄ"
#: ccdfunc.c:618
#: ccdfunc.c:625
msgid "Can't set fan speed"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ×"
#: ccdfunc.c:677
#: ccdfunc.c:682
#, c-format
msgid "Can't set gain to %g"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ Gain × %g"
#: ccdfunc.c:701 server.c:266
#: ccdfunc.c:706 server.c:266
msgid "Can't set given geometry"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÇÅÏÍÅÔÒÉÀ"
#: ccdfunc.c:448
#: ccdfunc.c:447
#, c-format
msgid "Can't set position %g"
msgstr "îÅ ÍÏÇÕ ÉÚÍÅÎÉÔØ ÐÏÚÉÃÉÀ ÎÁ %g"
#: ccdfunc.c:442
#: ccdfunc.c:441
#, c-format
msgid "Can't set position %g: out of limits [%g, %g]"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÐÏÚÉÃÉÀ %g: ×ÎÅ ÐÒÅÄÅÌÏ× [%g, %g]"
#: ccdfunc.c:717
#: ccdfunc.c:722
msgid "Can't set readout speed"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ÓÞÉÔÙ×ÁÎÉÑ"
#: ccdfunc.c:525
#: ccdfunc.c:524
#, c-format
msgid "Can't set wheel position %d"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÐÏÌÏÖÅÎÉÅ ËÏÌÅÓÁ %d"
#: ccdfunc.c:748 ccdfunc.c:823 server.c:150
#: ccdfunc.c:753 ccdfunc.c:827 server.c:150
msgid "Can't start exposition"
msgstr "îÅ ÍÏÇÕ ÎÁÞÁÔØ ÜËÓÐÏÚÉÃÉÀ"
#. Захват кадра %d\n
#: ccdfunc.c:746
#: ccdfunc.c:751
#, c-format
msgid "Capture frame %d"
msgstr "úÁÈ×ÁÔ ËÁÄÒÁ %d"
#: ccdfunc.c:637
#: ccdfunc.c:644
#, c-format
msgid "Current format: %s"
msgstr ""
msgstr "Текущий формат: %s"
#: cmdlnopts.c:118
msgid "Display image in OpenGL window"
msgstr "ïÔÏÂÒÁÖÅÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ × ÏËÎÅ OpenGL"
msgstr "отображение изображения в окне OpenGL"
#: imageview.c:746
#, c-format
msgid "Equalization of histogram: %s"
msgstr "üË×ÁÌÉÚÁÃÉÑ ÇÉÓÔÏÇÒÁÍÍÙ: %s"
#: ccdfunc.c:278
#: ccdfunc.c:277
msgid "Error saving file"
msgstr "ïÛÉÂËÁ ÓÏÈÒÁÎÅÎÉÑ ÆÁÊÌÁ"
#: ccdfunc.c:634
#: ccdfunc.c:641
#, c-format
msgid "Field of view: %s"
msgstr "ðÏÌÅ ÚÒÅÎÉÑ: %s"
#: ccdfunc.c:269
#: ccdfunc.c:268
#, c-format
msgid "File saved as '%s'"
msgstr "æÁÊÌ ÓÏÈÒÁÎÅÎ ËÁË '%s'"
#: ccdfunc.c:365
#: ccdfunc.c:364
msgid "Focuser device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï ÆÏËÕÓÅÒÁ ÎÅ ÕËÁÚÁÎÏ"
#: ccdfunc.c:595
#: ccdfunc.c:594
#, c-format
msgid "Found %d cameras, you point number %d"
msgstr "ïÂÎÁÒÕÖÅÎÏ %d ËÁÍÅÒ, ×Ù ÕËÁÚÁÌÉ %d"
#: ccdfunc.c:403
#: ccdfunc.c:402
#, c-format
msgid "Found %d focusers, you point number %d"
msgstr "ïÂÎÁÒÕÖÅÎÏ %d ÆÏËÕÓÅÒÏ×, ×Ù ÕËÁÚÁÌÉ %d"
#: ccdfunc.c:494
#: ccdfunc.c:493
#, c-format
msgid "Found %d wheels, you point number %d"
msgstr "ïÂÎÁÒÕÖÅÎÏ %d ËÏÌÅÓ, ×Ù ÕËÁÚÁÌÉ %d"
#: ccdfunc.c:631
#: ccdfunc.c:638
#, c-format
msgid "Full array: %s"
msgstr "ðÏÌÎÙÊ ÆÏÒÍÁÔ: %s"
@ -265,11 +261,10 @@ msgid "Histogram conversion: %s"
msgstr "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÇÉÓÔÏÇÒÁÍÍÙ: %s"
#: cmdlnopts.c:108
#, fuzzy
msgid "INET image socket port"
msgstr "ÐÏÒÔ ÌÏËÁÌØÎÏÇÏ ÓÅÔÅ×ÏÇÏ ÓÏËÅÔÁ"
msgstr "порт локального сетевого сокета передачи изображения"
#: ccdfunc.c:356
#: ccdfunc.c:355
#, c-format
msgid "Image stat:\n"
msgstr "óÔÁÔÉÓÔÉËÁ ÐÏ ÉÚÏÂÒÁÖÅÎÉÀ: \n"
@ -282,80 +277,86 @@ msgstr "N
msgid "No camera device"
msgstr "îÅ ÕËÁÚÁÎÏ ÕÓÔÒÏÊÓÔ×Ï ËÁÍÅÒÙ"
#: ccdfunc.c:564 ccdfunc.c:565
#: ccdfunc.c:563 ccdfunc.c:564
msgid "No cameras found"
msgstr "ëÁÍÅÒ ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
#: ccdfunc.c:372
#: ccdfunc.c:371
msgid "No focusers found"
msgstr "æÏËÕÓÅÒÏ× ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
#: ccdfunc.c:463
#: ccdfunc.c:462
msgid "No wheels found"
msgstr "ôÕÒÅÌÅÊ ÎÅ ÏÂÎÁÒÕÖÅÎÏ"
#: ccdfunc.c:719
#: ccdfunc.c:724
msgid "Only show statistics"
msgstr "ôÏÌØËÏ ÏÔÏÂÒÁÚÉÔØ ÓÔÁÔÉÓÔÉËÕ"
#: ccdfunc.c:625
#: ccdfunc.c:632
#, c-format
msgid "Pixel size: %g x %g"
msgstr "òÁÚÍÅÒ ÐÉËÓÅÌÑ: %g x %g"
#: ccdfunc.c:756
#: ccdfunc.c:761
msgid "Read grabbed image"
msgstr "óÞÉÔÙ×ÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ"
#: ccdfunc.c:718
#: ccdfunc.c:723
#, c-format
msgid "Readout mode: %s"
msgstr "òÅÖÉÍ ÓÞÉÔÙ×ÁÎÉÑ: %s"
#: client.c:287
#: client.c:286
msgid "Server timeout"
msgstr "ôÁÊÍÁÕÔ ÓÅÒ×ÅÒÁ"
#: ccdfunc.c:682
#: ccdfunc.c:687
#, c-format
msgid "Set brightness to %g"
msgstr "õÓÔÁÎÏ×ÉÔØ ÑÒËÏÓÔØ × %g"
#: ccdfunc.c:619
#: ccdfunc.c:626
#, c-format
msgid "Set fan speed to %d"
msgstr "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÓËÏÒÏÓÔØ ×ÅÎÔÉÌÑÔÏÒÏ× × %d"
#: ccdfunc.c:676
#: ccdfunc.c:681
#, c-format
msgid "Set gain to %g"
msgstr "õÓÔÁÎÏ×ÉÔØ Gain × %g"
#: ccdfunc.c:648
#: ccdfunc.c:655
#, c-format
msgid "Shutter command: %s\n"
msgstr "ëÏÍÁÎÄÁ ÚÁÔ×ÏÒÁ: %s\n"
#: ccdfunc.c:834
#: ccdfunc.c:838
msgid "Some error when capture"
msgstr ""
msgstr "Ошибка при захвате"
#. "Попытка Ñ<>конфигурироваÑÑŒ порт I/O как %d\n"
#: ccdfunc.c:654
#: ccdfunc.c:660
#, c-format
msgid "Try to configure I/O port as %d"
msgstr "ðÏÐÙÔËÁ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ ÐÏÒÔ I/O ËÁË %d"
#. "Попытка запиÑ<C2B8>и %d в порт I/O\n"
#: ccdfunc.c:667
#: ccdfunc.c:672
#, c-format
msgid "Try to write %d to I/O port"
msgstr "ðÏÐÙÔËÁ ÚÁÐÉÓÉ %d × ÐÏÒÔ I/O"
#: cmdlnopts.c:106
#, fuzzy
msgid "UNIX socket name (command socket)"
msgstr "éÍÑ UNIX-ÓÏËÅÔÁ"
msgstr "имя UNIX-сокета"
#: ccdfunc.c:455
msgid "Wheel device not pointed"
msgstr "Устройство турели не указано"
#: ccdfunc.c:520
#, c-format
msgid "Wheel position should be from 0 to %d"
msgstr "Позиция колеса должна быть от 0 до %d"
#: cmdlnopts.c:82
msgid "absolute (not divided by binning!) frame X0 coordinate (-1 - all "
@ -391,16 +392,6 @@ msgstr "
msgid "cancel current exposition"
msgstr "ÏÔÍÅÎÁ ÔÅËÕÝÅÊ ÜËÓÐÏÚÉÃÉÉ"
#: ccdfunc.c:456
#, fuzzy
msgid "cc_Wheel device not pointed"
msgstr "õÓÔÒÏÊÓÔ×Ï ÔÕÒÅÌÉ ÎÅ ÕËÁÚÁÎÏ"
#: ccdfunc.c:521
#, fuzzy, c-format
msgid "cc_Wheel position should be from 0 to %d"
msgstr "ðÏÚÉÃÉÑ ËÏÌÅÓÁ ÄÏÌÖÎÁ ÂÙÔØ ÏÔ 0 ÄÏ %d"
#: cmdlnopts.c:88
msgid "close shutter"
msgstr "ÚÁËÒÙÔØ ÚÁÔ×ÏÒ"
@ -416,9 +407,8 @@ msgstr "
"pin1 - ÍÌÁÄÛÉÊ ÂÉÔ, 1 - ×ÙÈÏÄ, 0 - ×ÈÏÄ)"
#: cmdlnopts.c:48
#, fuzzy
msgid "custom camera device plugin command"
msgstr "ÐÌÁÇÉÎ ËÁÍÅÒÙ (ÎÁÐÒÉÍÅÒ, devfli.so)"
msgstr "особые команды плагина камеры"
#: cmdlnopts.c:61
msgid "fast readout mode"
@ -437,8 +427,9 @@ msgid "focuser device plugin (e.g. devzwo.so)"
msgstr "ÐÌÁÇÉÎ ÆÏËÕÓÅÒÁ (ÎÁÐÒÉÍÅÒ, devzwo.so)"
#: cmdlnopts.c:114
msgid "force using image through socket transition even if can use SHM)"
msgstr ""
msgid "force using image through socket transition even if can use SHM"
msgstr "принудительно брать изображения из сокета даже если возможно "
"пользоваться разделяемой памятью"
#: cmdlnopts.c:91
msgid "get value of I/O port pins"
@ -457,7 +448,6 @@ msgid "list connected devices"
msgstr "ÓÐÉÓÏË ÐÏÄËÌÀÞÅÎÎÙÈ ÕÓÔÒÏÊÓÔ×"
#: cmdlnopts.c:107
#, fuzzy
msgid "local INET command socket port"
msgstr "ÐÏÒÔ ÌÏËÁÌØÎÏÇÏ ÓÅÔÅ×ÏÇÏ ÓÏËÅÔÁ"
@ -524,7 +514,7 @@ msgstr "
#: cmdlnopts.c:110
msgid "passive viewer (only get last images)"
msgstr ""
msgstr "пассивный просмотр (только последние кадры)"
#: cmdlnopts.c:65
msgid "program author"
@ -544,11 +534,11 @@ msgstr "
#: cmdlnopts.c:90
msgid "run exposition on HIGH @ pin5 I/O port"
msgstr ""
msgstr "запуск экспозиции по ВЫСОКОМУ сигналу на контакте 5 порта I/O"
#: cmdlnopts.c:89
msgid "run exposition on LOW @ pin5 I/O port"
msgstr ""
msgstr "запуск экспозиции по НИЗКОМУ сигналу на контакте 5 порта I/O"
#: cmdlnopts.c:60
msgid "run in 8-bit mode"
@ -576,7 +566,7 @@ msgstr "
#: cmdlnopts.c:113
msgid "shared memory (with image data) key (default: 7777777)"
msgstr ""
msgstr "ключ разделяемой памяти с данными изображения (по умолчанию: 7777777)"
#: cmdlnopts.c:56
msgid "show this help"
@ -584,7 +574,7 @@ msgstr "
#: cmdlnopts.c:115
msgid "start (!=0) or stop(==0) infinity capturing loop"
msgstr ""
msgstr "начать (!=0) или закончить (==0) бесконечный цикл захвата изображений"
#: cmdlnopts.c:58
msgid "verbose level (-V - messages, -VV - debug, -VVV - all shit)"
@ -601,29 +591,3 @@ msgstr "
#: cmdlnopts.c:51
msgid "wheel device plugin (e.g. devdummy.so)"
msgstr "ÐÌÁÇÉÎ ÕÓÔÒÏÊÓÔ×Á ÔÕÒÅÌÉ (ÎÁÐÒÉÍÅÒ, devdummy.so)"
#, c-format
#~ msgid "Can't find camera in plugin %s: %s"
#~ msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ËÁÍÅÒÙ %s: %s"
#, c-format
#~ msgid "Can't find focuser in plugin %s: %s"
#~ msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ÆÏËÕÓÅÒÁ %s: %s"
#, c-format
#~ msgid "Can't find plugin %s: %s"
#~ msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ %s: %s"
#, c-format
#~ msgid "Can't find wheel in plugin %s: %s"
#~ msgstr "îÅ ÍÏÇÕ ÎÁÊÔÉ ÐÌÁÇÉÎ ÔÕÒÅÌÉ %s: %s"
#~ msgid "Neither filename nor filename prefix pointed!"
#~ msgstr "îÉ ÉÍÑ ÆÁÊÌÁ, ÎÉ ÐÒÅÆÉËÓ ÎÅ ÕËÁÚÁÎÙ!"
#~ msgid "PID file (default: "
#~ msgstr "PID-ÆÁÊÌ (ÐÏ ÕÍÏÌÞÁÎÉÀ: "
#, fuzzy
#~ msgid "local INET socket port to send/receive images"
#~ msgstr "ÐÏÒÔ ÌÏËÁÌØÎÏÇÏ ÓÅÔÅ×ÏÇÏ ÓÏËÅÔÁ"

View File

@ -958,11 +958,14 @@ static cc_hresult inftyhandler(int fd, _U_ const char *key, const char *val){
// custom camera plugin command
static cc_hresult pluginhandler(int fd, _U_ const char *key, const char *val){
if(!camera->plugincmd) return RESULT_BADKEY;
const char *r = camera->plugincmd(val);
if(!r) return RESULT_FAIL;
if(*r == 0) return RESULT_OK;
if(!cc_sendstrmessage(fd, r)) return RESULT_DISCONNECTED;
return RESULT_SILENCE;
static cc_charbuff *ans = NULL;
if(!ans) ans = cc_charbufnew();
cc_buff_lock(ans);
cc_charbufclr(ans);
cc_hresult r = camera->plugincmd(val, ans);
cc_buff_unlock(ans);
if(ans->buflen && !cc_sendstrmessage(fd, ans->buf)) r = RESULT_DISCONNECTED;
return r;
}
// get headers