-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Prestonr feature add wkc driver saves #110
base: master
Are you sure you want to change the base?
Changes from all commits
55f9df1
c77bcb9
f06e8cf
b3d0840
c8d26e9
5339af5
03c7b36
1cdfe4f
b7e4462
7bacf19
465c767
1c3af6a
4ef43e2
dbe2702
650cf9a
4ba6532
59e7cf5
8c966f1
d11d65c
b0cae7c
2e121af
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -194,6 +194,8 @@ bool jsd_init(jsd_t* self, const char* ifname, uint8_t enable_autorecovery) { | |
WARNING("Failed OP transition attempt %d of %d", attempt, | ||
JSD_PO2OP_MAX_ATTEMPTS); | ||
|
||
jsd_inspect_context(self); | ||
|
||
if (attempt >= JSD_PO2OP_MAX_ATTEMPTS) { | ||
ERROR("Max number of attempts to transition to OPERATIONAL exceeded."); | ||
return false; | ||
|
@@ -226,6 +228,71 @@ bool jsd_init(jsd_t* self, const char* ifname, uint8_t enable_autorecovery) { | |
return true; | ||
} | ||
|
||
bool jsd_all_slaves_operational(jsd_t* self) { | ||
int slave; | ||
bool all_slaves_operational = true; | ||
uint8_t currentgroup = 0; // only 1 rate group in JSD currently | ||
/* one or more slaves may not be responding */ | ||
for (slave = 1; slave <= *self->ecx_context.slavecount; slave++) { | ||
if (self->ecx_context.slavelist[slave].group != currentgroup) continue; | ||
|
||
/* re-check bad slave individually */ | ||
ecx_statecheck(&self->ecx_context, slave, EC_STATE_OPERATIONAL, EC_TIMEOUTRET); | ||
if (self->ecx_context.slavelist[slave].state != EC_STATE_OPERATIONAL) { | ||
all_slaves_operational = false; | ||
if (self->ecx_context.slavelist[slave].state == | ||
(EC_STATE_SAFE_OP + EC_STATE_ERROR)) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wondered about this weird syntax, but I see it comes from SOEM, so all is good. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah Dennis commented on this too. If they're both one-hot pieces of data, an addition does the same as a bitwise OR |
||
ERROR("slave[%d] is in SAFE_OP + ERROR.", slave); | ||
} else if (self->ecx_context.slavelist[slave].state == EC_STATE_SAFE_OP) { | ||
ERROR("slave[%d] is in SAFE_OP.", slave); | ||
} else if (self->ecx_context.slavelist[slave].state > EC_STATE_NONE) { | ||
ERROR("slave[%d] is in state with hexadecimal: %x", slave, self->ecx_context.slavelist[slave].state); | ||
} else { | ||
ERROR("slave[%d] is lost", slave); | ||
} | ||
} | ||
else { | ||
MSG("slave[%d] is OPERATIONAL.", slave); | ||
} | ||
} | ||
|
||
return all_slaves_operational; | ||
} | ||
|
||
void jsd_inspect_context(jsd_t* self) { | ||
ec_state bus_state = jsd_get_device_state(self, 0); | ||
|
||
/* first check if the jsd bus is operational so we can get more info */ | ||
if (bus_state != EC_STATE_OPERATIONAL) { | ||
ERROR("JSD bus is not OPERATIONAL."); | ||
} | ||
|
||
if (jsd_all_slaves_operational(self)) { | ||
MSG("All slaves were operational at time of working counter fault."); | ||
} | ||
else { | ||
MSG("Some slaves were not operational."); | ||
if (self->ecx_context.ecaterror) { | ||
MSG("An ECAT error occurred; the error list is displayed below:"); | ||
uint8_t i = 0; | ||
while(self->ecx_context.ecaterror && i < JSD_ELIST_MAX_READS) { | ||
MSG("%s\n", ecx_elist2string(&self->ecx_context)); | ||
i++; | ||
} | ||
if (i == JSD_ELIST_MAX_READS) { | ||
MSG("Maximum number of reads from error list experienced." | ||
" This is likely a result of indefinite polling."); | ||
} | ||
else { | ||
MSG("Finished reporting errors in error list."); | ||
} | ||
} | ||
else { | ||
MSG("Despite some slaves not being operational, an ECAT error was not experienced."); | ||
} | ||
} | ||
} | ||
|
||
void jsd_read(jsd_t* self, int timeout_us) { | ||
assert(self); | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reduce the scope of
slave
here:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's also weird that they're using a signed integer to refer to a count, but this comes from SOEM