From b69abb10d6f493fa2a6aecaf17310be37ea05fdd Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 21:26:13 -0330 Subject: [PATCH 01/24] Add untested EventScheduler class --- .../EventScheduler/include/event_scheduler.h | 39 ++++++++ .../EventScheduler/src/event_scheduler.cpp | 91 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 OnPod/Node/Common/EventScheduler/include/event_scheduler.h create mode 100644 OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h new file mode 100644 index 0000000..ff40ec7 --- /dev/null +++ b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h @@ -0,0 +1,39 @@ +#ifndef NODE_EVENT_SCHEDULER_H +#define NODE_EVENT_SCHEDULER_H + +#include +#include "event.h" + +// Ranges from 0-127. -1 indicates error in finding free ID +typedef int8_t eventId_t; +typedef uint32_t timeMs_t; + +class EventScheduler +{ + private: + static const uint8_t m_MAX_NUM_EVENTS = 50; + Event m_events[m_MAX_NUM_EVENTS]; + + eventId_t findFreeEvent(void); + + public: + void updateEvents(timeMs_t current_time); + + void startEvent(eventId_t event_id); + void stopEvent(eventId_t event_id); + + // Call `callback` every `delay_ms` milliseconds, `repeat_count` times + // Returns index of event in `m_event_list` or -1 if `m_event_list` is full + eventId_t callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), + timeMs_t current_time, uint32_t repeat_count); + // Call `callback` every `delay_ms` milliseconds, forever + // Returns index of event in `m_event_list` or -1 if `m_event_list` is full + eventId_t callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), + timeMs_t current_time); + // Call `callback` after `delay_ms` milliseconds + // Returns index of event in `m_event_list` or -1 if `m_event_list` is full + eventId_t callFunctionAfter(timeMs_t delay_ms, void (*callback)(void), + timeMs_t current_time); +}; + +#endif \ No newline at end of file diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp new file mode 100644 index 0000000..d82ac38 --- /dev/null +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -0,0 +1,91 @@ +#include "event_scheduler.h" + +void EventScheduler::updateEvents(timeMs_t current_time) +{ + for (eventId_t id = 0; id < m_MAX_NUM_EVENTS; id++) + { + Event event = m_events[id]; + if (event.getType() == EventType::UNASSIGNED + || event.getState() == EventState::STOPPED) + { + continue; + } + if ((current_time-event.getLastTimeCalledMs() >= event.getDelayMs())) + { + event.callCallback(); + if (event.getType() == EventType::FINITE) + { + event.decrementNumCallsLeft(); + if (event.getNumCallsLeft() == 0) + { + event.cleanup(); + } + } + } + } +} + +eventId_t EventScheduler::findFreeEvent(void) +{ + for (eventId_t id = 0; id < m_MAX_NUM_EVENTS; id++) + { + if (m_events[id].getType() == EventType::UNASSIGNED) + { + return id; + } + } + return -1; +} + +void EventScheduler::startEvent(eventId_t event_id) +{ + m_events[event_id].setState(EventState::STARTED); +} + +void EventScheduler::stopEvent(eventId_t event_id) +{ + m_events[event_id].setState(EventState::STOPPED); +} + +eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), uint32_t repeat_count, + timeMs_t current_time) +{ + eventId_t id = findFreeEvent(); + Event event = m_events[id]; + event.setType(EventType::FINITE); + event.setState(EventState::STARTED); + event.setDelayMs(delay_ms); + event.setLastTimeCalledMs(current_time); + event.setCallback(callback); + event.setNumCallsLeft(repeat_count); + return id; +} + +eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), + timeMs_t current_time) + +{ + eventId_t id = findFreeEvent(); + Event event = m_events[id]; + event.setType(EventType::FOREVER); + event.setState(EventState::STARTED); + event.setDelayMs(delay_ms); + event.setLastTimeCalledMs(current_time); + event.setCallback(callback); + event.setNumCallsLeft(0); + return id; +} + +eventId_t EventScheduler::callFunctionAfter(timeMs_t delay_ms, void (*callback)(void), + timeMs_t current_time) +{ + eventId_t id = findFreeEvent(); + Event event = m_events[id]; + event.setType(EventType::FINITE); + event.setState(EventState::STARTED); + event.setDelayMs(delay_ms); + event.setLastTimeCalledMs(current_time); + event.setCallback(callback); + event.setNumCallsLeft(1); + return id; +} \ No newline at end of file From fb6a92385e661c72aaebc4530398eee828043de9 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 21:26:24 -0330 Subject: [PATCH 02/24] Add untested Event class --- .../Common/EventScheduler/include/event.h | 52 +++++++++++++ .../Node/Common/EventScheduler/src/event.cpp | 74 +++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 OnPod/Node/Common/EventScheduler/include/event.h create mode 100644 OnPod/Node/Common/EventScheduler/src/event.cpp diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Node/Common/EventScheduler/include/event.h new file mode 100644 index 0000000..be085f1 --- /dev/null +++ b/OnPod/Node/Common/EventScheduler/include/event.h @@ -0,0 +1,52 @@ +#ifndef NODE_EVENT_H +#define NODE_EVENT_H + +#include + +typedef uint32_t timeMs_t; + +enum class EventType +{ + UNASSIGNED, + FINITE, // Repeat X number of times + FOREVER, // Repeat forever +}; + +enum class EventState +{ + STARTED, + STOPPED, +}; + +class Event +{ + private: + EventType m_type = EventType::UNASSIGNED; + EventState m_state = EventState::STOPPED; + void (*m_callback)(void) = nullptr; + timeMs_t m_delay_ms = 0; + timeMs_t m_last_time_called_ms = 0; + uint32_t m_num_calls_left = 0; + + public: + EventType getType(void); + EventState getState(void); + timeMs_t getDelayMs(void); + timeMs_t getLastTimeCalledMs(void); + uint32_t getNumCallsLeft(void); + + void setType(EventType type); + void setState(EventState state); + void setDelayMs(timeMs_t delay_ms); + void setLastTimeCalledMs(timeMs_t time_ms); + void setCallback(void (*callback)(void)); + void setNumCallsLeft(uint32_t num_calls); + + void decrementNumCallsLeft(void); + + void callCallback(void); + // Clear all event attributes to prepare for reassignment + void cleanup(void); +}; + +#endif \ No newline at end of file diff --git a/OnPod/Node/Common/EventScheduler/src/event.cpp b/OnPod/Node/Common/EventScheduler/src/event.cpp new file mode 100644 index 0000000..0dc8442 --- /dev/null +++ b/OnPod/Node/Common/EventScheduler/src/event.cpp @@ -0,0 +1,74 @@ +#include "event.h" + +EventType Event::getType(void) +{ + return m_type; +} + +EventState Event::getState(void) +{ + return m_state; +} + +uint32_t Event::getDelayMs(void) +{ + return m_delay_ms; +} + +uint32_t Event::getLastTimeCalledMs(void) +{ + return m_last_time_called_ms; +} + +uint32_t Event::getNumCallsLeft(void) +{ + return m_num_calls_left; +} + + +void Event::setType(EventType type) +{ + m_type = type; +} + +void Event::setState(EventState state) +{ + m_state = state; +} + +void Event::setDelayMs(timeMs_t delay_ms) +{ + m_delay_ms = delay_ms; +} + +void Event::setLastTimeCalledMs(timeMs_t time_ms) +{ + m_last_time_called_ms = time_ms; +} + +void Event::setCallback(void (*callback)(void)) +{ + m_callback = callback; +} + + +void Event::decrementNumCallsLeft(void) +{ + m_num_calls_left--; +} + + +void Event::callCallback(void) +{ + m_callback(); +} + +void Event::cleanup(void) +{ + m_type = EventType::UNASSIGNED; + m_state = EventState::STOPPED; + m_callback = nullptr; + m_delay_ms = 0; + m_last_time_called_ms = 0; + m_num_calls_left = 0; +} \ No newline at end of file From 3f515a75e1dbdfc6c576987771dc8dac2a6d884a Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 21:26:52 -0330 Subject: [PATCH 03/24] Fix small i2c interface error for compiling purposes --- OnPod/Node/Common/PeripheralInterfaces/include/I2CInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OnPod/Node/Common/PeripheralInterfaces/include/I2CInterface.h b/OnPod/Node/Common/PeripheralInterfaces/include/I2CInterface.h index 0010a93..071a755 100644 --- a/OnPod/Node/Common/PeripheralInterfaces/include/I2CInterface.h +++ b/OnPod/Node/Common/PeripheralInterfaces/include/I2CInterface.h @@ -39,7 +39,7 @@ class I2CInterface HAL_StatusTypeDef memRead(uint16_t devAddress, uint16_t memAddress, uint16_t memAddressSize, uint32_t timeout); - HAL_StatusTypeDef isDeviceReady(uint16_t devAddress, uint32_t trials = 100, uint32_t timeout); + HAL_StatusTypeDef isDeviceReady(uint16_t devAddress, uint32_t trials, uint32_t timeout); /* Config methods for digital and analog noise filters From b65b01e07e74e1c063c12f28a80e5f1dc644b607 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 22:40:31 -0330 Subject: [PATCH 04/24] Remove local variable `event` and operate on member array of events --- .../EventScheduler/src/event_scheduler.cpp | 57 +++++++++---------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index d82ac38..bead38b 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -4,21 +4,21 @@ void EventScheduler::updateEvents(timeMs_t current_time) { for (eventId_t id = 0; id < m_MAX_NUM_EVENTS; id++) { - Event event = m_events[id]; - if (event.getType() == EventType::UNASSIGNED - || event.getState() == EventState::STOPPED) + if (m_events[id].getType() == EventType::UNASSIGNED || + m_events[id].getState() == EventState::STOPPED) { continue; } - if ((current_time-event.getLastTimeCalledMs() >= event.getDelayMs())) + if ((current_time - m_events[id].getLastTimeCalledMs() >= m_events[id].getDelayMs())) { - event.callCallback(); - if (event.getType() == EventType::FINITE) + m_events[id].callCallback(); + m_events[id].setLastTimeCalledMs(current_time); + if (m_events[id].getType() == EventType::FINITE) { - event.decrementNumCallsLeft(); - if (event.getNumCallsLeft() == 0) + m_events[id].decrementNumCallsLeft(); + if (m_events[id].getNumCallsLeft() == 0) { - event.cleanup(); + m_events[id].cleanup(); } } } @@ -51,13 +51,12 @@ eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)( timeMs_t current_time) { eventId_t id = findFreeEvent(); - Event event = m_events[id]; - event.setType(EventType::FINITE); - event.setState(EventState::STARTED); - event.setDelayMs(delay_ms); - event.setLastTimeCalledMs(current_time); - event.setCallback(callback); - event.setNumCallsLeft(repeat_count); + m_events[id].setType(EventType::FINITE); + m_events[id].setState(EventState::STARTED); + m_events[id].setDelayMs(delay_ms); + m_events[id].setLastTimeCalledMs(current_time); + m_events[id].setCallback(callback); + m_events[id].setNumCallsLeft(repeat_count); return id; } @@ -66,13 +65,12 @@ eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)( { eventId_t id = findFreeEvent(); - Event event = m_events[id]; - event.setType(EventType::FOREVER); - event.setState(EventState::STARTED); - event.setDelayMs(delay_ms); - event.setLastTimeCalledMs(current_time); - event.setCallback(callback); - event.setNumCallsLeft(0); + m_events[id].setType(EventType::FOREVER); + m_events[id].setState(EventState::STARTED); + m_events[id].setDelayMs(delay_ms); + m_events[id].setLastTimeCalledMs(current_time); + m_events[id].setCallback(callback); + m_events[id].setNumCallsLeft(0); return id; } @@ -80,12 +78,11 @@ eventId_t EventScheduler::callFunctionAfter(timeMs_t delay_ms, void (*callback)( timeMs_t current_time) { eventId_t id = findFreeEvent(); - Event event = m_events[id]; - event.setType(EventType::FINITE); - event.setState(EventState::STARTED); - event.setDelayMs(delay_ms); - event.setLastTimeCalledMs(current_time); - event.setCallback(callback); - event.setNumCallsLeft(1); + m_events[id].setType(EventType::FINITE); + m_events[id].setState(EventState::STARTED); + m_events[id].setDelayMs(delay_ms); + m_events[id].setLastTimeCalledMs(current_time); + m_events[id].setCallback(callback); + m_events[id].setNumCallsLeft(1); return id; } \ No newline at end of file From 9ac95420239708683e8def283a66033b6fa949bb Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 22:41:25 -0330 Subject: [PATCH 05/24] Add setter for m_num_calls_left --- OnPod/Node/Common/EventScheduler/src/event.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OnPod/Node/Common/EventScheduler/src/event.cpp b/OnPod/Node/Common/EventScheduler/src/event.cpp index 0dc8442..13ac635 100644 --- a/OnPod/Node/Common/EventScheduler/src/event.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event.cpp @@ -51,6 +51,11 @@ void Event::setCallback(void (*callback)(void)) m_callback = callback; } +void Event::setNumCallsLeft(uint32_t num_calls) +{ + m_num_calls_left = num_calls; +} + void Event::decrementNumCallsLeft(void) { From 8b5233bcf4a9dfa706e2e04bb59ab8e348059293 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 23:05:26 -0330 Subject: [PATCH 06/24] Change EventScheduler::callFunctionAfter behaviour to be callFunctionEvery repeated one time --- OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index bead38b..507980f 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -77,12 +77,5 @@ eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)( eventId_t EventScheduler::callFunctionAfter(timeMs_t delay_ms, void (*callback)(void), timeMs_t current_time) { - eventId_t id = findFreeEvent(); - m_events[id].setType(EventType::FINITE); - m_events[id].setState(EventState::STARTED); - m_events[id].setDelayMs(delay_ms); - m_events[id].setLastTimeCalledMs(current_time); - m_events[id].setCallback(callback); - m_events[id].setNumCallsLeft(1); - return id; + return callFunctionEvery(delay_ms, callback, 1, current_time); } \ No newline at end of file From 64489373ab2c6579476a9a3dfdbb88d282c48f88 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 23:19:34 -0330 Subject: [PATCH 07/24] Remove example test --- OnPod/Node/Test/Test1/main.cpp | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 OnPod/Node/Test/Test1/main.cpp diff --git a/OnPod/Node/Test/Test1/main.cpp b/OnPod/Node/Test/Test1/main.cpp deleted file mode 100644 index f52c1e3..0000000 --- a/OnPod/Node/Test/Test1/main.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include "mock_class.h" -#include "driver1.h" - -void testOne(void) -{ - TEST_ASSERT_EQUAL_UINT8(7, 7); -} - -int main(void) -{ - UNITY_BEGIN(); - RUN_TEST(testOne); - UNITY_END(); - return 0; -} - From 973919c414639536021cf817461ab74f72d146f8 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 23:26:47 -0330 Subject: [PATCH 08/24] Add more descriptive comments to EventScheduler class --- .../EventScheduler/include/event_scheduler.h | 24 +++++++++++-------- .../EventScheduler/src/event_scheduler.cpp | 5 ++++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h index ff40ec7..693cdc4 100644 --- a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h +++ b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h @@ -4,34 +4,38 @@ #include #include "event.h" -// Ranges from 0-127. -1 indicates error in finding free ID -typedef int8_t eventId_t; -typedef uint32_t timeMs_t; +typedef int8_t eventId_t; // Should range from 0-127. -1 indicates error in finding free ID +typedef uint32_t timeMs_t; // Time in ms class EventScheduler { private: + // Number of events that can be active at once static const uint8_t m_MAX_NUM_EVENTS = 50; + // Array of Event objects Event m_events[m_MAX_NUM_EVENTS]; - + + // Returns an unassigned Event object in array, or -1 if none are free eventId_t findFreeEvent(void); public: + // Check if any callbacks must be called and execute them. + // If the repeat limit is reached, reset the event object. void updateEvents(timeMs_t current_time); void startEvent(eventId_t event_id); void stopEvent(eventId_t event_id); - // Call `callback` every `delay_ms` milliseconds, `repeat_count` times - // Returns index of event in `m_event_list` or -1 if `m_event_list` is full + // Call `callback` every `delay_ms` milliseconds, `repeat_count` times. + // Returns index of event in `m_event_list` or -1 if `m_event_list` is full. eventId_t callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), timeMs_t current_time, uint32_t repeat_count); - // Call `callback` every `delay_ms` milliseconds, forever - // Returns index of event in `m_event_list` or -1 if `m_event_list` is full + // Call `callback` every `delay_ms` milliseconds, forever. + // Returns index of event in `m_event_list` or -1 if `m_event_list` is full. eventId_t callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), timeMs_t current_time); - // Call `callback` after `delay_ms` milliseconds - // Returns index of event in `m_event_list` or -1 if `m_event_list` is full + // Call `callback` after `delay_ms` milliseconds. + // Returns index of event in `m_event_list` or -1 if `m_event_list` is full. eventId_t callFunctionAfter(timeMs_t delay_ms, void (*callback)(void), timeMs_t current_time); }; diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index 507980f..335ec79 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -2,20 +2,25 @@ void EventScheduler::updateEvents(timeMs_t current_time) { + // Iterate through m_events array for (eventId_t id = 0; id < m_MAX_NUM_EVENTS; id++) { + // Ignore stopped or unused event objects if (m_events[id].getType() == EventType::UNASSIGNED || m_events[id].getState() == EventState::STOPPED) { continue; } + // If the event's delay has passed if ((current_time - m_events[id].getLastTimeCalledMs() >= m_events[id].getDelayMs())) { m_events[id].callCallback(); m_events[id].setLastTimeCalledMs(current_time); + // If the event only runs a certain number of times if (m_events[id].getType() == EventType::FINITE) { m_events[id].decrementNumCallsLeft(); + // Unassign/reset event objects that are finished if (m_events[id].getNumCallsLeft() == 0) { m_events[id].cleanup(); From 22cd84a163c8b899f2311dfb2400e34a08c3dfff Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sat, 9 Nov 2019 23:30:49 -0330 Subject: [PATCH 09/24] Add more descriptive comments to Event class --- OnPod/Node/Common/EventScheduler/include/event.h | 10 +++++++--- OnPod/Node/Common/EventScheduler/src/event.cpp | 1 - 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Node/Common/EventScheduler/include/event.h index be085f1..f064e25 100644 --- a/OnPod/Node/Common/EventScheduler/include/event.h +++ b/OnPod/Node/Common/EventScheduler/include/event.h @@ -3,7 +3,7 @@ #include -typedef uint32_t timeMs_t; +typedef uint32_t timeMs_t; // Time in ms enum class EventType { @@ -29,12 +29,16 @@ class Event uint32_t m_num_calls_left = 0; public: + // Getters + EventType getType(void); EventState getState(void); timeMs_t getDelayMs(void); timeMs_t getLastTimeCalledMs(void); uint32_t getNumCallsLeft(void); + // Setters + void setType(EventType type); void setState(EventState state); void setDelayMs(timeMs_t delay_ms); @@ -42,10 +46,10 @@ class Event void setCallback(void (*callback)(void)); void setNumCallsLeft(uint32_t num_calls); + // Take away one from the event's `m_num_calls_left` void decrementNumCallsLeft(void); - void callCallback(void); - // Clear all event attributes to prepare for reassignment + // Reset event attributes to prepare for reassignment void cleanup(void); }; diff --git a/OnPod/Node/Common/EventScheduler/src/event.cpp b/OnPod/Node/Common/EventScheduler/src/event.cpp index 13ac635..2a98e24 100644 --- a/OnPod/Node/Common/EventScheduler/src/event.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event.cpp @@ -62,7 +62,6 @@ void Event::decrementNumCallsLeft(void) m_num_calls_left--; } - void Event::callCallback(void) { m_callback(); From db41025d7fd36cdf8e3b7297605e46f46c7a7f40 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sun, 10 Nov 2019 18:54:55 -0330 Subject: [PATCH 10/24] Update platformio.ini to include event scheduler --- OnPod/Node/platformio.ini | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/OnPod/Node/platformio.ini b/OnPod/Node/platformio.ini index 34d2862..2599d39 100644 --- a/OnPod/Node/platformio.ini +++ b/OnPod/Node/platformio.ini @@ -11,6 +11,7 @@ [platformio] src_dir = ./ include_dir = Common +default_envs = Testing [env:ActuationNode] platform = ststm32 @@ -20,11 +21,13 @@ debug_tool = stlink upload_protocol = stlink src_filter = + + + build_flags = -I./ActuationNode/BoardFiles/Inc -I./Common/Drivers/include -I./Common/PeripheralManagers/include -I./Common/PeripheralInterfaces/include + -I./Common/EventScheduler/include [env:SenseNode] platform = ststm32 @@ -34,11 +37,13 @@ debug_tool = stlink upload_protocol = stlink src_filter = + + + build_flags = -I./SenseNode/BoardFiles/Inc -I./Common/Drivers/include -I./Common/PeripheralManagers/include -I./Common/PeripheralInterfaces/include + -I./Common/EventScheduler/include [env:LvdcNode] platform = ststm32 @@ -48,11 +53,13 @@ debug_tool = stlink upload_protocol = stlink src_filter = + + + build_flags = -I./LvdcNode/BoardFiles/Inc -I./Common/Drivers/include -I./Common/PeripheralManagers/include -I./Common/PeripheralInterfaces/include + -I./Common/EventScheduler/include [env:Testing] platform = native @@ -60,7 +67,12 @@ test_build_project_src = true src_filter = -<*/BoardFiles/Src> -<*/BoardFiles/Inc> + + + + + + build_flags = -I./Common/MockClasses/include -I./Common/Drivers/include -I./Common/PeripheralManagers/include + -I./Common/EventScheduler/include + -std=c++17 From 4158cadd55216b24b11ad252722837c3f0e0345a Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sun, 10 Nov 2019 18:58:54 -0330 Subject: [PATCH 11/24] Change order of callFunctionEvery args --- OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index 335ec79..8cccb01 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -52,8 +52,8 @@ void EventScheduler::stopEvent(eventId_t event_id) m_events[event_id].setState(EventState::STOPPED); } -eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), uint32_t repeat_count, - timeMs_t current_time) +eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), + timeMs_t current_time, uint32_t repeat_count) { eventId_t id = findFreeEvent(); m_events[id].setType(EventType::FINITE); @@ -82,5 +82,5 @@ eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)( eventId_t EventScheduler::callFunctionAfter(timeMs_t delay_ms, void (*callback)(void), timeMs_t current_time) { - return callFunctionEvery(delay_ms, callback, 1, current_time); + return callFunctionEvery(delay_ms, callback, current_time, 1); } \ No newline at end of file From ce5c5375a057854219405e5affc6c8f2267fc808 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sun, 10 Nov 2019 19:07:02 -0330 Subject: [PATCH 12/24] Add comments and whitespace fixes --- OnPod/Node/Common/EventScheduler/include/event.h | 2 -- OnPod/Node/Common/EventScheduler/include/event_scheduler.h | 3 +++ OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Node/Common/EventScheduler/include/event.h index f064e25..815e36f 100644 --- a/OnPod/Node/Common/EventScheduler/include/event.h +++ b/OnPod/Node/Common/EventScheduler/include/event.h @@ -30,7 +30,6 @@ class Event public: // Getters - EventType getType(void); EventState getState(void); timeMs_t getDelayMs(void); @@ -38,7 +37,6 @@ class Event uint32_t getNumCallsLeft(void); // Setters - void setType(EventType type); void setState(EventState state); void setDelayMs(timeMs_t delay_ms); diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h index 693cdc4..a382db5 100644 --- a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h +++ b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h @@ -23,7 +23,10 @@ class EventScheduler // If the repeat limit is reached, reset the event object. void updateEvents(timeMs_t current_time); + // Resumes the event's calls void startEvent(eventId_t event_id); + // Pauses all the event's calls. + // If the event has a certain number of repeats, they will be preserved after starting again. void stopEvent(eventId_t event_id); // Call `callback` every `delay_ms` milliseconds, `repeat_count` times. diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index 8cccb01..13a9a6e 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -67,7 +67,6 @@ eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)( eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), timeMs_t current_time) - { eventId_t id = findFreeEvent(); m_events[id].setType(EventType::FOREVER); From 83ccf5c6140dfbe1ae102f4074bbbdc7f330466b Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sun, 10 Nov 2019 19:07:15 -0330 Subject: [PATCH 13/24] Add testing main for EventScheduler class --- OnPod/Node/Test/EventScheduler/main.cpp | 253 ++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 OnPod/Node/Test/EventScheduler/main.cpp diff --git a/OnPod/Node/Test/EventScheduler/main.cpp b/OnPod/Node/Test/EventScheduler/main.cpp new file mode 100644 index 0000000..4c4b617 --- /dev/null +++ b/OnPod/Node/Test/EventScheduler/main.cpp @@ -0,0 +1,253 @@ +#include +#include "event_scheduler.h" + +///// TEST HELPERS ///// +uint16_t test_callback_run_count = 0; + +void testCallback(void) +{ + test_callback_run_count++; +} + +void resetTestCallback(void) +{ + test_callback_run_count = 0; +} + +///// TESTS ///// + +// startEvent +void startEvent_eventNotStarted_eventStarted(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.stopEvent(event); + event_scheduler.startEvent(event); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); +} + +void startEvent_eventStarted_eventStaysStarted(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.startEvent(event); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); + resetTestCallback(); +} + +// stopEvent +void stopEvent_eventStopped_eventStaysStopped(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.stopEvent(event); + event_scheduler.stopEvent(event); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(0, test_callback_run_count); + resetTestCallback(); +} + +void stopEvent_eventNotStopped_eventStopped(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.startEvent(event); + event_scheduler.stopEvent(event); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(0, test_callback_run_count); + resetTestCallback(); +} + +// callFunctionEvery (forever) +void callFunctionEveryForever_delayPassedOnce_functionCalledOnce(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryForever_delayPassedTwice_functionCalledTwice(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0); + event_scheduler.updateEvents(1001); + event_scheduler.updateEvents(2002); + TEST_ASSERT_EQUAL_UINT16(2, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryForever_delayPassedThousandTimes_functionCalledThousandTimes(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0); + for (uint16_t i = 1; i <= 1000; i++) + { + event_scheduler.updateEvents(i*1001); + } + TEST_ASSERT_EQUAL_UINT16(1000, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryForever_delayNotPassed_functionNotCalled(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0); + event_scheduler.updateEvents(999); + TEST_ASSERT_EQUAL_UINT16(0, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryForever_delayNotPassedThenPassed_functionCalledOnce(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0); + event_scheduler.updateEvents(999); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryForever_delayExactlyReached_functionCalledOnce(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0); + event_scheduler.updateEvents(1000); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); + resetTestCallback(); +} + +// callFunctionEvery (finite) +void callFunctionEveryFinite_delayNotPassed_functionNotCalled(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0, 2); + event_scheduler.updateEvents(999); + TEST_ASSERT_EQUAL_UINT16(0, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryFinite_delayPassed_functionCalledOnce(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0, 2); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryFinite_delayPassedTwice_functionCalledTwice(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0, 2); + event_scheduler.updateEvents(1001); + event_scheduler.updateEvents(2002); + TEST_ASSERT_EQUAL_UINT16(2, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryFinite_delayPassedThreeTimes_functionCalledTwice(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0, 2); + event_scheduler.updateEvents(1001); + event_scheduler.updateEvents(2002); + event_scheduler.updateEvents(3003); + TEST_ASSERT_EQUAL_UINT16(2, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionEveryFinite_delayNotPassedThenPassed_functionCalledOnce(void) +{ + EventScheduler event_scheduler; + eventId_t event = event_scheduler.callFunctionEvery(1000, testCallback, 0, 2); + event_scheduler.updateEvents(999); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); + resetTestCallback(); +} + +// callFunctionAfter +void callFunctionAfter_delayPassed_functionCalled(void) +{ + EventScheduler event_scheduler; + event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.updateEvents(1001); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionAfter_delayNotPassed_functionNotCalled(void) +{ + EventScheduler event_scheduler; + event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.updateEvents(999); + TEST_ASSERT_EQUAL_UINT16(0, test_callback_run_count); + resetTestCallback(); +} + +void callFunctionAfter_delayPassedTwice_functionCalledOnce(void) +{ + EventScheduler event_scheduler; + event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.updateEvents(1001); + event_scheduler.updateEvents(2002); + TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); + resetTestCallback(); +} + +int main(void) +{ + UNITY_BEGIN(); + + // startEvent + RUN_TEST(startEvent_eventNotStarted_eventStarted); + resetTestCallback(); + RUN_TEST(startEvent_eventStarted_eventStaysStarted); + resetTestCallback(); + + // stopEvent + RUN_TEST(stopEvent_eventStopped_eventStaysStopped); + resetTestCallback(); + RUN_TEST(stopEvent_eventNotStopped_eventStopped); + resetTestCallback(); + + // callFunctionEvery (forever) + RUN_TEST(callFunctionEveryForever_delayPassedOnce_functionCalledOnce); + resetTestCallback(); + RUN_TEST(callFunctionEveryForever_delayPassedTwice_functionCalledTwice); + resetTestCallback(); + RUN_TEST(callFunctionEveryForever_delayPassedThousandTimes_functionCalledThousandTimes); + resetTestCallback(); + RUN_TEST(callFunctionEveryForever_delayNotPassed_functionNotCalled); + resetTestCallback(); + RUN_TEST(callFunctionEveryForever_delayNotPassedThenPassed_functionCalledOnce); + resetTestCallback(); + RUN_TEST(callFunctionEveryForever_delayExactlyReached_functionCalledOnce); + resetTestCallback(); + + // callFunctionEvery (finite) + RUN_TEST(callFunctionEveryFinite_delayNotPassed_functionNotCalled); + resetTestCallback(); + RUN_TEST(callFunctionEveryFinite_delayPassed_functionCalledOnce); + resetTestCallback(); + RUN_TEST(callFunctionEveryFinite_delayPassedTwice_functionCalledTwice); + resetTestCallback(); + RUN_TEST(callFunctionEveryFinite_delayPassedThreeTimes_functionCalledTwice); + resetTestCallback(); + RUN_TEST(callFunctionEveryFinite_delayNotPassedThenPassed_functionCalledOnce); + resetTestCallback(); + + // callFunctionAfter + RUN_TEST(callFunctionAfter_delayPassed_functionCalled); + resetTestCallback(); + RUN_TEST(callFunctionAfter_delayNotPassed_functionNotCalled); + resetTestCallback(); + RUN_TEST(callFunctionAfter_delayPassedTwice_functionCalledOnce); + resetTestCallback(); + + UNITY_END(); +} \ No newline at end of file From 0cc33188728aab42b97252b3d5c8dc669808e3dc Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Sun, 10 Nov 2019 19:42:54 -0330 Subject: [PATCH 14/24] Remove Testing as default env before PR --- OnPod/Node/platformio.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/OnPod/Node/platformio.ini b/OnPod/Node/platformio.ini index 2599d39..7cfa208 100644 --- a/OnPod/Node/platformio.ini +++ b/OnPod/Node/platformio.ini @@ -11,7 +11,6 @@ [platformio] src_dir = ./ include_dir = Common -default_envs = Testing [env:ActuationNode] platform = ststm32 From 5d4195ce7b6577f128b4c43ebe284922825480eb Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Fri, 15 Nov 2019 21:57:09 -0330 Subject: [PATCH 15/24] Add newlines to end of files --- OnPod/Node/Common/EventScheduler/include/event.h | 2 +- OnPod/Node/Common/EventScheduler/include/event_scheduler.h | 2 +- OnPod/Node/Common/EventScheduler/src/event.cpp | 2 +- OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp | 2 +- OnPod/Node/Test/EventScheduler/main.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Node/Common/EventScheduler/include/event.h index 815e36f..ced533d 100644 --- a/OnPod/Node/Common/EventScheduler/include/event.h +++ b/OnPod/Node/Common/EventScheduler/include/event.h @@ -51,4 +51,4 @@ class Event void cleanup(void); }; -#endif \ No newline at end of file +#endif diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h index a382db5..d4e66e1 100644 --- a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h +++ b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h @@ -43,4 +43,4 @@ class EventScheduler timeMs_t current_time); }; -#endif \ No newline at end of file +#endif diff --git a/OnPod/Node/Common/EventScheduler/src/event.cpp b/OnPod/Node/Common/EventScheduler/src/event.cpp index 2a98e24..48abe13 100644 --- a/OnPod/Node/Common/EventScheduler/src/event.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event.cpp @@ -75,4 +75,4 @@ void Event::cleanup(void) m_delay_ms = 0; m_last_time_called_ms = 0; m_num_calls_left = 0; -} \ No newline at end of file +} diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index 13a9a6e..ed334d7 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -82,4 +82,4 @@ eventId_t EventScheduler::callFunctionAfter(timeMs_t delay_ms, void (*callback)( timeMs_t current_time) { return callFunctionEvery(delay_ms, callback, current_time, 1); -} \ No newline at end of file +} diff --git a/OnPod/Node/Test/EventScheduler/main.cpp b/OnPod/Node/Test/EventScheduler/main.cpp index 4c4b617..7452079 100644 --- a/OnPod/Node/Test/EventScheduler/main.cpp +++ b/OnPod/Node/Test/EventScheduler/main.cpp @@ -250,4 +250,4 @@ int main(void) resetTestCallback(); UNITY_END(); -} \ No newline at end of file +} From a350ef7e6963a7f94c5249aeebf045590ac5cbb0 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Fri, 15 Nov 2019 22:20:56 -0330 Subject: [PATCH 16/24] Move implementation of `Event` methods to header --- .../Common/EventScheduler/include/event.h | 30 +++++---- .../Node/Common/EventScheduler/src/event.cpp | 67 ------------------- 2 files changed, 17 insertions(+), 80 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Node/Common/EventScheduler/include/event.h index ced533d..13a0e15 100644 --- a/OnPod/Node/Common/EventScheduler/include/event.h +++ b/OnPod/Node/Common/EventScheduler/include/event.h @@ -30,23 +30,27 @@ class Event public: // Getters - EventType getType(void); - EventState getState(void); - timeMs_t getDelayMs(void); - timeMs_t getLastTimeCalledMs(void); - uint32_t getNumCallsLeft(void); + EventType getType(void) { return m_type; }; + EventState getState(void) { return m_state; }; + timeMs_t getDelayMs(void) { return m_delay_ms; }; + timeMs_t getLastTimeCalledMs(void) { return m_last_time_called_ms; }; + uint32_t getNumCallsLeft(void) { return m_num_calls_left; }; // Setters - void setType(EventType type); - void setState(EventState state); - void setDelayMs(timeMs_t delay_ms); - void setLastTimeCalledMs(timeMs_t time_ms); - void setCallback(void (*callback)(void)); - void setNumCallsLeft(uint32_t num_calls); + void setType(EventType type) { m_type = type; }; + void setState(EventState state) { m_state = state; }; + void setDelayMs(timeMs_t delay_ms) { m_delay_ms = delay_ms; }; + void setLastTimeCalledMs(timeMs_t time_ms) { + m_last_time_called_ms = time_ms; + }; + void setCallback(void (*callback)(void)) { m_callback = callback; }; + void setNumCallsLeft(uint32_t num_calls) { + m_num_calls_left = num_calls; + }; // Take away one from the event's `m_num_calls_left` - void decrementNumCallsLeft(void); - void callCallback(void); + void decrementNumCallsLeft(void) { m_num_calls_left--; }; + void callCallback(void) { m_callback(); }; // Reset event attributes to prepare for reassignment void cleanup(void); }; diff --git a/OnPod/Node/Common/EventScheduler/src/event.cpp b/OnPod/Node/Common/EventScheduler/src/event.cpp index 48abe13..0a3429e 100644 --- a/OnPod/Node/Common/EventScheduler/src/event.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event.cpp @@ -1,72 +1,5 @@ #include "event.h" -EventType Event::getType(void) -{ - return m_type; -} - -EventState Event::getState(void) -{ - return m_state; -} - -uint32_t Event::getDelayMs(void) -{ - return m_delay_ms; -} - -uint32_t Event::getLastTimeCalledMs(void) -{ - return m_last_time_called_ms; -} - -uint32_t Event::getNumCallsLeft(void) -{ - return m_num_calls_left; -} - - -void Event::setType(EventType type) -{ - m_type = type; -} - -void Event::setState(EventState state) -{ - m_state = state; -} - -void Event::setDelayMs(timeMs_t delay_ms) -{ - m_delay_ms = delay_ms; -} - -void Event::setLastTimeCalledMs(timeMs_t time_ms) -{ - m_last_time_called_ms = time_ms; -} - -void Event::setCallback(void (*callback)(void)) -{ - m_callback = callback; -} - -void Event::setNumCallsLeft(uint32_t num_calls) -{ - m_num_calls_left = num_calls; -} - - -void Event::decrementNumCallsLeft(void) -{ - m_num_calls_left--; -} - -void Event::callCallback(void) -{ - m_callback(); -} - void Event::cleanup(void) { m_type = EventType::UNASSIGNED; From 6ab8189b92a9399d3a6217f628f944765fd9fd97 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Fri, 15 Nov 2019 22:24:27 -0330 Subject: [PATCH 17/24] Rename `Event` method `callCallback` to `callback` :( --- OnPod/Node/Common/EventScheduler/include/event.h | 2 +- OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Node/Common/EventScheduler/include/event.h index 13a0e15..38b6f4e 100644 --- a/OnPod/Node/Common/EventScheduler/include/event.h +++ b/OnPod/Node/Common/EventScheduler/include/event.h @@ -50,7 +50,7 @@ class Event // Take away one from the event's `m_num_calls_left` void decrementNumCallsLeft(void) { m_num_calls_left--; }; - void callCallback(void) { m_callback(); }; + void callback(void) { m_callback(); }; // Reset event attributes to prepare for reassignment void cleanup(void); }; diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index ed334d7..0cfd334 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -14,7 +14,7 @@ void EventScheduler::updateEvents(timeMs_t current_time) // If the event's delay has passed if ((current_time - m_events[id].getLastTimeCalledMs() >= m_events[id].getDelayMs())) { - m_events[id].callCallback(); + m_events[id].callback(); m_events[id].setLastTimeCalledMs(current_time); // If the event only runs a certain number of times if (m_events[id].getType() == EventType::FINITE) From 74b59648d262952537d8c8685aac88bb960573bb Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Thu, 21 Nov 2019 21:38:39 -0330 Subject: [PATCH 18/24] Change `Event` class to a struct and change m_events from an array to a STL map --- .../Common/EventScheduler/include/event.h | 44 ++----- .../EventScheduler/include/event_scheduler.h | 17 ++- .../Node/Common/EventScheduler/src/event.cpp | 11 -- .../EventScheduler/src/event_scheduler.cpp | 108 ++++++++++++------ 4 files changed, 88 insertions(+), 92 deletions(-) delete mode 100644 OnPod/Node/Common/EventScheduler/src/event.cpp diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Node/Common/EventScheduler/include/event.h index 38b6f4e..2118c29 100644 --- a/OnPod/Node/Common/EventScheduler/include/event.h +++ b/OnPod/Node/Common/EventScheduler/include/event.h @@ -3,11 +3,11 @@ #include +typedef int8_t eventId_t; // Should range from 0-127. -1 indicates error in finding free ID typedef uint32_t timeMs_t; // Time in ms enum class EventType { - UNASSIGNED, FINITE, // Repeat X number of times FOREVER, // Repeat forever }; @@ -18,41 +18,15 @@ enum class EventState STOPPED, }; -class Event +struct Event { - private: - EventType m_type = EventType::UNASSIGNED; - EventState m_state = EventState::STOPPED; - void (*m_callback)(void) = nullptr; - timeMs_t m_delay_ms = 0; - timeMs_t m_last_time_called_ms = 0; - uint32_t m_num_calls_left = 0; - - public: - // Getters - EventType getType(void) { return m_type; }; - EventState getState(void) { return m_state; }; - timeMs_t getDelayMs(void) { return m_delay_ms; }; - timeMs_t getLastTimeCalledMs(void) { return m_last_time_called_ms; }; - uint32_t getNumCallsLeft(void) { return m_num_calls_left; }; - - // Setters - void setType(EventType type) { m_type = type; }; - void setState(EventState state) { m_state = state; }; - void setDelayMs(timeMs_t delay_ms) { m_delay_ms = delay_ms; }; - void setLastTimeCalledMs(timeMs_t time_ms) { - m_last_time_called_ms = time_ms; - }; - void setCallback(void (*callback)(void)) { m_callback = callback; }; - void setNumCallsLeft(uint32_t num_calls) { - m_num_calls_left = num_calls; - }; - - // Take away one from the event's `m_num_calls_left` - void decrementNumCallsLeft(void) { m_num_calls_left--; }; - void callback(void) { m_callback(); }; - // Reset event attributes to prepare for reassignment - void cleanup(void); + EventType type = EventType::FINITE; + EventState state = EventState::STOPPED; + void (*callback)(void) = nullptr; + timeMs_t delay_ms = 0; + timeMs_t last_time_called_ms = 0; + uint32_t num_calls_left = 0; + eventId_t id = 0; }; #endif diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h index d4e66e1..b237f8b 100644 --- a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h +++ b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h @@ -1,24 +1,23 @@ #ifndef NODE_EVENT_SCHEDULER_H #define NODE_EVENT_SCHEDULER_H +#include #include #include "event.h" -typedef int8_t eventId_t; // Should range from 0-127. -1 indicates error in finding free ID -typedef uint32_t timeMs_t; // Time in ms - class EventScheduler { private: // Number of events that can be active at once static const uint8_t m_MAX_NUM_EVENTS = 50; - // Array of Event objects - Event m_events[m_MAX_NUM_EVENTS]; - - // Returns an unassigned Event object in array, or -1 if none are free - eventId_t findFreeEvent(void); - + // Map of Event objects + std::map m_events; + + // + eventId_t findFreeEventId(void); + public: + // Check if any callbacks must be called and execute them. // If the repeat limit is reached, reset the event object. void updateEvents(timeMs_t current_time); diff --git a/OnPod/Node/Common/EventScheduler/src/event.cpp b/OnPod/Node/Common/EventScheduler/src/event.cpp deleted file mode 100644 index 0a3429e..0000000 --- a/OnPod/Node/Common/EventScheduler/src/event.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "event.h" - -void Event::cleanup(void) -{ - m_type = EventType::UNASSIGNED; - m_state = EventState::STOPPED; - m_callback = nullptr; - m_delay_ms = 0; - m_last_time_called_ms = 0; - m_num_calls_left = 0; -} diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index 0cfd334..92bb008 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -1,80 +1,114 @@ +#include #include "event_scheduler.h" void EventScheduler::updateEvents(timeMs_t current_time) { - // Iterate through m_events array - for (eventId_t id = 0; id < m_MAX_NUM_EVENTS; id++) + std::vector events_to_erase; + for (auto& [id, event] : m_events) { - // Ignore stopped or unused event objects - if (m_events[id].getType() == EventType::UNASSIGNED || - m_events[id].getState() == EventState::STOPPED) + if (event.state == EventState::STOPPED) { continue; } - // If the event's delay has passed - if ((current_time - m_events[id].getLastTimeCalledMs() >= m_events[id].getDelayMs())) + + if (current_time - event.last_time_called_ms >= event.delay_ms) { - m_events[id].callback(); - m_events[id].setLastTimeCalledMs(current_time); - // If the event only runs a certain number of times - if (m_events[id].getType() == EventType::FINITE) + event.callback(); + event.last_time_called_ms = current_time; + if (event.type == EventType::FINITE) { - m_events[id].decrementNumCallsLeft(); - // Unassign/reset event objects that are finished - if (m_events[id].getNumCallsLeft() == 0) + event.num_calls_left--; + if (event.num_calls_left == 0) { - m_events[id].cleanup(); + events_to_erase.push_back(id); } } } } + for (auto const id : events_to_erase) + { + m_events.erase(id); + } } -eventId_t EventScheduler::findFreeEvent(void) +eventId_t EventScheduler::findFreeEventId(void) { - for (eventId_t id = 0; id < m_MAX_NUM_EVENTS; id++) + // If map is too damn big return error + if (m_events.size() >= m_MAX_NUM_EVENTS) + { + return -1; + } + else if (m_events.empty()) + { + return 0; + } + + // Iterate over the map and see if index_being_checked is already taken + // If so, check the next index. If not, the new event's id will be index_being_checked + eventId_t index_being_checked = 0; + for (auto event : m_events) { - if (m_events[id].getType() == EventType::UNASSIGNED) + if (event.first == index_being_checked) { - return id; + index_being_checked++; } + else + { + return index_being_checked; + } + } + if (index_being_checked <= m_MAX_NUM_EVENTS) + { + return index_being_checked; } return -1; } -void EventScheduler::startEvent(eventId_t event_id) +void EventScheduler::startEvent(eventId_t id) { - m_events[event_id].setState(EventState::STARTED); + m_events[id].state = EventState::STARTED; } -void EventScheduler::stopEvent(eventId_t event_id) +void EventScheduler::stopEvent(eventId_t id) { - m_events[event_id].setState(EventState::STOPPED); + m_events[id].state = EventState::STOPPED; } eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), timeMs_t current_time, uint32_t repeat_count) { - eventId_t id = findFreeEvent(); - m_events[id].setType(EventType::FINITE); - m_events[id].setState(EventState::STARTED); - m_events[id].setDelayMs(delay_ms); - m_events[id].setLastTimeCalledMs(current_time); - m_events[id].setCallback(callback); - m_events[id].setNumCallsLeft(repeat_count); + eventId_t id = findFreeEventId(); + if (id == -1) + { + return id; + } + Event event; + event.type = EventType::FINITE; + event.state = EventState::STARTED; + event.delay_ms = delay_ms; + event.last_time_called_ms = current_time; + event.callback = callback; + event.num_calls_left = repeat_count; + m_events.insert({id, event}); return id; } eventId_t EventScheduler::callFunctionEvery(timeMs_t delay_ms, void (*callback)(void), timeMs_t current_time) { - eventId_t id = findFreeEvent(); - m_events[id].setType(EventType::FOREVER); - m_events[id].setState(EventState::STARTED); - m_events[id].setDelayMs(delay_ms); - m_events[id].setLastTimeCalledMs(current_time); - m_events[id].setCallback(callback); - m_events[id].setNumCallsLeft(0); + eventId_t id = findFreeEventId(); + if (id == -1) + { + return id; + } + Event event; + event.type = EventType::FOREVER; + event.state = EventState::STARTED; + event.delay_ms = delay_ms; + event.last_time_called_ms = current_time; + event.callback = callback; + event.num_calls_left = 0; + m_events.insert({id, event}); return id; } From 155521e2b7d75a10ece5d8bce35aa43120e0da16 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Thu, 21 Nov 2019 21:43:50 -0330 Subject: [PATCH 19/24] Change eventId_t from int8_t to int16_t in case if more than 127 events are needed --- OnPod/Node/Common/EventScheduler/include/event.h | 2 +- OnPod/Node/Common/EventScheduler/include/event_scheduler.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Node/Common/EventScheduler/include/event.h index 2118c29..6fd10f3 100644 --- a/OnPod/Node/Common/EventScheduler/include/event.h +++ b/OnPod/Node/Common/EventScheduler/include/event.h @@ -3,7 +3,7 @@ #include -typedef int8_t eventId_t; // Should range from 0-127. -1 indicates error in finding free ID +typedef int16_t eventId_t; // Should range from 0-127. -1 indicates error in finding free ID typedef uint32_t timeMs_t; // Time in ms enum class EventType diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h index b237f8b..2934bf0 100644 --- a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h +++ b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h @@ -9,7 +9,7 @@ class EventScheduler { private: // Number of events that can be active at once - static const uint8_t m_MAX_NUM_EVENTS = 50; + static const int16_t m_MAX_NUM_EVENTS = 50; // Map of Event objects std::map m_events; From 1f59a72656b2eb47951d3fa779905baeb9abafbe Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Thu, 21 Nov 2019 21:45:08 -0330 Subject: [PATCH 20/24] Add getter for m_MAX_NUM_EVENTS --- OnPod/Node/Common/EventScheduler/include/event_scheduler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h index 2934bf0..41a4c1c 100644 --- a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h +++ b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h @@ -17,7 +17,7 @@ class EventScheduler eventId_t findFreeEventId(void); public: - + int16_t getMaxNumEvents(void) { return m_MAX_NUM_EVENTS; }; // Check if any callbacks must be called and execute them. // If the repeat limit is reached, reset the event object. void updateEvents(timeMs_t current_time); From 5b9b4c6800dfbae4252b83a67fe38a70845083f0 Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Thu, 21 Nov 2019 22:29:16 -0330 Subject: [PATCH 21/24] Add unit tests suggested in PR --- OnPod/Node/Test/EventScheduler/main.cpp | 86 ++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/OnPod/Node/Test/EventScheduler/main.cpp b/OnPod/Node/Test/EventScheduler/main.cpp index 7452079..d7213a0 100644 --- a/OnPod/Node/Test/EventScheduler/main.cpp +++ b/OnPod/Node/Test/EventScheduler/main.cpp @@ -21,8 +21,8 @@ void startEvent_eventNotStarted_eventStarted(void) { EventScheduler event_scheduler; eventId_t event = event_scheduler.callFunctionAfter(1000, testCallback, 0); - event_scheduler.stopEvent(event); - event_scheduler.startEvent(event); + //event_scheduler.stopEvent(event); + //event_scheduler.startEvent(event); event_scheduler.updateEvents(1001); TEST_ASSERT_EQUAL_UINT16(1, test_callback_run_count); } @@ -199,6 +199,74 @@ void callFunctionAfter_delayPassedTwice_functionCalledOnce(void) resetTestCallback(); } +// findFreeEvent +void findFreeEvent_makeOneEvents_idIsZero(void) +{ + EventScheduler event_scheduler; + eventId_t id = event_scheduler.callFunctionEvery(0, testCallback, 0); + TEST_ASSERT_EQUAL_INT16(0, id); +} + +void findFreeEvent_makeTwoEvents_secondIdIsOne(void) +{ + EventScheduler event_scheduler; + event_scheduler.callFunctionEvery(0, testCallback, 0); + eventId_t id = event_scheduler.callFunctionEvery(0, testCallback, 0); + TEST_ASSERT_EQUAL_INT16(1, id); +} + +void findFreeEvent_expireEventThenMakeSecond_secondIdIsZero(void) +{ + EventScheduler event_scheduler; + event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.updateEvents(1001); + eventId_t id = event_scheduler.callFunctionEvery(0, testCallback, 0); + TEST_ASSERT_EQUAL_INT16(0, id); +} + +void findFreeEvent_makeThreeExpireSecondMakeFourth_fourthIdIsOne(void) +{ + EventScheduler event_scheduler; + event_scheduler.callFunctionEvery(1000, testCallback, 0); + event_scheduler.callFunctionAfter(1000, testCallback, 0); + event_scheduler.callFunctionEvery(1000, testCallback, 0); + event_scheduler.updateEvents(1001); + eventId_t id = event_scheduler.callFunctionEvery(0, testCallback, 0); + TEST_ASSERT_EQUAL_INT16(1, id); +} + +void findFreeEvent_makeMaxPlusOneEvents_errorIsReturned(void) +{ + EventScheduler event_scheduler; + // Make MAX events + for (eventId_t id = 0; id < event_scheduler.getMaxNumEvents(); id++) + { + event_scheduler.callFunctionEvery(0, testCallback, 0); + } + eventId_t last_id = event_scheduler.callFunctionEvery(0, testCallback, 0); + TEST_ASSERT_EQUAL_INT16(-1, last_id); +} + +void findFreeEvent_makeMaxThenExpireOneThenMakeEvent_validIdReturned(void) +{ + EventScheduler event_scheduler; + // Make MAX-1 events that won't expire + for (eventId_t id = 0; id < event_scheduler.getMaxNumEvents()-1; id++) + { + event_scheduler.callFunctionEvery(1000, testCallback, 0); + } + // Make final event that will expire + event_scheduler.callFunctionAfter(0, testCallback, 0); + // Try and fail to make a MAX+1th event + event_scheduler.callFunctionEvery(0, testCallback, 0); + // Expire final element + event_scheduler.updateEvents(999); + // Try (successfully) to make a MAXth element + eventId_t id = event_scheduler.callFunctionEvery(0, testCallback, 0); + // Assert id is MAX-1 (-1 to account for account for ids starting at 0) + TEST_ASSERT_EQUAL_INT16(event_scheduler.getMaxNumEvents()-1, id); +} + int main(void) { UNITY_BEGIN(); @@ -249,5 +317,19 @@ int main(void) RUN_TEST(callFunctionAfter_delayPassedTwice_functionCalledOnce); resetTestCallback(); + // Test private method findFreeEvent indirectly + RUN_TEST(findFreeEvent_makeOneEvents_idIsZero); + resetTestCallback(); + RUN_TEST(findFreeEvent_makeTwoEvents_secondIdIsOne); + resetTestCallback(); + RUN_TEST(findFreeEvent_expireEventThenMakeSecond_secondIdIsZero); + resetTestCallback(); + RUN_TEST(findFreeEvent_makeThreeExpireSecondMakeFourth_fourthIdIsOne); + resetTestCallback(); + RUN_TEST(findFreeEvent_makeMaxPlusOneEvents_errorIsReturned); + resetTestCallback(); + RUN_TEST(findFreeEvent_makeMaxThenExpireOneThenMakeEvent_validIdReturned); + resetTestCallback(); + UNITY_END(); } From 426c7d1881b61568986a898d233d119978ede07b Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Thu, 21 Nov 2019 22:38:05 -0330 Subject: [PATCH 22/24] Add new comments to EventScheduler class --- .../Common/EventScheduler/include/event_scheduler.h | 4 ++-- .../Node/Common/EventScheduler/src/event_scheduler.cpp | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h index 41a4c1c..2694957 100644 --- a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h +++ b/OnPod/Node/Common/EventScheduler/include/event_scheduler.h @@ -10,10 +10,10 @@ class EventScheduler private: // Number of events that can be active at once static const int16_t m_MAX_NUM_EVENTS = 50; - // Map of Event objects + // Map to hold events and their ids std::map m_events; - // + // Return a free event id eventId_t findFreeEventId(void); public: diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index 92bb008..97756a1 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -3,7 +3,10 @@ void EventScheduler::updateEvents(timeMs_t current_time) { + // Can't erase key/value pairs in the for loop + // Keep track of them in this vector then erase them afterwards std::vector events_to_erase; + // Iterate over map to find events that are due for (auto& [id, event] : m_events) { if (event.state == EventState::STOPPED) @@ -20,11 +23,13 @@ void EventScheduler::updateEvents(timeMs_t current_time) event.num_calls_left--; if (event.num_calls_left == 0) { + // Add to temporary vector to be removed events_to_erase.push_back(id); } } } } + // Remove key/value pairs that had expired for (auto const id : events_to_erase) { m_events.erase(id); @@ -38,11 +43,11 @@ eventId_t EventScheduler::findFreeEventId(void) { return -1; } - else if (m_events.empty()) + // If empty use first id, 0 + if (m_events.empty()) { return 0; } - // Iterate over the map and see if index_being_checked is already taken // If so, check the next index. If not, the new event's id will be index_being_checked eventId_t index_being_checked = 0; @@ -57,6 +62,7 @@ eventId_t EventScheduler::findFreeEventId(void) return index_being_checked; } } + // If there were no gaps in the map then use the next index up if (index_being_checked <= m_MAX_NUM_EVENTS) { return index_being_checked; From ea74d95abffda749f0080fdb507b2ac8d4626dff Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Thu, 21 Nov 2019 22:56:54 -0330 Subject: [PATCH 23/24] Add better comments to `findFreeEventId` --- OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp index 97756a1..befcfc6 100644 --- a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp +++ b/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp @@ -48,8 +48,8 @@ eventId_t EventScheduler::findFreeEventId(void) { return 0; } - // Iterate over the map and see if index_being_checked is already taken - // If so, check the next index. If not, the new event's id will be index_being_checked + // Check for gaps in the map + // Iterate and see if index_being_checked is available eventId_t index_being_checked = 0; for (auto event : m_events) { From cf8ad3727c10dcf33ce248bedf46bb000c3f6cdb Mon Sep 17 00:00:00 2001 From: Shane Williams Date: Thu, 21 Nov 2019 23:09:07 -0330 Subject: [PATCH 24/24] Move EventScheduler from Node/Common to OnPod/Common --- .../Common/EventScheduler/include/event.h | 0 .../Common/EventScheduler/include/event_scheduler.h | 0 .../Common/EventScheduler/src/event_scheduler.cpp | 0 OnPod/Node/platformio.ini | 13 +++++++++---- 4 files changed, 9 insertions(+), 4 deletions(-) rename OnPod/{Node => }/Common/EventScheduler/include/event.h (100%) rename OnPod/{Node => }/Common/EventScheduler/include/event_scheduler.h (100%) rename OnPod/{Node => }/Common/EventScheduler/src/event_scheduler.cpp (100%) diff --git a/OnPod/Node/Common/EventScheduler/include/event.h b/OnPod/Common/EventScheduler/include/event.h similarity index 100% rename from OnPod/Node/Common/EventScheduler/include/event.h rename to OnPod/Common/EventScheduler/include/event.h diff --git a/OnPod/Node/Common/EventScheduler/include/event_scheduler.h b/OnPod/Common/EventScheduler/include/event_scheduler.h similarity index 100% rename from OnPod/Node/Common/EventScheduler/include/event_scheduler.h rename to OnPod/Common/EventScheduler/include/event_scheduler.h diff --git a/OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp b/OnPod/Common/EventScheduler/src/event_scheduler.cpp similarity index 100% rename from OnPod/Node/Common/EventScheduler/src/event_scheduler.cpp rename to OnPod/Common/EventScheduler/src/event_scheduler.cpp diff --git a/OnPod/Node/platformio.ini b/OnPod/Node/platformio.ini index 7cfa208..c72b9a9 100644 --- a/OnPod/Node/platformio.ini +++ b/OnPod/Node/platformio.ini @@ -11,6 +11,7 @@ [platformio] src_dir = ./ include_dir = Common +default_envs = ActuationNode [env:ActuationNode] platform = ststm32 @@ -21,12 +22,13 @@ upload_protocol = stlink src_filter = + + + +<../Common> build_flags = -I./ActuationNode/BoardFiles/Inc -I./Common/Drivers/include -I./Common/PeripheralManagers/include -I./Common/PeripheralInterfaces/include - -I./Common/EventScheduler/include + -I../Common/EventScheduler/include [env:SenseNode] platform = ststm32 @@ -37,12 +39,13 @@ upload_protocol = stlink src_filter = + + + +<../Common> build_flags = -I./SenseNode/BoardFiles/Inc -I./Common/Drivers/include -I./Common/PeripheralManagers/include -I./Common/PeripheralInterfaces/include - -I./Common/EventScheduler/include + -I../Common/EventScheduler/include [env:LvdcNode] platform = ststm32 @@ -53,12 +56,13 @@ upload_protocol = stlink src_filter = + + + +<../Common> build_flags = -I./LvdcNode/BoardFiles/Inc -I./Common/Drivers/include -I./Common/PeripheralManagers/include -I./Common/PeripheralInterfaces/include - -I./Common/EventScheduler/include + -I../Common/EventScheduler/include [env:Testing] platform = native @@ -69,9 +73,10 @@ src_filter = + + + + +<../Common> build_flags = -I./Common/MockClasses/include -I./Common/Drivers/include -I./Common/PeripheralManagers/include - -I./Common/EventScheduler/include + -I../Common/EventScheduler/include -std=c++17