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() * Инициализировать и открыть драйвер eth_.Init(...), eth_.Open()
* Вызвать EthEcatApi::init(eth_);
* Создать служебный поток ecat_task_.Create(...) с вызовом EthEcatApi::process() * Создать служебный поток ecat_task_.Create(...) с вызовом EthEcatApi::process()
* Вызвать EthEcatApi::config_init(...) * Вызвать EthEcatApi::config_init(...)
* Создать пользовательский поток ecat_task_pdo_.Create(...) * Создать пользовательский поток ecat_task_pdo_.Create(...)
@ -20,53 +19,47 @@ namespace free_rtos {
* pdo_write(...), pdo_read(...) или pdo_write_async(...), pdo_read_async(...) * 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 EthEcatApi::config_init(TEthMacPorts port_id, uint16_t address_base) {
bool status = false; 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); 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_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) { if(status != true) {
return status; return status;
} }
get_ecat_sdo_mailbox().init(); ecat_sdo_mailbox_.init();
get_ecat_sdo_mailbox().read_pdo_map(ECT_RXPDOMAPINDEX, ECT_TXPDOMAPINDEX); ecat_sdo_mailbox_.read_pdo_map(ECT_RXPDOMAPINDEX, ECT_TXPDOMAPINDEX);
// Override buffer properties from eeprom for PDO // Override buffer properties from eeprom for PDO
#ifdef COMX #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 #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); 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_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) { if(status != true) {
return status; return status;
} }
status = get_ecat().safeop_to_op(); status = ecat_.safeop_to_op();
if(status != true) { if(status != true) {
return status; return status;
@ -76,41 +69,11 @@ bool EthEcatApi::config_init(TEthMacPorts port_id, uint16_t address_base) {
} }
void EthEcatApi::process() { void EthEcatApi::process() {
get_ecat_pdo_fmmu().process(); ecat_pdo_fmmu_.process();
} }
std::vector<ecat_buffer::PDOMap>& EthEcatApi::get_ecat_pdo_map() { std::vector<ecat_buffer::PDOMap>& EthEcatApi::get_ecat_pdo_map() {
return get_ecat_sdo_mailbox().get_pdo_map(); return 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;
} }
} }

View File

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