| /* |
| * Copyright (c) 2003, Adam Dunkels. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * 3. The name of the author may not be used to endorse or promote |
| * products derived from this software without specific prior |
| * written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS |
| * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
| * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * This an example program for the Contiki desktop OS |
| * |
| * $Id: calc.c,v 1.8 2005/02/07 23:13:00 oliverschmidt Exp $ |
| * |
| */ |
| |
| /* This is an example of how to write programs for Contiki. It |
| displays a window with the famous message "Hello world" and two |
| buttons; one which changes the message slightly and one which quits |
| the application. */ |
| |
| #include "ek.h" |
| #include "ctk.h" |
| #include "loader.h" |
| |
| static struct ctk_window window; |
| |
| static char input[16]; |
| static struct ctk_label inputlabel = |
| {CTK_LABEL(0, 0, 12, 1, input)}; |
| |
| static struct ctk_button button7 = |
| {CTK_BUTTON(0, 3, 1, "7")}; |
| static struct ctk_button button8 = |
| {CTK_BUTTON(3, 3, 1, "8")}; |
| static struct ctk_button button9 = |
| {CTK_BUTTON(6, 3, 1, "9")}; |
| static struct ctk_button button4 = |
| {CTK_BUTTON(0, 4, 1, "4")}; |
| static struct ctk_button button5 = |
| {CTK_BUTTON(3, 4, 1, "5")}; |
| static struct ctk_button button6 = |
| {CTK_BUTTON(6, 4, 1, "6")}; |
| static struct ctk_button button1 = |
| {CTK_BUTTON(0, 5, 1, "1")}; |
| static struct ctk_button button2 = |
| {CTK_BUTTON(3, 5, 1, "2")}; |
| static struct ctk_button button3 = |
| {CTK_BUTTON(6, 5, 1, "3")}; |
| static struct ctk_button button0 = |
| {CTK_BUTTON(0, 6, 3, " 0 ")}; |
| |
| static struct ctk_button cbutton = |
| {CTK_BUTTON(0, 2, 1, "C")}; |
| |
| static struct ctk_button divbutton = |
| {CTK_BUTTON(9, 2, 1, "/")}; |
| static struct ctk_button mulbutton = |
| {CTK_BUTTON(9, 3, 1, "*")}; |
| |
| static struct ctk_button subbutton = |
| {CTK_BUTTON(9, 4, 1, "-")}; |
| static struct ctk_button addbutton = |
| {CTK_BUTTON(9, 5, 1, "+")}; |
| static struct ctk_button calcbutton = |
| {CTK_BUTTON(9, 6, 1, "=")}; |
| |
| EK_EVENTHANDLER(calc_eventhandler, ev, data); |
| EK_PROCESS(p, "Calculator", EK_PRIO_NORMAL, |
| calc_eventhandler, NULL, NULL); |
| static ek_id_t id = EK_ID_NONE; |
| |
| /* |
| static DISPATCHER_SIGHANDLER(calc_sighandler, s, data); |
| static struct dispatcher_proc p = |
| {DISPATCHER_PROC("Calculator", NULL, calc_sighandler, NULL)}; |
| static ek_id_t id; |
| */ |
| |
| static unsigned long operand1, operand2; |
| static unsigned char op; |
| #define OP_ADD 1 |
| #define OP_SUB 2 |
| #define OP_MUL 3 |
| #define OP_DIV 4 |
| |
| /*-----------------------------------------------------------------------------------*/ |
| LOADER_INIT_FUNC(calc_init, arg) |
| { |
| arg_free(arg); |
| |
| if(id == EK_ID_NONE) { |
| id = ek_start(&p); |
| } |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| calc_quit(void) |
| { |
| ek_exit(); |
| id = EK_ID_NONE; |
| LOADER_UNLOAD(); |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| add_to_input(char c) |
| { |
| unsigned char i; |
| |
| for(i = 0; i < 11; ++i) { |
| input[i] = input[i + 1]; |
| } |
| input[11] = c; |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| clear_input(void) |
| { |
| unsigned char i; |
| |
| for(i = 0; i < sizeof(input); ++i) { |
| input[i] = ' '; |
| } |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| input_to_operand1(void) |
| { |
| unsigned int m; |
| unsigned char i; |
| |
| operand1 = 0; |
| for(m = 1, i = 11; |
| i > 7; --i, m *= 10) { |
| if(input[i] >= '0' && |
| input[i] <= '9') { |
| operand1 += (input[i] - '0') * m; |
| } |
| } |
| clear_input(); |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| operand2_to_input(void) |
| { |
| unsigned char i; |
| |
| input[7] = (operand2/10000) % 10 + '0'; |
| input[8] = (operand2/1000) % 10 + '0'; |
| input[9] = (operand2/100) % 10 + '0'; |
| input[10] = (operand2/10) % 10 + '0'; |
| input[11] = operand2 % 10 + '0'; |
| |
| for(i = 0; i < 4; ++i) { |
| if(input[7 + i] == '0') { |
| input[7 + i] = ' '; |
| } else { |
| break; |
| } |
| } |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| static void |
| calculate(void) |
| { |
| operand2 = operand1; |
| input_to_operand1(); |
| switch(op) { |
| case OP_ADD: |
| operand2 = operand2 + operand1; |
| break; |
| case OP_SUB: |
| operand2 = operand2 - operand1; |
| break; |
| case OP_MUL: |
| operand2 = operand2 * operand1; |
| break; |
| case OP_DIV: |
| operand2 = operand2 / operand1; |
| break; |
| } |
| operand2_to_input(); |
| } |
| /*-----------------------------------------------------------------------------------*/ |
| EK_EVENTHANDLER(calc_eventhandler, ev, data) |
| { |
| EK_EVENTHANDLER_ARGS(ev, data); |
| |
| if(ev == EK_EVENT_INIT) { |
| ctk_window_new(&window, 12, 7, "Calc"); |
| |
| CTK_WIDGET_ADD(&window, &inputlabel); |
| CTK_WIDGET_SET_FLAG(&inputlabel, CTK_WIDGET_FLAG_MONOSPACE); |
| |
| CTK_WIDGET_ADD(&window, &cbutton); |
| |
| CTK_WIDGET_ADD(&window, &divbutton); |
| |
| CTK_WIDGET_ADD(&window, &button7); |
| CTK_WIDGET_ADD(&window, &button8); |
| CTK_WIDGET_ADD(&window, &button9); |
| |
| CTK_WIDGET_ADD(&window, &mulbutton); |
| |
| |
| |
| CTK_WIDGET_ADD(&window, &button4); |
| CTK_WIDGET_ADD(&window, &button5); |
| CTK_WIDGET_ADD(&window, &button6); |
| |
| CTK_WIDGET_ADD(&window, &subbutton); |
| |
| CTK_WIDGET_ADD(&window, &button1); |
| CTK_WIDGET_ADD(&window, &button2); |
| CTK_WIDGET_ADD(&window, &button3); |
| |
| CTK_WIDGET_ADD(&window, &addbutton); |
| |
| CTK_WIDGET_ADD(&window, &button0); |
| |
| CTK_WIDGET_ADD(&window, &calcbutton); |
| |
| clear_input(); |
| |
| ctk_window_open(&window); |
| |
| } else if(ev == ctk_signal_keypress) { |
| if((char)data >= '0' && |
| (char)data <= '9') { |
| add_to_input((char)data); |
| } else if((char)data == ' ') { |
| clear_input(); |
| } else if((char)data == '+') { |
| input_to_operand1(); |
| op = OP_ADD; |
| } else if((char)data == '-') { |
| input_to_operand1(); |
| op = OP_SUB; |
| } else if((char)data == '*') { |
| input_to_operand1(); |
| op = OP_MUL; |
| } else if((char)data == '/') { |
| input_to_operand1(); |
| op = OP_DIV; |
| } else if((char)data == '=' || |
| (char)data == CH_ENTER) { |
| calculate(); |
| } |
| |
| CTK_WIDGET_REDRAW(&inputlabel); |
| } else if(ev == ctk_signal_button_activate) { |
| if(data == (ek_data_t)&button0) { |
| add_to_input('0'); |
| } else if(data == (ek_data_t)&button1) { |
| add_to_input('1'); |
| } else if(data == (ek_data_t)&button2) { |
| add_to_input('2'); |
| } else if(data == (ek_data_t)&button3) { |
| add_to_input('3'); |
| } else if(data == (ek_data_t)&button4) { |
| add_to_input('4'); |
| } else if(data == (ek_data_t)&button5) { |
| add_to_input('5'); |
| } else if(data == (ek_data_t)&button6) { |
| add_to_input('6'); |
| } else if(data == (ek_data_t)&button7) { |
| add_to_input('7'); |
| } else if(data == (ek_data_t)&button8) { |
| add_to_input('8'); |
| } else if(data == (ek_data_t)&button9) { |
| add_to_input('9'); |
| } else if(data == (ek_data_t)&cbutton) { |
| clear_input(); |
| } else if(data == (ek_data_t)&calcbutton) { |
| calculate(); |
| } else if(data == (ek_data_t)&addbutton) { |
| input_to_operand1(); |
| op = OP_ADD; |
| } else if(data == (ek_data_t)&subbutton) { |
| input_to_operand1(); |
| op = OP_SUB; |
| } else if(data == (ek_data_t)&mulbutton) { |
| input_to_operand1(); |
| op = OP_MUL; |
| } else if(data == (ek_data_t)&divbutton) { |
| input_to_operand1(); |
| op = OP_DIV; |
| } |
| CTK_WIDGET_REDRAW(&inputlabel); |
| } else if(ev == ctk_signal_window_close && |
| data == (ek_data_t)&window) { |
| calc_quit(); |
| } |
| } |
| /*-----------------------------------------------------------------------------------*/ |