#!/bin/bash
echo > output.csv
while read line; do
if [[ -z "$line" ]]; then
continue
fi
echo "$line" | tr "\n" ";" >> 'output.csv'
done < 'output'
echo "end" >> 'output.csv'
bash
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <cstring>
#include "Adafruit_GPS.h"
#include <iomanip>
using namespace std;
#define LOG1 "/home/vadim/programs/cpp/gpsParser/log_indoor"
#define LOG2 "/home/vadim/programs/cpp/gpsParser/log_last"
#define LOG3 "/home/vadim/programs/cpp/gpsParser/log_7_12_16_01"
vector<string> read_data(string f) {
ifstream in(f);
string tmp;
vector<string> res;
while (!in.eof()) {
getline(in, tmp);
if (tmp.empty()) continue;
res.push_back(tmp);
}
return res;
}
int main() {
auto data = read_data(LOG3);
ofstream out("../out.csv");
Adafruit_GPS gps;
char *tmp[100];
for (auto &d: data) {
strcpy(reinterpret_cast<char *>(tmp), d.c_str());
gps.parse(reinterpret_cast<char *>(tmp));
out << gps.hour << ','
<< gps.minute << ','
<< gps.seconds << ','
<< gps.milliseconds << ','
<< gps.year << ','
<< gps.month << ','
<< gps.day << ','
<< gps.latitude << ','
<< gps.longitude << ','
<< gps.latitudeDegrees << ','
<< gps.longitudeDegrees << ','
<< gps.geoidheight << ','
<< gps.altitude << ','
<< gps.speed << ','
<< gps.angle << ','
<< gps.magvariation << ','
<< gps.HDOP << ','
<< gps.VDOP << ','
<< gps.PDOP << ','
<< gps.fix << ','
<< gps.fixquality << ','
<< gps.fixquality_3d << ','
<< gps.satellites << ','
<< gps.antenna << endl;
}
return 0;
}
cpp
package main
import (
"go.uber.org/zap"
"lrm-backend/internal/competitions"
Facultys "lrm-backend/internal/faculties"
"lrm-backend/internal/files"
"lrm-backend/internal/handler"
"lrm-backend/internal/news"
"lrm-backend/internal/projects"
studyplace "lrm-backend/internal/study_place"
"lrm-backend/internal/users"
"lrm-backend/pkg/database"
)
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
db, err := database.Connect("postgres", "postgres", "postgres", "localhost", "5432")
if err != nil {
logger.Fatal("db connect", zap.Error(err))
}
fileUC := files.NewUseCase(db)
studyPlaceUC := studyplace.NewStudyPlaceUseCase(db)
facultiesUC := Facultys.NewFacultyUseCase(db)
competitionsUC := competitions.NewCompetitionUseCase(db, fileUC)
usersUC := users.NewUsersUseCase(db, fileUC, competitionsUC, facultiesUC)
newsUC := news.NewUseCase(db, fileUC)
projectsUC := projects.NewProjectUseCase(db, fileUC)
h := handler.New(newsUC, projectsUC, usersUC, competitionsUC, facultiesUC, studyPlaceUC)
server := h.InitRoutes()
server.Run()
}
go
begin;
drop table t_user;
drop table t_file_object;
drop table t_projects;
drop table t_news;
drop table t_competitions;
drop table t_faculties;
drop table t_study_place;
create table if not exists t_user
(
id serial not null primary key,
sname character varying(30),
name character varying(30),
pname character varying(30),
email text,
password text,
birthday date,
is_active boolean not null default true,
is_admin boolean not null default false,
is_member boolean not null default false,
create_date date not null default now(),
file_object_id integer,
competitions_id integer[],
faculty_id integer,
study_place_id integer
)
WITH (OIDS = FALSE);
-- alter table t_user owner to postgres;
-- grant all on table t_user to postgres;
-- grant select on table t_user to public;
-- comment on table t_user is 'Таблица пользователей';
comment on column t_user.id is 'Код';
comment on column t_user.sname is 'Фамилия';
comment on column t_user.name is 'Имя';
comment on column t_user.pname is 'Отчество';
comment on column t_user.is_active is 'Пользователь активен';
comment on column t_user.is_admin is 'Пользователь админ';
comment on column t_user.is_member is 'Пользователь участник лаборатории';
COMMENT ON COLUMN t_user.file_object_id IS 'Коды файлов';
-- grant all on sequence t_user_id_seq to postgres;
-- grant select on sequence t_user_id_seq to public;
-- comment on sequence t_user_id_seq
-- is 'Таблица пользователей';
create table if not exists t_faculties
(
id serial not null primary key,
name character varying
)
WITH (OIDS = FALSE);
create table if not exists t_study_place
(
id serial not null primary key,
name character varying
)
WITH (OIDS = FALSE);
create table if not exists t_news
(
id serial not null primary key,
name character varying,
body character varying,
author_id integer,
is_active boolean not null default true,
is_main boolean not null default false,
create_date date not null,
file_object_id integer[] default '{1}'
)
WITH (OIDS = FALSE);
-- alter table t_news owner to postgres;
-- grant all on table t_news TO postgres;
-- GRANT select on table t_news to public;
-- COMMENT ON table t_news IS 'Таблица пользователей';
COMMENT ON COLUMN t_news.id IS 'Код';
COMMENT ON COLUMN t_news.name IS 'Заголовок новости';
COMMENT ON COLUMN t_news.body IS 'Текст новости';
COMMENT ON COLUMN t_news.author_id IS 'Код автора новости';
COMMENT ON COLUMN t_news.is_active IS 'Новость активна';
COMMENT ON COLUMN t_news.is_main IS 'Новость главная';
COMMENT ON COLUMN t_news.create_date IS 'Дата создания';
COMMENT ON COLUMN t_news.file_object_id IS 'Коды файлов';
--
--
--
--
create table if not exists t_projects
(
id serial not null primary key,
name character varying,
body character varying,
is_active boolean not null default true,
create_date date not null,
author_id integer,
file_object_id integer[]
)
WITH (OIDS = FALSE);
-- alter table t_projects owner to postgres;
-- grant all on table t_projects TO postgres;
-- GRANT select on table t_projects to public;
-- COMMENT ON table t_projects IS 'Таблица пользователей';
COMMENT ON COLUMN t_projects.id IS 'Код';
COMMENT ON COLUMN t_projects.name IS 'Название проекта';
COMMENT ON COLUMN t_projects.body IS 'Текст проекта';
COMMENT ON COLUMN t_projects.is_active IS 'Проект активен';
COMMENT ON COLUMN t_projects.create_date IS 'Дата создания';
COMMENT ON COLUMN t_projects.file_object_id IS 'Коды файлов';
--
--
--
--
--
create table if not exists t_file_object
(
id serial not null primary key,
file_path character varying,
comment character varying,
is_active boolean not null default true,
create_date date not null
)
WITH (OIDS = FALSE);
-- alter table t_file_object
-- owner to postgres;
-- grant all on table t_file_object TO postgres;
-- GRANT select on table t_file_object to public;
-- COMMENT ON table t_file_object IS 'Таблица пользователей';
COMMENT ON COLUMN t_file_object.id IS 'Код';
COMMENT ON COLUMN t_file_object.file_path IS 'Название проекта';
COMMENT ON COLUMN t_file_object.comment IS 'Текст проекта';
COMMENT ON COLUMN t_file_object.is_active IS 'Проект активен';
COMMENT ON COLUMN t_file_object.create_date IS 'Дата создания';
create table if not exists t_competitions
(
id serial not null primary key,
name character varying,
body character varying,
color text,
is_active boolean not null default true,
create_date date not null default now(),
file_object_id integer[]
)
WITH (OIDS = FALSE);
alter table t_competitions
owner to postgres;
grant all on table t_competitions TO postgres;
GRANT select on table t_competitions to public;
COMMENT ON table t_competitions IS 'Таблица компетенций';
COMMENT ON COLUMN t_competitions.id IS 'Код';
COMMENT ON COLUMN t_competitions.name IS 'Название компетенции';
COMMENT ON COLUMN t_competitions.body IS 'Описание компетенции';
COMMENT ON COLUMN t_competitions.is_active IS 'Компетенция активна';
COMMENT ON COLUMN t_competitions.create_date IS 'Дата создания';
COMMENT ON COLUMN t_competitions.file_object_id IS 'Коды файлов';
DELETE
FROM t_news;
DELETE
FROM t_projects;
DELETE
FROM t_file_object;
DELETE
FROM t_user;
DELETE
FROM t_competitions;
DELETE
FROM t_faculties;
DELETE
FROM t_study_place;
INSERT INTO t_user(sname, name, pname, is_active, is_admin, is_member, create_date, file_object_id, email, password,
birthday, competitions_id,faculty_id,study_place_id)
VALUES ('Тестирующий', 'Тест', 'Тестов', true, true, true, '2022-04-01', 3, 'test1@yandex.ru',
'$2y$10$uhceKdu4UobO1pwShyZTUOqEjBHkuwDPy7T9ZE/I39jz8IR6WW1Ku', '2001-01-18', '{1,2,3}',1,1),
('Ломающий', 'Лом', 'Ломов', true, false, true, '2022-03-01', 4, 'test2@yandex.ru',
'$2y$10$uhceKdu4UobO1pwShyZTUOqEjBHkuwDPy7T9ZE/I39jz8IR6WW1Ku', '2001-01-20', '{4,5}',2,2);
INSERT INTO t_news(name, body, author_id, is_active, is_main, create_date, file_object_id)
VALUES ('News №1', 'Some cool news 1', 1, false, false, '2022-04-01', '{1}'),
('News №2', 'Some cool news 2', 1, false, false, '2022-03-30', '{1}'),
('News №3', 'Some bad news 1', 1, false, false, '2022-03-29', '{1,2}');
INSERT INTO t_projects(name, body, is_active, create_date, file_object_id, author_id)
VALUES ('test1', 'testbody', true, '2022-04-01', '{1,2}', 1),
('project1', 'body1', false, '2022-04-01', '{1}', 1),
('project2', 'body2', false, '2022-03-30', '{1,2}', 1),
('project3', 'body3', false, '2022-03-29', '{1}', 1),
('project4', 'body4', false, '2022-03-28', '{1,2}', 1),
('project5', 'body5', false, '2022-03-27', '{1}', 1),
('project6', 'body6', false, '2022-03-26', '{1,2}', 1),
('project7', 'body7', false, '2022-03-25', '{1}', 1);
INSERT INTO t_file_object(file_path, comment, is_active, create_date)
VALUES ('/photo/boston1.jpg', 'test', true, '2022-04-01'),
('/photo/boston2.jpg', 'test', true, '2022-04-01'),
('/photo/luntik.jpeg', 'test', true, '2022-04-01'),
('/photo/man1.png', 'test', true, '2022-04-01'),
('/photo/comp1.jpg', 'test', true, '2022-04-08'),
('/photo/comp2.jpg', 'test', true, '2022-04-08'),
('/photo/comp3.jpg', 'test', true, '2022-04-08'),
('/photo/comp4.jpg', 'test', true, '2022-04-08'),
('/photo/comp5.jpg', 'test', true, '2022-04-08');
INSERT INTO t_competitions(name, body, color, is_active, create_date, file_object_id)
VALUES ('Электроника', 'test1', 'yellow', true, '2022-04-08', '{5}'),
('Программирование МК', 'test2', 'indigo', true, '2022-04-08', '{9}'),
('Программирование ВУ', 'test3', 'orange', true, '2022-04-08', '{6}'),
('Нейросети', 'test4', 'lime', true, '2022-04-08', '{7}'),
('Конструирование', 'test5', 'red', true, '2022-04-08', '{8}');
INSERT INTO t_faculties(name)
VALUES ('ФМКН'),
('ФТФ'),
('ФПМ');
INSERT INTO t_study_place(name)
VALUES ('КубГУ'),('КубГАУ');
commit;
sql
module Lib
( someFunc
) where
someFunc :: IO ()
someFunc = putStrLn "someFunc"
haskell
from common_func import *
import gen_text_lines
# import gen_msg_rows
# import gen_text_lines
import gen_msg_start
def get_simple_text():
json_conf = read_file('source_xml', True)
source = read_file('needed_lines', False)
start_id = 69
start_y = 50
dt_y = 20
i = 1
retv = ''
source = gen_text_lines.create_needed_lines(source, 'TTGS_READABLE')
for s in source:
added_str = 'TTGSInf{} - '.format(i)
retv += gen_text_lines.create_text_string(start_id, added_str + s, start_y)
start_id += 1
start_y += dt_y
i += 1
write_string_to_file('result', retv)
def get_msg_rows():
start_id = 1
msg_id = 'MSG'
row_id = 'ROW'
target_id_pattern = msg_id
value_pattern = 'TTGSInf'
count_gr = 17
source_id = ''
step_pers = 1 / count_gr
start_pers = step_pers
sp_y = 80
sp_x = 95
dt_sp_x = 35
tp_y = 150
tp_x = sp_x
dt_tp_y = 80
dt_tp_x = dt_sp_x
x = 70
y = 130
dx = dt_sp_x
dy = 80
retv = ''
for i in range(start_id, count_gr + 1):
retv += gen_msg_rows.create_text_string(msg_id + str(i),
row_id + str(i),
value_pattern + str(i),
x, y if i % 2 == 1 else y + dy,
[tp_x, tp_y if i % 2 == 1 else tp_y + dt_tp_y],
[sp_x, sp_y],
start_pers, target_id_pattern + str(i),
source_id)
tp_x += dt_tp_x
x += dx
sp_x += dt_sp_x
write_string_to_file('result', retv)
def main():
start_id = 18
end_id = 45
msg_id = 'MSG'
value_pattern = 'TTGSInf'
x = 70
y = 130
dx = 0
dy = 80
retv = ''
for i in range(start_id, end_id + 1):
retv += gen_msg_start.create_text_string(msg_id + str(i),
value_pattern + str(i),
x, y)
x += dx
y += dy
write_string_to_file('result', retv)
if __name__ == '__main__':
main()
python
<template>
<button class="abstractButton" :style="cssProps">
<div v-if="text == null && img == null">
<span>UnnamedButton</span>
</div>
<div v-else-if="buttonText != null">
<span>{{ buttonText }}</span>
</div>
<div v-else>
<span>Some img</span>
</div>
</button>
</template>
<!-- -------------------------------------------------------------------------- -->
<script>
import Colors from '../common/colors.js'
export default {
name: "AbstractButton",
props: {
text: String,
img: String,
width: Number,
heigth: Number,
},
computed: {
cssProps: function() {
return {
"--color": Colors.mainColor,
"--width": this.width + "px",
"--heigth": this.heigth + "px",
"--hover-width": this.width + this.width * 0.05 + "px",
"--hover-heigth": this.heigth + this.heigth * 0.05 + "px",
};
},
},
};
</script>
<!-- -------------------------------------------------------------------------- -->
<style scoped>
.abstractButton {
width: var(--width);
height: var(--heigth);
border: 0px;
border-radius: 8px;
/* background-color: rgb(195, 195, 255); */
background-color: var(--color);
}
.abstractButton:hover {
box-shadow: 0px 0px 10px grey;
width: var(--hover-width);
height: var(--hover-heigth);
}
.abstractButton:active {
background-color: #78788f;
}
</style>
js
<H1>
Инициализация Linux для работы Real Time блоков
</H1>
<H2>
Концепция работы
</H2>
Основная цель - это изолировать ядра, на которых выполняется Real-Time код. Для этого все доступные ядра разбиваются на 2 доменные зоны:
1. Группа EtherCAT, где работает только EtherCAT мастер
2. Группа Systen, где работают: ОС, системные службы, отладчик и т.д.
При старте программы, она и отладчик запускаются в зоне System, после чего переносятся в EtherCAT зону, где начинаются спавнится потоки, привязанные к определенным ядрам.
Инициализация системы состоит из следующих этапов:
1. Запуск срипта, который подготавливает систему перед стартом пользовательского RT приложения и размечает доменные зоны
2. Запуск клиентского приложения и перенос его в определенную доменную зону
3. Инициализация потоков приложения
<H2>
Скрипт инициализации Linux
</H2>
Расположение: "scripts/rt_enviroment_init.sh".
Запуск: 1 раз при старте системы
Данный скрипт выполняет следующие действия:
1. Перенос обработки всех прерываний на 0 ядро
2. Отключает ограничения на время выполнения rt потков
3. Отключение балансировки ядра для того, чтобы потоки работали всегда только на определенных ядрах или группах ядер
4. Монтирует cpuset для настройки групп
5. Создает группу EtherCAT, в которой изначально запрещено спавнить потоки, в которой должно находится минимум 2 ядра
6. Создает группу System, в которой разрешено создавать новые процессы
7. Переносит все существующие процессы в группу System
В результате запуска скрипта: будут созданы 2 зоны: EtherCAT и System. Первая будет полностью чистая от каких-либо процессов и используемая для клиентских RT приложений, а вторая будет отвечать за работу всех системных служб.
<H3>
Разметка ядер для 4х ядерной системы
</H3>
Номер ядра | Зона | Назначение
--- | --- | ---
0 | System | Обработка системных процессов и работа инструментов отладки
1 | EtherCAT | EthrCAT Master
2 | EtherCAT | Серверы пульта, телеметрия, математика
3 | EtherCAT | Математика
<H2>
Инициализация приложения
</H2>
1. При старте приложения, процесс спавнися в зоне System, поэтому его необходимо перенести в зону EtherCAT. Для переноса, приложение получает PID своего процесса и записывает его в "/dev/cpuset/EtherCAT/tasks", после чего переносится в зону EtherCAT.
2. Далее каждый создаваемый поток привязывается к определенным ядрам, в зависимости от его задач и настраивается следующим образом:
```c++
// Привязка потока к определенным ядрам
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(<Маска для выбора ядер>, &cpuset);
// Получение PID потока
const pthread_t pid = pthread_self();
// Привязка потока к ядру
if(pthread_setaffinity_np(pid, sizeof(cpu_set_t), &cpuset))
{
perror("Can't set affinity");
exit(-1);
}
// Задание приоритета работы потока и режим работы планировщика
struct sched_param param;
param.sched_priority = 98;
int ret = pthread_attr_setschedpolicy(&appMainThreadAttr, SCHED_FIFO);
ret = pthread_attr_setschedparam(&appMainThreadAttr, ¶m);
ret = pthread_attr_setinheritsched(&appMainThreadAttr, PTHREAD_EXPLICIT_SCHED);
```
<H2>
Итог
</H2>
Таким образом, приложение находится в полной изоляции от системных процессов, на критические блоки, такие как EtherCAT master, минимизировано влияние других потоков приложения.
markdown
| |||||||||||
| |||||||||||
| |||||||||||
| |||||||||||
| |||||||||||