diff --git a/src/NoteDefines.h b/src/NoteDefines.h index 1bc41d3..20c5176 100644 --- a/src/NoteDefines.h +++ b/src/NoteDefines.h @@ -18,4 +18,9 @@ #define NOTE_ARDUINO_NO_DEPRECATED_ATTR #endif // __GNUC__ || __clang__ +// Switches for enabling/disabling features +#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR) || defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_NRF52) || defined(ARDUINO_ARCH_RP2040) +#define NOTE_ARDUINO_SOFTWARE_SERIAL_SUPPORT +#endif + #endif // NOTE_DEFINES_H diff --git a/src/NoteSerial.hpp b/src/NoteSerial.hpp index 34b50c7..3245f68 100644 --- a/src/NoteSerial.hpp +++ b/src/NoteSerial.hpp @@ -7,12 +7,6 @@ class NoteSerial { public: - /**************************************************************************/ - /*! - @brief Type used to abstract specific hardware implementation types. - */ - /**************************************************************************/ - typedef void * param_t; virtual ~NoteSerial(void) {} @@ -65,8 +59,7 @@ class NoteSerial the platform specific UART implementation. */ /******************************************************************************/ -NoteSerial * make_note_serial ( - NoteSerial::param_t serial_parameters -); +template NoteSerial * make_note_serial (T & serial_parameters); +NoteSerial * make_note_serial (nullptr_t); #endif // NOTE_SERIAL_HPP diff --git a/src/NoteSerial_Arduino.cpp b/src/NoteSerial_Arduino.cpp index 39ca49b..ce63401 100644 --- a/src/NoteSerial_Arduino.cpp +++ b/src/NoteSerial_Arduino.cpp @@ -1,59 +1,100 @@ #include "NoteSerial_Arduino.hpp" +#include "NoteDefines.h" + +#ifndef NOTE_MOCK +#ifdef NOTE_ARDUINO_SOFTWARE_SERIAL_SUPPORT +#include +#endif +#else +#include "mock/mock-arduino.hpp" +#endif + +// Template Meta-Programming (TMP) to extract the nested template type +template +struct ExtractNestedTemplateType { + // Default case: no extraction +}; +template +struct ExtractNestedTemplateType> { + using type = nested_type; +}; + +// Singleton instance of the NoteSerial_Arduino class +namespace instance { + inline NoteSerial* & note_serial (void) { + static NoteSerial* note_serial = nullptr; + return note_serial; + } +}; + NoteSerial * make_note_serial ( - NoteSerial::param_t serial_parameters_ -) -{ - static NoteSerial * note_serial = nullptr; - if (!serial_parameters_) { - if (note_serial) { - delete note_serial; - note_serial = nullptr; - } - } else if (!note_serial) { - MakeNoteSerial_ArduinoParameters * arduino_parameters = reinterpret_cast(serial_parameters_); - note_serial = new NoteSerial_Arduino(arduino_parameters->hw_serial, arduino_parameters->baud_rate); + nullptr_t +) { + NoteSerial* & note_serial = instance::note_serial(); + if (note_serial) { + delete note_serial; + note_serial = nullptr; + } + return note_serial; +} + +template +NoteSerial * +make_note_serial ( + T & serial_parameters_ +) { + NoteSerial* & note_serial = instance::note_serial(); + if (!note_serial) { + using serial_type = typename ExtractNestedTemplateType::type; + note_serial = new NoteSerial_Arduino(serial_parameters_.serial, serial_parameters_.baud_rate); } + return note_serial; } -NoteSerial_Arduino::NoteSerial_Arduino +template +NoteSerial_Arduino::NoteSerial_Arduino ( - HardwareSerial & hw_serial_, + T & serial_, size_t baud_rate_ ) : - _notecardSerial(hw_serial_), + _notecardSerial(serial_), _notecardSerialSpeed(baud_rate_) { _notecardSerial.begin(_notecardSerialSpeed); } -NoteSerial_Arduino::~NoteSerial_Arduino ( +template +NoteSerial_Arduino::~NoteSerial_Arduino ( void ) { _notecardSerial.end(); } +template size_t -NoteSerial_Arduino::available ( +NoteSerial_Arduino::available ( void ) { return _notecardSerial.available(); } +template char -NoteSerial_Arduino::receive ( +NoteSerial_Arduino::receive ( void ) { return _notecardSerial.read(); } +template bool -NoteSerial_Arduino::reset ( +NoteSerial_Arduino::reset ( void ) { @@ -63,8 +104,9 @@ NoteSerial_Arduino::reset ( return true; } +template size_t -NoteSerial_Arduino::transmit ( +NoteSerial_Arduino::transmit ( uint8_t *buffer, size_t size, bool flush @@ -77,3 +119,12 @@ NoteSerial_Arduino::transmit ( } return result; } + +// Explicitly instantiate the classes and methods for the supported types +template class NoteSerial_Arduino; +template NoteSerial * make_note_serial>(MakeNoteSerial_ArduinoParameters &); + +#ifdef NOTE_ARDUINO_SOFTWARE_SERIAL_SUPPORT +template class NoteSerial_Arduino; +template NoteSerial * make_note_serial>(MakeNoteSerial_ArduinoParameters &); +#endif diff --git a/src/NoteSerial_Arduino.hpp b/src/NoteSerial_Arduino.hpp index ab99f49..ca06399 100644 --- a/src/NoteSerial_Arduino.hpp +++ b/src/NoteSerial_Arduino.hpp @@ -9,22 +9,24 @@ #include "mock/mock-arduino.hpp" #endif +template struct MakeNoteSerial_ArduinoParameters { MakeNoteSerial_ArduinoParameters ( - HardwareSerial & hw_serial_, + T & serial_, size_t baud_rate_ ) : - hw_serial(hw_serial_), + serial(serial_), baud_rate(baud_rate_) { } - HardwareSerial & hw_serial; + T & serial; size_t baud_rate; }; +template class NoteSerial_Arduino final : public NoteSerial { public: - NoteSerial_Arduino(HardwareSerial & hw_serial_, size_t baud_rate_); + NoteSerial_Arduino(T & serial_, size_t baud_rate_); ~NoteSerial_Arduino(void); size_t available(void) override; char receive(void) override; @@ -32,7 +34,7 @@ class NoteSerial_Arduino final : public NoteSerial size_t transmit(uint8_t * buffer, size_t size, bool flush) override; private: - HardwareSerial & _notecardSerial; + T & _notecardSerial; const int _notecardSerialSpeed; }; diff --git a/src/Notecard.h b/src/Notecard.h index 8948462..fdb852c 100644 --- a/src/Notecard.h +++ b/src/Notecard.h @@ -35,6 +35,9 @@ #ifdef ARDUINO #include +#ifdef NOTE_ARDUINO_SOFTWARE_SERIAL_SUPPORT +#include +#endif #include #include "NoteSerial_Arduino.hpp" #endif @@ -63,9 +66,15 @@ class Notecard begin(make_note_i2c(&wirePort), i2cAddress, i2cMax); } inline void begin(HardwareSerial &serial, uint32_t speed = 9600) { - MakeNoteSerial_ArduinoParameters arduino_parameters(serial, speed); - begin(make_note_serial(&arduino_parameters)); + MakeNoteSerial_ArduinoParameters arduino_parameters(serial, speed); + begin(make_note_serial>(arduino_parameters)); + } +#ifdef NOTE_ARDUINO_SOFTWARE_SERIAL_SUPPORT + inline void begin(SoftwareSerial &serial, uint32_t speed = 9600) { + MakeNoteSerial_ArduinoParameters arduino_parameters(serial, speed); + begin(make_note_serial>(arduino_parameters)); } +#endif inline void setDebugOutputStream(Stream &dbgserial) { setDebugOutputStream(make_note_log(&dbgserial)); } diff --git a/test/NoteSerial_Arduino.test.cpp b/test/NoteSerial_Arduino.test.cpp index 164aba0..973f222 100644 --- a/test/NoteSerial_Arduino.test.cpp +++ b/test/NoteSerial_Arduino.test.cpp @@ -5,6 +5,7 @@ #include #include +#include // Compile command: g++ -Wall -Wextra -Wpedantic mock/mock-arduino.cpp ../src/NoteSerial_Arduino.cpp NoteSerial_Arduino.test.cpp -std=c++11 -I. -I../src -DNOTE_MOCK -ggdb -O0 -o noteSerial_arduino.tests && ./noteSerial_arduino.tests || echo "Tests Result: $?" @@ -14,10 +15,10 @@ int test_make_note_serial_instantiates_noteserial_object() // Arrange NoteSerial * noteserial = nullptr; - MakeNoteSerial_ArduinoParameters arduino_parameters(Serial, 9600); + MakeNoteSerial_ArduinoParameters arduino_parameters(Serial, 9600); // Action - noteserial = make_note_serial(&arduino_parameters); + noteserial = make_note_serial>(arduino_parameters); // Assert if (nullptr != noteserial) @@ -43,11 +44,11 @@ int test_make_note_serial_enforces_singleton_by_returning_same_noteserial_object int result; // Arrange - MakeNoteSerial_ArduinoParameters arduino_parameters(Serial, 9600); - NoteSerial * const noteserial_1 = make_note_serial(&arduino_parameters); + MakeNoteSerial_ArduinoParameters arduino_parameters(Serial, 9600); + NoteSerial * const noteserial_1 = make_note_serial>(arduino_parameters); // Action - NoteSerial * const noteserial_2 = make_note_serial(&arduino_parameters); + NoteSerial * const noteserial_2 = make_note_serial>(arduino_parameters); // Assert if (noteserial_1 == noteserial_2) @@ -74,8 +75,8 @@ int test_make_note_serial_deletes_singleton_when_nullptr_is_passed_as_parameter( int result; // Arrange - MakeNoteSerial_ArduinoParameters arduino_parameters(Serial, 9600); - NoteSerial * noteserial = make_note_serial(&arduino_parameters); + MakeNoteSerial_ArduinoParameters arduino_parameters(Serial, 9600); + NoteSerial * noteserial = make_note_serial>(arduino_parameters); assert(noteserial); // Action @@ -105,7 +106,7 @@ int test_noteserial_arduino_constructor_invokes_hardware_serial_parameter_begin_ hardwareSerialBegin_Parameters.reset(); // Action - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); // Assert if (hardwareSerialBegin_Parameters.invoked) @@ -133,7 +134,7 @@ int test_noteserial_arduino_constructor_does_not_modify_baud_parameter_before_pa hardwareSerialBegin_Parameters.reset(); // Action - NoteSerial_Arduino noteserial(Serial, EXPECTED_BAUD_RATE); + NoteSerial_Arduino noteserial(Serial, EXPECTED_BAUD_RATE); // Assert if (EXPECTED_BAUD_RATE == hardwareSerialBegin_Parameters.baud) @@ -157,7 +158,7 @@ int test_noteserial_arduino_deconstructor_invokes_hardware_serial_end_method() // Arrange hardwareSerialEnd_Parameters.reset(); - NoteSerial_Arduino * noteserial = new NoteSerial_Arduino(Serial, 9600); + NoteSerial_Arduino * noteserial = new NoteSerial_Arduino(Serial, 9600); // Action delete noteserial; @@ -183,7 +184,7 @@ int test_noteserial_arduino_available_invokes_hardware_serial_available() int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialAvailable_Parameters.reset(); // Action @@ -210,7 +211,7 @@ int test_noteserial_arduino_available_does_not_modify_hardware_serial_available_ int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); const size_t EXPECTED_RESULT = 79; hardwareSerialAvailable_Parameters.reset(); @@ -240,7 +241,7 @@ int test_noteserial_arduino_receive_invokes_hardware_serial_read() int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialRead_Parameters.reset(); @@ -269,7 +270,7 @@ int test_noteserial_arduino_receive_does_not_modify_hardware_serial_read_result_ // Arrange const char EXPECTED_RESULT = 'z'; - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialRead_Parameters.reset(); hardwareSerialRead_Parameters.result = EXPECTED_RESULT; @@ -298,7 +299,7 @@ int test_noteserial_arduino_reset_invokes_hardware_serial_end() int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialEnd_Parameters.reset(); // Action @@ -325,7 +326,7 @@ int test_noteserial_arduino_reset_invokes_hardware_serial_begin() int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialBegin_Parameters.reset(); // Action @@ -353,7 +354,7 @@ int test_noteserial_arduino_reset_invokes_hardware_serial_begin_with_the_baud_pa // Arrange const size_t EXPECTED_BAUD_RATE = 9600; - NoteSerial_Arduino noteserial(Serial, EXPECTED_BAUD_RATE); + NoteSerial_Arduino noteserial(Serial, EXPECTED_BAUD_RATE); hardwareSerialBegin_Parameters.reset(); @@ -381,7 +382,7 @@ int test_noteserial_arduino_reset_always_returns_true() int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); // Action const bool ACTUAL_RESULT = noteserial.reset(); @@ -407,7 +408,7 @@ int test_noteserial_arduino_transmit_invokes_hardware_serial_write() int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialWrite_Parameters.reset(); @@ -435,7 +436,7 @@ int test_noteserial_arduino_transmit_does_not_modify_buffer_parameter_value_befo int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); const char EXPECTED_RESULT[] = "Hello, Test!"; hardwareSerialWrite_Parameters.reset(); @@ -464,7 +465,7 @@ int test_noteserial_arduino_transmit_does_not_modify_size_parameter_value_before int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); const size_t EXPECTED_RESULT = 13; hardwareSerialWrite_Parameters.reset(); @@ -493,7 +494,7 @@ int test_noteserial_arduino_transmit_invokes_hardware_serial_flush_when_flush_pa int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialFlush_Parameters.reset(); // Action @@ -520,7 +521,7 @@ int test_noteserial_arduino_transmit_does_not_invoke_hardware_serial_flush_when_ int result; // Arrange - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialFlush_Parameters.reset(); // Action @@ -548,7 +549,7 @@ int test_noteserial_arduino_transmit_does_not_modify_hardware_serial_write_resul // Arrange const size_t EXPECTED_RESULT = 13; - NoteSerial_Arduino noteserial(Serial, 9600); + NoteSerial_Arduino noteserial(Serial, 9600); hardwareSerialWrite_Parameters.reset(); hardwareSerialWrite_Parameters.result = EXPECTED_RESULT; @@ -594,7 +595,8 @@ int main(void) {test_noteserial_arduino_transmit_does_not_modify_size_parameter_value_before_passing_to_hardware_serial_write, "test_noteserial_arduino_transmit_does_not_modify_size_parameter_value_before_passing_to_hardware_serial_write"}, {test_noteserial_arduino_transmit_invokes_hardware_serial_flush_when_flush_parameter_is_true, "test_noteserial_arduino_transmit_invokes_hardware_serial_flush_when_flush_parameter_is_true"}, {test_noteserial_arduino_transmit_does_not_invoke_hardware_serial_flush_when_flush_parameter_is_false, "test_noteserial_arduino_transmit_does_not_invoke_hardware_serial_flush_when_flush_parameter_is_false"}, - {test_noteserial_arduino_transmit_does_not_modify_hardware_serial_write_result_value_before_returning_to_caller, "test_noteserial_arduino_transmit_does_not_modify_hardware_serial_write_result_value_before_returning_to_caller"}}; + {test_noteserial_arduino_transmit_does_not_modify_hardware_serial_write_result_value_before_returning_to_caller, "test_noteserial_arduino_transmit_does_not_modify_hardware_serial_write_result_value_before_returning_to_caller"} + }; return TestFunction::runTests(tests, (sizeof(tests) / sizeof(TestFunction))); } diff --git a/test/Notecard.test.cpp b/test/Notecard.test.cpp index a9bb5e7..2dcad31 100644 --- a/test/Notecard.test.cpp +++ b/test/Notecard.test.cpp @@ -1732,7 +1732,7 @@ int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memor return result; } -int test_notecard_end_provides_nullptr_to_make_note_serial_to_free_associated_memory() +int test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory() { int result; @@ -1742,7 +1742,7 @@ int test_notecard_end_provides_nullptr_to_make_note_serial_to_free_associated_me Notecard notecard; NoteSerial_Mock mockSerial; // Instantiate NoteSerial (mocked) make_note_serial_Parameters.reset(); - make_note_serial_Parameters.serial_parameters = &mockSerial; + make_note_serial_Parameters.serial_parameters = &Serial; notecard.begin(&mockSerial); // Action @@ -5040,7 +5040,7 @@ int main(void) {test_notecard_end_clears_all_serial_interface_function_pointers, "test_notecard_end_clears_all_serial_interface_function_pointers"}, {test_notecard_end_clears_all_platform_interface_function_pointers, "test_notecard_end_clears_all_platform_interface_function_pointers"}, {test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory, "test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory"}, - {test_notecard_end_provides_nullptr_to_make_note_serial_to_free_associated_memory, "test_notecard_end_provides_nullptr_to_make_note_serial_to_free_associated_memory"}, + {test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory, "test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory"}, {test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer, "test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer"}, {test_notecard_setDebugOutputStream_clears_the_debug_log_function_pointer_when_nullptr_is_provided, "test_notecard_setDebugOutputStream_clears_the_debug_log_function_pointer_when_nullptr_is_provided"}, {test_notecard_clearDebugOutputStream_clears_the_debug_log_function_pointer, "test_notecard_clearDebugOutputStream_clears_the_debug_log_function_pointer"}, diff --git a/test/mock/NoteSerial_Mock.cpp b/test/mock/NoteSerial_Mock.cpp index fb19aea..97d34db 100644 --- a/test/mock/NoteSerial_Mock.cpp +++ b/test/mock/NoteSerial_Mock.cpp @@ -1,6 +1,6 @@ #include "mock/NoteSerial_Mock.hpp" -MakeNoteSerial_Parameters make_note_serial_Parameters; +MakeNoteSerial_Parameters make_note_serial_Parameters; NoteSerialAvailable_Parameters noteSerialAvailable_Parameters; NoteSerialReceive_Parameters noteSerialReceive_Parameters; NoteSerialReset_Parameters noteSerialReset_Parameters; @@ -8,14 +8,29 @@ NoteSerialTransmit_Parameters noteSerialTransmit_Parameters; NoteSerial * make_note_serial ( - NoteSerial::param_t serial_parameters_ + nullptr_t +) { + // Record invocation(s) + ++make_note_serial_Parameters.invoked; + + // Stash parameter(s) + make_note_serial_Parameters.serial_parameters = nullptr; + + // Return user-supplied result + return make_note_serial_Parameters.result; +} + +template +NoteSerial * +make_note_serial ( + T & serial_parameters_ ) { // Record invocation(s) ++make_note_serial_Parameters.invoked; // Stash parameter(s) - make_note_serial_Parameters.serial_parameters = serial_parameters_; + make_note_serial_Parameters.serial_parameters = &serial_parameters_; // Return user-supplied result return make_note_serial_Parameters.result; diff --git a/test/mock/NoteSerial_Mock.hpp b/test/mock/NoteSerial_Mock.hpp index 3ca16f7..ff27fb3 100644 --- a/test/mock/NoteSerial_Mock.hpp +++ b/test/mock/NoteSerial_Mock.hpp @@ -5,6 +5,7 @@ #include #include "NoteSerial.hpp" +#include "mock/mock-arduino.hpp" class NoteSerial_Mock final : public NoteSerial { @@ -15,6 +16,7 @@ class NoteSerial_Mock final : public NoteSerial size_t transmit(uint8_t * buffer, size_t size, bool flush) override; }; +template struct MakeNoteSerial_Parameters { MakeNoteSerial_Parameters( void @@ -31,7 +33,7 @@ struct MakeNoteSerial_Parameters { result = nullptr; } size_t invoked; - NoteSerial::param_t serial_parameters; + T * serial_parameters; NoteSerial * result; }; @@ -112,7 +114,7 @@ struct NoteSerialTransmit_Parameters { size_t result; }; -extern MakeNoteSerial_Parameters make_note_serial_Parameters; +extern MakeNoteSerial_Parameters make_note_serial_Parameters; extern NoteSerialAvailable_Parameters noteSerialAvailable_Parameters; extern NoteSerialReceive_Parameters noteSerialReceive_Parameters; extern NoteSerialReset_Parameters noteSerialReset_Parameters; diff --git a/test/mock/mock-arduino.cpp b/test/mock/mock-arduino.cpp index 1a66ead..31c4036 100644 --- a/test/mock/mock-arduino.cpp +++ b/test/mock/mock-arduino.cpp @@ -13,6 +13,13 @@ HardwareSerialFlush_Parameters hardwareSerialFlush_Parameters; HardwareSerialRead_Parameters hardwareSerialRead_Parameters; HardwareSerialWrite_Parameters hardwareSerialWrite_Parameters; +SoftwareSerialAvailable_Parameters softwareSerialAvailable_Parameters; +SoftwareSerialBegin_Parameters softwareSerialBegin_Parameters; +SoftwareSerialEnd_Parameters softwareSerialEnd_Parameters; +SoftwareSerialFlush_Parameters softwareSerialFlush_Parameters; +SoftwareSerialRead_Parameters softwareSerialRead_Parameters; +SoftwareSerialWrite_Parameters softwareSerialWrite_Parameters; + StreamPrint_Parameters streamPrint_Parameters; TwoWireBegin_Parameters twoWireBegin_Parameters; @@ -26,6 +33,7 @@ TwoWireWriteBuffer_Parameters twoWireWriteBuffer_Parameters; // Global Arduino Objects (Singletons) HardwareSerial Serial; +SoftwareSerial SoftSerial; TwoWire Wire; void @@ -167,6 +175,72 @@ HardwareSerial::write ( return hardwareSerialWrite_Parameters.result; } +unsigned int +SoftwareSerial::available ( + void +) { + // Record invocation(s) + ++softwareSerialAvailable_Parameters.invoked; + + // Return user-supplied result + return softwareSerialAvailable_Parameters.result; +} + +void +SoftwareSerial::begin ( + unsigned int baud +) { + // Record invocation(s) + ++softwareSerialBegin_Parameters.invoked; + + // Stash parameter(s) + softwareSerialBegin_Parameters.baud = baud; +} + +void +SoftwareSerial::end ( + void +) { + // Record invocation(s) + ++softwareSerialEnd_Parameters.invoked; +} + +void +SoftwareSerial::flush ( + void +) { + // Record invocation(s) + ++softwareSerialFlush_Parameters.invoked; +} + +char +SoftwareSerial::read ( + void +) { + // Record invocation(s) + ++softwareSerialRead_Parameters.invoked; + + // Return user-supplied result + return softwareSerialRead_Parameters.result; +} + +size_t +SoftwareSerial::write ( + uint8_t * buffer, + size_t size +) { + // Record invocation(s) + ++softwareSerialWrite_Parameters.invoked; + + // Stash parameter(s) + softwareSerialWrite_Parameters.buffer = buffer; + softwareSerialWrite_Parameters.buffer_cache = reinterpret_cast(buffer); + softwareSerialWrite_Parameters.size = size; + + // Return user-supplied result + return softwareSerialWrite_Parameters.result; +} + size_t Stream::print ( const char * str diff --git a/test/mock/mock-arduino.hpp b/test/mock/mock-arduino.hpp index 0eaa830..afd2680 100644 --- a/test/mock/mock-arduino.hpp +++ b/test/mock/mock-arduino.hpp @@ -275,6 +275,126 @@ struct HardwareSerialWrite_Parameters { size_t result; }; +struct SoftwareSerial : public Stream { + unsigned int available (void); + void begin(unsigned int baud); + void end(void); + void flush(void); + char read (void); + size_t write(uint8_t * buffer, size_t size); +}; + +struct SoftwareSerialAvailable_Parameters { + SoftwareSerialAvailable_Parameters( + void + ) : + invoked(0), + result(0) + { } + void + reset ( + void + ) { + invoked = 0; + result = 0; + } + size_t invoked; + size_t result; +}; + +struct SoftwareSerialBegin_Parameters { + SoftwareSerialBegin_Parameters( + void + ) : + baud(0), + invoked(0) + { } + void + reset ( + void + ) { + invoked = 0; + baud = 0; + } + unsigned int baud; + size_t invoked; +}; + +struct SoftwareSerialEnd_Parameters { + SoftwareSerialEnd_Parameters( + void + ) : + invoked(0) + { } + void + reset ( + void + ) { + invoked = 0; + } + size_t invoked; +}; + +struct SoftwareSerialFlush_Parameters { + SoftwareSerialFlush_Parameters( + void + ) : + invoked(0) + { } + void + reset ( + void + ) { + invoked = 0; + } + size_t invoked; +}; + + +struct SoftwareSerialRead_Parameters { + SoftwareSerialRead_Parameters( + void + ) : + invoked(0), + result(0) + { } + void + reset ( + void + ) { + invoked = 0; + result = 0; + } + size_t invoked; + char result; +}; + +struct SoftwareSerialWrite_Parameters { + SoftwareSerialWrite_Parameters( + void + ) : + invoked(0), + buffer(nullptr), + size(0), + result(0) + { } + void + reset ( + void + ) { + invoked = 0; + buffer = nullptr; + buffer_cache.clear(); + size = 0; + result = 0; + } + size_t invoked; + uint8_t * buffer; + std::string buffer_cache; + size_t size; + size_t result; +}; + struct TwoWire { void begin(void); void beginTransmission(uint8_t address); @@ -447,6 +567,14 @@ extern HardwareSerialFlush_Parameters hardwareSerialFlush_Parameters; extern HardwareSerialRead_Parameters hardwareSerialRead_Parameters; extern HardwareSerialWrite_Parameters hardwareSerialWrite_Parameters; +extern SoftwareSerial SoftSerial; +extern SoftwareSerialAvailable_Parameters softwareSerialAvailable_Parameters; +extern SoftwareSerialBegin_Parameters softwareSerialBegin_Parameters; +extern SoftwareSerialEnd_Parameters softwareSerialEnd_Parameters; +extern SoftwareSerialFlush_Parameters softwareSerialFlush_Parameters; +extern SoftwareSerialRead_Parameters softwareSerialRead_Parameters; +extern SoftwareSerialWrite_Parameters softwareSerialWrite_Parameters; + extern StreamPrint_Parameters streamPrint_Parameters; extern TwoWire Wire;