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