X-Git-Url: https://git.ucc.asn.au/?p=uccvend-snackrom.git;a=blobdiff_plain;f=ROM2%2Fmain.c;h=81919f03e3e5b9db33e3f0a29b3dc473c0a43958;hp=188fef07ae118f1633f1603b5c469b8a5338d6de;hb=2e7a8beb908896930042bc0564fbd16f3e0b0b62;hpb=c9763dcb182398266bae1c6a7a848beec1cba35d diff --git a/ROM2/main.c b/ROM2/main.c index 188fef0..81919f0 100644 --- a/ROM2/main.c +++ b/ROM2/main.c @@ -1,16 +1,220 @@ #include "display.h" +#include "keypad.h" +#include "chime.h" +#include "server.h" +#include "coinmech.h" #include "vend.h" +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 */ + + } +} + int main() { /* do stuff */ - set_msg("UNIVERSITY"); + set_msg("UNIVERSITY", WRAP_NONE); delay(1000); - set_msg(" COMPUTER "); + set_msg(" COMPUTER ", WRAP_NONE); delay(1000); - set_msg(" CLUB "); + set_msg(" CLUB ", WRAP_NONE); delay(1000); + load_default_msg(); while(1) { + /* this needs to be a relatively tight loop to make sure we catch + * keypresses at the main menu + */ + keypad_read(); + if (keypad_pressed()) { + if (last_key != KEY_RESET) { + if (uid_enter() && pin_enter()) { + /* authenticate them */ + switch (server_authenticate(uid, pin)) { + case AUTH_GOOD: + selection_menu(); + break; + case AUTH_BAD: + set_msg(" BAD USER ", WRAP_NONE); + delay(1000); + break; + case AUTH_NO_MONEY: + set_msg(" NO MONEY ", WRAP_NONE); + delay(1000); + break; + case AUTH_LOCKED: + set_msg("YOUR ACCOUNT IS LOCKED", WRAP_SCROLL); + delay(1000); + break; + } + } + uid = 0; + pin = 0; + /* move on */ + } + load_default_msg(); + } + + /* test door switch */ + if (door_open()) { + service_menu(); + load_default_msg(); + } + + /* check on coin mech */ } } @@ -20,6 +224,18 @@ void _start() { */ display_init(); set_bus_expanded(); + /* enable RTI & set rate */ + /* init coin mech */ main(); } +void rti() { + chime(); /* turn chime on or of as need be */ + + /* scroll the display if need be too */ + if (scroll_timer == 0) { + display_shift(); + scroll_timer = SCROLL_TIME; + } + scroll_timer--; +}