This class provides APIs to all of the registers of the TI BQ35100 battery gauge, as used on the u-blox C030 primary battery shield.
Dependents: example-battery-gauge-bq35100
TESTS/unit_tests/default/main.cpp@1:ee7cc8d75283, 2017-11-09 (annotated)
- Committer:
- RobMeades
- Date:
- Thu Nov 09 22:55:13 2017 +0000
- Revision:
- 1:ee7cc8d75283
- Parent:
- 0:cec745c014b7
- Child:
- 2:4c699a813451
Lots of functionality, having figured out that a reduced I2C clock rate seems to be required and how the seal/unseal functionality and data flash checksumming works.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RobMeades | 0:cec745c014b7 | 1 | #include "mbed.h" |
RobMeades | 0:cec745c014b7 | 2 | #include "greentea-client/test_env.h" |
RobMeades | 0:cec745c014b7 | 3 | #include "unity.h" |
RobMeades | 0:cec745c014b7 | 4 | #include "utest.h" |
RobMeades | 0:cec745c014b7 | 5 | #include "battery_gauge_bq35100.h" |
RobMeades | 0:cec745c014b7 | 6 | |
RobMeades | 0:cec745c014b7 | 7 | using namespace utest::v1; |
RobMeades | 0:cec745c014b7 | 8 | |
RobMeades | 0:cec745c014b7 | 9 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 10 | // COMPILE-TIME MACROS |
RobMeades | 0:cec745c014b7 | 11 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 12 | |
RobMeades | 1:ee7cc8d75283 | 13 | // The gauge enable pin |
RobMeades | 1:ee7cc8d75283 | 14 | #define GAUGE_ENABLE_PIN D4 |
RobMeades | 1:ee7cc8d75283 | 15 | |
RobMeades | 1:ee7cc8d75283 | 16 | // Pick some sensible minimum and maximum numbers |
RobMeades | 1:ee7cc8d75283 | 17 | #define MAX_TEMPERATURE_READING_C 80 |
RobMeades | 1:ee7cc8d75283 | 18 | #define MIN_TEMPERATURE_READING_C -20 |
RobMeades | 1:ee7cc8d75283 | 19 | #define MIN_VOLTAGE_READING_MV 0 |
RobMeades | 1:ee7cc8d75283 | 20 | #define MAX_VOLTAGE_READING_MV 12000 |
RobMeades | 1:ee7cc8d75283 | 21 | #define MAX_CURRENT_READING_MA 2000 |
RobMeades | 1:ee7cc8d75283 | 22 | #define MIN_CURRENT_READING_MA -2000 |
RobMeades | 1:ee7cc8d75283 | 23 | #define MIN_CAPACITY_READING_UAH 0 |
RobMeades | 1:ee7cc8d75283 | 24 | #define MAX_CAPACITY_READING_UAH 30000000 |
RobMeades | 1:ee7cc8d75283 | 25 | #define SET_DESIGN_CAPACITY_MAH 32177 |
RobMeades | 1:ee7cc8d75283 | 26 | |
RobMeades | 0:cec745c014b7 | 27 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 28 | // PRIVATE VARIABLES |
RobMeades | 0:cec745c014b7 | 29 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 30 | |
RobMeades | 0:cec745c014b7 | 31 | // I2C interface |
RobMeades | 0:cec745c014b7 | 32 | I2C * gpI2C = new I2C(I2C_SDA, I2C_SCL); |
RobMeades | 0:cec745c014b7 | 33 | |
RobMeades | 0:cec745c014b7 | 34 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 35 | // PRIVATE FUNCTIONS |
RobMeades | 0:cec745c014b7 | 36 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 37 | |
RobMeades | 0:cec745c014b7 | 38 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 39 | // TESTS |
RobMeades | 0:cec745c014b7 | 40 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 41 | |
RobMeades | 0:cec745c014b7 | 42 | // Test that the BQ35100 battery gauge can be initialised |
RobMeades | 0:cec745c014b7 | 43 | void test_init() { |
RobMeades | 0:cec745c014b7 | 44 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 0:cec745c014b7 | 45 | |
RobMeades | 1:ee7cc8d75283 | 46 | TEST_ASSERT_FALSE(pBatteryGauge->init(NULL, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 47 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 48 | } |
RobMeades | 1:ee7cc8d75283 | 49 | |
RobMeades | 1:ee7cc8d75283 | 50 | // Test that a temperature reading can be performed |
RobMeades | 1:ee7cc8d75283 | 51 | void test_temperature() { |
RobMeades | 1:ee7cc8d75283 | 52 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 53 | int32_t temperatureC = MIN_TEMPERATURE_READING_C - 1; |
RobMeades | 1:ee7cc8d75283 | 54 | |
RobMeades | 1:ee7cc8d75283 | 55 | // Call should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 56 | TEST_ASSERT_FALSE(pBatteryGauge->getTemperature(&temperatureC)); |
RobMeades | 1:ee7cc8d75283 | 57 | |
RobMeades | 1:ee7cc8d75283 | 58 | // Normal case |
RobMeades | 1:ee7cc8d75283 | 59 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 60 | TEST_ASSERT(pBatteryGauge->getTemperature(&temperatureC)); |
RobMeades | 1:ee7cc8d75283 | 61 | printf ("Temperature %d C.\n", (int) temperatureC); |
RobMeades | 1:ee7cc8d75283 | 62 | // Range check |
RobMeades | 1:ee7cc8d75283 | 63 | TEST_ASSERT((temperatureC >= MIN_TEMPERATURE_READING_C) && (temperatureC <= MAX_TEMPERATURE_READING_C)); |
RobMeades | 1:ee7cc8d75283 | 64 | |
RobMeades | 1:ee7cc8d75283 | 65 | // The parameter is allowed to be NULL |
RobMeades | 1:ee7cc8d75283 | 66 | TEST_ASSERT(pBatteryGauge->getTemperature(NULL)); |
RobMeades | 1:ee7cc8d75283 | 67 | } |
RobMeades | 1:ee7cc8d75283 | 68 | |
RobMeades | 1:ee7cc8d75283 | 69 | // Test that a voltage reading can be performed |
RobMeades | 1:ee7cc8d75283 | 70 | void test_voltage() { |
RobMeades | 1:ee7cc8d75283 | 71 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 72 | int32_t voltageMV = MIN_VOLTAGE_READING_MV - 1; |
RobMeades | 1:ee7cc8d75283 | 73 | |
RobMeades | 1:ee7cc8d75283 | 74 | // Call should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 75 | TEST_ASSERT_FALSE(pBatteryGauge->getVoltage(&voltageMV)); |
RobMeades | 1:ee7cc8d75283 | 76 | |
RobMeades | 1:ee7cc8d75283 | 77 | // Normal case |
RobMeades | 1:ee7cc8d75283 | 78 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 79 | TEST_ASSERT(pBatteryGauge->getVoltage(&voltageMV)); |
RobMeades | 1:ee7cc8d75283 | 80 | printf ("Voltage %.3f V.\n", ((float) voltageMV) / 1000); |
RobMeades | 1:ee7cc8d75283 | 81 | // Range check |
RobMeades | 1:ee7cc8d75283 | 82 | TEST_ASSERT((voltageMV >= MIN_VOLTAGE_READING_MV) && (voltageMV <= MAX_VOLTAGE_READING_MV)); |
RobMeades | 1:ee7cc8d75283 | 83 | |
RobMeades | 1:ee7cc8d75283 | 84 | // The parameter is allowed to be NULL |
RobMeades | 1:ee7cc8d75283 | 85 | TEST_ASSERT(pBatteryGauge->getVoltage(NULL)); |
RobMeades | 1:ee7cc8d75283 | 86 | } |
RobMeades | 1:ee7cc8d75283 | 87 | |
RobMeades | 1:ee7cc8d75283 | 88 | // Test that a current reading can be performed |
RobMeades | 1:ee7cc8d75283 | 89 | void test_current() { |
RobMeades | 1:ee7cc8d75283 | 90 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 91 | int32_t currentMA = MIN_CURRENT_READING_MA - 1; |
RobMeades | 1:ee7cc8d75283 | 92 | |
RobMeades | 1:ee7cc8d75283 | 93 | // Call should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 94 | TEST_ASSERT_FALSE(pBatteryGauge->getCurrent(¤tMA)); |
RobMeades | 1:ee7cc8d75283 | 95 | |
RobMeades | 1:ee7cc8d75283 | 96 | // Normal case |
RobMeades | 1:ee7cc8d75283 | 97 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 98 | TEST_ASSERT(pBatteryGauge->getCurrent(¤tMA)); |
RobMeades | 1:ee7cc8d75283 | 99 | printf ("Current %.3f A.\n", ((float) currentMA) / 1000); |
RobMeades | 1:ee7cc8d75283 | 100 | // Range check |
RobMeades | 1:ee7cc8d75283 | 101 | TEST_ASSERT((currentMA >= MIN_CURRENT_READING_MA) && (currentMA <= MAX_CURRENT_READING_MA)); |
RobMeades | 1:ee7cc8d75283 | 102 | |
RobMeades | 1:ee7cc8d75283 | 103 | // The parameter is allowed to be NULL |
RobMeades | 1:ee7cc8d75283 | 104 | TEST_ASSERT(pBatteryGauge->getCurrent(NULL)); |
RobMeades | 1:ee7cc8d75283 | 105 | } |
RobMeades | 1:ee7cc8d75283 | 106 | |
RobMeades | 1:ee7cc8d75283 | 107 | // Test that a capacity used reading can be performed |
RobMeades | 1:ee7cc8d75283 | 108 | void test_used_capacity() { |
RobMeades | 1:ee7cc8d75283 | 109 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 110 | uint32_t capacityUAh = MIN_CAPACITY_READING_UAH - 1; |
RobMeades | 1:ee7cc8d75283 | 111 | |
RobMeades | 1:ee7cc8d75283 | 112 | // Call should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 113 | TEST_ASSERT_FALSE(pBatteryGauge->getUsedCapacity(&capacityUAh)); |
RobMeades | 1:ee7cc8d75283 | 114 | |
RobMeades | 1:ee7cc8d75283 | 115 | // Normal case |
RobMeades | 1:ee7cc8d75283 | 116 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 117 | TEST_ASSERT(pBatteryGauge->getUsedCapacity(&capacityUAh)); |
RobMeades | 1:ee7cc8d75283 | 118 | printf ("Used capacity %.3f mAh.\n", ((float) capacityUAh) / 1000); |
RobMeades | 1:ee7cc8d75283 | 119 | // Range check |
RobMeades | 1:ee7cc8d75283 | 120 | TEST_ASSERT((capacityUAh >= MIN_CAPACITY_READING_UAH) && (capacityUAh <= MAX_CAPACITY_READING_UAH)); |
RobMeades | 1:ee7cc8d75283 | 121 | |
RobMeades | 1:ee7cc8d75283 | 122 | // The parameter is allowed to be NULL |
RobMeades | 1:ee7cc8d75283 | 123 | TEST_ASSERT(pBatteryGauge->getUsedCapacity(NULL)); |
RobMeades | 1:ee7cc8d75283 | 124 | } |
RobMeades | 1:ee7cc8d75283 | 125 | |
RobMeades | 1:ee7cc8d75283 | 126 | // Test that the design capacity can be set and read |
RobMeades | 1:ee7cc8d75283 | 127 | void test_design_capacity() { |
RobMeades | 1:ee7cc8d75283 | 128 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 129 | uint32_t originalDesignCapacity; |
RobMeades | 1:ee7cc8d75283 | 130 | uint32_t newDesignCapacity = SET_DESIGN_CAPACITY_MAH; |
RobMeades | 1:ee7cc8d75283 | 131 | uint32_t readDesignCapacity = 0; |
RobMeades | 1:ee7cc8d75283 | 132 | |
RobMeades | 1:ee7cc8d75283 | 133 | // Calls should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 134 | TEST_ASSERT_FALSE(pBatteryGauge->getDesignCapacity(&readDesignCapacity)); |
RobMeades | 1:ee7cc8d75283 | 135 | TEST_ASSERT_FALSE(pBatteryGauge->setDesignCapacity(newDesignCapacity)); |
RobMeades | 1:ee7cc8d75283 | 136 | |
RobMeades | 1:ee7cc8d75283 | 137 | // First get the original design capacity |
RobMeades | 1:ee7cc8d75283 | 138 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 139 | TEST_ASSERT(pBatteryGauge->getDesignCapacity(&originalDesignCapacity)); |
RobMeades | 1:ee7cc8d75283 | 140 | printf ("Design capacity was originally %d mAh.\n", (unsigned int) originalDesignCapacity); |
RobMeades | 1:ee7cc8d75283 | 141 | |
RobMeades | 1:ee7cc8d75283 | 142 | // Avoid the old and new values being the same |
RobMeades | 1:ee7cc8d75283 | 143 | if (originalDesignCapacity == newDesignCapacity) { |
RobMeades | 1:ee7cc8d75283 | 144 | newDesignCapacity--; |
RobMeades | 1:ee7cc8d75283 | 145 | } |
RobMeades | 1:ee7cc8d75283 | 146 | |
RobMeades | 1:ee7cc8d75283 | 147 | // Now set a new value |
RobMeades | 1:ee7cc8d75283 | 148 | TEST_ASSERT(pBatteryGauge->setDesignCapacity(newDesignCapacity)); |
RobMeades | 1:ee7cc8d75283 | 149 | printf ("Design capacity set to %d mAh.\n", (unsigned int) newDesignCapacity); |
RobMeades | 1:ee7cc8d75283 | 150 | |
RobMeades | 1:ee7cc8d75283 | 151 | // Read the value back and check that it's been set |
RobMeades | 1:ee7cc8d75283 | 152 | TEST_ASSERT(pBatteryGauge->getDesignCapacity(&readDesignCapacity)); |
RobMeades | 1:ee7cc8d75283 | 153 | printf ("Design capacity was read as %d mAh.\n", (unsigned int) readDesignCapacity); |
RobMeades | 1:ee7cc8d75283 | 154 | TEST_ASSERT(readDesignCapacity = newDesignCapacity) |
RobMeades | 1:ee7cc8d75283 | 155 | |
RobMeades | 1:ee7cc8d75283 | 156 | // The parameter in the get call is allowed to be NULL |
RobMeades | 1:ee7cc8d75283 | 157 | TEST_ASSERT(pBatteryGauge->getDesignCapacity(NULL)); |
RobMeades | 1:ee7cc8d75283 | 158 | |
RobMeades | 1:ee7cc8d75283 | 159 | // Put the original value back |
RobMeades | 1:ee7cc8d75283 | 160 | TEST_ASSERT(pBatteryGauge->setDesignCapacity(originalDesignCapacity)); |
RobMeades | 1:ee7cc8d75283 | 161 | printf ("Design capacity returned to %d mAh.\n", (unsigned int) originalDesignCapacity); |
RobMeades | 1:ee7cc8d75283 | 162 | } |
RobMeades | 1:ee7cc8d75283 | 163 | |
RobMeades | 1:ee7cc8d75283 | 164 | // Test that a remaining capacity reading can be performed |
RobMeades | 1:ee7cc8d75283 | 165 | void test_remaining_capacity() { |
RobMeades | 1:ee7cc8d75283 | 166 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 167 | uint32_t capacityUAh = MIN_CAPACITY_READING_UAH - 1; |
RobMeades | 1:ee7cc8d75283 | 168 | |
RobMeades | 1:ee7cc8d75283 | 169 | // Call should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 170 | TEST_ASSERT_FALSE(pBatteryGauge->getRemainingCapacity(&capacityUAh)); |
RobMeades | 1:ee7cc8d75283 | 171 | |
RobMeades | 1:ee7cc8d75283 | 172 | // Normal case |
RobMeades | 1:ee7cc8d75283 | 173 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 174 | TEST_ASSERT(pBatteryGauge->getRemainingCapacity(&capacityUAh)); |
RobMeades | 1:ee7cc8d75283 | 175 | printf ("Remaining capacity %.3f mAh.\n", ((float) capacityUAh) / 1000); |
RobMeades | 1:ee7cc8d75283 | 176 | // Range check |
RobMeades | 1:ee7cc8d75283 | 177 | TEST_ASSERT((capacityUAh >= MIN_CAPACITY_READING_UAH) && (capacityUAh <= MAX_CAPACITY_READING_UAH)); |
RobMeades | 1:ee7cc8d75283 | 178 | |
RobMeades | 1:ee7cc8d75283 | 179 | // The parameter is allowed to be NULL |
RobMeades | 1:ee7cc8d75283 | 180 | TEST_ASSERT(pBatteryGauge->getRemainingCapacity(NULL)); |
RobMeades | 1:ee7cc8d75283 | 181 | } |
RobMeades | 1:ee7cc8d75283 | 182 | |
RobMeades | 1:ee7cc8d75283 | 183 | // Test that a remaining precentage reading can be performed |
RobMeades | 1:ee7cc8d75283 | 184 | void test_remaining_percentage() { |
RobMeades | 1:ee7cc8d75283 | 185 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 186 | int32_t percentage = -1; |
RobMeades | 1:ee7cc8d75283 | 187 | |
RobMeades | 1:ee7cc8d75283 | 188 | // Call should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 189 | TEST_ASSERT_FALSE(pBatteryGauge->getRemainingPercentage(&percentage)); |
RobMeades | 1:ee7cc8d75283 | 190 | |
RobMeades | 1:ee7cc8d75283 | 191 | // Normal case |
RobMeades | 1:ee7cc8d75283 | 192 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 193 | TEST_ASSERT(pBatteryGauge->getRemainingPercentage(&percentage)); |
RobMeades | 1:ee7cc8d75283 | 194 | printf ("Remaining capacity %d%%.\n", (signed int) percentage); |
RobMeades | 1:ee7cc8d75283 | 195 | // Range check |
RobMeades | 1:ee7cc8d75283 | 196 | TEST_ASSERT((percentage >= 0) && (percentage <= 100)); |
RobMeades | 1:ee7cc8d75283 | 197 | |
RobMeades | 1:ee7cc8d75283 | 198 | // The parameter is allowed to be NULL |
RobMeades | 1:ee7cc8d75283 | 199 | TEST_ASSERT(pBatteryGauge->getRemainingPercentage(NULL)); |
RobMeades | 1:ee7cc8d75283 | 200 | } |
RobMeades | 1:ee7cc8d75283 | 201 | |
RobMeades | 1:ee7cc8d75283 | 202 | // Test that the security mode of the chip can be changed |
RobMeades | 1:ee7cc8d75283 | 203 | void test_advanced_security_mode() { |
RobMeades | 1:ee7cc8d75283 | 204 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 205 | BatteryGaugeBq35100::SecurityMode securityMode; |
RobMeades | 1:ee7cc8d75283 | 206 | |
RobMeades | 1:ee7cc8d75283 | 207 | // Get the existing device mode and then set it to sealed |
RobMeades | 1:ee7cc8d75283 | 208 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 209 | printf ("Calling advancedGetSecurityMode()...\n"); |
RobMeades | 1:ee7cc8d75283 | 210 | securityMode = pBatteryGauge->advancedGetSecurityMode(); |
RobMeades | 1:ee7cc8d75283 | 211 | printf ("Calling advancedSetSecurityMode(SECURITY_MODE_SEALED)...\n"); |
RobMeades | 1:ee7cc8d75283 | 212 | TEST_ASSERT(pBatteryGauge->advancedSetSecurityMode(BatteryGaugeBq35100::SECURITY_MODE_SEALED)); |
RobMeades | 1:ee7cc8d75283 | 213 | |
RobMeades | 1:ee7cc8d75283 | 214 | delete pBatteryGauge; |
RobMeades | 1:ee7cc8d75283 | 215 | pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 216 | // Calls should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 217 | printf ("Calling advancedGetSecurityMode()...\n"); |
RobMeades | 1:ee7cc8d75283 | 218 | TEST_ASSERT(pBatteryGauge->advancedGetSecurityMode() == BatteryGaugeBq35100::SECURITY_MODE_UNKNOWN); |
RobMeades | 1:ee7cc8d75283 | 219 | printf ("Calling advancedSetSecurityMode(SECURITY_MODE_UNSEALED)...\n"); |
RobMeades | 1:ee7cc8d75283 | 220 | TEST_ASSERT_FALSE(pBatteryGauge->advancedSetSecurityMode(BatteryGaugeBq35100::SECURITY_MODE_UNSEALED)); |
RobMeades | 1:ee7cc8d75283 | 221 | |
RobMeades | 1:ee7cc8d75283 | 222 | // Normal case |
RobMeades | 1:ee7cc8d75283 | 223 | printf ("Calling init()...\n"); |
RobMeades | 1:ee7cc8d75283 | 224 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 225 | printf ("Calling advancedGetSecurityMode()...\n"); |
RobMeades | 1:ee7cc8d75283 | 226 | TEST_ASSERT(pBatteryGauge->advancedGetSecurityMode() == BatteryGaugeBq35100::SECURITY_MODE_SEALED); |
RobMeades | 1:ee7cc8d75283 | 227 | |
RobMeades | 1:ee7cc8d75283 | 228 | // These calls should fail |
RobMeades | 1:ee7cc8d75283 | 229 | // TODO do a thing that only works when unsealed |
RobMeades | 1:ee7cc8d75283 | 230 | // TODO do a thing that only works when full access |
RobMeades | 1:ee7cc8d75283 | 231 | |
RobMeades | 1:ee7cc8d75283 | 232 | // Now unseal it |
RobMeades | 1:ee7cc8d75283 | 233 | printf ("Calling advancedSetSecurityMode(SECURITY_MODE_UNSEALED)...\n"); |
RobMeades | 1:ee7cc8d75283 | 234 | TEST_ASSERT(pBatteryGauge->advancedSetSecurityMode(BatteryGaugeBq35100::SECURITY_MODE_UNSEALED)); |
RobMeades | 1:ee7cc8d75283 | 235 | |
RobMeades | 1:ee7cc8d75283 | 236 | // This call should now pass |
RobMeades | 1:ee7cc8d75283 | 237 | // TODO do a thing that only works when unsealed |
RobMeades | 1:ee7cc8d75283 | 238 | |
RobMeades | 1:ee7cc8d75283 | 239 | // But this should still fail |
RobMeades | 1:ee7cc8d75283 | 240 | // TODO do a thing that only works when full access |
RobMeades | 1:ee7cc8d75283 | 241 | |
RobMeades | 1:ee7cc8d75283 | 242 | // Seal it again |
RobMeades | 1:ee7cc8d75283 | 243 | printf ("Calling advancedSetSecurityMode(SECURITY_MODE_SEALED)...\n"); |
RobMeades | 1:ee7cc8d75283 | 244 | TEST_ASSERT(pBatteryGauge->advancedSetSecurityMode(BatteryGaugeBq35100::SECURITY_MODE_SEALED)); |
RobMeades | 1:ee7cc8d75283 | 245 | |
RobMeades | 1:ee7cc8d75283 | 246 | // Now allow full access, which should fail as you can't get there from SEALED |
RobMeades | 1:ee7cc8d75283 | 247 | printf ("Calling advancedSetSecurityMode(SECURITY_MODE_FULL_ACCESS)...\n"); |
RobMeades | 1:ee7cc8d75283 | 248 | TEST_ASSERT_FALSE(pBatteryGauge->advancedSetSecurityMode(BatteryGaugeBq35100::SECURITY_MODE_FULL_ACCESS)); |
RobMeades | 1:ee7cc8d75283 | 249 | |
RobMeades | 1:ee7cc8d75283 | 250 | // Now unseal it |
RobMeades | 1:ee7cc8d75283 | 251 | printf ("Calling advancedSetSecurityMode(SECURITY_MODE_UNSEALED)...\n"); |
RobMeades | 1:ee7cc8d75283 | 252 | TEST_ASSERT(pBatteryGauge->advancedSetSecurityMode(BatteryGaugeBq35100::SECURITY_MODE_UNSEALED)); |
RobMeades | 1:ee7cc8d75283 | 253 | |
RobMeades | 1:ee7cc8d75283 | 254 | // *Now* allow full access, which should succeed |
RobMeades | 1:ee7cc8d75283 | 255 | printf ("Calling advancedSetSecurityMode(SECURITY_MODE_FULL_ACCESS)...\n"); |
RobMeades | 1:ee7cc8d75283 | 256 | TEST_ASSERT(pBatteryGauge->advancedSetSecurityMode(BatteryGaugeBq35100::SECURITY_MODE_FULL_ACCESS)); |
RobMeades | 1:ee7cc8d75283 | 257 | |
RobMeades | 1:ee7cc8d75283 | 258 | // These calls should now both pass |
RobMeades | 1:ee7cc8d75283 | 259 | // TODO do a thing that only works when unsealed |
RobMeades | 1:ee7cc8d75283 | 260 | // TODO do a thing that only works when full access |
RobMeades | 1:ee7cc8d75283 | 261 | |
RobMeades | 1:ee7cc8d75283 | 262 | // Put the device back the way it was |
RobMeades | 1:ee7cc8d75283 | 263 | TEST_ASSERT(pBatteryGauge->advancedSetSecurityMode(securityMode)); |
RobMeades | 1:ee7cc8d75283 | 264 | } |
RobMeades | 1:ee7cc8d75283 | 265 | |
RobMeades | 1:ee7cc8d75283 | 266 | // Reset the BQ35100 battery gauge chip at the outset |
RobMeades | 1:ee7cc8d75283 | 267 | void test_advanced_reset() { |
RobMeades | 1:ee7cc8d75283 | 268 | BatteryGaugeBq35100 * pBatteryGauge = new BatteryGaugeBq35100(); |
RobMeades | 1:ee7cc8d75283 | 269 | BatteryGaugeBq35100::SecurityMode securityMode; |
RobMeades | 1:ee7cc8d75283 | 270 | |
RobMeades | 1:ee7cc8d75283 | 271 | // Call should fail if the battery gauge has not been initialised |
RobMeades | 1:ee7cc8d75283 | 272 | TEST_ASSERT_FALSE(pBatteryGauge->advancedReset()); |
RobMeades | 1:ee7cc8d75283 | 273 | |
RobMeades | 1:ee7cc8d75283 | 274 | // Get the existing security mode and then set it to unsealed |
RobMeades | 1:ee7cc8d75283 | 275 | TEST_ASSERT(pBatteryGauge->init(gpI2C, GAUGE_ENABLE_PIN)); |
RobMeades | 1:ee7cc8d75283 | 276 | |
RobMeades | 1:ee7cc8d75283 | 277 | printf ("Calling advancedGetSecurityMode()...\n"); |
RobMeades | 1:ee7cc8d75283 | 278 | securityMode = pBatteryGauge->advancedGetSecurityMode(); |
RobMeades | 1:ee7cc8d75283 | 279 | printf ("Calling advancedSetSecurityMode(SECURITY_MODE_UNSEALED)...\n"); |
RobMeades | 1:ee7cc8d75283 | 280 | TEST_ASSERT(pBatteryGauge->advancedSetSecurityMode(BatteryGaugeBq35100::SECURITY_MODE_UNSEALED)); |
RobMeades | 1:ee7cc8d75283 | 281 | |
RobMeades | 1:ee7cc8d75283 | 282 | // TODO: modify a thing that will later be reset |
RobMeades | 1:ee7cc8d75283 | 283 | |
RobMeades | 1:ee7cc8d75283 | 284 | // Now reset the chip |
RobMeades | 1:ee7cc8d75283 | 285 | printf ("Calling advancedReset()...\n"); |
RobMeades | 1:ee7cc8d75283 | 286 | TEST_ASSERT(pBatteryGauge->advancedReset()); |
RobMeades | 1:ee7cc8d75283 | 287 | |
RobMeades | 1:ee7cc8d75283 | 288 | // TODO check that the thing has been reset |
RobMeades | 1:ee7cc8d75283 | 289 | |
RobMeades | 1:ee7cc8d75283 | 290 | // Put the security mode back to what it was |
RobMeades | 1:ee7cc8d75283 | 291 | TEST_ASSERT(pBatteryGauge->advancedSetSecurityMode(securityMode)); |
RobMeades | 0:cec745c014b7 | 292 | } |
RobMeades | 0:cec745c014b7 | 293 | |
RobMeades | 0:cec745c014b7 | 294 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 295 | // TEST ENVIRONMENT |
RobMeades | 0:cec745c014b7 | 296 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 297 | |
RobMeades | 0:cec745c014b7 | 298 | // Setup the test environment |
RobMeades | 0:cec745c014b7 | 299 | utest::v1::status_t test_setup(const size_t number_of_cases) { |
RobMeades | 0:cec745c014b7 | 300 | // Setup Greentea, timeout is long enough to run these tests with |
RobMeades | 0:cec745c014b7 | 301 | // DEBUG_BQ35100 defined |
RobMeades | 0:cec745c014b7 | 302 | GREENTEA_SETUP(480, "default_auto"); |
RobMeades | 0:cec745c014b7 | 303 | return verbose_test_setup_handler(number_of_cases); |
RobMeades | 0:cec745c014b7 | 304 | } |
RobMeades | 0:cec745c014b7 | 305 | |
RobMeades | 0:cec745c014b7 | 306 | // Test cases |
RobMeades | 0:cec745c014b7 | 307 | Case cases[] = { |
RobMeades | 1:ee7cc8d75283 | 308 | Case("Initialisation", test_init), |
RobMeades | 1:ee7cc8d75283 | 309 | Case("Temperature read", test_temperature), |
RobMeades | 1:ee7cc8d75283 | 310 | Case("Voltage read", test_voltage), |
RobMeades | 1:ee7cc8d75283 | 311 | Case("Current read", test_current), |
RobMeades | 1:ee7cc8d75283 | 312 | Case("Used capacity read", test_used_capacity), |
RobMeades | 1:ee7cc8d75283 | 313 | Case("Design capacity read/set", test_design_capacity), |
RobMeades | 1:ee7cc8d75283 | 314 | Case("Remaining capacity read", test_remaining_capacity), |
RobMeades | 1:ee7cc8d75283 | 315 | Case("Remaining precentage read", test_remaining_percentage), |
RobMeades | 1:ee7cc8d75283 | 316 | Case("Advanced security mode", test_advanced_security_mode), |
RobMeades | 1:ee7cc8d75283 | 317 | Case("Advanced reset", test_advanced_reset) |
RobMeades | 0:cec745c014b7 | 318 | }; |
RobMeades | 0:cec745c014b7 | 319 | |
RobMeades | 0:cec745c014b7 | 320 | Specification specification(test_setup, cases); |
RobMeades | 0:cec745c014b7 | 321 | |
RobMeades | 0:cec745c014b7 | 322 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 323 | // MAIN |
RobMeades | 0:cec745c014b7 | 324 | // ---------------------------------------------------------------- |
RobMeades | 0:cec745c014b7 | 325 | |
RobMeades | 0:cec745c014b7 | 326 | // Entry point into the tests |
RobMeades | 0:cec745c014b7 | 327 | int main() { |
RobMeades | 0:cec745c014b7 | 328 | bool success = false; |
RobMeades | 0:cec745c014b7 | 329 | |
RobMeades | 0:cec745c014b7 | 330 | if (gpI2C != NULL) { |
RobMeades | 0:cec745c014b7 | 331 | success = !Harness::run(specification); |
RobMeades | 0:cec745c014b7 | 332 | } else { |
RobMeades | 0:cec745c014b7 | 333 | printf ("Unable to instantiate I2C interface.\n"); |
RobMeades | 0:cec745c014b7 | 334 | } |
RobMeades | 0:cec745c014b7 | 335 | |
RobMeades | 0:cec745c014b7 | 336 | return success; |
RobMeades | 0:cec745c014b7 | 337 | } |
RobMeades | 0:cec745c014b7 | 338 | |
RobMeades | 0:cec745c014b7 | 339 | // End Of File |