penguin/homekey-relay

homekey-relay

tests/presence_test.c

raw ยท 2150 bytes

#include <stdio.h>
#include "../esp32/main/presence.c"
static int64_t now;
static int level, cause;
static unsigned armed, sleeps;
int64_t esp_timer_get_time(void) { return now; }
int gpio_config(const gpio_config_t *c)
{
    assert(c->pin_bit_mask == (1ULL << 5));
    assert(c->mode == GPIO_MODE_INPUT && c->pull_down_en);
    return ESP_OK;
}
int gpio_get_level(int pin) { assert(pin == 5); return level; }
int esp_sleep_get_wakeup_cause(void) { return cause; }
int esp_sleep_enable_gpio_wakeup_on_hp_periph_powerdown(uint64_t mask, int mode)
{
    assert(mask == (1ULL << 5) && mode == ESP_GPIO_WAKEUP_GPIO_HIGH);
    ++armed;
    return ESP_OK;
}
int esp_deep_sleep_enable_gpio_wakeup(uint64_t mask, int mode)
{
    return esp_sleep_enable_gpio_wakeup_on_hp_periph_powerdown(mask, mode);
}
void esp_deep_sleep_start(void) { assert(armed); ++sleeps; }
int main(void)
{
    presence_init();
#ifdef CONFIG_HOMEKEY_PRESENCE_ENABLED
    assert(armed == 1);
    assert(!presence_sleep_requested());
    now = 9999999;
    assert(!presence_sleep_requested());
    now = 10000000;
    assert(presence_sleep_requested());
    level = 1;
    assert(!presence_sleep_requested());
    level = 0;
    assert(!presence_sleep_requested());
    now += 999999;
    assert(!presence_sleep_requested());
    level = 1; /* An observed presence cancels the previous absence. */
    assert(!presence_sleep_requested());
    level = 0;
    assert(!presence_sleep_requested());
    now += 1000000;
    assert(presence_sleep_requested());
    /* New GPIO-wake boot skips cold-start grace. */
    now = 0;
    absent_since = -1;
    cause = ESP_SLEEP_WAKEUP_GPIO;
    presence_init();
    assert(!presence_sleep_requested());
    now = 1000000;
    assert(presence_sleep_requested());
    level = 1; /* Wake source was armed before a late return of presence. */
    presence_enter_sleep();
    assert(sleeps == 1);
#else
    now = 100000000;
    assert(!presence_sleep_requested());
    presence_enter_sleep();
    assert(armed == 0 && sleeps == 0);
#endif
    puts("Presence: boot grace, absence confirmation, return of presence, GPIO wake and disabled mode passed");
}