LINUX.ORG.RU

Сообщения Tumyq

 

Библиотека для парсинга ASN.1 С++

Всем привет!

У меня есть файл, подписанный цифровой подписью, я его открываю, например, вот в таком онлайн парсере https://lapo.it/asn1js/, и получаю структуру ASN.1.

Я хочу вытащить из такого файла поле - data. Подскажите, пожалуйста, какую-нибудь легкую библиотеку С++ только для чтения файла (как я понял этот формат называется «BER (DER, CER) ASN.1 binary data»). ASN компилятор мне не нужен, ничего генерировать я не собираюсь.

Я уже нашел парочку:

  1. https://github.com/Samuel-Tyler/fast_ber (собрал к ней abseil, и даже ее какие-то либы, но так и не понял, как она должна работать)
  2. https://github.com/YuryStrozhevsky/C-plus-plus-ASN.1-2008-coder-decoder (странная зависимость от xml msxml6.dll, что будет работать только под виндой)

 ,

Tumyq
()

Криптография::Win::С++: Добавление открытого ключа ЭЦП в локальное хранилище

Всем привет, как ваши дела? Давно тут не был.

Вопрос такого плана: взялся было автоматизировать подпись для работы в приложении, но столкнулся с непониманием и загадочностью wincrypt api. Использую ЭЦП SDK КриптоПро. Хочу, имея контейнер на флешке, добавлять только открытый ключ в список сертификатов «Личное» на локальном компе, чтобы подписывать документы только тогда, когда вставлена флешка (возможно, могу ошибаться, что в таком случае добавляется только открытый ключ). Во всех описаниях доки винды делают, как мне показалось, все с нуля, и до меня не доходит, какой порядок действий нужен в моем случае, когда у меня уже есть токен.

Вот пример, который, как мне кажется должен мне подойти: https://docs.microsoft.com/en-us/windows/win32/seccrypto/example-c-program-getting-and-setting-certificate-properties

Но где нужно указать путь до папки с контейнером…

Нашел еще один пример на форуме у КриптоПро https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=14724

Но тот же вопрос, плюс - зачем копировать или создавать новый контейнер.

Я вижу такой порядок действий:

  1. Проверить, что сертификат на флешке мне подходит, и получить его «хендл» для дальнейшей работы с ним (это не знаю как)
  2. Открыть хранилище CertOpenSystemStore(0, _T(«MY»));
  3. Создать контекст сертификата, в который потом будет положено что-то вроде ссылки на то, что на флешке CertCreateCertificateContext
  4. Откопать его имя и сделать ассоциацию его свойств с контекстом, который был в предыдущем шаге 3. CertSetCertificateContextProperty
  5. Скопировать содержимое контекста в локальное хранилище CertAddCertificateContextToStore

С какими параметрами это нужно делать - не совсем понятно.

Если у кого-то в этом есть опыт, подскажите, пожалуйста, что нужно делать, и, желательно названия этих виндовских функций., лучше всего, конечно, какой-то пример по мою тему…

 ,

Tumyq
()

Отправка и получение датаграм SO_BROADCAST из другой сети

Всем доброго времечка, не болеть и не дурнеть от СМИ!

Взялся я писать клиента на Пингвине, который получает бродкаст udp-датаграмму и посылает ответ таким же способом. Нужно это для того, чтобы удаленный девайс, который может находится в другой подсети, доступ к которому ограничен, смог словить пакет, и прислать свой в ответ со своим ip-адресом для дальнейшей с ним работы. Ну вот незадача - если говорить об SOCK_DGRAM, Linux стоит на страже любых поползновений, акромя тех, что в его сетке.

Общение проходит между Windows и Linux (я пишу для этой стороны).

Удалось протиснуться, установив опцию SO_BINDTODEVICE, хоть этот сокет начал отправлять, но этот сокет не принимает, а может лишь отправлять (насколько я понял из мануалов). То, что сработало, ниже:


int main(int argc, char *argv[])
{
    int sockfd;
    struct sockaddr_in their_addr; // connector's address information
    struct hostent *he;
    int numbytes;
    int broadcast = 1;
    
    if (argc != 3) {
        fprintf(stderr,"usage: broadcaster hostname message\n");
        exit(1);
    }

    if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
        perror("gethostbyname");
        exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }
