#!/bin/bash /** * @file generate_docs.sh * @brief Generate documentation for Automotive RTOS */ set -e # Script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" # Color codes RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Documentation directories DOCS_DIR="${PROJECT_ROOT}/docs" BUILD_DOCS_DIR="${PROJECT_ROOT}/build/docs" DOXYGEN_DIR="${BUILD_DOCS_DIR}/doxygen" HTML_DIR="${DOXYGEN_DIR}/html" PDF_DIR="${DOXYGEN_DIR}/pdf" # Print banner echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} Documentation Generator${NC}" echo -e "${BLUE}========================================${NC}" echo "" # Check for doxygen check_doxygen() { if ! command -v doxygen >/dev/null 2>&1; then echo -e "${YELLOW}Doxygen not found. Installing...${NC}" sudo apt-get install -y doxygen graphviz fi } # Check for other tools check_tools() { # LaTeX for PDF generation if ! command -v pdflatex >/dev/null 2>&1; then echo -e "${YELLOW}LaTeX not found. PDF generation will be skipped.${NC}" GENERATE_PDF=false else GENERATE_PDF=true fi # Graphviz for diagrams if ! command -v dot >/dev/null 2>&1; then echo -e "${YELLOW}Graphviz not found. Installing...${NC}" sudo apt-get install -y graphviz fi } # Generate doxygen configuration generate_doxygen_config() { echo -e "${YELLOW}Generating Doxygen configuration...${NC}" cat > "${BUILD_DOCS_DIR}/Doxyfile" << EOF # Doxygen configuration for Automotive RTOS # Project information PROJECT_NAME = "Automotive RTOS" PROJECT_NUMBER = "1.0.0" PROJECT_BRIEF = "Real-time operating system for automotive applications" OUTPUT_DIRECTORY = ${DOXYGEN_DIR} # Source files INPUT = ${PROJECT_ROOT}/kernel \ ${PROJECT_ROOT}/drivers \ ${PROJECT_ROOT}/middleware \ ${PROJECT_ROOT}/applications \ ${PROJECT_ROOT}/config \ ${PROJECT_ROOT}/board \ ${PROJECT_ROOT}/README.md # Include paths INCLUDE_PATH = ${PROJECT_ROOT}/kernel/include \ ${PROJECT_ROOT}/drivers/include \ ${PROJECT_ROOT}/middleware \ ${PROJECT_ROOT}/config # File patterns FILE_PATTERNS = *.c *.h *.md RECURSIVE = YES # Output formats GENERATE_HTML = YES GENERATE_LATEX = ${GENERATE_PDF} GENERATE_RTF = NO GENERATE_XML = YES GENERATE_MAN = NO # HTML output HTML_OUTPUT = html HTML_FILE_EXTENSION = .html GENERATE_TREEVIEW = YES DISPLAY_GRAPH = YES # LaTeX output LATEX_OUTPUT = pdf COMPACT_LATEX = YES PDF_HYPERLINKS = YES USE_PDFLATEX = YES # Diagrams HAVE_DOT = YES DOT_GRAPH_MAX_NODES = 50 CALL_GRAPH = YES CALLER_GRAPH = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES # Code documentation EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO # Warnings WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES # Source browser SOURCE_BROWSER = YES INLINE_SOURCES = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES # Search engine SEARCHENGINE = YES SERVER_BASED_SEARCH = NO # Colors HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 EOF echo -e "${GREEN}✓ Doxygen configuration generated${NC}" } # Generate API documentation generate_api_docs() { echo -e "${YELLOW}Generating API documentation...${NC}" mkdir -p "${DOCS_DIR}/api" # Extract function documentation from headers for header in "${PROJECT_ROOT}"/kernel/include/*.h; do if [ -f "$header" ]; then basename=$(basename "$header" .h) output="${DOCS_DIR}/api/${basename}.md" echo "# ${basename} API Documentation" > "$output" echo "" >> "$output" echo "Auto-generated documentation for ${header}" >> "$output" echo "" >> "$output" # Extract function prototypes grep -E "^(KernelStatus_t|void|uint|int|bool|float|TaskHandle_t)" "$header" | \ while read -r line; do echo "\`\`\`c" >> "$output" echo "$line" >> "$output" echo "\`\`\`" >> "$output" echo "" >> "$output" done fi done echo -e "${GREEN}✓ API documentation generated${NC}" } # Generate architecture documentation generate_architecture_docs() { echo -e "${YELLOW}Generating architecture documentation...${NC}" mkdir -p "${DOCS_DIR}/architecture" cat > "${DOCS_DIR}/architecture/system_overview.md" << 'EOF' # System Architecture Overview ## Introduction The Automotive RTOS is designed for safety-critical automotive applications. It provides deterministic real-time performance with priority-based preemptive scheduling. ## System Layers 1. **Application Layer** - Engine Control - Brake Control - Body Control - Dashboard 2. **Middleware Layer** - CAN Stack (ISO 15765-2) - Network Management - Diagnostics (UDS, OBD-II) - Safety Features 3. **Driver Layer** - CAN Driver - UART Driver - SPI Driver - I2C Driver - GPIO Driver - ADC Driver - PWM Driver 4. **Kernel Layer** - Task Management - Scheduler - Synchronization - Memory Management - Interrupt Handling ## Design Principles - Deterministic scheduling - Priority inheritance - Memory protection - Stack overflow detection - Fault tolerance - Watchdog integration - E2E protection ## Safety Features - ISO 26262 compliance - ASIL-D ready - Redundancy support - Fault detection - Safe state management EOF echo -e "${GREEN}✓ Architecture documentation generated${NC}" } # Generate user guide generate_user_guide() { echo -e "${YELLOW}Generating user guide...${NC}" mkdir -p "${DOCS_DIR}/user_guide" cat > "${DOCS_DIR}/user_guide/getting_started.md" << 'EOF' # Getting Started Guide ## Prerequisites - ARM GCC toolchain - CMake 3.10+ - Make - Git ## Installation 1. Clone repository: ```bash git clone https://github.com/automotive-rtos/rtos.git cd rtos