Index: apps/plugins/CATEGORIES =================================================================== --- apps/plugins/CATEGORIES (Revision 24098) +++ apps/plugins/CATEGORIES (Arbeitskopie) @@ -105,6 +105,7 @@ test_viewports,apps test_greylib_bitmap_scale,viewers text_editor,apps +text_editor2,apps theme_remove,viewers vbrfix,viewers video,viewers Index: apps/plugins/SOURCES =================================================================== --- apps/plugins/SOURCES (Revision 24098) +++ apps/plugins/SOURCES (Arbeitskopie) @@ -66,6 +66,7 @@ maze.c mazezam.c text_editor.c +text_editor2.c wavview.c robotfindskitten.c Index: apps/plugins/text_editor2.c =================================================================== --- apps/plugins/text_editor2.c (Revision 0) +++ apps/plugins/text_editor2.c (Revision 0) @@ -0,0 +1,908 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: calculator.c 24010 2009-12-15 20:51:41Z tomers $ + * + * Copyright (C) 2004 Pengxuan Liu (Isaac) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "plugin.h" +#include "lib/playback_control.h" + +PLUGIN_HEADER + +/* variable button definitions */ +#if CONFIG_KEYPAD == RECORDER_PAD +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_OFF +#define TEXT_INPUT BUTTON_PLAY +#define TEXT_CALC BUTTON_F3 +#define TEXT_OPERATORS BUTTON_F2 +#define TEXT_CLEAR BUTTON_F1 + +#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_OFF +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_F3 +#define TEXT_OPERATORS BUTTON_F2 +#define TEXT_CLEAR BUTTON_F1 + +#elif CONFIG_KEYPAD == ONDIO_PAD +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_OFF +#define TEXT_INPUT_CALC_PRE BUTTON_MENU +#define TEXT_INPUT (BUTTON_MENU | BUTTON_REL) +#define TEXT_CALC (BUTTON_MENU | BUTTON_REPEAT) + +#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ + (CONFIG_KEYPAD == IRIVER_H300_PAD) +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_OFF +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_ON +#define TEXT_OPERATORS BUTTON_MODE +#define TEXT_CLEAR BUTTON_REC + +#define TEXT_RC_QUIT BUTTON_RC_STOP + +#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ + (CONFIG_KEYPAD == IPOD_3G_PAD) || \ + (CONFIG_KEYPAD == IPOD_1G2G_PAD) + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP_W_SHIFT BUTTON_SCROLL_BACK +#define TEXT_DOWN_W_SHIFT BUTTON_SCROLL_FWD +#define TEXT_QUIT BUTTON_MENU +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_PLAY + +#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_PLAY +#define TEXT_CLEAR BUTTON_REC + +#elif (CONFIG_KEYPAD == GIGABEAT_PAD) + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_MENU +#define TEXT_CLEAR BUTTON_A + +#elif (CONFIG_KEYPAD == SANSA_E200_PAD) +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_UP_W_SHIFT BUTTON_SCROLL_BACK +#define TEXT_DOWN_W_SHIFT BUTTON_SCROLL_FWD +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT_CALC_PRE BUTTON_SELECT +#define TEXT_INPUT (BUTTON_SELECT|BUTTON_REL) +#define TEXT_CALC (BUTTON_SELECT|BUTTON_REPEAT) +#define TEXT_CLEAR BUTTON_REC + +#elif (CONFIG_KEYPAD == SANSA_C200_PAD) +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT_CALC_PRE BUTTON_SELECT +#define TEXT_INPUT (BUTTON_SELECT|BUTTON_REL) +#define TEXT_CALC (BUTTON_SELECT|BUTTON_REPEAT) + +#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD) +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_UP_W_SHIFT BUTTON_SCROLL_BACK +#define TEXT_DOWN_W_SHIFT BUTTON_SCROLL_FWD +#define TEXT_QUIT (BUTTON_HOME|BUTTON_REPEAT) +#define TEXT_INPUT_CALC_PRE BUTTON_SELECT +#define TEXT_INPUT (BUTTON_SELECT|BUTTON_REL) +#define TEXT_CALC (BUTTON_SELECT|BUTTON_REPEAT) +#define TEXT_CLEAR BUTTON_HOME + + +#elif (CONFIG_KEYPAD == SANSA_CLIP_PAD) +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT_CALC_PRE BUTTON_SELECT +#define TEXT_INPUT (BUTTON_SELECT|BUTTON_REL) +#define TEXT_CALC (BUTTON_SELECT|BUTTON_REPEAT) +#define TEXT_CLEAR BUTTON_HOME + +#elif (CONFIG_KEYPAD == SANSA_M200_PAD) +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT_CALC_PRE BUTTON_SELECT +#define TEXT_INPUT (BUTTON_SELECT|BUTTON_REL) +#define TEXT_CALC (BUTTON_SELECT|BUTTON_REPEAT) +#define TEXT_CLEAR (BUTTON_SELECT|BUTTON_UP) + +#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_SCROLL_UP +#define TEXT_DOWN BUTTON_SCROLL_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT_CALC_PRE BUTTON_PLAY +#define TEXT_INPUT (BUTTON_PLAY | BUTTON_REL) +#define TEXT_CALC (BUTTON_PLAY | BUTTON_REPEAT) +#define TEXT_CLEAR BUTTON_REW + +#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_BACK +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_MENU +#define TEXT_CLEAR BUTTON_PLAY + +#elif (CONFIG_KEYPAD == MROBE100_PAD) + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_MENU +#define TEXT_CLEAR BUTTON_DISPLAY + +#elif CONFIG_KEYPAD == IAUDIO_M3_PAD + +#define TEXT_LEFT BUTTON_RC_REW +#define TEXT_RIGHT BUTTON_RC_FF +#define TEXT_UP BUTTON_RC_VOL_UP +#define TEXT_DOWN BUTTON_RC_VOL_DOWN +#define TEXT_QUIT BUTTON_RC_REC +#define TEXT_INPUT BUTTON_RC_PLAY +#define TEXT_CALC BUTTON_RC_MODE +#define TEXT_CLEAR BUTTON_RC_MENU + +#define TEXT_RC_QUIT BUTTON_REC + +#elif (CONFIG_KEYPAD == COWON_D2_PAD) + +#define TEXT_QUIT BUTTON_POWER +#define TEXT_CLEAR BUTTON_MENU + +#elif CONFIG_KEYPAD == IAUDIO67_PAD + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_VOLUP +#define TEXT_DOWN BUTTON_VOLDOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT BUTTON_PLAY +#define TEXT_CALC BUTTON_MENU +#define TEXT_CLEAR BUTTON_STOP + +#define TEXT_RC_QUIT (BUTTON_MENU|BUTTON_PLAY) + +#elif (CONFIG_KEYPAD == CREATIVEZVM_PAD) + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_BACK +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_MENU +#define TEXT_CLEAR BUTTON_PLAY + +#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT BUTTON_SELECT +#define TEXT_CALC BUTTON_MENU +#define TEXT_CLEAR BUTTON_VIEW + +#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD + +#define TEXT_LEFT BUTTON_PREV +#define TEXT_RIGHT BUTTON_NEXT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_POWER +#define TEXT_INPUT BUTTON_PLAY +#define TEXT_CALC BUTTON_MENU +#define TEXT_CLEAR BUTTON_RIGHT + +#elif (CONFIG_KEYPAD == ONDAVX747_PAD) + +#define TEXT_QUIT BUTTON_POWER +#define TEXT_CLEAR BUTTON_MENU + +#elif (CONFIG_KEYPAD == ONDAVX777_PAD) +#define TEXT_QUIT BUTTON_POWER + +#elif CONFIG_KEYPAD == MROBE500_PAD +#define TEXT_QUIT BUTTON_POWER + +#elif CONFIG_KEYPAD == SAMSUNG_YH_PAD + +#define TEXT_LEFT BUTTON_LEFT +#define TEXT_RIGHT BUTTON_RIGHT +#define TEXT_UP BUTTON_UP +#define TEXT_DOWN BUTTON_DOWN +#define TEXT_QUIT BUTTON_REC +#define TEXT_INPUT BUTTON_PLAY +#define TEXT_CALC BUTTON_FFWD +#define TEXT_CLEAR BUTTON_REW + +#else +#error No keymap defined! +#endif + +#ifdef HAVE_TOUCHSCREEN +#ifndef TEXT_LEFT +#define TEXT_LEFT BUTTON_MIDLEFT +#endif +#ifndef TEXT_RIGHT +#define TEXT_RIGHT BUTTON_MIDRIGHT +#endif +#ifndef TEXT_UP +#define TEXT_UP BUTTON_TOPMIDDLE +#endif +#ifndef TEXT_DOWN +#define TEXT_DOWN BUTTON_BOTTOMMIDDLE +#endif +#ifndef TEXT_CALC +#define TEXT_CALC BUTTON_BOTTOMRIGHT +#endif +#ifndef TEXT_INPUT +#define TEXT_INPUT BUTTON_CENTER +#endif +#ifndef TEXT_CLEAR +#define TEXT_CLEAR BUTTON_TOPRIGHT +#endif +#endif + + +#if LCD_WIDTH > LCD_HEIGHT +#define BUTTON_ROWS 5 +#define BUTTON_COLS 6 +#else /* LCD_WIDTH <= LCD_HEIGHT */ +#define BUTTON_ROWS 6 +#define BUTTON_COLS 5 +#endif + +#define REC_HEIGHT (int)(LCD_HEIGHT / (BUTTON_ROWS + 1)) +#define REC_WIDTH (int)(LCD_WIDTH / BUTTON_COLS) + +#define Y_0_POS 0 +#define Y_1_POS (LCD_HEIGHT - BUTTON_ROWS * REC_HEIGHT) + +#define X_0_POS 0 +#define X_1_POS (X_0_POS + REC_WIDTH) + + + +#ifdef HAVE_TOUCHSCREEN +#include "lib/pluginlib_touchscreen.h" +static struct ts_raster calc_raster = { X_0_POS, Y_1_POS, + BUTTON_COLS*REC_WIDTH, BUTTON_ROWS*REC_HEIGHT, REC_WIDTH, REC_HEIGHT }; +#endif + +enum { + basicButtons, + sciButtons +} buttonGroup; + +#if LCD_WIDTH > LCD_HEIGHT +unsigned char* buttonChar[3][BUTTON_ROWS][BUTTON_COLS] = { + { { "A" , "B" , "C" , "D" , "E", "F" }, + { "G" , "H" , "I" , "J", "K" , "L" }, + { "M" , "N" , "O" , "P" , "Q" , "R" }, + { "S" , "T" , "U" , "V" , "W" , "X" }, + { "Y" , "Z" , " " , "¶" , "abc" , ".,?" } }, + + { { "a" , "b" , "c" , "d" , "e" , "f" }, + { "g" , "h" , "i" , "j" , "k" , "l" }, + { "m" , "n" , "o" , "p" , "q" , "r" }, + { "s" , "t" , "u" , "v" , "w" , "x" }, + { "y" , "z" , " " , "¶" , "ABC" , ".,?" } }, + + { { "." , "," , "?" , "!" , "\"" , "/" }, + { "(" , ")" , "+" , "-" , "*" , "#" }, + { "\\" , "[" , "}" , "&" , "$" , "€" }, + { "<" , ">" , "{" , "}" , "@" , "_" }, + { "|" , "~" , " " , "¶" , "ABC", "abc" } } +}; +#else /* LCD_WIDTH <= LCD_HEIGHT */ +unsigned char* buttonChar[3][BUTTON_ROWS][BUTTON_COLS] = { + { { "A" , "B" , "C" , "D" , "E" }, + { "F" , "G" , "H" , "I" , "J" }, + { "K" , "L", "M" , "N" , "O" }, + { "P" , "Q" , "R" , "S" , "T" }, + { "U" , "V" , "W" , "X" , "Y" }, + { "Z" , " " , "¶" , "abc" , ".,?" } }, + + { { "a" , "b" , "c" , "d" , "e" }, + { "f" , "g" , "h" , "i" , "j" }, + { "k" , "l" , "m" , "n" , "o" }, + { "p" , "q" , "r" , "s" , "t" }, + { "u" , "v" , "w" , "x" , "y" }, + { "z" , " " , "¶" , "ABC" , ".,?" } }, + + { { "." , "," , "?" , "!" , "\"" }, + { "/" , "(" , ")" , "+" , "-" }, + { "*" , "#" , "\\" , "[" , "}" }, + { "&" , "$" , "€" , "<" , ">" }, + { "{" , "}" , "@" , "_" , "|" }, + { "~" , " " , "¶" , "ABC", "abc" } } +}; +#endif +enum { btn_MR , btn_M , btn_bas , btn_CE , btn_C , + btn_7 , btn_8 , btn_9 , btn_div , btn_sqr , + btn_4 , btn_5 , btn_6 , btn_time , btn_square , + btn_1 , btn_2 , btn_3 , btn_minus , btn_rec , + btn_0 , btn_sign , btn_dot , btn_add , btn_equal + }; + +enum { sci_fac, sci_pi , sci_sci , sci_sin , sci_asin , + sci_7 , sci_8 , sci_9 , sci_cos , sci_acos , + sci_4 , sci_5 , sci_6 , sci_tan , sci_atan , + sci_1 , sci_2 , sci_3 , sci_ln , sci_exp , + sci_0 , sci_sign , sci_dot , sci_log , sci_xy + }; + + +#define DIGITLEN 10 /* must <= 10 */ +#define SCIENTIFIC_FORMAT ( power < -(DIGITLEN-3) || power > (DIGITLEN)) + /* 0.000 00000 0001 */ + /* ^ ^ ^ ^ ^ ^ */ + /* DIGITLEN 12345 6789a bcdef */ + /* power 12 34567 89abc def */ + /* 10^- 123 45678 9abcd ef */ + +unsigned char buf[19];/* 18 bytes of output line, + buf[0] is operator + buf[1] = 'M' if memTemp is not 0 + buf[2] = ' ' + + if SCIENTIFIC_FORMAT + buf[2]-buf[12] or buf[3]-buf[13] = result; + format X.XXXXXXXX + buf[13] or buf[14] -buf[17] = power; + format eXXX or e-XXX + else + buf[3]-buf[6] = ' '; + buf[7]-buf[17] = result; + + buf[18] = '\0' */ + +unsigned char typingbuf[DIGITLEN+2];/* byte 0 is sign or ' ', + byte 1~DIGITLEN are num and '.' + byte (DIGITLEN+1) is '\0' */ +unsigned char* typingbufPointer = typingbuf; + +double result = 0; /* main operand, format 0.xxxxx */ +int power = 0; /* 10^power */ +double modifier = 0.1; /* position of next input */ +double operand = 0; /* second operand, format 0.xxxxx */ +int operandPower = 0; /* 10^power of second operand */ +char oper = ' '; /* operators: + - * / */ +bool operInputted = false; /* false: do calculation first and + replace current oper + true: just replace current oper */ + +double memTemp = 0; /* temp memory */ +int memTempPower = 0; /* 10^^power of memTemp */ + +int btn_row, btn_col; /* current position index for button */ +int prev_btn_row, prev_btn_col; /* previous cursor position */ +#define CAL_BUTTON (btn_row*5+btn_col) + +int btn = BUTTON_NONE; +int lastbtn = BUTTON_NONE; + +/* Status of calculator */ +enum {cal_normal, /* 0, normal status, display result */ + cal_typing, /* 1, currently typing, dot hasn't been typed */ + cal_dotted, /* 2, currently typing, dot already has been typed. */ + cal_error, + cal_exit, + cal_toDo +} calStatus; + + +void drawLines(void); +void drawButtons(int group); + +/* ----------------------------------------------------------------------- +Handy funtions +----------------------------------------------------------------------- */ +void cleartypingbuf(void) +{ + int k; + for( k=1; k<=(DIGITLEN+1); k++) + typingbuf[k] = 0; + typingbuf[0] = ' '; + typingbufPointer = typingbuf+1; +} +void clearbuf(void) +{ + int k; + for(k=0;k<18;k++) + buf[k]=' '; + buf[18] = 0; +} +void clearResult(void) +{ + result = 0; + power = 0; + modifier = 0.1; +} + +void clearInput(void) +{ + calStatus = cal_normal; + clearResult(); + cleartypingbuf(); + rb->lcd_clear_display(); + drawButtons(buttonGroup); + drawLines(); +} + +void clearOperand(void) +{ + operand = 0; + operandPower = 0; +} + +void clearMemTemp(void) +{ + memTemp = 0; + memTempPower = 0; +} + +void clearOper(void) +{ + oper = ' '; + operInputted = false; +} + +void clearMem(void) +{ + clearInput(); + clearMemTemp(); + clearOperand(); + clearOper(); + btn = BUTTON_NONE; +} + +void switchOperands(void) +{ + double tempr = operand; + int tempp = operandPower; + operand = result; + operandPower = power; + result = tempr; + power = tempp; +} + +void drawLines(void) +{ + int i; + rb->lcd_hline(0, LCD_WIDTH, Y_1_POS-1); + for (i = 0; i < BUTTON_COLS+1 ; i++) + rb->lcd_hline(0, LCD_WIDTH, Y_1_POS+i*REC_HEIGHT); + for (i = 0; i < BUTTON_ROWS ; i++) + rb->lcd_vline(X_1_POS+i*REC_WIDTH, Y_1_POS, LCD_HEIGHT); +} + +void drawButtons(int group) +{ + int i, j, w, h; + for (i = 0; i <= BUTTON_ROWS; i++){ + for (j = 0; j <= BUTTON_COLS; j++){ + rb->lcd_getstringsize( buttonChar[group][i][j],&w,&h); + if (i == btn_row && j == btn_col) /* selected item */ + rb->lcd_set_drawmode(DRMODE_SOLID); + else + rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + rb->lcd_fillrect( X_0_POS + j*REC_WIDTH, + Y_1_POS + i*REC_HEIGHT, + REC_WIDTH, REC_HEIGHT+1); + if (i == btn_row && j == btn_col) /* selected item */ + rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + else + rb->lcd_set_drawmode(DRMODE_SOLID); + rb->lcd_putsxy( X_0_POS + j*REC_WIDTH + (REC_WIDTH - w)/2, + Y_1_POS + i*REC_HEIGHT + (REC_HEIGHT - h)/2 + 1, + buttonChar[group][i][j] ); + } + } + rb->lcd_set_drawmode(DRMODE_SOLID); +} + +/* ----------------------------------------------------------------------- +Initiate calculator +----------------------------------------------------------------------- */ +void cal_initial (void) +{ + int w,h; + + rb->lcd_getstringsize("abc",&w,&h); + if (w > REC_WIDTH || h > REC_HEIGHT) + rb->lcd_setfont(FONT_SYSFIXED); + + rb->lcd_clear_display(); + +#ifdef TEXT_OPERATORS + /* basic operators are available through separate button */ + buttonGroup = sciButtons; +#else + buttonGroup = basicButtons; +#endif + + /* initially, invert button "5" */ + btn_row = 2; + btn_col = 1; + prev_btn_row = btn_row; + prev_btn_col = btn_col; + drawButtons(buttonGroup); + drawLines(); + rb->lcd_update(); + + /* initial mem and output display*/ + clearMem(); + + /* clear button queue */ + rb->button_clear_queue(); +} + + +/* ----------------------------------------------------------------------- + add in scientific number format +----------------------------------------------------------------------- */ +void doAdd (double* operandOne, int* powerOne, + double operandTwo, int powerTwo) +{ + if ( *powerOne >= powerTwo ){ + if (*powerOne - powerTwo <= DIGITLEN+1){ + while (powerTwo < *powerOne){ + operandTwo /=10; + powerTwo++; + } + *operandOne += operandTwo; + } + /*do nothing if operandTwo is too small*/ + } + else{ + if (powerTwo - *powerOne <= DIGITLEN+1){ + while(powerTwo > *powerOne){ + *operandOne /=10; + (*powerOne)++; + } + (*operandOne) += operandTwo; + } + else{/* simply copy operandTwo if operandOne is too small */ + *operandOne = operandTwo; + *powerOne = powerTwo; + } + } +} + +/* First, increases *dimen1 by dimen1_delta modulo dimen1_modulo. + If dimen1 wraps, increases *dimen2 by dimen2_delta modulo dimen2_modulo. +*/ +static void move_with_wrap_and_shift( + int *dimen1, int dimen1_delta, int dimen1_modulo, + int *dimen2, int dimen2_delta, int dimen2_modulo) +{ + bool wrapped = false; + + *dimen1 += dimen1_delta; + if (*dimen1 < 0) + { + *dimen1 = dimen1_modulo - 1; + wrapped = true; + } + else if (*dimen1 >= dimen1_modulo) + { + *dimen1 = 0; + wrapped = true; + } + + if (wrapped) + { + /* Make the dividend always positive to be sure about the result. + Adding dimen2_modulo does not change it since we do it modulo. */ + *dimen2 = (*dimen2 + dimen2_modulo + dimen2_delta) % dimen2_modulo; + } +} + +/* ----------------------------------------------------------------------- +Print buttons when switching 1st and 2nd +int group = {basicButtons, sciButtons} +----------------------------------------------------------------------- */ +void printButtonGroups(int group) +{ + drawButtons(group); + drawLines(); + rb->lcd_update(); +} +/* ----------------------------------------------------------------------- +flash the currently marked button +----------------------------------------------------------------------- */ +void flashButton(void) +{ + int k, w, h; + for (k=2;k>0;k--) + { + rb->lcd_getstringsize( buttonChar[buttonGroup][btn_row][btn_col],&w,&h); + rb->lcd_set_drawmode(DRMODE_SOLID|(k==1) ? 0 : DRMODE_INVERSEVID); + rb->lcd_fillrect( X_0_POS + btn_col*REC_WIDTH + 1, + Y_1_POS + btn_row*REC_HEIGHT + 1, + REC_WIDTH - 1, REC_HEIGHT - 1); + rb->lcd_putsxy( X_0_POS + btn_col*REC_WIDTH + (REC_WIDTH - w)/2, + Y_1_POS + btn_row*REC_HEIGHT + (REC_HEIGHT - h)/2 +1, + buttonChar[buttonGroup][btn_row][btn_col] ); + rb->lcd_update_rect( X_0_POS + btn_col*REC_WIDTH + 1, + Y_1_POS + btn_row*REC_HEIGHT + 1, + REC_WIDTH - 1, REC_HEIGHT - 1); + + if (k!= 1) + rb->sleep(HZ/22); + + } +} + +/* ----------------------------------------------------------------------- +pos is the position that needs animation. pos = [1~18] +----------------------------------------------------------------------- */ +void deleteAnimation(int pos) +{ + int k, w, h, x; + if (pos<1 || pos >18) + return; + + rb->lcd_getstringsize("0", &w, &h); + x = (pos==1? 4: LCD_WIDTH - 4 - w); + + for (k=0;k<4;k++){ + rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + rb->lcd_fillrect(x, Y_1_POS - h -1, w, h); + rb->lcd_set_drawmode(DRMODE_SOLID); + rb->lcd_fillrect(x + (w*k)/8, Y_1_POS - h -1 + (h*k)/8, + (w*(4-k))/4, (h*(4-k))/4); + rb->lcd_update_rect(x, Y_1_POS - h -1, w, h); + rb->sleep(HZ/32); + } +} + + +/* ----------------------------------------------------------------------- +move button index +Invert display new button, invert back previous button +----------------------------------------------------------------------- */ +int handleButton(int button){ + switch(button) + { + case TEXT_INPUT: + case TEXT_CALC: +#ifdef TEXT_INPUT_CALC_PRE + if (lastbtn != TEXT_INPUT_CALC_PRE) + break; + /* no unconditional break; here! */ +#endif +#ifdef TEXT_OPERATORS + case TEXT_OPERATORS: +#endif + switch(buttonGroup){ + case basicButtons: + break; + case sciButtons: + break; + } + break; + +#ifdef TEXT_CLEAR + case TEXT_CLEAR: + switch(calStatus){ + case cal_typing: + case cal_dotted: + break; + default: /* cal_normal, cal_error, cal_exit */ + clearMem(); + break; + } + break; +#endif + case TEXT_LEFT: + case TEXT_LEFT | BUTTON_REPEAT: + move_with_wrap_and_shift( + &btn_col, -1, BUTTON_COLS, + &btn_row, 0, BUTTON_ROWS); + break; + + case TEXT_RIGHT: + case TEXT_RIGHT | BUTTON_REPEAT: + move_with_wrap_and_shift( + &btn_col, 1, BUTTON_COLS, + &btn_row, 0, BUTTON_ROWS); + break; + +#ifdef TEXT_UP + case TEXT_UP: + case TEXT_UP | BUTTON_REPEAT: + move_with_wrap_and_shift( + &btn_row, -1, BUTTON_ROWS, + &btn_col, 0, BUTTON_COLS); + break; +#endif +#ifdef TEXT_DOWN + case TEXT_DOWN: + case TEXT_DOWN | BUTTON_REPEAT: + move_with_wrap_and_shift( + &btn_row, 1, BUTTON_ROWS, + &btn_col, 0, BUTTON_COLS); + break; +#endif + +#ifdef TEXT_UP_W_SHIFT + case TEXT_UP_W_SHIFT: + case TEXT_UP_W_SHIFT | BUTTON_REPEAT: + move_with_wrap_and_shift( + &btn_row, -1, BUTTON_ROWS, + &btn_col, -1, BUTTON_COLS); + break; +#endif +#ifdef TEXT_DOWN_W_SHIFT + case TEXT_DOWN_W_SHIFT: + case TEXT_DOWN_W_SHIFT | BUTTON_REPEAT: + move_with_wrap_and_shift( + &btn_row, 1, BUTTON_ROWS, + &btn_col, 1, BUTTON_COLS); + break; +#endif +#ifdef TEXT_LEFT_W_SHIFT + case TEXT_LEFT_W_SHIFT: + case TEXT_LEFT_W_SHIFT | BUTTON_REPEAT: + move_with_wrap_and_shift( + &btn_col, -1, BUTTON_COLS, + &btn_row, -1, BUTTON_ROWS); + break; +#endif +#ifdef TEXT_RIGHT_W_SHIFT + case TEXT_RIGHT_W_SHIFT: + case TEXT_RIGHT_W_SHIFT | BUTTON_REPEAT: + move_with_wrap_and_shift( + &btn_col, 1, BUTTON_COLS, + &btn_row, 1, BUTTON_ROWS); + break; +#endif +#ifdef TEXT_RC_QUIT + case TEXT_RC_QUIT: +#endif + case TEXT_QUIT: + return -1; + } + + return 0; + + prev_btn_row = btn_row; + prev_btn_col = btn_col; +} + + +enum plugin_status plugin_start(const void* parameter) +{ + (void)parameter; + +#ifdef HAVE_TOUCHSCREEN + rb->touchscreen_set_mode(TOUCHSCREEN_POINT); +#endif + + cal_initial(); + + while (calStatus != cal_exit ) { + btn = rb->button_get_w_tmo(HZ/2); +#ifdef HAVE_TOUCHSCREEN + if(btn & BUTTON_TOUCHSCREEN) + { + struct ts_raster_result res; + if(touchscreen_map_raster(&calc_raster, rb->button_get_data() >> 16, + rb->button_get_data() & 0xffff, &res) == 1) + { + btn_row = res.y; + btn_col = res.x; + drawButtons(buttonGroup); + drawLines(); + + rb->lcd_update(); + + prev_btn_row = btn_row; + prev_btn_col = btn_col; + if(btn & BUTTON_REL) + { + btn = TEXT_INPUT; + switch(buttonGroup){ + case basicButtons: + break; + case sciButtons: + break; + } + btn = BUTTON_TOUCHSCREEN; + } + } + } +#endif + if (handleButton(btn) == -1) + { + calStatus = cal_exit; + } + else + { + drawButtons(buttonGroup); + drawLines(); + } + + rb->lcd_update(); + + if(rb->default_event_handler(btn) == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + + if (btn != BUTTON_NONE) + lastbtn = btn; + } /* while (calStatus != cal_exit ) */ + + rb->button_clear_queue(); + return PLUGIN_OK; +}