dev(UML-1462): Добавлено асинхронное чтение и исправлен баг
This commit is contained in:
parent
e40ceb8842
commit
75b28d8ab9
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* eth_udp_client.cpp
|
* eth_udp_client.cpp
|
||||||
*
|
*
|
||||||
* Created on: 15 мар. 2023 г.
|
* Created on: 15 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
||||||
* Author: sychev
|
* Author: sychev
|
||||||
*/
|
*/
|
||||||
#include "free_rtos/ethernet_ip/eth_udp_client.hpp"
|
#include "free_rtos/ethernet_ip/eth_udp_client.hpp"
|
||||||
@ -32,11 +32,11 @@ void free_rtos::EthUpdClient::put_data(uint32_t src_ip, uint8_t * p_data, uint32
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Копируем данные в буфер
|
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
LockGuard lock(rx_mut_); /// Блокируем мьютекс
|
LockGuard lock(rx_mut_); /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
/// Ограничиваем максимальный размер данных в буфере
|
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
if (buff_.size() < max_buf_size) {
|
if (buff_.size() < max_buf_size) {
|
||||||
buff_.insert(buff_.end(), p_data, p_data + len);
|
buff_.insert(buff_.end(), p_data, p_data + len);
|
||||||
}
|
}
|
||||||
@ -47,17 +47,8 @@ void free_rtos::EthUpdClient::put_data(uint32_t src_ip, uint8_t * p_data, uint32
|
|||||||
rx_sem_.post();
|
rx_sem_.post();
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
|
int32_t free_rtos::EthUpdClient::get_data(uint8_t * p_data, uint32_t len)
|
||||||
{
|
{
|
||||||
if ((p_data == nullptr) || (len == 0)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Если буфер пуст, ожидаем приема данных
|
|
||||||
if (buff_.empty()) {
|
|
||||||
rx_sem_.pend();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t size = buff_.size();
|
uint32_t size = buff_.size();
|
||||||
|
|
||||||
if (size > len) {
|
if (size > len) {
|
||||||
@ -65,19 +56,47 @@ int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
LockGuard lock(rx_mut_); /// Блокируем мьютекс
|
LockGuard lock(rx_mut_); /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
auto item_begin = buff_.begin();
|
auto item_begin = buff_.begin();
|
||||||
auto item_end = item_begin + size;
|
auto item_end = item_begin + size;
|
||||||
|
|
||||||
/// Извлекаем данные из буфера и копипуем в буфер пользователя
|
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
std::copy(item_begin, item_end, p_data);
|
std::copy(item_begin, item_end, p_data);
|
||||||
/// Удаляем скопированные данные из буфера
|
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
buff_.erase(item_begin, item_end);
|
buff_.erase(item_begin, item_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
|
||||||
|
{
|
||||||
|
if ((p_data == nullptr) || (len == 0)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
while (buff_.empty()) { // Не заменять на if ! Иначе следующий прием получит пустой буфер т.к. семафор может быть не сброшен !
|
||||||
|
rx_sem_.pend();
|
||||||
|
}
|
||||||
|
|
||||||
|
return get_data(p_data, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t free_rtos::EthUpdClient::read_async(uint8_t * p_data, uint32_t len)
|
||||||
|
{
|
||||||
|
if ((p_data == nullptr) || (len == 0)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
if (buff_.empty()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return get_data(p_data, len);
|
||||||
|
}
|
||||||
|
|
||||||
void free_rtos::EthUpdClient::clear()
|
void free_rtos::EthUpdClient::clear()
|
||||||
{
|
{
|
||||||
LockGuard lock(rx_mut_);
|
LockGuard lock(rx_mut_);
|
||||||
@ -100,10 +119,10 @@ int32_t free_rtos::EthUpdClient::write(uint32_t ip_dst_be, uint8_t * p_data, uin
|
|||||||
hdr->Length = BASE_SWAP16(eth_pkt_.length);
|
hdr->Length = BASE_SWAP16(eth_pkt_.length);
|
||||||
hdr->Chk_sum = 0;
|
hdr->Chk_sum = 0;
|
||||||
|
|
||||||
/// Копируем данные
|
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
memcpy(p_udp_data, p_data, len);
|
memcpy(p_udp_data, p_data, len);
|
||||||
|
|
||||||
/// Если нужно считать контроольную сумму
|
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||||
if (use_checksum_) {
|
if (use_checksum_) {
|
||||||
uint32_t self_ip = ip_iface_.getSelfIpAddr();
|
uint32_t self_ip = ip_iface_.getSelfIpAddr();
|
||||||
uint32_t chk_sum32 = 0;
|
uint32_t chk_sum32 = 0;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* eth_udp_client.hpp
|
* eth_udp_client.hpp
|
||||||
*
|
*
|
||||||
* Created on: 15 ìàð. 2023 ã.
|
* Created on: 15 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
||||||
* Author: sychev
|
* Author: sychev
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -29,12 +29,15 @@ public:
|
|||||||
|
|
||||||
int32_t read(uint8_t * p_data, uint32_t len);
|
int32_t read(uint8_t * p_data, uint32_t len);
|
||||||
|
|
||||||
|
int32_t read_async(uint8_t * p_data, uint32_t len);
|
||||||
|
|
||||||
int32_t write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len);
|
int32_t write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len);
|
||||||
|
|
||||||
void clear(); ///î÷èñòêà ïðèåìíîãî áóôåðà
|
void clear(); ///<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void put_data(uint32_t src_ip, uint8_t * p_data, uint32_t len);
|
void put_data(uint32_t src_ip, uint8_t * p_data, uint32_t len);
|
||||||
|
int32_t get_data(uint8_t * p_data, uint32_t len);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const uint32_t max_buf_size = 0x100000; // 1Mb
|
const uint32_t max_buf_size = 0x100000; // 1Mb
|
||||||
@ -54,7 +57,7 @@ private:
|
|||||||
|
|
||||||
const TEthMacPorts port_id_;
|
const TEthMacPorts port_id_;
|
||||||
|
|
||||||
uint32_t src_ip_; /// Ip Àäðåñ èñòî÷íèêà ïàêåòà UDP
|
uint32_t src_ip_; /// Ip <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UDP
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -68,6 +68,8 @@ int32_t free_rtos::EthUdpServer::Process(uint8_t * p_data, uint32_t len)
|
|||||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp
|
||||||
client->put_data(src_ip, p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader));
|
client->put_data(src_ip, p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader));
|
||||||
|
|
||||||
|
rx_sem_.post();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,6 +30,11 @@ public:
|
|||||||
|
|
||||||
virtual uint32_t Sender(uint8_t * p_data, size_t scatter_segment) override;
|
virtual uint32_t Sender(uint8_t * p_data, size_t scatter_segment) override;
|
||||||
|
|
||||||
|
int32_t select(uint32_t ticks = SystemP_WAIT_FOREVER)
|
||||||
|
{
|
||||||
|
return rx_sem_.pend(ticks);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EthIpIface& ip_iface_;
|
EthIpIface& ip_iface_;
|
||||||
|
|
||||||
@ -37,7 +42,7 @@ private:
|
|||||||
|
|
||||||
std::map<uint16_t, std::shared_ptr<EthUpdClient>> connections_; /// <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
std::map<uint16_t, std::shared_ptr<EthUpdClient>> connections_; /// <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
Semaphore rx_sem_;
|
||||||
///HandlerStore handlers_; /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
///HandlerStore handlers_; /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> udp-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user