diff --git a/components/free_rtos/ethernet_ip/eth_udp_client.cpp b/components/free_rtos/ethernet_ip/eth_udp_client.cpp index 65185f7..52b1a30 100644 --- a/components/free_rtos/ethernet_ip/eth_udp_client.cpp +++ b/components/free_rtos/ethernet_ip/eth_udp_client.cpp @@ -1,7 +1,7 @@ /* * eth_udp_client.cpp * - * Created on: 15 . 2023 . + * Created on: 15 ���. 2023 �. * 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; } - /// + /// �������� ������ � ����� { - LockGuard lock(rx_mut_); /// + LockGuard lock(rx_mut_); /// ��������� ������� - /// + /// ������������ ������������ ������ ������ � ������ 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_); /// ��������� ������� auto item_begin = buff_.begin(); auto item_end = item_begin + size; - /// + /// ��������� ������ �� ������ � �������� � ����� ������������ std::copy(item_begin, item_end, p_data); - /// + /// ������� ������������� ������ �� ������ 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; + } + + /// ���� ����� ����, ������� ������ ������ + 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; + } + + /// ���� ����� ����, ������� ������ ������ + 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; - /// + /// �������� ������ memcpy(p_udp_data, p_data, len); - /// + /// ���� ����� ������� ������������ ����� if (use_checksum_) { uint32_t self_ip = ip_iface_.getSelfIpAddr(); uint32_t chk_sum32 = 0; diff --git a/components/free_rtos/ethernet_ip/eth_udp_client.hpp b/components/free_rtos/ethernet_ip/eth_udp_client.hpp index a069ec5..bb97c44 100644 --- a/components/free_rtos/ethernet_ip/eth_udp_client.hpp +++ b/components/free_rtos/ethernet_ip/eth_udp_client.hpp @@ -1,7 +1,7 @@ /* * eth_udp_client.hpp * - * Created on: 15 . 2023 . + * Created on: 15 ���. 2023 �. * 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(); ///������� ��������� ������ 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 ����� ��������� ������ UDP }; } diff --git a/components/free_rtos/ethernet_ip/eth_udp_server.cpp b/components/free_rtos/ethernet_ip/eth_udp_server.cpp index 7696fd1..25c7037 100644 --- a/components/free_rtos/ethernet_ip/eth_udp_server.cpp +++ b/components/free_rtos/ethernet_ip/eth_udp_server.cpp @@ -68,6 +68,8 @@ int32_t free_rtos::EthUdpServer::Process(uint8_t * p_data, uint32_t len) /// �������� ������ udp client->put_data(src_ip, p_data + sizeof(TUdpHeader), BASE_SWAP16(hdr->Length) - sizeof(TUdpHeader)); + rx_sem_.post(); + return 0; } diff --git a/components/free_rtos/ethernet_ip/eth_udp_server.hpp b/components/free_rtos/ethernet_ip/eth_udp_server.hpp index 264293f..a04d2ce 100644 --- a/components/free_rtos/ethernet_ip/eth_udp_server.hpp +++ b/components/free_rtos/ethernet_ip/eth_udp_server.hpp @@ -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> connections_; /// ���� - ���� ���������� - + Semaphore rx_sem_; ///HandlerStore handlers_; /// ����������� udp-������ };