7#include <QtCore/QJsonArray>
8#include <QtCore/QJsonDocument>
9#include <QtCore/QJsonObject>
22 qCDebug(QGCSerialPortInfoLog) <<
this;
28 qCDebug(QGCSerialPortInfoLog) <<
this;
33 qCDebug(QGCSerialPortInfoLog) <<
this;
36bool QGCSerialPortInfo::_loadJsonData()
39 return _jsonDataValid;
48 qCWarning(QGCSerialPortInfoLog) <<
"Internal Error:" <<
errorString;
52 static const QList<JsonHelper::KeyValidateInfo> rootKeyInfoList = {
53 { _jsonBoardInfoKey, QJsonValue::Array,
true },
54 { _jsonBoardDescriptionFallbackKey, QJsonValue::Array,
true },
55 { _jsonBoardManufacturerFallbackKey, QJsonValue::Array,
true },
62 static const QList<JsonHelper::KeyValidateInfo> boardKeyInfoList = {
63 { _jsonVendorIDKey, QJsonValue::Double,
true },
64 { _jsonProductIDKey, QJsonValue::Double,
true },
65 { _jsonBoardClassKey, QJsonValue::String,
true },
66 { _jsonNameKey, QJsonValue::String,
true },
68 const QJsonArray rgBoardInfo = json[_jsonBoardInfoKey].toArray();
69 for (
const QJsonValue &jsonValue : rgBoardInfo) {
70 if (!jsonValue.isObject()) {
71 qCWarning(QGCSerialPortInfoLog) <<
"Entry in boardInfo array is not object";
75 const QJsonObject boardObject = jsonValue.toObject();
81 const BoardInfo_t boardInfo = {
82 boardObject[_jsonVendorIDKey].toInt(),
83 boardObject[_jsonProductIDKey].toInt(),
84 _boardClassStringToType(boardObject[_jsonBoardClassKey].toString()),
85 boardObject[_jsonNameKey].toString()
88 qCWarning(QGCSerialPortInfoLog) <<
"Bad board class" << boardObject[_jsonBoardClassKey].toString();
92 _boardInfoList.append(boardInfo);
95 static const QList<JsonHelper::KeyValidateInfo> fallbackKeyInfoList = {
96 { _jsonRegExpKey, QJsonValue::String,
true },
97 { _jsonBoardClassKey, QJsonValue::String,
true },
98 { _jsonAndroidOnlyKey, QJsonValue::Bool,
false },
100 const QJsonArray rgBoardDescriptionFallback = json[_jsonBoardDescriptionFallbackKey].toArray();
101 for (
const QJsonValue &jsonValue : rgBoardDescriptionFallback) {
102 if (!jsonValue.isObject()) {
103 qCWarning(QGCSerialPortInfoLog) <<
"Entry in boardFallback array is not object";
107 const QJsonObject fallbackObject = jsonValue.toObject();
113 const BoardRegExpFallback_t boardFallback = {
114 fallbackObject[_jsonRegExpKey].toString(),
115 _boardClassStringToType(fallbackObject[_jsonBoardClassKey].toString()),
116 fallbackObject[_jsonAndroidOnlyKey].toBool(
false)
119 qCWarning(QGCSerialPortInfoLog) <<
"Bad board class" << fallbackObject[_jsonBoardClassKey].toString();
123 _boardDescriptionFallbackList.append(boardFallback);
126 const QJsonArray rgBoardManufacturerFallback = json[_jsonBoardManufacturerFallbackKey].toArray();
127 for (
const QJsonValue &jsonValue : rgBoardManufacturerFallback) {
128 if (!jsonValue.isObject()) {
129 qCWarning(QGCSerialPortInfoLog) <<
"Entry in boardFallback array is not object";
133 const QJsonObject fallbackObject = jsonValue.toObject();
139 const BoardRegExpFallback_t boardFallback = {
140 fallbackObject[_jsonRegExpKey].toString(),
141 _boardClassStringToType(fallbackObject[_jsonBoardClassKey].toString()),
142 fallbackObject[_jsonAndroidOnlyKey].toBool(
false)
145 qCWarning(QGCSerialPortInfoLog) <<
"Bad board class" << fallbackObject[_jsonBoardClassKey].toString();
149 _boardManufacturerFallbackList.append(boardFallback);
152 _jsonDataValid =
true;
159 static const BoardClassString2BoardType_t rgBoardClass2BoardType[
BoardTypeUnknown] = {
166 for (
const BoardClassString2BoardType_t &board : rgBoardClass2BoardType) {
167 if (boardClass == board.classString) {
168 return board.boardType;
179 if (!_loadJsonData()) {
187 for (
const BoardInfo_t &boardInfo : _boardInfoList) {
189 boardType = boardInfo.boardType;
190 name = boardInfo.name;
197 for (
const BoardRegExpFallback_t &boardFallback : _boardDescriptionFallbackList) {
198 if (
description().contains(QRegularExpression(boardFallback.regExp, QRegularExpression::CaseInsensitiveOption))) {
200 if (boardFallback.androidOnly) {
204 boardType = boardFallback.boardType;
205 name = _boardTypeToString(boardType);
210 for (
const BoardRegExpFallback_t &boardFallback : _boardManufacturerFallbackList) {
211 if (
manufacturer().contains(QRegularExpression(boardFallback.regExp, QRegularExpression::CaseInsensitiveOption))) {
213 if (boardFallback.androidOnly) {
217 boardType = boardFallback.boardType;
218 name = _boardTypeToString(boardType);
226QString QGCSerialPortInfo::_boardTypeToString(BoardType_t boardType)
230 return QStringLiteral(
"Pixhawk");
232 return QStringLiteral(
"SiK Radio");
234 return QStringLiteral(
"OpenPilot");
236 return QStringLiteral(
"RTK GPS");
239 return QStringLiteral(
"Unknown");
245 QList<QGCSerialPortInfo> list;
254 list << *qgcPortInfo;
273 return description().contains(QStringLiteral(
"CubeBlack"));
279 static const QList<QString> systemPortLocations = {
280 QStringLiteral(
"tty.MALS"),
281 QStringLiteral(
"tty.SOC"),
282 QStringLiteral(
"tty.Bluetooth-Incoming-Port"),
283 QStringLiteral(
"tty.usbserial"),
284 QStringLiteral(
"tty.usbmodem")
286 for (
const QString &systemPortLocation : systemPortLocations) {
308 static const QList<BoardType_t> flashable = {
313 return flashable.contains(boardType);
#define QGC_LOGGING_CATEGORY(name, categoryStr)
bool isBootloader() const
static bool isSystemPort(const QSerialPortInfo &port)
bool getBoardInfo(BoardType_t &boardType, QString &name) const
static QList< QGCSerialPortInfo > availablePorts()
Override of QSerialPortInfo::availablePorts.
Provides information about existing serial ports.
quint16 productIdentifier() const
QString manufacturer() const
static QList< QSerialPortInfo > availablePorts()
QString systemLocation() const
QString description() const
quint16 vendorIdentifier() const
Provides functions to access serial ports.
QJsonObject openInternalQGCJsonFile(const QString &jsonFilename, const QString &expectedFileType, int minSupportedVersion, int maxSupportedVersion, int &version, QString &errorString)
returned error string if validation fails
bool validateKeys(const QJsonObject &jsonObject, const QList< KeyValidateInfo > &keyInfo, QString &errorString)