//    if ((sockfd = socket(AF_INET, SOCK_RAW, htons(ETH_P_IP))) == -1) {
//        perror("socket");
//        exit(1);
//    }

    // this call is what allows broadcast packets to be sent:
    if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof broadcast) == -1) {
        perror("setsockopt (SO_BROADCAST)");
        exit(1);
    }
    if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, "enp4s0", strlen("enp4s0")) == -1) {
        perror("setsockopt (SO_BINDTODEVICE)");
        exit(1);
    }

    their_addr.sin_family = AF_INET;	 // host byte order
    their_addr.sin_port = htons(SERVERPORT); // short, network byte order
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);


    if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0,
                             (struct sockaddr *)&their_addr, sizeof their_addr)) == -1) {
        perror("sendto");
        exit(1);
     }


    printf("sent %d bytes to %s\n", numbytes,
           inet_ntoa(their_addr.sin_addr));


    close(sockfd);

Далее мои размышления пошли в сторону RAW-сокетов, что-то вроде этого

socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))

Как прочитал из мануалов, сырые сокеты могут получать датаграму еще до ее попадания в ядро, таким образом есть возможность отловить этот броадкаст, и вот моя следующая попытка это сделать:


    int fd;
    int bcast = 1;
    char recvString[MAXRECVSTRING+1]; /* Buffer for received string */
    int recvStringLen;                /* Length of received string */


    /* Create a best-effort datagram socket using UDP */
    if ((fd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0)
        printf("socket() failed");

    struct sockaddr_ll sock;

    sock.sll_family     = AF_PACKET;
    sock.sll_protocol   = htons(ETH_P_IP);
    sock.sll_ifindex    = 0;
    sock.sll_hatype;
    sock.sll_pkttype    = PACKET_BROADCAST;;
    sock.sll_halen;
    sock.sll_addr[8];
    memset(sock.sll_addr, '\0', sizeof(sock.sll_addr));

    if (-1 == bind(fd, (struct sockaddr *) &sock, sizeof(sock)))
    {
        perror("bind");
        close(fd);
        exit(1);
    }
    if (-1 == setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &bcast, sizeof(bcast))) {
        perror("setsockopt (SO_BROADCAST)");
        exit(1);
    }

    while (true)
    {
    /* Receive a single datagram from the server */
    if ((recvStringLen = recvfrom(fd, recvString, MAXRECVSTRING, 0, NULL, 0)) < 0)
        printf("recvfrom() failed");

    recvString[recvStringLen] = '\0';
    printf("Received: %s\n", recvString);    /* Print the received string */

    }

    close(fd);

Только ОНО всё равно не работает, как надо: летит куча пакетов с первый байтом ‘E’. На просторах репозиториев находил, как люди устанавливают фильтры, но там жуткая морзянка из макросов, которую не каждый смелый человек отважится искать по крупицам. С posix сокетами раньше я не работал, использовал curl или qt, но нужда приперла. Прошу помочь навести порядок (что с чем мешать) с этими сокетами.

 , , ,

Tumyq
()

c++: многопоточное чтение большого файла блоками

Всем привет! Хочу поинтересоваться у знатоков, как читать большой файл несколькими потоками поблочно. Всегда использовал потоки несколько тривиально: закидывал какой-то класс(qt) или функцию(std::thread) в отдельный поток, где-то дожидался ответа или писал в очередь (std::queue), и, собственно, никаких влажных фантазий на тему ускорения вычислений, таки, не совершал. Но тут появилась идея обрабатывать на лету большие куски файла, подумал, вот ведь она, родимая, многопоточность то. Ан нет, 4 дня сижу - херня получается.

Идея такова: разбиваю файл на куски - будь то размер гранулярности страниц в отображении файла или просто буффер; потом несколькими потоками (2-3 не важно), читаю кусками файл. Затык в том, что не понимаю, за что цепляться: пробовал отслеживать позицию в файле(перекидывать ее между потоками), такая же идея с отсчетом размера файла. Может, есть на эту тема статья хорошая или книженция? В интернете все мучают conditional_variable и примеры на двух функциях. Кто-то пишет, что надо просто открыть в каждом потоке этот файл разными дескрипторами и все будет работать. Может, это работает только с сишным подходом открытия файла open(), но ifstream отреагировал отрицательно. Задайте вектор по этой теме, если не трудно

 ,

