Files
openbts/GPRS/MsgBase.cpp
Kurtis Heimerl 5289a229d9 sync of openbts
git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@6168 19bc5d8c-e614-43d4-8b26-e1612bc8e597
2013-08-14 00:52:14 +00:00

109 lines
2.8 KiB
C++

/*
* Copyright 2011 Range Networks, Inc.
* All Rights Reserved.
*
* This software is distributed under multiple licenses;
* see the COPYING file in the main directory for licensing
* information for this specific distribuion.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.
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.
*/
#include <stdio.h>
#include "MsgBase.h"
void MsgCommonWrite::_define_vtable() {}
void MsgCommonLength::_define_vtable() {}
void MsgCommonText::_define_vtable() {}
// Copied from same functions in L3Frame:
static const unsigned fillPattern[8] = {0,0,1,0,1,0,1,1};
void MsgCommonWrite::writeField(const ItemWithValueAndWidth&item,const char*)
{
mResult.writeField(wp,item.getValue(),item.getWidth());
}
void MsgCommonWrite::writeField(uint64_t value, unsigned len, const char *, Type2Str)
{
mResult.writeField(wp,value,len);
}
void MsgCommonWrite::writeOptFieldLH(uint64_t value, unsigned len, int present, const char *)
{
if (present) { writeH(); writeField(value,len); } else { writeL(); }
}
// pat added: write an Optional Field controlled by an initial 0/1 field.
void MsgCommonWrite::writeOptField01(uint64_t value, unsigned len, int present, const char*)
{
if (present) { write1(); writeField(value,len); } else { write0(); }
}
void MsgCommonWrite::writeH()
{
unsigned fillBit = fillPattern[wp%8]; // wp is in MsgCommon
writeField(!fillBit,1);
}
void MsgCommonWrite::writeL()
{
unsigned fillBit = fillPattern[wp%8]; // wp is in MsgCommon
writeField(fillBit,1);
}
void MsgCommonWrite::writeBitMap(bool*bitmap,unsigned bitmaplen, const char*name)
{
for (unsigned i=0; i<bitmaplen; i++) {
writeField(bitmap[i],1,name);
}
}
#if 0
static void truncateredundant(char *str, int len)
{
char *end = str + len - 1, *cp = end;
// Chop off trailing chars that are replicated.
int lastch = *cp;
for (; cp > str; cp--) {
if (*cp != lastch) {
if (cp < end-6) { strcpy(cp+2,"..."); }
break;
}
}
}
#endif
#define TOHEX(v) ((v) + ((v) < 10 ? '0' : ('a'-10)))
void MsgCommonText::writeBitMap(bool*bitmap,unsigned bitmaplen, const char*name)
{
char txtbits[bitmaplen+6], *tp = txtbits;
unsigned i, accum = 0;
for (i=0; i<bitmaplen; i++) {
accum = (accum<<1) + (bitmap[i] ? 1 : 0);
if (((i+1) & 3) == 0) {
*tp++ = TOHEX(accum);
accum = 0;
}
}
//if (i & 3) { *tp++ = TOHEX(accum); } Our bitmap is always evenly % 4, so dont bother.
*tp = 0;
//truncateredundant(txtbits,bitmaplen);
mos << " " << name << "=(" << txtbits << ")";
}
// This could fail multi-threaded, but it is only used for debug output.
const char *tohex(int val)
{
static char buf[20];
sprintf(buf,"0x%x",val);
return buf;
}