Clean up test code
Separate/consolidate board initialization code, and a few functions that are shared across tests. Update the Makefile accordingly. Resolves #18
This commit is contained in:
@@ -8,8 +8,8 @@ variables:
|
|||||||
- make -C ./firmware/
|
- make -C ./firmware/
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- "firmware/Test/*.elf"
|
- "firmware/Test/Apps/*.elf"
|
||||||
- "firmware/Test/*.bin"
|
- "firmware/Test/Apps/*.bin"
|
||||||
- "firmware/Application/*.elf"
|
- "firmware/Application/*.elf"
|
||||||
- "firmware/Application/*.bin"
|
- "firmware/Application/*.bin"
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ test-watch:
|
|||||||
- privileged
|
- privileged
|
||||||
image: registry.gitlab.maxregan.me/max/timely-reference/test-exec
|
image: registry.gitlab.maxregan.me/max/timely-reference/test-exec
|
||||||
script:
|
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:
|
artifacts:
|
||||||
reports:
|
reports:
|
||||||
junit: test-report.xml
|
junit: test-report.xml
|
||||||
|
|||||||
@@ -77,25 +77,41 @@ FONT_GEN_DIR := build/gen/fonts
|
|||||||
FONT_C_FILES := $(patsubst %,$(FONT_GEN_DIR)/%.c,$(FONTS))
|
FONT_C_FILES := $(patsubst %,$(FONT_GEN_DIR)/%.c,$(FONTS))
|
||||||
FONT_H_FILES := $(patsubst %,$(FONT_GEN_DIR)/%.h,$(FONTS))
|
FONT_H_FILES := $(patsubst %,$(FONT_GEN_DIR)/%.h,$(FONTS))
|
||||||
|
|
||||||
C_SOURCES := $(call find_important, $(SOURCEDIR), '*.c') $(FONT_C_FILES)
|
BSP_SRC_DIR := ./Bsp/
|
||||||
CXX_SOURCES := $(call find_important, $(SOURCEDIR), '*.cpp')
|
APP_SRC_DIR := ./Application/
|
||||||
S_SOURCES := $(call find_important, $(SOURCEDIR), '*.s')
|
TEST_APP_SRC_DIR := ./Test/Apps/
|
||||||
SPP_SOURCES := Bsp/Mcu/$(DEVICE_TYPE).S
|
TEST_COMMON_SRC_DIR:= ./Test/Common/
|
||||||
SOURCES = $(C_SOURCES) $(S_SOURCES) $(SPP_SOURCES) $(CPP_SOURCES)
|
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
|
COMMON_SRC_DIRS := $(BSP_SRC_DIR) $(APP_SRC_DIR) $(TEST_COMMON_SRC_DIR) $(THIRD_PARTY_SRC_DIR)
|
||||||
APP_ELFS = $(addsuffix .elf, $(APPS))
|
|
||||||
APP_MAPS = $(addsuffix .map, $(APPS))
|
C_SOURCES := $(call find_important, $(COMMON_SRC_DIRS), '*.c') $(FONT_C_FILES)
|
||||||
APP_BINS = $(addsuffix .bin, $(APPS))
|
CXX_SOURCES := $(call find_important, $(COMMON_SRC_DIRS), '*.cpp')
|
||||||
APP_OBJS = $(addsuffix .o, $(APPS))
|
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))
|
C_OBJS := $(patsubst %.c,%.o,$(C_SOURCES))
|
||||||
CXX_OBJS := $(patsubst %.cpp,%.o,$(CXX_SOURCES))
|
CXX_OBJS := $(patsubst %.cpp,%.o,$(CXX_SOURCES))
|
||||||
S_OBJS := $(patsubst %.s,%.o,$(S_SOURCES))
|
S_OBJS := $(patsubst %.s,%.o,$(S_SOURCES))
|
||||||
SPP_OBJS := $(patsubst %.S,%.o,$(SPP_SOURCES))
|
SPP_OBJS := $(patsubst %.S,%.o,$(SPP_SOURCES))
|
||||||
ALL_OBJS = $(C_OBJS) $(S_OBJS) $(SPP_OBJS) $(CXX_OBJS)
|
ALL_OBJS := $(C_OBJS) $(S_OBJS) $(SPP_OBJS) $(CXX_OBJS)
|
||||||
OBJS = $(filter-out $(APP_OBJS), $(ALL_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
|
LINKER_SCRIPT ?= Bsp/Mcu/$(DEVICE_TYPE).ld
|
||||||
|
|
||||||
OUTPUT_NAME ?= Application/main
|
OUTPUT_NAME ?= Application/main
|
||||||
@@ -142,6 +158,7 @@ CFLAGS += -I./ThirdParty/stm32/$(DEVICE_LINE)/Include
|
|||||||
CFLAGS += -I./ThirdParty/CMSIS/Core/Include
|
CFLAGS += -I./ThirdParty/CMSIS/Core/Include
|
||||||
CFLAGS += -I./ThirdParty/printf
|
CFLAGS += -I./ThirdParty/printf
|
||||||
CFLAGS += -I./build/gen/
|
CFLAGS += -I./build/gen/
|
||||||
|
CFLAGS += -I./Test/Common/
|
||||||
CFLAGS += -I.
|
CFLAGS += -I.
|
||||||
|
|
||||||
CXX_FLAGS += -std=c++14 -fno-exceptions -fno-rtti -fno-use-cxa-atexit
|
CXX_FLAGS += -std=c++14 -fno-exceptions -fno-rtti -fno-use-cxa-atexit
|
||||||
@@ -180,7 +197,7 @@ $(info ================================)
|
|||||||
# Default Target
|
# Default Target
|
||||||
#
|
#
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build: $(APP_BINS)
|
build: $(APP_BINS) $(TEST_APP_BINS)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Build Logic
|
# Build Logic
|
||||||
@@ -214,9 +231,13 @@ $(FONT_GEN_DIR)/large_digits.h $(FONT_GEN_DIR)/large_digits.c: Gen/fixedfont-to-
|
|||||||
@echo "OBJCOPY $@"
|
@echo "OBJCOPY $@"
|
||||||
@$(OBJCOPY) -O binary $^ $@
|
@$(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 $@"
|
@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
|
# Utilities
|
||||||
@@ -237,7 +258,10 @@ jlink: $(OUTPUT_BIN)
|
|||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
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.
|
# Please do not delete my files.
|
||||||
|
|||||||
@@ -20,31 +20,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Bsp/Drivers/GpioDriver.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 "Application/ButtonManager.h"
|
#include "Application/ButtonManager.h"
|
||||||
|
|
||||||
|
#include "TestBoard.h"
|
||||||
|
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "Mcu.h"
|
|
||||||
|
|
||||||
using namespace BSP;
|
using namespace BSP;
|
||||||
|
|
||||||
using Button = ButtonManager::Button;
|
using Button = ButtonManager::Button;
|
||||||
using ButtonState = ButtonManager::ButtonState;
|
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_down(g_gpioa, 0);
|
||||||
static GpioPin g_btn_mid(g_gpioa, 1);
|
static GpioPin g_btn_mid(g_gpioa, 1);
|
||||||
static GpioPin g_btn_up(g_gpioa, 2);
|
static GpioPin g_btn_up(g_gpioa, 2);
|
||||||
@@ -69,19 +57,10 @@ static IdleTask g_idle;
|
|||||||
|
|
||||||
[[noreturn]] void main() {
|
[[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);
|
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_down.configure_input(GpioDriver::input_pull_t::PULL_UP);
|
||||||
g_btn_mid.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);
|
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_btn_mgr.set_callback(Button::UP, callback);
|
||||||
g_test_uart.tx_blocking("Waiting for button press...\r\n");
|
|
||||||
|
|
||||||
Schedule::NextTime asap = Schedule::NextTime::asap();
|
Schedule::NextTime asap = Schedule::NextTime::asap();
|
||||||
g_sched.add_task(g_test_uart, asap);
|
g_sched.add_task(g_test_uart, asap);
|
||||||
g_sched.add_task(g_btn_mgr, asap);
|
g_sched.add_task(g_btn_mgr, asap);
|
||||||
g_sched.add_task(g_idle, asap);
|
g_sched.add_task(g_idle, asap);
|
||||||
|
|
||||||
|
g_test_uart.tx_blocking("Waiting for button press...\r\n");
|
||||||
g_sched.run();
|
g_sched.run();
|
||||||
|
|
||||||
TEST_SPIN();
|
TEST_SPIN();
|
||||||
@@ -21,38 +21,37 @@
|
|||||||
|
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
|
|
||||||
#include "Bsp/LowPowerTaskScheduler.h"
|
|
||||||
#include "Bsp/Drivers/GpioDriver.h"
|
#include "Bsp/Drivers/GpioDriver.h"
|
||||||
|
#include "Bsp/Drivers/RtcDriver.h"
|
||||||
#include "Bsp/Drivers/UsartDriver.h"
|
#include "Bsp/Drivers/UsartDriver.h"
|
||||||
|
#include "Bsp/LowPowerTaskScheduler.h"
|
||||||
#include "Bsp/macros.h"
|
#include "Bsp/macros.h"
|
||||||
|
|
||||||
|
#include "TestBoard.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "Mcu.h"
|
|
||||||
|
|
||||||
using BSP::Time;
|
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
|
|
||||||
|
|
||||||
[[noreturn]] void main() {
|
[[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);
|
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);
|
g_test_uart.tx_blocking(test_pass_text);
|
||||||
|
|
||||||
TEST_SPIN();
|
TEST_SPIN();
|
||||||
@@ -21,38 +21,17 @@
|
|||||||
|
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
|
|
||||||
#include "Bsp/LowPowerTaskScheduler.h"
|
#include "TestBoard.h"
|
||||||
#include "Bsp/Drivers/GpioDriver.h"
|
|
||||||
#include "Bsp/Drivers/UsartDriver.h"
|
|
||||||
#include "Bsp/macros.h"
|
|
||||||
|
|
||||||
#include "test.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() {
|
[[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);
|
g_test_uart.tx_blocking(test_start_text);
|
||||||
g_test_uart.tx_blocking("Causing test failure...\r\n");
|
g_test_uart.tx_blocking("Causing test failure...\r\n");
|
||||||
g_test_uart.tx_blocking(test_fail_text);
|
g_test_uart.tx_blocking(test_fail_text);
|
||||||
|
|
||||||
TEST_SPIN();
|
TEST_SPIN();
|
||||||
}
|
}
|
||||||
@@ -28,76 +28,52 @@
|
|||||||
#include "Bsp/Drivers/LowPower.h"
|
#include "Bsp/Drivers/LowPower.h"
|
||||||
#include "Bsp/macros.h"
|
#include "Bsp/macros.h"
|
||||||
|
|
||||||
|
#include "TestBoard.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "Mcu.h"
|
#include "Mcu.h"
|
||||||
|
|
||||||
using BSP::Time;
|
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)
|
#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::LptimPwm g_test_lptim(LPTIM1);
|
||||||
static BSP::GpioPin g_lptim_pin(g_gpioa, 7);
|
static BSP::GpioPin g_lptim_pin(g_gpioa, 7);
|
||||||
#elif defined(BOARD_DEVBOARD)
|
#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::LptimPwm g_test_lptim(LPTIM2);
|
||||||
static BSP::GpioPin g_lptim_pin(g_gpiob, 2);
|
static BSP::GpioPin g_lptim_pin(g_gpiob, 2);
|
||||||
#endif
|
#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() {
|
[[noreturn]] void main() {
|
||||||
|
|
||||||
g_gpioa.enable();
|
|
||||||
g_gpiob.enable();
|
board_init();
|
||||||
|
|
||||||
#if defined(BOARD_WATCH)
|
#if defined(BOARD_WATCH)
|
||||||
g_tx_pin.configure_alternate_function(4);
|
|
||||||
g_lptim_pin.configure_alternate_function(1);
|
g_lptim_pin.configure_alternate_function(1);
|
||||||
#elif defined(BOARD_DEVBOARD)
|
#elif defined(BOARD_DEVBOARD)
|
||||||
|
g_gpiob.enable();
|
||||||
g_lptim_pin.configure_alternate_function(1);
|
g_lptim_pin.configure_alternate_function(1);
|
||||||
#endif
|
#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();
|
g_test_lptim.init();
|
||||||
|
|
||||||
BSP::RtcDriver::init();
|
|
||||||
SystemTimer::set_timer(BSP::RtcDriver::get_system_timer());
|
|
||||||
BSP::LowPower::init();
|
BSP::LowPower::init();
|
||||||
|
|
||||||
g_test_uart.tx_blocking(test_start_text);
|
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);
|
BSP::time_t end = now + Time::seconds(3);
|
||||||
g_test_uart.tx_blocking("Running...\r\n");
|
g_test_uart.tx_blocking("Running...\r\n");
|
||||||
while (now < end) {
|
while (now < end) {
|
||||||
now = get_time();
|
now = Test::get_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
g_test_uart.tx_blocking("Going to sleep...\r\n");
|
g_test_uart.tx_blocking("Going to sleep...\r\n");
|
||||||
BSP::time_t delay = Time::seconds(3);
|
BSP::time_t delay = Time::seconds(3);
|
||||||
BSP::RtcDriver::set_wakeup_in(delay);
|
BSP::RtcDriver::set_wakeup_in(delay);
|
||||||
end = get_time() + delay;
|
end = Test::get_time() + delay;
|
||||||
while (get_time() < end) {
|
while (Test::get_time() < end) {
|
||||||
BSP::LowPower::stop();
|
BSP::LowPower::stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
37
firmware/Test/Apps/pass.cpp
Normal file
37
firmware/Test/Apps/pass.cpp
Normal file
@@ -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();
|
||||||
|
}
|
||||||
@@ -22,61 +22,23 @@
|
|||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
|
|
||||||
#include "Bsp/Drivers/GpioDriver.h"
|
|
||||||
#include "Bsp/Drivers/RtcDriver.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 "test.h"
|
||||||
|
|
||||||
#include "Mcu.h"
|
|
||||||
|
|
||||||
using BSP::Time;
|
using BSP::Time;
|
||||||
using BSP::ReturnCode;
|
|
||||||
using BSP::SystemTimer;
|
|
||||||
using BSP::time_t;
|
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() {
|
[[noreturn]] void main() {
|
||||||
|
|
||||||
BSP::RtcDriver::init();
|
board_init();
|
||||||
SystemTimer::set_timer(BSP::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();
|
|
||||||
g_test_uart.tx_blocking(test_start_text);
|
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();
|
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;
|
const uint32_t alarms = BSP::RtcDriver::get_alarm_count() - pre_alarms;
|
||||||
|
|
||||||
static char buffer[128] = { 0 };
|
static char buffer[128] = { 0 };
|
||||||
@@ -21,16 +21,10 @@
|
|||||||
|
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
|
|
||||||
#include "Bsp/Drivers/GpioDriver.h"
|
#include "TestBoard.h"
|
||||||
#include "Bsp/Drivers/RtcDriver.h"
|
|
||||||
#include "Bsp/Drivers/UsartDriver.h"
|
|
||||||
#include "Bsp/LowPowerTaskScheduler.h"
|
|
||||||
#include "Bsp/macros.h"
|
|
||||||
|
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "Mcu.h"
|
|
||||||
|
|
||||||
using BSP::Time;
|
using BSP::Time;
|
||||||
using BSP::ReturnCode;
|
using BSP::ReturnCode;
|
||||||
using BSP::SystemTimer;
|
using BSP::SystemTimer;
|
||||||
@@ -38,14 +32,6 @@ using BSP::time_t;
|
|||||||
using BSP::WallClockTime;
|
using BSP::WallClockTime;
|
||||||
using BSP::RtcDriver;
|
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};
|
static char buffer[128] = {0};
|
||||||
|
|
||||||
void run_case(unsigned int hours, unsigned int minutes, unsigned int seconds) {
|
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() {
|
[[noreturn]] void main() {
|
||||||
|
|
||||||
RtcDriver::init();
|
board_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();
|
|
||||||
|
|
||||||
g_test_uart.tx_blocking(test_start_text);
|
g_test_uart.tx_blocking(test_start_text);
|
||||||
|
|
||||||
@@ -22,41 +22,17 @@
|
|||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
|
|
||||||
#include "Bsp/Drivers/GpioDriver.h"
|
|
||||||
#include "Bsp/Drivers/RtcDriver.h"
|
#include "Bsp/Drivers/RtcDriver.h"
|
||||||
#include "Bsp/Drivers/UsartDriver.h"
|
|
||||||
#include "Bsp/Drivers/LowPower.h"
|
#include "Bsp/Drivers/LowPower.h"
|
||||||
#include "Bsp/LowPowerTaskScheduler.h"
|
|
||||||
#include "Bsp/macros.h"
|
#include "Bsp/macros.h"
|
||||||
|
|
||||||
|
#include "TestBoard.h"
|
||||||
|
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#include "Mcu.h"
|
|
||||||
|
|
||||||
using BSP::Time;
|
using BSP::Time;
|
||||||
using BSP::ReturnCode;
|
|
||||||
using BSP::SystemTimer;
|
|
||||||
using BSP::time_t;
|
using BSP::time_t;
|
||||||
|
using BSP::ReturnCode;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void stop_for(time_t delay) {
|
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_wakeups = BSP::RtcDriver::get_wakeup_count();
|
||||||
uint32_t pre_alarms = BSP::RtcDriver::get_alarm_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()) {
|
while (pre_wakeups == BSP::RtcDriver::get_wakeup_count()) {
|
||||||
BSP::LowPower::stop();
|
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_wakeups = BSP::RtcDriver::get_wakeup_count();
|
||||||
uint32_t post_alarms = BSP::RtcDriver::get_alarm_count();
|
uint32_t post_alarms = BSP::RtcDriver::get_alarm_count();
|
||||||
|
|
||||||
@@ -94,16 +70,9 @@ static void stop_for(time_t delay) {
|
|||||||
|
|
||||||
[[noreturn]] void main() {
|
[[noreturn]] void main() {
|
||||||
|
|
||||||
BSP::RtcDriver::init();
|
board_init();
|
||||||
SystemTimer::set_timer(BSP::RtcDriver::get_system_timer());
|
|
||||||
BSP::LowPower::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);
|
g_test_uart.tx_blocking(test_start_text);
|
||||||
|
|
||||||
for (uint32_t i = 0; i <= 1000; i++) {
|
for (uint32_t i = 0; i <= 1000; i++) {
|
||||||
@@ -19,8 +19,18 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "printf.h"
|
||||||
|
|
||||||
|
#include "TestBoard.h"
|
||||||
|
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
const char *test_start_text = "TEST_BEGIN\r\n";
|
[[noreturn]] void main() {
|
||||||
const char *test_fail_text = "TEST_FAIL\r\n";
|
|
||||||
const char *test_pass_text = "TEST_PASS\r\n";
|
board_init();
|
||||||
|
|
||||||
|
g_test_uart.tx_blocking(test_start_text);
|
||||||
|
g_test_uart.tx_blocking("Causing test timeout...\r\n");
|
||||||
|
|
||||||
|
TEST_SPIN();
|
||||||
|
}
|
||||||
@@ -19,70 +19,50 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <cinttypes>
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
|
|
||||||
#include "Bsp/Drivers/GpioDriver.h"
|
|
||||||
#include "Bsp/Drivers/RtcDriver.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 "test.h"
|
||||||
|
|
||||||
#include "Mcu.h"
|
|
||||||
|
|
||||||
using BSP::Time;
|
|
||||||
using BSP::ReturnCode;
|
using BSP::ReturnCode;
|
||||||
using BSP::SystemTimer;
|
using BSP::Time;
|
||||||
|
using BSP::time_t;
|
||||||
|
|
||||||
static BSP::Schedule::LowPowerTaskScheduler<1> g_sched;
|
static void fail_if_wakeup(time_t delay) {
|
||||||
static BSP::GpioDriver g_gpioa(GPIOA);
|
uint32_t pre_wakeups = BSP::RtcDriver::get_wakeup_count();
|
||||||
#if defined(BOARD_WATCH)
|
time_t before = Test::get_time();
|
||||||
static BSP::UsartDriver g_test_uart(USART2, g_sched);
|
while (before + delay > Test::get_time() && BSP::RtcDriver::get_wakeup_count() == pre_wakeups) {}
|
||||||
static BSP::GpioPin g_tx_pin(g_gpioa, 9);
|
|
||||||
#elif defined(BOARD_DEVBOARD)
|
|
||||||
static BSP::UsartDriver g_test_uart(USART1, g_sched);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static BSP::time_t get_time() {
|
if (BSP::RtcDriver::get_wakeup_count() != pre_wakeups) {
|
||||||
BSP::time_t time;
|
g_test_uart.tx_blocking("Got unexpected wakeup IRQ\r\n");
|
||||||
BSP::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);
|
g_test_uart.tx_blocking(test_fail_text);
|
||||||
TEST_SPIN();
|
TEST_SPIN();
|
||||||
}
|
}
|
||||||
return time;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[[noreturn]] void main() {
|
[[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);
|
g_test_uart.tx_blocking(test_start_text);
|
||||||
|
|
||||||
BSP::RtcDriver::init();
|
for (uint32_t i = 0; i <= 100; i++) {
|
||||||
SystemTimer::set_timer(BSP::RtcDriver::get_system_timer());
|
Test::stop_for(Time::millis(5));
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
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);
|
g_test_uart.tx_blocking(test_pass_text);
|
||||||
|
|
||||||
TEST_SPIN();
|
TEST_SPIN();
|
||||||
42
firmware/Test/Board/devboard.cpp
Normal file
42
firmware/Test/Board/devboard.cpp
Normal file
@@ -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());
|
||||||
|
}
|
||||||
@@ -19,39 +19,25 @@
|
|||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "printf.h"
|
|
||||||
|
|
||||||
#include "Bsp/LowPowerTaskScheduler.h"
|
|
||||||
#include "Bsp/Drivers/GpioDriver.h"
|
#include "Bsp/Drivers/GpioDriver.h"
|
||||||
#include "Bsp/Drivers/UsartDriver.h"
|
#include "Bsp/Drivers/RtcDriver.h"
|
||||||
#include "Bsp/macros.h"
|
|
||||||
|
|
||||||
#include "test.h"
|
|
||||||
|
|
||||||
#include "Mcu.h"
|
#include "Mcu.h"
|
||||||
|
#include "TestBoard.h"
|
||||||
|
|
||||||
using BSP::Time;
|
using namespace BSP;
|
||||||
|
using namespace BSP::Schedule;
|
||||||
|
|
||||||
static BSP::Schedule::LowPowerTaskScheduler<1> g_sched;
|
LowPowerTaskScheduler<10> g_sched;
|
||||||
static BSP::GpioDriver g_gpioa(GPIOA);
|
GpioDriver g_gpioa(GPIOA);
|
||||||
#if defined(BOARD_WATCH)
|
UsartDriver g_test_uart(USART2, g_sched);
|
||||||
static BSP::UsartDriver g_test_uart(USART2, g_sched);
|
static GpioPin g_tx_pin(g_gpioa, 9);
|
||||||
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() {
|
|
||||||
|
|
||||||
|
void board_init() {
|
||||||
g_gpioa.enable();
|
g_gpioa.enable();
|
||||||
|
|
||||||
#if defined(BOARD_WATCH)
|
|
||||||
g_tx_pin.configure_alternate_function(4);
|
g_tx_pin.configure_alternate_function(4);
|
||||||
#endif
|
|
||||||
|
|
||||||
g_test_uart.init();
|
g_test_uart.init();
|
||||||
|
|
||||||
g_test_uart.tx_blocking(test_start_text);
|
RtcDriver::init();
|
||||||
g_test_uart.tx_blocking("Causing test timeout...\r\n");
|
SystemTimer::set_timer(RtcDriver::get_system_timer());
|
||||||
TEST_SPIN();
|
|
||||||
}
|
}
|
||||||
32
firmware/Test/Common/TestBoard.h
Normal file
32
firmware/Test/Common/TestBoard.h
Normal file
@@ -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;
|
||||||
@@ -20,33 +20,25 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include "printf.h"
|
|
||||||
|
|
||||||
#include "Bsp/Drivers/GpioDriver.h"
|
#include "Bsp/SystemTime.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 "test.h"
|
||||||
|
#include "printf.h"
|
||||||
#include "Mcu.h"
|
|
||||||
|
|
||||||
using BSP::Time;
|
using BSP::Time;
|
||||||
using BSP::ReturnCode;
|
using BSP::ReturnCode;
|
||||||
using BSP::SystemTimer;
|
using BSP::SystemTimer;
|
||||||
using BSP::time_t;
|
using BSP::time_t;
|
||||||
|
|
||||||
static BSP::Schedule::LowPowerTaskScheduler<1> g_sched;
|
const char *test_start_text = "TEST_BEGIN\r\n";
|
||||||
static BSP::GpioDriver g_gpioa(GPIOA);
|
const char *test_fail_text = "TEST_FAIL\r\n";
|
||||||
#if defined(BOARD_WATCH)
|
const char *test_pass_text = "TEST_PASS\r\n";
|
||||||
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() {
|
namespace Test {
|
||||||
|
|
||||||
|
time_t get_time() {
|
||||||
time_t time;
|
time_t time;
|
||||||
ReturnCode rc = SystemTimer::get_time(time);
|
ReturnCode rc = SystemTimer::get_time(time);
|
||||||
if (rc != ReturnCode::OK) {
|
if (rc != ReturnCode::OK) {
|
||||||
@@ -57,8 +49,7 @@ static time_t get_time() {
|
|||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stop_for(time_t delay) {
|
void stop_for(time_t delay) {
|
||||||
|
|
||||||
ReturnCode rc = BSP::RtcDriver::set_wakeup_in(delay);
|
ReturnCode rc = BSP::RtcDriver::set_wakeup_in(delay);
|
||||||
if (rc != ReturnCode::OK) {
|
if (rc != ReturnCode::OK) {
|
||||||
g_test_uart.tx_blocking("Failed to set wakeup delay\r\n");
|
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);
|
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();
|
|
||||||
}
|
}
|
||||||
@@ -21,8 +21,15 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Bsp/Time.h"
|
||||||
|
|
||||||
extern const char *test_start_text;
|
extern const char *test_start_text;
|
||||||
extern const char *test_fail_text;
|
extern const char *test_fail_text;
|
||||||
extern const char *test_pass_text;
|
extern const char *test_pass_text;
|
||||||
|
|
||||||
#define TEST_SPIN() do {} while (1)
|
#define TEST_SPIN() do {} while (1)
|
||||||
|
|
||||||
|
namespace Test {
|
||||||
|
BSP::time_t get_time();
|
||||||
|
void stop_for(BSP::time_t delay);
|
||||||
|
}
|
||||||
@@ -103,28 +103,28 @@ def context_factory():
|
|||||||
|
|
||||||
|
|
||||||
def test_meta_pass(context_factory, logger):
|
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)
|
text = serial_dev.read_until(TEST_PASS_TEXT)
|
||||||
print("Got serial output: {}".format(text))
|
print("Got serial output: {}".format(text))
|
||||||
assert text.endswith(TEST_PASS_TEXT)
|
assert text.endswith(TEST_PASS_TEXT)
|
||||||
|
|
||||||
|
|
||||||
def test_meta_fail(context_factory, logger):
|
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)
|
text = serial_dev.read_until(TEST_PASS_TEXT)
|
||||||
print("Got serial output: {}".format(text))
|
print("Got serial output: {}".format(text))
|
||||||
assert not text.endswith(TEST_PASS_TEXT)
|
assert not text.endswith(TEST_PASS_TEXT)
|
||||||
|
|
||||||
|
|
||||||
def test_meta_timeout(context_factory, logger):
|
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)
|
text = serial_dev.read_until(TEST_PASS_TEXT)
|
||||||
assert not text.endswith(TEST_PASS_TEXT)
|
assert not text.endswith(TEST_PASS_TEXT)
|
||||||
|
|
||||||
|
|
||||||
def test_meta_nostart(context_factory, logger):
|
def test_meta_nostart(context_factory, logger):
|
||||||
with pytest.raises(AssertionError):
|
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):
|
def test_watch(context_factory, logger):
|
||||||
@@ -133,22 +133,68 @@ def test_watch(context_factory, logger):
|
|||||||
|
|
||||||
|
|
||||||
def test_set_time(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)
|
text = serial_dev.read_until(TEST_PASS_TEXT)
|
||||||
print("Text:", text.decode())
|
print("Text:", text.decode())
|
||||||
assert text.endswith(TEST_PASS_TEXT)
|
assert text.endswith(TEST_PASS_TEXT)
|
||||||
|
|
||||||
|
|
||||||
def test_periodic_alarms(context_factory, logger):
|
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
|
serial_dev.timeout = 6
|
||||||
text = serial_dev.read_until(TEST_PASS_TEXT)
|
text = serial_dev.read_until(TEST_PASS_TEXT)
|
||||||
print("Text:", text.decode())
|
print("Text:", text.decode())
|
||||||
assert text.endswith(TEST_PASS_TEXT)
|
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):
|
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
|
EXPECTED_RUNTIME = 10
|
||||||
TOLERANCE = 0.2
|
TOLERANCE = 0.2
|
||||||
|
|
||||||
@@ -180,7 +226,7 @@ def test_clock(context_factory, logger):
|
|||||||
|
|
||||||
|
|
||||||
def test_wakeup_irq(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
|
serial_dev.timeout = 65
|
||||||
|
|
||||||
pattern = re.compile("Requested=(\\d*) Actual=(\\d*) Wakeups=(\\d*)")
|
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):
|
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
|
serial_dev.timeout = 70
|
||||||
|
|
||||||
pattern = re.compile("Requested=(\\d*) Actual=(\\d*)")
|
pattern = re.compile("Requested=(\\d*) Actual=(\\d*)")
|
||||||
@@ -279,7 +325,7 @@ def measure_frequency(
|
|||||||
|
|
||||||
|
|
||||||
def test_lptim(context_factory, logger):
|
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")
|
state0_periods, state1_periods = measure_frequency(1, "D0")
|
||||||
num_periods = min(len(state0_periods), len(state1_periods))
|
num_periods = min(len(state0_periods), len(state1_periods))
|
||||||
periods = [state0_periods[i] + state1_periods[i] for i in range(num_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
|
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():
|
def main():
|
||||||
pytest.main(sys.argv)
|
pytest.main(sys.argv)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user