158ec469eSopenharmony_ci/* 258ec469eSopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd. 358ec469eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 458ec469eSopenharmony_ci * you may not use this file except in compliance with the License. 558ec469eSopenharmony_ci * You may obtain a copy of the License at 658ec469eSopenharmony_ci * 758ec469eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 858ec469eSopenharmony_ci * 958ec469eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1058ec469eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1158ec469eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1258ec469eSopenharmony_ci * See the License for the specific language governing permissions and 1358ec469eSopenharmony_ci * limitations under the License. 1458ec469eSopenharmony_ci */ 1558ec469eSopenharmony_ci#include "vibrator_infos.h" 1658ec469eSopenharmony_ci 1758ec469eSopenharmony_ci#include <cerrno> 1858ec469eSopenharmony_ci#include <cinttypes> 1958ec469eSopenharmony_ci 2058ec469eSopenharmony_ci#include <sys/stat.h> 2158ec469eSopenharmony_ci#include <unistd.h> 2258ec469eSopenharmony_ci 2358ec469eSopenharmony_ci#include "sensors_errors.h" 2458ec469eSopenharmony_ci 2558ec469eSopenharmony_ci#undef LOG_TAG 2658ec469eSopenharmony_ci#define LOG_TAG "MiscdeviceVibratorInfos" 2758ec469eSopenharmony_ci 2858ec469eSopenharmony_cinamespace OHOS { 2958ec469eSopenharmony_cinamespace Sensors { 3058ec469eSopenharmony_civoid VibratePattern::Dump() const 3158ec469eSopenharmony_ci{ 3258ec469eSopenharmony_ci int32_t size = static_cast<int32_t>(events.size()); 3358ec469eSopenharmony_ci MISC_HILOGD("Pattern startTime:%{public}d, eventSize:%{public}d", startTime, size); 3458ec469eSopenharmony_ci for (int32_t i = 0; i < size; ++i) { 3558ec469eSopenharmony_ci std::string tag = (events[i].tag == EVENT_TAG_CONTINUOUS) ? "continuous" : "transient"; 3658ec469eSopenharmony_ci int32_t pointSize = static_cast<int32_t>(events[i].points.size()); 3758ec469eSopenharmony_ci MISC_HILOGD("Event tag:%{public}s, time:%{public}d, duration:%{public}d," 3858ec469eSopenharmony_ci "intensity:%{public}d, frequency:%{public}d, index:%{public}d, curve pointSize:%{public}d", 3958ec469eSopenharmony_ci tag.c_str(), events[i].time, events[i].duration, events[i].intensity, 4058ec469eSopenharmony_ci events[i].frequency, events[i].index, pointSize); 4158ec469eSopenharmony_ci for (int32_t j = 0; j < pointSize; ++j) { 4258ec469eSopenharmony_ci MISC_HILOGD("Curve point time:%{public}d, intensity:%{public}d, frequency:%{public}d", 4358ec469eSopenharmony_ci events[i].points[j].time, events[i].points[j].intensity, events[i].points[j].frequency); 4458ec469eSopenharmony_ci } 4558ec469eSopenharmony_ci } 4658ec469eSopenharmony_ci} 4758ec469eSopenharmony_ci 4858ec469eSopenharmony_civoid VibratePackage::Dump() const 4958ec469eSopenharmony_ci{ 5058ec469eSopenharmony_ci int32_t size = static_cast<int32_t>(patterns.size()); 5158ec469eSopenharmony_ci MISC_HILOGD("Vibrate package pattern size:%{public}d", size); 5258ec469eSopenharmony_ci for (int32_t i = 0; i < size; ++i) { 5358ec469eSopenharmony_ci patterns[i].Dump(); 5458ec469eSopenharmony_ci } 5558ec469eSopenharmony_ci} 5658ec469eSopenharmony_ci 5758ec469eSopenharmony_civoid VibratorCapacity::Dump() const 5858ec469eSopenharmony_ci{ 5958ec469eSopenharmony_ci std::string isSupportHdHapticStr = isSupportHdHaptic ? "true" : "false"; 6058ec469eSopenharmony_ci std::string isSupportPresetMappingStr = isSupportPresetMapping ? "true" : "false"; 6158ec469eSopenharmony_ci std::string isSupportTimeDelayStr = isSupportTimeDelay ? "true" : "false"; 6258ec469eSopenharmony_ci MISC_HILOGD("SupportHdHaptic:%{public}s, SupportPresetMapping:%{public}s, " 6358ec469eSopenharmony_ci "SupportTimeDelayStr:%{public}s", isSupportHdHapticStr.c_str(), 6458ec469eSopenharmony_ci isSupportPresetMappingStr.c_str(), isSupportTimeDelayStr.c_str()); 6558ec469eSopenharmony_ci} 6658ec469eSopenharmony_ci 6758ec469eSopenharmony_ciint32_t VibratorCapacity::GetVibrateMode() 6858ec469eSopenharmony_ci{ 6958ec469eSopenharmony_ci if (isSupportHdHaptic) { 7058ec469eSopenharmony_ci return VIBRATE_MODE_HD; 7158ec469eSopenharmony_ci } 7258ec469eSopenharmony_ci if (isSupportPresetMapping) { 7358ec469eSopenharmony_ci return VIBRATE_MODE_MAPPING; 7458ec469eSopenharmony_ci } 7558ec469eSopenharmony_ci if (isSupportTimeDelay) { 7658ec469eSopenharmony_ci return VIBRATE_MODE_TIMES; 7758ec469eSopenharmony_ci } 7858ec469eSopenharmony_ci return -1; 7958ec469eSopenharmony_ci} 8058ec469eSopenharmony_ci 8158ec469eSopenharmony_cibool VibratorCapacity::Marshalling(Parcel &parcel) const 8258ec469eSopenharmony_ci{ 8358ec469eSopenharmony_ci if (!parcel.WriteBool(isSupportHdHaptic)) { 8458ec469eSopenharmony_ci MISC_HILOGE("Write isSupportHdHaptic failed"); 8558ec469eSopenharmony_ci return false; 8658ec469eSopenharmony_ci } 8758ec469eSopenharmony_ci if (!parcel.WriteBool(isSupportPresetMapping)) { 8858ec469eSopenharmony_ci MISC_HILOGE("Write isSupportPresetMapping failed"); 8958ec469eSopenharmony_ci return false; 9058ec469eSopenharmony_ci } 9158ec469eSopenharmony_ci if (!parcel.WriteBool(isSupportTimeDelay)) { 9258ec469eSopenharmony_ci MISC_HILOGE("Write isSupportTimeDelay failed"); 9358ec469eSopenharmony_ci return false; 9458ec469eSopenharmony_ci } 9558ec469eSopenharmony_ci return true; 9658ec469eSopenharmony_ci} 9758ec469eSopenharmony_ci 9858ec469eSopenharmony_cistd::optional<VibratorCapacity> VibratorCapacity::Unmarshalling(Parcel &data) 9958ec469eSopenharmony_ci{ 10058ec469eSopenharmony_ci VibratorCapacity capacity; 10158ec469eSopenharmony_ci if (!(data.ReadBool(capacity.isSupportHdHaptic))) { 10258ec469eSopenharmony_ci MISC_HILOGE("Read isSupportHdHaptic failed"); 10358ec469eSopenharmony_ci return std::nullopt; 10458ec469eSopenharmony_ci } 10558ec469eSopenharmony_ci if (!(data.ReadBool(capacity.isSupportPresetMapping))) { 10658ec469eSopenharmony_ci MISC_HILOGE("Read isSupportPresetMapping failed"); 10758ec469eSopenharmony_ci return std::nullopt; 10858ec469eSopenharmony_ci } 10958ec469eSopenharmony_ci if (!(data.ReadBool(capacity.isSupportTimeDelay))) { 11058ec469eSopenharmony_ci MISC_HILOGE("Read isSupportTimeDelay failed"); 11158ec469eSopenharmony_ci return std::nullopt; 11258ec469eSopenharmony_ci } 11358ec469eSopenharmony_ci return capacity; 11458ec469eSopenharmony_ci} 11558ec469eSopenharmony_ci 11658ec469eSopenharmony_cibool VibratePattern::Marshalling(Parcel &parcel) const 11758ec469eSopenharmony_ci{ 11858ec469eSopenharmony_ci if (!parcel.WriteInt32(startTime)) { 11958ec469eSopenharmony_ci MISC_HILOGE("Write pattern's startTime failed"); 12058ec469eSopenharmony_ci return false; 12158ec469eSopenharmony_ci } 12258ec469eSopenharmony_ci if (!parcel.WriteInt32(patternDuration)) { 12358ec469eSopenharmony_ci MISC_HILOGE("Write patternDuration failed"); 12458ec469eSopenharmony_ci return false; 12558ec469eSopenharmony_ci } 12658ec469eSopenharmony_ci if (!parcel.WriteInt32(static_cast<int32_t>(events.size()))) { 12758ec469eSopenharmony_ci MISC_HILOGE("Write events's size failed"); 12858ec469eSopenharmony_ci return false; 12958ec469eSopenharmony_ci } 13058ec469eSopenharmony_ci for (size_t i = 0; i < events.size(); ++i) { 13158ec469eSopenharmony_ci if (!parcel.WriteInt32(static_cast<int32_t>(events[i].tag))) { 13258ec469eSopenharmony_ci MISC_HILOGE("Write tag failed"); 13358ec469eSopenharmony_ci return false; 13458ec469eSopenharmony_ci } 13558ec469eSopenharmony_ci if (!parcel.WriteInt32(events[i].time)) { 13658ec469eSopenharmony_ci MISC_HILOGE("Write events's time failed"); 13758ec469eSopenharmony_ci return false; 13858ec469eSopenharmony_ci } 13958ec469eSopenharmony_ci if (!parcel.WriteInt32(events[i].duration)) { 14058ec469eSopenharmony_ci MISC_HILOGE("Write duration failed"); 14158ec469eSopenharmony_ci return false; 14258ec469eSopenharmony_ci } 14358ec469eSopenharmony_ci if (!parcel.WriteInt32(events[i].intensity)) { 14458ec469eSopenharmony_ci MISC_HILOGE("Write intensity failed"); 14558ec469eSopenharmony_ci return false; 14658ec469eSopenharmony_ci } 14758ec469eSopenharmony_ci if (!parcel.WriteInt32(events[i].frequency)) { 14858ec469eSopenharmony_ci MISC_HILOGE("Write frequency failed"); 14958ec469eSopenharmony_ci return false; 15058ec469eSopenharmony_ci } 15158ec469eSopenharmony_ci if (!parcel.WriteInt32(events[i].index)) { 15258ec469eSopenharmony_ci MISC_HILOGE("Write index failed"); 15358ec469eSopenharmony_ci return false; 15458ec469eSopenharmony_ci } 15558ec469eSopenharmony_ci if (!parcel.WriteInt32(static_cast<int32_t>(events[i].points.size()))) { 15658ec469eSopenharmony_ci MISC_HILOGE("Write points's size failed"); 15758ec469eSopenharmony_ci return false; 15858ec469eSopenharmony_ci } 15958ec469eSopenharmony_ci for (size_t j = 0; j < events[i].points.size(); ++j) { 16058ec469eSopenharmony_ci if (!parcel.WriteInt32(events[i].points[j].time)) { 16158ec469eSopenharmony_ci MISC_HILOGE("Write points's time failed"); 16258ec469eSopenharmony_ci return false; 16358ec469eSopenharmony_ci } 16458ec469eSopenharmony_ci if (!parcel.WriteInt32(events[i].points[j].intensity)) { 16558ec469eSopenharmony_ci MISC_HILOGE("Write points's intensity failed"); 16658ec469eSopenharmony_ci return false; 16758ec469eSopenharmony_ci } 16858ec469eSopenharmony_ci if (!parcel.WriteInt32(events[i].points[j].frequency)) { 16958ec469eSopenharmony_ci MISC_HILOGE("Write points's frequency failed"); 17058ec469eSopenharmony_ci return false; 17158ec469eSopenharmony_ci } 17258ec469eSopenharmony_ci } 17358ec469eSopenharmony_ci } 17458ec469eSopenharmony_ci return true; 17558ec469eSopenharmony_ci} 17658ec469eSopenharmony_ci 17758ec469eSopenharmony_cistd::optional<VibratePattern> VibratePattern::Unmarshalling(Parcel &data) 17858ec469eSopenharmony_ci{ 17958ec469eSopenharmony_ci VibratePattern pattern; 18058ec469eSopenharmony_ci if (!(data.ReadInt32(pattern.startTime))) { 18158ec469eSopenharmony_ci MISC_HILOGE("Read time failed"); 18258ec469eSopenharmony_ci return std::nullopt; 18358ec469eSopenharmony_ci } 18458ec469eSopenharmony_ci if (!(data.ReadInt32(pattern.patternDuration))) { 18558ec469eSopenharmony_ci MISC_HILOGE("Read duration failed"); 18658ec469eSopenharmony_ci return std::nullopt; 18758ec469eSopenharmony_ci } 18858ec469eSopenharmony_ci int32_t eventSize { 0 }; 18958ec469eSopenharmony_ci if (!(data.ReadInt32(eventSize))) { 19058ec469eSopenharmony_ci MISC_HILOGE("Read eventSize failed"); 19158ec469eSopenharmony_ci return std::nullopt; 19258ec469eSopenharmony_ci } 19358ec469eSopenharmony_ci if (eventSize > MAX_EVENT_SIZE) { 19458ec469eSopenharmony_ci MISC_HILOGE("eventSize exceed the maximum"); 19558ec469eSopenharmony_ci return std::nullopt; 19658ec469eSopenharmony_ci } 19758ec469eSopenharmony_ci for (int32_t i = 0; i < eventSize; ++i) { 19858ec469eSopenharmony_ci VibrateEvent event; 19958ec469eSopenharmony_ci int32_t tag { -1 }; 20058ec469eSopenharmony_ci if (!data.ReadInt32(tag)) { 20158ec469eSopenharmony_ci MISC_HILOGE("Read type failed"); 20258ec469eSopenharmony_ci return std::nullopt; 20358ec469eSopenharmony_ci } 20458ec469eSopenharmony_ci event.tag = static_cast<VibrateTag>(tag); 20558ec469eSopenharmony_ci if (!data.ReadInt32(event.time)) { 20658ec469eSopenharmony_ci MISC_HILOGE("Read events's time failed"); 20758ec469eSopenharmony_ci return std::nullopt; 20858ec469eSopenharmony_ci } 20958ec469eSopenharmony_ci if (!data.ReadInt32(event.duration)) { 21058ec469eSopenharmony_ci MISC_HILOGE("Read duration failed"); 21158ec469eSopenharmony_ci return std::nullopt; 21258ec469eSopenharmony_ci } 21358ec469eSopenharmony_ci if (!data.ReadInt32(event.intensity)) { 21458ec469eSopenharmony_ci MISC_HILOGE("Read intensity failed"); 21558ec469eSopenharmony_ci return std::nullopt; 21658ec469eSopenharmony_ci } 21758ec469eSopenharmony_ci if (!data.ReadInt32(event.frequency)) { 21858ec469eSopenharmony_ci MISC_HILOGE("Read frequency failed"); 21958ec469eSopenharmony_ci return std::nullopt; 22058ec469eSopenharmony_ci } 22158ec469eSopenharmony_ci if (!data.ReadInt32(event.index)) { 22258ec469eSopenharmony_ci MISC_HILOGE("Read index failed"); 22358ec469eSopenharmony_ci return std::nullopt; 22458ec469eSopenharmony_ci } 22558ec469eSopenharmony_ci int32_t pointSize { 0 }; 22658ec469eSopenharmony_ci if (!data.ReadInt32(pointSize)) { 22758ec469eSopenharmony_ci MISC_HILOGE("Read pointSize failed"); 22858ec469eSopenharmony_ci return std::nullopt; 22958ec469eSopenharmony_ci } 23058ec469eSopenharmony_ci if (pointSize > MAX_POINT_SIZE) { 23158ec469eSopenharmony_ci MISC_HILOGE("pointSize exceed the maximum"); 23258ec469eSopenharmony_ci return std::nullopt; 23358ec469eSopenharmony_ci } 23458ec469eSopenharmony_ci pattern.events.emplace_back(event); 23558ec469eSopenharmony_ci for (int32_t j = 0; j < pointSize; ++j) { 23658ec469eSopenharmony_ci VibrateCurvePoint point; 23758ec469eSopenharmony_ci if (!data.ReadInt32(point.time)) { 23858ec469eSopenharmony_ci MISC_HILOGE("Read points's time failed"); 23958ec469eSopenharmony_ci return std::nullopt; 24058ec469eSopenharmony_ci } 24158ec469eSopenharmony_ci if (!data.ReadInt32(point.intensity)) { 24258ec469eSopenharmony_ci MISC_HILOGE("Read points's intensity failed"); 24358ec469eSopenharmony_ci return std::nullopt; 24458ec469eSopenharmony_ci } 24558ec469eSopenharmony_ci if (!data.ReadInt32(point.frequency)) { 24658ec469eSopenharmony_ci MISC_HILOGE("Read points's frequency failed"); 24758ec469eSopenharmony_ci return std::nullopt; 24858ec469eSopenharmony_ci } 24958ec469eSopenharmony_ci pattern.events[i].points.emplace_back(point); 25058ec469eSopenharmony_ci } 25158ec469eSopenharmony_ci } 25258ec469eSopenharmony_ci return pattern; 25358ec469eSopenharmony_ci} 25458ec469eSopenharmony_ci 25558ec469eSopenharmony_civoid VibrateParameter::Dump() const 25658ec469eSopenharmony_ci{ 25758ec469eSopenharmony_ci MISC_HILOGI("intensity:%{public}d, frequency:%{public}d", intensity, frequency); 25858ec469eSopenharmony_ci} 25958ec469eSopenharmony_ci 26058ec469eSopenharmony_cibool VibrateParameter::Marshalling(Parcel &parcel) const 26158ec469eSopenharmony_ci{ 26258ec469eSopenharmony_ci if (!parcel.WriteInt32(intensity)) { 26358ec469eSopenharmony_ci MISC_HILOGE("Write parameter's intensity failed"); 26458ec469eSopenharmony_ci return false; 26558ec469eSopenharmony_ci } 26658ec469eSopenharmony_ci if (!parcel.WriteInt32(frequency)) { 26758ec469eSopenharmony_ci MISC_HILOGE("Write parameter's frequency failed"); 26858ec469eSopenharmony_ci return false; 26958ec469eSopenharmony_ci } 27058ec469eSopenharmony_ci return true; 27158ec469eSopenharmony_ci} 27258ec469eSopenharmony_ci 27358ec469eSopenharmony_cistd::optional<VibrateParameter> VibrateParameter::Unmarshalling(Parcel &data) 27458ec469eSopenharmony_ci{ 27558ec469eSopenharmony_ci VibrateParameter parameter; 27658ec469eSopenharmony_ci if (!(data.ReadInt32(parameter.intensity))) { 27758ec469eSopenharmony_ci MISC_HILOGE("Read parameter's intensity failed"); 27858ec469eSopenharmony_ci return std::nullopt; 27958ec469eSopenharmony_ci } 28058ec469eSopenharmony_ci if (!(data.ReadInt32(parameter.frequency))) { 28158ec469eSopenharmony_ci MISC_HILOGE("Read parameter's frequency failed"); 28258ec469eSopenharmony_ci return std::nullopt; 28358ec469eSopenharmony_ci } 28458ec469eSopenharmony_ci return parameter; 28558ec469eSopenharmony_ci} 28658ec469eSopenharmony_ci} // namespace Sensors 28758ec469eSopenharmony_ci} // namespace OHOS 288