#include #include #include "fixed.h" #include "calc.h" #include "pebblisp.h" static inline char* getToken(int n) { const int length = sizeof(tokens) / sizeof(tokens[0]); return tokens[n % length]; } static int8_t selected_token = 1; //Currently selected button, starts on '5' static struct Environment env; static void updateText() { strcpy(temptext, mytext); if(getToken(selected_token)[0] == ' ') { strcat(temptext, "_"); } else { strcat(temptext, getToken(selected_token)); } text_layer_set_text(s_input_text_layer, temptext); } // Button handler static void up_down_handler(ClickRecognizerRef recognizer, void *context){ // Change current token selected_token += (click_recognizer_get_button_id(recognizer) == BUTTON_ID_DOWN) ? 1 : -1; // If selected token is outside of range, wrap around selected_token = selected_token < 0 ? TOKEN_END : selected_token > TOKEN_END ? 0 : selected_token; updateText(); } static void back_handler(ClickRecognizerRef recognizer, void *context) { if(mytext[0] == '\0') { window_stack_remove(window_stack_get_top_window(), true); } else { int i = 0; while(mytext[++i] != '\0') { ; } mytext[i-1] = '\0'; updateText(); } } // Adds the current string to the main string static void enter(){ strcat(mytext, getToken(selected_token)); selected_token = 0; updateText(); } //Calculate result, display it and reset static void calculate(){ Object obj = parseEval(mytext, &env); snprintf(resulttext, MAX_LENGTH, "R:%d", obj.number); selected_token = 0; //strcpy(mytext, HAHA); text_layer_set_text(s_result_text_layer, resulttext); } // Button press handler static void select_handler(ClickRecognizerRef recognizer, void *context){ if(selected_token == sizeof(tokens) / sizeof(tokens[0]) - 1) calculate(); else enter(); } static void click_config_provider(void *context) { // Register click handlers window_single_repeating_click_subscribe(BUTTON_ID_UP, 100, up_down_handler); window_single_repeating_click_subscribe(BUTTON_ID_DOWN, 100, up_down_handler); window_single_click_subscribe(BUTTON_ID_SELECT, select_handler); window_single_click_subscribe(BUTTON_ID_BACK, back_handler); } static void init(void) { // Create a window and get information about the window s_window = window_create(); // Layer *window_layer = window_get_root_layer(s_window); // Register click config provider window_set_click_config_provider(s_window, click_config_provider); // Input text layer setup GRect text_bounds = GRect(6, 6, 132, 127); s_input_text_layer = text_layer_create(text_bounds); text_layer_set_text(s_input_text_layer, getToken(1)); text_layer_set_font(s_input_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); layer_add_child(window_get_root_layer(s_window), text_layer_get_layer(s_input_text_layer)); // Result text layer setup GRect result_bounds = GRect(6, 128, 132, 132); s_result_text_layer = text_layer_create(result_bounds); text_layer_set_text(s_result_text_layer, "R: "); text_layer_set_font(s_result_text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); text_layer_set_text_alignment(s_result_text_layer, GTextAlignmentRight); layer_add_child(window_get_root_layer(s_window), text_layer_get_layer(s_result_text_layer)); // Push the window, setting the window animation to 'true' window_stack_push(s_window, true); env = defaultEnv(); } static void deinit(void) { // Destroy the text layer text_layer_destroy(s_input_text_layer); // Destroy the window window_destroy(s_window); } int main(void) { init(); app_event_loop(); deinit(); }