blob: 39d3bf8da5f1a4bf2e96c2bfec67f2659d67b2f6 [file] [log] [blame] [edit]
/******************************************************************************
*
* Copyright 2020, 2022 NXP
*
* 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.
*
******************************************************************************/
#define LOG_TAG "[email protected]"
#include "Weaver.h"
#include <log/log.h>
#include <string.h>
#include <hidl/LegacySupport.h>
#include <weaver_interface.h>
#include <weaver-impl.h>
/* Mutex to synchronize multiple transceive */
namespace android {
namespace hardware {
namespace weaver {
namespace V1_0 {
namespace implementation {
WeaverInterface *pInterface = nullptr;
Weaver::Weaver() {
ALOGI("INITIALIZING WEAVER");
pInterface = WeaverImpl::getInstance();
if(pInterface != NULL) {
pInterface->Init();
}
}
Return<void> Weaver::getConfig(getConfig_cb _hidl_cb) {
ALOGI("GETCONFIG API ENTRY");
if(_hidl_cb == NULL) {
return Void();
}
WeaverConfig configResp;
if(pInterface == NULL) {
ALOGI("Weaver Interface not defined");
_hidl_cb(WeaverStatus::FAILED, configResp);
return Void();
}
SlotInfo slotInfo;
Status_Weaver status = pInterface->GetSlots(slotInfo);
if(status == WEAVER_STATUS_OK) {
configResp.slots = slotInfo.slots;
configResp.keySize = slotInfo.keySize;
configResp.valueSize = slotInfo.valueSize;
ALOGI("Weaver Success for getSlots Slots :(%d)", configResp.slots);
_hidl_cb(WeaverStatus::OK, configResp);
} else {
_hidl_cb(WeaverStatus::FAILED, configResp);
}
return Void();
}
Return<::android::hardware::weaver::V1_0::WeaverStatus>
Weaver::write(uint32_t slotId, const hidl_vec<uint8_t>& key, const hidl_vec<uint8_t>& value) {
ALOGI("Write API ENTRY");
WeaverStatus status = WeaverStatus::FAILED;
if(key != NULL && value != NULL && pInterface != NULL
&& (pInterface->Write(slotId, key, value) == WEAVER_STATUS_OK)) {
status = WeaverStatus::OK;
}
return status;
}
Return<void>
Weaver::read(uint32_t slotId, const hidl_vec<uint8_t>& key, read_cb _hidl_cb) {
ALOGI("Read API ENTRY");
if (_hidl_cb == NULL) {
return Void();
}
WeaverReadResponse readResp;
if (key == NULL || pInterface == NULL) {
_hidl_cb(WeaverReadStatus::FAILED, readResp);
} else {
ReadRespInfo readInfo;
Status_Weaver status = pInterface->Read(slotId, key, readInfo);
switch (status) {
case WEAVER_STATUS_OK:
ALOGI("Read OK");
readResp.value = readInfo.value;
_hidl_cb(WeaverReadStatus::OK, readResp);
break;
case WEAVER_STATUS_INCORRECT_KEY:
ALOGI("Read Incorrect Key");
readResp.value.resize(0);
readResp.timeout = readInfo.timeout;
_hidl_cb(WeaverReadStatus::INCORRECT_KEY, readResp);
break;
case WEAVER_STATUS_THROTTLE:
ALOGI("Read WEAVER_THROTTLE");
readResp.value.resize(0);
readResp.timeout = readInfo.timeout;
_hidl_cb(WeaverReadStatus::THROTTLE, readResp);
break;
default:
readResp.timeout = 0;
readResp.value.resize(0);
_hidl_cb(WeaverReadStatus::FAILED, readResp);
}
}
return Void();
}
void Weaver::serviceDied(uint64_t /*cookie*/, const wp<IBase>& /*who*/) {
if(pInterface != NULL) {
pInterface->DeInit();
}
}
}
}
}
}
}