summaryrefslogtreecommitdiff
path: root/src/main.cpp
blob: af388bdc87db7c7bdac3ecb5bdfe4ee046329bcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <Arduino.h>

#include "badge/config.h"

#include "badge/ble.h"
#include "badge/display.h"
#include "badge/gpio.h"
#include "badge/log.h"

#if defined(BADGE_SSID_NAME) && defined(BADGE_SSID_PASS)
#include <WiFi.h>
#define BADGE_USE_WIFI 1
#else
#define BADGE_USE_WIFI 0
#endif

#define PRESS_TIME_DRAW 1000
#define PRESS_TIME_BLE_ADV 3000
#define SLEEP_TIME 10000

void setup()
{
    Serial.begin(115200);
    Serial.println("Yes, it works!");

    LOG_F("XTAL freq is %u\n", getXtalFrequencyMhz());
    LOG_F("CPU freq is %u\n", getCpuFrequencyMhz());
    setCpuFrequencyMhz(80);
    LOG_F("CPU freq is now %u\n", getCpuFrequencyMhz());

    de::uvok::badge::ble_init();
    de::uvok::badge::display_init();

#if BADGE_USE_WIFI
    WiFi.begin(BADGE_SSID_NAME, BADGE_SSID_PASS);
    while (WiFi.status() != WL_CONNECTED)
        delay(500);
    Serial.printf("> My IP is %s\n", WiFi.localIP().toString());
#endif

    // doesn't work as expected?
    // gpio_wakeup_enable(GPIO_NUM_0, GPIO_INTR_LOW_LEVEL);
    // esp_sleep_enable_gpio_wakeup();
    // esp_light_sleep_start();

    de::uvok::badge::gpio_init();
}

void loop()
{
    static uint32_t lastActivity;

    auto gpio_result = de::uvok::badge::gpio_poll();
    if (gpio_result.has_data)
    {
        LOG_F("Pin %d for %u ms\n", gpio_result.pin_number, gpio_result.duration_ms);
        uint8_t newNum = UINT8_MAX;
        switch (gpio_result.pin_number)
        {
        case NEXT_KEY:
            de::uvok::badge::display_next();
            break;
        case PRV_KEY:
            de::uvok::badge::display_prev();
            break;
        case OK_KEY:
            newNum = de::uvok::badge::display_refresh();
            break;
        case HOME_KEY:
            if (gpio_result.duration_ms > 1000)
            {
                de::uvok::badge::ble_advertise();
            }
            break;
        }
        if (newNum != UINT8_MAX)
        {
            de::uvok::badge::ble_set_image(newNum);
        }

        lastActivity = millis();
    }

    {
        de::uvok::badge::ble_poll_result_t pollres = de::uvok::badge::ble_poll();
        if (pollres.has_data)
        {
            de::uvok::badge::display_direct(pollres.new_template);
            lastActivity = millis();
        }
    }

    if (millis() - lastActivity > SLEEP_TIME && !de::uvok::badge::ble_is_active())
    {
        // RTC watchdog might reset ??? - not sure when/how this happens...
        // (Happened with CPU@240MHz, not at 80 MHz yet?)
        // RTCWDT_RTC_RST
        esp_sleep_enable_timer_wakeup(10 * 1000);
        esp_light_sleep_start();
    }
}