/*
 *    Copyright (c) 2013-2014 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 is an umbrella header for the Amber-specific
 *	Nest Labs Heat-Link profile.
 */

#ifndef WEAVE_PROFILES_HEAT_LINK_H
#define WEAVE_PROFILES_HEAT_LINK_H

#include "HeatLinkConstants.h"
#include "HeatLinkTags.h"

namespace nl {
namespace Weave {
namespace Profiles {
namespace Vendor {
namespace Nestlabs {
namespace HeatLink {

/*
 * NOTE THAT THIS CODE WILL GO AWAY WHEN WE UPDATE THE AMBER
 * BOX TO THE NEW WDM IMPLEMENTATION.
 */

    class HeatLinkSlave
    {
    public:

        WEAVE_ERROR InformHeatStateChange(bool aHeatState);

        void HandleHeat(bool turnOn, uint32_t aTimeout = 0);

    };

}; // HeatLink
}; // Nestlabs
}; // Vendor
}; // Profiles
}; // Weave
}; // nl

#endif // WEAVE_PROFILES_HEAT_LINK_H
