preparations for protocol (CRC class added)

This commit is contained in:
Volker Fischer 2006-02-18 22:05:46 +00:00
parent 824bc8ab5d
commit c5e6c6b0c1
5 changed files with 133 additions and 19 deletions

View file

@ -103,6 +103,20 @@
#define _MAXBYTE 255 /* binary: 11111111 */
#define _MINSHORT (-32768)
#if HAVE_STDINT_H
# include <stdint.h>
#elif HAVE_INTTYPES_H
# include <inttypes.h>
#elif defined ( _WIN32 )
typedef unsigned __int32 uint32_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int8 uint8_t;
#else
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
#endif
/* Definitions for window message system ------------------------------------ */
typedef unsigned int _MESSAGE_IDENT;

View file

@ -4,6 +4,20 @@
* Author(s):
* Volker Fischer
*
Protocol message definition
+-----------+------------+-----------------+--------------+-------------+
| 2 byte ID | 1 byte cnt | 2 byte length n | n bytes data | 2 bytes CRC |
+-----------+------------+-----------------+--------------+-------------+
- message ID defined by the defines PROTMESSID_x
- cnt: counter which is incremet for each message and wraps around at 255
- length n in bytes of the data
- actual data, dependent on message type
- 16 bits CRC, calculating over the entire message, is transmitted inverted
Generator polynom: G_16(x) = x^16 + x^12 + x^5 + 1, initial state: all ones
*
******************************************************************************
*

View file

@ -28,6 +28,13 @@
#include "global.h"
/* Definitions ****************************************************************/
// protocol message IDs
#define PROTMESSID_ACKN 0 // acknowledge
#define PROTMESSID_JITT_BUF_SIZE 10 // jitter buffer size
#define PROTMESSID_PING 11 // for measuring ping time
/* Classes ********************************************************************/
class CProtocol
{
@ -59,5 +66,15 @@ protected:
};
class CProtMessage
{
public:
CProtMessage () {}
virtual ~CProtMessage () {}
protected:
};
#endif /* !defined(PROTOCOL_H__3B123453_4344_BB2392354455IUHF1912__INCLUDED_) */

View file

@ -72,20 +72,50 @@ double CSignalLevelMeter::MicLevel ()
}
/* Global functions implementation ********************************************/
void DebugError(const char* pchErDescr, const char* pchPar1Descr,
const double dPar1, const char* pchPar2Descr,
const double dPar2)
/* CRC ---------------------------------------------------------------------- */
void CCRC::Reset ()
{
FILE* pFile = fopen("DebugError.dat", "a");
fprintf(pFile, pchErDescr); fprintf(pFile, " ### ");
fprintf(pFile, pchPar1Descr); fprintf(pFile, ": ");
fprintf(pFile, "%e ### ", dPar1);
fprintf(pFile, pchPar2Descr); fprintf(pFile, ": ");
fprintf(pFile, "%e\n", dPar2);
fclose(pFile);
printf("\nDebug error! For more information see test/DebugError.dat\n");
exit(1);
/* Init state shift-register with ones. Set all registers to "1" with
bit-wise not operation */
iStateShiftReg = ~uint32_t ( 0 );
}
void CCRC::AddByte ( const uint8_t byNewInput )
{
for ( int i = 0; i < 8; i++ )
{
/* Shift bits in shift-register for transistion */
iStateShiftReg <<= 1;
/* Take bit, which was shifted out of the register-size and place it
at the beginning (LSB)
(If condition is not satisfied, implicitely a "0" is added) */
if ( ( iStateShiftReg & iBitOutMask) > 0 )
{
iStateShiftReg |= 1;
}
/* Add new data bit to the LSB */
if ( ( byNewInput & ( 1 << ( 8 - i - 1 ) ) ) > 0 )
{
iStateShiftReg ^= 1;
}
/* Add mask to shift-register if first bit is true */
if ( iStateShiftReg & 1 )
{
iStateShiftReg ^= iPoly;
}
}
}
uint32_t CCRC::GetCRC()
{
/* Return inverted shift-register (1's complement) */
iStateShiftReg = ~iStateShiftReg;
/* Remove bit which where shifted out of the shift-register frame */
return iStateShiftReg & ( iBitOutMask - 1 );
}
@ -316,3 +346,22 @@ CLlconHelpMenu::CLlconHelpMenu ( QWidget* parent ) : QPopupMenu ( parent )
insertSeparator();
insertItem ( tr ( "&About..." ), this, SLOT ( OnHelpAbout () ) );
}
/******************************************************************************\
* Global functions implementation *
\******************************************************************************/
void DebugError(const char* pchErDescr, const char* pchPar1Descr,
const double dPar1, const char* pchPar2Descr,
const double dPar2)
{
FILE* pFile = fopen("DebugError.dat", "a");
fprintf(pFile, pchErDescr); fprintf(pFile, " ### ");
fprintf(pFile, pchPar1Descr); fprintf(pFile, ": ");
fprintf(pFile, "%e ### ", dPar1);
fprintf(pFile, pchPar2Descr); fprintf(pFile, ": ");
fprintf(pFile, "%e\n", dPar2);
fclose(pFile);
printf("\nDebug error! For more information see test/DebugError.dat\n");
exit(1);
}

View file

@ -381,6 +381,26 @@ protected:
};
/* CRC ---------------------------------------------------------------------- */
class CCRC
{
public:
CCRC () : iPoly ( ( 1 << 5 ) | ( 1 << 12 ) ), iBitOutMask ( 1 << 16 )
{ Reset (); }
virtual ~CCRC () {}
void Reset ();
void AddByte ( const uint8_t byNewInput );
bool CheckCRC ( const uint32_t iCRC ) { return iCRC == GetCRC(); }
uint32_t GetCRC ();
protected:
uint32_t iBitOutMask;
uint32_t iPoly;
uint32_t iStateShiftReg;
};
/* Time conversion ---------------------------------------------------------- */
// needed for ping measurement
class CTimeConv