Safeguard against writing a wrong firmware to a different hardware version

This commit is contained in:
Jan Käberich 2023-02-17 17:30:22 +01:00
parent 0fd9d35a5d
commit 8ac9707242
3 changed files with 27 additions and 3 deletions

View File

@ -59,7 +59,7 @@ void FirmwareUpdateDialog::on_bStart_clicked()
} }
char header[24]; char header[24];
file->read(header, sizeof(header)); file->read(header, sizeof(header));
if(strncmp(header, "VNA!", 4)) { if(strncmp(header, dev->getFirmwareMagicString().toStdString().c_str(), 4)) {
abortWithError("Invalid magic header constant"); abortWithError("Invalid magic header constant");
return; return;
} }

View File

@ -108,6 +108,7 @@ LibreVNADriver::LibreVNADriver()
connected = false; connected = false;
skipOwnPacketHandling = false; skipOwnPacketHandling = false;
SApoints = 0; SApoints = 0;
hardwareVersion = 0;
setSynchronization(Synchronization::Disabled, false); setSynchronization(Synchronization::Disabled, false);
auto manual = new QAction("Manual Control"); auto manual = new QAction("Manual Control");
@ -182,7 +183,7 @@ std::set<DeviceDriver::Flag> LibreVNADriver::getFlags()
QString LibreVNADriver::getStatus() QString LibreVNADriver::getStatus()
{ {
QString ret; QString ret;
ret.append("HW Rev."); ret.append("HW ");
ret.append(info.hardware_version); ret.append(info.hardware_version);
ret.append(" FW "+info.firmware_version); ret.append(" FW "+info.firmware_version);
ret.append(" Temps: "+QString::number(lastStatus.temp_source)+"°C/"+QString::number(lastStatus.temp_LO1)+"°C/"+QString::number(lastStatus.temp_MCU)+"°C"); ret.append(" Temps: "+QString::number(lastStatus.temp_source)+"°C/"+QString::number(lastStatus.temp_LO1)+"°C/"+QString::number(lastStatus.temp_MCU)+"°C");
@ -555,8 +556,9 @@ void LibreVNADriver::handleReceivedPacket(const Protocol::PacketInfo &packet)
} }
} }
hardwareVersion = packet.info.hardware_version;
info.firmware_version = QString::number(packet.info.FW_major)+"."+QString::number(packet.info.FW_minor)+"."+QString::number(packet.info.FW_patch); info.firmware_version = QString::number(packet.info.FW_major)+"."+QString::number(packet.info.FW_minor)+"."+QString::number(packet.info.FW_patch);
info.hardware_version = QString::number(packet.info.hardware_version)+QString(packet.info.HW_Revision); info.hardware_version = hardwareVersionToString(packet.info.hardware_version)+" Rev."+QString(packet.info.HW_Revision);
info.supportedFeatures = { info.supportedFeatures = {
Feature::VNA, Feature::VNAFrequencySweep, Feature::VNALogSweep, Feature::VNAPowerSweep, Feature::VNAZeroSpan, Feature::VNA, Feature::VNAFrequencySweep, Feature::VNALogSweep, Feature::VNAPowerSweep, Feature::VNAZeroSpan,
Feature::Generator, Feature::Generator,
@ -658,11 +660,29 @@ void LibreVNADriver::updateIFFrequencies()
SendPacket(p); SendPacket(p);
} }
QString LibreVNADriver::hardwareVersionToString(uint8_t version)
{
switch(version) {
case 1: return "1";
case 255: return "PT";
default: return "Unknown";
}
}
unsigned int LibreVNADriver::getMaxAmplitudePoints() const unsigned int LibreVNADriver::getMaxAmplitudePoints() const
{ {
return limits_maxAmplitudePoints; return limits_maxAmplitudePoints;
} }
QString LibreVNADriver::getFirmwareMagicString()
{
switch(hardwareVersion) {
case 1: return "VNA!";
case 255: return "VNPT";
default: return "XXXX";
}
}
bool LibreVNADriver::sendWithoutPayload(Protocol::PacketType type, std::function<void(TransmissionResult)> cb) bool LibreVNADriver::sendWithoutPayload(Protocol::PacketType type, std::function<void(TransmissionResult)> cb)
{ {
Protocol::PacketInfo p; Protocol::PacketInfo p;

View File

@ -182,6 +182,8 @@ public:
unsigned int getMaxAmplitudePoints() const; unsigned int getMaxAmplitudePoints() const;
QString getFirmwareMagicString();
signals: signals:
void receivedAnswer(const LibreVNADriver::TransmissionResult &result); void receivedAnswer(const LibreVNADriver::TransmissionResult &result);
void receivedPacket(const Protocol::PacketInfo& packet); void receivedPacket(const Protocol::PacketInfo& packet);
@ -190,10 +192,12 @@ protected slots:
void handleReceivedPacket(const Protocol::PacketInfo& packet); void handleReceivedPacket(const Protocol::PacketInfo& packet);
protected: protected:
void updateIFFrequencies(); void updateIFFrequencies();
QString hardwareVersionToString(uint8_t version);
bool connected; bool connected;
QString serial; QString serial;
Info info; Info info;
uint8_t hardwareVersion;
unsigned int limits_maxAmplitudePoints; unsigned int limits_maxAmplitudePoints;
Protocol::DeviceStatusV1 lastStatus; Protocol::DeviceStatusV1 lastStatus;