www.open-tager.ru
http://www.open-tager.ru/forum/

Система Caustic
http://www.open-tager.ru/forum/viewtopic.php?f=5&t=4128
Страница 105 из 108

Автор:  Alexies [ 15 фев 2017, 22:59 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
Пакеты по 32 байта гонять научился.
Давайте обсудим структуру пакета.
Цитата:
RCSP-сообщения
...

Тут какой уровень описан?
Не вижу ни адреса отправителя, ни адреса получателя...


Это что-то вроде "прикладного уровня". То есть, уже полезная нагрузка пакета. Или содержимое файла, или RFID-карты, да чего угодно. Сетевой уровень подробно опишу в ближайшем будущем.

Если кратко, то вот тут описание заголовока пакета: https://github.com/DAlexis/caustic-lase ... er.hpp#L40 . Он состоит из адресов отправителя и получателя, а также структуры PackageDetails, в которой, в свою очередь, уникальный идентификатор пакета (генерируется случайно и нужен, например, чтобы 2 раза не принять одно и то же), TTL и флаг запроса на подтверждение. Обратите внимание, используется относительно малоизвестная возможность языка C - битовые поля (про неё в этой статье есть: https://habrahabr.ru/post/142662/ )

Автор:  Pingvin [ 16 фев 2017, 06:17 ]
Заголовок сообщения:  Re: Система Caustic

Хорошо, а адреса устройств откуда берутся?

И вот в этом месте
Код:
struct PackageDetails
{
PackageDetails(uint16_t id, uint8_t ack = 0, uint16_t ttl = 0) :
packageId(id),
TTL(ttl),
needAck(ack)
{}
PackageDetails()
{
TTL = 0;
needAck = 0;
}
PackageId packageId;
uint8_t TTL : 7;
uint8_t needAck : 1;
};



что означает объявление
Код:
PackageDetails(uint16_t id, uint8_t ack = 0, uint16_t ttl = 0) :
packageId(id),
TTL(ttl),
needAck(ack)
{}



Функция, как поле структуры?
Что означает двоеточие?

Ну тут понятно
Код:
uint8_t TTL : 7;

это значит размер поля 4 бита.


Опять же
Код:
packageId(id),
TTL(ttl),
needAck(ack)

это вызов функций?
В структуре?
Ничего не понятно...

Автор:  Alexies [ 16 фев 2017, 10:56 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
Хорошо, а адреса устройств откуда берутся?

Адреса устройств берутся из конфига каждого устройства с SD-карты и назначаются при запуске. Все, что связано с сетью, лежит в папке network (она есть в include и в src)
Pingvin писал(а):
И вот в этом месте
что означает объявление
Код:
PackageDetails(uint16_t id, uint8_t ack = 0, uint16_t ttl = 0) :
packageId(id),
TTL(ttl),
needAck(ack)
{}

это вызов функций?
В структуре?
Ничего не понятно...

Это прямая инициализации членов класса (или структуры) в конструкторе. Почитайте, как работают конструкторы классов в C++, например в MSDN: https://msdn.microsoft.com/ru-ru/library/s16xw1a8.aspx . Это основы C++.

Если кратко, это то же самое, как внутри конструктора написать
Код:
packageId = id;
TTL = ttl;
needAck = ack;

но правильней в силу некоторых причин.

Автор:  Pingvin [ 16 фев 2017, 11:37 ]
Заголовок сообщения:  Re: Система Caustic

Что такое конструкторы и деструкторы я знаю.
Но я не знал, что это применимо и к структурам.

Автор:  Alexies [ 16 фев 2017, 12:02 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
Что такое конструкторы и деструкторы я знаю.
Но я не знал, что это применимо и к структурам.

Структуры и классы в С++ - полностью одно и то же, за исключением того, что в классе по-умолчанию все поля private (если не указать явно иное), а в структуре - public. Все остальное, включая принципы наследования и полиморфизма - идентично. Структура и класс могут наследоваться друг от друга в любой комбинации.

Автор:  Pingvin [ 16 фев 2017, 13:39 ]
Заголовок сообщения:  Re: Система Caustic

Код:
PackageDetails(uint16_t id, uint8_t ack = 0, uint16_t ttl = 0) :
packageId(id),
TTL(ttl),
needAck(ack)
{}
PackageDetails()
{
TTL = 0;
needAck = 0;
}


Два конструктора, что ли?
Код:
PackageDetails()
{
TTL = 0;
needAck = 0;
}


Это тоже конструктор, что ли?
Это если структура создается без указания параметров?

Автор:  Alexies [ 16 фев 2017, 14:10 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
Это тоже конструктор, что ли?
Это если структура создается без указания параметров?

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

Автор:  Pingvin [ 17 фев 2017, 07:10 ]
Заголовок сообщения:  Re: Система Caustic

Мне бы структуру заголовка и всего пакета в простом наглядном виде - как Си структуры.

Автор:  Alexies [ 17 фев 2017, 15:15 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
Мне бы структуру заголовка и всего пакета в простом наглядном виде - как Си структуры.

Так я же Вам эти структуры показал: https://github.com/DAlexis/caustic-lase ... er.hpp#L40 , там все, как есть.

Поля пакета - это структура-адрес отправителя, структура-адрес получателя, структура-заголовок и массив с данными. Структура-заголовок описана прям в этом же файле, структура-адрес - в https://github.com/DAlexis/caustic-lase ... -types.hpp . Если нужно найти, в каком файле что определено, и у вас не настроена среда, можно воспользоваться
Код:
grep -rnI "строка"


Вот я максимально упростил код - все константы и методы убраны. Тут все должно быть ясно:
Код:
struct DeviceAddress
{
   uint8_t address[3];
};

struct PackageDetails
{
   PackageId packageId;
   uint8_t TTL : 7;
   uint8_t needAck : 1;
};
struct Package
{
   DeviceAddress sender;
   DeviceAddress target;
   PackageDetails details;
   uint8_t payload[23];
};


Чтобы было совсем сишно, нужно struct заменить на typedef struct, и имя в конец :)

Автор:  Pingvin [ 17 фев 2017, 16:56 ]
Заголовок сообщения:  Re: Система Caustic

Так понятней.
PackageId - это uint16_t ?
Значит "полезная нагрузка" - 23 байта?

Страница 105 из 108 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/