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