PLOC SUPV Update to newer firmware #316
@ -65,7 +65,7 @@ ReturnValue_t PlocSupvHelper::initializeInterface(CookieIF* cookie) {
|
|||||||
// Use non-canonical mode and clear echo flag
|
// Use non-canonical mode and clear echo flag
|
||||||
tty.c_lflag &= ~(ICANON | ECHO);
|
tty.c_lflag &= ~(ICANON | ECHO);
|
||||||
|
|
||||||
// Non-blocking mode, 0.5 seconds timeout
|
// Blocking mode, 0.5 seconds timeout
|
||||||
tty.c_cc[VTIME] = 5;
|
tty.c_cc[VTIME] = 5;
|
||||||
tty.c_cc[VMIN] = 0;
|
tty.c_cc[VMIN] = 0;
|
||||||
|
|
||||||
@ -311,12 +311,7 @@ void PlocSupvHelper::executeFullCheckMemoryCommand() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sif::info << "PLOC SUPV Mem Check: Memory Check" << std::endl;
|
sif::info << "PLOC SUPV Mem Check: Memory Check" << std::endl;
|
||||||
result = handleCheckMemoryCommand();
|
handleCheckMemoryCommand();
|
||||||
if (result == returnvalue::OK) {
|
|
||||||
triggerEvent(SUPV_MEM_CHECK_OK, result);
|
|
||||||
} else {
|
|
||||||
triggerEvent(SUPV_MEM_CHECK_FAIL, result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t PlocSupvHelper::executeUpdate() {
|
ReturnValue_t PlocSupvHelper::executeUpdate() {
|
||||||
@ -434,6 +429,7 @@ ReturnValue_t PlocSupvHelper::writeUpdatePackets() {
|
|||||||
#if OBSW_DEBUG_PLOC_SUPERVISOR == 1
|
#if OBSW_DEBUG_PLOC_SUPERVISOR == 1
|
||||||
progressPrinter.print(update.bytesWritten);
|
progressPrinter.print(update.bytesWritten);
|
||||||
#endif /* OBSW_DEBUG_PLOC_SUPERVISOR == 1 */
|
#endif /* OBSW_DEBUG_PLOC_SUPERVISOR == 1 */
|
||||||
|
TaskFactory::delayTask(1);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -552,7 +548,11 @@ ReturnValue_t PlocSupvHelper::handlePacketTransmissionNoReply(supv::TcBase& pack
|
|||||||
}
|
}
|
||||||
Countdown countdown(timeoutExecutionReport);
|
Countdown countdown(timeoutExecutionReport);
|
||||||
bool ackReceived = false;
|
bool ackReceived = false;
|
||||||
|
bool packetWasHandled = false;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
while (result != NO_PACKET_FOUND) {
|
||||||
|
result = tryHdlcParsing();
|
||||||
|
}
|
||||||
if (not decodedQueue.empty()) {
|
if (not decodedQueue.empty()) {
|
||||||
size_t packetLen = 0;
|
size_t packetLen = 0;
|
||||||
decodedQueue.retrieve(&packetLen);
|
decodedQueue.retrieve(&packetLen);
|
||||||
@ -569,6 +569,7 @@ ReturnValue_t PlocSupvHelper::handlePacketTransmissionNoReply(supv::TcBase& pack
|
|||||||
retval = handleAckReception(packet, serviceId, packetLen);
|
retval = handleAckReception(packet, serviceId, packetLen);
|
||||||
if (retval == 1) {
|
if (retval == 1) {
|
||||||
ackReceived = true;
|
ackReceived = true;
|
||||||
|
packetWasHandled = true;
|
||||||
} else if (retval == -1) {
|
} else if (retval == -1) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
@ -580,7 +581,8 @@ ReturnValue_t PlocSupvHelper::handlePacketTransmissionNoReply(supv::TcBase& pack
|
|||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
if (not packetWasHandled) {
|
||||||
pushIpcData(decodedBuf.data(), packetLen);
|
pushIpcData(decodedBuf.data(), packetLen);
|
||||||
decodedRingBuf.deleteData(packetLen);
|
decodedRingBuf.deleteData(packetLen);
|
||||||
}
|
}
|
||||||
@ -601,7 +603,7 @@ int PlocSupvHelper::handleAckReception(supv::TcBase& tc, uint8_t serviceId, size
|
|||||||
ReturnValue_t result = ackReport.parse();
|
ReturnValue_t result = ackReport.parse();
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
triggerEvent(ACK_RECEPTION_FAILURE);
|
triggerEvent(ACK_RECEPTION_FAILURE);
|
||||||
return returnvalue::FAILED;
|
return -1;
|
||||||
}
|
}
|
||||||
if (ackReport.getRefApid() == tc.getApid() and
|
if (ackReport.getRefApid() == tc.getApid() and
|
||||||
ackReport.getRefServiceId() == tc.getServiceId()) {
|
ackReport.getRefServiceId() == tc.getServiceId()) {
|
||||||
@ -631,7 +633,7 @@ int PlocSupvHelper::handleExeAckReception(supv::TcBase& tc, uint8_t serviceId, s
|
|||||||
ReturnValue_t result = exeReport.parse();
|
ReturnValue_t result = exeReport.parse();
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
triggerEvent(EXE_RECEPTION_FAILURE);
|
triggerEvent(EXE_RECEPTION_FAILURE);
|
||||||
return returnvalue::FAILED;
|
return -1;
|
||||||
}
|
}
|
||||||
if (exeReport.getRefApid() == tc.getApid() and
|
if (exeReport.getRefApid() == tc.getApid() and
|
||||||
exeReport.getRefServiceId() == tc.getServiceId()) {
|
exeReport.getRefServiceId() == tc.getServiceId()) {
|
||||||
@ -729,7 +731,12 @@ ReturnValue_t PlocSupvHelper::handleCheckMemoryCommand() {
|
|||||||
Countdown countdown(timeout::CRC_EXECUTION_TIMEOUT);
|
Countdown countdown(timeout::CRC_EXECUTION_TIMEOUT);
|
||||||
bool ackReceived = false;
|
bool ackReceived = false;
|
||||||
bool checkReplyReceived = false;
|
bool checkReplyReceived = false;
|
||||||
|
bool packetWasHandled = false;
|
||||||
|
bool exeReceived = false;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
while (result != NO_PACKET_FOUND) {
|
||||||
|
result = tryHdlcParsing();
|
||||||
|
}
|
||||||
if (not decodedQueue.empty()) {
|
if (not decodedQueue.empty()) {
|
||||||
size_t packetLen = 0;
|
size_t packetLen = 0;
|
||||||
decodedQueue.retrieve(&packetLen);
|
decodedQueue.retrieve(&packetLen);
|
||||||
@ -739,19 +746,23 @@ ReturnValue_t PlocSupvHelper::handleCheckMemoryCommand() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
packetWasHandled = false;
|
||||||
if (tmReader.getApid() == Apid::TMTC_MAN) {
|
if (tmReader.getApid() == Apid::TMTC_MAN) {
|
||||||
uint8_t serviceId = tmReader.getServiceId();
|
uint8_t serviceId = tmReader.getServiceId();
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
if (not ackReceived) {
|
if (not ackReceived) {
|
||||||
retval = handleAckReception(packet, serviceId, packetLen);
|
retval = handleAckReception(packet, serviceId, packetLen);
|
||||||
if (retval == 1) {
|
if (retval == 1) {
|
||||||
|
packetWasHandled = true;
|
||||||
ackReceived = true;
|
ackReceived = true;
|
||||||
} else if (retval == -1) {
|
} else if (retval == -1) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
} else if (checkReplyReceived) {
|
} else {
|
||||||
retval = handleExeAckReception(packet, serviceId, packetLen);
|
retval = handleExeAckReception(packet, serviceId, packetLen);
|
||||||
if (retval == 1) {
|
if (retval == 1) {
|
||||||
|
packetWasHandled = true;
|
||||||
|
exeReceived = true;
|
||||||
break;
|
break;
|
||||||
} else if (retval == -1) {
|
} else if (retval == -1) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
@ -764,86 +775,40 @@ ReturnValue_t PlocSupvHelper::handleCheckMemoryCommand() {
|
|||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
packetWasHandled = true;
|
||||||
|
checkReplyReceived = true;
|
||||||
if (update.crcShouldBeChecked) {
|
if (update.crcShouldBeChecked) {
|
||||||
result = report.verifyCrc(update.crc);
|
result = report.verifyCrc(update.crc);
|
||||||
if (result != returnvalue::OK) {
|
if (result == returnvalue::OK) {
|
||||||
|
triggerEvent(SUPV_MEM_CHECK_OK, result);
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
sif::warning
|
sif::warning
|
||||||
|
|
||||||
<< "PlocSupvHelper::handleCheckMemoryCommand: CRC failure. Expected CRC 0x"
|
<< "PlocSupvHelper::handleCheckMemoryCommand: CRC failure. Expected CRC 0x"
|
||||||
<< std::setfill('0') << std::hex << std::setw(4)
|
<< std::setfill('0') << std::hex << std::setw(4)
|
||||||
<< static_cast<uint16_t>(update.crc) << " but received CRC 0x" << std::setw(4)
|
<< static_cast<uint16_t>(update.crc) << " but received CRC 0x" << std::setw(4)
|
||||||
<< report.getCrc() << std::dec << std::endl;
|
<< report.getCrc() << std::dec << std::endl;
|
||||||
return result;
|
triggerEvent(SUPV_MEM_CHECK_FAIL, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
checkReplyReceived = true;
|
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
if (not packetWasHandled) {
|
||||||
pushIpcData(decodedBuf.data(), packetLen);
|
pushIpcData(decodedBuf.data(), packetLen);
|
||||||
decodedRingBuf.deleteData(packetLen);
|
decodedRingBuf.deleteData(packetLen);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
TaskFactory::delayTask(50);
|
TaskFactory::delayTask(50);
|
||||||
}
|
}
|
||||||
|
if (ackReceived and exeReceived and checkReplyReceived) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (countdown.hasTimedOut()) {
|
if (countdown.hasTimedOut()) {
|
||||||
return result::NO_REPLY_TIMEOUT;
|
return result::NO_REPLY_TIMEOUT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
// result = handleAck();
|
|
||||||
// if (result != returnvalue::OK) {
|
|
||||||
// return result;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// bool exeAlreadyHandled = false;
|
|
||||||
// uint32_t timeout = std::max(CRC_EXECUTION_TIMEOUT, supv::timeout::UPDATE_STATUS_REPORT);
|
|
||||||
// result = handleTmReception(ccsds::HEADER_LEN, tmBuf.data(), timeout);
|
|
||||||
// ploc::SpTmReader spReader(tmBuf.data(), tmBuf.size());
|
|
||||||
// if (spReader.getApid() == supv::APID_EXE_FAILURE) {
|
|
||||||
// exeAlreadyHandled = true;
|
|
||||||
// result = handleRemainingExeReport(spReader);
|
|
||||||
// } else if (spReader.getApid() == supv::APID_UPDATE_STATUS_REPORT) {
|
|
||||||
// size_t remBytes = spReader.getPacketDataLen() + 1;
|
|
||||||
// result = handleTmReception(remBytes, tmBuf.data() + ccsds::HEADER_LEN,
|
|
||||||
// supv::timeout::UPDATE_STATUS_REPORT);
|
|
||||||
// if (result != returnvalue::OK) {
|
|
||||||
// sif::warning
|
|
||||||
// << "PlocSupvHelper::handleCheckMemoryCommand: Failed to receive update status report"
|
|
||||||
// << std::endl;
|
|
||||||
// return result;
|
|
||||||
// }
|
|
||||||
// result = updateStatusReport.checkCrc();
|
|
||||||
// if (result != returnvalue::OK) {
|
|
||||||
// sif::warning << "PlocSupvHelper::handleCheckMemoryCommand: CRC check failed" << std::endl;
|
|
||||||
// return result;
|
|
||||||
// }
|
|
||||||
// // Copy into other buffer because data will be overwritten when reading execution report
|
|
||||||
// std::memcpy(statusReportBuf.data(), tmBuf.data(), updateStatusReport.getNominalSize());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (not exeAlreadyHandled) {
|
|
||||||
// result = handleExe(CRC_EXECUTION_TIMEOUT);
|
|
||||||
// if (result != returnvalue::OK) {
|
|
||||||
// return result;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // Now process the status report
|
|
||||||
// updateStatusReport.setData(statusReportBuf.data(), statusReportBuf.size());
|
|
||||||
// result = updateStatusReport.parseDataField();
|
|
||||||
// if (result != returnvalue::OK) {
|
|
||||||
// return result;
|
|
||||||
// }
|
|
||||||
// if (update.crcShouldBeChecked) {
|
|
||||||
// result = updateStatusReport.verifycrc(update.crc);
|
|
||||||
// if (result != returnvalue::OK) {
|
|
||||||
// sif::warning << "PlocSupvHelper::handleCheckMemoryCommand: CRC failure. Expected CRC 0x"
|
|
||||||
// << std::setfill('0') << std::hex << std::setw(4)
|
|
||||||
// << static_cast<uint16_t>(update.crc) << " but received CRC 0x" <<
|
|
||||||
// std::setw(4)
|
|
||||||
// << updateStatusReport.getCrc() << std::dec << std::endl;
|
|
||||||
// return result;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user