Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
191 changes: 129 additions & 62 deletions flasher.cpp

Large diffs are not rendered by default.

54 changes: 37 additions & 17 deletions flasher.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ class Flasher : public QObject {
*/
bool CollectBoardInfo();

/*!
* \brief Method used to collect security data
* \return True if data is successfully collected, false otherwise
*/
bool CollectSecurityDataFromBoard();

/*!
* \brief Method used to flash from the console
* \return Flashing information
Expand Down Expand Up @@ -119,11 +125,11 @@ class Flasher : public QObject {
bool IsReadProtectionEnabled() const;

/*!
* \brief Open firmware file
* \param file_path - File(firmware) path
* \brief Open file
* \param file_path - File path
* \return True if file is successfully opened, false otherwise
*/
bool OpenFirmwareFile(const QString& file_path);
bool OpenFile(const QString& file_path);

/*!
* \brief Send enter bootloader command
Expand All @@ -149,10 +155,10 @@ class Flasher : public QObject {
void SetState(const FlasherStates& state);

/*!
* \brief Set selected firmware version
* \param selected_firmware_version - Firmware version that will be set
* \brief Set selected file version
* \param selected_file_version - File version that will be set
*/
void SetSelectedFirmwareVersion(const QString& selected_firmware_version);
void SetSelectedFileVersion(const QString& selected_file_version);

/*!
* \brief Try to connect to the board over console
Expand All @@ -162,9 +168,9 @@ class Flasher : public QObject {
/*!
* \brief Update progress bar
* \param sent_size - Size that is sent
* \param firmware_size - Firmware size
* \param total_size - Total size
*/
void UpdateProgressBar(const quint64& sent_size, const quint64& firmware_size);
void UpdateProgressBar(const quint64& sent_size, const quint64& total_size);

signals:
/*!
Expand Down Expand Up @@ -227,6 +233,11 @@ class Flasher : public QObject {
*/
void DisableAllButtons();

/*!
* \brief Disable all buttons signal
*/
void DisableBrowseFileButton();

/*!
* \brief Enable connect button, connect button is enabled and disconnect button disabled
*/
Expand All @@ -243,10 +254,10 @@ class Flasher : public QObject {
void EnableLoadButton();

/*!
* \brief Set firmware list signal
* \brief Set file versions list signal
* \param product_info - Json array that contains product information
*/
void SetFirmwareList(const QJsonArray& product_info);
void SetFileVersionsList(const QJsonArray& product_info);

public slots:
/*!
Expand Down Expand Up @@ -275,20 +286,23 @@ class Flasher : public QObject {
private:
QString board_id_; //!< Board ID
QJsonObject board_info_; //!< Board information
QJsonObject client_security_data_; //!< Security data client
QJsonObject server_security_data_; //!< Security data server
QJsonObject bl_version_; //!< Bootloader version
QJsonObject fw_version_; //!< Firmware version
QJsonArray product_info_; //!< Product information
QString selected_firmware_version_; //!< Selected firmware version
QString firmware_file_source_; //!< Firmware file source (URL or Server)
QString selected_file_version_; //!< Selected file version
QString file_source_; //!< File source (URL or Server)
QFile config_file_; //!< Configuration file
QFile firmware_file_; //!< Firmware file
qint64 signature_size_{0}; //!< Firmware signature size
QFile file_to_flash_; //!< File to flash
qint64 signature_size_{0}; //!< Signature size
qint64 packet_size_{0}; //!< Size of the packets that will be used to send data for flashing
quint8 last_progress_percentage_{0}; //!< Last progress percentage
bool is_bootloader_ {false}; //!< Is bootloader detected flag
bool is_bootloader_expected_ {false}; //!< Is bootloader expected after board reset
bool is_read_protection_enabled_ {false}; //!< Is read protection enabled flag
bool is_timer_started_ {false}; //!< Is timer started flag
bool is_firmware_downloaded_{false}; //!< Is firmware downloaded flag
bool is_file_downloaded_{false}; //!< Is file downloaded flag
bool is_download_success_{false}; //!< Is download successfully done
bool is_signature_warning_enabled_{false}; //!< Is signature warning enabled
QByteArray file_content_; //!< File content
Expand Down Expand Up @@ -329,9 +343,9 @@ class Flasher : public QObject {
void CreateDefaultConfigFile();

/*!
* \brief Method used to donwload firmware file from URL
* \brief Method used to donwload file from URL
*/
void DownloadFirmwareFromUrl();
void DownloadFileFromUrl();

/*!
* \brief Method used to perform flash process
Expand Down Expand Up @@ -394,6 +408,12 @@ class Flasher : public QObject {
*/
bool SendMessage(const char *data, qint64 length, int timeout_ms);

/*!
* \brief Method used to send server security data to the bootloader
* \return Flashing info structure
*/
FlashingInfo SendServerSecurityData();

/*!
* \brief Method used to send signature to the bootloader
* \return Flashing info structure
Expand Down
7 changes: 4 additions & 3 deletions flasher_states.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,11 @@ enum class FlasherStates {
kConnected,
kDisconnected,
kServerDataExchange,
kBrowseFirmware,
kBrowseFile,
kCheckBoardInfo,
kLoadFirmwareFile,
kDownloadFirmwareFileFromUrl,
kLoadFile,
kDownloadFileFromUrl,
kSendServerSecurityData,
kCheckSignature,
kSendSignature,
kVerifyFlasher,
Expand Down
4 changes: 2 additions & 2 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,11 @@ int main(int argc, char *argv[]) {
}

} else if (0 == QString::compare("flash", action, Qt::CaseInsensitive)) {
if (flasher->OpenFirmwareFile(file_path) && flasher->SetLocalFileContent()) {
if (flasher->OpenFile(file_path) && flasher->SetLocalFileContent()) {
flasher::FlashingInfo flashing_info = flasher->ConsoleFlash();
qInfo() << flashing_info.description;
} else {
qInfo() << "Open firmware file error";
qInfo() << "Open file error";
}
} else {
qInfo() << "Select flash or erase";
Expand Down
45 changes: 25 additions & 20 deletions mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,11 @@ MainWindow::MainWindow(std::shared_ptr<flasher::Flasher> flasher) :

if (is_bootloader) {
ui_.enterBootloader->setText("Exit bootloader");
ui_.browseFirmware->setEnabled(true);
ui_.browseFile->setEnabled(true);
ui_.protectButton->setEnabled(true);
} else {
ui_.enterBootloader->setText("Enter bootloader");
ui_.browseFirmware->setEnabled(false);
ui_.browseFile->setEnabled(false);
ui_.protectButton->setEnabled(false);
}
});
Expand All @@ -97,8 +97,9 @@ MainWindow::MainWindow(std::shared_ptr<flasher::Flasher> flasher) :
});

connect(flasher_.get(), &flasher::Flasher::DisableAllButtons, this, &MainWindow::DisableAllButtons);
connect(flasher_.get(), &flasher::Flasher::EnableLoadButton, this, [&] { ui_.loadFirmware->setEnabled(true); });
connect(flasher_.get(), &flasher::Flasher::SetFirmwareList, this, &MainWindow::SetFirmwareList);
connect(flasher_.get(), &flasher::Flasher::DisableBrowseFileButton, this, &MainWindow::DisableBrowseFileButton);
connect(flasher_.get(), &flasher::Flasher::EnableLoadButton, this, [&] { ui_.loadFile->setEnabled(true); });
connect(flasher_.get(), &flasher::Flasher::SetFileVersionsList, this, &MainWindow::SetFileList);
}

MainWindow::~MainWindow() = default;
Expand All @@ -110,22 +111,26 @@ void MainWindow::ClearProgress() {

void MainWindow::DisableAllButtons() {
ui_.enterBootloader->setEnabled(false);
ui_.availableFirmware->setEnabled(false);
ui_.browseFirmware->setEnabled(false);
ui_.loadFirmware->setEnabled(false);
ui_.availableFileVersions->setEnabled(false);
ui_.browseFile->setEnabled(false);
ui_.loadFile->setEnabled(false);
ui_.protectButton->setEnabled(false);
}

void MainWindow::SetFirmwareList(const QJsonArray& product_info) {
ui_.availableFirmware->clear();
void MainWindow::DisableBrowseFileButton() {
ui_.browseFile->setEnabled(false);
}

void MainWindow::SetFileList(const QJsonArray& product_info) {
ui_.availableFileVersions->clear();
foreach (const QJsonValue& value, product_info) {
QJsonObject obj = value.toObject();
ui_.availableFirmware->addItem(obj["fw_version"].toString());
ui_.availableFileVersions->addItem(obj["file_version"].toString());
}

ui_.availableFirmware->show();
ui_.availableFirmware->setEnabled(true);
ui_.loadFirmware->setEnabled(true);
ui_.availableFileVersions->show();
ui_.availableFileVersions->setEnabled(true);
ui_.loadFile->setEnabled(true);
}

void MainWindow::ConnectActions() {
Expand Down Expand Up @@ -162,22 +167,22 @@ void MainWindow::EnableDisconnectButton() {
void MainWindow::InitActions() {
EnableConnectButton();
ui_.actionQuit->setEnabled(true);
ui_.availableFirmware->hide();
ui_.availableFileVersions->hide();
}

void MainWindow::ShowStatusMessage(const QString& message) {
ui_.statusLabel->setText(message);
}

void MainWindow::on_browseFirmware_clicked() {
flasher_->SetState(flasher::FlasherStates::kBrowseFirmware);
void MainWindow::on_browseFile_clicked() {
flasher_->SetState(flasher::FlasherStates::kBrowseFile);
}

void MainWindow::on_loadFirmware_clicked() {
flasher_->SetSelectedFirmwareVersion(ui_.availableFirmware->currentText());
ui_.loadFirmware->setEnabled(false);
void MainWindow::on_loadFile_clicked() {
flasher_->SetSelectedFileVersion(ui_.availableFileVersions->currentText());
ui_.loadFile->setEnabled(false);
ui_.progressBar->show();
flasher_->SetState(flasher::FlasherStates::kLoadFirmwareFile);
flasher_->SetState(flasher::FlasherStates::kLoadFile);
}

void MainWindow::on_enterBootloader_clicked() {
Expand Down
17 changes: 11 additions & 6 deletions mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,14 @@ class MainWindow : public QMainWindow {

private slots:
/*!
* \brief on_browseFirmware_clicked
* \brief on_browseFile_clicked
*/
void on_browseFirmware_clicked();
void on_browseFile_clicked();

/*!
* \brief on_loadFirmware_clicked
* \brief on_loadFile_clicked
*/
void on_loadFirmware_clicked();
void on_loadFile_clicked();

/*!
* \brief on_enterBootloader_clicked
Expand Down Expand Up @@ -111,6 +111,11 @@ class MainWindow : public QMainWindow {
*/
void DisableAllButtons();

/*!
* \brief Method used to disable browse file button
*/
void DisableBrowseFileButton();

/*!
* \brief Method used to enable connect button and disable disconnect button
*/
Expand All @@ -133,10 +138,10 @@ class MainWindow : public QMainWindow {
void ShowStatusMessage(const QString& message);

/*!
* \brief Method used to set firmware list
* \brief Method used to set file list
* \param product_info - Json array that presents product information
*/
void SetFirmwareList(const QJsonArray& product_info);
void SetFileList(const QJsonArray& product_info);
};

} // namespace gui
Expand Down
8 changes: 4 additions & 4 deletions mainwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="browseFirmware">
<widget class="QPushButton" name="browseFile">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
Expand All @@ -135,14 +135,14 @@
</widget>
</item>
<item>
<widget class="QComboBox" name="availableFirmware">
<widget class="QComboBox" name="availableFileVersions">
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="loadFirmware">
<widget class="QPushButton" name="loadFile">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
Expand Down Expand Up @@ -197,7 +197,7 @@
<x>0</x>
<y>0</y>
<width>900</width>
<height>22</height>
<height>19</height>
</rect>
</property>
<widget class="QMenu" name="menuCalls">
Expand Down
20 changes: 11 additions & 9 deletions socket_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,17 +263,18 @@ bool SocketClient::ReceiveProductInfo(QJsonObject board_info, QJsonArray& produc
return success;
}

bool SocketClient::DownloadFirmwareFile(QJsonObject board_info, QString fw_version, QByteArray& firmware_file) {
bool SocketClient::DownloadFile(const QJsonObject board_info, const QJsonObject client_security_data, const QString file_version, QJsonObject& server_security_data, QByteArray& file) {

qint32 file_crc;

bool success = Connect();

if (success) {
QJsonObject packet_object;
packet_object.insert("header", kHeaderClientDownloadFirmware);
packet_object.insert("header", kHeaderClientDownloadFile);
packet_object.insert("board_info", board_info);
packet_object.insert("fw_version", fw_version);
packet_object.insert("file_version", file_version);
packet_object.insert("client_security_data", client_security_data);

QJsonDocument json_data;
json_data.setObject(packet_object);
Expand All @@ -293,10 +294,11 @@ bool SocketClient::DownloadFirmwareFile(QJsonObject board_info, QString fw_versi
QJsonDocument json_data = QJsonDocument::fromJson(data);
QJsonObject packet_object = json_data.object();

if (packet_object.value("header").toString() == kHeaderServerDownloadFirmware) {
if (packet_object.value("header").toString() == kHeaderServerDownloadFile) {

file_crc = packet_object.value("file_crc").toInt();
file_size_ = packet_object.value("file_size").toInt();
server_security_data = packet_object.value("server_security_data").toObject();

} else {
success = false;
Expand All @@ -305,17 +307,17 @@ bool SocketClient::DownloadFirmwareFile(QJsonObject board_info, QString fw_versi

if (success) {
emit_progress = true;
success = RequestData(); // request firmware binary file
success = RequestData(); // request file

if (success) {
success = ReadAll(firmware_file);
success = ReadAll(file);

if (success) {

const uint8_t *data = reinterpret_cast<const uint8_t *>(firmware_file.data());
qint32 crc = crc::CalculateCrc32(data, firmware_file.size(), false, false);
const uint8_t *data = reinterpret_cast<const uint8_t *>(file.data());
qint32 crc = crc::CalculateCrc32(data, file.size(), false, false);

if ((firmware_file.size() != file_size_) || (crc != file_crc)) {
if ((file.size() != file_size_) || (crc != file_crc)) {
success = false;
}
}
Expand Down
Loading