feat(UML-1462): Добавил счетчик PDO и поправил варнинги от логирования
This commit is contained in:
parent
ac6e7845ad
commit
7f65963fc3
@ -113,6 +113,8 @@ void EthEcatPdoFMMU::process() {
|
|||||||
process_write_queue(process_data.data(), process_data.size());
|
process_write_queue(process_data.data(), process_data.size());
|
||||||
|
|
||||||
write(0, process_data);
|
write(0, process_data);
|
||||||
|
|
||||||
|
pdo_counter_++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,6 +80,10 @@ public:
|
|||||||
void init();
|
void init();
|
||||||
void process();
|
void process();
|
||||||
|
|
||||||
|
uint32_t get_pdo_counter() {
|
||||||
|
return pdo_counter_;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename... DataTypes>
|
template<typename... DataTypes>
|
||||||
bool pdo_write(uint32_t timeout_ticks, address::Offset offset, DataTypes&... data) {
|
bool pdo_write(uint32_t timeout_ticks, address::Offset offset, DataTypes&... data) {
|
||||||
custom_promise::WritePromise<DataTypes...> promise{offset, data...};
|
custom_promise::WritePromise<DataTypes...> promise{offset, data...};
|
||||||
@ -141,6 +145,8 @@ private:
|
|||||||
custom_promise::WritePromise<> queue_write_{0};
|
custom_promise::WritePromise<> queue_write_{0};
|
||||||
custom_promise::ReadPromise<> queue_read_{0};
|
custom_promise::ReadPromise<> queue_read_{0};
|
||||||
|
|
||||||
|
uint32_t pdo_counter_{0};
|
||||||
|
|
||||||
void wait_op();
|
void wait_op();
|
||||||
|
|
||||||
void process_write_queue(uint8_t* process_data, uint32_t len);
|
void process_write_queue(uint8_t* process_data, uint32_t len);
|
||||||
|
@ -30,16 +30,16 @@ void EthEcatSdoMailbox::read_pdo_map(uint16_t pdo_map_rx_index, uint16_t pdo_map
|
|||||||
uint16_t pdo_tx_data_size{0x0000};
|
uint16_t pdo_tx_data_size{0x0000};
|
||||||
ecat_buffer::PDOMap pdo_map;
|
ecat_buffer::PDOMap pdo_map;
|
||||||
|
|
||||||
DebugP_log("Reading rx pdo map\r\n");
|
DebugP_log((char*)"Reading rx pdo map\r\n");
|
||||||
pdo_rx_data_size = sdo_mailbox_slave.pdo_map_read<command::FP>(telegram, pdo_map, pdo_map_rx_index);
|
pdo_rx_data_size = sdo_mailbox_slave.pdo_map_read<command::FP>(telegram, pdo_map, pdo_map_rx_index);
|
||||||
|
|
||||||
DebugP_log("Reading tx pdo map\r\n");
|
DebugP_log((char*)"Reading tx pdo map\r\n");
|
||||||
pdo_tx_data_size = sdo_mailbox_slave.pdo_map_read<command::FP>(telegram, pdo_map, pdo_map_tx_index);
|
pdo_tx_data_size = sdo_mailbox_slave.pdo_map_read<command::FP>(telegram, pdo_map, pdo_map_tx_index);
|
||||||
|
|
||||||
pdo_map_.emplace_back(std::move(pdo_map));
|
pdo_map_.emplace_back(std::move(pdo_map));
|
||||||
|
|
||||||
DebugP_log("pdo_rx_data_size = %d\r\n", pdo_rx_data_size);
|
DebugP_log((char*)"pdo_rx_data_size = %d\r\n", pdo_rx_data_size);
|
||||||
DebugP_log("pdo_tx_data_size = %d\r\n", pdo_tx_data_size);
|
DebugP_log((char*)"pdo_tx_data_size = %d\r\n", pdo_tx_data_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,7 +280,7 @@ public:
|
|||||||
|
|
||||||
if( (elements.coe_header.service != static_cast<uint8_t>(Service::SDO_RESPONSE)) ||
|
if( (elements.coe_header.service != static_cast<uint8_t>(Service::SDO_RESPONSE)) ||
|
||||||
(elements.command_specifier.command_spec != static_cast<uint8_t>(SDOReqCommandSpecifier::UPLOAD)) ) {
|
(elements.command_specifier.command_spec != static_cast<uint8_t>(SDOReqCommandSpecifier::UPLOAD)) ) {
|
||||||
DebugP_log("CoE error: = 0x%04x\r\n", complete_size.value); // 0x601004 - The object cannot be accessed via complete access
|
DebugP_log((char*)"CoE error: = 0x%04x\r\n", complete_size.value); // 0x601004 - The object cannot be accessed via complete access
|
||||||
}
|
}
|
||||||
|
|
||||||
//DebugP_log("elements.coe_header.number = %d\r\n", elements.coe_header.number);
|
//DebugP_log("elements.coe_header.number = %d\r\n", elements.coe_header.number);
|
||||||
@ -318,7 +318,7 @@ public:
|
|||||||
|
|
||||||
if( (elements.coe_header.service != static_cast<uint8_t>(Service::SDO_RESPONSE)) ||
|
if( (elements.coe_header.service != static_cast<uint8_t>(Service::SDO_RESPONSE)) ||
|
||||||
(elements.command_specifier.command_spec != static_cast<uint8_t>(SDOReqCommandSpecifier::UPLOAD)) ) {
|
(elements.command_specifier.command_spec != static_cast<uint8_t>(SDOReqCommandSpecifier::UPLOAD)) ) {
|
||||||
DebugP_log("CoE error: = 0x%04x\r\n", complete_size.value); // 0x601004 - The object cannot be accessed via complete access
|
DebugP_log((char*)"CoE error: = 0x%04x\r\n", complete_size.value); // 0x601004 - The object cannot be accessed via complete access
|
||||||
}
|
}
|
||||||
|
|
||||||
//DebugP_log("elements.coe_header.number = %d\r\n", elements.coe_header.number);
|
//DebugP_log("elements.coe_header.number = %d\r\n", elements.coe_header.number);
|
||||||
@ -345,7 +345,7 @@ public:
|
|||||||
sdo_read<TypeT, uint8_t>(telegram, pdo_map_index, 0x00, pdo_block_count);
|
sdo_read<TypeT, uint8_t>(telegram, pdo_map_index, 0x00, pdo_block_count);
|
||||||
pdo_map.block_index_map[pdo_map_index].emplace(0, pdo_block_count);
|
pdo_map.block_index_map[pdo_map_index].emplace(0, pdo_block_count);
|
||||||
|
|
||||||
DebugP_log("pdo_block_count = 0x%01x\r\n", pdo_block_count);
|
DebugP_log((char*)"pdo_block_count = 0x%01x\r\n", pdo_block_count);
|
||||||
|
|
||||||
for(uint8_t pdo_map_subindex = 1; pdo_map_subindex < (pdo_block_count + 1); pdo_map_subindex++) {
|
for(uint8_t pdo_map_subindex = 1; pdo_map_subindex < (pdo_block_count + 1); pdo_map_subindex++) {
|
||||||
uint16_t pdo_block_index{0x0000};
|
uint16_t pdo_block_index{0x0000};
|
||||||
@ -363,7 +363,7 @@ public:
|
|||||||
sdo_read<TypeT, uint8_t>(telegram, pdo_block_index, 0, pdo_block_object_count);
|
sdo_read<TypeT, uint8_t>(telegram, pdo_block_index, 0, pdo_block_object_count);
|
||||||
pdo_map.object_descriptor_map[pdo_block_index].emplace(0, tmp);
|
pdo_map.object_descriptor_map[pdo_block_index].emplace(0, tmp);
|
||||||
|
|
||||||
DebugP_log("pdo_block_object_count = 0x%01x\r\n", pdo_block_object_count);
|
DebugP_log((char*)"pdo_block_object_count = 0x%01x\r\n", pdo_block_object_count);
|
||||||
|
|
||||||
for(uint8_t pdo_block_subindex = 1; pdo_block_subindex < (pdo_block_object_count + 1); pdo_block_subindex++) {
|
for(uint8_t pdo_block_subindex = 1; pdo_block_subindex < (pdo_block_object_count + 1); pdo_block_subindex++) {
|
||||||
ecat_buffer::PDODescriptor descriptor;
|
ecat_buffer::PDODescriptor descriptor;
|
||||||
|
@ -109,19 +109,19 @@ void EthEcat::set_slaves_to_default() {
|
|||||||
//telegram_.transfer(l);
|
//telegram_.transfer(l);
|
||||||
//telegram_.transfer(m);
|
//telegram_.transfer(m);
|
||||||
|
|
||||||
DebugP_log("a.get_wkc() = %d\r\n", a.get_wkc());
|
DebugP_log((char*)"a.get_wkc() = %d\r\n", a.get_wkc());
|
||||||
DebugP_log("b.get_wkc() = %d\r\n", b.get_wkc());
|
DebugP_log((char*)"b.get_wkc() = %d\r\n", b.get_wkc());
|
||||||
DebugP_log("c.get_wkc() = %d\r\n", c.get_wkc());
|
DebugP_log((char*)"c.get_wkc() = %d\r\n", c.get_wkc());
|
||||||
DebugP_log("d.get_wkc() = %d\r\n", d.get_wkc());
|
DebugP_log((char*)"d.get_wkc() = %d\r\n", d.get_wkc());
|
||||||
DebugP_log("e.get_wkc() = %d\r\n", e.get_wkc());
|
DebugP_log((char*)"e.get_wkc() = %d\r\n", e.get_wkc());
|
||||||
DebugP_log("f.get_wkc() = %d\r\n", f.get_wkc());
|
DebugP_log((char*)"f.get_wkc() = %d\r\n", f.get_wkc());
|
||||||
DebugP_log("g.get_wkc() = %d\r\n", g.get_wkc());
|
DebugP_log((char*)"g.get_wkc() = %d\r\n", g.get_wkc());
|
||||||
DebugP_log("h.get_wkc() = %d\r\n", h.get_wkc());
|
DebugP_log((char*)"h.get_wkc() = %d\r\n", h.get_wkc());
|
||||||
DebugP_log("i.get_wkc() = %d\r\n", i.get_wkc());
|
DebugP_log((char*)"i.get_wkc() = %d\r\n", i.get_wkc());
|
||||||
DebugP_log("j.get_wkc() = %d\r\n", j.get_wkc());
|
DebugP_log((char*)"j.get_wkc() = %d\r\n", j.get_wkc());
|
||||||
DebugP_log("k.get_wkc() = %d\r\n", k.get_wkc());
|
DebugP_log((char*)"k.get_wkc() = %d\r\n", k.get_wkc());
|
||||||
DebugP_log("l.get_wkc() = %d\r\n", l.get_wkc());
|
DebugP_log((char*)"l.get_wkc() = %d\r\n", l.get_wkc());
|
||||||
DebugP_log("m.get_wkc() = %d\r\n", m.get_wkc());
|
DebugP_log((char*)"m.get_wkc() = %d\r\n", m.get_wkc());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t EthEcat::slaves_detecting() {
|
uint16_t EthEcat::slaves_detecting() {
|
||||||
@ -184,16 +184,16 @@ void EthEcat::get_addresses_of_slaves() {
|
|||||||
} while(datagrams[0].get_all_wkc() < number_of_slaves);
|
} while(datagrams[0].get_all_wkc() < number_of_slaves);
|
||||||
|
|
||||||
for(EcatSlave& slave : slaves_) {
|
for(EcatSlave& slave : slaves_) {
|
||||||
DebugP_log("Slave %d address = %d\r\n", -slave.get_slave_address<command::AP>(), slave.get_slave_address<command::FP>());
|
DebugP_log((char*)"Slave %d address = %d\r\n", -slave.get_slave_address<command::AP>(), slave.get_slave_address<command::FP>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t EthEcat::config_init(uint16_t address_base) {
|
uint16_t EthEcat::config_init(uint16_t address_base) {
|
||||||
DebugP_log("Initializing slaves...\r\n");
|
DebugP_log((char*)"Initializing slaves...\r\n");
|
||||||
|
|
||||||
set_slaves_to_default();
|
set_slaves_to_default();
|
||||||
uint16_t number_of_slaves = slaves_detecting();
|
uint16_t number_of_slaves = slaves_detecting();
|
||||||
DebugP_log("number_of_slaves = %d\r\n", number_of_slaves);
|
DebugP_log((char*)"number_of_slaves = %d\r\n", number_of_slaves);
|
||||||
|
|
||||||
set_addresses_of_slaves(number_of_slaves, address_base);
|
set_addresses_of_slaves(number_of_slaves, address_base);
|
||||||
get_addresses_of_slaves();
|
get_addresses_of_slaves();
|
||||||
@ -214,7 +214,7 @@ bool EthEcat::init_to_preop() {
|
|||||||
success &= slave.init_to_preop<command::FP>(telegram_);
|
success &= slave.init_to_preop<command::FP>(telegram_);
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("success = %d\r\n", success);
|
DebugP_log((char*)"success = %d\r\n", success);
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
@ -226,7 +226,7 @@ bool EthEcat::preop_to_safeop() {
|
|||||||
success &= slave.preop_to_safeop<command::FP>(telegram_);
|
success &= slave.preop_to_safeop<command::FP>(telegram_);
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("success = %d\r\n", success);
|
DebugP_log((char*)"success = %d\r\n", success);
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
@ -269,8 +269,8 @@ bool EthEcat::safeop_to_op() {
|
|||||||
ecat_timer_.Start();
|
ecat_timer_.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
DebugP_log((char*)"stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||||
DebugP_log("success = %d\r\n", success);
|
DebugP_log((char*)"success = %d\r\n", success);
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ public:
|
|||||||
} while(datagram.get_wkc() < 0x0001);
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
DebugP_log((char*)"stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||||
|
|
||||||
if((stat.state & 0x0010) != 0) {
|
if((stat.state & 0x0010) != 0) {
|
||||||
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
||||||
@ -133,7 +133,7 @@ public:
|
|||||||
} while(datagram.get_wkc() < 0x0001);
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
DebugP_log((char*)"stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||||
|
|
||||||
if((stat.state & 0x0010) != 0) {
|
if((stat.state & 0x0010) != 0) {
|
||||||
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
||||||
@ -145,7 +145,7 @@ public:
|
|||||||
telegram.transfer(datagram);
|
telegram.transfer(datagram);
|
||||||
} while(datagram.get_wkc() < 0x0001);
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
|
|
||||||
DebugP_log("stat_code = 0x%02x\r\n", stat_code);
|
DebugP_log((char*)"stat_code = 0x%02x\r\n", stat_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (stat.state == EC_STATE_SAFE_OP) && (stat.fault == 0);
|
return (stat.state == EC_STATE_SAFE_OP) && (stat.fault == 0);
|
||||||
@ -178,7 +178,7 @@ public:
|
|||||||
} while(datagram.get_wkc() < 0x0001);
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
DebugP_log((char*)"stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||||
|
|
||||||
if((stat.state & 0x0010) != 0) {
|
if((stat.state & 0x0010) != 0) {
|
||||||
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
||||||
@ -190,7 +190,7 @@ public:
|
|||||||
telegram.transfer(datagram);
|
telegram.transfer(datagram);
|
||||||
} while(datagram.get_wkc() < 0x0001);
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
|
|
||||||
DebugP_log("stat_code = 0x%02x\r\n", stat_code);
|
DebugP_log((char*)"stat_code = 0x%02x\r\n", stat_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (stat.state == EC_STATE_OPERATIONAL) && (stat.fault == 0);
|
return (stat.state == EC_STATE_OPERATIONAL) && (stat.fault == 0);
|
||||||
|
@ -25,6 +25,9 @@ public:
|
|||||||
static void process(); // Внутри бесконечный цикл. Запускать в отдельном потоке
|
static void process(); // Внутри бесконечный цикл. Запускать в отдельном потоке
|
||||||
|
|
||||||
static std::vector<ecat_buffer::PDOMap>& get_ecat_pdo_map();
|
static std::vector<ecat_buffer::PDOMap>& get_ecat_pdo_map();
|
||||||
|
static uint32_t get_pdo_counter() {
|
||||||
|
return get_ecat_pdo_fmmu().get_pdo_counter();
|
||||||
|
}
|
||||||
|
|
||||||
template<typename... DataTypes>
|
template<typename... DataTypes>
|
||||||
static ecat_sdo_mailbox::CompleteSize sdo_write(size_t slave_index, uint16_t index, uint8_t subindex, DataTypes&... data) {
|
static ecat_sdo_mailbox::CompleteSize sdo_write(size_t slave_index, uint16_t index, uint8_t subindex, DataTypes&... data) {
|
||||||
|
@ -163,8 +163,8 @@ public:
|
|||||||
buffer_regs_[MailboxesRegs::WRITE] = buffer_properties_write_.offset;
|
buffer_regs_[MailboxesRegs::WRITE] = buffer_properties_write_.offset;
|
||||||
buffer_regs_[MailboxesRegs::READ] = buffer_properties_read_.offset;
|
buffer_regs_[MailboxesRegs::READ] = buffer_properties_read_.offset;
|
||||||
|
|
||||||
DebugP_log("buffer_properties_write_ = 0x%04x\r\n", buffer_properties_write_);
|
DebugP_log((char*)"buffer_properties_write_ = 0x%04x\r\n", buffer_properties_write_);
|
||||||
DebugP_log("buffer_properties_read_ = 0x%04x\r\n", buffer_properties_read_);
|
DebugP_log((char*)"buffer_properties_read_ = 0x%04x\r\n", buffer_properties_read_);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename TypeT>
|
template<typename TypeT>
|
||||||
@ -202,8 +202,8 @@ public:
|
|||||||
buffer_regs_[MailboxesRegs::EMPTY] = sync_manager_write.offset + 0x05;
|
buffer_regs_[MailboxesRegs::EMPTY] = sync_manager_write.offset + 0x05;
|
||||||
buffer_regs_[MailboxesRegs::AVAILABLE] = sync_manager_read.offset + 0x05;
|
buffer_regs_[MailboxesRegs::AVAILABLE] = sync_manager_read.offset + 0x05;
|
||||||
|
|
||||||
DebugP_log("datagram_write.get_wkc() = %d\r\n", datagram_write.get_wkc());
|
DebugP_log((char*)"datagram_write.get_wkc() = %d\r\n", datagram_write.get_wkc());
|
||||||
DebugP_log("datagram_read.get_wkc() = %d\r\n", datagram_read.get_wkc());
|
DebugP_log((char*)"datagram_read.get_wkc() = %d\r\n", datagram_read.get_wkc());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename TypeT>
|
template<typename TypeT>
|
||||||
|
@ -44,7 +44,6 @@ struct DatagramPackFunctor : public PackFunctor {
|
|||||||
raw = data[data.size() - 1].pack(raw);
|
raw = data[data.size() - 1].pack(raw);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
*/
|
|
||||||
|
|
||||||
// Функтор для обхода и распаковки датаграмм в custom_tuple
|
// Функтор для обхода и распаковки датаграмм в custom_tuple
|
||||||
struct DatagramUnpackFunctor : public UnpackFunctor {
|
struct DatagramUnpackFunctor : public UnpackFunctor {
|
||||||
@ -69,6 +68,7 @@ struct DatagramUnpackFunctor : public UnpackFunctor {
|
|||||||
raw = data[data.size() - 1].unpack(raw);
|
raw = data[data.size() - 1].unpack(raw);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
template<typename... DataTypes>
|
template<typename... DataTypes>
|
||||||
class Future {
|
class Future {
|
||||||
|
@ -207,5 +207,5 @@ int32_t free_rtos::EthArp::Process(uint8_t * p_data, uint32_t len)
|
|||||||
|
|
||||||
uint32_t free_rtos::EthArp::Sender(uint8_t * p_data, size_t scatter_segment)
|
uint32_t free_rtos::EthArp::Sender(uint8_t * p_data, size_t scatter_segment)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -42,5 +42,5 @@ int32_t free_rtos::EthIcmp::Process(uint8_t * p_data, uint32_t len)
|
|||||||
|
|
||||||
uint32_t free_rtos::EthIcmp::Sender(uint8_t * p_data, size_t scatter_segment)
|
uint32_t free_rtos::EthIcmp::Sender(uint8_t * p_data, size_t scatter_segment)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ int32_t free_rtos::EthIp::Process(uint8_t * p_data, uint32_t len)
|
|||||||
|
|
||||||
uint32_t free_rtos::EthIp::Sender(uint8_t * p_data, size_t scatter_segment)
|
uint32_t free_rtos::EthIp::Sender(uint8_t * p_data, size_t scatter_segment)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool free_rtos::EthIp::send(TEthMacPorts port_id, uint32_t dest_ip, uint8_t prot_id, TEthPkt& pkt)
|
bool free_rtos::EthIp::send(TEthMacPorts port_id, uint32_t dest_ip, uint8_t prot_id, TEthPkt& pkt)
|
||||||
|
@ -73,6 +73,6 @@ int32_t free_rtos::EthUdpServer::Process(uint8_t * p_data, uint32_t len)
|
|||||||
|
|
||||||
uint32_t free_rtos::EthUdpServer::Sender(uint8_t * p_data, size_t scatter_segment)
|
uint32_t free_rtos::EthUdpServer::Sender(uint8_t * p_data, size_t scatter_segment)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user