Skip to content

Commit d73bf1d

Browse files
committed
Fix some bugs related to insert and extract card
1 parent 434d404 commit d73bf1d

File tree

6 files changed

+75
-118
lines changed

6 files changed

+75
-118
lines changed

ATMFrame.java

Lines changed: 63 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public class ATMFrame extends JFrame implements ActionListener {
1717
// Static variable to hold the single instance of ATMFrame
1818
private static ATMFrame instance;
1919
private static Screen screen; // ATM's screen
20-
private final Keypad keypad; // ATM's keypad
2120
private final CardPanel cardPanel;
2221
private final CashDispenser cashDispenser; // ATM's cash dispenser
2322
private final BankDatabase bankDatabase; // account information database
@@ -59,36 +58,30 @@ private ATMFrame() {
5958
userAuthenticated = false; // user is not authenticated to start
6059
currentAccountNumber = 0; // no current account number to start
6160
screen = new Screen(); // create screen
62-
keypad = new Keypad(); // create keypad
6361
cashDispenser = new CashDispenser(); // create cash dispenser
6462
bankDatabase = new BankDatabase(); // create acct info database
65-
GlobalState.ATMState = "waitingCard"; // Change ui state to login
66-
screen.displayMessageLine("Welcome!");
67-
screen.displayMessageLine("Please insert your card");
68-
69-
// Create a timer to display the account number prompt after 3 seconds (3000 milliseconds)
70-
/**
71-
Timer timer = new Timer(3000, new ActionListener() {
72-
@Override
73-
public void actionPerformed(ActionEvent e) {
74-
screen.displayMessage("Please enter your account number: ");
75-
((Timer)e.getSource()).stop(); // Stop the timer after it runs once
76-
}
77-
});
78-
timer.setRepeats(false); // Only execute once
79-
timer.start(); // Start the timer
80-
**/
63+
welcomeMessage();
8164

8265
}
8366

67+
68+
private void wait(int mSec) {
69+
try {
70+
Thread.sleep(mSec); // Wait for 3000 milliseconds (3 seconds)
71+
} catch (InterruptedException e) {
72+
e.printStackTrace(); // Handle the exception
73+
}
74+
}
75+
76+
8477
static void displayMainMenu() {
8578
GlobalState.ATMState = "Menu";
8679
screen.clearScreen();
8780
screen.displayMessageLine("Main menu:");
8881
screen.displayMessageLine("1 - View my balance");
8982
screen.displayMessageLine("2 - Withdraw cash");
9083
screen.displayMessageLine("3 - Transfer");
91-
screen.displayMessageLine("4 - Exit\n");
84+
screen.displayMessageLine("Eject card to exit ATM\n");
9285
screen.displayMessage("Enter a choice: ");
9386

9487
} // end method displayMainMenu
@@ -105,6 +98,17 @@ public static void appendMessage(String text) {
10598
messageField.appendMessage(text);
10699
}
107100

101+
public static void welcomeMessage() {
102+
screen.clearScreen();
103+
GlobalState.ATMState = "waitingCard"; // Change ui state to login
104+
screen.displayMessageLine("Welcome!");
105+
screen.displayMessageLine("Please insert your card");
106+
}
107+
108+
public static void loginMessage() {
109+
screen.displayMessage("Please Enter your account number: ");
110+
}
111+
108112
private void authenticateUser(int input) {
109113
GlobalState.allowDecimal = false;
110114
if (!isPinInput) {
@@ -150,22 +154,14 @@ private void menuSelection(int choice) {
150154
break;
151155
case WITHDRAWAL:
152156
GlobalState.ATMState = "Withdrawal";
153-
temp = new Withdrawal(currentAccountNumber, screen, bankDatabase, keypad, cashDispenser);
157+
temp = new Withdrawal(currentAccountNumber, screen, bankDatabase, cashDispenser);
154158
temp.execute(0);
155159
break;
156160
case TRANSFER:
157161
GlobalState.ATMState = "Transfer";
158-
temp = new Transfer(currentAccountNumber, screen, bankDatabase, keypad);
162+
temp = new Transfer(currentAccountNumber, screen, bankDatabase);
159163
temp.execute(0);
160164
break;
161-
case EXIT: // user chose to terminate session
162-
screen.clearScreen();
163-
screen.displayMessageLine("\nExiting the system...");
164-
screen.displayMessageLine("\nWelcome!");
165-
screen.displayMessage("\nPlease enter your account number: ");
166-
GlobalState.ATMState = "login";
167-
userAuthenticated = false;
168-
break;
169165
default: // user did not enter an integer from 1-4
170166
screen.clearScreen();
171167
screen.displayMessageLine(
@@ -190,21 +186,15 @@ public void actionPerformed(ActionEvent e) {
190186
if ("login".equals(GlobalState.ATMState)) {
191187
GlobalState.allowDecimal = false;
192188
screen.clearScreen();
193-
screen.displayMessageLine("\nWelcome!");
194-
screen.displayMessage("\nPlease enter your account number: ");
189+
screen.displayMessage("Please enter your account number: ");
195190
accountNumber = 0; // Reset account number
196191
isPinInput = false; // Reset flag for next authentication attempt
197192
userAuthenticated = false;
198193
} else if ("Menu".equals(GlobalState.ATMState)) {
199-
GlobalState.allowDecimal = false;
200-
screen.clearScreen();
201-
screen.displayMessageLine("\nWelcome!");
202-
screen.displayMessage("\nPlease enter your account number: ");
203-
GlobalState.ATMState = "login";
204-
} else if ("waitingCard".equals(GlobalState.ATMState)){
205194

206-
}
207-
else {
195+
} else if ("waitingCard".equals(GlobalState.ATMState)) {
196+
197+
} else {
208198
GlobalState.allowDecimal = false;
209199
displayMainMenu();
210200
}
@@ -226,20 +216,50 @@ public void actionPerformed(ActionEvent e) {
226216
} else if (source == keypadPanel.numberButtons[11]) { // "00" Button
227217
textField.appendInput("00"); // Append "00" to user input
228218

229-
} else if (source == cardPanel.insertCardButton){
219+
} else if (source == cardPanel.insertCardButton) {
230220
System.out.println("aaa");
231-
if ("waitingCard".equals(GlobalState.ATMState)){
221+
if ("waitingCard".equals(GlobalState.ATMState)) {
232222
screen.clearScreen();
233223
screen.displayMessageLine("Card read successful!");
234224
GlobalState.ATMState = "login"; // Change ui state to login
225+
loginMessage();
226+
}
227+
} else if (source == cardPanel.ejectCardButton) {
228+
if (!"waitingCard".equals(GlobalState.ATMState)) {
229+
startCardEjectTimer();
230+
235231
}
236-
} else if (source == cardPanel.ejectCardButton){
232+
}
233+
}
234+
235+
private void startCardEjectTimer() {
236+
if (!"waitingCard".equals(GlobalState.ATMState)) {
237+
// Display the initial message immediately
237238
screen.clearScreen();
238239
screen.displayMessageLine("Ejecting card...");
239-
GlobalState.ATMState = "waitingCard";
240+
241+
// Create a timer to execute actions after 3 seconds
242+
Timer timer = new Timer(3000, x -> {
243+
screen.clearScreen(); // Clear the screen after 3 seconds
244+
screen.displayMessageLine("Remember to take your card!"); // Display this message
245+
246+
// Start another timer to wait before calling welcomeMessage
247+
Timer welcomeTimer = new Timer(3000, y -> {
248+
welcomeMessage(); // Call welcomeMessage after another 3 seconds
249+
});
250+
welcomeTimer.setRepeats(false); // Ensure this timer only runs once
251+
welcomeTimer.start(); // Start the welcome timer
252+
});
253+
254+
timer.setRepeats(false); // Ensure the first timer only runs once
255+
timer.start(); // Start the first timer
256+
GlobalState.ATMState = "waitingCard"; // Update the state
240257
}
241258
}
242259

260+
261+
262+
243263
private void handler(String text) {
244264
System.out.println(GlobalState.ATMState);
245265
if ("login".equals(GlobalState.ATMState)) {

BalanceInquiry.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public void execute() {
3131

3232
// display the balance information on the screen
3333
screen.clearScreen();
34-
screen.displayMessageLine("\nBalance Information:");
35-
screen.displayMessage(" - Account type: ");
34+
screen.displayMessageLine("Balance Information:");
35+
screen.displayMessage("\n - Account type: ");
3636
screen.displayMessage(accountType);
3737
screen.displayMessage("\n - Available balance: ");
3838
screen.displayDollarAmount(availableBalance);

CardPanel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public CardPanel(ActionListener actionListener) {
1111
this.setLayout(new FlowLayout());
1212
//this.setBackground(Color.LIGHT_GRAY);
1313

14-
// Add action listner
14+
// Add action listener
1515
insertCardButton.addActionListener(actionListener);
1616
ejectCardButton.addActionListener(actionListener);
1717

Keypad.java

Lines changed: 0 additions & 59 deletions
This file was deleted.

Transfer.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@ public class Transfer extends Transaction {
33
private final static int CANCELED = 0;
44
private String state = "";
55
private double amount; // Amount to be transferred
6-
private Keypad keypad; // Keypad for user input
76
private int beneficiaryAccountNumber = 0;
87

98
// Constructor to initialize the transfer transaction
10-
public Transfer(int remitterAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase, Keypad atmKeypad) {
9+
public Transfer(int remitterAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase) {
1110
// Initialize superclass variables
1211
super(remitterAccountNumber, atmScreen, atmBankDatabase);
13-
this.keypad = atmKeypad; // Set the keypad for user input
1412
}
1513

1614
// Execute the transfer process

Withdrawal.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,20 @@ public class Withdrawal extends Transaction {
33
private final static int CANCELED = 5;
44
private final static double MAX_WITHDRAWAL = 5000; // maximum cash that can be taken
55
private static double ATM_RESERVE = 10000; // ATM reserve amount
6-
private int amount; // amount to withdraw
7-
private Keypad keypad; // reference to keypad
6+
private int amount; // amount to withdraw// reference to keypad
87
private CashDispenser cashDispenser; // reference to cash dispenser
98
//Withdrawal state
109
private String state;
1110

1211
// Withdrawal constructor
1312
public Withdrawal(int userAccountNumber, Screen atmScreen,
14-
BankDatabase atmBankDatabase, Keypad atmKeypad,
13+
BankDatabase atmBankDatabase,
1514
CashDispenser atmCashDispenser) {
1615
// initialize superclass variables
1716
super(userAccountNumber, atmScreen, atmBankDatabase);
1817

1918
// initialize references to keypad and cash dispenser
2019
this.state = "";
21-
keypad = atmKeypad;
2220
cashDispenser = atmCashDispenser;
2321
} // end Withdrawal constructor
2422

@@ -46,22 +44,22 @@ public void execute(int input) {
4644
case 4: // user chose to input a preferred cash amount
4745
state = "waitingPreferredAmount";
4846
screen.clearScreen();
49-
screen.displayMessage("\n*Less or equal $5000*");
47+
screen.displayMessage("*Less or equal $5000*");
5048
screen.displayMessage("Enter your preferred cash amount (must be in $100, $ 500, or $1000 increments): ");
5149
break;
5250
case CANCELED: // the user chose to cancel
5351
userChoice = CANCELED; // save user's choice
5452
break;
5553
default: // the user did not enter a value from 1-6
5654
screen.clearScreen();
57-
screen.displayMessageLine("\nInvalid selection. Try again.");
55+
screen.displayMessageLine("Invalid selection. Try again.");
5856
returnMainMenu();
5957
}
6058
} else if ("waitingPreferredAmount".equals(state)) {
6159
int preferredAmount = checkPreferredCashAmount(input);
6260
if (preferredAmount == 0) {
6361
screen.clearScreen();
64-
screen.displayMessageLine("\nInvalid amount. Please enter a valid amount.");
62+
screen.displayMessageLine("Invalid amount. Please enter a valid amount.");
6563
returnMainMenu();
6664
} else runWithdrawal(preferredAmount);
6765

@@ -85,15 +83,15 @@ private void runWithdrawal(int amount) {
8583
if (ATM_RESERVE < amount) {
8684
// Not enough cash in the ATM reserve
8785
screen.clearScreen();
88-
screen.displayMessageLine("\nATM cash not enough, now available ($" + ATM_RESERVE + ").");
86+
screen.displayMessageLine("ATM cash not enough, now available ($" + ATM_RESERVE + ").");
8987
screen.displayMessageLine("Please wait for replenishment.");
9088
disableWithdrawals(); // Disable all withdrawals momentarily
9189
} else if (cashDispenser.isSufficientCashAvailable(amount)) {
9290
// Update ATM reserve after successful withdrawal
9391
bankDatabase.debit(getAccountNumber(), amount);
9492
ATM_RESERVE -= amount; // decrease ATM reserve
9593
screen.clearScreen();
96-
screen.displayMessageLine("\nPlease take your cash now.");
94+
screen.displayMessageLine("Please take your cash now.");
9795
dispenseCash(amount); // dispense cash
9896
} else { // cash dispenser does not have enough cash
9997
screen.displayMessageLine("\nInsufficient cash available in the ATM." +
@@ -124,7 +122,7 @@ private void dispenseCash(int amount) {
124122
}
125123

126124
// Display the dispensed amounts
127-
StringBuilder dispensedMessage = new StringBuilder("\nDispensed:\n");
125+
StringBuilder dispensedMessage = new StringBuilder("Dispensed:\n");
128126
for (int i = 0; i < counts.length; i++) {
129127
if (counts[i] > 0) {
130128
dispensedMessage.append("$").append(denominations[i]).append(" x ").append(counts[i]).append("\n");

0 commit comments

Comments
 (0)