blob: ed9ba0774d7a13ee828d98b706c20b7ea3fc752e [file] [log] [blame]
/**
*
* Copyright (c) 2023 Project CHIP Authors
*
* 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 "ColorControlManager.h"
#include "DeviceApp-JNI.h"
#include <app-common/zap-generated/attributes/Accessors.h>
#include <app-common/zap-generated/ids/Clusters.h>
#include <app/util/attribute-storage.h>
#include <app/util/config.h>
#include <jni.h>
#include <lib/support/CHIPJNIError.h>
#include <lib/support/JniReferences.h>
#include <lib/support/JniTypeWrappers.h>
using namespace chip;
static constexpr size_t kColorControlManagerTableSize = MATTER_DM_COLOR_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT;
namespace {
ColorControlManager * gColorControlManagerTable[kColorControlManagerTableSize] = { nullptr };
static_assert(kColorControlManagerTableSize <= kEmberInvalidEndpointIndex, "gColorControlManagerTable table size error");
} // namespace
void emberAfColorControlClusterInitCallback(EndpointId endpoint)
{
ChipLogProgress(Zcl, "Device App::ColorControl::PostClusterInit");
DeviceAppJNIMgr().PostClusterInit(chip::app::Clusters::ColorControl::Id, endpoint);
}
void ColorControlManager::NewManager(jint endpoint, jobject manager)
{
ChipLogProgress(Zcl, "Device App: ColorControlManager::NewManager");
uint16_t ep = emberAfGetClusterServerEndpointIndex(static_cast<chip::EndpointId>(endpoint), app::Clusters::ColorControl::Id,
MATTER_DM_COLOR_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT);
VerifyOrReturn(ep < kColorControlManagerTableSize,
ChipLogError(Zcl, "Device App::ColorControl::NewManager: endpoint %d not found", endpoint));
VerifyOrReturn(gColorControlManagerTable[ep] == nullptr,
ChipLogError(Zcl, "ST Device App::ColorControl::NewManager: endpoint %d already has a manager", endpoint));
ColorControlManager * mgr = new ColorControlManager();
CHIP_ERROR err = mgr->InitializeWithObjects(manager);
if (err != CHIP_NO_ERROR)
{
ChipLogError(Zcl, "ST Device App::ColorControl::NewManager: failed to initialize manager for endpoint %d", endpoint);
delete mgr;
}
else
{
gColorControlManagerTable[ep] = mgr;
}
}
static ColorControlManager * GetColorControlManager(EndpointId endpoint)
{
uint16_t ep = emberAfGetClusterServerEndpointIndex(endpoint, app::Clusters::ColorControl::Id,
MATTER_DM_COLOR_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT);
return (ep >= kColorControlManagerTableSize ? nullptr : gColorControlManagerTable[ep]);
}
void ColorControlManager::PostCurrentHueChanged(chip::EndpointId endpoint, int value)
{
ChipLogProgress(Zcl, "Device App: ColorControlManager::PostCurrentHueChanged");
ColorControlManager * mgr = GetColorControlManager(endpoint);
VerifyOrReturn(mgr != nullptr, ChipLogError(Zcl, "ColorControlManager null"));
mgr->HandleCurrentHueChanged(value);
}
void ColorControlManager::PostCurrentSaturationChanged(chip::EndpointId endpoint, int value)
{
ChipLogProgress(Zcl, "Device App: ColorControlManager::PostCurrentSaturationChanged");
ColorControlManager * mgr = GetColorControlManager(endpoint);
VerifyOrReturn(mgr != nullptr, ChipLogError(Zcl, "ColorControlManager null"));
mgr->HandleCurrentSaturationChanged(value);
}
void ColorControlManager::PostColorTemperatureChanged(chip::EndpointId endpoint, int value)
{
ChipLogProgress(Zcl, "Device App: ColorControlManager::PostColorTemperatureChanged");
ColorControlManager * mgr = GetColorControlManager(endpoint);
VerifyOrReturn(mgr != nullptr, ChipLogError(Zcl, "ColorControlManager null"));
mgr->HandleColorTemperatureChanged(value);
}
void ColorControlManager::PostColorModeChanged(chip::EndpointId endpoint, int value)
{
ChipLogProgress(Zcl, "Device App: ColorControlManager::PostColorModeChanged");
ColorControlManager * mgr = GetColorControlManager(endpoint);
VerifyOrReturn(mgr != nullptr, ChipLogError(Zcl, "ColorControlManager null"));
mgr->HandleColorModeChanged(value);
}
void ColorControlManager::PostEnhancedColorModeChanged(chip::EndpointId endpoint, int value)
{
ChipLogProgress(Zcl, "Device App: ColorControlManager::PostEnhancedColorModeChanged");
ColorControlManager * mgr = GetColorControlManager(endpoint);
VerifyOrReturn(mgr != nullptr, ChipLogError(Zcl, "ColorControlManager null"));
mgr->HandleEnhancedColorModeChanged(value);
}
CHIP_ERROR ColorControlManager::InitializeWithObjects(jobject managerObject)
{
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
VerifyOrReturnLogError(env != nullptr, CHIP_ERROR_INCORRECT_STATE);
ReturnLogErrorOnFailure(mColorControlManagerObject.Init(managerObject));
jclass ColorControlManagerClass = env->GetObjectClass(managerObject);
VerifyOrReturnLogError(ColorControlManagerClass != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
mHandleCurrentHueChangedMethod = env->GetMethodID(ColorControlManagerClass, "HandleCurrentHueChanged", "(I)V");
if (mHandleCurrentHueChangedMethod == nullptr)
{
ChipLogError(Zcl, "Failed to access ColorControlManager 'HandleCurrentHueChanged' method");
env->ExceptionClear();
return CHIP_ERROR_INVALID_ARGUMENT;
}
mHandleCurrentSaturationChangedMethod = env->GetMethodID(ColorControlManagerClass, "HandleCurrentSaturationChanged", "(I)V");
if (mHandleCurrentSaturationChangedMethod == nullptr)
{
ChipLogError(Zcl, "Failed to access ColorControlManager 'HandleCurrentSaturationChanged' method");
env->ExceptionClear();
return CHIP_ERROR_INVALID_ARGUMENT;
}
mHandleColorTemperatureChangedMethod = env->GetMethodID(ColorControlManagerClass, "HandleColorTemperatureChanged", "(I)V");
if (mHandleColorTemperatureChangedMethod == nullptr)
{
ChipLogError(Zcl, "Failed to access ColorControlManager 'HandleColorTemperatureChanged' method");
env->ExceptionClear();
return CHIP_ERROR_INVALID_ARGUMENT;
}
mHandleColorModeChangedMethod = env->GetMethodID(ColorControlManagerClass, "HandleColorModeChanged", "(I)V");
if (mHandleColorModeChangedMethod == nullptr)
{
ChipLogError(Zcl, "Failed to access ColorControlManager 'HandleColorModeChanged' method");
env->ExceptionClear();
return CHIP_ERROR_INVALID_ARGUMENT;
}
mHandleEnhancedColorModeChangedMethod = env->GetMethodID(ColorControlManagerClass, "HandleEnhancedColorModeChanged", "(I)V");
if (mHandleEnhancedColorModeChangedMethod == nullptr)
{
ChipLogError(Zcl, "Failed to access ColorControlManager 'HandleEnhancedColorModeChanged' method");
env->ExceptionClear();
return CHIP_ERROR_INVALID_ARGUMENT;
}
return CHIP_NO_ERROR;
}
void ColorControlManager::HandleCurrentHueChanged(int value)
{
ChipLogProgress(Zcl, "ColorControlManager::HandleCurrentHueChanged");
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
VerifyOrReturn(env != NULL, ChipLogProgress(Zcl, "env null"));
VerifyOrReturn(mColorControlManagerObject.HasValidObjectRef(), ChipLogProgress(Zcl, "mColorControlManagerObject null"));
VerifyOrReturn(mHandleCurrentHueChangedMethod != nullptr, ChipLogProgress(Zcl, "mHandleCurrentHueChangedMethod null"));
env->ExceptionClear();
env->CallVoidMethod(mColorControlManagerObject.ObjectRef(), mHandleCurrentHueChangedMethod, value);
if (env->ExceptionCheck())
{
ChipLogError(AppServer, "Java exception in ColorControlManager::HandleCurrentHueChanged");
env->ExceptionDescribe();
env->ExceptionClear();
}
}
void ColorControlManager::HandleCurrentSaturationChanged(int value)
{
ChipLogProgress(Zcl, "ColorControlManager::HandleCurrentSaturationChanged");
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
VerifyOrReturn(env != NULL, ChipLogProgress(Zcl, "env null"));
VerifyOrReturn(mColorControlManagerObject.HasValidObjectRef(), ChipLogProgress(Zcl, "mColorControlManagerObject null"));
VerifyOrReturn(mHandleCurrentSaturationChangedMethod != nullptr,
ChipLogProgress(Zcl, "mHandleCurrentSaturationChangedMethod null"));
env->ExceptionClear();
env->CallVoidMethod(mColorControlManagerObject.ObjectRef(), mHandleCurrentSaturationChangedMethod, value);
if (env->ExceptionCheck())
{
ChipLogError(AppServer, "Java exception in ColorControlManager::HandleCurrentSaturationChanged");
env->ExceptionDescribe();
env->ExceptionClear();
}
}
void ColorControlManager::HandleColorTemperatureChanged(int value)
{
ChipLogProgress(Zcl, "ColorControlManager::HandleColorTemperatureChanged");
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
VerifyOrReturn(env != NULL, ChipLogProgress(Zcl, "env null"));
VerifyOrReturn(mColorControlManagerObject.HasValidObjectRef(), ChipLogProgress(Zcl, "mColorControlManagerObject null"));
VerifyOrReturn(mHandleColorTemperatureChangedMethod != nullptr,
ChipLogProgress(Zcl, "mHandleColorTemperatureChangedMethod null"));
env->ExceptionClear();
env->CallVoidMethod(mColorControlManagerObject.ObjectRef(), mHandleColorTemperatureChangedMethod, value);
if (env->ExceptionCheck())
{
ChipLogError(AppServer, "Java exception in ColorControlManager::mHandleColorTemperatureChanged");
env->ExceptionDescribe();
env->ExceptionClear();
}
}
void ColorControlManager::HandleColorModeChanged(int value)
{
ChipLogProgress(Zcl, "ColorControlManager::HandleColorModeChanged");
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
VerifyOrReturn(env != NULL, ChipLogProgress(Zcl, "env null"));
VerifyOrReturn(mColorControlManagerObject.HasValidObjectRef(), ChipLogProgress(Zcl, "mColorControlManagerObject null"));
VerifyOrReturn(mHandleColorModeChangedMethod != nullptr, ChipLogProgress(Zcl, "mHandleColorModeChangedMethod null"));
env->ExceptionClear();
env->CallVoidMethod(mColorControlManagerObject.ObjectRef(), mHandleColorModeChangedMethod, value);
if (env->ExceptionCheck())
{
ChipLogError(AppServer, "Java exception in ColorControlManager::HandleColorModeChanged");
env->ExceptionDescribe();
env->ExceptionClear();
}
}
void ColorControlManager::HandleEnhancedColorModeChanged(int value)
{
ChipLogProgress(Zcl, "ColorControlManager::HandleEnhancedColorModeChanged");
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
VerifyOrReturn(env != NULL, ChipLogProgress(Zcl, "env null"));
VerifyOrReturn(mColorControlManagerObject.HasValidObjectRef(), ChipLogProgress(Zcl, "mColorControlManagerObject null"));
VerifyOrReturn(mHandleEnhancedColorModeChangedMethod != nullptr,
ChipLogProgress(Zcl, "mHandleEnhancedColorModeChangedMethod null"));
env->ExceptionClear();
env->CallVoidMethod(mColorControlManagerObject.ObjectRef(), mHandleEnhancedColorModeChangedMethod, value);
if (env->ExceptionCheck())
{
ChipLogError(AppServer, "Java exception in ColorControlManager::HandleEnhancedColorModeChanged");
env->ExceptionDescribe();
env->ExceptionClear();
}
}