feat(UML-1462): Переделал API из статического класса в объектный

This commit is contained in:
algin 2023-06-19 11:09:21 +03:00
parent 080b4f25c7
commit 0ffd4fa0fb
2 changed files with 49 additions and 81 deletions

View File

@ -12,7 +12,6 @@ namespace free_rtos {
/*
* Порядок инициализации:
* Инициализировать и открыть драйвер eth_.Init(...), eth_.Open()
* Вызвать EthEcatApi::init(eth_);
* Создать служебный поток ecat_task_.Create(...) с вызовом EthEcatApi::process()
* Вызвать EthEcatApi::config_init(...)
* Создать пользовательский поток ecat_task_pdo_.Create(...)
@ -20,53 +19,47 @@ namespace free_rtos {
* pdo_write(...), pdo_read(...) или pdo_write_async(...), pdo_read_async(...)
*/
Eth *EthEcatApi::eth_{nullptr};
void EthEcatApi::init(Eth& eth) {
eth_ = ð
}
bool EthEcatApi::config_init(TEthMacPorts port_id, uint16_t address_base) {
bool status = false;
get_ecat().Init(port_id);
ecat_.Init(port_id);
get_ecat().config_init(address_base);
ecat_.config_init(address_base);
get_ecat_buffer_sdo().init(ECT_SII_RXMBXADR, ECT_SII_TXMBXADR);
get_ecat_buffer_sdo().init_sync_manager(sync_manager::SYNC_M0, sync_manager::SYNC_M1);
ecat_buffer_sdo_.init(ECT_SII_RXMBXADR, ECT_SII_TXMBXADR);
ecat_buffer_sdo_.init_sync_manager(sync_manager::SYNC_M0, sync_manager::SYNC_M1);
get_ecat_buffer_pdo().init(ECT_PDOOUTPUTADR, ECT_PDOINPUTADR);
ecat_buffer_pdo_.init(ECT_PDOOUTPUTADR, ECT_PDOINPUTADR);
get_ecat().enable_PDI();
ecat_.enable_PDI();
status = get_ecat().init_to_preop();
status = ecat_.init_to_preop();
if(status != true) {
return status;
}
get_ecat_sdo_mailbox().init();
get_ecat_sdo_mailbox().read_pdo_map(ECT_RXPDOMAPINDEX, ECT_TXPDOMAPINDEX);
ecat_sdo_mailbox_.init();
ecat_sdo_mailbox_.read_pdo_map(ECT_RXPDOMAPINDEX, ECT_TXPDOMAPINDEX);
// Override buffer properties from eeprom for PDO
#ifdef COMX
get_ecat_buffer_pdo().set_buffer_offset(get_ecat_sdo_mailbox().get_pdo_map());
ecat_buffer_pdo_.set_buffer_offset(ecat_sdo_mailbox_.get_pdo_map());
#endif
get_ecat_buffer_pdo().set_buffer_length(get_ecat_sdo_mailbox().get_pdo_map());
ecat_buffer_pdo_.set_buffer_length(ecat_sdo_mailbox_.get_pdo_map());
get_ecat_buffer_pdo().init_sync_manager(sync_manager::SYNC_M2, sync_manager::SYNC_M3);
get_ecat_buffer_pdo().init_fmmu(fmmu::FMMU0, fmmu::FMMU1);
ecat_buffer_pdo_.init_sync_manager(sync_manager::SYNC_M2, sync_manager::SYNC_M3);
ecat_buffer_pdo_.init_fmmu(fmmu::FMMU0, fmmu::FMMU1);
get_ecat_pdo_fmmu().init();
ecat_pdo_fmmu_.init();
status = get_ecat().preop_to_safeop();
status = ecat_.preop_to_safeop();
if(status != true) {
return status;
}
status = get_ecat().safeop_to_op();
status = ecat_.safeop_to_op();
if(status != true) {
return status;
@ -76,41 +69,11 @@ bool EthEcatApi::config_init(TEthMacPorts port_id, uint16_t address_base) {
}
void EthEcatApi::process() {
get_ecat_pdo_fmmu().process();
ecat_pdo_fmmu_.process();
}
std::vector<ecat_buffer::PDOMap>& EthEcatApi::get_ecat_pdo_map() {
return get_ecat_sdo_mailbox().get_pdo_map();
}
EthEcat& EthEcatApi::get_ecat() {
static EthEcat ecat{*eth_};
return ecat;
}
ecat_buffer::EthEcatBuffer& EthEcatApi::get_ecat_buffer_sdo() {
static ecat_buffer::EthEcatBuffer ecat_buffer_sdo{get_ecat()};
return ecat_buffer_sdo;
}
ecat_buffer::EthEcatBuffer& EthEcatApi::get_ecat_buffer_pdo() {
static ecat_buffer::EthEcatBuffer ecat_buffer_pdo{get_ecat()};
return ecat_buffer_pdo;
}
ecat_sdo_mailbox::EthEcatSdoMailbox& EthEcatApi::get_ecat_sdo_mailbox() {
static ecat_sdo_mailbox::EthEcatSdoMailbox ecat_sdo_mailbox{get_ecat_buffer_sdo()};
return ecat_sdo_mailbox;
}
ecat_pdo_fmmu::EthEcatPdoFMMU& EthEcatApi::get_ecat_pdo_fmmu() {
static ecat_pdo_fmmu::EthEcatPdoFMMU ecat_pdo_fmmu{get_ecat_buffer_pdo()};
return ecat_pdo_fmmu;
return ecat_sdo_mailbox_.get_pdo_map();
}
}

View File

@ -21,7 +21,6 @@ namespace free_rtos {
/*
* Порядок инициализации:
* Инициализировать и открыть драйвер eth_.Init(...), eth_.Open()
* Вызвать EthEcatApi::init(eth_);
* Создать служебный поток ecat_task_.Create(...) с вызовом EthEcatApi::process()
* Вызвать EthEcatApi::config_init(...)
* Создать пользовательский поток ecat_task_pdo_.Create(...)
@ -31,51 +30,57 @@ namespace free_rtos {
class EthEcatApi {
public:
static void init(Eth& eth);
static bool config_init(TEthMacPorts port_id, uint16_t address_base);
static void process(); // Внутри бесконечный цикл. Запускать в отдельном потоке
EthEcatApi(Eth *eth)
: eth_{eth}
, ecat_{*eth}
, ecat_buffer_sdo_{ecat_}
, ecat_buffer_pdo_{ecat_}
, ecat_sdo_mailbox_{ecat_buffer_sdo_}
, ecat_pdo_fmmu_{ecat_buffer_pdo_} { }
static std::vector<ecat_buffer::PDOMap>& get_ecat_pdo_map();
static uint32_t get_pdo_counter() {
return get_ecat_pdo_fmmu().get_pdo_counter();
bool config_init(TEthMacPorts port_id, uint16_t address_base);
void process(); // Внутри бесконечный цикл. Запускать в отдельном потоке
std::vector<ecat_buffer::PDOMap>& get_ecat_pdo_map();
uint32_t get_pdo_counter() {
return ecat_pdo_fmmu_.get_pdo_counter();
}
template<typename... DataTypes>
static ecat_sdo_mailbox::CompleteSize sdo_write(size_t slave_index, uint16_t index, uint8_t subindex, DataTypes&... data) {
return get_ecat_sdo_mailbox().sdo_write<command::FP, DataTypes...>(slave_index, index, subindex, data...);
ecat_sdo_mailbox::CompleteSize sdo_write(size_t slave_index, uint16_t index, uint8_t subindex, DataTypes&... data) {
return ecat_sdo_mailbox_.sdo_write<command::FP, DataTypes...>(slave_index, index, subindex, data...);
}
template<typename... DataTypes>
static ecat_sdo_mailbox::CompleteSize sdo_read(size_t slave_index, uint16_t index, uint8_t subindex, DataTypes&... data) {
return get_ecat_sdo_mailbox().sdo_read<command::FP, DataTypes...>(slave_index, index, subindex, data...);
ecat_sdo_mailbox::CompleteSize sdo_read(size_t slave_index, uint16_t index, uint8_t subindex, DataTypes&... data) {
return ecat_sdo_mailbox_.sdo_read<command::FP, DataTypes...>(slave_index, index, subindex, data...);
}
template<typename... DataTypes>
static bool pdo_write(uint32_t timeout_ticks, address::Offset offset, DataTypes&... data) {
return get_ecat_pdo_fmmu().pdo_write<DataTypes...>(timeout_ticks, offset, data...);
bool pdo_write(uint32_t timeout_ticks, address::Offset offset, DataTypes&... data) {
return ecat_pdo_fmmu_.pdo_write<DataTypes...>(timeout_ticks, offset, data...);
}
template<typename... DataTypes>
static bool pdo_read(uint32_t timeout_ticks, address::Offset offset, DataTypes&... data) {
return get_ecat_pdo_fmmu().pdo_read<DataTypes...>(timeout_ticks, offset, data...);
bool pdo_read(uint32_t timeout_ticks, address::Offset offset, DataTypes&... data) {
return ecat_pdo_fmmu_.pdo_read<DataTypes...>(timeout_ticks, offset, data...);
}
static void pdo_write_async(custom_promise::IPromise& promise) {
get_ecat_pdo_fmmu().pdo_write_async(promise);
void pdo_write_async(custom_promise::IPromise& promise) {
ecat_pdo_fmmu_.pdo_write_async(promise);
}
static void pdo_read_async(custom_promise::IPromise& promise) {
get_ecat_pdo_fmmu().pdo_read_async(promise);
void pdo_read_async(custom_promise::IPromise& promise) {
ecat_pdo_fmmu_.pdo_read_async(promise);
}
private:
static Eth *eth_;
static EthEcat& get_ecat();
static ecat_buffer::EthEcatBuffer& get_ecat_buffer_sdo();
static ecat_buffer::EthEcatBuffer& get_ecat_buffer_pdo();
static ecat_sdo_mailbox::EthEcatSdoMailbox& get_ecat_sdo_mailbox();
static ecat_pdo_fmmu::EthEcatPdoFMMU& get_ecat_pdo_fmmu();
Eth *eth_;
EthEcat ecat_;
ecat_buffer::EthEcatBuffer ecat_buffer_sdo_;
ecat_buffer::EthEcatBuffer ecat_buffer_pdo_;
ecat_sdo_mailbox::EthEcatSdoMailbox ecat_sdo_mailbox_;
ecat_pdo_fmmu::EthEcatPdoFMMU ecat_pdo_fmmu_;
};
}