PhotoStepper/PhotoStepper/Scenerunner.cpp

132 lines
2.9 KiB
C++

#include "Arduino.h"
#include <LiquidCrystal.h>
#include <BasicStepperDriver.h>
#include "Scenerunner.h"
Scenerunner::Scenerunner(LiquidCrystal *lcd, BasicStepperDriver *stepper, int pin_focus, int pin_shutter, int pin_backlight) {
_lcd = lcd;
_stepper = stepper;
_pin_focus = pin_focus;
_pin_shutter = pin_shutter;
_pin_backlight = pin_backlight;
}
void Scenerunner::start() {
step = 1;
_lcd->clear();
_lcd->print("Step ");
_lcd->print(step);
runStep = RUN_SETTLE;
runStepStart = millis();
}
void Scenerunner::_runHandler_off() {
_lcd->setCursor(0, 1);
_lcd->print("rS: OFF ");
}
void Scenerunner::_runHandler_settle() {
_lcd->setCursor(0, 1);
_lcd->print("Settling ");
_lcd->print(tSettle);
_lcd->print("ms");
if (millis() >= runStepStart + tSettle) {
_lcd->clear();
_lcd->print("Step ");
_lcd->print(step);
runStep = RUN_FOCUS;
runStepStart = millis();
digitalWrite(_pin_focus, HIGH);
}
}
void Scenerunner::_runHandler_focus() {
_lcd->setCursor(0, 1);
_lcd->print("Focusing ");
_lcd->print(tFocus);
_lcd->print("ms");
if (millis() >= runStepStart + tFocus) {
_lcd->clear();
_lcd->print("Step ");
_lcd->print(step);
runStep = RUN_SHUTTER;
runStepStart = millis();
if (bDarkenLcd) {
digitalWrite(_pin_backlight, LOW);
}
digitalWrite(_pin_shutter, HIGH);
}
}
void Scenerunner::_runHandler_shutter() {
_lcd->setCursor(0, 1);
_lcd->print("Shutter ");
_lcd->print(tShutter);
_lcd->print("ms");
if (millis() >= runStepStart + tShutter) {
digitalWrite(_pin_focus, LOW);
digitalWrite(_pin_shutter, LOW);
digitalWrite(_pin_backlight, HIGH);
if (step >= nSteps) {
_lcd->clear();
_lcd->print("Return to start");
runStep = RUN_RETURN;
runStepStart = millis();
_stepper->startMove(- 200/8 * distance * (nSteps - 1));
} else {
step++;
_lcd->clear();
_lcd->print("Step ");
_lcd->print(step);
runStep = RUN_MOVE;
runStepStart = millis();
_stepper->startMove(200/8 * distance);
}
}
}
void Scenerunner::_runHandler_move() {
_lcd->setCursor(0, 1);
_lcd->print("Moving ");
_lcd->print(distance);
_lcd->print("mm");
if (_stepper->getStepsRemaining() == 0) {
_lcd->clear();
_lcd->print("Step ");
_lcd->print(step);
runStep = RUN_SETTLE;
runStepStart = millis();
}
}
void Scenerunner::_runHandler_return() {
_lcd->setCursor(0, 1);
_lcd->print("moving ");
_lcd->print(distance * (nSteps - 1));
_lcd->print("mm");
}
void Scenerunner::nextAction() {
switch (runStep) {
case RUN_OFF:
_runHandler_off();
break;
case RUN_SETTLE:
_runHandler_settle();
break;
case RUN_FOCUS:
_runHandler_focus();
break;
case RUN_SHUTTER:
_runHandler_shutter();
break;
case RUN_MOVE:
_runHandler_move();
break;
case RUN_RETURN:
_runHandler_return();
break;
}
}