2023-06-01 16:13:05 +03:00
|
|
|
|
/*
|
|
|
|
|
|
* eth_ecat_api.cpp
|
|
|
|
|
|
*
|
|
|
|
|
|
* Created on: May 29, 2023
|
|
|
|
|
|
* Author: algin
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "ethernet_industry/eth_ecat_api.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
namespace free_rtos {
|
|
|
|
|
|
|
2023-06-13 12:37:00 +03:00
|
|
|
|
/*
|
|
|
|
|
|
* Порядок инициализации:
|
|
|
|
|
|
* Инициализировать и открыть драйвер 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(...)
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2023-06-06 14:46:20 +03:00
|
|
|
|
bool EthEcatApi::config_init(TEthMacPorts port_id, uint16_t address_base) {
|
2023-06-01 16:13:05 +03:00
|
|
|
|
bool status = false;
|
|
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_.Init(port_id);
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_.config_init(address_base);
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_buffer_sdo_.init(ECT_SII_RXMBXADR, ECT_SII_TXMBXADR);
|
|
|
|
|
|
ecat_buffer_sdo_.init_sync_manager(sync_manager::SYNC_M0, sync_manager::SYNC_M1);
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_buffer_pdo_.init(ECT_PDOOUTPUTADR, ECT_PDOINPUTADR);
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_.enable_PDI();
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
status = ecat_.init_to_preop();
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
|
|
|
|
|
if(status != true) {
|
|
|
|
|
|
return status;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_sdo_mailbox_.init();
|
|
|
|
|
|
ecat_sdo_mailbox_.read_pdo_map(ECT_RXPDOMAPINDEX, ECT_TXPDOMAPINDEX);
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
|
|
|
|
|
// Override buffer properties from eeprom for PDO
|
|
|
|
|
|
#ifdef COMX
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_buffer_pdo_.set_buffer_offset(ecat_sdo_mailbox_.get_pdo_map());
|
2023-06-01 16:13:05 +03:00
|
|
|
|
#endif
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_buffer_pdo_.set_buffer_length(ecat_sdo_mailbox_.get_pdo_map());
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_buffer_pdo_.init_sync_manager(sync_manager::SYNC_M2, sync_manager::SYNC_M3);
|
|
|
|
|
|
ecat_buffer_pdo_.init_fmmu(fmmu::FMMU0, fmmu::FMMU1);
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_pdo_fmmu_.init();
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
status = ecat_.preop_to_safeop();
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
|
|
|
|
|
if(status != true) {
|
|
|
|
|
|
return status;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-19 11:09:21 +03:00
|
|
|
|
status = ecat_.safeop_to_op();
|
2023-06-01 16:13:05 +03:00
|
|
|
|
|
|
|
|
|
|
if(status != true) {
|
|
|
|
|
|
return status;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return status;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EthEcatApi::process() {
|
2023-06-19 11:09:21 +03:00
|
|
|
|
ecat_pdo_fmmu_.process();
|
2023-06-01 16:13:05 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<ecat_buffer::PDOMap>& EthEcatApi::get_ecat_pdo_map() {
|
2023-06-19 11:09:21 +03:00
|
|
|
|
return ecat_sdo_mailbox_.get_pdo_map();
|
2023-06-01 16:13:05 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|