Skip to content

Commit 07db20c

Browse files
Merge branch 'nasa:devel' into cfdp_manager
2 parents f560f12 + f67b68f commit 07db20c

71 files changed

Lines changed: 4716 additions & 1148 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/spelling/expect.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ bitshifts
4242
bitwidth
4343
bocchino
4444
boolt
45+
BSB
4546
bsd
4647
BSDI
4748
bst
@@ -58,6 +59,7 @@ bugprone
5859
buildstep
5960
BYTEDRV
6061
calcu
62+
CALCULATECRC
6163
callergraph
6264
callgraph
6365
Campuzano
@@ -606,6 +608,7 @@ sfregoso
606608
sge
607609
SGN
608610
sgt
611+
shahab
609612
SHAREDSTATEDIR
610613
SHELLCOMMAND
611614
showinitializer
@@ -649,7 +652,7 @@ strnlen
649652
subgrouping
650653
subhist
651654
subhistory
652-
subseconds
655+
subsecond
653656
subtopology
654657
suppr
655658
suseconds
@@ -716,6 +719,7 @@ uge
716719
uitofp
717720
UML
718721
umod
722+
unconfigured
719723
UNEXP
720724
unistd
721725
UNITTESTASSERT

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ build-artifacts/
44
gtest/
55
docs-cache/
66
CMakePresets.json
7+
/DpTest*/
8+
/Testing/
79

810
AutoXML/
911
test_harness/src/test_harness-C/application.out
@@ -30,6 +32,7 @@ Dict
3032

