#include "MainUnit.h"
#include "Rtc.h"
#include "Hardware.h"
#include "config/Pins.h"
#include "Logging.h"


extern int __heap_start, *__brkval;

namespace mainunit {
	#define CURRENT_LOGGER "mainunit"

	namespace details {

		void prepareSleep() {
			hardware::sim808::simSerial.end(); //avoid woke up by SoftwareSerial interrupt
			delay(5); //ensure log messages have been printed out
		}

		void wokeUp() {
			#define CURRENT_LOGGER_FUNCTION "wokeUp"

			tmElements_t wokeUpTime;
			rtc::getTime(wokeUpTime);
			VERBOSE_FORMAT("%d:%d:%d", wokeUpTime.hour, wokeUpTime.minute, wokeUpTime.second);

			hardware::sim808::simSerial.listen();
		}

	}

	void interrupt() {
		detachInterrupt(digitalPinToInterrupt(RTC_WAKE));
	}

	void interruptIn(uint16_t seconds) {
		rtc::setAlarm(seconds);

		pinMode(RTC_WAKE, INPUT);
		attachInterrupt(digitalPinToInterrupt(RTC_WAKE), interrupt, FALLING);
	}

	void deepSleep(uint16_t seconds) {
		#define CURRENT_LOGGER_FUNCTION "deepSleep"
		NOTICE_FORMAT("%ds", seconds);

		interruptIn(seconds);
		details::prepareSleep();
		LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
		details::wokeUp();
	}

	int freeRam() {
		int v;
		return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
	}
}