Tumyq
()

ПИД(PID)-регулятор: управление поворотом угла двигателя с помощью драйвера

Всем привет, кого не видел) Вопрос следующий: давно хотел как-нибудь использовать ПИД-регулятор в проекте, и вот настал тот час, когда надо, а я не могу понять, как же его присобачить с имеющимися данными. У меня есть драйвер двигателя (BLSD-20), редуктор. Я опрашиваю количество прошедших оборотов двигателем с неким интервалом, и знаю, сколько мне надо получить оборотов, чтобы редуктор повернулся на нужный угол, соответственно, знаю на какой угол в текущий момент отклонился редуктор. Соль в том, что управлять двигателем с помощью драйвера я могу только заданием скорости его вращения. Итого у меня получается диапазон выставления скорости: 0 - 66,(6) оборотов/сек. Один оборот - 3,6 градусов редуктора Начитавшись литературы по ПИД, отлично понял составные части этого регулятора, и тем не менее не понимаю, как задать управляющую величину.

Основной методичкой взял вот этот манускрипт http://robofob.ru/materials/articles/pages/Karpov_mobline1.pdf

Мои размышления такие:

  1. Моя задача повернуть на некий угол, пусть будет = 90 град.

  2. Значит, в начале движения у меня ошибка 90 град.

  3. Я начинаю суммировать все обороты (angle_sum) и получаю ошибку error = 90 - angle_sum

  4. Далее пропускаю её через регулятор, должен получить управляющее воздействие, судя по методичке, это снова будет какой-то угол, который надо как-то превратить в скорость.

Теоретическая выкладка из методички


// Параметры пропорционального звена
static double kp = 10; // Коэффициент пропорционального звена

// Параметры интегратора
static double ki = 0.001; // Коэффициент интегрального звена
#define iMin -0.2 // Минимальное значение интегратора
#define iMax 0.2 // Максимальное значение интегратора
static double iSum = 0; // Сумма ошибок (значение, накопленное в интеграторе)

// Параметры дифференциатора
static double kd = 1; // Коэффициент дифференциального звена
static double old_y = 0; // Предыдущее значение сигнала

static double PIDctl (double error, double y)
{    
    double up, ui, ud;

    // Пропорциональная компонента
    up = kp * error;

    // Интегральная компонента
    iSum = iSum + error; // Накапливаем (суммируем)
    if (iSum < iMin) iSum = iMin; // Проверяем граничные значение
    if (iSum > iMax) iSum = iMax;
    ui = ki * iSum;

    // Дифференциальная компонента
    ud = kd * (y - old_y);
    old_y = y;

    return up + ui + ud;
}

Подскажите, как перейти от теории к практике, какие подводные камни меня ожидают

 

Tumyq
()

C: Декодер MJPEG

Всем привет! Вопрос ко всем знатокам: нужно прочитать отдельные кадры из MJPEG, знает ли кто-нибудь некий проект на Си с гита или еще откуда-то, которым это можно сделать, соответственно, подшаманив под себя.

В общем и целом понятно, что это просто набор картинок, пожатых отдельно друг от друга, но , таки, нормального внутреннего строения этой кухни на задворках е'нтернета не нашел.

Может, как-то не так ищу. Формат, мол , не стандартизированный. Но как же быть, если он необходим.

 

Tumyq
()

C++:: Работа со структурой по ссылке, полученной с помощью итератора

Всем привет! Как жизнь?) Вопрос академического характера. Есть такой цикл:


struct Data
{
  std::string name_pack;
  std::list<std::string> values;
};

bool func_real(std::string &val)
{
  //что-то делаем со структурой:
  bool result = handler(val);
  return result; //* <-ТОЧКА ОСТАНОВКИ
}

//записываем данные
Data data = ...;

//работаем с элементом структуры по ссылке, и надеемся,
//что эта работа изменит текущее содержимое data
for (auto el : data.values)
{        
  if (!func_real(el)) continue;
}

//на выходе в date ничего не изменилось, хотя в ТОЧКЕ ОСТАНОВКИ
//данные менялись

В методе func_real(Data &data) ссылка, соответственно, не const,

