/*
 *
 *    Copyright (c) 2015 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    This document is the property of Nest. It is considered
 *    confidential and proprietary information.
 *
 *    This document may not be reproduced or transmitted in any form,
 *    in whole or in part, without the express written permission of
 *    Nest.
 *
 */

/**
 *    @file
 *      This file defines constants used by the Nest Boiler Profile
 */

#ifndef WEAVE_PROFILES_NEST_BOILER_CONSTANTS
#define WEAVE_PROFILES_NEST_BOILER_CONSTANTS

namespace nl {

namespace Weave {

namespace Profiles {

namespace Vendor {

namespace Nestlabs {

namespace Boiler {

enum EquipmentInterface {
    UnknownEquipmentInterface = 0,
    Relay                     = 1,
    OpenTherm                 = 2,
};

enum ProductionSource {
    UnknownSource   = 0,
    Electricity     = 1,
    NaturalGas      = 2,
    Propane         = 3,
};


// Generic boiler tag space (0x0001 - 0xFFFF)
//
//                                    Tag        Tag               Element
//                                    Number     Category          Type        Constraints        Disposition  Readability  Writability  OT
//                                    -----------------------------------------------------------------------------------------------------

enum {
    kTag_EquipmentInterface         = 0x0001, // Profile-specific  UINT32      EquipmentInterface Mandatory    Any          -
    kTag_ProductionSource           = 0x0002, // Profile-specific  UINT32      ProductionSource   Mandatory    Any          -

    //Modulation settings
    kTag_ModulationCapable          = 0x0003, // Profile-specific  Bool        -                  Optional     Any          -            3.1
    kTag_MaxRelativeModulationLevel = 0x0004, // Profile-specific  UINT32      0 to 1000 0.1%     Optional     -            Any          14
    kTag_MinimumModulationLevel     = 0x0005, // Profile-specific  UINT32      0 to 1000 0.1%     Optional     Any          -            15.LB
    kTag_RelativeModulationLevel    = 0x0006, // Profile-specific  UINT32      0 to 1000 0.1%     Optional     Any          -            17

    //Other settings
    kTag_MaximumCapacity            = 0x0007, // Profile-specific  UINT32      0 to 1000 KW       Optional     Any          -            15.HB
    kTag_OutsideTempCompEnabled     = 0x0008, // Profile-specific  Bool        -                  Optional     -            Any          0.HB.3

    //Faults
    kTag_Fault                      = 0x0009, // Profile-specific  Bool        -                  Optional     Any          -            0.LB.0
    kTag_SourceOn                   = 0x000A, // Profile-specific  Bool        -                  Optional     Any          -            0.LB.3
    kTag_DiagOrServiceIndication    = 0x000B, // Profile-specific  Bool        -                  Optional     Any          -            0.LB.6

    //Is pump control allowed
    kTag_PumpControlAllowed         = 0x000C, // Profile-specific  Bool        -                  Optional     Any          -            3.4

    //Remote water filling function
    kTag_RemoteWaterFilling         = 0x000D, // Profile-specific  Bool        -                  Optional     Any          Any          R=3.6, W=4.2
};


// Boiler OpenTherm (OT) specific tag space (0x10001 - 0x1FFFF)
//
//                                   Tag        Tag               Element
//                                   Number     Category          Type        Constraints          Disposition  Readability  Writability
//                                   -------------------------------------------------------------------------------------------------

enum {
    kTag_OT_ProtocolVersion         = 0x10001, // Profile-specific  UINT32     OT reg 125          Optional    Any          -
    kTag_OT_ProductType             = 0x10002, // Profile-specific  UINT32     OT reg 127.HB       Optional    Any          -
    kTag_OT_ProductVersion          = 0x10003, // Profile-specific  UINT32     OT reg 127.LB       Optional    Any          -
    kTag_OT_DiagnosticCode          = 0x10004, // Profile-specific  UINT32     OT reg 115          Optional    Any          -
    kTag_OT_OEMFaultCode            = 0x10005, // Profile-specific  UINT32     OT reg 5.LB         Optional    Any          -
    kTag_OT_ServiceRequestRequired  = 0x10006, // Profile-specific  Bool       OT bit 5.HB.0       Optional    Any          -
    kTag_OT_LockoutResetFault       = 0x10007, // Profile-specific  Bool       OT bit 5.HB.1       Optional    Any          -
    kTag_OT_LowWaterPressureFault   = 0x10008, // Profile-specific  Bool       OT bit 5.HB.2       Optional    Any          -
    kTag_OT_GasOrFlameOutFault      = 0x10009, // Profile-specific  Bool       OT bit 5.HB.3       Optional    Any          -
    kTag_OT_AirPressureFault        = 0x1000A, // Profile-specific  Bool       OT bit 5.HB.4       Optional    Any          -
    kTag_OT_WaterOverTempFault      = 0x1000B, // Profile-specific  Bool       OT bit 5.HB.5       Optional    Any          -
    kTag_OT_DirectAccess            = 0x1000C, // Profile-specific  UINT32     VAL[15:0],ID[23:16] Optional    Any          Any
};


// Boiler sensor tag space (0x20001 - 0x2FFFF)
//
//                                   Tag        Tag               Element
//                                   Number     Category          Type        Constraints        Disposition  Readability  Writability  OT
//                                   ------------------------------------------------------------------------------------------------------

enum {
    kTag_Sensor_SupplyWaterOutTemp  = 0x20001, // Profile-specific  UINT32    0 to 1000 0.1degC  Optional    Any          -             25
    kTag_Sensor_ReturnWaterInTemp   = 0x20002, // Profile-specific  UINT32    0 to 1000 0.1degC  Optional    Any          -             28
};


// Boiler fuel-based production source counters tag space (0x30001 - 0x3FFFF). Write 0 to clear
//
//                                             Tag        Tag               Element
//                                             Number     Category          Type        Constraints        Disposition  Readability  Writability  OT
//                                           --------------------------------------------------------------------------------------------------------

enum {
    kTag_Counter_NumTimesFlameTooLow         = 0x30001, // Profile-specific  UINT32     -                  Optional     Any          Any          114
    kTag_Counter_NumSuccessfulBurnerStarts   = 0x30002, // Profile-specific  UINT32     -                  Optional     Any          Any          116
    kTag_Counter_NumUnsuccessfulBurnerStarts = 0x30003, // Profile-specific  UINT32     -                  Optional     Any          Any          113
    kTag_Counter_NumBurnerOperationHours     = 0x30004, // Profile-specific  UINT32     -                  Optional     Any          Any          120
};


// Boiler electricity-based production source counters tag space (0x40001 - 0x4FFFF). Write 0 to clear
//
//                                           Tag        Tag               Element
//                                           Number     Category          Type        Constraints        Disposition  Readability  Writability  OT
//                                         --------------------------------------------------------------------------------------------------------

enum {
    kTag_Counter_NumTimesHeatingElementOn  = 0x40001, // Profile-specific  UINT32     -                  Optional     Any          Any          116
    kTag_Counter_NumHoursHeatingElementOn  = 0x40002, // Profile-specific  UINT32     -                  Optional     Any          Any          120
};


// Boiler status codes
enum {
    kStatus_BoilerFault                    = 0x0001,  // Boiler in fault condition
    kStatus_CannotSetMaxModulationLevel    = 0x0002,  // The maximum relative modulation level cannot be set
};


}; // namespace Boiler

}; // namespace Nestlabs

}; // namespace Vendor

}; // namespace Profiles

}; // namespace Weave

}; // namespace nl

#endif // WEAVE_PROFILES_NEST_BOILER_CONSTANTS
