Skip to content

Latest commit

 

History

History
140 lines (102 loc) · 2.81 KB

CONTRIBUTING.md

File metadata and controls

140 lines (102 loc) · 2.81 KB

Coding standards

Literal structure

  • 4 spaces are used for tabulation. No tabs are allowed.
  • Unix line endings are used.
  • Curlies are always explicitly written, even for single statements.
  • No trailing whitespaces at the end of lines.
  • Insert closing newline at the end of files.

Naming identifiers

Extern functions and variables are written with UpperCamelCase, non-extern functions and variables are written with lowerCamelCase.

Function names are composed of a verb followed by a noun.

Non-extern functions must be declared as static.

DoThisExtern(void);
static doThisNonExtern(void);
uint8 ExternVariable;
uint8 nonExternVariable;

Whenever a file exposes a group of functions as a consistent API, their function names should be prefixed with the group name, followed by _, followed by the individual function names.

void LedDriver_WriteBuffer(uint8_t i2cAddress, uint8_t buffer[], uint8_t size);
void LedDriver_WriteRegister(uint8_t i2cAddress, uint8_t reg, uint8_t val);
void LedDriver_SetAllLedsTo(uint8_t val);

Function scoped variables and function parameters are written with lowerCamelCase.

void MyFunction(uint8_t myArg1, uint8_t myArg2)
{
    uint8_t myVariable;
    ....
}

Type names are written with underscores, and end with _t. Type members are written with lowerCamelCase.

typedef struct {
    uint8_t acceleration;
    uint8_t maxSpeed;
    uint8_t roles[LAYER_COUNT];
} pointer_t;

Control structures

if (something) {
    ...
} else {
    ...
}

switch (currentMacroAction.key.type) {
    case KeystrokeType_Basic:
        addBasicScancode(currentMacroAction.key.scancode);
        break;
    case KeystrokeType_Media:
        addMediaScancode(currentMacroAction.key.scancode);
        break;
    case KeystrokeType_System:
        addSystemScancode(currentMacroAction.key.scancode);
        break;
}

for (uint8_t i = 0; i < j; i++) {
    ...
}

while (condition) {
    ...
}

Function declaration

void doThis(void)
{
    ...
}

Function calls

myFunction();

Header file structure

Header files are composed of sections. The order of sections is fixed. Every header file is guarded by a file-wide #ifndef.

#ifndef __LED_DRIVER_H__
#define __LED_DRIVER_H__

// Includes:

    #include "fsl_gpio.h"
    ...

// Macros:

    #define LED_DRIVER_SDB_PORT PORTA
    ...

// Typedefs:

    typedef enum {
        KeystrokeType_Basic,
        KeystrokeType_Media,
        KeystrokeType_System,
    } keystroke_type_t;

// Variables:

    extern led_driver_state_t LedDriverState;
    ...

// Functions:

    void LedDriver_WriteBuffer(uint8_t i2cAddress, uint8_t buffer[], uint8_t size);
    ...

#endif

Semantics

The build process must not yield any warnings, and the build must pass on Travis.