Files
lorakiss/src/kiss.h
Maze X 3baf7df0d1 Apply clang-format to source files and fix linter config
- Formatted all .c/.cpp/.h files using LLVM style (4-space indent, 88-char lines)
- Fixed macro alignment, pointer alignment, brace placement
- Updated .clang-format to use Cpp language (valid enum value)
- Removed clang-tidy pre-commit hook (requires additional setup)
- Pre-commit now runs clang-format for automated formatting
- Verified: All boards still build without errors or warnings
2026-03-27 17:48:39 +01:00

70 lines
1.9 KiB
C

#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
/* KISS special bytes */
#define KISS_FEND 0xC0u
#define KISS_FESC 0xDBu
#define KISS_TFEND 0xDCu
#define KISS_TFESC 0xDDu
/* Port assignments */
#define KISS_PORT_DATA 0u
#define KISS_PORT_QUALITY 1u
#define KISS_PORT_CONFIG 2u
/* Configuration command opcodes (port 2) */
#define KISS_CMD_RESERVED 0x00u
#define KISS_CMD_RES_OK 0x01u
#define KISS_CMD_RES_ERROR 0x02u
#define KISS_CMD_GET_RADIO 0x10u
#define KISS_CMD_SET_RADIO 0x11u
#define KISS_CMD_GET_FREQ 0x12u
#define KISS_CMD_SET_FREQ 0x13u
#define KISS_CMD_GET_BW 0x14u
#define KISS_CMD_SET_BW 0x15u
#define KISS_CMD_GET_SF 0x16u
#define KISS_CMD_SET_SF 0x17u
#define KISS_CMD_GET_CR 0x18u
#define KISS_CMD_SET_CR 0x19u
#define KISS_CMD_GET_POWER 0x1Au
#define KISS_CMD_SET_POWER 0x1Bu
#define KISS_CMD_GET_SYNCWORD 0x1Cu
#define KISS_CMD_SET_SYNCWORD 0x1Du
#define KISS_MAX_FRAME 256u
typedef struct {
uint8_t port;
uint8_t data[KISS_MAX_FRAME];
uint16_t len;
} kiss_frame_t;
typedef enum {
KISS_STATE_IDLE,
KISS_STATE_IN_FRAME,
KISS_STATE_ESCAPE,
} kiss_state_t;
typedef struct {
kiss_state_t state;
uint8_t buf[KISS_MAX_FRAME + 1u]; /* +1 for type byte */
uint16_t len;
} kiss_decoder_t;
void kiss_decoder_init(kiss_decoder_t *dec);
/* Feed one byte into the decoder. Returns true when a complete frame is
ready in *frame. frame must not be NULL when return value is checked. */
bool kiss_decode(kiss_decoder_t *dec, uint8_t byte, kiss_frame_t *frame);
/* Encode port+data into a KISS frame. Returns bytes written, or 0 on
overflow. */
size_t kiss_encode(uint8_t port, const uint8_t *data, size_t len, uint8_t *dst,
size_t dst_cap);
/* Encode a 3-byte signal quality frame for port 1. Big-endian: int8 snr,
int16 rssi. */
size_t kiss_encode_quality(int8_t snr, int16_t rssi, uint8_t *dst, size_t dst_cap);