Files
kunlun/app/smart_grid/protocol/proto_iec_yj.c
2024-09-28 14:24:04 +08:00

2864 lines
70 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "proto_iec_yj.h"
#include "iot_io_api.h"
#include "os_utils_api.h"
#include "iot_pkt_api.h"
/* define max iec packet length */
#define PROTO_IEC_READ_PKT_LENGTH_MAX (300)
/* define Event record added byte 1->5z groupdefine by customer*/
#define CHANGE_EVENTBYTE
/* define add combination IDE710-E750define by customer*/
#define ADD_GRID
/* define add combination IDE760-E765define by customer */
#define ADD_GRID2
#define LEN_ADD1BYTE
#undef LEN_ADD1BYTE
static uint8_t iec_toupper(uint8_t c)
{
return (c >= 'a' && c <= 'z') ? (c - 0x20) : c;
}
/**
* @brief DL/T 645-1997 di to IEC obis from yujian
*
* @param di dlt64597 di
* @param buf obis buffer
* @return obis data length in buf
*/
static uint8_t iec_pm_drv_di_to_obis(uint16_t di, uint8_t *buf)
{
uint8_t len = 0, temp;
uint16_t req_id = di;
if (((di & 0xF000) == 0x9000) && ((di & 0xFF) < 0xC0)) {
req_id = 0x9000;
} else if ((di & 0xFF00) == 0xA100) {
req_id = 0xA100;
} else if ((di & 0xFF00) == 0xB100) {
req_id = 0xB100;
} else if (((di & 0xFF00) == 0xE500) && ((di & 0xFF) < 0xFE)) {
req_id = 0xE500;
} else if ((di & 0xFF00) == 0xE900) {
req_id = 0xE900;
} else if ((di & 0xFF00) == 0xE800) {
req_id = 0xE800;
} else if ((di & 0xFF00) == 0x3100) {
req_id = 0x3100;
}
switch (req_id) {
case 0x9000:
{
os_mem_cpy(buf, "1.0.1.8.", 8);
if ((di & 0x0FF0) == 0x0010) {
buf[4] = '1';
} else if ((di & 0x0FF0) == 0x0020) {
buf[4] = '2';
} else if ((di & 0x0FF0) == 0x0110) {
buf[4] = '3';
} else if ((di & 0x0FF0) == 0x0120) {
buf[4] = '4';
} else if ((di & 0x0FF0) == 0x0130) {
buf[4] = '5';
} else if ((di & 0x0FF0) == 0x0140) {
buf[4] = '6';
} else if ((di & 0x0FF0) == 0x0150) {
buf[4] = '7';
} else if ((di & 0x0FF0) == 0x0160) {
buf[4] = '8';
} else if ((di & 0x0FF0) == 0x0050) {
buf[4] = '9';
}
buf[8] = (di & 0x000F) + '0', len = 9;
break;
}
case 0xB611:
case 0xB612:
case 0xB613:
{
os_mem_cpy(buf, "1.0.32.7.0", 10);
buf[4] = (di & 0x000F) * 2 + 1 + '0', len = 10;
break;
}
case 0xB621:
case 0xB622:
case 0xB623:
{
os_mem_cpy(buf, "1.0.31.7.0", 10);
buf[4] = (di & 0x000F) * 2 + 1 + '0', len = 10;
break;
}
case 0xB630:
{
os_mem_cpy(buf, "1.0.1.7.0", 9);
len = 9;
break;
}
case 0xB631:
case 0xB632:
case 0xB633:
{
os_mem_cpy(buf, "1.0.21.7.0", 10);
buf[4] = (di & 0x000F) * 2 + '0', len = 10;
break;
}
case 0xB640:
{
os_mem_cpy(buf, "1.0.3.7.0", 9);
len = 9;
break;
}
case 0xB641:
case 0xB642:
case 0xB643:
{
os_mem_cpy(buf, "1.0.23.7.0", 10);
buf[4] = (di & 0x000F) * 2 + '0', len = 10;
break;
}
case 0xB650:
case 0xB651:
case 0xB652:
case 0xB653:
{
os_mem_cpy(buf, "1.0.13.7.0", 10);
buf[4] = (di & 0x000F) * 2 + 1 + '0', len = 10;
break;
}
case 0x8EA0:
{
os_mem_cpy(buf, "0.0.F.F.0", 9);
len = 9;
break;
}
case 0xA080:
{
os_mem_cpy(buf, "1.0.0.4.4", 9);
len = 9;
break;
}
case 0xB660:
{
os_mem_cpy(buf, "1.0.14.7.0", 10);
len = 10;
break;
}
case 0xC000:
{
os_mem_cpy(buf, "1.0.81.7.78", 11);
len = 11;
break;
}
case 0xC710:
{
os_mem_cpy(buf, "0.0.0.7.0", 9);
len = 9;
break;
}
case 0xA007:
{
os_mem_cpy(buf, "1.0.99.35.0", 11);
len = 11;
break;
}
case 0xC111:
{
os_mem_cpy(buf, "0.0.0.8.0", 9);
len = 9;
break;
}
case 0xC711:
{
os_mem_cpy(buf, "0.0.0.2.8", 9);
len = 9;
break;
}
case 0xC712:
{
os_mem_cpy(buf, "0.0.0.2.0", 9);
len = 9;
break;
}
case 0xA000:
{
os_mem_cpy(buf, "1.0.12.35.0", 11);
len = 11;
break;
}
case 0xA001:
{
os_mem_cpy(buf, "1.0.11.35.0", 11);
len = 11;
break;
}
case 0xA002:
{
os_mem_cpy(buf, "1.0.12.39.0", 11);
len = 11;
break;
}
case 0xA006:
{
os_mem_cpy(buf, "0.0.99.13.0", 11);
len = 11;
break;
}
case 0xE302:
{
os_mem_cpy(buf, "0.0.C.2.0", 9);
len = 9;
break;
}
case 0xE304:
{
os_mem_cpy(buf, "0.0.C.2.1", 9);
len = 9;
break;
}
case 0xA090:
{
os_mem_cpy(buf, "0.0.C.51.15", 11);
len = 11;
break;
}
case 0xA091:
{
os_mem_cpy(buf, "0.0.C.51.16", 11);
len = 11;
break;
}
case 0xE40A:
{
os_mem_cpy(buf, "0.0.96.52.26", 12);
len = 12;
break;
}
case 0xE403:
case 0xE404:
case 0xE405:
case 0xE406:
case 0xE40F:
case 0xE410:
case 0xE407:
case 0xE408:
{
os_mem_cpy(buf, "0.0.C.51.00", 11);
if (di == 0xE403) {
buf[9] = '1';
buf[10] = '1';
} else if (di == 0xE404) {
buf[9] = '1';
buf[10] = '2';
} else if (di == 0xE405) {
buf[9] = '1';
buf[10] = '7';
} else if (di == 0xE406) {
buf[9] = '1';
buf[10] = '8';
} else if (di == 0xE40F) {
buf[9] = '4';
buf[10] = '3';
} else if (di == 0xE410) {
buf[9] = '4';
buf[10] = '4';
} else if (di == 0xE407) {
buf[9] = '4';
buf[10] = '5';
} else if (di == 0xE408) {
buf[9] = '4';
buf[10] = '6';
}
len = 11;
break;
}
case 0xE40B:
case 0xE40C:
case 0xE309:
case 0xE310:
{
os_mem_cpy(buf, "0.0.C.52.00", 11);
if (di == 0xE40B) {
buf[9] = '2';
buf[10] = '9';
} else if (di == 0xE40C) {
buf[9] = '3';
buf[10] = '0';
} else if (di == 0xE309) {
buf[9] = '4';
buf[10] = '3';
} else if (di == 0xE310) {
buf[9] = '4';
buf[10] = '4';
}
len = 11;
break;
}
case 0xE401:
{
os_mem_cpy(buf, "0.0.C.51.9", 10);
len = 10;
break;
}
case 0xE402:
{
os_mem_cpy(buf, "0.0.C.51.10", 11);
len = 11;
break;
}
case 0xE300:
{
os_mem_cpy(buf, "0.0.C.7.0", 9);
len = 9;
break;
}
case 0xE301:
{
os_mem_cpy(buf, "0.0.C.51.13", 11);
len = 11;
break;
}
case 0xE306:
{
os_mem_cpy(buf, "0.0.C.7.10", 10);
len = 10;
break;
}
case 0xE308:
{
os_mem_cpy(buf, "0.0.C.51.14", 11);
len = 11;
break;
}
case 0xE100:
{
os_mem_cpy(buf, "1.0.0.8.6", 9);
len = 9;
break;
}
case 0xE108:
{
os_mem_cpy(buf, "1.0.0.8.7", 9);
len = 9;
break;
}
case 0xE109:
{
os_mem_cpy(buf, "1.0.0.8.9", 9);
len = 9;
break;
}
case 0x9FC0:
case 0x9FC1:
case 0x9FC2:
{
os_mem_cpy(buf, "1.0.99.7.0", 10);
buf[7] = (di & 0x000F) + 7 + '0';
len = 10;
break;
}
case 0x9FC3:
{
os_mem_cpy(buf, "1.0.99.12.0", 11);
len = 11;
break;
}
case 0x9FC4:
{
os_mem_cpy(buf, "0.0.99.10.0", 11);
len = 11;
break;
}
case 0x8030:
{
os_mem_cpy(buf, "0.0.0.9.4", 9);
len = 9;
break;
}
case 0xA010:
case 0xA011:
case 0xA012:
case 0xA013:
case 0xA014:
case 0xA020:
case 0xA021:
case 0xA022:
case 0xA023:
case 0xA024:
case 0xB010:
case 0xB011:
case 0xB012:
case 0xB013:
case 0xB014:
case 0xB020:
case 0xB021:
case 0xB022:
case 0xB023:
case 0xB024:
{
os_mem_cpy(buf, "1.0.1.6.0", 9);
buf[4] = ((di & 0x00F0) >> 4) + '0';
buf[8] = (di & 0x000F) + '0';
len = 9;
break;
}
case 0xA100:
case 0xB100:
{
temp = ((di & 0x00F0) >> 4) + 2;
if (temp > 9) {
os_mem_cpy(buf, "1.0.10.6.0", 10);
len = 10;
} else {
os_mem_cpy(buf, "1.0.3.6.0", 9);
buf[4] = temp + '0', len = 9;
}
buf[8] = (di & 0x000F) + '0';
break;
}
case 0xB620:
{
os_mem_cpy(buf, "1.0.11.7.0", 10);
len = 10;
break;
}
case 0xB610:
{
os_mem_cpy(buf, "1.0.12.7.0", 10);
len = 10;
break;
}
case 0xC032:
{
os_mem_cpy(buf, "0.0.C.1.0", 9);
len = 9;
break;
}
case 0xC0FE:
{
os_mem_cpy(buf, "0.0.C.78.0", 10);
len = 11;
break;
}
case 0xE5FF:
{
os_mem_cpy(
buf, "1.0.128.1.1.0(1.0.1.8.0)(1.0.12.7.0)(1.0.11.7.0)(0.0.F.F.0)",
59);
len = 59;
break;
}
case 0xE800:
{
if ((di - 0xE801 + 1) < 10) {
os_mem_cpy(buf, "0.0.C.51.1", 10);
temp = (uint8_t)(di - 0xE801 + 1);
buf[9] = temp + '0';
len = 10;
} else if ((di - 0xE801 + 1) < 100) {
os_mem_cpy(buf, "0.0.C.51.10", 11);
temp = (uint8_t)(di - 0xE801 + 1);
buf[9] = temp / 10 + '0';
buf[10] = temp % 10 + '0';
len = 11;
} else if ((di - 0xE801 + 1) < 122) {
os_mem_cpy(buf, "0.0.C.52.1", 10);
temp = (uint8_t)(di - 0xE871 + 1);
buf[9] = temp + '0';
len = 10;
} else if ((di - 0xE801 + 1) < 149) {
os_mem_cpy(buf, "0.0.C.52.10", 11);
temp = (uint8_t)(di - 0xE871 + 1);
buf[9] = temp / 10 + '0';
buf[10] = temp % 10 + '0';
len = 11;
}
break;
}
case 0xE900:
{
os_mem_cpy(buf, "0.0.0.1.2.", 10);
if ((di - 0xE901 + 1) < 10) {
char ch;
ch = (uint8_t)(di - 0xE901 + 1 + '0');
os_mem_cpy(buf + 10, &ch, 1);
len = 11;
} else {
char ch[2];
ch[1] = (uint8_t)((di - 0xE901 + 1) % 10 + '0');
ch[0] = (uint8_t)((di - 0xE901 + 1) / 10 + '0');
os_mem_cpy(buf + 10, ch, 2);
len = 12;
}
break;
}
case 0x3100:
{
if ((di - 0x3100) < 17) {
os_mem_cpy(buf, "1.0.1.4.0", 9);
temp = (uint8_t)(di - 0x3100);
buf[4] = temp + '0';
len = 9;
} else {
os_mem_cpy(buf, "1.0.1.5.0", 9);
temp = (uint8_t)(di - 0x3110);
buf[4] = temp + '0';
len = 9;
}
break;
}
case 0x0060:
case 0x0260:
case 0x0460:
case 0x0660:
case 0x0860:
case 0x0A60:
case 0x0C60:
case 0x0E60:
case 0x1060:
case 0x1260:
case 0x1460:
case 0x1660:
case 0x0070:
case 0x0270:
case 0x0470:
case 0x0670:
case 0x0870:
case 0x0A70:
case 0x0C70:
case 0x0E70:
case 0x1070:
case 0x1270:
case 0x1470:
case 0x1670:
case 0x0080:
case 0x0280:
case 0x0480:
case 0x0680:
case 0x0880:
case 0x0A80:
case 0x0C80:
case 0x0E80:
case 0x1080:
case 0x1280:
case 0x1480:
case 0x1680:
case 0x0090:
case 0x0290:
case 0x0490:
case 0x0690:
case 0x0890:
case 0x0A90:
case 0x0C90:
case 0x0E90:
case 0x1090:
case 0x1290:
case 0x1490:
case 0x1690:
{
os_mem_cpy(buf, "1.0.5.6.0.", 10);
buf[4] = ((di >> 4) & 0x000F) - 1 + '0';
temp = (di >> 8) / 2 + 1;
if (temp > 9) {
buf[10] = temp / 10 + '0';
buf[11] = temp % 10 + '0';
len = 12;
} else {
buf[10] = temp + '0';
len = 11;
}
break;
}
case 0x05A0:
case 0x07A0:
case 0x09A0:
case 0x0BA0:
case 0x0DA0:
case 0x0FA0:
case 0x11A0:
case 0x13A0:
case 0x15A0:
case 0x17A0:
case 0x19A0:
case 0x1BA0:
{
os_mem_cpy(buf, "1.0.0.1.2.", 10);
temp = (di >> 8) / 2 - 1;
if (temp > 9) {
buf[10] = temp / 10 + '0';
buf[11] = temp % 10 + '0';
len = 12;
} else {
buf[10] = temp + '0';
len = 11;
}
break;
}
default:
{
len = 0;
break;
}
}
return len;
}
static void proto_iec_reverse_data(uint8_t *sdata, uint8_t len)
{
uint8_t i, temp, index;
index = len - 1;
len = len / 2;
for (i = 0; i < len; i++) {
temp = *sdata;
*sdata = *(index + sdata);
*(index + sdata) = temp;
index -= 2;
sdata++;
}
}
/**
* @brief DL/T 645-1997 di to iec multi-obis from yujian
*
* @param di dlt64597 di
* @param buf obis buffer
* @param *multi_obis_idx address for multi_obis_idx
* @return obis data length in buf
*/
static uint8_t proto_iec_di_to_obis2(uint16_t di, uint8_t *buf,
uint8_t *multi_obis_idx)
{
uint8_t len = 0, temp = 0, obis_index = *multi_obis_idx;
switch (di) {
case 0x0400:
case 0x0600:
case 0x0800:
case 0x0A00:
case 0x0C00:
case 0x0E00:
case 0x1000:
case 0x1200:
case 0x1400:
case 0x1600:
case 0x1800:
case 0x1A00:
case 0x0410:
case 0x0610:
case 0x0810:
case 0x0A10:
case 0x0C10:
case 0x0E10:
case 0x1010:
case 0x1210:
case 0x1410:
case 0x1610:
case 0x1810:
case 0x1A10:
case 0x0420:
case 0x0620:
case 0x0820:
case 0x0A20:
case 0x0C20:
case 0x0E20:
case 0x1020:
case 0x1220:
case 0x1420:
case 0x1620:
case 0x1820:
case 0x1A20:
case 0x0430:
case 0x0630:
case 0x0830:
case 0x0A30:
case 0x0C30:
case 0x0E30:
case 0x1030:
case 0x1230:
case 0x1430:
case 0x1630:
case 0x1830:
case 0x1A30:
case 0x0440:
case 0x0640:
case 0x0840:
case 0x0A40:
case 0x0C40:
case 0x0E40:
case 0x1040:
case 0x1240:
case 0x1440:
case 0x1640:
case 0x1840:
case 0x1A40:
{
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.1.8.0.", 10);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "1.0.1.8.1.", 10);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "1.0.1.8.2.", 10);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "1.0.1.8.3.", 10);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "1.0.1.8.4.", 10);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
if ((di & 0x0040) != 0) {
buf[4] = '9';
} else {
buf[4] = ((di >> 4) & 0x000F) + 1 + '0';
}
temp = (di >> 8) / 2 - 1;
if (temp > 9) {
buf[10] = temp / 10 + '0';
buf[11] = temp % 10 + '0';
len = 12;
} else {
buf[10] = temp + '0';
len = 11;
}
break;
}
case 0x04C0:
case 0x06C0:
case 0x08C0:
case 0x0AC0:
case 0x0CC0:
case 0x0EC0:
case 0x10C0:
case 0x12C0:
case 0x14C0:
case 0x16C0:
case 0x18C0:
case 0x1AC0:
case 0x04D0:
case 0x06D0:
case 0x08D0:
case 0x0AD0:
case 0x0CD0:
case 0x0ED0:
case 0x10D0:
case 0x12D0:
case 0x14D0:
case 0x16D0:
case 0x18D0:
case 0x1AD0:
case 0x04E0:
case 0x06E0:
case 0x08E0:
case 0x0AE0:
case 0x0CE0:
case 0x0EE0:
case 0x10E0:
case 0x12E0:
case 0x14E0:
case 0x16E0:
case 0x18E0:
case 0x1AE0:
case 0x04F0:
case 0x06F0:
case 0x08F0:
case 0x0AF0:
case 0x0CF0:
case 0x0EF0:
case 0x10F0:
case 0x12F0:
case 0x14F0:
case 0x16F0:
case 0x18F0:
case 0x1AF0:
{
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.1.8.0.", 10);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "1.0.1.8.1.", 10);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "1.0.1.8.2.", 10);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "1.0.1.8.3.", 10);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "1.0.1.8.4.", 10);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
/* Recalculate the fifth character */
buf[4] = ((di >> 4) & 0x000F) - 7 + '0';
/* Calculate the last character */
temp = (di >> 8) / 2 - 1;
if (temp > 9) {
buf[10] = temp / 10 + '0';
buf[11] = temp % 10 + '0';
len = 12;
} else {
buf[10] = temp + '0';
len = 11;
}
break;
}
case 0x2400:
case 0x2500:
case 0x2600:
case 0x2700:
case 0x2800:
case 0x2900:
case 0x2A00:
case 0x2B00:
case 0x2C00:
case 0x2D00:
case 0x2E00:
case 0x2F00:
case 0x2410:
case 0x2510:
case 0x2610:
case 0x2710:
case 0x2810:
case 0x2910:
case 0x2A10:
case 0x2B10:
case 0x2C10:
case 0x2D10:
case 0x2E10:
case 0x2F10:
case 0x2420:
case 0x2520:
case 0x2620:
case 0x2720:
case 0x2820:
case 0x2920:
case 0x2A20:
case 0x2B20:
case 0x2C20:
case 0x2D20:
case 0x2E20:
case 0x2F20:
case 0x2430:
case 0x2530:
case 0x2630:
case 0x2730:
case 0x2830:
case 0x2930:
case 0x2A30:
case 0x2B30:
case 0x2C30:
case 0x2D30:
case 0x2E30:
case 0x2F30:
case 0x2440:
case 0x2540:
case 0x2640:
case 0x2740:
case 0x2840:
case 0x2940:
case 0x2A40:
case 0x2B40:
case 0x2C40:
case 0x2D40:
case 0x2E40:
case 0x2F40:
{
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.1.6.0.", 10);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "1.0.1.6.1.", 10);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "1.0.1.6.2.", 10);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "1.0.1.6.3.", 10);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "1.0.1.6.4.", 10);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
/* Recalculate the fifth character */
if ((di & 0x00F0) == 0x0040) {
buf[4] = '9';
} else {
buf[4] = ((di >> 4) & 0x000F) + 1 + '0';
}
/* Calculate the last character */
temp = ((di >> 8) & 0x0F) - 3;
if (temp > 9) {
buf[10] = temp / 10 + '0';
buf[11] = temp % 10 + '0';
len = 12;
} else {
buf[10] = temp + '0';
len = 11;
}
break;
}
#ifdef ADD_GRID
case 0xE710:
{
len = 9;
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.1.8.0", 9);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "1.0.2.8.0", 9);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "1.0.12.7.0", 10);
obis_index++;
len = 10;
} else if (obis_index == 3) {
os_mem_cpy(buf, "1.0.11.7.0", 10);
obis_index++;
len = 10;
} else if (obis_index == 4) {
os_mem_cpy(buf, "0.0.F.F.0", 9);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE720:
{
len = 9;
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.1.8.0", 9);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "1.0.1.8.1", 9);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "1.0.1.8.2", 9);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "1.0.1.8.3", 9);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "1.0.1.8.4", 9);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE730:
{
len = 9;
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.2.8.0", 9);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "1.0.2.8.1", 9);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "1.0.2.8.2", 9);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "1.0.2.8.3", 9);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "1.0.2.8.4", 9);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE740:
{
len = 10;
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.31.7.0", 10);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "1.0.51.7.0", 10);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "1.0.71.7.0", 10);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "1.0.32.7.0", 10);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "1.0.52.7.0", 10);
obis_index++;
} else if (obis_index == 5) {
os_mem_cpy(buf, "1.0.72.7.0", 10);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE750:
{
len = 9;
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.1.6.0", 9);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "1.0.2.6.0", 9);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
#endif
#ifdef ADD_GRID2
case 0xE760:
{
len = 9;
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.1.8.0", 9);
obis_index++;
}
else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.F.F.0", 9);
obis_index++;
}
else if (obis_index == 2)
{
os_mem_cpy(buf, "1.0.1.8.1", 9);
obis_index++;
} else if (obis_index == 3)
{
os_mem_cpy(buf, "1.0.1.8.2", 9);
obis_index++;
} else if (obis_index == 4)
{
os_mem_cpy(buf, "1.0.1.8.3", 9);
obis_index++;
} else if (obis_index == 5)
{
os_mem_cpy(buf, "1.0.1.8.4", 9);
obis_index++;
} else if (obis_index == 6) {
os_mem_cpy(buf, "1.0.32.7.0", 10);
obis_index++;
len = 10;
} else if (obis_index == 7) {
os_mem_cpy(buf, "1.0.31.7.0", 10);
obis_index++;
len = 10;
} else if (obis_index == 8) {
os_mem_cpy(buf, "1.0.3.8.0", 9);
obis_index++;
} else if (obis_index == 9) {
os_mem_cpy(buf, "1.0.0.4.4", 9);
obis_index++;
} else if (obis_index == 10) {
os_mem_cpy(buf, "1.0.52.7.0", 10);
obis_index++;
len = 10;
} else if (obis_index == 11) {
os_mem_cpy(buf, "1.0.51.7.0", 10);
obis_index++;
len = 10;
} else if (obis_index == 12) {
os_mem_cpy(buf, "1.0.72.7.0", 10);
obis_index++;
len = 10;
} else if (obis_index == 13) {
os_mem_cpy(buf, "1.0.71.7.0", 10);
obis_index++;
len = 10;
} else if (
(obis_index == 14) ||
(obis_index == 15)) {
os_mem_cpy(buf, "1.0.1.6.0", 9);
obis_index++;
} else if (obis_index == 16) {
os_mem_cpy(buf, "1.0.2.8.0", 9);
obis_index++;
} else if (obis_index == 17) {
os_mem_cpy(buf, "1.0.2.8.1", 9);
obis_index++;
} else if (obis_index == 18) {
os_mem_cpy(buf, "1.0.2.8.2", 9);
obis_index++;
} else if (obis_index == 19) {
os_mem_cpy(buf, "1.0.2.8.3", 9);
obis_index++;
} else if (obis_index == 20) {
os_mem_cpy(buf, "1.0.2.8.4", 9);
obis_index++;
} else if (obis_index == 21) {
os_mem_cpy(buf, "1.0.4.8.0", 9);
obis_index++;
} else if (obis_index == 22) {
os_mem_cpy(buf, "1.0.2.6.0", 9);
obis_index++;
} else if (obis_index == 23) {
os_mem_cpy(buf, "1.0.2.6.0", 9);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE770:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.7.10", 10);
obis_index++;
len = 10;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.51.14", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.51.10", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.51.12", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE771:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.96.52.26", 12);
obis_index++;
len = 12;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.52.30", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.51.16", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.51.18", 11);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "0.0.C.51.44", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE780:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.7.10", 10);
obis_index++;
len = 10;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.51.14", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.51.16", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.52.34", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE781:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.52.36", 11);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.2.0", 9);
obis_index++;
len = 9;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.2.1", 9);
obis_index++;
len = 9;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.52.14", 11);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "0.0.C.52.16", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE782:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.51.60", 11);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.51.62", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.51.72", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.51.74", 11);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "0.0.C.52.2", 10);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
len = 10;
}
break;
}
case 0xE783:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.52.4", 10);
obis_index++;
len = 10;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.52.26", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.52.28", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.52.18", 11);
obis_index++;
} else if (obis_index == 4) {
os_mem_cpy(buf, "0.0.C.52.20", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE784:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.52.22", 11);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.52.24", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.51.64", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.51.66", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE785:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.51.68", 11);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.51.70", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.51.76", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.51.78", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE786:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.51.80", 11);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.51.82", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.52.6", 10);
obis_index++;
len = 10;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.52.8", 10);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
len = 10;
}
break;
}
case 0xE787:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.52.10", 11);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.52.12", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.51.84", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.51.86", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE788:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "0.0.C.51.88", 11);
obis_index++;
} else if (obis_index == 1) {
os_mem_cpy(buf, "0.0.C.51.90", 11);
obis_index++;
} else if (obis_index == 2) {
os_mem_cpy(buf, "0.0.C.51.92", 11);
obis_index++;
} else if (obis_index == 3) {
os_mem_cpy(buf, "0.0.C.51.94", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
case 0xE790:
{
len = 11;
if (obis_index == 0) {
os_mem_cpy(buf, "1.0.0.4.4", 9);
obis_index++;
len = 9;
} else if (
(obis_index >= 1) &&
(obis_index <= 12)) {
os_mem_cpy(buf, "1.0.1.8.0.1", 11);
if (obis_index <= 10)
{
if (obis_index > 5)
buf[4] = '2';
buf[8] = (obis_index - 1) % 5 + 0x30;
} else
{
buf[4] = (obis_index - 8) + 0x30;
}
obis_index++;
} else if (obis_index == 13) {
os_mem_cpy(buf, "1.0.0.1.2.1", 11);
obis_index++;
len = 11;
} else if (obis_index == 14) {
os_mem_cpy(buf, "1.0.1.6.0.1", 11);
obis_index++;
} else if (obis_index == 15) {
os_mem_cpy(buf, "1.0.2.6.0.1", 11);
obis_index = PROTO_IEC_YJ_MULTI_OBIS_INDEX_INVALID;
}
break;
}
default:
{
len = 0;
break;
}
#endif
}
*multi_obis_idx = obis_index;
return len;
}
/**
* @brief calc xor crc value by yujian
*
* @param p address of data.
* @param len len of data
* @return crc value
*/
uint8_t proto_iec_calc_crc(uint8_t *p, uint8_t len)
{
uint8_t i, cs = 0;
for (i = 0; i < (len - 1); i++) {
cs ^= p[i];
}
return cs;
}
iot_pkt_t *proto_iec_yj_build_iec_by_64597_di(uint16_t di,
uint8_t *multi_obis_idx)
{
uint8_t obis_len = 0, *data = NULL, data_len = 0;
iot_pkt_t *pkt = NULL;
pkt = iot_pkt_alloc(PROTO_IEC_READ_PKT_LENGTH_MAX, IOT_SMART_GRID_MID);
if (!pkt) {
return pkt;
}
data = iot_pkt_data(pkt);
os_mem_cpy(data,"\x01\x52\x31\x02\x30\x2E\x30\x2E"
"\x43\x2E\x31\x2E\x30\x28\x29\x03\x21", 17);
obis_len = iec_pm_drv_di_to_obis(di, &data[4]);
if (obis_len == 59 || obis_len == 72) {
data[2] = 0x35;
data[4 + obis_len] = 0x03;
data_len = obis_len + 6;
} else if (obis_len) {
/* After copying the IEC suffix to mswrtmsg IEC data */
os_mem_cpy(data + 4 + obis_len, "\x28\x29\x03", 3);
data_len = obis_len + 8;
} else {
obis_len = proto_iec_di_to_obis2(di, &data[4], multi_obis_idx);
if (!obis_len) {
*multi_obis_idx = 0;
goto out;
}
/* After copying the IEC suffix to mswrtmsg IEC data */
os_mem_cpy(data + 4 + obis_len, "\x28\x29\x03", 3);
data_len = obis_len + 8;
}
data[data_len - 1] = proto_iec_calc_crc(&data[1], data_len - 1);
iot_pkt_put(pkt, data_len);
out:
if (pkt && !data_len) {
iot_pkt_free(pkt);
pkt = NULL;
}
return pkt;
}
static uint8_t IEC2645(uint8_t *src, uint8_t *dst,
uint8_t s_len, uint8_t d_len, uint8_t num, uint16_t opt)
{
uint8_t i = 0, j = 0, k = 0, temp1[32], temp2[32];
for (j = 0; j < num; j++) {
for (i = i; i < s_len; i++) {
if (*src == '(') {
src++;
break;
}
src++;
}
}
if (i == s_len)
return 0;
if (opt & 0x8000) {
for (i = 0; i < d_len; i++) {
temp1[k] = *src++;
temp1[k] = iec_toupper(temp1[k]) - '0';
if (temp1[k] > 9)
temp1[k] = temp1[k] - 7;
k++;
}
} else {
for (i = i; i < s_len; i++) {
if ((*src >= '0') && (*src <= '9')) {
temp1[k] = *src++;
k++;
} else {
if (*src == ')') {
break;
}
src++;
}
}
if (i == s_len)
return 0;
}
if (d_len < k)
return 0;
#ifdef CHANGE_EVENTBYTE
if (opt & 0x4000)
{
os_mem_set(temp2, 0xff, d_len - k);
}
else
{
os_mem_set(temp2, 0x30, d_len - k);
}
#else
os_mem_set(temp2, 0x30, d_len - k);
#endif
os_mem_cpy(temp2 + d_len - k, temp1, k);
os_mem_set(temp1, 0x30, sizeof(temp1));
os_mem_cpy(temp1 + ((opt & 0x0F00) >> 8), temp2 + ((opt & 0x00F0) >> 4),
d_len - ((opt & 0x00F0) >> 4) - (opt & 0x000F));
for (i = 0, k = 0; i < d_len; i += 2, k++) {
dst[k] = ((temp1[i] & 0x0f) << 4) | (temp1[i + 1] & 0x0f);
}
return k;
}
uint8_t proto_iec_yj_iec_map_to_64597_data(
uint16_t di, uint8_t *src, uint8_t *dst, uint8_t len)
{
uint8_t datalen = 0, d_len = 0, i, j, h, l;
uint16_t req_id;
req_id = di;
if (((di & 0xF000) == 0x9000) && ((di & 0xFF) < 0xC0)) {
req_id = 0x9000;
} else if ((di & 0xFF00) == 0xA100) {
req_id = 0xA100;
} else if ((di & 0xFF00) == 0xB100) {
req_id = 0xB100;
} else if (((di & 0xFF00) == 0xE500) && ((di & 0xFF) < 0xFE)) {
req_id = 0xE500;
} else if ((di & 0xFF00) == 0xE900) {
req_id = 0xE900;
} else if ((di & 0xFF00) == 0xE800) {
req_id = 0xE800;
} else if ((di & 0xFF00) == 0x3100) {
req_id = 0x3100;
}
switch (req_id) {
case 0x9000:
{
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
}
#else
if (IEC2645(src, dst, len, 10, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
#endif
break;
}
/* Read voltage, remove the last byte of IEC format,
* equivalent voltage A, B, C with 1 decimal place of 4 bytes.
*/
case 0xB610:
case 0xB611:
case 0xB612:
case 0xB613:
{
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 6, 1, 0x0101) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 4, 1, 0x0101) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
break;
}
/* Read current, excluding the highest two bytes in IEC format,
* equivalent current A, B, C with 2 decimal places and 6 bytes.
*/
case 0xB620:
case 0xB621:
case 0xB622:
case 0xB623:
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 6, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
break;
/* Read power, take 2 decimal places for the integer part of IEC,
* and add 0 to the last decimal place of 645. Active power A, B, C,
* total active power takes 3 decimal places and 6 bytes.
*/
case 0x3100:
case 0xB630:
case 0xB631:
case 0xB632:
case 0xB633:
{
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 8, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#endif
break;
}
case 0xB640:
case 0xB641:
case 0xB642:
case 0xB643:
{
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 8, 1, 0x0011) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0011) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
break;
}
case 0xB650:
case 0xB651:
case 0xB652:
case 0xB653:
{
if (IEC2645(src, dst, len, 6, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
break;
}
case 0x8EA0:
{
if (IEC2645(src, dst, len, 8, 1, 0x8000) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
break;
}
case 0xA080:
{
if (IEC2645(src, dst, len, 16, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 8);
datalen = 8;
}
break;
}
case 0xB660:
{
if (IEC2645(src, dst, len, 8, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
break;
}
case 0xC111:
case 0xC710:
case 0xA002:
case 0xA000:
case 0xA001:
case 0xA006:
case 0xA007:
{
if (IEC2645(src, dst, len, 4, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
break;
}
case 0xE100:
case 0xE108:
case 0xE109:
{
if (IEC2645(src, dst, len, 2, 1, 0x0000) != 0) {
datalen = 1;
}
break;
}
case 0xC712:
{
if (IEC2645(src, dst, len, 24, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 12);
datalen = 12;
}
break;
}
case 0xC711:
{
if (IEC2645(src, dst, len, 8, 1, 0x8000) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
break;
}
case 0x8030:
{
if (IEC2645(src, dst, len, 12, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 6);
datalen = 6;
}
break;
}
case 0xA010:
case 0xA011:
case 0xA012:
case 0xA013:
case 0xA014:
case 0xA020:
case 0xA021:
case 0xA022:
case 0xA023:
case 0xA024:
case 0xA100:
{
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 8, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#endif
break;
}
case 0x05A0:
case 0x07A0:
case 0x09A0:
case 0x0BA0:
case 0x0DA0:
case 0x0FA0:
case 0x11A0:
case 0x13A0:
case 0x15A0:
case 0x17A0:
case 0x19A0:
case 0x1BA0:
{
if (IEC2645(src, dst, len, 12, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 6);
datalen = 6;
}
break;
}
case 0xB010:
case 0xB011:
case 0xB012:
case 0xB013:
case 0xB014:
case 0xB020:
case 0xB021:
case 0xB022:
case 0xB023:
case 0xB024:
case 0xB100:
{
if (IEC2645(src, dst, len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 4;
}
break;
}
case 0xE800:
{
if (di % 2)
{
if (IEC2645(src, dst, len, 4, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
} else
{
#ifdef CHANGE_EVENTBYTE
if (di == 0xE810)
{
datalen = 30;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 6, len, 12, i + 1, 0x4000) !=
0) {
proto_iec_reverse_data(dst + i * 6, 6);
} else {
os_mem_set(dst + i * 6, 0xFF, datalen - 6 * i);
break;
}
}
break;
}
datalen = 25;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 5, len, 10, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 5, 5);
} else {
os_mem_set(dst + i * 5, 0xFF, datalen - 5 * i);
break;
}
}
#else
if (di == 0xE810)
{
if (IEC2645(src, dst, len, 12, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 6);
datalen = 6;
}
break;
}
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
} else {
os_mem_set(dst, 0xFF, 5);
datalen = 5;
}
#endif
}
break;
}
case 0xE900:
{
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
}
break;
}
case 0xC0FE:
{
if (IEC2645(src, dst, len, 2, 1, 0x0000) != 0) {
datalen = 1;
}
break;
}
case 0xE5FF:
{
for (i = 0; i < len; i++) {
if (*src++ == 0x0D) {
if (*src++ == 0x0A) {
break;
}
}
}
if (i == len)
return 0;
len -= i;
if (IEC2645(src, dst, len, 10, 1, 0x0020) != 0)
{
proto_iec_reverse_data(dst, 4);
datalen += 4;
}
if (IEC2645(src, dst + 4, len, 4, 2, 0x0101) != 0)
{
proto_iec_reverse_data(dst + 4, 2);
datalen += 2;
}
if (IEC2645(src, dst + 6, len, 6, 3, 0x0020) != 0)
{
proto_iec_reverse_data(dst + 6, 2);
datalen += 2;
}
if (IEC2645(src, dst + 8, len, 8, 4, 0x8000) != 0)
{
proto_iec_reverse_data(dst + 8, 4);
datalen += 4;
}
if (datalen != 12) {
datalen = 0;
}
break;
}
case 0x0060:
case 0x0260:
case 0x0460:
case 0x0660:
case 0x0860:
case 0x0A60:
case 0x0C60:
case 0x0E60:
case 0x1060:
case 0x1260:
case 0x1460:
case 0x1660:
case 0x0070:
case 0x0270:
case 0x0470:
case 0x0670:
case 0x0870:
case 0x0A70:
case 0x0C70:
case 0x0E70:
case 0x1070:
case 0x1270:
case 0x1470:
case 0x1670:
case 0x0080:
case 0x0280:
case 0x0480:
case 0x0680:
case 0x0880:
case 0x0A80:
case 0x0C80:
case 0x0E80:
case 0x1080:
case 0x1280:
case 0x1480:
case 0x1680:
case 0x0090:
case 0x0290:
case 0x0490:
case 0x0690:
case 0x0890:
case 0x0A90:
case 0x0C90:
case 0x0E90:
case 0x1090:
case 0x1290:
case 0x1490:
case 0x1690:
{
if (IEC2645(src, dst, len, 6, 1, 0x000) != 0) {
proto_iec_reverse_data(dst, 3);
datalen += 3;
}
if (IEC2645(src, &dst[3], len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(&dst[3], 5);
datalen += 5;
}
if (datalen != 8) {
datalen = 0;
}
break;
}
case 0xE302:
case 0xE407:
case 0xE409:
case 0xE403:
case 0xE405:
case 0xE40F:
case 0xE401:
case 0xE300:
case 0xE40B:
case 0xE309:
case 0xA090:
case 0xE301:
{
if (IEC2645(src, dst, len, 4, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
break;
}
case 0xE408:
case 0xE40A:
case 0xE404:
case 0xE406:
case 0xE410:
case 0xE402:
case 0xE40C:
{
if (IEC2645(src, dst, len, 20, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 10);
datalen = 10;
} else {
os_mem_set(dst, 0xFF, 10);
datalen = 10;
}
break;
}
case 0xE304:
case 0xE306:
case 0xE308:
case 0xE310:
{
#ifdef CHANGE_EVENTBYTE
datalen = 25;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 5, len, 10, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 5, 5);
} else {
os_mem_set(dst + i * 5, 0xFF, datalen - 5 * i);
break;
}
}
#else
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
} else {
os_mem_set(dst, 0xFF, 5);
datalen = 5;
}
#endif
break;
}
case 0xA091:
{
#ifdef CHANGE_EVENTBYTE
datalen = 30;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 6, len, 12, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 6, 6);
} else {
os_mem_set(dst + i * 6, 0xFF, datalen - 6 * i);
break;
}
}
#else
if (IEC2645(src, dst, len, 12, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 6);
datalen = 6;
} else {
os_mem_set(dst, 0xFF, 6);
datalen = 6;
}
#endif
break;
}
case 0xC000:
{
d_len = 4;
goto Trans_Entry;
}
case 0xC032:
{
d_len = 12;
goto A080_Entry;
}
case 0xC106:
{
d_len = 4;
goto C10X_Entry;
}
case 0xC107:
{
d_len = 32;
goto C10X_Entry;
}
case 0x9FC0:
case 0x9FC1:
{
d_len = 80;
goto C9FX_Entry;
}
case 0x9FC2:
{
d_len = 24;
goto C9FX_Entry;
}
case 0x9FC3:
{
d_len = 56;
goto C9FX_Entry;
}
case 0xE601:
case 0xE602:
case 0xE603:
case 0xE604:
case 0xE605:
case 0xE606:
case 0xE607:
case 0xE608:
case 0xE609:
case 0xE60A:
case 0xE60B:
case 0xE60C:
case 0xE60D:
case 0xE60E:
case 0xE60F:
case 0xE610:
case 0xE611:
case 0xE612:
case 0xE613:
case 0xE614:
case 0xE615:
case 0xE616:
case 0xE617:
case 0xE618:
case 0xE619:
case 0xE61A:
case 0xE61B:
case 0xE61C:
case 0xE61D:
case 0xE61E:
{
d_len = 58;
Trans_Entry:
for (i = 0; i < len; i++) {
if (*src == '(') {
src++;
break;
}
src++;
}
if (i == len)
return 0;
datalen = d_len / 2;
for (i = 0; i < datalen; i++) {
h = src[2 * i];
l = src[2 * i + 1];
if (h < 0x3a)
h -= 0x30;
else {
if (h > 0x60)
h -= 0x20;
h -= 0x37;
}
if (l < 0x3a)
l -= 0x30;
else {
if (l > 0x60)
l -= 0x20;
l -= 0x37;
}
dst[i] = (h << 4) | l;
}
break;
}
case 0xC105:
case 0xC108:
{
d_len = 8;
C10X_Entry:
for (i = 0; i < len; i++) {
if (*src == '(') {
src++;
break;
}
src++;
}
if (i == len)
return 0;
datalen = d_len / 2;
for (i = 0; i < datalen; i++) {
h = src[2 * i];
l = src[2 * i + 1];
if (h < 0x3a)
h -= 0x30;
else {
if (h > 0x60)
h -= 0x20;
h -= 0x37;
}
if (l < 0x3a)
l -= 0x30;
else {
if (l > 0x60)
l -= 0x20;
l -= 0x37;
}
dst[datalen - i - 1] = (h << 4) | l;
}
break;
}
case 0x9FC4:
{
d_len = 20;
C9FX_Entry:
for (i = 0; i < len; i++) {
if (*src == '(') {
src++;
break;
}
src++;
}
if (i == len)
return 0;
datalen = d_len / 2;
for (i = 0; i < datalen; i++) {
h = src[2 * i];
l = src[2 * i + 1];
if (h < 0x3a)
h -= 0x30;
else {
if (h > 0x60)
h -= 0x20;
h -= 0x37;
}
if (l < 0x3a)
l -= 0x30;
else {
if (l > 0x60)
l -= 0x20;
l -= 0x37;
}
dst[i] = (h << 4) | l;
}
break;
}
default:
{
if (d_len == 104 || d_len == 50 || d_len == 52 || d_len == 12) {
A080_Entry:
for (i = 0; i < len; i++) {
if (*src == '(') {
src++;
break;
}
src++;
}
if (i == len) {
return 0;
}
datalen = d_len / 2;
{
for (i = 0; i < datalen; i++) {
j = 2 * i;
dst[datalen - i - 1] =
((src[j] & 0x0f) << 4) | (src[j + 1] & 0x0f);
}
}
break;
} else {
return 0;
}
}
}
return datalen;
}
uint8_t proto_iec_yj_iec_map_to_64597_data_multi_obis(
uint16_t di, uint8_t *src, uint8_t *dst, uint8_t len,
uint8_t *multi_obis_idx)
{
uint8_t datalen = 0, i;
switch (di) {
case 0x0400:
case 0x0600:
case 0x0800:
case 0x0A00:
case 0x0C00:
case 0x0E00:
case 0x1000:
case 0x1200:
case 0x1400:
case 0x1600:
case 0x1800:
case 0x1A00:
case 0x0410:
case 0x0610:
case 0x0810:
case 0x0A10:
case 0x0C10:
case 0x0E10:
case 0x1010:
case 0x1210:
case 0x1410:
case 0x1610:
case 0x1810:
case 0x1A10:
case 0x0420:
case 0x0620:
case 0x0820:
case 0x0A20:
case 0x0C20:
case 0x0E20:
case 0x1020:
case 0x1220:
case 0x1420:
case 0x1620:
case 0x1820:
case 0x1A20:
case 0x0430:
case 0x0630:
case 0x0830:
case 0x0A30:
case 0x0C30:
case 0x0E30:
case 0x1030:
case 0x1230:
case 0x1430:
case 0x1630:
case 0x1830:
case 0x1A30:
case 0x0440:
case 0x0640:
case 0x0840:
case 0x0A40:
case 0x0C40:
case 0x0E40:
case 0x1040:
case 0x1240:
case 0x1440:
case 0x1640:
case 0x1840:
case 0x1A40:
case 0x04C0:
case 0x06C0:
case 0x08C0:
case 0x0AC0:
case 0x0CC0:
case 0x0EC0:
case 0x10C0:
case 0x12C0:
case 0x14C0:
case 0x16C0:
case 0x18C0:
case 0x1AC0:
case 0x04D0:
case 0x06D0:
case 0x08D0:
case 0x0AD0:
case 0x0CD0:
case 0x0ED0:
case 0x10D0:
case 0x12D0:
case 0x14D0:
case 0x16D0:
case 0x18D0:
case 0x1AD0:
case 0x04E0:
case 0x06E0:
case 0x08E0:
case 0x0AE0:
case 0x0CE0:
case 0x0EE0:
case 0x10E0:
case 0x12E0:
case 0x14E0:
case 0x16E0:
case 0x18E0:
case 0x1AE0:
case 0x04F0:
case 0x06F0:
case 0x08F0:
case 0x0AF0:
case 0x0CF0:
case 0x0EF0:
case 0x10F0:
case 0x12F0:
case 0x14F0:
case 0x16F0:
case 0x18F0:
case 0x1AF0:
{
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
}
break;
}
case 0x2400:
case 0x2500:
case 0x2600:
case 0x2700:
case 0x2800:
case 0x2900:
case 0x2A00:
case 0x2B00:
case 0x2C00:
case 0x2D00:
case 0x2E00:
case 0x2F00:
case 0x2410:
case 0x2510:
case 0x2610:
case 0x2710:
case 0x2810:
case 0x2910:
case 0x2A10:
case 0x2B10:
case 0x2C10:
case 0x2D10:
case 0x2E10:
case 0x2F10:
case 0x2420:
case 0x2520:
case 0x2620:
case 0x2720:
case 0x2820:
case 0x2920:
case 0x2A20:
case 0x2B20:
case 0x2C20:
case 0x2D20:
case 0x2E20:
case 0x2F20:
case 0x2430:
case 0x2530:
case 0x2630:
case 0x2730:
case 0x2830:
case 0x2930:
case 0x2A30:
case 0x2B30:
case 0x2C30:
case 0x2D30:
case 0x2E30:
case 0x2F30:
case 0x2440:
case 0x2540:
case 0x2640:
case 0x2740:
case 0x2840:
case 0x2940:
case 0x2A40:
case 0x2B40:
case 0x2C40:
case 0x2D40:
case 0x2E40:
case 0x2F40:
{
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 8, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 4);
datalen += 4;
}
if (IEC2645(src, &dst[4], len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(&dst[4], 5);
datalen += 5;
}
if (datalen != 9) {
datalen = 0;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 3);
datalen += 3;
}
if (IEC2645(src, &dst[3], len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(&dst[3], 5);
datalen += 5;
}
if (datalen != 8) {
datalen = 0;
}
#endif
break;
}
#ifdef ADD_GRID
case 0xE710:
{
if ((*multi_obis_idx == 1) ||
(*multi_obis_idx == 2)) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
}
#else
if (IEC2645(src, dst, len, 10, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
#endif
} else if (*multi_obis_idx == 3) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 6, 1, 0x0101) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 4, 1, 0x0101) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
} else if (*multi_obis_idx == 4) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 6, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
} else if (*multi_obis_idx == 50) {
if (IEC2645(src, dst, len, 8, 1, 0x8000) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
}
break;
}
case 0xE720:
case 0xE730:
{
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
}
#else
if (IEC2645(src, dst, len, 10, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
#endif
break;
}
case 0xE740:
{
if ((*multi_obis_idx == 1) ||
(*multi_obis_idx == 2) ||
(*multi_obis_idx == 3)) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 6, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
} else if (
(*multi_obis_idx == 4) ||
(*multi_obis_idx == 5) ||
(*multi_obis_idx == 50)) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 6, 1, 0x0101) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 4, 1, 0x0101) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
}
break;
}
case 0xE750:
{
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 8, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
if (IEC2645(src, &dst[4], len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(&dst[4], 5);
datalen += 5;
}
if (datalen != 9) {
datalen = 0;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
if (IEC2645(src, &dst[3], len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(&dst[3], 5);
datalen += 5;
}
if (datalen != 8) {
datalen = 0;
}
#endif
break;
}
#endif
#ifdef ADD_GRID2
case 0xE760:
{
if ((*multi_obis_idx == 1) ||
(*multi_obis_idx == 3) ||
(*multi_obis_idx == 4) ||
(*multi_obis_idx == 5) ||
(*multi_obis_idx == 6) ||
(*multi_obis_idx == 9) ||
(*multi_obis_idx == 17) ||
(*multi_obis_idx == 18) ||
(*multi_obis_idx == 19) ||
(*multi_obis_idx == 20) ||
(*multi_obis_idx == 21) ||
(*multi_obis_idx == 22)) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
}
#else
if (IEC2645(src, dst, len, 10, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
#endif
} else if ((*multi_obis_idx == 7) ||
(*multi_obis_idx == 11) ||
(*multi_obis_idx == 13)) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 6, 1, 0x0101) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 4, 1, 0x0101) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
}
else if ((*multi_obis_idx == 8) ||
(*multi_obis_idx == 12) ||
(*multi_obis_idx == 14)) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 6, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0020) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
#endif
} else if (*multi_obis_idx == 10) {
if (IEC2645(src, dst, len, 16, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 8);
datalen = 8;
}
} else if (*multi_obis_idx == 2) {
if (IEC2645(src, dst, len, 8, 1, 0x8000) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
} else if (
(*multi_obis_idx == 15) ||
(*multi_obis_idx == 23)) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 8, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 4);
datalen = 4;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 3);
datalen = 3;
}
#endif
} else if (
(*multi_obis_idx == 16) ||
(*multi_obis_idx == 50)) {
if (IEC2645(src, dst, len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 4;
}
}
break;
}
case 0xE770:
{
if ((*multi_obis_idx == 1) ||
(*multi_obis_idx == 2)) {
datalen = 25;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 5, len, 10, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 5, 5);
} else {
os_mem_set(dst + i * 5, 0xFF, datalen - 5 * i);
break;
}
}
} else if (
(*multi_obis_idx == 3) ||
(*multi_obis_idx == 50)) {
if (IEC2645(src, dst, len, 20, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 10);
datalen = 10;
} else {
os_mem_set(dst, 0xFF, 10);
datalen = 10;
}
}
break;
}
case 0xE771:
{
if ((*multi_obis_idx == 1) ||
(*multi_obis_idx == 2) ||
(*multi_obis_idx == 4) ||
(*multi_obis_idx == 50)) {
if (IEC2645(src, dst, len, 20, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 10);
datalen = 10;
} else {
os_mem_set(dst, 0xFF, 10);
datalen = 10;
}
} else if (*multi_obis_idx == 3) {
datalen = 30;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 6, len, 12, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 6, 6);
} else {
os_mem_set(dst + i * 6, 0xFF, datalen - 6 * i);
break;
}
}
}
break;
}
case 0xE780:
{
if ((*multi_obis_idx == 1) ||
(*multi_obis_idx == 2) ||
(*multi_obis_idx == 50)) {
datalen = 25;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 5, len, 10, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 5, 5);
} else {
os_mem_set(dst + i * 5, 0xFF, datalen - 5 * i);
break;
}
}
} else if (*multi_obis_idx == 3) {
datalen = 30;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 6, len, 12, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 6, 6);
} else {
os_mem_set(dst + i * 6, 0xFF, datalen - 6 * i);
break;
}
}
}
break;
}
case 0xE781:
{
if ((*multi_obis_idx == 1) ||
(*multi_obis_idx == 3) ||
(*multi_obis_idx == 4) ||
(*multi_obis_idx == 50)) {
datalen = 25;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 5, len, 10, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 5, 5);
} else {
os_mem_set(dst + i * 5, 0xFF, datalen - 5 * i);
break;
}
}
} else if (*multi_obis_idx == 2) {
if (IEC2645(src, dst, len, 4, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 2);
datalen = 2;
}
}
break;
}
case 0xE782:
case 0xE783:
case 0xE784:
case 0xE785:
case 0xE786:
case 0xE787:
case 0xE788:
{
datalen = 25;
for (i = 0; i < 5; i++) {
if (IEC2645(src, dst + i * 5, len, 10, i + 1, 0x4000) != 0) {
proto_iec_reverse_data(dst + i * 5, 5);
} else {
os_mem_set(dst + i * 5, 0xFF, datalen - 5 * i);
break;
}
}
break;
}
case 0xE790:
{
if (*multi_obis_idx == 1) {
if (IEC2645(src, dst, len, 16, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 8);
datalen = 8;
}
} else if (
(*multi_obis_idx >= 2) &&
(*multi_obis_idx <= 13)) {
if (IEC2645(src, dst, len, 10, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 5);
datalen = 5;
}
} else if (*multi_obis_idx == 14) {
if (IEC2645(src, dst, len, 12, 1, 0x0000) != 0) {
proto_iec_reverse_data(dst, 6);
datalen = 6;
}
} else if (
(*multi_obis_idx == 15) ||
(*multi_obis_idx == 50)) {
#ifdef LEN_ADD1BYTE
if (IEC2645(src, dst, len, 8, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 4);
datalen += 4;
}
if (IEC2645(src, &dst[4], len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(&dst[4], 5);
datalen += 5;
}
if (datalen != 9) {
datalen = 0;
}
#else
if (IEC2645(src, dst, len, 6, 1, 0x0010) != 0) {
proto_iec_reverse_data(dst, 3);
datalen += 3;
}
if (IEC2645(src, &dst[3], len, 10, 2, 0x0000) != 0) {
proto_iec_reverse_data(&dst[3], 5);
datalen += 5;
}
if (datalen != 8) {
datalen = 0;
}
#endif
}
break;
}
#endif
default:
break;
}
return datalen;
}