firmware-base/docs/Component.md

4.7 KiB

title description keywords
Component Class Base class for all hardware and software components in the system
component
base class
modular architecture
ESP32

Component

Path: src/Component.h

Revision History: Initial documentation

The Component class serves as the foundational base class for all hardware and software components in the system. It provides a standardized interface for component initialization, runtime behavior, and communication with other system components. The class implements a modular architecture that allows components to be easily added, removed, or modified without affecting the rest of the system.

REQUIREMENTS

  • Arduino framework
  • ESP32 platform
  • WString.h for string handling
  • ArduinoLog.h for logging functionality
  • Vector.h for dynamic arrays

FEATURES

  • Component identification with unique IDs and names
  • Standardized initialization and setup processes
  • Runtime flags for controlling component behavior
  • Owner-child component relationship hierarchy
  • Integration with Modbus communication
  • Network capability flags

DEPENDENCIES

graph TD
    Component --> WString
    Component --> ArduinoLog
    Component --> Vector
    Component --> enums
    Component --> constants
    Component --> error_codes
    Component --> macros
    Component --> xtypes
    Component --> Bridge[Bridge class]
    Component --> ModbusTCP[ModbusTCP class]
    Component --> ModbusBlockView[ModbusBlockView class]
    Component --> MB_Registers[MB_Registers class]
    Component --> RS485[RS485 class]

BEHAVIOUR

The Component class follows a lifecycle pattern that includes initialization, setup, and runtime phases. Components can be dynamically enabled or disabled through runtime flags.

stateDiagram-v2
    [*] --> Constructed
    Constructed --> Setup: setup()
    Setup --> Running: flags & E_OF_SETUP
    Running --> LoopExecution: flags & D_OF_LOOP
    LoopExecution --> Running
    Running --> Disabled: disable()
    Disabled --> Running: enable()
    Running --> [*]: destroy()

TODOS

PERFORMANCE

  • Optimize component instantiation for memory-constrained environments
  • Consider implementing lazy initialization for components with heavy setup requirements
  • Review the component hierarchy for potential performance bottlenecks in deeply nested structures

SECURITY

  • Implement access control mechanisms for components with critical functionality
  • Add validation for component parameters passed through Modbus or other interfaces
  • Consider encryption for sensitive component data communication

COMPLIANCE

  • Ensure component implementation adheres to industrial communication standards
  • Verify compatibility with Modbus protocol specifications
  • Document compliance with relevant industrial control system standards

RECOMMENDATIONS

  • Use meaningful component names and IDs to facilitate debugging and maintenance
  • Consider implementing a component registry for easier system-wide management
  • Implement proper error handling in component constructors and methods
  • Use the owner-child relationship to implement clean component lifecycle management

EXAMPLE

This section illustrates how to create and configure a Component instance. Since the complete implementation in Component.cpp is not accessible, this example provides a general pattern for component creation based on the header file.

// Create a basic component with default settings
Component* basicComponent = new Component("BasicComponent", 100, Component::COMPONENT_DEFAULT);

// Add the component to the components vector
if (basicComponent) {
    components.push_back(basicComponent);
    Log.infoln(F("Basic component initialized. ID:%d"), 100);
} else {
    Log.errorln(F("Basic component initialization failed."));
}

// Example with an owner component
Component* parentComponent = new Component("ParentComponent", 200, Component::COMPONENT_DEFAULT);
Component* childComponent = new Component(
    "ChildComponent",    // name
    201,                  // id
    Component::COMPONENT_DEFAULT,  // flags
    parentComponent       // owner
);

if (childComponent) {
    components.push_back(childComponent);
    Log.infoln(F("Child component initialized. Name:%s, ID:%d"),
              "ChildComponent", 201);
} else {
    Log.errorln(F("Child component initialization failed."));
}

References

  • None available