1 
2 /*------------------------------------------------------------------
3  *
4  * Module:      dlq.h
5  *
6  *---------------------------------------------------------------*/
7 
8 #ifndef DLQ_H
9 #define DLQ_H 1
10 
11 #include "ax25_pad.h"
12 #include "audio.h"
13 
14 
15 /* A transmit or receive data block for connected mode. */
16 
17 typedef struct cdata_s {
18 	int magic;			/* For integrity checking. */
19 
20 #define TXDATA_MAGIC 0x09110911
21 
22 	struct cdata_s *next;		/* Pointer to next when part of a list. */
23 
24 	int pid;			/* Protocol id. */
25 
26 	int size;			/* Number of bytes allocated. */
27 
28 	int len;			/* Number of bytes actually used. */
29 
30 	char data[];			/* Variable length data. */
31 
32 } cdata_t;
33 
34 
35 
36 /* Types of things that can be in queue. */
37 
38 typedef enum dlq_type_e {DLQ_REC_FRAME, DLQ_CONNECT_REQUEST, DLQ_DISCONNECT_REQUEST, DLQ_XMIT_DATA_REQUEST, DLQ_REGISTER_CALLSIGN, DLQ_UNREGISTER_CALLSIGN, DLQ_OUTSTANDING_FRAMES_REQUEST, DLQ_CHANNEL_BUSY, DLQ_SEIZE_CONFIRM, DLQ_CLIENT_CLEANUP} dlq_type_t;
39 
40 
41 /* A queue item. */
42 
43 // TODO: call this event rather than item.
44 // TODO: should add fences.
45 
46 typedef struct dlq_item_s {
47 
48 	struct dlq_item_s *nextp;	/* Next item in queue. */
49 
50 	dlq_type_t type;		/* Type of item. */
51 					/* See enum definition above. */
52 
53 	int chan;			/* Radio channel of origin. */
54 
55 // I'm not worried about amount of memory used but this might be a
56 // little clearer if a union was used for the different event types.
57 
58 // Used for received frame.
59 
60 	int subchan;			/* Winning "subchannel" when using multiple */
61 					/* decoders on one channel.  */
62 					/* Special case, -1 means DTMF decoder. */
63 					/* Maybe we should have a different type in this case? */
64 
65 	int slice;			/* Winning slicer. */
66 
67 	packet_t pp;			/* Pointer to frame structure. */
68 
69 	alevel_t alevel;		/* Audio level. */
70 
71 	int is_fx25;			/* Was it from FX.25? */
72 
73 	retry_t retries;		/* Effort expended to get a valid CRC. */
74 					/* Bits changed for regular AX.25. */
75 					/* Number of bytes fixed for FX.25. */
76 
77 	char spectrum[MAX_SUBCHANS*MAX_SLICERS+1];	/* "Spectrum" display for multi-decoders. */
78 
79 // Used by requests from a client application, connect, etc.
80 
81 	char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN];
82 
83 	int num_addr;			/* Range 2 .. 10. */
84 
85 	int client;
86 
87 
88 // Used only by client request to transmit connected data.
89 
90 	cdata_t *txdata;
91 
92 // Used for channel activity change.
93 // It is useful to know when the channel is busy either for carrier detect
94 // or when we are transmitting.
95 
96 	int activity;			/* OCTYPE_PTT for my transmission start/end. */
97 					/* OCTYPE_DCD if we hear someone else. */
98 
99 	int status;			/* 1 for active or 0 for quiet. */
100 
101 } dlq_item_t;
102 
103 
104 
105 void dlq_init (void);
106 
107 
108 
109 void dlq_rec_frame (int chan, int subchan, int slice, packet_t pp, alevel_t alevel, int is_fx25, retry_t retries, char *spectrum);
110 
111 void dlq_connect_request (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, int chan, int client, int pid);
112 
113 void dlq_disconnect_request (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, int chan, int client);
114 
115 void dlq_outstanding_frames_request (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, int chan, int client);
116 
117 void dlq_xmit_data_request (char addrs[AX25_MAX_ADDRS][AX25_MAX_ADDR_LEN], int num_addr, int chan, int client, int pid, char *xdata_ptr, int xdata_len);
118 
119 void dlq_register_callsign (char addr[AX25_MAX_ADDR_LEN], int chan, int client);
120 
121 void dlq_unregister_callsign (char addr[AX25_MAX_ADDR_LEN], int chan, int client);
122 
123 void dlq_channel_busy (int chan, int activity, int status);
124 
125 void dlq_seize_confirm (int chan);
126 
127 void dlq_client_cleanup (int client);
128 
129 
130 
131 int dlq_wait_while_empty (double timeout_val);
132 
133 struct dlq_item_s *dlq_remove (void);
134 
135 void dlq_delete (struct dlq_item_s *pitem);
136 
137 
138 
139 cdata_t *cdata_new (int pid, char *data, int len);
140 
141 void cdata_delete (cdata_t *txdata);
142 
143 void cdata_check_leak (void);
144 
145 
146 #endif
147 
148 /* end dlq.h */
149