From 0ee9d39e81bca9e0dd10774a421140016019c5f0 Mon Sep 17 00:00:00 2001 From: Max Regan Date: Sat, 6 Jun 2020 16:50:00 -0700 Subject: [PATCH] Clean up test code Separate/consolidate board initialization code, and a few functions that are shared across tests. Update the Makefile accordingly. Resolves #18 --- .gitlab-ci.yml | 6 +- firmware/Makefile | 58 ++++++--- firmware/Test/{ => Apps}/button.cpp | 34 ++---- firmware/Test/{pass.cpp => Apps/clock.cpp} | 39 +++--- firmware/Test/{ => Apps}/fail.cpp | 27 +---- firmware/Test/{ => Apps}/lptim.cpp | 42 ++----- firmware/Test/{ => Apps}/no_start.cpp | 0 firmware/Test/Apps/pass.cpp | 37 ++++++ firmware/Test/{ => Apps}/periodic_alarms.cpp | 48 +------- firmware/Test/{ => Apps}/set_time.cpp | 28 +---- firmware/Test/{ => Apps}/stop.cpp | 43 +------ firmware/Test/{test.cpp => Apps/timeout.cpp} | 16 ++- .../Test/{clock.cpp => Apps/wakeup_irq.cpp} | 68 ++++------- firmware/Test/Board/devboard.cpp | 42 +++++++ .../Test/{timeout.cpp => Board/watch.cpp} | 36 ++---- firmware/Test/Common/TestBoard.h | 32 +++++ .../Test/{wakeup_irq.cpp => Common/test.cpp} | 72 ++--------- firmware/Test/{ => Common}/test.h | 7 ++ test/src/tr_test/test.py | 112 +++++++++--------- 19 files changed, 327 insertions(+), 420 deletions(-) rename firmware/Test/{ => Apps}/button.cpp (81%) rename firmware/Test/{pass.cpp => Apps/clock.cpp} (74%) rename firmware/Test/{ => Apps}/fail.cpp (69%) rename firmware/Test/{ => Apps}/lptim.cpp (70%) rename firmware/Test/{ => Apps}/no_start.cpp (100%) create mode 100644 firmware/Test/Apps/pass.cpp rename firmware/Test/{ => Apps}/periodic_alarms.cpp (61%) rename firmware/Test/{ => Apps}/set_time.cpp (78%) rename firmware/Test/{ => Apps}/stop.cpp (73%) rename firmware/Test/{test.cpp => Apps/timeout.cpp} (83%) rename firmware/Test/{clock.cpp => Apps/wakeup_irq.cpp} (52%) create mode 100644 firmware/Test/Board/devboard.cpp rename firmware/Test/{timeout.cpp => Board/watch.cpp} (66%) create mode 100644 firmware/Test/Common/TestBoard.h rename firmware/Test/{wakeup_irq.cpp => Common/test.cpp} (58%) rename firmware/Test/{ => Common}/test.h (92%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a724a2d..3ee008c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,8 +8,8 @@ variables: - make -C ./firmware/ artifacts: paths: - - "firmware/Test/*.elf" - - "firmware/Test/*.bin" + - "firmware/Test/Apps/*.elf" + - "firmware/Test/Apps/*.bin" - "firmware/Application/*.elf" - "firmware/Application/*.bin" @@ -32,7 +32,7 @@ test-watch: - privileged image: registry.gitlab.maxregan.me/max/timely-reference/test-exec script: - - test/src/tr_test/test.py --junitxml=test-report.xml + - test/src/tr_test/test.py -v --durations=0 --junitxml=test-report.xml artifacts: reports: junit: test-report.xml diff --git a/firmware/Makefile b/firmware/Makefile index 1886520..bd93a91 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -77,25 +77,41 @@ FONT_GEN_DIR := build/gen/fonts FONT_C_FILES := $(patsubst %,$(FONT_GEN_DIR)/%.c,$(FONTS)) FONT_H_FILES := $(patsubst %,$(FONT_GEN_DIR)/%.h,$(FONTS)) -C_SOURCES := $(call find_important, $(SOURCEDIR), '*.c') $(FONT_C_FILES) -CXX_SOURCES := $(call find_important, $(SOURCEDIR), '*.cpp') -S_SOURCES := $(call find_important, $(SOURCEDIR), '*.s') -SPP_SOURCES := Bsp/Mcu/$(DEVICE_TYPE).S -SOURCES = $(C_SOURCES) $(S_SOURCES) $(SPP_SOURCES) $(CPP_SOURCES) +BSP_SRC_DIR := ./Bsp/ +APP_SRC_DIR := ./Application/ +TEST_APP_SRC_DIR := ./Test/Apps/ +TEST_COMMON_SRC_DIR:= ./Test/Common/ +TEST_BOARD_SRC_DIR := ./Test/Board/ +THIRD_PARTY_SRC_DIR := ./ThirdParty/ -APPS := ./Application/main ./Test/pass ./Test/fail ./Test/timeout ./Test/clock ./Test/stop ./Test/no_start ./Test/lptim ./Test/set_time ./Test/periodic_alarms ./Test/wakeup_irq ./Test/button -APP_ELFS = $(addsuffix .elf, $(APPS)) -APP_MAPS = $(addsuffix .map, $(APPS)) -APP_BINS = $(addsuffix .bin, $(APPS)) -APP_OBJS = $(addsuffix .o, $(APPS)) +COMMON_SRC_DIRS := $(BSP_SRC_DIR) $(APP_SRC_DIR) $(TEST_COMMON_SRC_DIR) $(THIRD_PARTY_SRC_DIR) + +C_SOURCES := $(call find_important, $(COMMON_SRC_DIRS), '*.c') $(FONT_C_FILES) +CXX_SOURCES := $(call find_important, $(COMMON_SRC_DIRS), '*.cpp') +S_SOURCES := $(call find_important, $(COMMON_SRC_DIRS), '*.s') +SPP_SOURCES := Bsp/Mcu/$(DEVICE_TYPE).S +SOURCES := $(C_SOURCES) $(S_SOURCES) $(SPP_SOURCES) $(CPP_SOURCES) + +APPS := ./Application/main +TEST_APPS := $(patsubst %.cpp, %, $(call find_important, $(TEST_APP_SRC_DIR), '*.cpp')) + +APP_ELFS := $(addsuffix .elf, $(APPS)) +APP_MAPS := $(addsuffix .map, $(APPS)) +APP_BINS := $(addsuffix .bin, $(APPS)) +APP_OBJS := $(addsuffix .o, $(APPS)) + +TEST_APP_ELFS := $(addsuffix .elf, $(TEST_APPS)) +TEST_APP_MAPS := $(addsuffix .map, $(TEST_APPS)) +TEST_APP_BINS := $(addsuffix .bin, $(TEST_APPS)) +TEST_APP_OBJS := $(addsuffix .o, $(TEST_APPS)) C_OBJS := $(patsubst %.c,%.o,$(C_SOURCES)) CXX_OBJS := $(patsubst %.cpp,%.o,$(CXX_SOURCES)) S_OBJS := $(patsubst %.s,%.o,$(S_SOURCES)) SPP_OBJS := $(patsubst %.S,%.o,$(SPP_SOURCES)) -ALL_OBJS = $(C_OBJS) $(S_OBJS) $(SPP_OBJS) $(CXX_OBJS) -OBJS = $(filter-out $(APP_OBJS), $(ALL_OBJS)) - +ALL_OBJS := $(C_OBJS) $(S_OBJS) $(SPP_OBJS) $(CXX_OBJS) +COMMON_OBJS := $(filter-out $(APP_OBJS), $(ALL_OBJS)) +TEST_BOARD_OBJ := $(TEST_BOARD_SRC_DIR)$(BOARD).o LINKER_SCRIPT ?= Bsp/Mcu/$(DEVICE_TYPE).ld OUTPUT_NAME ?= Application/main @@ -142,6 +158,7 @@ CFLAGS += -I./ThirdParty/stm32/$(DEVICE_LINE)/Include CFLAGS += -I./ThirdParty/CMSIS/Core/Include CFLAGS += -I./ThirdParty/printf CFLAGS += -I./build/gen/ +CFLAGS += -I./Test/Common/ CFLAGS += -I. CXX_FLAGS += -std=c++14 -fno-exceptions -fno-rtti -fno-use-cxa-atexit @@ -180,7 +197,7 @@ $(info ================================) # Default Target # .PHONY: build -build: $(APP_BINS) +build: $(APP_BINS) $(TEST_APP_BINS) # # Build Logic @@ -214,9 +231,13 @@ $(FONT_GEN_DIR)/large_digits.h $(FONT_GEN_DIR)/large_digits.c: Gen/fixedfont-to- @echo "OBJCOPY $@" @$(OBJCOPY) -O binary $^ $@ -%.map %.elf: %.o $(LINKER_SCRIPT) $(OBJS) +$(TEST_APP_MAPS) $(TEST_APP_ELFS): $(TEST_APP_OBJS) $(LINKER_SCRIPT) $(COMMON_OBJS) $(TEST_BOARD_OBJ) @echo "LD $@" - @$(LD) -T $(LINKER_SCRIPT) $(LDFLAGS) -o $*.elf $*.o $(OBJS) -Wl,-Map=$*.map + @$(LD) -T $(LINKER_SCRIPT) $(LDFLAGS) -o $(basename $@).elf $(basename $@).o $(COMMON_OBJS) $(TEST_BOARD_OBJ) -Wl,-Map=$(basename $@).map + +$(APP_MAPS) $(APP_ELFS): $(APP_OBJS) $(LINKER_SCRIPT) $(COMMON_OBJS) + @echo "LD $@" + @$(LD) -T $(LINKER_SCRIPT) $(LDFLAGS) -o $(basename $@).elf $(basename $@).o $(COMMON_OBJS) -Wl,-Map=$(basename $@).map # # Utilities @@ -237,7 +258,10 @@ jlink: $(OUTPUT_BIN) .PHONY: clean clean: - rm -f $(OBJS) $(OUTPUT_BIN) $(OUTPUT_ELF) $(FONT_C_FILES) $(FONT_H_FILES) $(OUTPUT_MAP) $(APPS) $(APP_ELFS) $(APP_MAPS) $(APP_BINS) $(APP_OBJS) $(addsuffix .su,$(basename $(ALL_OBJS))) + @echo "Cleaning up..." + @rm -f $(OBJS) $(OUTPUT_BIN) $(OUTPUT_ELF) $(FONT_C_FILES) $(FONT_H_FILES) $(OUTPUT_MAP) $(APP_ELFS) $(APP_MAPS) $(APP_BINS) $(APP_OBJS) $(TEST_APP_ELFS) $(TEST_APP_MAPS) $(TEST_APP_BINS) $(TEST_APP_OBJS) $(addsuffix .su,$(basename $(ALL_OBJS))) + + # Please do not delete my files. diff --git a/firmware/Test/button.cpp b/firmware/Test/Apps/button.cpp similarity index 81% rename from firmware/Test/button.cpp rename to firmware/Test/Apps/button.cpp index 61dd36a..68ce08e 100644 --- a/firmware/Test/button.cpp +++ b/firmware/Test/Apps/button.cpp @@ -20,31 +20,19 @@ */ #include "Bsp/Drivers/GpioDriver.h" -#include "Bsp/Drivers/RtcDriver.h" -#include "Bsp/Drivers/UsartDriver.h" -#include "Bsp/LowPowerTaskScheduler.h" -#include "Bsp/macros.h" + #include "Application/ButtonManager.h" +#include "TestBoard.h" + #include "printf.h" #include "test.h" -#include "Mcu.h" - using namespace BSP; using Button = ButtonManager::Button; using ButtonState = ButtonManager::ButtonState; -static Schedule::LowPowerTaskScheduler<5> g_sched; -static GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static UsartDriver g_test_uart(USART2, g_sched); -static GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static UsartDriver g_test_uart(USART1, g_sched); -#endif - static GpioPin g_btn_down(g_gpioa, 0); static GpioPin g_btn_mid(g_gpioa, 1); static GpioPin g_btn_up(g_gpioa, 2); @@ -69,19 +57,10 @@ static IdleTask g_idle; [[noreturn]] void main() { - g_gpioa.enable(); + board_init(); -#if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); -#endif - - g_test_uart.init(); g_test_uart.tx_blocking(test_start_text); - - RtcDriver::init(); - SystemTimer::set_timer(RtcDriver::get_system_timer()); - LowPower::init(); - + g_btn_down.configure_input(GpioDriver::input_pull_t::PULL_UP); g_btn_mid.configure_input(GpioDriver::input_pull_t::PULL_UP); g_btn_up.configure_input(GpioDriver::input_pull_t::PULL_UP); @@ -99,12 +78,13 @@ static IdleTask g_idle; }; g_btn_mgr.set_callback(Button::UP, callback); - g_test_uart.tx_blocking("Waiting for button press...\r\n"); Schedule::NextTime asap = Schedule::NextTime::asap(); g_sched.add_task(g_test_uart, asap); g_sched.add_task(g_btn_mgr, asap); g_sched.add_task(g_idle, asap); + + g_test_uart.tx_blocking("Waiting for button press...\r\n"); g_sched.run(); TEST_SPIN(); diff --git a/firmware/Test/pass.cpp b/firmware/Test/Apps/clock.cpp similarity index 74% rename from firmware/Test/pass.cpp rename to firmware/Test/Apps/clock.cpp index 6b715b4..87f6b7e 100644 --- a/firmware/Test/pass.cpp +++ b/firmware/Test/Apps/clock.cpp @@ -21,38 +21,37 @@ #include "printf.h" -#include "Bsp/LowPowerTaskScheduler.h" #include "Bsp/Drivers/GpioDriver.h" +#include "Bsp/Drivers/RtcDriver.h" #include "Bsp/Drivers/UsartDriver.h" +#include "Bsp/LowPowerTaskScheduler.h" #include "Bsp/macros.h" +#include "TestBoard.h" #include "test.h" -#include "Mcu.h" - using BSP::Time; - -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); -#endif +using BSP::time_t; [[noreturn]] void main() { - g_gpioa.enable(); - -#if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); -#endif - - g_test_uart.init(); + board_init(); g_test_uart.tx_blocking(test_start_text); - g_test_uart.tx_blocking("Test is executing...\r\n"); + + BSP::time_t now; + now = Test::get_time(); + BSP::time_t end = now + Time::seconds(10); + + g_test_uart.tx_blocking("GO\r\n"); + static char buffer[40] = { 0 }; + while (now < end) { + snprintf(buffer, sizeof(buffer), "%lld\r\n", BSP::Time::to_micros(now)); + g_test_uart.tx_blocking(buffer); + now = Test::get_time(); + } + g_test_uart.tx_blocking("STOP\r\n"); + g_test_uart.tx_blocking(test_pass_text); TEST_SPIN(); diff --git a/firmware/Test/fail.cpp b/firmware/Test/Apps/fail.cpp similarity index 69% rename from firmware/Test/fail.cpp rename to firmware/Test/Apps/fail.cpp index ec80d93..002008c 100644 --- a/firmware/Test/fail.cpp +++ b/firmware/Test/Apps/fail.cpp @@ -21,38 +21,17 @@ #include "printf.h" -#include "Bsp/LowPowerTaskScheduler.h" -#include "Bsp/Drivers/GpioDriver.h" -#include "Bsp/Drivers/UsartDriver.h" -#include "Bsp/macros.h" +#include "TestBoard.h" #include "test.h" -#include "Mcu.h" - -using BSP::Time; - -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); -#endif - [[noreturn]] void main() { - g_gpioa.enable(); - -#if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); -#endif - - g_test_uart.init(); + board_init(); g_test_uart.tx_blocking(test_start_text); g_test_uart.tx_blocking("Causing test failure...\r\n"); g_test_uart.tx_blocking(test_fail_text); + TEST_SPIN(); } diff --git a/firmware/Test/lptim.cpp b/firmware/Test/Apps/lptim.cpp similarity index 70% rename from firmware/Test/lptim.cpp rename to firmware/Test/Apps/lptim.cpp index d16832e..4aed10e 100644 --- a/firmware/Test/lptim.cpp +++ b/firmware/Test/Apps/lptim.cpp @@ -28,76 +28,52 @@ #include "Bsp/Drivers/LowPower.h" #include "Bsp/macros.h" +#include "TestBoard.h" #include "test.h" #include "Mcu.h" using BSP::Time; -using BSP::ReturnCode; -using BSP::SystemTimer; - -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -static BSP::GpioDriver g_gpiob(GPIOB); #if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); static BSP::LptimPwm g_test_lptim(LPTIM1); static BSP::GpioPin g_lptim_pin(g_gpioa, 7); #elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); +static BSP::GpioDriver g_gpiob(GPIOB); static BSP::LptimPwm g_test_lptim(LPTIM2); static BSP::GpioPin g_lptim_pin(g_gpiob, 2); #endif -static BSP::time_t get_time() { - BSP::time_t time; - ReturnCode rc = SystemTimer::get_time(time); - if (rc != ReturnCode::OK) { - g_test_uart.tx_blocking("Failed while getting the time\r\n"); - g_test_uart.tx_blocking(test_fail_text); - TEST_SPIN(); - } - return time; -} - [[noreturn]] void main() { - g_gpioa.enable(); - g_gpiob.enable(); + + board_init(); #if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); g_lptim_pin.configure_alternate_function(1); #elif defined(BOARD_DEVBOARD) + g_gpiob.enable(); g_lptim_pin.configure_alternate_function(1); #endif - // TODO: Fix LPTIM pin init for the L030 model - g_lptim_pin.configure_alternate_function(1); - - g_test_uart.init(); g_test_lptim.init(); - BSP::RtcDriver::init(); - SystemTimer::set_timer(BSP::RtcDriver::get_system_timer()); BSP::LowPower::init(); g_test_uart.tx_blocking(test_start_text); - BSP::time_t now = get_time(); + BSP::time_t now = Test::get_time(); BSP::time_t end = now + Time::seconds(3); g_test_uart.tx_blocking("Running...\r\n"); while (now < end) { - now = get_time(); + now = Test::get_time(); } g_test_uart.tx_blocking("Going to sleep...\r\n"); BSP::time_t delay = Time::seconds(3); BSP::RtcDriver::set_wakeup_in(delay); - end = get_time() + delay; - while (get_time() < end) { + end = Test::get_time() + delay; + while (Test::get_time() < end) { BSP::LowPower::stop(); } diff --git a/firmware/Test/no_start.cpp b/firmware/Test/Apps/no_start.cpp similarity index 100% rename from firmware/Test/no_start.cpp rename to firmware/Test/Apps/no_start.cpp diff --git a/firmware/Test/Apps/pass.cpp b/firmware/Test/Apps/pass.cpp new file mode 100644 index 0000000..2eb0fea --- /dev/null +++ b/firmware/Test/Apps/pass.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2020 Max Regan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "printf.h" + +#include "TestBoard.h" + +#include "test.h" + +[[noreturn]] void main() { + + board_init(); + + g_test_uart.tx_blocking(test_start_text); + g_test_uart.tx_blocking("Test is executing...\r\n"); + g_test_uart.tx_blocking(test_pass_text); + + TEST_SPIN(); +} diff --git a/firmware/Test/periodic_alarms.cpp b/firmware/Test/Apps/periodic_alarms.cpp similarity index 61% rename from firmware/Test/periodic_alarms.cpp rename to firmware/Test/Apps/periodic_alarms.cpp index 8440870..2333944 100644 --- a/firmware/Test/periodic_alarms.cpp +++ b/firmware/Test/Apps/periodic_alarms.cpp @@ -22,61 +22,23 @@ #include #include "printf.h" -#include "Bsp/Drivers/GpioDriver.h" #include "Bsp/Drivers/RtcDriver.h" -#include "Bsp/Drivers/UsartDriver.h" -#include "Bsp/Drivers/LowPower.h" -#include "Bsp/LowPowerTaskScheduler.h" -#include "Bsp/macros.h" +#include "TestBoard.h" #include "test.h" -#include "Mcu.h" - using BSP::Time; -using BSP::ReturnCode; -using BSP::SystemTimer; using BSP::time_t; -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); -#endif - -static time_t get_time() { - time_t time; - ReturnCode rc = SystemTimer::get_time(time); - if (rc != ReturnCode::OK) { - g_test_uart.tx_blocking("Failed while getting the time\r\n"); - g_test_uart.tx_blocking(test_fail_text); - TEST_SPIN(); - } - return time; -} - - [[noreturn]] void main() { - BSP::RtcDriver::init(); - SystemTimer::set_timer(BSP::RtcDriver::get_system_timer()); - BSP::LowPower::init(); + board_init(); - g_gpioa.enable(); - -#if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); -#endif - - g_test_uart.init(); g_test_uart.tx_blocking(test_start_text); - const time_t end = get_time() + Time::millis(5100); + const time_t end = Test::get_time() + Time::millis(5100); const uint32_t pre_alarms = BSP::RtcDriver::get_alarm_count(); - while (get_time() < end) {} + while (Test::get_time() < end) {} const uint32_t alarms = BSP::RtcDriver::get_alarm_count() - pre_alarms; static char buffer[128] = { 0 }; @@ -86,7 +48,7 @@ static time_t get_time() { g_test_uart.tx_blocking(buffer); if (alarms > 6 || alarms < 5) { - g_test_uart.tx_blocking(test_fail_text); + g_test_uart.tx_blocking(test_fail_text); } else { g_test_uart.tx_blocking(test_pass_text); } diff --git a/firmware/Test/set_time.cpp b/firmware/Test/Apps/set_time.cpp similarity index 78% rename from firmware/Test/set_time.cpp rename to firmware/Test/Apps/set_time.cpp index d00535a..072e5d5 100644 --- a/firmware/Test/set_time.cpp +++ b/firmware/Test/Apps/set_time.cpp @@ -21,16 +21,10 @@ #include "printf.h" -#include "Bsp/Drivers/GpioDriver.h" -#include "Bsp/Drivers/RtcDriver.h" -#include "Bsp/Drivers/UsartDriver.h" -#include "Bsp/LowPowerTaskScheduler.h" -#include "Bsp/macros.h" +#include "TestBoard.h" #include "test.h" -#include "Mcu.h" - using BSP::Time; using BSP::ReturnCode; using BSP::SystemTimer; @@ -38,14 +32,6 @@ using BSP::time_t; using BSP::WallClockTime; using BSP::RtcDriver; -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); -#endif static char buffer[128] = {0}; void run_case(unsigned int hours, unsigned int minutes, unsigned int seconds) { @@ -85,17 +71,7 @@ void run_case(unsigned int hours, unsigned int minutes, unsigned int seconds) { [[noreturn]] void main() { - RtcDriver::init(); - SystemTimer::set_timer(RtcDriver::get_system_timer()); - BSP::LowPower::init(); - - g_gpioa.enable(); - -#if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); -#endif - - g_test_uart.init(); + board_init(); g_test_uart.tx_blocking(test_start_text); diff --git a/firmware/Test/stop.cpp b/firmware/Test/Apps/stop.cpp similarity index 73% rename from firmware/Test/stop.cpp rename to firmware/Test/Apps/stop.cpp index c151bc8..57bd3e3 100644 --- a/firmware/Test/stop.cpp +++ b/firmware/Test/Apps/stop.cpp @@ -22,41 +22,17 @@ #include #include "printf.h" -#include "Bsp/Drivers/GpioDriver.h" #include "Bsp/Drivers/RtcDriver.h" -#include "Bsp/Drivers/UsartDriver.h" #include "Bsp/Drivers/LowPower.h" -#include "Bsp/LowPowerTaskScheduler.h" #include "Bsp/macros.h" +#include "TestBoard.h" + #include "test.h" -#include "Mcu.h" - using BSP::Time; -using BSP::ReturnCode; -using BSP::SystemTimer; using BSP::time_t; - -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); -#endif - -static time_t get_time() { - time_t time; - ReturnCode rc = SystemTimer::get_time(time); - if (rc != ReturnCode::OK) { - g_test_uart.tx_blocking("Failed while getting the time\r\n"); - g_test_uart.tx_blocking(test_fail_text); - TEST_SPIN(); - } - return time; -} +using BSP::ReturnCode; static void stop_for(time_t delay) { @@ -70,13 +46,13 @@ static void stop_for(time_t delay) { uint32_t pre_wakeups = BSP::RtcDriver::get_wakeup_count(); uint32_t pre_alarms = BSP::RtcDriver::get_alarm_count(); - time_t before = get_time(); + time_t before = Test::get_time(); while (pre_wakeups == BSP::RtcDriver::get_wakeup_count()) { BSP::LowPower::stop(); } - time_t after = get_time(); + time_t after = Test::get_time(); uint32_t post_wakeups = BSP::RtcDriver::get_wakeup_count(); uint32_t post_alarms = BSP::RtcDriver::get_alarm_count(); @@ -94,16 +70,9 @@ static void stop_for(time_t delay) { [[noreturn]] void main() { - BSP::RtcDriver::init(); - SystemTimer::set_timer(BSP::RtcDriver::get_system_timer()); + board_init(); BSP::LowPower::init(); - g_gpioa.enable(); -#if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); -#endif - g_test_uart.init(); - g_test_uart.tx_blocking(test_start_text); for (uint32_t i = 0; i <= 1000; i++) { diff --git a/firmware/Test/test.cpp b/firmware/Test/Apps/timeout.cpp similarity index 83% rename from firmware/Test/test.cpp rename to firmware/Test/Apps/timeout.cpp index 288b96a..2ff76bd 100644 --- a/firmware/Test/test.cpp +++ b/firmware/Test/Apps/timeout.cpp @@ -19,8 +19,18 @@ * THE SOFTWARE. */ +#include "printf.h" + +#include "TestBoard.h" + #include "test.h" -const char *test_start_text = "TEST_BEGIN\r\n"; -const char *test_fail_text = "TEST_FAIL\r\n"; -const char *test_pass_text = "TEST_PASS\r\n"; +[[noreturn]] void main() { + + board_init(); + + g_test_uart.tx_blocking(test_start_text); + g_test_uart.tx_blocking("Causing test timeout...\r\n"); + + TEST_SPIN(); +} diff --git a/firmware/Test/clock.cpp b/firmware/Test/Apps/wakeup_irq.cpp similarity index 52% rename from firmware/Test/clock.cpp rename to firmware/Test/Apps/wakeup_irq.cpp index b8fa2da..5f9d63b 100644 --- a/firmware/Test/clock.cpp +++ b/firmware/Test/Apps/wakeup_irq.cpp @@ -19,70 +19,50 @@ * THE SOFTWARE. */ +#include #include "printf.h" -#include "Bsp/Drivers/GpioDriver.h" #include "Bsp/Drivers/RtcDriver.h" -#include "Bsp/Drivers/UsartDriver.h" -#include "Bsp/LowPowerTaskScheduler.h" -#include "Bsp/macros.h" +#include "TestBoard.h" #include "test.h" -#include "Mcu.h" - -using BSP::Time; using BSP::ReturnCode; -using BSP::SystemTimer; +using BSP::Time; +using BSP::time_t; -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); -#endif +static void fail_if_wakeup(time_t delay) { + uint32_t pre_wakeups = BSP::RtcDriver::get_wakeup_count(); + time_t before = Test::get_time(); + while (before + delay > Test::get_time() && BSP::RtcDriver::get_wakeup_count() == pre_wakeups) {} -static BSP::time_t get_time() { - BSP::time_t time; - BSP::ReturnCode rc = SystemTimer::get_time(time); - if (rc != ReturnCode::OK) { - g_test_uart.tx_blocking("Failed while getting the time\r\n"); + if (BSP::RtcDriver::get_wakeup_count() != pre_wakeups) { + g_test_uart.tx_blocking("Got unexpected wakeup IRQ\r\n"); g_test_uart.tx_blocking(test_fail_text); TEST_SPIN(); } - return time; } [[noreturn]] void main() { - g_gpioa.enable(); - -#if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); -#endif - - g_test_uart.init(); + board_init(); g_test_uart.tx_blocking(test_start_text); - BSP::RtcDriver::init(); - SystemTimer::set_timer(BSP::RtcDriver::get_system_timer()); - BSP::LowPower::init(); - - BSP::time_t now; - - now = get_time(); - BSP::time_t end = now + Time::seconds(10); - g_test_uart.tx_blocking("GO\r\n"); - static char buffer[40] = { 0 }; - while (now < end) { - snprintf(buffer, sizeof(buffer), "%lld\r\n", BSP::Time::to_micros(now)); - g_test_uart.tx_blocking(buffer); - now = get_time(); + for (uint32_t i = 0; i <= 100; i++) { + Test::stop_for(Time::millis(5)); } - g_test_uart.tx_blocking("STOP\r\n"); + + for (uint32_t delay_millis = 4; delay_millis <= 1024; delay_millis *= 2) { + Test::stop_for(Time::millis(delay_millis)); + } + + Test::stop_for(Time::seconds(2)); + Test::stop_for(Time::seconds(4)); + + Test::stop_for(Time::millis(5)); + fail_if_wakeup(Time::seconds(1)); + g_test_uart.tx_blocking(test_pass_text); TEST_SPIN(); diff --git a/firmware/Test/Board/devboard.cpp b/firmware/Test/Board/devboard.cpp new file mode 100644 index 0000000..f280006 --- /dev/null +++ b/firmware/Test/Board/devboard.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2020 Max Regan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "Bsp/Drivers/GpioDriver.h" +#include "Bsp/Drivers/RtcDriver.h" + +#include "Mcu.h" +#include "TestBoard.h" + +using namespace BSP; +using namespace BSP::Schedule; + +LowPowerTaskScheduler<10> g_sched; +GpioDriver g_gpioa(GPIOA); +UsartDriver g_test_uart(USART1, g_sched); + +void board_init() { + g_gpioa.enable(); + g_test_uart.init(); + + RtcDriver::init(); + SystemTimer::set_timer(RtcDriver::get_system_timer()); +} diff --git a/firmware/Test/timeout.cpp b/firmware/Test/Board/watch.cpp similarity index 66% rename from firmware/Test/timeout.cpp rename to firmware/Test/Board/watch.cpp index e527c5e..5106148 100644 --- a/firmware/Test/timeout.cpp +++ b/firmware/Test/Board/watch.cpp @@ -19,39 +19,25 @@ * THE SOFTWARE. */ -#include "printf.h" - -#include "Bsp/LowPowerTaskScheduler.h" #include "Bsp/Drivers/GpioDriver.h" -#include "Bsp/Drivers/UsartDriver.h" -#include "Bsp/macros.h" - -#include "test.h" +#include "Bsp/Drivers/RtcDriver.h" #include "Mcu.h" +#include "TestBoard.h" -using BSP::Time; +using namespace BSP; +using namespace BSP::Schedule; -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); -#endif - -[[noreturn]] void main() { +LowPowerTaskScheduler<10> g_sched; +GpioDriver g_gpioa(GPIOA); +UsartDriver g_test_uart(USART2, g_sched); +static GpioPin g_tx_pin(g_gpioa, 9); +void board_init() { g_gpioa.enable(); - -#if defined(BOARD_WATCH) g_tx_pin.configure_alternate_function(4); -#endif - g_test_uart.init(); - g_test_uart.tx_blocking(test_start_text); - g_test_uart.tx_blocking("Causing test timeout...\r\n"); - TEST_SPIN(); + RtcDriver::init(); + SystemTimer::set_timer(RtcDriver::get_system_timer()); } diff --git a/firmware/Test/Common/TestBoard.h b/firmware/Test/Common/TestBoard.h new file mode 100644 index 0000000..17c254d --- /dev/null +++ b/firmware/Test/Common/TestBoard.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2020 Max Regan + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#pragma once + +#include "Bsp/LowPowerTaskScheduler.h" +#include "Bsp/Drivers/GpioDriver.h" +#include "Bsp/Drivers/UsartDriver.h" + +void board_init(); + +extern BSP::Schedule::LowPowerTaskScheduler<10> g_sched; +extern BSP::GpioDriver g_gpioa; +extern BSP::UsartDriver g_test_uart; diff --git a/firmware/Test/wakeup_irq.cpp b/firmware/Test/Common/test.cpp similarity index 58% rename from firmware/Test/wakeup_irq.cpp rename to firmware/Test/Common/test.cpp index b39687c..a24b0d7 100644 --- a/firmware/Test/wakeup_irq.cpp +++ b/firmware/Test/Common/test.cpp @@ -20,33 +20,25 @@ */ #include -#include "printf.h" -#include "Bsp/Drivers/GpioDriver.h" -#include "Bsp/Drivers/RtcDriver.h" -#include "Bsp/Drivers/UsartDriver.h" -#include "Bsp/LowPowerTaskScheduler.h" -#include "Bsp/macros.h" +#include "Bsp/SystemTime.h" +#include "TestBoard.h" #include "test.h" - -#include "Mcu.h" +#include "printf.h" using BSP::Time; using BSP::ReturnCode; using BSP::SystemTimer; using BSP::time_t; -static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; -static BSP::GpioDriver g_gpioa(GPIOA); -#if defined(BOARD_WATCH) -static BSP::UsartDriver g_test_uart(USART2, g_sched); -static BSP::GpioPin g_tx_pin(g_gpioa, 9); -#elif defined(BOARD_DEVBOARD) -static BSP::UsartDriver g_test_uart(USART1, g_sched); -#endif +const char *test_start_text = "TEST_BEGIN\r\n"; +const char *test_fail_text = "TEST_FAIL\r\n"; +const char *test_pass_text = "TEST_PASS\r\n"; -static time_t get_time() { +namespace Test { + +time_t get_time() { time_t time; ReturnCode rc = SystemTimer::get_time(time); if (rc != ReturnCode::OK) { @@ -57,8 +49,7 @@ static time_t get_time() { return time; } -static void stop_for(time_t delay) { - +void stop_for(time_t delay) { ReturnCode rc = BSP::RtcDriver::set_wakeup_in(delay); if (rc != ReturnCode::OK) { g_test_uart.tx_blocking("Failed to set wakeup delay\r\n"); @@ -84,47 +75,4 @@ static void stop_for(time_t delay) { g_test_uart.tx_blocking(buffer); } -static void fail_if_wakeup(time_t delay) { - uint32_t pre_wakeups = BSP::RtcDriver::get_wakeup_count(); - time_t before = get_time(); - while (before + delay > get_time() && BSP::RtcDriver::get_wakeup_count() == pre_wakeups) {} - - if (BSP::RtcDriver::get_wakeup_count() != pre_wakeups) { - g_test_uart.tx_blocking("Got unexpected wakeup IRQ\r\n"); - g_test_uart.tx_blocking(test_fail_text); - TEST_SPIN(); - } -} - -[[noreturn]] void main() { - - BSP::RtcDriver::init(); - SystemTimer::set_timer(BSP::RtcDriver::get_system_timer()); - - g_gpioa.enable(); - -#if defined(BOARD_WATCH) - g_tx_pin.configure_alternate_function(4); -#endif - - g_test_uart.init(); - g_test_uart.tx_blocking(test_start_text); - - for (uint32_t i = 0; i <= 100; i++) { - stop_for(Time::millis(5)); - } - - for (uint32_t delay_millis = 4; delay_millis <= 1024; delay_millis *= 2) { - stop_for(Time::millis(delay_millis)); - } - - stop_for(Time::seconds(2)); - stop_for(Time::seconds(4)); - - stop_for(Time::millis(5)); - fail_if_wakeup(Time::seconds(1)); - - g_test_uart.tx_blocking(test_pass_text); - - TEST_SPIN(); } diff --git a/firmware/Test/test.h b/firmware/Test/Common/test.h similarity index 92% rename from firmware/Test/test.h rename to firmware/Test/Common/test.h index 0ab6072..e438c16 100644 --- a/firmware/Test/test.h +++ b/firmware/Test/Common/test.h @@ -21,8 +21,15 @@ #pragma once +#include "Bsp/Time.h" + extern const char *test_start_text; extern const char *test_fail_text; extern const char *test_pass_text; #define TEST_SPIN() do {} while (1) + +namespace Test { + BSP::time_t get_time(); + void stop_for(BSP::time_t delay); +} diff --git a/test/src/tr_test/test.py b/test/src/tr_test/test.py index f1d4635..bc76c53 100755 --- a/test/src/tr_test/test.py +++ b/test/src/tr_test/test.py @@ -103,28 +103,28 @@ def context_factory(): def test_meta_pass(context_factory, logger): - serial_dev, jlink = context_factory("Test/pass.bin") + serial_dev, jlink = context_factory("Test/Apps/pass.bin") text = serial_dev.read_until(TEST_PASS_TEXT) print("Got serial output: {}".format(text)) assert text.endswith(TEST_PASS_TEXT) def test_meta_fail(context_factory, logger): - serial_dev, jlink = context_factory("Test/fail.bin") + serial_dev, jlink = context_factory("Test/Apps/fail.bin") text = serial_dev.read_until(TEST_PASS_TEXT) print("Got serial output: {}".format(text)) assert not text.endswith(TEST_PASS_TEXT) def test_meta_timeout(context_factory, logger): - serial_dev, jlink = context_factory("Test/timeout.bin") + serial_dev, jlink = context_factory("Test/Apps/timeout.bin") text = serial_dev.read_until(TEST_PASS_TEXT) assert not text.endswith(TEST_PASS_TEXT) def test_meta_nostart(context_factory, logger): with pytest.raises(AssertionError): - serial_dev, jlink = context_factory("Test/no_start.bin") + serial_dev, jlink = context_factory("Test/Apps/no_start.bin") def test_watch(context_factory, logger): @@ -133,22 +133,68 @@ def test_watch(context_factory, logger): def test_set_time(context_factory, logger): - serial_dev, jlink = context_factory("Test/set_time.bin") + serial_dev, jlink = context_factory("Test/Apps/set_time.bin") text = serial_dev.read_until(TEST_PASS_TEXT) print("Text:", text.decode()) assert text.endswith(TEST_PASS_TEXT) def test_periodic_alarms(context_factory, logger): - serial_dev, jlink = context_factory("Test/periodic_alarms.bin") + serial_dev, jlink = context_factory("Test/Apps/periodic_alarms.bin") serial_dev.timeout = 6 text = serial_dev.read_until(TEST_PASS_TEXT) print("Text:", text.decode()) assert text.endswith(TEST_PASS_TEXT) +def test_button_slow(context_factory, logger): + serial_dev, jlink = context_factory("Test/Apps/button.bin") + serial_dev.timeout = 0.3 + ASSERTED = True + + serial_dev.dtr = not ASSERTED + while (line := serial_dev.readline()) is not None and len(line) > 0: + pass + + for _ in range(5): + serial_dev.dtr = ASSERTED + press_line = serial_dev.readline() + serial_dev.dtr = not ASSERTED + release_line = serial_dev.readline() + assert press_line == b"up:pressed\r\n" + assert release_line == b"up:released\r\n" + + +def test_button_fast(context_factory, logger): + serial_dev, jlink = context_factory("Test/Apps/button.bin") + serial_dev.timeout = 0.3 + ASSERTED = True + + serial_dev.dtr = not ASSERTED + time.sleep(0.3) + serial_dev.timeout = 0 + while (line := serial_dev.readline()) is not None and len(line) > 0: + pass + + for _ in range(25): + serial_dev.dtr = ASSERTED + time.sleep(0.075) + serial_dev.dtr = not ASSERTED + time.sleep(0.075) + + serial_dev.timeout = 0.3 + for _ in range(25): + press_line = serial_dev.readline() + release_line = serial_dev.readline() + assert press_line == b"up:pressed\r\n" + assert release_line == b"up:released\r\n" + + serial_dev.timeout = 0 + assert serial_dev.readline() == b"" + + def test_clock(context_factory, logger): - serial_dev, jlink = context_factory("Test/clock.bin") + serial_dev, jlink = context_factory("Test/Apps/clock.bin") EXPECTED_RUNTIME = 10 TOLERANCE = 0.2 @@ -180,7 +226,7 @@ def test_clock(context_factory, logger): def test_wakeup_irq(context_factory, logger): - serial_dev, jlink = context_factory("Test/wakeup_irq.bin") + serial_dev, jlink = context_factory("Test/Apps/wakeup_irq.bin") serial_dev.timeout = 65 pattern = re.compile("Requested=(\\d*) Actual=(\\d*) Wakeups=(\\d*)") @@ -207,7 +253,7 @@ def test_wakeup_irq(context_factory, logger): def test_stop(context_factory, logger): - serial_dev, jlink = context_factory("Test/stop.bin") + serial_dev, jlink = context_factory("Test/Apps/stop.bin") serial_dev.timeout = 70 pattern = re.compile("Requested=(\\d*) Actual=(\\d*)") @@ -279,7 +325,7 @@ def measure_frequency( def test_lptim(context_factory, logger): - serial_dev, jlink = context_factory("Test/lptim.bin") + serial_dev, jlink = context_factory("Test/Apps/lptim.bin") state0_periods, state1_periods = measure_frequency(1, "D0") num_periods = min(len(state0_periods), len(state1_periods)) periods = [state0_periods[i] + state1_periods[i] for i in range(num_periods)] @@ -297,52 +343,6 @@ def test_lptim(context_factory, logger): assert max_f < 51 -def test_button_slow(context_factory, logger): - serial_dev, jlink = context_factory("Test/button.bin") - serial_dev.timeout = 0.3 - ASSERTED = True - - serial_dev.dtr = not ASSERTED - while (line := serial_dev.readline()) is not None and len(line) > 0: - pass - - for _ in range(5): - serial_dev.dtr = ASSERTED - press_line = serial_dev.readline() - serial_dev.dtr = not ASSERTED - release_line = serial_dev.readline() - assert press_line == b"up:pressed\r\n" - assert release_line == b"up:released\r\n" - - -def test_button_fast(context_factory, logger): - serial_dev, jlink = context_factory("Test/button.bin") - serial_dev.timeout = 0.3 - ASSERTED = True - - serial_dev.dtr = not ASSERTED - time.sleep(0.3) - serial_dev.timeout = 0 - while (line := serial_dev.readline()) is not None and len(line) > 0: - pass - - for _ in range(25): - serial_dev.dtr = ASSERTED - time.sleep(0.075) - serial_dev.dtr = not ASSERTED - time.sleep(0.075) - - serial_dev.timeout = 0.3 - for _ in range(25): - press_line = serial_dev.readline() - release_line = serial_dev.readline() - assert press_line == b"up:pressed\r\n" - assert release_line == b"up:released\r\n" - - serial_dev.timeout = 0 - assert serial_dev.readline() == b"" - - def main(): pytest.main(sys.argv)