| 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 |