/* MyMonModulesFMS.h * * This file is part of MyMonitor * * Copyright (C) 1996 * Thomas Sailer (sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu) * * Copyright (C) 1998-2002 * Markus Grohmann (markus_grohmann@gmx.de) * * Copyright (c) 2002 * Stephan Effertz (mail@stephan-effertz.de) * * * (Demodulation parts taken from monitor (c) Markus Grohmann) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ---------------------------------------------------------------------- */ #if !defined(AFX_MYMONMODULEFMS_H__680AB4C3_EAB0_4D03_A913_869FB97EA730__INCLUDED_) #define AFX_MYMONMODULEFMS_H__680AB4C3_EAB0_4D03_A913_869FB97EA730__INCLUDED_ #if _MSC_VER > 1000 // #pragma once #endif // _MSC_VER > 1000 #include "MonitorModules.h" #include "math.h" //#include "resource.h" // #define FMSDEBUG #define FREQ_MARK 1200 #define FREQ_SPACE 1800 #define BAUD 1200 #define SUBSAMP 1 // war:2 #define LINELEN 240 #define ITEMLEN 50 // F�r die SE - FMS Auswertung // kann bis 44100 Hz eine ganze FMS Aussendung erfassen // (44100Hz/1200Bit/s)*56Bit=2058 + Auswertungsspielraum #define FMS_BUFFERSIZE 10000 struct LINE { char string[LINELEN], subst[ITEMLEN]; long value; struct LINE *next; }; typedef struct LINE Line ; // /* ---------------------------------------------------------------------- */ #ifdef WIN32 #ifndef M_PI const float M_PI = 3.14159265358979 ; #endif #endif static const unsigned short crc_table[] = { 48, 48, 48, 48, 48, 48, 48, 27, 48, 48, 48, 18, 48, 5, 26, 48, 48, 48, 48, 37, 48, 1, 17, 48, 48, 8, 4, 48, 25, 48, 48, 48, 48, 48, 48, 42, 48, 22, 36, 48, 48, 30, 0, 48, 16, 48, 48, 13, 48, 48, 7, 48, 3, 48, 48, 10, 24, 48, 48, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 46, 41, 48, 48, 40, 21, 48, 35, 48, 48, 45, 48, 20, 29, 48, 48, 48, 48, 39, 15, 48, 48, 44, 48, 34, 12, 48, 48, 28, 48, 48, 6, 48, 48, 19, 2, 48, 48, 38, 48, 48, 9, 48, 23, 48, 48, 43, 48, 14, 31, 48, 48, 11, 48, 48, 48, 48, 48, 33, }; /** Auswerter f�r FMS Aussendungen. * Werte die �bergebenen Tondaten aus und sucht nach FMS Aussendungen * Gefundene Daten werden per XML an den Hauptproze� zur�ckgegeben */ class MonitorModuleFMS : public MonitorModule { public: bool IsValid(); bool test_rxbit(unsigned char bit); void ClearRXBuf(); int PruefeTelegramm(int start); int SucheSync(int start); void demod_neu(float *buffer, int length); void demod_se(float *buffer, int length); virtual void demod(float* buffer, int length); MonitorModuleFMS(int sampleRate=22050,int vorlaufbits=8, bool crccheck=0, float signallevel=0.4, bool ignore_Wiederholung=true, bool ignore_Quittung=true, int algorithm=1,bool error_correction=false, bool force_preambel=false) ; MonitorModuleFMS(unsigned int sampleRate,XMLNode *pConfig) ; virtual ~MonitorModuleFMS(); protected: int distCounter ; int rules(); int crc_check(int offset); int decode(bool test=false); int dcd_buffer[FMS_BUFFERSIZE+100] ; int CORRLEN ; long SPHASEINC ; virtual void parseConfigData() ; bool rxbit(unsigned char bit, bool test=false); void initialize(int sampleRate, int vorlaufbits, bool crccheck, float signallevel, bool ignore_Wiederholung, bool ignore_Quittung, int algorithm, bool error_correction, bool force_preambel); /******************************************************* Decoder Variables & Coef. calculation *******************************************************/ float lp1_c[3],lp2_c[3],bp0_c[3],bp1_c[3]; float lp1_b[4],lp2_b[4],bp0_b[4],bp1_b[4]; unsigned short bit_phase ; // Das geht bis max 44100 Hz Samplerate (MaxWert=Samplerate/Baud) (44100/1200=37) ; float corr_mark_i[40]; float corr_mark_q[40]; float corr_space_i[40]; float corr_space_q[40]; float m_fZwPuffer[80] ; // Um den Bereich der L�nge CORRLEN am Ende des Blocks zwischenzuspeichern //short int int_corr_mark_i[40]; //short int int_corr_mark_q[40]; //short int int_corr_space_i[40]; //short int int_corr_space_q[40]; unsigned int dcd_shreg ; unsigned int sphase ; unsigned int lasts[11] ; unsigned int lastout ; unsigned int subsamp ; short quittung ; struct FMS { unsigned short bos[1], land[1], ort[2], kfz[4], stat[1], bst[1], dir[1], tki[1], crc[7]; short txtnr ; } fms ; struct VALS{ short quality ; unsigned short txtinc, bit, ctrl ; } vals ; protected: void fms_bin(short offset, char *c); void DisplayResult(const std::string input=""); bool CheckForQuittung(); bool CheckForDupes(); void StoreForDupeCheck(); void fms_txt(short offset,char *c); bool error_correction(); bool IsRelatedMessage(); void StoreForReverseCheck(); void ErrorOut(); bool IsSyncWord(unsigned long); bool feedBuffer(int & start); bool RMExists(); bool rx_sample(int x); void set_filters(float f0, float f1, float dr); void gen_coef(int tipo, float f0, float Q, float *pcoef); float biq_hp(float x,float *pcoef,float *buf); float biq_bp(float x,float *pcoef,float *buf); float biq_lp(float x,float *pcoef,float *buf); //int m_iSkipCounter; bool m_bErrorCorrection; int m_iLastSyncState, m_bPrintError ; int m_iAlgorithmus; unsigned int m_iLastrxstate ; float m_fSignallevel; Line* txtbuf; std::string m_lpszStatusTabelle; float m_PLLFaktor; int SPHASEINC_BASE; int summe; struct FMS m_LastMessage; struct FMS m_ReverseCheckMessage ; float m_fPLLFaktor ; float Ud ; #ifdef FMSDEBUG FILE *debugFile1, *debugFile2, *debugFile3, *debugFile4; float fileBuffer1[50000],fileBuffer2[50000], fileBuffer3[50000] ; float *pBuffer1, *pBuffer2, *pBuffer3 ; long bufferLen1,bufferLen2, bufferLen3 ; #endif }; #endif // !defined(AFX_MYMONMODULEFMS_H__680AB4C3_EAB0_4D03_A913_869FB97EA730__INCLUDED_)