//
/* * Example ATM simulation - file atmparts.h * * This file declares the classes that manage the ATM's components * * Copyright (c) 1996 - Russell C. Bjork * */ //
class CardReader
  {
    /* 
     * PURPOSE: Model the ATM component that reads a customer's card
     */
    public:
	CardReader();
	void ejectCard();
	void retainCard();
	enum ReaderStatus 
	  { NO_CARD, UNREADABLE_CARD, CARD_HAS_BEEN_READ };
	ReaderStatus checkForCardInserted();
	int cardNumber() const;
    private:
	ReaderStatus	_status;
	int		_cardNumberRead;	
  };
//
class Display
  {
    /* 
     * PURPOSE: Model the ATM component that displays messages for the customer
     */
    public:
	Display();
	// A particular screen that is to be displayed is specified by a
	// member of this enumeration
	enum Screen
	  { // The following request the customer to perform some
	    // specific action
	    INSERT_CARD, ENTER_PIN, 
	    CHOOSE_TRANSACTION, WANT_ANOTHER_TRANSACTION,
	    CHOOSE_ACCOUNT, CHOOSE_AMOUNT, ENTER_AMOUNT,
	    DEPOSIT_ENVELOPE,
	    // The following inform the customer of some problem
	    CARD_UNREADABLE, NOT_ENOUGH_CASH, TRANSACTION_REJECTED,
	    INVALID_PIN, CARD_RETAINED
	  };
	void displayScreen(Screen whichScreen, const char * extraInfo = NULL);
	void clearDisplay();
  };
//
class Keyboard
  {
    /* 
     * PURPOSE: Model the ATM component that accepts input from the customer
     */
    public:
	Keyboard();
	int readPIN();
	Transaction::TransactionType readTransactionChoice();
	bool readDoAnotherTransactionChoice();
	Bank::AccountType readAccountChoice();
	Money readWithdrawlAmountChoice();
	Money readAmountEntry();
	void pressEnterToContinue();
  };
//
class CashDispenser
  {
    /* 
     * PURPOSE: Model the ATM component that dispenses cash during withdrawls
     */
    public:
	CashDispenser();
	void setCash(Money initialCash);
	void dispenseCash(Money amount);
	Money currentCash() const;
    private:
	Money _currentCash;
  };
//
class EnvelopeAcceptor
  {
    /* 
     * PURPOSE: Model the ATM component that accepts an envelope during deposits
     */
    public:
	EnvelopeAcceptor();
	bool acceptEnvelope();
  };
//
class ReceiptPrinter
  {
    /* 
     * PURPOSE: Model the ATM component that prints switch
     */
    public:
	ReceiptPrinter();
	void printReceipt(int theATMnumber,
			  const char * theATMlocation,
			  int cardNumber,
			  int serialNumber,
			  const char * description,
			  Money amount,
			  Money balance,
			  Money availableBalance);
  };
//
class OperatorPanel
  {
    /* 
     * PURPOSE: Model the ATM component that allows an operator to stop
     *		the machine for maintenance
     */
    public:
	OperatorPanel();
	bool switchOn();		// True iff "on"
	Money getInitialCash();
  };
//