summaryrefslogtreecommitdiff
path: root/apps/plugins/calculator.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/calculator.c')
-rw-r--r--apps/plugins/calculator.c84
1 files changed, 60 insertions, 24 deletions
diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c
index 35ebea6e70..5e8c31aa0f 100644
--- a/apps/plugins/calculator.c
+++ b/apps/plugins/calculator.c
@@ -104,6 +104,22 @@ F3: equal to "="
104#define SIGN(x) ((x)<0?-1:1) 104#define SIGN(x) ((x)<0?-1:1)
105#define ABS(x) ((x)<0?-(x):(x)) 105#define ABS(x) ((x)<0?-(x):(x))
106 106
107/* variable button definitions */
108#if CONFIG_KEYPAD == RECORDER_PAD
109#define CALCULATOR_QUIT BUTTON_OFF
110#define CALCULATOR_INPUT BUTTON_PLAY
111#define CALCULATOR_CALC BUTTON_F3
112#define CALCULATOR_OPERATORS BUTTON_F2
113#define CALCULATOR_CLEAR BUTTON_F1
114
115#elif CONFIG_KEYPAD == ONDIO_PAD
116#define CALCULATOR_QUIT BUTTON_OFF
117#define CALCULATOR_INPUT_CALC_PRE BUTTON_MENU
118#define CALCULATOR_INPUT (BUTTON_MENU | BUTTON_REL)
119#define CALCULATOR_CALC (BUTTON_MENU | BUTTON_REPEAT)
120
121#endif
122
107static struct plugin_api* rb; 123static struct plugin_api* rb;
108 124
109enum { 125enum {
@@ -187,6 +203,7 @@ int m, n, prev_m, prev_n; /* position index for button */
187#define CAL_BUTTON (m*5+n) 203#define CAL_BUTTON (m*5+n)
188 204
189int btn = BUTTON_NONE; 205int btn = BUTTON_NONE;
206int lastbtn = BUTTON_NONE;
190 207
191/* Status of calculator */ 208/* Status of calculator */
192enum {cal_normal, /* 0, normal status, display result */ 209enum {cal_normal, /* 0, normal status, display result */
@@ -1090,7 +1107,7 @@ Handle buttons on basic screen
1090----------------------------------------------------------------------- */ 1107----------------------------------------------------------------------- */
1091void basicButtonsProcess(void){ 1108void basicButtonsProcess(void){
1092 switch (btn) { 1109 switch (btn) {
1093 case BUTTON_PLAY: 1110 case CALCULATOR_INPUT:
1094 if (calStatus == cal_error && (CAL_BUTTON != btn_C) ) break; 1111 if (calStatus == cal_error && (CAL_BUTTON != btn_C) ) break;
1095 flashButton(CAL_BUTTON); 1112 flashButton(CAL_BUTTON);
1096 switch( CAL_BUTTON ){ 1113 switch( CAL_BUTTON ){
@@ -1143,7 +1160,9 @@ void basicButtonsProcess(void){
1143 case btn_add: 1160 case btn_add:
1144 if(!operInputted) {twoOperands(); operInputted = true;} 1161 if(!operInputted) {twoOperands(); operInputted = true;}
1145 oper = buttonChar[basicButtons][m][n][0]; 1162 oper = buttonChar[basicButtons][m][n][0];
1146 case_BUTTON_F2: /* F2 shortkey entrance */ 1163#ifdef CALCULATOR_OPERATORS
1164 case_cycle_operators: /* F2 shortkey entrance */
1165#endif
1147 calStatus = cal_normal; 1166 calStatus = cal_normal;
1148 formatResult(); 1167 formatResult();
1149 operand = result; 1168 operand = result;
@@ -1159,7 +1178,8 @@ void basicButtonsProcess(void){
1159 } /* switch (CAL_BUTTON) */ 1178 } /* switch (CAL_BUTTON) */
1160 break; 1179 break;
1161 1180
1162 case BUTTON_F2: 1181#ifdef CALCULATOR_OPERATORS
1182 case CALCULATOR_OPERATORS:
1163 if (calStatus == cal_error) break; 1183 if (calStatus == cal_error) break;
1164 if (!operInputted) {twoOperands(); operInputted = true;} 1184 if (!operInputted) {twoOperands(); operInputted = true;}
1165 switch (oper){ 1185 switch (oper){
@@ -1169,9 +1189,11 @@ void basicButtonsProcess(void){
1169 case '-': oper = '*'; flashButton(btn_time); break; 1189 case '-': oper = '*'; flashButton(btn_time); break;
1170 case '*': oper = '/'; flashButton(btn_div); break; 1190 case '*': oper = '/'; flashButton(btn_div); break;
1171 } 1191 }
1172 goto case_BUTTON_F2; 1192 goto case_cycle_operators;
1173 break; 1193 break;
1174 case BUTTON_F3: 1194#endif
1195
1196 case CALCULATOR_CALC:
1175 if (calStatus == cal_error) break; 1197 if (calStatus == cal_error) break;
1176 flashButton(btn_equal); 1198 flashButton(btn_equal);
1177 goto case_btn_equal; 1199 goto case_btn_equal;
@@ -1186,7 +1208,7 @@ Handle buttons on scientific screen
1186----------------------------------------------------------------------- */ 1208----------------------------------------------------------------------- */
1187void sciButtonsProcess(void){ 1209void sciButtonsProcess(void){
1188 switch (btn) { 1210 switch (btn) {
1189 case BUTTON_PLAY: 1211 case CALCULATOR_INPUT:
1190 if (calStatus == cal_error && (CAL_BUTTON != sci_sci) ) break; 1212 if (calStatus == cal_error && (CAL_BUTTON != sci_sci) ) break;
1191 flashButton(CAL_BUTTON); 1213 flashButton(CAL_BUTTON);
1192 switch( CAL_BUTTON ){ 1214 switch( CAL_BUTTON ){
@@ -1225,7 +1247,8 @@ void sciButtonsProcess(void){
1225 } /* switch (CAL_BUTTON) */ 1247 } /* switch (CAL_BUTTON) */
1226 break; 1248 break;
1227 1249
1228 case BUTTON_F2: 1250#ifdef CALCULATOR_OPERATORS
1251 case CALCULATOR_OPERATORS:
1229 if (calStatus == cal_error) break; 1252 if (calStatus == cal_error) break;
1230 if (!operInputted) {twoOperands(); operInputted = true;} 1253 if (!operInputted) {twoOperands(); operInputted = true;}
1231 switch (oper){ 1254 switch (oper){
@@ -1240,7 +1263,9 @@ void sciButtonsProcess(void){
1240 operand = result; 1263 operand = result;
1241 operandPower = power; 1264 operandPower = power;
1242 break; 1265 break;
1243 case BUTTON_F3: 1266#endif
1267
1268 case CALCULATOR_CALC:
1244 if (calStatus == cal_error) break; 1269 if (calStatus == cal_error) break;
1245 formatResult(); 1270 formatResult();
1246 calStatus = cal_normal; 1271 calStatus = cal_normal;
@@ -1268,9 +1293,16 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1268 while (calStatus != cal_exit ) { 1293 while (calStatus != cal_exit ) {
1269 btn = rb->button_get_w_tmo(HZ/2); 1294 btn = rb->button_get_w_tmo(HZ/2);
1270 switch (btn) { 1295 switch (btn) {
1271 case BUTTON_PLAY: 1296 case CALCULATOR_INPUT:
1272 case BUTTON_F2: 1297 case CALCULATOR_CALC:
1273 case BUTTON_F3: 1298#ifdef CALCULATOR_INPUT_CALC_PRE
1299 if (lastbtn != CALCULATOR_INPUT_CALC_PRE)
1300 break;
1301 /* no unconditional break; here! */
1302#endif
1303#ifdef CALCULATOR_OPERATORS
1304 case CALCULATOR_OPERATORS:
1305#endif
1274 switch(buttonGroup){ 1306 switch(buttonGroup){
1275 case basicButtons: 1307 case basicButtons:
1276 basicButtonsProcess(); 1308 basicButtonsProcess();
@@ -1281,18 +1313,20 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1281 } 1313 }
1282 break; 1314 break;
1283 1315
1284 case BUTTON_F1: 1316#ifdef CALCULATOR_CLEAR
1285 switch(calStatus){ 1317 case CALCULATOR_CLEAR:
1286 case cal_typing: 1318 switch(calStatus){
1287 case cal_dotted: 1319 case cal_typing:
1288 doDelete(); 1320 case cal_dotted:
1289 break; 1321 doDelete();
1290 default: /* cal_normal, cal_error, cal_exit */ 1322 break;
1291 clearMem(); 1323 default: /* cal_normal, cal_error, cal_exit */
1292 break; 1324 clearMem();
1293 } 1325 break;
1294 printResult(); 1326 }
1295 break; 1327 printResult();
1328 break;
1329#endif
1296 1330
1297 case BUTTON_LEFT: 1331 case BUTTON_LEFT:
1298 case BUTTON_LEFT | BUTTON_REPEAT: 1332 case BUTTON_LEFT | BUTTON_REPEAT:
@@ -1304,7 +1338,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1304 case BUTTON_DOWN | BUTTON_REPEAT: 1338 case BUTTON_DOWN | BUTTON_REPEAT:
1305 moveButton(); 1339 moveButton();
1306 break; 1340 break;
1307 case BUTTON_OFF: 1341 case CALCULATOR_QUIT:
1308 calStatus = cal_exit; 1342 calStatus = cal_exit;
1309 printResult(); 1343 printResult();
1310 break; 1344 break;
@@ -1313,6 +1347,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1313 return PLUGIN_USB_CONNECTED; 1347 return PLUGIN_USB_CONNECTED;
1314 break; 1348 break;
1315 } /* switch (btn) */ 1349 } /* switch (btn) */
1350 if (btn != BUTTON_NONE)
1351 lastbtn = btn;
1316 } /* while (calStatus != cal_exit ) */ 1352 } /* while (calStatus != cal_exit ) */
1317 1353
1318 /* rb->splash(HZ*2, true, "Hello world!"); */ 1354 /* rb->splash(HZ*2, true, "Hello world!"); */