diff options
Diffstat (limited to 'apps/plugins/calculator.c')
-rw-r--r-- | apps/plugins/calculator.c | 84 |
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 | |||
107 | static struct plugin_api* rb; | 123 | static struct plugin_api* rb; |
108 | 124 | ||
109 | enum { | 125 | enum { |
@@ -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 | ||
189 | int btn = BUTTON_NONE; | 205 | int btn = BUTTON_NONE; |
206 | int lastbtn = BUTTON_NONE; | ||
190 | 207 | ||
191 | /* Status of calculator */ | 208 | /* Status of calculator */ |
192 | enum {cal_normal, /* 0, normal status, display result */ | 209 | enum {cal_normal, /* 0, normal status, display result */ |
@@ -1090,7 +1107,7 @@ Handle buttons on basic screen | |||
1090 | ----------------------------------------------------------------------- */ | 1107 | ----------------------------------------------------------------------- */ |
1091 | void basicButtonsProcess(void){ | 1108 | void 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 | ----------------------------------------------------------------------- */ |
1187 | void sciButtonsProcess(void){ | 1209 | void 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!"); */ |