aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2022-05-24 21:00:16 -1200
committerClyne Sullivan <clyne@bitgloo.com>2022-05-24 21:00:16 -1200
commitdff847ff4455e7b8c5123167a7d01afe7c45f585 (patch)
tree1c1fa04635a3c248d07fde4dce8857885ca23952
parent5846bda565dc100fc73550d937ec910bd29532f3 (diff)
built-in openocd support
-rw-r--r--.gitignore1
-rw-r--r--openocd.cfg2
-rw-r--r--source/gui_help.cpp113
-rw-r--r--source/main.cpp36
4 files changed, 120 insertions, 32 deletions
diff --git a/.gitignore b/.gitignore
index 9c562a6..b23a6a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
build/
+openocd/
imgui.ini
stmdspgui
stmdspgui.exe
diff --git a/openocd.cfg b/openocd.cfg
new file mode 100644
index 0000000..33f2c52
--- /dev/null
+++ b/openocd.cfg
@@ -0,0 +1,2 @@
+source [find interface/stlink.cfg]
+source [find target/stm32l4x.cfg] \ No newline at end of file
diff --git a/source/gui_help.cpp b/source/gui_help.cpp
new file mode 100644
index 0000000..a17d9fa
--- /dev/null
+++ b/source/gui_help.cpp
@@ -0,0 +1,113 @@
+#include "imgui.h"
+#include "ImGuiFileDialog.h"
+
+#include <cstdlib>
+#include <iostream>
+#include <string>
+#include <thread>
+
+void log(const std::string& str);
+
+static bool showDownloadFirmware = false;
+static bool showHelp = false;
+static std::string firmwareFile;
+
+static void helpDownloadThread();
+
+void helpRenderMenu()
+{
+ if (ImGui::BeginMenu("Help")) {
+ if (ImGui::MenuItem("Open wiki...")) {
+#ifdef STMDSP_WIN32
+ system("start "
+#else
+ system("xdg-open "
+#endif
+ "https://code.bitgloo.com/clyne/stmdspgui/wiki");
+ }
+
+ if (ImGui::MenuItem("Download firmware...")) {
+ showDownloadFirmware = true;
+ }
+
+ ImGui::Separator();
+ if (ImGui::MenuItem("About")) {
+ showHelp = true;
+ }
+
+ ImGui::EndMenu();
+ }
+}
+
+void helpRenderDialog()
+{
+ if (showDownloadFirmware) {
+ showDownloadFirmware = false;
+ ImGuiFileDialog::Instance()->OpenModal(
+ "ChooseFileFW", "Choose Firmware File", ".hex", ".");
+ }
+
+ if (ImGuiFileDialog::Instance()->Display("ChooseFileFW",
+ ImGuiWindowFlags_NoCollapse,
+ ImVec2(460, 540)))
+ {
+ if (ImGuiFileDialog::Instance()->IsOk()) {
+ firmwareFile = ImGuiFileDialog::Instance()->GetFilePathName();
+#ifdef STMDSP_WIN32
+ size_t i = 0;
+ while ((i = firmwareFile.find('\\', i)) != std::string::npos) {
+ firmwareFile.replace(i, 1, "\\\\");
+ i += 2;
+ }
+#endif
+
+ std::thread(helpDownloadThread).detach();
+ }
+
+ ImGuiFileDialog::Instance()->Close();
+ }
+
+ if (showHelp) {
+ ImGui::Begin("help");
+
+ ImGui::Text("stmdspgui\nCompiled on " __DATE__ ".\n\nWritten by Clyne Sullivan.\n");
+
+ if (ImGui::Button("Close")) {
+ showHelp = false;
+ }
+
+ ImGui::End();
+ }
+
+ if (!firmwareFile.empty()) {
+ ImGui::Begin("Downloading");
+
+ ImGui::Text("Downloading firmware to device...");
+
+ ImGui::End();
+ }
+}
+
+void helpDownloadThread()
+{
+ std::string command (
+#ifdef STMDSP_WIN32
+ "openocd\\bin\\openocd.exe"
+#else
+ "openocd"
+#endif
+ " -f openocd.cfg -c \"program $0 reset exit\"");
+
+ command.replace(command.find("$0"), 2, firmwareFile);
+
+ std::cout << "Run: " << command << std::endl;
+
+ if (system(command.c_str()) == 0) {
+ log("Programming finished.");
+ } else {
+ log("Error while programming device!");
+ }
+
+ firmwareFile.clear();
+}
+
diff --git a/source/main.cpp b/source/main.cpp
index b5514e4..aa9f7c4 100644
--- a/source/main.cpp
+++ b/source/main.cpp
@@ -37,6 +37,8 @@ bool guiInitialize();
bool guiHandleEvents();
void guiShutdown();
void guiRender();
+void helpRenderMenu();
+void helpRenderDialog();
void log(const std::string& str);
@@ -90,8 +92,6 @@ void log(const std::string& str)
template<bool first>
void renderWindow()
{
- static bool showHelp = false;
-
// Start the new window frame and render the menu bar.
ImGui_ImplOpenGL2_NewFrame();
ImGui_ImplSDL2_NewFrame();
@@ -101,24 +101,7 @@ void renderWindow()
fileRenderMenu();
deviceRenderMenu();
codeRenderMenu();
-
- if (ImGui::BeginMenu("Help")) {
- if (ImGui::MenuItem("Open wiki...")) {
-#ifdef STMDSP_WIN32
- system("start "
-#else
- system("xdg-open "
-#endif
- "https://code.bitgloo.com/clyne/stmdspgui/wiki");
- }
-
- ImGui::Separator();
- if (ImGui::MenuItem("About")) {
- showHelp = true;
- }
-
- ImGui::EndMenu();
- }
+ helpRenderMenu();
ImGui::EndMainMenuBar();
}
@@ -142,6 +125,7 @@ void renderWindow()
codeRenderToolbar();
deviceRenderToolbar();
fileRenderDialog();
+ helpRenderDialog();
deviceRenderWidgets();
ImGui::PopFont();
@@ -160,18 +144,6 @@ void renderWindow()
deviceRenderDraw();
- if (showHelp) {
- ImGui::Begin("help");
-
- ImGui::Text("stmdspgui\nCompiled on " __DATE__ ".\n\nWritten by Clyne Sullivan.\n");
-
- if (ImGui::Button("Close")) {
- showHelp = false;
- }
-
- ImGui::End();
- }
-
// Draw everything to the screen.
guiRender();
}