--- /dev/null
+//==========================================================================\r
+// Name: fdmdv2_main.cpp\r
+// Purpose: Implements simple wxWidgets application with GUI.\r
+// Created: Apr. 9, 2012
+// Initial author: David Witten\r
+// License: BSD License (other licenses may apply to other\r
+// components of this project)\r
+//==========================================================================\r
+#include "fdmdv2_main.h"\r
+\r
+#define wxUSE_FILEDLG 1\r
+#define wxUSE_LIBPNG 1\r
+#define wxUSE_LIBJPEG 1\r
+#define wxUSE_GIF 1\r
+#define wxUSE_PCX 1\r
+#define wxUSE_LIBTIFF 1\r
+\r
+// initialize the application\r
+IMPLEMENT_APP(MainApp);\r
+\r
+// `Main program' equivalent: the program execution "starts" here\r
+//-------------------------------------------------------------------------\r
+// OnInit()\r
+//-------------------------------------------------------------------------\r
+bool MainApp::OnInit()\r
+{\r
+ if(!wxApp::OnInit())\r
+ {\r
+ return false;\r
+ }\r
+ // Create the main application window\r
+ MainFrame *frame = new MainFrame(NULL);\r
+\r
+ frame->m_panelSpectrum = new DrawPanel((wxFrame*) frame->m_auiNbookCtrl );\r
+ frame->m_auiNbookCtrl->AddPage(frame->m_panelSpectrum, _("Spectrum"), true, wxNullBitmap );\r
+\r
+ frame->m_panelWaterfall = new DrawPanel((wxFrame*) frame->m_auiNbookCtrl );\r
+ frame->m_auiNbookCtrl->AddPage(frame->m_panelWaterfall, _("Waterfall"), true, wxNullBitmap );\r
+\r
+ SetTopWindow(frame);\r
+ frame->Layout();\r
+ frame->Show();\r
+ return true;\r
+}\r
+\r
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
+// Class MainFrame(wxFrame* parent) : TopFrame(parent)\r
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\r
+MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent)\r
+{\r
+ m_radioRunning = false;\r
+// m_bitmap = bitmap;\r
+ m_sound = NULL;\r
+ m_zoom = 1.;\r
+\r
+}\r
+\r
+MainFrame::~MainFrame()\r
+{\r
+}\r
+\r
+void MainFrame::OnCloseFrame(wxCloseEvent& event)\r
+{\r
+ Destroy();\r
+}\r
+\r
+void MainFrame::OnExitClick(wxCommandEvent& event)\r
+{\r
+ Destroy();\r
+}\r
+\r
+void MainFrame::OnPaint(wxPaintEvent& WXUNUSED(event))\r
+{\r
+ wxPaintDC dc(this);\r
+\r
+ if(GetMenuBar()->IsChecked(ID_PAINT_BG))\r
+ {\r
+ dc.Clear();\r
+ }\r
+ dc.SetUserScale(m_zoom, m_zoom);\r
+ const wxSize size = GetClientSize();\r
+ dc.DrawBitmap(m_bitmap, dc.DeviceToLogicalX((size.x - m_zoom * m_bitmap.GetWidth()) / 2), dc.DeviceToLogicalY((size.y - m_zoom * m_bitmap.GetHeight()) / 2), true);\r
+}\r
+\r
+void MainFrame::OnCmdSliderScroll(wxScrollEvent& event)\r
+{\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnCmdSliderScrollChanged(wxScrollEvent& event)\r
+{\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnSliderScrollTop(wxScrollEvent& event)\r
+{\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnSliderScrollBottom(wxScrollEvent& event)\r
+{\r
+ wxMessageBox("Got Click!", "OnSliderScrollBottom", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnCheckSQClick(wxCommandEvent& event)\r
+{\r
+ wxMessageBox("Got Click!", "OnCheckSQClick", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnTogBtnTXClick(wxCommandEvent& event)\r
+{\r
+ m_soundFile = wxT("./hts1a.wav");\r
+ m_sound = new wxSound(m_soundFile, false);\r
+ m_sound->Play();\r
+}\r
+\r
+void MainFrame::OnTogBtnRxID(wxCommandEvent& event)\r
+{\r
+ wxMessageBox("Got Click!", "OnTogBtnRxID", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnTogBtnTxID(wxCommandEvent& event)\r
+{\r
+ wxMessageBox("Got Click!", "OnTogBtnTxID", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnTogBtnSplitClick(wxCommandEvent& event)\r
+{\r
+ wxMessageBox("Got Click!", "OnTogBtnSplitClick", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnTogBtnAnalogClick (wxCommandEvent& event)\r
+{\r
+ wxMessageBox("Got Click!", "OnTogBtnAnalogClick", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnTogBtnALCClick(wxCommandEvent& event)\r
+{\r
+ wxMessageBox("Got Click!", "OnTogBtnALCClick", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnOpen( wxCommandEvent& event )\r
+{\r
+ wxMessageBox("Got Click!", "OnOpen", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnOpenUpdateUI( wxUpdateUIEvent& event )\r
+{\r
+// wxMessageBox("Got Click!", "OnOpenUpdateUI", wxOK);\r
+// event.Skip();\r
+}\r
+\r
+void MainFrame::OnSaveUpdateUI( wxUpdateUIEvent& event )\r
+{\r
+// wxMessageBox("Got Click!", "OnSaveUpdateUI", wxOK);\r
+// event.Skip();\r
+}\r
+\r
+void MainFrame::OnClose( wxCommandEvent& event )\r
+{\r
+ if(m_sound != NULL)\r
+ {\r
+// if(m_sound->IsPlaying())\r
+// {\r
+ m_sound->Stop();\r
+ m_sound = NULL;\r
+// }\r
+ }\r
+// wxMessageBox("Got Click!", "OnClose", wxOK);\r
+// event.Skip();\r
+}\r
+\r
+void MainFrame::OnCloseUpdateUI( wxUpdateUIEvent& event )\r
+{\r
+// wxMessageBox("Got Click!", "OnCloseUpdateUI", wxOK);\r
+// event.Skip();\r
+}\r
+\r
+void MainFrame::OnExit( wxCommandEvent& event )\r
+{\r
+ wxMessageBox("Got Click!", "OnExit", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnCopy( wxCommandEvent& event )\r
+{\r
+ wxMessageBox("Got Click!", "OnCopy", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnCopyUpdateUI( wxUpdateUIEvent& event )\r
+{\r
+// wxMessageBox("Got Click!", "OnCopyUpdateUI", wxOK);\r
+// event.Skip();\r
+}\r
+\r
+void MainFrame::OnCut( wxCommandEvent& event )\r
+{\r
+ wxMessageBox("Got Click!", "OnCut", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnCutUpdateUI( wxUpdateUIEvent& event )\r
+{\r
+// wxMessageBox("Got Click!", "OnCutUpdateUI", wxOK);\r
+// event.Skip();\r
+}\r
+\r
+void MainFrame::OnPaste( wxCommandEvent& event )\r
+{\r
+ wxMessageBox("Got Click!", "OnPaste", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnPasteUpdateUI( wxUpdateUIEvent& event )\r
+{\r
+// wxMessageBox("Got Click!", "OnPasteUpdateUI", wxOK);\r
+// event.Skip();\r
+}\r
+\r
+void MainFrame::OnToolsOptions( wxCommandEvent& event )\r
+{\r
+ OptionsDlg *dlg = new OptionsDlg(NULL);\r
+ dlg->ShowModal();\r
+}\r
+\r
+void MainFrame::OnToolsOptionsUI( wxUpdateUIEvent& event )\r
+{\r
+// OptionsDlg *dlg = new OptionsDlg(NULL);\r
+// dlg->ShowModal();\r
+}\r
+\r
+void MainFrame::OnToolsAudio( wxCommandEvent& event )\r
+{\r
+ AudioDlg *dlg = new AudioDlg(NULL);\r
+ dlg->ShowModal();\r
+}\r
+\r
+void MainFrame::OnToolsAudioUI( wxUpdateUIEvent& event )\r
+{\r
+// OptionsDlg *dlg = new OptionsDlg(NULL);\r
+// dlg->ShowModal();\r
+}\r
+\r
+void MainFrame::OnToolsComCfg( wxCommandEvent& event )\r
+{\r
+ ComPortsDlg *dlg = new ComPortsDlg(NULL);\r
+ dlg->ShowModal();\r
+}\r
+\r
+void MainFrame::OnToolsComCfgUI( wxUpdateUIEvent& event )\r
+{\r
+ event.Enable(!m_radioRunning);\r
+}\r
+\r
+void MainFrame::OnHelpCheckUpdates( wxCommandEvent& event )\r
+{\r
+ wxMessageBox("Got Click!", "OnHelpCheckUpdates", wxOK);\r
+ event.Skip();\r
+}\r
+\r
+void MainFrame::OnHelpCheckUpdatesUI( wxUpdateUIEvent& event )\r
+{\r
+}\r
+\r
+void MainFrame::OnHelpAbout( wxCommandEvent& event )\r
+{\r
+ AboutDlg *dlg = new AboutDlg(NULL);\r
+ dlg->ShowModal();\r
+}\r
+\r
+\r
+wxString MainFrame::LoadUserImage(wxImage& image)\r
+{\r
+ wxString filename;\r
+\r
+ filename = wxLoadFileSelector(wxT("image"), wxEmptyString);\r
+ if(!filename.empty())\r
+ {\r
+ if(!image.LoadFile(filename))\r
+ {\r
+ wxLogError(wxT("Couldn't load image from '%s'."), filename.c_str());\r
+ return wxEmptyString;\r
+ }\r
+ }\r
+ return filename;\r
+}\r
+\r
+void MainFrame::OnSave(wxCommandEvent& WXUNUSED(event))\r
+{\r
+ wxImage image = m_bitmap.ConvertToImage();\r
+\r
+ wxString savefilename = wxFileSelector(wxT("Save Image"),\r
+ wxEmptyString,\r
+ wxEmptyString,\r
+ (const wxChar *)NULL,\r
+ wxT("BMP files (*.bmp)|*.bmp|")\r
+ wxT("PNG files (*.png)|*.png|")\r
+ wxT("JPEG files (*.jpg)|*.jpg|")\r
+ wxT("GIF files (*.gif)|*.gif|")\r
+ wxT("TIFF files (*.tif)|*.tif|")\r
+ wxT("PCX files (*.pcx)|*.pcx|")\r
+ wxT("ICO files (*.ico)|*.ico|")\r
+ wxT("CUR files (*.cur)|*.cur"),\r
+ wxFD_SAVE,\r
+ this);\r
+\r
+ if(savefilename.empty())\r
+ {\r
+ return;\r
+ }\r
+ wxString extension;\r
+ wxFileName::SplitPath(savefilename, NULL, NULL, &extension);\r
+ bool saved = false;\r
+ if(extension == wxT("bmp"))\r
+ {\r
+ static const int bppvalues[] =\r
+ {\r
+ wxBMP_1BPP,\r
+ wxBMP_1BPP_BW,\r
+ wxBMP_4BPP,\r
+ wxBMP_8BPP,\r
+ wxBMP_8BPP_GREY,\r
+ wxBMP_8BPP_RED,\r
+ wxBMP_8BPP_PALETTE,\r
+ wxBMP_24BPP\r
+ };\r
+\r
+ const wxString bppchoices[] =\r
+ {\r
+ wxT("1 bpp color"),\r
+ wxT("1 bpp B&W"),\r
+ wxT("4 bpp color"),\r
+ wxT("8 bpp color"),\r
+ wxT("8 bpp greyscale"),\r
+ wxT("8 bpp red"),\r
+ wxT("8 bpp own palette"),\r
+ wxT("24 bpp")\r
+ };\r
+\r
+ int bppselection = wxGetSingleChoiceIndex(wxT("Set BMP BPP"),\r
+ wxT("Image sample: save file"),\r
+ WXSIZEOF(bppchoices),\r
+ bppchoices,\r
+ this);\r
+ if(bppselection != -1)\r
+ {\r
+ int format = bppvalues[bppselection];\r
+\r
+ image.SetOption(wxIMAGE_OPTION_BMP_FORMAT, format);\r
+ if(format == wxBMP_8BPP_PALETTE)\r
+ {\r
+ unsigned char *cmap = new unsigned char [256];\r
+ for(int i = 0; i < 256; i++)\r
+ {\r
+ cmap[i] = (unsigned char)i;\r
+ }\r
+ image.SetPalette(wxPalette(256, cmap, cmap, cmap));\r
+ delete[] cmap;\r
+ }\r
+ }\r
+ }\r
+ else if(extension == wxT("png"))\r
+ {\r
+ static const int pngvalues[] =\r
+ {\r
+ wxPNG_TYPE_COLOUR,\r
+ wxPNG_TYPE_COLOUR,\r
+ wxPNG_TYPE_GREY,\r
+ wxPNG_TYPE_GREY,\r
+ wxPNG_TYPE_GREY_RED,\r
+ wxPNG_TYPE_GREY_RED,\r
+ };\r
+\r
+ const wxString pngchoices[] =\r
+ {\r
+ wxT("Colour 8bpp"),\r
+ wxT("Colour 16bpp"),\r
+ wxT("Grey 8bpp"),\r
+ wxT("Grey 16bpp"),\r
+ wxT("Grey red 8bpp"),\r
+ wxT("Grey red 16bpp"),\r
+ };\r
+\r
+ int sel = wxGetSingleChoiceIndex(wxT("Set PNG format"),\r
+ wxT("Image sample: save file"),\r
+ WXSIZEOF(pngchoices),\r
+ pngchoices,\r
+ this);\r
+ if(sel != -1)\r
+ {\r
+ image.SetOption(wxIMAGE_OPTION_PNG_FORMAT, pngvalues[sel]);\r
+ image.SetOption(wxIMAGE_OPTION_PNG_BITDEPTH, sel % 2 ? 16 : 8);\r
+\r
+ // these values are taken from OptiPNG with -o3 switch\r
+ const wxString compressionChoices[] =\r
+ {\r
+ wxT("compression = 9, memory = 8, strategy = 0, filter = 0"),\r
+ wxT("compression = 9, memory = 9, strategy = 0, filter = 0"),\r
+ wxT("compression = 9, memory = 8, strategy = 1, filter = 0"),\r
+ wxT("compression = 9, memory = 9, strategy = 1, filter = 0"),\r
+ wxT("compression = 1, memory = 8, strategy = 2, filter = 0"),\r
+ wxT("compression = 1, memory = 9, strategy = 2, filter = 0"),\r
+ wxT("compression = 9, memory = 8, strategy = 0, filter = 5"),\r
+ wxT("compression = 9, memory = 9, strategy = 0, filter = 5"),\r
+ wxT("compression = 9, memory = 8, strategy = 1, filter = 5"),\r
+ wxT("compression = 9, memory = 9, strategy = 1, filter = 5"),\r
+ wxT("compression = 1, memory = 8, strategy = 2, filter = 5"),\r
+ wxT("compression = 1, memory = 9, strategy = 2, filter = 5"),\r
+ };\r
+\r
+ int sel = wxGetSingleChoiceIndex(wxT("Select compression option (Cancel to use default)\n"),\r
+ wxT("PNG Compression Options"),\r
+ WXSIZEOF(compressionChoices),\r
+ compressionChoices,\r
+ this);\r
+ if(sel != -1)\r
+ {\r
+ const int zc[] = {9, 9, 9, 9, 1, 1, 9, 9, 9, 9, 1, 1};\r
+ const int zm[] = {8, 9, 8, 9, 8, 9, 8, 9, 8, 9, 8, 9};\r
+ const int zs[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2};\r
+ const int f[] = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08,\r
+ 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8\r
+ };\r
+\r
+ image.SetOption(wxIMAGE_OPTION_PNG_COMPRESSION_LEVEL , zc[sel]);\r
+ image.SetOption(wxIMAGE_OPTION_PNG_COMPRESSION_MEM_LEVEL , zm[sel]);\r
+ image.SetOption(wxIMAGE_OPTION_PNG_COMPRESSION_STRATEGY , zs[sel]);\r
+ image.SetOption(wxIMAGE_OPTION_PNG_FILTER , f[sel]);\r
+ image.SetOption(wxIMAGE_OPTION_PNG_COMPRESSION_BUFFER_SIZE, 1048576); // 1 MB\r
+ }\r
+ }\r
+ }\r
+ else if(extension == wxT("cur"))\r
+ {\r
+ image.Rescale(32, 32);\r
+ image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 0);\r
+ image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 0);\r
+ // This shows how you can save an image with explicitly\r
+ // specified image format:\r
+ saved = image.SaveFile(savefilename, wxBITMAP_TYPE_CUR);\r
+ }\r
+ if(!saved)\r
+ {\r
+ // This one guesses image format from filename extension\r
+ // (it may fail if the extension is not recognized):\r
+ image.SaveFile(savefilename);\r
+ }\r
+}\r