dev(UML-1462): Добавлено асинхронное чтение и исправлен баг
This commit is contained in:
parent
e40ceb8842
commit
75b28d8ab9
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* eth_udp_client.cpp
|
||||
*
|
||||
* Created on: 15 мар. 2023 г.
|
||||
* Created on: 15 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
||||
* Author: sychev
|
||||
*/
|
||||
#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;
|
||||
}
|
||||
|
||||
/// Копируем данные в буфер
|
||||
/// <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) {
|
||||
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();
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
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_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);
|
||||
/// Удаляем скопированные данные из буфера
|
||||
/// <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);
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
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->Chk_sum = 0;
|
||||
|
||||
/// Копируем данные
|
||||
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
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_) {
|
||||
uint32_t self_ip = ip_iface_.getSelfIpAddr();
|
||||
uint32_t chk_sum32 = 0;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* eth_udp_client.hpp
|
||||
*
|
||||
* Created on: 15 ìàð. 2023 ã.
|
||||
* Created on: 15 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
||||
* Author: sychev
|
||||
*/
|
||||
|
||||
@ -29,12 +29,15 @@ public:
|
||||
|
||||
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);
|
||||
|
||||
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:
|
||||
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:
|
||||
const uint32_t max_buf_size = 0x100000; // 1Mb
|
||||
@ -54,7 +57,7 @@ private:
|
||||
|
||||
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
|
||||
client->put_data(src_ip, p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader));
|
||||
|
||||
rx_sem_.post();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -30,6 +30,11 @@ public:
|
||||
|
||||
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:
|
||||
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>
|
||||
|
||||
|
||||
Semaphore rx_sem_;
|
||||
///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