8.9 KiB
#ifndef PHAPP_H #define PHAPP_H
#include "config.h" #include "config-modbus.h" #include "features.h"
#include <enums.h> #include #include <xmath.h> #include <macros.h> #include <App.h> #include <Component.h> #include <Bridge.h> #include <SerialMessage.h> #include <ArduinoLog.h> #include <Logger.h> #include <ArduinoJson.h> #include <LittleFS.h> #include <xstatistics.h>
#include <modbus/ModbusTCP.h> #include <modbus/ModbusTypes.h> #include <profiles/SignalPlot.h> #include <profiles/WiFiNetworkSettings.h>
#include <components/OmronE5.h>
class POT; class Relay; class RS485; class Pos3Analog; class StatusLight; class RESTServer; class PIDController; class TemperatureProfile; class SignalPlot; class SAKO_VFD; class MB_GPIO; class AnalogLevelSwitch; class LEDFeedback; class Extruder; class Plunger; class Joystick; class PHApp; class AmperageBudgetManager;
class AsyncWebServerRequest;
class PHApp : public App { public: ////////////////////////////////////////////////////////////// // Enums ////////////////////////////////////////////////////////////// enum CONTROLLER_STATE { E_CS_OK = 0, E_CS_ERROR = 10 }; enum APP_STATE { RESET = 0, EXTRUDING = 1, STANDBY = 2, ERROR = 5, PID_TIMEOUT = 11, FEED_TIMEOUT = 12, CONTROL_PANEL_INVALID = 13, PID_ERROR = 20, FEED_ERROR = 40, };
//////////////////////////////////////////////////////////////
// Constructor / Destructor
//////////////////////////////////////////////////////////////
PHApp();
~PHApp() override;
//////////////////////////////////////////////////////////////
// Core Application Logic
//////////////////////////////////////////////////////////////
virtual short setup();
virtual short onRun();
short loop() override;
short load(short val0 = 0, short val1 = 0);
virtual short serial_register(Bridge *bridge);
virtual Component *byId(ushort id);
// App States & Error Handling
short _state;
short _cstate;
short _error;
short setAppState(short newState);
short getAppState(short val);
short getLastError() { return _error; }
short setLastError(short val = 0) { _error = val; return _error; }
short onError(short id, short code);
short clearError();
short reset(short arg1, short arg2); // Related to resetting state?
//////////////////////////////////////////////////////////////
// Components
//////////////////////////////////////////////////////////////
SerialMessage *com_serial;
POT *pot_0;
POT *pot_1;
POT *pot_2;
StatusLight *statusLight_0;
StatusLight *statusLight_1;
Relay *relay_0;
Relay *relay_1;
Relay *relay_2;
Relay *relay_3;
Relay *relay_4;
Relay *relay_5;
Relay *relay_6;
Relay *relay_7;
Pos3Analog *pos3Analog_0;
Pos3Analog *pos3Analog_1;
PIDController *pidController_0;
SAKO_VFD *vfd_0;
Extruder *extruder_0;
Plunger *plunger_0;
MB_GPIO *gpio_0;
AnalogLevelSwitch *analogLevelSwitch_0;
LEDFeedback *ledFeedback_0;
Joystick *joystick_0;
AmperageBudgetManager *pidManagerAmperage;
// Component Callbacks/Control
short onStop(short code = 0);
short onWarning(short code);
//////////////////////////////////////////////////////////////
// Logging
//////////////////////////////////////////////////////////////
std::vector<String> logBuffer;
size_t currentLogIndex = 0;
CircularLogPrinter *logPrinter = nullptr;
std::vector<String> getLogSnapshot()
{
std::vector<String> snapshot;
snapshot.reserve(logBuffer.size());
if (logBuffer.size() < LOG_BUFFER_LINES)
{
for (size_t i = 0; i < logBuffer.size(); ++i)
{
snapshot.push_back(logBuffer[i]);
}
}
else
{
// Buffer is full and circular
size_t startIndex = (currentLogIndex + 1) % LOG_BUFFER_LINES; // <-- Note: LOG_BUFFER_LINES is now defined in Logger.h
for (size_t i = 0; i < LOG_BUFFER_LINES; ++i)
{
snapshot.push_back(logBuffer[(startIndex + i) % LOG_BUFFER_LINES]);
}
}
return snapshot;
}
//////////////////////////////////////////////////////////////
// Network Management
//////////////////////////////////////////////////////////////
short setupNetwork();
short loadNetworkSettings();
short saveNetworkSettings(JsonObject& doc);
WiFiNetworkSettings wifiSettings;
//////////////////////////////////////////////////////////////
// Modbus TCP
//////////////////////////////////////////////////////////////
ModbusTCP *modbusManager;
short loopModbus();
#ifdef ENABLE_MODBUS_TCP short setupModbus();
short mb_tcp_write(short address, short value) override;
short mb_tcp_write(MB_Registers *reg, short networkValue) override;
short mb_tcp_read(short address) override;
void mb_tcp_register(ModbusTCP *manager) const override;
ModbusBlockView *mb_tcp_blocks() const override;
int client_count;
int client_max;
int client_total;
millis_t client_track_ts;
short updateClientCount(short val0, short val1);
short resetClientStats(short val0, short val1);
short getClientStats(short val0, short val1);
// Modbus PID Specific (Conditional)
short getConnectedClients() const; // Returns number of currently connected Modbus TCP clients
#ifdef ENABLE_PID short getPid2Register(short offset, short unused); short setPid2Register(short offset, short value); #endif // ENABLE_PID #endif // ENABLE_MODBUS_TCP RESTServer *webServer; short loopWeb();
#ifdef ENABLE_RS485
friend class RS485Devices;
#endif // ENABLE_RS485
//////////////////////////////////////////////////////////////
// Component Overrides / Message Handling
/////////////////////////////////////////////////////////////
/**
* @brief Handles incoming messages, including RTU updates via void*.
*/
short onMessage(int id, E_CALLS verb, E_MessageFlags flags, void* user, Component *src) override;
//////////////////////////////////////////////////////////////
// Debugging & Utility Methods
//////////////////////////////////////////////////////////////
void printRegisters();
short list(short val0, short val1);
short print(short arg1, short arg2);
//////////////////////////////////////////////////////////////
// Profiling & Feature Specific (Conditional)
//////////////////////////////////////////////////////////////
#ifdef ENABLE_PROFILER static uint32_t initialFreeHeap; static uint64_t initialCpuTicks; #endif // ENABLE_PROFILER
#ifdef ENABLE_PROFILE_TEMPERATURE
TemperatureProfile* tempProfiles[PROFILE_TEMPERATURE_COUNT]; // Array to hold multiple temperature profiles
void getProfilesHandler(AsyncWebServerRequest *request);
void setProfilesHandler(AsyncWebServerRequest *request, JsonVariant &json, int slot); // Adjusted for body handling
bool saveProfilesToJson();
#endif // ENABLE_PROCESS_PROFILE
#ifdef ENABLE_PROFILE_SIGNAL_PLOT SignalPlot* signalPlots[PROFILE_SIGNAL_PLOT_COUNT]; // Array to hold multiple signal plot profiles void getSignalPlotsHandler(AsyncWebServerRequest *request); void setSignalPlotsHandler(AsyncWebServerRequest *request, JsonVariant &json, int slot); bool saveSignalPlotsToJson(); // Methods to control SignalPlot from TemperatureProfile void startSignalPlot(short slotId); void stopSignalPlot(short slotId); void enableSignalPlot(short slotId, bool enable); void pauseSignalPlot(short slotId); void resumeSignalPlot(short slotId); #endif // ENABLE_PROFILE_SIGNAL_PLOT
//////////////////////////////////////////////////////////////
// Web Server
//////////////////////////////////////////////////////////////
/**
* @brief Register routes with the RESTServer. This will be called upon built-in RESTServer initialization.
*
* @param server The RESTServer instance to register routes with.
* @return short The result of the operation.
*/
short registerRoutes(RESTServer *instance);
// Network settings handlers
#ifdef ENABLE_WEBSERVER_WIFI_SETTINGS void handleGetNetworkSettings(AsyncWebServerRequest *request); void handleSetNetworkSettings(AsyncWebServerRequest *request, JsonVariant &json); #endif void getSystemLogsHandler(AsyncWebServerRequest *request); void getBridgeMethodsHandler(AsyncWebServerRequest *request);
private: ////////////////////////////////////////////////////////////// // Private Methods ////////////////////////////////////////////////////////////// void handleSerialCommand(const String &command); // Moved here as it's private impl detail void cleanupComponents(); // Moved here as it's private impl detail };
#endif