| 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 | ✗ | StubState& getStubState() { | |
| 22 | ✗ | return s_state; | |
| 23 | } | ||
| 24 | |||
| 25 | ✗ | 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 | ✗ | s_state = StubState{}; | |
| 30 | ✗ | } | |
| 31 | |||
| 32 | ✗ | 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 | ✗ | s_state.configured = true; | |
| 43 | ✗ | s_state.configure_count++; | |
| 44 | ✗ | s_state.sercom = sercom; | |
| 45 | ✗ | s_state.rx = rx; | |
| 46 | ✗ | s_state.tx = tx; | |
| 47 | ✗ | s_state.clock = clock; | |
| 48 | ✗ | s_state.mode = mode; | |
| 49 | ✗ | s_state.baud_rate = baud_rate; | |
| 50 | ✗ | s_state.data_order = data_order; | |
| 51 | ✗ | s_state.data_bits = data_bits; | |
| 52 | ✗ | s_state.stop_bits = stop_bits; | |
| 53 | ✗ | s_state.parity = parity; | |
| 54 | ✗ | } | |
| 55 | |||
| 56 | ✗ | void UsartHal::sendSync(SercomKind sercom, const U8* data, U32 size) { | |
| 57 | ✗ | s_state.send_sync_count++; | |
| 58 | ✗ | s_state.send_sync_sercom = sercom; | |
| 59 | ✗ | s_state.send_sync_size = size; | |
| 60 | ✗ | if (data != nullptr && size <= sizeof(s_state.send_sync_data)) { | |
| 61 | ✗ | std::memcpy(s_state.send_sync_data, data, size); | |
| 62 | } | ||
| 63 | ✗ | } | |
| 64 | |||
| 65 | ✗ | U32 UsartHal::getDataRegisterAddress(SercomKind sercom) { | |
| 66 | ✗ | return s_state.data_register_address; | |
| 67 | } | ||
| 68 | |||
| 69 | ✗ | bool UsartHal::checkAndClearRxOverflow(SercomKind sercom) { | |
| 70 | ✗ | s_state.rx_overflow_check_count++; | |
| 71 | ✗ | return s_state.rx_overflow; | |
| 72 | } | ||
| 73 | |||
| 74 | } // namespace UsartHardware | ||
| 75 | } // namespace Samd21 | ||
| 76 |