Files
dali_cpp/include/base.hpp
2026-03-26 12:04:08 +08:00

167 lines
4.7 KiB
C++

#pragma once
#include "dali_comm.hpp"
#include <cmath>
#include <cstdint>
#include <chrono>
#include <map>
#include <optional>
#include <utility>
#include <vector>
struct DaliStatus {
bool controlGearPresent = false;
bool lampFailure = false;
bool lampPowerOn = false;
bool limitError = false;
bool fadingCompleted = false;
bool resetState = false;
bool missingShortAddress = false;
bool psFault = false;
static DaliStatus fromByte(uint8_t status);
};
class DaliBase {
public:
explicit DaliBase(DaliComm& comm);
// Runtime state mirrored from Dart DaliBase.
const int broadcast = 127;
bool isAllocAddr = false;
int lastAllocAddr = 0;
int selectedAddress = 127;
int64_t mcuTicks() const;
// Scene helpers
bool toScene(int a, int s);
bool reset(int a, int t = 2);
// Brightness helpers
int brightnessToLog(int brightness) const;
int logToBrightness(int logValue) const;
bool setBright(int a, int b);
bool setBrightPercentage(int a, double b);
bool stopFade(int a);
bool off(int a);
bool on(int a);
bool recallMaxLevel(int a);
bool recallMinLevel(int a);
int groupToAddr(int gp) const;
// Core sending wrappers
bool send(int a, uint8_t cmd);
bool sendCmd(uint8_t addr, uint8_t cmd);
bool sendExtCmd(int cmd, int value);
// DTR helpers
bool setDTR(int value);
bool setDTR1(int value);
bool setDTR2(int value);
std::optional<int> getDTR(int a);
std::optional<int> getDTR1(int a);
std::optional<int> getDTR2(int a);
bool copyCurrentBrightToDTR(int a);
// Colour value helpers (DT8 plumbing)
bool queryColourValue(int a);
bool storeDTRAsAddr(int a);
bool storeDTRAsSceneBright(int a, int s);
bool storeScene(int a, int s);
bool removeScene(int a, int s);
bool addToGroup(int a, int g);
bool removeFromGroup(int a, int g);
bool storeDTRAsFadeTime(int a);
bool storeDTRAsFadeRate(int a);
bool storeDTRAsPoweredBright(int a);
bool storeDTRAsSystemFailureLevel(int a);
bool storeDTRAsMinLevel(int a);
bool storeDTRAsMaxLevel(int a);
bool storeColourTempLimits(int a);
std::optional<bool> getOnlineStatus(int a);
std::optional<int> getBright(int a);
std::optional<int> getDeviceType(int a);
std::optional<int> getPhysicalMinLevel(int a);
std::optional<int> getDeviceVersion(int a);
bool dtSelect(int value);
bool activate(int a);
bool setDTRAsColourX(int a);
bool setDTRAsColourY(int a);
bool setDTRAsColourRGB(int a);
bool setDTRAsColourTemp(int a);
bool copyReportColourToTemp(int a);
bool setGradualChangeSpeed(int a, int value);
bool setGradualChangeRate(int a, int value);
std::optional<std::pair<int, int>> getGradualChange(int a);
std::optional<int> getGradualChangeRate(int a);
std::optional<int> getGradualChangeSpeed(int a);
bool setPowerOnLevel(int a, int value);
std::optional<int> getPowerOnLevel(int a);
bool setSystemFailureLevel(int a, int value);
std::optional<int> getSystemFailureLevel(int a);
bool setMinLevel(int a, int value);
std::optional<int> getMinLevel(int a);
bool setMaxLevel(int a, int value);
std::optional<int> getMaxLevel(int a);
bool setFadeTime(int a, int value);
std::optional<int> getFadeTime(int a);
bool setFadeRate(int a, int value);
std::optional<int> getFadeRate(int a);
std::optional<int> getNextDeviceType(int a);
std::optional<int> getGroupH(int a);
std::optional<int> getGroupL(int a);
std::optional<int> getGroup(int a);
bool setGroup(int a, int value);
std::optional<int> getScene(int a, int b);
bool setScene(int a, int b);
std::map<int, int> getScenes(int a);
std::optional<int> getStatus(int a);
std::optional<bool> getControlGearPresent(int a);
std::optional<bool> getLampFailureStatus(int a);
std::optional<bool> getLampPowerOnStatus(int a);
std::optional<bool> getLimitError(int a);
std::optional<bool> getResetStatus(int a);
std::optional<bool> getMissingShortAddress(int a);
bool terminate();
bool randomise();
bool initialiseAll();
bool initialise();
bool withdraw();
bool cancel();
bool physicalSelection();
bool queryAddressH(int addr);
bool queryAddressM(int addr);
bool queryAddressL(int addr);
bool programShortAddr(int a);
std::optional<int> queryShortAddr();
std::optional<bool> verifyShortAddr(int a);
std::optional<bool> compareAddress();
std::optional<bool> compare(int h, int m, int l);
std::optional<int> getRandomAddrH(int addr);
std::optional<int> getRandomAddrM(int addr);
std::optional<int> getRandomAddrL(int addr);
// Exposed query helpers mirroring Dart API.
std::optional<int> query(int a, uint8_t cmd);
std::optional<int> queryCmd(uint8_t addr, uint8_t cmd);
private:
DaliComm& comm_;
static uint8_t encodeCmdAddr(int dec_addr);
static uint8_t encodeArcAddr(int dec_addr);
};