~aleteoryx/muditaos

ref: 73b72b99ef854b1d1cb07cd4eef9688f84893391 muditaos/module-cellular/at/response.hpp -rw-r--r-- 14.8 KiB
73b72b99 — rrandomsky [MOS-471] Fix case sensitive in the note search 2 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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "Result.hpp"
#include <log/log.hpp>
#include <map>
#include <memory>
#include <string>

#include <service-appmgr/data/MmiActionsParams.hpp>

namespace at
{
    namespace response
    {
        constexpr auto StringDelimiter = "\"";
        namespace qpinc
        {
            /// Structure that holds parsed information from AT+QPINC command
            struct AttemptsCounters
            {
                int PinCounter; /*!<  PIN attempts counter */
                int PukCounter; /*!<  PUK attempts counter */
            };
        } // namespace qpinc

        namespace cops
        {
            enum class OperatorStatus
            {
                Unknown   = 0,
                Available = 1,
                Current   = 2,
                Forbidden = 3
            };
            enum class CopsMode
            {
                Automatic    = 0,
                Manual       = 1,
                Deregister   = 2,
                OnlyFormat   = 3,
                ManualOrAuto = 4
            };
            enum class AccessTechnology
            {
                GSM                     = 0,
                UTRAN                   = 2,
                GSM_W_EGPRS             = 3,
                UTRAN_W_HSDPA           = 4,
                UTRAN_W_HSUPA           = 5,
                UTRAN_W_HSDPA_and_HSUPA = 6,
                E_UTRAN                 = 7,
                CDMA                    = 100
            };
            enum class NameFormat
            {
                Long    = 0,
                Short   = 1,
                Numeric = 2
            };

            class Operator
            {
              public:
                OperatorStatus status;
                std::string shortName;
                std::string longName;
                std::string numericName;
                std::optional<cops::AccessTechnology> technology = std::nullopt;

                std::string getNameByFormat(NameFormat format)
                {
                    switch (format) {
                    case NameFormat::Long:
                        return longName;
                    case NameFormat::Short:
                        return shortName;
                    case NameFormat::Numeric:
                        return numericName;
                    }
                    return {};
                }

                void setNameByFormat(NameFormat format, const std::string &name)
                {
                    switch (format) {
                    case NameFormat::Long:
                        longName = name;
                        break;
                    case NameFormat::Short:
                        shortName = name;
                        break;
                    case NameFormat::Numeric:
                        numericName = name;
                        break;
                    }
                }
            };

            class CurrentOperatorInfo
            {
                Operator op;
                CopsMode mode     = CopsMode::Automatic;
                NameFormat format = NameFormat::Long;
                bool operatorSet  = false;

              public:
                void setFormat(NameFormat format)
                {
                    this->format = format;
                }
                NameFormat getFormat() const noexcept
                {
                    return this->format;
                }
                void setMode(CopsMode mode)
                {
                    this->mode = mode;
                }
                CopsMode getMode() const noexcept
                {
                    return this->mode;
                }

                void setOperator(Operator op)
                {
                    this->operatorSet = true;
                    this->op          = op;
                }
                std::optional<cops::Operator> getOperator() const
                {
                    if (operatorSet) {
                        return op;
                    }
                    else {
                        return std::nullopt;
                    }
                }
            };
        } // namespace cops

        /**
         * @brief parse for AT+COPS=? from quectel
         *
         */
        bool parseCOPS(const at::Result &resp, std::vector<cops::Operator> &ret);
        using ResponseTokens = std::vector<std::vector<std::string>>;
        /**
         * @brief parse for AT+COPS? from quectel
         *
         */
        bool parseCOPS(const at::Result &resp, cops::CurrentOperatorInfo &ret);

        std::vector<std::string> tokenize(std::string &response, std::string separator = ",");

        /**
         * For AT one line (+XYZ) response like:
         * +CPIN READY
         * OK
         */
        std::optional<std::vector<std::string>> getTokensForATCommand(const at::Result &resp, std::string_view head);

