137 int j, lastBitWasOne;
141 int thisSample, lastBit, lastSpace = 0;
142 int m0, m1,
m2,
m3, mPhase;
144 int F1_sig, F1_noise;
145 int F2_sig, F2_noise;
146 int fSig, fNoise, fLevel, fLoLo;
170 m0 = m[0]; m1 = m[1];
175 m2 = m[2]; m3 = m[3];
179 if ((m2 <= m0) || (m2 < m3))
196 F1_sig = (m1 +
m2) - ((m0 + m3) << 1);
197 F1_noise = (m0 +
m3) >> 1;
200 || (F1_sig < (F1_noise << 2)) )
208 mPhase = ((m2 * 20) / (m1 + m2));
209 byte = (mPhase + 812) / 20;
210 n0 = m[byte++]; n1 = m[byte++];
219 if ((mPhase + 812) % 20)
229 F2_sig = (n1 + n2) - ((n0 + n3) << 1);
230 F2_noise = (n0 + n3) >> 1;
233 || (F2_sig < (F2_noise << 2)) )
236 fSig = (F1_sig + F2_sig) >> 1;
237 fNoise = (F1_noise + F2_noise) >> 1;
238 fLoLo = fNoise + (fSig >> 2);
239 fLevel = fNoise + (fSig >> 1);
247 for (j = 1, mPhase += 29; j < 48; mPhase += 29, j ++)
249 byte = 1 + (mPhase / 20);
251 thisSample = m[byte] - fNoise;
253 {thisSample += (m[byte+1] - fNoise);}
257 {lastSpace = thisSample;}
262 if (thisSample >= fLevel)
268 if ( (lastSpace >= (thisSample>>1)) || (lastSpace >= lastBit) )
274 if (lastSpace >= (thisSample >> 1))
286 if (lastSpace >= lastBit)
292 if (lastSpace >= fLoLo)
299 lastBit = (thisSample >> 1);
306 if ((ModeABits < 3) || (ModeABits & 0xFFFF8808) || (ModeAErrs) )
307 {
return (ModeABits = 0);}
309 fSig = (fSig + 0x7F) >> 8;
321 unsigned int FiveHundreds = 0;
322 unsigned int OneHundreds = 0;
324 if ( (ModeA & 0xFFFF888B)
325 || ((ModeA & 0x000000F0) == 0) )
328 if (ModeA & 0x0010) {OneHundreds ^= 0x007;}
329 if (ModeA & 0x0020) {OneHundreds ^= 0x003;}
330 if (ModeA & 0x0040) {OneHundreds ^= 0x001;}
333 if ((OneHundreds & 5) == 5) {OneHundreds ^= 2;}
340 if (ModeA & 0x0002) {FiveHundreds ^= 0x0FF;}
341 if (ModeA & 0x0004) {FiveHundreds ^= 0x07F;}
343 if (ModeA & 0x1000) {FiveHundreds ^= 0x03F;}
344 if (ModeA & 0x2000) {FiveHundreds ^= 0x01F;}
345 if (ModeA & 0x4000) {FiveHundreds ^= 0x00F;}
347 if (ModeA & 0x0100) {FiveHundreds ^= 0x007;}
348 if (ModeA & 0x0200) {FiveHundreds ^= 0x003;}
349 if (ModeA & 0x0400) {FiveHundreds ^= 0x001;}
352 if (FiveHundreds & 1) {OneHundreds = 6 - OneHundreds;}
354 return ((FiveHundreds * 5) + OneHundreds - 13);
365 mm->
msg[0] = (ModeA >> 8);
366 mm->
msg[1] = (ModeA);
370 mm->
addr = 0x00FF0000 | (ModeA & 0x0000FF7F);
373 mm->
modeA = ModeA & 0x7777;
377 mm->
fs = ModeA & 0x0080;
int ModeAToModeC(unsigned int ModeA)
int detectModeA(uint16_t *m, struct modesMessage *mm)
void decodeModeAMessage(struct modesMessage *mm, int ModeA)
#define MODEAC_MSG_SQUELCH_LEVEL
unsigned char signalLevel
#define MODES_ACFLAGS_SQUAWK_VALID
uint32_t ModeABitTable[24]
uint32_t ModeAMidTable[24]