#include “json.hpp” using json = nlohmann::json; void GUIApp::setup() {

gui0 = new ofxDatGui( 0, 0 );
gui0->setTheme( new AppGuiTheme() );
bool reload_prev_iteration = true;
json prevStateVars;
printf( "Do you wish to reload the previous interation values? Yes = 1, No = 0. " );
cin >> reload_prev_iteration;
if( reload_prev_iteration )
{
  // read a JSON file
  std::ifstream i( "sweeper_saved_variables.json" );
  i >> prevStateVars;
  reload_prev_iteration = !prevStateVars.empty();
}

———————————————————————————–

gui0_SaveFile = gui0->addButton( "[ Save To File ]" );
gui0_SaveAs = gui0->addButton( "[ Save as ]" );
gui0_LoadFile = gui0->addButton( "[ Load From File ]" );
gui0_equalizerEnable = gui0->addToggle( "Enable Equalizer", ( reload_prev_iteration ? prevStateVars[ "gui0_equalizerEnable" ] : false ) );
gui0_timeCoherent = gui0->addToggle( "Time-Coherent", ( reload_prev_iteration ? prevStateVars[ "gui0_timeCoherent" ] : false ) );
sweep_mode = ( reload_prev_iteration ? prevStateVars[ "sweep_mode" ] : 1 ); // 0 - manual
                                                                            // 1 - automatic
vector<string> sweep_options ={ "Sweep: Manual","Sweep: Auto" };
gui0_SweepMode = gui0->addDropdown( "Sweep Mode", sweep_options );
gui0_SweepMode->select( sweep_mode );
gui0_StopSweep = gui0->addButton( "[ Stop Sweep ]" );
sweep_rate = ( reload_prev_iteration ? prevStateVars[ "sweep_rate" ] : 0.25 );
gui0_SweepRate = gui0->addSlider( "Sweep Rate", -2.0, 2.0 );
gui0_SweepRate->setValue( sweep_rate );
gui0_SweepRate->setVisible( true );
sweep_percentage = ( reload_prev_iteration ? prevStateVars[ "sweep_percentage" ] : 0.5 );
gui0_SweepPercentage = gui0->addSlider( "Sweep Alpha", 0.0, 1.0 );
gui0_SweepPercentage->setValue( sweep_percentage );
gui0_SweepPercentage->setVisible( true );
vector<string> mode_options ={ "Output Mode: Shared", "Output Mode: Separate" };
gui0_outputModeDD = gui0->addDropdown( "Output Mode", mode_options );
output_mode = ( reload_prev_iteration ? prevStateVars[ "output_mode" ] : 1 ); // 0 - all three together
                                                                             // 1 - all three separate
gui0_outputModeDD->select( output_mode );
vector<string> channel_options ={ "Output Channel: Red", "Output Channel: Green", "Output Channel: Blue" };
gui0_outputChannelDD = gui0->addDropdown( "Output Channel", channel_options );
output_channel = ( reload_prev_iteration ? prevStateVars[ "output_channel" ] : 0 ); // 0 - all three on R
                                                                                    // 1 - all three on G
                                                                                    // 2 - all three on B
gui0_outputChannelDD->select( output_channel );
gui0_outputChannelDD->setVisible( output_mode == 0 );
vector<string> mixing_options ={ "Averaging Divisor: Constant", "Averaging Divisor: Summation" };
gui0_mixingModeDD = gui0->addDropdown( "Shared Mixing Mode", mixing_options );
shared_output_mixing_mode = ( reload_prev_iteration ? prevStateVars[ "shared_output_mixing_mode" ] : 0 ); 
                                      // 0 - average with constant divisor
                                      // 1 - average with changing divisor based upon sum of amplitudes
gui0_mixingModeDD->setVisible( output_mode == 0 );
char temp_c_str[ 16 ];

