Bladeren bron

Fixed SIM808 power management. Straighten the power count logic everywhere

tags/v1.2.0
Bertrand Lemasle 6 jaren geleden
bovenliggende
commit
a8ad48317a
1 gewijzigde bestanden met toevoegingen van 52 en 43 verwijderingen
  1. +52
    -43
      Hardware.cpp

+ 52
- 43
Hardware.cpp Bestand weergeven

@@ -37,6 +37,9 @@ namespace hardware {
}

void powerOffIfUnused() {
//does not rely on count for safety
//if there is a bug somewhere, the device will consume more battery,
//but will not fail due to an over aggressive battery saving strategy
bool gpsPowered = false;

if ((!device.getGpsPowerState(&gpsPowered) || !gpsPowered) &&
@@ -53,13 +56,14 @@ namespace hardware {
}

void gpsPowerOn() {
if (!gpsPoweredCount) {
VERBOSE("gpsPowerOn");
powerOn();
device.enableGps();
if(gpsPoweredCount) {
gpsPoweredCount++;
return;
}

gpsPoweredCount++;
VEBOSE("gpsPowerOn");
powerOn();
device.enableGps();
}

void gpsPowerOff() {
@@ -68,23 +72,25 @@ namespace hardware {
return;
}

if (gpsPoweredCount == 1) {
VERBOSE("gpsPowerOff");
device.disableGps();
powerOffIfUnused();
if(gpsPoweredCount > 1) {
gpsPoweredCount--;
return;
}

if (gpsPoweredCount) gpsPoweredCount--; //avoid 255 if 0--
VERBOSE("gpsPowerOff");
device.disableGps();
powerOffIfUnused();
}

void networkPowerOn() {
if (!networkPoweredCount) {
VERBOSE("networkPowerOn");
powerOn();
device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::FULL);
if(networkPoweredCount) {
networkPoweredCount++;
return;
}

networkPoweredCount++;
VERBOSE("networkPowerOn");
powerOn();
device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::FULL);
}

void networkPowerOff() {
@@ -93,16 +99,15 @@ namespace hardware {
return;
}


if (networkPoweredCount == 1) {
VERBOSE("networkPowerOff");
device.disableGprs();
device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::MINIMUM);

powerOffIfUnused();
if(networkPoweredCount > 1) {
networkPoweredCount--;
return;
}

if (networkPoweredCount) networkPoweredCount--; //avoid 255 if 0--
VERBOSE("networkPowerOff");
device.disableGprs();
device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::MINIMUM);
powerOffIfUnused();
}
}

@@ -114,33 +119,37 @@ namespace hardware {
uint8_t poweredCount = 0;

void powerOn() {
if (!poweredCount) {
VERBOSE("powerOn");
digitalWrite(I2C_PWR, HIGH);
pinMode(I2C_PWR, OUTPUT);

Wire.begin();
poweredCount = 1;
if(poweredCount) {
poweredCount++;
return;
}
else poweredCount++;

VERBOSE("powerOn");
digitalWrite(I2C_PWR, HIGH);
pinMode(I2C_PWR, OUTPUT);

Wire.begin();
poweredCount = 1;
}

void powerOff(bool forced = false) {
if (poweredCount == 1 || forced) {
VERBOSE("powerOff");
pinMode(I2C_PWR, INPUT);
digitalWrite(I2C_PWR, LOW);
if(poweredCount > 1 && !forced) {
poweredCount--;
return;
}

VERBOSE("powerOff");
pinMode(I2C_PWR, INPUT);
digitalWrite(I2C_PWR, LOW);

//turn off i2c
TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));
//turn off i2c
TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));

//disable i2c internal pull ups
digitalWrite(A4, LOW);
digitalWrite(A5, LOW);
//disable i2c internal pull ups
digitalWrite(A4, LOW);
digitalWrite(A5, LOW);

poweredCount = 0;
}
else if(poweredCount > 1) poweredCount--; //avoid decrement if == 0
poweredCount = 0;
}
}
}

Laden…
Annuleren
Opslaan