Сайт лаборатории робототехники и мехатроники КубГУ

Код (не норм) + вольфрам (норм)

#!/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, &param);
    ret = pthread_attr_setinheritsched(&appMainThreadAttr, PTHREAD_EXPLICIT_SCHED);
    ```

<H2>
    Итог
</H2>

Таким образом, приложение находится в полной изоляции от системных процессов, на критические блоки, такие как EtherCAT master, минимизировано влияние других потоков приложения.

markdown

Вернуться назад