- 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
70 lines
1.9 KiB
C
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);
|