dev(UML-1547): Исправил переход в состояние OP и PDO process
This commit is contained in:
parent
dea7d4e8d8
commit
d356b80aac
@ -21,6 +21,59 @@ void EthEcatPdoFMMU::init() {
|
||||
}
|
||||
}
|
||||
|
||||
void EthEcatPdoFMMU::process() {
|
||||
free_rtos::Semaphore& init_sem = ecat_buffer_.get_ecat().get_init_sem();
|
||||
free_rtos::Semaphore& process_sem = ecat_buffer_.get_ecat().get_process_sem();
|
||||
std::array<std::array<uint8_t, 55>, 2> process_data;
|
||||
|
||||
process_sem.pend();
|
||||
|
||||
process_data[0].fill(0x00);
|
||||
process_data[1].fill(0x00);
|
||||
|
||||
read(0, process_data[0], process_data[1]);
|
||||
|
||||
for(uint8_t& byte : process_data[0]) {
|
||||
DebugP_log("0x%01x", byte);
|
||||
}
|
||||
DebugP_log("\r\n");
|
||||
|
||||
write(0, process_data[0], process_data[1]);
|
||||
|
||||
init_sem.post();
|
||||
process_sem.pend();
|
||||
|
||||
for(uint32_t i = 0; i < 250; i++) {
|
||||
read(0, process_data[0], process_data[1]);
|
||||
|
||||
for(uint8_t& byte : process_data[0]) {
|
||||
DebugP_log("0x%01x", byte);
|
||||
}
|
||||
DebugP_log("\r\n");
|
||||
|
||||
write(0, process_data[0], process_data[1]);
|
||||
|
||||
//ClockP_usleep(125ul);
|
||||
}
|
||||
|
||||
init_sem.post();
|
||||
process_sem.pend();
|
||||
|
||||
while(1)
|
||||
{
|
||||
read(0, process_data[0], process_data[1]);
|
||||
|
||||
for(uint8_t& byte : process_data[0]) {
|
||||
DebugP_log("0x%01x", byte);
|
||||
}
|
||||
DebugP_log("\r\n");
|
||||
|
||||
write(0, process_data[0], process_data[1]);
|
||||
|
||||
//ClockP_usleep(125ul);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -29,8 +29,6 @@ public:
|
||||
do {
|
||||
telegram.transfer(datagram);
|
||||
} while(datagram.get_wkc() < 0x0001);
|
||||
|
||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
||||
}
|
||||
|
||||
template<typename... DataTypes>
|
||||
@ -56,19 +54,45 @@ public:
|
||||
void init();
|
||||
|
||||
template<typename... DataTypes>
|
||||
void write(DataTypes&... data) {
|
||||
void write(size_t slave_index, DataTypes&... data);
|
||||
|
||||
template<typename DataType, typename... DataTypes>
|
||||
void write(size_t slave_index, DataType& head, DataTypes&... tail) {
|
||||
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram();
|
||||
|
||||
pdo_fmmu_slaves_[0].write(telegram, data...);
|
||||
pdo_fmmu_slaves_[slave_index].write(telegram, head);
|
||||
|
||||
slave_index++;
|
||||
|
||||
if(slave_index < pdo_fmmu_slaves_.size()) {
|
||||
write(slave_index, tail...);
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
void write(size_t slave_index) { }
|
||||
|
||||
template<typename... DataTypes>
|
||||
void read(DataTypes&... data) {
|
||||
void read(size_t slave_index, DataTypes&... data);
|
||||
|
||||
template<typename DataType, typename... DataTypes>
|
||||
void read(size_t slave_index, DataType& head, DataTypes&... tail) {
|
||||
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram();
|
||||
|
||||
pdo_fmmu_slaves_[0].read(telegram, data...);
|
||||
pdo_fmmu_slaves_[slave_index].read(telegram, head);
|
||||
|
||||
slave_index++;
|
||||
|
||||
if(slave_index < pdo_fmmu_slaves_.size()) {
|
||||
read(slave_index, tail...);
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
void read(size_t slave_index) { }
|
||||
|
||||
void process();
|
||||
|
||||
private:
|
||||
ecat_buffer::EthEcatBuffer& ecat_buffer_;
|
||||
|
||||
|
@ -187,8 +187,8 @@ public:
|
||||
|
||||
auto slave_address = buffer_slave_.get_slave().get_slave_address<TypeT>();
|
||||
std::array<address::Offset, 4>& buffer_regs = buffer_slave_.get_buffer_regs();
|
||||
uint16_t sm_status{0x0000};
|
||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
|
||||
uint8_t sm_status{0x00};
|
||||
datagram::EcatDatagram<TCommand, uint8_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
|
||||
|
||||
do {
|
||||
telegram.transfer(datagram);
|
||||
@ -215,8 +215,8 @@ public:
|
||||
|
||||
auto slave_address = buffer_slave_.get_slave().get_slave_address<TypeT>();
|
||||
std::array<address::Offset, 4>& buffer_regs = buffer_slave_.get_buffer_regs();
|
||||
uint16_t sm_status{0x0000};
|
||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
|
||||
uint8_t sm_status{0x00};
|
||||
datagram::EcatDatagram<TCommand, uint8_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
|
||||
|
||||
do {
|
||||
telegram.transfer(datagram);
|
||||
@ -358,7 +358,7 @@ public:
|
||||
|
||||
pdo_data_size += descriptor.size;
|
||||
|
||||
DebugP_log("descriptor.size = 0x%01x\r\n", descriptor.size);
|
||||
//DebugP_log("descriptor.size = 0x%01x\r\n", descriptor.size);
|
||||
//DebugP_log("descriptor.subindex = 0x%01x\r\n", descriptor.subindex);
|
||||
//DebugP_log("descriptor.index = 0x%02x\r\n", descriptor.index);
|
||||
}
|
||||
|
@ -260,6 +260,9 @@ bool EthEcat::safeop_to_op() {
|
||||
ALSTAT stat{0x0000, 0x0000};
|
||||
uint16_t zero{0x00000000};
|
||||
|
||||
process_sem_.post();
|
||||
init_sem_.pend();
|
||||
|
||||
{
|
||||
uint16_t data{EC_STATE_OPERATIONAL};
|
||||
datagram::EcatDatagram<command::BWR, uint16_t> datagram{ {{broadcast, ECT_REG_ALCTL}}, data };
|
||||
@ -269,7 +272,8 @@ bool EthEcat::safeop_to_op() {
|
||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
||||
}
|
||||
|
||||
//ClockP_usleep(3000000ul);
|
||||
process_sem_.post();
|
||||
init_sem_.pend();
|
||||
|
||||
{
|
||||
datagram::EcatDatagram<command::BRD, ALSTAT, uint16_t> datagram{ {{broadcast, ECT_REG_ALSTAT}}, stat, zero };
|
||||
@ -280,6 +284,11 @@ bool EthEcat::safeop_to_op() {
|
||||
}
|
||||
|
||||
success = (stat.state == EC_STATE_OPERATIONAL) && (stat.fault == 0);
|
||||
//ClockP_usleep(3000000ul);
|
||||
|
||||
if(success == true) {
|
||||
process_sem_.post();
|
||||
}
|
||||
|
||||
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||
DebugP_log("success = %d\r\n", success);
|
||||
|
@ -246,6 +246,14 @@ public:
|
||||
return slaves_;
|
||||
}
|
||||
|
||||
free_rtos::Semaphore& get_init_sem() {
|
||||
return init_sem_;
|
||||
}
|
||||
|
||||
free_rtos::Semaphore& get_process_sem() {
|
||||
return process_sem_;
|
||||
}
|
||||
|
||||
bool is_ready() { return ready_; }
|
||||
|
||||
Statistic getStat() { return stat_;}
|
||||
@ -265,10 +273,13 @@ private:
|
||||
|
||||
TEthPkt pkt_[e_pktTotal];
|
||||
|
||||
Mutex mut_;
|
||||
//Mutex mut_;
|
||||
|
||||
free_rtos::Semaphore rx_sem_;
|
||||
|
||||
free_rtos::Semaphore init_sem_;
|
||||
free_rtos::Semaphore process_sem_;
|
||||
|
||||
Eth& eth_;
|
||||
EthTxFlowIface& tx_flow_;
|
||||
|
||||
|
@ -45,7 +45,6 @@ void EthEcatBuffer::init_fmmu(fmmu fmmu_write, fmmu fmmu_read) {
|
||||
|
||||
for(EcatBufferSlave& buffer_slave : buffer_slaves_) {
|
||||
buffer_slave.init_fmmu<command::FP>(telegram, fmmu_write, fmmu_read);
|
||||
//buffer_slave.get_slave().preop_to_safeop<command::FP>(telegram);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,8 +31,6 @@ struct FMMUSettings {
|
||||
uint8_t phys_start_bit;
|
||||
uint8_t direction;
|
||||
uint8_t activate;
|
||||
//uint8_t param1;
|
||||
//uint16_t param2;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct FMMUProperties {
|
||||
@ -148,36 +146,23 @@ public:
|
||||
auto slave_address = slave_.get_slave_address<TypeT>();
|
||||
|
||||
SyncManager sync_manager_write = sync_managers_[static_cast<size_t>(sm_write)];
|
||||
/*
|
||||
BufferSettings buffer_settings_write{ .control = 0x26,
|
||||
.status = 0x00,
|
||||
.activate = 0x01,
|
||||
.pdi_control = 0x00 };
|
||||
*/
|
||||
datagram::EcatDatagram<TCommand, BufferProperties, uint32_t> datagram_write{ {{slave_address, sync_manager_write.offset}},
|
||||
buffer_properties_write_,
|
||||
sync_manager_write.default_setting };
|
||||
//register_sync_manager<TypeT>(telegram, sm_write, buffer_properties_write_, buffer_regs_[MailboxesRegs::EMPTY]);
|
||||
|
||||
SyncManager sync_manager_read = sync_managers_[static_cast<size_t>(sm_read)];
|
||||
/*
|
||||
BufferSettings buffer_settings_read{ .control = 0x22,
|
||||
.status = 0x00,
|
||||
.activate = 0x01,
|
||||
.pdi_control = 0x00 };
|
||||
*/
|
||||
datagram::EcatDatagram<TCommand, BufferProperties, uint32_t> datagram_read{ {{slave_address, sync_manager_read.offset}},
|
||||
buffer_properties_read_,
|
||||
sync_manager_read.default_setting };
|
||||
//register_sync_manager<TypeT>(telegram, sm_read, buffer_properties_read_, buffer_regs_[MailboxesRegs::AVAILABLE]);
|
||||
/*
|
||||
|
||||
datagram_write + datagram_read;
|
||||
|
||||
do {
|
||||
telegram.transfer(datagram_write);
|
||||
} while((datagram_write.get_wkc() < 0x0001) || (datagram_read.get_wkc() < 0x0001));
|
||||
*/
|
||||
|
||||
/*
|
||||
do {
|
||||
telegram.transfer(datagram_write);
|
||||
} while(datagram_write.get_wkc() < 0x0001);
|
||||
@ -185,7 +170,7 @@ public:
|
||||
do {
|
||||
telegram.transfer(datagram_read);
|
||||
} while(datagram_read.get_wkc() < 0x0001);
|
||||
|
||||
*/
|
||||
buffer_regs_[MailboxesRegs::EMPTY] = sync_manager_write.offset + 0x05;
|
||||
buffer_regs_[MailboxesRegs::AVAILABLE] = sync_manager_read.offset + 0x05;
|
||||
|
||||
@ -222,9 +207,7 @@ public:
|
||||
.phys_start_address = buffer_properties_write_.offset,
|
||||
.phys_start_bit = 0,
|
||||
.direction = static_cast<uint8_t>(DataDirection::WRITE),
|
||||
.activate = 0x01,
|
||||
//.param1 = 0x00,
|
||||
//.param2 = 0x00
|
||||
.activate = 0x01
|
||||
};
|
||||
|
||||
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_write{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_write)]}}, settings_write};
|
||||
@ -243,9 +226,7 @@ public:
|
||||
.phys_start_address = buffer_properties_read_.offset,
|
||||
.phys_start_bit = 0,
|
||||
.direction = static_cast<uint8_t>(DataDirection::READ),
|
||||
.activate = 0x01,
|
||||
//.param1 = 0x00,
|
||||
//.param2 = 0x00
|
||||
.activate = 0x01
|
||||
};
|
||||
|
||||
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_read{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_read)]}}, settings_read};
|
||||
|
@ -106,7 +106,7 @@ private:
|
||||
}
|
||||
|
||||
uint8_t* pack_padding(uint8_t *raw) {
|
||||
std::memset(raw, 0x00, padding_);
|
||||
//std::memset(raw, 0x00, padding_);
|
||||
|
||||
return raw + padding_;
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ Usage:
|
||||
runAfterLoad = true;
|
||||
|
||||
// Указать путь к текущей папке
|
||||
var script_path = "/home/algin/workspace_v11/sitara_depot/utils/ddr_init/ccs_files";
|
||||
var script_path = "/home/sofdev/workspace_v11/sitara_depot/utils/ddr_init/ccs_files";
|
||||
|
||||
print("script_path = " + script_path);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user