summaryrefslogtreecommitdiff
path: root/include/mts/MTS_IO_QuectelRadio.h
blob: c54e560d8333833cad6941214d8c77bd8495cdad (plain)
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
/*
 * Copyright (C) 2019 by Multi-Tech Systems
 *
 * This file is part of libmts-io.
 *
 * libmts-io is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * libmts-io is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with libmts-io.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef MTS_IO_QUECTELRADIO_H_
#define MTS_IO_QUECTELRADIO_H_

#include <mts/MTS_IO_CellularRadio.h>

namespace MTS {
    namespace IO {

        class QuectelRadio : public CellularRadio {

            public:
                bool resetRadio(uint32_t iTimeoutMillis = 5000) override;

                CODE getVendorFirmware(std::string& sVendorFirmware) override;
                CODE getModel(std::string& sModel) override;
                CODE getIccid(std::string& sIccid) override;
                CODE getService(std::string& sService) override;
                CODE getNetwork(std::string& sNetwork) override;
                CODE getNetworkStatus(Json::Value& jData) override;

                CODE convertSignalStrengthTodBm(const int32_t& iRssi, int32_t& dBm) override;
                CODE convertdBmToSignalStrength(const int32_t& dBm, int32_t& iRssi) override;

                CODE setMdn(const Json::Value& jArgs) override;
                CODE startOmaDm(ICellularRadio::UpdateCb& stepCb) override;

                CODE setCellularMode(CELLULAR_MODES networks) override;

                CODE updateFumoLocal(int fd, UpdateCb& stepCb) override;
                CODE fumoLocalInject(int fd, UpdateCb& stepCb) override;
                CODE fumoLocalCleanup() override;
                CODE fumoLocalApply(UpdateCb& stepCb) override;

                CODE setUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION mode) override;
                CODE getUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION& mode) override;

                CODE disableVoiceSupport() override;
                CODE getVoiceSupport(bool& bVoiceEnabled, bool& bSmsOnly) override;

                CODE getSelectedBandsRaw(std::string& sRawBands) override;

            protected:
                enum class UE_USAGE_SETTING : uint8_t {
                    UNKNOWN_MODE = 0, // Unknown mode
                    MODE_1, // Voice centric mode
                    MODE_2 // Data centric mode
                };

                QuectelRadio(const std::string& sName, const std::string& sRadioPort);

                CODE getIsSimInserted(bool& bData) override;
                CODE getSimLockAttempts(int& iAttemptsPin, int& iAttemptsPuk) override;

                virtual CODE getServiceDomain(SERVICEDOMAIN& sd);
                virtual CODE convertToActiveBand(const std::string& sQuectelBand, ACTIVEBAND& band);

                virtual CODE uploadFile(int fd, const std::string& sTargetFilename, UpdateCb& stepCb);
                virtual CODE removeFile(const std::string& sTargetFilename);
                virtual CODE checkFile(bool& bFilePresent, const std::string& sTargetFilename);

                virtual CODE getUeUsageSetting(QuectelRadio::UE_USAGE_SETTING& us);
                virtual CODE convertToUeUsageSetting(const std::string& sSetting, QuectelRadio::UE_USAGE_SETTING& us);

                static bool isContainsSignChar(const std::string& str);

            private:
                // private variable to save old firmware versions during FOTA
                std::string m_sQuectelFirmware;

                static const size_t FILE_CHUNK_SIZE;
                static const std::string CMD_ABORT_UPLOAD;
                static const std::string VALUE_MTS_DELTA_NAME;
                static const std::string VALUE_MTS_DELTA_PATH;
                static const std::string VALUE_QNVR_DISABLE_VOICE;

                CODE startFileUpload(const std::string& sTargetFilename, size_t nBytes, uint16_t uRxTimeout = 5, bool bAckEnabled = false);
                CODE abortFileUpload();

                static inline void callNextStep(UpdateCb& stepCb, const char* csMessage);
                static inline void callNextStep(UpdateCb& stepCb, const std::string& sMessage);

                static uint16_t getQuectelChecksum(const void* data, size_t nBytes);
                static inline void updateQuectelChecksum(uint16_t& iChecksum, uint16_t iNewFragment);
                static inline uint16_t bytesToUint16(uint8_t high, uint8_t low);

                CODE fumoWaitUpgradeFinished(UpdateCb& stepCb);
                CODE fumoWaitNewFirmware(UpdateCb& stepCb);

                /// Parse error code if +QIND: "FOTA" received before the first attempt to flash the firmware
                std::string getFumoEarlyErrorCode(const std::string& sRadioInput);

                /// Get value from container by its index, use default value if not found. Non-template version.
                const std::string& getByIndex(const std::vector<std::string>& vector, size_t index, const std::string& defaultValue) {
                    if (index >= vector.size()) {
                        return defaultValue;
                    } else {
                        return vector[index];
                    }
                }
        };
    }
}

void MTS::IO::QuectelRadio::callNextStep(ICellularRadio::UpdateCb& stepCb, const char* csMessage) {
    if (stepCb) {
        stepCb(Json::Value(csMessage));
    }
}

void MTS::IO::QuectelRadio::callNextStep(ICellularRadio::UpdateCb& stepCb, const std::string& sMessage) {
    if (stepCb) {
        stepCb(Json::Value(sMessage));
    }
}

void MTS::IO::QuectelRadio::updateQuectelChecksum(uint16_t& iChecksum, uint16_t iNewFragment) {
    iChecksum = iChecksum ^ iNewFragment;
}

uint16_t MTS::IO::QuectelRadio::bytesToUint16(uint8_t high, uint8_t low) {
    uint16_t comboHigh = static_cast<uint16_t>(high << 8);  // explicit cast to prevent warnings
    uint16_t comboLow = low;
    return (comboHigh | comboLow);
}

#endif /* MTS_IO_QUECTELRADIO_H_ */