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

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?

UserRevisionLine numberNew 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(&currentMA));
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(&currentMA));
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