2864 lines
70 KiB
C
2864 lines
70 KiB
C
#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 group,define by customer*/
|
||
#define CHANGE_EVENTBYTE
|
||
/* define add combination ID,E710-E750,define by customer*/
|
||
#define ADD_GRID
|
||
/* define add combination ID,E760-E765,define 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;
|
||
} |