add my own simple JSON parser instead of json-c

This commit is contained in:
eddyem 2016-06-01 13:59:47 +03:00
parent 8602fda187
commit f68362a8b3
25 changed files with 2449 additions and 937 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
.hg*
*.tgz
*~
.dropbox.attr

22
mask/README.fmt.RU Normal file
View File

@ -0,0 +1,22 @@
формат JSON для файла описания диафрагмы:
Файл состоит из некоторого количества глобальных параметров и одного массива с описанием отверстий
в диафрагме
В глобальных объектах обязательно должен находиться параметр "Z" или "maskz" (это одно и то же) -
координата Z (от вершины зеркала) расположения диафрагмы Гартманна
Также можно объявить глобальные параметры - одну или несколько характеристик отверстий диафрагмы,
в этом случае в тех отверстиях массива, где данный параметр опущен, он будет браться из глобальных.
Центр диафрагмы располагается на оптической оси зеркала. Считается, что диафрагма строго
перпендикулярна оптической оси.
Массив, задающий параметры отверстий диафрагмы, именуется "holes", каждый член массива может
содержать следующие поля (они могут быть и описаны в глобальных):
"shape" - форма отверстия ("square" - квадрат, "round" -круг, "ellipse" - эллипс)
"radius" - скаляр или массив из двух значений - радиус отверстия
"center" - массив из двух значений - координаты центра отверстия (относительно центра диафрагмы)
"bbox" - массив из четырех значений - координаты двух противоположных углов прямоугольника, описывающего отверстие
Независимо от формы отверстия его можно задать двумя способами: либо комбинацией "radius" и "center",
либо одним полем "bbox". Если заданы оба параметра, учитывается лишь первый.

View File

@ -1,5 +1,5 @@
{
"maskz": 20.0,
"maskz": 20.017,
"shape": "round", "radius": 0.007500,
"holes": [
{ "ring": 0, "number": 0, "center": [ 0.1742, 0.0172 ] },
@ -258,7 +258,7 @@
{ "ring": 7, "number": 29, "center": [ 0.4216, -0.2253 ] },
{ "ring": 7, "number": 30, "center": [ 0.4574, -0.1388 ] },
{ "ring": 7, "number": 31, "center": [ 0.4757, -0.0469 ] },
{ "mark": 1, "number": 0, "center": [ 0.3141, -0.1301 ] },
{ "mark": 1, "number": 1, "center": [ 0.0933, -0.4688 ] },
{ "mark": 1, "number": 0, "center": [ 0.4416, -0.1829 ] },
{ "mark": 1, "number": 1, "center": [ 0.0576, -0.2893 ] },
]
}

View File

@ -3,6 +3,7 @@ function make_mask()
% построение гартмановской маски
% SS - размер маски
f = fopen("holes.json", "w");
X = []; Y = [];
R = [175 247 295 340 379 414 448 478] * 1e-3; % радиусы колец на гартманограмме
HoleR = 7.5e-3; % радиус отверстий - 7.5мм
R0 = .6; % радиус самой гартманограммы
@ -11,20 +12,23 @@ function make_mask()
% для того, чтобы разместить на маске окружности, создадим маску
% окружности: zeros(15) с единицами там, где должна быть дырка. Затем
% пометим единицами в mask те точки, куда должен попадать левый верхний
fprintf(f, "{\n\t\"shape\": \"round\", \"radius\": %f,\n\t\"holes\": [\n" , HoleR);
fprintf(f, "{\n\t\"maskz\": 20.017,\n\t\"shape\": \"round\", \"radius\": %f,\n\t\"holes\": [\n" , HoleR);
for i = [1 : size(R,2)] % цикл по кольцам
x = R(i) * cos(Angles);
y = R(i) * sin(Angles);
X = [X x]; Y = [Y y];
%fprintf(f, "\t\t{\"ring\": %d, \"center\": [%f, %f]\n", i, x[j], y[j]]);
printR(f, sprintf("\"ring\": %d", i-1), x, y);
endfor
% помечаем маркеры
x = R([4 8]) .* cos([-2 -7]* 2 * alpha0);
y = R([4 8]) .* sin([-2 -7]* 2 * alpha0);
x = R([8 3]) .* cos([-2 -7]* 2 * alpha0);
y = R([8 3]) .* sin([-2 -7]* 2 * alpha0);
X = [X x]; Y = [Y y];
%fprintf(f, "\t\t{\"marker\", \"center\": [%f, %f]\n", x, y);
printR(f, sprintf("\"mark\": 1"), x, y);
fprintf(f, "\t]\n}\n");
fclose(f);
plot(X, Y, 'o'); axis square;
endfunction
function printR(f, msg, x, y)

View File

@ -21,7 +21,7 @@ pkg_check_modules(${PROJ} REQUIRED
# gtkglext-1.0>=0.7.0
# gtkglext-x11-1.0>=0.7.0
cfitsio>=3.0
json>=0.9
# json>=0.9
# libpng>=1.5
# fftw3>=3.2.0
)

View File