gui_widgets[ 0 ] = gui0_RedEnable   = gui0->addToggle( "Red Enable", ( reload_prev_iteration ? prevStateVars[ "red_enable" ] : true ) );
red_carrier_freq = ( reload_prev_iteration ? prevStateVars[ "red_carrier_freq" ] : 350.0 );
sprintf( temp_c_str, "%.2f", red_carrier_freq );
gui0_RedCarrierFrequency = gui0->addTextInput( "Red Carrier Freq", temp_c_str );
gui0_RedCarrierFrequency->setInputType( ofxDatGuiInputType::NUMERIC );
gui0_RedMinFreq                   = gui0->addSlider( "Red Min Freq", red_carrier_freq, red_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "red_min_freq" ] : red_carrier_freq ) );
gui_widgets[ 1 ] = gui0_RedFreq     = gui0->addSlider( "Red Freq", red_carrier_freq, red_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "red_freq" ] : ( red_carrier_freq + GPU_BW_MHZ * 0.5 ) ) );
gui0_RedMaxFreq                   = gui0->addSlider( "Red Max Freq", red_carrier_freq, red_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "red_max_freq" ] : ( red_carrier_freq + GPU_BW_MHZ ) ) );
gui_widgets[ 2 ] = gui0_RedAmp      = gui0->addSlider( "Red Amp", 0.0, 1.0, ( reload_prev_iteration ? prevStateVars[ "red_amp" ] : 1.0 ) );
gui_widgets[ 3 ] = gui0_GreenEnable = gui0->addToggle( "Green Enable", ( reload_prev_iteration ? prevStateVars[ "green_enable" ] : false ) );
green_carrier_freq = ( reload_prev_iteration ? prevStateVars[ "green_carrier_freq" ] : 0.0 );
sprintf( temp_c_str, "%.2f", green_carrier_freq );
gui0_GreenCarrierFrequency = gui0->addTextInput( "Green Carrier Freq", temp_c_str );
gui0_GreenCarrierFrequency->setInputType( ofxDatGuiInputType::NUMERIC );
gui0_GreenMinFreq                 = gui0->addSlider( "Green Min Freq", green_carrier_freq, green_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "green_min_freq" ] : 0.0 ) );
gui_widgets[ 4 ] = gui0_GreenFreq   = gui0->addSlider( "Green Freq", green_carrier_freq, green_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "green_freq" ] : 0.0 ) );
gui0_GreenMaxFreq                 = gui0->addSlider( "Green Max Freq", green_carrier_freq, green_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "green_max_freq" ] : 0.0 ) );
gui_widgets[ 5 ] = gui0_GreenAmp    = gui0->addSlider( "Green Amp", 0.0, 1.0, ( reload_prev_iteration ? prevStateVars[ "green_amp" ] : 1.0 ) );
gui_widgets[ 6 ] = gui0_BlueEnable  = gui0->addToggle( "Blue Enable", ( reload_prev_iteration ? prevStateVars[ "blue_enable" ] : true ) );
blue_carrier_freq = ( reload_prev_iteration ? prevStateVars[ "blue_carrier_freq" ] : 0.0 );
sprintf( temp_c_str, "%.2f", blue_carrier_freq );
gui0_BlueCarrierFrequency = gui0->addTextInput( "Blue Carrier Freq", temp_c_str );
gui0_BlueCarrierFrequency->setInputType( ofxDatGuiInputType::NUMERIC );
gui0_BlueMinFreq                  = gui0->addSlider( "Blue Min Freq", blue_carrier_freq, blue_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "blue_min_freq" ] : 1.0 ) );
gui_widgets[ 7 ] = gui0_BlueFreq    = gui0->addSlider( "Blue Freq", blue_carrier_freq, blue_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "blue_freq" ] : 1.0 ) );
gui0_BlueMaxFreq                  = gui0->addSlider( "Blue Max Freq", blue_carrier_freq, blue_carrier_freq + GPU_BW_MHZ, ( reload_prev_iteration ? prevStateVars[ "blue_max_freq" ] : 1.0 ) );
gui_widgets[ 8 ] = gui0_BlueAmp     = gui0->addSlider( "Blue Amp", 0.0, 1.0, ( reload_prev_iteration ? prevStateVars[ "blue_amp" ] : 1.0 ) );

————————————————————

