1 /*
2  * Copyright (C) 2010 DSD Author
3  * GPG Key ID: 0x3F1D7FD0 (74EF 430D F7F2 0A48 FCE6  F630 FAA2 635D 3F1D 7FD0)
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15  * PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include "config.h"
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <signal.h>
22 #include <string.h>
23 #define __USE_XOPEN
24 #include <time.h>
25 #include <sys/time.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <sys/ioctl.h>
29 #include <fcntl.h>
30 #include <unistd.h>
31 #ifdef SOLARIS
32 #include <sys/audioio.h>
33 #endif
34 #ifdef BSD
35 #include <sys/soundcard.h>
36 #endif
37 #include <math.h>
38 #include <mbelib.h>
39 
40 /*
41  * global variables
42  */
43 extern int exitflag;
44 
45 
46 typedef struct
47 {
48   int onesymbol;
49   char mbe_in_file[1024];
50   FILE *mbe_in_f;
51   int errorbars;
52   int datascope;
53   int symboltiming;
54   int verbose;
55   int p25enc;
56   int p25lc;
57   int p25status;
58   int p25tg;
59   int scoperate;
60   char audio_in_dev[1024];
61   int audio_in_fd;
62   char audio_out_dev[1024];
63   int audio_out_fd;
64   int split;
65   int playoffset;
66   char mbe_out_dir[1024];
67   char mbe_out_file[1024];
68   FILE *mbe_out_f;
69   float audio_gain;
70   int audio_out;
71   char wav_out_file[1024];
72   FILE *wav_out_f;
73   int wav_out_fd;
74   int serial_baud;
75   char serial_dev[1024];
76   int serial_fd;
77   int resume;
78   int frame_dstar;
79   int frame_x2tdma;
80   int frame_p25p1;
81   int frame_nxdn48;
82   int frame_nxdn96;
83   int frame_dmr;
84   int frame_provoice;
85   int mod_c4fm;
86   int mod_qpsk;
87   int mod_gfsk;
88   int uvquality;
89   int inverted_x2tdma;
90   int inverted_dmr;
91   int mod_threshold;
92   int ssize;
93   int msize;
94   int playfiles;
95   int delay;
96 } dsd_opts;
97 
98 typedef struct
99 {
100   int *dibit_buf;
101   int *dibit_buf_p;
102   int repeat;
103   short *audio_out_buf;
104   short *audio_out_buf_p;
105   float *audio_out_float_buf;
106   float *audio_out_float_buf_p;
107   float audio_out_temp_buf[160];
108   float *audio_out_temp_buf_p;
109   int audio_out_idx;
110   int audio_out_idx2;
111   int wav_out_bytes;
112   int center;
113   int jitter;
114   int synctype;
115   int min;
116   int max;
117   int lmid;
118   int umid;
119   int minref;
120   int maxref;
121   int lastsample;
122   int sbuf[128];
123   int sidx;
124   int maxbuf[1024];
125   int minbuf[1024];
126   int midx;
127   char err_str[64];
128   char fsubtype[16];
129   char ftype[16];
130   int symbolcnt;
131   int rf_mod;
132   int numflips;
133   int lastsynctype;
134   int lastp25type;
135   int offset;
136   int carrier;
137   char tg[25][16];
138   int tgcount;
139   int lasttg;
140   int lastsrc;
141   int nac;
142   int errs;
143   int errs2;
144   int mbe_file_type;
145   int optind;
146   int numtdulc;
147   int firstframe;
148   char slot0light[8];
149   char slot1light[8];
150   float aout_gain;
151   float aout_max_buf[200];
152   float *aout_max_buf_p;
153   int aout_max_buf_idx;
154   int samplesPerSymbol;
155   int symbolCenter;
156   char algid[9];
157   char keyid[17];
158   int currentslot;
159   mbe_parms *cur_mp;
160   mbe_parms *prev_mp;
161   mbe_parms *prev_mp_enhanced;
162   int p25kid;
163 } dsd_state;
164 
165 /*
166  * Frame sync patterns
167  */
168 #define INV_P25P1_SYNC "333331331133111131311111"
169 #define P25P1_SYNC     "111113113311333313133333"
170 
171 #define X2TDMA_BS_VOICE_SYNC "113131333331313331113311"
172 #define X2TDMA_BS_DATA_SYNC  "331313111113131113331133"
173 #define X2TDMA_MS_DATA_SYNC  "313113333111111133333313"
174 #define X2TDMA_MS_VOICE_SYNC "131331111333333311111131"
175 
176 #define DSTAR_SYNC     "313131313133131113313111"
177 #define INV_DSTAR_SYNC "131313131311313331131333"
178 
179 #define NXDN_MS_DATA_SYNC      "313133113131111333"
180 #define INV_NXDN_MS_DATA_SYNC  "131311331313333111"
181 #define NXDN_MS_VOICE_SYNC     "313133113131113133"
182 #define INV_NXDN_MS_VOICE_SYNC "131311331313331311"
183 #define INV_NXDN_BS_DATA_SYNC  "131311331313333131"
184 #define NXDN_BS_DATA_SYNC      "313133113131111313"
185 #define INV_NXDN_BS_VOICE_SYNC "131311331313331331"
186 #define NXDN_BS_VOICE_SYNC     "313133113131113113"
187 
188 #define DMR_BS_DATA_SYNC  "313333111331131131331131"
189 #define DMR_BS_VOICE_SYNC "131111333113313313113313"
190 #define DMR_MS_DATA_SYNC  "311131133313133331131113"
191 #define DMR_MS_VOICE_SYNC "133313311131311113313331"
192 
193 #define INV_PROVOICE_SYNC    "31313111333133133311331133113311"
194 #define PROVOICE_SYNC        "13131333111311311133113311331133"
195 #define INV_PROVOICE_EA_SYNC "13313133113113333311313133133311"
196 #define PROVOICE_EA_SYNC     "31131311331331111133131311311133"
197 
198 /*
199  * function prototypes
200  */
201 void processDMRdata (dsd_opts * opts, dsd_state * state);
202 void processDMRvoice (dsd_opts * opts, dsd_state * state);
203 void processAudio (dsd_opts * opts, dsd_state * state);
204 void writeSynthesizedVoice (dsd_opts * opts, dsd_state * state);
205 void playSynthesizedVoice (dsd_opts * opts, dsd_state * state);
206 void openAudioOutDevice (dsd_opts * opts, int speed);
207 void openAudioInDevice (dsd_opts * opts);
208 int getDibit (dsd_opts * opts, dsd_state * state);
209 void skipDibit (dsd_opts * opts, dsd_state * state, int count);
210 void saveImbe4400Data (dsd_opts * opts, dsd_state * state, char *imbe_d);
211 void saveAmbe2450Data (dsd_opts * opts, dsd_state * state, char *ambe_d);
212 int readImbe4400Data (dsd_opts * opts, dsd_state * state, char *imbe_d);
213 int readAmbe2450Data (dsd_opts * opts, dsd_state * state, char *ambe_d);
214 void openMbeInFile (dsd_opts * opts, dsd_state * state);
215 void closeMbeOutFile (dsd_opts * opts, dsd_state * state);
216 void openMbeOutFile (dsd_opts * opts, dsd_state * state);
217 void openWavOutFile (dsd_opts * opts, dsd_state * state);
218 void closeWavOutFile (dsd_opts * opts, dsd_state * state);
219 void printFrameInfo (dsd_opts * opts, dsd_state * state);
220 void processFrame (dsd_opts * opts, dsd_state * state);
221 void printFrameSync (dsd_opts * opts, dsd_state * state, char *frametype, int offset, char *modulation);
222 int getFrameSync (dsd_opts * opts, dsd_state * state);
223 int comp (const void *a, const void *b);
224 void noCarrier (dsd_opts * opts, dsd_state * state);
225 void initOpts (dsd_opts * opts);
226 void initState (dsd_state * state);
227 void usage ();
228 void liveScanner (dsd_opts * opts, dsd_state * state);
229 void cleanupAndExit (dsd_opts * opts, dsd_state * state);
230 void sigfun (int sig);
231 int main (int argc, char **argv);
232 void playMbeFiles (dsd_opts * opts, dsd_state * state, int argc, char **argv);
233 void processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char ambe_fr[4][24], char imbe7100_fr[7][24]);
234 void openSerial (dsd_opts * opts, dsd_state * state);
235 void resumeScan (dsd_opts * opts, dsd_state * state);
236 int getSymbol (dsd_opts * opts, dsd_state * state, int have_sync);
237 void upsample (dsd_state * state, float invalue);
238 void processDSTAR (dsd_opts * opts, dsd_state * state);
239 void processNXDNVoice (dsd_opts * opts, dsd_state * state);
240 void processNXDNData (dsd_opts * opts, dsd_state * state);
241 void processP25lcw (dsd_opts * opts, dsd_state * state, char *lcformat, char *mfid, char *lcinfo);
242 void processHDU (dsd_opts * opts, dsd_state * state);
243 void processLDU1 (dsd_opts * opts, dsd_state * state);
244 void processLDU2 (dsd_opts * opts, dsd_state * state);
245 void processTDULC (dsd_opts * opts, dsd_state * state);
246 void processProVoice (dsd_opts * opts, dsd_state * state);
247 void processX2TDMAdata (dsd_opts * opts, dsd_state * state);
248 void processX2TDMAvoice (dsd_opts * opts, dsd_state * state);
249