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