dev(SF-60): Улучшена работа ServiceLink и UDP
This commit is contained in:
parent
c3ca4b1e32
commit
07c4f35520
@ -34,55 +34,91 @@ void free_rtos::EthUpdClient::put_data(uint32_t src_ip, uint8_t * p_data, uint32
|
|||||||
{
|
{
|
||||||
LockGuard lock(rx_mut_);
|
LockGuard lock(rx_mut_);
|
||||||
|
|
||||||
uint32_t new_size = buff_.size() + len;
|
state_ = UDPState::UDP_BUSY;
|
||||||
|
|
||||||
if(new_size > max_buf_size) {
|
|
||||||
DebugP_log((char *)"Warning ! UDP client buffer overflow !\r\n");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
buff_.reserve(new_size);
|
|
||||||
buff_.insert(buff_.end(), p_data, p_data + len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t>& buff = buff_[!toggle_];
|
||||||
|
uint32_t new_size = buff.size() + len;
|
||||||
|
|
||||||
|
if(new_size > max_buf_size) {
|
||||||
|
state_ = UDPState::UDP_READY;
|
||||||
|
|
||||||
|
DebugP_log((char *)"Warning ! UDP client buffer overflow !\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buff.reserve(new_size);
|
||||||
|
buff.insert(buff.end(), p_data, p_data + len);
|
||||||
|
|
||||||
src_ip_ = src_ip;
|
src_ip_ = src_ip;
|
||||||
|
|
||||||
|
{
|
||||||
|
LockGuard lock(rx_mut_);
|
||||||
|
|
||||||
|
state_ = UDPState::UDP_READY;
|
||||||
|
}
|
||||||
|
|
||||||
rx_sem_.post();
|
rx_sem_.post();
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t free_rtos::EthUpdClient::get_data(uint8_t * p_data, uint32_t len)
|
int32_t free_rtos::EthUpdClient::get_data(uint8_t * p_data, uint32_t len)
|
||||||
{
|
{
|
||||||
uint32_t size;
|
std::vector<uint8_t>& buff = buff_[toggle_];
|
||||||
|
uint32_t size = buff.size();
|
||||||
|
|
||||||
{
|
if (size > len) {
|
||||||
LockGuard lock(rx_mut_);
|
size = len;
|
||||||
|
|
||||||
size = buff_.size();
|
|
||||||
|
|
||||||
if (size > len) {
|
|
||||||
size = len;
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool free_rtos::EthUpdClient::capture_buffer()
|
||||||
|
{
|
||||||
|
LockGuard lock(rx_mut_);
|
||||||
|
bool toggle = !toggle_;
|
||||||
|
std::vector<uint8_t>& buff = buff_[toggle];
|
||||||
|
|
||||||
|
if(state_ != UDPState::UDP_READY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(buff.empty() == true) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggle_ = toggle;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t free_rtos::EthUpdClient::get_data_size()
|
||||||
|
{
|
||||||
|
if (buff_[toggle_].empty() == true) {
|
||||||
|
if(capture_buffer() == false) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return buff_[toggle_].size();
|
||||||
|
}
|
||||||
|
|
||||||
int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
|
int32_t free_rtos::EthUpdClient::read(uint8_t * p_data, uint32_t len)
|
||||||
{
|
{
|
||||||
if ((p_data == nullptr) || (len == 0)) {
|
if ((p_data == nullptr) || (len == 0)) {
|
||||||
return 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_[toggle_].empty() == true) {
|
||||||
while (buff_.empty()) {
|
while (capture_buffer() == false) {
|
||||||
rx_sem_.pend();
|
rx_sem_.pend();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return get_data(p_data, len);
|
return get_data(p_data, len);
|
||||||
@ -94,9 +130,10 @@ int32_t free_rtos::EthUpdClient::read_async(uint8_t * p_data, uint32_t len)
|
|||||||
return 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_[toggle_].empty() == true) {
|
||||||
if (buff_.empty()) {
|
if(capture_buffer() == false) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return get_data(p_data, len);
|
return get_data(p_data, len);
|
||||||
@ -104,8 +141,7 @@ int32_t free_rtos::EthUpdClient::read_async(uint8_t * p_data, uint32_t len)
|
|||||||
|
|
||||||
void free_rtos::EthUpdClient::clear()
|
void free_rtos::EthUpdClient::clear()
|
||||||
{
|
{
|
||||||
LockGuard lock(rx_mut_);
|
buff_[toggle_].clear();
|
||||||
buff_.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool free_rtos::EthUpdClient::write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len)
|
bool free_rtos::EthUpdClient::write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len)
|
||||||
|
|||||||
@ -14,12 +14,18 @@
|
|||||||
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
|
#include "free_rtos/ethernet_ip/eth_ip_iface.hpp"
|
||||||
#include "free_rtos/ethernet/eth_types.h"
|
#include "free_rtos/ethernet/eth_types.h"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
namespace free_rtos {
|
namespace free_rtos {
|
||||||
|
|
||||||
|
enum UDPState : uint8_t {
|
||||||
|
UDP_READY = 0,
|
||||||
|
UDP_BUSY
|
||||||
|
};
|
||||||
|
|
||||||
class EthUpdClient {
|
class EthUpdClient {
|
||||||
friend class EthUdpServer;
|
friend class EthUdpServer;
|
||||||
|
|
||||||
@ -28,10 +34,12 @@ public:
|
|||||||
uint16_t port_dst_be, uint16_t port_src_be,
|
uint16_t port_dst_be, uint16_t port_src_be,
|
||||||
bool use_chksum);
|
bool use_chksum);
|
||||||
|
|
||||||
|
bool capture_buffer();
|
||||||
|
size_t get_data_size();
|
||||||
|
|
||||||
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 read_async(uint8_t * p_data, uint32_t len);
|
||||||
|
/*
|
||||||
template<class T, class Allocator>
|
template<class T, class Allocator>
|
||||||
int32_t read_async(std::vector<T, Allocator>& data, uint32_t len)
|
int32_t read_async(std::vector<T, Allocator>& data, uint32_t len)
|
||||||
{
|
{
|
||||||
@ -39,13 +47,15 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buff_.empty()) {
|
if (buff_[toggle_].empty() == true) {
|
||||||
return 0;
|
if(capture_buffer() == false) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return get_data(data, len);
|
return get_data(data, len);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
bool write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len);
|
bool write(uint32_t ip_dst_be, uint8_t * p_data, uint32_t len);
|
||||||
|
|
||||||
template<class T, class Allocator>
|
template<class T, class Allocator>
|
||||||
@ -59,50 +69,48 @@ public:
|
|||||||
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);
|
int32_t get_data(uint8_t * p_data, uint32_t len);
|
||||||
|
/*
|
||||||
template<class T, class Allocator>
|
template<class T, class Allocator>
|
||||||
int32_t get_data(std::vector<T, Allocator>& data, uint32_t len)
|
int32_t get_data(std::vector<T, Allocator>& data, uint32_t len)
|
||||||
{
|
{
|
||||||
uint32_t size;
|
std::vector<uint8_t>& buff = buff_[toggle_];
|
||||||
|
uint32_t size = buff.size();
|
||||||
|
|
||||||
{
|
if (size > len) {
|
||||||
LockGuard lock(rx_mut_);
|
size = len;
|
||||||
|
|
||||||
size = buff_.size();
|
|
||||||
|
|
||||||
if (size > len) {
|
|
||||||
size = len;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto item_begin = buff_.begin();
|
|
||||||
auto item_end = item_begin + size;
|
|
||||||
|
|
||||||
data.insert(data.end(), item_begin, item_end);
|
|
||||||
buff_.erase(item_begin, item_end);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto item_begin = buff.begin();
|
||||||
|
auto item_end = item_begin + size;
|
||||||
|
|
||||||
|
data.insert(data.end(), item_begin, item_end);
|
||||||
|
buff.erase(item_begin, item_end);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
private:
|
private:
|
||||||
const uint32_t max_buf_size = 0x10000; // 0x10000 - 65536, 0x11CA - 4554, 0x0BDC - 3036, 0x100000 - 1Mb
|
const uint32_t max_buf_size = 0x8000; // 0x8000 - 32768, 0x10000 - 65536, 0x11CA - 4554, 0x0BDC - 3036, 0x100000 - 1Mb
|
||||||
|
|
||||||
Semaphore rx_sem_;
|
|
||||||
Mutex rx_mut_;
|
|
||||||
|
|
||||||
const uint16_t port_dst_be_; /// big endian
|
const uint16_t port_dst_be_; /// big endian
|
||||||
const uint16_t port_src_be_; /// big endian
|
const uint16_t port_src_be_; /// big endian
|
||||||
const bool use_checksum_;
|
const bool use_checksum_;
|
||||||
|
|
||||||
std::vector<uint8_t> buff_;
|
|
||||||
|
|
||||||
TEthPkt eth_pkt_;
|
|
||||||
|
|
||||||
EthIpIface& ip_iface_;
|
EthIpIface& ip_iface_;
|
||||||
|
|
||||||
const TEthMacPorts port_id_;
|
const TEthMacPorts port_id_;
|
||||||
|
|
||||||
|
TEthPkt eth_pkt_;
|
||||||
|
|
||||||
uint32_t src_ip_; /// Ip <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UDP
|
uint32_t src_ip_; /// Ip <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UDP
|
||||||
|
|
||||||
|
Semaphore rx_sem_;
|
||||||
|
Mutex rx_mut_;
|
||||||
|
|
||||||
|
std::array<std::vector<uint8_t>, 2> buff_;
|
||||||
|
bool toggle_{false};
|
||||||
|
UDPState state_{UDPState::UDP_READY};
|
||||||
|
//std::vector<uint8_t> buff_;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user