forked from cellular-infrastructure/osmocom-analog
108 lines
4.5 KiB
C
108 lines
4.5 KiB
C
#include "../libmobile/sender.h"
|
|
|
|
enum pocsag_function {
|
|
POCSAG_FUNCTION_NUMERIC = 0,
|
|
POCSAG_FUNCTION_BEEP1,
|
|
POCSAG_FUNCTION_BEEP2,
|
|
POCSAG_FUNCTION_ALPHA,
|
|
};
|
|
|
|
extern const char *pocsag_function_name[4];
|
|
|
|
enum pocsag_state {
|
|
POCSAG_IDLE = 0,
|
|
POCSAG_PREAMBLE,
|
|
POCSAG_MESSAGE,
|
|
};
|
|
|
|
enum pocsag_language {
|
|
LANGUAGE_DEFAULT = 0,
|
|
LANGUAGE_GERMAN,
|
|
};
|
|
|
|
struct pocsag;
|
|
|
|
/* instance of outgoing message */
|
|
typedef struct pocsag_msg {
|
|
struct pocsag_msg *next;
|
|
struct pocsag *pocsag;
|
|
int callref; /* call reference */
|
|
uint32_t ric; /* current pager ID */
|
|
enum pocsag_function function; /* current function */
|
|
char data[256]; /* message to be transmitted */
|
|
int data_length; /* length of message that is not 0-terminated */
|
|
int data_index; /* current character transmitting */
|
|
int bit_index; /* current bit transmitting */
|
|
int repeat; /* how often the message is sent */
|
|
} pocsag_msg_t;
|
|
|
|
/* instance of pocsag transmitter/receiver */
|
|
typedef struct pocsag {
|
|
sender_t sender;
|
|
|
|
/* system info */
|
|
int tx; /* can transmit */
|
|
int rx; /* can receive */
|
|
enum pocsag_language language; /* special characters */
|
|
enum pocsag_function default_function; /* default function, if not given by caller */
|
|
const char *default_message; /* default message, if caller has no caller ID */
|
|
|
|
/* tx states */
|
|
enum pocsag_state state; /* state (idle, preamble, message) */
|
|
pocsag_msg_t *current_msg; /* msg, if message codewords are transmitted */
|
|
int word_count; /* counter for codewords */
|
|
int idle_count; /* counts when to go idle */
|
|
uint32_t scan_from, scan_to; /* if not equal: scnning mode */
|
|
|
|
/* rx states */
|
|
int rx_msg_valid; /* currently in receiving message state */
|
|
uint32_t rx_msg_ric; /* ric of message */
|
|
enum pocsag_function rx_msg_function; /* function of message */
|
|
char rx_msg_data[256]; /* data buffer */
|
|
int rx_msg_data_length; /* complete characters received */
|
|
int rx_msg_bit_index; /* current bit received for alphanumeric */
|
|
|
|
/* calls */
|
|
pocsag_msg_t *msg_list; /* linked list of all calls */
|
|
|
|
/* dsp states */
|
|
double fsk_deviation; /* deviation of FSK signal on sound card */
|
|
double fsk_polarity; /* polarity of FSK signal (-1.0 = bit '1' is down) */
|
|
sample_t fsk_ramp_up[256]; /* samples of upward ramp shape */
|
|
sample_t fsk_ramp_down[256]; /* samples of downward ramp shape */
|
|
double fsk_bitduration; /* duration of a bit in samples */
|
|
double fsk_bitstep; /* fraction of a bit each sample */
|
|
sample_t *fsk_tx_buffer; /* tx buffer for one data block */
|
|
int fsk_tx_buffer_size; /* size of tx buffer (in samples) */
|
|
int fsk_tx_buffer_length; /* usage of buffer (in samples) */
|
|
int fsk_tx_buffer_pos; /* current position sending buffer */
|
|
double fsk_tx_phase; /* current bit position */
|
|
uint8_t fsk_tx_lastbit; /* last bit of last message, to correctly ramp */
|
|
double fsk_rx_phase; /* current sample position */
|
|
uint8_t fsk_rx_lastbit; /* last bit of last message, to detect level */
|
|
uint32_t fsk_rx_word; /* shift register to receive codeword */
|
|
int fsk_rx_sync; /* counts down to next sync */
|
|
int fsk_rx_index; /* counts bits of received codeword */
|
|
} pocsag_t;
|
|
|
|
int msg_receive(const char *text);
|
|
|
|
int pocsag_function_name2value(const char *text);
|
|
void pocsag_list_channels(void);
|
|
double pocsag_channel2freq(const char *kanal, double *deviation, double *polarity, int *baudrate);
|
|
const char *pocsag_number_valid(const char *number);
|
|
void pocsag_add_id(const char *id);
|
|
int pocsag_init(void);
|
|
void pocsag_exit(void);
|
|
int pocsag_init(void);
|
|
void pocsag_exit(void);
|
|
void pocsag_new_state(pocsag_t *pocsag, enum pocsag_state new_state);
|
|
void pocsag_msg_receive(enum pocsag_language language, const char *channel, uint32_t ric, enum pocsag_function function, const char *message);
|
|
int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback);
|
|
void pocsag_destroy(sender_t *sender);
|
|
void pocsag_msg_send(enum pocsag_language language, const char *text);
|
|
void pocsag_msg_destroy(pocsag_msg_t *msg);
|
|
void pocsag_get_id(pocsag_t *euro, char *id);
|
|
void pocsag_receive_id(pocsag_t *euro, char *id);
|
|
void pocsag_msg_done(pocsag_t *pocsag);
|