aboutsummaryrefslogtreecommitdiffstats
path: root/src/datenklo/am791x.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/datenklo/am791x.h')
-rw-r--r--src/datenklo/am791x.h107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/datenklo/am791x.h b/src/datenklo/am791x.h
new file mode 100644
index 0000000..a75f736
--- /dev/null
+++ b/src/datenklo/am791x.h
@@ -0,0 +1,107 @@
+
+enum am791x_type {
+ AM791X_TYPE_7910 = 0,
+ AM791X_TYPE_7911 = 1,
+};
+
+enum am791x_st {
+ AM791X_STATE_INIT = 0,
+ AM791X_STATE_RCON,
+ AM791X_STATE_CDON,
+ AM791X_STATE_DATA,
+ AM791X_STATE_RCOFF,
+ AM791X_STATE_CDOFF,
+ AM791X_STATE_STO_OFF,
+ AM791X_STATE_SQ_OFF,
+ AM791X_STATE_BRCON,
+ AM791X_STATE_BCDON,
+ AM791X_STATE_BDATA,
+ AM791X_STATE_BRCOFF,
+ AM791X_STATE_BCDOFF,
+};
+
+typedef struct am791x {
+ /* settings */
+ void *inst; /* upper layer instance */
+ enum am791x_type type;
+ int samplerate;
+ double tx_baud, rx_baud;
+
+ /* callbacks */
+ void (*cts_cb)(void *inst, int cts);
+ void (*bcts_cb)(void *inst, int cts);
+ void (*cd_cb)(void *inst, int cd);
+ void (*bcd_cb)(void *inst, int cd);
+ int (*td_cb)(void *inst);
+ int (*btd_cb)(void *inst);
+ void (*rd_cb)(void *inst, int bit, double quality, double level);
+ void (*brd_cb)(void *inst, int bit, double quality, double level);
+
+ /* modes */
+ uint8_t mc; /* current mode setting */
+ int fullduplex; /* duplex */
+ int loopback_main, loopback_back; /* loopback */
+ int equalizer, sto; /* equalizer & STO */
+ int bell_202; /* is BELL 202 */
+
+ /* states */
+ enum am791x_st tx_state, rx_state;
+ int tx_silence; /* no audio transmitted */
+ int tx_sto; /* no STO transmitted */
+ int block_td; /* "TD IGNORED" */
+ int block_rd; /* "RD = MARK" */
+ int line_cd; /* 1 = CD is low */
+ int block_cd; /* "SET CD HIGH" (CD is ignored) */
+ int block_btd; /* "BTD IGNORED" */
+ int block_brd; /* "BRD = MARK" */
+ int line_bcd; /* 1 = BCD is low */
+ int block_bcd; /* "SET BCD HIGH" (BCD is ignored) */
+ int squelch; /* "SQUELCH" (mute received audio) */
+ int line_dtr; /* 1 = DTR is low */
+ int line_rts; /* 1 = RTS is low */
+ int line_brts; /* 1 = BRTS is low */
+ int line_ring; /* 1 = ring is low */
+
+ /* frequencies */
+ int f0_tx, f1_tx;
+ int f0_rx, f1_rx;
+
+ /* timers */
+ struct timer tx_timer, rx_timer;
+ double t_rcon;
+ double t_rcoff;
+ double t_brcon;
+ double t_brcoff;
+ double t_cdon;
+ double t_cdoff;
+ double t_bcdon;
+ double t_bcdoff;
+ double t_at;
+ double t_sil1;
+ double t_sil2;
+ double t_sq;
+ double t_sto;
+
+ /* FSK/STO signal */
+ int rx_back_channel; /* indikates if receiver is tuned to back channel */
+ fsk_mod_t fsk_tx; /* FSK modulator */
+ fsk_demod_t fsk_rx; /* FSK demodulator */
+ double tx_level; /* level of TX */
+ double cd_on, cd_off; /* levels for CD */
+ int cd, bcd; /* carrier detected */
+ double sto_phaseshift65536; /* STO tone phase shift */
+} am791x_t;
+
+void am791x_send(am791x_t *am791x, sample_t *samples, int length);
+void am791x_receive(am791x_t *am791x, sample_t *samples, int length);
+void am791x_list_mc(enum am791x_type type);
+int am791x_init(am791x_t *am791x, void *inst, enum am791x_type type, uint8_t mc, int samplerate, double tx_baud, double rx_baud, void (*cts)(void *inst, int cts), void (*bcts)(void *inst, int cts), void (*cd)(void *inst, int cd), void (*bcd)(void *inst, int cd), int (*td)(void *inst), int (*btd)(void *inst), void (*rd)(void *inst, int bit, double quality, double level), void (*brd)(void *inst, int bit, double quality, double level));
+void am791x_exit(am791x_t *am791x);
+double am791x_max_baud(uint8_t mc);
+int am791x_mc(am791x_t *am791x, uint8_t mc, int samplerate, double tx_baud, double rx_baud);
+void am791x_reset(am791x_t *am791x);
+void am791x_dtr(am791x_t *am791x, int dtr);
+void am791x_rts(am791x_t *am791x, int rts);
+void am791x_brts(am791x_t *am791x, int brts);
+void am791x_ring(am791x_t *am791x, int ring);
+