machines/firmware/legacy/asterix_max/app.cpp

266 lines
5.5 KiB
C++

#include <Vector.h>
#include <Streaming.h>
#include <Arduino.h>
#include "app.h"
#include "features.h"
#include <MemoryFree.h>
#include "Version.h"
static Addon *addonsArray[6];
short App::ok()
{
return E_OK;
}
App::App() : Addon("APP", APP, 1 << STATE),
shredButton(ProximitySensor(SHRED_START_PIN)),
statusLightOk(StatusLight(CONTROLLINO_D2)),
statusLightError(StatusLight(CONTROLLINO_D3)),
#ifdef HAS_DIRECTION_SWITCH
dirSwitch(new DirectionSwitch()),
#endif
#ifdef HAS_VFD
vfd(new VFD()),
#endif
#ifdef MOTOR_LOAD_PIN
mLoad(new MotorLoad(MOTOR_LOAD_PIN)),
#endif
#ifdef HAS_PLUNGER
plunger(new Plunger(
PLUNGER_LIMIT_UP_1,
PLUNGER_LIMIT_DOWN_1,
PLUNGER_MOTOR_1_DIR_PIN,
PLUNGER_MOTOR_1_STEP_PIN,
PLUNGER_MOTOR_2_STEP_PIN,
-1,
-1,
PLUNGER_PLUNGE_TIMEOUT,
PLUNGER_HOME_TIMEOUT,
this, (AddonFnPtr)&App::plungerCB)),
#endif
#ifdef HAS_OP_MODE_SWITCH
opModeSwitch(new OperationModeSwitch(OP_MODE_1_PIN)),
#endif
shredStateLast(0),
shredCancelState(0)
{
}
#ifdef HAS_STATES
String App::state()
{
const int capacity = JSON_OBJECT_SIZE(6);
StaticJsonDocument<capacity> doc;
doc["0"] = id;
doc["1"] = _state;
doc["2"] = shredState;
doc["3"] = overloaded;
doc["5"] = opModeSwitch->value();
return doc.as<String>();
}
#endif
short App::getAppState(short val)
{
return _state;
}
void (*resetFunction)(void) = 0; // Self reset (to be used with watchdog)
short App::setAppState(short newState)
{
switch (newState)
{
case App::APP_STATE::RESET:
{
_state = App::APP_STATE::STANDBY;
shredStateLast = 0;
shredCancelState = 0;
shredState = DONE;
plunger->reset();
vfd->stop();
resetFunction();
return;
}
case App::APP_STATE::STANDBY:
{
switch (_state)
{
case App::APP_STATE::SHREDDING:
{
shredCancelState = App::SHRED_STATE::INIT;
shredState = App::SHRED_STATE::CANCELLING;
plunger->reset();
break;
}
}
}
}
_state = newState;
}
void printMem()
{
Serial.print("mem: ");
Serial.print(freeMemory());
Serial.println('--');
}
short App::setup()
{
Serial.begin(DEBUG_BAUD_RATE);
Serial.println("Booting Firmware ...................... ");
#ifdef PRINT_VERSION
Serial.print(FIRMWARE_VERSION);
Serial.print(" | VERSION: ");
Serial.print(VERSION);
Serial.print("\n SUPPORT :");
Serial.print(SUPPORT);
Serial.print("\n | BUILD: ");
Serial.print(BUILD);
Serial.print("\n | FIRMWARE SOURCE: ");
Serial.print(FW_SRC);
Serial.print("\n CID:");
Serial.print(CID);
Serial.println(" - \n");
#endif
addons.setStorage(addonsArray);
setup_addons();
#ifdef MEARSURE_PERFORMANCE
printPerfTS = 0;
addonLoopTime = 0;
bridgeLoopTime = 0;
#endif
debugTS = 0;
loopTS = 0;
shredState = 0;
overloaded = 0;
_state = 0;
jamCounter = 0;
bootTime = millis();
shredButton.setup();
lastOpMode = opModeSwitch->loop();
statusLightOk.on();
statusLightError.on();
/*
timer.every(5000, [](App *app) -> void {
printMem();
},this);
*/
}
void App::_loop_motor_manual()
{
uchar sw = this->dirSwitch->loop();
if (sw == 0)
{
this->vfd->stop();
this->shredState = INIT;
this->_state = RESET;
this->statusLightError.status_blink(false);
return;
}
if (sw == 2)
{
if (this->isAutoReversing())
{
this->loop_auto_reverse();
return;
}
statusLightError.status_blink(true);
if (this->mLoad->jammed())
{
if (!this->isAutoReversing())
{
this->setShredState(JAMMED);
this->loop_auto_reverse();
}
return E_OK;
}
else
{
this->vfd->fwd(true);
}
}
else if (sw == 1)
{
this->vfd->rev(true);
this->statusLightError.status_blink(true);
}
}
short App::loop()
{
loop_addons();
timer.tick();
now = millis();
statusLightError.loop();
statusLightOk.loop();
opModeSwitch->loop();
//Serial.println(analogRead(CONTROLLINO_A2));
if (now - bootTime < BOOT_DELAY)
{
return;
}
#ifdef HAS_OP_MODE_SWITCH
short op = opModeSwitch->value();
if (lastOpMode != op)
{
if (lastOpMode == OP_NORMAL)
{
plunger->stop();
plunger->reset();
_state = App::APP_STATE::RESET;
shredStateLast = 0;
shredCancelState = 0;
shredState = 0;
vfd->stop();
plunger->home();
}
else if (lastOpMode == OP_MANUAL)
{
plunger->stop();
plunger->reset();
vfd->stop();
_state = App::APP_STATE::RESET;
shredStateLast = 0;
shredCancelState = 0;
shredState = 0;
}
lastOpMode = op;
return;
}
switch (op)
{
case OP_NORMAL:
{
loopShred();
debug();
break;
}
case OP_MANUAL:
{
_loop_motor_manual();
plunger->stop();
plunger->reset();
debug();
break;
}
}
#endif
}