//
/* * Example ATM simulation - file ATM.java * * This file implements the class that manages the ATM itself * * Copyright (c) 1997 - Russell C. Bjork * */ package atm; import java.awt.*; import atm.atmparts.*; import atm.util.Status; import atm.util.Money; //
public class ATM
{
//
public ATM(int number, String location, Bank bank, Container container)
{
super();
_number = number;
_location = location;
_bank = bank;
_cardReader = new CardReader();
_display = new Display();
_keyboard = new Keyboard();
_cashDispenser = new CashDispenser();
_envelopeAcceptor = new EnvelopeAcceptor();
_receiptPrinter = new ReceiptPrinter();
_operatorPanel = new OperatorPanel();
GUILayout.doLayout(container,
_cardReader, _display, _keyboard, _cashDispenser,
_envelopeAcceptor, _receiptPrinter, _operatorPanel);
}
//
public synchronized Money startupOperation()
{
// Wait for switch to be turned on. Message will blink on and off
// to tell user what to do
while (! _operatorPanel.switchOn())
try
{ Thread.sleep(1000); }
catch (InterruptedException e)
{ }
_state = RUNNING;
return _operatorPanel.getInitialCash();
}
//
public void serviceCustomers(Money initialCash)
{
_cashDispenser.setCash(initialCash);
while (_state == RUNNING)
{
int readerStatus = CardReader.NO_CARD; // Initialization needed only
// to keep the compiler happy!
_display.requestCard();
do
{
if (! _operatorPanel.switchOn())
_state = STOPPED;
else
readerStatus = _cardReader.checkForCardInserted();
}
while (_state == RUNNING && readerStatus == CardReader.NO_CARD);
_display.clearDisplay();
if (_state == RUNNING)
switch (readerStatus)
{
case CardReader.CARD_HAS_BEEN_READ:
{
Session session = new Session(_cardReader.cardNumber(),
this,
_bank);
session.doSessionUseCase();
break;
}
case CardReader.UNREADABLE_CARD:
_display.reportCardUnreadable();
_cardReader.ejectCard();
_display.clearDisplay();
}
}
}
//
public int getPIN()
{ _display.requestPIN();
int PIN = _keyboard.readPIN(_display);
_display.clearDisplay();
return PIN;
}
//
public int getMenuChoice(String whatToChoose,
int numItems,
String items[])
{ _display.displayMenu(whatToChoose, numItems, items);
int choice = _keyboard.readMenuChoice(numItems);
_display.clearDisplay();
return choice;
}
//
public Money getAmountEntry()
{ _display.requestAmountEntry();
Money amount = _keyboard.readAmountEntry(_display);
_display.clearDisplay();
return amount;
}
//
public boolean checkIfCashAvailable(Money amount)
{ return ! _cashDispenser.currentCash().less(amount);
}
//
public void dispenseCash(Money amount)
{ _cashDispenser.dispenseCash(amount);
}
//
public boolean acceptEnvelope()
{ return _envelopeAcceptor.acceptEnvelope();
}
//
public void issueReceipt(int cardNumber,
int serialNumber,
String description,
Money amount,
Money balance,
Money availableBalance)
{
_receiptPrinter.printReceipt(_number, _location, cardNumber, serialNumber,
description, amount,
balance, availableBalance);;
}
//
public int reEnterPIN()
{ _display.requestReEnterPIN();
int PIN = _keyboard.readPIN(_display);
_display.clearDisplay();
return PIN;
}
//
public boolean reportTransactionFailure(String explanation)
{ _display.reportTransactionFailure(explanation);
int response = _keyboard.readMenuChoice(2);
_display.clearDisplay();
return response == 1;
}
//
public void ejectCard()
{ _cardReader.ejectCard();
}
//
public void retainCard()
{ _display.reportCardRetained();
_cardReader.retainCard();
_display.clearDisplay();
}
//
public int number()
{ return _number; }
//
// Private instance variables
private int _number;
private String _location;
private Bank _bank;
// Values for _state instance variable
private static final int RUNNING = 0;
private static final int STOPPED = 1;
private int _state;
private CardReader _cardReader;
private Display _display;
private Keyboard _keyboard;
private CashDispenser _cashDispenser;
private EnvelopeAcceptor _envelopeAcceptor;
private ReceiptPrinter _receiptPrinter;
private OperatorPanel _operatorPanel;
}
//