diff --git a/include/arke.h b/include/arke.h index 087357a..8bf7d38 100644 --- a/include/arke.h +++ b/include/arke.h @@ -1,154 +1,155 @@ #pragma once #include "inttypes.h" #ifdef __cplusplus extern "C"{ #endif //__cplusplus typedef enum ArkeMessageType_e { ARKE_NETWORK_CONTROL_COMMAND = 0x00, ARKE_HIGH_PRIORITY_MESSAGE = 0x01, ARKE_MESSAGE = 0x02, ARKE_HEARTBEAT = 0x03, ARKE_MESSAGE_TYPE_MASK = 0x03 << 9 } ArkeMessageType; typedef enum ArkeNodeClass_e { ARKE_BROADCAST = 0x0, ARKE_ZEUS = 0x38, ARKE_HELIOS = 0x34, ARKE_CELAENO = 0x30, ARKE_NODE_CLASS_MASK = 0x3f << 3 } ArkeNodeClass; typedef enum ArkeNetworkCommand_e { ARKE_RESET_REQUEST = 0x00, ARKE_SYNCHRONISATION = 0x01, ARKE_HEARTBEAT_REQUEST = 0x07, ARKE_SUBID_MASK = 0x07 } ArkeNetworkCommand; //#define ARKE_SUBID_MASK ARKE_HEARTBEAT_REQUEST typedef enum ArkeMessageClass_e { ARKE_ZEUS_SET_POINT = 0x38, ARKE_ZEUS_REPORT = 0x39, ARKE_ZEUS_VIBRATION_REPORT = 0x3a, ARKE_ZEUS_CONFIG = 0x3b, ARKE_ZEUS_STATUS = 0x3c, ARKE_ZEUS_CONTROL_POINT = 0x3d, ARKE_HELIOS_SET_POINT = 0x34, ARKE_HELIOS_PULSE_MODE = 0x35, ARKE_CELAENO_SET_POINT = 0x30, ARKE_CELAENO_STATUS = 0x31, ARKE_CELAENO_CONFIG = 0x32 } ArkeMessageClass; struct ArkeZeusSetPoint_t { uint16_t Humidity; uint16_t Temperature; uint8_t Wind; } __attribute__((packed)); typedef struct ArkeZeusSetPoint_t ArkeZeusSetPoint; struct ArkeZeusReport_t { uint16_t Humidity:14; uint16_t Temperature1:14; uint16_t Temperature2:12; uint16_t Temperature3:12; uint16_t Temperature4:12; } __attribute__((packed)); typedef struct ArkeZeusReport_t ArkeZeusReport; struct ArkePDConfig_t { uint8_t ProportionalMult; uint8_t DerivativeMult; uint8_t IntegralMult; - uint8_t DividerPower; + uint8_t DividerPower:4; + uint8_t DividerPowerInt:4; } __attribute__((packed)); typedef struct ArkePDConfig_t ArkePDConfig; struct ArkeZeusConfig_t { ArkePDConfig Humidity; ArkePDConfig Temperature; } __attribute__((packed)); typedef struct ArkeZeusConfig_t ArkeZeusConfig; #define ARKE_FAN_AGING_ALERT (0x4000) #define ARKE_FAN_STALL_ALERT (0x8000) #define ARKE_FAN_RPM_MASK (0x3fff) #define ArkeFanAging(status) (((status).fanStatus & ARKE_FAN_AGING_ALERT) != 0x0000) #define ArkeFanStall(status) (((status).fanStatus & ARKE_FAN_STALL_ALERT) != 0x0000) #define ArkeFanRPM(status) ( (status).fanStatus & ARKE_FAN_RPM_MASK ) typedef uint16_t ArkeFanStatus; struct ArkeZeusStatus_t { uint8_t Status; ArkeFanStatus Fan[2]; } __attribute__((packed)); typedef struct ArkeZeusStatus_t ArkeZeusStatus; #define ARKE_ZEUS_IDLE 0x00 #define ARKE_ZEUS_ACTIVE 0x01 #define ARKE_ZEUS_CLIMATE_UNCONTROLLED_WD 0x02 struct ArkeZeusControlPoint_t { int16_t Humidity; int16_t Temperature; } __attribute__((packed)); typedef struct ArkeZeusControlPoint_t ArkeZeusControlPoint; struct ArkeHeliosSetPoint_t { uint8_t Visible; uint8_t UV; } __attribute__((packed)); typedef struct ArkeHeliosSetPoint_t ArkeHeliosSetPoint; struct ArkeCelaenoSetPoint_t { uint8_t Power; } __attribute__((packed)); typedef struct ArkeCelaenoSetPoint_t ArkeCelaenoSetPoint; struct ArkeCelaenoStatus_t { uint8_t waterLevel; ArkeFanStatus fanStatus; } __attribute__((packed)); typedef struct ArkeCelaenoStatus_t ArkeCelaenoStatus; typedef enum ArkeCelaenoWaterLevel_e { ARKE_CELAENO_NOMINAL = 0, ARKE_CELAENO_WARNING = (1 << 0), ARKE_CELAENO_CRITICAL = (1 << 1), ARKE_CELAENO_RO_ERROR = (1 << 2) } ArkeCelaenoWaterLevel; #define ArkeCelaenoWaterNominal(status) ( (status).waterLevel == 0 ) #define ArkeCelaenoWaterWarning(status) ( (status).waterLevel == ARKE_CELAENO_WARNING ) #define ArkeCelaenoWaterCritical(status) ( ((status).waterLevel & ~(ARKE_CELAENO_CRITICAL | ARKE_CELAENO_RO_ERROR) ) == ARKE_CELAENO_WARNING ) #define ArkeCelaenoWaterHasRoError(status) (((status).waterLevel & ARKE_CELAENO_RO_ERROR) != 0x00) struct ArkeCelaenoConfig_t { uint16_t RampUpTimeMS; uint16_t RampDownTimeMS; uint16_t MinOnTimeMS; uint16_t DebounceTimeMS; } __attribute__((packed)); typedef struct ArkeCelaenoConfig_t ArkeCelaenoConfig; #ifdef __cplusplus } #endif //__cplusplus diff --git a/src-go/arke/pd_config.go b/src-go/arke/pd_config.go index e560b9b..1441e44 100644 --- a/src-go/arke/pd_config.go +++ b/src-go/arke/pd_config.go @@ -1,23 +1,34 @@ package arke +import "fmt" + type PDConfig struct { ProportionnalMultiplier uint8 DerivativeMultiplier uint8 IntegralMultiplier uint8 DividerPower uint8 + DividerPowerIntegral uint8 } func (c PDConfig) marshall(buffer []byte) error { + if c.DividerPower > 15 { + return fmt.Errorf("Maximal Proportional&Derivative Divider is 15") + } + if c.DividerPowerIntegral > 15 { + return fmt.Errorf("Maximal Integral Divider is 15") + } + buffer[0] = c.ProportionnalMultiplier buffer[1] = c.DerivativeMultiplier buffer[2] = c.IntegralMultiplier - buffer[3] = c.DividerPower + buffer[3] = ((c.DividerPowerIntegral & 0x0f) << 4) | c.DividerPower&0x0f return nil } func (c *PDConfig) unmarshall(buffer []byte) { c.ProportionnalMultiplier = buffer[0] c.DerivativeMultiplier = buffer[1] c.IntegralMultiplier = buffer[2] - c.DividerPower = buffer[3] + c.DividerPower = buffer[3] & 0x0f + c.DividerPowerIntegral = (buffer[3] & 0xf0) >> 4 }