        /**
         * For AT multiline response like (last OK)
         * +QIACT:1,<context_state>,<context_type>[,<IP_address>]
         * [.....
         * +QIACT:16,<context_state>,<context_type>[,<IP_address>]]
         * OK
         *
         * response from function like QPING (not mention in DOC as URC), looks like (first OK)
         * OK
         * +QPING: 0,"61.135.169.125",32,192,255
         * +QPING: 0,"61.135.169.125",32,240,255
         * ...
         * +QPING: 0,4,4,0,192,479,287
         *
         * Warning: should not be used for URC !
         */
        std::optional<ResponseTokens> getTokensForATResults(const at::Result &resp, std::string_view head);

        bool parseCSQ(std::string response, std::string &result);
        bool parseCSQ(std::string cellularResponse, std::uint32_t &result);
        bool parseCREG(std::string &response, std::uint32_t &result);
        bool parseCREG(std::string &response, std::string &result);
        bool parseQNWINFO(std::string &response, std::string &result);
        bool parseQPINC(const at::Result &resp, qpinc::AttemptsCounters &ret);
        bool parseCLCK(const at::Result &resp, int &ret);
        namespace qcfg_ims
        {
            /**
             * VoLTE state based on QCFG="ims" command
             */
            enum class VoLTEIMSState
            {
                NotReady = 0,
                Ready    = 1
            };

            enum class IMSState
            {
                ViaMBN  = 0, /// configuration could be setup via MBN file in NVRAM
                Enable  = 1,
                Disable = 2
            };
        } // namespace qcfg_ims
        bool parseQCFG_IMS(const at::Result &resp, std::pair<qcfg_ims::IMSState, qcfg_ims::VoLTEIMSState> &ret);
        namespace creg
        {
            bool isRegistered(std::uint32_t commandData);
        }
        namespace qnwinfo
        {

            auto constexpr gsmString   = "GSM";
            auto constexpr wcdmaString = "WCDMA";

            auto constexpr band_1  = 1;
            auto constexpr band_2  = 2;
            auto constexpr band_3  = 3;
            auto constexpr band_4  = 4;
            auto constexpr band_5  = 5;
            auto constexpr band_7  = 7;
            auto constexpr band_8  = 8;
            auto constexpr band_12 = 12;
            auto constexpr band_13 = 13;
            auto constexpr band_18 = 18;
            auto constexpr band_19 = 19;
            auto constexpr band_20 = 20;
            auto constexpr band_25 = 25;
            auto constexpr band_26 = 26;
            auto constexpr band_28 = 28;
            auto constexpr band_38 = 38;
            auto constexpr band_40 = 40;
            auto constexpr band_41 = 41;

            auto constexpr band_3_freq = 1800;
            auto constexpr band_1_freq = 2100;
            auto constexpr band_2_freq = 1900;

            auto constexpr band_4_freq  = 1700;
            auto constexpr band_5_freq  = 850;
            auto constexpr band_7_freq  = 2600;
            auto constexpr band_8_freq  = 900;
            auto constexpr band_12_freq = 700;
            auto constexpr band_13_freq = 700;
            auto constexpr band_18_freq = 850;
            auto constexpr band_19_freq = 850;
            auto constexpr band_20_freq = 800;
            auto constexpr band_25_freq = 1900;
            auto constexpr band_26_freq = 850;
            auto constexpr band_28_freq = 700;
            auto constexpr band_38_freq = 2600;
            auto constexpr band_40_freq = 2300;
            auto constexpr band_41_freq = 2500;

            std::string parseOperatorCode(const std::string &response);
            std::uint32_t parseNetworkFrequency(std::string &response);
            std::uint32_t parseNumericBandString(std::string &string);
            std::uint32_t parseLteBandString(std::string &string);
        } // namespace qnwinfo

        namespace clir
        {
            constexpr std::uint32_t clirTokens = 2;

            enum class ServiceState
            {
                AccordingToSubscription,
                ServiceEnabled,
                ServiceDisabled,
            };

            enum class ServiceStatus
            {
                NotProvisioned,
                PermanentProvisioned,
                Unknown,
                TemporaryRestricted,
                TemporaryAllowed
            };

            class ClirResponse
            {
              public:
                ServiceState serviceState;
                ServiceStatus serviceStatus;

