rlm@1: // Logging.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "resource.h" rlm@1: #include "Logging.h" rlm@1: #include "FileDlg.h" rlm@1: rlm@1: #include "../common/System.h" rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // Logging dialog rlm@1: rlm@1: Logging *Logging::instance = NULL; rlm@1: CString Logging:: text; rlm@1: rlm@1: Logging::Logging(CWnd*pParent /*=NULL*/) rlm@1: : ResizeDlg(Logging::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(Logging) rlm@1: m_swi = FALSE; rlm@1: m_unaligned_access = FALSE; rlm@1: m_illegal_write = FALSE; rlm@1: m_illegal_read = FALSE; rlm@1: m_dma0 = FALSE; rlm@1: m_dma1 = FALSE; rlm@1: m_dma2 = FALSE; rlm@1: m_dma3 = FALSE; rlm@1: m_agbprint = FALSE; rlm@1: m_undefined = FALSE; rlm@1: //}}AFX_DATA_INIT rlm@1: } rlm@1: rlm@1: void Logging::DoDataExchange(CDataExchange*pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(Logging) rlm@1: DDX_Control(pDX, IDC_LOG, m_log); rlm@1: DDX_Check(pDX, IDC_VERBOSE_SWI, m_swi); rlm@1: DDX_Check(pDX, IDC_VERBOSE_UNALIGNED_ACCESS, m_unaligned_access); rlm@1: DDX_Check(pDX, IDC_VERBOSE_ILLEGAL_WRITE, m_illegal_write); rlm@1: DDX_Check(pDX, IDC_VERBOSE_ILLEGAL_READ, m_illegal_read); rlm@1: DDX_Check(pDX, IDC_VERBOSE_DMA0, m_dma0); rlm@1: DDX_Check(pDX, IDC_VERBOSE_DMA1, m_dma1); rlm@1: DDX_Check(pDX, IDC_VERBOSE_DMA2, m_dma2); rlm@1: DDX_Check(pDX, IDC_VERBOSE_DMA3, m_dma3); rlm@1: DDX_Check(pDX, IDC_VERBOSE_AGBPRINT, m_agbprint); rlm@1: DDX_Check(pDX, IDC_VERBOSE_UNDEFINED, m_undefined); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(Logging, CDialog) rlm@1: //{{AFX_MSG_MAP(Logging) rlm@1: ON_BN_CLICKED(ID_OK, OnOk) rlm@1: ON_BN_CLICKED(IDC_CLEAR, OnClear) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_AGBPRINT, OnVerboseAgbprint) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_DMA0, OnVerboseDma0) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_DMA1, OnVerboseDma1) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_DMA2, OnVerboseDma2) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_DMA3, OnVerboseDma3) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_ILLEGAL_READ, OnVerboseIllegalRead) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_ILLEGAL_WRITE, OnVerboseIllegalWrite) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_SWI, OnVerboseSwi) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_UNALIGNED_ACCESS, OnVerboseUnalignedAccess) rlm@1: ON_BN_CLICKED(IDC_VERBOSE_UNDEFINED, OnVerboseUndefined) rlm@1: ON_BN_CLICKED(IDC_SAVE, OnSave) rlm@1: ON_EN_ERRSPACE(IDC_LOG, OnErrspaceLog) rlm@1: ON_EN_MAXTEXT(IDC_LOG, OnMaxtextLog) rlm@1: ON_WM_CLOSE() rlm@1: //}}AFX_MSG_MAP rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // Logging message handlers rlm@1: rlm@1: void Logging::OnOk() rlm@1: { rlm@1: EndDialog(TRUE); rlm@1: rlm@1: instance = NULL; rlm@1: } rlm@1: rlm@1: void Logging::OnClear() rlm@1: { rlm@1: text = ""; rlm@1: m_log.SetWindowText(""); rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseAgbprint() rlm@1: { rlm@1: systemVerbose ^= 512; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseDma0() rlm@1: { rlm@1: systemVerbose ^= 16; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseDma1() rlm@1: { rlm@1: systemVerbose ^= 32; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseDma2() rlm@1: { rlm@1: systemVerbose ^= 64; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseDma3() rlm@1: { rlm@1: systemVerbose ^= 128; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseIllegalRead() rlm@1: { rlm@1: systemVerbose ^= 8; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseIllegalWrite() rlm@1: { rlm@1: systemVerbose ^= 4; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseSwi() rlm@1: { rlm@1: systemVerbose ^= 1; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseUnalignedAccess() rlm@1: { rlm@1: systemVerbose ^= 2; rlm@1: } rlm@1: rlm@1: void Logging::OnVerboseUndefined() rlm@1: { rlm@1: systemVerbose ^= 256; rlm@1: } rlm@1: rlm@1: void Logging::OnSave() rlm@1: { rlm@1: int len = m_log.GetWindowTextLength(); rlm@1: rlm@1: char *mem = (char *)malloc(len); rlm@1: rlm@1: if (mem) rlm@1: { rlm@1: LPCTSTR exts[] = { ".txt", NULL }; rlm@1: m_log.GetWindowText(mem, len); rlm@1: CString filter = "All Files|*.*||"; rlm@1: FileDlg dlg(this, "", filter, 0, rlm@1: NULL, exts, NULL, "Save output", true); rlm@1: rlm@1: if (dlg.DoModal() == IDOK) rlm@1: { rlm@1: FILE *f = fopen(dlg.GetPathName(), "w"); rlm@1: if (f) rlm@1: { rlm@1: fwrite(mem, 1, len, f); rlm@1: fclose(f); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: free(mem); rlm@1: } rlm@1: rlm@1: void Logging::OnErrspaceLog() rlm@1: { rlm@1: systemMessage(0, "Error allocating space"); rlm@1: } rlm@1: rlm@1: void Logging::OnMaxtextLog() rlm@1: { rlm@1: systemMessage(0, "Max text length reached %d", m_log.GetLimitText()); rlm@1: } rlm@1: rlm@1: void Logging::PostNcDestroy() rlm@1: { rlm@1: delete this; rlm@1: } rlm@1: rlm@1: BOOL Logging::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: DIALOG_SIZER_START(sz) rlm@1: DIALOG_SIZER_ENTRY(IDC_LOG, DS_SizeY|DS_SizeX) rlm@1: DIALOG_SIZER_ENTRY(ID_OK, DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_CLEAR, DS_MoveY) rlm@1: DIALOG_SIZER_ENTRY(IDC_SAVE, DS_MoveY) rlm@1: DIALOG_SIZER_END() rlm@1: SetData(sz, rlm@1: TRUE, rlm@1: HKEY_CURRENT_USER, rlm@1: "Software\\Emulators\\VisualBoyAdvance\\Viewer\\LogView", rlm@1: NULL); rlm@1: rlm@1: m_swi = (systemVerbose & 1) != 0; rlm@1: m_unaligned_access = (systemVerbose & 2) != 0; rlm@1: m_illegal_write = (systemVerbose & 4) != 0; rlm@1: m_illegal_read = (systemVerbose & 8) != 0; rlm@1: m_dma0 = (systemVerbose & 16) != 0; rlm@1: m_dma1 = (systemVerbose & 32) != 0; rlm@1: m_dma2 = (systemVerbose & 64) != 0; rlm@1: m_dma3 = (systemVerbose & 128) != 0; rlm@1: m_undefined = (systemVerbose & 256) != 0; rlm@1: m_agbprint = (systemVerbose & 256) != 0; rlm@1: UpdateData(FALSE); rlm@1: rlm@1: m_log.LimitText(-1); rlm@1: m_log.SetWindowText(text); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void Logging::log(const char *s) rlm@1: { rlm@1: int size = ::SendMessage(m_log, WM_GETTEXTLENGTH, 0, 0); rlm@1: m_log.SetSel(size, size); rlm@1: m_log.ReplaceSel(s); rlm@1: } rlm@1: rlm@1: void Logging::OnClose() rlm@1: { rlm@1: EndDialog(FALSE); rlm@1: rlm@1: instance = NULL; rlm@1: rlm@1: CDialog::OnClose(); rlm@1: } rlm@1: rlm@1: void toolsLogging() rlm@1: { rlm@1: if (Logging::instance == NULL) rlm@1: { rlm@1: Logging::instance = new Logging(); rlm@1: Logging::instance->Create(IDD_LOGGING, AfxGetApp()->m_pMainWnd); rlm@1: Logging::instance->ShowWindow(SW_SHOW); rlm@1: } rlm@1: else rlm@1: { rlm@1: Logging::instance->SetForegroundWindow(); rlm@1: } rlm@1: } rlm@1: rlm@1: void toolsLog(const char *s) rlm@1: { rlm@1: CString str; rlm@1: int state = 0; rlm@1: if (s) rlm@1: { rlm@1: char c = *s++; rlm@1: while (c) rlm@1: { rlm@1: if (c == '\n' && state == 0) rlm@1: str += '\r'; rlm@1: else if (c == '\r') rlm@1: state = 1; rlm@1: else rlm@1: state = 0; rlm@1: str += c; rlm@1: c = *s++; rlm@1: } rlm@1: } rlm@1: rlm@1: Logging::text += str; rlm@1: if (Logging::instance != NULL) rlm@1: { rlm@1: Logging::instance->log(str); rlm@1: } rlm@1: } rlm@1: