From a5276f7d534c3b56bdbfbe494fa451b80f29379b Mon Sep 17 00:00:00 2001 From: Max Tyson <98maxt98@gmail.com> Date: Fri, 5 Jan 2024 20:22:03 +1300 Subject: [PATCH] Generate Doxygen --- .github/workflows/documentation.yml | 36 ++ Makefile | 7 + docs/Screenshots/Logo.png | Bin 0 -> 30142 bytes docs/doxy/Doxyfile | 359 ++++++++++++++++++ kernel/include/common/colour.h | 2 +- kernel/include/common/outputStream.h | 2 +- kernel/include/common/rectangle.h | 7 +- kernel/include/common/time.h | 1 + kernel/include/drivers/clock/clock.h | 1 + kernel/include/filesystem/fat32.h | 8 + kernel/include/filesystem/msdospart.h | 8 + kernel/include/gui/font.h | 5 +- kernel/include/gui/window.h | 4 + .../hardwarecommunication/interrupts.h | 34 +- kernel/include/memory/memoryIO.h | 13 +- kernel/include/memory/memorymanagement.h | 4 + kernel/include/system/multitasking.h | 4 + kernel/include/system/multithreading.h | 9 +- kernel/include/system/process.h | 4 + kernel/include/system/syscalls.h | 5 + toolchain/make_documentation.sh | 30 ++ 21 files changed, 524 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/documentation.yml create mode 100644 docs/Screenshots/Logo.png create mode 100644 docs/doxy/Doxyfile create mode 100755 toolchain/make_documentation.sh diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 00000000..dfea5aaa --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,36 @@ +name: MaxOS + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the master branch + push: + branches: [ main ] + pull_request: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + build-os: + # The type of runner that the job will run on + runs-on: ubuntu-20.04 + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Generate Docs + run: | + make documentation + + - name: Upload to branch + uses: s0/git-publish-subdir-action@develop + env: + REPO: self + BRANCH: docs + FOLDER: docs/doxy + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MESSAGE: "Build: ({sha}) {msg}" diff --git a/Makefile b/Makefile index 9db825fa..1b106b60 100644 --- a/Makefile +++ b/Makefile @@ -83,15 +83,22 @@ virtualbox: iso .PHONY: clean clean: + # Remove the kernel object files rm -rf obj rm -f maxOS.bin maxOS.sym maxOS.img + # Remove all files and folders in the docs/doxy folder except for the Doxyfile + cd docs/doxy && find . ! -name 'Doxyfile' -type f -exec rm -f {} + + cross_compiler: cd toolchain && ./make_cross_compiler.sh disk_img: cd toolchain && ./create_disk_img.sh +documentation: + cd toolchain && ./make_documentation.sh + install_deps: sudo apt-get update -y sudo apt-get install -y grub-pc qemu-system-i386 gdb dosfstools bridge-utils xorriso diff --git a/docs/Screenshots/Logo.png b/docs/Screenshots/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..439a583886ff6a253985368f1d5e06d454e28fa5 GIT binary patch literal 30142 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 xMUfO9!}BzA)05wIjNs2OVx4 class Rectangle{ public: Type left { 0 }; diff --git a/kernel/include/common/time.h b/kernel/include/common/time.h index c53ad3fd..bc642a83 100644 --- a/kernel/include/common/time.h +++ b/kernel/include/common/time.h @@ -13,6 +13,7 @@ namespace maxOS{ /** * @struct Time + * @brief Stores the year, month, day, hour, minute and second of a time. */ struct Time{ diff --git a/kernel/include/drivers/clock/clock.h b/kernel/include/drivers/clock/clock.h index 7bf117c5..ab22f5bc 100644 --- a/kernel/include/drivers/clock/clock.h +++ b/kernel/include/drivers/clock/clock.h @@ -35,6 +35,7 @@ namespace maxOS { /** * @class ClockEventHandler + * @brief Handles the events triggered by the clock */ class ClockEventHandler : public common::EventHandler{ diff --git a/kernel/include/filesystem/fat32.h b/kernel/include/filesystem/fat32.h index 98f36581..16b46e38 100644 --- a/kernel/include/filesystem/fat32.h +++ b/kernel/include/filesystem/fat32.h @@ -16,6 +16,10 @@ namespace maxOS{ namespace filesystem{ + /** + * @struct BiosParameterBlock + * @brief Stores information about the FAT32 filesystem + */ struct BiosParameterBlock32{ uint8_t jump[3]; @@ -49,6 +53,10 @@ namespace maxOS{ } __attribute__((packed)); + /** + * @struct DirectoryEntry + * @brief Stores information about a file or directory + */ struct DirectoryEntry{ uint8_t name[8]; diff --git a/kernel/include/filesystem/msdospart.h b/kernel/include/filesystem/msdospart.h index 254384bc..b55beccd 100644 --- a/kernel/include/filesystem/msdospart.h +++ b/kernel/include/filesystem/msdospart.h @@ -14,6 +14,10 @@ namespace maxOS{ namespace filesystem{ + /** + * @struct PartitionTableEntry + * @brief Stores information about a partition + */ struct PartitionTableEntry{ uint8_t bootable; // 0x80 = bootable, 0x00 = not bootable @@ -33,6 +37,10 @@ namespace maxOS{ } __attribute__((packed)); + /** + * @struct MasterBootRecord + * @brief Stores information about the master boot record + */ struct MasterBootRecord{ uint8_t bootloader[440]; diff --git a/kernel/include/gui/font.h b/kernel/include/gui/font.h index 81c8a695..b50b3e43 100644 --- a/kernel/include/gui/font.h +++ b/kernel/include/gui/font.h @@ -43,7 +43,10 @@ namespace maxOS{ }; - + /** + * @class AmigaFont + * @brief A font that uses the Amiga 8x8 font + */ class AmigaFont : public Font{ public: AmigaFont(); diff --git a/kernel/include/gui/window.h b/kernel/include/gui/window.h index 66831660..b6e1082d 100644 --- a/kernel/include/gui/window.h +++ b/kernel/include/gui/window.h @@ -13,6 +13,10 @@ namespace maxOS{ namespace gui{ + /** + * @class Window + * @brief A window that can be moved and resized and contains a widget. + */ class Window : public CompositeWidget{ protected: diff --git a/kernel/include/hardwarecommunication/interrupts.h b/kernel/include/hardwarecommunication/interrupts.h index ffb02bc8..c8013d71 100644 --- a/kernel/include/hardwarecommunication/interrupts.h +++ b/kernel/include/hardwarecommunication/interrupts.h @@ -35,6 +35,27 @@ namespace maxOS { }; + /** + * @struct GateDescriptor + * @brief Describes a gate in the Interrupt Descriptor Table + */ + struct GateDescriptor { + uint16_t handler_address_low_bits; + uint16_t gdt_code_segment_selector; + uint8_t reserved; + uint8_t access; + uint16_t handler_address_high_bits; + } __attribute__((packed)); + + /** + * @struct InterruptDescriptorTablePointer + * @brief Describes the Interrupt Descriptor Table + */ + struct InterruptDescriptorTablePointer { + uint16_t size; + uint32_t base; + } __attribute__((packed)); + /** * @class InterruptManager * @brief Handles all interrupts and passes them to the correct handler @@ -50,21 +71,8 @@ namespace maxOS { InterruptHandler* m_interrupt_handlers[256]; //TODO: Make vector? system::ThreadManager* m_thread_manager; - struct GateDescriptor { - uint16_t handler_address_low_bits; - uint16_t gdt_code_segment_selector; - uint8_t reserved; - uint8_t access; - uint16_t handler_address_high_bits; - } __attribute__((packed)); - static GateDescriptor s_interrupt_descriptor_table[256]; - struct InterruptDescriptorTablePointer { - uint16_t size; - uint32_t base; - } __attribute__((packed)); - static void set_interrupt_descriptor_table_entry(uint8_t interrupt, uint16_t code_segment_selector_offset, void (*handler)(), uint8_t DescriptorPrivilegeLevel, uint8_t descriptor_type); static void InterruptIgnore(); diff --git a/kernel/include/memory/memoryIO.h b/kernel/include/memory/memoryIO.h index 9528f8cb..678809ed 100644 --- a/kernel/include/memory/memoryIO.h +++ b/kernel/include/memory/memoryIO.h @@ -36,7 +36,10 @@ namespace maxOS{ virtual uint8_t read(); }; - + /** + * @class MemIO16Bit + * @brief Handles 16 bit memory IO + */ class MemIO16Bit : public MemIO { public: MemIO16Bit(uint32_t address); @@ -46,6 +49,10 @@ namespace maxOS{ virtual uint16_t read(); }; + /** + * @class MemIO32Bit + * @brief Handles 32 bit memory IO + */ class MemIO32Bit : public MemIO { public: MemIO32Bit(uint32_t address); @@ -55,6 +62,10 @@ namespace maxOS{ virtual uint32_t read(); }; + /** + * @class MemIO64Bit + * @brief Handles 64 bit memory IO + */ class MemIO64Bit : public MemIO { public: MemIO64Bit(uint32_t address); diff --git a/kernel/include/memory/memorymanagement.h b/kernel/include/memory/memorymanagement.h index 1fc257e5..73734fee 100644 --- a/kernel/include/memory/memorymanagement.h +++ b/kernel/include/memory/memorymanagement.h @@ -12,6 +12,10 @@ namespace maxOS{ namespace memory{ + /** + * @struct MemoryChunk + * @brief Stores information about a memory chunk in the memory manager linked list + */ struct MemoryChunk{ MemoryChunk* next; diff --git a/kernel/include/system/multitasking.h b/kernel/include/system/multitasking.h index ad206223..9149ab46 100644 --- a/kernel/include/system/multitasking.h +++ b/kernel/include/system/multitasking.h @@ -13,6 +13,10 @@ namespace maxOS{ namespace system{ + /** + * @struct CPUState + * @brief Stores the state of the CPU registers + */ struct CPUState { //Pushed by kernel in interupt_stubs diff --git a/kernel/include/system/multithreading.h b/kernel/include/system/multithreading.h index 4b4102d9..df85f056 100644 --- a/kernel/include/system/multithreading.h +++ b/kernel/include/system/multithreading.h @@ -14,6 +14,10 @@ namespace maxOS{ namespace system{ + /** + * @class Thread + * @brief A execution thread that can be scheduled by the ThreadManager + */ class Thread { friend class ThreadManager; @@ -29,7 +33,10 @@ namespace maxOS{ void init(system::GlobalDescriptorTable *gdt, void entrypoint()); }; - + /** + * @class ThreadManager + * @brief Manages the scheduling of threads + */ class ThreadManager { private: diff --git a/kernel/include/system/process.h b/kernel/include/system/process.h index 9709a5ad..bd0ccd9f 100644 --- a/kernel/include/system/process.h +++ b/kernel/include/system/process.h @@ -13,6 +13,10 @@ namespace maxOS{ class Process; + /** + * @class Process + * @breif TODO + */ class Process{ // TODO: Re-work process class }; diff --git a/kernel/include/system/syscalls.h b/kernel/include/system/syscalls.h index a64cd00d..6b03eb99 100644 --- a/kernel/include/system/syscalls.h +++ b/kernel/include/system/syscalls.h @@ -11,6 +11,11 @@ namespace maxOS{ namespace system{ + + /** + * @class SyscallHandler + * @brief Handles system calls + */ class SyscallHandler : hardwarecommunication::InterruptHandler{ public: diff --git a/toolchain/make_documentation.sh b/toolchain/make_documentation.sh new file mode 100755 index 00000000..b761a566 --- /dev/null +++ b/toolchain/make_documentation.sh @@ -0,0 +1,30 @@ +#!/bin/bash +source ./maxOS.sh + +# Go to the project root directory +cd ../docs/doxy + +# Install Required Packages +sudo apt-get install doxygen + +# Download required extensions +msg "Downloading extensions..." +ls doxygen-awesome.css || wget https://raw.githubusercontent.com/jothepro/doxygen-awesome-css/main/doxygen-awesome.css +ls doxygen-awesome-darkmode-toggle.js || wget https://raw.githubusercontent.com/jothepro/doxygen-awesome-css/main/doxygen-awesome-darkmode-toggle.js +ls doxygen-awesome-paragraph-link.js || wget https://raw.githubusercontent.com/jothepro/doxygen-awesome-css/main/doxygen-awesome-paragraph-link.js +ls doxygen-awesome-interactive-toc.js || wget https://raw.githubusercontent.com/jothepro/doxygen-awesome-css/main/doxygen-awesome-interactive-toc.js + +msg "Setting up extensions..." + +# Create the header template +doxygen -w html header.html delete_me.html delete_me.css + +# Find head tag in script and add the extensions +sed -i '/<\/head>/i \n\n\n' header.html + + +# Generate the documentation +msg "Generating documentation..." +doxygen Doxyfile + +msg "Documentation generated successfully!" \ No newline at end of file