if( sweep_mode )
{
  gui0_RedMinFreq->setVisible( true );
  gui0_RedMaxFreq->setVisible( true );
  gui0_GreenMinFreq->setVisible( true );
  gui0_GreenMaxFreq->setVisible( true );
  gui0_BlueMinFreq->setVisible( true );
  gui0_BlueMaxFreq->setVisible( true );
}
else
{
  gui0_SweepRate->setVisible( false );
  gui0_SweepPercentage->setVisible( false );
  gui0_RedMinFreq->setVisible( false );
  gui0_RedMaxFreq->setVisible( false );
  gui0_GreenMinFreq->setVisible( false );
  gui0_GreenMaxFreq->setVisible( false );
  gui0_BlueMinFreq->setVisible( false );
  gui0_BlueMaxFreq->setVisible( false );
}
gui_widget_focused_index = 1; // focus on red frequency widget initially
gui0->onButtonEvent( this, &GUIApp::onButtonEvent );
gui0->onToggleEvent( this, &GUIApp::onToggleEvent );
gui0->onTextInputEvent( this, &GUIApp::onTextInputEvent );
gui0->onSliderEvent( this, &GUIApp::onSliderEvent );
gui0->onDropdownEvent( this, &GUIApp::onDropdownEvent );
alt_modifier = false;
shift_modifier = false;
ctrl_modifier = false;
is_adjusting_min_max_freq = false;
//ofTrueTypeFont::setGlobalDpi( 72 ); // this screws up the font size
font.load( "FAFERS_Technical_Font.ttf", 14, false );
if( !font.isLoaded() )
  font.load( "arial.ttf", 14, false );
font.setLineHeight( font.getSize() * 1.125 );
font.setLetterSpacing( 1.037 );

}

bool save_curr_iteration = true;
printf( "Do you wish to save current data? Yes = 1, No = 0 \n" );
cin >> save_curr_iteration;
if (save_curr_iteration)
{
   json savedStateVars;
   savedStateVars["sweep_rate"] = gui0_SweepRate->getValue();
   savedStateVars["sweep_percentage"] = gui0_SweepPercentage->getValue();
savedStateVars["red_enable"] = gui0_RedEnable->getChecked();
savedStateVars["red_carrier_freq"] = gui0_RedCarrierFrequency->getLabel();
savedStateVars["red_min_freq"] = gui0_RedMinFreq->getValue();
savedStateVars["red_freq"] = gui0_RedFreq->getValue();
savedStateVars["red_max_freq"] = gui0_RedMaxFreq->getValue();
savedStateVars["red_amp"] = gui0_RedAmp->getValue();
savedStateVars["green_enable"] = gui0_GreenEnable->getChecked();
savedStateVars["green_carrier_freq"] = gui0_GreenCarrierFrequency->getLabel();
savedStateVars["green_min_freq"] = gui0_GreenMinFreq->getValue();
savedStateVars["green_freq"] = gui0_GreenFreq->getValue();
savedStateVars["green_max_freq"] = gui0_GreenMaxFreq->getValue();
savedStateVars["green_amp"] = gui0_GreenAmp->getValue();
savedStateVars["blue_enable"] = gui0_BlueEnable->getChecked();
savedStateVars["blue_carrier_freq"] = gui0_BlueCarrierFrequency->getLabel();
savedStateVars["blue_min_freq"] = gui0_BlueMinFreq->getValue();
savedStateVars["blue_freq"] = gui0_BlueFreq->getValue();
savedStateVars["blue_max_freq"] = gui0_BlueMaxFreq->getValue();
savedStateVars["blue_amp"] = gui0_BlueAmp->getValue();
// write prettified JSON to another file
std::ofstream off_program_file("sweeper_saved_variables.json");
off_program_file << std::setw(10) << savedStateVars << std::endl;
printf("sweep_rate: %f \n", savedStateVars["sweep_rate"]);
printf("sweep_percentage: %f \n", savedStateVars["sweep_percentage"]);
printf("red_min_freq: %f \n", savedStateVars["red_min_freq"]);
printf("red curr freq: %f \n", savedStateVars["red_freq"]);
printf("red_max_freq: %f \n", savedStateVars["red_max_freq"]);
printf("green_min_freq: %f \n", savedStateVars["green_min_freq"]);
printf("green curr freq: %f \n", savedStateVars["green_freq"]);
printf("green_max_freq: %f \n", savedStateVars["green_max_freq"]);
printf("blue_min_freq: %f \n", savedStateVars["blue_min_freq"]);
printf("blue curr freq: %f \n", savedStateVars["blue_freq"]);
printf("blue_max_freq: %f \n", savedStateVars["blue_max_freq"]);
 }