т.к. есть желание работать по ссылке с содержимым data.

Что я делаю неправильно, подскажите, пожалуйста.

 

Tumyq
()

Ubuntu(18.04) + ActiveDirectory::получение сертификата

Всем привет. Сгенерировал файл запроса сертификата .csr по этой инструкции

https://www.dmosk.ru/miniinstruktions.php?mini=linux-cert-adcs

Что нужно делать с ним дальше. Пишут, что нужно передать этот файл (в т.ч. по почте) или скопировать в центр сертификации AD. Не понятно, как это сделать.. Развернул этот центр сертификации на отдельном сервере

http://osdevice.com/threads/ustanovka-sluzhby-sertifikacii-active-directory-ad-cs-v-windows-server-2012-r2.88/

, установил там веб-службу, и посылаю свой CSR-файл post-запросом, да даже просто пытаюсь достучаться на этот сервер (в локалке) - вебовская морда открывается, а морда службы сертификации - нет.

Может быть, я плохо искал, но перерыл все, что можно было в инете, и не нашел, как послать этот CSR. Может быть, я чего не понимаю в работе таинства выпуска сертификатов, но по-другому, как это сделать из под linux, мне не понятно. Подскажите, если кто имел с этим дело

 ,

Tumyq
()

UBUNTU 18.04:: SNMP:: Создание собственных OID-ов

Всем привет! Ковыряю такую штуковину как SNMP-протокол c его MIB-деревьями.

Не получается привязать написанный mib-файл к общей системе, то есть: после префикса 1.3.6.1.4.enterprises(1) добавить еще подуровень 4050 (станет 1.3.6.1.4.enterprises(1).4050), и накидать туда других подуровней и переменных.

1.Проделал установку по ссылке https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-an-snmp-daemon-and-client-on-ubuntu-14-04

Если коротко:

sudo apt-get update
sudo apt-get install snmp snmp-mibs-downloader
sudo apt-get install snmpd
и настроил малость на локальный комп настроечные файлы агента и менеджера /etc/snmp/snmp.conf и /etc/snmp/snmpd.conf

2.Набросал тестовый mib:


NET-SNMP-EXAMPLES-MIB DEFINITIONS ::= BEGIN

IMPORTS
    
    MODULE-IDENTITY, OBJECT-TYPE, Integer32, 
    Counter32, Unsigned32, NOTIFICATION-TYPE,
    enterprises                             FROM SNMPv2-SMI    
    SnmpAdminString                         FROM SNMP-FRAMEWORK-MIB    
    RowStatus, StorageType                  FROM SNMPv2-TC
    InetAddressType, InetAddress            FROM INET-ADDRESS-MIB    
;

netSnmpExamples MODULE-IDENTITY
    LAST-UPDATED   "201901150000Z"
    ORGANIZATION    "www.net-snmp.org"
    CONTACT-INFO    
                   "postal:   Wes Hardaker
                    P.O. Box 382
                    Davis CA  95617
                    email:    net-snmp-coders@lists.sourceforge.net"
    DESCRIPTION    "Example MIB objects for agent module example implementations"
    REVISION       "201901150000Z"
    DESCRIPTION    "Corrected notification example definitions"
    REVISION       "201802060000Z"
    DESCRIPTION    "First draft"
    
    ::= { enterprises 4050 }

--
-- верхний уровень структуры
--
netSnmpExampleScalars       OBJECT IDENTIFIER ::= { netSnmpExamples 1 }
netSnmpExampleTables        OBJECT IDENTIFIER ::= { netSnmpExamples 2 }

--
-- переменные
--

netSnmpExampleInteger OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION "some text"
    DEFVAL { 42 }
    ::= { netSnmpExampleScalars 1 }

netSnmpExampleSleeper OBJECT-TYPE
    SYNTAX      Unsigned32
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION "some text"
    DEFVAL { 1 }
    ::= { netSnmpExampleScalars 2 }


END

3.Положил его в директорию /usr/share/snmp/mibs/, чтобы демон snmp мог его видеть. Соответственно, перезапустил демона: sudo service snmpd

4.В настроечном файле /etc/snmp/snmpd.conf агента указал доступ к узлу enterprises: view systemonly included .1.3.6.1.4.1

