foxBMS - Unit Tests  1.6.0
The foxBMS Unit Tests API Documentation
test_mxm_1785x_tools.c
Go to the documentation of this file.
1 /**
2  *
3  * @copyright © 2010 - 2023, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V.
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright notice, this
12  * list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  *
18  * 3. Neither the name of the copyright holder nor the names of its
19  * contributors may be used to endorse or promote products derived from
20  * this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  * We kindly request you to use one or more of the following phrases to refer to
34  * foxBMS in your hardware, software, documentation or advertising materials:
35  *
36  * - ″This product uses parts of foxBMS®″
37  * - ″This product includes parts of foxBMS®″
38  * - ″This product is derived from foxBMS®″
39  *
40  */
41 
42 /**
43  * @file test_mxm_1785x_tools.c
44  * @author foxBMS Team
45  * @date 2020-07-15 (date of creation)
46  * @updated 2023-10-12 (date of last update)
47  * @version v1.6.0
48  * @ingroup UNIT_TEST_IMPLEMENTATION
49  * @prefix MXM
50  *
51  * @brief Test for the Maxim 1785x driver tools.
52  *
53  * @details def
54  *
55  */
56 
57 /*========== Includes =======================================================*/
58 #pragma GCC diagnostic push
59 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
60 #pragma GCC diagnostic ignored "-Wuninitialized"
61 
62 #include "unity.h"
63 #include "Mockfassert.h"
64 #include "Mockmxm_cfg.h"
65 
66 #include "mxm_1785x_tools.h"
67 #include "test_assert_helper.h"
68 
69 /*========== Unit Testing Framework Directives ==============================*/
70 TEST_INCLUDE_PATH("../../src/app/driver/afe/maxim/common")
71 TEST_INCLUDE_PATH("../../src/app/driver/afe/maxim/common/config")
72 TEST_INCLUDE_PATH("../../src/app/driver/config")
73 TEST_INCLUDE_PATH("../../src/app/driver/spi")
74 
75 /*========== Definitions and Implementations for Unit Test ==================*/
76 
77 /*========== Setup and Teardown =============================================*/
78 void setUp(void) {
79 }
80 
81 void tearDown(void) {
82 }
83 
84 /*========== Test Cases =====================================================*/
87 }
88 
89 /** test #MXM_ExtractValueFromRegister() with an ADC value */
91  const uint8_t lsb = 0xFCu;
92  const uint8_t msb = 0xFFu;
93  uint16_t value = 0x00u;
95  TEST_ASSERT_EQUAL(0x3FFFu, value);
96 }
97 
98 /** test #MXM_ExtractValueFromRegister() with a single bit in lsb */
100  const uint8_t lsb = 0x10u;
101  const uint8_t msb = 0x00u;
102  uint16_t value = 0x00u;
104  TEST_ASSERT_EQUAL(1u, value);
105 }
106 
107 /** test #MXM_ExtractValueFromRegister() without a bit in lsb */
109  const uint8_t lsb = 0x00u;
110  const uint8_t msb = 0x00u;
111  uint16_t value = 0x00u;
113  TEST_ASSERT_EQUAL(0u, value);
114 }
115 
116 /** test #MXM_ExtractValueFromRegister() with whole lsb */
118  const uint8_t lsb = 0xFFu;
119  const uint8_t msb = 0x00u;
120  uint16_t value = 0x00u;
121  MXM_ExtractValueFromRegister(lsb, msb, MXM_BM_LSB, &value);
122  TEST_ASSERT_EQUAL(0xFFu, value);
123 }
124 
125 /** test #MXM_ExtractValueFromRegister() with whole msb */
127  const uint8_t lsb = 0x00u;
128  const uint8_t msb = 0xFFu;
129  uint16_t value = 0x00u;
130  MXM_ExtractValueFromRegister(lsb, msb, MXM_BM_MSB, &value);
131  TEST_ASSERT_EQUAL(0xFFu, value);
132 }
133 
134 /** test #MXM_ExtractValueFromRegister() with a single bit in msb */
136  const uint8_t lsb = 0x00u;
137  const uint8_t msb = 0x40u;
138  uint16_t value = 0x00u;
140  TEST_ASSERT_EQUAL(1u, value);
141 }
142 
143 /** test #MXM_ExtractValueFromRegister() with a single bit in msb and with full byte */
145  const uint8_t lsb = 0xFFu;
146  const uint8_t msb = 0xFFu;
147  uint16_t value = 0x00u;
149  TEST_ASSERT_EQUAL(1u, value);
150 }
151 
152 /** test #MXM_ExtractValueFromRegister() without a bit in msb */
154  const uint8_t lsb = 0x00u;
155  const uint8_t msb = 0x00u;
156  uint16_t value = 0x00u;
158  TEST_ASSERT_EQUAL(0u, value);
159 }
160 
162  /* bogus conversion type */
163  uint8_t msb = 0;
164  uint8_t lsb = 0;
165  uint16_t voltage = 0;
166  TEST_ASSERT_FAIL_ASSERT(MXM_Convert(lsb, msb, &voltage, (MXM_CONVERSION_TYPE_e)42, 5000));
167 }
168 
170  /* full scale */
171  uint8_t msb = 0xFFu;
172  uint8_t lsb = 0xFCu;
173  uint16_t voltage = 0;
174  TEST_ASSERT_PASS_ASSERT(MXM_Convert(lsb, msb, &voltage, MXM_CONVERSION_UNIPOLAR, 5000));
175  TEST_ASSERT_EQUAL(5000u, voltage);
176 }
177 
179  /* low scale */
180  uint8_t msb = 0x00u;
181  uint8_t lsb = 0x00u;
182  uint16_t voltage = 0;
183  TEST_ASSERT_PASS_ASSERT(MXM_Convert(lsb, msb, &voltage, MXM_CONVERSION_UNIPOLAR, 5000));
184  TEST_ASSERT_EQUAL(0u, voltage);
185 }
186 
188  /* half scale */
189  uint8_t msb = 0x80u;
190  uint8_t lsb = 0x00u;
191  uint16_t voltage = 0;
192  TEST_ASSERT_PASS_ASSERT(MXM_Convert(lsb, msb, &voltage, MXM_CONVERSION_UNIPOLAR, 5000));
193  TEST_ASSERT_EQUAL(2500u, voltage);
194 }
195 
197  FAS_StoreAssertLocation_Ignore();
198  TEST_ASSERT_PASS_ASSERT(TEST_ASSERT_EQUAL(STD_OK, MXM_ConvertTest()));
199 }
200 
202  TEST_ASSERT_PASS_ASSERT(TEST_ASSERT_EQUAL(STD_OK, MXM_FirstSetBitTest()));
203 }
204 
206  uint8_t lsb = 255;
207  uint8_t msb = 255;
208  MXM_Unipolar14BitInto16Bit(0u, &lsb, &msb);
209  TEST_ASSERT_EQUAL(0u, lsb);
210  TEST_ASSERT_EQUAL(0u, msb);
211 }
212 
214  uint8_t lsb = 0;
215  uint8_t msb = 0;
216  MXM_Unipolar14BitInto16Bit(0x3FFFu, &lsb, &msb);
217  TEST_ASSERT_EQUAL(0xFCu, lsb);
218  TEST_ASSERT_EQUAL(0xFFu, msb);
219 }
220 
222  TEST_ASSERT_EQUAL(0u, MXM_VoltageIntoUnipolar14Bit(0, 5000));
223  TEST_ASSERT_EQUAL(0x3FFFu, MXM_VoltageIntoUnipolar14Bit(5000, 5000));
224  /* get the half-scale value by rightshifting */
225  TEST_ASSERT_EQUAL((0x3FFFu >> 1u), MXM_VoltageIntoUnipolar14Bit(2500, 5000));
226 
227  /* test with fullscale value of block-voltage */
228  TEST_ASSERT_EQUAL(0x3FFFu, MXM_VoltageIntoUnipolar14Bit(65000, 65000));
229  /* test with halfscale value of block-voltage */
230  TEST_ASSERT_EQUAL((0x3FFFu >> 1u), MXM_VoltageIntoUnipolar14Bit(32500, 65000));
231 }
232 
234  /* halfscale
235  lsb = 0xFCu;
236  msb = 0x7Fu;
237  2.5V
238  */
239  uint16_t value_14bit = MXM_VoltageIntoUnipolar14Bit(2500u, 5000u);
240  TEST_ASSERT_EQUAL((0x3FFF >> 1u), value_14bit);
241 
242  uint8_t lsb = 0;
243  uint8_t msb = 0;
244  MXM_Unipolar14BitInto16Bit(value_14bit, &lsb, &msb);
245  TEST_ASSERT_EQUAL(0xFCu, lsb);
246  TEST_ASSERT_EQUAL(0x7Fu, msb);
247 }
248 
250  /* known values from driver:
251  lsb = 0x98u;
252  msb = 0x19u;
253  0.5V
254  */
255  uint16_t value_14bit = MXM_VoltageIntoUnipolar14Bit(500u, 5000u);
256  TEST_ASSERT_EQUAL((0x1998u >> 2u), value_14bit);
257 
258  uint8_t lsb = 0;
259  uint8_t msb = 0;
260  MXM_Unipolar14BitInto16Bit(value_14bit, &lsb, &msb);
261  TEST_ASSERT_EQUAL(0x98u, lsb);
262  TEST_ASSERT_EQUAL(0x19u, msb);
263 }
264 
266  uint16_t voltage = 5000u;
267  uint16_t voltage_result = voltage;
268  uint8_t lsb = 0;
269  uint8_t msb = 0;
270 
271  uint16_t converted_voltage = MXM_VoltageIntoUnipolar14Bit(voltage, 5000);
272 
273  MXM_Unipolar14BitInto16Bit(converted_voltage, &lsb, &msb);
274 
275  TEST_ASSERT_PASS_ASSERT(MXM_Convert(lsb, msb, &voltage_result, MXM_CONVERSION_UNIPOLAR, 5000));
276 
277  TEST_ASSERT_EQUAL(voltage, voltage_result);
278 }
279 
281  uint16_t voltage = 0u;
282  uint16_t voltage_result = voltage;
283  uint8_t lsb = 0;
284  uint8_t msb = 0;
285 
286  uint16_t converted_voltage = MXM_VoltageIntoUnipolar14Bit(voltage, 5000);
287 
288  MXM_Unipolar14BitInto16Bit(converted_voltage, &lsb, &msb);
289 
290  TEST_ASSERT_PASS_ASSERT(MXM_Convert(lsb, msb, &voltage_result, MXM_CONVERSION_UNIPOLAR, 5000));
291 
292  TEST_ASSERT_EQUAL(voltage, voltage_result);
293 }
294 
296  uint16_t voltage = 4200u;
297  uint16_t voltage_result = voltage;
298  uint8_t lsb = 0;
299  uint8_t msb = 0;
300 
301  uint16_t converted_voltage = MXM_VoltageIntoUnipolar14Bit(voltage, 5000);
302  TEST_ASSERT_EQUAL(0x35C1u, converted_voltage);
303 
304  MXM_Unipolar14BitInto16Bit(converted_voltage, &lsb, &msb);
305  TEST_ASSERT_EQUAL(0x04u, lsb);
306  TEST_ASSERT_EQUAL(0xD7u, msb);
307 
308  TEST_ASSERT_PASS_ASSERT(MXM_Convert(lsb, msb, &voltage_result, MXM_CONVERSION_UNIPOLAR, 5000));
309 
310  TEST_ASSERT_EQUAL(voltage, voltage_result);
311 }
312 
313 /* WARNING: in order for the MXM_ConvertModuleToString tests to work as expected,
314  make sure that both test and source have been rebuilt (clear the build) after
315  changing system defines such as BS_NR_OF_MODULES_PER_STRING */
316 
318  uint8_t stringNumber = 0u;
319  uint16_t moduleNumberInString = 0u;
320  TEST_ASSERT_FAIL_ASSERT(MXM_ConvertModuleToString(0u, NULL_PTR, &moduleNumberInString));
322 }
323 
325  uint8_t stringNumber = 0u;
326  uint16_t moduleNumberInString = 0u;
327  /* module index #MXM_MAXIMUM_NR_OF_MODULES should not be ok */
328  TEST_ASSERT_FAIL_ASSERT(MXM_ConvertModuleToString(MXM_MAXIMUM_NR_OF_MODULES, &stringNumber, &moduleNumberInString));
329 }
330 
332  uint8_t stringNumber = 0u;
333  uint16_t moduleNumberInString = 0u;
334  /* The system cannot have more modules than BS_NR_OF_STRINGS*BS_NR_OF_MODULES_PER_STRING */
336  (BS_NR_OF_STRINGS * BS_NR_OF_MODULES_PER_STRING), &stringNumber, &moduleNumberInString));
337 }
338 
340  const uint8_t expectedStringNumber = 0u;
341  uint8_t stringNumber = 42u;
342  const uint16_t expectedModuleNumberInString = 0u;
343  uint16_t moduleNumberInString = 42u;
345  (expectedStringNumber * BS_NR_OF_MODULES_PER_STRING), &stringNumber, &moduleNumberInString));
346 
347  TEST_ASSERT_EQUAL(expectedStringNumber, stringNumber);
348  TEST_ASSERT_EQUAL(expectedModuleNumberInString, moduleNumberInString);
349 }
350 
352  /* skip this test if the BMS configuration does not fit to this test (we need a second string) */
353  if (BS_NR_OF_STRINGS < 2u) {
354  TEST_PASS_MESSAGE("This test is skipped due to the configuration of the BMS.");
355  }
356  const uint8_t expectedStringNumber = 1u;
357  uint8_t stringNumber = 0u;
358  const uint16_t expectedModuleNumberInString = 0u;
359  uint16_t moduleNumberInString = 42u;
361  (expectedStringNumber * BS_NR_OF_MODULES_PER_STRING), &stringNumber, &moduleNumberInString));
362 
363  TEST_ASSERT_EQUAL(expectedStringNumber, stringNumber);
364  TEST_ASSERT_EQUAL(expectedModuleNumberInString, moduleNumberInString);
365 }
366 
368  /* skip this test if the BMS configuration does not fit to this test (we need a second module) */
369  if (BS_NR_OF_MODULES_PER_STRING < 2u) {
370  TEST_PASS_MESSAGE("This test is skipped due to the configuration of the BMS.");
371  }
372  const uint8_t expectedStringNumber = 0u;
373  uint8_t stringNumber = 42u;
374  const uint16_t expectedModuleNumberInString = 1u;
375  uint16_t moduleNumberInString = 42u;
377  ((expectedStringNumber * BS_NR_OF_MODULES_PER_STRING) + expectedModuleNumberInString),
378  &stringNumber,
379  &moduleNumberInString));
380 
381  TEST_ASSERT_EQUAL(expectedStringNumber, stringNumber);
382  TEST_ASSERT_EQUAL(expectedModuleNumberInString, moduleNumberInString);
383 }
384 
386  /* skip this test if the BMS configuration does not fit to this test (we need a second module) */
387  if ((BS_NR_OF_MODULES_PER_STRING < 2u) || (BS_NR_OF_STRINGS < 2u)) {
388  TEST_PASS_MESSAGE("This test is skipped due to the configuration of the BMS.");
389  }
390  const uint8_t expectedStringNumber = 1u;
391  uint8_t stringNumber = 42u;
392  const uint16_t expectedModuleNumberInString = 1u;
393  uint16_t moduleNumberInString = 42u;
395  (expectedModuleNumberInString + (expectedStringNumber * BS_NR_OF_MODULES_PER_STRING)),
396  &stringNumber,
397  &moduleNumberInString));
398 
399  TEST_ASSERT_EQUAL(expectedStringNumber, stringNumber);
400  TEST_ASSERT_EQUAL(expectedModuleNumberInString, moduleNumberInString);
401 }
#define BS_NR_OF_STRINGS
Number of parallel strings in the battery pack.
#define BS_NR_OF_MODULES_PER_STRING
number of modules in a string
@ STD_OK
Definition: fstd_types.h:83
#define NULL_PTR
Null pointer.
Definition: fstd_types.h:77
#define MXM_BM_LSB
Monitoring Register LSB.
#define MXM_REG_STATUS1_ALRTINTRFC
ALRTINTRFC bit in STATUS1.
#define MXM_BM_MSB
Monitoring Register MSB.
#define MXM_REG_STATUS1_ALRTRST
ALRTRST bit in STATUS1.
#define MXM_REG_ADC_14BIT_VALUE
Monitoring Register 14bit ADC value.
void MXM_Unipolar14BitInto16Bit(uint16_t inputValue, uint8_t *lsb, uint8_t *msb)
convert a unipolar 14bit-value and shifts it into the 16bit-format
void MXM_ConvertModuleToString(const uint16_t moduleNumber, uint8_t *pStringNumber, uint16_t *pModuleNumberInString)
Get the string and module number from a global module number.
STD_RETURN_TYPE_e GEN_MUST_CHECK_RETURN MXM_ConvertTest(void)
Test the MXM_Convert()-function.
STD_RETURN_TYPE_e GEN_MUST_CHECK_RETURN MXM_ExtractValueFromRegisterTest(void)
Test MXM_ExtractValueFromRegister().
uint16_t MXM_VoltageIntoUnipolar14Bit(uint16_t voltage_mV, uint16_t fullscaleReference_mV)
convert a voltage value into a unipolar 14bit value
void MXM_Convert(uint8_t lsb, uint8_t msb, uint16_t *pTarget, MXM_CONVERSION_TYPE_e convType, uint32_t fullScaleReference_mV)
Convert a measurement value to a voltage value.
STD_RETURN_TYPE_e GEN_MUST_CHECK_RETURN MXM_FirstSetBitTest(void)
Test MXM_FirstSetBit().
void MXM_ExtractValueFromRegister(uint8_t lsb, uint8_t msb, MXM_REG_BM bitmask, uint16_t *pValue)
Extract a value from a single register.
This is a collection of helper functions for the MAX1785x ICs.
MXM_CONVERSION_TYPE_e
@ MXM_CONVERSION_UNIPOLAR
#define MXM_MAXIMUM_NR_OF_MODULES
Maximum number of modules.
Helper for unit tests.
#define TEST_ASSERT_PASS_ASSERT(_code_under_test)
assert whether assert macro has passed
#define TEST_ASSERT_FAIL_ASSERT(_code_under_test)
assert whether assert macro has failed
void testMXM_ConvertInvalidConversionType(void)
void testConversionExtractAndInsertRoundTripFullScale(void)
void testMXM_ExtractValueFromRegisterLsbCompletelySet(void)
void testMXM_VoltageIntoUnipolar14Bit(void)
void testMXM_FirstSetBitTest(void)
void testMXM_ConvertModuleToStringTooManyForSystem(void)
void testMXM_ConvertSelfCheck(void)
void testMXM_ConvertModuleToStringSecondInFirstString(void)
void testScaleAndConvert2500(void)
void testMXM_ConvertModuleToStringSecondInSecondString(void)
void testMXM_ConvertModuleToStringFirstInFirstString(void)
void testMXM_ExtractValueFromRegisterLsbBitUnset(void)
void testMXM_ConvertModuleToStringFirstInSecondString(void)
void testMXM_ConvertHalfScale(void)
void testMXM_ExtractValueFromRegisterADCValue(void)
void testMXM_Unipolar14BitInto16BitWithInput0(void)
void testMXM_ExtractValueFromRegisterMsbCompletelySet(void)
void setUp(void)
void tearDown(void)
void testMXM_ExtractValueFromRegisterMsbBitSet(void)
void testConversionExtractAndInsertRoundTripNull(void)
void testMXM_ExtractValueFromRegisterLsbBitSet(void)
void testConversionExtractAndInsertRoundTripSomeValue(void)
void testScaleAndConvert500(void)
void testMXM_ConvertLowScale(void)
void testMXM_ConvertFullScale(void)
void testMXM_ExtractValueFromRegisterMsbBitSetFullBytes(void)
void testMXM_ExtractValueFromRegisterTest(void)
void testMXM_ConvertModuleToStringNullPointer(void)
void testMXM_Unipolar14BitInto16BitWithInput3FFF(void)
void testMXM_ExtractValueFromRegisterMsbBitUnset(void)
void testMXM_ConvertModuleToStringTooManyForMaxim(void)