~aleteoryx/muditaos

ref: d32ce980d98396dc4652bca96ede347fa6a06f0c muditaos/module-cellular/at/cmd/src/QSIMSTAT.cpp -rw-r--r-- 2.9 KiB
d32ce980 — Tomasz Rybarski [BH-1272] Update Onboarding Finalize Screen 4 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <at/cmd/QSIMSTAT.hpp>

#include <log/log.hpp>
#include <memory>
#include <string>

namespace at
{
    namespace cmd
    {
        QSIMSTAT::QSIMSTAT(at::cmd::Modifier mod) noexcept : Cmd("AT+QSIMSTAT", mod, at::default_timeout)
        {}

        QSIMSTAT::QSIMSTAT() noexcept : QSIMSTAT(at::cmd::Modifier::None)
        {}

        auto QSIMSTAT::parseQSIMSTAT(const Result &base_result) -> result::QSIMSTAT
        {

            auto constexpr responseHeader      = "+QSIMSTAT: ";
            auto constexpr qsimstatTokensCount = 2;
            result::QSIMSTAT parsed{base_result};

            if (parsed) {
                if (parsed.response.empty()) {
                    LOG_ERROR("Can't parse - empty response");
                    parsed.code = result::QSIMSTAT::Code::PARSING_ERROR;
                }
                else {
                    std::string str = parsed.response[0];
                    if (str.find(responseHeader) == std::string::npos) {
                        LOG_ERROR("Can't parse - bad header");
                        parsed.code = result::QSIMSTAT::Code::PARSING_ERROR;
                        return parsed;
                    }

                    utils::findAndReplaceAll(str, responseHeader, "");
                    utils::trim(str);

                    std::vector<std::string> tokens = utils::split(str, ',');

                    if (tokens.size() != qsimstatTokensCount) {
                        LOG_ERROR("Can't parse - invalid tokens count");
                        parsed.code = result::QSIMSTAT::Code::PARSING_ERROR;
                        return parsed;
                    }

                    parseTokens(tokens, parsed);
                }
            }
            return parsed;
        }

        void QSIMSTAT::parseTokens(const std::vector<std::string> &tokens, result::QSIMSTAT &parsed)
        {
            auto status = 0, enabled = 0;
            if (utils::toNumeric(tokens[magic_enum::enum_integer(responseTokens::SimInserted)], status) &&
                utils::toNumeric(tokens[magic_enum::enum_integer(responseTokens::Enabled)], enabled)) {
                if (magic_enum::enum_contains<SimInsertedStatus>(status) &&
                    magic_enum::enum_contains<at::SimInsertedStatusEnable>(enabled)) {
                    parsed.enabled = static_cast<at::SimInsertedStatusEnable>(enabled);
                    parsed.status  = static_cast<SimInsertedStatus>(status);
                    return;
                }
            }

            LOG_ERROR("Can't parse - bad value");
            parsed.code = result::QSIMSTAT::Code::PARSING_ERROR;
        }
    } // namespace cmd
    namespace result
    {
        QSIMSTAT::QSIMSTAT(const Result &that) : Result(that)
        {}

    } // namespace result
} // namespace at