+u16 uid;
+u16 pin;
+u8 selection;
+
+u16 scroll_timer;
+
+bool uid_enter() {
+ u8 uidpos;
+ /* the user has started to type in his/her UID. grab the last key and continue
+ * reading. Returns true if a UID was entered successfully.
+ * The UID will be entered as 5 digits. (shorter uids should be pre-padded
+ * with zeros)
+ */
+ uid = last_key%10; /* 10 => 0, it was _not_ reset (hopefuly :) */
+ set_msg("UID? ", WRAP_NONE);
+ set_char((last_key%10)+'0', 5);
+
+ for (uidpos = 2; uidpos <= 5; uidpos++) {
+ keypad_getkey();
+ if (last_key == KEY_RESET) {
+ uid = 0;
+ return 0;
+ }
+ uid = (uid*10) + (last_key%10);
+ set_char((last_key%10)+'0', 4+uidpos);
+ }
+ return (uid!=0);
+}
+
+bool pin_enter() {
+ u8 pinpos;
+ /* We ask for a pin, display a PIN: prompt. PINs must be a 4 digit number.
+ * Strictly, they must be 16-bit, but it's easier to use the guarantee that
+ * 4-digits numbers are < 65536
+ *
+ * Also display X's on screen as the pin is entered.
+ */
+ pin = 0;
+ set_msg("PIN? ", WRAP_NONE);
+ for (pinpos = 1; pinpos <= 4; pinpos++) {
+ keypad_getkey();
+ if (last_key == KEY_RESET) {
+ pin = 0;
+ return 0;
+ }
+ pin = (pin*10) + (last_key%10);
+ set_char('X', 4+pinpos);
+ }
+ return 1;
+}
+
+void make_request(u8 selection) {
+ set_msg("REQUESTING", WRAP_NONE); /* XXX: maybe this isn't needed? */
+ switch(server_request(uid, pin, selection)) {
+ case REQUEST_OK:
+ set_msg("THANK YOU!", WRAP_NONE);
+ break;
+ case REQUEST_NO_MONEY:
+ set_msg("NO MONEY!", WRAP_NONE);
+ break;
+ case REQUEST_SERVFAIL:
+ set_msg("SERV FAIL!", WRAP_NONE);
+ break;
+ case REQUEST_EMPTY:
+ set_msg("NONE LEFT!", WRAP_NONE);
+ break;
+ case REQUEST_INVAL:
+ set_msg(" BAD SELN ", WRAP_NONE);
+ break;
+ }
+ delay(1000);
+}
+
+void selection_menu() {
+ /* we have a valid username & PIN number */
+ /* either ask for a 2-digit selection, or wait for coins to be entered */
+ /* get the username somehow? */
+ set_msg("ENTER SELECTION OR INSERT COINS ", WRAP_SCROLL);
+ selection = 0;
+ while(1) {
+ if (coin_value) { /* we have coins inserted */
+ int prev_coin = 0;
+ /* alternate between the price and a confirm message */
+ while (coin_value) {
+ if (prev_coin != coin_value) {
+ print_amount(coin_value);
+ append_msg("0: CONFIRM", WRAP_ALTERNATE);
+ prev_coin = coin_value;
+ }
+ keypad_read();
+ if (keypad_pressed()) {
+ switch (last_key) {
+ case KEY_RESET:
+ scroll_msg("PRESS COIN REFUND");
+ while (coin_value);
+ break;
+ case KEY_0:
+ switch (server_credit_account(uid, pin, coin_value)) {
+ case CREDIT_OK:
+ coin_eat();
+ set_msg(" SUCCESS! ", WRAP_NONE);
+ delay(1000);
+ break;
+ case CREDIT_FAIL:
+ set_msg(" FAILED! " "PRESS COIN" " REFUND ",
+ WRAP_ALTERNATE);
+ while (coin_value);
+ break;
+ }
+ break;
+ }
+ }
+ }
+ /* coins were refunded */
+ }
+
+ if (selection) { /* half way through a selection */
+ keypad_read();
+ if (keypad_pressed()) {
+ switch (last_key) {
+ case KEY_RESET:
+ selection = 0;
+ break;
+ case 0:
+ break;
+ default:
+ selection = selection * 10 + (last_key%10);
+ make_request(selection);
+ selection = 0;
+ }
+ }
+ } else { /* else listen for the first key of a selection */
+ keypad_read();
+ if (keypad_pressed()) {
+ switch (last_key) {
+ case KEY_RESET:
+ return;
+ case 0:
+ break;
+ default:
+ selection = last_key%10;
+ }
+ }
+ }
+ }
+}
+
+void load_default_msg() {
+ /* FIXME: want this message to be changeable from the server */
+ set_msg("UNIVERSITY COMPUTER CLUB *** INSERT COINS OR USER-ID *** ",
+ WRAP_SCROLL);
+}
+
+void service_menu() {
+ while (door_open()) { /* don't quit until door is closed */
+
+ }
+}
+