Russian Qt Forum
Ноябрь 14, 2024, 20:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 30 31 [32] 33 34 ... 88   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].  (Прочитано 782361 раз)
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #465 : Июнь 18, 2011, 09:55 »

>>Открыл у себя Git GUI и склонировал репозиторий в D:/git/ng
у тебя же уже есть клон, с ним и работай
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #466 : Июнь 18, 2011, 11:39 »

Вроде сделал:
1. Зашел + залогинился на gitorious
2. Скопировал адрес:
Цитировать
git@gitorious.org:qserialdevice/qserialdevice.git
3. Открыл у себя Git GUI и склонировал репозиторий в:
Цитировать
D:/git/t
4. Сделал:
Цитировать
> git checkout --orphan 2.0-t
5. Сделал:
Цитировать
> git rm -rf *
6. Сделал:
Цитировать
> git commit -a
7. Создал файлы исходных кодов проекта *.h/*.cpp и скопировал их в
Цитировать
D:/git/t
8. Сделал:
Цитировать
> git add *
9. Открыл Git GU (ветку 2.0-t), сохранил изменения с коммитом: "Determination of the initial project structure."
10. Сделал:
Цитировать
> git checkout --orphan 2.0 2.0-t
11. Сделал:
Цитировать
> git branch -D 2.0-t
12. Открыл Git GU (ветку 2.0), сохранил изменения с коммитом: "Determination of the initial project structure."
13. Сделал:
Цитировать
> git push origin 2.0:refs/heads/2.0

1)
Теперь определимся с структурой самого проекта:
- файлы исходников будут в корне проекта или раскиданы по каталогам?
- нужны или нет всякие "реадми", "чейнчлоги"?
и.т.п

2.)
Как теперь коммитить в ветку 2.0?
Интересует алгоритм от клонирования, до редактирования, сохранения и отправки изменений.
Записан

ArchLinux x86_64 / Win10 64 bit
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #467 : Июнь 18, 2011, 14:59 »

1)

Можно такую структуру каталогов:

include
examples
src
<project_name>.pro
CHANGES
README
INSTALL

2)
Предлагаю работать не напрямую с репозиторием, а посредством мердж-реквестов
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #468 : Июнь 19, 2011, 07:58 »

2)
Как теперь коммитить в ветку 2.0?
Интересует алгоритм от клонирования, до редактирования, сохранения и отправки изменений.
также как ты работал с мастером.
Записан

Юра.
b-s-a
Гость
« Ответ #469 : Июнь 19, 2011, 13:48 »

Поддерживаю пастора
так же рекомендую делать проект типа subdirs (т.е. с подпроектами).
« Последнее редактирование: Июнь 19, 2011, 17:33 от b-s-a » Записан
b-s-a
Гость
« Ответ #470 : Июнь 19, 2011, 22:07 »

Я тут еще раз посмотрел на интерфейс. И мне пришла мысль отказаться от свойства portName.
И так. Предлагаю сделать 3 метода:
void setPort(const QString &portName);
void setPort(const SerialPortInfo &info);
QString portName() const;

portName возвращает всегда "COM1", "ttyS0" и т.п.
а вот setPort принимает и короткое название порта, и системный путь. Да и не перепутаешь setPort и setPortName.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #471 : Июнь 20, 2011, 07:40 »

Насчет структуры проекта: так пойдет?
Цитировать
/
|->/src
|     |-> /serialport
|     |           |-> *.h/*.cpp/*.pri
|     |->/serialportinfo
|     |           |-> *.h/*.cpp/*.pri
|     |->src.pro
|->/examples
|->serialport.pro //<< Или как-то иначе?
|->CHANGES
|->README
|->INSTALL

Цитата: b-s-a
Я тут еще раз посмотрел на интерфейс. И мне пришла мысль отказаться от свойства portName.
И так. Предлагаю сделать 3 метода:
void setPort(const QString &portName);
void setPort(const SerialPortInfo &info);
QString portName() const;

portName возвращает всегда "COM1", "ttyS0" и т.п.
а вот setPort принимает и короткое название порта, и системный путь. Да и не перепутаешь setPort и setPortName.
Так я не понял, а setPortName() где тогда будет? Или его не будет?

Цитата: pastor
2)
Предлагаю работать не напрямую с репозиторием, а посредством мердж-реквестов
А это как? Желательно по пунктам Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #472 : Июнь 20, 2011, 10:03 »

Насчет структуры проекта: так пойдет?
Поменьше подкаталогов. Лучше как сказал пастор: /include - публичные хидеры
/src - приватные хидеры и реализация
/examples - примеры
/tests - юнит-тесты

Цитата: b-s-a
Я тут еще раз посмотрел на интерфейс. И мне пришла мысль отказаться от свойства portName.
И так. Предлагаю сделать 3 метода:
void setPort(const QString &portName);
void setPort(const SerialPortInfo &info);
QString portName() const;

portName возвращает всегда "COM1", "ttyS0" и т.п.
а вот setPort принимает и короткое название порта, и системный путь. Да и не перепутаешь setPort и setPortName.
Так я не понял, а setPortName() где тогда будет? Или его не будет?
Именно - не будет. Иначе пользователь вводится в заблуждение - есть методы setPort и setPortName. Который из них надо использовать? Я бы выбрал первый и долго геморроился.

Цитата: pastor
2)
Предлагаю работать не напрямую с репозиторием, а посредством мердж-реквестов
А это как? Желательно по пунктам Улыбающийся
Для тебя никаких отличий. Т.е. как работал, так и будешь. А все остальные будут только делать мержреквесты.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #473 : Июнь 20, 2011, 12:19 »

1.

Цитировать
Лучше как сказал пастор: /include - публичные хидеры
Ну так в исходном виде эта директория должна содержать только
файлы типа: SerialPort (Или QSerialPort ?) и SerialPortInfo (Или QSerialPortInfo ?).
Содержимое которых соответственно:

SerialPort
Код
C++ (Qt)
#include "serialport.h"
 

SerialPortInfo
Код
C++ (Qt)
#include "serialportinfo.h"
 

Но она по идее не должна изначально содержать самих хидеров  "serialport.h" "serialportinfo.h".
Эти хидеры, по идее, должны автоматом копироваться в каталог /include после того как библиотека собралась.
Т.е. они должны изначально находится только в /src, а потом и в /include

А то, если бы они были только в /include - то как-то сбивается аналогия с Qt и/или с Qxt библиотеками.

2. Если уж делаем новую версию библиотеки "затачиваемую" под интеграцию в Qt, то нужно, скорее всего,
определиться как будет называться модуль (Например QtSerial, по аналогии с QtNetwork) ?

3. Нужно ли патчить qmake и т.п. ? Чтобы можно было в конфиге проекта написать типа: QT += serial

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

А то я пока не могу охватить целостной картины, что , собственно, требуется и к чему идем !


ЗЫ: Или я рано еще об этом? Улыбающийся

 
« Последнее редактирование: Июнь 20, 2011, 12:28 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #474 : Июнь 20, 2011, 12:36 »

ЗЫ: Или я рано еще об этом? Улыбающийся
Именно. Что патчить и как оформлять - это будут решать тролли. Для начала, нужно сделать, чтобы работало.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #475 : Июнь 20, 2011, 12:58 »

Ну а насчет каталога /include : я тогда просто его создам и оставлю пустым (если в git это возможно), а все заголовки помещу в /src
Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #476 : Июнь 20, 2011, 14:55 »

я предлагал в /include класть публичные хидеры - чтобы можно было просто в примерах и тестах включить этот каталог в INCLUDEPATH и не париться о том, что они могут случайно включить что-то приватное. В то же время, у самой библиотеки этот каталог тоже можно засунуть в INCLUDEPATH.
Записан
asvil
Гость
« Ответ #477 : Июнь 20, 2011, 15:16 »

А что случиться если включить что-нибудь приватное? Считаю это придумыванием несуществующих проблем.
Но таки папка include удобна, особенно если наполнить ее непосредственно заголовочниками. Зачем ее создавать пустую?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #478 : Июнь 20, 2011, 15:21 »

Ок.

1.
Теперь перейдем к АПИ приватных классов.
Я тут для SerialPortPrivate ориентировочно набросал АПИ:
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORT_P_H
#define SERIALPORT_P_H
 
#include "serialport.h"
 
#if defined (Q_OS_WIN)
#  include <qt_windows.h>
#else
#  include <termios.h>
//#  include "../unix/ttylocker.h"
#endif
 
 
class SerialPortPrivate
{
public:
   SerialPortPrivate();
   virtual ~SerialPortPrivate();
 
   void setNativePort(const QString &port);
   QString nativePort() const;
 
   bool nativeOpen(QIODevice::OpenMode mode);
   void nativeClose();
 
   bool nativeSetRate(qint32 rate, SerialPort::Directions dir);
   qint32 nativeRate(SerialPort::Directions dir) const;
 
   bool nativeSetDataBits(SerialPort::DataBits dataBits);
   SerialPort::DataBits nativeDataBits() const;
 
   bool nativeSetParity(SerialPort::Parity parity);
   SerialPort::Parity nativeParity() const;
 
   bool nativeSetStopBits(SerialPort::StopBits stopBits);
   SerialPort::StopBits nativeStopBits() const;
 
   bool nativeSetFlowControl(SerialPort::FlowControl flow);
   SerialPort::FlowControl nativeFlowControl() const;
 
   void nativeSetDataInterval(int usecs);
   int nativeDataInterval() const;
 
   void nativeSetReadTimeout(int msecs);
   int nativeReadTimeout() const;
 
   bool nativeDtr() const;
   bool nativeRts() const;
 
   SerialPort::Lines nativeLines() const;
 
   bool nativeFlush();
   bool nativeReset();
 
   void nativeSetDataErrorPolicy(SerialPort::DataErrorPolicy policy);
   SerialPort::DataErrorPolicy nativeDataErrorPolicy() const;
 
   SerialPort::PortError nativeError() const;
   void nativeUunsetError();
 
   qint64 nativeBytesAvailable() const;
 
   qint64 nativeRead(char *data, qint64 len);
   qint64 nativeWrite(const char *data, qint64 len);
 
   int nativeSelect(int timeout, bool checkRead, bool checkWrite,
                    bool *selectForRead, bool *selectForWrite);
 
private:
   //General (for any OS) private parameters
   QString mPort;
   qint32 mInRate;
   qint32 mOutRate;
   SerialPort::DataBits mDataBits;
   SerialPort::Parity mParity;
   SerialPort::StopBits mStopBits;
   SerialPort::FlowControl mFlow;
   int mDataInterval;
   int mReadTimeout;
   SerialPort::DataErrorPolicy mPolicy;
   SerialPort::PortError mError;
 
   //General (for any OS) private methods
   void initVariables();
 
   void detectDefaultRate();
   void detectDefaultDataBits();
   void detectDefaultParity();
   void detectDefaultStopBits();
   void detectDefaultFlowControl();
   void detectDefaultCurrentSettings();
 
   bool prepareOtherOptions();
 
   bool saveOldSettings();
   bool restoreOldSettings();
 
   //OS specific parameters and methods
#ifdef Q_OS_WIN
 
   enum CommTimeouts {
       ReadIntervalTimeout, ReadTotalTimeoutMultiplier,
       ReadTotalTimeoutConstant, WriteTotalTimeoutMultiplier,
       WriteTotalTimeoutConstant
   };
 
   DCB mDCB, mOldDCB;
   COMMTIMEOUTS mCommTimeouts, mOldCommTimeouts;
   OVERLAPPED mOvRead;
   OVERLAPPED mOvWrite;
   OVERLAPPED mOvSelect;
 
   bool createEvents(bool rx, bool tx);
   bool closeEvents() const;
   void recalcTotalReadTimeoutConstant();
   void prepareCommTimeouts(CommTimeouts cto, DWORD msecs);
   bool updateDcb();
   bool updateCommTimeouts();
#else
   struct termios mTermios;
   struct termios mOldTermios;
   void prepareTimeouts(int msecs);
   bool updateTermious();
   bool setStandartRate(AbstractSerial::BaudRateDirection, speed_t rate);
   bool setCustomRate(qint32 rate);
#endif
 
};
 
#endif // SERIALPORT_P_H
 
 

И вот вопрос: может быть лучше создать абстрактный класс типа AbstractSerialPortPrivate
который бы содержал общие данные и общие методы для любой ОС.
Некоторые из них можно реализовать прямо в абстрактном AbstractSerialPortPrivate
(например, nativeRate(), nativeParity() и т.п.), а остальные сделать чисто виртуальными.

А уже класс SerialPortPrivate наследовался бы от AbstractSerialPortPrivate.

Тем самым, мы в объявлении SerialPortPrivate уменьшаем кол-во писанины (да и в реализации тоже),
но у нас тогда появляется дополнительный класс AbstractSerialPortPrivate, для которого нужно создать два файла *.h/*.cpp .

Или, может быть, есть более изящное решение?

2.
Кто нить накидает АПИ для SerialPortPrivateInfo?
А то я не соображу.


Цитировать
А что случиться если включить что-нибудь приватное? Считаю это придумыванием несуществующих проблем.
Но таки папка include удобна, особенно если наполнить ее непосредственно заголовочниками. Зачем ее создавать пустую?
Ок.

----
Еще прикрепил аттач с архивом предварительной конфигурации проекта и т.п.
« Последнее редактирование: Июнь 28, 2011, 14:35 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #479 : Июнь 20, 2011, 15:47 »

На мой вгляд лучше делать именно через абстрактный класс. Причем, для него достаточно сделать только хидер - все методы пусть инлайнятся. Название его оставить SerialPortPrivate. А вот конкретные реализации - SerialPortPrivateWin/Unix.
А разве мьютекс не нужен?
слово native обязательно надо у каждого метода писать? Я бы понял, если бы это были защищенные абстрактные методы, которые вызываются публичными, но в таком виде смысле не вижу - лишняя писанина.
Что за "SerialPortPrivateInfo"? Должен же быть "SerialPortInfoPrivate", вроде. Разве нет? А потом, его состав полностью идентичен набору свойств публичного класса:
Код
C++ (Qt)
struct SerialPortInfoPrivate
{
  QString device;
  QString portName;
  QString manufacturer;
  virtual bool isValid() = 0;
};
Записан
Страниц: 1 ... 30 31 [32] 33 34 ... 88   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.19 секунд. Запросов: 23.