37 m_lastCompletedType(
Fw::FilePacket::T_NONE),
43 this->m_cooldown = cooldown;
44 this->m_cycleTime = cycleTime;
45 this->m_configured =
true;
49 static_cast<FwSizeType>(fileQueueDepth), static_cast<FwSizeType>(
sizeof(
struct FileEntry)));
68 void FileDownlink ::Run_handler(
const FwIndexType portNum, U32 context) {
69 switch (this->m_mode.get()) {
74 static_cast<FwSizeType>(
sizeof(this->m_curEntry)),
75 Os::Queue::BlockingType::NONBLOCKING, real_size, prio);
81 sendFile(this->m_curEntry.srcFilename, this->m_curEntry.destFilename, this->m_curEntry.offset,
82 this->m_curEntry.length);
85 case Mode::COOLDOWN: {
86 if (this->m_curTimer >= this->m_cooldown) {
90 this->m_curTimer += m_cycleTime;
95 this->m_curTimer += m_cycleTime;
109 struct FileEntry entry;
110 entry.srcFilename[0] = 0;
111 entry.destFilename[0] = 0;
112 entry.offset = offset;
113 entry.length = length;
114 entry.source = FileDownlink::PORT;
117 entry.context = m_cntxId++;
122 static_cast<FwSizeType>(
sizeof(entry.srcFilename)));
124 static_cast<FwSizeType>(
sizeof(entry.destFilename)));
126 Os::Queue::Status status = m_fileQueue.
send(reinterpret_cast<U8*>(&entry), static_cast<FwSizeType>(
sizeof(entry)),
127 0, Os::Queue::BlockingType::NONBLOCKING);
135 void FileDownlink ::pingIn_handler(
const FwIndexType portNum, U32 key) {
146 FW_ASSERT(this->m_mode.get() == Mode::WAIT || this->m_mode.get() == Mode::CANCEL,
154 else if (this->m_mode.get() == Mode::WAIT) {
155 this->m_mode.set(Mode::DOWNLINK);
158 this->downlinkPacket();
165 void FileDownlink ::SendFile_cmdHandler(
const FwOpcodeType opCode,
169 struct FileEntry entry;
170 entry.srcFilename[0] = 0;
171 entry.destFilename[0] = 0;
174 entry.source = FileDownlink::COMMAND;
175 entry.opCode = opCode;
176 entry.cmdSeq = cmdSeq;
177 entry.context = std::numeric_limits<U32>::max();
182 static_cast<FwSizeType>(
sizeof(entry.srcFilename)));
184 static_cast<FwSizeType>(
sizeof(entry.destFilename)));
186 Os::Queue::Status status = m_fileQueue.
send(reinterpret_cast<U8*>(&entry), static_cast<FwSizeType>(
sizeof(entry)),
187 0, Os::Queue::BlockingType::NONBLOCKING);
194 void FileDownlink ::SendPartial_cmdHandler(
FwOpcodeType opCode,
200 struct FileEntry entry;
201 entry.srcFilename[0] = 0;
202 entry.destFilename[0] = 0;
203 entry.offset = startOffset;
204 entry.length = length;
205 entry.source = FileDownlink::COMMAND;
206 entry.opCode = opCode;
207 entry.cmdSeq = cmdSeq;
208 entry.context = std::numeric_limits<U32>::max();
213 static_cast<FwSizeType>(
sizeof(entry.srcFilename)));
215 static_cast<FwSizeType>(
sizeof(entry.destFilename)));
217 Os::Queue::Status status = m_fileQueue.
send(reinterpret_cast<U8*>(&entry), static_cast<FwSizeType>(
sizeof(entry)),
218 0, Os::Queue::BlockingType::NONBLOCKING);
225 void FileDownlink ::Cancel_cmdHandler(
const FwOpcodeType opCode,
const U32 cmdSeq) {
227 if (this->m_mode.get() == Mode::DOWNLINK || this->m_mode.get() == Mode::WAIT) {
228 this->m_mode.set(Mode::CANCEL);
237 Fw::CmdResponse FileDownlink ::statusToCmdResp(SendFileStatus status) {
256 void FileDownlink ::sendResponse(SendFileStatus resp) {
257 if (this->m_curEntry.source == FileDownlink::COMMAND) {
258 this->
cmdResponse_out(this->m_curEntry.opCode, this->m_curEntry.cmdSeq, statusToCmdResp(resp));
268 void FileDownlink ::sendFile(
const char* sourceFilename,
const char* destFilename, U32 startOffset, U32 length) {
275 this->m_warnings.fileOpenError();
280 if (startOffset >= this->m_file.getSize()) {
281 this->enterCooldown();
283 this->m_file.getSize());
287 }
else if (startOffset + length > this->m_file.getSize()) {
291 this->m_file.getSourceName(), this->m_file.getDestName());
292 length = this->m_file.getSize() - startOffset;
296 this->getBuffer(this->m_buffer, FILE_PACKET);
297 this->sendStartPacket();
298 this->m_mode.set(Mode::WAIT);
299 this->m_sequenceIndex = 1;
300 this->m_curTimer = 0;
301 this->m_byteOffset = startOffset;
307 this->m_endOffset = startOffset + length;
310 this->m_file.getDestName());
311 this->m_endOffset = this->m_file.getSize();
316 FW_ASSERT(byteOffset < this->m_endOffset);
317 const U32 maxDataSize =
320 (byteOffset + maxDataSize > this->m_endOffset) ? (this->m_endOffset - byteOffset) : maxDataSize;
321 U8 buffer[maxDataSize];
323 if (dataSize + byteOffset == this->m_endOffset) {
327 const Os::File::Status status = this->m_file.read(buffer, byteOffset, dataSize);
329 this->m_warnings.fileRead(status);
334 dataPacket.
initialize(this->m_sequenceIndex, byteOffset, static_cast<U16>(dataSize), buffer);
335 ++this->m_sequenceIndex;
338 this->sendFilePacket(filePacket);
340 byteOffset += dataSize;
345 void FileDownlink ::sendCancelPacket() {
348 cancelPacket.
initialize(this->m_sequenceIndex);
352 this->getBuffer(buffer, CANCEL_PACKET);
354 static_cast<FwAssertArgType>(buffer.
getSize()),
364 status = filePacket.
toBuffer(offsetBuffer);
367 this->m_packetsSent.packetSent();
370 void FileDownlink ::sendEndPacket() {
372 this->m_file.getChecksum(checksum);
375 endPacket.
initialize(this->m_sequenceIndex, checksum);
379 this->sendFilePacket(filePacket);
382 void FileDownlink ::sendStartPacket() {
384 startPacket.
initialize(this->m_file.getSize(), this->m_file.getSourceName().toChar(),
385 this->m_file.getDestName().toChar());
388 this->sendFilePacket(filePacket);
391 void FileDownlink ::sendFilePacket(
const Fw::FilePacket& filePacket) {
395 static_cast<FwAssertArgType>(this->m_buffer.
getSize()));
398 static_cast<FwPacketDescriptorType>(Fw::ComPacketType::FW_PACKET_FILE));
404 status = filePacket.
toBuffer(offsetBuffer);
407 this->m_buffer.
setSize(bufferSize);
411 this->m_packetsSent.packetSent();
414 void FileDownlink ::enterCooldown() {
415 this->m_file.getOsFile().close();
416 this->m_mode.set(Mode::COOLDOWN);
418 this->m_curTimer = 0;
421 void FileDownlink ::downlinkPacket() {
423 static_cast<FwAssertArgType>(this->m_lastCompletedType));
424 FW_ASSERT(this->m_mode.get() == Mode::CANCEL || this->m_mode.get() == Mode::DOWNLINK,
428 this->sendCancelPacket();
437 this->enterCooldown();
446 this->sendEndPacket();
449 this->m_mode.set(Mode::WAIT);
450 this->m_curTimer = 0;
453 void FileDownlink ::finishHelper(
bool cancel) {
456 this->m_filesSent.fileSent();
461 this->enterCooldown();
465 void FileDownlink ::getBuffer(
Fw::Buffer& buffer, PacketType type) {
467 FW_ASSERT(type < COUNT_PACKET_TYPE && type >= 0, static_cast<FwAssertArgType>(type));
469 buffer.
setData(this->m_memoryStore[type]);
Serialization/Deserialization operation was successful.
Status create(FwEnumStoreType id, const Fw::ConstStringBase &name, FwSizeType depth, FwSizeType messageSize) override
create queue storage through delegate
U16 FwPacketDescriptorType
The width of packet descriptors when they are serialized by the framework.
void fromCancelPacket(const CancelPacket &cancelPacket)
FwIdType FwOpcodeType
The type of a command opcode.
SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG) override
Serialize an 8-bit unsigned integer value.
void fromDataPacket(const DataPacket &dataPacket)
PlatformSizeType FwSizeType
Status receive(U8 *destination, FwSizeType capacity, BlockingType blockType, FwSizeType &actualSize, FwQueuePriorityType &priority) override
receive a message from the queue through delegate
void setContext(U32 context)
void setSize(FwSizeType size)
static constexpr FwIndexType getNum_FileComplete_OutputPorts()
The type of a cancel packet.
Status
status returned from the queue send function
void fromEndPacket(const EndPacket &endPacket)
The type of a data packet.
FwEnumStoreType getInstance() const
virtual const CHAR * toChar() const =0
Convert to a C-style char*.
void fromStartPacket(const StartPacket &startPacket)
void pingOut_out(FwIndexType portNum, U32 key)
Invoke output port pingOut.
Enum representing a command response.
SerializeStatus toBuffer(Buffer &buffer) const
FileDownlink(const char *const compName)
void log_ACTIVITY_HI_DownlinkCanceled(const Fw::StringBase &sourceFileName, const Fw::StringBase &destFileName) const
SerializeStatus
forward declaration for string
void configure(U32 cooldown, U32 cycleTime, U32 fileQueueDepth)
Class representing a 32-bit checksum as mandated by the CCSDS File Delivery Protocol.
Auto-generated base for FileDownlink component.
void log_WARNING_LO_DownlinkPartialWarning(U32 startOffset, U32 length, U32 filesize, const Fw::StringBase &sourceFileName, const Fw::StringBase &destFileName) const
char * string_copy(char *destination, const char *source, FwSizeType num)
copy string with null-termination guaranteed
The type of a start packet.
Status send(const U8 *buffer, FwSizeType size, FwQueuePriorityType priority, BlockingType blockType) override
send a message into the queue through delegate
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
void deinit()
Allows de-initialization on teardown.
void bufferSendOut_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port bufferSendOut.
void teardown() override
teardown the queue
Command successfully executed.
void initialize(const U32 fileSize, const char *const sourcePath, const char *const destinationPath)
Initialize a StartPacket with sequence number 0.
uint8_t U8
8-bit unsigned integer
void log_ACTIVITY_HI_FileSent(const Fw::StringBase &sourceFileName, const Fw::StringBase &destFileName) const
FwSizeType getSize() const
PlatformQueuePriorityType FwQueuePriorityType
The type of queue priorities used.
Command had execution error.
void log_WARNING_HI_SendDataFail(const Fw::StringBase &sourceFileName, U32 byteOffset) const
const char * toChar() const
Convert to a C-style char*.
Operation was successful.
PlatformIndexType FwIndexType
FwSizeType SizeType
The size type for a buffer - for backwards compatibility.
Send file response struct.
Command failed validation.
RateGroupDivider component implementation.
virtual SizeType length() const
Get the length of the string.
message sent/received okay
static const U32 FILEDOWNLINK_INTERNAL_BUFFER_SIZE
void initialize(const U32 sequenceIndex, const U32 byteOffset, const U16 dataSize, const U8 *const data)
Initialize a data packet.
static const bool FILEDOWNLINK_COMMAND_FAILURES_DISABLED
bool isConnected_FileComplete_OutputPort(FwIndexType portNum)
Implementation of malloc based allocator.
void deinit()
Cleans up file queue before dispatching to underlying component.
void log_ACTIVITY_HI_SendStarted(U32 fileSize, const Fw::StringBase &sourceFileName, const Fw::StringBase &destFileName) const
void initialize(const U32 sequenceIndex, const CFDP::Checksum &checksum)
Initialize an end packet.
void log_WARNING_HI_DownlinkPartialFail(const Fw::StringBase &sourceFileName, const Fw::StringBase &destFileName, U32 startOffset, U32 filesize) const
void FileComplete_out(FwIndexType portNum, const Svc::SendFileResponse &resp)
Invoke output port FileComplete.
void initialize(const U32 sequenceIndex)
Initialize a cancel packet.
ExternalSerializeBufferWithMemberCopy getSerializer()
PlatformAssertArgType FwAssertArgType
The type of arguments to assert functions.
The type of an end packet.