#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; }