1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "wifi_chip_modes.h"
17094332d3Sopenharmony_ci#include <hdf_log.h>
18094332d3Sopenharmony_ci
19094332d3Sopenharmony_cinamespace OHOS {
20094332d3Sopenharmony_cinamespace HDI {
21094332d3Sopenharmony_cinamespace Wlan {
22094332d3Sopenharmony_cinamespace Chip {
23094332d3Sopenharmony_cinamespace V1_0 {
24094332d3Sopenharmony_ci#define STA IfaceType::STA
25094332d3Sopenharmony_ci#define AP IfaceType::AP
26094332d3Sopenharmony_ci#define P2P IfaceType::P2P
27094332d3Sopenharmony_ciconstexpr int STA_MAX_NUM = 3;
28094332d3Sopenharmony_ci
29094332d3Sopenharmony_ciWifiChipModes::WifiChipModes(
30094332d3Sopenharmony_ci    const std::weak_ptr<WifiVendorHal> vendorHal)
31094332d3Sopenharmony_ci    : vendorHal_(vendorHal)
32094332d3Sopenharmony_ci{}
33094332d3Sopenharmony_ci
34094332d3Sopenharmony_ciUsableMode WifiChipModes::MakeComModes(int staNum, int apNum, int p2pNum, int modeId)
35094332d3Sopenharmony_ci{
36094332d3Sopenharmony_ci    std::vector<IfaceType> staTypes = {};
37094332d3Sopenharmony_ci    std::vector<IfaceType> apTypes = {};
38094332d3Sopenharmony_ci    std::vector<IfaceType> p2pTypes = {};
39094332d3Sopenharmony_ci    std::vector<ComboIface> chipComb = {};
40094332d3Sopenharmony_ci    IfaceLimit staChipIfaceComb;
41094332d3Sopenharmony_ci    IfaceLimit apChipIfaceComb;
42094332d3Sopenharmony_ci    IfaceLimit p2pChipIfaceComb;
43094332d3Sopenharmony_ci
44094332d3Sopenharmony_ci    staTypes.push_back(STA);
45094332d3Sopenharmony_ci    staChipIfaceComb.types = staTypes;
46094332d3Sopenharmony_ci    staChipIfaceComb.ifaceNum = staNum;
47094332d3Sopenharmony_ci    apTypes.push_back(AP);
48094332d3Sopenharmony_ci    apChipIfaceComb.types = apTypes;
49094332d3Sopenharmony_ci    apChipIfaceComb.ifaceNum = apNum;
50094332d3Sopenharmony_ci    p2pTypes.push_back(P2P);
51094332d3Sopenharmony_ci    p2pChipIfaceComb.types = p2pTypes;
52094332d3Sopenharmony_ci    p2pChipIfaceComb.ifaceNum = p2pNum;
53094332d3Sopenharmony_ci    ComboIface comb;
54094332d3Sopenharmony_ci    if (staNum != 0)
55094332d3Sopenharmony_ci        comb.limits.push_back(staChipIfaceComb);
56094332d3Sopenharmony_ci    if (apNum != 0)
57094332d3Sopenharmony_ci        comb.limits.push_back(apChipIfaceComb);
58094332d3Sopenharmony_ci    if (p2pNum != 0)
59094332d3Sopenharmony_ci        comb.limits.push_back(p2pChipIfaceComb);
60094332d3Sopenharmony_ci    chipComb.push_back(comb);
61094332d3Sopenharmony_ci    UsableMode chipmode = {};
62094332d3Sopenharmony_ci    chipmode.modeId = modeId;
63094332d3Sopenharmony_ci    chipmode.usableCombo = chipComb;
64094332d3Sopenharmony_ci    return chipmode;
65094332d3Sopenharmony_ci}
66094332d3Sopenharmony_ci
67094332d3Sopenharmony_cistd::vector<UsableMode> WifiChipModes::GetChipModesForPrimary()
68094332d3Sopenharmony_ci{
69094332d3Sopenharmony_ci    std::vector<UsableMode> modes = {};
70094332d3Sopenharmony_ci    UsableMode mode = MakeComModes(3, 0, 1, 0);
71094332d3Sopenharmony_ci    modes.push_back(mode);
72094332d3Sopenharmony_ci    UsableMode modeAp = MakeComModes(0, 1, 0, 1);
73094332d3Sopenharmony_ci    modes.push_back(modeAp);
74094332d3Sopenharmony_ci    return modes;
75094332d3Sopenharmony_ci}
76094332d3Sopenharmony_ci
77094332d3Sopenharmony_cistd::vector<UsableMode> WifiChipModes::GetChipModesForTriple()
78094332d3Sopenharmony_ci{
79094332d3Sopenharmony_ci    std::vector<UsableMode> modes = {};
80094332d3Sopenharmony_ci    UsableMode mode = MakeComModes(STA_MAX_NUM, 1, 1, 0);
81094332d3Sopenharmony_ci    modes.push_back(mode);
82094332d3Sopenharmony_ci    return modes;
83094332d3Sopenharmony_ci}
84094332d3Sopenharmony_ci
85094332d3Sopenharmony_cistd::vector<UsableMode> WifiChipModes::GetChipModes(bool isPrimary)
86094332d3Sopenharmony_ci{
87094332d3Sopenharmony_ci    bool isCoex;
88094332d3Sopenharmony_ci    vendorHal_.lock()->IsSupportCoex(isCoex);
89094332d3Sopenharmony_ci    if (isCoex) {
90094332d3Sopenharmony_ci        return GetChipModesForTriple();
91094332d3Sopenharmony_ci    } else {
92094332d3Sopenharmony_ci        return GetChipModesForPrimary();
93094332d3Sopenharmony_ci    }
94094332d3Sopenharmony_ci}
95094332d3Sopenharmony_ci}
96094332d3Sopenharmony_ci}
97094332d3Sopenharmony_ci}
98094332d3Sopenharmony_ci}
99094332d3Sopenharmony_ci}