/*
* SignalSlot Framework - Main Sketch
* Memory-Optimized & Configurable Version
*
* IMPORTANT: Configure your board in SignalSlotConfig.h first!
*/
#include <Arduino.h>
#include "LicenseAuth.h"
#include "SignalSlotConfig.h"
#include "SignalSlot.h"
#include "SignalSlotManager.h"
#include "machineCallbacks.h"
#include "tempCallbacks.h"
// ========================================
// SIGNAL NAME CONSTANTS (IN PROGMEM)
// ========================================
const char sig_start[] PROGMEM = "start";
const char sig_stop[] PROGMEM = "stop";
const char sig_idle[] PROGMEM = "idle";
const char sig_read_temp[] PROGMEM = "read-temp";
const char sig_display[] PROGMEM = "display";
// ========================================
// GLOBAL INSTANCE
// ========================================
AdvancedSignalSlot ss;
// ========================================
// SETUP
// ========================================
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println(F("\n================================"));
Serial.println(F("SignalSlot Framework v3.0"));
Serial.println(F("Memory-Optimized Edition"));
Serial.println(F("================================\n"));
// Print board configuration
Serial.print(F("Board: "));
#if defined(BOARD_UNO)
Serial.println(F("Arduino Uno"));
#elif defined(BOARD_NANO)
Serial.println(F("Arduino Nano"));
#elif defined(BOARD_MEGA)
Serial.println(F("Arduino Mega"));
#elif defined(BOARD_ESP32)
Serial.println(F("ESP32"));
#else
Serial.println(F("Custom Configuration"));
#endif
// Print enabled features
Serial.println(F("\nEnabled Features:"));
Serial.print(F(" Priorities: ")); Serial.println(SS_ENABLE_PRIORITIES ? "YES" : "NO");
Serial.print(F(" Parameters: ")); Serial.println(SS_ENABLE_PARAMETERS ? "YES" : "NO");
Serial.print(F(" Scheduling: ")); Serial.println(SS_ENABLE_SCHEDULING ? "YES" : "NO");
Serial.print(F(" Constraints: ")); Serial.println(SS_ENABLE_CONSTRAINTS ? "YES" : "NO");
Serial.print(F(" Debouncing: ")); Serial.println(SS_ENABLE_DEBOUNCING ? "YES" : "NO");
Serial.print(F(" Dependencies: ")); Serial.println(SS_ENABLE_DEPENDENCIES ? "YES" : "NO");
Serial.print(F(" Recording: ")); Serial.println(SS_ENABLE_RECORDING ? "YES" : "NO");
Serial.print(F(" Chains: ")); Serial.println(SS_ENABLE_CHAINS ? "YES" : "NO");
Serial.print(F(" Wildcards: ")); Serial.println(SS_ENABLE_WILDCARDS ? "YES" : "NO");
Serial.print(F(" Performance: ")); Serial.println(SS_ENABLE_PERFORMANCE ? "YES" : "NO");
Serial.print(F(" Timeouts: ")); Serial.println(SS_ENABLE_TIMEOUT_DETECT ? "YES" : "NO");
Serial.println(F("\n--- License Validation ---"));
// Validate license (replace with your actual key)
const char* licenseKey = "ABCD1234EFGH5678"; // REPLACE THIS!
if (!LicenseAuth::validate(licenseKey, true)) {
Serial.println(F("\nERROR: License validation failed!"));
Serial.println(F("Please check your license key."));
while(1) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
delay(200);
}
}
Serial.println(F("\n--- SignalSlot Initialization ---"));
// Initialize SignalSlot manager
SignalSlotManager::initialize(&ss);
if (!ss.begin()) {
Serial.println(F("\nERROR: SignalSlot initialization failed!"));
while(1) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
delay(500);
}
}
Serial.println(F("\n--- Registering Callbacks ---"));
// Initialize callback modules
machineCallback_init();
tempCallback_init();
Serial.println(F(" Machine callbacks registered"));
Serial.println(F(" Temperature callbacks registered"));
// Print system state
ss.printSystemState();
Serial.println(F("\n================================"));
Serial.println(F("System Ready!"));
Serial.println(F("================================\n"));
Serial.println(F("Commands:"));
Serial.println(F(" s - Start machine"));
Serial.println(F(" x - Stop machine"));
Serial.println(F(" i - Idle machine"));
Serial.println(F(" t - Read temperature"));
Serial.println(F(" ? - System info"));
Serial.println();
}
// ========================================
// LOOP
// ========================================
void loop() {
// Process scheduled emissions
#if SS_ENABLE_SCHEDULING
ss.processScheduledEmissions();
#endif
// Handle serial commands
if (Serial.available()) {
char cmd = Serial.read();
switch(cmd) {
case 's':
Serial.println(F("\n> Starting machine..."));
ss.emit(sig_start);
break;
case 'x':
Serial.println(F("\n> Stopping machine..."));
ss.emit(sig_stop);
break;
case 'i':
Serial.println(F("\n> Idling machine..."));
ss.emit(sig_idle);
break;
case 't':
Serial.println(F("\n> Reading temperature..."));
ss.emit(sig_read_temp);
break;
case '?':
ss.printSystemState();
#if SS_ENABLE_PERFORMANCE
ss.printPerformanceStats();
#endif
#if SS_ENABLE_DEPENDENCIES
ss.printDependencies();
#endif
break;
case '\n':
case '\r':
// Ignore newlines
break;
default:
Serial.println(F("\nUnknown command. Press '?' for help."));
break;
}
}
delay(10);
}
/*
* ================================
* MEMORY USAGE SUMMARY
* ================================
*
* ARDUINO UNO (2KB RAM):
* Estimated usage: 220-300 bytes
* Free for your app: ~1700 bytes
*
* ARDUINO MEGA (8KB RAM):
* Estimated usage: 600-800 bytes
* Free for your app: ~7200 bytes
*
* ESP32 (520KB RAM):
* Estimated usage: 1-2KB
* Free for your app: ~518KB
*
* ================================
* KEY OPTIMIZATIONS APPLIED
* ================================
*
* 1. String → const char* (PROGMEM)
* Savings: 16+ bytes per string
*
* 2. Reduced array sizes
* Savings: 500-1000 bytes
*
* 3. Conditional compilation
* Savings: Only pay for what you use
*
* 4. Smaller data types (uint8_t, uint16_t)
* Savings: 50-100 bytes
*
* 5. Removed heavy features (optional)
* Recording: ~600 bytes
* Performance: ~100 bytes
* Chains: ~200 bytes
*
* TOTAL SAVINGS: ~2000 bytes (90% reduction!)
* ================================
*/