//
/* * Example ATM simulation - file atm.cc * * This file implements the class that manages the ATM itself * - as declared in atm.h * * Copyright (c) 1996, 1997 - Russell C. Bjork * */ #include "sysdep.h" #include "status.h" #include "money.h" #include "bank.h" #include "session.h" #include "transaction.h" #include "atmparts.h" #include "atm.h" //
ATM::ATM(int number, const char * location, Bank & bank)
: _number(number),
_location(location),
_bank(bank),
_state(STOPPED),
_cardReader(* new CardReader()),
_display(* new Display()),
_keyboard(* new Keyboard()),
_cashDispenser(* new CashDispenser()),
_envelopeAcceptor(* new EnvelopeAcceptor),
_receiptPrinter(* new ReceiptPrinter()),
_operatorPanel(* new OperatorPanel())
{ }
//
Money ATM::startupOperation()
{
// Wait for switch to be turned on
while (! _operatorPanel.switchOn())
;
_state = RUNNING;
return _operatorPanel.getInitialCash();
}
//
void ATM::serviceCustomers(Money initialCash)
{
_cashDispenser.setCash(initialCash);
while (_state == RUNNING)
{
CardReader::ReaderStatus readerStatus;
_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();
delete session;
break;
}
case CardReader::UNREADABLE_CARD:
_display.reportCardUnreadable();
_cardReader.ejectCard();
}
}
}
//
int ATM::getPIN() const
{ _display.requestPIN();
int PIN = _keyboard.readPIN(_display);
_display.clearDisplay();
return PIN;
}
//
int ATM::getMenuChoice(const char * whatToChoose,
int numItems,
const char * items[]) const
{ _display.displayMenu(whatToChoose, numItems, items);
int choice = _keyboard.readMenuChoice(numItems);
_display.clearDisplay();
return choice;
}
//
Money ATM::getAmountEntry() const
{ _display.requestAmountEntry();
Money amount = _keyboard.readAmountEntry(_display);
_display.clearDisplay();
return amount;
}
//
bool ATM::checkIfCashAvailable(Money amount) const
{ return ! (_cashDispenser.currentCash() < amount);
}
//
void ATM::dispenseCash(Money amount) const
{ _cashDispenser.dispenseCash(amount);
}
//
bool ATM::acceptEnvelope() const
{ return _envelopeAcceptor.acceptEnvelope();
}
//
void ATM::issueReceipt(int cardNumber,
int serialNumber,
const char * description,
Money amount,
Money balance,
Money availableBalance) const
{
_receiptPrinter.printReceipt(_number, _location, cardNumber, serialNumber,
description, amount,
balance, availableBalance);;
}
//
int ATM::reEnterPIN() const
{ _display.requestReEnterPIN();
int PIN = _keyboard.readPIN(_display);
_display.clearDisplay();
return PIN;
}
//
bool ATM::reportTransactionFailure(const char * explanation) const
{
_display.reportTransactionFailure(explanation);
int response = _keyboard.readMenuChoice(2);
_display.clearDisplay();
return response == 1;
}
//
void ATM::ejectCard() const
{ _cardReader.ejectCard(); }
//
void ATM::retainCard() const
{ _cardReader.retainCard();
_display.reportCardRetained();
// The above routine will sleep 20 seconds to let user see message
_display.clearDisplay();
}
//
int ATM::number() const
{ return _number; }
//