pebblisp/src/calc.c

123 lines
3.8 KiB
C

#include <stdio.h>
#include <limits.h>
#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);
char temp[MAX_LENGTH-2] = "";
stringObj(temp, &obj);
snprintf(resulttext, MAX_LENGTH, "R:%s", temp);
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();
}