better reset handling
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
This commit is contained in:
parent
8cf9dd9136
commit
e023220be4
@ -156,8 +156,8 @@ ReturnValue_t PdecHandler::polledOperation() {
|
|||||||
// See https://yurovsky.github.io/2014/10/10/linux-uio-gpio-interrupt.html for more information.
|
// See https://yurovsky.github.io/2014/10/10/linux-uio-gpio-interrupt.html for more information.
|
||||||
ReturnValue_t PdecHandler::irqOperation() {
|
ReturnValue_t PdecHandler::irqOperation() {
|
||||||
ReturnValue_t result = returnvalue::OK;
|
ReturnValue_t result = returnvalue::OK;
|
||||||
int fd = -1;
|
// int fd = -1;
|
||||||
// Used to unmask IRQ
|
// Used to unmask IRQ
|
||||||
uint32_t info = 1;
|
uint32_t info = 1;
|
||||||
|
|
||||||
interruptWindowCd.resetTimer();
|
interruptWindowCd.resetTimer();
|
||||||
@ -176,7 +176,7 @@ ReturnValue_t PdecHandler::irqOperation() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
openIrqFile(&fd);
|
openIrqFile();
|
||||||
if (ptmeResetWithReinitializationPending) {
|
if (ptmeResetWithReinitializationPending) {
|
||||||
actionHelper.finish(true, commandedBy, pdec::RESET_PDEC_WITH_REINIITALIZATION);
|
actionHelper.finish(true, commandedBy, pdec::RESET_PDEC_WITH_REINIITALIZATION);
|
||||||
ptmeResetWithReinitializationPending = false;
|
ptmeResetWithReinitializationPending = false;
|
||||||
@ -195,7 +195,7 @@ ReturnValue_t PdecHandler::irqOperation() {
|
|||||||
}
|
}
|
||||||
case State::RUNNING: {
|
case State::RUNNING: {
|
||||||
doPeriodicWork();
|
doPeriodicWork();
|
||||||
checkAndHandleIrqs(fd, info);
|
checkAndHandleIrqs(info);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case State::WAIT_FOR_RECOVERY:
|
case State::WAIT_FOR_RECOVERY:
|
||||||
@ -236,9 +236,9 @@ ReturnValue_t PdecHandler::handleInitState() {
|
|||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PdecHandler::openIrqFile(int* fd) {
|
void PdecHandler::openIrqFile() {
|
||||||
*fd = open(uioNames.irq, O_RDWR);
|
irqFd = open(uioNames.irq, O_RDWR);
|
||||||
if (*fd < 0) {
|
if (irqFd < 0) {
|
||||||
sif::error << "PdecHandler::irqOperation: Opening UIO IRQ file" << uioNames.irq << " failed"
|
sif::error << "PdecHandler::irqOperation: Opening UIO IRQ file" << uioNames.irq << " failed"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
triggerEvent(OPEN_IRQ_FILE_FAILED);
|
triggerEvent(OPEN_IRQ_FILE_FAILED);
|
||||||
@ -246,16 +246,16 @@ void PdecHandler::openIrqFile(int* fd) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t PdecHandler::checkAndHandleIrqs(int fd, uint32_t& info) {
|
ReturnValue_t PdecHandler::checkAndHandleIrqs(uint32_t& info) {
|
||||||
ssize_t nb = write(fd, &info, sizeof(info));
|
ssize_t nb = write(irqFd, &info, sizeof(info));
|
||||||
if (nb != static_cast<ssize_t>(sizeof(info))) {
|
if (nb != static_cast<ssize_t>(sizeof(info))) {
|
||||||
sif::error << "PdecHandler::irqOperation: Unmasking IRQ failed" << std::endl;
|
sif::error << "PdecHandler::irqOperation: Unmasking IRQ failed" << std::endl;
|
||||||
triggerEvent(WRITE_SYSCALL_ERROR_PDEC, errno);
|
triggerEvent(WRITE_SYSCALL_ERROR_PDEC, errno);
|
||||||
close(fd);
|
close(irqFd);
|
||||||
state = State::INIT;
|
state = State::INIT;
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
struct pollfd fds = {.fd = fd, .events = POLLIN, .revents = 0};
|
struct pollfd fds = {.fd = irqFd, .events = POLLIN, .revents = 0};
|
||||||
int ret = poll(&fds, 1, IRQ_TIMEOUT_MS);
|
int ret = poll(&fds, 1, IRQ_TIMEOUT_MS);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
// No TCs for timeout period
|
// No TCs for timeout period
|
||||||
@ -263,7 +263,7 @@ ReturnValue_t PdecHandler::checkAndHandleIrqs(int fd, uint32_t& info) {
|
|||||||
resetIrqLimiters();
|
resetIrqLimiters();
|
||||||
} else if (ret >= 1) {
|
} else if (ret >= 1) {
|
||||||
// Interrupt handling.
|
// Interrupt handling.
|
||||||
nb = read(fd, &info, sizeof(info));
|
nb = read(irqFd, &info, sizeof(info));
|
||||||
interruptCounter++;
|
interruptCounter++;
|
||||||
if (nb == static_cast<ssize_t>(sizeof(info))) {
|
if (nb == static_cast<ssize_t>(sizeof(info))) {
|
||||||
uint32_t pisr = *(registerBaseAddress + PDEC_PISR_OFFSET);
|
uint32_t pisr = *(registerBaseAddress + PDEC_PISR_OFFSET);
|
||||||
@ -302,7 +302,7 @@ ReturnValue_t PdecHandler::checkAndHandleIrqs(int fd, uint32_t& info) {
|
|||||||
sif::error << "PdecHandler::irqOperation: Poll error with errno " << errno << ": "
|
sif::error << "PdecHandler::irqOperation: Poll error with errno " << errno << ": "
|
||||||
<< strerror(errno) << std::endl;
|
<< strerror(errno) << std::endl;
|
||||||
triggerEvent(POLL_SYSCALL_ERROR_PDEC, errno);
|
triggerEvent(POLL_SYSCALL_ERROR_PDEC, errno);
|
||||||
close(fd);
|
close(irqFd);
|
||||||
state = State::INIT;
|
state = State::INIT;
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
@ -347,7 +347,7 @@ ReturnValue_t PdecHandler::executeAction(ActionId_t actionId, MessageQueueId_t c
|
|||||||
return EXECUTION_FINISHED;
|
return EXECUTION_FINISHED;
|
||||||
}
|
}
|
||||||
case RESET_PDEC_WITH_REINIITALIZATION: {
|
case RESET_PDEC_WITH_REINIITALIZATION: {
|
||||||
state = State::PDEC_RESET;
|
initializeReset();
|
||||||
ptmeResetWithReinitializationPending = true;
|
ptmeResetWithReinitializationPending = true;
|
||||||
this->commandedBy = commandedBy;
|
this->commandedBy = commandedBy;
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
@ -380,7 +380,7 @@ ReturnValue_t PdecHandler::getParameter(uint8_t domainId, uint8_t uniqueIdentifi
|
|||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
// PDEC needs reset to apply this parameter change
|
// PDEC needs reset to apply this parameter change
|
||||||
state = State::PDEC_RESET;
|
initializeReset();
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
} else if ((domainId == 0) and (uniqueIdentifier == ParameterId::NEGATIVE_WINDOW)) {
|
} else if ((domainId == 0) and (uniqueIdentifier == ParameterId::NEGATIVE_WINDOW)) {
|
||||||
uint8_t newVal = 0;
|
uint8_t newVal = 0;
|
||||||
@ -402,7 +402,7 @@ ReturnValue_t PdecHandler::getParameter(uint8_t domainId, uint8_t uniqueIdentifi
|
|||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
// PDEC needs reset to apply this parameter change
|
// PDEC needs reset to apply this parameter change
|
||||||
state = State::PDEC_RESET;
|
initializeReset();
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
@ -797,6 +797,13 @@ ReturnValue_t PdecHandler::postResetOperation() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PdecHandler::initializeReset() {
|
||||||
|
if (irqFd != 0) {
|
||||||
|
close(irqFd);
|
||||||
|
}
|
||||||
|
state = State::PDEC_RESET;
|
||||||
|
}
|
||||||
|
|
||||||
std::string PdecHandler::getMonStatusString(uint32_t status) {
|
std::string PdecHandler::getMonStatusString(uint32_t status) {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case TC_CHANNEL_INACTIVE:
|
case TC_CHANNEL_INACTIVE:
|
||||||
|
@ -171,6 +171,7 @@ class PdecHandler : public SystemObject,
|
|||||||
|
|
||||||
Countdown genericCheckCd = Countdown(IRQ_TIMEOUT_MS);
|
Countdown genericCheckCd = Countdown(IRQ_TIMEOUT_MS);
|
||||||
object_id_t tcDestinationId;
|
object_id_t tcDestinationId;
|
||||||
|
int irqFd = 0;
|
||||||
|
|
||||||
AcceptsTelecommandsIF* tcDestination = nullptr;
|
AcceptsTelecommandsIF* tcDestination = nullptr;
|
||||||
|
|
||||||
@ -243,8 +244,8 @@ class PdecHandler : public SystemObject,
|
|||||||
ReturnValue_t polledOperation();
|
ReturnValue_t polledOperation();
|
||||||
ReturnValue_t irqOperation();
|
ReturnValue_t irqOperation();
|
||||||
ReturnValue_t handleInitState();
|
ReturnValue_t handleInitState();
|
||||||
void openIrqFile(int* fd);
|
void openIrqFile();
|
||||||
ReturnValue_t checkAndHandleIrqs(int fd, uint32_t& info);
|
ReturnValue_t checkAndHandleIrqs(uint32_t& info);
|
||||||
|
|
||||||
uint32_t readFar();
|
uint32_t readFar();
|
||||||
|
|
||||||
@ -366,6 +367,7 @@ class PdecHandler : public SystemObject,
|
|||||||
void pdecResetNoInit();
|
void pdecResetNoInit();
|
||||||
|
|
||||||
ReturnValue_t postResetOperation();
|
ReturnValue_t postResetOperation();
|
||||||
|
void initializeReset();
|
||||||
|
|
||||||
void initFailedHandler(ReturnValue_t reason);
|
void initFailedHandler(ReturnValue_t reason);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user