Абашибка в консоли: NET-SNMP-EXAMPLES-MIB::netSnmpExampleInteger.0 = No Such Object available on this agent at this OID

5.Судя по тому, что ответ содержит в себе название моего mib-а «NET-SNMP-EXAMPLES-MIB::netSnmpExampleInteger.0 =», что-то да где-то читается

Подскажите, кто занимался этим протоколом, есть где-то ошибка или надо что-то где-то еще настроить?

 ,

Tumyq
()

Qt:: парсинг .xml

Всем привет!

Такая вот простая незадача: есть до умопомрачения простейшая xml, но не могу найти внятного пояснения в стандартных Qt библиотек для этого случая


<тэг1>
   Текст 1.
   <тэг2>
	Текст 4.
   </тэг2>
   Текст 2.
   <тэг3>
	Текст 5.
   </тэг3>
   Текст 3.
</тэг1>

Суть в том, что сначала надо прочитать тэг1 с текст1, текст2, текст3, потом, соответственно, тэг2 с текст4 и тэг3 с текст5. QXmlStreamReader явно не подходит, хотя и пробовал нагородить с запоминанием пройденный тэгов. Теперь мучаю QDomNode, но он ведет себя так же, как предыдущий: либо читает только текст находящийся в самом верху(текст1, текст4 и текст5), либо методом text() выдает все тексты внутри каждого тэга (т.е, для тэг1 выдает все тексты в порядке 1,4,2,5,3 и т.д.). Подскажите, кто знает, пожалуйста, как этого добиться, желательно, примером

код:

void MyClass::parse_xml(QDomNode &node)
{
    QDomNode domNode = node.firstChild();
    while (!domNode.isNull())
    {
        qDebug() << "el";
        if(domNode.isElement())
        {
            QDomElement domElement = domNode.toElement();
            if (!domElement.isNull())
            {
                qDebug() << "tagname: " << domElement.tagName();
                if (domElement.hasAttributes())
                {                    
                    QDomNamedNodeMap attrmap = domElement.attributes();
                    for (int i = 0; i < attrmap.count(); i++)
                    {
                        qDebug() << "attribute: " <<  attrmap.item(i).toAttr().name()
                                 << ", value:" << attrmap.item(i).toAttr().value();
                    }
                }
                qDebug() << "tagbody: " << domElement.text().simplified();
            }
        }        
        parse_xml(domNode);
        domNode = domNode.nextSibling();
    }
}

 

Tumyq
()

Qt:: Определение выхода виджета за рамки видимости

Всем привет!)

Имеется gridlayout, в который я добавляю QTableWidget-ы по мере необходимости друг под другом. Так вот, если их становится много и контекст не влезает в окно экрана, я должен перенести следующие QTableWidget-ы на другой gridlayout.

И возникает вопрос, как узнать насколько видимый сейчас виджет.

Пробовал подобраться к задаче с точки зрения геометрии, методы :

        QRegion reg = table->visibleRegion();
        QRect rect = table->frameGeometry();
        QRect rec = table->geometry();

Выяснилось, что отрисовка виджетов идет не синхронно, поэтому эти методы возвращают размеры по дефолту до их отрисовки на экране.

Подскажите, может быть, есть другие способы. Всем заранее спасибо

 

Tumyq
()

Qt:: кодировка при работе с Microsoft SQL

Всем доброго времени суток. Такая тема уже поднималась,

https://www.linux.org.ru/forum/development/3591060

но ответа, как это сделать в Qt я не нашел.

Ситуация аналогичная: делаю запрос к базе получаю ответ, преобразовываю в стринг, вместо этого вижу что даже байты не приходят правильно, хотя цифры нормально читаются. Перебрал

    QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
    QTextCodec::setCodecForLocale(codec);

Пробовал «UTF-8», пробовал менять драйвер на «SQL Server Native Client 10.0» (сейчас «SQL Server»), пробовал преобразования из QByteArray, но дело в том, что мне уже приходят битые байты,

в дебаге:

'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd
'�' 	65533	0xfffd

то есть дело в кодировке кириллицы с самого подключения.

Смотрел здесь,

https://habr.com/post/234089/

не помогло. Подскажите, пожалуйста, кто имел с этим делом, как решили этот вопрос?

 

