//
/* * Example ATM simulation - file atm.cc * * This file implements the class that manages the ATM itself * - as declared in atm.h * * Copyright (c) 1996 - Russell C. Bjork * */ #include "sysdep.h" #include "bank.h" #include "session.h" #include "transaction.h" #include "atmparts.h" #include "atm.h" //
ATM::ATM(int number, const char * location)
: _cardReader(* new CardReader()),
_display(* new Display()),
_keyboard(* new Keyboard()),
_cashDispenser(* new CashDispenser()),
_envelopeAcceptor(* new EnvelopeAcceptor),
_receiptPrinter(* new ReceiptPrinter()),
_operatorPanel(* new OperatorPanel()),
_number(number), _location(location)
{ }
//
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.displayScreen(Display::INSERT_CARD);
do
{
if (! _operatorPanel.switchOn())
_state = STOPPED;
else
readerStatus = _cardReader.checkForCardInserted();
}
while (_state == RUNNING && readerStatus == CardReader::NO_CARD);
if (_state == RUNNING)
switch (readerStatus)
{
case CardReader::CARD_HAS_BEEN_READ:
{
Session * session = new Session(_cardReader.cardNumber());
session -> doSessionUseCase();
delete session;
break;
}
case CardReader::UNREADABLE_CARD:
_display.displayScreen(Display::CARD_UNREADABLE);
_cardReader.ejectCard();
}
}
}
//
int ATM::getPIN() const
{ _display.displayScreen(Display::ENTER_PIN);
int PIN = _keyboard.readPIN();
_display.clearDisplay();
return PIN;
}
//
Transaction::TransactionType ATM::getTransactionChoice() const
{ _display.displayScreen(Display::CHOOSE_TRANSACTION);
Transaction::TransactionType choice = _keyboard.readTransactionChoice();
_display.clearDisplay();
return choice;
}
//
bool ATM::getDoAnotherTransactionChoice() const
{ _display.displayScreen(Display::WANT_ANOTHER_TRANSACTION);
bool choice = _keyboard.readDoAnotherTransactionChoice();
_display.clearDisplay();
return choice;
}
//
Bank::AccountType ATM::getAccountChoice(const char * purpose) const
{ _display.displayScreen(Display::CHOOSE_ACCOUNT, purpose);
Bank::AccountType choice = _keyboard.readAccountChoice();
_display.clearDisplay();
return choice;
}
//
Money ATM::getWithdrawlAmountChoice() const
{ _display.displayScreen(Display::CHOOSE_AMOUNT);
Money amount = _keyboard.readWithdrawlAmountChoice();
_display.clearDisplay();
return amount;
}
//
Money ATM::getAmountEntry() const
{ _display.displayScreen(Display::ENTER_AMOUNT);
Money amount = _keyboard.readAmountEntry();
_display.clearDisplay();
return amount;
}
//
bool ATM::checkIfCashAvailable(Money amount) const
{ if (amount <= _cashDispenser.currentCash())
return true;
else
{ _display.displayScreen(Display::NOT_ENOUGH_CASH);
_keyboard.pressEnterToContinue();
return false;
}
}
//
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.displayScreen(Display::INVALID_PIN);
int PIN = _keyboard.readPIN();
_display.clearDisplay();
return PIN;
}
//
void ATM::reportRejection(const char * reason) const
{
_display.displayScreen(Display::TRANSACTION_REJECTED, reason);
_keyboard.pressEnterToContinue();
_display.clearDisplay();
}
//
void ATM::ejectCard() const
{ _cardReader.ejectCard(); }
//
void ATM::retainCard() const
{ _cardReader.retainCard();
_display.displayScreen(Display::CARD_RETAINED);
_keyboard.pressEnterToContinue();
_display.clearDisplay();
}
//
int ATM::number() const
{ return _number; }
//