powerpic

Replacement board for a Casio CA-53W

/** @file settings.c
 * 
 * This mode provides a way to configure watch settings.
*/

#include <xc.h>

#include "drivers/rtcc.h"

#include "lib/mode.h"
#include "lib/events.h"
#include "lib/tick.h"
#include "lib/display.h"
#include "lib/buttons.h"
#include "lib/keypad.h"
#include "lib/settings.h"           // This might get confusing
// #include "modes/mode_settings.h"    // Oh yea this is gonna be bad

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

#include "modes/settings.h"

#define SETTINGS_KEYMAP KEYMAP_DIRECTIONAL

// Holds the current setting id and value
static unsigned char settings_active_id = 0;
static unsigned char settings_active_value = 0;

// Holds the current value being edited
static unsigned char edit_value = 0;

// Variable to determine if we should blink when editing value
unsigned char is_blinking = 0;

// Alternative mode functions
signed char settings_edit (unsigned int event);

// Display setting's ID and value
static void settings_display (unsigned char id);
static void settings_display_edit (void);


void
settings_init (void)
{
}

void
settings_start (void)
{
    // Display settings tag.
    display_secondary_string(1, "SE");

    // We use button events.
    // tick_disable();

    // We use the selection keypad.
    keypad_keymap_set(SETTINGS_KEYMAP);

    // Display initial setting.
    settings_display(0);
    settings_active_id = 0;
    settings_active_value = 0;
}

signed char
settings_run (unsigned int event)
{
    unsigned char keycode;

    switch (EVENT_TYPE(event))
    {

    case EVENT_TICK:
    break;

    case KEYPAD_EVENT_PRESS:
        keycode = EVENT_DATA(event);

        if ('>' == keycode)
        {
            // Next setting
            settings_display(settings_active_id + 1);
        }
        if ('<' == keycode)
        {
            // Previous setting
            settings_display(settings_active_id - 1);
        }
        if ('^' == keycode)
        {
            // Next setting +10
            // settings_active_id += 10;
            settings_display(settings_active_id + 10);
        }
        if ('v' == keycode)
        {
            // previous setting -10
            // settings_active_id -= 10;
            settings_display(settings_active_id - 10);
        }
    break;

    case EVENT_BUTTON:
        if (BUTTON_MODE_PRESS == EVENT_DATA(event))
        {
            return 1;
        }
        if (BUTTON_ADJ_PRESS == EVENT_DATA(event))
        {
            // Edit setting value
            edit_value = settings_active_value;
            keypad_keymap_set(KEYMAP_CASIO);
            settings_mode.run = &settings_edit;
            tick_rate_set_ms(500); // Set tickrate to 500ms for blinking
            is_blinking = 1; // We want to blink off the bat
        }
    break;

    default:
    break;
    }

    return 0;
}




signed char
settings_edit (unsigned int event)
{
    unsigned char keypress;

    switch (EVENT_TYPE(event))
    {
    case EVENT_TICK:
        if (is_blinking)
        {
            // Clear equal sign
            display_primary_clear(4);
            is_blinking = 0;
        }
        else
        {
            // Display equal sign
            display_primary_character(4, '=');
            is_blinking = 1;
        }
    break;

    case KEYPAD_EVENT_PRESS:
        keypress = EVENT_DATA(event);
        if ('0' <= keypress && keypress <= '9')
        {
            // Keypress is a number
            keypress = keypress - 48;   // Get int value
            edit_value = (edit_value * 10) + keypress;  // Add keypress as LSD.
            // Display new value.
            settings_display_edit();
            is_blinking = 0;
        }
        if ('.' == keypress)
        {
            // Period key deletes last digit
            edit_value /= 10;

            // Display new value
            settings_display_edit();
            is_blinking = 0;
        }
    break;

    case EVENT_BUTTON:
        if (EVENT_DATA(event) == BUTTON_MODE_PRESS)
        {
            // Press of the mode button cancels
            settings_display(settings_active_id);      // Display value
            keypad_keymap_set(SETTINGS_KEYMAP);    // Set keymap back
            settings_mode.run = &settings_run;      // Set run loop back
            tick_disable(); // disable ticks
        }
        else if (EVENT_DATA(event) == BUTTON_ADJ_PRESS)
        {
            LOG_DEBUG("Setting value %i", edit_value);
            settings_active_value = edit_value;
            // Adj button sets the value
            // display_primary_clear(0);
            // display_primary_string(4, "SET");       // Display Confirmation
            settings_set(settings_active_id, settings_active_value);
            keypad_keymap_set(SETTINGS_KEYMAP);    // Set keymap back
            settings_display(settings_active_id);      // Display set value
            settings_mode.run = &settings_run;      // Set run loop back
            tick_disable(); // disable ticks
            // Adj button up returns to main settings loop
        }
        else if (EVENT_DATA(event) == BUTTON_ADJ_RELEASE)
        {
        }
    break;
    
    default:
    break;
    }

    return 0;
}


static void
settings_display (unsigned char setting_index)
{
    settings_active_id = setting_index;
    settings_active_value = settings_get(setting_index);
    display_primary_clear(0);                   // Clear display
    display_primary_number(3, settings_active_id);  // Display label
    display_primary_character(4, '='); // Display '='
    display_primary_number(8, settings_active_value); // Display value
}

static void
settings_display_edit (void)
{
    display_primary_clear(0);                   // Clear display
    display_primary_number(3, settings_active_id);  // Display index
    display_primary_character(4, '='); // Display '='
    display_primary_number(8, edit_value); // Display value
}


// EOF //