@ -21,6 +21,7 @@
#define CPU_C
#include "mkHartmann.h"
#include "usefull_macros.h"
#include "wrapper.h"
// RANDOM NUMBER generation block ============================================>
@ -93,9 +94,22 @@ int CPUbicubic_interp(float *out, float *in,
}
// <========================================= end of BICUBIC interpolation block
int CPUmkmirDeviat(float *map _U_, size_t mapWH _U_, float mirSZ _U_,
mirDeviations * mirDev _U_){
/**
* Compute matrices of mirror surface deviation
* @param map, mapWH - square matrix of surface deviations (in meters) and its size
* @param mirDia - mirror diameter
* @param mirDev - deviations:
* .mirWH - size of output square matrices (mirWH x mirWH)
* .mirZ - matrix of mirror Z variations (add to mirror Z)
* .mirDX, .mirDY - partial derivatives dZ/dx & dZ/dy (add to mirror der.)
* @return 0 if fails
*/
int CPUmkmirDeviat(float *map, size_t mapWH, float mirDia,
mirDeviations * mirDev){
FNAME();
size_t mirWH = mirDev->mirWH;
if(!CPUbicubic_interp(mirDev->mirZ,map,mirWH,mirWH,mapWH,mapWH)) return 0;
;
return 0;
}
@ -105,9 +119,3 @@ int CPUgetPhotonXY(float *xout _U_, float *yout _U_, int R _U_ ,mirDeviations *D
return 0;
}
/*
int CPUfillImage(float *phX _U_, float *phY _U_, size_t ph_sz _U_,
float *image _U_, size_t imW _U_, size_t imH _U_, BBox *imbox _U_){
return 0;
}
*/

View File

@ -32,6 +32,7 @@
#define EXTERN extern "C"
#define CUDA_CU
#include "mkHartmann.h"
#include "usefull_macros.h"
#include "wrapper.h"
int SHMEMSZ = 16383; // default constants, changed runtime
@ -102,7 +103,7 @@ static int ret;
if(CUERROR("CUDA: can't copy data to device")){\
FREERETMACRO; \
}}while(0)
#define CUFREE(var) do{cudaFree(var); var = NULL; }while(0)
#define CUFREE(var) do{if(var){cudaFree(var); var = NULL; }}while(0)
#define CUFFTCALL(fn) do{ \
cufftResult fres = fn; \
if(CUFFT_SUCCESS != fres){ \
@ -420,11 +421,12 @@ free_all:
*/
// 1./sqrt(2)
#define DIVSQ2 0.7071068f
// 2*(1+2/sqrt(2))
#define WEIGHT 482.842712f
// 2*(1+2/sqrt(2)) -- (1+2/sqrt(2)) taken from linear gradient:
// 1 = (2 + 4/sqrt(2)) / (2*x) ==> x = 1 + 2/sqrt(2)
#define WEIGHT 4.82842712f
__global__ void calcMir_dXdY(size_t Sz, float mirPixSZ,
float *dZdX, float *dZdY){
#define TEX(X,Y) tex2D(TEXTURE(), X0+(X), Y0+(Y))*100.f
#define TEX(X,Y) tex2D(TEXTURE(), X0+(X), Y0+(Y))
#define PAIR(X,Y) (TEX((X),(Y))-TEX(-(X),-(Y)))
int X0,Y0;
X0 = threadIdx.x + blockDim.x * blockIdx.x;
@ -445,9 +447,10 @@ __global__ void calcMir_dXdY(size_t Sz, float mirPixSZ,
* Compute matrices of mirror surface deviation
* @param map, mapWH - square matrix of surface deviations (in meters) and its size
* @param mirDia - mirror diameter
* @param mirWH - size of output square matrices (mirWH x mirWH)
* @param mirZ - matrix of mirror Z variations (add to mirror Z)
* @param mirDX, mirDY - partial derivatives dZ/dx & dZ/dy (add to mirror der.)
* @param mirDev - deviations:
* .mirWH - size of output square matrices (mirWH x mirWH)
* .mirZ - matrix of mirror Z variations (add to mirror Z)
* .mirDX, .mirDY - partial derivatives dZ/dx & dZ/dy (add to mirror der.)
* @return 0 if fails
*/
EXTERN int CUmkmirDeviat(float *map, size_t mapWH, float mirDia,
@ -529,9 +532,8 @@ typedef struct{
* in: coordinates in diapazone [0,1)
* @param photonSZ - size of prevoius arrays
* @param Z0 - Z-coordinate of image plane
* @param M - mirror rotation matrix or NULL if rotation is absent
* @param mpb - rotmatrix, mirror parameters, bbox where photons falling and diaphragm
* @param mir_WH - mirror derivations matrix size
* @param Parms - mirror parameters
* @param f - light direction vector
*
* @param holes - array with
@ -547,15 +549,15 @@ __global__ void getXY(float *photonX, float *photonY, size_t photonSZ,
BBox *box = &mpb->B;
float _2F = Parms->F * 2.f, R = Parms->D / 2.f;
float x,y,z; // coordinates on mirror in meters
x = box->x0 + photonX[IDX] * box->w; // coords of photons
x = box->x0 + photonX[IDX] * box->w; // coords of photons on mirror
y = box->y0 + photonY[IDX] * box->h;
float r2 = x*x + y*y;
z = r2 / _2F / 2.f;
// we don't mean large inclination so check border by non-inclinated mirror
if(r2 > R*R) BADPHOTON();
float pixSZ = Parms->D / float(mir_WH-1); // "pixel" size on mirror
float pixSZ = Parms->D / float(mir_WH-1); // "pixel" size on mirror's normales matrix
// coordinates on deviation matrix, don't forget about y-mirroring!
float xOnMat = (x + R) / pixSZ, yOnMat = (R - y) / pixSZ;
float xOnMat = (x + R) / pixSZ, yOnMat = (y + R) / pixSZ; //yOnMat = (R - y) / pixSZ;
// now add z-deviations, linear interpolation of pre-computed matrix
z += tex2D(TZ, xOnMat, yOnMat);
// point on unrotated mirror
@ -576,17 +578,18 @@ __global__ void getXY(float *photonX, float *photonY, size_t photonSZ,
float K;
if(mpb->D.Nholes){ // there is a diaphragm - test it
Diaphragm *D = &(mpb->D);
int S = D->mask->WH; // size of diaphragm matrix
int S = D->mask->WH; // size of matrix mask
pixSZ = Parms->D / (float)S;
K = (D->Z - point.z) / refl.z; // scale to convert normal to vector
float xleft = D->box.x0, ybot = D->box.y0; // left bottom angle of dia box
float scalex = D->box.w/(float)S, scaley = D->box.h/(float)S;
x = point.x + K*refl.x;
y = point.y + K*refl.y;
int curX = (int)((x - xleft) / scalex + 0.5f); // coords on dia matrix
int curY = (int)((y - ybot) / scaley + 0.5f);
//float xleft = D->box.x0, ybot = D->box.y0; // left bottom angle of dia box
//float scalex = D->box.w/(float)S, scaley = D->box.h/(float)S;
int curX = (int)((x + R) / pixSZ + 0.5f); // coords on mirror mask
int curY = (int)((y + R) / pixSZ + 0.5f);
if(curX < 0 || curX >= S || curY < 0 || curY >= S) BADPHOTON();
uint16_t mark = D->mask->data[curY*S + curX];
if(!mark) BADPHOTON();
x = point.x + K*refl.x; // coords on diaphragm
y = point.y + K*refl.y;
do{
int t = D->holes[mark-1].type;
BBox *b = &D->holes[mark-1].box;
@ -699,7 +702,8 @@ EXTERN int CUgetPhotonXY(float *xout, float *yout, int R, mirDeviations *D,
Diaphragm tmpd;
mirMask tmpM;
memcpy(&tmpd, mirParms->dia, sizeof(Diaphragm));
memcpy(&tmpM, mirParms->dia->mask, sizeof(mirMask));
//memcpy(&tmpM, mirParms->dia->mask, sizeof(mirMask));
tmpM.WH = mirParms->dia->mask->WH;
size_t S = sizeof(aHole) * mirParms->dia->Nholes;
CUALLOC(hdev, S);
CUMOV2DEV(hdev, mirParms->dia->holes, S);

View File

@ -10,4 +10,5 @@
ВСЕ ПРОСТРАНСТВЕННЫЕ КООРДИНАТЫ ПРАВОВИНТОВЫЕ
НА ИЗОБРАЖЕНИЯХ ОСЬ Y Н
НА ИЗОБРАЖЕНИЯХ ОСЬ Y НАПРАВЛЕНА ВВЕРХ!

View File

@ -1,5 +1,5 @@
/*
* cmdlnopts.c - the only function that parce cmdln args and returns glob parameters
* cmdlnopts.c - the only function that parse cmdln args and returns glob parameters
*
* Copyright 2013 Edward V. Emelianoff <eddy@sao.ru>
*
@ -20,10 +20,11 @@
*/
/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>*/
#include "cmdlnopts.h"
#include <stdlib.h>*/
#include "cmdlnopts.h"
#include "usefull_macros.h"
#include <strings.h>
// global variables for parsing
glob_pars G;
@ -37,6 +38,7 @@ extern int rewrite_ifexists;
extern char *outpfile; // output file name for saving matrixes
extern int printDebug; // print tabulars with data on screen or to file
extern int save_images;// save intermediate results to images
extern int forceCPU; // force using CPU even if videocard available
// suboptions structure for get_suboptions
// in array last MUST BE {0,0,0}
@ -49,15 +51,20 @@ typedef struct{
// DEFAULTS
// default global parameters
glob_pars const Gdefault = {
8, // size of initial array of surface deviations
100, // size of interpolated S0
1000, // resulting image size
10000, // amount of photons falled to one pixel of S1 by one iteration
0, // add to mask random numbers
1e-8, // amplitude of added random noice
IT_FITS,// output image type
NULL, // input deviations file name
NULL // mirror
.S_dev = 8, // size of initial array of surface deviations
.S_interp = 100, // size of interpolated S0
.S_image = 1024, // resulting image size
.N_phot = 10000, // amount of photons falled to one pixel of S1 by one iteration
.N_iter = 1000, // iterations number
.randMask = 0, // add to mask random numbers
.randAmp = -1., // amplitude of added random noice
.CCDW = 30., // CCD width
.CCDH = 30., // CD height
.it = IT_FITS, // output image type
.dev_filename = NULL, // input deviations file name
.holes_filename = NULL, // input holes file name
.outfile = "image", // output file name
.Mirror = NULL // mirror
};
//default mirror parameters
mirPar const Mdefault = {
@ -74,7 +81,7 @@ mirPar const Mdefault = {
bool get_mir_par(void *arg, int N);
bool get_imtype(void *arg, int N);
char MirPar[] = N_("set mirror parameters, arg=[diam=num:foc=num:Zincl=ang:Aincl=ang:Ao=ang:Zo=ang:C=num]\n" \
char MirPar[] = N_("set mirror parameters, arg=[diam=num:foc=num:Zincl=ang:Aincl=ang:Aobj=ang:Zoobj=ang:CCD=num]\n" \
"\t\t\tALL DEGREES ARE IN FORMAT [+-][DDd][MMm][SS.S] like -10m13.4 !\n" \
"\t\tdiam - diameter of mirror\n" \
"\t\tfoc - mirror focus ratio\n" \
@ -87,19 +94,25 @@ char MirPar[] = N_("set mirror parameters, arg=[diam=num:foc=num:Zincl=ang:Aincl
// name has_arg flag val type argptr help
myoption cmdlnopts[] = {
{"help", 0, NULL, 'h', arg_int, APTR(&help), N_("show this help")},
{"dev-size",1, NULL, 'd', arg_int, APTR(&G.S_dev), N_("size of initial array of surface deviations")},
{"dev-size",1, NULL, 's', arg_int, APTR(&G.S_dev), N_("size of initial array of surface deviations")},
{"int-size",1, NULL, 'i', arg_int, APTR(&G.S_interp), N_("size of interpolated array of surface deviations")},
{"image-size",1,NULL, 'I', arg_int, APTR(&G.S_image), N_("resulting image size")},
{"image-size",1,NULL, 'S', arg_int, APTR(&G.S_image), N_("resulting image size")},
{"N-photons",1,NULL, 'N', arg_int, APTR(&G.N_phot), N_("amount of photons falled to one pixel of matrix by one iteration")},
{"mir-parameters",1,NULL,'M', arg_function,APTR(&get_mir_par),MirPar},
{"add-noice",0, &G.randMask,1, arg_none, NULL, N_("add random noice to mirror surface deviations")},
{"noice-amp",1, NULL, 'a', arg_float, APTR(&G.randAmp), N_("amplitude of random noice (default: 1e-8)")},
{"dev-file", 1, NULL, 'F', arg_string, APTR(&G.dev_filename),N_("filename for mirror surface deviations (in microns!)")},
{"force", 0, &rewrite_ifexists,1,arg_none,NULL, N_("rewrite output file if exists")},
{"force", 0, NULL, 'f', arg_int, APTR(&rewrite_ifexists),N_("rewrite output file if exists")},
{"log-file",1, NULL, 'l', arg_string, APTR(&outpfile), N_("save matrices to file arg")},
{"print-matr",0,&printDebug,1, arg_none, NULL, N_("print matrices on screen")},
{"save-images",0,&save_images,1,arg_none, NULL, N_("save intermediate results to images")},
{"debug-images",0,NULL, 'd', arg_int, APTR(&save_images), N_("save intermediate results to images")},
{"image-type",1,NULL, 'T', arg_function,APTR(&get_imtype), N_("image type, arg=[jfpt] (Jpeg, Fits, Png, Tiff)")},
{"holes-file",1,NULL, 'j', arg_string, APTR(&G.holes_filename),N_("name of JSON file with holes description")},
{"N-iter", 1, NULL, 'I', arg_int, APTR(&G.N_iter), N_("amount of iterations by N-photons")},
{"ccd-w", 1, NULL, 'W', arg_float, APTR(&G.CCDW), N_("CCD width (in millimeters)")},
{"ccd-h", 1, NULL, 'H', arg_float, APTR(&G.CCDH), N_("CCD height (in millimeters)")},
{"outfile", 1, NULL, 'o', arg_string, APTR(&G.outfile), N_("output image file name")},
{"force-cpu",0, &forceCPU,1, arg_none, NULL, N_("force CPU using iven if have videocard")},
end_option
};
@ -239,13 +252,13 @@ bool get_mir_par(void *arg, int N _U_){
}
/**
* Parce command line options and return dynamically allocated structure
* Parse command line options and return dynamically allocated structure
* to global parameters
* @param argc - copy of argc from main
* @param argv - copy of argv from main
* @return allocated structure with global parameters
*/
glob_pars *parce_args(int argc, char **argv){
glob_pars *parse_args(int argc, char **argv){
int i;
void *ptr;
ptr = memcpy(&G, &Gdefault, sizeof(G)); assert(ptr);
@ -254,7 +267,7 @@ glob_pars *parce_args(int argc, char **argv){
// format of help: "Usage: progname [args]\n"
change_helpstring("Usage: %s [args]\n\n\tWhere args are:\n");
// parse arguments
parceargs(&argc, &argv, cmdlnopts);
parseargs(&argc, &argv, cmdlnopts);
if(help) showhelp(-1, cmdlnopts);
if(argc > 0){
printf("\nIgnore argument[s]:\n");

View File

@ -20,30 +20,20 @@
*/
#include "mkHartmann.h"
#include "usefull_macros.h"
#include "wrapper.h"
#include "diaphragm.h"
#include <sys/mman.h>
#include <json/json.h>
#include "json.h"
/**
* Get double value from object
* @param jobj (i) - object
* @return double value
*/
double get_jdouble(json_object *jobj){
enum json_type type = json_object_get_type(jobj);
double val;
switch(type){
case json_type_double:
val = json_object_get_double(jobj);
break;
case json_type_int:
val = json_object_get_int(jobj);
break;
default:
ERRX(_("Wrong value! Get non-number!\n"));
}
return val;
double get_jdouble(json_pair *val){
if(val->type != json_type_number) ERRX(_("Wrong value! Get non-number!\n"));
return json_pair_get_number(val);
}
/**
@ -53,26 +43,19 @@ double get_jdouble(json_object *jobj){
* @param getLen (o) - array length or NULL
* @return filled array
*/
double *json_get_array(json_object *jobj, int *getLen){
enum json_type type;
json_object *jarray = jobj;
int arraylen = json_object_array_length(jarray);
double *arr = calloc(arraylen, sizeof(double));
double *json_get_array(json_pair *pair, int *getLen){
if(pair->type != json_type_data_array) return NULL;
size_t i, arraylen = pair->len;
if(arraylen < 1) return NULL;
double *arr = MALLOC(double, arraylen);
int L = 0;
int i;
json_object *jvalue;
for (i=0; i< arraylen; i++){
jvalue = json_object_array_get_idx(jarray, i);
type = json_object_get_type(jvalue);
if(type == json_type_array){ // nested arrays is error
ERRX(_("Invalid file format! Found nested arrays!\n"));
}
else if (type != json_type_object){
arr[L++] = get_jdouble(jvalue);
}
else{ // non-numerical data?
ERRX(_("Invalid file format! Non-numerical data in array!\n"));
}
char *jvalue;
for (i = 0; i< arraylen; i++){
jvalue = json_array_get_data(pair, i);
//DBG("get arr val[%zd]: %s",i, jvalue);
if(!jvalue) break;
arr[L++] = strtod(jvalue, NULL);
FREE(jvalue);
}
if(L == 0) FREE(arr);
if(getLen) *getLen = L;
@ -84,18 +67,20 @@ double *json_get_array(json_object *jobj, int *getLen){
*
* @param B (o) - output BBox (allocated outside)
* @param jobj (i) - JSON object (array with BBox params)
* @return 0 if all OK
*/
void json_get_bbox(BBox *B, json_object *jobj){
int json_get_bbox(BBox *B, json_object *jobj){
double *arr = NULL;
int Len;
assert(B); assert(jobj);
json_object *o = json_object_object_get(jobj, "bbox");
if(!o) return;
json_pair *o = json_object_get_pair(jobj, "bbox");
if(!o) return 1;
if(!(arr = json_get_array(o, &Len)) || Len != 4){
ERRX(_("\"bbox\" must contain an array of four doubles!\n"));
}
B->x0 = arr[0]; B->y0 = arr[1]; B->w = arr[2]; B->h = arr[3];
FREE(arr);
return 0;
}
aHole globHole; // global parameters for all holes (in beginning of diafragm JSON)
@ -103,29 +88,32 @@ aHole globHole; // global parameters for all holes (in beginning of diafragm JSO
* Fills aHole object by data in JSON
* @param jobj (i) - JSON data for hole
* @param H (o) - output hole object
* @return 0 if all OK
*/
void get_obj_params(json_object *jobj, aHole *H){
int get_obj_params(json_object *jobj, aHole *H){
double *arr = NULL;
if(!jobj) return 1;
int Len;
enum json_type type;
if(!H){
ERRX( _("Error: NULL instead of aHole structure!\n"));
}
memcpy(H, &globHole, sizeof(aHole)); // initialize hole by global values
json_object *o = json_object_object_get(jobj, "shape");
json_pair *o = json_object_get_pair(jobj, "shape");
if(o){
const char *ptr = json_object_get_string(o);
char *ptr = json_pair_get_string(o);
if(!ptr) ERRX(_("Wrong \"shape\" value"));
if(strcmp(ptr, "square") == 0) H->type = H_SQUARE;
else if(strcmp(ptr, "round") == 0 || strcmp(ptr, "ellipse") == 0 ) H->type = H_ELLIPSE;
else H->type = H_UNDEF;
//DBG("shape: %s", ptr);
}
o = json_object_object_get(jobj, "radius");
o = json_object_get_pair(jobj, "radius");
if(o){
type = json_object_get_type(o);
if(type == json_type_int || type == json_type_double){ // circle / square
double R = json_object_get_double(o);
//DBG("radius: %s", o->value);
if(o->type == json_type_number){ // circle / square
double R = strtod(o->value, NULL);
H->box.w = H->box.h = R * 2.;
}else if(type == json_type_array){ // ellipse / rectangle
}else if(o->type == json_type_data_array){ // ellipse / rectangle
if(!(arr = json_get_array(o, &Len)) || Len != 2){
ERRX(_("\"radius\" array must consist of two doubles!\n"));
}
@ -135,8 +123,9 @@ void get_obj_params(json_object *jobj, aHole *H){
ERRX(_("\"radius\" must be a number or an array of two doubles!\n"));
}
}
o = json_object_object_get(jobj, "center");
o = json_object_get_pair(jobj, "center");
if(o){
//DBG("center");
if(!(arr = json_get_array(o, &Len)) || Len != 2){
ERRX(_("\"center\" must contain an array of two doubles!\n"));
}
@ -144,16 +133,9 @@ void get_obj_params(json_object *jobj, aHole *H){
H->box.y0 = arr[1] - H->box.h/2.;
FREE(arr);
}else{
json_get_bbox(&H->box, jobj);
/* o = json_object_object_get(jobj, "bbox");
if(o){
if(!(arr = json_get_array(o, &Len)) || Len != 4){
ERRX(_("\"bbox\" must contain an array of four doubles!\n"));
}
H->box.x0 = arr[0]; H->box.y0 = arr[1]; H->box.w = arr[2]; H->box.h = arr[3];
FREE(arr);
}*/
return json_get_bbox(&H->box, jobj);
}
return 0;
}
/**
@ -163,22 +145,19 @@ void get_obj_params(json_object *jobj, aHole *H){
* @param getLen (o) - length of array or NULL
* @return holes array
*/
aHole *json_parse_holesarray(json_object *jobj, int *getLen){
enum json_type type;
json_object *jarray = jobj;
int arraylen = json_object_array_length(jarray), i;
aHole *json_parse_holesarray(json_pair *jobj, int *getLen){
int arraylen = jobj->len, i;
if(!arraylen || jobj->type != json_type_obj_array) return NULL;
aHole *H = calloc(arraylen, sizeof(aHole));
json_object *jvalue;
for (i=0; i < arraylen; i++){
jvalue = json_object_array_get_idx(jarray, i);
type = json_object_get_type(jvalue);
if(type == json_type_object){
get_obj_params(jvalue, &H[i]);
}else{
ERRX(_("Invalid holes array format!\n"));
}
for (i = 0; i < arraylen; i++){
jvalue = json_array_get_object(jobj, i);
if(!jvalue) break;
if(get_obj_params(jvalue, &H[i]))
ERRX(_("Invalid format for hole #%d!\n"), i);
json_free_obj(&jvalue);
}
if(getLen) *getLen = arraylen;
if(getLen) *getLen = i;
return H;
}
@ -199,73 +178,56 @@ char *gettype(aHole *H){
}
#endif
/**
* Try to mmap a file
*
* @param filename (i) - name of file to mmap
* @return pointer with mmap'ed file or die
*/
char *My_mmap(char *filename, size_t *Mlen){
int fd;
char *ptr;
struct stat statbuf;
if(!filename) ERRX(_("No filename given!"));
if((fd = open(filename, O_RDONLY)) < 0)
ERR(_("Can't open %s for reading"), filename);
if(fstat (fd, &statbuf) < 0)
ERR(_("Can't stat %s"), filename);
*Mlen = statbuf.st_size;
if((ptr = mmap (0, *Mlen, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
ERR(_("Mmap error for input"));
if(close(fd)) ERR(_("Can't close mmap'ed file"));
return ptr;
}
/**
* Read holes array for diaphragm structure from file
*
* file should
*
* @param filename - name of file
* @return readed structure or NULL if failed
* @return read structure or NULL if failed
*/
aHole *readHoles(char *filename, Diaphragm *dia){
char *ptr;
enum json_type type;
json_object *o, *jobj;
int i, HolesNum;
aHole *HolesArray;
FNAME();
mmapbuf *map;
json_pair *o;
json_object *jobj;
int i, HolesNum = -1;
aHole *HolesArray = NULL;
BBox Dbox = {100.,100.,-200.,-200.}; // bounding box of diaphragm
size_t Mlen;
if(dia) memset(dia, 0, sizeof(Diaphragm));
ptr = My_mmap(filename, &Mlen);
jobj = json_tokener_parse(ptr);
map = My_mmap(filename);
jobj = json_tokener_parse(map->data);
if(!jobj) ERRX(_("Wrong JSON file"));
get_obj_params(jobj, &globHole); // read global parameters
// now try to find diaphragm bounding box & Z-coordinate
json_get_bbox(&Dbox, jobj);
// check for Z-coordinate
if(dia){
o = json_object_object_get(jobj, "Z");
if(!o) o = json_object_object_get(jobj, "maskz");
o = json_object_get_pair(jobj, "Z");
if(!o) o = json_object_get_pair(jobj, "maskz");
if(!o)
ERRX(_("JSON file MUST contain floating point field \"Z\" or \"maskz\" with mask's coordinate"));
dia->Z = get_jdouble(o); // read mask Z
}
o = json_object_object_get(jobj, "holes");
o = json_object_get_pair(jobj, "holes");
if(!o)
ERRX(_("Corrupted file: no holes found!"));
type = json_object_get_type(o);
if(type == json_type_object){ // single hole
HolesArray = calloc(1, sizeof(aHole));
assert(HolesArray);
if(o->type == json_type_object){ // single hole
HolesArray = MALLOC(aHole, 1);
HolesNum = 1;
get_obj_params(o, HolesArray);
}else{ // array of holes
json_object *obj = json_pair_get_object(o);
if(!obj) ERRX(_("Wrong hole descriptor"));
get_obj_params(obj, HolesArray);
json_free_obj(&obj);
}else if(o->type == json_type_obj_array){ // array of holes
//DBG("array of holes");
HolesArray = json_parse_holesarray(o, &HolesNum);
}else{
ERRX(_("Corrupted file: bad holes format!"));
}
if(!HolesArray || HolesNum < 1)
ERRX(_("Didn't find any holes in json file!"));
DBG("Readed %d holes", HolesNum);
//DBG("Read %d holes", HolesNum);
// check bbox of diafragm (or make it if none)
float minx=100., miny=100., maxx=-100., maxy=-100.;
for(i = 0; i < HolesNum; i++){
@ -287,12 +249,13 @@ aHole *readHoles(char *filename, Diaphragm *dia){
if(Dbox.y0 > miny) Dbox.y0 = miny;
if(Dbox.w < wdth) Dbox.w = wdth;
if(Dbox.h < hght) Dbox.h = hght;
munmap(ptr, Mlen);
My_munmap(map);
if(dia){
dia->holes = HolesArray;
dia->Nholes = HolesNum;
memcpy(&dia->box, &Dbox, sizeof(BBox));
}
json_free_obj(&jobj);
return HolesArray;
}

View File

@ -23,7 +23,7 @@
#ifndef __CMDLNOPTS_H__
#define __CMDLNOPTS_H__
#include "parceargs.h"
#include "parseargs.h"
#include "mkHartmann.h"
#include "saveimg.h"
@ -32,10 +32,15 @@ typedef struct{
int S_interp; // size of interpolated S0
int S_image; // resulting image size
int N_phot; // amount of photons falled to one pixel of S1 by one iteration
int N_iter; // iterations number
int randMask; // add to mask random numbers
float randAmp; // amplitude of added random noice
float CCDW; // CCD width
float CCDH; // and height (in millimeters)
imtype it; // output image type
char *dev_filename;// input deviations file name
char *holes_filename;// input holes file name
char *outfile; // output file name
mirPar *Mirror; // mirror parameters
} glob_pars;
@ -43,6 +48,6 @@ typedef struct{
extern glob_pars const Gdefault;
extern mirPar const Mdefault;
glob_pars *parce_args(int argc, char **argv);
glob_pars *parse_args(int argc, char **argv);
#endif // __CMDLNOPTS_H__

View File

@ -26,6 +26,6 @@
#include "wrapper.h"
aHole *readHoles(char *filename, Diaphragm *dia);
char *My_mmap(char *filename, size_t *Mlen);
//char *My_mmap(char *filename, size_t *Mlen);
#endif // __DIAPHRAGM_H__

64
src/include/json.h Normal file
View File

@ -0,0 +1,64 @@
/*
* json.h
*
* Copyright 2016 Edward V. Emelianov <eddy@sao.ru, 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#pragma once
#ifndef __JSON_H__
#define __JSON_H__
enum json_type{
json_type_object, // compound object
json_type_obj_array, // array of objects
json_type_data_array, // array of data
json_type_number, // number
json_type_string // string
};
// JSON pair (name - value):
typedef struct{
char *name;
char *value;
enum json_type type;
size_t len; // amount of objects in array
}json_pair;
typedef struct{
size_t len; // amount of pairs
size_t max_len; // max amount of pairs
char *original_data; // contains string with data
json_pair *objs;// objects themself
}json_object;
#define JSON_BLKSZ (128)
// JSON object
json_object *json_tokener_parse(char *data);
void json_free_obj(json_object **obj);
char *json_pair_get_string(json_pair *pair);
double json_pair_get_number(json_pair *pair);
json_object *json_pair_get_object(json_pair *pair);
json_pair *json_object_get_pair(json_object *obj, char *name);
json_object *json_array_get_object(json_pair *pair, int idx);
char *json_array_get_data(json_pair *pair, int idx);
#endif // __JSON_H__

View File

@ -61,12 +61,6 @@
#define LOCALEDIR "/usr/share/locale/"
#endif
#define _(String) gettext(String)
#define gettext_noop(String) String
#define N_(String) gettext_noop(String)
#define _U_ __attribute__((__unused__))
#ifndef THREAD_NUMBER
#define THREAD_NUMBER 2
#endif
@ -81,27 +75,6 @@
#define OMP_FOR(x)
#endif // OMP
extern int globErr;
#define ERR(...) do{globErr=errno; _WARN(__VA_ARGS__); exit(-1);}while(0)
#define ERRX(...) do{globErr=0; _WARN(__VA_ARGS__); exit(-1);}while(0)
#define WARN(...) do{globErr=errno; _WARN(__VA_ARGS__);}while(0)
#define WARNX(...) do{globErr=0; _WARN(__VA_ARGS__);}while(0)
// debug mode, -DEBUG
#ifdef EBUG
#define FNAME() fprintf(stderr, "\n%s (%s, line %d)\n", __func__, __FILE__, __LINE__)
#define DBG(...) do{fprintf(stderr, "%s (%s, line %d): ", __func__, __FILE__, __LINE__); \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\n");} while(0)
#else
#define FNAME() do{}while(0)
#define DBG(...) do{}while(0)
#endif //EBUG
#define ALLOC(type, var, size) type * var = ((type *)my_alloc(size, sizeof(type)))
#define MALLOC(type, size) ((type *)my_alloc(size, sizeof(type)))
#define FREE(ptr) do{free(ptr); ptr = NULL;}while(0)
#ifndef EXTERN // file wasn't included from CUDA.cu
#define EXTERN extern
#endif

View File

@ -1,5 +1,5 @@
/*
* parceargs.h - headers for parcing command line arguments
* parseargs.h - headers for parsing command line arguments
*
* Copyright 2013 Edward V. Emelianoff <eddy@sao.ru>
*
@ -19,10 +19,11 @@
* MA 02110-1301, USA.
*/
#pragma once
#ifndef __PARCEARGS_H__
#define __PARCEARGS_H__
#ifndef __PARSEARGS_H__
#define __PARSEARGS_H__
#include <stdbool.h>// bool
#include <stdlib.h>
#ifndef TRUE
#define TRUE true
@ -36,7 +37,7 @@
#define APTR(x) ((void*)x)
// if argptr is a function:
typedef bool(*argfn)(void *arg, int N);
typedef bool(*argfn)(void *arg);
/*
* type of getopt's argument
@ -47,7 +48,7 @@ typedef bool(*argfn)(void *arg, int N);
* int iarg;
* myoption opts[] = {
* {"value", 1, NULL, 'v', arg_int, &iarg, "char val"}, ..., end_option};
* ..(parce args)..
* ..(parse args)..
* charg = (char) iarg;
*/
typedef enum {
@ -57,7 +58,7 @@ typedef enum {
arg_double, // double
arg_float, // float
arg_string, // char *
arg_function // parce_args will run function `bool (*fn)(char *optarg, int N)`
arg_function // parse_args will run function `bool (*fn)(char *optarg, int N)`
} argtype;
/*
@ -66,7 +67,7 @@ typedef enum {
* conversion depends on .type
*
* ATTENTION: string `help` prints through macro PRNT(), bu default it is gettext,
* but you can redefine it before `#include "parceargs.h"`
* but you can redefine it before `#include "parseargs.h"`
*
* if arg is string, then value wil be strdup'ed like that:
* char *str;
@ -79,26 +80,45 @@ typedef enum {
* !!!LAST VALUE OF ARRAY SHOULD BE `end_option` or ZEROS !!!
*
*/
typedef enum{
NO_ARGS = 0, // first three are the same as in getopt_long
NEED_ARG = 1,
OPT_ARG = 2,
MULT_PAR
} hasarg;
typedef struct{
// these are from struct option:
const char *name; // long option's name
int has_arg; // 0 - no args, 1 - nesessary arg, 2 - optionally arg
hasarg has_arg; // 0 - no args, 1 - nesessary arg, 2 - optionally arg, 4 - need arg & key can repeat (args are stored in null-terminated array)
int *flag; // NULL to return val, pointer to int - to set its value of val (function returns 0)
int val; // short opt name (if flag == NULL) or flag's value
// and these are mine:
argtype type; // type of argument
void *argptr; // pointer to variable to assign optarg value or function `bool (*fn)(char *optarg, int N)`
char *help; // help string which would be shown in function `showhelp` or NULL
const char *help; // help string which would be shown in function `showhelp` or NULL
} myoption;
/*
* Suboptions structure, almost the same like myoption
* used in parse_subopts()
*/
typedef struct{
const char *name;
hasarg has_arg;
argtype type;
void *argptr;
} mysuboption;
// last string of array (all zeros)
#define end_option {0,0,0,0,0,0,0}
#define end_suboption {0,0,0,0}
extern const char *__progname;
void showhelp(int oindex, myoption *options);
void parceargs(int *argc, char ***argv, myoption *options);
void parseargs(int *argc, char ***argv, myoption *options);
void change_helpstring(char *s);
bool get_suboption(char *str, mysuboption *opt);
#endif // __PARCEARGS_H__
#endif // __PARSEARGS_H__

View File

@ -0,0 +1,124 @@
/*
* usefull_macros.h - a set of usefull macros: memory, color etc
*
* Copyright 2013 Edward V. Emelianoff <eddy@sao.ru>
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#pragma once
#ifndef __USEFULL_MACROS_H__
#define __USEFULL_MACROS_H__
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <errno.h>
#include <err.h>
#include <locale.h>
#if defined GETTEXT_PACKAGE && defined LOCALEDIR
/*
* GETTEXT
*/
#include <libintl.h>
#define _(String) gettext(String)
#define gettext_noop(String) String
#define N_(String) gettext_noop(String)
#else
#define _(String) (String)
#define N_(String) (String)
#endif
#include <stdlib.h>
#include <termios.h>
#include <termio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <stdint.h>
// unused arguments with -Wall -Werror
#define _U_ __attribute__((__unused__))
/*
* Coloured messages output
*/
#define RED "\033[1;31;40m"
#define GREEN "\033[1;32;40m"
#define OLDCOLOR "\033[0;0;0m"
/*
* ERROR/WARNING messages
*/
extern int globErr;
extern void signals(int sig);
#define ERR(...) do{globErr=errno; _WARN(__VA_ARGS__); signals(9);}while(0)
#define ERRX(...) do{globErr=0; _WARN(__VA_ARGS__); signals(9);}while(0)
#define WARN(...) do{globErr=errno; _WARN(__VA_ARGS__);}while(0)
#define WARNX(...) do{globErr=0; _WARN(__VA_ARGS__);}while(0)
/*
* print function name, debug messages
* debug mode, -DEBUG
*/
#ifdef EBUG
#define FNAME() fprintf(stderr, "\n%s (%s, line %d)\n", __func__, __FILE__, __LINE__)
#define DBG(...) do{fprintf(stderr, "%s (%s, line %d): ", __func__, __FILE__, __LINE__); \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\n");} while(0)
#else
#define FNAME() do{}while(0)
#define DBG(...) do{}while(0)
#endif //EBUG
/*
* Memory allocation
*/
#define ALLOC(type, var, size) type * var = ((type *)my_alloc(size, sizeof(type)))
#define MALLOC(type, size) ((type *)my_alloc(size, sizeof(type)))
#define FREE(ptr) do{if(ptr){free(ptr); ptr = NULL;}}while(0)
double dtime();
// pointers to functions for color output in tty & no-color in pipes
extern int (*red)(const char *fmt, ...);
extern int (*_WARN)(const char *fmt, ...);
extern int (*green)(const char *fmt, ...);
void * my_alloc(size_t N, size_t S);
void initial_setup();
// mmap file
typedef struct{
char *data;
size_t len;
} mmapbuf;
mmapbuf *My_mmap(char *filename);
void My_munmap(mmapbuf *b);
void restore_console();
void setup_con();
int read_console();
int mygetchar();
void restore_tty();
void tty_init(char *comdev);
size_t read_tty(uint8_t *buff, size_t length);
int write_tty(uint8_t *buff, size_t length);
#endif // __USEFULL_MACROS_H__

361
src/json.c Normal file
View File

@ -0,0 +1,361 @@
/*
* json.c - simple JSON parser
*
* Copyright 2016 Edward V. Emelianov <eddy@sao.ru, 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include "usefull_macros.h"
#include "json.h"
/**
* don't understand hex and octal numbers
* don't understand mixed arrays
*/
static json_object *json_collect(char *data);
static char *skipspaces(char *data){
while(*data){
char ch = *data;
switch (ch){
case '\r': case '\n': case '\t': case ' ':
++data;
break;
default:
goto ret;
}
}
ret:
return data;
}
static json_object *json_ini(){
json_object *ret = MALLOC(json_object, 1);
ret->objs = MALLOC(json_pair, JSON_BLKSZ);
ret->max_len = JSON_BLKSZ; ret->len = 0;
return ret;
}
void json_free_obj(json_object **obj){
FREE((*obj)->objs);
FREE((*obj)->original_data);
FREE(*obj);
}
/**
* find end of compound object & set last brace to zero
* @return first symbol after object's end
*/
static char *find_obj_end(char *data){
int opening = 0;
while(*data && opening != -1){
switch(*data++){
case '{':
++opening;
break;
case '}':
--opening;
break;
default: break;
}
}
if(opening != -1) return NULL;
data[-1] = 0;
return data;
}
/**
* count objects in array
* @return first symbol after array's end
*/
static char *count_objs(json_pair *pair){
int a_closing = 0, o_opening = 0, commas = 0, objects = 0, valstart = 1, values = 0; // counts ']' & '{', ',' & objects
char *data = pair->value;
if(!data) return NULL;
while(*data && a_closing != 1){
switch(*data++){
case '{':
++o_opening; valstart = 0;
break;
case '}':
if(--o_opening == 0) ++objects;
break;
case '[':
--a_closing;
break;
case ']':
++a_closing;
break;
case ',':
if(o_opening == 0){
++commas; // count commas separating objects
valstart = 1;
}
break;
case '\t': case '\n': case '\r': case ' ':
break;
default:
if(valstart) ++values;
valstart = 0;
break;
}
}
if(a_closing != 1) return NULL;
//DBG("find array with %d objects & %d values, commas: %d", objects, values, commas);
if((objects && commas < objects-1) || (values && commas < values-1)) return NULL; // delimeter omit
if(objects && values) return NULL; // mixed array
pair->len = objects + values;
data[-1] = 0;
pair->type = objects ? json_type_obj_array : json_type_data_array;
return data;
}
/**
* skip '.', numbers, signs & '[e|E]'
* return first non-number
*/
static char *skipnumbers(char *data){
while(*data){
char ch = *data;
if(ch < '0' || ch > '9'){
if(ch != '.' && ch != 'e' && ch != 'E' && ch != '-' && ch !='+')
break;
}
++data;
}
return data;
}
/**
* read and add object from string
*/
int json_add_object(json_object *obj, char **data){
//FNAME();
if(!obj || !data || !*data || !**data) return 0;
char *str = skipspaces(*data);
json_pair pair;
memset(&pair, 0, sizeof(pair));
if(*str == '}') return 0; // no objects
if(*str != '"') return -1; // err - not an object's name
char *eptr = strchr(++str, '"');
if(!eptr) return -1;
*eptr = 0;
pair.name = str;
str = eptr + 1;
str = skipspaces(str);
if(*str != ':') return -1; // no delimeter
str = skipspaces(str+1);
if(*str == '"'){ // string
pair.type = json_type_string;
pair.value = ++str;
eptr = strchr(str, '"');
if(!eptr) return -1;
*eptr = 0;
str = eptr + 1;
}else if(*str == '{'){ // compound object
pair.type = json_type_object;
pair.value = skipspaces(++str);
str = find_obj_end(pair.value);
}else if(*str == '['){ // array
pair.value = skipspaces(++str);
str = count_objs(&pair);
}else{ // number ?
pair.type = json_type_number;
pair.value = str;
str = skipnumbers(str);
if(pair.value == str) return -1; // not a number
}
// skip comma & spaces, but leave '}' & add object
if(!str) return -1;
str = skipspaces(str);
//DBG("char: %c", *str);
int meetcomma = 0;
if(*str == ','){
*str++ = 0;
meetcomma = 1;
str = skipspaces(str);
}
if(*str == '}') --str;
else if(!meetcomma && *str) return -1;
*data = str;
// add pair
if(obj->len == obj->max_len){ // no space left - realloc
obj->max_len += JSON_BLKSZ;
obj->objs = realloc(obj->objs, sizeof(json_pair)*obj->max_len);
if(!obj->objs) return -1;
}
memcpy(&(obj->objs[obj->len]), &pair, sizeof(json_pair));
++obj->len;
/*
#ifdef EBUG
fprintf(stderr, "pair %zd, nm: %s, val: %s, type: %d", obj->len, pair.name, pair.value, pair.type);
if(pair.len) fprintf(stderr, "; array length: %zd", pair.len);
fprintf(stderr, "\n");
#endif
*/
return 1;
}
static json_object *json_collect(char *data){
//FNAME();
json_object *ret = json_ini();
ret->original_data = strdup(data);
data = skipspaces(ret->original_data);
int r;
while((r = json_add_object(ret, &data)) > 0);
if(r < 0) goto errjson;
return ret;
errjson:
json_free_obj(&ret);
return NULL;
}
/**
* get global object
*/
json_object *json_tokener_parse(char *data){
data = skipspaces(data);
if(*data != '{') return NULL;
data = strdup(data+1);
if(!data) return NULL;
if(!find_obj_end(data)){
free(data);
return NULL;
}
json_object *jobj = json_collect(data);
free(data);
return jobj;
}
/**
* return double value of number pair
*/
double json_pair_get_number(json_pair *pair){
if(pair->type != json_type_number) return 0.;
char *endptr;
return strtod(pair->value, &endptr);
}
/**
* return string value of string pair
*/
char *json_pair_get_string(json_pair *pair){
if(pair->type != json_type_string) return NULL;
return pair->value;
}
/**
* create object from compound pair
*/
json_object *json_pair_get_object(json_pair *pair){
if(pair->type != json_type_object) return NULL;
return json_collect(pair->value);
}
/**
* find pair with name @name
*/
json_pair *json_object_get_pair(json_object *obj, char *name){
//DBG("search pair named %s", name);
if(!obj || !name) return NULL;
json_pair *pairs = obj->objs;
size_t i, L = obj->len;
for(i = 0; i < L; ++i){
if(strcmp(name, pairs[i].name) == 0){
//DBG("Find, val = %s", pairs[i].value);
return &pairs[i];
}
}
return NULL;
}
/**
* return new object with index idx from array
*/
json_object *json_array_get_object(json_pair *pair, int idx){
//DBG("get %d object from array type %d, len %zd", idx, pair->type, pair->len);
if(pair->type != json_type_obj_array) return NULL;
if(pair->len < 1 || idx > pair->len) return NULL;
int opening = 0, curidx = 0;
char *data = pair->value, *start = NULL;
json_object *obj = NULL;
while(*data && curidx <= idx){
switch(*data++){
case '{':
if(++opening == 1 && curidx == idx) start = data;
break;
case '}':
if(--opening == 0){
++curidx;
if(start){ // found
data[-1] = 0;
obj = json_collect(start);
//DBG("found data with idx %d, val: %s", idx, start);
data[-1] = '}';
}
}
break;
default: break;
}
}
if(!start || opening || !obj->original_data){
json_free_obj(&obj);
return NULL;
}
return obj;
}
/**
* return allocated memory - must be free'd
* @return - string with data
*/
char *json_array_get_data(json_pair *pair, int idx){
if(pair->type != json_type_data_array) return NULL;
if(pair->len < 1 || idx > pair->len) return NULL;
char *data = pair->value, *eptr, *val = NULL;
int curidx = 0;
while(*data && curidx <= idx){
data = skipspaces(data);
char ch = *data;
if(!ch) return NULL;
if(ch != ','){
if(curidx == idx){
if(ch == '"'){ // string
eptr = strchr(++data, '"');
if(!eptr) return NULL;
*eptr = 0;
val = strdup(data);
*eptr = '"';
return val;
}else{ // number
eptr = skipnumbers(data);
if(!eptr || eptr == data) return NULL;
char oldval = *eptr;
*eptr = 0; val = strdup(data);
*eptr = oldval;
return val;
}
}else data = strchr(data, ',');
}else{
do{
data = skipspaces(data+1);
}while(*data == ',');
++curidx;
}
}
return NULL;
}

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-02 17:54+0400\n"
"POT-Creation-Date: 2016-06-01 13:49+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"
@ -17,187 +17,244 @@ msgstr ""
"Content-Type: text/plain; charset=koi8-r\n"
"Content-Transfer-Encoding: 8bit\n"
#: mkHartmann.c:168
#. amount of pcount and/or scount wrong
#. / "îÅÐÒÁ×ÉÌØÎÙÊ ÆÏÒÍÁÔ ÓÔÒÏËÉ ÐÏÍÏÝÉ"
#: parseargs.c:56
msgid "Wrong helpstring!"
msgstr ""
#. / "ãÅÌÏÅ ×ÎÅ ÄÏÐÕÓÔÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ"
#: parseargs.c:86
msgid "Integer out of range"
msgstr ""
#. / "îÅÐÒÁ×ÉÌØÎÙÊ ÐÁÒÁÍÅÔÒ: %s"
#: parseargs.c:480
#, c-format
msgid "Wrong parameter: %s"
msgstr ""
#. / "%s: ÎÅÏÂÈÏÄÉÍ ÁÒÇÕÍÅÎÔ!"
#: parseargs.c:485
#, c-format
msgid "%s: argument needed!"
msgstr ""
#. / "îÅÐÒÁ×ÉÌØÎÙÊ ÁÒÇÕÍÅÎÔ \"%s\" ÐÁÒÁÍÅÔÒÁ \"%s\""
#: parseargs.c:490
#, c-format
msgid "Wrong argument \"%s\" of parameter \"%s\""
msgstr ""
#: mkHartmann.c:69
#, c-format
msgid "Can't write to %s"
msgstr ""
#. file not exist but some error occured
#: mkHartmann.c:172 diaphragm.c:216
#: mkHartmann.c:73 usefull_macros.c:177
#, c-format
msgid "Can't stat %s"
msgstr ""
#: mkHartmann.c:178
#: mkHartmann.c:79
msgid "No output filename given"
msgstr ""
#: mkHartmann.c:185
#: mkHartmann.c:86
#, c-format
msgid "Can't open file %s"
msgstr ""
#: mkHartmann.c:199
#: mkHartmann.c:102
#, c-format
msgid "Can't close file %s"
msgstr ""
#: mkHartmann.c:229
#: mkHartmann.c:134
msgid "Wrong file: should be matrix of float data separated by spaces"
msgstr ""
#. update old width counter
#. check it
#: mkHartmann.c:237
#: mkHartmann.c:142
msgid "All rows must contain equal number of columns"
msgstr ""
#: mkHartmann.c:243
#: mkHartmann.c:148
msgid "Matrix must be square"
msgstr ""
#: mkHartmann.c:254
msgid "Input file was modified in runtime!"
#: mkHartmann.c:156
msgid "File modified in runtime?"
msgstr ""
#: mkHartmann.c:259
#: mkHartmann.c:163
#, c-format
msgid "Error reading data: read %d numbers instaed of %d"
msgid "Error reading data: read %d numbers instead of %d"
msgstr ""
#. / "îÅ ÍÏÇÕ ÐÏÓÔÒÏÉÔØ ÍÁÔÒÉÃÕ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ"
#: mkHartmann.c:316
#: mkHartmann.c:211
msgid "Can't build random matrix"
msgstr ""
#: mkHartmann.c:323
#: mkHartmann.c:221
msgid "Can't build mirror dZ arrays"
msgstr ""
#: diaphragm.c:44
msgid "Wrong value! Get non-number!\n"
msgstr ""
#. nested arrays is error
#: diaphragm.c:68
msgid "Invalid file format! Found nested arrays!\n"
msgstr ""
#. non-numerical data?
#: diaphragm.c:74
msgid "Invalid file format! Non-numerical data in array!\n"
msgstr ""
#: diaphragm.c:95
msgid "\"bbox\" must contain an array of four doubles!\n"
msgstr ""
#: diaphragm.c:112
msgid "Error: NULL instead of aHole structure!\n"
msgstr ""
#: diaphragm.c:130
msgid "\"radius\" array must consist of two doubles!\n"
msgstr ""
#: diaphragm.c:135
msgid "\"radius\" must be a number or an array of two doubles!\n"
msgstr ""
#: diaphragm.c:141
msgid "\"center\" must contain an array of two doubles!\n"
msgstr ""
#: diaphragm.c:178
msgid "Invalid holes array format!\n"
msgstr ""
#: diaphragm.c:212
#: usefull_macros.c:173
msgid "No filename given!"
msgstr ""
#: diaphragm.c:214
#: usefull_macros.c:175
#, c-format
msgid "Can't open %s for reading"
msgstr ""
#: diaphragm.c:219
#: usefull_macros.c:180
msgid "Mmap error for input"
msgstr ""
#: diaphragm.c:220
#: usefull_macros.c:181
msgid "Can't close mmap'ed file"
msgstr ""
#: diaphragm.c:251
#: usefull_macros.c:190
msgid "Can't munmap"
msgstr ""
#: usefull_macros.c:214
msgid "Can't setup console"
msgstr ""
#. Get settings
#: usefull_macros.c:283
msgid "Can't get settings"
msgstr ""
#: usefull_macros.c:293
msgid "Can't set settings"
msgstr ""
#: diaphragm.c:35
msgid "Wrong value! Get non-number!\n"
msgstr ""
#: diaphragm.c:79
msgid "\"bbox\" must contain an array of four doubles!\n"
msgstr ""
#: diaphragm.c:98
msgid "Error: NULL instead of aHole structure!\n"
msgstr ""
#: diaphragm.c:104
msgid "Wrong \"shape\" value"
msgstr ""
#: diaphragm.c:118
msgid "\"radius\" array must consist of two doubles!\n"
msgstr ""
#: diaphragm.c:123
msgid "\"radius\" must be a number or an array of two doubles!\n"
msgstr ""
#: diaphragm.c:130
msgid "\"center\" must contain an array of two doubles!\n"
msgstr ""
#: diaphragm.c:157
#, c-format
msgid "Invalid format for hole #%d!\n"
msgstr ""
#: diaphragm.c:200
msgid "Wrong JSON file"
msgstr ""
#: diaphragm.c:209
msgid ""
"JSON file MUST contain floating point field \"Z\" or \"maskz\" with mask's "
"coordinate"
msgstr ""
#: diaphragm.c:256
#: diaphragm.c:214
msgid "Corrupted file: no holes found!"
msgstr ""
#: diaphragm.c:267
#: diaphragm.c:219
msgid "Wrong hole descriptor"
msgstr ""
#: diaphragm.c:226
msgid "Corrupted file: bad holes format!"
msgstr ""
#: diaphragm.c:229
msgid "Didn't find any holes in json file!"
msgstr ""
#. / "ðÒÉÌÏÖÅÎÉÅ ÓËÏÍÐÉÌÉÒÏ×ÁÎÏ ÂÅÚ ÐÏÄÄÅÒÖËÉ CUDA"
#: wrapper.c:39 wrapper.c:48 wrapper.c:58
#: wrapper.c:41 wrapper.c:50 wrapper.c:60
msgid "Tool was compiled without CUDA support"
msgstr ""
#. / "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ GPU\n"
#: wrapper.c:74
#: wrapper.c:68
msgid "In computations will try to use GPU\n"
msgstr ""
#. / "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#: wrapper.c:79
#: wrapper.c:73
msgid "Can't get properties"
msgstr ""
#. / "ïÛÉÂËÁ ÏÐÒÅÄÅÌÅÎÉÑ ÄÏÓÔÕÐÎÏÊ ÐÁÍÑÔÉ"
#: wrapper.c:81
#: wrapper.c:75
msgid "Can't determine free memory"
msgstr ""
#. / "ïÛÉÂËÁ ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ"
#: wrapper.c:83
#: wrapper.c:77
msgid "Can't allocate memory"
msgstr ""
#: wrapper.c:91
msgid "Can't run CUDA!"
msgstr ""
#. / "ïÛÉÂËÁ × ÉÎÉÃÉÁÌÉÚÁÃÉÉ CUDA!"
#: wrapper.c:99
#: wrapper.c:94
msgid "Error in CUDA initialisation!"
msgstr ""
#. / "ðáíñôø: Ó×ÏÂÏÄÎÁÑ = "
#: wrapper.c:103
#: wrapper.c:98
#, c-format
msgid "MEMORY: free = "
msgstr ""
#. / " ÓÕÍÍÁÒÎÁÑ = "
#: wrapper.c:106
#: wrapper.c:101
#, c-format
msgid " total= "
msgstr ""
#. / "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ CPU\n"
#: wrapper.c:112
#: wrapper.c:122
msgid "Will use only CPU in computations\n"
msgstr ""
#. / "ôÅÓÔ ×ÙÄÅÌÅÎÉÑ 100íâ ÐÁÍÑÔÉ ÐÒÏÊÄÅÎ ÕÓÐÅÛÎÏ\n"
#: wrapper.c:120
#: wrapper.c:133
#, c-format
msgid "Allocation test for 100MB of memory passed\n"
msgstr ""
#. / "\n\n÷ÓÅ ÔÅÓÔÙ ÐÒÏÊÄÅÎÙ ÕÓÐÅÛÎÏ"
#: wrapper.c:123
#: wrapper.c:136
msgid ""
"\n"
"\n"
@ -205,19 +262,19 @@ msgid ""
msgstr ""
#. / "îÅ ÍÏÇÕ ÏÔËÒÙÔØ"
#: wrapper.c:154
#: wrapper.c:155
msgid "Can't open"
msgstr ""
#. / "îÅ ÍÏÇÕ ÐÒÏÞÅÓÔØ"
#: wrapper.c:159
#: wrapper.c:160
msgid "Can't read"
msgstr ""
#: cmdlnopts.c:77
#: cmdlnopts.c:84
msgid ""
"set mirror parameters, arg=[diam=num:foc=num:Zincl=ang:Aincl=ang:Ao=ang:"
"Zo=ang:C=num]\n"
"set mirror parameters, arg=[diam=num:foc=num:Zincl=ang:Aincl=ang:Aobj=ang:"
"Zoobj=ang:CCD=num]\n"
"\t\t\tALL DEGREES ARE IN FORMAT [+-][DDd][MMm][SS.S] like -10m13.4 !\n"
"\t\tdiam - diameter of mirror\n"
"\t\tfoc - mirror focus ratio\n"
@ -228,77 +285,101 @@ msgid ""
"\t\tccd - Z-coordinate of light receiver"
msgstr ""
#: cmdlnopts.c:89
#: cmdlnopts.c:96
msgid "show this help"
msgstr ""
#: cmdlnopts.c:90
#: cmdlnopts.c:97
msgid "size of initial array of surface deviations"
msgstr ""
#: cmdlnopts.c:91
#: cmdlnopts.c:98
msgid "size of interpolated array of surface deviations"
msgstr ""
#: cmdlnopts.c:92
#: cmdlnopts.c:99
msgid "resulting image size"
msgstr ""
#: cmdlnopts.c:93
#: cmdlnopts.c:100
msgid "amount of photons falled to one pixel of matrix by one iteration"
msgstr ""
#: cmdlnopts.c:95
#: cmdlnopts.c:102
msgid "add random noice to mirror surface deviations"
msgstr ""
#: cmdlnopts.c:96
#: cmdlnopts.c:103
msgid "amplitude of random noice (default: 1e-8)"
msgstr ""
#: cmdlnopts.c:97
#: cmdlnopts.c:104
msgid "filename for mirror surface deviations (in microns!)"
msgstr ""
#: cmdlnopts.c:98
#: cmdlnopts.c:105
msgid "rewrite output file if exists"
msgstr ""
#: cmdlnopts.c:99
#: cmdlnopts.c:106
msgid "save matrices to file arg"
msgstr ""
#: cmdlnopts.c:100
#: cmdlnopts.c:107
msgid "print matrices on screen"
msgstr ""
#: cmdlnopts.c:101
#: cmdlnopts.c:108
msgid "save intermediate results to images"
msgstr ""
#: cmdlnopts.c:102
#: cmdlnopts.c:109
msgid "image type, arg=[jfpt] (Jpeg, Fits, Png, Tiff)"
msgstr ""
#: cmdlnopts.c:119
#: cmdlnopts.c:110
msgid "name of JSON file with holes description"
msgstr ""
#: cmdlnopts.c:111
msgid "amount of iterations by N-photons"
msgstr ""
#: cmdlnopts.c:112
msgid "CCD width (in millimeters)"
msgstr ""
#: cmdlnopts.c:113
msgid "CCD height (in millimeters)"
msgstr ""
#: cmdlnopts.c:114
msgid "output image file name"
msgstr ""
#: cmdlnopts.c:115
msgid "force CPU using iven if have videocard"
msgstr ""
#: cmdlnopts.c:132
msgid "Wrong float number format!"
msgstr ""
#: cmdlnopts.c:147
#: cmdlnopts.c:160
msgid "Degrees should be less than 360"
msgstr ""
#. wrong format
#: cmdlnopts.c:193
#: cmdlnopts.c:206
msgid "Wrong format: no value for keyword"
msgstr ""
#. nothing found - wrong format
#: cmdlnopts.c:213
#: cmdlnopts.c:226
msgid "Bad keyword!"
msgstr ""
#: cmdlnopts.c:294
#: cmdlnopts.c:307
#, c-format
msgid "Wrong format of image type: %c"
msgstr ""

View File

@ -6,7 +6,7 @@
msgid ""
msgstr "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-02 16:58+0400\n"
"POT-Creation-Date: 2016-06-01 13:48+0300\n"
"PO-Revision-Date: 2013-01-14 18:49+0400\n"
"Last-Translator: Edward V. Emelianov <eddy@sao.ru>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -16,7 +16,7 @@ msgstr "Project-Id-Version: PACKAGE VERSION\n"
"Content-Transfer-Encoding: 8bit\n"
#. / "\n\n÷ÓÅ ÔÅÓÔÙ ÐÒÏÊÄÅÎÙ ÕÓÐÅÛÎÏ"
#: wrapper.c:123
#: wrapper.c:136
#, fuzzy
msgid "\n"
"\n"
@ -27,260 +27,344 @@ msgstr "\n"
"\n"
#. / " ÓÕÍÍÁÒÎÁÑ = "
#: wrapper.c:106
#: wrapper.c:101
#, c-format
msgid " total= "
msgstr " ÓÕÍÍÁÒÎÁÑ = "
#: diaphragm.c:95
#: diaphragm.c:79
msgid "\"bbox\" must contain an array of four doubles!\n"
msgstr ""
#: diaphragm.c:141
#: diaphragm.c:130
msgid "\"center\" must contain an array of two doubles!\n"
msgstr ""
#: diaphragm.c:130
#: diaphragm.c:118
msgid "\"radius\" array must consist of two doubles!\n"
msgstr ""
#: diaphragm.c:135
#: diaphragm.c:123
msgid "\"radius\" must be a number or an array of two doubles!\n"
msgstr ""
#. / "%s: ÎÅÏÂÈÏÄÉÍ ÁÒÇÕÍÅÎÔ!"
#: parseargs.c:485
#, c-format
msgid "%s: argument needed!"
msgstr ""
#. update old width counter
#. check it
#: mkHartmann.c:237
#: mkHartmann.c:142
msgid "All rows must contain equal number of columns"
msgstr ""
#. / "ôÅÓÔ ×ÙÄÅÌÅÎÉÑ 100íâ ÐÁÍÑÔÉ ÐÒÏÊÄÅÎ ÕÓÐÅÛÎÏ\n"
#: wrapper.c:120
#: wrapper.c:133
#, c-format
msgid "Allocation test for 100MB of memory passed\n"
msgstr "ôÅÓÔ ×ÙÄÅÌÅÎÉÑ 100íâ ÐÁÍÑÔÉ ÐÒÏÊÄÅÎ ÕÓÐÅÛÎÏ\n"
#. nothing found - wrong format
#: cmdlnopts.c:213
#: cmdlnopts.c:226
msgid "Bad keyword!"
msgstr ""
#: cmdlnopts.c:113
msgid "CCD height (in millimeters)"
msgstr ""
#: cmdlnopts.c:112
msgid "CCD width (in millimeters)"
msgstr ""
#. / "ïÛÉÂËÁ ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ"
#: wrapper.c:83
#: wrapper.c:77
msgid "Can't allocate memory"
msgstr "ïÛÉÂËÁ ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ"
#: mkHartmann.c:323
#: mkHartmann.c:221
msgid "Can't build mirror dZ arrays"
msgstr ""
#. / "îÅ ÍÏÇÕ ÐÏÓÔÒÏÉÔØ ÍÁÔÒÉÃÕ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ"
#: mkHartmann.c:316
#: mkHartmann.c:211
msgid "Can't build random matrix"
msgstr ""
#: mkHartmann.c:199
#: mkHartmann.c:102
#, c-format
msgid "Can't close file %s"
msgstr ""
#: diaphragm.c:220
#: usefull_macros.c:181
msgid "Can't close mmap'ed file"
msgstr ""
#. / "ïÛÉÂËÁ ÏÐÒÅÄÅÌÅÎÉÑ ÄÏÓÔÕÐÎÏÊ ÐÁÍÑÔÉ"
#: wrapper.c:81
#: wrapper.c:75
msgid "Can't determine free memory"
msgstr "ïÛÉÂËÁ ÏÐÒÅÄÅÌÅÎÉÑ ÄÏÓÔÕÐÎÏÊ ÐÁÍÑÔÉ"
#. / "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#: wrapper.c:79
#: wrapper.c:73
msgid "Can't get properties"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#. Get settings
#: usefull_macros.c:283
#, fuzzy
msgid "Can't get settings"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#: usefull_macros.c:190
#, fuzzy
msgid "Can't munmap"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#. / "îÅ ÍÏÇÕ ÏÔËÒÙÔØ"
#: wrapper.c:154
#: wrapper.c:155
#, fuzzy
msgid "Can't open"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#: diaphragm.c:214
#: usefull_macros.c:175
#, c-format
msgid "Can't open %s for reading"
msgstr ""
#: mkHartmann.c:185
#: mkHartmann.c:86
#, fuzzy, c-format
msgid "Can't open file %s"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#. / "îÅ ÍÏÇÕ ÐÒÏÞÅÓÔØ"
#: wrapper.c:159
#: wrapper.c:160
msgid "Can't read"
msgstr ""
#: wrapper.c:91
msgid "Can't run CUDA!"
msgstr ""
#: usefull_macros.c:293
#, fuzzy
msgid "Can't set settings"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#: usefull_macros.c:214
msgid "Can't setup console"
msgstr ""
#. file not exist but some error occured
#: mkHartmann.c:172 diaphragm.c:216
#: mkHartmann.c:73 usefull_macros.c:177
#, c-format
msgid "Can't stat %s"
msgstr ""
#: mkHartmann.c:168
#: mkHartmann.c:69
#, c-format
msgid "Can't write to %s"
msgstr ""
#: diaphragm.c:256
#: diaphragm.c:226
msgid "Corrupted file: bad holes format!"
msgstr ""
#: diaphragm.c:214
msgid "Corrupted file: no holes found!"
msgstr ""
#: cmdlnopts.c:147
#: cmdlnopts.c:160
msgid "Degrees should be less than 360"
msgstr ""
#: diaphragm.c:267
#: diaphragm.c:229
msgid "Didn't find any holes in json file!"
msgstr ""
#. / "ïÛÉÂËÁ × ÉÎÉÃÉÁÌÉÚÁÃÉÉ CUDA!"
#: wrapper.c:99
#: wrapper.c:94
msgid "Error in CUDA initialisation!"
msgstr "ïÛÉÂËÁ × ÉÎÉÃÉÁÌÉÚÁÃÉÉ CUDA!"
#: mkHartmann.c:259
#: mkHartmann.c:163
#, c-format
msgid "Error reading data: read %d numbers instaed of %d"
msgid "Error reading data: read %d numbers instead of %d"
msgstr ""
#: diaphragm.c:112
#: diaphragm.c:98
msgid "Error: NULL instead of aHole structure!\n"
msgstr ""
#: mkHartmann.c:156
msgid "File modified in runtime?"
msgstr ""
#. / "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ GPU\n"
#: wrapper.c:74
#: wrapper.c:68
msgid "In computations will try to use GPU\n"
msgstr "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ GPU\n"
#: mkHartmann.c:254
msgid "Input file was modified in runtime!"
#. / "ãÅÌÏÅ ×ÎÅ ÄÏÐÕÓÔÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ"
#: parseargs.c:86
msgid "Integer out of range"
msgstr ""
#. nested arrays is error
#: diaphragm.c:68
msgid "Invalid file format! Found nested arrays!\n"
#: diaphragm.c:157
#, c-format
msgid "Invalid format for hole #%d!\n"
msgstr ""
#. non-numerical data?
#: diaphragm.c:74
msgid "Invalid file format! Non-numerical data in array!\n"
msgstr ""
#: diaphragm.c:178
msgid "Invalid holes array format!\n"
msgstr ""
#: diaphragm.c:251
#: diaphragm.c:209
msgid "JSON file MUST contain floating point field \"Z\" or \"maskz\" with "
"mask's coordinate"
msgstr ""
#. / "ðáíñôø: Ó×ÏÂÏÄÎÁÑ = "
#: wrapper.c:103
#: wrapper.c:98
#, c-format
msgid "MEMORY: free = "
msgstr "ðáíñôø: Ó×ÏÂÏÄÎÁÑ = "
#: mkHartmann.c:243
#: mkHartmann.c:148
msgid "Matrix must be square"
msgstr ""
#: diaphragm.c:219
#: usefull_macros.c:180
msgid "Mmap error for input"
msgstr ""
#: diaphragm.c:212
#: usefull_macros.c:173
msgid "No filename given!"
msgstr ""
#: mkHartmann.c:178
#: mkHartmann.c:79
msgid "No output filename given"
msgstr ""
#. / "ðÒÉÌÏÖÅÎÉÅ ÓËÏÍÐÉÌÉÒÏ×ÁÎÏ ÂÅÚ ÐÏÄÄÅÒÖËÉ CUDA"
#: wrapper.c:39 wrapper.c:48 wrapper.c:58
#: wrapper.c:41 wrapper.c:50 wrapper.c:60
msgid "Tool was compiled without CUDA support"
msgstr ""
#. / "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ CPU\n"
#: wrapper.c:112
#: wrapper.c:122
msgid "Will use only CPU in computations\n"
msgstr "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ CPU\n"
#: mkHartmann.c:229
#: diaphragm.c:104
msgid "Wrong \"shape\" value"
msgstr ""
#: diaphragm.c:200
msgid "Wrong JSON file"
msgstr ""
#. / "îÅÐÒÁ×ÉÌØÎÙÊ ÁÒÇÕÍÅÎÔ \"%s\" ÐÁÒÁÍÅÔÒÁ \"%s\""
#: parseargs.c:490
#, c-format
msgid "Wrong argument \"%s\" of parameter \"%s\""
msgstr ""
#: mkHartmann.c:134
msgid "Wrong file: should be matrix of float data separated by spaces"
msgstr ""
#: cmdlnopts.c:119
#: cmdlnopts.c:132
msgid "Wrong float number format!"
msgstr ""
#: cmdlnopts.c:294
#: cmdlnopts.c:307
#, c-format
msgid "Wrong format of image type: %c"
msgstr ""
#. wrong format
#: cmdlnopts.c:193
#: cmdlnopts.c:206
msgid "Wrong format: no value for keyword"
msgstr ""
#: diaphragm.c:44
#. amount of pcount and/or scount wrong
#. / "îÅÐÒÁ×ÉÌØÎÙÊ ÆÏÒÍÁÔ ÓÔÒÏËÉ ÐÏÍÏÝÉ"
#: parseargs.c:56
msgid "Wrong helpstring!"
msgstr ""
#: diaphragm.c:219
msgid "Wrong hole descriptor"
msgstr ""
#. / "îÅÐÒÁ×ÉÌØÎÙÊ ÐÁÒÁÍÅÔÒ: %s"
#: parseargs.c:480
#, c-format
msgid "Wrong parameter: %s"
msgstr ""
#: diaphragm.c:35
msgid "Wrong value! Get non-number!\n"
msgstr ""
#: cmdlnopts.c:95
#: cmdlnopts.c:102
msgid "add random noice to mirror surface deviations"
msgstr ""
#: cmdlnopts.c:93
msgid "amount of photons falled to one pixel of matrix by one iteration"
msgstr ""
#: cmdlnopts.c:96
msgid "amplitude of random noice (default: 1e-8)"
msgstr ""
#: cmdlnopts.c:97
msgid "filename for mirror surface deviations (in microns!)"
msgstr ""
#: cmdlnopts.c:102
msgid "image type, arg=[jfpt] (Jpeg, Fits, Png, Tiff)"
#: cmdlnopts.c:111
msgid "amount of iterations by N-photons"
msgstr ""
#: cmdlnopts.c:100
msgid "amount of photons falled to one pixel of matrix by one iteration"
msgstr ""
#: cmdlnopts.c:103
msgid "amplitude of random noice (default: 1e-8)"
msgstr ""
#: cmdlnopts.c:104
msgid "filename for mirror surface deviations (in microns!)"
msgstr ""
#: cmdlnopts.c:115
msgid "force CPU using iven if have videocard"
msgstr ""
#: cmdlnopts.c:109
msgid "image type, arg=[jfpt] (Jpeg, Fits, Png, Tiff)"
msgstr ""
#: cmdlnopts.c:110
msgid "name of JSON file with holes description"
msgstr ""
#: cmdlnopts.c:114
msgid "output image file name"
msgstr ""
#: cmdlnopts.c:107
msgid "print matrices on screen"
msgstr ""
#: cmdlnopts.c:92
#: cmdlnopts.c:99
msgid "resulting image size"
msgstr ""
#: cmdlnopts.c:98
#: cmdlnopts.c:105
msgid "rewrite output file if exists"
msgstr ""
#: cmdlnopts.c:101
#: cmdlnopts.c:108
msgid "save intermediate results to images"
msgstr ""
#: cmdlnopts.c:99
#: cmdlnopts.c:106
msgid "save matrices to file arg"
msgstr ""
#: cmdlnopts.c:77
#: cmdlnopts.c:84
msgid "set mirror parameters, arg=[diam=num:foc=num:Zincl=ang:Aincl=ang:"
"Ao=ang:Zo=ang:C=num]\n"
"Aobj=ang:Zoobj=ang:CCD=num]\n"
"\t\t\tALL DEGREES ARE IN FORMAT [+-][DDd][MMm][SS.S] like "
"-10m13.4 !\n"
"\t\tdiam - diameter of mirror\n"
@ -292,14 +376,14 @@ msgid "set mirror parameters, arg=[diam=num:foc=num:Zincl=ang:Aincl=ang:"
"\t\tccd - Z-coordinate of light receiver"
msgstr ""
#: cmdlnopts.c:89
#: cmdlnopts.c:96
msgid "show this help"
msgstr ""
#: cmdlnopts.c:90
#: cmdlnopts.c:97
msgid "size of initial array of surface deviations"
msgstr ""
#: cmdlnopts.c:91
#: cmdlnopts.c:98
msgid "size of interpolated array of surface deviations"
msgstr ""

View File

@ -3,299 +3,745 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-02 16:46+0400\n"
"PO-Revision-Date: 2013-01-14 18:49+0400\n"
"Last-Translator: Edward V. Emelianov <eddy@sao.ru>\n"
"POT-Creation-Date: 2015-05-05 10:39+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"
"Language: Russian\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=koi8-r\n"
"Content-Transfer-Encoding: 8bit\n"
"#-#-#-#-# ru.po (PACKAGE VERSION) #-#-#-#-#\n"
"#-#-#-#-# ruru.po (PACKAGE VERSION) #-#-#-#-#\n"
#. / "\n\n÷ÓÅ ÔÅÓÔÙ ÐÒÏÊÄÅÎÙ ÕÓÐÅÛÎÏ"
#: wrapper.c:123
#, fuzzy
#. "\tОпции:\n"
#: usage.c:128
#, c-format
msgid "\tOptions:\n"
msgstr "\tОпции:\n"
#. "Обнаружен работающий процесс (pid=%d), выход.\n"
#: takepic.c:222 takepic.c:234
#, c-format
msgid "\n"
"\n"
"All tests succeed"
"Found running process (pid=%d), exit.\n"
msgstr "\n"
"\n"
"÷ÓÅ ÔÅÓÔÙ ÐÒÏÊÄÅÎÙ ÕÓÐÅÛÎÏ\n"
"\n"
"Обнаружен работающий процесс (pid=%d), выход.\n"
#. / " ÓÕÍÍÁÒÎÁÑ = "
#: wrapper.c:106
#. "\nЗатвор "
#: takepic.c:409
#, c-format
msgid " total= "
msgstr " ÓÕÍÍÁÒÎÁÑ = "
msgid "\n"
"The shutter is "
msgstr "\n"
"Затвор "
#: diaphragm.c:95
msgid "\"bbox\" must contain an array of four doubles!\n"
msgstr ""
#: diaphragm.c:141
msgid "\"center\" must contain an array of two doubles!\n"
msgstr ""
#: diaphragm.c:130
msgid "\"radius\" array must consist of two doubles!\n"
msgstr ""
#: diaphragm.c:135
msgid "\"radius\" must be a number or an array of two doubles!\n"
msgstr ""
#. update old width counter
#. check it
#: mkHartmann.c:237
msgid "All rows must contain equal number of columns"
msgstr ""
#. / "ôÅÓÔ ×ÙÄÅÌÅÎÉÑ 100íâ ÐÁÍÑÔÉ ÐÒÏÊÄÅÎ ÕÓÐÅÛÎÏ\n"
#: wrapper.c:120
#. "%d секунд до окончания паузы\n"
#: takepic.c:658
#, c-format
msgid "Allocation test for 100MB of memory passed\n"
msgstr "ôÅÓÔ ×ÙÄÅÌÅÎÉÑ 100íâ ÐÁÍÑÔÉ ÐÒÏÊÄÅÎ ÕÓÐÅÛÎÏ\n"
msgid "%d seconds till pause ends\n"
msgstr "%d секунд до окончания паузы\n"
#. nothing found - wrong format
#: cmdlnopts.c:213
msgid "Bad keyword!"
msgstr ""
#. "Не введено никаких параметров"
#: usage.c:311
msgid "Any parameters are absent"
msgstr "Не введено никаких параметров"
#. / "ïÛÉÂËÁ ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ"
#: wrapper.c:83
msgid "Can't allocate memory"
msgstr "ïÛÉÂËÁ ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ"
#. / "îÅ ÍÏÇÕ ÐÏÓÔÒÏÉÔØ ÍÁÔÒÉÃÕ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ"
#: mkHartmann.c:317
msgid "Can't build random matrix"
msgstr ""
#: mkHartmann.c:199
#. "Поле изображения: (0, %d)(0, %d)"
#: takepic.c:442
#, c-format
msgid "Can't close file %s"
msgstr ""
msgid "Array field: (0, %d)(0, %d)"
msgstr "Поле изображения: (0, %d)(0, %d)"
#: diaphragm.c:220
#: macros.c:183
msgid "Can't close mmap'ed file"
msgstr ""
msgstr "Не могу закрыть mmap'нутый файл"
#. / "ïÛÉÂËÁ ÏÐÒÅÄÅÌÅÎÉÑ ÄÏÓÔÕÐÎÏÊ ÐÁÍÑÔÉ"
#: wrapper.c:81
msgid "Can't determine free memory"
msgstr "ïÛÉÂËÁ ÏÐÒÅÄÅÌÅÎÉÑ ÄÏÓÔÕÐÎÏÊ ÐÁÍÑÔÉ"
#. "Не могу удалить PID-файл"
#: takepic.c:136
msgid "Can't delete PIDfile"
msgstr "Не могу удалить PID-файл"
#. / "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#: wrapper.c:79
msgid "Can't get properties"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#. "Не могу переместить турель"
#: takepic.c:268
msgid "Can't move turret"
msgstr "Не могу переместить турель"
#. / "îÅ ÍÏÇÕ ÏÔËÒÙÔØ"
#: wrapper.c:154
#, fuzzy
msgid "Can't open"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#: macros.c:192
msgid "Can't munmap"
msgstr "Не могу вызывать munmap"
#: diaphragm.c:214
#: macros.c:177
#, c-format
msgid "Can't open %s for reading"
msgstr ""
msgstr "Не могу открыть %s для чтения"
#: mkHartmann.c:185
#, fuzzy, c-format
msgid "Can't open file %s"
msgstr "ïÛÉÂËÁ ÐÏÌÕÞÅÎÉÑ Ó×ÏÊÓÔ× ×ÉÄÅÏÑÄÒÁ"
#. "Не могу открыть окно OpenGL, просмотр будет недоступен!"
#: takepic.c:631
msgid "Can't open OpenGL window, image preview will be inaccessible"
msgstr "Не могу открыть окно OpenGL, просмотр будет недоступен!"
#. / "îÅ ÍÏÇÕ ÐÒÏÞÅÓÔØ"
#: wrapper.c:159
msgid "Can't read"
msgstr ""
#. "Не могу открыть камеру, завершаю"
#: takepic.c:347
msgid "Can't open camera device, exit"
msgstr "Не могу открыть камеру, завершаю"
#. file not exist but some error occured
#: mkHartmann.c:172 diaphragm.c:216
#. "Не могу открыть файл устройства %s: %s"
#: takepic.c:116
#, c-format
msgid "Can't open device file %s: %s"
msgstr "Не могу открыть файл устройства %s: %s"
#. "Не могу открыть файл журнала статистики"
#: takepic.c:400
msgid "Can't open statistics log file"
msgstr "Не могу открыть журнал статистики"
#. "Не могу открыть файл журнала температур"
#: takepic.c:386
msgid "Can't open temperature log file"
msgstr "Не могу открыть журнал температур"
#. "Не могу открыть турель"
#: takepic.c:251
msgid "Can't open turret"
msgstr "Не могу открыть турель"
#. "Не могу сохранить файл"
#: takepic.c:618
msgid "Can't save file"
msgstr "Не могу сохранить файл"
#: macros.c:179
#, c-format
msgid "Can't stat %s"
msgstr ""
msgstr "Не могу выполнить stat для %s"
#: mkHartmann.c:168
#. "Захват кадра %d, время экспозиции - %g секунд\n"
#: takepic.c:546
#, c-format
msgid "Can't write to %s"
msgstr ""
msgid "Capture frame %d, exp time - %g sec\n"
msgstr "Захват кадра %d, время экспозиции - %g секунд\n"
#: diaphragm.c:256
msgid "Corrupted file: no holes found!"
msgstr ""
#. "Изменение температуры холодильника"
#: takepic.c:428
msgid "Changing of cooler setpoint"
msgstr "Изменение температуры холодильника"
#: cmdlnopts.c:147
msgid "Degrees should be less than 360"
msgstr ""
#. "Холодильник отключен"
#: camtools.c:137
msgid "Cooler is off"
msgstr "Холодильник отключен"
#: diaphragm.c:267
msgid "Didn't find any holes in json file!"
msgstr ""
#. / "ïÛÉÂËÁ × ÉÎÉÃÉÁÌÉÚÁÃÉÉ CUDA!"
#: wrapper.c:99
msgid "Error in CUDA initialisation!"
msgstr "ïÛÉÂËÁ × ÉÎÉÃÉÁÌÉÚÁÃÉÉ CUDA!"
#: mkHartmann.c:259
#. "Целевая температура: %g\n"
#: camtools.c:132
#, c-format
msgid "Error reading data: read %d numbers instaed of %d"
msgstr ""
msgid "Cooler setpoint: %g\n"
msgstr "Целевая температура: %g\n"
#: diaphragm.c:112
msgid "Error: NULL instead of aHole structure!\n"
msgstr ""
#. "Съемка темновых"
#: usage.c:335
msgid "Dark frames"
msgstr "Съемка темновых"
#. / "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ GPU\n"
#: wrapper.c:74
msgid "In computations will try to use GPU\n"
msgstr "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ GPU\n"
#. "Устройство не найдено"
#: takepic.c:108
msgid "Device not found"
msgstr "Устройство не найдено"
#: mkHartmann.c:254
msgid "Input file was modified in runtime!"
msgstr ""
#. "Отобразить на экране полученное изображение"
#: usage.c:140
msgid "Display last image"
msgstr "Отобразить на экране полученное изображение"
#. nested arrays is error
#: diaphragm.c:68
msgid "Invalid file format! Found nested arrays!\n"
msgstr ""
#. "не засвечивать матрицу перед экспозицией"
#: usage.c:143
msgid "Don't flash CCD chip before expose"
msgstr "не засвечивать матрицу перед экспозицией"
#. non-numerical data?
#: diaphragm.c:74
msgid "Invalid file format! Non-numerical data in array!\n"
msgstr ""
#. "Не могу вызывать ioctl"
#: takepic.c:123
msgid "Error in ioctl"
msgstr "Не могу вызывать ioctl"
#: diaphragm.c:178
msgid "Invalid holes array format!\n"
msgstr ""
#. "Ошибка перехода в спящий режим!"
#: takepic.c:372
msgid "Error: sleepless night!"
msgstr "Ошибка перехода в спящий режим!"
#: diaphragm.c:251
msgid "JSON file MUST contain floating point field \"Z\" or \"maskz\" with "
"mask's coordinate"
msgstr ""
#. "Не заданы параметры экспозиции, отключаюсь"
#: takepic.c:339
msgid "Expose parameters aren't specified, exit"
msgstr "Не заданы параметры экспозиции, отключаюсь"
#. / "ðáíñôø: Ó×ÏÂÏÄÎÁÑ = "
#: wrapper.c:103
#. "Время экспозиции: %dмс"
#: usage.c:517
#, c-format
msgid "MEMORY: free = "
msgstr "ðáíñôø: Ó×ÏÂÏÄÎÁÑ = "
msgid "Exposure time: %dms"
msgstr "Время экспозиции: %dмс"
#: mkHartmann.c:243
msgid "Matrix must be square"
msgstr ""
#. "Скорость вентилятора должна быть в пределе 0..3"
#: usage.c:354
msgid "Fan speed should be in interval 0..3"
msgstr "Скорость вентилятора должна быть в пределе 0..3"
#: diaphragm.c:219
#. "Установить скорость вращения вентиляторов в %d"
#: usage.c:356
#, c-format
msgid "Fan speed would be set to %d"
msgstr "Установить скорость вращения вентиляторов в %d"
#. "Видимое поле: %s"
#: takepic.c:440
#, c-format
msgid "Field of view: %s"
msgstr "Видимое поле: %s"
#. "Файл записан в '%s'"
#: takepic.c:622
#, c-format
msgid "File saved as '%s'"
msgstr "Файл записан в '%s'"
#. "Обнаружена камера '%s' с датчиком '%s'"
#: takepic.c:354
#, c-format
msgid "Find camera '%s' with sensor '%s'"
msgstr "Обнаружена камера '%s' с датчиком '%s'"
#. Полное журналирование статистики
#: usage.c:400
msgid "Full statistics logging"
msgstr "Полное журналирование статистики"
#. "Получен сигнал %d, отключаюсь.\n"
#: takepic.c:133
#, c-format
msgid "Get signal %d, quit.\n"
msgstr "Получен сигнал %d, отключаюсь.\n"
#. "Получить информацию о турели"
#: usage.c:362
msgid "Get turret's info"
msgstr "Получить информацию о турели"
#. "Установка заданной температуры"
#: camtools.c:140
msgid "Go to setpoint"
msgstr "Установка заданной температуры"
#. "Спящий режим"
#: usage.c:465
msgid "Go to sleep"
msgstr "Спящий режим"
#. "Гор. биннинг: %d"
#: usage.c:385
#, c-format
msgid "Horisontal binning: %d"
msgstr "Гор. биннинг: %d"
#. "Игнорирую аргумент[ы]:\n"
#: usage.c:545
#, c-format
msgid "Ignore argument[s]:\n"
msgstr "Игнорирую аргумент[ы]:\n"
#. "Статистика по изображению:\n"
#: camtools.c:170
#, c-format
msgid "Image stat:\n"
msgstr "Статистика по изображению\n"
#. "Тип изображения - %s"
#: usage.c:390
#, c-format
msgid "Image type - %s"
msgstr "Тип изображения - %s"
#. "Название прибора - %s"
#: usage.c:395
#, c-format
msgid "Instrument name - %s"
msgstr "Название прибора - %s"
#. "Поддержание заданной температуры"
#: camtools.c:143
msgid "Keeping setpoint"
msgstr "Поддержание заданной температуры"
#: macros.c:182
msgid "Mmap error for input"
msgstr ""
msgstr "Ошибка mmap для входных данных"
#: diaphragm.c:212
msgid "No filename given!"
msgstr ""
#: mkHartmann.c:178
msgid "No output filename given"
msgstr ""
#. / "ðÒÉÌÏÖÅÎÉÅ ÓËÏÍÐÉÌÉÒÏ×ÁÎÏ ÂÅÚ ÐÏÄÄÅÒÖËÉ CUDA"
#: wrapper.c:39 wrapper.c:48 wrapper.c:58
msgid "Tool was compiled without CUDA support"
msgstr ""
#. / "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ CPU\n"
#: wrapper.c:112
msgid "Will use only CPU in computations\n"
msgstr "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ CPU\n"
#: mkHartmann.c:229
msgid "Wrong file: should be matrix of float data separated by spaces"
msgstr ""
#: cmdlnopts.c:119
msgid "Wrong float number format!"
msgstr ""
#: cmdlnopts.c:294
#. "Переместить турель в позицию %d"
#: usage.c:370
#, c-format
msgid "Wrong format of image type: %c"
msgstr ""
msgid "Move turret into %d"
msgstr "Переместить турель в позицию %d"
#. wrong format
#: cmdlnopts.c:193
msgid "Wrong format: no value for keyword"
msgstr ""
#: macros.c:175
msgid "No filename given!"
msgstr "Не указано имя файла!"
#: diaphragm.c:44
msgid "Wrong value! Get non-number!\n"
msgstr ""
#. "Не засвечивать камеру до экспозиции"
#: usage.c:349
msgid "No pre-expose flash"
msgstr "Не засвечивать камеру до экспозиции"
#: cmdlnopts.c:95
msgid "add random noice to mirror surface deviations"
msgstr ""
#. "Имя объекта - %s"
#: usage.c:428
#, c-format
msgid "Object name - %s"
msgstr "Имя объекта - %s"
#: cmdlnopts.c:93
msgid "amount of photons falled to one pixel of matrix by one iteration"
msgstr ""
#. "Наблюдатели: %s"
#: usage.c:433
#, c-format
msgid "Observers: %s"
msgstr "Наблюдатели: %s"
#: cmdlnopts.c:96
msgid "amplitude of random noice (default: 1e-8)"
msgstr ""
#. "Работать с камерой номер %d"
#: usage.c:415
#, c-format
msgid "Open camera number %d"
msgstr "Работать с камерой номер %d"
#: cmdlnopts.c:97
msgid "filename for mirror surface deviations (in microns!)"
msgstr ""
#. "Пауза: %dс"
#: usage.c:446
#, c-format
msgid "Pause: %ds"
msgstr "Пауза: %dс"
#: cmdlnopts.c:102
msgid "image type, arg=[jfpt] (Jpeg, Fits, Png, Tiff)"
msgstr ""
#. "Номер позиции должен быть больше 0"
#: usage.c:368
msgid "Position number should be positive value"
msgstr "Номер позиции должен быть больше 0"
#: cmdlnopts.c:100
msgid "print matrices on screen"
msgstr ""
#. pre-expose
#. "Предварительная экспозиция"
#: takepic.c:466
msgid "Pre-expose"
msgstr "Предварительная экспозиция"
#: cmdlnopts.c:92
msgid "resulting image size"
msgstr ""
#. "Нажмите Ctrl+C еще %d раз[а], чтобы прервать считывание\n"
#: takepic.c:154
#, c-format
msgid "Press Ctrl+C %d time[s] more to interrupt reading\n"
msgstr "Нажмите Ctrl+C еще %d раз[а], чтобы прервать считывание\n"
#: cmdlnopts.c:98
msgid "rewrite output file if exists"
msgstr ""
#. "Автор программы: %s"
#: usage.c:323
#, c-format
msgid "Program author: %s"
msgstr "Автор программы: %s"
#: cmdlnopts.c:101
msgid "save intermediate results to images"
msgstr ""
#. "Название программы: %s"
#: usage.c:438
#, c-format
msgid "Program name: %s"
msgstr "Название программы: %s"
#: cmdlnopts.c:99
msgid "save matrices to file arg"
msgstr ""
#. "Считывание изображения:"
#: takepic.c:575
#, c-format
msgid "Read image: "
msgstr "Считывание изображения: "
#: cmdlnopts.c:77
msgid "set mirror parameters, arg=[diam=num:foc=num:Zincl=ang:Aincl=ang:"
"Ao=ang:Zo=ang:C=num]\n"
"\t\t\tALL DEGREES ARE IN FORMAT [+-][DDd][MMm][SS.S] like "
"-10m13.4 !\n"
"\t\tdiam - diameter of mirror\n"
"\t\tfoc - mirror focus ratio\n"
"\t\tZincl - inclination from Z axe\n"
"\t\tAincl - azimuth of inclination\n"
"\t\tAobj - azimuth of object\n"
"\t\tZobj - zenith of object\n"
"\t\tccd - Z-coordinate of light receiver"
msgstr ""
#. "Ошибка считывания: %s\n"
#: takepic.c:490 takepic.c:581
#, c-format
msgid "Readout error: %s\n"
msgstr "Ошибка считывания: %s\n"
#: cmdlnopts.c:89
msgid "show this help"
msgstr ""
#. "Скорость считывания - беззнаковое целое!"
#: usage.c:451
msgid "Readout speed should be unsigned int!"
msgstr "Скорость считывания - беззнаковое целое!"
#: cmdlnopts.c:90
msgid "size of initial array of surface deviations"
msgstr ""
#. "Требуемая позиция больше максимальной"
#: takepic.c:263
msgid "Required position greater then max"
msgstr "ребуемая позиция больше максимальной"
#: cmdlnopts.c:91
msgid "size of interpolated array of surface deviations"
msgstr ""
#. "Полный сброс"
#: usage.c:459
msgid "Reset"
msgstr "Полный сброс"
#. "Сохранение журнала температур"
#: usage.c:406
msgid "Save temperature log"
msgstr "Сохранение журнала температур"
#. "Серия из %d кадров"
#: usage.c:423
#, c-format
msgid "Series of %d frames"
msgstr "Серия из %d кадров"
#. "отключить холодильник"
#: usage.c:134 usage.c:329
msgid "Set cooler off"
msgstr "отключить холодильник"
#. "Устанавливаю скорость вращения вентиляторов в %d\n"
#: camtools.c:119
#, c-format
msgid "Set fan speed %d\n"
msgstr "Устанавливаю скорость вращения вентиляторов в %d\n"
#. "Установить скорость вентиляторов в F (0..3)"
#: usage.c:146
msgid "Set fan speed to F (0..3)"
msgstr "Установить скорость вентиляторов в F (0..3)"
#. "Установить интервал логгирования в %d секунд"
#: usage.c:377
#, c-format
msgid "Set logging interval to %d seconds"
msgstr "Установить интервал логгирования в %d секунд"
#. "Установить температуру: %.3f"
#: usage.c:486
#, c-format
msgid "Set temperature: %.3f"
msgstr "Установить температуру: %.3f"
#. "Отключение холодильника"
#: takepic.c:422
msgid "Switch cooler off"
msgstr "Отключение холодильника"
#. "Температура ниже допустимой"
#: takepic.c:431
msgid "The temperature setpoint is too low"
msgstr "Температура ниже допустимой"
#. "Максимальная (MAX) и текущая (CUR) позиции турели:\n"
#: takepic.c:258
#, c-format
msgid "Turret MAXimum position and CURrent position:\n"
msgstr "Максимальная (MAX) и текущая (CUR) позиции турели:\n"
#. "Номер турели должен быть больше 0"
#: usage.c:500
msgid "Turret number should be positive value"
msgstr "Номер турели должен быть больше 0"
#. "Статус неизвестен"
#: camtools.c:146
msgid "Unknown status"
msgstr "Хрен знает что"
#. "Использование:\t%s [опции] [префикс выходных файлов]\n"
#: usage.c:125
#, c-format
msgid "Usage:\t%s [options] [output files prefix]\n"
msgstr "Использование:\t%s [опции] [префикс выходных файлов]\n"
#. "Значение time-interval должно быть натуральным числом"
#: usage.c:375
msgid "Value of time-interval must be non-zero positive"
msgstr "Значение time-interval должно быть натуральным числом"
#. "Верт. биннинг: %d"
#: usage.c:494
#, c-format
msgid "Vertical binning: %d"
msgstr "Верт. биннинг: %d"
#. "Подождите завершения перемещения турели "
#: takepic.c:273
#, c-format
msgid "Wait, while turret is moving "
msgstr "Подождите завершения перемещения турели "
#. "Активировать камеру"
#: usage.c:508
msgid "Wakeup camera"
msgstr "Активировать камеру"
#. "Отображение снятых кадров"
#: usage.c:341
msgid "Will show images"
msgstr "Отображение снятых кадров"
#. "Работать с турелью %d"
#: usage.c:502
#, c-format
msgid "Work with turret %d"
msgstr "Работать с турелью %d"
#. "Неверный"
#: usage.c:382 usage.c:491
msgid "Wrong"
msgstr "Неверный"
#. "Неверный номер камеры: %s"
#: usage.c:412
#, c-format
msgid "Wrong camera number: %s"
msgstr "Неверный номер камеры: %s"
#. "Неверное время экспозиции: %s"
#: usage.c:514
#, c-format
msgid "Wrong exposure time: %s"
msgstr "Неверное время экспозиции: %s"
#. "Неверное кол-во кадров: %s"
#: usage.c:420
#, c-format
msgid "Wrong frames number in series: %s"
msgstr "Неверное кол-во кадров: %s"
#. "Неверная нижняя граница: %s"
#: usage.c:104
#, c-format
msgid "Wrong lower border: %s"
msgstr "Неверная нижняя граница: %s"
#. "Неверная пауза: %s"
#: usage.c:443
#, c-format
msgid "Wrong pause length: %s"
msgstr "Неверная пауза: %s"
#. "Неверное значение температуры: %s (должно быть от -35 до 30)"
#: usage.c:482
#, c-format
msgid "Wrong temperature: %s (must be from -35 to 30)"
msgstr "Неверное значение температуры: %s (должно быть от -35 до 30)"
#. "Неверная верхняя граница: %s"
#: usage.c:109
#, c-format
msgid "Wrong upper border: %s"
msgstr "Неверная верхняя граница: %s"
#. "Диапазон по X: [%d, %d]"
#: usage.c:522
#, c-format
msgid "X range: [%d, %d]"
msgstr "Диапазон по X: [%d, %d]"
#. "Диапазон по Y: [%d, %d]"
#: usage.c:527
#, c-format
msgid "Y range: [%d, %d]"
msgstr "Диапазон по Y: [%d, %d]"
#. -255. - there's no thermometer on hot side
#. "В вашем светоприемнике нет \"горячего\" термометра"
#: camtools.c:105
msgid "Your camera have no hot temperature sensor\n"
msgstr "В вашем светоприемнике нет \"горячего\" термометра\n"
#. "заткрыть затвор"
#: usage.c:243
msgid "close shutter"
msgstr "заткрыть затвор"
#. "закрыт\n"
#: takepic.c:415
#, c-format
msgid "closed\n"
msgstr "закрыт\n"
#. "не очищать матрицу после считывания"
#: usage.c:234
msgid "don't flush ccd after expose"
msgstr "не очищать матрицу после считывания"
#. "не открывать устройство, лишь отобразить шапку FITS"
#: usage.c:246
msgid "don't open camera device, just show FITS header"
msgstr "не открывать устройство, лишь отобразить шапку FITS"
#. "не сохранять изображения, лишь вести запись статистки"
#: usage.c:167
msgid "don't save images, only make all-stat log"
msgstr "не сохранять изображения, лишь вести запись статистки"
#. "отразить изображение горизонтально (относительно оси Y)"
#: usage.c:231
msgid "flip image horizontally (around Y axe)"
msgstr "отразить изображение горизонтально (относительно оси Y)"
#. "отразить изображение вертикально (относительно оси X)"
#: usage.c:228
msgid "flip image vertically (around X axe)"
msgstr "отразить изображение вертикально (относительно оси X)"
#. "Полный сброс"
#: usage.c:194
msgid "full reset"
msgstr "Полный сброс"
#. получить сведения о турели
#: usage.c:149
msgid "get turret's parameters"
msgstr "получить сведения о турели"
#. "перейти в спящий режим"
#: usage.c:197
msgid "go to sleeping mode"
msgstr "перейти в спящий режим"
#. "биннинг N пикселей по горизонтали"
#: usage.c:158
msgid "horizontal binning to N pixels"
msgstr "биннинг N пикселей по горизонтали"
#. "тип изображения"
#: usage.c:161
msgid "image type"
msgstr "тип изображения"
#. "название прибора"
#: usage.c:164
msgid "instrument name"
msgstr "название прибора"
#. "выполнить предварительную нулевую экспозицию для очистки матрицы"
#: usage.c:237
msgid "make a preliminary zero exposition for cleaning CCD"
msgstr "выполнить предварительную нулевую экспозицию для очистки матрицы"
#. "выдержать ptime секунд между экспозициями"
#: usage.c:188
msgid "make pause for ptime seconds between expositions"
msgstr "выдержать ptime секунд между экспозициями"
#. "N кадров в серии"
#: usage.c:176
msgid "make series of N frames"
msgstr "N кадров в серии"
#. "вести запись рабочих температур в файл temp_log"
#: usage.c:170
msgid "make temperatures logging to file temp_log"
msgstr "вести запись рабочих температур в файл temp_log"
#. "Ошибка выделения памяти!"
#: takepic.c:480 takepic.c:509
msgid "malloc() failed!"
msgstr "Ошибка выделения памяти!"
#. "не открывать затвор при экспозиции (\"темновые\")"
#: usage.c:137
msgid "not open shutter when exposing (\"dark frames\")"
msgstr "не открывать затвор при экспозиции (\"темновые\")"
#. "не сохранять изображение, а только отобразить статистику"
#: usage.c:200
msgid "not save image, just show statistics"
msgstr "не сохранять изображение, а только отобразить статистику"
#. "название объекта"
#: usage.c:179
msgid "object name"
msgstr "название объекта"
#. "имена наблюдателей"
#: usage.c:182
msgid "observers' names"
msgstr "имена наблюдателей"
#. "название программы наблюдений"
#: usage.c:185
msgid "observing program name"
msgstr "название программы наблюдений"
#. "только задать/получить температуру"
#. "только отобразить/задать температуру"
#: usage.c:203 usage.c:475
msgid "only set/get temperature"
msgstr "только задать/получить температуру"
#. "открыт\n"
#: takepic.c:412
#, c-format
msgid "open\n"
msgstr "открыт\n"
#. "открыть затвор"
#: usage.c:240
msgid "open shutter"
msgstr "открыть затвор"
#. "автор программы"
#: usage.c:131
msgid "program author"
msgstr "автор программы"
#. "возобновить питание"
#: usage.c:215
msgid "resume system"
msgstr "возобновить питание"
#. "выбрать диапазон для считывания"
#: usage.c:221 usage.c:224
msgid "select clip region"
msgstr "выбрать диапазон для считывания"
#. "время экспозиции exptime мс"
#: usage.c:218
msgid "set exposure time to exptime ms"
msgstr "время экспозиции exptime мс"
#. "установить скорость считывания в N"
#: usage.c:191
msgid "set readout speed to N"
msgstr "установить скорость считывания в N"
#. переместить турель в N-ю позицию
#: usage.c:152
msgid "set turret to Nth position"
msgstr "переместить турель в N-ю позицию"
#. установить номер турели в N
#: usage.c:212
msgid "set turret's number to N"
msgstr "установить номер турели в N"
#. "задать рабочую температуру degr градусов"
#: usage.c:206
msgid "set work temperature to degr C"
msgstr "задать рабочую температуру degr градусов"
#. "интервал времени между последовательными записями в лог и HISTORY (в секундах)"
#: usage.c:155
msgid "time interval between sequential writings to log & HISTORY (in "
"seconds)"
msgstr "интервал времени между последовательными записями в лог и HISTORY (в "
"секундах)"
#. "биннинг N пикселей по вертикали"
#: usage.c:209
msgid "vertical binning to N pixels"
msgstr "биннинг N пикселей по вертикали"
#. "работать в 12-битном режиме"
#: usage.c:249
msgid "work in a 12-bit ADC mode"
msgstr "работать в 12-битном режиме"
#. "работать с N-й камерой"
#: usage.c:173
msgid "work with Nth camera"
msgstr "работать с N-й камерой"
msgid "Can't init mutex!"
msgstr "Не могу инициировать взаимное исключение!"
msgid "Error removing from list"
msgstr "Ошибка удаления из списка"
msgid "can't cancel a thread!"
msgstr "Не могу отменить выполнение потока!"

View File

@ -26,116 +26,17 @@
#include "wrapper.h"
#include "saveimg.h"
#include "diaphragm.h"
#include "usefull_macros.h"
/*
* Coloured messages output
*/
#define RED "\033[1;31;40m"
#define GREEN "\033[1;32;40m"
#define OLDCOLOR "\033[0;0;0m"
int globErr = 0; // errno for WARN/ERR
// pointers to coloured output printf
int (*red)(const char *fmt, ...);
int (*green)(const char *fmt, ...);
int (*_WARN)(const char *fmt, ...);
/*
* format red / green messages
* name: r_pr_, g_pr_
* @param fmt ... - printf-like format
* @return number of printed symbols
*/
int r_pr_(const char *fmt, ...){
va_list ar; int i;
printf(RED);
va_start(ar, fmt);
i = vprintf(fmt, ar);
va_end(ar);
printf(OLDCOLOR);
return i;
}
int g_pr_(const char *fmt, ...){
va_list ar; int i;
printf(GREEN);
va_start(ar, fmt);
i = vprintf(fmt, ar);
va_end(ar);
printf(OLDCOLOR);
return i;
}
/*
* print red error/warning messages (if output is a tty)
* @param fmt ... - printf-like format
* @return number of printed symbols
*/
int r_WARN(const char *fmt, ...){
va_list ar; int i = 1;
fprintf(stderr, RED);
va_start(ar, fmt);
if(globErr){
errno = globErr;
vwarn(fmt, ar);
errno = 0;
globErr = 0;
}else
i = vfprintf(stderr, fmt, ar);
va_end(ar);
i++;
fprintf(stderr, OLDCOLOR "\n");
return i;
}
const char stars[] = "****************************************";
/*
* notty variants of coloured printf
* name: s_WARN, r_pr_notty
* @param fmt ... - printf-like format
* @return number of printed symbols
*/
int s_WARN(const char *fmt, ...){
va_list ar; int i;
i = fprintf(stderr, "\n%s\n", stars);
va_start(ar, fmt);
if(globErr){
errno = globErr;
vwarn(fmt, ar);
errno = 0;
globErr = 0;
}else
i = +vfprintf(stderr, fmt, ar);
va_end(ar);
i += fprintf(stderr, "\n%s\n", stars);
i += fprintf(stderr, "\n");
return i;
}
int r_pr_notty(const char *fmt, ...){
va_list ar; int i;
i = printf("\n%s\n", stars);
va_start(ar, fmt);
i += vprintf(fmt, ar);
va_end(ar);
i += printf("\n%s\n", stars);
return i;
}
/*
* safe memory allocation for macro ALLOC
* @param N - number of elements to allocate
* @param S - size of single element (typically sizeof)
* @return pointer to allocated memory area
*/
void *my_alloc(size_t N, size_t S){
void *p = calloc(N, S);
if(!p) ERR("malloc");
//assert(p);
return p;
}
char *outpfile = NULL; // filename for data output in octave text format
int printDebug = 0; // print tab
bool firstRun = TRUE; // first run: create new file
int forceCPU = 0;
void signals(int sig){exit (sig);}
/**
* Print tabular on screen (if outpfile == NULL) or to outpfile
* in octave text format
@ -190,7 +91,9 @@ void printTAB(size_t W, size_t H, float *data, char *mask, char *comment){
// now put out matrix itself (upside down - for octave/matlab)
for(y = 0; y < H; y++){
for(x = 0; x < W; x++){
PR(" %g", *data++);
//PR(" %g", *data++);
float d = data[H*(H-y-1) + x];
PR(" %g", d);
}
PR("\n");
}
@ -212,7 +115,8 @@ float *read_deviations(char *filename, size_t *Size){
float *ret = NULL;
int W = 0, W0 = 0, H0 = 0, i;
size_t Mlen;
char *Mem = NULL, *endptr, *ptr;
mmapbuf *map;
char *endptr, *ptr, *dstart;
if(!filename){
assert(Size);
ret = MALLOC(float, (*Size) * (*Size)); // allocate matrix with given size
@ -220,15 +124,16 @@ float *read_deviations(char *filename, size_t *Size){
return ret;
}
// there was filename given: try to read data from it
Mem = My_mmap(filename, &Mlen); // from diaphragm.c
ptr = Mem;
map = My_mmap(filename);
ptr = dstart = map->data;
Mlen = map->len;
do{
errno = 0;
strtof(ptr, &endptr);
if(errno || (endptr == ptr && *ptr))
ERRX(_("Wrong file: should be matrix of float data separated by spaces"));
ERR(_("Wrong file: should be matrix of float data separated by spaces"));
W++;
if(endptr >= Mem + Mlen) break; // eptr out of range - EOF?
if(endptr >= dstart + Mlen) break; // eptr out of range - EOF?
if(*endptr == '\n'){
H0++;
ptr = endptr + 1;
@ -237,27 +142,26 @@ float *read_deviations(char *filename, size_t *Size){
ERRX(_("All rows must contain equal number of columns"));
W = 0;
}else ptr = endptr;
}while(endptr && endptr < Mem + Mlen);
}while(endptr && endptr < dstart + Mlen);
if(W > 1) H0++; // increase number of rows if there's no trailing '\n' in last line
if(W0 != H0)
ERRX(_("Matrix must be square"));
*Size = W0;
DBG("here");
ret = MALLOC(float, W0*W0);
DBG("there");
ptr = Mem;
ptr = dstart;
for(i = 0, H0 = 0; H0 < W0; H0++)
for(W = 0; W < W0; W++, i++){
DBG("%d ", i);
ret[W0*(W0-H0-1) + W] = strtof(ptr, &endptr) * 1e-6;
if(errno || (endptr == ptr && *ptr) || endptr >= Mem + Mlen)
ERRX(_("Input file was modified in runtime!"));
if(errno || (endptr == ptr && *ptr))
ERR(_("File modified in runtime?"));
if(endptr > dstart + Mlen) goto ex_for;
ptr = endptr;
}
ex_for:
W0 *= W0;
if(i != W0)
ERRX(_("Error reading data: read %d numbers instaed of %d"), W-1, W0);
munmap(Mem, Mlen);
ERRX(_("Error reading data: read %d numbers instead of %d"), i, W0);
My_munmap(map);
return ret;
}
@ -279,21 +183,10 @@ int main(int argc, char **argv){
glob_pars *G = NULL; // default parameters see in cmdlnopts.c
mirPar *M = NULL; // default mirror parameters
int x, y _U_;
// setup coloured output
if(isatty(STDOUT_FILENO)){ // make color output in tty
red = r_pr_; green = g_pr_;
}else{ // no colors in case of pipe
red = r_pr_notty; green = printf;
}
if(isatty(STDERR_FILENO)) _WARN = r_WARN;
else _WARN = s_WARN;
// Setup locale
setlocale(LC_ALL, "");
setlocale(LC_NUMERIC, "C");
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
textdomain(GETTEXT_PACKAGE);
G = parce_args(argc, argv);
initial_setup();
G = parse_args(argc, argv);
M = G->Mirror;
if(forceCPU) noCUDA();
// Run simple initialisation of CUDA and/or memory test
getprops();
size_t S0 = G->S_dev, S1 = G->S_interp, Sim = G->S_image, N_phot = G->N_phot;
@ -310,10 +203,15 @@ int main(int argc, char **argv){
ALLOC(float, mirZ, masksize); // mirror Z coordinate
ALLOC(float, mirDX, masksize); // projections of normale to mirror
ALLOC(float, mirDY, masksize);
if(G->randMask || G->randAmp != Gdefault.randAmp){ // add random numbers to mask
if(!fillrandarr(S0*S0, idata, G->randAmp))
if(G->randMask || G->randAmp > 0.){ // add random numbers to mask
size_t Ss = S0*S0;
ALLOC(float, tmpf, Ss);
if(!fillrandarr(Ss, tmpf, G->randAmp))
/// "îÅ ÍÏÇÕ ÐÏÓÔÒÏÉÔØ ÍÁÔÒÉÃÕ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ"
ERR(_("Can't build random matrix"));
OMP_FOR()
for(x = 0; x < Ss; x++) idata[x] += tmpf[x];
FREE(tmpf);
}
// initialize structure of mirror deviations
mirDeviations mD;
@ -332,9 +230,9 @@ int main(int argc, char **argv){
{{-0.1,-0.45,0.6,0.6}, H_ELLIPSE}}; */
// Hartmann mask
Diaphragm dia; //{{-0.5, -0.5, 1., 1.}, NULL, 0, 20., NULL};
Diaphragm dia = {{-0.5, -0.5, 1., 1.}, NULL, 0, 20., NULL};
mirMask *mask;
readHoles("holes.json", &dia);
if(G->holes_filename) readHoles(G->holes_filename, &dia);
#ifdef EBUG
green("Dia: ");
printf("(%g, %g, %g, %g); %d holes, Z = %g\n", dia.box.x0, dia.box.y0,
@ -347,100 +245,29 @@ int main(int argc, char **argv){
float *dm = MALLOC(float, S2);
for(x=0; x<S2; x++) dm[x] = (float)dia.mask->data[x];
writeimg("mirror_mask", imt, S, S, NULL, M, dm);
free(dm);
FREE(dm);
}
// coordinates of photons
ALLOC(float, xout, N_phot);
ALLOC(float, yout, N_phot);
// resulting image
ALLOC(float, image, Sim*Sim);
/*
//for(int i = 0; i < 100; i++){
box.x0 = -3.; box.y0 = -3.; box.w = 6.; box.h = 6.;
if(!getPhotonXY(xout, yout, 1, &mD, M, N_phot, &box))
ERR("Can't build photon map");
box.x0 = -15e-3; box.y0 = -15e-3; box.w = 30e-3; box.h = 30e-3;
//box.x0 = -5e-3; box.y0 = .8365; box.w = 10e-3; box.h = 10e-3;
if(!fillImage(xout, yout, N_phot, image, Sim, Sim, &box))
ERR("Can't fill output image");
//}
writeimg("image", imt, Sim, Sim, &box, M, image);
FREE(xout); FREE(yout); FREE(image);
*/
// CCD bounding box
BBox CCD = {-15e-3, -15e-3, 30e-3, 30e-3};
for(x = 0; x < 100; x++){
BBox CCD = {-5e-4*G->CCDW, -5e-4*G->CCDH, 1e-3*G->CCDW, 1e-3*G->CCDH};
green("Make %d iterations by %d photons on each", G->N_iter, N_phot);
printf("\n");
for(x = 0; x < G->N_iter; ++x){
if(x%1000 == 999) printf("Iteration %d\n", x+1);
if(!getPhotonXY(xout, yout, 1, &mD, M, N_phot, &box))
ERR("Can't build photon map");
if(!fillImage(xout, yout, N_phot, image, Sim, Sim, &CCD))
ERR("Can't fill output image");
}
/* int S = mask->WH;
double R = M->D / 2., scale = M->D / (double)S;
uint16_t *dptr = mask->data;
box.w = box.h = scale;
// check mask's pixels & throw photons to holes
for(y = 0; y < S; y++){
for(x = 0; x < S; x++, dptr++){
if(!*dptr) continue;
DBG("x = %d, Y=%d\n", x,y);
box.x0 = -R + scale*(double)x;
box.y0 = -R + scale*(double)y;
if(!getPhotonXY(xout, yout, 1, &mD, M, N_phot, &box))
ERR("Can't build photon map");
if(!fillImage(xout, yout, N_phot, image, Sim, Sim, &CCD))
ERR("Can't fill output image");
}
}
*/
writeimg("image", imt, Sim, Sim, &CCD, M, image);
FREE(xout); FREE(yout); FREE(image);
// if rand() is good, amount of photons on image should be 785398 on every 1000000
//printTAB(Sim, Sim, image, NULL, "\n\nResulting image:");
/* for(x = 0; x < N_phot; x++)
if(fabs(xout[x]) < M->D/2. && fabs(yout[x]) < M->D/2.)
printf("photon #%4d:\t\t(%g, %g)\n", x, xout[x]*1e6, yout[x]*1e6);*/
FREE(xout); FREE(yout);
/* FILE *F = fopen("TESTs", "w");
if(!F) ERR("Can't open");
fprintf(F,"S1\tGPU\t\tCPU\n");
for(S1 = 100; ; S1 += S1*drand48()){
float *odata = my_alloc(S1*S1, sizeof(float));
double t0;
fprintf(F,"%zd", S1);
forceCUDA();
*/
/* int x, y; float *ptr = idata;
printf("Original array:\n");
for(y = 0; y < 5; y++){
for(x = 0; x < 5; x++){
*ptr *= 2.;
*ptr += x;
printf("%4.3f ", (*ptr++));
}
printf("\n");
}
t0 = dtime();
if(!bicubic_interp(odata, idata, S1,S1, S0,S0)) fprintf(F,"\tnan");
else fprintf(F,"\t%g", dtime() - t0);
printf("Enlarged array:\n");
ptr = odata;
for(y = 0; y < 20; y++){
for(x = 0; x < 20; x++)
printf("%4.3f ", (*ptr++));
printf("\n");
}
*
noCUDA();
t0 = dtime();
/// "îÅ ÍÏÇÕ ÐÏÓÔÒÏÉÔØ ÉÎÔÅÒÐÏÌÑÃÉÀ"
if(!bicubic_interp(odata, idata, S1,S1, S0,S0)) ERR(_("Can't do interpolation"));
fprintf(F,"\t%g\n", dtime() - t0);
fflush(F);
free(odata);
}*/
writeimg(G->outfile, imt, Sim, Sim, &CCD, M, image);
FREE(image);
return 0;
}

View File

@ -1,5 +1,5 @@
/*
* parceargs.c - parcing command line arguments & print help
* parseargs.c - parsing command line arguments & print help
*
* Copyright 2013 Edward V. Emelianoff <eddy@sao.ru>
*
@ -19,26 +19,17 @@
* MA 02110-1301, USA.
*/
#include <stdio.h> // DBG
#include <stdio.h> // printf
#include <getopt.h> // getopt_long
#include <stdlib.h> // calloc, exit, strtoll
#include <assert.h> // assert
#include <string.h> // strdup, strchr, strlen
#include <strings.h>// strcasecmp
#include <limits.h> // INT_MAX & so on
#include <libintl.h>// gettext
#include <ctype.h> // isalpha
#include "parceargs.h"
#ifdef EBUG
#define DBG(...) printf(__VA_ARGS__)
#else
#define DBG(...)
#endif
// macro to print help messages
#ifndef PRNT
#define PRNT(x) gettext(x)
#endif
#include "parseargs.h"
#include "usefull_macros.h"
char *helpstring = "%s\n";
@ -47,7 +38,6 @@ char *helpstring = "%s\n";
* MAY consist ONE "%s" for progname
* @param str (i) - new format
*/
void change_helpstring(char *s){
int pcount = 0, scount = 0;
char *str = s;
@ -61,13 +51,11 @@ void change_helpstring(char *s){
}
if(str[1] == 's') scount++; // increment "%s" counter
};
DBG("pc: %d, sc: %d\n", pcount, scount);
if(pcount > 1 || pcount != scount){ // amount of pcount and/or scount wrong
fprintf(stderr, "Wrong helpstring!\n");
exit(-1);
/// "îÅÐÒÁ×ÉÌØÎÙÊ ÆÏÒÍÁÔ ÓÔÒÏËÉ ÐÏÍÏÝÉ"
ERRX(_("Wrong helpstring!"));
}
helpstring = s;
DBG("hs: %s\n", helpstring);
}
/**
@ -77,7 +65,7 @@ void change_helpstring(char *s){
* @param t (i) - T_INT for integer or T_LLONG for long long (if argtype would be wided, may add more)
* @return TRUE if conversion sone without errors, FALSE otherwise
*/
bool myatoll(void *num, char *str, argtype t){
static bool myatoll(void *num, char *str, argtype t){
long long tmp, *llptr;
int *iptr;
char *endptr;
@ -94,7 +82,8 @@ bool myatoll(void *num, char *str, argtype t){
case arg_int:
default:
if(tmp < INT_MIN || tmp > INT_MAX){
fprintf(stderr, "Integer out of range\n");
/// "ãÅÌÏÅ ×ÎÅ ÄÏÐÕÓÔÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ"
WARNX(_("Integer out of range"));
return FALSE;
}
iptr = (int*)num;
@ -105,7 +94,7 @@ bool myatoll(void *num, char *str, argtype t){
// the same as myatoll but for double
// There's no NAN & INF checking here (what if they would be needed?)
bool myatod(void *num, const char *str, argtype t){
static bool myatod(void *num, const char *str, argtype t){
double tmp, *dptr;
float *fptr;
char *endptr;
@ -133,7 +122,7 @@ bool myatod(void *num, const char *str, argtype t){
* @param options (i) - array of options
* @return index in array
*/
int get_optind(int opt, myoption *options){
static int get_optind(int opt, myoption *options){
int oind;
myoption *opts = options;
assert(opts);
@ -144,7 +133,57 @@ int get_optind(int opt, myoption *options){
}
/**
* Parce command line arguments
* reallocate new value in array of multiple repeating arguments
* @arg paptr - address of pointer to array (**void)
* @arg type - its type (for realloc)
* @return pointer to new (next) value
*/
void *get_aptr(void *paptr, argtype type){
int i = 1;
void **aptr = *((void***)paptr);
if(aptr){ // there's something in array
void **p = aptr;
while(*p++) ++i;
}
size_t sz = 0;
switch(type){
default:
case arg_none:
/// "îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÎÅÓËÏÌØËÏ ÐÁÒÁÍÅÔÒÏ× ÂÅÚ ÁÒÇÕÍÅÎÔÏ×!"
ERRX("Can't use multiple args with arg_none!");
break;
case arg_int:
sz = sizeof(int);
break;
case arg_longlong:
sz = sizeof(long long);
break;
case arg_double:
sz = sizeof(double);
break;
case arg_float:
sz = sizeof(float);
break;
case arg_string:
sz = 0;
break;
/* case arg_function:
sz = sizeof(argfn *);
break;*/
}
aptr = realloc(aptr, (i + 1) * sizeof(void*));
*((void***)paptr) = aptr;
aptr[i] = NULL;
if(sz){
aptr[i - 1] = malloc(sz);
}else
aptr[i - 1] = &aptr[i - 1];
return aptr[i - 1];
}
/**
* Parse command line arguments
* ! If arg is string, then value will be strdup'ed!
*
* @param argc (io) - address of argc of main(), return value of argc stay after `getopt`
@ -155,7 +194,7 @@ int get_optind(int opt, myoption *options){
*
* @exit: in case of error this function show help & make `exit(-1)`
*/
void parceargs(int *argc, char ***argv, myoption *options){
void parseargs(int *argc, char ***argv, myoption *options){
char *short_options, *soptr;
struct option *long_options, *loptr;
size_t optsize, i;
@ -169,10 +208,18 @@ void parceargs(int *argc, char ***argv, myoption *options){
short_options = calloc(optsize * 3 + 1, 1); // multiply by three for '::' in case of args in opts
long_options = calloc(optsize + 1, sizeof(struct option));
opts = options; loptr = long_options; soptr = short_options;
// in debug mode check the parameters are not repeated
#ifdef EBUG
char **longlist = MALLOC(char*, optsize);
char *shortlist = MALLOC(char, optsize);
#endif
// fill short/long parameters and make a simple checking
for(i = 0; i < optsize; i++, loptr++, opts++){
// check
assert(opts->name); // check name
#ifdef EBUG
longlist[i] = strdup(opts->name);
#endif
if(opts->has_arg){
assert(opts->type != arg_none); // check error with arg type
assert(opts->argptr); // check pointer
@ -182,18 +229,47 @@ void parceargs(int *argc, char ***argv, myoption *options){
// fill long_options
// don't do memcmp: what if there would be different alignment?
loptr->name = opts->name;
loptr->has_arg = opts->has_arg;
loptr->has_arg = (opts->has_arg < MULT_PAR) ? opts->has_arg : 1;
loptr->flag = opts->flag;
loptr->val = opts->val;
// fill short options if they are:
if(!opts->flag){
#ifdef EBUG
shortlist[i] = (char) opts->val;
#endif
*soptr++ = opts->val;
if(opts->has_arg) // add ':' if option has required argument
if(loptr->has_arg) // add ':' if option has required argument
*soptr++ = ':';
if(opts->has_arg == 2) // add '::' if option has optional argument
if(loptr->has_arg == 2) // add '::' if option has optional argument
*soptr++ = ':';
}
}
// sort all lists & check for repeating
#ifdef EBUG
int cmpstringp(const void *p1, const void *p2){
return strcmp(* (char * const *) p1, * (char * const *) p2);
}
int cmpcharp(const void *p1, const void *p2){
return (int)(*(char * const)p1 - *(char *const)p2);
}
qsort(longlist, optsize, sizeof(char *), cmpstringp);
qsort(shortlist,optsize, sizeof(char), cmpcharp);
char *prevl = longlist[0], prevshrt = shortlist[0];
for(i = 1; i < optsize; ++i){
if(longlist[i]){
if(prevl){
if(strcmp(prevl, longlist[i]) == 0) ERRX("double long arguments: --%s", prevl);
}
prevl = longlist[i];
}
if(shortlist[i]){
if(prevshrt){
if(prevshrt == shortlist[i]) ERRX("double short arguments: -%c", prevshrt);
}
prevshrt = shortlist[i];
}
}
#endif
// now we have both long_options & short_options and can parse `getopt_long`
while(1){
int opt;
@ -202,55 +278,51 @@ void parceargs(int *argc, char ***argv, myoption *options){
if(opt == '?'){
opt = optopt;
optind = get_optind(opt, options);
if(options[optind].has_arg == 1) showhelp(optind, options); // need argument
if(options[optind].has_arg == NEED_ARG || options[optind].has_arg == MULT_PAR)
showhelp(optind, options); // need argument
}
else{
if(opt == 0 || oindex > 0) optind = oindex;
else optind = get_optind(opt, options);
}
opts = &options[optind];
DBG ("\n*******\noption %s (oindex = %d / optind = %d)", options[optind].name, oindex, optind);
if(optarg) DBG (" with arg %s", optarg);
DBG ("\n");
if(opt == 0 && opts->has_arg == 0) continue; // only long option changing integer flag
DBG("opt = %c, arg type: ", opt);
if(opt == 0 && opts->has_arg == NO_ARGS) continue; // only long option changing integer flag
// now check option
if(opts->has_arg == 1) assert(optarg);
if(opts->has_arg == NEED_ARG || opts->has_arg == MULT_PAR)
if(!optarg) showhelp(optind, options); // need argument
void *aptr;
if(opts->has_arg == MULT_PAR){
aptr = get_aptr(opts->argptr, opts->type);
}else
aptr = opts->argptr;
bool result = TRUE;
// even if there is no argument, but argptr != NULL, think that optarg = "1"
if(!optarg) optarg = "1";
switch(opts->type){
default:
case arg_none:
DBG("none\n");
if(opts->argptr) *((int*)aptr) += 1; // increment value
break;
case arg_int:
DBG("integer\n");
result = myatoll(opts->argptr, optarg, arg_int);
result = myatoll(aptr, optarg, arg_int);
break;
case arg_longlong:
DBG("long long\n");
result = myatoll(opts->argptr, optarg, arg_longlong);
result = myatoll(aptr, optarg, arg_longlong);
break;
case arg_double:
DBG("double\n");
result = myatod(opts->argptr, optarg, arg_double);
result = myatod(aptr, optarg, arg_double);
break;
case arg_float:
DBG("double\n");
result = myatod(opts->argptr, optarg, arg_float);
result = myatod(aptr, optarg, arg_float);
break;
case arg_string:
DBG("string\n");
result = (*((char **)opts->argptr) = strdup(optarg));
result = (*((void**)aptr) = (void*)strdup(optarg));
break;
case arg_function:
DBG("function\n");
result = ((argfn)opts->argptr)(optarg, optind);
result = ((argfn)aptr)(optarg);
break;
}
if(!result){
DBG("OOOPS! Error in result\n");
showhelp(optind, options);
}
}
@ -258,6 +330,26 @@ DBG("OOOPS! Error in result\n");
*argv += optind;
}
/**
* compare function for qsort
* first - sort by short options; second - sort arguments without sort opts (by long options)
*/
static int argsort(const void *a1, const void *a2){
const myoption *o1 = (myoption*)a1, *o2 = (myoption*)a2;
const char *l1 = o1->name, *l2 = o2->name;
int s1 = o1->val, s2 = o2->val;
int *f1 = o1->flag, *f2 = o2->flag;
// check if both options has short arg
if(f1 == NULL && f2 == NULL){ // both have short arg
return (s1 - s2);
}else if(f1 != NULL && f2 != NULL){ // both don't have short arg - sort by long
return strcmp(l1, l2);
}else{ // only one have short arg -- return it
if(f2) return -1; // a1 have short - it is 'lesser'
else return 1;
}
}
/**
* Show help information based on myoption->help values
* @param oindex (i) - if non-negative, show only help by myoption[oindex].help
@ -266,8 +358,6 @@ DBG("OOOPS! Error in result\n");
* @exit: run `exit(-1)` !!!
*/
void showhelp(int oindex, myoption *options){
// ATTENTION: string `help` prints through macro PRNT(), bu default it is gettext,
// but you can redefine it before `#include "parceargs.h"`
int max_opt_len = 0; // max len of options substring - for right indentation
const int bufsz = 255;
char buf[bufsz+1];
@ -281,7 +371,7 @@ void showhelp(int oindex, myoption *options){
printf("--%s", opts->name);
if(opts->has_arg == 1) printf("=arg");
else if(opts->has_arg == 2) printf("[=arg]");
printf(" %s\n", PRNT(opts->help));
printf(" %s\n", _(opts->help));
exit(-1);
}
// header, by default is just "progname\n"
@ -298,10 +388,15 @@ void showhelp(int oindex, myoption *options){
}while((++opts)->name);
max_opt_len += 14; // format: '-S , --long[=arg]' - get addition 13 symbols
opts = options;
// Now print all help
// count amount of options
int N; for(N = 0; opts->name; ++N, ++opts);
if(N == 0) exit(-2);
// Now print all help (sorted)
opts = options;
qsort(opts, N, sizeof(myoption), argsort);
do{
int p = sprintf(buf, " "); // a little indent
if(!opts->flag && isalpha(opts->val)) // .val is short argument
if(!opts->flag) // .val is short argument
p += snprintf(buf+p, bufsz-p, "-%c, ", opts->val);
p += snprintf(buf+p, bufsz-p, "--%s", opts->name);
if(opts->has_arg == 1) // required argument
@ -309,8 +404,94 @@ void showhelp(int oindex, myoption *options){
else if(opts->has_arg == 2) // optional argument
p += snprintf(buf+p, bufsz-p, "[=arg]");
assert(p < max_opt_len); // there would be magic if p >= max_opt_len
printf("%-*s%s\n", max_opt_len+1, buf, PRNT(opts->help)); // write options & at least 2 spaces after
}while((++opts)->name);
printf("%-*s%s\n", max_opt_len+1, buf, _(opts->help)); // write options & at least 2 spaces after
++opts;
}while(--N);
printf("\n\n");
exit(-1);
}
/**
* get suboptions from parameter string
* @param str - parameter string
* @param opt - pointer to suboptions structure
* @return TRUE if all OK
*/
bool get_suboption(char *str, mysuboption *opt){
int findsubopt(char *par, mysuboption *so){
int idx = 0;
if(!par) return -1;
while(so[idx].name){
if(strcasecmp(par, so[idx].name) == 0) return idx;
++idx;
}
return -1; // badarg
}
bool opt_setarg(mysuboption *so, int idx, char *val){
mysuboption *soptr = &so[idx];
bool result = FALSE;
void *aptr = soptr->argptr;
switch(soptr->type){
default:
case arg_none:
if(soptr->argptr) *((int*)aptr) += 1; // increment value
result = TRUE;
break;
case arg_int:
result = myatoll(aptr, val, arg_int);
break;
case arg_longlong:
result = myatoll(aptr, val, arg_longlong);
break;
case arg_double:
result = myatod(aptr, val, arg_double);
break;
case arg_float:
result = myatod(aptr, val, arg_float);
break;
case arg_string:
result = (*((void**)aptr) = (void*)strdup(val));
break;
case arg_function:
result = ((argfn)aptr)(val);
break;
}
return result;
}
char *tok;
bool ret = FALSE;
char *tmpbuf;
tok = strtok_r(str, ":,", &tmpbuf);
do{
char *val = strchr(tok, '=');
int noarg = 0;
if(val == NULL){ // no args
val = "1";
noarg = 1;
}else{
*val++ = '\0';
if(!*val || *val == ':' || *val == ','){ // no argument - delimeter after =
val = "1"; noarg = 1;
}
}
int idx = findsubopt(tok, opt);
if(idx < 0){
/// "îÅÐÒÁ×ÉÌØÎÙÊ ÐÁÒÁÍÅÔÒ: %s"
WARNX(_("Wrong parameter: %s"), tok);
goto returning;
}
if(noarg && opt[idx].has_arg == NEED_ARG){
/// "%s: ÎÅÏÂÈÏÄÉÍ ÁÒÇÕÍÅÎÔ!"
WARNX(_("%s: argument needed!"), tok);
goto returning;
}
if(!opt_setarg(opt, idx, val)){
/// "îÅÐÒÁ×ÉÌØÎÙÊ ÁÒÇÕÍÅÎÔ \"%s\" ÐÁÒÁÍÅÔÒÁ \"%s\""
WARNX(_("Wrong argument \"%s\" of parameter \"%s\""), val, tok);
goto returning;
}
}while((tok = strtok_r(NULL, ":,", &tmpbuf)));
ret = TRUE;
returning:
return ret;
}

View File

@ -20,6 +20,7 @@
*/
#include "mkHartmann.h"
#include "usefull_macros.h"
#include "cmdlnopts.h" // for flag "-f", which will tell to rewrite existing file
#include "saveimg.h"
#if defined __PNG && __PNG == TRUE
@ -118,6 +119,7 @@ void get_stat(float *img, size_t size){
if(max < pv) max = pv;
if(min > pv) min = pv;
}
glob_stat.image = img;
glob_stat.avr = sum/sz;
glob_stat.std = sqrt(fabs(sum2/sz - glob_stat.avr*glob_stat.avr));
glob_stat.max = max;
@ -137,6 +139,7 @@ int writefits(char *filename, size_t width, size_t height, BBox *imbox,
mirPar *mirror, float *data){
FNAME();
long naxes[2] = {width, height};
static char* newname = NULL;
char buf[80];
int ret = 1;
double dX, dY;
@ -146,15 +149,13 @@ int writefits(char *filename, size_t width, size_t height, BBox *imbox,
}
time_t savetime = time(NULL);
fitsfile *fp;
get_stat(data, width*height);
assert(filename);
char* newname = MALLOC(char, strlen(filename + 2));
newname = realloc(newname, strlen(filename + 2));
sprintf(newname, "!%s", filename); // say cfitsio that file could be rewritten
TRYFITS(fits_create_file, &fp, newname);
TRYFITS(fits_create_img, fp, FLOAT_IMG, 2, naxes);
// FILE / Input file original name
WRITEKEY(TSTRING, "FILE", filename, "Input file original name");
free(newname);
WRITEKEY(TSTRING, "DETECTOR", "Hartmann model", "Detector model");
if(imbox){
snprintf(buf, 79, "%.2g x %.2g", dX * 1e6, dY * 1e6);
@ -198,6 +199,7 @@ int writefits(char *filename, size_t width, size_t height, BBox *imbox,
WRITEKEY(TFLOAT, "Z", &mirror->objZ, "Object's zenith distance");
WRITEKEY(TFLOAT, "FOCUS", &mirror->foc, "Z-coordinate of light receiver");
}
TRYFITS(fits_write_img, fp, TFLOAT, 1, width * height, data);
TRYFITS(fits_close_file, fp);
@ -212,13 +214,12 @@ uint8_t *processRow(float *irow, size_t width, float min, float wd){
rowptr = MALLOC(uint8_t, width * 3);
OMP_FOR()
for(size_t i = 0; i < width; i++){
//*ptr = (uint16_t)(umax*(*irow - min)/wd);
double gray = ((double)(irow[i] - min))/((double)wd);
if(gray == 0.) continue;
int G = (int)(gray * 4.);
double x = 4.*gray - (double)G;
uint8_t r = 0, g = 0, b = 0;
uint8_t *ptr = &rowptr[i*3];
uint8_t r = 0, g = 0, b = 0;
switch(G){
case 0:
g = (uint8_t)(255. * x + 0.5);
@ -253,7 +254,6 @@ int writepng(char *filename, size_t width, size_t height, BBox *imbox,
FILE *fp = NULL;
png_structp pngptr = NULL;
png_infop infoptr = NULL;
get_stat(data, width*height);
float min = glob_stat.min, wd = glob_stat.max - min;
float *row;
@ -297,7 +297,6 @@ int writejpg(char *filename, size_t width, size_t height, BBox *imbox,
FNAME();
int ret = 1;
#if defined __JPEG && __JPEG == TRUE
get_stat(data, width*height);
float min = glob_stat.min, wd = glob_stat.max - min;
float *row;
FILE* outfile = fopen(filename, "w");
@ -337,7 +336,6 @@ int writetiff(char *filename, size_t width, size_t height, BBox *imbox,
FNAME();
int ret = 1;
#if defined __TIFF && __TIFF == TRUE
get_stat(data, width*height);
float min = glob_stat.min, wd = glob_stat.max - min;
float *row;
TIFF *image = TIFFOpen(filename, "w");
@ -399,6 +397,7 @@ int writeimg(char *name, imtype t, size_t width, size_t height, BBox *imbox,
char *filename = NULL, *suffix;
int ret = 0;
itsuff *suf = suffixes;
get_stat(data, width*height);
while(t && suf->t){
if(!(t & suf->t)){
suf++;
@ -406,18 +405,17 @@ int writeimg(char *name, imtype t, size_t width, size_t height, BBox *imbox,
}
t ^= suf->t;
suffix = suf->s;
FREE(filename);
if(name)
filename = createfilename(name, suffix);
else
filename = createfilename("out", suffix);
DBG("Filename: %s", filename);
if(!filename){
fprintf(stderr, "Create file with name %s and suffix %s failed,\n", name, suffix);
perror("can't make filename");
continue;
}
if(suf->writefn(filename, width, height, imbox, mirror, data)) ret++;
FREE(filename);
}
FREE(filename);
return ret;
}

327
src/usefull_macros.c Normal file
View File

@ -0,0 +1,327 @@
/*
* usefull_macros.h - a set of usefull functions: memory, color etc
*
* Copyright 2013 Edward V. Emelianoff <eddy@sao.ru>
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include "usefull_macros.h"
/**
* function for different purposes that need to know time intervals
* @return double value: time in seconds
*/
double dtime(){
double t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
return t;
}
/******************************************************************************\
* Coloured terminal
\******************************************************************************/
int globErr = 0; // errno for WARN/ERR
// pointers to coloured output printf
int (*red)(const char *fmt, ...);
int (*green)(const char *fmt, ...);
int (*_WARN)(const char *fmt, ...);
/*
* format red / green messages
* name: r_pr_, g_pr_
* @param fmt ... - printf-like format
* @return number of printed symbols
*/
int r_pr_(const char *fmt, ...){
va_list ar; int i;
printf(RED);
va_start(ar, fmt);
i = vprintf(fmt, ar);
va_end(ar);
printf(OLDCOLOR);
return i;
}
int g_pr_(const char *fmt, ...){
va_list ar; int i;
printf(GREEN);
va_start(ar, fmt);
i = vprintf(fmt, ar);
va_end(ar);
printf(OLDCOLOR);
return i;
}
/*
* print red error/warning messages (if output is a tty)
* @param fmt ... - printf-like format
* @return number of printed symbols
*/
int r_WARN(const char *fmt, ...){
va_list ar; int i = 1;
fprintf(stderr, RED);
va_start(ar, fmt);
if(globErr){
errno = globErr;
vwarn(fmt, ar);
errno = 0;
globErr = 0;
}else
i = vfprintf(stderr, fmt, ar);
va_end(ar);
i++;
fprintf(stderr, OLDCOLOR "\n");
return i;
}
static const char stars[] = "****************************************";
/*
* notty variants of coloured printf
* name: s_WARN, r_pr_notty
* @param fmt ... - printf-like format
* @return number of printed symbols
*/
int s_WARN(const char *fmt, ...){
va_list ar; int i;
i = fprintf(stderr, "\n%s\n", stars);
va_start(ar, fmt);
if(globErr){
errno = globErr;
vwarn(fmt, ar);
errno = 0;
globErr = 0;
}else
i = +vfprintf(stderr, fmt, ar);
va_end(ar);
i += fprintf(stderr, "\n%s\n", stars);
i += fprintf(stderr, "\n");
return i;
}
int r_pr_notty(const char *fmt, ...){
va_list ar; int i;
i = printf("\n%s\n", stars);
va_start(ar, fmt);
i += vprintf(fmt, ar);
va_end(ar);
i += printf("\n%s\n", stars);
return i;
}
/**
* Run this function in the beginning of main() to setup locale & coloured output
*/
void initial_setup(){
// setup coloured output
if(isatty(STDOUT_FILENO)){ // make color output in tty
red = r_pr_; green = g_pr_;
}else{ // no colors in case of pipe
red = r_pr_notty; green = printf;
}
if(isatty(STDERR_FILENO)) _WARN = r_WARN;
else _WARN = s_WARN;
// Setup locale
setlocale(LC_ALL, "");
setlocale(LC_NUMERIC, "C");
#if defined GETTEXT_PACKAGE && defined LOCALEDIR
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
textdomain(GETTEXT_PACKAGE);
#endif
}
/******************************************************************************\
* Memory
\******************************************************************************/
/*
* safe memory allocation for macro ALLOC
* @param N - number of elements to allocate
* @param S - size of single element (typically sizeof)
* @return pointer to allocated memory area
*/
void *my_alloc(size_t N, size_t S){
void *p = calloc(N, S);
if(!p) ERR("malloc");
//assert(p);
return p;
}
/**
* Mmap file to a memory area
*
* @param filename (i) - name of file to mmap
* @return stuct with mmap'ed file or die
*/
mmapbuf *My_mmap(char *filename){
int fd;
char *ptr;
size_t Mlen;
struct stat statbuf;
if(!filename) ERRX(_("No filename given!"));
if((fd = open(filename, O_RDONLY)) < 0)
ERR(_("Can't open %s for reading"), filename);
if(fstat (fd, &statbuf) < 0)
ERR(_("Can't stat %s"), filename);
Mlen = statbuf.st_size;
if((ptr = mmap (0, Mlen, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
ERR(_("Mmap error for input"));
if(close(fd)) ERR(_("Can't close mmap'ed file"));
mmapbuf *ret = MALLOC(mmapbuf, 1);
ret->data = ptr;
ret->len = Mlen;
return ret;
}
void My_munmap(mmapbuf *b){
if(munmap(b->data, b->len))
ERR(_("Can't munmap"));
FREE(b);
}
/******************************************************************************\
* Terminal in no-echo mode
\******************************************************************************/
static struct termios oldt, newt; // terminal flags
static int console_changed = 0;
// run on exit:
void restore_console(){
if(console_changed)
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); // return terminal to previous state
console_changed = 0;
}
// initial setup:
void setup_con(){
if(console_changed) return;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
if(tcsetattr(STDIN_FILENO, TCSANOW, &newt) < 0){
WARN(_("Can't setup console"));
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
signals(0); //quit?
}
console_changed = 1;
}
/**
* Read character from console without echo
* @return char read
*/
int read_console(){
int rb;
struct timeval tv;
int retval;
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(STDIN_FILENO, &rfds);
tv.tv_sec = 0; tv.tv_usec = 10000;
retval = select(1, &rfds, NULL, NULL, &tv);
if(!retval) rb = 0;
else {
if(FD_ISSET(STDIN_FILENO, &rfds)) rb = getchar();
else rb = 0;
}
return rb;
}
/**
* getchar() without echo
* wait until at least one character pressed
* @return character read
*/
int mygetchar(){ // getchar() without need of pressing ENTER
int ret;
do ret = read_console();
while(ret == 0);
return ret;
}
/******************************************************************************\
* TTY with select()
\******************************************************************************/
static struct termio oldtty, tty; // TTY flags
static int comfd = -1; // TTY fd
// run on exit:
void restore_tty(){
if(comfd == -1) return;
ioctl(comfd, TCSANOW, &oldtty ); // return TTY to previous state
close(comfd);
comfd = -1;
}
#ifndef BAUD_RATE
#define BAUD_RATE B9600
#endif
// init:
void tty_init(char *comdev){
DBG("\nOpen port...\n");
if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0){
WARN("Can't use port %s\n",comdev);
ioctl(comfd, TCSANOW, &oldtty); // return TTY to previous state
close(comfd);
signals(0); // quit?
}
DBG(" OK\nGet current settings... ");
if(ioctl(comfd,TCGETA,&oldtty) < 0){ // Get settings
WARN(_("Can't get settings"));
signals(0);
}
tty = oldtty;
tty.c_lflag = 0; // ~(ICANON | ECHO | ECHOE | ISIG)
tty.c_oflag = 0;
tty.c_cflag = BAUD_RATE|CS8|CREAD|CLOCAL; // 9.6k, 8N1, RW, ignore line ctrl
tty.c_cc[VMIN] = 0; // non-canonical mode
tty.c_cc[VTIME] = 5;
if(ioctl(comfd,TCSETA,&tty) < 0){
WARN(_("Can't set settings"));
signals(0);
}
DBG(" OK\n");
}
/**
* Read data from TTY
* @param buff (o) - buffer for data read
* @param length - buffer len
* @return amount of read bytes
*/
size_t read_tty(uint8_t *buff, size_t length){
ssize_t L = 0;
fd_set rfds;
struct timeval tv;
int retval;
FD_ZERO(&rfds);
FD_SET(comfd, &rfds);
tv.tv_sec = 0; tv.tv_usec = 50000; // wait for 50ms
retval = select(comfd + 1, &rfds, NULL, NULL, &tv);
if (!retval) return 0;
if(FD_ISSET(comfd, &rfds)){
if((L = read(comfd, buff, length)) < 1) return 0;
}
return (size_t)L;
}
int write_tty(uint8_t *buff, size_t length){
ssize_t L = write(comfd, buff, length);
if((size_t)L != length){
WARN("Write error!");
return 1;
}
return 0;
}

View File

@ -21,6 +21,8 @@
#define WRAPPER_C
#include "wrapper.h"
#include "usefull_macros.h"
#include "cmdlnopts.h"
#ifdef EBUG
#include "saveimg.h"
#endif
@ -55,21 +57,13 @@ void forceCUDA(){ // not run on CPU even if GPU failed
CUforce = 1;
#else
/// "ðÒÉÌÏÖÅÎÉÅ ÓËÏÍÐÉÌÉÒÏ×ÁÎÏ ÂÅÚ ÐÏÄÄÅÒÖËÉ CUDA"
WARN(_("Tool was compiled without CUDA support"));
ERRX(_("Tool was compiled without CUDA support"));
#endif
}
// Init function ==============================================================>
/*
* Init CUDA context and/or test memory allocation
* name: getprops
*/
void getprops(){
FNAME();
size_t mem = 100 * MB;
/// "ôÅÓÔ ÎÁ ×ÙÄÅÌÅÎÉÅ ËÁË ÍÉÎÉÍÕÍ 100íâ ÐÁÍÑÔÉ\n"
printf("Make a test for allocation at least 100MB memory\n");
#ifdef CUDA_FOUND
int testCUDA(){
size_t mem = 100 * MB;
/// "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ GPU\n"
red(_("In computations will try to use GPU\n"));
int status = 0;
@ -94,6 +88,7 @@ void getprops(){
#undef _TEST
}while(0);
if(status){
if(CUforce) ERRX(_("Can't run CUDA!"));
Only_CPU = 1;
/// "ïÛÉÂËÁ × ÉÎÉÃÉÁÌÉÚÁÃÉÉ CUDA!"
WARN(_("Error in CUDA initialisation!"));
@ -106,11 +101,29 @@ void getprops(){
printf(_(" total= "));
green("%zdMB\n", theTotal / MB);
}
return status;
}
#endif
// Init function ==============================================================>
/*
* Init CUDA context and/or test memory allocation
* name: getprops
*/
void getprops(){
FNAME();
size_t mem = 100 * MB;
int status = 0;
/// "ôÅÓÔ ÎÁ ×ÙÄÅÌÅÎÉÅ ËÁË ÍÉÎÉÍÕÍ 100íâ ÐÁÍÑÔÉ\n"
printf("Make a test for allocation at least 100MB memory\n");
if(Only_CPU){
/// "÷ ×ÙÞÉÓÌÅÎÉÑÈ ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ CPU\n"
green(_("Will use only CPU in computations\n"));
}
#ifdef CUDA_FOUND
else status = testCUDA();
#endif
// at last step - try to allocate main memory
char *ptr = (char *) malloc(mem);
/// "ïÛÉÂËÁ ×ÙÄÅÌÅÎÉÑ ÐÁÍÑÔÉ"
@ -126,18 +139,6 @@ void getprops(){
}
// Functions for pseudo-random number generators initialisation ===============>
/*
* Current time in seconds since UNIX epoch
* name: dtime
* @return time in seconds
*/
double dtime(){
double t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
return t;
}
/*
* Generate a quasy-random number to initialize PRNG
* name: throw_random_seed
@ -306,7 +307,7 @@ mirMask *makeDmask(Diaphragm *d, size_t minSz, mirPar *M, mirDeviations *D){
for(x = 0; x < d->Nholes; x++)
if(!histo[x]){
DBG("Oooops! Missed a hole!");
FREE(mdata);
FREE(mdata); FREE(histo);
return makeDmask(d, minSz*2, M, D);
}
#ifdef EBUG
@ -343,31 +344,32 @@ void freeDmask(mirMask *m){
*/
int fillImage(float *phX, float *phY, size_t ph_sz,
float *image, size_t imW, size_t imH, BBox *imbox){
FNAME();
//FNAME();
float x0 = imbox->x0, y0 = imbox->y0, x1 = imbox->x0 + imbox->w, y1 = imbox->y0 + imbox->h;
float dX = imbox->w / (float)(imW - 1), dY = imbox->h / (float)(imH - 1), x=0,y=0;
size_t N;
#ifdef EBUG
/* #ifdef EBUG
float sum = 0., miss = 0., Xc = 0., Yc = 0.;
#endif
#endif */
for(N = 0; N < ph_sz; N++){
x = phX[N]; y = phY[N];
size_t X,Y;
if(x < x0 || x > x1 || y < y0 || y > y1){
#ifdef EBUG
/* #ifdef EBUG
miss += 1.;
#endif
#endif */
}else{
X = (size_t)((x - x0) / dX + 0.5);
Y = (size_t)((y1 - y) / dY + 0.5);
//Y = (size_t)((y1 - y) / dY + 0.5);
Y = (size_t)((y - y0) / dY + 0.5);
image[Y*imW + X] += 1.f;
#ifdef EBUG
/* #ifdef EBUG
sum += 1.;
Xc += x; Yc += y;
#endif
#endif*/
}
}
DBG("Photons on image: %g, missed: %g; TOTAL: %g\ncenter: Xc=%gmm, Yc=%gmm\nPI=%g",
sum,miss, sum+miss, Xc/sum*1000., Yc/sum*1000., 4.*sum/(sum+miss));
// DBG("Photons on image: %g, missed: %g; TOTAL: %g\ncenter: Xc=%gmm, Yc=%gmm\nPI=%g",
// sum,miss, sum+miss, Xc/sum*1000., Yc/sum*1000., 4.*sum/(sum+miss));
return 1;
}