powerpic

Replacement board for a Casio CA-53W

/** @file uptime.c
 * 
 * This mode implements an uptime counter.
*/

#include <xc.h>

#include "lib/mode.h"
#include "lib/settings.h"
#include "lib/display.h"
#include "lib/events.h"
// #include "lib/tick.h"
#include "lib/buttons.h"
#include "lib/keypad.h"
// #include "lib/buzzer.h"
// #include "lib/backlight.h"
#include "lib/datetime.h"
#include "lib/alarm.h"

#define LOG_TAG "mode.uptime"
#include "lib/logging.h"

#include "modes/mode_settings.h"
#include "modes/uptime.h"


/* The current battery uptime in days */
static unsigned int current_uptime = 0;

// Time repr of 12:00 noon
// static time_t noon = {0x12, 0x00, 0x00};

// Time repr of 12:00 midnight
static time_t midnight = {0x00, 0x00, 0x00};


void
uptime_init (void)
{
    // Load saved uptime from EEPROM
    // current_uptime = settings_get_int(SETTING_UPTIME_H, SETTING_UPTIME_L);
    // current_uptime = settings_get(SETTING_UPTIME_H);
    // current_uptime |= settings_get(SETTING_UPTIME_L);

    // Register alarm for day counter
    alarm_set_time(&midnight, 0xAE);
}

void
uptime_start (void)
{
    // Display tag
    display_secondary_string(1, "UP");

    // Load saved uptime from EEPROM
    current_uptime = settings_get_int(SETTING_UPTIME_H, SETTING_UPTIME_L);

    // Display current uptime
    display_primary_string(1, "day");
    // display_primary_string(-1, "----");
    display_primary_number(8, (long)current_uptime);

    // display_update();
}


signed char
uptime_run (unsigned int event)
{

    switch (EVENT_TYPE(event))
    {
    case EVENT_TICK:
    break;

    case KEYPAD_EVENT_PRESS:
    break;

    case KEYPAD_EVENT_RELEASE:
    break;

    case EVENT_BUTTON:
        switch (EVENT_DATA(event))
        {
        case BUTTON_MODE_PRESS:
            return 1;
        break;
            
        case BUTTON_MODE_RELEASE:
        break;

        case BUTTON_ADJ_PRESS:
            // Reset uptime counter
            current_uptime = 0;
            settings_set_int(SETTING_UPTIME_H, SETTING_UPTIME_L, current_uptime);
            display_primary_number(8, (long)current_uptime);

            // Re-register uptime alarm
            alarm_del_event(UPTIME_ALARM_EVENT);
            alarm_set_time(&midnight, UPTIME_ALARM_EVENT);
        break;

        case BUTTON_ADJ_RELEASE:
        break;
        }
    break;

    case EVENT_ALARM:
        switch (EVENT_DATA(event))
        {
            case UPTIME_ALARM_EVENT:
                current_uptime = settings_get_int(SETTING_UPTIME_H, SETTING_UPTIME_L);
                display_primary_number(8, (long)current_uptime);
            break;
        }
    break;

    default:
    break;
    }

    return 0;
}


void
uptime_stop (void)
{
}

void
uptimed (unsigned int event)
{
    if (event == EVENT_ID(EVENT_ALARM, UPTIME_ALARM_EVENT))
    {
        // Increment day counter at midnight
        settings_set_int(SETTING_UPTIME_H, SETTING_UPTIME_L, ++current_uptime);

        // Register another alarm for next time
        alarm_set_time(&midnight, 0xAE);
    }
}

// EOF //