Tumyq
()

QT:: Динамическое размещение кнопок на форме

Всем привет, такой вопрос: получаю информацию из вне о количестве необходимых кнопок, нужно расставить их динамически по сетке, меняя их размер в зависимости от их количества, т.е. если кнопок мало, то - в столбик с максимальным размером, если много то в два столбца.

Сейчас начал делать так: размещаю лейаут, на него закидываю кнопки, после удаления их и последующей перерисовки, новый кнопки начинают добавляться поверх друг друга. Какой есть способ сделать это удобнее?

Ниже методы добавления и удаления


void MainWindow::_CreateButtons(int butnumber, QTabWidget *tabWdg)
{
    QVBoxLayout *vlayout = new QVBoxLayout(this);
    tabWdg->setLayout(vlayout);

    for(int i = 0; i < butnumber; i++)
    {
        QPushButton *btn = new QPushButton(tr("new Button %1").arg(i), tabWdg->currentWidget());
        btn->setObjectName(QString::number(i));//имена кнопок

        connect(btn, SIGNAL(clicked()), this, SLOT(on_buttons_clicked())); // соединяем с самописным слотом

        vlayout->addWidget(btn);
        btn->show();
    }
}


void MainWindow::_DelDinamicButtons()
{
    QLayoutItem *child;
    while ((child = ui->tabWidget_nomList->layout()->takeAt(0)) != 0)  {

        if (child->widget()) {
            ui->tabWidget_nomList->layout()->removeWidget(child->widget());
            delete child->widget();
        }
        delete child;
    }
}

 

Tumyq
()

Тайминг в Расбери Пи

Всем привет. Такая запара: надо управлять шаговым двигателем средствами расбери пи. Не могу найти четкого тактирования или хоть какой-то годный код, где бы это было сделано аппаратно. Самое приближенное, что нашлось, здесь:

http://abyz.co.uk/rpi/pigpio/code/minimal_clk.zip

но что-то я вообще не пойму, как оно работает и что ему надо послать через консоль (то ли 1k, то ли просто один 1 или просто k, если мне , например, нужно 19,2 честных МГц)

Должен же быть какой-то простой способ получить неплавающие импульсы от такой то железки, на которой, по словам очевидцев, чего только не реализовано, ну и поуправлять ими

 , ,

Tumyq
()

Raspberry Pi B camera + OpenCV

Всем доброго времени суток)

Накатил на расбери ось Rasbian(desktop), поставил штатный OpenCV из репозитория, поставил qt5-default аналогично из репозитория, либу raspicam, и написал прогу детектирования лица.

Проблема в том, что камера не захватывает текущий кадр, а как будто медленно (кадр в секунду) буферизует видео, и только потом выкидывает кадр для OpenCV. И получается, что я уже вышел из поля зрения камеры, но в кадре еще сижу секунд 10, и меееедленно двигаюсь)

Порылся на просторах интернета, с чем это связано точно - не нашел. Как понимаю, должна быть где-то настройка камеры, чтобы отключить такой режим, либо уменьшить размер захватываемого кадра, либо увеличить количество кадров в секунду.. В общем, товарищи, кто имел дело с расбери и камерой, подскажите, пожалуйста

 ,

Tumyq
()

Qt: Сборка deb-пакета проекта qt со сторонними библиотеками

Всем привээээт!) Собственно весь вопрос в заголовке. Написан проект Qt+OpenCV, OpenCV собран как рантайм, теперь надо перенести на машину с Debian (у меня Kubuntu). Просьба - подсказать, как это делается.

 

Tumyq
()

Qt, бесконечный цикл в отдельном потоке

Всем привет!)

В проекте есть класс (Engine) с бесконечным циклом, который вынесен в отдельный поток (moveToThread()). В этом цикле эмитируется сигнал, который ловится слотом в другом классе (MainWindow).

То, что объявлено в MainWindow

QThread thread; //thread и cm- объявлен глобально, здесь для простоты
Engine *cm = new Engine;

cm->moveToThread(&thread);
connect(&thread, &QThread::finished, cm, &QObject::deleteLater); 
connect(cm, &Engine::coordinate, this, &MainWindow::moveEngine); 
thread.start();

То, что в Engine

