//------------------------------------------- cascade -------------------------------------------------------+
void cascade() {
static bool reWind;
static uint32_t stepTime;
if (!routineSet) {
stepTime = random(3, 11);
!random(2) ? reWind = false : reWind = true;
runStart = millis();
runTime = random(1250, 2600);
Serial.println(F("Routine: CASCADE"));
Serial.print(F(" stepTime (ms) = "));
Serial.println(stepTime);
Serial.print(F(" reWind = "));
reWind ? Serial.println(F("true")) : Serial.println(F("false"));
Serial.println();
SPI.end(); // Release SPI pin control
SPI.endTransaction(); // <<<<<<<<<<<<< new line
pinMode(DATA, OUTPUT); // <<<<<<<<<<<<< new line
pinMode(CLOCK, OUTPUT); // <<<<<<<<<<<<< new line
routineSet = true;
}
if (millis() - runStart < runTime) {
for (int16_t location = LAST_OUT; location >= 0; location--) bitbang(location, stepTime);
if (reWind) for (int16_t location = 0; location <= LAST_OUT; location++) bitbang(location, stepTime);
}
else {
SPI.begin(); // Restore SPI
SPI.beginTransaction(SPISettings(24000000, MSBFIRST, SPI_MODE0)); // <<<<<<<<<<<<< new line
routineSet = false;
reStart = false; // Note: this routine blocks; reStart will not interrupt it
ChainGang::clearChain();
}
}
//------------------- bitbang -----------------------+
void bitbang(int16_t location, uint32_t stepTime) {
digitalWriteFast(LATCH, LOW);
digitalWrite(DATA, HIGH);
for (int n = 0; n < location; n++) {
digitalWrite(CLOCK, HIGH);
digitalWrite(DATA, LOW);
digitalWrite(CLOCK, LOW);
}
digitalWriteFast(LATCH, HIGH);
delay(stepTime);
}