/main/pm.c
#include <stdint.h>

#include "driver/gpio.h"
#include "esp_sleep.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include "gfx.h"
#include "pm.h"

void deep_sleep() {
	// Set ~SHDN low
	gpio_set_level(GPIO_NUM_14, 0);

	// Turn off display
	gfx_set_power(0);

	u8g2_ClearBuffer(&u8g2);
	u8g2_SendBuffer(&u8g2);

	// Wait for a bit for the button to be released.
	vTaskDelay(1000 / portTICK_PERIOD_MS);

	// Set GPIO25-27 high
	gpio_set_level(GPIO_NUM_25, 1);
	gpio_set_level(GPIO_NUM_26, 1);
	gpio_set_level(GPIO_NUM_27, 1);

	// Set ~SHDN, GPIO25-27 HOLD
	gpio_hold_en(GPIO_NUM_14);
	gpio_hold_en(GPIO_NUM_25);
	gpio_hold_en(GPIO_NUM_26);
	gpio_hold_en(GPIO_NUM_27);

	// Set hold in deep sleep
	gpio_deep_sleep_hold_en();

	// Trigger wakeup on any keyboard row going high
	esp_sleep_enable_ext1_wakeup(
		1ull << 34 | 1ull << 35 | 1ull << 36 | 1ull << 39,
		ESP_EXT1_WAKEUP_ANY_HIGH
	);

	// See you on the other side
	esp_deep_sleep_start();
}