You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

359 lines
12 KiB

/*
* Copyright (C) 2009,2010,2014 by Jonathan Naylor G4KLX
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "DVToolReaderPreferences.h"
#include "DVToolReaderFrame.h"
#include "DVTOOLFileReader.h"
#include "DVToolReaderApp.h"
#include "AMBEFileReader.h"
#include "DStarDefines.h"
#include "MessageEvent.h"
#include "HeaderEvent.h"
#include "ErrorEvent.h"
#include "Version.h"
#include <wx/gbsizer.h>
#include <wx/aboutdlg.h>
enum {
Menu_File_OpenDVTOOL = 6000,
Menu_File_OpenAMBE,
Menu_Edit_Preferences
};
DEFINE_EVENT_TYPE(MESSAGE_EVENT)
DEFINE_EVENT_TYPE(HEADER_EVENT)
DEFINE_EVENT_TYPE(ERROR_EVENT)
BEGIN_EVENT_TABLE(CDVToolReaderFrame, wxFrame)
EVT_MENU(Menu_File_OpenDVTOOL, CDVToolReaderFrame::onDVTOOLOpen)
EVT_MENU(Menu_File_OpenAMBE, CDVToolReaderFrame::onAMBEOpen)
EVT_MENU(wxID_EXIT, CDVToolReaderFrame::onQuit)
EVT_MENU(Menu_Edit_Preferences, CDVToolReaderFrame::onPreferences)
EVT_MENU(wxID_ABOUT, CDVToolReaderFrame::onAbout)
EVT_CLOSE(CDVToolReaderFrame::onClose)
EVT_CUSTOM(MESSAGE_EVENT, wxID_ANY, CDVToolReaderFrame::onMessage)
EVT_CUSTOM(HEADER_EVENT, wxID_ANY, CDVToolReaderFrame::onHeader)
EVT_CUSTOM(ERROR_EVENT, wxID_ANY, CDVToolReaderFrame::onError)
END_EVENT_TABLE()
CDVToolReaderFrame::CDVToolReaderFrame(const wxString& title) :
wxFrame(NULL, -1, title),
m_fileName(NULL),
m_your(NULL),
m_my(NULL),
m_rpt1(NULL),
m_rpt2(NULL),
m_flags(NULL),
m_message(NULL)
{
SetMenuBar(createMenuBar());
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
wxPanel* panel = new wxPanel(this);
wxGridBagSizer* panelSizer = new wxGridBagSizer(BORDER_SIZE, BORDER_SIZE);
wxStaticText* fileNameLabel = new wxStaticText(panel, -1, _("File Name:"), wxDefaultPosition, wxSize(LABEL_WIDTH, -1), wxALIGN_RIGHT);
panelSizer->Add(fileNameLabel, wxGBPosition(0, 0), wxDefaultSpan, wxALL, BORDER_SIZE);
m_fileName = new wxStaticText(panel, -1, wxEmptyString, wxDefaultPosition, wxSize(LABEL_WIDTH, -1), wxALIGN_RIGHT);
panelSizer->Add(m_fileName, wxGBPosition(0, 1), wxGBSpan(1, 5), wxALL, BORDER_SIZE);
wxStaticText* yourLabel = new wxStaticText(panel, -1, _("Your:"), wxDefaultPosition, wxSize(LABEL_WIDTH, -1), wxALIGN_RIGHT);
panelSizer->Add(yourLabel, wxGBPosition(1, 0), wxDefaultSpan, wxALL, BORDER_SIZE);
m_your = new wxStaticText(panel, -1, wxEmptyString, wxDefaultPosition, wxSize(CONTROL_WIDTH, -1));
panelSizer->Add(m_your, wxGBPosition(1, 1), wxDefaultSpan, wxALL, BORDER_SIZE);
wxStaticText* rpt1Label = new wxStaticText(panel, -1, _("RPT1:"), wxDefaultPosition, wxSize(LABEL_WIDTH, -1), wxALIGN_RIGHT);
panelSizer->Add(rpt1Label, wxGBPosition(1, 2), wxDefaultSpan, wxALL, BORDER_SIZE);
m_rpt1 = new wxStaticText(panel, -1, wxEmptyString, wxDefaultPosition, wxSize(CONTROL_WIDTH, -1));
panelSizer->Add(m_rpt1, wxGBPosition(1, 3), wxDefaultSpan, wxALL, BORDER_SIZE);
wxStaticText* rpt2Label = new wxStaticText(panel, -1, _("RPT2:"), wxDefaultPosition, wxSize(LABEL_WIDTH, -1), wxALIGN_RIGHT);
panelSizer->Add(rpt2Label, wxGBPosition(1, 4), wxDefaultSpan, wxALL, BORDER_SIZE);
m_rpt2 = new wxStaticText(panel, -1, wxEmptyString, wxDefaultPosition, wxSize(CONTROL_WIDTH, -1));
panelSizer->Add(m_rpt2, wxGBPosition(1, 5), wxDefaultSpan, wxALL, BORDER_SIZE);
wxStaticText* myLabel = new wxStaticText(panel, -1, _("My:"), wxDefaultPosition, wxSize(LABEL_WIDTH, -1), wxALIGN_RIGHT);
panelSizer->Add(myLabel, wxGBPosition(2, 0), wxDefaultSpan, wxALL, BORDER_SIZE);
m_my = new wxStaticText(panel, -1, wxEmptyString, wxDefaultPosition, wxSize(CONTROL_WIDTH, -1));
panelSizer->Add(m_my, wxGBPosition(2, 1), wxDefaultSpan, wxALL, BORDER_SIZE);
wxStaticText* flagsLabel = new wxStaticText(panel, -1, _("Flags:"), wxDefaultPosition, wxSize(LABEL_WIDTH, -1), wxALIGN_RIGHT);
panelSizer->Add(flagsLabel, wxGBPosition(2, 2), wxDefaultSpan, wxALL, BORDER_SIZE);
m_flags = new wxStaticText(panel, -1, wxEmptyString, wxDefaultPosition, wxSize(LABEL_WIDTH * 3U, -1), wxALIGN_RIGHT);
panelSizer->Add(m_flags, wxGBPosition(2, 3), wxGBSpan(1, 3), wxALL, BORDER_SIZE);
wxStaticText* messageLabel = new wxStaticText(panel, -1, _("Message:"), wxDefaultPosition, wxSize(LABEL_WIDTH, -1), wxALIGN_RIGHT);
panelSizer->Add(messageLabel, wxGBPosition(3, 0), wxDefaultSpan, wxALL, BORDER_SIZE);
m_message = new wxStaticText(panel, -1, wxEmptyString, wxDefaultPosition, wxSize(LABEL_WIDTH * 3U, -1), wxALIGN_RIGHT);
panelSizer->Add(m_message, wxGBPosition(3, 1), wxGBSpan(1, 3), wxALL, BORDER_SIZE);
panel->SetSizer(panelSizer);
panelSizer->SetSizeHints(panel);
mainSizer->Add(panel);
SetSizer(mainSizer);
mainSizer->SetSizeHints(this);
}
CDVToolReaderFrame::~CDVToolReaderFrame()
{
}
wxMenuBar* CDVToolReaderFrame::createMenuBar()
{
wxMenu* fileMenu = new wxMenu();
fileMenu->Append(Menu_File_OpenDVTOOL, _("Open DVTOOL File..."));
fileMenu->Append(Menu_File_OpenAMBE, _("Open AMBE File..."));
fileMenu->AppendSeparator();
fileMenu->Append(wxID_EXIT, _("Exit"));
wxMenu* editMenu = new wxMenu();
editMenu->Append(Menu_Edit_Preferences, _("Preferences..."));
wxMenu* helpMenu = new wxMenu();
helpMenu->Append(wxID_ABOUT, _("About DVTool Reader"));
wxMenuBar* menuBar = new wxMenuBar();
menuBar->Append(fileMenu, _("File"));
menuBar->Append(editMenu, _("Edit"));
menuBar->Append(helpMenu, _("Help"));
return menuBar;
}
void CDVToolReaderFrame::showMessage(CMessageData* message)
{
wxASSERT(message != NULL);
CMessageEvent event(message, MESSAGE_EVENT);
AddPendingEvent(event);
}
void CDVToolReaderFrame::showHeader(CHeaderData* header)
{
CHeaderEvent event(header, HEADER_EVENT);
AddPendingEvent(event);
}
void CDVToolReaderFrame::error(const wxString& error)
{
CErrorEvent event(error, ERROR_EVENT);
AddPendingEvent(event);
}
void CDVToolReaderFrame::onQuit(wxCommandEvent& event)
{
Close(false);
}
void CDVToolReaderFrame::onDVTOOLOpen(wxCommandEvent& event)
{
wxFileDialog dialog(this, _("Select a DVTOOL File"), wxEmptyString, wxEmptyString, _("DVTOOL file (*.dvtool)|*.dvtool|All files (*.*)|*.*"));
if (dialog.ShowModal() != wxID_OK)
return;
wxString fileName = dialog.GetPath();
CDVTOOLFileReader* reader = new CDVTOOLFileReader;
bool res = reader->open(fileName);
if (!res) {
wxMessageDialog dialog(this, _("Cannot find the file, or the file is corrupt."), _("DVTool Reader Error"), wxICON_ERROR);
dialog.ShowModal();
delete reader;
return;
}
res = ::wxGetApp().setReader(reader);
if (!res) {
wxMessageDialog dialog(this, _("Cannot process the file."), _("DVTool Reader Error"), wxICON_ERROR);
dialog.ShowModal();
delete reader;
return;
}
fileName = dialog.GetFilename();
m_fileName->SetLabel(fileName);
}
void CDVToolReaderFrame::onAMBEOpen(wxCommandEvent& event)
{
wxFileDialog dialog(this, _("Select an AMBE File"), wxEmptyString, wxEmptyString, _("AMBE file (*.ambe)|*.ambe|All files (*.*)|*.*"));
if (dialog.ShowModal() != wxID_OK)
return;
wxString fileName = dialog.GetPath();
CAMBEFileReader* reader = new CAMBEFileReader;
bool res = reader->open(fileName);
if (!res) {
wxMessageDialog dialog(this, _("Cannot find the file, or the file is corrupt."), _("DVTool Reader Error"), wxICON_ERROR);
dialog.ShowModal();
delete reader;
return;
}
res = ::wxGetApp().setReader(reader);
if (!res) {
wxMessageDialog dialog(this, _("Cannot process the file."), _("DVTool Reader Error"), wxICON_ERROR);
dialog.ShowModal();
delete reader;
return;
}
fileName = dialog.GetFilename();
m_fileName->SetLabel(fileName);
}
void CDVToolReaderFrame::onPreferences(wxCommandEvent& event)
{
DONGLE_TYPE type;
wxString device, address;
unsigned int port;
::wxGetApp().getDongle(type, device, address, port);
wxString soundcard;
::wxGetApp().getSoundcard(soundcard);
bool bleep;
::wxGetApp().getBleep(bleep);
CDVToolReaderPreferences dialog1(this, -1, type, device, address, port, soundcard, bleep);
if (dialog1.ShowModal() != wxID_OK)
return;
type = dialog1.getType();
device = dialog1.getDevice();
address = dialog1.getAddress();
port = dialog1.getPort();
soundcard = dialog1.getSoundcard();
bleep = dialog1.getBleep();
::wxGetApp().setDongle(type, device, address, port);
::wxGetApp().setSoundcard(soundcard);
::wxGetApp().setBleep(bleep);
wxMessageDialog dialog2(this, _("The changes made will not take effect\nuntil the application is restarted"), _("DVTool Reader Information"), wxICON_INFORMATION);
dialog2.ShowModal();
}
void CDVToolReaderFrame::onAbout(wxCommandEvent& event)
{
wxAboutDialogInfo info;
info.AddDeveloper(wxT("Jonathan Naylor, G4KLX"));
info.SetCopyright(wxT("(C) 2009-2014 using GPL v2 or later"));
info.SetName(APPLICATION_NAME);
info.SetVersion(VERSION);
info.SetDescription(_("This program reads .ambe and .dvtool files created and displays\nthe enclosed information and plays the encoded audio."));
::wxAboutBox(info);
}
void CDVToolReaderFrame::onClose(wxCloseEvent& event)
{
Destroy();
}
void CDVToolReaderFrame::onMessage(wxEvent& event)
{
CMessageEvent& msgEvent = dynamic_cast<CMessageEvent&>(event);
CMessageData* message = msgEvent.getMessageData();
wxASSERT(message != NULL);
wxString msg = message->getMsgText();
m_message->SetLabel(msg);
delete message;
}
void CDVToolReaderFrame::onHeader(wxEvent& event)
{
CHeaderEvent& hdrEvent = dynamic_cast<CHeaderEvent&>(event);
CHeaderData* header = hdrEvent.getHeaderData();
if (header != NULL) {
wxDateTime dateTime = header->getTime();
wxString hrdDateTime = dateTime.FormatISODate() + wxT(" ") + dateTime.FormatISOTime();
wxString urCall = header->getYourCall();
m_your->SetLabel(urCall);
wxString myCall = header->getMyCall1();
wxString myCall2 = header->getMyCall2();
if (!myCall2.IsSameAs(wxT(" "))) {
myCall.Append(wxT("/"));
myCall.Append(myCall2);
}
m_my->SetLabel(myCall);
wxString rpt1Call = header->getRptCall1();
m_rpt1->SetLabel(rpt1Call);
wxString rpt2Call = header->getRptCall2();
m_rpt2->SetLabel(rpt2Call);
wxString flags;
flags.Printf(wxT("%02X %02X %02X"), header->getFlag1(), header->getFlag2(), header->getFlag3());
m_flags->SetLabel(flags);
m_message->SetLabel(wxEmptyString);
delete header;
} else {
m_fileName->SetLabel(wxEmptyString);
m_your->SetLabel(wxEmptyString);
m_my->SetLabel(wxEmptyString);
m_rpt1->SetLabel(wxEmptyString);
m_rpt2->SetLabel(wxEmptyString);
m_flags->SetLabel(wxEmptyString);
m_message->SetLabel(wxEmptyString);
}
}
void CDVToolReaderFrame::onError(wxEvent& event)
{
CErrorEvent& errEvent = dynamic_cast<CErrorEvent&>(event);
wxString text = errEvent.getText();
wxMessageDialog dialog(this, text, _("DVTool Reader Error"), wxICON_ERROR);
dialog.ShowModal();
}

Powered by TurnKey Linux.