From 0b4f624b2a9142c8dc196c1eedadcec87e22ff67 Mon Sep 17 00:00:00 2001 From: rusefi Date: Mon, 2 Dec 2019 01:52:54 -0500 Subject: [PATCH] cj125 unit test progress! --- firmware/hw_layer/sensors/cj125.cpp | 8 ++++-- firmware/hw_layer/sensors/cj125_logic.cpp | 15 +++++++++++- firmware/hw_layer/sensors/cj125_logic.h | 7 +++--- unit_tests/tests/test_cj125.cpp | 30 ++++++++++++++++++----- unit_tests/unit_test_framework.h | 1 + 5 files changed, 49 insertions(+), 12 deletions(-) diff --git a/firmware/hw_layer/sensors/cj125.cpp b/firmware/hw_layer/sensors/cj125.cpp index 53290706ad..f914e21a49 100644 --- a/firmware/hw_layer/sensors/cj125.cpp +++ b/firmware/hw_layer/sensors/cj125.cpp @@ -164,7 +164,7 @@ static void cjPrintErrorCode(cj125_error_e errCode) { case CJ125_ERROR_OVERHEAT: errString = "Sensor overheating"; break; - case CJ125_ERROR_NONE: + case CJ125_NO_ERROR: errString = "N/A"; break; case CJ125_ERROR_WRONG_IDENT: @@ -540,18 +540,22 @@ void initCJ125(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) { globalInstance.spi = &spi; globalInstance.logger = sharedLogger; - if (!CONFIGB(isCJ125Enabled)) + if (!CONFIGB(isCJ125Enabled)) { + globalInstance.errorCode = CJ125_ERROR_DISABLED; return; + } if (CONFIG(cj125ur) == EFI_ADC_NONE || CONFIG(cj125ua) == EFI_ADC_NONE) { scheduleMsg(logger, "cj125 init error! cj125ur and cj125ua are required."); warning(CUSTOM_CJ125_0, "cj ur ua"); + globalInstance.errorCode = CJ125_ERROR_DISABLED; return; } if (CONFIGB(wboHeaterPin) == GPIO_UNASSIGNED) { scheduleMsg(logger, "cj125 init error! wboHeaterPin is required."); warning(CUSTOM_CJ125_1, "cj heater"); + globalInstance.errorCode = CJ125_ERROR_DISABLED; return; } diff --git a/firmware/hw_layer/sensors/cj125_logic.cpp b/firmware/hw_layer/sensors/cj125_logic.cpp index 22ee2198d4..e8b017da1e 100644 --- a/firmware/hw_layer/sensors/cj125_logic.cpp +++ b/firmware/hw_layer/sensors/cj125_logic.cpp @@ -7,6 +7,7 @@ #include "cj125_logic.h" #include "engine.h" +#include "error_handling.h" EXTERN_ENGINE; @@ -47,7 +48,12 @@ void CJ125::StartHeaterControl(pwm_gen_callback *stateChangeCallback DECLARE_ENG SetIdleHeater(PASS_ENGINE_PARAMETER_SIGNATURE); } -void CJ125::cjIdentify(void) { +/** + * @return true in case of positive SPI identification + * false in case of unexpected SPI response + */ +bool CJ125::cjIdentify(void) { + efiAssert(OBD_PCM_Processor_Fault, spi!= NULL, "No SPI pointer", false); // read Ident register int ident = spi->ReadRegister(IDENT_REG_RD) & CJ125_IDENT_MASK; @@ -62,15 +68,22 @@ void CJ125::cjIdentify(void) { scheduleMsg(logger, "cj125: Check ident=0x%x diag=0x%x init1=0x%x init2=0x%x", ident, diag, init1, init2); if (ident != CJ125_IDENT) { scheduleMsg(logger, "cj125: Error! Wrong ident! Cannot communicate with CJ125!"); + errorCode = CJ125_ERROR_WRONG_IDENT; + state = CJ125_ERROR; + return false; } if (init1 != CJ125_INIT1_NORMAL_17 || init2 != CJ125_INIT2_DIAG) { scheduleMsg(logger, "cj125: Error! Cannot set init registers! Cannot communicate with CJ125!"); + errorCode = CJ125_ERROR_WRONG_INIT; + state = CJ125_ERROR; + return false; } #if 0 if (diag != CJ125_DIAG_NORM) { scheduleMsg(logger, "cj125: Diag error!"); } #endif + return true; } void CJ125::cjSetMode(cj125_mode_e m) { diff --git a/firmware/hw_layer/sensors/cj125_logic.h b/firmware/hw_layer/sensors/cj125_logic.h index 208aeda0a2..e2b326fff2 100644 --- a/firmware/hw_layer/sensors/cj125_logic.h +++ b/firmware/hw_layer/sensors/cj125_logic.h @@ -31,11 +31,12 @@ typedef enum { } cj125_state_e; typedef enum { - CJ125_ERROR_NONE = 0, + CJ125_NO_ERROR = 0, CJ125_ERROR_HEATER_MALFUNCTION = 1, CJ125_ERROR_OVERHEAT = 2, CJ125_ERROR_WRONG_IDENT = 3, CJ125_ERROR_WRONG_INIT = 4, + CJ125_ERROR_DISABLED = 5, } cj125_error_e; typedef enum { @@ -90,14 +91,14 @@ public: // Used by CJ125 driver state machine volatile cj125_state_e state = CJ125_INIT; // Last Error code - volatile cj125_error_e errorCode = CJ125_ERROR_NONE; + volatile cj125_error_e errorCode = CJ125_NO_ERROR; void setError(cj125_error_e errCode DECLARE_ENGINE_PARAMETER_SUFFIX); bool isWorkingState(void) const; void SetHeater(float value DECLARE_ENGINE_PARAMETER_SUFFIX); void SetIdleHeater(DECLARE_ENGINE_PARAMETER_SIGNATURE); void StartHeaterControl(pwm_gen_callback *stateChangeCallback DECLARE_ENGINE_PARAMETER_SUFFIX); - void cjIdentify(void); + bool cjIdentify(void); void cjSetMode(cj125_mode_e m); bool isValidState() const; void cjInitPid(DECLARE_ENGINE_PARAMETER_SIGNATURE); diff --git a/unit_tests/tests/test_cj125.cpp b/unit_tests/tests/test_cj125.cpp index df083359a3..6ed755c10e 100644 --- a/unit_tests/tests/test_cj125.cpp +++ b/unit_tests/tests/test_cj125.cpp @@ -1,11 +1,10 @@ /* - * test_cj125.cpp + * @file test_cj125.cpp * * Created on: Jan 3, 2019 * @author Andrey Belomutskiy, (c) 2012-2019 */ -#include "gtest/gtest.h" #include "cj125_logic.h" #include "engine_test_helper.h" @@ -35,13 +34,32 @@ TEST(testCJ125, testInitialState) { TestSpi mock; cj.spi = &mock; - EXPECT_CALL(mock, ReadRegister(IDENT_REG_RD)).Times(1); - EXPECT_CALL(mock, ReadRegister(INIT_REG1_RD)).Times(1); - EXPECT_CALL(mock, ReadRegister(INIT_REG2_RD)).Times(1); + EXPECT_CALL(mock, ReadRegister(IDENT_REG_RD)).Times(1).WillOnce(Return(CJ125_IDENT)); + EXPECT_CALL(mock, ReadRegister(INIT_REG1_RD)).Times(1).WillOnce(Return(CJ125_INIT1_NORMAL_17)); + EXPECT_CALL(mock, ReadRegister(INIT_REG2_RD)).Times(1).WillOnce(Return(CJ125_INIT2_DIAG)); EXPECT_CALL(mock, ReadRegister(DIAG_REG_RD)).Times(1); cj.cjIdentify(); - + // validate that error state was not set + ASSERT_EQ(cj.state, CJ125_INIT); } +TEST(testCJ125, testFailedIdentify) { + CJ125 cj; + + ASSERT_EQ(cj.state, CJ125_INIT); + + TestSpi mock; + cj.spi = &mock; + + cj.cjIdentify(); + ASSERT_EQ(cj.errorCode, CJ125_ERROR_WRONG_IDENT); + ASSERT_EQ(cj.state, CJ125_ERROR); +} + +TEST(testCJ125, testMode) { + + + +} diff --git a/unit_tests/unit_test_framework.h b/unit_tests/unit_test_framework.h index fd380ef299..5c0f3788fe 100644 --- a/unit_tests/unit_test_framework.h +++ b/unit_tests/unit_test_framework.h @@ -11,6 +11,7 @@ #include "engine.h" #include "gtest/gtest.h" #include "gmock/gmock.h" +using ::testing::Return; // This lets us inspect private state from unit tests #define private public