mirror of
https://github.com/eddyem/bta-meteo-logger.git
synced 2026-03-21 17:21:00 +03:00
init github
This commit is contained in:
12
C/client_cli/Makefile
Normal file
12
C/client_cli/Makefile
Normal file
@@ -0,0 +1,12 @@
|
||||
CXX.SRCS = tempmon_cli
|
||||
CC = gcc
|
||||
LDFLAGS =
|
||||
CPPFLAGS =
|
||||
all : tempmon_cli clean
|
||||
tempmon_cli : client_cli.o
|
||||
$(CC) client_cli.c $(CPPFLAGS) -o tempmon_cli
|
||||
clean:
|
||||
/bin/rm -f *.o *~
|
||||
|
||||
### <DEPENDENCIES ON .h FILES GO HERE>
|
||||
# name1.o : header1.h header2.h ...
|
||||
1158
C/client_cli/bta_shdata.h
Normal file
1158
C/client_cli/bta_shdata.h
Normal file
File diff suppressed because it is too large
Load Diff
360
C/client_cli/client_cli.c
Normal file
360
C/client_cli/client_cli.c
Normal file
@@ -0,0 +1,360 @@
|
||||
// client.c
|
||||
//
|
||||
// Copyright 2012 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.
|
||||
|
||||
|
||||
#define __CLIENT_C__
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include "defines.h"
|
||||
#include "lang.h"
|
||||
|
||||
#define Julian(x) ((double)x/86400. + 2440587.5)
|
||||
|
||||
extern const char *__progname;
|
||||
|
||||
char *db_path = A_PATH;
|
||||
off_t starting_pos = 0LL;
|
||||
typedef struct shm_data shm_d;
|
||||
unsigned char Lang = 1; // ÁÎÇÌÉÊÓËÉÊ
|
||||
time_t t_start = 0, t_end = 0;
|
||||
time_t aver_interval = 1;
|
||||
int force_dbpath = 0;
|
||||
int out_fd;
|
||||
int only_extr = 0;
|
||||
|
||||
inline void minmax(float *min, float *max, float param){
|
||||
if(param > *max) *max = param;
|
||||
else if(param < *min) *min = param;
|
||||
}
|
||||
|
||||
void send_data(unsigned char stat_mask){
|
||||
int ii=0, j;
|
||||
uint64_t data_amount = 0;
|
||||
struct tm ltime;
|
||||
time_t t_first=0, t_last=0;
|
||||
double otemp=0., itemp=0., mtemp=0., wind=0., pres=0., hum=0.;
|
||||
double otmax=-1e6,otmin=1e6,itmax=-1e6,itmin=1e6,mtmax=-1e6,mtmin=1e6,windmax=-1e6,windmin=1e6;
|
||||
int ctr, status, statuses[5] = {0,0,0,0,0};
|
||||
char s_time[32];
|
||||
monit_d data;
|
||||
if(!only_extr){
|
||||
printf("OT - %s\nIT - %s\nMT - %s\nWS - %s\nP - %s\nH - %s\nS - %s\n\n",
|
||||
_L(_s_Otemp_), _L(_s_Itemp_), _L(_s_Mtemp_),
|
||||
_L(_s_WSpeed_), _L(_s_Pressure_), _L(_s_Humidity_),
|
||||
_L(_s_State_));
|
||||
printf("%s\t\tJulian date\tOT\tIT\tMT\tWS\tP\tH\tS\n", _L(_s_Date_));
|
||||
}
|
||||
while(read(out_fd, &data, sizeof(data)) > 0){
|
||||
time_t X = (time_t) data.seconds;
|
||||
//printf("time: %zd (tstart: %zd, tend: %zd) -- %s", data.seconds, t_start, t_end, ctime(&X));
|
||||
if(X < t_start) continue;
|
||||
if(X > t_end) break;
|
||||
if(!(stat_mask & (1 << data.status))) continue;
|
||||
data_amount++;
|
||||
if(!only_extr){
|
||||
if(t_first == 0) t_first = t_last = X;
|
||||
else if((X - t_first) >= aver_interval){ // ÎÁËÏÐÉÌÉ ÄÏÓÔÁÔÏÞÎÏ ÄÁÎÎÙÈ
|
||||
t_first = t_first/2 + t_last/2; // ÓÅÒÅÄÉÎÁ ×ÒÅÍÅÎÎÏÇÏ ÉÎÔÅÒ×ÁÌÁ
|
||||
ltime = *localtime(&t_first);//*localtime(&t_first);
|
||||
strftime(s_time, 32, "%d/%m/%Y, %H:%M:%S", <ime);
|
||||
if(ii == 0) ii = 1;
|
||||
ctr = 0;
|
||||
for(j = 0; j<5; j++){
|
||||
if(statuses[j] > ctr){
|
||||
ctr = statuses[j];
|
||||
status = j;
|
||||
}
|
||||
statuses[j] = 0;
|
||||
}
|
||||
printf("%s\t%.6f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d\n",
|
||||
s_time,
|
||||
Julian(t_first),
|
||||
otemp/ii,
|
||||
itemp/ii,
|
||||
mtemp/ii,
|
||||
wind/ii,
|
||||
pres/ii,
|
||||
hum/ii,
|
||||
status);
|
||||
t_first = X;
|
||||
otemp=itemp=mtemp=wind=pres=hum=0.;
|
||||
ii = 0;
|
||||
}
|
||||
t_last = X;
|
||||
otemp += data.outdoor_temp;
|
||||
itemp += data.indoor_temp;
|
||||
mtemp += data.mirror_temp;
|
||||
wind += data.wind_speed;
|
||||
pres += data.pressure;
|
||||
hum += data.humidity;
|
||||
statuses[data.status]++;
|
||||
ii++;
|
||||
}
|
||||
if(otmax < data.outdoor_temp) otmax = data.outdoor_temp;
|
||||
if(otmin > data.outdoor_temp) otmin = data.outdoor_temp;
|
||||
if(itmax < data.indoor_temp) itmax = data.indoor_temp;
|
||||
if(itmin > data.indoor_temp) itmin = data.indoor_temp;
|
||||
if(mtmax < data.mirror_temp) mtmax = data.mirror_temp;
|
||||
if(mtmin > data.mirror_temp) mtmin = data.mirror_temp;
|
||||
if(windmax < data.wind_speed) windmax = data.wind_speed;
|
||||
if(windmin > data.wind_speed) windmin = data.wind_speed;
|
||||
}
|
||||
if(!data_amount){
|
||||
printf("No data found!\n");
|
||||
return;
|
||||
}
|
||||
printf("\n\nExtremal values (min / max):\n");
|
||||
printf("%s: %g / %g\n", _L(_s_Otemp_), otmin, otmax);
|
||||
printf("%s: %g / %g\n", _L(_s_Itemp_), itmin, itmax);
|
||||
printf("%s: %g / %g\n", _L(_s_Mtemp_), mtmin, mtmax);
|
||||
printf("%s: %g / %g\n", _L(_s_WSpeed_),windmin, windmax);
|
||||
}
|
||||
|
||||
void find_starting_pos(){ // ÉÝÅÍ × ËÜÛÅ ÓÍÅÝÅÎÉÅ ÄÌÑ ÎÁÞÁÌÁ ÐÏÉÓËÁ
|
||||
int cache_fd;
|
||||
Cache cache;
|
||||
if(force_dbpath){
|
||||
char cname[256];
|
||||
snprintf(cname, 255, "%s/.cache", db_path);
|
||||
printf("using cache file %s\n", cname);
|
||||
cache_fd = open(cname, O_RDONLY);
|
||||
}else{
|
||||
if((cache_fd = open(CACHE_FILE, O_RDONLY)) < 0)
|
||||
cache_fd = open("./cache", O_RDONLY);
|
||||
}
|
||||
if(cache_fd < 0){
|
||||
WARN(_L(_s_Cant_open_cache_));
|
||||
exit(1);
|
||||
}
|
||||
while(read(cache_fd, &cache, sizeof(cache)) > 0){
|
||||
//time_t X = (time_t) cache.time;
|
||||
//printf("time: %zd -- %s", cache.time, ctime(&X));
|
||||
if(cache.time < t_start)
|
||||
starting_pos = cache.offset;
|
||||
else break;
|
||||
}
|
||||
//printf("pos: %zd \n", starting_pos);
|
||||
close(cache_fd);
|
||||
}
|
||||
|
||||
time_t get_date(char *line){
|
||||
time_t date = time(NULL);
|
||||
struct tm time_, time_now;
|
||||
time_now = *localtime(&date);
|
||||
time_.tm_sec = 0;
|
||||
if(sscanf(line, "%d/%d/%d-%d:%d", &time_.tm_mday, &time_.tm_mon, &time_.tm_year,
|
||||
&time_.tm_hour, &time_.tm_min) == 5){time_.tm_mon -= 1;}
|
||||
else if(!strchr(line, ':') && sscanf(line, "%d/%d/%d", &time_.tm_mday, &time_.tm_mon, &time_.tm_year) == 3){
|
||||
date = -1; time_.tm_mon -= 1;}
|
||||
else if(!strchr(line, ':') && sscanf(line, "%d/%d", &time_.tm_mday, &time_.tm_mon) == 2){
|
||||
date = -1; time_.tm_mon -= 1; time_.tm_year = time_now.tm_year;}
|
||||
else if(sscanf(line, "%d:%d", &time_.tm_hour, &time_.tm_min) == 2){
|
||||
time_.tm_year = time_now.tm_year; time_.tm_mon = time_now.tm_mon;
|
||||
time_.tm_mday = time_now.tm_mday;}
|
||||
else if(!strchr(line, ':') && !strchr(line, '/') && !strchr(line, '.') && !strchr(line, '-')
|
||||
&& sscanf(line, "%d", &time_.tm_mon) == 1){
|
||||
date = -1; time_.tm_mon -= 1; time_.tm_year = time_now.tm_year;
|
||||
time_.tm_mday = 1;}
|
||||
else{
|
||||
printf("\nWrong datetime format!\n");
|
||||
printf("Formats: D/M/Y-hh:mm, D/M/Y, hh:mm, D/M, M\n");
|
||||
exit(1);
|
||||
}
|
||||
if(date == -1){
|
||||
time_.tm_hour = 0;
|
||||
time_.tm_min = 0;
|
||||
}
|
||||
if(time_.tm_mon > 11 || time_.tm_mon < 0){
|
||||
printf("\nMonth should be in 1..12\n");
|
||||
exit(2);
|
||||
}
|
||||
if(time_.tm_mday > 31 || time_.tm_mday < 1){
|
||||
printf("\nDate should be in 1..31, %d\n", time_.tm_mday);
|
||||
exit(3);
|
||||
}
|
||||
if(time_.tm_year > 1900) time_.tm_year -= 1900;
|
||||
else if(time_.tm_year > -1 && time_.tm_year < 100) time_.tm_year += 100;
|
||||
else if(time_.tm_year < 0 || time_.tm_year > 200){
|
||||
printf("\nBad year format %d\n", time_.tm_year);
|
||||
exit(4);
|
||||
}
|
||||
if(time_.tm_hour > 23 || time_.tm_hour < 0){
|
||||
printf("\nTime should be in 0..23\n");
|
||||
exit(5);
|
||||
}
|
||||
if(time_.tm_min > 59 || time_.tm_min < 0){
|
||||
printf("\nMinutes should be in 0..59\n");
|
||||
exit(6);
|
||||
}
|
||||
date = mktime(&time_);
|
||||
return date;
|
||||
}
|
||||
|
||||
void print_dates(){
|
||||
char s_time[32];
|
||||
inline char *mktm(uint32_t t){
|
||||
time_t X = (time_t) t;
|
||||
struct tm ltime = *localtime(&X);
|
||||
strftime(s_time, 32, "%d/%m/%Y, %H:%M:%S", <ime);
|
||||
return s_time;
|
||||
}
|
||||
monit_d data;
|
||||
if(read(out_fd, &data, sizeof(data)) != sizeof(data)){
|
||||
WARN("Error reading datafile!\n");
|
||||
exit(1);
|
||||
}
|
||||
printf("Date of first record in database: %s\n", mktm(data.seconds));
|
||||
lseek(out_fd, -sizeof(data), SEEK_END);
|
||||
if(read(out_fd, &data, sizeof(data)) != sizeof(data)){
|
||||
WARN("Error reading datafile!\n");
|
||||
exit(1);
|
||||
}
|
||||
printf("Date of last record in database: %s\n", mktm(data.seconds));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
unsigned char get_modemask(const char *optarg){
|
||||
unsigned char mode = 0;
|
||||
char c;
|
||||
while((c = *optarg++)){
|
||||
switch (c){
|
||||
case 's': case 'S':
|
||||
mode |= 1;
|
||||
break;
|
||||
case 'g': case 'G':
|
||||
mode |= 2;
|
||||
break;
|
||||
case 'r': case 'R':
|
||||
mode |= 4;
|
||||
break;
|
||||
case 'u': case 'U':
|
||||
mode |= 8;
|
||||
break;
|
||||
case 'o': case 'O':
|
||||
mode |= 16;
|
||||
break;
|
||||
default:
|
||||
WARN("Bad mode: should be sgruo\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
return mode;
|
||||
}
|
||||
|
||||
void usage(char *fmt, ...){
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
printf("\n");
|
||||
if (fmt != NULL){
|
||||
vprintf(fmt, ap);
|
||||
printf("\n\n");
|
||||
}
|
||||
va_end(ap);
|
||||
printf("Usage:\t%s [options]\n",
|
||||
__progname);
|
||||
printf("\tOptions:\n");
|
||||
printf("\t-d, --dbpath\t\tPath to database files\n");
|
||||
printf("\t-e, --tend\t\tEnding time (D/M/Y-hh:mm)\n");
|
||||
printf("\t-h, --help\t\tShow this help\n");
|
||||
printf("\t-i, --averint\t\tTime interval for data averaging (in seconds)\n");
|
||||
printf("\t-l, --lookout\t\t Show date interval of stored data\n");
|
||||
printf("\t-m, --mode\t\tTelescope mode (sgruo - Stopped, Guiding, Ready, Unknown, Opened)\n");
|
||||
printf("\t-s, --tstart\t\tStarting time (D/M/Y-hh:mm)\n");
|
||||
printf("\t-X, --extremal\t\tOnly show extremal values\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv){
|
||||
unsigned char mask = 0;
|
||||
struct option long_options[] = {
|
||||
{"dbpath", 1, 0, 'd'},
|
||||
{"tend", 1, 0, 'e'},
|
||||
{"help", 0, 0, 'h'},
|
||||
{"averint", 1, 0, 'i'},
|
||||
{"lookout", 0, 0, 'l'},
|
||||
{"mode", 1, 0, 'm'},
|
||||
{"tstart", 1, 0, 's'},
|
||||
{"extremal", 0, 0, 'X'}
|
||||
};
|
||||
char short_options[] = "d:e:hi:lm:s:X";
|
||||
int lookout = 0;
|
||||
while (1){
|
||||
int opt;
|
||||
if((opt = getopt_long(argc, argv, short_options,
|
||||
long_options, NULL)) == -1) break;
|
||||
switch(opt){
|
||||
case 'd':
|
||||
db_path = strdup(optarg);
|
||||
force_dbpath = 1;
|
||||
break;
|
||||
case 'e':
|
||||
t_end = get_date((char*)optarg);
|
||||
break;
|
||||
case 'h':
|
||||
usage(NULL);
|
||||
break;
|
||||
case 'i':
|
||||
aver_interval = atoi((char*)optarg);
|
||||
if(aver_interval < 1) aver_interval = 1;
|
||||
break;
|
||||
case 'l':
|
||||
lookout = 1;
|
||||
break;
|
||||
case 'm':
|
||||
mask = get_modemask(optarg);
|
||||
break;
|
||||
case 's':
|
||||
t_start = get_date((char*)optarg);
|
||||
break;
|
||||
case 'X':
|
||||
only_extr = 1;
|
||||
break;
|
||||
default:
|
||||
usage("Unknown argument");
|
||||
}
|
||||
}
|
||||
if(argc != optind) usage("Too many arguments");
|
||||
if(t_end < 1) t_end = time(NULL);
|
||||
if(t_end <= t_start){
|
||||
WARN("%s\n", _L(_s_Bad_date_));
|
||||
return(1);
|
||||
}
|
||||
if(mask == 0) mask = 0xff;
|
||||
if(force_dbpath){
|
||||
char cname[256];
|
||||
snprintf(cname, 255, "%s/.out", db_path);
|
||||
printf("using DB file %s\n", cname);
|
||||
out_fd = open(cname, O_RDONLY);
|
||||
}else{
|
||||
if((out_fd = open(OUT_FILE, O_RDONLY)) < 0)
|
||||
out_fd = open("./out", O_RDONLY);
|
||||
}
|
||||
if(out_fd < 0){
|
||||
WARN(_L(_s_Cant_open_data_));
|
||||
return(1);
|
||||
}
|
||||
if(lookout) print_dates();
|
||||
find_starting_pos();
|
||||
lseek(out_fd, starting_pos, SEEK_SET);
|
||||
send_data(mask);
|
||||
return(0);
|
||||
}
|
||||
|
||||
78
C/client_cli/defines.h
Normal file
78
C/client_cli/defines.h
Normal file
@@ -0,0 +1,78 @@
|
||||
#ifndef __DEFINES_H__
|
||||
#define __DEFINES_H__
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
#define _LARGEFILE64_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#include <stdint.h>
|
||||
#ifndef __CLIENT_C__
|
||||
#include "bta_shdata.h"
|
||||
#endif
|
||||
|
||||
#define WARN(...) do{fprintf(stderr, __VA_ARGS__);}while(0)
|
||||
|
||||
#define TIMEINTERVAL 9.99 // ÉÎÔÅÒ×ÁÌ ÕÓÒÅÄÎÅÎÉÑ ÄÁÎÎÙÈ (× ÓÅËÕÎÄÁÈ)
|
||||
#define LOG_FILE "/Users/eddy/_data/.temp_daemon" // ÆÁÊÌ Ó ÌÏÇÁÍÉ
|
||||
#define CACHE_FILE "/Users/eddy/_data/.cache" // ÉÎÄÅËÓÎÙÊ ÆÁÊÌ
|
||||
#define OUT_FILE "/Users/eddy/_data/.out" // ÓÁÍÁ ÉÎÆÏÒÍÁÃÉÑ
|
||||
#define PID_FILE "/Users/eddy/_data/.pid" // PID
|
||||
#define A_PATH "/Users/eddy/_data"
|
||||
#define PROC_BASE "/proc"
|
||||
#define SHM_KEY 1234567890
|
||||
#define CACHE_EVERY_PWR 10 // ËÜÛÉÒÕÅÍ ËÁÖÄÕÀ 2^CACHE_EVERY_PWR ÚÁÐÉÓØ
|
||||
#define tell(fd) lseek(fd, 0, SEEK_CUR)
|
||||
|
||||
enum telescope_status{
|
||||
STOP, // 0 - ÔÅÌÅÓËÏÐ ×ÙËÌÀÞÅÎ
|
||||
GUIDING, // 1 - ×ÅÄÅÎÉÅ
|
||||
READY, // 2 - ×ÓÅ ÏÓÔÁÎÏ×ÌÅÎÏ, ÐÉÔÁÎÉÅ ÅÓÔØ
|
||||
OTHER, // 3 - ÎÁ×ÅÄÅÎÉÅ ÉÌÉ ÐÒÏÞÅÅ ÐÅÒÅÍÅÝÅÎÉÅ ÔÅÌÅÓËÏÐÁ/ËÕÐÏÌÁ
|
||||
OPEN // 4 - ÚÁÂÒÁÌÏ ÏÔËÒÙÔÏ, ÉÄÕÔ ÎÁÂÌÀÄÅÎÉÑ
|
||||
// 5 - úáòåúåò÷éòï÷áîï ÄÌÑ ÓÕÍÍÁÒÎÏÇÏ ×ÒÅÍÅÎÉ
|
||||
};
|
||||
typedef enum telescope_status Status;
|
||||
typedef float data_type;
|
||||
#pragma pack(4)
|
||||
struct monitoring_data{
|
||||
uint32_t seconds; // ×ÒÅÍÑ × ÓÅËÕÎÄÁÈ
|
||||
data_type outdoor_temp; // ÍÅÄÉÁÎÁ ÔÅÍÐÅÒÁÔÕÒÙ ÚÁ TIMEINTERVAL ÓÎÁÒÕÖÉ
|
||||
data_type indoor_temp; // -//- ÔÅÍÐÅÒÁÔÕÒÁ ×ÎÕÔÒÉ
|
||||
data_type mirror_temp; // -//- ÔÅÍÐÅÒÁÔÕÒÁ ÚÅÒËÁÌÁ
|
||||
data_type wind_speed; // ÍÁËÓÉÍÁÌØÎÁÑ ÚÁ TIMEINTERVAL ÓËÏÒÏÓÔØ ×ÅÔÒÁ
|
||||
data_type pressure; // ÍÅÄÉÁÎÎÏÅ ÚÎÁÞÅÎÉÅ ÄÁ×ÌÅÎÉÑ (ÍÍ.ÒÔ.ÓÔ)
|
||||
data_type humidity; // -//- ×ÌÁÖÎÏÓÔÉ
|
||||
/* data_type sigma_ot; // ÓÔÁÎÄÁÒÔÎÏÅ ÏÔËÌÏÎÅÎÉÅ ×ÎÅÛÎÅÊ ÔÅÍÐÅÒÁÔÕÒÙ
|
||||
data_type sigma_it; // -//- ×ÎÕÔÒÅÎÎÅÊ ÔÅÍÐÅÒÁÔÕÒÙ
|
||||
data_type sigma_mt; // -//- ÔÅÍÐÅÒÁÔÕÒÙ ÚÅÒËÁÌÁ
|
||||
data_type sigma_w; // -//- ÓËÏÒÏÓÔÉ ×ÅÔÒÁ
|
||||
data_type sigma_p;
|
||||
data_type sigma_h;
|
||||
data_type avr_ot; // ÓÒÅÄÎÅÅ ÚÁ TIMEINTERVAL ÚÎÁÞÅÎÉÅ ×ÎÅÛÎÅÊ ÔÅÍÐÅÒÁÔÕÒÙ
|
||||
data_type avr_it; // ...
|
||||
data_type avr_mt;
|
||||
data_type avr_w;
|
||||
data_type avr_p;
|
||||
data_type avr_h;*/
|
||||
Status status; // ÓÏÓÔÏÑÎÉÅ ÔÅÌÅÓËÏÐÁ
|
||||
};
|
||||
typedef struct monitoring_data monit_d;
|
||||
|
||||
#pragma pack(4)
|
||||
struct _cache{ // ÓÔÒÕËÔÕÒÁ ÄÌÑ ÈÒÁÎÅÎÉÑ ÄÁÎÎÙÈ × ËÜÛÅ
|
||||
uint32_t time; // ×ÒÅÍÑ × ÓÅËÕÎÄÁÈ Ó 1.01.1970-0:0
|
||||
uint64_t offset; // ÓÍÅÝÅÎÉÅ × ÌÏÇ-ÆÁÊÌÅ
|
||||
};
|
||||
typedef struct _cache Cache;
|
||||
int *Visor = NULL; // ÓÏÓÔÏÑÎÉÅ ÚÁÂÒÁÌÁ
|
||||
#endif
|
||||
|
||||
55
C/client_cli/lang.h
Normal file
55
C/client_cli/lang.h
Normal file
@@ -0,0 +1,55 @@
|
||||
#define _LANG(_var, _ru, _en) char _var##ru[] = _ru;\
|
||||
char _var##en[] = _en;\
|
||||
char *_var[2] = {_var##ru, _var##en};
|
||||
#define _L(x) (x[Lang])
|
||||
|
||||
_LANG(_s_Save_file_, "óÏÈÒÁÎÉÔØ ÆÁÊÌ", "Save file");
|
||||
_LANG(_s_no_QS_, "ïÔÓÕÔÓÔ×ÕÅÔ ÓÔÒÏËÁ ÚÁÐÒÏÓÁ", "No query string");
|
||||
_LANG(_s_no_tstart_, "ðÏÖÁÌÕÊÓÔÁ, ÚÁÐÏÌÎÉÔÅ ÆÏÒÍÕ\"ÎÁÞÁÌØÎÏÅ ×ÒÅÍÑ\"", "Please, fill the form \"starting time\"");
|
||||
_LANG(_s_Date_, "äÁÔÁ É ×ÒÅÍÑ", "Date and time");
|
||||
_LANG(_s_Otemp_, "÷ÎÅÛÎÑÑ ÔÅÍÐÅÒÁÔÕÒÁ", "Outdoor temperature");
|
||||
_LANG(_s_Itemp_, "÷ÎÕÔÒÅÎÎÑÑ ÔÅÍÐÅÒÁÔÕÒÁ", "Indoor temperature");
|
||||
_LANG(_s_Mtemp_, "ôÅÍÐÅÒÁÔÕÒÁ ÚÅÒËÁÌÁ", "Mirror temperature");
|
||||
_LANG(_s_Ot_, "÷ÎÅÛÎÑÑ", "Outdoor");
|
||||
_LANG(_s_It_, "÷ÎÕÔÒÅÎÎÑÑ", "Indoor");
|
||||
_LANG(_s_Mt_, "úÅÒËÁÌÁ", "Mirror");
|
||||
_LANG(_s_WSpeed_, "óËÏÒÏÓÔØ ×ÅÔÒÁ", "Wind speed");
|
||||
_LANG(_s_Temp_, "ôÅÍÐÅÒÁÔÕÒÁ", "Temperature");
|
||||
_LANG(_s_Pressure_, "äÁ×ÌÅÎÉÅ (ÍÍ.ÒÔ.ÓÔ.)", "Pressure (mmHg)");
|
||||
_LANG(_s_Humidity_, "÷ÌÁÖÎÏÓÔØ (%)", "Humidity (%)");
|
||||
_LANG(_s_State_, "óÏÓÔÏÑÎÉÅ ÔÅÌÅÓËÏÐÁ", "Telescope state");
|
||||
_LANG(_s_Monlen_, "óÄÅÌÁÎÏ ÉÚÍÅÒÅÎÉÊ", "Number of measurements");
|
||||
_LANG(_s_SVGerr_, "îÅ ÍÏÇÕ ÓÏÚÄÁÔØ ÇÒÁÆÉË", "Can't create graph");
|
||||
_LANG(_s_Bad_date_, "îÅÐÒÁ×ÉÌØÎÙÊ ÆÏÒÍÁÔ ÄÁÔÙ, ÉÌÉ ÄÁÔÁ ÏËÏÎÞÁÎÉÑ ÒÁÎØÛÅ ÄÁÔÙ ÎÁÞÁÌÁ", "Bad date format, or starting date goes after ending date");
|
||||
_LANG(_s_Cant_open_cache_, "îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÆÁÊÌ ËÜÛÁ", "Can't open cache file");
|
||||
_LANG(_s_Cant_open_data_, "îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÆÁÊÌ Ó ÄÁÎÎÙÍÉ", "Can't open data file");
|
||||
_LANG(_s_Cant_write_, "ïÛÉÂËÁ ÚÁÐÉÓÉ ÄÁÎÎÙÈ", "Can't write data");
|
||||
_LANG(_s_noData_, "úÁ ÕËÁÚÁÎÎÙÊ ÐÅÒÉÏÄ ÎÅÔ ÄÁÎÎÙÈ", "No data for this period");
|
||||
_LANG(_s_Vopen_, "úÁÂÒÁÌÏ ÏÔËÒÙÔÏ", "Visor is open");
|
||||
_LANG(_s_Vclose_, "úÁÂÒÁÌÏ ÚÁËÒÙÔÏ", "Visor is close");
|
||||
_LANG(_s_CurVstat_, "ôÅËÕÝÅÅ ÓÏÓÔÏÑÎÉÅ", "Current status");
|
||||
_LANG(_s_ChVstat_, "óÍÅÎÉÔØ ÓÏÓÔÏÑÎÉÅ ÎÁ", "Change status to");
|
||||
_LANG(_s_noVisor_, "îÅ ÍÏÇÕ ÏÐÒÅÄÅÌÉÔØ ÓÏÓÔÏÑÎÉÅ ÚÁÂÒÁÌÁ", "Can't define visor state");
|
||||
_LANG(_s_No_Data_, "îÅÄÏÓÔÁÔÏÞÎÏ ÄÁÎÎÙÈ", "Not enough data");
|
||||
_LANG(_s_Gtr_, "ÂÏÌØÛÅ", "greater");
|
||||
_LANG(_s_Less_, "ÍÅÎØÛÅ", "less");
|
||||
_LANG(_s_G_mustbe_less_L_, "þÉÓÌÏ × ÐÏÌÅ \"ÂÏÌØÛÅ\" ÄÏÌÖÎÏ ÂÙÔØ ÍÅÎØÛÅ ÞÉÓÌÁ × ÐÏÌÅ \"ÍÅÎØÛÅ\"",
|
||||
"The value in field \"greater\" must be less than value in field \"less\"");
|
||||
_LANG(_s_L_mustbe_less_G_, "þÉÓÌÏ × ÐÏÌÅ \"ÍÅÎØÛÅ\" ÄÏÌÖÎÏ ÂÙÔØ ÍÅÎØÛÅ ÞÉÓÌÁ × ÐÏÌÅ \"ÂÏÌØÛÅ\"",
|
||||
"The value in field \"less\" must be less than value in field \"greater\"");
|
||||
_LANG(_s_Max_data_, "äÁÔÙ Ó ÍÁËÓÉÍÁÌØÎÙÍ ÚÎÁÞÅÎÉÅÍ ÐÁÒÁÍÅÔÒÏ×", "Dates with maximum of paremeters");
|
||||
_LANG(_s_Min_data_, "äÁÔÙ Ó ÍÉÎÉÍÁÌØÎÙÍ ÚÎÁÞÅÎÉÅÍ ÐÁÒÁÍÅÔÒÏ×", "Dates with minimum of paremeters");
|
||||
_LANG(_s_Diapazon_, "äÁÎÎÙÅ ÉÚ ×ÙÂÒÁÎÎÏÇÏ ÄÉÁÐÁÚÏÎÁ:", "Data from selected range:");
|
||||
_LANG(_s_Modes_, "òÅÖÉÍÙ ÒÁÂÏÔÙ", "Work modes");
|
||||
_LANG(_s_And_, "É", "and");
|
||||
_LANG(_s_Or_, "ÉÌÉ", "or");
|
||||
_LANG(_s_Mode_Times_, "óÕÍÍÁÒÎÏÅ ×ÒÅÍÑ ÒÁÂÏÔÙ × ÒÅÖÉÍÁÈ", "Total work time in modes");
|
||||
_LANG(_s_seconds_, "ÓÅËÕÎÄ", "seconds");
|
||||
_LANG(_s_days_, "ÓÕÔÏË", "days");
|
||||
_LANG(_s_Stopped_, "ðÏÌÎÙÊ ÏÓÔÁÎÏ×", "Full stop");
|
||||
_LANG(_s_Guiding_, "óÏÐÒÏ×ÏÖÄÅÎÉÅ ÏÂßÅËÔÁ", "Object guiding");
|
||||
_LANG(_s_Ready_, "çÏÔÏ×", "Ready");
|
||||
_LANG(_s_Other_, "ðÒÏÞÅÅ", "Other");
|
||||
_LANG(_s_Total_, "éÔÏÇÏ", "Total");
|
||||
//_LANG(, "", "");
|
||||
|
||||
Reference in New Issue
Block a user