From 6fc4e7b451ad9c37b7724ee15724a034b6ff8d40 Mon Sep 17 00:00:00 2001
From: Bertrand Lemasle <blemasle@gmail.com>
Date: Sun, 11 Mar 2018 17:26:29 +1300
Subject: [PATCH] Improved logging and removed eepromPowerOff/On &&
 rtcPowerOff/On

---
 GpsTracker/Debug.cpp    |  8 ++---
 GpsTracker/Hardware.cpp | 72 +++++++++++++++--------------------------
 GpsTracker/Hardware.h   |  8 +----
 GpsTracker/Rtc.cpp      |  5 +--
 GpsTracker/Rtc.h        |  4 +--
 GpsTracker/Storage.h    |  4 +--
 6 files changed, 38 insertions(+), 63 deletions(-)

diff --git a/GpsTracker/Debug.cpp b/GpsTracker/Debug.cpp
index 4b3fe41..63eefb3 100644
--- a/GpsTracker/Debug.cpp
+++ b/GpsTracker/Debug.cpp
@@ -173,7 +173,7 @@ namespace debug {
 
 	void getAndDisplayEepromContent() {
 		char buffer[128];
-		hardware::i2c::eepromPowerOn();
+		hardware::i2c::powerOn();
 
 		for (int i = 0; i < 8; i++) {
 			hardware::i2c::eeprom.read(128 * i, buffer, 128);
@@ -182,7 +182,7 @@ namespace debug {
 			}
 		}
 		Serial.println();
-		hardware::i2c::eepromPowerOff();
+		hardware::i2c::powerOff();
 		Log.notice(F("Done\n"));
 	}
 
@@ -190,12 +190,12 @@ namespace debug {
 		uint16_t currentEntryIndex = config::get().firstEntry;
 		PositionEntry currentEntry;
 
-		hardware::i2c::eepromPowerOn();
+		hardware::i2c::powerOn();
 		do {
 			if (!positions::get(currentEntryIndex, currentEntry)) break;
 			details::displayPosition(currentEntry);
 		} while (positions::moveNext(currentEntryIndex));
-		hardware::i2c::eepromPowerOff();
+		hardware::i2c::powerOff();
 	}
 
 	void getAndDisplayEepromLastPosition() {
diff --git a/GpsTracker/Hardware.cpp b/GpsTracker/Hardware.cpp
index 2e1b27b..378ea82 100644
--- a/GpsTracker/Hardware.cpp
+++ b/GpsTracker/Hardware.cpp
@@ -19,6 +19,7 @@ namespace hardware {
 		SIM808 device = SIM808(SIM_RST, SIM_PWR, SIM_STATUS);
 
 		void powerOn() {
+			VERBOSE("powerOn");
 			bool poweredOn = device.powerOnOff(true);
 			if (!poweredOn) return;
 
@@ -26,6 +27,7 @@ namespace hardware {
 		}
 
 		void powerOff() {
+			VERBOSE("powerOff");
 			device.powerOnOff(false);
 		}
 
@@ -39,6 +41,7 @@ namespace hardware {
 		}
 
 		void setup() {
+			VERBOSE("setup");
 			device.powerOnOff(true);
 			simSerial.begin(4800);
 
@@ -47,22 +50,26 @@ namespace hardware {
 		}
 
 		void gpsPowerOn() {
+			VERBOSE("gpsPowerOn");
 			powerOn();
 			device.enableGps();
 		}
 
 		void gpsPowerOff() {
+			VERBOSE("gpsPowerOff");
 			device.disableGps();
 			powerOffIfUnused();
 		}
 
 		void networkPowerOn() {
+			VERBOSE("networkPowerOn");
 			powerOn();
 			device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::FULL);
-			device.enableGprs("Free"); //TODO : configure
+			device.enableGprs(config::get().apn);
 		}
 
 		void networkPowerOff() {
+			VERBOSE("networkPowerOff");
 			device.setPhoneFunctionality(SIM808_PHONE_FUNCTIONALITY::MINIMUM);
 			device.disableGprs();
 
@@ -74,66 +81,39 @@ namespace hardware {
 
 	namespace i2c {
 
-		#define DEVICE_RTC 1
-		#define DEVICE_EEPROM 2
-
 		E24 eeprom = E24(E24Size_t::E24_512K);
 
-		uint8_t powered = 0;
 		uint8_t poweredCount = 0;
 
 		//inline void powered() { digitalRead(I2C_PWR) == HIGH; } //TODO = replace enum with just reading the output pin ?
 
 		void powerOn() {
-			VERBOSE("powerOn");
-			digitalWrite(I2C_PWR, HIGH);
-			pinMode(I2C_PWR, OUTPUT);
-
-			Wire.begin();
-		}
+			if (!poweredCount) {
+				VERBOSE("powerOn");
+				digitalWrite(I2C_PWR, HIGH);
+				pinMode(I2C_PWR, OUTPUT);
 
-		void powerOff() {
-			VERBOSE("powerOff");
-			pinMode(I2C_PWR, INPUT);
-			digitalWrite(I2C_PWR, LOW);
-
-			//turn off i2c
-			TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));
-
-			//disable i2c internal pull ups
-			digitalWrite(A4, LOW);
-			digitalWrite(A5, LOW);
-		}
+				Wire.begin();
+			}
 
-		void powerOnIfPoweredOff() {
-			if (!poweredCount) powerOn();
 			poweredCount++;
 		}
 
-		void powerOffIfUnused() {
-			if (!poweredCount) return;
-			poweredCount--;
-			if (!poweredCount) powerOff();
-		}
+		void powerOff(bool forced = false) {
+			if (poweredCount == 1 || forced) {
+				VERBOSE("powerOff");
+				pinMode(I2C_PWR, INPUT);
+				digitalWrite(I2C_PWR, LOW);
 
-		void rtcPowerOn() {
-			powerOnIfPoweredOff();
-			powered |= DEVICE_RTC;
-		}
+				//turn off i2c
+				TWCR &= ~(bit(TWEN) | bit(TWIE) | bit(TWEA));
 
-		void rtcPowerOff() {
-			powered &= ~DEVICE_RTC;
-			powerOffIfUnused();
-		}
-
-		void eepromPowerOn() {
-			powerOnIfPoweredOff();
-			powered |= DEVICE_EEPROM;
-		}
+				//disable i2c internal pull ups
+				digitalWrite(A4, LOW);
+				digitalWrite(A5, LOW);
+			}
 
-		void eepromPowerOff() {
-			powered &= ~DEVICE_EEPROM;
-			powerOffIfUnused();
+			poweredCount--;
 		}
 	}
 }
diff --git a/GpsTracker/Hardware.h b/GpsTracker/Hardware.h
index 9f41aa7..df67034 100644
--- a/GpsTracker/Hardware.h
+++ b/GpsTracker/Hardware.h
@@ -24,12 +24,6 @@ namespace hardware {
 		extern E24 eeprom;
 
 		void powerOn();
-		void powerOff();
-
-		void rtcPowerOn();
-		void rtcPowerOff();
-
-		void eepromPowerOn();
-		void eepromPowerOff();
+		void powerOff(bool forced = false);
 	}
 }
\ No newline at end of file
diff --git a/GpsTracker/Rtc.cpp b/GpsTracker/Rtc.cpp
index c8a1432..39062e2 100644
--- a/GpsTracker/Rtc.cpp
+++ b/GpsTracker/Rtc.cpp
@@ -35,6 +35,7 @@ namespace rtc {
 	}
 	
 	void setup() {
+		VERBOSE("setup");
 		powerOn();
 		RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock
 		RTC.control(DS3231_INT_ENABLE, DS3231_OFF); //INTCN OFF
@@ -72,13 +73,13 @@ namespace rtc {
 	void setAlarm(tmElements_t &time) {
 		details::writeTimeToRegisters(time);
 
-		hardware::i2c::rtcPowerOn();
+		powerOn();
 		RTC.writeAlarm1(DS3231_ALM_DTHMS);
 
 		RTC.control(DS3231_A1_FLAG, DS3231_OFF); //reset Alarm 1 flag
 		RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON
 		RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
-		hardware::i2c::rtcPowerOff();
+		powerOff();
 
 		Log.notice(F("Set alarm to : %d/%d/%d %d:%d:%d\n"), tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
 
diff --git a/GpsTracker/Rtc.h b/GpsTracker/Rtc.h
index bdf0032..5e2364c 100644
--- a/GpsTracker/Rtc.h
+++ b/GpsTracker/Rtc.h
@@ -5,11 +5,11 @@
 
 namespace rtc {
 	inline void powerOn() {
-		hardware::i2c::rtcPowerOn();
+		hardware::i2c::powerOn();
 	}
 
 	inline void powerOff() {
-		hardware::i2c::rtcPowerOff();
+		hardware::i2c::powerOff();
 	}
 
 	void setup();
diff --git a/GpsTracker/Storage.h b/GpsTracker/Storage.h
index db80633..0058b23 100644
--- a/GpsTracker/Storage.h
+++ b/GpsTracker/Storage.h
@@ -4,11 +4,11 @@
 
 namespace storage {
 	inline void powerOn() {
-		hardware::i2c::eepromPowerOn();
+		hardware::i2c::powerOn();
 	}
 
 	inline void powerOff() {
-		hardware::i2c::eepromPowerOff();
+		hardware::i2c::powerOff();
 	}