GCC Code Coverage Report


Directory: lib/fprime-samd/fprime-samd/Drv/UsartDriver/
File: UsartDriverHardwareStub.cpp
Date: 2026-09-26 00:05:17
Exec Total Coverage
Lines: 31 31 100.0%
Functions: 6 6 100.0%
Branches: 8 15 53.3%

Line Branch Exec Source
1 // ======================================================================
2 // \title UsartDriverHardwareStub.cpp
3 // \author tumbar
4 // \brief Stub hardware implementation for USART peripheral (Linux/test builds)
5 //
6 // This file is compiled for Linux/test builds to enable unit testing.
7 // For SAMD21 target builds, UsartDriverHardware.cpp is used instead.
8 //
9 // The stub records the arguments of the last hardware call so unit tests can
10 // verify what the driver asked the peripheral to do without any real MCU.
11 // ======================================================================
12
13 #include <cstring>
14 #include "fprime-samd/Drv/UsartDriver/UsartDriverHardware.hpp"
15
16 namespace Samd21 {
17 namespace UsartHardware {
18
19 static StubState s_state = {};
20
21 40 StubState& getStubState() {
22 40 return s_state;
23 }
24
25 18 void resetStubState() {
26 // Assign a fresh value-initialized instance rather than memset: several
27 // members (e.g. SercomKind) are autocoded classes with vtables that
28 // memset would corrupt.
29
3/5
✓ Branch 2 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 9 taken 18 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
18 s_state = StubState{};
30 18 }
31
32 21 void UsartHal::configure(SercomKind sercom,
33 UsartDriver::RxPinOut rx,
34 UsartDriver::TxPinOut tx,
35 UsartDriver::ClockMode clock,
36 UsartDriver::CommunicationMode mode,
37 UsartDriver::BaudRate baud_rate,
38 UsartDriver::DataOrder data_order,
39 UsartDriver::DataBits data_bits,
40 UsartDriver::StopBits stop_bits,
41 UsartDriver::Parity parity) {
42 21 s_state.configured = true;
43 21 s_state.configure_count++;
44 21 s_state.sercom = sercom;
45 21 s_state.rx = rx;
46 21 s_state.tx = tx;
47 21 s_state.clock = clock;
48 21 s_state.mode = mode;
49 21 s_state.baud_rate = baud_rate;
50 21 s_state.data_order = data_order;
51 21 s_state.data_bits = data_bits;
52 21 s_state.stop_bits = stop_bits;
53 21 s_state.parity = parity;
54 21 }
55
56 1 void UsartHal::sendSync(SercomKind sercom, const U8* data, U32 size) {
57 1 s_state.send_sync_count++;
58 1 s_state.send_sync_sercom = sercom;
59 1 s_state.send_sync_size = size;
60
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 if (data != nullptr && size <= sizeof(s_state.send_sync_data)) {
61
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
1 std::memcpy(s_state.send_sync_data, data, size);
62 }
63 1 }
64
65 53 U32 UsartHal::getDataRegisterAddress(SercomKind sercom) {
66 53 return s_state.data_register_address;
67 }
68
69 6 bool UsartHal::checkAndClearRxOverflow(SercomKind sercom) {
70 6 s_state.rx_overflow_check_count++;
71
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 return s_state.rx_overflow;
72 }
73
74 } // namespace UsartHardware
75 } // namespace Samd21
76