11#include " Inkplate10Driver.h"
2- #include " ../../system/defines.h"
2+
3+ SPIClass spi2 (2 );
4+ SdFat sd (&spi2);
35
46/* *
57 * @brief begin function initialize Inkplate object with predefined
1517 */
1618int EPDDriver::initDriver (Inkplate *_inkplatePtr)
1719{
20+ // If the driver was already initialized, skip current initialization
1821 if (_beginDone == 1 )
1922 return 0 ;
20- internalIO.beginIO (0x20 );
21- externalIO.beginIO (0x21 );
2223
23- internalIO.digitalWriteIO ( 9 , LOW);
24+ internalIO.begin (IO_INT_ADDR);
25+ externalIO.begin (IO_EXT_ADDR);
26+
27+ internalIO.digitalWrite ( 9 , LOW);
2428
2529
2630 memset (internalIO._ioExpanderRegs , 0 , 22 );
2731 memset (externalIO._ioExpanderRegs , 0 , 22 );
2832
29- internalIO.pinModeIO ( VCOM, OUTPUT);
30- internalIO.pinModeIO ( PWRUP, OUTPUT);
31- internalIO.pinModeIO ( WAKEUP, OUTPUT);
32- internalIO.pinModeIO ( GPIO0_ENABLE, OUTPUT);
33- internalIO.digitalWriteIO ( GPIO0_ENABLE, 1 );
33+ internalIO.pinMode ( VCOM, OUTPUT);
34+ internalIO.pinMode ( PWRUP, OUTPUT);
35+ internalIO.pinMode ( WAKEUP, OUTPUT);
36+ internalIO.pinMode ( GPIO0_ENABLE, OUTPUT);
37+ internalIO.digitalWrite ( GPIO0_ENABLE, 1 );
3438
35- internalIO.digitalWriteIO ( WAKEUP, 1 );
39+ internalIO.digitalWrite ( WAKEUP, 1 );
3640 WAKEUP_SET;
3741 delay (1 );
3842 Wire.beginTransmission (0x48 );
@@ -43,7 +47,7 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
4347 Wire.write (0B00000000 ); // Power down delay (6mS per rail)
4448 Wire.endTransmission ();
4549 delay (1 );
46- internalIO.digitalWriteIO ( WAKEUP, 0 );
50+ internalIO.digitalWrite ( WAKEUP, 0 );
4751 WAKEUP_CLEAR;
4852
4953 // Set all pins of seconds I/O expander to outputs, low.
@@ -56,16 +60,16 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
5660
5761 for (int i = 0 ; i < 15 ; i++)
5862 {
59- externalIO.pinModeIO ( i, OUTPUT);
60- externalIO.digitalWriteIO ( i, LOW);
63+ externalIO.pinMode ( i, OUTPUT);
64+ externalIO.digitalWrite ( i, LOW);
6165 }
6266
6367 // For same reason, unused pins of first I/O expander have to be also set as
6468 // outputs, low.
65- internalIO.pinModeIO ( 14 , OUTPUT);
66- internalIO.pinModeIO ( 15 , OUTPUT);
67- internalIO.digitalWriteIO ( 14 , LOW);
68- internalIO.digitalWriteIO ( 15 , LOW);
69+ internalIO.pinMode ( 14 , OUTPUT);
70+ internalIO.pinMode ( 15 , OUTPUT);
71+ internalIO.digitalWrite ( 14 , LOW);
72+ internalIO.digitalWrite ( 15 , LOW);
6973
7074 // Set SPI pins to input to reduce power consumption in deep sleep
7175 pinMode (12 , INPUT);
@@ -74,16 +78,16 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
7478 pinMode (15 , INPUT);
7579
7680 // And also disable uSD card supply
77- internalIO.pinModeIO ( SD_PMOS_PIN, INPUT);
81+ internalIO.pinMode ( SD_PMOS_PIN, INPUT);
7882
7983 // CONTROL PINS
8084 pinMode (0 , OUTPUT);
8185 pinMode (2 , OUTPUT);
8286 pinMode (32 , OUTPUT);
8387 pinMode (33 , OUTPUT);
84- internalIO.pinModeIO ( OE, OUTPUT);
85- internalIO.pinModeIO ( GMOD, OUTPUT);
86- internalIO.pinModeIO ( SPV, OUTPUT);
88+ internalIO.pinMode ( OE, OUTPUT);
89+ internalIO.pinMode ( GMOD, OUTPUT);
90+ internalIO.pinMode ( SPV, OUTPUT);
8791
8892 // DATA PINS
8993 pinMode (4 , OUTPUT); // D0
@@ -95,16 +99,17 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
9599 pinMode (26 , OUTPUT);
96100 pinMode (27 , OUTPUT); // D7
97101
98- internalIO.pinModeIO ( 10 , OUTPUT);
99- internalIO.pinModeIO ( 11 , OUTPUT);
100- internalIO.pinModeIO ( 12 , OUTPUT);
101- internalIO.digitalWriteIO ( 10 , LOW);
102- internalIO.digitalWriteIO ( 11 , LOW);
103- internalIO.digitalWriteIO ( 12 , LOW);
102+ internalIO.pinMode ( 10 , OUTPUT);
103+ internalIO.pinMode ( 11 , OUTPUT);
104+ internalIO.pinMode ( 12 , OUTPUT);
105+ internalIO.digitalWrite ( 10 , LOW);
106+ internalIO.digitalWrite ( 11 , LOW);
107+ internalIO.digitalWrite ( 12 , LOW);
104108 // Battery voltage Switch MOSFET
105- internalIO.pinModeIO ( 9 , OUTPUT);
106- internalIO.digitalWriteIO ( 9 , LOW);
109+ internalIO.pinMode ( 9 , OUTPUT);
110+ internalIO.digitalWrite ( 9 , LOW);
107111
112+ // Initialize all the framebuffers
108113 DMemoryNew = (uint8_t *)ps_malloc (E_INK_WIDTH * E_INK_HEIGHT / 8 );
109114 _partial = (uint8_t *)ps_malloc (E_INK_WIDTH * E_INK_HEIGHT / 8 );
110115 _pBuffer = (uint8_t *)ps_malloc (E_INK_WIDTH * E_INK_HEIGHT / 4 );
@@ -116,6 +121,7 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
116121 {
117122 return 0 ;
118123 }
124+ // Set all the framebuffers to White at start
119125 memset (DMemoryNew, 0 , E_INK_WIDTH * E_INK_HEIGHT / 8 );
120126 memset (_partial, 0 , E_INK_WIDTH * E_INK_HEIGHT / 8 );
121127 memset (_pBuffer, 0 , E_INK_WIDTH * E_INK_HEIGHT / 4 );
@@ -127,6 +133,11 @@ int EPDDriver::initDriver(Inkplate *_inkplatePtr)
127133 return 1 ;
128134}
129135
136+
137+ /* *
138+ * @brief Calculates the values of the lookup table to
139+ * speed up rendering
140+ */
130141void EPDDriver::calculateLUTs ()
131142{
132143 for (int j = 0 ; j < 9 ; ++j)
@@ -584,9 +595,9 @@ void EPDDriver::pinsAsOutputs()
584595 pinMode (2 , OUTPUT);
585596 pinMode (32 , OUTPUT);
586597 pinMode (33 , OUTPUT);
587- internalIO.pinModeIO ( OE, OUTPUT);
588- internalIO.pinModeIO ( GMOD, OUTPUT);
589- internalIO.pinModeIO ( SPV, OUTPUT);
598+ internalIO.pinMode ( OE, OUTPUT);
599+ internalIO.pinMode ( GMOD, OUTPUT);
600+ internalIO.pinMode ( SPV, OUTPUT);
590601 pinMode (0 , OUTPUT);
591602 pinMode (4 , OUTPUT);
592603 pinMode (5 , OUTPUT);
@@ -631,9 +642,9 @@ void EPDDriver::pinsZstate()
631642 pinMode (2 , INPUT);
632643 pinMode (32 , INPUT);
633644 pinMode (33 , INPUT);
634- internalIO.pinModeIO (OE, INPUT);
635- internalIO.pinModeIO (GMOD, INPUT);
636- internalIO.pinModeIO (SPV, INPUT);
645+ internalIO.pinMode (OE, INPUT);
646+ internalIO.pinMode (GMOD, INPUT);
647+ internalIO.pinMode (SPV, INPUT);
637648
638649 // Set up the EPD Data and CL pins for I2S .
639650 pinMode (0 , INPUT);
@@ -717,4 +728,159 @@ void EPDDriver::hscan_start(uint32_t _d)
717728uint8_t EPDDriver::getDisplayMode ()
718729{
719730 return _displayMode;
720- }
731+ }
732+
733+ /* *
734+ * @brief sdCardInit initializes sd card trough SPI
735+ *
736+ * @return 0 if failed to initialise, 1 if successful
737+ */
738+ int16_t EPDDriver::sdCardInit ()
739+ {
740+ internalIO.pinMode (SD_PMOS_PIN, OUTPUT);
741+ internalIO.digitalWrite (SD_PMOS_PIN, LOW);
742+ delay (50 );
743+ spi2.begin (14 , 12 , 13 , 15 );
744+ setSdCardOk (sd.begin (15 , SD_SCK_MHZ (25 )));
745+ return getSdCardOk ();
746+ }
747+
748+ /* *
749+ * @brief sdCardSleep turns off the P-MOS which powers the sd card to save energy in deep sleep
750+ */
751+ void EPDDriver::sdCardSleep ()
752+ {
753+ // Set SPI pins to input to reduce power consumption in deep sleep
754+ pinMode (12 , INPUT);
755+ pinMode (13 , INPUT);
756+ pinMode (14 , INPUT);
757+ pinMode (15 , INPUT);
758+
759+ // And also disable uSD card supply
760+ internalIO.pinMode ( SD_PMOS_PIN, INPUT);
761+ }
762+
763+ /* *
764+ * @brief getSdFat gets sd card object
765+ *
766+ * @return sd card class object
767+ */
768+ SdFat EPDDriver::getSdFat ()
769+ {
770+ return sd;
771+ }
772+
773+ /* *
774+ * @brief getSPIptr gets SPI class object pointer
775+ *
776+ * @return SPI class object
777+ */
778+ SPIClass *EPDDriver::getSPIptr ()
779+ {
780+ return &spi2;
781+ }
782+
783+ /* *
784+ * @brief setSdCardOk sets sd card OK status
785+ *
786+ * @param int16_t s
787+ * sd card OK status, can be 1 or 0
788+ */
789+ void EPDDriver::setSdCardOk (int16_t s)
790+ {
791+ _sdCardOk = s;
792+ }
793+
794+
795+ /* *
796+ * @brief setSdCardOk gets sd card OK status
797+ *
798+ * @return sd card OK status, can be 1 or 0
799+ */
800+ int16_t EPDDriver::getSdCardOk ()
801+ {
802+ return _sdCardOk;
803+ }
804+
805+
806+
807+ /* *
808+ * @brief readBattery reads voltage of the battery
809+ *
810+ * @return returns battery voltage value
811+ */
812+ double EPDDriver::readBattery ()
813+ {
814+ // Read the pin on the battery MOSFET. If is high, that means is older version of the board
815+ // that uses PMOS only. If it's low, newer board with both PMOS and NMOS.
816+ internalIO.pinMode (9 , INPUT);
817+ int state = internalIO.digitalRead (9 );
818+ internalIO.pinMode (9 , OUTPUT);
819+
820+ // If the input is pulled high, it's PMOS only.
821+ // If it's pulled low, it's PMOS and NMOS.
822+ if (state)
823+ {
824+ internalIO.digitalWrite (9 , LOW);
825+ }
826+ else
827+ {
828+ internalIO.digitalWrite (9 , HIGH);
829+ }
830+
831+ // Wait a little bit after a MOSFET enable.
832+ delay (5 );
833+
834+ // Set to the highest resolution and read the voltage.
835+ analogReadResolution (12 );
836+ int adc = analogReadMilliVolts (35 );
837+
838+ // Turn off the MOSFET (and voltage divider).
839+ if (state)
840+ {
841+ internalIO.digitalWrite (9 , HIGH);
842+ }
843+ else
844+ {
845+ internalIO.digitalWrite (9 , LOW);
846+ }
847+
848+ // Calculate the voltage at the battery terminal (voltage is divided in half by voltage divider).
849+ return (double (adc) * 2.0 / 1000 );
850+ }
851+
852+ /* *
853+ * @brief readTemperature reads panel temperature
854+ *
855+ * @return returns temperature in range from -10 to 85 degree C with
856+ * accuracy of +-1 in range from 0 to 50
857+ */
858+ int8_t EPDDriver::readTemperature ()
859+ {
860+ int8_t temp;
861+ if (getPanelState () == 0 )
862+ {
863+ WAKEUP_SET;
864+ PWRUP_SET;
865+ delay (5 );
866+ }
867+ Wire.beginTransmission (0x48 );
868+ Wire.write (0x0D );
869+ Wire.write (B10000000);
870+ Wire.endTransmission ();
871+ delay (5 );
872+
873+ Wire.beginTransmission (0x48 );
874+ Wire.write (0x00 );
875+ Wire.endTransmission ();
876+
877+ Wire.requestFrom (0x48 , 1 );
878+ temp = Wire.read ();
879+ if (getPanelState () == 0 )
880+ {
881+ PWRUP_CLEAR;
882+ WAKEUP_CLEAR;
883+ delay (5 );
884+ }
885+ return temp;
886+ }
0 commit comments