155 lines
3.2 KiB
Markdown
155 lines
3.2 KiB
Markdown
# Signing the CLA
|
|
|
|
Before contributing to this project, you must sign [the CLA](/cla/cla-1.0.0.md).
|
|
|
|
To sign the CLA, add your GitHub username to the end of the CLA. Make sure that the usernames remain alphabetically sorted.
|
|
|
|
Then create a pull request with the title:
|
|
|
|
> Sign CLA
|
|
|
|
and with the body:
|
|
|
|
> I have read the Agreement, and fully agree to it by signing it with my GitHub username.
|
|
|
|
# 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](https://travis-ci.org/UltimateHackingKeyboard/firmware).
|