import type { MockCode } from '../readMeter'; import { ElsterMeterFamily, HexingMeterFamily, IskraMeterFamily, AlphaA1MeterFamily, AlphaA3MeterFamily, HX110HexingMeterFamily, HXE310AndHXF300HexingMeterFamily, } from '../../parsing/MeterFamilies'; import { ElsterPayloads, HexingPayloads, IskraPayloads, AlphaPayloads } from '../../parsing/TestObjects'; import HolleyPayloads from '../../parsing/TestObjects/HolleyPayloads'; import { base64ToHex, hexToBase64 } from '../../parsing/binary'; const generateElsterOrIskraPayload = (mockCode: MockCode) => { switch (mockCode) { case 'elsterA150': return ElsterPayloads.realA150EdemsaPayloadInHex; case 'elsterA150V1': return ElsterPayloads.elsterA150V1EdemsaPayload; case 'elsterA150Error': return ElsterPayloads.realA150EdemsaPayloadInHexInvalidType; case 'elsterA102C': return ElsterPayloads.realA102CEdemsaPayloadInHex1; case 'elsterA1052': return ElsterPayloads.elsterA1052PayloadInHex; case 'elsterA1052Plus': return ElsterPayloads.elsterA1052PlusPayloadInHex; case 'elsterA1052Demand': return ElsterPayloads.elsterA1052DemandPayload; case 'iskraMT174V9': return IskraPayloads.iskraMT174V9Payload; case 'iskraMT174V6': return IskraPayloads.iskraMT174V6Payload; case 'iskraME152V1': return IskraPayloads.iskraME152V1Payload; case 'iskraME152V1Payload2': return IskraPayloads.iskraME152V1Payload2; case 'iskraME154': return IskraPayloads.iskraME154Payload; default: { throw new Error('Invalid mock code for Elster/Iskra family'); } } }; const generateHexingPayload = (mockCode: MockCode) => { switch (mockCode) { case 'hexingHXE12': return HexingPayloads.hexingHXE12Payload1; case 'hexingHXE12DL': return HexingPayloads.hexingHXE12DLPayload2; case 'hexingHXE34': return HexingPayloads.hexingHXE34Payload; case 'holleyDDSD285': return HolleyPayloads.holleyDDSD285PayloadInHex; case 'holleyDDSD285RealLog': return HolleyPayloads.realHolleyDDSD285PayloadInHex; case 'holleyDTS541': return HolleyPayloads.holleyDTS541PayloadInHex; case 'HXE310Type560First': return HexingPayloads.HXE310Type560PayloadInAsciiFirst(); case 'HXE310Type560Second': return HexingPayloads.HXE310Type560PayloadInAsciiSecond(); default: throw new Error('Invalid mock code for Hexing family'); } }; const generateAlphaPayload = (mockCode: MockCode) => { switch (mockCode) { case 'alphaA1ABBA1T': return AlphaPayloads.alphaA1ABBA1TPayload; case 'alphaA1ABBA1R': return AlphaPayloads.alphaA1ABBA1RPayload; case 'alphaElsterIIA1R': return AlphaPayloads.alphaElsterIIA1RPayload; case 'alphaABBA1RPlusLQMi': return AlphaPayloads.alphaABBA1RPlusLQMiPayload; case 'alphaA3': return AlphaPayloads.alphaA3Payload; case 'alphaA3RD': return AlphaPayloads.alphaA3RDPayload; case 'alphaA3RDAgriculturalIrrigation': return AlphaPayloads.alphaA3RDAgriculturalIrrigationPayload; case 'alphaA3RS': return AlphaPayloads.alphaA3RSPayload; case 'alphaA3RDLqs': return AlphaPayloads.alphaA3RDLqsPayload; default: throw new Error('Invalid mock code for Alpha family'); } }; const generateChangeDatetimePayload = (mockCode: MockCode, commandInHex) => { switch (mockCode) { case 'alphaA1Ok': return AlphaPayloads.changeDatetimeSuccessPayloadInHex(commandInHex); case 'alphaA1Error': return AlphaPayloads.changeDatetimeFailurePayloadInHex(commandInHex); default: throw new Error('Invalid mock code for Alpha family'); } }; const generateResetToZeroPayload = (mockCode: MockCode, commandInHex) => { switch (mockCode) { case 'resetOk': return HexingPayloads.resetOk(commandInHex); case 'resetError': return HexingPayloads.resetError(commandInHex); default: throw new Error('Invalid mock code for reset to zero'); } }; export const generatePayload = (commandInBase64: string, mockCode: MockCode): string => { let resultCommand = commandInBase64; const commandInHex = base64ToHex(commandInBase64); if (commandInHex.length > 5) { resultCommand = hexToBase64(commandInHex.slice(0, 5)); } switch (resultCommand) { case ElsterMeterFamily.probeCommand(): case IskraMeterFamily.probeCommand(): return generateElsterOrIskraPayload(mockCode); case HexingMeterFamily.probeCommand(): case HX110HexingMeterFamily.probeCommand(): case HXE310AndHXF300HexingMeterFamily.probeCommand(): return generateHexingPayload(mockCode); case AlphaA1MeterFamily.probeCommand(): case AlphaA3MeterFamily.probeCommand(): return generateAlphaPayload(mockCode); case AlphaA1MeterFamily.setTimeProbeCommand?.(): case AlphaA1MeterFamily.setDateAndTimeCommand?.(): return generateChangeDatetimePayload(mockCode, commandInHex.slice(0, 5)); case HXE310AndHXF300HexingMeterFamily.resetToZeroCommand?.(): return generateResetToZeroPayload(mockCode, commandInHex); default: throw new Error("Probe command doesn't have available payloads"); } };