check busy state
Some checks failed
EIVE/eive-obsw/pipeline/pr-develop There was a failure building this commit
Some checks failed
EIVE/eive-obsw/pipeline/pr-develop There was a failure building this commit
This commit is contained in:
parent
3c0b8f9e8b
commit
976235a79f
@ -41,7 +41,7 @@ void PapbVcInterface::startPacketTransfer() { *vcBaseReg = CONFIG_START; }
|
|||||||
|
|
||||||
void PapbVcInterface::endPacketTransfer() { *vcBaseReg = CONFIG_END; }
|
void PapbVcInterface::endPacketTransfer() { *vcBaseReg = CONFIG_END; }
|
||||||
|
|
||||||
ReturnValue_t PapbVcInterface::pollPapbBusySignal() {
|
ReturnValue_t PapbVcInterface::pollPapbBusySignal() const {
|
||||||
gpio::Levels papbBusyState = gpio::Levels::LOW;
|
gpio::Levels papbBusyState = gpio::Levels::LOW;
|
||||||
ReturnValue_t result = returnvalue::OK;
|
ReturnValue_t result = returnvalue::OK;
|
||||||
|
|
||||||
@ -53,7 +53,6 @@ ReturnValue_t PapbVcInterface::pollPapbBusySignal() {
|
|||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
if (papbBusyState == gpio::Levels::LOW) {
|
if (papbBusyState == gpio::Levels::LOW) {
|
||||||
sif::warning << "PapbVcInterface::pollPapbBusySignal: PAPB busy" << std::endl;
|
|
||||||
return PAPB_BUSY;
|
return PAPB_BUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +79,8 @@ void PapbVcInterface::isVcInterfaceBufferEmpty() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PapbVcInterface::isBusy() const { return pollPapbBusySignal() == PAPB_BUSY; }
|
||||||
|
|
||||||
ReturnValue_t PapbVcInterface::sendTestFrame() {
|
ReturnValue_t PapbVcInterface::sendTestFrame() {
|
||||||
/** Size of one complete transfer frame data field amounts to 1105 bytes */
|
/** Size of one complete transfer frame data field amounts to 1105 bytes */
|
||||||
uint8_t testPacket[1105];
|
uint8_t testPacket[1105];
|
||||||
|
@ -32,6 +32,13 @@ class PapbVcInterface : public VirtualChannelIF {
|
|||||||
std::string uioFile, int mapNum);
|
std::string uioFile, int mapNum);
|
||||||
virtual ~PapbVcInterface();
|
virtual ~PapbVcInterface();
|
||||||
|
|
||||||
|
bool isBusy() const override;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
* @param size
|
||||||
|
* @return returnvalue::OK on successfull write, PAPB_BUSY if PAPB is busy.
|
||||||
|
*/
|
||||||
ReturnValue_t write(const uint8_t* data, size_t size) override;
|
ReturnValue_t write(const uint8_t* data, size_t size) override;
|
||||||
|
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
@ -95,7 +102,7 @@ class PapbVcInterface : public VirtualChannelIF {
|
|||||||
*
|
*
|
||||||
* @return returnvalue::OK when ready to receive data else PAPB_BUSY.
|
* @return returnvalue::OK when ready to receive data else PAPB_BUSY.
|
||||||
*/
|
*/
|
||||||
ReturnValue_t pollPapbBusySignal();
|
ReturnValue_t pollPapbBusySignal() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function can be used for debugging to check whether there are packets in
|
* @brief This function can be used for debugging to check whether there are packets in
|
||||||
|
@ -51,3 +51,14 @@ void Ptme::addVcInterface(VcId_t vcId, VirtualChannelIF* vc) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Ptme::isBusy(uint8_t vcId) const {
|
||||||
|
const auto& vcInterfaceMapIter = vcInterfaceMap.find(vcId);
|
||||||
|
if (vcInterfaceMapIter == vcInterfaceMap.end()) {
|
||||||
|
sif::warning << "Ptme::writeToVc: No virtual channel interface found for the virtual "
|
||||||
|
"channel with id "
|
||||||
|
<< static_cast<unsigned int>(vcId) << std::endl;
|
||||||
|
return UNKNOWN_VC_ID;
|
||||||
|
}
|
||||||
|
return vcInterfaceMapIter->second->isBusy();
|
||||||
|
}
|
||||||
|
@ -35,6 +35,7 @@ class Ptme : public PtmeIF, public SystemObject {
|
|||||||
|
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
ReturnValue_t writeToVc(uint8_t vcId, const uint8_t* data, size_t size) override;
|
ReturnValue_t writeToVc(uint8_t vcId, const uint8_t* data, size_t size) override;
|
||||||
|
bool isBusy(uint8_t vcId) const override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function adds the reference to a virtual channel interface to the vcInterface
|
* @brief This function adds the reference to a virtual channel interface to the vcInterface
|
||||||
|
@ -22,6 +22,7 @@ class PtmeIF {
|
|||||||
* @param size Number of bytes to write
|
* @param size Number of bytes to write
|
||||||
*/
|
*/
|
||||||
virtual ReturnValue_t writeToVc(uint8_t vcId, const uint8_t* data, size_t size) = 0;
|
virtual ReturnValue_t writeToVc(uint8_t vcId, const uint8_t* data, size_t size) = 0;
|
||||||
|
virtual bool isBusy(uint8_t vcId) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* LINUX_OBC_PTMEIF_H_ */
|
#endif /* LINUX_OBC_PTMEIF_H_ */
|
||||||
|
@ -16,6 +16,8 @@ class DirectTmSinkIF {
|
|||||||
* @param size Number of bytes to write
|
* @param size Number of bytes to write
|
||||||
*/
|
*/
|
||||||
virtual ReturnValue_t write(const uint8_t* data, size_t size) = 0;
|
virtual ReturnValue_t write(const uint8_t* data, size_t size) = 0;
|
||||||
|
|
||||||
|
virtual bool isBusy() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* MISSION_TMTC_DIRECTTMSINKIF_H_ */
|
#endif /* MISSION_TMTC_DIRECTTMSINKIF_H_ */
|
||||||
|
@ -191,12 +191,15 @@ ReturnValue_t PersistentTmStore::startDumpFromUpTo(uint32_t fromUnixSeconds,
|
|||||||
|
|
||||||
ReturnValue_t PersistentTmStore::loadNextDumpFile() {
|
ReturnValue_t PersistentTmStore::loadNextDumpFile() {
|
||||||
using namespace std::filesystem;
|
using namespace std::filesystem;
|
||||||
|
dumpParams.currentSize = 0;
|
||||||
std::error_code e;
|
std::error_code e;
|
||||||
for (; dumpParams.dirIter != directory_iterator(); dumpParams.dirIter++) {
|
for (; dumpParams.dirIter != directory_iterator(); dumpParams.dirIter++) {
|
||||||
dumpParams.dirEntry = *dumpParams.dirIter;
|
dumpParams.dirEntry = *dumpParams.dirIter;
|
||||||
if (dumpParams.dirEntry.is_directory(e)) {
|
if (dumpParams.dirEntry.is_directory(e)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
sif::debug << "handling file " << dumpParams.dirEntry << std::endl;
|
||||||
|
|
||||||
dumpParams.fileSize = std::filesystem::file_size(dumpParams.dirEntry.path(), e);
|
dumpParams.fileSize = std::filesystem::file_size(dumpParams.dirEntry.path(), e);
|
||||||
if (e) {
|
if (e) {
|
||||||
sif::error << "PersistentTmStore: Could not retrieve file size: " << e.message() << std::endl;
|
sif::error << "PersistentTmStore: Could not retrieve file size: " << e.message() << std::endl;
|
||||||
@ -221,10 +224,9 @@ ReturnValue_t PersistentTmStore::loadNextDumpFile() {
|
|||||||
auto fileEpoch = static_cast<uint32_t>(timegm(&fileTime));
|
auto fileEpoch = static_cast<uint32_t>(timegm(&fileTime));
|
||||||
if ((fileEpoch > dumpParams.fromUnixTime) and
|
if ((fileEpoch > dumpParams.fromUnixTime) and
|
||||||
(fileEpoch + rolloverDiffSeconds <= dumpParams.untilUnixTime)) {
|
(fileEpoch + rolloverDiffSeconds <= dumpParams.untilUnixTime)) {
|
||||||
dumpParams.currentSize = 0;
|
|
||||||
dumpParams.currentFileUnixStamp = fileEpoch;
|
dumpParams.currentFileUnixStamp = fileEpoch;
|
||||||
std::ifstream ifile(file, std::ios::binary);
|
std::ifstream ifile(file, std::ios::binary);
|
||||||
if(ifile.bad()) {
|
if (ifile.bad()) {
|
||||||
sif::error << "PersistentTmStore: File is bad" << std::endl;
|
sif::error << "PersistentTmStore: File is bad" << std::endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -245,6 +247,7 @@ ReturnValue_t PersistentTmStore::dumpNextPacket(DirectTmSinkIF& tmSink, size_t&
|
|||||||
if (state == State::IDLE) {
|
if (state == State::IDLE) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
|
sif::debug << "Current file idx: " << dumpParams.currentSize << std::endl;
|
||||||
PusTmReader reader(&timeReader, fileBuf.data() + dumpParams.currentSize,
|
PusTmReader reader(&timeReader, fileBuf.data() + dumpParams.currentSize,
|
||||||
fileBuf.size() - dumpParams.currentSize);
|
fileBuf.size() - dumpParams.currentSize);
|
||||||
// CRC check to fully ensure this is a valid TM
|
// CRC check to fully ensure this is a valid TM
|
||||||
@ -262,7 +265,7 @@ ReturnValue_t PersistentTmStore::dumpNextPacket(DirectTmSinkIF& tmSink, size_t&
|
|||||||
return loadNextDumpFile();
|
return loadNextDumpFile();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sif::error << "Parsing of PUS TM failed with code " << result << std::endl;
|
sif::error << "PersistentTmStore: Parsing of PUS TM failed with code " << result << std::endl;
|
||||||
triggerEvent(POSSIBLE_FILE_CORRUPTION, result, dumpParams.currentFileUnixStamp);
|
triggerEvent(POSSIBLE_FILE_CORRUPTION, result, dumpParams.currentFileUnixStamp);
|
||||||
// Delete the file and load next. Could use better algorithm to partially
|
// Delete the file and load next. Could use better algorithm to partially
|
||||||
// restore the file dump, but for now do not trust the file.
|
// restore the file dump, but for now do not trust the file.
|
||||||
|
@ -21,12 +21,14 @@ bool TmStoreTaskBase::handleOneStore(PersistentTmStoreWithTmQueue& store, Countd
|
|||||||
if (store.getState() == PersistentTmStore::State::DUMPING) {
|
if (store.getState() == PersistentTmStore::State::DUMPING) {
|
||||||
size_t dumpedLen;
|
size_t dumpedLen;
|
||||||
bool fileHasSwapped;
|
bool fileHasSwapped;
|
||||||
// TODO: Maybe do a bit of a delay every 100-200 packets?
|
if (not channel.isBusy()) {
|
||||||
// TODO: We could continously dump until a file swap during active downlink..
|
// TODO: Maybe do a bit of a delay every 100-200 packets?
|
||||||
// TODO: handle returnvalue?
|
// TODO: We could continously dump until a file swap during active downlink..
|
||||||
result = store.dumpNextPacket(channel, dumpedLen, fileHasSwapped);
|
// TODO: handle returnvalue?
|
||||||
if (result == returnvalue::OK) {
|
result = store.dumpNextPacket(channel, dumpedLen, fileHasSwapped);
|
||||||
dumpsPerformed = true;
|
if (result == returnvalue::OK) {
|
||||||
|
dumpsPerformed = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Handle TC requests, for example deletion or retrieval requests.
|
// Handle TC requests, for example deletion or retrieval requests.
|
||||||
|
@ -24,3 +24,5 @@ ReturnValue_t VirtualChannel::write(const uint8_t* data, size_t size) {
|
|||||||
uint8_t VirtualChannel::getVcid() const { return vcId; }
|
uint8_t VirtualChannel::getVcid() const { return vcId; }
|
||||||
|
|
||||||
const char* VirtualChannel::getName() const { return vcName.c_str(); }
|
const char* VirtualChannel::getName() const { return vcName.c_str(); }
|
||||||
|
|
||||||
|
bool VirtualChannel::isBusy() const { return ptme.isBusy(vcId); }
|
||||||
|
@ -26,6 +26,7 @@ class VirtualChannel : public SystemObject, public VirtualChannelIF {
|
|||||||
|
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
ReturnValue_t sendNextTm(const uint8_t* data, size_t size);
|
ReturnValue_t sendNextTm(const uint8_t* data, size_t size);
|
||||||
|
bool isBusy() const override;
|
||||||
ReturnValue_t write(const uint8_t* data, size_t size) override;
|
ReturnValue_t write(const uint8_t* data, size_t size) override;
|
||||||
uint8_t getVcid() const;
|
uint8_t getVcid() const;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user