blob: 01f30e70f552ec5c5a2c5e85c1705a520b9986c0 [file] [log] [blame]
/*
*
* Copyright (c) 2024 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "LEDWidget.h"
#include "AppConfig.h"
#include "AppTask.h"
#include "DishwasherManager.h"
#include "operational-state-delegate-impl.h"
#ifdef SL_CATALOG_SIMPLE_LED_LED1_PRESENT
#define DW_STATE_LED 1
#else
#define DW_STATE_LED 0
#endif
namespace {
LEDWidget sDishwasherLED;
}
using namespace chip;
using namespace chip::app;
using namespace chip::app::Clusters;
using namespace chip::app::Clusters::OperationalState;
using namespace chip::app::Clusters::DeviceEnergyManagement;
using namespace chip::DeviceLayer;
CHIP_ERROR DishwasherManager::Init()
{
sDishwasherLED.Init(DW_STATE_LED);
AppTask::GetAppTask().LinkAppLed(&sDishwasherLED);
chip::app::Clusters::DeviceEnergyManagement::DeviceEnergyManagementDelegate * dem = GetDEMDelegate();
VerifyOrReturnLogError(dem != nullptr, CHIP_ERROR_UNINITIALIZED);
/* For Device Energy Management we need the ESA to be Online and ready to accept commands */
dem->SetESAState(ESAStateEnum::kOnline);
dem->SetESAType(ESATypeEnum::kDishwasher);
// Set the abs min and max power
dem->SetAbsMinPower(1200000); // 1.2KW
dem->SetAbsMaxPower(7600000); // 7.6KW
return CHIP_NO_ERROR;
}
OperationalStateEnum DishwasherManager::GetOperationalState()
{
return mState;
}
void DishwasherManager::UpdateDishwasherLed()
{
OperationalStateEnum opState = GetOperationalState();
sDishwasherLED.Set(false);
switch (opState)
{
case OperationalStateEnum::kRunning:
sDishwasherLED.Set(true);
break;
case OperationalStateEnum::kPaused:
sDishwasherLED.Blink(300, 700);
break;
case OperationalStateEnum::kError:
sDishwasherLED.Blink(100);
break;
default:
break;
}
}
void DishwasherManager::SetCallbacks(Callback_fn_initiated aActionInitiated_CB, Callback_fn_completed aActionCompleted_CB)
{
mActionInitiated_CB = aActionInitiated_CB;
mActionCompleted_CB = aActionCompleted_CB;
}
void DishwasherManager::CycleOperationalState()
{
if (mActionInitiated_CB)
{
OperationalStateEnum action;
switch (mState)
{
case OperationalStateEnum::kRunning:
action = OperationalStateEnum::kPaused;
break;
case OperationalStateEnum::kPaused:
action = OperationalStateEnum::kStopped;
break;
case OperationalStateEnum::kStopped:
action = OperationalStateEnum::kRunning;
break;
case OperationalStateEnum::kError:
action = OperationalStateEnum::kStopped;
break;
default:
break;
}
mActionInitiated_CB(action);
}
}
void DishwasherManager::UpdateOperationState(OperationalStateEnum state)
{
mState = state;
UpdateDishwasherLed();
if (mActionCompleted_CB)
{
mActionCompleted_CB();
}
}
int64_t DishwasherManager::GetApproxEnergyDuringSession()
{
return kApproximateEnergyUsedByESA;
};
CHIP_ERROR DishwasherManager::HandleDeviceEnergyManagementPowerAdjustRequest(const int64_t powerMw, const uint32_t durationS,
AdjustmentCauseEnum cause)
{
// Currently not implemented by our dishwasher app
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
}
CHIP_ERROR DishwasherManager::HandleDeviceEnergyManagementPowerAdjustCompletion()
{
// Currently not implemented by our dishwasher app
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
}
CHIP_ERROR DishwasherManager::HandleDeviceEnergyManagementCancelPowerAdjustRequest(CauseEnum cause)
{
// Currently not implemented by our dishwasher app
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
}
// kNoOptOut = 0x00,
// kLocalOptOut = 0x01,
// kGridOptOut = 0x02,
// kOptOut = 0x03,
CHIP_ERROR DishwasherManager::HandleDeviceEnergyManagementStartTimeAdjustRequest(const uint32_t requestedStartTimeUtc,
AdjustmentCauseEnum cause)
{
AppEvent event;
event.Type = AppEvent::kEventType_Timer;
event.Handler = nullptr;
AppTask::GetAppTask().PostEvent(&event);
return CHIP_NO_ERROR;
}
CHIP_ERROR DishwasherManager::HandleDeviceEnergyManagementPauseRequest(const uint32_t durationS, AdjustmentCauseEnum cause)
{
mActionInitiated_CB(OperationalStateEnum::kPaused);
return CHIP_NO_ERROR;
}
CHIP_ERROR DishwasherManager::HandleDeviceEnergyManagementPauseCompletion()
{
mActionInitiated_CB(OperationalStateEnum::kRunning);
return CHIP_NO_ERROR;
}
CHIP_ERROR DishwasherManager::HandleDeviceEnergyManagementCancelPauseRequest(CauseEnum cause)
{
mActionInitiated_CB(OperationalStateEnum::kRunning);
return CHIP_NO_ERROR;
}
CHIP_ERROR DishwasherManager::HandleDeviceEnergyManagementCancelRequest()
{
mActionInitiated_CB(OperationalStateEnum::kStopped);
return CHIP_NO_ERROR;
}
CHIP_ERROR DishwasherManager::HandleModifyForecastRequest(
const uint32_t forecastId, const DataModel::DecodableList<Structs::SlotAdjustmentStruct::DecodableType> & slotAdjustments,
AdjustmentCauseEnum cause)
{
// Currently not implemented by our dishwasher app
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
}
CHIP_ERROR DishwasherManager::RequestConstraintBasedForecast(
const DataModel::DecodableList<DeviceEnergyManagement::Structs::ConstraintsStruct::DecodableType> & constraints,
AdjustmentCauseEnum cause)
{
// Currently not implemented by our dishwasher app
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
}