mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 09:49:32 +02:00
Unit test attempt
This commit is contained in:
parent
44c02745bf
commit
da8421dcff
8 changed files with 92 additions and 28 deletions
23
.github/workflows/unit-tests.yml
vendored
Normal file
23
.github/workflows/unit-tests.yml
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
name: Build and Test
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Configure and build with CMake
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ..
|
||||||
|
cmake --build .
|
||||||
|
|
||||||
|
- name: Run unit tests
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
./Software/test/Debug/events_test.exe
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -4,4 +4,8 @@
|
||||||
# Ignore any files in the build folder
|
# Ignore any files in the build folder
|
||||||
Software/build/
|
Software/build/
|
||||||
|
|
||||||
|
# Ignore CMake build folder
|
||||||
|
build/
|
||||||
|
|
||||||
|
# Ignore unit tests
|
||||||
*.exe
|
*.exe
|
6
CMakeLists.txt
Normal file
6
CMakeLists.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
|
||||||
|
project(BatteryEmulator)
|
||||||
|
|
||||||
|
add_subdirectory(Software/src/devboard/utils)
|
||||||
|
add_subdirectory(Software/test)
|
1
Software/src/devboard/utils/CMakeLists.txt
Normal file
1
Software/src/devboard/utils/CMakeLists.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# add_library(utils_library events.cpp)
|
|
@ -14,9 +14,10 @@ static EVENTS_STRUCT_TYPE entries[EVENT_NOF_EVENTS];
|
||||||
static unsigned long previous_millis = 0;
|
static unsigned long previous_millis = 0;
|
||||||
static uint32_t time_seconds = 0;
|
static uint32_t time_seconds = 0;
|
||||||
static uint8_t total_led_color = GREEN;
|
static uint8_t total_led_color = GREEN;
|
||||||
|
static char event_message[256];
|
||||||
|
|
||||||
/* Local function prototypes */
|
/* Local function prototypes */
|
||||||
static void print_event_message(EVENTS_ENUM_TYPE event);
|
static void set_event_message(EVENTS_ENUM_TYPE event);
|
||||||
static void update_led_color(EVENTS_ENUM_TYPE event);
|
static void update_led_color(EVENTS_ENUM_TYPE event);
|
||||||
|
|
||||||
/* Exported functions */
|
/* Exported functions */
|
||||||
|
@ -42,7 +43,10 @@ void set_event(EVENTS_ENUM_TYPE event, uint8_t data) {
|
||||||
entries[event].timestamp = time_seconds;
|
entries[event].timestamp = time_seconds;
|
||||||
entries[event].data = data;
|
entries[event].data = data;
|
||||||
entries[event].occurences++;
|
entries[event].occurences++;
|
||||||
print_event_message(event);
|
set_event_message(event);
|
||||||
|
#ifdef DEBUG_VIA_USB
|
||||||
|
Serial.println(event_message);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_event_timestamps(void) {
|
void update_event_timestamps(void) {
|
||||||
|
@ -58,69 +62,75 @@ static void update_led_color(EVENTS_ENUM_TYPE event) {
|
||||||
total_led_color = (total_led_color == RED) ? RED : entries[event].led_color;
|
total_led_color = (total_led_color == RED) ? RED : entries[event].led_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_event_message(EVENTS_ENUM_TYPE event) {
|
static void set_event_message(EVENTS_ENUM_TYPE event) {
|
||||||
#ifndef DEBUG_VIA_USB
|
|
||||||
return;
|
|
||||||
#else
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case EVENT_CAN_FAILURE:
|
case EVENT_CAN_FAILURE:
|
||||||
Serial.println("No CAN communication detected for 60s. Shutting down battery control.");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"No CAN communication detected for 60s. Shutting down battery control.");
|
||||||
break;
|
break;
|
||||||
case EVENT_CAN_WARNING:
|
case EVENT_CAN_WARNING:
|
||||||
Serial.println("ERROR: High amount of corrupted CAN messages detected. Check CAN wire shielding!");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"ERROR: High amount of corrupted CAN messages detected. Check CAN wire shielding!");
|
||||||
break;
|
break;
|
||||||
case EVENT_WATER_INGRESS:
|
case EVENT_WATER_INGRESS:
|
||||||
Serial.println("Water leakage inside battery detected. Operation halted. Inspect battery!");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"Water leakage inside battery detected. Operation halted. Inspect battery!");
|
||||||
break;
|
break;
|
||||||
case EVENT_12V_LOW:
|
case EVENT_12V_LOW:
|
||||||
Serial.println(
|
snprintf(event_message, sizeof(event_message),
|
||||||
"12V battery source below required voltage to safely close contactors. Inspect the supply/battery!");
|
"12V battery source below required voltage to safely close contactors. Inspect the supply/battery!");
|
||||||
break;
|
break;
|
||||||
case EVENT_SOC_PLAUSIBILITY_ERROR:
|
case EVENT_SOC_PLAUSIBILITY_ERROR:
|
||||||
Serial.println("ERROR: SOC% reported by battery not plausible. Restart battery!");
|
snprintf(event_message, sizeof(event_message), "ERROR: SOC% reported by battery not plausible. Restart battery!");
|
||||||
break;
|
break;
|
||||||
case EVENT_KWH_PLAUSIBILITY_ERROR:
|
case EVENT_KWH_PLAUSIBILITY_ERROR:
|
||||||
Serial.println("Warning: kWh remaining reported by battery not plausible. Battery needs cycling.");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"Warning: kWh remaining reported by battery not plausible. Battery needs cycling.");
|
||||||
break;
|
break;
|
||||||
case EVENT_BATTERY_CHG_STOP_REQ:
|
case EVENT_BATTERY_CHG_STOP_REQ:
|
||||||
Serial.println("ERROR: Battery raised caution indicator AND requested charge stop. Inspect battery status!");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"ERROR: Battery raised caution indicator AND requested charge stop. Inspect battery status!");
|
||||||
break;
|
break;
|
||||||
case EVENT_BATTERY_DISCHG_STOP_REQ:
|
case EVENT_BATTERY_DISCHG_STOP_REQ:
|
||||||
Serial.println("ERROR: Battery raised caution indicator AND requested discharge stop. Inspect battery status!");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"ERROR: Battery raised caution indicator AND requested discharge stop. Inspect battery status!");
|
||||||
break;
|
break;
|
||||||
case EVENT_BATTERY_CHG_DISCHG_STOP_REQ:
|
case EVENT_BATTERY_CHG_DISCHG_STOP_REQ:
|
||||||
Serial.println(
|
snprintf(event_message, sizeof(event_message),
|
||||||
"ERROR: Battery raised caution indicator AND requested charge/discharge stop. Inspect battery status!");
|
"ERROR: Battery raised caution indicator AND requested charge/discharge stop. Inspect battery status!");
|
||||||
break;
|
break;
|
||||||
case EVENT_LOW_SOH:
|
case EVENT_LOW_SOH:
|
||||||
Serial.println(
|
snprintf(
|
||||||
|
event_message, sizeof(event_message),
|
||||||
"ERROR: State of health critically low. Battery internal resistance too high to continue. Recycle battery.");
|
"ERROR: State of health critically low. Battery internal resistance too high to continue. Recycle battery.");
|
||||||
break;
|
break;
|
||||||
case EVENT_HVIL_FAILURE:
|
case EVENT_HVIL_FAILURE:
|
||||||
Serial.println(
|
snprintf(event_message, sizeof(event_message),
|
||||||
"ERROR: Battery interlock loop broken. Check that high voltage connectors are seated. Battery will be "
|
"ERROR: Battery interlock loop broken. Check that high voltage connectors are seated. Battery will be "
|
||||||
"disabled!");
|
"disabled!");
|
||||||
break;
|
break;
|
||||||
case EVENT_INTERNAL_OPEN_FAULT:
|
case EVENT_INTERNAL_OPEN_FAULT:
|
||||||
Serial.println("ERROR: High voltage cable removed while battery running. Opening contactors!");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"ERROR: High voltage cable removed while battery running. Opening contactors!");
|
||||||
break;
|
break;
|
||||||
case EVENT_CELL_UNDER_VOLTAGE:
|
case EVENT_CELL_UNDER_VOLTAGE:
|
||||||
Serial.println("ERROR: CELL UNDERVOLTAGE!!! Stopping battery charging and discharging. Inspect battery!");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"ERROR: CELL UNDERVOLTAGE!!! Stopping battery charging and discharging. Inspect battery!");
|
||||||
break;
|
break;
|
||||||
case EVENT_CELL_OVER_VOLTAGE:
|
case EVENT_CELL_OVER_VOLTAGE:
|
||||||
Serial.println("ERROR: CELL OVERVOLTAGE!!! Stopping battery charging and discharging. Inspect battery!");
|
snprintf(event_message, sizeof(event_message),
|
||||||
|
"ERROR: CELL OVERVOLTAGE!!! Stopping battery charging and discharging. Inspect battery!");
|
||||||
break;
|
break;
|
||||||
case EVENT_CELL_DEVIATION_HIGH:
|
case EVENT_CELL_DEVIATION_HIGH:
|
||||||
Serial.println("ERROR: HIGH CELL DEVIATION!!! Inspect battery!");
|
snprintf(event_message, sizeof(event_message), "ERROR: HIGH CELL DEVIATION!!! Inspect battery!");
|
||||||
break;
|
break;
|
||||||
case EVENT_UNKNOWN_EVENT_SET:
|
case EVENT_UNKNOWN_EVENT_SET:
|
||||||
Serial.println("An unknown event was set! Review your code!");
|
snprintf(event_message, sizeof(event_message), "An unknown event was set! Review your code!");
|
||||||
break;
|
break;
|
||||||
case EVENT_DUMMY:
|
case EVENT_DUMMY:
|
||||||
Serial.println("The dummy event was set!");
|
snprintf(event_message, sizeof(event_message), "The dummy event was set!"); // Don't change this event message!
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EVENT_CAN_FAILURE = 0u,
|
EVENT_CAN_FAILURE = 0u,
|
||||||
EVENT_CAN_WARNING,
|
EVENT_CAN_WARNING,
|
||||||
|
|
|
@ -3,6 +3,11 @@
|
||||||
|
|
||||||
#include "events.cpp"
|
#include "events.cpp"
|
||||||
|
|
||||||
|
/* Helper functions */
|
||||||
|
static void reset_event_msg(void) {
|
||||||
|
snprintf(event_message, sizeof(event_message), "");
|
||||||
|
}
|
||||||
|
|
||||||
TEST(init_events_test) {
|
TEST(init_events_test) {
|
||||||
init_events();
|
init_events();
|
||||||
|
|
||||||
|
@ -62,4 +67,12 @@ TEST(set_event_test) {
|
||||||
ASSERT_EQ(entries[EVENT_CELL_OVER_VOLTAGE].timestamp, 345);
|
ASSERT_EQ(entries[EVENT_CELL_OVER_VOLTAGE].timestamp, 345);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(event_message_test) {
|
||||||
|
reset_event_msg();
|
||||||
|
|
||||||
|
set_event(EVENT_DUMMY, 0); // Set dummy event with no data
|
||||||
|
|
||||||
|
ASSERT_STREQ("The dummy event was set!", event_message);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_MAIN();
|
TEST_MAIN();
|
||||||
|
|
5
Software/test/CMakeLists.txt
Normal file
5
Software/test/CMakeLists.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
add_executable(events_test ../src/devboard/utils/events_test.cpp test_lib.cpp)
|
||||||
|
|
||||||
|
target_compile_definitions(events_test PRIVATE UNIT_TEST)
|
||||||
|
|
||||||
|
target_link_libraries(events_test) # Link to the library from devboard/utils
|
Loading…
Add table
Add a link
Reference in a new issue