diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index 05d436f2e..02ab4884d 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -53,7 +53,10 @@ enum Capability { VoicesAsNumbers, VoicesMaxLength, MultiLangVoice, - ModelImage, + HasModelImage, + ModelImageNameLen, + ModelImageFilters, + ModelImageKeepExtn, CustomFunctions, SafetyChannelCustomFunction, LogicalSwitches, @@ -348,6 +351,8 @@ class Firmware virtual int getCapability(Capability) = 0; + virtual QString getCapabilityStr(Capability) = 0; + virtual QString getAnalogInputName(unsigned int index) = 0; virtual QTime getMaxTimerStart() = 0; diff --git a/companion/src/firmwares/er9x/er9xinterface.cpp b/companion/src/firmwares/er9x/er9xinterface.cpp index 2905a94a8..d92492380 100644 --- a/companion/src/firmwares/er9x/er9xinterface.cpp +++ b/companion/src/firmwares/er9x/er9xinterface.cpp @@ -334,3 +334,8 @@ int Er9xInterface::getCapability(Capability capability) return 0; } } + +QString Er9xInterface::getCapabilityStr(Capability capability) +{ + return QString(); +} diff --git a/companion/src/firmwares/er9x/er9xinterface.h b/companion/src/firmwares/er9x/er9xinterface.h index ec3d9cc1a..0e360e7d7 100644 --- a/companion/src/firmwares/er9x/er9xinterface.h +++ b/companion/src/firmwares/er9x/er9xinterface.h @@ -53,9 +53,11 @@ class Er9xInterface : public EEPROMInterface virtual int getSize(const GeneralSettings &settings); virtual bool isAvailable(PulsesProtocol proto, int port=0); - + virtual int getCapability(Capability capability); + virtual QString getCapabilityStr(Capability); + protected: RleFile * efile; diff --git a/companion/src/firmwares/ersky9x/ersky9xinterface.cpp b/companion/src/firmwares/ersky9x/ersky9xinterface.cpp index 5c2a35edb..c4627f44c 100644 --- a/companion/src/firmwares/ersky9x/ersky9xinterface.cpp +++ b/companion/src/firmwares/ersky9x/ersky9xinterface.cpp @@ -387,3 +387,8 @@ int Ersky9xInterface::getCapability(Capability capability) return 0; } } + +QString Ersky9xInterface::getCapabilityStr(Capability capability) +{ + return QString(); +} diff --git a/companion/src/firmwares/ersky9x/ersky9xinterface.h b/companion/src/firmwares/ersky9x/ersky9xinterface.h index c5aabdb07..27f0a532f 100644 --- a/companion/src/firmwares/ersky9x/ersky9xinterface.h +++ b/companion/src/firmwares/ersky9x/ersky9xinterface.h @@ -36,42 +36,44 @@ class Ersky9xInterface : public EEPROMInterface virtual ~Ersky9xInterface(); virtual const char * getName(); - - + + virtual unsigned long load(RadioData &, const uint8_t * eeprom, int size); virtual unsigned long loadBackup(RadioData &, const uint8_t * eeprom, int esize, int index); - + virtual int save(uint8_t * eeprom, const RadioData & radioData, uint8_t version=0, uint32_t variant=0) { return 0; } virtual int getSize(const ModelData &); - + virtual int getSize(const GeneralSettings & settings); virtual bool isAvailable(PulsesProtocol proto, int port=0); - + virtual int getCapability(Capability capability); + virtual QString getCapabilityStr(Capability); + protected: RleFile * efile; private: void appendTextElement(QDomDocument * qdoc, QDomElement * pe, QString name, QString value); - + void appendNumberElement(QDomDocument * qdoc, QDomElement * pe,QString name, int value, bool forceZeroWrite = false); - + void appendCDATAElement(QDomDocument * qdoc, QDomElement * pe,QString name, const char * data, int size); - + QDomElement getGeneralDataXML(QDomDocument * qdoc, Ersky9xGeneral * tgen); //parse out data to XML format - + QDomElement getModelDataXML(QDomDocument * qdoc, Ersky9xModelData_v11 * tmod, int modelNum, int mdver); //parse out data to XML format - + bool loadRadioSettingsDataXML(QDomDocument * qdoc, Ersky9xGeneral * tgen); // get data from XML - + template bool loadModelDataXML(QDomDocument * qdoc, ModelData * model, int modelNum, int stickMode); // get data from XML diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index bad3e96d3..b1c536f9e 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -407,6 +407,21 @@ void ModelData::convert(RadioDataConversionState & cstate) thrTraceSrc = RawSource(SOURCE_TYPE_STICK, (int)thrTraceSrc + 3).convert(cstate).index - 3; } + Firmware *fw = getCurrentFirmware(); + + if (fw->getCapability(HasModelImage) && bitmap[0] != '\0') { + QString filename = bitmap; + QFileInfo file(filename); + if (fw->getCapability(ModelImageKeepExtn) && file.suffix() == "") + filename.append(".bmp"); // bmp is assumed default for radios that do not store file extension + else if (!fw->getCapability(ModelImageKeepExtn) && file.suffix() != "") { + int posn = filename.indexOf("." % file.suffix(), + 1); + filename.remove(posn, filename.size() - posn + 1); + } + memset(bitmap, 0, CPN_MAX_BITMAP_LEN); + strncpy(bitmap, filename.toLatin1().data(), fw->getCapability(ModelImageNameLen)); + } + for (int i = 0; i < CPN_MAX_MODULES; i++) { moduleData[i].convert(cstate.withComponentIndex(i)); } diff --git a/companion/src/firmwares/modeldata.h b/companion/src/firmwares/modeldata.h index fcc529a4f..f6177daf7 100644 --- a/companion/src/firmwares/modeldata.h +++ b/companion/src/firmwares/modeldata.h @@ -80,6 +80,7 @@ enum TrainerMode { }; #define INPUT_NAME_LEN 4 +#define CPN_MAX_BITMAP_LEN 14 class ModelData { Q_DECLARE_TR_FUNCTIONS(ModelData) @@ -145,7 +146,7 @@ class ModelData { unsigned int rssiSource; RSSIAlarmData rssiAlarms; - char bitmap[10+1]; + char bitmap[CPN_MAX_BITMAP_LEN + 1]; unsigned int trainerMode; // TrainerMode diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index bc15ff7df..8da245c6b 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -447,8 +447,12 @@ int OpenTxFirmware::getCapability(::Capability capability) return 60; case Imperial: return 0; - case ModelImage: + case HasModelImage: return (board == BOARD_TARANIS_X9D || IS_TARANIS_PLUS(board) || board == BOARD_TARANIS_X9DP_2019 || IS_FAMILY_HORUS_OR_T16(board)); + case ModelImageNameLen: + return (IS_FAMILY_HORUS_OR_T16(board) ? 14 : 10); // including extension if saved and <= CPN_MAX_BITMAP_LEN + case ModelImageKeepExtn: + return (IS_FAMILY_HORUS_OR_T16(board) ? true : false); case HasBeeper: return false; case HasPxxCountry: @@ -748,6 +752,16 @@ int OpenTxFirmware::getCapability(::Capability capability) } } +QString OpenTxFirmware::getCapabilityStr(::Capability capability) +{ + switch (capability) { + case ModelImageFilters: + return IS_FAMILY_HORUS_OR_T16(board) ? "*.bmp|*.jpg|*.png" : "*.bmp"; + default: + return QString(); + } +} + QString OpenTxFirmware::getAnalogInputName(unsigned int index) { return Boards::getAnalogInputName(board, index); diff --git a/companion/src/firmwares/opentx/opentxinterface.h b/companion/src/firmwares/opentx/opentxinterface.h index b71ba9eb9..628456fd3 100644 --- a/companion/src/firmwares/opentx/opentxinterface.h +++ b/companion/src/firmwares/opentx/opentxinterface.h @@ -118,6 +118,8 @@ class OpenTxFirmware: public Firmware virtual int getCapability(Capability); + virtual QString getCapabilityStr(Capability); + virtual QString getAnalogInputName(unsigned int index); virtual QTime getMaxTimerStart(); diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 3817e1ea7..08f79559c 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -1036,62 +1036,51 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge ui->name->setValidator(new QRegExpValidator(rx, this)); ui->name->setMaxLength(firmware->getCapability(ModelName)); - if (firmware->getCapability(ModelImage)) { + if (firmware->getCapability(HasModelImage)) { + if (Boards::getCapability(board, Board::HasColorLcd)) { + ui->imagePreview->setFixedSize(QSize(192, 114)); + } + else { + ui->imagePreview->setFixedSize(QSize(64, 32)); + } QStringList items; items.append(""); QString path = g.profile[g.id()].sdPath(); path.append("/IMAGES/"); QDir qd(path); if (qd.exists()) { - QStringList filters; - if(IS_FAMILY_HORUS_OR_T16(board)) { - filters << "*.bmp" << "*.jpg" << "*.png"; - foreach ( QString file, qd.entryList(filters, QDir::Files) ) { - QFileInfo fi(file); - QString temp = fi.fileName(); - if (!items.contains(temp) && temp.length() <= 6 + 4) { - items.append(temp); - } - } - } - else { - filters << "*.bmp"; - foreach (QString file, qd.entryList(filters, QDir::Files)) { - QFileInfo fi(file); - QString temp = fi.completeBaseName(); - if (!items.contains(temp) && temp.length() <= 10 + 4) { - items.append(temp); - } - } + QStringList filters = firmware->getCapabilityStr(ModelImageFilters).split("|"); + foreach ( QString file, qd.entryList(filters, QDir::Files) ) { + QFileInfo fi(file); + QString temp; + if (firmware->getCapability(ModelImageKeepExtn)) + temp = fi.fileName(); + else + temp = fi.completeBaseName(); + if (!items.contains(temp) && temp.length() <= firmware->getCapability(ModelImageNameLen)) + items.append(temp); } } if (!items.contains(model.bitmap)) { items.append(model.bitmap); } - items.sort(); + items.sort(Qt::CaseInsensitive); foreach (QString file, items) { ui->image->addItem(file); if (file == model.bitmap) { ui->image->setCurrentIndex(ui->image->count() - 1); - QString fileName = path; - fileName.append(model.bitmap); - if (!IS_FAMILY_HORUS_OR_T16(board)) - fileName.append(".bmp"); - QImage image(fileName); - if (image.isNull() && !IS_FAMILY_HORUS_OR_T16(board)) { - fileName = path; + if (!file.isEmpty()) { + QString fileName = path; fileName.append(model.bitmap); - fileName.append(".BMP"); - image.load(fileName); - } - if (!image.isNull()) { - if (IS_FAMILY_HORUS_OR_T16(board)) { - ui->imagePreview->setFixedSize(QSize(192, 114)); - ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(192, 114))); + if (!firmware->getCapability(ModelImageKeepExtn)) { + QString extn = firmware->getCapabilityStr(ModelImageFilters); + if (extn.size() > 0) + extn.remove(0, 1); // remove * + fileName.append(extn); } - else { - ui->imagePreview->setFixedSize(QSize(64, 32)); - ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(64, 32))); + QImage image(fileName); + if (!image.isNull()) { + ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(ui->imagePreview->size()))); } } } @@ -1334,36 +1323,23 @@ void SetupPanel::on_name_editingFinished() void SetupPanel::on_image_currentIndexChanged(int index) { if (!lock) { - Board::Type board = firmware->getBoard(); - strncpy(model->bitmap, ui->image->currentText().toLatin1(), 10); - QString path = g.profile[g.id()].sdPath(); - path.append("/IMAGES/"); - QDir qd(path); - if (qd.exists()) { - QString fileName=path; - fileName.append(model->bitmap); - if (!IS_FAMILY_HORUS_OR_T16(board)) - fileName.append(".bmp"); - QImage image(fileName); - if (image.isNull() && !IS_FAMILY_HORUS_OR_T16(board)) { - fileName=path; - fileName.append(model->bitmap); - fileName.append(".BMP"); - image.load(fileName); + memset(model->bitmap, 0, CPN_MAX_BITMAP_LEN); + strncpy(model->bitmap, ui->image->currentText().toLatin1(), CPN_MAX_BITMAP_LEN); + if (model->bitmap[0] != '\0') { + QString path = g.profile[g.id()].sdPath(); + path.append("/IMAGES/"); + path.append(model->bitmap); + if (!firmware->getCapability(ModelImageKeepExtn)) { + QString extn = firmware->getCapabilityStr(ModelImageFilters); + if (extn.size() > 0) + extn.remove(0, 1); // remove * + path.append(extn); } - if (!image.isNull()) { - if (IS_FAMILY_HORUS_OR_T16(board)) { - ui->imagePreview->setFixedSize(QSize(192, 114)); - ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(192, 114))); - } - else { - ui->imagePreview->setFixedSize(QSize(64, 32)); - ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(64, 32))); - } - } - else { + QImage image(path); + if (!image.isNull()) + ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(ui->imagePreview->size()))); + else ui->imagePreview->clear(); - } } else { ui->imagePreview->clear(); diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index 6dfb42c65..1cf0140e3 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -313,7 +313,7 @@ QString MultiModelPrinter::printSetup() if (!IS_FAMILY_HORUS_OR_T16(firmware->getBoard())) { ROWLABELCOMPARECELL(tr("EEprom Size"), 0, modelPrinter->printEEpromSize(), 0); } - if (firmware->getCapability(ModelImage)) { + if (firmware->getCapability(HasModelImage)) { ROWLABELCOMPARECELL(tr("Model Image"), 0, model->bitmap, 0); } ROWLABELCOMPARECELL(tr("Throttle"), 0, modelPrinter->printThrottle(), 0);