3133
**/coverage/
3234
*.gcov
35+
lcov.info
3336
!**/test/ut/output/*.gcov
3437
GTestBase.*
3538
TesterBase.*
@@ -59,6 +62,7 @@ test_harness/.autotools
5962
core
6063

6164
*.swp4
65+
*dpState.dat
6266

6367
*AppDictionary.xml
6468
*TopologyAppID.csv
Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// ======================================================================
22
// \title AsyncByteStreamBufferAdapter.cpp
3-
// \author bocchino
3+
// \author shahab
44
// \brief cpp file for AsyncByteStreamBufferAdapter component implementation class
55
// ======================================================================
66

@@ -12,41 +12,54 @@ namespace Drv {
1212
// Component construction and destruction
1313
// ----------------------------------------------------------------------
1414

15-
AsyncByteStreamBufferAdapter::AsyncByteStreamBufferAdapter(const char* const compName)
15+
AsyncByteStreamBufferAdapter ::AsyncByteStreamBufferAdapter(const char* const compName)
1616
: AsyncByteStreamBufferAdapterComponentBase(compName) {}
1717

18-
AsyncByteStreamBufferAdapter::~AsyncByteStreamBufferAdapter() {}
18+
AsyncByteStreamBufferAdapter ::~AsyncByteStreamBufferAdapter() {}
1919

2020
// ----------------------------------------------------------------------
2121
// Handler implementations for typed input ports
2222
// ----------------------------------------------------------------------
2323

24-
void AsyncByteStreamBufferAdapter::bufferIn_handler(FwIndexType portNum, Fw::Buffer& fwBuffer) {
25-
// TODO: If m_driverIsReady then send fwBuffer on toByteStreamDriver_out
26-
// TODO: Otherwise
27-
// TODO: Log the error
28-
// TODO: Send fwBuffer on bufferInReturn_out
24+
void AsyncByteStreamBufferAdapter ::bufferIn_handler(FwIndexType portNum, Fw::Buffer& fwBuffer) {
25+
if (this->m_driverIsReady) {
26+
this->toByteStreamDriver_out(portNum, fwBuffer);
27+
// ByteStreamDriver is Async; don't return buffer here but wait for toByteStreamDriverReturn
28+
} else {
29+
// If not ready, log warning and return buffer back immediately
30+
this->log_WARNING_LO_DriverNotReady();
31+
this->bufferInReturn_out(portNum, fwBuffer);
32+
}
2933
}
3034

31-
void AsyncByteStreamBufferAdapter::bufferOutReturn_handler(FwIndexType portNum, Fw::Buffer& fwBuffer) {
32-
// TODO: Send fwBuffer on fromByteStreamDriverReturn_out
35+
void AsyncByteStreamBufferAdapter ::bufferOutReturn_handler(FwIndexType portNum, Fw::Buffer& fwBuffer) {
36+
this->fromByteStreamDriverReturn_out(portNum, fwBuffer);
3337
}
3438

35-
void AsyncByteStreamBufferAdapter::byteStreamDriverReady_handler(FwIndexType portNum) {
36-
this->m_driverIsReady = true;
39+
void AsyncByteStreamBufferAdapter ::fromByteStreamDriver_handler(FwIndexType portNum,
40+
Fw::Buffer& buffer,
41+
const Drv::ByteStreamStatus& status) {
42+
if (status == Drv::ByteStreamStatus::OP_OK) {
43+
this->bufferOut_out(portNum, buffer);
44+
// buffer ownership will come back through bufferOutReturn so we do **not** return buffer here
45+
} else {
46+
// If error, log and return buffer back immediately
47+
this->log_WARNING_LO_DataReceiveError(status);
48+
this->fromByteStreamDriverReturn_out(portNum, buffer);
49+
}
3750
}
3851

39-
void AsyncByteStreamBufferAdapter::fromByteStreamDriver_handler(FwIndexType portNum,
40-
Fw::Buffer& buffer,
41-
const Drv::ByteStreamStatus& status) {
42-
// TODO: If the status is OK, then send buffer on toByteStreamDriver_out
43-
// TODO: Otherwise log the error and send buffer on fromByteStreamDriverReturn_out
52+
void AsyncByteStreamBufferAdapter ::byteStreamDriverReady_handler(FwIndexType portNum) {
53+
this->m_driverIsReady = true;
4454
}
4555

46-
void AsyncByteStreamBufferAdapter::toByteStreamDriverReturn_handler(FwIndexType portNum,
47-
Fw::Buffer& buffer,
48-
const Drv::ByteStreamStatus& status) {
49-
// TODO: Send fwBuffer on bufferInReturn_out
56+
void AsyncByteStreamBufferAdapter ::toByteStreamDriverReturn_handler(FwIndexType portNum,
57+
Fw::Buffer& buffer,
58+
const Drv::ByteStreamStatus& status) {
59+
if (status != Drv::ByteStreamStatus::OP_OK) {
60+
this->log_WARNING_LO_DataSendError(status);
61+
}
62+
this->bufferInReturn_out(portNum, buffer);
5063
}
5164

5265
} // namespace Drv

Drv/AsyncByteStreamBufferAdapter/AsyncByteStreamBufferAdapter.fpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,36 @@ module Drv {
2828
@ AsyncByteStreamBufferAdapter is a PassiveBufferDriver
2929
import PassiveBufferDriver
3030

31+
@ Event port
32+
event port Log
33+
34+
@ Text event port
35+
text event port LogText
36+
37+
@ Time get port
38+
time get port Time
39+
40+
@ Driver Ready
41+
event DriverNotReady \
42+
severity warning low \
43+
id 0 \
44+
format "Buffer Driver not ready"
45+
46+
@Data Send
47+
event DataSendError(
48+
stat: I32
49+
) \
50+
severity warning low \
51+
id 1 \
52+
format "Data send error status: {}"
53+
54+
@Data Receive
55+
event DataReceiveError(
56+
stat: I32
57+
) \
58+
severity warning low \
59+
id 2 \
60+
format "Data reception error status: {}"
3161
}
3262

3363
}

Drv/AsyncByteStreamBufferAdapter/AsyncByteStreamBufferAdapter.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// ======================================================================
22
// \title AsyncByteStreamBufferAdapter.hpp
3-
// \author bocchino
3+
// \author shahab
44
// \brief hpp file for AsyncByteStreamBufferAdapter component implementation class
55
// ======================================================================
66

@@ -43,10 +43,10 @@ class AsyncByteStreamBufferAdapter final : public AsyncByteStreamBufferAdapterCo
4343
Fw::Buffer& fwBuffer //!< The buffer
4444
) override;
4545

46-
//! Handler implementation for byteStreamDriver
46+
//! Handler implementation for byteStreamDriverReady
4747
//!
4848
//! Port for receiving ready signals from the driver
49-
//! Sample connection: byteStreamDriver.ready -> byteStreamDriverClient.byteStreamReady
49+
//! Sample connection: byteStreamDriver.ready -> byteStreamDriverClient.byteStreamDriverReady
5050
void byteStreamDriverReady_handler(FwIndexType portNum //!< The port number
5151
) override;
5252

@@ -72,7 +72,7 @@ class AsyncByteStreamBufferAdapter final : public AsyncByteStreamBufferAdapterCo
7272
// ----------------------------------------------------------------------
7373

7474
//! Whether the driver is ready
75-
bool m_driverIsReady = false;
75+
std::atomic<bool> m_driverIsReady = {false};
7676
};
7777

7878
} // namespace Drv

Drv/AsyncByteStreamBufferAdapter/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,16 @@ set(MOD_DEPS
88
)
99

1010
register_fprime_module()
11+
12+
set(UT_SOURCE_FILES
13+
"${CMAKE_CURRENT_LIST_DIR}/AsyncByteStreamBufferAdapter.fpp"
14+
"${CMAKE_CURRENT_LIST_DIR}/test/ut/AsyncByteStreamBufferAdapterTestMain.cpp"
15+
"${CMAKE_CURRENT_LIST_DIR}/test/ut/AsyncByteStreamBufferAdapterTester.cpp"
16+
)
17+
18+
set(UT_MOD_DEPS
19+
STest
20+
)
21+
22+
set(UT_AUTO_HELPERS ON)
23+
register_fprime_ut()
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Drv::AsyncByteStreamBufferAdapter
2+
3+
## 1 Introduction
4+
5+
`AsyncByteStreamBufferAdapter` is a passive F´ component that mediates between the `AsyncByteStreamDriver` interface and the `PassiveBufferDriver` interface. It enables asynchronous byte stream drivers to be used as passive buffer drivers by adapting the interfaces and managing buffer ownership transitions.
6+
7+
The component allows an asynchronous byte stream driver implementation to be transparently used by components that expect a passive buffer driver interface, providing flexibility in topology design.
8+
9+
## 2 Requirements
10+
11+
12+
| Name | Description | Validation |
13+
|------|-------------|------------|
14+
| DRV-ASYNC-BSB-ADAPTER-001 | The component shall adapt the AsyncByteStreamDriver interface to the PassiveBufferDriver interface | Unit Test |
15+
| DRV-ASYNC-BSB-ADAPTER-002 | The component shall handle buffer ownership transfers between the two interfaces | Unit Test |
16+
| DRV-ASYNC-BSB-ADAPTER-003 | The component shall monitor the AsyncByteStreamDriver readiness state | Unit Test |
17+
| DRV-ASYNC-BSB-ADAPTER-004 | The component shall emit events on error conditions | Unit Test |
18+
19+
## 3 Design
20+
21+
### 3.1 Assumptions
22+
23+
The design of `AsyncByteStreamBufferAdapter` assumes the following:
24+
25+
1. The async byte stream driver will properly signal ready status before accepting data.
26+
2. Buffer ownership follows the standard Return-To-Sender pattern: buffers are owned by the receiver until returned.
27+
3. The async byte stream driver operates correctly and returns buffers sent to it when it is done processing.
28+
29+
### 3.2 State
30+
31+
`AsyncByteStreamBufferAdapter` maintains a single state variable:
32+
33+
* **m_driverIsReady**: An atomic boolean flag indicating whether the async byte stream driver is ready to accept data. Initialized to `false` and set to `true` when a ready signal is received from the driver.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// ======================================================================
2+
// \title AsyncByteStreamBufferAdapterTestMain.cpp
3+
// \author shahab
4+
// \brief cpp file for AsyncByteStreamBufferAdapter component test main function
5+
// ======================================================================
6+
7+
#include "AsyncByteStreamBufferAdapterTester.hpp"
8+
9+
TEST(Nominal, Test_Stream_out) {
10+
Drv::AsyncByteStreamBufferAdapterTester tester;
11+
tester.test_byte_stream_out();
12+
}
13+
14+
TEST(Nominal, Test_Stream_in) {
15+
Drv::AsyncByteStreamBufferAdapterTester tester;
16+
tester.test_byte_stream_in();
17+
}
18+
TEST(Nominal, Test_Stream_Return) {
19+
Drv::AsyncByteStreamBufferAdapterTester tester;
20+
tester.test_byte_stream_return();
21+
}
22+
23+
int main(int argc, char** argv) {
24+
::testing::InitGoogleTest(&argc, argv);
25+
return RUN_ALL_TESTS();
26+
}

0 commit comments

Comments
 (0)