import { AxdrEnum } from "../asn1.axdr/AxdrEnum"; import { AxdrNull } from "../asn1.axdr/AxdrNull"; import { Apdu } from "../axdr/Apdu"; import { CSD } from "../axdr/CSD"; import { Data } from "../axdr/Data"; import { Date_time_s } from "../axdr/Date_time_s"; import { FjCAPdu } from "../axdr/FjCAPdu"; import { MS, SubSeqOfRegion, SubSeqOfTsa, SubSeqOfUnsigned16, SubSeqOfUnsigned8 } from "../axdr/MS"; import { OAD } from "../axdr/OAD"; import { OBI } from "../axdr/OBI"; import { OMD } from "../axdr/OMD"; import { RCSD } from "../axdr/RCSD"; import { Region } from "../axdr/Region"; import { ROAD, SubSeqOfOads } from "../axdr/ROAD"; import { RSD } from "../axdr/RSD"; import { Selector1 } from "../axdr/Selector1"; import { Selector10 } from "../axdr/Selector10"; import { Selector2 } from "../axdr/Selector2"; import { Selector3 } from "../axdr/Selector3"; import { Selector4 } from "../axdr/Selector4"; import { Selector5 } from "../axdr/Selector5"; import { Selector6 } from "../axdr/Selector6"; import { Selector7 } from "../axdr/Selector7"; import { Selector8 } from "../axdr/Selector8"; import { Selector9 } from "../axdr/Selector9"; import { TI } from "../axdr/TI"; import { TimeTag } from "../axdr/TimeTag"; import { TSA } from "../axdr/TSA"; import { Unsigned16 } from "../axdr/Unsigned16"; import { Unsigned8 } from "../axdr/Unsigned8"; import { DataUtils } from "../DataUtils"; import { DataOpt, MSOption, RCSDOption, RSDOption } from "../opt/DataOption"; import { LinkOption } from "../opt/LinkOption"; import { RequestOption } from "../opt/RequestOption"; import { HdlcAddress } from "../sessionlayer.hdlc/HdlcAddress"; import { HdlcAddressPair } from "../sessionlayer.hdlc/HdlcAddressPair"; import { HdlcFrame } from "../sessionlayer.hdlc/HdlcFrame"; import { DataIndex } from "../tools/DataIndex"; export function buildLinkFrame(apdu: Apdu, link_opt: LinkOption, req_opt: RequestOption): String { let linkFrame: String = ""; if (req_opt.time_tag) { if (req_opt.time == null || req_opt.unit == null || req_opt.interval == null) { linkFrame = "param time,unit,interval is not allow empty"; return linkFrame; } else { if (req_opt.time.length != 14 || req_opt.unit.length != 2 || req_opt.interval.length != 4) { linkFrame = "param length is Illegal"; return linkFrame; } } let timeTag = new TimeTag(); let date_time_s = new Date_time_s(); let year = new Unsigned16(); year.set_dataCode(DataUtils.toBytes(req_opt.time.substring(0, 4))); let month = new Unsigned8(); month.set_dataCode(DataUtils.toBytes(req_opt.time.substring(4, 6))); let day = new Unsigned8(); day.set_dataCode(DataUtils.toBytes(req_opt.time.substring(6, 8))); let hour = new Unsigned8(); hour.set_dataCode(DataUtils.toBytes(req_opt.time.substring(8, 10))); let minute = new Unsigned8(); minute.set_dataCode(DataUtils.toBytes(req_opt.time.substring(10, 12))); let second = new Unsigned8(); second.set_dataCode(DataUtils.toBytes(req_opt.time.substring(12, 14))); date_time_s.set_date_time_s(year, month, day, hour, minute, second); let ti = new TI(); let unit = new AxdrEnum(); // unit.set_min_max_val(Number(req_opt.unit.toString())); unit.set_dataCode(DataUtils.toBytes(req_opt.unit.toString())); let inter = new Unsigned16(); // inter.set_min_max_val(Number(req_opt.interval.toString())) inter.set_dataCode(DataUtils.toBytes(req_opt.interval.toString())); ti.set_unit_inter(unit, inter); timeTag.set_dts_ti(date_time_s, ti); let fjCAPdu = new FjCAPdu(); fjCAPdu.set_timeTag(timeTag); apdu.setFjcliapdu(fjCAPdu); } let buf = Buffer.alloc(3000); let length = apdu.encode(buf); let apduData = DataUtils.toHexString(buf, 1, buf.length - length); let hdlcAddress; if (req_opt.isBroadCast) { hdlcAddress = new HdlcAddress(0, "AAAAAAAAAAAA"); hdlcAddress.setAddressType(1); } else { hdlcAddress = new HdlcAddress(0, link_opt.server_address.toString()); } let hdlcAddressPair = new HdlcAddressPair(hdlcAddress, DataUtils.toBytes(link_opt.client_address.toString())); let segment = -1 if (link_opt.is_segmentation) { if (link_opt.current_seq == 0) { segment = (0x0000 | link_opt.current_seq); } else if (link_opt.current_seq == link_opt.frame_block - 1) { segment = (0x4000 | link_opt.current_seq); } else { segment = (0xC000 | link_opt.current_seq); } } let hdlcFrame = HdlcFrame.newCliReqFrame(hdlcAddressPair, DataUtils.hexToBytes(apduData), false); if (link_opt.is_segmentation) { hdlcFrame.setSegFrameXh(segment); } let frameBytes = hdlcFrame.encode(); linkFrame = DataUtils.toHexString(frameBytes, 1, 0); return linkFrame; } export function buildRsd(rsd_opt: RSDOption): RSD { switch (rsd_opt.index) { case 1: let rsd1 = new RSD(); let selector1 = new Selector1(); let oads1 = buildOAD(rsd_opt.selector1.oad); let data = new Data() let value = buildData(rsd_opt.selector1.data); data.set_dataCode(DataUtils.toBytes(value.toString())); selector1.set_all(oads1, data); rsd1.setS1(selector1); return rsd1; case 2: let rsd2 = new RSD(); let selector2 = new Selector2(); let oads2 = buildOAD(rsd_opt.selector2.oad); let sData = new Data(); sData.set_dataCode(DataUtils.toBytes(buildData(rsd_opt.selector2.sData).toString())); let eData = new Data(); eData.set_dataCode(DataUtils.toBytes(buildData(rsd_opt.selector2.eData).toString())); let tData = new Data(); tData.set_dataCode(DataUtils.toBytes(buildData(rsd_opt.selector2.tData).toString())); selector2.set_all(oads2, sData, eData, tData); rsd2.setS2(selector2); return rsd2; case 3: let rsd3 = new RSD(); let selector3 = new Selector3(); for (let data of rsd_opt.selector3.seqOfSelector2) { let selector2 = new Selector2(); let oads2 = buildOAD(data.oad); let sData = new Data(); sData.set_dataCode(DataUtils.toBytes(buildData(data.sData).toString())); let eData = new Data(); eData.set_dataCode(DataUtils.toBytes(buildData(data.eData).toString())); let tData = new Data(); tData.set_dataCode(DataUtils.toBytes(buildData(data.tData).toString())); selector2.set_all(oads2, sData, eData, tData); selector3.add(selector2); } rsd3.setS3(selector3); return rsd3; case 4: let rsd4 = new RSD(); let selector4 = new Selector4(); let dts_4 = new Date_time_s(); dts_4.set_dataCode(DataUtils.toBytes(rsd_opt.selector4.time.toString())); let ms_4 = buildMS(rsd_opt.selector4.ms); selector4.set_all(dts_4, ms_4); rsd4.setS4(selector4); return rsd4; case 5: let rsd5 = new RSD(); let selector5 = new Selector5(); let dts_5 = new Date_time_s(); dts_5.set_dataCode(DataUtils.toBytes(rsd_opt.selector5.time.toString())); let ms_5 = buildMS(rsd_opt.selector5.ms); selector5.set_all(dts_5, ms_5); rsd5.setS5(selector5); return rsd5; case 6: let rsd6 = new RSD(); let selector6 = new Selector6(); let sdts6 = new Date_time_s(); let edts6 = new Date_time_s(); let ti6 = new TI(); let unit6 = new AxdrEnum(); unit6.set_dataCode(DataUtils.toBytes(rsd_opt.selector6.ti.unit.toString())); let inter6 = new Unsigned16(); inter6.set_dataCode(DataUtils.toBytes(rsd_opt.selector6.ti.interval.toString())); ti6.set_unit_inter(unit6, inter6); sdts6.set_dataCode(DataUtils.toBytes(rsd_opt.selector6.sTime.toString())); edts6.set_dataCode(DataUtils.toBytes(rsd_opt.selector6.eTime.toString())); let ms6 = buildMS(rsd_opt.selector6.ms); selector6.set_all(sdts6, edts6, ti6, ms6); rsd6.setS6(selector6); return rsd6; case 7: let rsd7 = new RSD(); let selector7 = new Selector7(); let sdts7 = new Date_time_s(); let edts7 = new Date_time_s(); let ti7 = new TI(); let unit7 = new AxdrEnum(); unit7.set_dataCode(DataUtils.toBytes(rsd_opt.selector7.ti.unit.toString())); let inter7 = new Unsigned16(); inter7.set_dataCode(DataUtils.toBytes(rsd_opt.selector7.ti.interval.toString())); ti7.set_unit_inter(unit7, inter7); sdts7.set_dataCode(DataUtils.toBytes(rsd_opt.selector7.sTime.toString())); edts7.set_dataCode(DataUtils.toBytes(rsd_opt.selector7.eTime.toString())); let ms7 = buildMS(rsd_opt.selector7.ms); selector7.set_all(sdts7, edts7, ti7, ms7); rsd7.setS7(selector7); return rsd7; case 8: let rsd8 = new RSD(); let selector8 = new Selector8(); let sdts8 = new Date_time_s(); let edts8 = new Date_time_s(); let ti8 = new TI(); let unit8 = new AxdrEnum(); unit8.set_dataCode(DataUtils.toBytes(rsd_opt.selector8.ti.unit.toString())); let inter8 = new Unsigned16(); inter8.set_dataCode(DataUtils.toBytes(rsd_opt.selector8.ti.interval.toString())); ti8.set_unit_inter(unit8, inter8); sdts8.set_dataCode(DataUtils.toBytes(rsd_opt.selector8.sTime.toString())); edts8.set_dataCode(DataUtils.toBytes(rsd_opt.selector8.eTime.toString())); let ms8 = buildMS(rsd_opt.selector8.ms); selector8.set_all(sdts8, edts8, ti8, ms8); rsd8.setS8(selector8); return rsd8; case 9: let rsd9 = new RSD(); let selector9 = new Selector9(); let times = new Unsigned8(); times.set_min_max_val(rsd_opt.selector9.index); selector9.set_all(times); rsd9.setS9(selector9); return rsd9; case 10: let rsd10 = new RSD(); let selector10 = new Selector10(); let several = new Unsigned8(); several.set_min_max_val(rsd_opt.selector10.index); let ms10 = buildMS(rsd_opt.selector10.ms); selector10.set_all(several, ms10); rsd10.setS10(selector10); return rsd10; default: throw new Error("rsd no such index"); } } export function buildRcsd(rcsd_opt: RCSDOption): RCSD { let rcsd = new RCSD(); for (let data of rcsd_opt.seqOfCsd) { switch (data.index) { case 0: let oad = buildOAD(data.oad); let csd0 = new CSD(); csd0.set_oad(oad); rcsd.add(csd0); break; case 1: let csd1 = new CSD(); let road = new ROAD(); let road_oad = buildOAD(data.road.oad); let seqofoad = new SubSeqOfOads(); for (let value of data.road.seqOfOad) { seqofoad.add(buildOAD(value)); } road.set_all(road_oad, seqofoad); csd1.set_road(road); rcsd.add(csd1); break; default: throw new Error("rcsd no such index"); } } return rcsd; } export function buildMS(ms_opt: MSOption): MS { switch (ms_opt.index) { case 0: let ms0 = new MS(); ms0.setNom(new AxdrNull()); return ms0; case 1: let ms1 = new MS(); ms1.setAllmaddr(new AxdrNull()); return ms1; case 2: let ms2 = new MS(); let subSeqOfGroupType = new SubSeqOfUnsigned8(); for (let data of ms_opt.typeGroup) { let typeGroup = new Unsigned8(); typeGroup.set_min_max_val(data); subSeqOfGroupType.add(typeGroup); } ms2.setGroupmtype(subSeqOfGroupType); return ms2; case 3: let ms3 = new MS(); let subSeqOfGroupAddr = new SubSeqOfTsa(); for (let data of ms_opt.addGroup) { let tsa = new TSA(); tsa.set_oct_string(DataUtils.toBytes(data.toString())); subSeqOfGroupAddr.add(tsa); } ms3.setGroupmaddr(subSeqOfGroupAddr); return ms3; case 4: let ms4 = new MS(); let subSeqOfGroupSetIndex = new SubSeqOfUnsigned16(); for (let data of ms_opt.serGroup) { let serGroup = new Unsigned16(); serGroup.set_min_max_val(data); subSeqOfGroupSetIndex.add(serGroup); } ms4.setGroupsetindex(subSeqOfGroupSetIndex); return ms4; case 5: let ms5 = new MS(); let subSeqOfRegionType = new SubSeqOfRegion(); for (let data of ms_opt.typeGroupSect) { let region = new Region(); let unit = new AxdrEnum(); unit.set_min_max_val(data.index); let sval = new Data(); let eeval = new Data(); sval.set_dataCode(DataUtils.toBytes(buildData(data.sData).toString())); eeval.set_dataCode(DataUtils.toBytes(buildData(data.eData).toString())); region.set_all(unit, sval, eeval); subSeqOfRegionType.add(region); } ms5.setRegiontype(subSeqOfRegionType); return ms5; case 6: let ms6 = new MS(); let subSeqOfRegionAddr = new SubSeqOfRegion(); for (let data of ms_opt.addGroupSect) { let region = new Region(); let unit = new AxdrEnum(); unit.set_min_max_val(data.index); let sval = new Data(); let eeval = new Data(); sval.set_dataCode(DataUtils.toBytes(buildData(data.sData).toString())); eeval.set_dataCode(DataUtils.toBytes(buildData(data.eData).toString())); region.set_all(unit, sval, eeval); subSeqOfRegionAddr.add(region); } ms6.setRegionaddr(subSeqOfRegionAddr); return ms6; case 7: let ms7 = new MS(); let subSeqOfRegionSetIndex = new SubSeqOfRegion(); for (let data of ms_opt.serGroupSect) { let region = new Region(); let unit = new AxdrEnum(); unit.set_min_max_val(data.index); let sval = new Data(); let eeval = new Data(); sval.set_dataCode(DataUtils.toBytes(buildData(data.sData).toString())); eeval.set_dataCode(DataUtils.toBytes(buildData(data.eData).toString())); region.set_all(unit, sval, eeval); subSeqOfRegionSetIndex.add(region); } ms7.setRegionsetindex(subSeqOfRegionSetIndex); return ms7; default: throw new Error("ms no such index"); } } export function buildOAD(data: String): OAD { let oad = new OAD(); let oi = new Unsigned16(); oi.set_dataCode(DataUtils.toBytes(data.substring(0, 4))); let obi = new OBI(); obi.setBitString(DataUtils.toBytes(data.substring(4, 6))); let index = new Unsigned8(); index.set_dataCode(DataUtils.toBytes(data.substring(6, 8))); oad.set_oad(oi, obi, index); return oad; } export function buildOMD(data: String): OMD { let omd = new OMD(); let oi = new Unsigned16(); oi.set_dataCode(DataUtils.toBytes(data.substring(0, 4))); let mi = new Unsigned8(); mi.set_dataCode(DataUtils.toBytes(data.substring(4, 6))); let opm = new Unsigned8(); opm.set_dataCode(DataUtils.toBytes(data.substring(6, 8))); omd.set_omd(oi, mi, opm); return omd; } export function buildData(data: DataOpt): String { let dataValue = ""; switch (data.dataIndex) { case DataIndex.NULL_DATA: dataValue = "00"; return dataValue; case DataIndex.ARRAY: dataValue = "01" + DataUtils.intToHexString(data.array.length, 1); for (let value of data.array) { dataValue += buildData(value); } return dataValue; case DataIndex.STRUCTURE: dataValue = "02" + DataUtils.intToHexString(data.structure.length, 1); for (let value of data.structure) { dataValue += buildData(value); } return dataValue; case DataIndex.BOOL: dataValue = "03" + data.bool; return dataValue; case DataIndex.BIT_STRING: dataValue = "04" + DataUtils.intToHexString(data.bit_string.length * 8 / 2, 1) + data.bit_string; return dataValue; case DataIndex.DOUBLE_LONG: dataValue = "05" + data.double_long; return dataValue; case DataIndex.DOUBLE_LONG_UNSIGNED: dataValue = "06" + data.double_long_unsigned; return dataValue; case DataIndex.OCTET_STRING: dataValue = "09" + DataUtils.intToHexString(data.octet_string.length / 2, 1) + data.octet_string; return dataValue; case DataIndex.VISIBLE_STRING: dataValue = "0a" + DataUtils.intToHexString(data.visible_string.length / 2, 1) + data.visible_string; return dataValue; case DataIndex.UTF8_STRING: dataValue = "0c" + DataUtils.intToHexString(data.utf8_string.length / 2, 1) + data.utf8_string; return dataValue; case DataIndex.INTEGER: dataValue = "0f" + data.integer; return dataValue; case DataIndex.LONGDATA: dataValue = "10" + data.long; return dataValue; case DataIndex.UNSIGNED: dataValue = "11" + data.unsigned; return dataValue; case DataIndex.LONG_UNSIGNED: dataValue = "12" + data.long_unsigned; return dataValue; case DataIndex.LONG64: dataValue = "14" + data.long64; return dataValue; case DataIndex.LONG64_UNSIGNED: dataValue = "15" + data.long64_unsigned; return dataValue; case DataIndex.ENUMDATA: dataValue = "16" + data.enum; return dataValue; case DataIndex.FLOAT32: dataValue = "17" + data.float32; return dataValue; case DataIndex.FLOAT64: dataValue = "18" + data.float64; return dataValue; case DataIndex.DATE_TIME: dataValue = "19" + data.date_time; return dataValue; case DataIndex.DATE: dataValue = "1a" + data.date; return dataValue; case DataIndex.TIME: dataValue = "1b" + data.time; return dataValue; case DataIndex.DATE_TIME_S: dataValue = "1c" + data.date_time_s; return dataValue; case DataIndex.OI: dataValue = "50" + data.oi; return dataValue; case DataIndex.OAD: dataValue = "51" + data.oad; return dataValue; case DataIndex.ROAD: dataValue = "52" + data.road.oad + DataUtils.intToHexString(data.road.seqOfOad.length, 1); for (let value of data.road.seqOfOad) { dataValue += value; } return dataValue; case DataIndex.OMD: dataValue = "53" + data.omd; return dataValue; case DataIndex.TI: dataValue = "54" + data.ti.unit.toString() + data.ti.interval.toString(); return dataValue; case DataIndex.TSA: dataValue = "55" + DataUtils.intToHexString(data.tsa.length / 2, 1) + data.tsa; return dataValue; case DataIndex.MAC: dataValue = "56" + DataUtils.intToHexString(data.mac.length / 2, 1) + data.mac; return dataValue; case DataIndex.RN: dataValue = "57" + DataUtils.intToHexString(data.rn.oct.length / 2, 1) + data.rn.oct; return dataValue; case DataIndex.REGION: dataValue = "58" + DataUtils.intToHexString(data.region.index, 1); dataValue += buildData(data.region.sData); dataValue += buildData(data.region.eData); return dataValue; case DataIndex.SCALER_UNIT: dataValue = "59" + data.scaler_unit.scaler + data.scaler_unit.unit; return dataValue; case DataIndex.RSD: dataValue = "5a" + DataUtils.intToHexString(data.rsd.index, 1); dataValue += buildRsdData(data.rsd.index, data.rsd); return dataValue; case DataIndex.CSD: dataValue = "5b" + DataUtils.intToHexString(data.csd.index, 1); switch (data.csd.index) { case 0: dataValue += data.csd.oad; return dataValue; case 1: dataValue += data.csd.road.oad; for (let value of data.csd.road.seqOfOad) { dataValue += value; } return dataValue; default: throw new Error("no such index"); } case DataIndex.MS: dataValue = "5c" + buildMSData(data.ms.index, data.ms); return dataValue; case DataIndex.SID: dataValue = "5d" + data.sid.sid + DataUtils.intToHexString(data.sid.attachData.length / 2, 1) + data.sid.attachData; return dataValue; case DataIndex.SID_MAC: dataValue = "5e" + data.sid_mac.sid + DataUtils.intToHexString(data.sid_mac.attachData.length / 2, 1) + data.sid_mac.attachData + DataUtils.intToHexString(data.sid_mac.mac.length / 2, 1) + data.sid_mac.mac; return dataValue; case DataIndex.COMDCB: dataValue = "5f" + data.comdcb.bondRate + data.comdcb.checkBits + data.comdcb.dataBits + data.comdcb.stopBits + data.comdcb.flowControl; return dataValue; case DataIndex.RCSD: dataValue = "60" + DataUtils.intToHexString(data.rcsd.seqOfCsd.length, 1); for (let value of data.rcsd.seqOfCsd) { switch (value.index) { case 0: dataValue += value.oad; break; case 1: dataValue += value.road.oad; for (let tempValue of value.road.seqOfOad) { dataValue += tempValue; } break; default: throw new Error("no such index"); } } return dataValue; default: throw new Error("data no such index"); } } export function buildRsdData(index: number, rsd_opt: RSDOption): String { let rsdData = ""; switch (index) { case 0: rsdData = "00"; return rsdData; case 1: rsdData = "01" + rsd_opt.selector1.oad; rsdData += buildData(rsd_opt.selector1.data); return rsdData; case 2: rsdData = "02" + rsd_opt.selector2.oad; rsdData += buildData(rsd_opt.selector2.sData); rsdData += buildData(rsd_opt.selector2.eData); rsdData += buildData(rsd_opt.selector2.tData); return rsdData; case 3: rsdData = "03" + DataUtils.intToHexString(rsd_opt.selector3.seqOfSelector2.length / 2, 1); for (let data of rsd_opt.selector3.seqOfSelector2) { rsdData += data.oad; rsdData += buildData(data.sData); rsdData += buildData(data.eData); rsdData += buildData(data.tData); } return rsdData; case 4: rsdData = "04" + "1C" + rsd_opt.selector4.time; rsdData += buildMSData(rsd_opt.selector4.ms.index, rsd_opt); return rsdData; case 5: rsdData = "05" + "1C" + rsd_opt.selector5.time; rsdData += buildMSData(rsd_opt.selector5.ms.index, rsd_opt.selector5.ms); return rsdData; case 6: rsdData = "06" + rsd_opt.selector6.sTime + rsd_opt.selector6.eTime + rsd_opt.selector6.ti.unit + rsd_opt.selector6.ti.interval; rsdData += buildMSData(rsd_opt.selector6.ms.index, rsd_opt.selector6.ms) return rsdData; case 7: rsdData = "07" + rsd_opt.selector7.sTime + rsd_opt.selector7.eTime + rsd_opt.selector7.ti.unit + rsd_opt.selector7.ti.interval; rsdData += buildMSData(rsd_opt.selector7.ms.index, rsd_opt.selector7.ms) return rsdData; case 8: rsdData = "08" + rsd_opt.selector8.sTime + rsd_opt.selector8.eTime + rsd_opt.selector8.ti.unit + rsd_opt.selector8.ti.interval; rsdData += buildMSData(rsd_opt.selector8.ms.index, rsd_opt.selector8.ms); return rsdData; case 9: rsdData = "09" + DataUtils.intToHexString(rsd_opt.selector9.index, 1); return rsdData; case 10: rsdData = "0a" + DataUtils.intToHexString(rsd_opt.selector10.index, 1); rsdData += buildMSData(rsd_opt.selector10.ms.index, rsd_opt.selector10.ms); return rsdData; default: throw new Error("no such index"); } } export function buildMSData(index: number, ms_opt: MSOption): String { let msData = ""; switch (index) { case 0: msData = "00"; return msData; case 1: msData = "01"; return msData; case 2: msData = "02" + DataUtils.intToHexString(ms_opt.typeGroup.length, 1); for (let value of ms_opt.typeGroup) { msData += DataUtils.intToHexString(value, 1); } return msData; case 3: msData = "03" + DataUtils.intToHexString(ms_opt.addGroup.length, 1); for (let value of ms_opt.addGroup) { msData += DataUtils.intToHexString(value.length / 2, 1) + value; } return msData; case 4: msData = "04" + DataUtils.intToHexString(ms_opt.serGroup.length, 1); for (let value of ms_opt.serGroup) { msData += DataUtils.intToHexString(value, 2); } return msData; case 5: msData = "05" + DataUtils.intToHexString(ms_opt.typeGroupSect.length, 1); for (let value of ms_opt.serGroupSect) { msData += DataUtils.intToHexString(value.index, 1); msData += buildData(value.sData); msData += buildData(value.eData); } return msData; case 6: msData = "06" + DataUtils.intToHexString(ms_opt.addGroupSect.length, 1); for (let value of ms_opt.addGroupSect) { msData += DataUtils.intToHexString(value.index, 1); msData += buildData(value.sData); msData += buildData(value.eData); } return msData; case 7: msData = "07" + DataUtils.intToHexString(ms_opt.serGroupSect.length, 1); for (let value of ms_opt.serGroupSect) { msData += DataUtils.intToHexString(value.index, 1); msData += buildData(value.sData); msData += buildData(value.eData); } return msData; default: throw new Error("no such index"); } }