# SPDX-License-Identifier: GPL-3.0-only
# This file is part of Lazuli.

* Maybe switch to C99 (to allow inline). (or maybe not!)
* Allow the user to define its own Panic() function
* Be compatible with C++ user tasks
* Be compatible with Rust task.
* Be compatible with Go tasks ?
** Looks complicated, due to the presence of the garbage collector...
* TODO Add a license and define a file header to add to each file for distribution
* Pick a version numbering model.
* TODO Reference resources
** Providing links and documentation over the Internet.
* Add a README file
** [[https://youtu.be/PC05prd2usY]]
* Write documentation about header files organization
* For context saving: Allow the user to define a task with no context saving
* TODO Write doc about progmem
* Add a CONTRIBUTING file and update README.md about that
** [[https://help.github.com/articles/setting-guidelines-for-repository-contributors/]]
* Prefix Lazuli structs in userspace with "Lz_"
* Find a logo
* TODO Document build chain
* Add an "end of file" comment marker at the end of each file.
** Cf. Barr conventions.
* For example programs: write the purpose of each program.
* Replace Arch_DisableInterrupts() with Arch_DisableInterruptsGetStatus() where possible.
* When using CONFIG_CHECK_XXXXX, unify the calls to Panic() or return.
** Decide which one is the best.
* Rename some functions for API consistency:
** Lz_Run() => Lz_System_Run()
** Lz_RegisterTask() => Lz_System_RegisterTask() (or Lz_Task_Register)
* Add non blocking mutex lock
** Something like bool Lz_Mutex_TryLock(Lz_Mutex * const mutex);
* Implement pipes
** Lz_Pipe, Lz_Pipe_Read(), Lz_Pipe_Write(), Lz_Pipe_TryRead()
* Move linked lists functions declarations in a kernel header file.
** The user list.h header file will only contain the definition of structs.
* Find a way to get rid of #including AVR interrupts header file in kernel code.
* If threads are killed/crash while holding locks, what happens?
* For Cpu_Sleep -> Maybe combine the 3 calls in 1 ASM call.
* Generate doxygen documentation for stdint.h.
* Make it ZERO dynamic allocation.
** Allow the user to statically define the structures needed by the system (in particular tasks + stacks)
** Place the incremental memory allocator in a separate module. By the way, the incremental memory allocator is not thread safe.
* In documentation about modules:
** After creating the module directory:
*** Update CMakeLists.txt to add_subdirectory.
*** Update config.h.in to add the configuration macro constant.
* In .dir-locals.el add configuration for C style.
* In .bashrc of the Docker image: display a warning if the version of the image doesn't match the version of the repository.
* CMake config : prefix the config cache variables by their respective categories.
* Implement scheduler queues with AVL trees.
* Think about defining the execution of the main() function in the idle task.
** i.e. Execution begins as the idle task, and user tasks are created from the idle task.
** This allows/ease the implementation of Pthread API.
** Carefully think about priorities.
* For PROGMEM, implement "memcpy_P": Memory_CopyFromProgmem
* Test command "apropos" in man pages of the Docker image.
* In the Docker image, make sure to respect the File Hierarchy Standard
** https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
* Doxygen seems to have problems dealing with 2 header files of the same name in different directories
** mandb: can't open /usr/share/man/man3/sys_clock_24.h.3: No such file or directory
** Check if it's a real bug, and declare the issue to the Doxygen project.
   mandb: warning: /usr/share/man/man3/Clock24_Increment.3.gz: bad symlink or ROFF `.so' request
* Think about renaming the GitHub repository to "LazuliRTOS".
* Host the Lazuli docker image to GitHub instead of docker.io.
* Think about moving libc header files to the directory include/
** See if we can also get rid of directory libc/, as the corresponding functionalities are actually implemented as kernel modules
* See if it would be necessary to declare all global variables used the scheduler.c and kernel.c as 'volatile'.
