1/*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef ALGO_BASE_H
17#define ALGO_BASE_H
18
19#ifdef DEVICE_STATUS_SENSOR_ENABLE
20#include <cmath>
21#include <cstdio>
22#include <iostream>
23
24#include "devicestatus_common.h"
25#include "devicestatus_data_define.h"
26#include "devicestatus_msdp_interface.h"
27#include "sensor_data_callback.h"
28#include "stationary_data.h"
29
30namespace OHOS {
31namespace Msdp {
32namespace DeviceStatus {
33class AlgoBase {
34public:
35    AlgoBase() {};
36    virtual ~AlgoBase() = default;
37
38    virtual bool Init(Type type) = 0;
39    void Unsubscribe(int32_t sensorTypeId);
40    void RegisterCallback(const std::shared_ptr<IMsdp::MsdpAlgoCallback> callback);
41
42protected:
43    enum {
44        UNKNOWN = -1,
45        STILL,
46        UNSTILL,
47        HORIZONTAL,
48        NON_HORIZONTAL,
49        VERTICAL,
50        NON_VERTICAL
51    };
52    struct {
53        float x { 0.0 };
54        float y { 0.0 };
55        float z { 0.0 };
56        double resultantAcc { 0.0 };
57        double pitch { 0.0 };
58        double roll { 0.0 };
59    } algoPara_ {};
60    int32_t state_ { UNKNOWN };
61    int32_t counter_ { COUNTER_THRESHOLD };
62    Data reportInfo_ { TYPE_INVALID,
63                       VALUE_INVALID,
64                       STATUS_INVALID,
65                       ACTION_INVALID,
66                       0.0 };
67
68    virtual bool StartAlgorithm(int32_t sensorTypeId, AccelData* sensorData) = 0;
69    bool SetData(int32_t sensorTypeId, AccelData* sensorData);
70    virtual void ExecuteOperation() = 0;
71    void UpdateStateAndReport(OnChangedValue value, int32_t state, Type type);
72
73    SensorCallback algoCallback_ { nullptr };
74    std::shared_ptr<IMsdp::MsdpAlgoCallback> callback_ { nullptr };
75};
76} // namespace DeviceStatus
77} // namespace Msdp
78} // namespace OHOS
79#endif // DEVICE_STATUS_SENSOR_ENABLE
80#endif // ALGO_BASE_H
81
82