#include #include #include #include #include "error_logging.h" std::wstring save_error_log(HidHandler& hid) { std::time_t t = time(nullptr); std::tm* tm = localtime(&t); std::wstringstream crash_filename; crash_filename << std::format(L"error-{:04d}-{:02d}-{:02d}-{:02d}-{:02d}-{:02d}.log", (tm->tm_year + 1900), tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); std::ofstream crash_stream(crash_filename.str().c_str(), std::ios::ate); if (crash_stream.is_open()) { crash_stream << "Bigscreen Beyond v" << hid_handler.cdinfo.swver << "\n"; crash_stream << asctime(tm) << "\n\n"; switch (hid_handler.cdinfo.crash_reason) { case Beyond_Crash_Reason::Hard_Fault: crash_stream << "Hard Fault\n\n"; break; case Beyond_Crash_Reason::Unknown_ISR: crash_stream << "Unassigned interrupt called\n\n"; break; case Beyond_Crash_Reason::Stack_Overflow: crash_stream << "Stack Overflow (" << hid_handler.cdinfo.crashed_task_name << ")\n\n"; break; default: crash_stream << "error - unknown crash reason\n\n"; break; } crash_stream << "Interrupt IRQ during crash: " << hid_handler.cdinfo.crash_irq_num << "\n"; crash_stream << std::format("Hard fault status register: 0x{:08X}", hid_handler.cdinfo.hfsr) << "\n"; crash_stream << std::format("Configurable fault status register: 0x{:08X}", hid_handler.cdinfo.cfsr) << "\n\n"; crash_stream << "REGISTERS:\n"; for (int i = 0; i < 13; i++) { crash_stream << std::format("R{:02d}:\t\t\t0x{:08X}", i, hid_handler.cdinfo.regs[i]) << "\n"; } crash_stream << std::format("SP (R13):\t\t0x{:08X}", hid_handler.cdinfo.regs[13]) << "\n"; crash_stream << std::format("LR (R14):\t\t0x{:08X}", hid_handler.cdinfo.regs[14]) << "\n"; crash_stream << std::format("PC (R15):\t\t0x{:08X}", hid_handler.cdinfo.regs[15]) << "\n"; crash_stream << std::format("PSR:\t\t\t0x{:08X}", hid_handler.cdinfo.psr) << "\n"; crash_stream << std::format("MSP:\t\t\t0x{:08X}", hid_handler.cdinfo.msp) << "\n"; crash_stream << std::format("PSP:\t\t\t0x{:08X}", hid_handler.cdinfo.psp) << "\n"; crash_stream << std::format("Exception's PSR:\t0x{:08X}", hid_handler.cdinfo.exception_psr) << "\n"; for (int i = 0; i < 32; i++) { crash_stream << std::format("S{:02d}:\t\t\t0x{:08X}", i, hid_handler.cdinfo.floats[i]) << "\n"; } crash_stream << std::format("FPSCR:\t\t\t0x{:08X}", hid_handler.cdinfo.fpscr) << "\n"; crash_stream << std::endl; crash_stream.flush(); crash_stream.close(); return crash_filename.str(); } return L""; } void save_memory_dump(HidHandler& hid, int mem_region_number, std::wstring filename) { uint32_t startaddr = std::get<1>(hid.cdinfo.mem_info[mem_region_number]); uint32_t endaddr = std::get<2>(hid.cdinfo.mem_info[mem_region_number]); uint32_t memsize = endaddr - startaddr; std::string region_name = std::get<0>(hid.cdinfo.mem_info[mem_region_number]); std::fstream crash_stream(filename.c_str(), std::ios::app); if (crash_stream.is_open()) { crash_stream << "MEMORY REGION \"" << region_name << "\"\n\n"; for (uint32_t curaddr = 0; curaddr < memsize; curaddr += 32) // 32 bytes per line { crash_stream << std::format("{:08X}\t", startaddr + curaddr); for (uint8_t i = 0; i < 32; i++) { if (curaddr + i < memsize) { crash_stream << std::format("{:02X}", hid_handler.cdinfo.mem_dump[mem_region_number][curaddr + i]); } } crash_stream << "\n"; } crash_stream << "\n\n"; crash_stream.flush(); crash_stream.close(); } }