/**
  ******************************************************************************
  * @file	: ShiftRegGPIOXpander_Example02.cpp
  * @brief  : Code example of the use of the ShiftRegGPIOXpander_ESP32 library
  * 
  * Repository: https://github.com/GabyGold67/ShiftRegGPIOXpander_ESP32
  * 
  * Framework: Arduino
  * Platform: ESP32
  * 
  * @author	: Gabriel D. Goldman
  * mail <gdgoldman67@hotmail.com>
  * Github <https://github.com/GabyGold67>
  *
  * @date First release: 16/02/2025 
  *       Last update:   02/04/2025 13:40 GMT+0200 DST
  ******************************************************************************
  * @warning **Use of this library is under your own responsibility**
  * 
  * @warning The use of this library falls in the category described by The Alan 
  * Parsons Project (c) 1980 "Games People play" disclaimer:
  * 
  * Games people play, you take it or you leave it
  * Things that they say aren't alright
  * If I promised you the moon and the stars, would you believe it?
  * 
  * Released into the public domain in accordance with "GPL-3.0-or-later" license terms.
  ******************************************************************************
*/
#include <Arduino.h>
#include <ShiftRegGPIOXpander.h>

//==============================================>> General use definitions BEGIN
//================================================>> General use definitions END
 
//======================================>> General use function prototypes BEGIN
void Error_Handler();
//========================================>> General use function prototypes END
 
//====================================>> Task Callback function prototypes BEGIN
//======================================>> Task Callback function prototypes END
 
//===========================================>> Tasks Handles declarations BEGIN
//=============================================>> Tasks Handles declarations END

uint8_t ds{33};
uint8_t sh_cp{26};
uint8_t st_cp{25};
uint8_t srQty{4};
uint8_t strtngVals [4] {0x00, 0x00,0x00,0x00};
uint8_t* stVlsPtr = strtngVals;

uint8_t mask_1 [] {0b10001000, 0b00100010, 0b00110011, 0b01110111};
uint8_t mask_2 [] {0b01010101, 0b01010101, 0b01010101, 0b01010101};

uint8_t pinUpdtd{0};
uint8_t setVal{};

ShiftRegGPIOXpander srgx(ds, sh_cp, st_cp, srQty, stVlsPtr);

void setup() { 
   Serial.begin(9600);
}

void loop() {

   Serial.println("Example starts");
   Serial.println("--------------");

   Serial.println("digitalWriteSrAllSet() method rises all pins");
   srgx.digitalWriteSrAllSet();
   vTaskDelay(1000);

   Serial.println("digitalWriteSrAllReset() method clears all pins");
   srgx.digitalWriteSrAllReset();
   vTaskDelay(1000);

   Serial.println("digitalWriteSr() method writing HIGH pin by pin");
   setVal = HIGH;
   for(uint8_t pinNum{0}; pinNum <= srgx.getMaxPin(); pinNum++){
      srgx.digitalWriteSr(pinNum, setVal);
      vTaskDelay(200);
   }

   Serial.println("digitalWriteSr() method writing LOW pin by pin");
   setVal = LOW;
   for(uint8_t pinNum{0}; pinNum <= srgx.getMaxPin(); pinNum++){
      srgx.digitalWriteSr(pinNum, setVal);
      vTaskDelay(200);
   }
   vTaskDelay(1000);

   Serial.println("digitalWriteSrToAux() method writing TO THE BUFFER HIGH pin by pin and 'move & flush automatic' every 3rd pin ");
   setVal = HIGH;
   for(uint8_t pinNum{0}; pinNum <= srgx.getMaxPin(); pinNum++){
      if((pinNum+1) % 3 != 0)
         srgx.digitalWriteSrToAux(pinNum, setVal);
      else
         srgx.digitalWriteSr(pinNum, setVal);
      vTaskDelay(200);
   }
   srgx.moveAuxToMain();
   vTaskDelay(1000);

   Serial.println("digitalWriteSrToAux() method writing TO THE BUFFER LOW pin by pin and 'move & flush automatic' every 4th pin");
   setVal = LOW;
   for(uint8_t pinNum{0}; pinNum <= srgx.getMaxPin(); pinNum++){
      if((pinNum+1) % 4 != 0)
         srgx.digitalWriteSrToAux(pinNum, setVal);
      else
         srgx.digitalWriteSr(pinNum, setVal);
      vTaskDelay(200);
   }
   srgx.moveAuxToMain();
   vTaskDelay(1000);

   Serial.println("digitalWriteSrMaskSet() method sets pins using the mask {0b10001000, 0b00100010, 0b00110011, 0b01110111}");
   srgx.digitalWriteSrMaskSet(mask_1);
   vTaskDelay(5000);

   Serial.println("digitalWriteSrMaskReset() method resets pins using the mask {0b01010101, 0b01010101, 0b01010101, 0b01010101}");
   srgx.digitalWriteSrMaskReset(mask_2);
   vTaskDelay(5000);

   Serial.println("digitalWriteSrAllReset() method clears all pins");
   srgx.digitalWriteSrAllReset();
   vTaskDelay(2000);

   Serial.println("stampOverMain() method overwrites the Main Buffer with the value {0b01010101, 0b01010101, 0b01010101, 0b01010101}");
   srgx.stampOverMain(mask_2);
   vTaskDelay(5000);

   Serial.println("digitalWriteSrAllReset() method clears all pins before restarting tests");
   Serial.println("-----------------------------------------------------------------------");
   srgx.digitalWriteSrAllReset();
   vTaskDelay(3000);
}  



