#ifndef INCLUDE_PROM_DEVICE_H
#define INCLUDE_PROM_DEVICE_H

#include "Arduino.h"

/*****************************************************************************/
/*****************************************************************************/
/**
 * PromDevice class
 *
 * Provides the interface to read and write data from a parallel PROM using the
 * Arduino.
 *
 * Block writes are supported on compatible devices by specifying a blockSize
 * in the constructor.  Use zero for devices that only support byte writes.
 */
class PromDevice
{
  public:
    PromDevice(unsigned long size, word blockSize, unsigned maxWriteTime, bool polling);
    bool writeData(byte data[], word len, word address);
    byte readData(word address) { return readByte(address); }

    virtual void begin() = 0;
    virtual void disableSoftwareWriteProtect() {}

  protected:
    unsigned int mSize;             // Size of the device, in bytes
    unsigned int mBlockSize;        // Block size for page writes, zero if N/A
    unsigned int mMaxWriteTime;     // Max time (in ms) to wait for write cycle to complete
    bool mSupportsDataPoll;         // End of write detected by data polling

    void setDataBusMode(uint8_t mode);
    byte readDataBus();
    void writeDataBus(byte data);

    virtual void setAddress(word address) = 0;
    virtual byte readByte(word address) = 0;
    virtual bool burnByte(byte value, word address) = 0;
    virtual bool burnBlock(byte data[], word len, word address) { return false; }

};


#endif  // #define INCLUDE_PROM_DEVICE_H

