#ifndef SegmentDisplay_h
#define SegmentDisplay_h

#include "SegmentDisplayConfig.h"
#include "Arduino.h"

#if defined(SDUseSPI)
#include "SPI.h"
#endif

#include "SegmentDisplayChars.h"

/**
 * Drives up to 8 digits using two 8-bit shift registers.
 *
 * Least significant bit ends up at output pin 0 of the shift register,
 * which correlates to Segment A (as defined in SegmentDisplayChars.h).
 * The last digit is also assumed to be at output pin 0 of the chained
 * shift register.
 *
 * The order in which the shift registers are chained is determined by
 * (un)defining SDPushSegmentsFirst.
**/

class SegmentDisplay
{
  public:
    void begin();
    void end();

    void writeNumber(uint32_t value);
    void writeTextLeft(char* value);
    void writeTextCenter(char* value);
    void writeTextRight(char* value);

    byte getDigits() { return digits; }
    void setDigits(byte value) { digits = value; }

    uint32_t getLatchPin() { return latchPin; }
    void setLatchPin(uint32_t value) { latchPin = value; }

    uint32_t getDigitDelayMicroseconds() { return digitDelayMicroseconds; }
    void setDigitDelayMicroseconds(uint32_t value) { digitDelayMicroseconds = value; }

    #if defined(SDUseSPI)
    uint32_t getClockSpeed() { return clockSpeed; }
    void setClockSpeed(uint32_t value) { clockSpeed = value; }
    #endif

    #if !defined(SDUseSPI)
    uint32_t getClockPin() { return clockPin; }
    void setClockPin(uint32_t value) { clockPin = value; }

    uint32_t getDataPin() { return dataPin; }
    void setDataPin(uint32_t value) { dataPin = value; }
    #endif

  protected:
    void writeDigit(byte value, byte digitMask);
    void writeChar(char value, byte digitMask);
  public:
    void writeDisplay(byte characterMask, byte digitMask);

  private:
    byte digits = 6;
    uint32_t digitDelayMicroseconds = 1000;
    uint32_t latchPin = SS;

    #if defined(SDUseSPI)
    uint32_t clockSpeed = 20000000;
    #endif

    #if !defined(SDUseSPI)
    uint32_t clockPin = SCK;
    uint32_t dataPin = MOSI;
    #endif
};

#endif