mirror of
https://github.com/eddyem/small_tel.git
synced 2025-12-06 02:35:14 +03:00
fix weatherdaemon for new usefull_macros
This commit is contained in:
parent
cc8e915546
commit
453a56429d
43
Daemons/weatherdaemon.deprecated/Makefile
Normal file
43
Daemons/weatherdaemon.deprecated/Makefile
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# run `make DEF=...` to add extra defines
|
||||||
|
PROGRAM := weatherdaemon
|
||||||
|
LDFLAGS := -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,--discard-all -pthread
|
||||||
|
LDFLAGS += -lusefull_macros
|
||||||
|
SRCS := $(wildcard *.c)
|
||||||
|
DEFINES := $(DEF) -D_GNU_SOURCE -D_XOPEN_SOURCE=1111
|
||||||
|
#DEFINES += -DEBUG
|
||||||
|
# baudrate for USB<->UART converter
|
||||||
|
OBJDIR := mk
|
||||||
|
CFLAGS += -O2 -Wall -Werror -Wextra -Wno-trampolines
|
||||||
|
OBJS := $(addprefix $(OBJDIR)/, $(SRCS:%.c=%.o))
|
||||||
|
DEPS := $(OBJS:.o=.d)
|
||||||
|
CC = gcc
|
||||||
|
|
||||||
|
all : $(OBJDIR) $(PROGRAM)
|
||||||
|
|
||||||
|
$(PROGRAM) : $(OBJS)
|
||||||
|
@echo -e "\t\tLD $(PROGRAM)"
|
||||||
|
$(CC) $(LDFLAGS) $(OBJS) -o $(PROGRAM)
|
||||||
|
|
||||||
|
$(OBJDIR):
|
||||||
|
mkdir $(OBJDIR)
|
||||||
|
|
||||||
|
ifneq ($(MAKECMDGOALS),clean)
|
||||||
|
-include $(DEPS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.c
|
||||||
|
@echo -e "\t\tCC $<"
|
||||||
|
$(CC) -MD -c $(LDFLAGS) $(CFLAGS) $(DEFINES) -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo -e "\t\tCLEAN"
|
||||||
|
@rm -f $(OBJS) $(DEPS)
|
||||||
|
@rmdir $(OBJDIR) 2>/dev/null || true
|
||||||
|
|
||||||
|
xclean: clean
|
||||||
|
@rm -f $(PROGRAM)
|
||||||
|
|
||||||
|
gentags:
|
||||||
|
CFLAGS="$(CFLAGS) $(DEFINES)" geany -g $(PROGRAM).c.tags *[hc] 2>/dev/null
|
||||||
|
|
||||||
|
.PHONY: gentags clean xclean
|
||||||
20
Daemons/weatherdaemon.deprecated/Readme.md
Normal file
20
Daemons/weatherdaemon.deprecated/Readme.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Weather daemon
|
||||||
|
==================
|
||||||
|
|
||||||
|
Open a socket at given port (default: 4444)
|
||||||
|
Parse weather data and send it to client
|
||||||
|
|
||||||
|
```
|
||||||
|
Usage: weatherdaemon [args]
|
||||||
|
|
||||||
|
Where args are:
|
||||||
|
|
||||||
|
-P, --pidfile=arg pidfile name (default: /tmp/weatherdaemon.pid)
|
||||||
|
-b, --baudrate=arg serial terminal baudrate (default: 9600)
|
||||||
|
-d, --device=arg serial device name (default: none)
|
||||||
|
-e, --emulation emulate serial device
|
||||||
|
-h, --help show this help
|
||||||
|
-l, --logfile=arg save logs to file (default: none)
|
||||||
|
-p, --port=arg network port to connect (default: 12345)
|
||||||
|
-v, --verb logfile verbocity level (each -v increase it)
|
||||||
|
```
|
||||||
348
Daemons/weatherdaemon.deprecated/bta_shdata.c
Normal file
348
Daemons/weatherdaemon.deprecated/bta_shdata.c
Normal file
@ -0,0 +1,348 @@
|
|||||||
|
// Copyright: V.S. Shergin, vsher@sao.ru
|
||||||
|
// fixed for x86_64 E.V. Emelianov, edward.emelianoff@gmail.com
|
||||||
|
#include "bta_shdata.h"
|
||||||
|
#include <usefull_macros.h>
|
||||||
|
|
||||||
|
#include <crypt.h>
|
||||||
|
|
||||||
|
#pragma pack(push, 4)
|
||||||
|
// Main command channel (level 5)
|
||||||
|
struct CMD_Queue mcmd = {{"Mcmd"}, 0200,0,-1,0};
|
||||||
|
// Operator command channel (level 4)
|
||||||
|
struct CMD_Queue ocmd = {{"Ocmd"}, 0200,0,-1,0};
|
||||||
|
// User command channel (level 2/3)
|
||||||
|
struct CMD_Queue ucmd = {{"Ucmd"}, 0200,0,-1,0};
|
||||||
|
|
||||||
|
#define MSGLEN (80)
|
||||||
|
static char msg[MSGLEN];
|
||||||
|
#define PERR(...) do{snprintf(msg, MSGLEN, __VA_ARGS__); perror(msg);} while(0)
|
||||||
|
|
||||||
|
#ifndef BTA_MODULE
|
||||||
|
volatile struct BTA_Data *sdt;
|
||||||
|
volatile struct BTA_Local *sdtl;
|
||||||
|
|
||||||
|
volatile struct SHM_Block sdat = {
|
||||||
|
{"Sdat"},
|
||||||
|
sizeof(struct BTA_Data),
|
||||||
|
2048,0444,
|
||||||
|
SHM_RDONLY,
|
||||||
|
bta_data_init,
|
||||||
|
bta_data_check,
|
||||||
|
bta_data_close,
|
||||||
|
ClientSide,-1,NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
int snd_id = -1; // client sender ID
|
||||||
|
int cmd_src_pid = 0; // next command source PID
|
||||||
|
uint32_t cmd_src_ip = 0;// next command source IP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init data
|
||||||
|
*/
|
||||||
|
void bta_data_init() {
|
||||||
|
sdt = (struct BTA_Data *)sdat.addr;
|
||||||
|
sdtl = (struct BTA_Local *)(sdat.addr+sizeof(struct BTA_Data));
|
||||||
|
if(sdat.side == ClientSide) {
|
||||||
|
if(sdt->magic != sdat.key.code) {
|
||||||
|
WARN("Wrong shared data (maybe server turned off)");
|
||||||
|
}
|
||||||
|
if(sdt->version == 0) {
|
||||||
|
WARN("Null shared data version (maybe server turned off)");
|
||||||
|
}
|
||||||
|
else if(sdt->version != BTA_Data_Ver) {
|
||||||
|
WARN("Wrong shared data version: I'am - %d, but server - %d ...",
|
||||||
|
BTA_Data_Ver, sdt->version );
|
||||||
|
}
|
||||||
|
if(sdt->size != sdat.size) {
|
||||||
|
if(sdt->size > sdat.size) {
|
||||||
|
WARN("Wrong shared area size: I needs - %d, but server - %d ...",
|
||||||
|
sdat.size, sdt->size );
|
||||||
|
} else {
|
||||||
|
WARN("Attention! Too little shared data structure!");
|
||||||
|
WARN("I needs - %d, but server gives only %d ...",
|
||||||
|
sdat.size, sdt->size );
|
||||||
|
WARN("May be server's version too old!?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ServerSide */
|
||||||
|
if(sdt->magic == sdat.key.code &&
|
||||||
|
sdt->version == BTA_Data_Ver &&
|
||||||
|
sdt->size == sdat.size)
|
||||||
|
return;
|
||||||
|
memset(sdat.addr, 0, sdat.maxsize);
|
||||||
|
sdt->magic = sdat.key.code;
|
||||||
|
sdt->version = BTA_Data_Ver;
|
||||||
|
sdt->size = sdat.size;
|
||||||
|
Tel_Hardware = Hard_On;
|
||||||
|
Pos_Corr = PC_On;
|
||||||
|
TrkOk_Mode = UseDiffVel | UseDiffAZ ;
|
||||||
|
inp_B = 591.;
|
||||||
|
Pressure = 595.;
|
||||||
|
PEP_code_A = 0x002aaa;
|
||||||
|
PEP_code_Z = 0x002aaa;
|
||||||
|
PEP_code_P = 0x002aaa;
|
||||||
|
PEP_code_F = 0x002aaa;
|
||||||
|
PEP_code_D = 0x002aaa;
|
||||||
|
DomeSEW_N = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bta_data_check() {
|
||||||
|
return( (sdt->magic == sdat.key.code) && (sdt->version == BTA_Data_Ver) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void bta_data_close() {
|
||||||
|
if(sdat.side == ServerSide) {
|
||||||
|
sdt->magic = 0;
|
||||||
|
sdt->version = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate shared memory segment
|
||||||
|
*/
|
||||||
|
int get_shm_block(volatile struct SHM_Block *sb, int server) {
|
||||||
|
int getsize = (server)? sb->maxsize : sb->size;
|
||||||
|
// first try to find existing one
|
||||||
|
sb->id = shmget(sb->key.code, getsize, sb->mode);
|
||||||
|
if(sb->id < 0 && errno == ENOENT && server){
|
||||||
|
// if no - try to create a new one
|
||||||
|
int cresize = sb->maxsize;
|
||||||
|
if(sb->size > cresize){
|
||||||
|
WARN("Wrong shm maxsize(%d) < realsize(%d)",sb->maxsize,sb->size);
|
||||||
|
cresize = sb->size;
|
||||||
|
}
|
||||||
|
sb->id = shmget(sb->key.code, cresize, IPC_CREAT|IPC_EXCL|sb->mode);
|
||||||
|
}
|
||||||
|
if(sb->id < 0){
|
||||||
|
if(server)
|
||||||
|
PERR("Can't create shared memory segment '%s'",sb->key.name);
|
||||||
|
else
|
||||||
|
PERR("Can't find shared segment '%s' (maybe no server process) ",sb->key.name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// attach it to our memory space
|
||||||
|
sb->addr = (unsigned char *) shmat(sb->id, NULL, sb->atflag);
|
||||||
|
if((long)sb->addr == -1){
|
||||||
|
PERR("Can't attach shared memory segment '%s'",sb->key.name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(server && (shmctl(sb->id, SHM_LOCK, NULL) < 0)){
|
||||||
|
PERR("Can't prevents swapping of shared memory segment '%s'",sb->key.name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
DBG("Create & attach shared memory segment '%s' %dbytes", sb->key.name, sb->size);
|
||||||
|
sb->side = server;
|
||||||
|
if(sb->init != NULL)
|
||||||
|
sb->init();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int close_shm_block(volatile struct SHM_Block *sb){
|
||||||
|
int ret;
|
||||||
|
if(sb->close != NULL)
|
||||||
|
sb->close();
|
||||||
|
if(sb->side == ServerSide) {
|
||||||
|
// ret = shmctl(sb->id, SHM_UNLOCK, NULL);
|
||||||
|
ret = shmctl(sb->id, IPC_RMID, NULL);
|
||||||
|
}
|
||||||
|
ret = shmdt (sb->addr);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create|Find command queue
|
||||||
|
*/
|
||||||
|
void get_cmd_queue(struct CMD_Queue *cq, int server){
|
||||||
|
if (!server && cq->id >= 0) { //if already in use set current
|
||||||
|
snd_id = cq->id;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// first try to find existing one
|
||||||
|
cq->id = msgget(cq->key.code, cq->mode);
|
||||||
|
// if no - try to create a new one
|
||||||
|
if(cq->id<0 && errno == ENOENT && server)
|
||||||
|
cq->id = msgget(cq->key.code, IPC_CREAT|IPC_EXCL|cq->mode);
|
||||||
|
if(cq->id<0){
|
||||||
|
if(server)
|
||||||
|
PERR("Can't create comand queue '%s'",cq->key.name);
|
||||||
|
else
|
||||||
|
PERR("Can't find comand queue '%s' (maybe no server process) ",cq->key.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cq->side = server;
|
||||||
|
if(server){
|
||||||
|
char buf[120]; /* выбросить все команды из очереди */
|
||||||
|
while(msgrcv(cq->id, (struct msgbuf *)buf, 112, 0, IPC_NOWAIT) > 0);
|
||||||
|
}else
|
||||||
|
snd_id = cq->id;
|
||||||
|
cq->acckey = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // BTA_MODULE
|
||||||
|
|
||||||
|
|
||||||
|
int check_shm_block(volatile struct SHM_Block *sb) {
|
||||||
|
if(sb->check)
|
||||||
|
return(sb->check());
|
||||||
|
else return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set access key in current channel
|
||||||
|
*/
|
||||||
|
void set_acckey(uint32_t newkey){
|
||||||
|
if(snd_id < 0) return;
|
||||||
|
if(ucmd.id == snd_id) ucmd.acckey = newkey;
|
||||||
|
else if(ocmd.id == snd_id) ocmd.acckey = newkey;
|
||||||
|
else if(mcmd.id == snd_id) mcmd.acckey = newkey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup source data for one following command if default values
|
||||||
|
* (IP == 0 - local, PID = current) not suits
|
||||||
|
*/
|
||||||
|
void set_cmd_src(uint32_t ip, int pid) {
|
||||||
|
cmd_src_pid = pid;
|
||||||
|
cmd_src_ip = ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma pack(push, 4)
|
||||||
|
/**
|
||||||
|
* Send client commands to server
|
||||||
|
*/
|
||||||
|
void send_cmd(int cmd_code, char *buf, int size) {
|
||||||
|
struct my_msgbuf mbuf;
|
||||||
|
if(snd_id < 0) return;
|
||||||
|
if(size > 100) size = 100;
|
||||||
|
if(cmd_code > 0)
|
||||||
|
mbuf.mtype = cmd_code;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
if(ucmd.id == snd_id) mbuf.acckey = ucmd.acckey;
|
||||||
|
else if(ocmd.id == snd_id) mbuf.acckey = ocmd.acckey;
|
||||||
|
else if(mcmd.id == snd_id) mbuf.acckey = mcmd.acckey;
|
||||||
|
|
||||||
|
mbuf.src_pid = cmd_src_pid ? cmd_src_pid : getpid();
|
||||||
|
mbuf.src_ip = cmd_src_ip;
|
||||||
|
cmd_src_pid = cmd_src_ip = 0;
|
||||||
|
|
||||||
|
if(size > 0)
|
||||||
|
memcpy(mbuf.mtext, buf, size);
|
||||||
|
else {
|
||||||
|
mbuf.mtext[0] = 0;
|
||||||
|
size = 1;
|
||||||
|
}
|
||||||
|
msgsnd(snd_id, (struct msgbuf *)&mbuf, size+12, IPC_NOWAIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_cmd_noarg(int cmd_code) {
|
||||||
|
send_cmd(cmd_code, NULL, 0);
|
||||||
|
}
|
||||||
|
void send_cmd_str(int cmd_code, char *arg) {
|
||||||
|
send_cmd(cmd_code, arg, strlen(arg)+1);
|
||||||
|
}
|
||||||
|
void send_cmd_i1(int cmd_code, int32_t arg1) {
|
||||||
|
send_cmd(cmd_code, (char *)&arg1, sizeof(int32_t));
|
||||||
|
}
|
||||||
|
void send_cmd_i2(int cmd_code, int32_t arg1, int32_t arg2) {
|
||||||
|
int32_t ibuf[2];
|
||||||
|
ibuf[0] = arg1;
|
||||||
|
ibuf[1] = arg2;
|
||||||
|
send_cmd(cmd_code, (char *)ibuf, 2*sizeof(int32_t));
|
||||||
|
}
|
||||||
|
void send_cmd_i3(int cmd_code, int32_t arg1, int32_t arg2, int32_t arg3) {
|
||||||
|
int32_t ibuf[3];
|
||||||
|
ibuf[0] = arg1;
|
||||||
|
ibuf[1] = arg2;
|
||||||
|
ibuf[2] = arg3;
|
||||||
|
send_cmd(cmd_code, (char *)ibuf, 3*sizeof(int32_t));
|
||||||
|
}
|
||||||
|
void send_cmd_i4(int cmd_code, int32_t arg1, int32_t arg2, int32_t arg3, int32_t arg4) {
|
||||||
|
int32_t ibuf[4];
|
||||||
|
ibuf[0] = arg1;
|
||||||
|
ibuf[1] = arg2;
|
||||||
|
ibuf[2] = arg3;
|
||||||
|
ibuf[3] = arg4;
|
||||||
|
send_cmd(cmd_code, (char *)ibuf, 4*sizeof(int32_t));
|
||||||
|
}
|
||||||
|
void send_cmd_d1(int32_t cmd_code, double arg1) {
|
||||||
|
send_cmd(cmd_code, (char *)&arg1, sizeof(double));
|
||||||
|
}
|
||||||
|
void send_cmd_d2(int cmd_code, double arg1, double arg2) {
|
||||||
|
double dbuf[2];
|
||||||
|
dbuf[0] = arg1;
|
||||||
|
dbuf[1] = arg2;
|
||||||
|
send_cmd(cmd_code, (char *)dbuf, 2*sizeof(double));
|
||||||
|
}
|
||||||
|
void send_cmd_i1d1(int cmd_code, int32_t arg1, double arg2) {
|
||||||
|
struct {
|
||||||
|
int32_t ival;
|
||||||
|
double dval;
|
||||||
|
} buf;
|
||||||
|
buf.ival = arg1;
|
||||||
|
buf.dval = arg2;
|
||||||
|
send_cmd(cmd_code, (char *)&buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
void send_cmd_i2d1(int cmd_code, int32_t arg1, int32_t arg2, double arg3) {
|
||||||
|
struct {
|
||||||
|
int32_t ival[2];
|
||||||
|
double dval;
|
||||||
|
} buf;
|
||||||
|
buf.ival[0] = arg1;
|
||||||
|
buf.ival[1] = arg2;
|
||||||
|
buf.dval = arg3;
|
||||||
|
send_cmd(cmd_code, (char *)&buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
void send_cmd_i3d1(int cmd_code, int32_t arg1, int32_t arg2, int32_t arg3, double arg4) {
|
||||||
|
struct {
|
||||||
|
int32_t ival[3];
|
||||||
|
double dval;
|
||||||
|
} buf;
|
||||||
|
buf.ival[0] = arg1;
|
||||||
|
buf.ival[1] = arg2;
|
||||||
|
buf.ival[2] = arg3;
|
||||||
|
buf.dval = arg4;
|
||||||
|
send_cmd(cmd_code, (char *)&buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
void encode_lev_passwd(char *passwd, int nlev, uint32_t *keylev, uint32_t *codlev){
|
||||||
|
char salt[4];
|
||||||
|
char *encr;
|
||||||
|
union {
|
||||||
|
uint32_t ui;
|
||||||
|
char c[4];
|
||||||
|
} key, cod;
|
||||||
|
sprintf(salt,"L%1d",nlev);
|
||||||
|
encr = (char *)crypt(passwd, salt);
|
||||||
|
cod.c[0] = encr[2];
|
||||||
|
key.c[0] = encr[3];
|
||||||
|
cod.c[1] = encr[4];
|
||||||
|
key.c[1] = encr[5];
|
||||||
|
cod.c[2] = encr[6];
|
||||||
|
key.c[2] = encr[7];
|
||||||
|
cod.c[3] = encr[8];
|
||||||
|
key.c[3] = encr[9];
|
||||||
|
*keylev = key.ui;
|
||||||
|
*codlev = cod.ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
int find_lev_passwd(char *passwd, uint32_t *keylev, uint32_t *codlev){
|
||||||
|
int nlev;
|
||||||
|
for(nlev = 5; nlev > 0; --nlev){
|
||||||
|
encode_lev_passwd(passwd, nlev, keylev, codlev);
|
||||||
|
if(*codlev == code_Lev(nlev)) break;
|
||||||
|
}
|
||||||
|
return(nlev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int check_lev_passwd(char *passwd){
|
||||||
|
uint32_t keylev,codlev;
|
||||||
|
int nlev;
|
||||||
|
nlev = find_lev_passwd(passwd, &keylev, &codlev);
|
||||||
|
if(nlev > 0) set_acckey(keylev);
|
||||||
|
return(nlev);
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
853
Daemons/weatherdaemon.deprecated/bta_shdata.h
Normal file
853
Daemons/weatherdaemon.deprecated/bta_shdata.h
Normal file
@ -0,0 +1,853 @@
|
|||||||
|
// Copyright: V.S. Shergin, vsher@sao.ru
|
||||||
|
// fixed for x86_64 E.V. Emelianov, edward.emelianoff@gmail.com
|
||||||
|
#pragma once
|
||||||
|
#ifndef __BTA_SHDATA_H__
|
||||||
|
#define __BTA_SHDATA_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/ipc.h>
|
||||||
|
#include <sys/shm.h>
|
||||||
|
#include <sys/msg.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#pragma pack(push, 4)
|
||||||
|
/*
|
||||||
|
* Shared memory block
|
||||||
|
*/
|
||||||
|
struct SHM_Block {
|
||||||
|
union {
|
||||||
|
char name[5]; // memory segment identificator
|
||||||
|
key_t code;
|
||||||
|
} key;
|
||||||
|
int32_t size; // size of memory used
|
||||||
|
int32_t maxsize; // size when created
|
||||||
|
int32_t mode; // access mode (rwxrwxrwx)
|
||||||
|
int32_t atflag; // connection mode (SHM_RDONLY or 0)
|
||||||
|
void (*init)(); // init function
|
||||||
|
int32_t (*check)(); // test function
|
||||||
|
void (*close)(); // deinit function
|
||||||
|
int32_t side; // connection type: client/server
|
||||||
|
int32_t id; // connection identificator
|
||||||
|
uint8_t *addr; // connection address
|
||||||
|
};
|
||||||
|
|
||||||
|
extern volatile struct SHM_Block sdat;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Command queue descriptor
|
||||||
|
*/
|
||||||
|
struct CMD_Queue {
|
||||||
|
union {
|
||||||
|
char name[5]; // queue key
|
||||||
|
key_t code;
|
||||||
|
} key;
|
||||||
|
int32_t mode; // access mode (rwxrwxrwx)
|
||||||
|
int32_t side; // connection type (Sender/Receiver - server/client)
|
||||||
|
int32_t id; // connection identificator
|
||||||
|
uint32_t acckey; // access key (for transmission from client to server)
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct CMD_Queue mcmd;
|
||||||
|
extern struct CMD_Queue ocmd;
|
||||||
|
extern struct CMD_Queue ucmd;
|
||||||
|
|
||||||
|
void send_cmd_noarg(int);
|
||||||
|
void send_cmd_str(int, char *);
|
||||||
|
void send_cmd_i1(int, int32_t);
|
||||||
|
void send_cmd_i2(int, int32_t, int32_t);
|
||||||
|
void send_cmd_i3(int, int32_t, int32_t, int32_t);
|
||||||
|
void send_cmd_i4(int, int32_t, int32_t, int32_t, int32_t);
|
||||||
|
void send_cmd_d1(int, double);
|
||||||
|
void send_cmd_d2(int, double, double);
|
||||||
|
void send_cmd_i1d1(int, int32_t, double);
|
||||||
|
void send_cmd_i2d1(int, int32_t, int32_t, double);
|
||||||
|
void send_cmd_i3d1(int, int32_t, int32_t, int32_t, double);
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Command list *
|
||||||
|
*******************************************************************************/
|
||||||
|
/* name code args type */
|
||||||
|
// Stop telescope
|
||||||
|
#define StopTel 1
|
||||||
|
#define StopTeleskope() send_cmd_noarg( 1 )
|
||||||
|
// High/low speed
|
||||||
|
#define StartHS 2
|
||||||
|
#define StartHighSpeed() send_cmd_noarg( 2 )
|
||||||
|
#define StartLS 3
|
||||||
|
#define StartLowSpeed() send_cmd_noarg( 3 )
|
||||||
|
// Timer setup (Ch7_15 or SysTimer)
|
||||||
|
#define SetTmr 4
|
||||||
|
#define SetTimerMode(T) send_cmd_i1 ( 4, (int)(T))
|
||||||
|
// Simulation (modeling) mode
|
||||||
|
#define SetModMod 5
|
||||||
|
#define SetModelMode(M) send_cmd_i1 ( 5, (int)(M))
|
||||||
|
// Azimuth speed code
|
||||||
|
#define SetCodA 6
|
||||||
|
#define SetPKN_A(iA,sA) send_cmd_i2 ( 6, (int)(iA),(int)(sA))
|
||||||
|
// Zenith speed code
|
||||||
|
#define SetCodZ 7
|
||||||
|
#define SetPKN_Z(iZ) send_cmd_i1 ( 7, (int)(iZ))
|
||||||
|
// Parangle speed code
|
||||||
|
#define SetCodP 8
|
||||||
|
#define SetPKN_P(iP) send_cmd_i1 ( 8, (int)(iP))
|
||||||
|
// Set Az velocity
|
||||||
|
#define SetVA 9
|
||||||
|
#define SetSpeedA(vA) send_cmd_d1 ( 9, (double)(vA))
|
||||||
|
// Set Z velocity
|
||||||
|
#define SetVZ 10
|
||||||
|
#define SetSpeedZ(vZ) send_cmd_d1 (10, (double)(vZ))
|
||||||
|
// Set P velocity
|
||||||
|
#define SetVP 11
|
||||||
|
#define SetSpeedP(vP) send_cmd_d1 (11, (double)(vP))
|
||||||
|
// Set new polar coordinates
|
||||||
|
#define SetAD 12
|
||||||
|
#define SetRADec(Alp,Del) send_cmd_d2 (12, (double)(Alp),(double)(Del))
|
||||||
|
// Set new azimutal coordinates
|
||||||
|
#define SetAZ 13
|
||||||
|
#define SetAzimZ(A,Z) send_cmd_d2 (13, (double)(A),(double)(Z))
|
||||||
|
// Goto new object by polar coords
|
||||||
|
#define GoToAD 14
|
||||||
|
#define GoToObject() send_cmd_noarg(14 )
|
||||||
|
// Start steering to object by polar coords
|
||||||
|
#define MoveToAD 15
|
||||||
|
#define MoveToObject() send_cmd_noarg(15 )
|
||||||
|
// Go to object by azimutal coords
|
||||||
|
#define GoToAZ 16
|
||||||
|
#define GoToAzimZ() send_cmd_noarg(16 )
|
||||||
|
// Set A&Z for simulation
|
||||||
|
#define WriteAZ 17
|
||||||
|
#define WriteModelAZ() send_cmd_noarg(17 )
|
||||||
|
// Set P2 mode
|
||||||
|
#define SetModP 18
|
||||||
|
#define SetPMode(pmod) send_cmd_i1 (18, (int)(pmod))
|
||||||
|
// Move(+-1)/Stop(0) P2
|
||||||
|
#define P2Move 19
|
||||||
|
#define MoveP2(dir) send_cmd_i1 (19, (int)(dir))
|
||||||
|
// Move(+-2,+-1)/Stop(0) focus
|
||||||
|
#define FocMove 20
|
||||||
|
#define MoveFocus(speed,time) send_cmd_i1d1(20,(int)(speed),(double)(time))
|
||||||
|
// Use/don't use pointing correction system
|
||||||
|
#define UsePCorr 21
|
||||||
|
#define SwitchPosCorr(pc_flag) send_cmd_i1 (21, (int)(pc_flag))
|
||||||
|
// Tracking flags
|
||||||
|
#define SetTrkFlags 22
|
||||||
|
#define SetTrkOkMode(trk_flags) send_cmd_i1 (22, (int)(trk_flags))
|
||||||
|
// Set focus (0 - primary, 1 - N1, 2 - N2)
|
||||||
|
#define SetTFoc 23
|
||||||
|
#define SetTelFocus(N) send_cmd_i1 ( 23, (int)(N))
|
||||||
|
// Set intrinsic move parameters by RA/Decl
|
||||||
|
#define SetVAD 24
|
||||||
|
#define SetVelAD(VAlp,VDel) send_cmd_d2 (24, (double)(VAlp),(double)(VDel))
|
||||||
|
// Reverse Azimuth direction when pointing
|
||||||
|
#define SetRevA 25
|
||||||
|
#define SetAzRevers(amod) send_cmd_i1 (25, (int)(amod))
|
||||||
|
// Set P2 velocity
|
||||||
|
#define SetVP2 26
|
||||||
|
#define SetVelP2(vP2) send_cmd_d1 (26, (double)(vP2))
|
||||||
|
// Set pointing target
|
||||||
|
#define SetTarg 27
|
||||||
|
#define SetSysTarg(Targ) send_cmd_i1 (27, (int)(Targ))
|
||||||
|
// Send message to all clients (+write into protocol)
|
||||||
|
#define SendMsg 28
|
||||||
|
#define SendMessage(Mesg) send_cmd_str (28, (char *)(Mesg))
|
||||||
|
// RA/Decl user correction
|
||||||
|
#define CorrAD 29
|
||||||
|
#define DoADcorr(dAlp,dDel) send_cmd_d2 (29, (double)(dAlp),(double)(dDel))
|
||||||
|
// A/Z user correction
|
||||||
|
#define CorrAZ 30
|
||||||
|
#define DoAZcorr(dA,dZ) send_cmd_d2 (30, (double)(dA),(double)(dZ))
|
||||||
|
// sec A/Z user correction speed
|
||||||
|
#define SetVCAZ 31
|
||||||
|
#define SetVCorr(vA,vZ) send_cmd_d2 (31, (double)(vA),(double)(vZ))
|
||||||
|
// move P2 with given velocity for a given time
|
||||||
|
#define P2MoveTo 32
|
||||||
|
#define MoveP2To(vP2,time) send_cmd_d2 (32, (double)(vP2),(double)(time))
|
||||||
|
// Go to t/Decl position
|
||||||
|
#define GoToTD 33
|
||||||
|
#define GoToSat() send_cmd_noarg (33 )
|
||||||
|
// Move to t/Decl
|
||||||
|
#define MoveToTD 34
|
||||||
|
#define MoveToSat() send_cmd_noarg (34 )
|
||||||
|
// Empty command for synchronisation
|
||||||
|
#define NullCom 35
|
||||||
|
#define SyncCom() send_cmd_noarg (35 )
|
||||||
|
// Button "Start"
|
||||||
|
#define StartTel 36
|
||||||
|
#define StartTeleskope() send_cmd_noarg(36 )
|
||||||
|
// Set telescope mode
|
||||||
|
#define SetTMod 37
|
||||||
|
#define SetTelMode(M) send_cmd_i1 ( 37, (int)(M))
|
||||||
|
// Turn telescope on (oil etc)
|
||||||
|
#define TelOn 38
|
||||||
|
#define TeleskopeOn() send_cmd_noarg(38 )
|
||||||
|
// Dome mode
|
||||||
|
#define SetModD 39
|
||||||
|
#define SetDomeMode(dmod) send_cmd_i1 (39, (int)(dmod))
|
||||||
|
// Move(+-3,+-2,+-1)/Stop(0) dome
|
||||||
|
#define DomeMove 40
|
||||||
|
#define MoveDome(speed,time) send_cmd_i1d1(40,(int)(speed),(double)(time))
|
||||||
|
// Set account password
|
||||||
|
#define SetPass 41
|
||||||
|
#define SetPasswd(LPass) send_cmd_str (41, (char *)(LPass))
|
||||||
|
// Set code of access level
|
||||||
|
#define SetLevC 42
|
||||||
|
#define SetLevCode(Nlev,Cod) send_cmd_i2(42, (int)(Nlev),(int)(Cod))
|
||||||
|
// Set key for access level
|
||||||
|
#define SetLevK 43
|
||||||
|
#define SetLevKey(Nlev,Key) send_cmd_i2(43, (int)(Nlev),(int)(Key))
|
||||||
|
// Setup network
|
||||||
|
#define SetNet 44
|
||||||
|
#define SetNetAcc(Mask,Addr) send_cmd_i2(44, (int)(Mask),(int)(Addr))
|
||||||
|
// Input meteo data
|
||||||
|
#define SetMet 45
|
||||||
|
#define SetMeteo(m_id,m_val) send_cmd_i1d1(45,(int)(m_id),(double)(m_val))
|
||||||
|
// Cancel meteo data
|
||||||
|
#define TurnMetOff 46
|
||||||
|
#define TurnMeteoOff(m_id) send_cmd_i1 (46, (int)(m_id))
|
||||||
|
// Set time correction (IERS DUT1=UT1-UTC)
|
||||||
|
#define SetDUT1 47
|
||||||
|
#define SetDtime(dT) send_cmd_d1 (47, (double)(dT))
|
||||||
|
// Set polar motion (IERS polar motion)
|
||||||
|
#define SetPM 48
|
||||||
|
#define SetPolMot(Xp,Yp) send_cmd_d2 (48, (double)(Xp),(double)(Yp))
|
||||||
|
// Get SEW parameter
|
||||||
|
#define GetSEW 49
|
||||||
|
#define GetSEWparam(Ndrv,Indx,Cnt) send_cmd_i3(49,(int)(Ndrv),(int)(Indx),(int)(Cnt))
|
||||||
|
// Set SEW parameter
|
||||||
|
#define PutSEW 50
|
||||||
|
#define PutSEWparam(Ndrv,Indx,Key,Val) send_cmd_i4(50,(int)(Ndrv),(int)(Indx),(int)(Key),(int)(Val))
|
||||||
|
// Set lock flags
|
||||||
|
#define SetLocks 51
|
||||||
|
#define SetLockFlags(f) send_cmd_i1 (SetLocks, (int)(f))
|
||||||
|
// Clear lock flags
|
||||||
|
#define ClearLocks 52
|
||||||
|
#define ClearLockFlags(f) send_cmd_i1 (ClearLocks, (int)(f))
|
||||||
|
// Set PEP-RK bits
|
||||||
|
#define SetRKbits 53
|
||||||
|
#define AddRKbits(f) send_cmd_i1 (SetRKbits, (int)(f))
|
||||||
|
// Clear PEP-RK bits
|
||||||
|
#define ClrRKbits 54
|
||||||
|
#define ClearRKbits(f) send_cmd_i1 (ClrRKbits, (int)(f))
|
||||||
|
// Set SEW dome motor number (for indication)
|
||||||
|
#define SetSEWnd 55
|
||||||
|
#define SetDomeDrive(ND) send_cmd_i1 (SetSEWnd, (int)(ND))
|
||||||
|
// Turn SEW controllers of dome on/off
|
||||||
|
#define SEWsDome 56
|
||||||
|
#define DomeSEW(OnOff) send_cmd_i1 (SEWsDome, (int)(OnOff))
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* BTA data structure definitions *
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#define ServPID (sdt->pid) // PID of main program
|
||||||
|
// model
|
||||||
|
#define UseModel (sdt->model) // model variants
|
||||||
|
enum{
|
||||||
|
NoModel = 0 // OFF
|
||||||
|
,CheckModel // control motors by model
|
||||||
|
,DriveModel // "blind" management without real sensors
|
||||||
|
,FullModel // full model without telescope
|
||||||
|
};
|
||||||
|
// timer
|
||||||
|
#define ClockType (sdt->timer) // which timer to use
|
||||||
|
enum{
|
||||||
|
Ch7_15 = 0 // Inner timer with synchronisation by CH7_15
|
||||||
|
,SysTimer // System timer (synchronisation unknown)
|
||||||
|
,ExtSynchro // External synchronisation (bta_time or xntpd)
|
||||||
|
};
|
||||||
|
// system
|
||||||
|
#define Sys_Mode (sdt->system) // main system mode
|
||||||
|
enum{
|
||||||
|
SysStop = 0 // Stop
|
||||||
|
,SysWait // Wait for start (pointing)
|
||||||
|
,SysPointAZ // Pointing by A/Z
|
||||||
|
,SysPointAD // Pointing by RA/Decl
|
||||||
|
,SysTrkStop // Tracking stop
|
||||||
|
,SysTrkStart // Start tracking (acceleration to nominal velocity)
|
||||||
|
,SysTrkMove // Tracking move to object
|
||||||
|
,SysTrkSeek // Tracking in seeking mode
|
||||||
|
,SysTrkOk // Tracking OK
|
||||||
|
,SysTrkCorr // Correction of tracking position
|
||||||
|
,SysTest // Test
|
||||||
|
};
|
||||||
|
// sys_target
|
||||||
|
#define Sys_Target (sdt->sys_target) // system pointing target
|
||||||
|
enum{
|
||||||
|
TagPosition = 0 // point by A/Z
|
||||||
|
,TagObject // point by RA/Decl
|
||||||
|
,TagNest // point to "nest"
|
||||||
|
,TagZenith // point to zenith
|
||||||
|
,TagHorizon // point to horizon
|
||||||
|
,TagStatObj // point to statinary object (t/Decl)
|
||||||
|
};
|
||||||
|
// tel_focus
|
||||||
|
#define Tel_Focus (sdt->tel_focus) // telescope focus type
|
||||||
|
enum{
|
||||||
|
Prime = 0
|
||||||
|
,Nasmyth1
|
||||||
|
,Nasmyth2
|
||||||
|
};
|
||||||
|
// PCS
|
||||||
|
#define PosCor_Coeff (sdt->pc_coeff) // pointing correction system coefficients
|
||||||
|
// tel_state
|
||||||
|
#define Tel_State (sdt->tel_state) // telescope state
|
||||||
|
#define Req_State (sdt->req_state) // required state
|
||||||
|
enum{
|
||||||
|
Stopping = 0
|
||||||
|
,Pointing
|
||||||
|
,Tracking
|
||||||
|
};
|
||||||
|
// tel_hard_state
|
||||||
|
#define Tel_Hardware (sdt->tel_hard_state) // Power state
|
||||||
|
enum{
|
||||||
|
Hard_Off = 0
|
||||||
|
,Hard_On
|
||||||
|
};
|
||||||
|
// tel_mode
|
||||||
|
#define Tel_Mode (sdt->tel_mode) // telescope mode
|
||||||
|
enum{
|
||||||
|
Automatic = 0 // Automatic (normal) mode
|
||||||
|
,Manual = 1 // manual mode
|
||||||
|
,ZenHor = 2 // work when Z<5 || Z>80
|
||||||
|
,A_Move = 4 // hand move by A
|
||||||
|
,Z_Move = 8 // hand move by Z
|
||||||
|
,Balance =0x10// balancing
|
||||||
|
};
|
||||||
|
// az_mode
|
||||||
|
#define Az_Mode (sdt->az_mode) // azimuth reverce
|
||||||
|
enum{
|
||||||
|
Rev_Off = 0 // move by nearest way
|
||||||
|
,Rev_On // move by longest way
|
||||||
|
};
|
||||||
|
// p2_state
|
||||||
|
#define P2_State (sdt->p2_state) // P2 motor state
|
||||||
|
#define P2_Mode (sdt->p2_req_mode)
|
||||||
|
enum{
|
||||||
|
P2_Off = 0 // Stop
|
||||||
|
,P2_On // Guiding
|
||||||
|
,P2_Plus // Move to +
|
||||||
|
,P2_Minus = -2 // Move to -
|
||||||
|
};
|
||||||
|
// focus_state
|
||||||
|
#define Foc_State (sdt->focus_state) // focus motor state
|
||||||
|
enum{
|
||||||
|
Foc_Hminus = -2// fast "-" move
|
||||||
|
,Foc_Lminus // slow "-" move
|
||||||
|
,Foc_Off // Off
|
||||||
|
,Foc_Lplus // slow "+" move
|
||||||
|
,Foc_Hplus // fast "+" move
|
||||||
|
};
|
||||||
|
// dome_state
|
||||||
|
#define Dome_State (sdt->dome_state) // dome motors state
|
||||||
|
enum{
|
||||||
|
D_Hminus = -3 // speeds: low, medium, high
|
||||||
|
,D_Mminus
|
||||||
|
,D_Lminus
|
||||||
|
,D_Off // off
|
||||||
|
,D_Lplus
|
||||||
|
,D_Mplus
|
||||||
|
,D_Hplus
|
||||||
|
,D_On = 7 // auto
|
||||||
|
};
|
||||||
|
// pcor_mode
|
||||||
|
#define Pos_Corr (sdt->pcor_mode) // pointing correction mode
|
||||||
|
enum{
|
||||||
|
PC_Off = 0
|
||||||
|
,PC_On
|
||||||
|
};
|
||||||
|
// trkok_mode
|
||||||
|
#define TrkOk_Mode (sdt->trkok_mode) // tracking mode
|
||||||
|
enum{
|
||||||
|
UseDiffVel = 1 // Isodrome (correction by real motors speed)
|
||||||
|
,UseDiffAZ = 2 // Tracking by coordinate difference
|
||||||
|
,UseDFlt = 4 // Turn on digital filter
|
||||||
|
};
|
||||||
|
// input RA/Decl values
|
||||||
|
#define InpAlpha (sdt->i_alpha)
|
||||||
|
#define InpDelta (sdt->i_delta)
|
||||||
|
// current source RA/Decl values
|
||||||
|
#define SrcAlpha (sdt->s_alpha)
|
||||||
|
#define SrcDelta (sdt->s_delta)
|
||||||
|
// intrinsic object velocity
|
||||||
|
#define VelAlpha (sdt->v_alpha)
|
||||||
|
#define VelDelta (sdt->v_delta)
|
||||||
|
// input A/Z values
|
||||||
|
#define InpAzim (sdt->i_azim)
|
||||||
|
#define InpZdist (sdt->i_zdist)
|
||||||
|
// calculated values
|
||||||
|
#define CurAlpha (sdt->c_alpha)
|
||||||
|
#define CurDelta (sdt->c_delta)
|
||||||
|
// current values (from sensors)
|
||||||
|
#define tag_A (sdt->tag_a)
|
||||||
|
#define tag_Z (sdt->tag_z)
|
||||||
|
#define tag_P (sdt->tag_p)
|
||||||
|
// calculated corrections
|
||||||
|
#define pos_cor_A (sdt->pcor_a)
|
||||||
|
#define pos_cor_Z (sdt->pcor_z)
|
||||||
|
#define refract_Z (sdt->refr_z)
|
||||||
|
// reverse calculation corr.
|
||||||
|
#define tel_cor_A (sdt->tcor_a)
|
||||||
|
#define tel_cor_Z (sdt->tcor_z)
|
||||||
|
#define tel_ref_Z (sdt->tref_z)
|
||||||
|
// coords difference
|
||||||
|
#define Diff_A (sdt->diff_a)
|
||||||
|
#define Diff_Z (sdt->diff_z)
|
||||||
|
#define Diff_P (sdt->diff_p)
|
||||||
|
// base object velocity
|
||||||
|
#define vel_objA (sdt->vbasea)
|
||||||
|
#define vel_objZ (sdt->vbasez)
|
||||||
|
#define vel_objP (sdt->vbasep)
|
||||||
|
// correction by real speed
|
||||||
|
#define diff_vA (sdt->diffva)
|
||||||
|
#define diff_vZ (sdt->diffvz)
|
||||||
|
#define diff_vP (sdt->diffvp)
|
||||||
|
// motor speed
|
||||||
|
#define speedA (sdt->speeda)
|
||||||
|
#define speedZ (sdt->speedz)
|
||||||
|
#define speedP (sdt->speedp)
|
||||||
|
// last precipitation time
|
||||||
|
#define Precip_time (sdt->m_time_precip)
|
||||||
|
// reserved
|
||||||
|
#define Reserve (sdt->reserve)
|
||||||
|
// real motor speed (''/sec)
|
||||||
|
#define req_speedA (sdt->rspeeda)
|
||||||
|
#define req_speedZ (sdt->rspeedz)
|
||||||
|
#define req_speedP (sdt->rspeedp)
|
||||||
|
// model speed
|
||||||
|
#define mod_vel_A (sdt->simvela)
|
||||||
|
#define mod_vel_Z (sdt->simvelz)
|
||||||
|
#define mod_vel_P (sdt->simvelp)
|
||||||
|
#define mod_vel_F (sdt->simvelf)
|
||||||
|
#define mod_vel_D (sdt->simvelf)
|
||||||
|
// telescope & hand correction state
|
||||||
|
/*
|
||||||
|
* 0x8000 - ÁÚÉÍÕÔ ÐÏÌÏÖÉÔÅÌØÎÙÊ
|
||||||
|
* 0x4000 - ÏÔÒÁÂÏÔËÁ ×ËÌ.
|
||||||
|
* 0x2000 - ÒÅÖÉÍ ×ÅÄÅÎÉÑ
|
||||||
|
* 0x1000 - ÏÔÒÁÂÏÔËÁ P2 ×ËÌ.
|
||||||
|
* 0x01F0 - ÓË.ËÏÒÒ. 0.2 0.4 1.0 2.0 5.0("/ÓÅË)
|
||||||
|
* 0x000F - ÎÁÐÒ.ËÏÒÒ. +Z -Z +A -A
|
||||||
|
*/
|
||||||
|
#define code_KOST (sdt->kost)
|
||||||
|
// different time (UTC, stellar, local)
|
||||||
|
#define M_time (sdt->m_time)
|
||||||
|
#define S_time (sdt->s_time)
|
||||||
|
#define L_time (sdt->l_time)
|
||||||
|
// PPNDD sensor (rough) code
|
||||||
|
#define ppndd_A (sdt->ppndd_a)
|
||||||
|
#define ppndd_Z (sdt->ppndd_z)
|
||||||
|
#define ppndd_P (sdt->ppndd_p)
|
||||||
|
#define ppndd_B (sdt->ppndd_b) // atm. pressure
|
||||||
|
// DUP sensor (precise) code (Gray code)
|
||||||
|
#define dup_A (sdt->dup_a)
|
||||||
|
#define dup_Z (sdt->dup_z)
|
||||||
|
#define dup_P (sdt->dup_p)
|
||||||
|
#define dup_F (sdt->dup_f)
|
||||||
|
#define dup_D (sdt->dup_d)
|
||||||
|
// binary 14-digit precise code
|
||||||
|
#define low_A (sdt->low_a)
|
||||||
|
#define low_Z (sdt->low_z)
|
||||||
|
#define low_P (sdt->low_p)
|
||||||
|
#define low_F (sdt->low_f)
|
||||||
|
#define low_D (sdt->low_d)
|
||||||
|
// binary 23-digit rough code
|
||||||
|
#define code_A (sdt->code_a)
|
||||||
|
#define code_Z (sdt->code_z)
|
||||||
|
#define code_P (sdt->code_p)
|
||||||
|
#define code_B (sdt->code_b)
|
||||||
|
#define code_F (sdt->code_f)
|
||||||
|
#define code_D (sdt->code_d)
|
||||||
|
// ADC PCL818 (8-channel) codes
|
||||||
|
#define ADC(N) (sdt->adc[(N)])
|
||||||
|
#define code_T1 ADC(0) // External temperature code
|
||||||
|
#define code_T2 ADC(1) // In-dome temperature code
|
||||||
|
#define code_T3 ADC(2) // Mirror temperature code
|
||||||
|
#define code_Wnd ADC(3) // Wind speed code
|
||||||
|
// calculated values
|
||||||
|
#define val_A (sdt->val_a) // A, ''
|
||||||
|
#define val_Z (sdt->val_z) // Z, ''
|
||||||
|
#define val_P (sdt->val_p) // P, ''
|
||||||
|
#define val_B (sdt->val_b) // atm. pressure, mm.hg.
|
||||||
|
#define val_F (sdt->val_f) // focus, mm
|
||||||
|
#define val_D (sdt->val_d) // Dome Az, ''
|
||||||
|
#define val_T1 (sdt->val_t1) // ext. T, degrC
|
||||||
|
#define val_T2 (sdt->val_t2) // in-dome T, degrC
|
||||||
|
#define val_T3 (sdt->val_t3) // mirror T, degrC
|
||||||
|
#define val_Wnd (sdt->val_wnd) // wind speed, m/s
|
||||||
|
// RA/Decl calculated by A/Z
|
||||||
|
#define val_Alp (sdt->val_alp)
|
||||||
|
#define val_Del (sdt->val_del)
|
||||||
|
// measured speed
|
||||||
|
#define vel_A (sdt->vel_a)
|
||||||
|
#define vel_Z (sdt->vel_z)
|
||||||
|
#define vel_P (sdt->vel_p)
|
||||||
|
#define vel_F (sdt->vel_f)
|
||||||
|
#define vel_D (sdt->vel_d)
|
||||||
|
// system messages queue
|
||||||
|
#define MesgNum 3
|
||||||
|
#define MesgLen 39
|
||||||
|
// message type
|
||||||
|
enum{
|
||||||
|
MesgEmpty = 0
|
||||||
|
,MesgInfor
|
||||||
|
,MesgWarn
|
||||||
|
,MesgFault
|
||||||
|
,MesgLog
|
||||||
|
};
|
||||||
|
#define Sys_Mesg(N) (sdt->sys_msg_buf[N])
|
||||||
|
// access levels
|
||||||
|
#define code_Lev1 (sdt->code_lev[0]) // remote observer - only information
|
||||||
|
#define code_Lev2 (sdt->code_lev[1]) // local observer - input coordinates
|
||||||
|
#define code_Lev3 (sdt->code_lev[2]) // main observer - correction by A/Z, P2/F management
|
||||||
|
#define code_Lev4 (sdt->code_lev[3]) // operator - start/stop telescope, testing
|
||||||
|
#define code_Lev5 (sdt->code_lev[4]) // main operator - full access
|
||||||
|
#define code_Lev(x) (sdt->code_lev[(x-1)])
|
||||||
|
// network settings
|
||||||
|
#define NetMask (sdt->netmask) // subnet mask (usually 255.255.255.0)
|
||||||
|
#define NetWork (sdt->netaddr) // subnet address (for ex.: 192.168.3.0)
|
||||||
|
#define ACSMask (sdt->acsmask) // ACS network mask (for ex.: 255.255.255.0)
|
||||||
|
#define ACSNet (sdt->acsaddr) // ACS subnet address (for ex.: 192.168.13.0)
|
||||||
|
// meteo data
|
||||||
|
#define MeteoMode (sdt->meteo_stat)
|
||||||
|
enum{
|
||||||
|
INPUT_B = 1 // pressure
|
||||||
|
,INPUT_T1 = 2 // external T
|
||||||
|
,INPUT_T2 = 4 // in-dome T
|
||||||
|
,INPUT_T3 = 8 // mirror T
|
||||||
|
,INPUT_WND = 0x10 // wind speed
|
||||||
|
,INPUT_HMD = 0x20 // humidity
|
||||||
|
};
|
||||||
|
#define SENSOR_B (INPUT_B <<8) // external data flags
|
||||||
|
#define SENSOR_T1 (INPUT_T1 <<8)
|
||||||
|
#define SENSOR_T2 (INPUT_T2 <<8)
|
||||||
|
#define SENSOR_T3 (INPUT_T3 <<8)
|
||||||
|
#define SENSOR_WND (INPUT_WND<<8)
|
||||||
|
#define SENSOR_HMD (INPUT_HMD<<8)
|
||||||
|
#define ADC_B (INPUT_B <<16) // reading from ADC flags
|
||||||
|
#define ADC_T1 (INPUT_T1 <<16)
|
||||||
|
#define ADC_T2 (INPUT_T2 <<16)
|
||||||
|
#define ADC_T3 (INPUT_T3 <<16)
|
||||||
|
#define ADC_WND (INPUT_WND<<16)
|
||||||
|
#define ADC_HMD (INPUT_HMD<<16)
|
||||||
|
#define NET_B (INPUT_B <<24) // got by network flags
|
||||||
|
#define NET_T1 (INPUT_T1 <<24)
|
||||||
|
#define NET_T3 (INPUT_T3 <<24)
|
||||||
|
#define NET_WND (INPUT_WND<<24)
|
||||||
|
#define NET_HMD (INPUT_HMD<<24)
|
||||||
|
// input meteo values
|
||||||
|
#define inp_B (sdt->inp_b) // atm.pressure (mm.hg)
|
||||||
|
#define inp_T1 (sdt->inp_t1) // ext T
|
||||||
|
#define inp_T2 (sdt->inp_t2) // in-dome T
|
||||||
|
#define inp_T3 (sdt->inp_t3) // mirror T
|
||||||
|
#define inp_Wnd (sdt->inp_wnd) // wind
|
||||||
|
// values used for refraction calculation
|
||||||
|
#define Temper (sdt->temper)
|
||||||
|
#define Pressure (sdt->press)
|
||||||
|
// last wind gust time
|
||||||
|
#define Wnd10_time (sdt->m_time10)
|
||||||
|
#define Wnd15_time (sdt->m_time15)
|
||||||
|
// IERS DUT1
|
||||||
|
#define DUT1 (sdt->dut1)
|
||||||
|
// sensors reading time
|
||||||
|
#define A_time (sdt->a_time)
|
||||||
|
#define Z_time (sdt->z_time)
|
||||||
|
#define P_time (sdt->p_time)
|
||||||
|
// input speeds
|
||||||
|
#define speedAin (sdt->speedain)
|
||||||
|
#define speedZin (sdt->speedzin)
|
||||||
|
#define speedPin (sdt->speedpin)
|
||||||
|
// acceleration (''/sec^2)
|
||||||
|
#define acc_A (sdt->acc_a)
|
||||||
|
#define acc_Z (sdt->acc_z)
|
||||||
|
#define acc_P (sdt->acc_p)
|
||||||
|
#define acc_F (sdt->acc_f)
|
||||||
|
#define acc_D (sdt->acc_d)
|
||||||
|
// SEW code
|
||||||
|
#define code_SEW (sdt->code_sew)
|
||||||
|
// sew data
|
||||||
|
#define statusSEW(Drv) (sdt->sewdrv[(Drv)-1].status)
|
||||||
|
#define statusSEW1 (sdt->sewdrv[0].status)
|
||||||
|
#define statusSEW2 (sdt->sewdrv[1].status)
|
||||||
|
#define statusSEW3 (sdt->sewdrv[2].status)
|
||||||
|
#define speedSEW(Drv) (sdt->sewdrv[(Drv)-1].set_speed)
|
||||||
|
#define speedSEW1 (sdt->sewdrv[0].set_speed)
|
||||||
|
#define speedSEW2 (sdt->sewdrv[1].set_speed)
|
||||||
|
#define speedSEW3 (sdt->sewdrv[2].set_speed)
|
||||||
|
#define vel_SEW(Drv) (sdt->sewdrv[(Drv)-1].mes_speed)
|
||||||
|
#define vel_SEW1 (sdt->sewdrv[0].mes_speed)
|
||||||
|
#define vel_SEW2 (sdt->sewdrv[1].mes_speed)
|
||||||
|
#define vel_SEW3 (sdt->sewdrv[2].mes_speed)
|
||||||
|
#define currentSEW(Drv) (sdt->sewdrv[(Drv)-1].current)
|
||||||
|
#define currentSEW1 (sdt->sewdrv[0].current)
|
||||||
|
#define currentSEW2 (sdt->sewdrv[1].current)
|
||||||
|
#define currentSEW3 (sdt->sewdrv[2].current)
|
||||||
|
#define indexSEW(Drv) (sdt->sewdrv[(Drv)-1].index)
|
||||||
|
#define indexSEW1 (sdt->sewdrv[0].index)
|
||||||
|
#define indexSEW2 (sdt->sewdrv[1].index)
|
||||||
|
#define indexSEW3 (sdt->sewdrv[2].index)
|
||||||
|
#define valueSEW(Drv) (sdt->sewdrv[(Drv)-1].value.l)
|
||||||
|
#define valueSEW1 (sdt->sewdrv[0].value.l)
|
||||||
|
#define valueSEW2 (sdt->sewdrv[1].value.l)
|
||||||
|
#define valueSEW3 (sdt->sewdrv[2].value.l)
|
||||||
|
#define bvalSEW(Drv,Nb) (sdt->sewdrv[(Drv)-1].value.b[Nb])
|
||||||
|
// 23-digit PEP-controllers code
|
||||||
|
#define PEP_code_A (sdt->pep_code_a)
|
||||||
|
#define PEP_code_Z (sdt->pep_code_z)
|
||||||
|
#define PEP_code_P (sdt->pep_code_p)
|
||||||
|
// PEP end-switches code
|
||||||
|
#define switch_A (sdt->pep_sw_a)
|
||||||
|
enum{
|
||||||
|
Sw_minus_A = 1 // negative A value
|
||||||
|
,Sw_plus240_A = 2 // end switch +240degr
|
||||||
|
,Sw_minus240_A = 4 // end switch -240degr
|
||||||
|
,Sw_minus45_A = 8 // "horizon" end switch
|
||||||
|
};
|
||||||
|
#define switch_Z (sdt->pep_sw_z)
|
||||||
|
enum{
|
||||||
|
Sw_0_Z = 1
|
||||||
|
,Sw_5_Z = 2
|
||||||
|
,Sw_20_Z = 4
|
||||||
|
,Sw_60_Z = 8
|
||||||
|
,Sw_80_Z = 0x10
|
||||||
|
,Sw_90_Z = 0x20
|
||||||
|
};
|
||||||
|
#define switch_P (sdt->pep_sw_p)
|
||||||
|
enum{
|
||||||
|
Sw_No_P = 0 // no switches
|
||||||
|
,Sw_22_P = 1 // 22degr
|
||||||
|
,Sw_89_P = 2 // 89degr
|
||||||
|
,Sw_Sm_P = 0x80 // Primary focus smoke sensor
|
||||||
|
};
|
||||||
|
// PEP codes
|
||||||
|
#define PEP_code_F (sdt->pep_code_f)
|
||||||
|
#define PEP_code_D (sdt->pep_code_d)
|
||||||
|
#define PEP_code_Rin (sdt->pep_code_ri)
|
||||||
|
#define PEP_code_Rout (sdt->pep_code_ro)
|
||||||
|
// PEP flags
|
||||||
|
#define PEP_A_On (sdt->pep_on[0])
|
||||||
|
#define PEP_A_Off (PEP_A_On==0)
|
||||||
|
#define PEP_Z_On (sdt->pep_on[1])
|
||||||
|
#define PEP_Z_Off (PEP_Z_On==0)
|
||||||
|
#define PEP_P_On (sdt->pep_on[2])
|
||||||
|
#define PEP_P_Off (PEP_P_On==0)
|
||||||
|
#define PEP_F_On (sdt->pep_on[3])
|
||||||
|
#define PEP_F_Off (PEP_F_On==0)
|
||||||
|
#define PEP_D_On (sdt->pep_on[4])
|
||||||
|
#define PEP_D_Off (PEP_D_On==0)
|
||||||
|
#define PEP_R_On (sdt->pep_on[5])
|
||||||
|
#define PEP_R_Off ((PEP_R_On&1)==0)
|
||||||
|
#define PEP_R_Inp ((PEP_R_On&2)!=0)
|
||||||
|
#define PEP_K_On (sdt->pep_on[6])
|
||||||
|
#define PEP_K_Off ((PEP_K_On&1)==0)
|
||||||
|
#define PEP_K_Inp ((PEP_K_On&2)!=0)
|
||||||
|
// IERS polar motion
|
||||||
|
#define polarX (sdt->xpol)
|
||||||
|
#define polarY (sdt->ypol)
|
||||||
|
// current Julian date, sidereal time correction by "Equation of the Equinoxes"
|
||||||
|
#define JDate (sdt->jdate)
|
||||||
|
#define EE_time (sdt->eetime)
|
||||||
|
// humidity value (%%) & hand input
|
||||||
|
#define val_Hmd (sdt->val_hmd)
|
||||||
|
#define inp_Hmd (sdt->val_hmd)
|
||||||
|
// worm position, mkm
|
||||||
|
#define worm_A (sdt->worm_a)
|
||||||
|
#define worm_Z (sdt->worm_z)
|
||||||
|
// locking flags
|
||||||
|
#define LockFlags (sdt->lock_flags)
|
||||||
|
enum{
|
||||||
|
Lock_A = 1
|
||||||
|
,Lock_Z = 2
|
||||||
|
,Lock_P = 4
|
||||||
|
,Lock_F = 8
|
||||||
|
,Lock_D = 0x10
|
||||||
|
};
|
||||||
|
#define A_Locked (LockFlags&Lock_A)
|
||||||
|
#define Z_Locked (LockFlags&Lock_Z)
|
||||||
|
#define P_Locked (LockFlags&Lock_P)
|
||||||
|
#define F_Locked (LockFlags&Lock_F)
|
||||||
|
#define D_Locked (LockFlags&Lock_D)
|
||||||
|
// SEW dome divers speed
|
||||||
|
#define Dome_Speed (sdt->sew_dome_speed)
|
||||||
|
// SEW dome drive number (for indication)
|
||||||
|
#define DomeSEW_N (sdt->sew_dome_num)
|
||||||
|
// SEW dome driver parameters
|
||||||
|
#define statusSEWD (sdt->sewdomedrv.status) // controller status
|
||||||
|
#define speedSEWD (sdt->sewdomedrv.set_speed) // speed, rpm
|
||||||
|
#define vel_SEWD (sdt->sewdomedrv.mes_speed) /*ÉÚÍÅÒÅÎÎÁÑ ÓËÏÒÏÓÔØ ÏÂ/ÍÉÎ (rpm)*/
|
||||||
|
#define currentSEWD (sdt->sewdomedrv.current) // current, A
|
||||||
|
#define indexSEWD (sdt->sewdomedrv.index) // parameter index
|
||||||
|
#define valueSEWD (sdt->sewdomedrv.value.l) // parameter value
|
||||||
|
// dome PEP codes
|
||||||
|
#define PEP_code_Din (sdt->pep_code_di) // data in
|
||||||
|
#define PEP_Dome_SEW_Ok 0x200
|
||||||
|
#define PEP_Dome_Cable_Ok 0x100
|
||||||
|
#define PEP_code_Dout (sdt->pep_code_do) // data out
|
||||||
|
#define PEP_Dome_SEW_On 0x10
|
||||||
|
#define PEP_Dome_SEW_Off 0x20
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* BTA data structure *
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#define BTA_Data_Ver 2
|
||||||
|
struct BTA_Data {
|
||||||
|
int32_t magic; // magic value
|
||||||
|
int32_t version; // BTA_Data_Ver
|
||||||
|
int32_t size; // sizeof(struct BTA_Data)
|
||||||
|
int32_t pid; // main process PID
|
||||||
|
int32_t model; // model modes
|
||||||
|
int32_t timer; // timer selected
|
||||||
|
int32_t system; // main system mode
|
||||||
|
int32_t sys_target; // system pointing target
|
||||||
|
int32_t tel_focus; // telescope focus type
|
||||||
|
double pc_coeff[8]; // pointing correction system coefficients
|
||||||
|
int32_t tel_state; // telescope state
|
||||||
|
int32_t req_state; // new (required) state
|
||||||
|
int32_t tel_hard_state; // Power state
|
||||||
|
int32_t tel_mode; // telescope mode
|
||||||
|
int32_t az_mode; // azimuth reverce
|
||||||
|
int32_t p2_state; // P2 motor state
|
||||||
|
int32_t p2_req_mode; // P2 required state
|
||||||
|
int32_t focus_state; // focus motor state
|
||||||
|
int32_t dome_state; // dome motors state
|
||||||
|
int32_t pcor_mode; // pointing correction mode
|
||||||
|
int32_t trkok_mode; // tracking mode
|
||||||
|
double i_alpha, i_delta; // input values
|
||||||
|
double s_alpha, s_delta; // source
|
||||||
|
double v_alpha, v_delta; // intrinsic vel.
|
||||||
|
double i_azim, i_zdist; // input A/Z
|
||||||
|
double c_alpha, c_delta; // calculated values
|
||||||
|
double tag_a, tag_z, tag_p; // current values (from sensors)
|
||||||
|
double pcor_a, pcor_z, refr_z; // calculated corrections
|
||||||
|
double tcor_a, tcor_z, tref_z; // reverse calculation corr.
|
||||||
|
double diff_a, diff_z, diff_p; // coords difference
|
||||||
|
double vbasea,vbasez,vbasep; // base object velocity
|
||||||
|
double diffva,diffvz,diffvp; // correction by real speed
|
||||||
|
double speeda,speedz,speedp; // motor speed
|
||||||
|
double m_time_precip; // last precipitation time
|
||||||
|
uint8_t reserve[16]; // reserved
|
||||||
|
double rspeeda, rspeedz, rspeedp; // real motor speed (''/sec)
|
||||||
|
double simvela, simvelz, simvelp, simvelf, simveld; // model speed
|
||||||
|
uint32_t kost; // telescope & hand correction state
|
||||||
|
double m_time, s_time, l_time; // different time (UTC, stellar, local)
|
||||||
|
uint32_t ppndd_a, ppndd_z, ppndd_p, ppndd_b; // PPNDD sensor (rough) code
|
||||||
|
uint32_t dup_a, dup_z, dup_p, dup_f, dup_d; // DUP sensor (precise) code (Gray code)
|
||||||
|
uint32_t low_a, low_z, low_p, low_f, low_d; // binary 14-digit precise code
|
||||||
|
uint32_t code_a, code_z, code_p, code_b, code_f, code_d; // binary 23-digit rough code
|
||||||
|
uint32_t adc[8]; // ADC PCL818 (8-channel) codes
|
||||||
|
double val_a, val_z, val_p, val_b, val_f, val_d;
|
||||||
|
double val_t1, val_t2, val_t3, val_wnd; // calculated values
|
||||||
|
double val_alp, val_del; // RA/Decl calculated by A/Z
|
||||||
|
double vel_a, vel_z, vel_p, vel_f, vel_d; // measured speed
|
||||||
|
// system messages queue
|
||||||
|
struct SysMesg {
|
||||||
|
int32_t seq_num;
|
||||||
|
char type; // message type
|
||||||
|
char text[MesgLen]; // message itself
|
||||||
|
} sys_msg_buf[MesgNum];
|
||||||
|
// access levels
|
||||||
|
uint32_t code_lev[5];
|
||||||
|
// network settings
|
||||||
|
uint32_t netmask, netaddr, acsmask, acsaddr;
|
||||||
|
int32_t meteo_stat; // meteo data
|
||||||
|
double inp_b, inp_t1, inp_t2, inp_t3, inp_wnd; // input meteo values
|
||||||
|
double temper, press; // values used for refraction calculation
|
||||||
|
double m_time10, m_time15; // last wind gust time
|
||||||
|
double dut1; // IERS DUT1 (src: ftp://maia.usno.navy.mil/ser7/ser7.dat), DUT1 = UT1-UTC
|
||||||
|
double a_time, z_time, p_time; // sensors reading time
|
||||||
|
double speedain, speedzin, speedpin; // input speeds
|
||||||
|
double acc_a, acc_z, acc_p, acc_f, acc_d; // acceleration (''/sec^2)
|
||||||
|
uint32_t code_sew; // SEW code
|
||||||
|
struct SEWdata { // sew data
|
||||||
|
int32_t status;
|
||||||
|
double set_speed; // target speed, rpm
|
||||||
|
double mes_speed; // measured speed, rpm
|
||||||
|
double current; // measured current, A
|
||||||
|
int32_t index; // parameter number
|
||||||
|
union{ // parameter code
|
||||||
|
uint8_t b[4];
|
||||||
|
uint32_t l;
|
||||||
|
} value;
|
||||||
|
} sewdrv[3];
|
||||||
|
uint32_t pep_code_a, pep_code_z, pep_code_p; // 23-digit PEP-controllers code
|
||||||
|
uint32_t pep_sw_a, pep_sw_z, pep_sw_p; // PEP end-switches code
|
||||||
|
uint32_t pep_code_f, pep_code_d, pep_code_ri, pep_code_ro; // PEP codes
|
||||||
|
uint8_t pep_on[10]; // PEP flags
|
||||||
|
double xpol, ypol; // IERS polar motion (src: ftp://maia.usno.navy.mil/ser7/ser7.dat)
|
||||||
|
double jdate, eetime; // current Julian date, sidereal time correction by "Equation of the Equinoxes"
|
||||||
|
double val_hmd, inp_hmd; // humidity value (%%) & hand input
|
||||||
|
double worm_a, worm_z; // worm position, mkm
|
||||||
|
/* ÆÌÁÇÉ ÂÌÏËÉÒÏ×ËÉ ÕÐÒÁ×ÌÅÎÉÑ ÕÚÌÁÍÉ */
|
||||||
|
uint32_t lock_flags; // locking flags
|
||||||
|
int32_t sew_dome_speed; // SEW dome divers speed: D_Lplus, D_Hminus etc
|
||||||
|
int32_t sew_dome_num; // SEW dome drive number (for indication)
|
||||||
|
struct SEWdata sewdomedrv; // SEW dome driver parameters
|
||||||
|
uint32_t pep_code_di, pep_code_do; // dome PEP codes
|
||||||
|
};
|
||||||
|
|
||||||
|
extern volatile struct BTA_Data *sdt;
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Local data structure *
|
||||||
|
*******************************************************************************/
|
||||||
|
// Oil pressure, MPa
|
||||||
|
#define PressOilA (sdtl->pr_oil_a)
|
||||||
|
#define PressOilZ (sdtl->pr_oil_z)
|
||||||
|
#define PressOilTank (sdtl->pr_oil_t)
|
||||||
|
// Oil themperature, degrC
|
||||||
|
#define OilTemper1 (sdtl->t_oil_1) // oil
|
||||||
|
#define OilTemper2 (sdtl->t_oil_2) // water
|
||||||
|
|
||||||
|
// Local data structure
|
||||||
|
struct BTA_Local {
|
||||||
|
uint8_t reserve[120]; // reserved data
|
||||||
|
double pr_oil_a,pr_oil_z,pr_oil_t; // Oil pressure
|
||||||
|
double t_oil_1,t_oil_2; // Oil themperature
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message buffer structure
|
||||||
|
*/
|
||||||
|
struct my_msgbuf {
|
||||||
|
int32_t mtype; // message type
|
||||||
|
uint32_t acckey; // client access key
|
||||||
|
uint32_t src_pid; // source PID
|
||||||
|
uint32_t src_ip; // IP of command source or 0 for local
|
||||||
|
char mtext[100]; // message itself
|
||||||
|
};
|
||||||
|
|
||||||
|
extern volatile struct BTA_Local *sdtl;
|
||||||
|
extern int snd_id;
|
||||||
|
extern int cmd_src_pid;
|
||||||
|
extern uint32_t cmd_src_ip;
|
||||||
|
|
||||||
|
#define ClientSide 0
|
||||||
|
#define ServerSide 1
|
||||||
|
|
||||||
|
#ifndef BTA_MODULE
|
||||||
|
void bta_data_init();
|
||||||
|
int bta_data_check();
|
||||||
|
void bta_data_close();
|
||||||
|
int get_shm_block(volatile struct SHM_Block *sb, int server);
|
||||||
|
int close_shm_block(volatile struct SHM_Block *sb);
|
||||||
|
void get_cmd_queue(struct CMD_Queue *cq, int server);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int check_shm_block(volatile struct SHM_Block *sb);
|
||||||
|
|
||||||
|
void encode_lev_passwd(char *passwd, int nlev, uint32_t *keylev, uint32_t *codlev);
|
||||||
|
int find_lev_passwd(char *passwd, uint32_t *keylev, uint32_t *codlev);
|
||||||
|
int check_lev_passwd(char *passwd);
|
||||||
|
void set_acckey(uint32_t newkey);
|
||||||
|
|
||||||
|
// restore packing
|
||||||
|
#pragma pack(pop)
|
||||||
|
//#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
#endif // __BTA_SHDATA_H__
|
||||||
24
Daemons/weatherdaemon.deprecated/chkweather
Normal file
24
Daemons/weatherdaemon.deprecated/chkweather
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
badsky=1700
|
||||||
|
[ $# = 1 ] && badsky=$1
|
||||||
|
|
||||||
|
export http_proxy=""
|
||||||
|
|
||||||
|
Q="192.168.70.33:12345"
|
||||||
|
ANS=$(curl $Q 2>/dev/null)
|
||||||
|
retval=$?
|
||||||
|
[ $retval -ne "0" ] && exit $retval
|
||||||
|
[ "$ANS" = "No data" ] && exit 2
|
||||||
|
Rain=1
|
||||||
|
Clouds=0
|
||||||
|
Wind=100
|
||||||
|
eval $ANS
|
||||||
|
retval=0
|
||||||
|
clouds=$(echo "$Clouds" | sed 's/\..*//g')
|
||||||
|
wind=$(echo "$Wind" | sed 's/\..*//g')
|
||||||
|
[ $Rain -ne "0" ] && retval=1
|
||||||
|
[ $clouds -lt "$badsky" ] && retval=1
|
||||||
|
[ $wind -gt "15" ] && retval=1
|
||||||
|
echo "$ANS"
|
||||||
|
exit $retval
|
||||||
93
Daemons/weatherdaemon.deprecated/cmdlnopts.c
Normal file
93
Daemons/weatherdaemon.deprecated/cmdlnopts.c
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the weatherdaemon project.
|
||||||
|
* Copyright 2021 Edward V. Emelianov <edward.emelianoff@gmail.com>.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <usefull_macros.h>
|
||||||
|
#include "cmdlnopts.h"
|
||||||
|
#include "term.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* here are global parameters initialisation
|
||||||
|
*/
|
||||||
|
int help;
|
||||||
|
static glob_pars G;
|
||||||
|
|
||||||
|
// default values for Gdefault & help
|
||||||
|
#define DEFAULT_PORT "12345"
|
||||||
|
#define DEFAULT_PID "/tmp/weatherdaemon.pid"
|
||||||
|
|
||||||
|
// DEFAULTS
|
||||||
|
// default global parameters
|
||||||
|
glob_pars const Gdefault = {
|
||||||
|
.device = NULL,
|
||||||
|
.port = DEFAULT_PORT,
|
||||||
|
.logfile = NULL,
|
||||||
|
.verb = 0,
|
||||||
|
.tty_speed = 9600,
|
||||||
|
.rest_pars = NULL,
|
||||||
|
.rest_pars_num = 0,
|
||||||
|
.emul = 0,
|
||||||
|
.pidfile = DEFAULT_PID
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define command line options by filling structure:
|
||||||
|
* name has_arg flag val type argptr help
|
||||||
|
*/
|
||||||
|
myoption cmdlnopts[] = {
|
||||||
|
// common options
|
||||||
|
{"help", NO_ARGS, NULL, 'h', arg_int, APTR(&help), _("show this help")},
|
||||||
|
{"device", NEED_ARG, NULL, 'd', arg_string, APTR(&G.device), _("serial device name (default: none)")},
|
||||||
|
{"port", NEED_ARG, NULL, 'p', arg_string, APTR(&G.port), _("network port to connect (default: " DEFAULT_PORT ")")},
|
||||||
|
{"logfile", NEED_ARG, NULL, 'l', arg_string, APTR(&G.logfile), _("save logs to file (default: none)")},
|
||||||
|
{"verb", NO_ARGS, NULL, 'v', arg_none, APTR(&G.verb), _("logfile verbocity level (each -v increase it)")},
|
||||||
|
{"baudrate",NEED_ARG, NULL, 'b', arg_int, APTR(&G.tty_speed), _("serial terminal baudrate (default: 9600)")},
|
||||||
|
{"emulation",NO_ARGS, NULL, 'e', arg_int, APTR(&G.emul), _("emulate serial device")},
|
||||||
|
{"pidfile", NEED_ARG, NULL, 'P', arg_string, APTR(&G.pidfile), _("pidfile name (default: " DEFAULT_PID ")")},
|
||||||
|
end_option
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 *parse_args(int argc, char **argv){
|
||||||
|
int i;
|
||||||
|
void *ptr;
|
||||||
|
ptr = memcpy(&G, &Gdefault, sizeof(G)); assert(ptr);
|
||||||
|
// format of help: "Usage: progname [args]\n"
|
||||||
|
change_helpstring("Usage: %s [args]\n\n\tWhere args are:\n");
|
||||||
|
// parse arguments
|
||||||
|
parseargs(&argc, &argv, cmdlnopts);
|
||||||
|
if(help) showhelp(-1, cmdlnopts);
|
||||||
|
if(argc > 0){
|
||||||
|
G.rest_pars_num = argc;
|
||||||
|
G.rest_pars = calloc(argc, sizeof(char*));
|
||||||
|
for (i = 0; i < argc; i++)
|
||||||
|
G.rest_pars[i] = strdup(argv[i]);
|
||||||
|
}
|
||||||
|
return &G;
|
||||||
|
}
|
||||||
|
|
||||||
44
Daemons/weatherdaemon.deprecated/cmdlnopts.h
Normal file
44
Daemons/weatherdaemon.deprecated/cmdlnopts.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the weatherdaemon project.
|
||||||
|
* Copyright 2021 Edward V. Emelianov <edward.emelianoff@gmail.com>.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef __CMDLNOPTS_H__
|
||||||
|
#define __CMDLNOPTS_H__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* here are some typedef's for global data
|
||||||
|
*/
|
||||||
|
typedef struct{
|
||||||
|
char *device; // serial device name
|
||||||
|
char *port; // port to connect
|
||||||
|
char *logfile; // logfile name
|
||||||
|
int terminal; // run as terminal
|
||||||
|
int echo; // echo user commands back
|
||||||
|
int verb; // verbocity level
|
||||||
|
int tty_speed; // serial terminal baudrate
|
||||||
|
int emul; // emulation of serial device
|
||||||
|
char *pidfile; // pidfile name
|
||||||
|
int rest_pars_num; // number of rest parameters
|
||||||
|
char** rest_pars; // the rest parameters: array of char* (path to logfile and thrash)
|
||||||
|
} glob_pars;
|
||||||
|
|
||||||
|
|
||||||
|
glob_pars *parse_args(int argc, char **argv);
|
||||||
|
#endif // __CMDLNOPTS_H__
|
||||||
90
Daemons/weatherdaemon.deprecated/main.c
Normal file
90
Daemons/weatherdaemon.deprecated/main.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the weatherdaemon project.
|
||||||
|
* Copyright 2021 Edward V. Emelianov <edward.emelianoff@gmail.com>.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/wait.h> // wait
|
||||||
|
#include <sys/prctl.h> //prctl
|
||||||
|
#include <usefull_macros.h>
|
||||||
|
|
||||||
|
#include "bta_shdata.h"
|
||||||
|
#include "cmdlnopts.h"
|
||||||
|
#include "socket.h"
|
||||||
|
#include "term.h"
|
||||||
|
|
||||||
|
glob_pars *GP;
|
||||||
|
|
||||||
|
void signals(int signo){
|
||||||
|
restore_console();
|
||||||
|
if(ttydescr) close_tty(&ttydescr);
|
||||||
|
LOGERR("exit with status %d", signo);
|
||||||
|
exit(signo);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv){
|
||||||
|
initial_setup();
|
||||||
|
signal(SIGTERM, signals); // kill (-15) - quit
|
||||||
|
signal(SIGHUP, SIG_IGN); // hup - ignore
|
||||||
|
signal(SIGINT, signals); // ctrl+C - quit
|
||||||
|
signal(SIGQUIT, signals); // ctrl+\ - quit
|
||||||
|
signal(SIGTSTP, SIG_IGN); // ignore ctrl+Z
|
||||||
|
#ifndef EBUG
|
||||||
|
char *self = strdup(argv[0]);
|
||||||
|
#endif
|
||||||
|
GP = parse_args(argc, argv);
|
||||||
|
if(GP->logfile){
|
||||||
|
sl_loglevel lvl = LOGLEVEL_ERR;
|
||||||
|
for(; GP->verb && lvl < LOGLEVEL_ANY; --GP->verb) ++lvl;
|
||||||
|
DBG("Loglevel: %d", lvl);
|
||||||
|
if(!OPENLOG(GP->logfile, lvl, 1)) ERRX("Can't open log file");
|
||||||
|
LOGERR("Started");
|
||||||
|
}
|
||||||
|
#ifndef EBUG
|
||||||
|
if(daemon(1, 0)){
|
||||||
|
ERR("daemon()");
|
||||||
|
}
|
||||||
|
check4running(self, GP->pidfile);
|
||||||
|
while(1){ // guard for dead processes
|
||||||
|
pid_t childpid = fork();
|
||||||
|
if(childpid){
|
||||||
|
LOGDBG("create child with PID %d\n", childpid);
|
||||||
|
DBG("Created child with PID %d\n", childpid);
|
||||||
|
wait(NULL);
|
||||||
|
WARNX("Child %d died\n", childpid);
|
||||||
|
LOGWARN("Child %d died\n", childpid);
|
||||||
|
sleep(1);
|
||||||
|
}else{
|
||||||
|
prctl(PR_SET_PDEATHSIG, SIGTERM); // send SIGTERM to child when parent dies
|
||||||
|
break; // go out to normal functional
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(!get_shm_block( &sdat, ClientSide)) WARNX("Can't get BTA shared memory block");
|
||||||
|
if(GP->device) if(!try_connect(GP->device, GP->tty_speed)){
|
||||||
|
LOGERR("Can't connect to device");
|
||||||
|
ERRX("Can't connect to device");
|
||||||
|
}
|
||||||
|
if(!GP->device && !GP->emul){
|
||||||
|
LOGERR("Need serial device name or emulation flag");
|
||||||
|
ERRX("Need serial device name or emulation flag");
|
||||||
|
}
|
||||||
|
daemonize(GP->port);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
347
Daemons/weatherdaemon.deprecated/socket.c
Normal file
347
Daemons/weatherdaemon.deprecated/socket.c
Normal file
@ -0,0 +1,347 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the weatherdaemon project.
|
||||||
|
* Copyright 2021 Edward V. Emelianov <edward.emelianoff@gmail.com>.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <netdb.h> // addrinfo
|
||||||
|
#include <arpa/inet.h> // inet_ntop
|
||||||
|
#include <limits.h> // INT_xxx
|
||||||
|
#include <poll.h> // poll
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <signal.h> // pthread_kill
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/syscall.h> // syscall
|
||||||
|
#include <unistd.h> // daemon
|
||||||
|
#include <usefull_macros.h>
|
||||||
|
|
||||||
|
#include "cmdlnopts.h" // glob_pars
|
||||||
|
#include "socket.h"
|
||||||
|
#include "term.h"
|
||||||
|
|
||||||
|
// temporary buffers
|
||||||
|
#define BUFLEN (1024)
|
||||||
|
// Max amount of connections
|
||||||
|
#define BACKLOG (30)
|
||||||
|
|
||||||
|
extern glob_pars *GP;
|
||||||
|
|
||||||
|
static char *answer = NULL;
|
||||||
|
static int freshdata = 0;
|
||||||
|
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
/**************** SERVER FUNCTIONS ****************/
|
||||||
|
/**
|
||||||
|
* Send data over socket
|
||||||
|
* @param sock - socket fd
|
||||||
|
* @param webquery - ==1 if this is web query
|
||||||
|
* @param textbuf - zero-trailing buffer with data to send
|
||||||
|
* @return 1 if all OK
|
||||||
|
*/
|
||||||
|
static int send_data(int sock, int webquery, char *textbuf){
|
||||||
|
ssize_t L, Len;
|
||||||
|
char tbuf[BUFLEN];
|
||||||
|
Len = strlen(textbuf);
|
||||||
|
// OK buffer ready, prepare to send it
|
||||||
|
if(webquery){
|
||||||
|
L = snprintf((char*)tbuf, BUFLEN,
|
||||||
|
"HTTP/2.0 200 OK\r\n"
|
||||||
|
"Access-Control-Allow-Origin: *\r\n"
|
||||||
|
"Access-Control-Allow-Methods: GET, POST\r\n"
|
||||||
|
"Access-Control-Allow-Credentials: true\r\n"
|
||||||
|
"Content-type: text/plain\r\nContent-Length: %zd\r\n\r\n", Len);
|
||||||
|
if(L < 0){
|
||||||
|
WARN("sprintf()");
|
||||||
|
LOGWARN("sprintf()");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(L != write(sock, tbuf, L)){
|
||||||
|
LOGWARN("Can't write header");
|
||||||
|
WARN("write");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// send data
|
||||||
|
//DBG("send %zd bytes\nBUF: %s", Len, buf);
|
||||||
|
if(Len != write(sock, textbuf, Len)){
|
||||||
|
WARN("write()");
|
||||||
|
LOGERR("send_data(): write() failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//LOGDBG("fd %d, write %s", sock, textbuf);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// search a first word after needle without spaces
|
||||||
|
static char* stringscan(char *str, char *needle){
|
||||||
|
char *a;//, *e;
|
||||||
|
char *end = str + strlen(str);
|
||||||
|
a = strstr(str, needle);
|
||||||
|
if(!a) return NULL;
|
||||||
|
a += strlen(needle);
|
||||||
|
while (a < end && (*a == ' ' || *a == '\r' || *a == '\t' || *a == '\r')) a++;
|
||||||
|
if(a >= end) return NULL;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief handle_socket - read information from socket
|
||||||
|
* @param sock - socket fd
|
||||||
|
* @param chkheader - ==1 on first run
|
||||||
|
* @return 1 if socket closed
|
||||||
|
*/
|
||||||
|
static int handle_socket(int sock, int notchkhdr){
|
||||||
|
FNAME();
|
||||||
|
int webquery = 0; // whether query is web or regular
|
||||||
|
char buff[BUFLEN];
|
||||||
|
ssize_t rd;
|
||||||
|
if(!(rd = read(sock, buff, BUFLEN-1))){
|
||||||
|
//LOGMSG("Client %d closed", sock);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//LOG("client send %zd bytes", rd);
|
||||||
|
DBG("Got %zd bytes", rd);
|
||||||
|
if(rd < 0){ // error
|
||||||
|
LOGWARN("Client %d close socket on error", sock);
|
||||||
|
DBG("Nothing to read from fd %d (ret: %zd)", sock, rd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// add trailing zero to be on the safe side
|
||||||
|
buff[rd] = 0;
|
||||||
|
// now we should check what do user want
|
||||||
|
char *found = buff;
|
||||||
|
DBG("user send: %s", buff);
|
||||||
|
if(!notchkhdr){
|
||||||
|
if(0 == strncmp(buff, "GET", 3)){
|
||||||
|
DBG("GET");
|
||||||
|
// GET web query have format GET /some.resource
|
||||||
|
webquery = 1;
|
||||||
|
char *slash = strchr(buff, '/');
|
||||||
|
if(slash){
|
||||||
|
found = slash + 1;
|
||||||
|
char *eol = strstr(found, "HTTP");
|
||||||
|
if(eol) *eol = 0;
|
||||||
|
}
|
||||||
|
}else if(0 == strncmp(buff, "POST", 4)){
|
||||||
|
DBG("POST");
|
||||||
|
webquery = 1;
|
||||||
|
// search content length of POST query
|
||||||
|
char *cl = stringscan(buff, "Content-Length:");
|
||||||
|
if(cl){
|
||||||
|
int contlen = atoi(cl);
|
||||||
|
int l = strlen(buff);
|
||||||
|
if(contlen && l > contlen) found = &buff[l - contlen];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// here we can process user data
|
||||||
|
DBG("found=%s", found);
|
||||||
|
LOGDBG("sockfd=%d, got %s", sock, buff);
|
||||||
|
if(GP->echo){
|
||||||
|
if(!send_data(sock, webquery, found)){
|
||||||
|
LOGWARN("Can't send data, some error occured");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(answer) send_data(sock, webquery, answer);
|
||||||
|
else send_data(sock, webquery, "No data\n");
|
||||||
|
if(webquery) return 1; // close web query after message processing
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// main socket server
|
||||||
|
static void *server(void *asock){
|
||||||
|
LOGMSG("server()");
|
||||||
|
int sock = *((int*)asock);
|
||||||
|
if(listen(sock, BACKLOG) == -1){
|
||||||
|
LOGERR("listen() failed");
|
||||||
|
WARN("listen");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
int nfd = 1; // current fd amount in poll_set
|
||||||
|
struct pollfd poll_set[MAX_FDS];
|
||||||
|
int notchkhdr[MAX_FDS];
|
||||||
|
memset(poll_set, 0, sizeof(poll_set));
|
||||||
|
memset(notchkhdr, 0, sizeof(notchkhdr));
|
||||||
|
poll_set[0].fd = sock;
|
||||||
|
poll_set[0].events = POLLIN;
|
||||||
|
double lastdatat = dtime();
|
||||||
|
while(1){
|
||||||
|
poll(poll_set, nfd, 1); // poll for 1ms
|
||||||
|
for(int fdidx = 0; fdidx < nfd; ++fdidx){ // poll opened FDs
|
||||||
|
if((poll_set[fdidx].revents & POLLIN) == 0) continue;
|
||||||
|
poll_set[fdidx].revents = 0;
|
||||||
|
if(fdidx){ // client
|
||||||
|
int fd = poll_set[fdidx].fd;
|
||||||
|
if(handle_socket(fd, notchkhdr[fdidx])){ // socket closed - remove it from list
|
||||||
|
close(fd);
|
||||||
|
DBG("Client with fd %d closed", fd);
|
||||||
|
LOGMSG("Client %d disconnected", fd);
|
||||||
|
// move last to free space
|
||||||
|
poll_set[fdidx] = poll_set[nfd - 1];
|
||||||
|
notchkhdr[fdidx] = notchkhdr[nfd - 1];
|
||||||
|
--nfd;
|
||||||
|
}else notchkhdr[fdidx] = 1;
|
||||||
|
}else{ // server
|
||||||
|
socklen_t size = sizeof(struct sockaddr_in);
|
||||||
|
struct sockaddr_in their_addr;
|
||||||
|
int newsock = accept(sock, (struct sockaddr*)&their_addr, &size);
|
||||||
|
if(newsock <= 0){
|
||||||
|
LOGERR("server(): accept() failed");
|
||||||
|
WARN("accept()");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
struct in_addr ipAddr = their_addr.sin_addr;
|
||||||
|
char str[INET_ADDRSTRLEN];
|
||||||
|
inet_ntop(AF_INET, &ipAddr, str, INET_ADDRSTRLEN);
|
||||||
|
DBG("Connection from %s, give fd=%d", str, newsock);
|
||||||
|
LOGMSG("Got connection from %s, fd=%d", str, newsock);
|
||||||
|
if(nfd == MAX_FDS){
|
||||||
|
LOGWARN("Max amount of connections: disconnect %s (%d)", str, newsock);
|
||||||
|
send_data(newsock, 0, "Max amount of connections reached!\n");
|
||||||
|
WARNX("Limit of connections reached");
|
||||||
|
close(newsock);
|
||||||
|
}else{
|
||||||
|
memset(&poll_set[nfd], 0, sizeof(struct pollfd));
|
||||||
|
poll_set[nfd].fd = newsock;
|
||||||
|
poll_set[nfd].events = POLLIN;
|
||||||
|
notchkhdr[nfd] = 0;
|
||||||
|
++nfd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // endfor
|
||||||
|
if(freshdata && answer){ // send new data to all
|
||||||
|
freshdata = 0;
|
||||||
|
lastdatat = dtime();
|
||||||
|
for(int fdidx = 1; fdidx < nfd; ++fdidx){
|
||||||
|
if(notchkhdr[fdidx])
|
||||||
|
send_data(poll_set[fdidx].fd, 0, answer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dtime() - lastdatat > NODATA_TMOUT){
|
||||||
|
LOGERR("No data timeout");
|
||||||
|
ERRX("No data timeout");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOGERR("server(): UNREACHABLE CODE REACHED!");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *ttyparser(_U_ void *notused){
|
||||||
|
double tlast = 0;
|
||||||
|
while(1){
|
||||||
|
if(dtime() - tlast > T_INTERVAL){
|
||||||
|
char *got = poll_device();
|
||||||
|
if(got){
|
||||||
|
if (0 == pthread_mutex_lock(&mutex)){
|
||||||
|
FREE(answer);
|
||||||
|
answer = strdup(got);
|
||||||
|
freshdata = 1;
|
||||||
|
pthread_mutex_unlock(&mutex);
|
||||||
|
}
|
||||||
|
tlast = dtime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// data gathering & socket management
|
||||||
|
static void daemon_(int sock){
|
||||||
|
if(sock < 0) return;
|
||||||
|
pthread_t sock_thread, parser_thread;
|
||||||
|
if(pthread_create(&sock_thread, NULL, server, (void*) &sock)){
|
||||||
|
LOGERR("daemon_(): pthread_create(sock_thread) failed");
|
||||||
|
ERR("pthread_create()");
|
||||||
|
}
|
||||||
|
if(pthread_create(&parser_thread, NULL, ttyparser, NULL)){
|
||||||
|
LOGERR("daemon_(): pthread_create(parser_thread) failed");
|
||||||
|
ERR("pthread_create()");
|
||||||
|
}
|
||||||
|
do{
|
||||||
|
if(pthread_kill(sock_thread, 0) == ESRCH){ // died
|
||||||
|
WARNX("Sockets thread died");
|
||||||
|
LOGWARN("Sockets thread died");
|
||||||
|
pthread_join(sock_thread, NULL);
|
||||||
|
if(pthread_create(&sock_thread, NULL, server, (void*) &sock)){
|
||||||
|
LOGERR("daemon_(): new pthread_create() failed");
|
||||||
|
ERR("pthread_create()");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(pthread_kill(parser_thread, 0) == ESRCH){ // died
|
||||||
|
WARNX("TTY thread died");
|
||||||
|
LOGWARN("TTY thread died");
|
||||||
|
pthread_join(parser_thread, NULL);
|
||||||
|
if(pthread_create(&parser_thread, NULL, ttyparser, NULL)){
|
||||||
|
LOGERR("daemon_(): new pthread_create(parser_thread) failed");
|
||||||
|
ERR("pthread_create()");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
usleep(1000); // sleep a little
|
||||||
|
}while(1);
|
||||||
|
LOGERR("daemon_(): UNREACHABLE CODE REACHED!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run daemon service
|
||||||
|
*/
|
||||||
|
void daemonize(char *port){
|
||||||
|
FNAME();
|
||||||
|
int sock = -1;
|
||||||
|
struct addrinfo hints, *res, *p;
|
||||||
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_family = AF_INET;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
hints.ai_flags = AI_PASSIVE;
|
||||||
|
// To accept only local sockets replace NULL with "127.0.0.1" and remove AI_PASSIVE
|
||||||
|
if(getaddrinfo(NULL, port, &hints, &res) != 0){
|
||||||
|
LOGERR("getaddrinfo");
|
||||||
|
ERR("getaddrinfo");
|
||||||
|
}
|
||||||
|
struct sockaddr_in *ia = (struct sockaddr_in*)res->ai_addr;
|
||||||
|
char str[INET_ADDRSTRLEN];
|
||||||
|
inet_ntop(AF_INET, &(ia->sin_addr), str, INET_ADDRSTRLEN);
|
||||||
|
// loop through all the results and bind to the first we can
|
||||||
|
for(p = res; p != NULL; p = p->ai_next){
|
||||||
|
if((sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1){
|
||||||
|
WARN("socket");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int reuseaddr = 1;
|
||||||
|
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(int)) == -1){
|
||||||
|
LOGERR("setsockopt() error");
|
||||||
|
ERR("setsockopt");
|
||||||
|
}
|
||||||
|
if(bind(sock, p->ai_addr, p->ai_addrlen) == -1){
|
||||||
|
close(sock);
|
||||||
|
WARN("bind");
|
||||||
|
LOGWARN("bind() error");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break; // if we get here, we have a successfull connection
|
||||||
|
}
|
||||||
|
if(p == NULL){
|
||||||
|
LOGERR("daemonize(): failed to bind socket, exit");
|
||||||
|
// looped off the end of the list with no successful bind
|
||||||
|
ERRX("failed to bind socket");
|
||||||
|
}
|
||||||
|
freeaddrinfo(res);
|
||||||
|
daemon_(sock);
|
||||||
|
close(sock);
|
||||||
|
LOGERR("daemonize(): UNREACHABLE CODE REACHED!");
|
||||||
|
signals(0);
|
||||||
|
}
|
||||||
|
|
||||||
32
Daemons/weatherdaemon.deprecated/socket.h
Normal file
32
Daemons/weatherdaemon.deprecated/socket.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the weatherdaemon project.
|
||||||
|
* Copyright 2021 Edward V. Emelianov <edward.emelianoff@gmail.com>.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef __SOCKET_H__
|
||||||
|
#define __SOCKET_H__
|
||||||
|
|
||||||
|
// time interval for data polling (seconds)
|
||||||
|
#define T_INTERVAL (10.)
|
||||||
|
// max amount of opened fd (+1 for server socket)
|
||||||
|
#define MAX_FDS (11)
|
||||||
|
// no data timeout
|
||||||
|
#define NODATA_TMOUT (90.)
|
||||||
|
|
||||||
|
void daemonize(char *port);
|
||||||
|
|
||||||
|
#endif // __SOCKET_H__
|
||||||
159
Daemons/weatherdaemon.deprecated/term.c
Normal file
159
Daemons/weatherdaemon.deprecated/term.c
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the weatherdaemon project.
|
||||||
|
* Copyright 2021 Edward V. Emelianov <edward.emelianoff@gmail.com>.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h> // isspace
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <strings.h> // strncasecmp
|
||||||
|
#include <time.h> // time(NULL)
|
||||||
|
#include <limits.h> // INT_MAX, INT_MIN
|
||||||
|
|
||||||
|
#include "bta_shdata.h"
|
||||||
|
#include "cmdlnopts.h"
|
||||||
|
#include "term.h"
|
||||||
|
|
||||||
|
#define BUFLEN (4096)
|
||||||
|
|
||||||
|
TTY_descr *ttydescr = NULL;
|
||||||
|
extern glob_pars *GP;
|
||||||
|
|
||||||
|
static char buf[BUFLEN];
|
||||||
|
static const char *emultemplate = "<?U> 06:50:36, 20.01.00, TE-2.20, DR1405.50, WU2057.68, RT0.00, WK1.00, WR177.80, WT-2.20, FE0.69, RE0.00, WG7.36, WV260.03, TI0.00, FI0.00,";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* read strings from terminal (ending with '\n') with timeout
|
||||||
|
* @return NULL if nothing was read or pointer to static buffer
|
||||||
|
*/
|
||||||
|
static char *read_string(){
|
||||||
|
//static int done = 0;
|
||||||
|
if(GP->emul){
|
||||||
|
//if(done) return NULL;
|
||||||
|
strncpy(buf, emultemplate, BUFLEN);
|
||||||
|
//done = 1;
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
if(!ttydescr) ERRX("Serial device not initialized");
|
||||||
|
size_t r = 0, l;
|
||||||
|
int LL = BUFLEN - 1;
|
||||||
|
char *ptr = buf;
|
||||||
|
double d0 = dtime();
|
||||||
|
do{
|
||||||
|
if((l = read_tty(ttydescr))){
|
||||||
|
strncpy(ptr, ttydescr->buf, LL);
|
||||||
|
r += l; LL -= l; ptr += l;
|
||||||
|
DBG("l=%zd, r=%zd, LL=%d", l, r, LL);
|
||||||
|
d0 = dtime();
|
||||||
|
}
|
||||||
|
}while(dtime() - d0 < WAIT_TMOUT && LL);
|
||||||
|
if(r){
|
||||||
|
//buf[r] = 0;
|
||||||
|
DBG("buf: %s", buf);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to connect to `device` at baudrate speed
|
||||||
|
* @return 1 if OK
|
||||||
|
*/
|
||||||
|
int try_connect(char *device, int baudrate){
|
||||||
|
if(!device) return 0;
|
||||||
|
fflush(stdout);
|
||||||
|
ttydescr = new_tty(device, baudrate, 1024);
|
||||||
|
if(ttydescr) ttydescr = tty_open(ttydescr, 1); // exclusive open
|
||||||
|
if(!ttydescr) return 0;
|
||||||
|
while(read_tty(ttydescr)); // clear rbuf
|
||||||
|
LOGMSG("Connected to %s", device);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief getpar - get parameter value
|
||||||
|
* @param string (i) - string where to search
|
||||||
|
* @param Val (o) - value found
|
||||||
|
* @param Name - parameter name
|
||||||
|
* @return TRUE if found
|
||||||
|
*/
|
||||||
|
static int getpar(char *string, double *Val, char *Name){
|
||||||
|
if(!string || !Val || !Name) return FALSE;
|
||||||
|
char *p = strstr(string, Name);
|
||||||
|
if(!p) return FALSE;
|
||||||
|
p += strlen(Name);
|
||||||
|
DBG("search %s", Name);
|
||||||
|
char *endptr;
|
||||||
|
*Val = strtod(p, &endptr);
|
||||||
|
DBG("eptr=%s, val=%g", endptr, *Val);
|
||||||
|
if(endptr == string){
|
||||||
|
WARNX("Double value not found");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Poll serial port for new dataportion
|
||||||
|
* @return: NULL if no data received, pointer to string if valid data received
|
||||||
|
*/
|
||||||
|
char *poll_device(){
|
||||||
|
FNAME();
|
||||||
|
static char ans[BUFLEN];
|
||||||
|
char *ptr = ans, *r = NULL;
|
||||||
|
if(!GP->emul){
|
||||||
|
if(write_tty(ttydescr->comfd, "?U\r\n", 4))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
double t0 = dtime();
|
||||||
|
while(dtime() - t0 < T_POLLING_TMOUT){
|
||||||
|
if((r = read_string())){ // parse new data
|
||||||
|
DBG("got %s", r);
|
||||||
|
if(strncmp(r, "<?U>", 4)){
|
||||||
|
WARNX("Wrong answer");
|
||||||
|
LOGWARN("poll_device() get wrong answer: %s", r);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
r += 4;
|
||||||
|
DBG("R=%s", r);
|
||||||
|
while(*r){if(isspace(*r)) ++r; else break;}
|
||||||
|
DBG("R=%s", r);
|
||||||
|
char *eol = strchr(r, '\n');
|
||||||
|
if(eol) *eol = 0;
|
||||||
|
double d;
|
||||||
|
size_t L = BUFLEN, l;
|
||||||
|
#define PRINT(...) do{l = snprintf(ptr, L, __VA_ARGS__); if(l > 0){ L -= l; ptr += l;}}while(0)
|
||||||
|
if(getpar(r, &d, "RT")) PRINT("Rain=%g\n", d);
|
||||||
|
if(getpar(r, &d, "WU")) PRINT("Clouds=%.1f\n", d);
|
||||||
|
if(getpar(r, &d, "TE")) PRINT("Exttemp=%.1f\n", d);
|
||||||
|
if(getpar(r, &d, "WG")) PRINT("Wind=%.1f\n", d/3.6);
|
||||||
|
// now get BTA parameters
|
||||||
|
if(check_shm_block(&sdat)){
|
||||||
|
PRINT("BTAExttemp=%.1f\n", val_T1);
|
||||||
|
PRINT("BTAPres=%.1f\n", val_B);
|
||||||
|
PRINT("BTAWind=%.1f\n", val_Wnd);
|
||||||
|
PRINT("BTAHumid=%.1f\n", val_Hmd);
|
||||||
|
}
|
||||||
|
#undef PRINT
|
||||||
|
snprintf(ptr, L, "Time=%lld\n", (long long)time(NULL));
|
||||||
|
DBG("Buffer: %s", ans);
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
37
Daemons/weatherdaemon.deprecated/term.h
Normal file
37
Daemons/weatherdaemon.deprecated/term.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the weatherdaemon project.
|
||||||
|
* Copyright 2021 Edward V. Emelianov <edward.emelianoff@gmail.com>.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#ifndef __TERM_H__
|
||||||
|
#define __TERM_H__
|
||||||
|
|
||||||
|
#include <usefull_macros.h>
|
||||||
|
|
||||||
|
#define FRAME_MAX_LENGTH (300)
|
||||||
|
#define MAX_MEMORY_DUMP_SIZE (0x800 * 4)
|
||||||
|
// Terminal timeout (seconds)
|
||||||
|
#define WAIT_TMOUT (0.5)
|
||||||
|
// Terminal polling timeout - 1 second
|
||||||
|
#define T_POLLING_TMOUT (1.0)
|
||||||
|
|
||||||
|
extern TTY_descr *ttydescr;
|
||||||
|
void run_terminal();
|
||||||
|
int try_connect(char *device, int baudrate);
|
||||||
|
char *poll_device();
|
||||||
|
|
||||||
|
#endif // __TERM_H__
|
||||||
1
Daemons/weatherdaemon.deprecated/weatherdaemon.cflags
Normal file
1
Daemons/weatherdaemon.deprecated/weatherdaemon.cflags
Normal file
@ -0,0 +1 @@
|
|||||||
|
-std=c17
|
||||||
1
Daemons/weatherdaemon.deprecated/weatherdaemon.config
Normal file
1
Daemons/weatherdaemon.deprecated/weatherdaemon.config
Normal file
@ -0,0 +1 @@
|
|||||||
|
#define EBUG 1
|
||||||
1
Daemons/weatherdaemon.deprecated/weatherdaemon.creator
Normal file
1
Daemons/weatherdaemon.deprecated/weatherdaemon.creator
Normal file
@ -0,0 +1 @@
|
|||||||
|
[General]
|
||||||
157
Daemons/weatherdaemon.deprecated/weatherdaemon.creator.user
Normal file
157
Daemons/weatherdaemon.deprecated/weatherdaemon.creator.user
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE QtCreatorProject>
|
||||||
|
<!-- Written by QtCreator 4.12.3, 2021-06-09T21:11:29. -->
|
||||||
|
<qtcreator>
|
||||||
|
<data>
|
||||||
|
<variable>EnvironmentId</variable>
|
||||||
|
<value type="QByteArray">{7bd84e39-ca37-46d3-be9d-99ebea85bc0d}</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||||
|
<value type="int">0</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||||
|
<value type="QString" key="language">Cpp</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||||
|
<value type="QString" key="language">QmlJS</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||||
|
<value type="QByteArray" key="EditorConfiguration.Codec">KOI8-R</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanIndentation">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||||
|
<valuemap type="QVariantMap"/>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{65a14f9e-e008-4c1b-89df-4eaa4774b6e3}</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Big/Data/00__Small_tel/C-sources/netdaemon</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">По умолчанию</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Развёртывание</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Развёртывание</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||||
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
|
||||||
|
<value type="QString" key="RunConfiguration.Arguments"></value>
|
||||||
|
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
|
||||||
|
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||||
|
<value type="int">1</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||||
|
<value type="int">22</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>Version</variable>
|
||||||
|
<value type="int">22</value>
|
||||||
|
</data>
|
||||||
|
</qtcreator>
|
||||||
@ -0,0 +1,167 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE QtCreatorProject>
|
||||||
|
<!-- Written by QtCreator 4.8.2, 2020-08-27T15:02:35. -->
|
||||||
|
<qtcreator>
|
||||||
|
<data>
|
||||||
|
<variable>EnvironmentId</variable>
|
||||||
|
<value type="QByteArray">{7bd84e39-ca37-46d3-be9d-99ebea85bc0d}</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||||
|
<value type="int">0</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||||
|
<value type="QString" key="language">Cpp</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||||
|
<value type="QString" key="language">QmlJS</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||||
|
<value type="QByteArray" key="EditorConfiguration.Codec">KOI8-R</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanIndentation">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||||
|
<valuemap type="QVariantMap"/>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{65a14f9e-e008-4c1b-89df-4eaa4774b6e3}</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Big/Data/00__Small_tel/C-sources/netdaemon</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">По умолчанию</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">По умолчанию</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Установка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Конфигурация установки</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
||||||
|
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
||||||
|
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Особая программа</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
||||||
|
<value type="QString" key="RunConfiguration.Arguments"></value>
|
||||||
|
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||||
|
<value type="int">1</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||||
|
<value type="int">20</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>Version</variable>
|
||||||
|
<value type="int">20</value>
|
||||||
|
</data>
|
||||||
|
</qtcreator>
|
||||||
1
Daemons/weatherdaemon.deprecated/weatherdaemon.cxxflags
Normal file
1
Daemons/weatherdaemon.deprecated/weatherdaemon.cxxflags
Normal file
@ -0,0 +1 @@
|
|||||||
|
-std=c++17
|
||||||
9
Daemons/weatherdaemon.deprecated/weatherdaemon.files
Normal file
9
Daemons/weatherdaemon.deprecated/weatherdaemon.files
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
bta_shdata.c
|
||||||
|
bta_shdata.h
|
||||||
|
cmdlnopts.c
|
||||||
|
cmdlnopts.h
|
||||||
|
main.c
|
||||||
|
socket.c
|
||||||
|
socket.h
|
||||||
|
term.c
|
||||||
|
term.h
|
||||||
1
Daemons/weatherdaemon.deprecated/weatherdaemon.includes
Normal file
1
Daemons/weatherdaemon.deprecated/weatherdaemon.includes
Normal file
@ -0,0 +1 @@
|
|||||||
|
.
|
||||||
@ -1,25 +1,44 @@
|
|||||||
# run `make DEF=...` to add extra defines
|
# run `make DEF=...` to add extra defines
|
||||||
PROGRAM := weatherdaemon
|
PROGRAM := weatherdaemon
|
||||||
LDFLAGS := -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,--discard-all -pthread
|
LDFLAGS := -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,--discard-all
|
||||||
LDFLAGS += -lusefull_macros
|
LDFLAGS += -lusefull_macros
|
||||||
SRCS := $(wildcard *.c)
|
SRCS := $(wildcard *.c)
|
||||||
DEFINES := $(DEF) -D_GNU_SOURCE -D_XOPEN_SOURCE=1111
|
DEFINES := $(DEF) -D_GNU_SOURCE -D_XOPEN_SOURCE=1111
|
||||||
#DEFINES += -DEBUG
|
|
||||||
# baudrate for USB<->UART converter
|
|
||||||
OBJDIR := mk
|
OBJDIR := mk
|
||||||
CFLAGS += -O2 -Wall -Werror -Wextra -Wno-trampolines
|
CFLAGS += -O2 -Wall -Wextra -Wno-trampolines
|
||||||
OBJS := $(addprefix $(OBJDIR)/, $(SRCS:%.c=%.o))
|
OBJS := $(addprefix $(OBJDIR)/, $(SRCS:%.c=%.o))
|
||||||
DEPS := $(OBJS:.o=.d)
|
DEPS := $(OBJS:.o=.d)
|
||||||
|
TARGFILE := $(OBJDIR)/TARGET
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
all : $(OBJDIR) $(PROGRAM)
|
ifeq ($(shell test -e $(TARGFILE) && echo -n yes),yes)
|
||||||
|
TARGET := $(file < $(TARGFILE))
|
||||||
|
else
|
||||||
|
TARGET := RELEASE
|
||||||
|
endif
|
||||||
|
|
||||||
$(PROGRAM) : $(OBJS)
|
ifeq ($(TARGET), DEBUG)
|
||||||
|
.DEFAULT_GOAL := debug
|
||||||
|
endif
|
||||||
|
|
||||||
|
release: CFLAGS += -flto
|
||||||
|
release: LDFLAGS += -flto
|
||||||
|
release: $(PROGRAM)
|
||||||
|
|
||||||
|
debug: CFLAGS += -DEBUG -Werror
|
||||||
|
debug: TARGET := DEBUG
|
||||||
|
debug: $(PROGRAM)
|
||||||
|
|
||||||
|
$(TARGFILE): $(OBJDIR)
|
||||||
|
@echo -e "\t\tTARGET: $(TARGET)"
|
||||||
|
@echo "$(TARGET)" > $(TARGFILE)
|
||||||
|
|
||||||
|
$(PROGRAM) : $(TARGFILE) $(OBJS)
|
||||||
@echo -e "\t\tLD $(PROGRAM)"
|
@echo -e "\t\tLD $(PROGRAM)"
|
||||||
$(CC) $(LDFLAGS) $(OBJS) -o $(PROGRAM)
|
$(CC) $(LDFLAGS) $(OBJS) -o $(PROGRAM)
|
||||||
|
|
||||||
$(OBJDIR):
|
$(OBJDIR):
|
||||||
mkdir $(OBJDIR)
|
@mkdir $(OBJDIR)
|
||||||
|
|
||||||
ifneq ($(MAKECMDGOALS),clean)
|
ifneq ($(MAKECMDGOALS),clean)
|
||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
@ -31,13 +50,9 @@ $(OBJDIR)/%.o: %.c
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
@echo -e "\t\tCLEAN"
|
@echo -e "\t\tCLEAN"
|
||||||
@rm -f $(OBJS) $(DEPS)
|
@rm -rf $(OBJDIR) 2>/dev/null || true
|
||||||
@rmdir $(OBJDIR) 2>/dev/null || true
|
|
||||||
|
|
||||||
xclean: clean
|
xclean: clean
|
||||||
@rm -f $(PROGRAM)
|
@rm -f $(PROGRAM)
|
||||||
|
|
||||||
gentags:
|
.PHONY: clean xclean
|
||||||
CFLAGS="$(CFLAGS) $(DEFINES)" geany -g $(PROGRAM).c.tags *[hc] 2>/dev/null
|
|
||||||
|
|
||||||
.PHONY: gentags clean xclean
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
Weather daemon
|
Weather daemon working with old "Astro-M" meteostation
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Open a socket at given port (default: 4444)
|
Open a socket at given port (default: 4444)
|
||||||
|
|||||||
@ -18,8 +18,8 @@ static char msg[MSGLEN];
|
|||||||
#define PERR(...) do{snprintf(msg, MSGLEN, __VA_ARGS__); perror(msg);} while(0)
|
#define PERR(...) do{snprintf(msg, MSGLEN, __VA_ARGS__); perror(msg);} while(0)
|
||||||
|
|
||||||
#ifndef BTA_MODULE
|
#ifndef BTA_MODULE
|
||||||
volatile struct BTA_Data *sdt;
|
volatile struct BTA_Data *sdt = NULL;
|
||||||
volatile struct BTA_Local *sdtl;
|
volatile struct BTA_Local *sdtl = NULL;
|
||||||
|
|
||||||
volatile struct SHM_Block sdat = {
|
volatile struct SHM_Block sdat = {
|
||||||
{"Sdat"},
|
{"Sdat"},
|
||||||
@ -89,10 +89,12 @@ void bta_data_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int bta_data_check() {
|
int bta_data_check() {
|
||||||
|
if(!sdt) return 0;
|
||||||
return( (sdt->magic == sdat.key.code) && (sdt->version == BTA_Data_Ver) );
|
return( (sdt->magic == sdat.key.code) && (sdt->version == BTA_Data_Ver) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void bta_data_close() {
|
void bta_data_close() {
|
||||||
|
if(!sdt) return;
|
||||||
if(sdat.side == ServerSide) {
|
if(sdat.side == ServerSide) {
|
||||||
sdt->magic = 0;
|
sdt->magic = 0;
|
||||||
sdt->version = 0;
|
sdt->version = 0;
|
||||||
@ -184,8 +186,9 @@ void get_cmd_queue(struct CMD_Queue *cq, int server){
|
|||||||
|
|
||||||
|
|
||||||
int check_shm_block(volatile struct SHM_Block *sb){
|
int check_shm_block(volatile struct SHM_Block *sb){
|
||||||
if(sb->check)
|
if(sb->check){
|
||||||
return(sb->check());
|
return(sb->check());
|
||||||
|
}
|
||||||
else return(0);
|
else return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,6 @@
|
|||||||
// Copyright: V.S. Shergin, vsher@sao.ru
|
// Copyright: V.S. Shergin, vsher@sao.ru
|
||||||
// fixed for x86_64 E.V. Emelianov, edward.emelianoff@gmail.com
|
// fixed for x86_64 E.V. Emelianov, edward.emelianoff@gmail.com
|
||||||
#pragma once
|
#pragma once
|
||||||
#ifndef __BTA_SHDATA_H__
|
|
||||||
#define __BTA_SHDATA_H__
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -850,4 +848,3 @@ void set_acckey(uint32_t newkey);
|
|||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
//#pragma GCC diagnostic pop
|
//#pragma GCC diagnostic pop
|
||||||
|
|
||||||
#endif // __BTA_SHDATA_H__
|
|
||||||
|
|||||||
@ -29,7 +29,6 @@
|
|||||||
* here are global parameters initialisation
|
* here are global parameters initialisation
|
||||||
*/
|
*/
|
||||||
int help;
|
int help;
|
||||||
static glob_pars G;
|
|
||||||
|
|
||||||
// default values for Gdefault & help
|
// default values for Gdefault & help
|
||||||
#define DEFAULT_PORT "12345"
|
#define DEFAULT_PORT "12345"
|
||||||
@ -37,14 +36,12 @@ static glob_pars G;
|
|||||||
|
|
||||||
// DEFAULTS
|
// DEFAULTS
|
||||||
// default global parameters
|
// default global parameters
|
||||||
glob_pars const Gdefault = {
|
static glob_pars G = {
|
||||||
.device = NULL,
|
.device = NULL,
|
||||||
.port = DEFAULT_PORT,
|
.port = DEFAULT_PORT,
|
||||||
.logfile = NULL,
|
.logfile = NULL,
|
||||||
.verb = 0,
|
.verb = 0,
|
||||||
.tty_speed = 9600,
|
.tty_speed = 9600,
|
||||||
.rest_pars = NULL,
|
|
||||||
.rest_pars_num = 0,
|
|
||||||
.emul = 0,
|
.emul = 0,
|
||||||
.pidfile = DEFAULT_PID
|
.pidfile = DEFAULT_PID
|
||||||
};
|
};
|
||||||
@ -53,7 +50,7 @@ glob_pars const Gdefault = {
|
|||||||
* Define command line options by filling structure:
|
* Define command line options by filling structure:
|
||||||
* name has_arg flag val type argptr help
|
* name has_arg flag val type argptr help
|
||||||
*/
|
*/
|
||||||
myoption cmdlnopts[] = {
|
sl_option_t cmdlnopts[] = {
|
||||||
// common options
|
// common options
|
||||||
{"help", NO_ARGS, NULL, 'h', arg_int, APTR(&help), _("show this help")},
|
{"help", NO_ARGS, NULL, 'h', arg_int, APTR(&help), _("show this help")},
|
||||||
{"device", NEED_ARG, NULL, 'd', arg_string, APTR(&G.device), _("serial device name (default: none)")},
|
{"device", NEED_ARG, NULL, 'd', arg_string, APTR(&G.device), _("serial device name (default: none)")},
|
||||||
@ -75,18 +72,15 @@ myoption cmdlnopts[] = {
|
|||||||
*/
|
*/
|
||||||
glob_pars *parse_args(int argc, char **argv){
|
glob_pars *parse_args(int argc, char **argv){
|
||||||
int i;
|
int i;
|
||||||
void *ptr;
|
|
||||||
ptr = memcpy(&G, &Gdefault, sizeof(G)); assert(ptr);
|
|
||||||
// format of help: "Usage: progname [args]\n"
|
// format of help: "Usage: progname [args]\n"
|
||||||
change_helpstring("Usage: %s [args]\n\n\tWhere args are:\n");
|
sl_helpstring("Usage: %s [args]\n\n\tWhere args are:\n");
|
||||||
// parse arguments
|
// parse arguments
|
||||||
parseargs(&argc, &argv, cmdlnopts);
|
sl_parseargs(&argc, &argv, cmdlnopts);
|
||||||
if(help) showhelp(-1, cmdlnopts);
|
if(help) sl_showhelp(-1, cmdlnopts);
|
||||||
if(argc > 0){
|
if(argc > 0){
|
||||||
G.rest_pars_num = argc;
|
red("Unused parameters:\n");
|
||||||
G.rest_pars = calloc(argc, sizeof(char*));
|
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
G.rest_pars[i] = strdup(argv[i]);
|
printf("%s\n", argv[i]);
|
||||||
}
|
}
|
||||||
return &G;
|
return &G;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,11 +16,7 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#ifndef __CMDLNOPTS_H__
|
|
||||||
#define __CMDLNOPTS_H__
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* here are some typedef's for global data
|
* here are some typedef's for global data
|
||||||
@ -35,10 +31,7 @@ typedef struct{
|
|||||||
int tty_speed; // serial terminal baudrate
|
int tty_speed; // serial terminal baudrate
|
||||||
int emul; // emulation of serial device
|
int emul; // emulation of serial device
|
||||||
char *pidfile; // pidfile name
|
char *pidfile; // pidfile name
|
||||||
int rest_pars_num; // number of rest parameters
|
|
||||||
char** rest_pars; // the rest parameters: array of char* (path to logfile and thrash)
|
|
||||||
} glob_pars;
|
} glob_pars;
|
||||||
|
|
||||||
|
|
||||||
glob_pars *parse_args(int argc, char **argv);
|
glob_pars *parse_args(int argc, char **argv);
|
||||||
#endif // __CMDLNOPTS_H__
|
|
||||||
|
|||||||
@ -31,14 +31,14 @@
|
|||||||
glob_pars *GP;
|
glob_pars *GP;
|
||||||
|
|
||||||
void signals(int signo){
|
void signals(int signo){
|
||||||
restore_console();
|
sl_restore_con();
|
||||||
if(ttydescr) close_tty(&ttydescr);
|
if(ttydescr) sl_tty_close(&ttydescr);
|
||||||
LOGERR("exit with status %d", signo);
|
LOGERR("exit with status %d", signo);
|
||||||
exit(signo);
|
exit(signo);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv){
|
int main(int argc, char **argv){
|
||||||
initial_setup();
|
sl_init();
|
||||||
signal(SIGTERM, signals); // kill (-15) - quit
|
signal(SIGTERM, signals); // kill (-15) - quit
|
||||||
signal(SIGHUP, SIG_IGN); // hup - ignore
|
signal(SIGHUP, SIG_IGN); // hup - ignore
|
||||||
signal(SIGINT, signals); // ctrl+C - quit
|
signal(SIGINT, signals); // ctrl+C - quit
|
||||||
@ -49,17 +49,14 @@ int main(int argc, char **argv){
|
|||||||
#endif
|
#endif
|
||||||
GP = parse_args(argc, argv);
|
GP = parse_args(argc, argv);
|
||||||
if(GP->logfile){
|
if(GP->logfile){
|
||||||
sl_loglevel lvl = LOGLEVEL_ERR;
|
sl_loglevel_e lvl = LOGLEVEL_ERR;
|
||||||
for(; GP->verb && lvl < LOGLEVEL_ANY; --GP->verb) ++lvl;
|
for(; GP->verb && lvl < LOGLEVEL_ANY; --GP->verb) ++lvl;
|
||||||
DBG("Loglevel: %d", lvl);
|
DBG("Loglevel: %d", lvl);
|
||||||
if(!OPENLOG(GP->logfile, lvl, 1)) ERRX("Can't open log file");
|
if(!OPENLOG(GP->logfile, lvl, 1)) ERRX("Can't open log file");
|
||||||
LOGERR("Started");
|
LOGERR("Started");
|
||||||
}
|
}
|
||||||
#ifndef EBUG
|
#ifndef EBUG
|
||||||
if(daemon(1, 0)){
|
sl_check4running(self, GP->pidfile);
|
||||||
ERR("daemon()");
|
|
||||||
}
|
|
||||||
check4running(self, GP->pidfile);
|
|
||||||
while(1){ // guard for dead processes
|
while(1){ // guard for dead processes
|
||||||
pid_t childpid = fork();
|
pid_t childpid = fork();
|
||||||
if(childpid){
|
if(childpid){
|
||||||
|
|||||||
@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
extern glob_pars *GP;
|
extern glob_pars *GP;
|
||||||
|
|
||||||
static char *answer = NULL;
|
static char answer[BUFSIZ] = {0};
|
||||||
static int freshdata = 0;
|
static int freshdata = 0;
|
||||||
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
@ -156,7 +156,7 @@ static int handle_socket(int sock, int notchkhdr){
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(answer) send_data(sock, webquery, answer);
|
if(*answer) send_data(sock, webquery, answer);
|
||||||
else send_data(sock, webquery, "No data\n");
|
else send_data(sock, webquery, "No data\n");
|
||||||
if(webquery) return 1; // close web query after message processing
|
if(webquery) return 1; // close web query after message processing
|
||||||
return 0;
|
return 0;
|
||||||
@ -178,7 +178,7 @@ static void *server(void *asock){
|
|||||||
memset(notchkhdr, 0, sizeof(notchkhdr));
|
memset(notchkhdr, 0, sizeof(notchkhdr));
|
||||||
poll_set[0].fd = sock;
|
poll_set[0].fd = sock;
|
||||||
poll_set[0].events = POLLIN;
|
poll_set[0].events = POLLIN;
|
||||||
double lastdatat = dtime();
|
double lastdatat = sl_dtime();
|
||||||
while(1){
|
while(1){
|
||||||
poll(poll_set, nfd, 1); // poll for 1ms
|
poll(poll_set, nfd, 1); // poll for 1ms
|
||||||
for(int fdidx = 0; fdidx < nfd; ++fdidx){ // poll opened FDs
|
for(int fdidx = 0; fdidx < nfd; ++fdidx){ // poll opened FDs
|
||||||
@ -223,15 +223,15 @@ static void *server(void *asock){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // endfor
|
} // endfor
|
||||||
if(freshdata && answer){ // send new data to all
|
if(freshdata){ // send new data to all
|
||||||
freshdata = 0;
|
freshdata = 0;
|
||||||
lastdatat = dtime();
|
lastdatat = sl_dtime();
|
||||||
for(int fdidx = 1; fdidx < nfd; ++fdidx){
|
for(int fdidx = 1; fdidx < nfd; ++fdidx){
|
||||||
if(notchkhdr[fdidx])
|
if(notchkhdr[fdidx])
|
||||||
send_data(poll_set[fdidx].fd, 0, answer);
|
send_data(poll_set[fdidx].fd, 0, answer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(dtime() - lastdatat > NODATA_TMOUT){
|
if(sl_dtime() - lastdatat > NODATA_TMOUT){
|
||||||
LOGERR("No data timeout");
|
LOGERR("No data timeout");
|
||||||
ERRX("No data timeout");
|
ERRX("No data timeout");
|
||||||
}
|
}
|
||||||
@ -242,16 +242,14 @@ static void *server(void *asock){
|
|||||||
static void *ttyparser(_U_ void *notused){
|
static void *ttyparser(_U_ void *notused){
|
||||||
double tlast = 0;
|
double tlast = 0;
|
||||||
while(1){
|
while(1){
|
||||||
if(dtime() - tlast > T_INTERVAL){
|
if(sl_dtime() - tlast > T_INTERVAL){
|
||||||
char *got = poll_device();
|
char *got = poll_device(answer, BUFSIZ);
|
||||||
if(got){
|
if(got){
|
||||||
if(0 == pthread_mutex_lock(&mutex)){
|
if(0 == pthread_mutex_lock(&mutex)){
|
||||||
FREE(answer);
|
|
||||||
answer = strdup(got);
|
|
||||||
freshdata = 1;
|
freshdata = 1;
|
||||||
pthread_mutex_unlock(&mutex);
|
pthread_mutex_unlock(&mutex);
|
||||||
}
|
}
|
||||||
tlast = dtime();
|
tlast = sl_dtime();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|||||||
@ -17,8 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#ifndef __SOCKET_H__
|
|
||||||
#define __SOCKET_H__
|
|
||||||
|
|
||||||
// time interval for data polling (seconds)
|
// time interval for data polling (seconds)
|
||||||
#define T_INTERVAL (10.)
|
#define T_INTERVAL (10.)
|
||||||
@ -29,4 +27,3 @@
|
|||||||
|
|
||||||
void daemonize(char *port);
|
void daemonize(char *port);
|
||||||
|
|
||||||
#endif // __SOCKET_H__
|
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
#define BUFLEN (4096)
|
#define BUFLEN (4096)
|
||||||
|
|
||||||
TTY_descr *ttydescr = NULL;
|
sl_tty_t *ttydescr = NULL;
|
||||||
extern glob_pars *GP;
|
extern glob_pars *GP;
|
||||||
|
|
||||||
static char buf[BUFLEN];
|
static char buf[BUFLEN];
|
||||||
@ -51,15 +51,20 @@ static char *read_string(){
|
|||||||
size_t r = 0, l;
|
size_t r = 0, l;
|
||||||
int LL = BUFLEN - 1;
|
int LL = BUFLEN - 1;
|
||||||
char *ptr = buf;
|
char *ptr = buf;
|
||||||
double d0 = dtime();
|
double d0 = sl_dtime();
|
||||||
do{
|
do{
|
||||||
if((l = read_tty(ttydescr))){
|
if((l = sl_tty_read(ttydescr))){
|
||||||
strncpy(ptr, ttydescr->buf, LL);
|
strncpy(ptr, ttydescr->buf, LL);
|
||||||
r += l; LL -= l; ptr += l;
|
r += l; LL -= l; ptr += l;
|
||||||
DBG("l=%zd, r=%zd, LL=%d", l, r, LL);
|
DBG("l=%zd, r=%zd, LL=%d", l, r, LL);
|
||||||
d0 = dtime();
|
if(ptr[-1] == '\n'){
|
||||||
|
DBG("Got newline");
|
||||||
|
ptr[-1] = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}while(dtime() - d0 < WAIT_TMOUT && LL);
|
d0 = sl_dtime();
|
||||||
|
}
|
||||||
|
}while(sl_dtime() - d0 < WAIT_TMOUT && LL);
|
||||||
if(r){
|
if(r){
|
||||||
//buf[r] = 0;
|
//buf[r] = 0;
|
||||||
DBG("buf: %s", buf);
|
DBG("buf: %s", buf);
|
||||||
@ -75,10 +80,10 @@ static char *read_string(){
|
|||||||
int try_connect(char *device, int baudrate){
|
int try_connect(char *device, int baudrate){
|
||||||
if(!device) return 0;
|
if(!device) return 0;
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
ttydescr = new_tty(device, baudrate, 1024);
|
ttydescr = sl_tty_new(device, baudrate, 1024);
|
||||||
if(ttydescr) ttydescr = tty_open(ttydescr, 1); // exclusive open
|
if(ttydescr) ttydescr = sl_tty_open(ttydescr, 1); // exclusive open
|
||||||
if(!ttydescr) return 0;
|
if(!ttydescr) return 0;
|
||||||
while(read_tty(ttydescr)); // clear rbuf
|
while(sl_tty_read(ttydescr)); // clear rbuf
|
||||||
LOGMSG("Connected to %s", device);
|
LOGMSG("Connected to %s", device);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -111,16 +116,17 @@ static int getpar(char *string, double *Val, char *Name){
|
|||||||
* Poll serial port for new dataportion
|
* Poll serial port for new dataportion
|
||||||
* @return: NULL if no data received, pointer to string if valid data received
|
* @return: NULL if no data received, pointer to string if valid data received
|
||||||
*/
|
*/
|
||||||
char *poll_device(){
|
char *poll_device(char *ans, int anslen){
|
||||||
FNAME();
|
FNAME();
|
||||||
static char ans[BUFLEN];
|
// gust (>10m/s) time
|
||||||
|
static time_t gustt = 0., btagustt = 0.;
|
||||||
char *ptr = ans, *r = NULL;
|
char *ptr = ans, *r = NULL;
|
||||||
if(!GP->emul){
|
if(!GP->emul){
|
||||||
if(write_tty(ttydescr->comfd, "?U\r\n", 4))
|
if(sl_tty_write(ttydescr->comfd, "?U\r\n", 4))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
double t0 = dtime();
|
double t0 = sl_dtime();
|
||||||
while(dtime() - t0 < T_POLLING_TMOUT){
|
while(sl_dtime() - t0 < T_POLLING_TMOUT){
|
||||||
if((r = read_string())){ // parse new data
|
if((r = read_string())){ // parse new data
|
||||||
DBG("got %s", r);
|
DBG("got %s", r);
|
||||||
if(strncmp(r, "<?U>", 4)){
|
if(strncmp(r, "<?U>", 4)){
|
||||||
@ -135,21 +141,29 @@ char *poll_device(){
|
|||||||
char *eol = strchr(r, '\n');
|
char *eol = strchr(r, '\n');
|
||||||
if(eol) *eol = 0;
|
if(eol) *eol = 0;
|
||||||
double d;
|
double d;
|
||||||
size_t L = BUFLEN, l;
|
int L = anslen - 1, l;
|
||||||
|
time_t tnow = time(NULL);
|
||||||
#define PRINT(...) do{l = snprintf(ptr, L, __VA_ARGS__); if(l > 0){ L -= l; ptr += l;}}while(0)
|
#define PRINT(...) do{l = snprintf(ptr, L, __VA_ARGS__); if(l > 0){ L -= l; ptr += l;}}while(0)
|
||||||
if(getpar(r, &d, "RT")) PRINT("Rain=%g\n", d);
|
if(getpar(r, &d, "RT")) PRINT("Rain=%g\n", d);
|
||||||
if(getpar(r, &d, "WU")) PRINT("Clouds=%.1f\n", d);
|
if(getpar(r, &d, "WU")) PRINT("Clouds=%.1f\n", d);
|
||||||
if(getpar(r, &d, "TE")) PRINT("Exttemp=%.1f\n", d);
|
if(getpar(r, &d, "TE")) PRINT("Exttemp=%.1f\n", d);
|
||||||
if(getpar(r, &d, "WG")) PRINT("Wind=%.1f\n", d/3.6);
|
if(getpar(r, &d, "WG")){
|
||||||
|
d /= 3.6;
|
||||||
|
PRINT("Wind=%.1f\n", d);
|
||||||
|
if(d > GUST_WIND) gustt = tnow;
|
||||||
|
}
|
||||||
|
if(tnow - gustt < GUST_MAX_TIME) PRINT("Gusttime=%lld\n", (long long)gustt);
|
||||||
// now get BTA parameters
|
// now get BTA parameters
|
||||||
if(check_shm_block(&sdat)){
|
if(check_shm_block(&sdat)){
|
||||||
PRINT("BTAExttemp=%.1f\n", val_T1);
|
PRINT("BTAExttemp=%.1f\n", val_T1);
|
||||||
PRINT("BTAPres=%.1f\n", val_B);
|
PRINT("BTAPres=%.1f\n", val_B);
|
||||||
PRINT("BTAWind=%.1f\n", val_Wnd);
|
PRINT("BTAWind=%.1f\n", val_Wnd);
|
||||||
|
if(val_Wnd > GUST_WIND) btagustt = tnow;
|
||||||
|
if(tnow - btagustt < GUST_MAX_TIME) PRINT("BTAGusttime=%lld\n", (long long)btagustt);
|
||||||
PRINT("BTAHumid=%.1f\n", val_Hmd);
|
PRINT("BTAHumid=%.1f\n", val_Hmd);
|
||||||
}
|
}
|
||||||
#undef PRINT
|
#undef PRINT
|
||||||
snprintf(ptr, L, "Time=%lld\n", (long long)time(NULL));
|
snprintf(ptr, L, "Time=%lld\n", (long long)tnow);
|
||||||
DBG("Buffer: %s", ans);
|
DBG("Buffer: %s", ans);
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,8 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#ifndef __TERM_H__
|
|
||||||
#define __TERM_H__
|
|
||||||
|
|
||||||
#include <usefull_macros.h>
|
#include <usefull_macros.h>
|
||||||
|
|
||||||
@ -29,9 +27,13 @@
|
|||||||
// Terminal polling timeout - 1 second
|
// Terminal polling timeout - 1 second
|
||||||
#define T_POLLING_TMOUT (1.0)
|
#define T_POLLING_TMOUT (1.0)
|
||||||
|
|
||||||
extern TTY_descr *ttydescr;
|
// wind speed for gust
|
||||||
|
#define GUST_WIND (10.0)
|
||||||
|
// max interval after gust to show gust time - 1 hour
|
||||||
|
#define GUST_MAX_TIME (3600)
|
||||||
|
|
||||||
|
extern sl_tty_t *ttydescr;
|
||||||
void run_terminal();
|
void run_terminal();
|
||||||
int try_connect(char *device, int baudrate);
|
int try_connect(char *device, int baudrate);
|
||||||
char *poll_device();
|
char *poll_device(char *ans, int anslen);
|
||||||
|
|
||||||
#endif // __TERM_H__
|
|
||||||
|
|||||||
@ -1 +1,4 @@
|
|||||||
#define EBUG 1
|
#define EBUG 1
|
||||||
|
#define _XOPEN_SOURCE 12345
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
|
|||||||
@ -1,20 +1,20 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE QtCreatorProject>
|
<!DOCTYPE QtCreatorProject>
|
||||||
<!-- Written by QtCreator 4.12.3, 2021-06-09T21:11:29. -->
|
<!-- Written by QtCreator 16.0.2, 2025-06-20T13:35:46. -->
|
||||||
<qtcreator>
|
<qtcreator>
|
||||||
<data>
|
<data>
|
||||||
<variable>EnvironmentId</variable>
|
<variable>EnvironmentId</variable>
|
||||||
<value type="QByteArray">{7bd84e39-ca37-46d3-be9d-99ebea85bc0d}</value>
|
<value type="QByteArray">{cf63021e-ef53-49b0-b03b-2f2570cdf3b6}</value>
|
||||||
</data>
|
</data>
|
||||||
<data>
|
<data>
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||||
<value type="int">0</value>
|
<value type="qlonglong">0</value>
|
||||||
</data>
|
</data>
|
||||||
<data>
|
<data>
|
||||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||||
<valuemap type="QVariantMap">
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoDetect">true</value>
|
||||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||||
<value type="QString" key="language">Cpp</value>
|
<value type="QString" key="language">Cpp</value>
|
||||||
@ -28,58 +28,87 @@
|
|||||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||||
<value type="QByteArray" key="EditorConfiguration.Codec">KOI8-R</value>
|
<value type="QByteArray" key="EditorConfiguration.Codec">KOI8-R</value>
|
||||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
|
||||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">false</value>
|
||||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">1</value>
|
||||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
|
||||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||||
<value type="bool" key="EditorConfiguration.cleanIndentation">false</value>
|
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
||||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.inEntireDocument">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
</data>
|
</data>
|
||||||
<data>
|
<data>
|
||||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||||
<valuemap type="QVariantMap"/>
|
<valuemap type="QVariantMap">
|
||||||
|
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
|
||||||
|
<value type="bool" key="AutoTest.Framework.Boost">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.CTest">false</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.Catch">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.GTest">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="bool" key="AutoTest.ApplyFilter">false</value>
|
||||||
|
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
|
||||||
|
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
|
||||||
|
<value type="int" key="AutoTest.RunAfterBuild">0</value>
|
||||||
|
<value type="bool" key="AutoTest.UseGlobal">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="ClangTools">
|
||||||
|
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
||||||
|
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
||||||
|
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
||||||
|
<value type="int" key="ClangTools.ParallelJobs">4</value>
|
||||||
|
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
||||||
|
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
</data>
|
</data>
|
||||||
<data>
|
<data>
|
||||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||||
<valuemap type="QVariantMap">
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="QString" key="DeviceType">Desktop</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{65a14f9e-e008-4c1b-89df-4eaa4774b6e3}</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{91347f2c-5221-46a7-80b1-0a054ca02f79}</value>
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Big/Data/00__Small_tel/C-sources/netdaemon</value>
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/tmp/A/Daemons/weatherdaemon</value>
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
||||||
<value type="QString">all</value>
|
<value type="QString">all</value>
|
||||||
</valuelist>
|
</valuelist>
|
||||||
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
|
||||||
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
@ -89,28 +118,26 @@
|
|||||||
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
||||||
<value type="QString">clean</value>
|
<value type="QString">clean</value>
|
||||||
</valuelist>
|
</valuelist>
|
||||||
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
|
||||||
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">По умолчанию</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">По умолчанию</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericBuildConfiguration</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericBuildConfiguration</value>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Развёртывание</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Развёртывание</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Развёртывание</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Развёртывание</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||||
@ -120,31 +147,31 @@
|
|||||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||||
|
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="QList<int>" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
|
||||||
|
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
|
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
|
||||||
|
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
||||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
|
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
|
||||||
<value type="QString" key="RunConfiguration.Arguments"></value>
|
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
|
||||||
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
|
|
||||||
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
|
|
||||||
</valuemap>
|
</valuemap>
|
||||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||||
</valuemap>
|
</valuemap>
|
||||||
</data>
|
</data>
|
||||||
<data>
|
<data>
|
||||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||||
<value type="int">1</value>
|
<value type="qlonglong">1</value>
|
||||||
</data>
|
</data>
|
||||||
<data>
|
<data>
|
||||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||||
|
|||||||
157
Daemons/weatherdaemon/weatherdaemon.creator.user.7bd84e3
Normal file
157
Daemons/weatherdaemon/weatherdaemon.creator.user.7bd84e3
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE QtCreatorProject>
|
||||||
|
<!-- Written by QtCreator 4.12.3, 2021-06-09T21:11:29. -->
|
||||||
|
<qtcreator>
|
||||||
|
<data>
|
||||||
|
<variable>EnvironmentId</variable>
|
||||||
|
<value type="QByteArray">{7bd84e39-ca37-46d3-be9d-99ebea85bc0d}</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||||
|
<value type="int">0</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||||
|
<value type="QString" key="language">Cpp</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||||
|
<value type="QString" key="language">QmlJS</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||||
|
<value type="QByteArray" key="EditorConfiguration.Codec">KOI8-R</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanIndentation">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||||
|
<valuemap type="QVariantMap"/>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{65a14f9e-e008-4c1b-89df-4eaa4774b6e3}</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Big/Data/00__Small_tel/C-sources/netdaemon</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
||||||
|
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
||||||
|
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">По умолчанию</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Развёртывание</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Развёртывание</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||||
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
|
||||||
|
<value type="QString" key="RunConfiguration.Arguments"></value>
|
||||||
|
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
|
||||||
|
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
||||||
|
<value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||||
|
<value type="int">1</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||||
|
<value type="int">22</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>Version</variable>
|
||||||
|
<value type="int">22</value>
|
||||||
|
</data>
|
||||||
|
</qtcreator>
|
||||||
Loading…
x
Reference in New Issue
Block a user