/** * Furnace Tracker - multi-system chiptune tracker * Copyright (C) 2021-2022 tildearrow and contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "gui.h" #include "debug.h" #include "IconsFontAwesome4.h" #include void FurnaceGUI::drawDebug() { static int bpOrder; static int bpRow; static int bpTick; static bool bpOn; if (nextWindow==GUI_WINDOW_DEBUG) { debugOpen=true; ImGui::SetNextWindowFocus(); nextWindow=GUI_WINDOW_NOTHING; } if (!debugOpen) return; ImGui::SetNextWindowSizeConstraints(ImVec2(400.0f*dpiScale,200.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale)); if (ImGui::Begin("Debug",&debugOpen,ImGuiWindowFlags_NoDocking)) { ImGui::Text("NOTE: use with caution."); if (ImGui::TreeNode("Debug Controls")) { if (e->isHalted()) { if (ImGui::Button("Resume")) e->resume(); } else { if (ImGui::Button("Pause")) e->halt(); } ImGui::SameLine(); if (ImGui::Button("Frame Advance")) e->haltWhen(DIV_HALT_TICK); ImGui::SameLine(); if (ImGui::Button("Row Advance")) e->haltWhen(DIV_HALT_ROW); ImGui::SameLine(); if (ImGui::Button("Pattern Advance")) e->haltWhen(DIV_HALT_PATTERN); if (ImGui::Button("Panic")) e->syncReset(); ImGui::SameLine(); if (ImGui::Button("Abort")) { abort(); } ImGui::TreePop(); } if (ImGui::TreeNode("Breakpoint")) { ImGui::InputInt("Order",&bpOrder); ImGui::InputInt("Row",&bpRow); ImGui::InputInt("Tick",&bpTick); ImGui::Checkbox("Enable",&bpOn); ImGui::TreePop(); } if (ImGui::TreeNode("Dispatch Status")) { ImGui::Text("for best results set latency to minimum or use the Frame Advance button."); ImGui::Columns(e->getTotalChannelCount()); for (int i=0; igetTotalChannelCount(); i++) { void* ch=e->getDispatchChanState(i); ImGui::TextColored(uiColors[GUI_COLOR_ACCENT_PRIMARY],"Ch. %d: %d, %d",i,e->dispatchOfChan[i],e->dispatchChanOfChan[i]); if (ch==NULL) { ImGui::Text("NULL"); } else { putDispatchChan(ch,e->dispatchChanOfChan[i],e->sysOfChan[i]); } ImGui::NextColumn(); } ImGui::Columns(); ImGui::TreePop(); } if (ImGui::TreeNode("Playback Status")) { ImGui::Text("for best results set latency to minimum or use the Frame Advance button."); ImGui::Columns(e->getTotalChannelCount()); for (int i=0; igetTotalChannelCount(); i++) { DivChannelState* ch=e->getChanState(i); ImGui::TextColored(uiColors[GUI_COLOR_ACCENT_PRIMARY],"Channel %d:",i); if (ch==NULL) { ImGui::Text("NULL"); } else { ImGui::Text("* General:"); ImGui::Text("- note = %d",ch->note); ImGui::Text("- oldNote = %d",ch->oldNote); ImGui::Text("- pitch = %d",ch->pitch); ImGui::Text("- portaSpeed = %d",ch->portaSpeed); ImGui::Text("- portaNote = %d",ch->portaNote); ImGui::Text("- volume = %.4x",ch->volume); ImGui::Text("- volSpeed = %d",ch->volSpeed); ImGui::Text("- cut = %d",ch->cut); ImGui::Text("- rowDelay = %d",ch->rowDelay); ImGui::Text("- volMax = %.4x",ch->volMax); ImGui::Text("- delayOrder = %d",ch->delayOrder); ImGui::Text("- delayRow = %d",ch->delayRow); ImGui::Text("- retrigSpeed = %d",ch->retrigSpeed); ImGui::Text("- retrigTick = %d",ch->retrigTick); ImGui::PushStyleColor(ImGuiCol_Text,(ch->vibratoDepth>0)?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_TEXT]); ImGui::Text("* Vibrato:"); ImGui::Text("- depth = %d",ch->vibratoDepth); ImGui::Text("- rate = %d",ch->vibratoRate); ImGui::Text("- pos = %d",ch->vibratoPos); ImGui::Text("- dir = %d",ch->vibratoDir); ImGui::Text("- fine = %d",ch->vibratoFine); ImGui::PopStyleColor(); ImGui::PushStyleColor(ImGuiCol_Text,(ch->tremoloDepth>0)?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_TEXT]); ImGui::Text("* Tremolo:"); ImGui::Text("- depth = %d",ch->tremoloDepth); ImGui::Text("- rate = %d",ch->tremoloRate); ImGui::Text("- pos = %d",ch->tremoloPos); ImGui::PopStyleColor(); ImGui::PushStyleColor(ImGuiCol_Text,(ch->arp>0)?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_TEXT]); ImGui::Text("* Arpeggio:"); ImGui::Text("- arp = %.2X",ch->arp); ImGui::Text("- stage = %d",ch->arpStage); ImGui::Text("- ticks = %d",ch->arpTicks); ImGui::PopStyleColor(); ImGui::Text("* Miscellaneous:"); ImGui::TextColored(ch->doNote?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> Do Note"); ImGui::TextColored(ch->legato?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> Legato"); ImGui::TextColored(ch->portaStop?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> PortaStop"); ImGui::TextColored(ch->keyOn?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> Key On"); ImGui::TextColored(ch->keyOff?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> Key Off"); ImGui::TextColored(ch->nowYouCanStop?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> NowYouCanStop"); ImGui::TextColored(ch->stopOnOff?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> Stop on Off"); ImGui::TextColored(ch->arpYield?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> Arp Yield"); ImGui::TextColored(ch->delayLocked?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> DelayLocked"); ImGui::TextColored(ch->inPorta?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> InPorta"); ImGui::TextColored(ch->scheduledSlideReset?uiColors[GUI_COLOR_MACRO_VOLUME]:uiColors[GUI_COLOR_HEADER],">> SchedSlide"); } ImGui::NextColumn(); } ImGui::Columns(); ImGui::TreePop(); } if (ImGui::TreeNode("Playground")) { if (pgSys<0 || pgSys>=e->song.systemLen) pgSys=0; if (ImGui::BeginCombo("System",fmt::sprintf("%d. %s",pgSys+1,e->getSystemName(e->song.system[pgSys])).c_str())) { for (int i=0; isong.systemLen; i++) { if (ImGui::Selectable(fmt::sprintf("%d. %s",i+1,e->getSystemName(e->song.system[i])).c_str())) { pgSys=i; break; } } ImGui::EndCombo(); } ImGui::Text("Program"); if (pgProgram.empty()) { ImGui::Text("-nothing here-"); } else { char id[32]; for (size_t index=0; indexpoke(pgSys,pgProgram); } ImGui::SameLine(); if (ImGui::Button("Clear")) { pgProgram.clear(); } ImGui::Text("Address"); ImGui::SameLine(); ImGui::SetNextItemWidth(100.0f*dpiScale); ImGui::InputInt("##PAddress",&pgAddr,0,0,ImGuiInputTextFlags_CharsHexadecimal); ImGui::SameLine(); ImGui::Text("Value"); ImGui::SameLine(); ImGui::SetNextItemWidth(100.0f*dpiScale); ImGui::InputInt("##PValue",&pgVal,0,0,ImGuiInputTextFlags_CharsHexadecimal); ImGui::SameLine(); if (ImGui::Button("Write")) { e->poke(pgSys,pgAddr,pgVal); } ImGui::SameLine(); if (ImGui::Button("Add")) { pgProgram.push_back(DivRegWrite(pgAddr,pgVal)); } if (ImGui::TreeNode("Register Cheatsheet")) { const char** sheet=e->getRegisterSheet(pgSys); if (sheet==NULL) { ImGui::Text("no cheatsheet available for this system."); } else { if (ImGui::BeginTable("RegisterSheet",2,ImGuiTableFlags_SizingFixedSame)) { ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Name"); ImGui::TableNextColumn(); ImGui::Text("Address"); for (int i=0; sheet[i]!=NULL; i+=2) { ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("%s",sheet[i]); ImGui::TableNextColumn(); ImGui::Text("$%s",sheet[i+1]); } ImGui::EndTable(); } } ImGui::TreePop(); } ImGui::TreePop(); } if (ImGui::TreeNode("User Interface")) { if (ImGui::Button("Inspect")) { inspectorOpen=!inspectorOpen; } ImGui::TreePop(); } if (ImGui::TreeNode("Settings")) { if (ImGui::Button("Sync")) syncSettings(); ImGui::SameLine(); if (ImGui::Button("Commit")) commitSettings(); ImGui::SameLine(); if (ImGui::Button("Force Load")) e->loadConf(); ImGui::SameLine(); if (ImGui::Button("Force Save")) e->saveConf(); ImGui::TreePop(); } ImGui::Text("Song format version %d",e->song.version); ImGui::Text("Furnace version " DIV_VERSION " (%d)",DIV_ENGINE_VERSION); } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_DEBUG; ImGui::End(); }