2023-05-03 14:01:32 +03:00
|
|
|
/*
|
2023-06-06 10:27:01 +03:00
|
|
|
* eth_ecat_telegram.cpp
|
2023-05-03 14:01:32 +03:00
|
|
|
*
|
2023-06-06 10:27:01 +03:00
|
|
|
* Created on: Jun 5, 2023
|
2023-05-03 14:01:32 +03:00
|
|
|
* Author: algin
|
|
|
|
*/
|
|
|
|
|
2023-06-06 10:27:01 +03:00
|
|
|
#include "ethernet_industry/eth_ecat_telegram.hpp"
|
2023-05-03 14:01:32 +03:00
|
|
|
|
|
|
|
namespace free_rtos {
|
|
|
|
|
2023-06-06 10:27:01 +03:00
|
|
|
namespace telegram {
|
2023-05-03 14:01:32 +03:00
|
|
|
|
|
|
|
int32_t EcatTelegram::Process(uint8_t *p_data, uint32_t len) {
|
2023-05-26 11:06:54 +03:00
|
|
|
//buffer_in_.length = len + sizeof(TEthFrameHeader);
|
2023-05-03 14:01:32 +03:00
|
|
|
|
2023-05-26 11:06:54 +03:00
|
|
|
//memcpy(buffer_in_.data, p_data - sizeof(TEthFrameHeader), buffer_in_.length);
|
|
|
|
|
2023-06-01 16:13:05 +03:00
|
|
|
if(datagram_queue_ == nullptr) {
|
2023-05-26 11:06:54 +03:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
unpack(p_data);
|
|
|
|
|
2023-06-01 16:13:05 +03:00
|
|
|
datagram_queue_ = nullptr;
|
2023-05-03 14:01:32 +03:00
|
|
|
|
|
|
|
rx_sem_.post();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2023-05-26 11:06:54 +03:00
|
|
|
void EcatTelegram::pack() {
|
2023-05-03 14:01:32 +03:00
|
|
|
TEthFrameHeader *p_eth_hdr = new(buffer_out_.data) TEthFrameHeader{ {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
|
|
|
|
{0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
|
|
|
|
ETH_PROT_ECAT_LE};
|
2023-05-23 10:17:24 +03:00
|
|
|
TEcatFrameHeader *p_hdr = new(buffer_out_.data + sizeof(TEthFrameHeader)) TEcatFrameHeader{ .bits{
|
|
|
|
.length = 0,
|
|
|
|
.type = static_cast<uint16_t>(ec_network::PROTOCOL_TYPE)}};
|
2023-05-03 14:01:32 +03:00
|
|
|
uint8_t *p_datagram_first = buffer_out_.data + sizeof(TEthFrameHeader) + sizeof(TEcatFrameHeader);
|
|
|
|
uint8_t *p_datagram_last = p_datagram_first;
|
2023-06-06 10:27:01 +03:00
|
|
|
queue::QueueEntity<datagram::IEcatDatagram> *next = datagram_queue_;
|
2023-05-03 14:01:32 +03:00
|
|
|
|
2023-05-10 15:10:01 +03:00
|
|
|
(void)p_eth_hdr;
|
|
|
|
(void)p_hdr;
|
|
|
|
|
2023-05-03 14:01:32 +03:00
|
|
|
while(next != nullptr) {
|
2023-06-06 10:27:01 +03:00
|
|
|
p_datagram_last = next->get_data()->pack(p_datagram_last);
|
2023-05-03 14:01:32 +03:00
|
|
|
next = next->get_next();
|
|
|
|
}
|
|
|
|
|
|
|
|
p_hdr->bits.length = p_datagram_last - p_datagram_first;
|
|
|
|
buffer_out_.length = sizeof(TEthFrameHeader) + sizeof(TEcatFrameHeader) + p_hdr->bits.length;
|
|
|
|
}
|
|
|
|
|
2023-05-26 11:06:54 +03:00
|
|
|
void EcatTelegram::unpack(uint8_t *raw) {
|
|
|
|
TEthFrameHeader *p_eth_hdr = reinterpret_cast<TEthFrameHeader*>(raw);
|
|
|
|
TEcatFrameHeader *p_hdr = reinterpret_cast<TEcatFrameHeader*>(raw + sizeof(TEthFrameHeader));
|
|
|
|
uint8_t *p_datagram_first = raw + sizeof(TEthFrameHeader) + sizeof(TEcatFrameHeader);
|
2023-05-03 14:01:32 +03:00
|
|
|
uint8_t *p_datagram_last = p_datagram_first;
|
2023-06-06 10:27:01 +03:00
|
|
|
queue::QueueEntity<datagram::IEcatDatagram> *next = datagram_queue_;
|
2023-05-03 14:01:32 +03:00
|
|
|
|
2023-05-10 15:10:01 +03:00
|
|
|
(void)p_eth_hdr;
|
|
|
|
(void)p_hdr;
|
|
|
|
|
2023-05-03 14:01:32 +03:00
|
|
|
while(next != nullptr) {
|
2023-06-06 10:27:01 +03:00
|
|
|
p_datagram_last = next->get_data()->unpack(p_datagram_last);
|
2023-05-03 14:01:32 +03:00
|
|
|
next = next->get_next();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-06 10:27:01 +03:00
|
|
|
void EcatTelegram::transfer(datagram::IEcatDatagram& first) {
|
|
|
|
datagram_queue_ = &first.get_queue_entity(); // TODO: Доделать добавление в очередь более одного элемента
|
2023-05-26 11:06:54 +03:00
|
|
|
|
|
|
|
pack();
|
2023-05-03 14:01:32 +03:00
|
|
|
bool stat = tx_flow_.send(port_id_, buffer_out_.data, buffer_out_.length);
|
|
|
|
|
|
|
|
if(stat == false) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
rx_sem_.pend();
|
2023-05-26 11:06:54 +03:00
|
|
|
//unpack(first);
|
2023-05-03 14:01:32 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|