osr-mono/packages/osr-code-bot/tests/shell-ext/app.cpp
2025-01-30 00:50:58 +01:00

259 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;
}
short App::getLastError(short val = 0)
{
return _error;
}
App::App() : Addon("APP", APP, 1 << STATE),
statusLightOk(StatusLight(STATUS_OK_PIN)),
statusLightError(StatusLight(STATUS_ERROR_PIN)),
#ifdef HAS_DIRECTION_SWITCH
dirSwitch(new DirectionSwitch()),
#endif
#ifdef HAS_VFD
vfd(new VFD(VFD_SPEED_INPUT, -1)),
#endif
#ifdef MOTOR_LOAD_PIN
mLoad(new MotorLoad(MOTOR_LOAD_PIN)),
#endif
#ifdef HAS_OP_MODE_SWITCH
opModeSwitch(new OperationModeSwitch(OP_MODE_1_PIN)),
#endif
plungeStateLast(0),
plungeState(PLUNGE_STATE::WAITING)
{
}
void (*resetFunction)(void) = 0; // Self reset (to be used with watchdog)
void printMem()
{
Serial.print("mem: ");
Serial.print(freeMemory());
Serial.println('--');
}
short App::setup()
{
Serial.begin(DEBUG_BAUD_RATE);
Serial.println("Booting Firmware");
printMem();
#ifdef PRINT_VERSION
Serial.print(FIRMWARE_VERSION);
Serial.print(" | VERSION: ");
Serial.print(VERSION);
Serial.print("\n SUPPORT :");
#endif
addons.setStorage(addonsArray);
setup_addons();
#ifdef MEARSURE_PERFORMANCE
printPerfTS = 0;
addonLoopTime = 0;
bridgeLoopTime = 0;
#endif
debugTS = 0;
loopTS = 0;
plungeState = PLUNGE_STATE::WAITING;
overloaded = 0;
_state = 0;
bootTime = millis();
// lastOpMode = opModeSwitch->loop();
// statusLightOk.on();
// statusLightError.on();
lastDirection = VFD::DIRECTION::STOP;
return;
/*
timer.every(5000, [](App *app) -> void {
printMem();
},this);
*/
}
ushort App::loopManual()
{
uchar sw = this->dirSwitch->loop();
if (sw != lastDirection)
{
lastDirection = sw;
}
// we are in homing mode, hand over control to loopHome
if (plungeState == PLUNGE_STATE::HOMING)
{
PLUNGE_DEBUG("Goto loop homing");
return loopHome();
}
if (mLoad->jammed())
{
this->vfd->stop();
setPlungeState(PLUNGE_STATE::JAMMED);
PLUNGE_DEBUG("jammed");
return E_MOTOR_DT_OVERLOAD;
}
// direction switch in same position and still jammed, abort
if (plungeState == PLUNGE_STATE::JAMMED &&
sw == lastDirection &&
sw != VFD::DIRECTION::STOP)
{
PLUNGE_DEBUG("still jammed");
return E_MOTOR_DT_OVERLOAD;
}
// clear state on stop
if (mLoad->idle() &&
plungeState == PLUNGE_STATE::JAMMED &&
sw == VFD::DIRECTION::STOP)
{
PLUNGE_DEBUG("clear");
setPlungeState(PLUNGE_STATE::WAITING);
return E_OK;
}
// if idle, and direction switch kept up, set into 'homing' state
if (plungeState == PLUNGE_STATE::WAITING &&
sw == VFD::DIRECTION::REVERSE &&
now- dirSwitch->lastChanged() > HOMING_WAIT_THRESHOLD)
{
PLUNGE_DEBUG("start homing");
setPlungeState(PLUNGE_STATE::HOMING);
this->vfd->rev(true);
return E_OK;
}
// if idle and all ok and start button on, set into plunge !
if (analogRead(PLUNGE_START_PIN) > PLUNGE_START_LEVEL &&
sw == VFD::DIRECTION::STOP &&
plungeState == PLUNGE_STATE::WAITING)
{
PLUNGE_DEBUG("start plunging");
setPlungeState(PLUNGE_STATE::PLUNGING);
this->vfd->fwd(true);
return E_OK;
}
// we are in plunge mode, hand over control to loopPlunge
if (plungeState == PLUNGE_STATE::PLUNGING)
{
PLUNGE_DEBUG("Goto loop plunge");
return loopPlunge();
}
// manual control cases
if (sw == VFD::DIRECTION::STOP)
{
this->vfd->stop();
setPlungeState(PLUNGE_STATE::WAITING);
return E_OK;
}
if (sw == VFD::DIRECTION::FORWARD)
{
this->vfd->fwd(true);
return E_OK;
}
else if (sw == VFD::DIRECTION::REVERSE)
{
if (mLoad->highLoad())
{
this->vfd->stop();
setPlungeState(PLUNGE_STATE::JAMMED);
return E_OK;
}
this->vfd->rev(true);
return E_OK;
}
return E_OK;
}
short App::loop()
{
loop_addons();
timer.tick();
now = millis();
// statusLightError.loop();
// statusLightOk.loop();
// opModeSwitch->loop();
loopManual();
delay(LOOP_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:
{
loopPlunge();
debug();
break;
}
case OP_MANUAL:
{
_loop_motor_manual();
plunger->stop();
plunger->reset();
debug();
break;
}
}
#endif
}