IP400/Raspberry Pi/ip400spi/include/frame.h
2025-03-28 13:01:50 -06:00

207 lines
6.5 KiB
C

/*---------------------------------------------------------------------------
Project: WL33_NUCLEO_UART
Module: <module description here>
File Name: frame.h
Date Created: Jan 8, 2025
Author: MartinA
Description: <what it does>
Copyright © 2024-25, Alberta Digital Radio Communications Society,
All rights reserved
Revision History:
---------------------------------------------------------------------------*/
#ifndef FRAME_H_
#define FRAME_H_
#include <stdint.h>
#include "types.h"
// frame defines
#define N_CALL 4 // octets in the excess-40 compressed callsign
#define MAX_CALL 6 // max callsign size
#define EXT_CALL 4*MAX_CALL // extended call sign field
#define PAYLOAD_MIN 56 // min octets in payload
#define PAYLOAD_MAX 1053 // max octets in payload
#define MAX_CALL_BUFFER 20 // max buffering for callsign in payload
#define N_FEC 4 // number of bytes in the FEC
#define BROADCAST_ADDR 0xFF // broadcast address
#define MAX_HOP_COUNT 15 // max hop count
// transmit states
enum {
TX_IDLE=0, // idle - waiting for work
TX_SENDING, // sending a frame
TX_DONE // done
};
// radio error register
#define SEQ_COMPLETE_ERR 0x8000 // Sequencer error
#define SEQ_ACT_TIMEOUT 0x4000 // Sequencer action timeout
#define PLL_CALAMP_ERR 0x0800 // VCO amplitude calibration error
#define PLL_CALFREQ_ERR 0x0400 // VCO frequency calibration error
#define PLL_UNLOCK_ERR 0x0200 // PLL is unlocked
#define PLL_LOCK_FAIL 0x0100 // PLL lock failure
#define DBM_FIFO_ERR 0x0020 // Data buffer failure
#define N_RADIO_ERRS 7 // number of the above
// radio FSM states
enum fsm_states_e {
FSM_IDLE=0, // idle
FSM_ENA_RF_REG, // enable RF registers
FSM_WAIT_ACTIVE2, // wait for active 2
FSM_ACTIVE2, // active 2
FSM_ENA_CURR, // enable current
FSM_SYNTH_SETUP, // synth setup
FSM_CALIB_VCO, // VCO calibration
FSM_LOCKRXTX, // lock Rx and Rx
FSM_LOCKONTX, // lock on Rx
FSM_EN_PA, // enable PA
FSM_TX, // transmit
FSM_PA_DWN_ANA, // Analog power down
FSM_END_TX, // end transmit
FSM_LOCKONRX, // lock on Rx
FSM_EN_RX, // Enable Rx
FSM_EN_LNA, // enable LNA
FSM_RX, // recieve
FSM_END_RX, // end rx
FSM_SYNTH_PWDN, // synth power down
FSM_N_FSM_STATES
};
// header flags
typedef struct frame_flags_t {
unsigned hop_count: 4; // hop count
unsigned coding: 4; // coding method
unsigned compression: 2; // compression method
unsigned unused: 1; // unused
unsigned srcExt: 1; // source call is extended
unsigned destExt: 1; // dest call is extended
unsigned command: 1; // command packet
unsigned noconnect: 1; // connectionless
unsigned repeat: 1; // repeat flag
} IP400_FLAGS;
// callsign field
typedef struct callsign_t {
union {
uint8_t bytes[N_CALL]; // compressed callsign
uint32_t encoded;
} callbytes;
uint16_t port; // port information
} IP400_CALL;
// complete frame
typedef struct ip400_frame_t {
IP400_CALL source; // source call sign
IP400_CALL dest; // destination call sign
union {
IP400_FLAGS flags; // flag bit field
uint16_t allflags; // all flags
} flagfld;
uint32_t seqNum; // packet sequence number
void *buf; // data to send
uint16_t length; // data length
} IP400_FRAME;
// min/max payload sizes
#define IP_400_PORT_SIZE sizeof(uint16_t)
#define IP_400_CALL_SIZE (N_CALL + IP_400_PORT_SIZE)
#define IP_400_FLAG_SIZE sizeof(uint16_t)
#define IP_400_HDR_SIZE (2*IP_400_CALL_SIZE + IP_400_FLAG_SIZE)
#define IP_400_LEN_SIZE sizeof(uint16_t)
#define MIN_FRAME_SIZE sizeof(IP400_FRAME) + PAYLOAD_MIN + N_FEC
#define MAX_FRAME_SIZE MIN_FRAME_SIZE - PAYLOAD_MIN + PAYLOAD_MAX
// packet types
enum {
UTF8_TEXT_PACKET=0, // Text packet
COMPRESSED_AUDIO, // compressed audio packet
COMPREESSD_VIDEO, // compressed video packet
DATA_PACKET, // data packet
PING_PACKET, // ping packet
IP_ENCAPSULATED, // IP encapsulated packet
AX_25_PACKET, // AX.25 encapsulated packet
RFC4733_DTMF, // DTMF packet
DMR_FRAME, // DMR Frame
DSTAR_FRAME, // Dstar Frame
P25_FRAME, // TIA project 25
NXDN_FRAME, // NXDN
M17_FRAME, // M17
TBD_1,
TBD_2,
LOCAL_COMMAND // local command frame
};
// audio compression types
enum {
AUDIO_RAW, // raw 16-bit PCM
AUDIO_ULAW, // mu law compression
AUDIO_CODEC2, // codec 2 encoded
AUDIO_AMBE // AMBE encoded
};
// H.246 Video compression
enum {
H264_240_180_24, // H.264: 240x180, 24FPS
H264_320_240_24, // H.264: 320x240, 24FPS
H264_480_360_12, // H.264: 480x360, 12FPS
H264_640_480_6 // H.264: 640x480, 6FPS
};
// callsign fields
enum {
SRC_CALLSIGN=0, // dest for encode is source callsign
DEST_CALLSIGN // dest for encode is dest callsign
};
// frame stats
typedef struct frame_stats_t {
uint32_t TxFrameCnt; // transmit frame count
uint32_t RxFrameCnt; // good receive frame count
uint32_t CRCErrors; // CRC Errors
uint32_t TimeOuts; // Timeouts
uint32_t lastRSSI; // last RSSI reading
uint32_t framesOK; // processed frames
uint32_t dropped; // rejected frames
uint32_t duplicates; // duplicates
uint32_t nBeacons; // number of beacons processed
uint32_t nRepeated; // repeated frames
} FRAME_STATS;
// packet types
#define ICMP_TYPE 1 // control message type
#define ENC_IP_TYPE 4 // encapsulated IP
#define AUDIO_TYPE 11 // audio packets
#define TEXT_TYPE 17 // port for text chat (UDP)
#define VIDEO_TYPE 75 // H.264 video
#define ENC_AX25_TYPE 93 // encapsulated AX25 packets
uint8_t getFrameStatus(void);
// references
uint8_t callEncode(char *callsign, uint16_t port, IP400_FRAME *frame, uint8_t dest, uint8_t offset);
BOOL callDecode(IP400_CALL *encCall, char *callsign, uint16_t *port);
// frame senders
BOOL SendTextFrame(char *srcCall, uint16_t srcPort, char *destCall, uint16_t dstPort, char *buf, uint16_t length, BOOL repeat);
void SendBeaconFrame(char *srcCall, uint8_t *payload, int bcnlen);
//
BOOL EnqueChatFrame(void *Frame); // queue a chat frame
FRAME_STATS *GetFrameStats(void); // return the frame stats
uint32_t GetRadioStatus(void); // get the radio status
uint8_t GetFSMState(void); // get FSM state
//
uint8_t getFrameStatus(void); // get the frame status
#endif /* FRAME_H_ */