osmocom-analog/src/nmt/dms.h

63 lines
2.3 KiB
C

struct dms_frame {
struct dms_frame *next;
uint8_t s; /* CT/DT frame */
uint8_t n; /* sequence number */
uint8_t data[8]; /* data */
};
struct dms_state {
int started; /* did we start conversation ? */
int rand_sent; /* if we sent rand as an initiator? */
int established; /* DT frames after RAND (ack) */
int tx_pending; /* uper layer sent data, but not yet sent and acked */
uint8_t n_r; /* next expected frame to be received */
uint8_t n_s; /* next frame to be sent */
uint8_t n_a; /* next frame to be acked */
uint8_t n_count; /* counts frames that are stored in list */
uint8_t dir; /* direction */
int eight_bits; /* what mode are used for DT frames */
struct dms_frame *frame_list; /* list of frames to transmit */
int send_rr; /* RR must be sent next */
};
typedef struct dms {
/* DMS transmission */
int tx_frame_valid; /* do we have or had a valid frame? */
char tx_frame[127]; /* carries bits of one frame to transmit */
int tx_frame_length;
int tx_frame_pos;
uint16_t rx_sync; /* shift register to detect sync */
double rx_sync_level[256]; /* level infos */
double rx_sync_quality[256]; /* quality infos */
int rx_sync_count; /* next bit to receive */
int rx_in_sync; /* if we are in sync and receive bits */
uint8_t rx_frame[12]; /* receive frame, including label at the start and 3 words crc */
double rx_frame_level[12]; /* level info */
double rx_frame_quality[12]; /* quality info */
int rx_bit_count; /* next bit to receive */
int rx_frame_count; /* next character to receive */
struct {
uint8_t d; /* direction */
uint8_t s; /* selection */
uint8_t p; /* prefix */
uint8_t n; /* number of DT frame */
} rx_label; /* used while receiving frame */
/* DMS protocol states */
struct dms_state state;
} dms_t;
int dms_init_sender(nmt_t *nmt);
void dms_cleanup_sender(nmt_t *nmt);
int dms_send_bit(nmt_t *nmt);
void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level);
void dms_reset(nmt_t *nmt);
void dms_send(nmt_t *nmt, const uint8_t *data, int length, int eight_bits);
void dms_all_sent(nmt_t *nmt);
void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int eight_bits);
void trigger_frame_transmission(nmt_t *nmt);