You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.1 KiB
C++
126 lines
3.1 KiB
C++
3 years ago
|
/**
|
||
|
* @file device.cpp
|
||
|
* @brief Contains code for device-related UI elements and logic.
|
||
|
*
|
||
|
* Copyright (C) 2021 Clyne Sullivan
|
||
|
*
|
||
|
* Distributed under the GNU GPL v3 or later. You should have received a copy of
|
||
|
* the GNU General Public License along with this program.
|
||
|
* If not, see <https://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#include "stmdsp.hpp"
|
||
|
|
||
|
#include "imgui.h"
|
||
|
|
||
|
extern stmdsp::device *m_device;
|
||
|
extern std::string statusMessage;
|
||
|
|
||
|
static const char *sampleRateList[6] = {
|
||
|
"8 kHz",
|
||
|
"16 kHz",
|
||
|
"20 kHz",
|
||
|
"32 kHz",
|
||
|
"48 kHz",
|
||
|
"96 kHz"
|
||
|
};
|
||
|
static const char *sampleRatePreview = sampleRateList[0];
|
||
|
|
||
|
static void deviceConnect();
|
||
|
static void deviceStart();
|
||
|
|
||
|
void deviceRenderMenu()
|
||
|
{
|
||
|
if (ImGui::BeginMenu("Run")) {
|
||
|
static const char *connectLabel = "Connect";
|
||
|
if (ImGui::MenuItem(connectLabel)) {
|
||
|
deviceConnect();
|
||
|
connectLabel = m_device == nullptr ? "Connect" : "Disconnect";
|
||
|
}
|
||
|
|
||
|
static const char *startLabel = "Start";
|
||
|
if (ImGui::MenuItem(startLabel)) {
|
||
|
deviceStart();
|
||
|
startLabel = m_device != nullptr && m_device->is_running() ? "Stop" : "Start";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
TODO: Run menu:
|
||
|
measure
|
||
|
draw
|
||
|
log
|
||
|
upload
|
||
|
unload
|
||
|
buffer size
|
||
|
load siggen
|
||
|
run siggen
|
||
|
*/
|
||
|
ImGui::MenuItem("Upload algorithm");
|
||
|
ImGui::MenuItem("Unload algorithm");
|
||
|
ImGui::MenuItem("Measure Code Time");
|
||
|
ImGui::MenuItem("Draw samples");
|
||
|
ImGui::MenuItem("Log results...");
|
||
|
ImGui::MenuItem("Load signal generator");
|
||
|
ImGui::MenuItem("Start signal generator");
|
||
|
|
||
|
ImGui::EndMenu();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deviceRenderToolbar()
|
||
|
{
|
||
|
ImGui::SameLine();
|
||
|
ImGui::SetNextItemWidth(100);
|
||
|
if (ImGui::BeginCombo("", sampleRatePreview)) {
|
||
|
for (int i = 0; i < 6; ++i) {
|
||
|
if (ImGui::Selectable(sampleRateList[i])) {
|
||
|
sampleRatePreview = sampleRateList[i];
|
||
|
if (m_device != nullptr && !m_device->is_running())
|
||
|
m_device->set_sample_rate(i);
|
||
|
}
|
||
|
}
|
||
|
ImGui::EndCombo();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deviceConnect()
|
||
|
{
|
||
|
if (m_device == nullptr) {
|
||
|
stmdsp::scanner scanner;
|
||
|
if (auto devices = scanner.scan(); devices.size() > 0) {
|
||
|
m_device = new stmdsp::device(devices.front());
|
||
|
if (m_device->connected()) {
|
||
|
sampleRatePreview = sampleRateList[m_device->get_sample_rate()];
|
||
|
statusMessage = "Connected!";
|
||
|
} else {
|
||
|
delete m_device;
|
||
|
m_device = nullptr;
|
||
|
statusMessage = "Failed to connect.";
|
||
|
}
|
||
|
} else {
|
||
|
statusMessage = "No devices found.";
|
||
|
}
|
||
|
} else {
|
||
|
delete m_device;
|
||
|
m_device = nullptr;
|
||
|
statusMessage = "Disconnected.";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void deviceStart()
|
||
|
{
|
||
|
if (m_device == nullptr) {
|
||
|
statusMessage = "No device connected.";
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (m_device->is_running()) {
|
||
|
m_device->continuous_stop();
|
||
|
statusMessage = "Ready.";
|
||
|
} else {
|
||
|
m_device->continuous_start();
|
||
|
statusMessage = "Running.";
|
||
|
}
|
||
|
}
|
||
|
|