An mbed implementation of IEC 61850-9-2LE Sample Values. Creating using the rapid61850 library, available at: https://github.com/stevenblair/rapid61850.
decodePacket.c
00001 /** 00002 * Rapid-prototyping protection schemes with IEC 61850 00003 * 00004 * Copyright (c) 2012 Steven Blair 00005 * 00006 * This program is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU General Public License 00008 * as published by the Free Software Foundation; either version 2 00009 * of the License, or (at your option) any later version. 00010 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00019 */ 00020 00021 #include "decodePacket.h" 00022 //#include "svEncodeBasic.h" 00023 00024 00025 // returns size of length field, from first byte 00026 int getLengthFieldSize(unsigned char byte) { 00027 if (byte <= 126) { 00028 return 1; 00029 } 00030 else { 00031 return 1 + (byte & 0x7F); 00032 } 00033 } 00034 00035 //TODO check this works for all inputs, e.g., buf[1] = 0xFF 00036 int decodeLength(unsigned char *buf) { 00037 if (buf[0] <= 126) { 00038 return buf[0]; 00039 } 00040 else { 00041 int bytes = (buf[0] & 0x7F); 00042 00043 if (bytes == 1) { 00044 return buf[1]; 00045 } 00046 else if (bytes == 2) { // assumes max length of 2^15 00047 return ((buf[1] & 0xFF) << 8) | (buf[2] & 0xFF); 00048 } 00049 } 00050 00051 return 0; 00052 }
Generated on Sat Jul 23 2022 01:15:10 by 1.7.2