Tactility/CODING_STYLE_C.md
Ken Van Hoeylandt 71f8369377
TactilityKernel improvements (#464)
* **New Features**
  * Thread API with lifecycle, priority, affinity and state monitoring
  * Timer subsystem: one-shot/periodic timers, reset, pending callbacks, expiry queries
  * Expanded I²C: register-level ops, bulk writes, presence checks, ESP32 integration and new config properties
  * GPIO controller: pin level and options APIs
  * Error utilities: new error code, error-to-string, timeout helper and common macros
  * Device construction helpers (construct+start)

* **Tests**
  * New unit tests for thread and timer behavior

* **Documentation**
  * Expanded coding style guide (files/folders, C conventions)
2026-01-28 23:58:11 +01:00

2.1 KiB

C coding Style

Files & Folders

Files

Files are lower snake case.

  • Files: ^[0-9a-z_]+$
  • Directories: ^[0-9a-z_]+$

Example:

some_feature.c
some_feature.h

Folders

Project folders include:

  • source for source files and public header files
  • private for private header files
  • include for projects that require separate header files

C language

Macros and consts

These are all upper snake case:

#define MY_CONST 1
#define PRINT_SOMETHING() printf("something")
const int ANOTHER_CONST = 1;

Variables

Variable names and function parameters are lower snake case:

int some_variable;

Enumerations and Structs

Enums and struct types are upper camel case. Its fields use lower snake case.

struct ThreadData {
    int some_attribute;
};
enum SomeResult  {
    Ok,
    NotSupported,
    Error
};

Function names

Function names are lower snake case.

Example:

void get_limit() {
    // ...
}

If a set of functions relates to a struct, the CamelCase struct name is converted to a snake_case_ prefix for the function name:

struct TextMessage {
    // ...
};

void text_message_set(struct TextMessage* message) { /* ... */ }

void text_message_get(struct TextMessage* message) { /* ... */ }

Typedef of simple value types

Typedefs for simple value types (such as int, int64_t, char) are lower snake case. They are postfixed with _t

Examples:

typedef uint32_t thread_id_t;

Function comments

/**
 * @brief Validates a number
 * @param[in] number the integer to validate
 * @return true if validation was succesful and there were no issues
 */
bool validate(int number);

/**
 * @brief Run the action.
 * @param timeout[in] the maximum time the task should run
 * @retval ERROR_TIMEOUT when the task couldn't be completed on time
 * @retval ERROR_NONE when the task completed successfully
 */
error_t runAction(TickType_t timeout);

/**
 * @brief Increase a number.
 * @param[inout] number
 */
void increase(int* number);

/**
 * A function with a longer description here.
 *
 * @brief short description
 */
void something();