void Engine::workfunction()
{
   while(key == true)
   {
      ...
      emit coordinate(data);
      if(key == false) break;
   }
}

Теперь получается так, что этот сигнал ловится слотом только первый раз. Полазил в интернете, нашел, что «поток занят функцией с бесконечным циклом, и сигналы встают в очередь и не обрабатываются».

Отсюда https://ru.stackoverflow.com/questions/758609/qt-%d0%bd%d0%b5-%d0%b2%d1%8b%d0%b7%d1%8b%d0%b2%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d1%81%d0%bb%d0%be%d1%82-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d0%be%d0%bc-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%b5

Пробовал дописать пятым параметром Qt::DirectConnection сначала - во второй, а потом и в первый конект с различными вариациями - не помогает.

Для меня видится две проблемы:

1. Как сделать отзывчивый бесконечный цикл средствами Qt.

2. Как правильно использовать вызовы для потока QThread.

Расскажите, пожалуйста

 

Tumyq
()

Qt ошибка: collect2: error: ld returned 1 exit status

Kubuntu LTS 18.04 новая, Qt 5.11

Всем привет! Поставил новую Kubuntu и Qt, сделал новый проект, только с MainWindow. Сначала ругался линковщик, вылечил установив

sudo apt-get install build-essential
теперь qmake работает, но не компилится, выдает ошибку:
collect2: error: ld returned 1 exit status
Компиляторы и дебагер указаны в пакете
GCC (C, x86 64bit в /usr/bin)
GCC (C++, x86 64bit в /usr/bin)
/usr/bin/gdb
подскажите, пожалуйста, что еще может быть?

 

Tumyq
()

Qt сборка проекта в бинарный файл

Всем привет!) Стоит Lubuntu, хочу собрать проект как бинарник. В винде докидывал .dll рядом с .exe, и всё запускалось. Как это делается в Linux? Несколько lib используются runtime. Первое, что приходит в голову, надо скомпилировать в creator release, вытащить исполняемый файл, и, возможно, что-то ещё набросать. А что, и где это искать в Linux, а подскажите, пожалуйста)

 

Tumyq
()

HIDAPI Lubuntu Qt

Всем привет! Есть проект, нужно из под Линукс соединиться с контроллером, контроллер изначально настроен как hid-устройство. Для этих целей я взял библиотеку hidapi отсюда https://github.com/signal11/hidapi по инструкции собрал, подключил либы в Qt, все компилится, вначале проги получаю список всех хид-устройств с пидами и вендорами, но я ничего не могу отправить, код ниже:

#include <QCoreApplication>

#include <hidapi/hidapi.h>
#include <QDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int res;
    unsigned char buf[65];
    wchar_t wstr[MAX_STR];

    hid_device *handle;

    // Enumerate and print the HID devices on the system
    struct hid_device_info *devs, *cur_dev;

   
    devs = hid_enumerate(0x0, 0x0);
    cur_dev = devs;

    while (cur_dev) {
        qDebug() << "vendor_id: " << cur_dev->vendor_id;
        qDebug() << "product_id: " << cur_dev->product_id;
        qDebug() << "path: " << QString(cur_dev->path);
        qDebug() << "serial_number: " << cur_dev->serial_number;
        qDebug() << "manufacturer_string: " 
                 << cur_dev->manufacturer_string;
        qDebug() << "product_string: " 
                 << cur_dev->product_string << "\n";

        cur_dev = cur_dev->next;
    }
    hid_free_enumeration(devs);

    
    unsigned char buf[2];
    hid_device *handle;
    
    handle = hid_open(0x4C53, 0x0007, NULL);
    qDebug() << "handle is: " << handle;

    buf[0] = 0x01;
    buf[1] = 0x01;

    res = hid_send_feature_report(handle, buf, 2);
    qDebug() << "hid_send_feature_report :" << res;

    res = hid_exit();
    qDebug() << "hid_exit :" << res;

    return a.exec();
}

начиная со строчки handle = hid_open(0x4C53, 0x0007, NULL); хендл становится нулем - и все, я пробовал пересобирать библиотеку, ставить более раннюю версию - ничего не помогает, хендл становится нулем. Что я делаю не так, подскажите, пожалуйста

 ,

Tumyq
()

RSS подписка на новые темы