Thursday, April 26, 2012

TCP Client Socket using AT commands

Below are the sequence of AT commands to be executed to run the TCP client socket in wavecom GPRS modem with wipsoft sample program loaded

AT+WIPCFG=1

AT+WIPBR=1,6

AT+WIPBR=2,6,11,"www"

AT+WIPBR=2,6,0,""

AT+WIPBR=2,6,1,""

AT+WIPBR=4,6,0

AT+WIPCREATE=2,1,"122.166.54.20",10106

AT+WIPDATA=2,1,1

AT+WIPCLOSE=2,1

Thursday, April 5, 2012

Getdate by passing year and no. of days as arguments.

Hi All,


Below is the C++ program to get the date if you pass the year and number of days as arguments.



#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>


typedef struct {
int mm;
int dd;
int yy;
} ST_USER_DATE;




ST_USER_DATE GetDate(int yy, int day);


int main(int argc, char *argv[])
{
int day;
int yy;


ST_USER_DATE stDate;


yy = atoi(argv[1]);
day = atoi(argv[2]);

stDate = GetDate(yy, day);


printf("Date is MM-DD-YYYY - %02d-%02d-%04d\n",  stDate.mm, stDate.dd, stDate.yy);
fflush(stdout);

getch();

return 0;
}


ST_USER_DATE GetDate(int yy, int day)
{
int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int nMDay[12];
int dd;
int i, mm, sum;


ST_USER_DATE stDate;


if( (yy % 4 == 0 && yy % 100 != 0) ||  yy % 400 == 0) // leap year
daysInMonth[1] = 29;
else
daysInMonth[1] = 28;


sum = 0;
for(i=0; i<12; i++)
{
sum = sum + daysInMonth[i];
nMDay[i] = sum;
}

if( day <= nMDay[0])      { mm = 1;  dd = day; }
else if( day <=nMDay[1])  { mm = 2;  dd = day  - nMDay[0];  }
else if( day <=nMDay[2])  { mm = 3;  dd = day  - nMDay[1];  }
else if( day <=nMDay[3])  { mm = 4;  dd = day  - nMDay[2];  }
else if( day <=nMDay[4])  { mm = 5;  dd = day  - nMDay[3];  }
else if( day <=nMDay[5])  { mm = 6;  dd = day  - nMDay[4];  }
else if( day <=nMDay[6])  { mm = 7;  dd = day  - nMDay[5];  }
else if( day <=nMDay[7])  { mm = 8;  dd = day  - nMDay[6];  }
else if( day <=nMDay[8])  { mm = 9;  dd = day  - nMDay[7];  }
else if( day <=nMDay[9])  { mm = 10; dd = day  - nMDay[8];  }
else if( day <=nMDay[10]) { mm = 11; dd = day - nMDay[9];  }
else if( day <=nMDay[11]) { mm = 12; dd = day - nMDay[10]; }


stDate.mm = mm;
stDate.dd = dd;
stDate.yy = yy;


return (stDate);

}

Tuesday, April 3, 2012

DLMS Data type

DLMS response packet may contain the data, which may be any one of the
DLMS data type.




#define DT_NULL_DATA 0
#define DT_ARRAY 1
#define DT_STRUCTURE 2
#define DT_BOOLEAN 3
#define DT_BIT_STRING 4
#define DT_DOUBLE_LONG 5
#define DT_DOUBLE_LONG_UNSIGNED  6
#define DT_FLOATING_POINT 7
#define DT_OCTET_STRING 9
#define DT_VISIBLE_STRING         10
#define DT_BCD 13
#define DT_INTEGER 15
#define DT_LONG 16
#define DT_UNSIGNED 17
#define DT_LONG_UNSIGNED 18
#define DT_LONG64 20
#define DT_UNSIGNED_LONG64 21
#define DT_ENUM 22
#define DT_REAL32 23
#define DT_REAL64 24
#define DT_DATETIME 25
#define DT_DATE 26
#define DT_TIME 27
#define DT_OBJECT_IDENTIFIER         6
#define MIN_LS_DATA 45


For example when the data is of type "DT_DOUBLE_LONG_UNSIGNED" then the data is 4 byte value.

Monday, April 2, 2012

Want to know more about DLMS

Below are the links which may help in understanding the device language message specification (DLMS) protocol.


http://dlms.com/documents/Excerpt_BB10.pdf


http://dlms.com/documents/Excerpt_GB7.pdf


http://dlms.com/documents/Excerpt_YB4.pdf


http://dlms.com/documents/White_book_1.pdf

How to calculate the checksum value in DLMS commands.


You can straight away call the below function. 


// len field represents the total number of bytes on which checksum to be calculated,
// But len should be be counted with start and end flag.
u16 hdlc_ChksumCalculate(u16 fcs, u8 *pcp, u16 len)
{
        while (len--)
        {
                fcs = (u16)((fcs >> 8) ^ fcstab[(fcs ^ *pcp++)&0xff]);
        }
        return fcs;
}

Below is one example in how to use this function to get the checksum for SNRM Packet.
u16 CalcChecksum
CalcChecksum = hdlc_ChksumCalculate(0xFFFF, &Hdlc_OutBuf[1], (u16 )(4 + address_size));

fcstab is an array holding the look up value as mentioned below.


/*
 * FCS Look up table
 */
const u16 fcstab[256] = {
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
};

Saturday, March 17, 2012

DLMS Frame Type

How to calculate the DLMS frame type field value ? It is simple just follow the below algorithm.
Easy to integrate in your program just call the below function.



u8 GetFrameTypeValue(u8 CodeType)
{
        // define "g_FrameTypeValue" as global variable and initialize its value to 0.
// u8  g_FrameTypeValue ;


// define " g_PrevLongCode" as global variable and initialize its value to 0.
        // u8  g_PrevLongCode;


if(CodeType == SHORT_CODE)
{
if(g_FrameTypeValue == 0xFE)
{
g_SSS = 1;
}
g_FrameTypeValue = (( g_RRR & 0x07 ) << 5) | 0x11;
}
else if(CodeType == LONG_CODE)
{
if(g_FrameTypeValue == 0xFE)
{
g_FrameTypeValue = 0x10;
g_SSS = 1;
g_RRR = 1;
}
else if( (g_PrevLongCode & 0x0F) == 0x0E )
{
g_FrameTypeValue = ((( g_RRR & 0x07 ) << 5) | 0x10);
g_SSS = 1;
}
else
{
g_FrameTypeValue = ((( g_RRR & 0x07 ) << 5) | 0x11) + g_SSS;         
g_SSS = g_SSS + 2; if(g_SSS > 13) { g_SSS = 1; }
}
g_PrevLongCode = g_FrameTypeValue;
}
else
{
//do nothing
}
if(g_FrameTypeValue != 0x10)
{
g_RRR = g_RRR + 1; if(g_RRR > 7) { g_RRR = 0; }
}
return g_FrameTypeValue;
}




Sunday, November 7, 2010

Embedded software and hardware support

Hi,

Many embedded programmers face many challenges to accomplish the development tasks on time, due to lack of combinational skills of hardware and software. Making use of this blog I am trying to provide the required support to the developers and reach as many as possible number of peoples.

There are many instances a single person does not know all thing in embedded system. So it is most important that we need to build a support system to help developers to reuse the existing solution rather newly develop from the scratch. Reusing surely helps one to devlop fast and on time.

---
Gouse