                explicit ClirResponse(const ServiceState &state, const ServiceStatus &status)
                    : serviceState(state), serviceStatus(status)
                {}
            };

            auto parse(const std::string &response) -> std::optional<ClirResponse>;
            auto getState(const ServiceState &state) -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
            auto getStatus(const ServiceStatus &status)
                -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
        } // namespace clir

        namespace clip
        {
            auto constexpr clipTokens = 2;

            enum class UrcState
            {
                SupressUrc,
                DisplayUrc
            };

            enum class ClipState
            {
                NotProvisioned,
                Provisioned,
                Unknown
            };

            struct ClipParsed
            {
                UrcState urcState;
                ClipState clipState;
                explicit ClipParsed(UrcState urc, ClipState clip) : urcState(urc), clipState(clip)
                {}
            };

            auto parse(std::string response) -> std::optional<ClipParsed>;
            auto getClipState(const ClipState &state)
                -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
        } // namespace clip

        namespace ccfc
        {

            enum class ConnectionClass
            {
                None                  = 0,
                Voice                 = 1,
                Data                  = 2,
                Fax                   = 4,
                AllTelephonyExceptSMS = 7,
                ShortMessgeService    = 8,
                DataAsync             = 16,
                DataSync              = 32
            };

            enum class ForwardingStatus
            {
                NotActive,
                Active
            };

            struct ParsedCcfc
            {
                ConnectionClass connectionClass;
                ForwardingStatus status;
                std::string number;

                explicit ParsedCcfc(ConnectionClass connectionClass, ForwardingStatus status, const std::string &number)
                    : connectionClass(connectionClass), status(status), number(number)
                {}
            };

            enum Tokens
            {
                Status,
                Class,
                Number,
                Type
            };

            struct CcfcNumbers
            {
                std::string voice;
                std::string fax;
                std::string sync;
                std::string async;
            };

            auto constexpr serviceDisabledTokenCount = 2;
            auto constexpr serviceEnabledTokenCount  = 4;

            auto parse(std::vector<std::string> response, std::vector<ParsedCcfc> &parsed) -> bool;
            auto getNumbers(std::vector<ParsedCcfc> &parsed) -> CcfcNumbers;
            auto isAnyActive(std::vector<ParsedCcfc> &parsed) -> bool;
        } // namespace ccfc

        namespace mmi
        {

            enum class ServiceClass
            {
                Voice       = 1,
                Data        = 2,
                Fax         = 4,
                DataSync    = 16,
                DataAsync   = 32,
                AllDisabled = 255
            };

            auto getClass(const ServiceClass &serviceClass) noexcept
                -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
        } // namespace mmi

        namespace clck
        {
            enum class Status
            {
                Disable,
                Enable,
                Query
            };

            struct ClckParsed
            {
                Status status;
                mmi::ServiceClass serviceClass;
                explicit ClckParsed(Status status, mmi::ServiceClass serviceClass)
                    : status(status), serviceClass(serviceClass){};
            };

            auto parseQueryResponse(const std::vector<std::string> &data, std::vector<ClckParsed> &parsed) -> bool;
            auto iterLessIter(ClckParsed a, ClckParsed b) -> bool;
            auto getStatus(const Status &status) noexcept
                -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
        } // namespace clck

        namespace ccwa
        {
            enum class Status
            {
                Disable,
                Enable
            };
            enum class ServiceClass
            {
                Voice       = 1,
                Data        = 2,
                Fax         = 4,
                DataSync    = 16,
                DataAsync   = 32,
                AllDisabled = 255
            };

            struct CcwaParsed
            {
                Status status;
                ServiceClass serviceClass;
                explicit CcwaParsed(const Status status, const ServiceClass serviceClass)
                    : status(status), serviceClass(serviceClass){};
            };

            auto parse(const std::vector<std::string> &data, std::vector<CcwaParsed> &parsed) noexcept -> bool;
            auto getStatus(const Status &status) noexcept
                -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
            auto getClass(const ServiceClass &serviceClass) noexcept
                -> app::manager::actions::IMMICustomResultParams::MMIResultMessage;
        } // namespace ccwa
    }     // namespace response
} // namespace at