dev(UML-1666): Заменил обработчик на коллбек
This commit is contained in:
parent
d3d411ceea
commit
b8eaf8066f
@ -13,7 +13,7 @@ namespace free_rtos {
|
|||||||
|
|
||||||
namespace ecat_pdo_fmmu {
|
namespace ecat_pdo_fmmu {
|
||||||
|
|
||||||
void EthEcatPdoFMMU::init() {
|
void EthEcatPdoFMMU::init(ProcessCallback callback) {
|
||||||
std::vector<ecat_buffer::EcatBufferSlave>& buffer_slaves = ecat_buffer_.get_buffer_slaves();
|
std::vector<ecat_buffer::EcatBufferSlave>& buffer_slaves = ecat_buffer_.get_buffer_slaves();
|
||||||
|
|
||||||
pdo_fmmu_slaves_.reserve(buffer_slaves.size());
|
pdo_fmmu_slaves_.reserve(buffer_slaves.size());
|
||||||
@ -21,6 +21,8 @@ void EthEcatPdoFMMU::init() {
|
|||||||
for(ecat_buffer::EcatBufferSlave& buffer_slave : buffer_slaves) {
|
for(ecat_buffer::EcatBufferSlave& buffer_slave : buffer_slaves) {
|
||||||
pdo_fmmu_slaves_.emplace_back(EcatPdoFMMUSlave{buffer_slave});
|
pdo_fmmu_slaves_.emplace_back(EcatPdoFMMUSlave{buffer_slave});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
callback_ = callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EthEcatPdoFMMU::wait_op() {
|
void EthEcatPdoFMMU::wait_op() {
|
||||||
@ -131,6 +133,11 @@ void EthEcatPdoFMMU::process() {
|
|||||||
//read(0, process_data);
|
//read(0, process_data);
|
||||||
|
|
||||||
process_read_queue(pdo_read.data(), pdo_read.size());
|
process_read_queue(pdo_read.data(), pdo_read.size());
|
||||||
|
|
||||||
|
if(callback_ != nullptr) {
|
||||||
|
callback_();
|
||||||
|
}
|
||||||
|
|
||||||
process_write_queue(pdo_write.data(), pdo_write.size());
|
process_write_queue(pdo_write.data(), pdo_write.size());
|
||||||
|
|
||||||
//write(0, process_data);
|
//write(0, process_data);
|
||||||
@ -139,7 +146,7 @@ void EthEcatPdoFMMU::process() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EthEcatPdoFMMU::process_fake(uint32_t period_microsec = 250) {
|
void EthEcatPdoFMMU::process_fake(uint32_t period_microsec, ecat_pdo_fmmu::ProcessCallback callback) {
|
||||||
std::vector<uint8_t> pdo_read(110, 0x00);
|
std::vector<uint8_t> pdo_read(110, 0x00);
|
||||||
std::vector<uint8_t> pdo_write(110, 0x00);
|
std::vector<uint8_t> pdo_write(110, 0x00);
|
||||||
free_rtos::Timer& ecat_timer = ecat_buffer_.get_ecat().get_ecat_timer();
|
free_rtos::Timer& ecat_timer = ecat_buffer_.get_ecat().get_ecat_timer();
|
||||||
@ -161,6 +168,11 @@ void EthEcatPdoFMMU::process_fake(uint32_t period_microsec = 250) {
|
|||||||
//DebugP_log("Tick !\r\n");
|
//DebugP_log("Tick !\r\n");
|
||||||
|
|
||||||
process_read_queue(pdo_read.data(), pdo_read.size());
|
process_read_queue(pdo_read.data(), pdo_read.size());
|
||||||
|
|
||||||
|
if(callback != nullptr) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
|
||||||
process_write_queue(pdo_write.data(), pdo_write.size());
|
process_write_queue(pdo_write.data(), pdo_write.size());
|
||||||
|
|
||||||
pdo_counter_++;
|
pdo_counter_++;
|
||||||
|
|||||||
@ -18,6 +18,8 @@ namespace free_rtos {
|
|||||||
|
|
||||||
namespace ecat_pdo_fmmu {
|
namespace ecat_pdo_fmmu {
|
||||||
|
|
||||||
|
typedef void (*ProcessCallback)();
|
||||||
|
|
||||||
class EcatPdoFMMUSlave {
|
class EcatPdoFMMUSlave {
|
||||||
public:
|
public:
|
||||||
EcatPdoFMMUSlave(ecat_buffer::EcatBufferSlave& buffer_slave)
|
EcatPdoFMMUSlave(ecat_buffer::EcatBufferSlave& buffer_slave)
|
||||||
@ -52,9 +54,9 @@ class EthEcatPdoFMMU {
|
|||||||
public:
|
public:
|
||||||
EthEcatPdoFMMU(ecat_buffer::EthEcatBuffer& ecat_buffer): ecat_buffer_{ecat_buffer} { }
|
EthEcatPdoFMMU(ecat_buffer::EthEcatBuffer& ecat_buffer): ecat_buffer_{ecat_buffer} { }
|
||||||
|
|
||||||
void init();
|
void init(ProcessCallback callback = nullptr);
|
||||||
void process();
|
void process();
|
||||||
void process_fake(uint32_t period_microsec);
|
void process_fake(uint32_t period_microsec = 250, ProcessCallback callback = nullptr);
|
||||||
|
|
||||||
uint32_t get_pdo_counter() {
|
uint32_t get_pdo_counter() {
|
||||||
return pdo_counter_;
|
return pdo_counter_;
|
||||||
@ -120,6 +122,8 @@ private:
|
|||||||
queue::Queue<custom_promise::IPromise> queue_write_;
|
queue::Queue<custom_promise::IPromise> queue_write_;
|
||||||
queue::Queue<custom_promise::IPromise> queue_read_;
|
queue::Queue<custom_promise::IPromise> queue_read_;
|
||||||
|
|
||||||
|
ProcessCallback callback_{nullptr};
|
||||||
|
|
||||||
uint32_t pdo_counter_{0};
|
uint32_t pdo_counter_{0};
|
||||||
|
|
||||||
void wait_op();
|
void wait_op();
|
||||||
|
|||||||
@ -9,17 +9,7 @@
|
|||||||
|
|
||||||
namespace free_rtos {
|
namespace free_rtos {
|
||||||
|
|
||||||
/*
|
bool EthEcatApi::config_init(TEthMacPorts port_id, uint16_t address_base, uint32_t period_microsec, ecat_pdo_fmmu::ProcessCallback callback) {
|
||||||
* Порядок инициализации:
|
|
||||||
* Инициализировать и открыть драйвер eth_.Init(...), eth_.Open()
|
|
||||||
* Создать служебный поток ecat_task_.Create(...) с вызовом EthEcatApi::process()
|
|
||||||
* Вызвать EthEcatApi::config_init(...)
|
|
||||||
* Создать пользовательский поток ecat_task_pdo_.Create(...)
|
|
||||||
* Для чтения/записи данных в пользовательском потоке вызвать
|
|
||||||
* pdo_write(...), pdo_read(...) или pdo_write_async(...), pdo_read_async(...)
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool EthEcatApi::config_init(TEthMacPorts port_id, uint16_t address_base, uint32_t period_microsec = 250) {
|
|
||||||
bool status = false;
|
bool status = false;
|
||||||
|
|
||||||
ecat_.Init(port_id, period_microsec);
|
ecat_.Init(port_id, period_microsec);
|
||||||
@ -51,7 +41,7 @@ bool EthEcatApi::config_init(TEthMacPorts port_id, uint16_t address_base, uint32
|
|||||||
ecat_buffer_pdo_.init_sync_manager(sync_manager::SYNC_M2, sync_manager::SYNC_M3);
|
ecat_buffer_pdo_.init_sync_manager(sync_manager::SYNC_M2, sync_manager::SYNC_M3);
|
||||||
ecat_buffer_pdo_.init_fmmu(fmmu::FMMU0, fmmu::FMMU1);
|
ecat_buffer_pdo_.init_fmmu(fmmu::FMMU0, fmmu::FMMU1);
|
||||||
|
|
||||||
ecat_pdo_fmmu_.init();
|
ecat_pdo_fmmu_.init(callback);
|
||||||
|
|
||||||
status = ecat_.preop_to_safeop();
|
status = ecat_.preop_to_safeop();
|
||||||
|
|
||||||
@ -72,8 +62,8 @@ void EthEcatApi::process() {
|
|||||||
ecat_pdo_fmmu_.process();
|
ecat_pdo_fmmu_.process();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EthEcatApi::process_fake(uint32_t period_microsec = 250) {
|
void EthEcatApi::process_fake(uint32_t period_microsec, ecat_pdo_fmmu::ProcessCallback callback) {
|
||||||
ecat_pdo_fmmu_.process_fake(period_microsec);
|
ecat_pdo_fmmu_.process_fake(period_microsec, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ecat_buffer::PDOMap>& EthEcatApi::get_ecat_pdo_map() {
|
std::vector<ecat_buffer::PDOMap>& EthEcatApi::get_ecat_pdo_map() {
|
||||||
|
|||||||
@ -18,16 +18,6 @@
|
|||||||
|
|
||||||
namespace free_rtos {
|
namespace free_rtos {
|
||||||
|
|
||||||
/*
|
|
||||||
* Порядок инициализации:
|
|
||||||
* Инициализировать и открыть драйвер eth_.Init(...), eth_.Open()
|
|
||||||
* Создать служебный поток ecat_task_.Create(...) с вызовом EthEcatApi::process()
|
|
||||||
* Вызвать EthEcatApi::config_init(...)
|
|
||||||
* Создать пользовательский поток ecat_task_pdo_.Create(...)
|
|
||||||
* Для чтения/записи данных в пользовательском потоке вызвать
|
|
||||||
* pdo_write(...), pdo_read(...) или pdo_write_async(...), pdo_read_async(...)
|
|
||||||
*/
|
|
||||||
|
|
||||||
class EthEcatApi {
|
class EthEcatApi {
|
||||||
public:
|
public:
|
||||||
EthEcatApi(Eth *eth)
|
EthEcatApi(Eth *eth)
|
||||||
@ -38,9 +28,9 @@ public:
|
|||||||
, ecat_sdo_mailbox_{ecat_buffer_sdo_}
|
, ecat_sdo_mailbox_{ecat_buffer_sdo_}
|
||||||
, ecat_pdo_fmmu_{ecat_buffer_pdo_} { }
|
, ecat_pdo_fmmu_{ecat_buffer_pdo_} { }
|
||||||
|
|
||||||
bool config_init(TEthMacPorts port_id, uint16_t address_base, uint32_t period_microsec);
|
bool config_init(TEthMacPorts port_id, uint16_t address_base, uint32_t period_microsec = 250, ecat_pdo_fmmu::ProcessCallback callback = nullptr);
|
||||||
void process(); // Внутри бесконечный цикл. Запускать в отдельном потоке
|
void process();
|
||||||
void process_fake(uint32_t period_microsec);
|
void process_fake(uint32_t period_microsec = 250, ecat_pdo_fmmu::ProcessCallback callback = nullptr);
|
||||||
std::vector<ecat_buffer::PDOMap>& get_ecat_pdo_map();
|
std::vector<ecat_buffer::PDOMap>& get_ecat_pdo_map();
|
||||||
|
|
||||||
uint32_t get_pdo_counter() {
|
uint32_t get_pdo_counter() {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user