//================================================>> General use functions BEGIN
//==================================================>> General use functions END

//=======================================>> User Functions Implementations BEGIN
 /**
  * @brief Error Handling function
  * 
  * Placeholder for a Error Handling function, in case of an error the execution
  * will be trapped in this endless loop
  */
 void Error_Handler(){
   for(;;)
   {    
   }
   
   return;
 }
//=========================================>> User Functions Implementations END
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
r20:1
r20:2
r21:1
r21:2
r22:1
r22:2
r23:1
r23:2
r24:1
r24:2
r25:1
r25:2
r26:1
r26:2
r27:1
r27:2
vcc3:VCC
74HC595
sr4:Q1
sr4:Q2
sr4:Q3
sr4:Q4
sr4:Q5
sr4:Q6
sr4:Q7
sr4:GND
sr4:Q7S
sr4:MR
sr4:SHCP
sr4:STCP
sr4:OE
sr4:DS
sr4:Q0
sr4:VCC
led2:A
led2:C
led4:A
led4:C
led5:A
led5:C
led7:A
led7:C
led8:A
led8:C
led9:A
led9:C
led10:A
led10:C
led11:A
led11:C
DS
STCP
SHCP
GND
r9:1
r9:2
r10:1
r10:2
r11:1
r11:2
r12:1
r12:2
r13:1
r13:2
r14:1
r14:2
r15:1
r15:2
r16:1
r16:2
vcc4:VCC
74HC595
sr3:Q1
sr3:Q2
sr3:Q3
sr3:Q4
sr3:Q5
sr3:Q6
sr3:Q7
sr3:GND
sr3:Q7S
sr3:MR
sr3:SHCP
sr3:STCP
sr3:OE
sr3:DS
sr3:Q0
sr3:VCC
led1:A
led1:C
led3:A
led3:C
led6:A
led6:C
led12:A
led12:C
led13:A
led13:C
led14:A
led14:C
led15:A
led15:C
led16:A
led16:C
DS
STCP
SHCP
GND
sw0:1
sw0:2
sw0:3
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
vcc1:VCC
74HC595
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
led17:A
led17:C
led18:A
led18:C
led19:A
led19:C
led20:A
led20:C
led21:A
led21:C
led22:A
led22:C
led23:A
led23:C
led24:A
led24:C
DS
STCP
SHCP
GND
sw1:1
sw1:2
sw1:3
r17:1
r17:2
r18:1
r18:2
r19:1
r19:2
r28:1
r28:2
r29:1
r29:2
r30:1
r30:2
r31:1
r31:2
r32:1
r32:2
vcc2:VCC
74HC595
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
led25:A
led25:C
led26:A
led26:C
led27:A
led27:C
led28:A
led28:C
led29:A
led29:C
led30:A
led30:C
led31:A
led31:C
led32:A
led32:C
DS
STCP
SHCP
GND
sw2:1
sw2:2
sw2:3
R00 - b00~07
R01 - b08~15
R02 - b16~23
R03 - b34~31
sw2
sw0
sw1