Patrick Schurig 4ae1939f93 [3a] structs protocole + interfaces LoadAdapter/Scheduler (zéro comportement)
LoadAction (kind+funding+§6 fields), LoadDescriptor, SurplusContext (§5),
Plan/Slot, ILoadAdapter, IScheduler — noms de champs = OPTIMIZER_PROTOCOL.md.
energyplugin.pri inclut etm/etm.pri. Build Qt6 vert, aucun fichier upstream touché.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 22:02:18 +02:00

38 lines
1.4 KiB
C++

// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2025 - 2026, Patrick Schurig / ETM PowerSync
#pragma once
#include <QDateTime>
#include "../types/loadaction.h"
#include "../types/loaddescriptor.h"
#include "../types/surpluscontext.h"
// Vue runtime minimale qu'un adaptateur expose à l'arbitre.
struct LoadTelemetry {
double currentPowerW = 0;
bool available = true; // faux si l'appareil nymea est absent/erreur
QDateTime lastActionAt;
};
// Interface pure — les implémentations concrètes héritent de QObject + ILoadAdapter.
// Signaux (telemetryChanged, descriptorChanged) déclarés dans les classes concrètes.
class ILoadAdapter {
public:
virtual ~ILoadAdapter() = default;
// Déclaration statique : capacités, limites, priorité, needs.
virtual LoadDescriptor descriptor() const = 0;
// Télémétrie runtime (courant, disponibilité, dernière action).
virtual LoadTelemetry telemetry() const = 0;
// Construit l'entrée §5 loads[] pour SurplusContext.
// Inclut declared, telemetry type-spécifique, learned courant.
virtual LoadContext toLoadContext() const = 0;
// Applique l'action. Retourne ce qui a réellement été appliqué
// (après écrêtage matériel). L'arbitre a déjà écrêté selon les limites
// et le budget — c'est le second filet.
virtual LoadAction applyAction(const LoadAction &action) = 0;
};