feat: Add enhanced EXI viewer with XML decode capability

- Implement complete CurrentDemandReq/CurrentDemandRes parsing (24 total fields)
- Add enhanced_exi_viewer.c with detailed message analysis
- Support -decode option for clean XML output (file-ready format)
- Enable ISO1, ISO2, DIN codec support in build configuration
- Fix C99 compatibility issues in makefiles (change -ansi to -std=c99)
- Create test utilities for hex string to EXI conversion
- Generate test files: test3.exi (CurrentDemandRes), test4.exi (CurrentDemandReq)

Features:
* Dual output modes: detailed analysis (default) vs XML (-decode)
* Complete V2G message type detection and parsing
* Session ID display in hex and ASCII formats
* Voltage/current/power readings with proper units
* All optional fields and status flags supported

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-09 23:46:47 +09:00
commit 7edb3cde54
172 changed files with 249903 additions and 0 deletions

579
.cproject Normal file
View File

@@ -0,0 +1,579 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907" moduleId="org.eclipse.cdt.core.settings" name="Debug">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="OpenV2G" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug">
<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907." name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.base.186426714" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.base">
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.base.208578740" name="Debug Platform" osList="win32" superClass="cdt.managedbuild.target.gnu.platform.mingw.base"/>
<builder buildPath="${workspace_loc:/OpenV2G}/Debug" id="cdt.managedbuild.builder.gnu.cross.474380604" keepEnvironmentInBuildfile="false" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross"/>
<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.base.467817276" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.base">
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1213164158" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.260408959" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base.1208420490" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base">
<option id="gnu.cpp.compiler.option.optimization.level.650473997" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.debugging.level.2034188123" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.base.1511109002" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.base">
<option id="gnu.c.compiler.option.include.paths.229245493" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;../src/codec&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/din&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/iso1&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/iso2&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/xmldsig&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/appHandshake&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/transport&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/test&quot;"/>
</option>
<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.1880660058" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
<option id="gnu.c.compiler.option.debugging.level.890071608" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
<option id="gnu.c.compiler.option.warnings.pedantic.1983095151" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" value="false" valueType="boolean"/>
<option id="gnu.c.compiler.option.misc.ansi.1916749690" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" value="true" valueType="boolean"/>
<option id="gnu.c.compiler.option.warnings.toerrors.990186240" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors" value="false" valueType="boolean"/>
<option id="gnu.c.compiler.option.warnings.pedantic.error.145905553" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" value="false" valueType="boolean"/>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1904654876" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.1907160138" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base">
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1866282924" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.521623519" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base"/>
</toolChain>
</folderInfo>
<sourceEntries>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
</sourceEntries>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
</cconfiguration>
<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450" moduleId="org.eclipse.cdt.core.settings" name="Release">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="OpenV2G" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450" name="Release" parent="cdt.managedbuild.config.gnu.mingw.exe.release">
<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.release.681614450." name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.base.544862828" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.base">
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.base.452289502" name="Debug Platform" osList="win32" superClass="cdt.managedbuild.target.gnu.platform.mingw.base"/>
<builder buildPath="${workspace_loc:/OpenV2G/Release}" id="cdt.managedbuild.builder.gnu.cross.288561722" keepEnvironmentInBuildfile="false" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross"/>
<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.base.586100401" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.base">
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1634756901" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.934860510" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base.596457747" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base">
<option id="gnu.cpp.compiler.option.optimization.level.2131218410" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.debugging.level.1665313885" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.base.2107890734" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.base">
<option id="gnu.c.compiler.option.include.paths.289860304" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;../src/codec&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/din&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/iso1&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/iso2&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/xmldsig&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/appHandshake&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/transport&quot;"/>
<listOptionValue builtIn="false" value="&quot;../src/test&quot;"/>
</option>
<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.899621054" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" value="gnu.c.optimization.level.size" valueType="enumerated"/>
<option id="gnu.c.compiler.option.debugging.level.1251127335" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
<option id="gnu.c.compiler.option.misc.ansi.496561434" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" value="false" valueType="boolean"/>
<option id="gnu.c.compiler.option.warnings.pedantic.289278524" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" value="false" valueType="boolean"/>
<option id="gnu.c.compiler.option.warnings.pedantic.error.822372173" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" value="false" valueType="boolean"/>
<option id="gnu.c.compiler.option.optimization.flags.1051939537" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" value="" valueType="string"/>
<option id="gnu.c.compiler.option.misc.other.1470884128" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0" valueType="string"/>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.898314529" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.2082341498" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base">
<option id="gnu.c.link.option.other.71044722" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other"/>
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.153003457" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.557104889" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base"/>
</toolChain>
</folderInfo>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="OpenV2G.cdt.managedbuild.target.gnu.mingw.exe.1420366407" name="Executable" projectType="cdt.managedbuild.target.gnu.mingw.exe"/>
</storageModule>
<storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="Debug">
<resource resourceType="PROJECT" workspacePath="/OpenV2G"/>
</configuration>
<configuration configurationName="Release">
<resource resourceType="PROJECT" workspacePath="/OpenV2G"/>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
<buildTargets>
<target name="OpenV2G.exe" path="Debug" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>OpenV2G.exe</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
</buildTargets>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907;cdt.managedbuild.config.gnu.mingw.exe.debug.181718907.;cdt.managedbuild.tool.gnu.c.compiler.mingw.base.1511109002;cdt.managedbuild.tool.gnu.c.compiler.input.1904654876">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.181718907;cdt.managedbuild.config.gnu.mingw.exe.debug.181718907.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.113647340;cdt.managedbuild.tool.gnu.c.compiler.input.67299528">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.681614450;cdt.managedbuild.config.gnu.mingw.exe.release.681614450.;cdt.managedbuild.tool.gnu.c.compiler.mingw.base.2107890734;cdt.managedbuild.tool.gnu.c.compiler.input.898314529">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.681614450;cdt.managedbuild.config.gnu.mingw.exe.release.681614450.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.150928873;cdt.managedbuild.tool.gnu.c.compiler.input.2117635578">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.681614450;cdt.managedbuild.config.gnu.mingw.exe.release.681614450.;cdt.managedbuild.tool.gnu.c.compiler.base.1358204014;cdt.managedbuild.tool.gnu.c.compiler.input.822105819">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.1536681007;cdt.managedbuild.config.gnu.mingw.exe.debug.1536681007.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1257453970;cdt.managedbuild.tool.gnu.c.compiler.input.1901507773">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.1091708379;cdt.managedbuild.config.gnu.mingw.exe.release.1091708379.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.1844784508;cdt.managedbuild.tool.gnu.c.compiler.input.1276057383">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
</storageModule>
</cproject>

81
.project Normal file
View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>OpenV2G</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
<dictionary>
<key>?name?</key>
<value></value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.append_environment</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
<value>all</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildArguments</key>
<value></value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildCommand</key>
<value>make</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildLocation</key>
<value>./OpenV2G/Debug</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
<value>clean</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.contents</key>
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
<value>false</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
<value>all</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.stopOnError</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
<value>true</value>
</dictionary>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
</projectDescription>

BIN
Debug/OpenV2G.exe Normal file

Binary file not shown.

BIN
Debug/decoded_output.exi Normal file

Binary file not shown.

51
Debug/makefile Normal file
View File

@@ -0,0 +1,51 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
-include ../makefile.init
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include src/xmldsig/subdir.mk
-include src/transport/subdir.mk
-include src/test/subdir.mk
-include src/iso2/subdir.mk
-include src/iso1/subdir.mk
-include src/din/subdir.mk
-include src/codec/subdir.mk
-include src/appHandshake/subdir.mk
-include subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif
-include ../makefile.defs
# Add inputs and outputs from these tool invocations to the build variables
# All Target
all: OpenV2G.exe
# Tool invocations
OpenV2G.exe: $(OBJS) $(USER_OBJS)
@echo 'Building target: $@'
@echo 'Invoking: MinGW C Linker'
gcc -o "OpenV2G.exe" $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '
# Other Targets
clean:
-$(RM) $(EXECUTABLES)$(OBJS)$(C_DEPS) OpenV2G.exe
-@echo ' '
.PHONY: all clean dependents
.SECONDARY:
-include ../makefile.targets

8
Debug/objects.mk Normal file
View File

@@ -0,0 +1,8 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
USER_OBJS :=
LIBS :=

24
Debug/sources.mk Normal file
View File

@@ -0,0 +1,24 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
OBJ_SRCS :=
ASM_SRCS :=
C_SRCS :=
S_UPPER_SRCS :=
O_SRCS :=
EXECUTABLES :=
OBJS :=
C_DEPS :=
# Every subdirectory with source files must be described here
SUBDIRS := \
src/xmldsig \
src/transport \
src/test \
src/iso2 \
src/iso1 \
src/din \
src/codec \
src/appHandshake \

View File

@@ -0,0 +1,10 @@
src/appHandshake/appHandEXIDatatypes.d: \
../src/appHandshake/appHandEXIDatatypes.c \
../src/appHandshake/appHandEXIDatatypes.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h
../src/appHandshake/appHandEXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:

Binary file not shown.

View File

@@ -0,0 +1,25 @@
src/appHandshake/appHandEXIDatatypesDecoder.d: \
../src/appHandshake/appHandEXIDatatypesDecoder.c \
../src/appHandshake/appHandEXIDatatypesDecoder.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/appHandshake/appHandEXIDatatypes.h \
../src/codec/DecoderChannel.h ../src/codec/EXIOptions.h \
../src/codec/EXITypes.h ../src/codec/EXIHeaderDecoder.h \
../src/codec/ErrorCodes.h
../src/appHandshake/appHandEXIDatatypesDecoder.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/appHandshake/appHandEXIDatatypes.h:
../src/codec/DecoderChannel.h:
../src/codec/EXIOptions.h:
../src/codec/EXITypes.h:
../src/codec/EXIHeaderDecoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,22 @@
src/appHandshake/appHandEXIDatatypesEncoder.d: \
../src/appHandshake/appHandEXIDatatypesEncoder.c \
../src/appHandshake/appHandEXIDatatypesEncoder.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/appHandshake/appHandEXIDatatypes.h \
../src/codec/EncoderChannel.h ../src/codec/EXITypes.h \
../src/codec/EXIHeaderEncoder.h ../src/codec/ErrorCodes.h
../src/appHandshake/appHandEXIDatatypesEncoder.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/appHandshake/appHandEXIDatatypes.h:
../src/codec/EncoderChannel.h:
../src/codec/EXITypes.h:
../src/codec/EXIHeaderEncoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/appHandshake/appHandEXIDatatypes.c \
../src/appHandshake/appHandEXIDatatypesDecoder.c \
../src/appHandshake/appHandEXIDatatypesEncoder.c
OBJS += \
./src/appHandshake/appHandEXIDatatypes.o \
./src/appHandshake/appHandEXIDatatypesDecoder.o \
./src/appHandshake/appHandEXIDatatypesEncoder.o
C_DEPS += \
./src/appHandshake/appHandEXIDatatypes.d \
./src/appHandshake/appHandEXIDatatypesDecoder.d \
./src/appHandshake/appHandEXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/appHandshake/%.o: ../src/appHandshake/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,11 @@
src/codec/BitInputStream.d: ../src/codec/BitInputStream.c \
../src/codec/BitInputStream.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/codec/ErrorCodes.h
../src/codec/BitInputStream.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,11 @@
src/codec/BitOutputStream.d: ../src/codec/BitOutputStream.c \
../src/codec/BitOutputStream.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/codec/ErrorCodes.h
../src/codec/BitOutputStream.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
src/codec/ByteStream.d: ../src/codec/ByteStream.c ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/codec/ErrorCodes.h
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,19 @@
src/codec/DecoderChannel.d: ../src/codec/DecoderChannel.c \
../src/codec/DecoderChannel.h ../src/codec/EXIOptions.h \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/codec/BitInputStream.h ../src/codec/MethodsBag.h \
../src/codec/ErrorCodes.h
../src/codec/DecoderChannel.h:
../src/codec/EXIOptions.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/BitInputStream.h:
../src/codec/MethodsBag.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,19 @@
src/codec/EXIHeaderDecoder.d: ../src/codec/EXIHeaderDecoder.c \
../src/codec/EXIHeaderDecoder.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/codec/BitInputStream.h \
../src/codec/DecoderChannel.h ../src/codec/EXIOptions.h \
../src/codec/ErrorCodes.h
../src/codec/EXIHeaderDecoder.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/BitInputStream.h:
../src/codec/DecoderChannel.h:
../src/codec/EXIOptions.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,14 @@
src/codec/EXIHeaderEncoder.d: ../src/codec/EXIHeaderEncoder.c \
../src/codec/EXIHeaderEncoder.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/codec/BitOutputStream.h \
../src/codec/EncoderChannel.h
../src/codec/EXIHeaderEncoder.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/BitOutputStream.h:
../src/codec/EncoderChannel.h:

Binary file not shown.

View File

@@ -0,0 +1,19 @@
src/codec/EncoderChannel.d: ../src/codec/EncoderChannel.c \
../src/codec/EncoderChannel.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/codec/EXIOptions.h \
../src/codec/BitOutputStream.h ../src/codec/ErrorCodes.h \
../src/codec/MethodsBag.h
../src/codec/EncoderChannel.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/EXIOptions.h:
../src/codec/BitOutputStream.h:
../src/codec/ErrorCodes.h:
../src/codec/MethodsBag.h:

Binary file not shown.

View File

@@ -0,0 +1,6 @@
src/codec/MethodsBag.d: ../src/codec/MethodsBag.c \
../src/codec/MethodsBag.h ../src/codec/ErrorCodes.h
../src/codec/MethodsBag.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

45
Debug/src/codec/subdir.mk Normal file
View File

@@ -0,0 +1,45 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/codec/BitInputStream.c \
../src/codec/BitOutputStream.c \
../src/codec/ByteStream.c \
../src/codec/DecoderChannel.c \
../src/codec/EXIHeaderDecoder.c \
../src/codec/EXIHeaderEncoder.c \
../src/codec/EncoderChannel.c \
../src/codec/MethodsBag.c
OBJS += \
./src/codec/BitInputStream.o \
./src/codec/BitOutputStream.o \
./src/codec/ByteStream.o \
./src/codec/DecoderChannel.o \
./src/codec/EXIHeaderDecoder.o \
./src/codec/EXIHeaderEncoder.o \
./src/codec/EncoderChannel.o \
./src/codec/MethodsBag.o
C_DEPS += \
./src/codec/BitInputStream.d \
./src/codec/BitOutputStream.d \
./src/codec/ByteStream.d \
./src/codec/DecoderChannel.d \
./src/codec/EXIHeaderDecoder.d \
./src/codec/EXIHeaderEncoder.d \
./src/codec/EncoderChannel.d \
./src/codec/MethodsBag.d
# Each subdirectory must supply rules for building sources it contributes
src/codec/%.o: ../src/codec/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,9 @@
src/din/dinEXIDatatypes.d: ../src/din/dinEXIDatatypes.c \
../src/din/dinEXIDatatypes.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h
../src/din/dinEXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:

Binary file not shown.

View File

@@ -0,0 +1,24 @@
src/din/dinEXIDatatypesDecoder.d: ../src/din/dinEXIDatatypesDecoder.c \
../src/din/dinEXIDatatypesDecoder.h ../src/din/dinEXIDatatypes.h \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/codec/DecoderChannel.h ../src/codec/EXIOptions.h \
../src/codec/EXITypes.h ../src/codec/EXIHeaderDecoder.h \
../src/codec/ErrorCodes.h
../src/din/dinEXIDatatypesDecoder.h:
../src/din/dinEXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/DecoderChannel.h:
../src/codec/EXIOptions.h:
../src/codec/EXITypes.h:
../src/codec/EXIHeaderDecoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
src/din/dinEXIDatatypesEncoder.d: ../src/din/dinEXIDatatypesEncoder.c \
../src/din/dinEXIDatatypesEncoder.h ../src/din/dinEXIDatatypes.h \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/codec/EncoderChannel.h ../src/codec/EXITypes.h \
../src/codec/EXIHeaderEncoder.h ../src/codec/ErrorCodes.h
../src/din/dinEXIDatatypesEncoder.h:
../src/din/dinEXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/EncoderChannel.h:
../src/codec/EXITypes.h:
../src/codec/EXIHeaderEncoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

30
Debug/src/din/subdir.mk Normal file
View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/din/dinEXIDatatypes.c \
../src/din/dinEXIDatatypesDecoder.c \
../src/din/dinEXIDatatypesEncoder.c
OBJS += \
./src/din/dinEXIDatatypes.o \
./src/din/dinEXIDatatypesDecoder.o \
./src/din/dinEXIDatatypesEncoder.o
C_DEPS += \
./src/din/dinEXIDatatypes.d \
./src/din/dinEXIDatatypesDecoder.d \
./src/din/dinEXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/din/%.o: ../src/din/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,9 @@
src/iso1/iso1EXIDatatypes.d: ../src/iso1/iso1EXIDatatypes.c \
../src/iso1/iso1EXIDatatypes.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h
../src/iso1/iso1EXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:

Binary file not shown.

View File

@@ -0,0 +1,24 @@
src/iso1/iso1EXIDatatypesDecoder.d: ../src/iso1/iso1EXIDatatypesDecoder.c \
../src/iso1/iso1EXIDatatypesDecoder.h ../src/iso1/iso1EXIDatatypes.h \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/codec/DecoderChannel.h ../src/codec/EXIOptions.h \
../src/codec/EXITypes.h ../src/codec/EXIHeaderDecoder.h \
../src/codec/ErrorCodes.h
../src/iso1/iso1EXIDatatypesDecoder.h:
../src/iso1/iso1EXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/DecoderChannel.h:
../src/codec/EXIOptions.h:
../src/codec/EXITypes.h:
../src/codec/EXIHeaderDecoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
src/iso1/iso1EXIDatatypesEncoder.d: ../src/iso1/iso1EXIDatatypesEncoder.c \
../src/iso1/iso1EXIDatatypesEncoder.h ../src/iso1/iso1EXIDatatypes.h \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/codec/EncoderChannel.h ../src/codec/EXITypes.h \
../src/codec/EXIHeaderEncoder.h ../src/codec/ErrorCodes.h
../src/iso1/iso1EXIDatatypesEncoder.h:
../src/iso1/iso1EXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/EncoderChannel.h:
../src/codec/EXITypes.h:
../src/codec/EXIHeaderEncoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

30
Debug/src/iso1/subdir.mk Normal file
View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/iso1/iso1EXIDatatypes.c \
../src/iso1/iso1EXIDatatypesDecoder.c \
../src/iso1/iso1EXIDatatypesEncoder.c
OBJS += \
./src/iso1/iso1EXIDatatypes.o \
./src/iso1/iso1EXIDatatypesDecoder.o \
./src/iso1/iso1EXIDatatypesEncoder.o
C_DEPS += \
./src/iso1/iso1EXIDatatypes.d \
./src/iso1/iso1EXIDatatypesDecoder.d \
./src/iso1/iso1EXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/iso1/%.o: ../src/iso1/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,9 @@
src/iso2/iso2EXIDatatypes.d: ../src/iso2/iso2EXIDatatypes.c \
../src/iso2/iso2EXIDatatypes.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h
../src/iso2/iso2EXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:

Binary file not shown.

View File

@@ -0,0 +1,24 @@
src/iso2/iso2EXIDatatypesDecoder.d: ../src/iso2/iso2EXIDatatypesDecoder.c \
../src/iso2/iso2EXIDatatypesDecoder.h ../src/iso2/iso2EXIDatatypes.h \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/codec/DecoderChannel.h ../src/codec/EXIOptions.h \
../src/codec/EXITypes.h ../src/codec/EXIHeaderDecoder.h \
../src/codec/ErrorCodes.h
../src/iso2/iso2EXIDatatypesDecoder.h:
../src/iso2/iso2EXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/DecoderChannel.h:
../src/codec/EXIOptions.h:
../src/codec/EXITypes.h:
../src/codec/EXIHeaderDecoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,21 @@
src/iso2/iso2EXIDatatypesEncoder.d: ../src/iso2/iso2EXIDatatypesEncoder.c \
../src/iso2/iso2EXIDatatypesEncoder.h ../src/iso2/iso2EXIDatatypes.h \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/codec/EncoderChannel.h ../src/codec/EXITypes.h \
../src/codec/EXIHeaderEncoder.h ../src/codec/ErrorCodes.h
../src/iso2/iso2EXIDatatypesEncoder.h:
../src/iso2/iso2EXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/EncoderChannel.h:
../src/codec/EXITypes.h:
../src/codec/EXIHeaderEncoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

30
Debug/src/iso2/subdir.mk Normal file
View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/iso2/iso2EXIDatatypes.c \
../src/iso2/iso2EXIDatatypesDecoder.c \
../src/iso2/iso2EXIDatatypesEncoder.c
OBJS += \
./src/iso2/iso2EXIDatatypes.o \
./src/iso2/iso2EXIDatatypesDecoder.o \
./src/iso2/iso2EXIDatatypesEncoder.o
C_DEPS += \
./src/iso2/iso2EXIDatatypes.d \
./src/iso2/iso2EXIDatatypesDecoder.d \
./src/iso2/iso2EXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/iso2/%.o: ../src/iso2/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

3
Debug/src/test/main.d Normal file
View File

@@ -0,0 +1,3 @@
src/test/main.d: ../src/test/main.c ../src/test/main.h
../src/test/main.h:

BIN
Debug/src/test/main.o Normal file

Binary file not shown.

View File

@@ -0,0 +1,31 @@
src/test/main_databinder.d: ../src/test/main_databinder.c \
../src/iso1/iso1EXIDatatypes.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/iso1/iso1EXIDatatypesEncoder.h \
../src/iso1/iso1EXIDatatypes.h ../src/iso1/iso1EXIDatatypesDecoder.h \
../src/iso2/iso2EXIDatatypes.h ../src/iso2/iso2EXIDatatypesEncoder.h \
../src/iso2/iso2EXIDatatypes.h ../src/iso2/iso2EXIDatatypesDecoder.h \
../src/codec/ByteStream.h ../src/codec/EXITypes.h
../src/iso1/iso1EXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/iso1/iso1EXIDatatypesEncoder.h:
../src/iso1/iso1EXIDatatypes.h:
../src/iso1/iso1EXIDatatypesDecoder.h:
../src/iso2/iso2EXIDatatypes.h:
../src/iso2/iso2EXIDatatypesEncoder.h:
../src/iso2/iso2EXIDatatypes.h:
../src/iso2/iso2EXIDatatypesDecoder.h:
../src/codec/ByteStream.h:
../src/codec/EXITypes.h:

Binary file not shown.

View File

@@ -0,0 +1,53 @@
src/test/main_example.d: ../src/test/main_example.c \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/appHandshake/appHandEXIDatatypes.h \
../src/appHandshake/appHandEXIDatatypesEncoder.h \
../src/appHandshake/appHandEXIDatatypes.h \
../src/appHandshake/appHandEXIDatatypesDecoder.h \
../src/din/dinEXIDatatypes.h ../src/din/dinEXIDatatypesEncoder.h \
../src/din/dinEXIDatatypes.h ../src/din/dinEXIDatatypesDecoder.h \
../src/xmldsig/xmldsigEXIDatatypes.h ../src/iso1/iso1EXIDatatypes.h \
../src/iso1/iso1EXIDatatypesEncoder.h ../src/iso1/iso1EXIDatatypes.h \
../src/iso1/iso1EXIDatatypesDecoder.h ../src/iso2/iso2EXIDatatypes.h \
../src/iso2/iso2EXIDatatypesEncoder.h ../src/iso2/iso2EXIDatatypes.h \
../src/iso2/iso2EXIDatatypesDecoder.h ../src/transport/v2gtp.h
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/appHandshake/appHandEXIDatatypes.h:
../src/appHandshake/appHandEXIDatatypesEncoder.h:
../src/appHandshake/appHandEXIDatatypes.h:
../src/appHandshake/appHandEXIDatatypesDecoder.h:
../src/din/dinEXIDatatypes.h:
../src/din/dinEXIDatatypesEncoder.h:
../src/din/dinEXIDatatypes.h:
../src/din/dinEXIDatatypesDecoder.h:
../src/xmldsig/xmldsigEXIDatatypes.h:
../src/iso1/iso1EXIDatatypes.h:
../src/iso1/iso1EXIDatatypesEncoder.h:
../src/iso1/iso1EXIDatatypes.h:
../src/iso1/iso1EXIDatatypesDecoder.h:
../src/iso2/iso2EXIDatatypes.h:
../src/iso2/iso2EXIDatatypesEncoder.h:
../src/iso2/iso2EXIDatatypes.h:
../src/iso2/iso2EXIDatatypesDecoder.h:
../src/transport/v2gtp.h:

Binary file not shown.

30
Debug/src/test/subdir.mk Normal file
View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/test/main.c \
../src/test/main_databinder.c \
../src/test/main_example.c
OBJS += \
./src/test/main.o \
./src/test/main_databinder.o \
./src/test/main_example.o
C_DEPS += \
./src/test/main.d \
./src/test/main_databinder.d \
./src/test/main_example.d
# Each subdirectory must supply rules for building sources it contributes
src/test/%.o: ../src/test/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,24 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/transport/v2gtp.c
OBJS += \
./src/transport/v2gtp.o
C_DEPS += \
./src/transport/v2gtp.d
# Each subdirectory must supply rules for building sources it contributes
src/transport/%.o: ../src/transport/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,3 @@
src/transport/v2gtp.d: ../src/transport/v2gtp.c ../src/transport/v2gtp.h
../src/transport/v2gtp.h:

BIN
Debug/src/transport/v2gtp.o Normal file

Binary file not shown.

View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/xmldsig/xmldsigEXIDatatypes.c \
../src/xmldsig/xmldsigEXIDatatypesDecoder.c \
../src/xmldsig/xmldsigEXIDatatypesEncoder.c
OBJS += \
./src/xmldsig/xmldsigEXIDatatypes.o \
./src/xmldsig/xmldsigEXIDatatypesDecoder.o \
./src/xmldsig/xmldsigEXIDatatypesEncoder.o
C_DEPS += \
./src/xmldsig/xmldsigEXIDatatypes.d \
./src/xmldsig/xmldsigEXIDatatypesDecoder.d \
./src/xmldsig/xmldsigEXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/xmldsig/%.o: ../src/xmldsig/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,9 @@
src/xmldsig/xmldsigEXIDatatypes.d: ../src/xmldsig/xmldsigEXIDatatypes.c \
../src/xmldsig/xmldsigEXIDatatypes.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h
../src/xmldsig/xmldsigEXIDatatypes.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:

Binary file not shown.

View File

@@ -0,0 +1,23 @@
src/xmldsig/xmldsigEXIDatatypesDecoder.d: \
../src/xmldsig/xmldsigEXIDatatypesDecoder.c \
../src/xmldsig/xmldsigEXIDatatypesDecoder.h \
../src/xmldsig/xmldsigEXIDatatypes.h ../src/codec/DecoderChannel.h \
../src/codec/EXIOptions.h ../src/codec/EXITypes.h \
../src/codec/EXIConfig.h ../src/codec/EXIHeaderDecoder.h \
../src/codec/ErrorCodes.h
../src/xmldsig/xmldsigEXIDatatypesDecoder.h:
../src/xmldsig/xmldsigEXIDatatypes.h:
../src/codec/DecoderChannel.h:
../src/codec/EXIOptions.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/EXIHeaderDecoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

View File

@@ -0,0 +1,20 @@
src/xmldsig/xmldsigEXIDatatypesEncoder.d: \
../src/xmldsig/xmldsigEXIDatatypesEncoder.c \
../src/xmldsig/xmldsigEXIDatatypesEncoder.h \
../src/xmldsig/xmldsigEXIDatatypes.h ../src/codec/EncoderChannel.h \
../src/codec/EXITypes.h ../src/codec/EXIConfig.h \
../src/codec/EXIHeaderEncoder.h ../src/codec/ErrorCodes.h
../src/xmldsig/xmldsigEXIDatatypesEncoder.h:
../src/xmldsig/xmldsigEXIDatatypes.h:
../src/codec/EncoderChannel.h:
../src/codec/EXITypes.h:
../src/codec/EXIConfig.h:
../src/codec/EXIHeaderEncoder.h:
../src/codec/ErrorCodes.h:

Binary file not shown.

BIN
Debug/test.exi Normal file

Binary file not shown.

1
Debug/test.txt Normal file
View File

@@ -0,0 +1 @@
8034282e23dd1022334455668660dd00000000002c06fffe80000000000000122233fffe445566fe80000000000000823428fffe2e23ddc365d121007d208c2ce1d2295018111c493a00000101fe8001000000001080980210509008c0c0c0e0c52110003200

165
LICENSE.txt Normal file
View File

@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

165
README.txt Normal file
View File

@@ -0,0 +1,165 @@
-------------------------------------------------------------------------
OpenV2G - an open source project implementing the basic functionality of the ISO IEC 15118 vehicle to grid (V2G) communication interface
Version 0.9.5, released March 11, 2022
http://openv2g.sourceforge.net/
Please report bugs via the SourceForge bug tracking system at http://sourceforge.net/tracker/?group_id=350113.
Thank you.
Copyright (C) 2007-2022 Siemens AG
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------
CHANGES from version 0.9.4:
-------------------------------------------------------------------------
* fix possible memory corruption bug
-------------------------------------------------------------------------
CHANGES from version 0.9.3:
-------------------------------------------------------------------------
* Support for 15118-2-2016 (ISO2) started besides 15118-2-2013 (ISO1) and DIN
* fix eMAID fragment encoding/decoding support
* internal coding updates
* bug-fixes
-------------------------------------------------------------------------
CHANGES from version 0.9.2:
-------------------------------------------------------------------------
* resolves XML signature interoperability issue
Note: To make use of xmldsig the following defines have to be set.
in "xmldsigEXIDatatypes.h"
#define DEPLOY_XMLDSIG_CODEC SUPPORT_YES
#define DEPLOY_XMLDSIG_CODEC_FRAGMENT SUPPORT_YES
in "v2gEXIDatatypes.h"
#define DEPLOY_ISO_CODEC_FRAGMENT SUPPORT_YES
Otherwise the code is turned off.
-------------------------------------------------------------------------
CHANGES from version 0.9.1:
-------------------------------------------------------------------------
* resolves bug with name clashes w.r.t. iso and din track
* fixes issue with test code for init handshake
* Note: OpenV2G 0.9.2 is essentially just a bug fixed version of OpenV2G 0.9.1
-------------------------------------------------------------------------
CHANGES from version 0.9:
-------------------------------------------------------------------------
* includes support for DIN and hence interoperability with OpenV2G 0.7
(needs to be switched on though by #define DEPLOY_DIN_CODEC)
* fixes bugs and warnings for Visual Studio
* Note: OpenV2G 0.9.1 is a superset of previous versions
v2g...c/h files support ISO track
din...c/h files support DIN track
-------------------------------------------------------------------------
CHANGES from version 0.8:
-------------------------------------------------------------------------
* large code footprint reduction which resulted in a new API
(please take a look at the example in src/test folder)
* datatype differences w.r.t. arrays, strings, bytes, isUsed, and enum-naming
* bug-fixes
* Note: OpenV2G 0.8 and 0.9 are interoperable, meaning that one can generate
streams with one and decode with the other or vice-versa
-------------------------------------------------------------------------
CHANGES from version 0.7:
-------------------------------------------------------------------------
* adaption of V2G schema changes (reflects the ISO/IEC 15118-2 FDIS status)
* bug-fixes
-------------------------------------------------------------------------
CHANGES from version 0.7:
-------------------------------------------------------------------------
* adaption of V2G schema changes (reflects the ISO/IEC 15118-2 FDIS status)
* bug-fixes
-------------------------------------------------------------------------
CHANGES from version 0.6:
-------------------------------------------------------------------------
* adaption of V2G schema changes (reflects the ISO/IEC 15118-2 DIS status and DIN 70121)
* reduced memory usage
* EXI decoder skips schema deviations according to EXI Profile
* bug-fixes
-------------------------------------------------------------------------
CHANGES from version 0.5:
-------------------------------------------------------------------------
* adaption of V2G schema changes
* application handshake protocol implementation
* asynchronised communication
* reduced memory usage
* changed V2GTP byte order from little endian to big endian
* bug-fixes
* updated AC demo interaction between EV and EVSE, and
* updated DC demo interaction between EV and EVSE
-------------------------------------------------------------------------
CHANGES from version 0.4:
-------------------------------------------------------------------------
* adaption of V2G schema changes
* V2GTP implementation (replaces the DoIP implementation)
* EXI default coder for the 15118 schema (replaces the strict mode of EXI)
* AC demo interaction between PEV and EVSE, and
* DC demo interaction between PEV and EVSE
-------------------------------------------------------------------------
CHANGES from version 0.3.1:
-------------------------------------------------------------------------
* adaption of V2G schema changes
* supporting of DC messages
* example program showing the message sequence of AC charging and
DC charging
* bug-fixes
-------------------------------------------------------------------------
CHANGES from version 0.3:
-------------------------------------------------------------------------
* Bug-fixes
* reduced memory usage
* some type changes in the EXI codec and V2G service:
** struct v2gService->struct EXIService in v2g_service.h
** size_t->uint16_t in v2g_serviceClientDataTransmitter.h and doIP.h
* renaming of some enumeration values in v2g_serviceDataTypes.h
-------------------------------------------------------------------------
CHANGES from version 0.2.2:
-------------------------------------------------------------------------
* Bug-fixes
* first DoIP implementation
* V2G message error handling
* adaption of V2G schema changes
* code optimizations
-------------------------------------------------------------------------
CHANGES from version 0.2.1:
-------------------------------------------------------------------------
* Bug-fixes
* adaption of V2G schema changes
* some code optimizations
-------------------------------------------------------------------------
CHANGES from version 0.2:
-------------------------------------------------------------------------
* Bug-fixes
* Fixed compiler warnings
-------------------------------------------------------------------------
CHANGES from version 0.1:
-------------------------------------------------------------------------
* Bug-fixes
* Service and Client added

51
Release/makefile Normal file
View File

@@ -0,0 +1,51 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
-include ../makefile.init
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include src/xmldsig/subdir.mk
-include src/transport/subdir.mk
-include src/test/subdir.mk
-include src/iso2/subdir.mk
-include src/iso1/subdir.mk
-include src/din/subdir.mk
-include src/codec/subdir.mk
-include src/appHandshake/subdir.mk
-include subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif
-include ../makefile.defs
# Add inputs and outputs from these tool invocations to the build variables
# All Target
all: OpenV2G.exe
# Tool invocations
OpenV2G.exe: $(OBJS) $(USER_OBJS)
@echo 'Building target: $@'
@echo 'Invoking: MinGW C Linker'
gcc -o "OpenV2G.exe" $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '
# Other Targets
clean:
-$(RM) $(EXECUTABLES)$(OBJS)$(C_DEPS) OpenV2G.exe
-@echo ' '
.PHONY: all clean dependents
.SECONDARY:
-include ../makefile.targets

8
Release/objects.mk Normal file
View File

@@ -0,0 +1,8 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
USER_OBJS :=
LIBS :=

24
Release/sources.mk Normal file
View File

@@ -0,0 +1,24 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
OBJ_SRCS :=
ASM_SRCS :=
C_SRCS :=
S_UPPER_SRCS :=
O_SRCS :=
EXECUTABLES :=
OBJS :=
C_DEPS :=
# Every subdirectory with source files must be described here
SUBDIRS := \
src/xmldsig \
src/transport \
src/test \
src/iso2 \
src/iso1 \
src/din \
src/codec \
src/appHandshake \

View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/appHandshake/appHandEXIDatatypes.c \
../src/appHandshake/appHandEXIDatatypesDecoder.c \
../src/appHandshake/appHandEXIDatatypesEncoder.c
OBJS += \
./src/appHandshake/appHandEXIDatatypes.o \
./src/appHandshake/appHandEXIDatatypesDecoder.o \
./src/appHandshake/appHandEXIDatatypesEncoder.o
C_DEPS += \
./src/appHandshake/appHandEXIDatatypes.d \
./src/appHandshake/appHandEXIDatatypesDecoder.d \
./src/appHandshake/appHandEXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/appHandshake/%.o: ../src/appHandshake/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,45 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/codec/BitInputStream.c \
../src/codec/BitOutputStream.c \
../src/codec/ByteStream.c \
../src/codec/DecoderChannel.c \
../src/codec/EXIHeaderDecoder.c \
../src/codec/EXIHeaderEncoder.c \
../src/codec/EncoderChannel.c \
../src/codec/MethodsBag.c
OBJS += \
./src/codec/BitInputStream.o \
./src/codec/BitOutputStream.o \
./src/codec/ByteStream.o \
./src/codec/DecoderChannel.o \
./src/codec/EXIHeaderDecoder.o \
./src/codec/EXIHeaderEncoder.o \
./src/codec/EncoderChannel.o \
./src/codec/MethodsBag.o
C_DEPS += \
./src/codec/BitInputStream.d \
./src/codec/BitOutputStream.d \
./src/codec/ByteStream.d \
./src/codec/DecoderChannel.d \
./src/codec/EXIHeaderDecoder.d \
./src/codec/EXIHeaderEncoder.d \
./src/codec/EncoderChannel.d \
./src/codec/MethodsBag.d
# Each subdirectory must supply rules for building sources it contributes
src/codec/%.o: ../src/codec/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

30
Release/src/din/subdir.mk Normal file
View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/din/dinEXIDatatypes.c \
../src/din/dinEXIDatatypesDecoder.c \
../src/din/dinEXIDatatypesEncoder.c
OBJS += \
./src/din/dinEXIDatatypes.o \
./src/din/dinEXIDatatypesDecoder.o \
./src/din/dinEXIDatatypesEncoder.o
C_DEPS += \
./src/din/dinEXIDatatypes.d \
./src/din/dinEXIDatatypesDecoder.d \
./src/din/dinEXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/din/%.o: ../src/din/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/iso1/iso1EXIDatatypes.c \
../src/iso1/iso1EXIDatatypesDecoder.c \
../src/iso1/iso1EXIDatatypesEncoder.c
OBJS += \
./src/iso1/iso1EXIDatatypes.o \
./src/iso1/iso1EXIDatatypesDecoder.o \
./src/iso1/iso1EXIDatatypesEncoder.o
C_DEPS += \
./src/iso1/iso1EXIDatatypes.d \
./src/iso1/iso1EXIDatatypesDecoder.d \
./src/iso1/iso1EXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/iso1/%.o: ../src/iso1/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/iso2/iso2EXIDatatypes.c \
../src/iso2/iso2EXIDatatypesDecoder.c \
../src/iso2/iso2EXIDatatypesEncoder.c
OBJS += \
./src/iso2/iso2EXIDatatypes.o \
./src/iso2/iso2EXIDatatypesDecoder.o \
./src/iso2/iso2EXIDatatypesEncoder.o
C_DEPS += \
./src/iso2/iso2EXIDatatypes.d \
./src/iso2/iso2EXIDatatypesDecoder.d \
./src/iso2/iso2EXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/iso2/%.o: ../src/iso2/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/test/main.c \
../src/test/main_databinder.c \
../src/test/main_example.c
OBJS += \
./src/test/main.o \
./src/test/main_databinder.o \
./src/test/main_example.o
C_DEPS += \
./src/test/main.d \
./src/test/main_databinder.d \
./src/test/main_example.d
# Each subdirectory must supply rules for building sources it contributes
src/test/%.o: ../src/test/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,24 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/transport/v2gtp.c
OBJS += \
./src/transport/v2gtp.o
C_DEPS += \
./src/transport/v2gtp.d
# Each subdirectory must supply rules for building sources it contributes
src/transport/%.o: ../src/transport/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

View File

@@ -0,0 +1,30 @@
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../src/xmldsig/xmldsigEXIDatatypes.c \
../src/xmldsig/xmldsigEXIDatatypesDecoder.c \
../src/xmldsig/xmldsigEXIDatatypesEncoder.c
OBJS += \
./src/xmldsig/xmldsigEXIDatatypes.o \
./src/xmldsig/xmldsigEXIDatatypesDecoder.o \
./src/xmldsig/xmldsigEXIDatatypesEncoder.o
C_DEPS += \
./src/xmldsig/xmldsigEXIDatatypes.d \
./src/xmldsig/xmldsigEXIDatatypesDecoder.d \
./src/xmldsig/xmldsigEXIDatatypesEncoder.d
# Each subdirectory must supply rules for building sources it contributes
src/xmldsig/%.o: ../src/xmldsig/%.c
@echo 'Building file: $<'
@echo 'Invoking: GCC C Compiler'
gcc -I"../src/codec" -I"../src/din" -I"../src/iso1" -I"../src/iso2" -I"../src/xmldsig" -I"../src/appHandshake" -I"../src/transport" -I"../src/test" -Os -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '

76
create_test3.c Normal file
View File

@@ -0,0 +1,76 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int hex_char_to_int(char c) {
if (c >= '0' && c <= '9') return c - '0';
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
return -1;
}
int main() {
const char* hex_string = "8098021050908C0C0C0E0C50E00000002040C40C203030C01400003103D00C0618370105088270095A5A30303030300008";
size_t hex_len = strlen(hex_string);
if (hex_len % 2 != 0) {
printf("Error: Hex string length must be even\n");
return -1;
}
size_t binary_len = hex_len / 2;
unsigned char* binary_data = malloc(binary_len);
if (!binary_data) {
printf("Memory allocation failed\n");
return -1;
}
// Convert hex string to binary
for (size_t i = 0; i < binary_len; i++) {
int high = hex_char_to_int(hex_string[i * 2]);
int low = hex_char_to_int(hex_string[i * 2 + 1]);
if (high == -1 || low == -1) {
printf("Invalid hex character at position %zu\n", i * 2);
free(binary_data);
return -1;
}
binary_data[i] = (high << 4) | low;
}
// Write to file
FILE* file = fopen("test3.exi", "wb");
if (!file) {
printf("Cannot create output file\n");
free(binary_data);
return -1;
}
size_t written = fwrite(binary_data, 1, binary_len, file);
fclose(file);
free(binary_data);
if (written != binary_len) {
printf("Write error\n");
return -1;
}
printf("Successfully created test3.exi with %zu bytes\n", binary_len);
// Show first few bytes for verification
printf("First 16 bytes: ");
FILE* verify = fopen("test3.exi", "rb");
if (verify) {
for (int i = 0; i < 16 && i < binary_len; i++) {
int c = fgetc(verify);
printf("%02X ", c);
}
fclose(verify);
}
printf("\n");
return 0;
}

BIN
create_test3.exe Normal file

Binary file not shown.

24
create_test4.c Normal file
View File

@@ -0,0 +1,24 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
const char* hex_string = "8098021050908C0C0C0E0C50D10032018600A01881AE0601860C806140C801030800006100001881980600";
FILE* file = fopen("test4.exi", "wb");
if (!file) {
printf("Error creating test4.exi\n");
return -1;
}
size_t len = strlen(hex_string);
for (size_t i = 0; i < len; i += 2) {
unsigned int byte;
sscanf(&hex_string[i], "%2x", &byte);
fputc(byte, file);
}
fclose(file);
printf("test4.exi created successfully (%zu bytes)\n", len/2);
return 0;
}

BIN
create_test4.exe Normal file

Binary file not shown.

66
create_test_exi.c Normal file
View File

@@ -0,0 +1,66 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* EXI codec headers */
#include "iso1EXIDatatypes.h"
#include "iso1EXIDatatypesEncoder.h"
#include "ByteStream.h"
#define BUFFER_SIZE 1024
int main() {
struct iso1EXIDocument exiDoc;
bitstream_t stream;
uint8_t buffer[BUFFER_SIZE];
size_t pos = 0;
int errn = 0;
/* Initialize EXI document */
init_iso1EXIDocument(&exiDoc);
/* Create a simple V2G message */
exiDoc.V2G_Message_isUsed = 1;
init_iso1MessageHeaderType(&exiDoc.V2G_Message.Header);
/* Set session ID to all zeros */
memset(exiDoc.V2G_Message.Header.SessionID.bytes, 0, 8);
exiDoc.V2G_Message.Header.SessionID.bytesLen = 8;
/* Create session setup request */
exiDoc.V2G_Message.Body.SessionSetupReq_isUsed = 1;
init_iso1SessionSetupReqType(&exiDoc.V2G_Message.Body.SessionSetupReq);
/* Set EVCC ID */
strcpy((char*)exiDoc.V2G_Message.Body.SessionSetupReq.EVCCID.bytes, "01");
exiDoc.V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen = 2;
/* Setup output stream */
stream.size = BUFFER_SIZE;
stream.data = buffer;
stream.pos = &pos;
stream.buffer = 0;
stream.capacity = 8;
/* Encode to EXI */
printf("Encoding V2G message to EXI...\n");
errn = encode_iso1ExiDocument(&stream, &exiDoc);
if (errn != 0) {
printf("Encoding failed with error: %d\n", errn);
return -1;
}
/* Write to file */
FILE *fp = fopen("test_message.exi", "wb");
if (fp == NULL) {
printf("Cannot create output file\n");
return -1;
}
fwrite(buffer, 1, pos, fp);
fclose(fp);
printf("Created test_message.exi with %zu bytes\n", pos);
return 0;
}

BIN
create_test_exi.exe Normal file

Binary file not shown.

15
data/sessionSetupReq.xml Normal file
View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<v2gci_d:V2G_Message xmlns:v2gci_b="urn:iso:15118:2:2016:MsgBody"
xmlns:ns2="urn:iso:15118:2:2016:MsgDataTypes"
xmlns:v2gci_h="urn:iso:15118:2:2016:MsgHeader"
xmlns:xmlsig="http://www.w3.org/2000/09/xmldsig#"
xmlns:v2gci_d="urn:iso:15118:2:2016:MsgDef">
<v2gci_d:Header>
<v2gci_h:SessionID>0000000000000000</v2gci_h:SessionID>
</v2gci_d:Header>
<v2gci_d:Body>
<v2gci_b:SessionSetupReq>
<v2gci_b:EVCCID>01</v2gci_b:EVCCID>
</v2gci_b:SessionSetupReq>
</v2gci_d:Body>
</v2gci_d:V2G_Message>

Binary file not shown.

17
data/sessionSetupRes.xml Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<v2gci_d:V2G_Message xmlns:v2gci_b="urn:iso:15118:2:2016:MsgBody"
xmlns:ns2="urn:iso:15118:2:2016:MsgDataTypes"
xmlns:v2gci_h="urn:iso:15118:2:2016:MsgHeader"
xmlns:xmlsig="http://www.w3.org/2000/09/xmldsig#"
xmlns:v2gci_d="urn:iso:15118:2:2016:MsgDef">
<v2gci_d:Header>
<v2gci_h:SessionID>0000000000000010</v2gci_h:SessionID>
</v2gci_d:Header>
<v2gci_d:Body>
<v2gci_b:SessionSetupRes>
<v2gci_b:ResponseCode>OK</v2gci_b:ResponseCode>
<v2gci_b:EVSEID>1234567</v2gci_b:EVSEID>
<v2gci_b:EVSETimeStamp>123456789</v2gci_b:EVSETimeStamp>
</v2gci_b:SessionSetupRes>
</v2gci_d:Body>
</v2gci_d:V2G_Message>

Binary file not shown.

627
enhanced_exi_viewer.c Normal file
View File

@@ -0,0 +1,627 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* EXI codec headers */
#include "iso1EXIDatatypes.h"
#include "iso1EXIDatatypesDecoder.h"
#include "iso2EXIDatatypes.h"
#include "iso2EXIDatatypesDecoder.h"
#include "dinEXIDatatypes.h"
#include "dinEXIDatatypesDecoder.h"
#include "ByteStream.h"
#define BUFFER_SIZE 4096
void print_session_id(uint8_t *bytes, size_t len) {
printf("SessionID: ");
for(size_t i = 0; i < len; i++) {
printf("%02X", bytes[i]);
}
printf(" (");
for(size_t i = 0; i < len; i++) {
if (bytes[i] >= 32 && bytes[i] <= 126) {
printf("%c", bytes[i]);
} else {
printf(".");
}
}
printf(")\n");
}
void print_xml_header() {
printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
printf("<V2G_Message xmlns=\"urn:iso:15118:2:2013:MsgDef\"\n");
printf(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n");
}
void print_xml_footer() {
printf("</V2G_Message>\n");
}
void print_session_id_xml(uint8_t *bytes, size_t len) {
printf(" <SessionID>");
for(size_t i = 0; i < len; i++) {
printf("%02X", bytes[i]);
}
printf("</SessionID>\n");
}
void print_iso1_xml(struct iso1EXIDocument *doc) {
if (!doc->V2G_Message_isUsed) return;
print_xml_header();
// Header
printf(" <Header>\n");
print_session_id_xml(doc->V2G_Message.Header.SessionID.bytes,
doc->V2G_Message.Header.SessionID.bytesLen);
if (doc->V2G_Message.Header.Notification_isUsed) {
printf(" <Notification>\n");
printf(" <FaultCode>%d</FaultCode>\n", doc->V2G_Message.Header.Notification.FaultCode);
printf(" <FaultMsg>%s</FaultMsg>\n", doc->V2G_Message.Header.Notification.FaultMsg.characters);
printf(" </Notification>\n");
}
printf(" </Header>\n");
// Body
printf(" <Body>\n");
if (doc->V2G_Message.Body.CurrentDemandRes_isUsed) {
printf(" <CurrentDemandRes>\n");
printf(" <ResponseCode>%d</ResponseCode>\n", doc->V2G_Message.Body.CurrentDemandRes.ResponseCode);
printf(" <DC_EVSEStatus>\n");
printf(" <EVSENotification>%d</EVSENotification>\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSENotification);
printf(" <NotificationMaxDelay>%d</NotificationMaxDelay>\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.NotificationMaxDelay);
if (doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEIsolationStatus_isUsed) {
printf(" <EVSEIsolationStatus>%d</EVSEIsolationStatus>\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEIsolationStatus);
}
printf(" <EVSEStatusCode>%d</EVSEStatusCode>\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEStatusCode);
printf(" </DC_EVSEStatus>\n");
printf(" <EVSEPresentVoltage>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Value);
printf(" </EVSEPresentVoltage>\n");
printf(" <EVSEPresentCurrent>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Value);
printf(" </EVSEPresentCurrent>\n");
printf(" <EVSECurrentLimitAchieved>%s</EVSECurrentLimitAchieved>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSECurrentLimitAchieved ? "true" : "false");
printf(" <EVSEVoltageLimitAchieved>%s</EVSEVoltageLimitAchieved>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEVoltageLimitAchieved ? "true" : "false");
printf(" <EVSEPowerLimitAchieved>%s</EVSEPowerLimitAchieved>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPowerLimitAchieved ? "true" : "false");
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit_isUsed) {
printf(" <EVSEMaximumVoltageLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Value);
printf(" </EVSEMaximumVoltageLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit_isUsed) {
printf(" <EVSEMaximumCurrentLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Value);
printf(" </EVSEMaximumCurrentLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit_isUsed) {
printf(" <EVSEMaximumPowerLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Value);
printf(" </EVSEMaximumPowerLimit>\n");
}
printf(" <EVSEID>%.*s</EVSEID>\n",
doc->V2G_Message.Body.CurrentDemandRes.EVSEID.charactersLen,
doc->V2G_Message.Body.CurrentDemandRes.EVSEID.characters);
printf(" <SAScheduleTupleID>%d</SAScheduleTupleID>\n", doc->V2G_Message.Body.CurrentDemandRes.SAScheduleTupleID);
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo_isUsed) {
printf(" <MeterInfo>\n");
printf(" <MeterID>%.*s</MeterID>\n",
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.charactersLen,
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.characters);
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading_isUsed) {
printf(" <MeterReading>%llu</MeterReading>\n",
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading);
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading_isUsed) {
printf(" <SigMeterReading>");
for(int i = 0; i < doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading.bytes[i]);
}
printf("</SigMeterReading>\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus_isUsed) {
printf(" <MeterStatus>%d</MeterStatus>\n", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus);
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter_isUsed) {
printf(" <TMeter>%lld</TMeter>\n", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter);
}
printf(" </MeterInfo>\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.ReceiptRequired_isUsed) {
printf(" <ReceiptRequired>%s</ReceiptRequired>\n", doc->V2G_Message.Body.CurrentDemandRes.ReceiptRequired ? "true" : "false");
}
printf(" </CurrentDemandRes>\n");
}
else if (doc->V2G_Message.Body.CurrentDemandReq_isUsed) {
printf(" <CurrentDemandReq>\n");
printf(" <DC_EVStatus>\n");
printf(" <EVReady>%s</EVReady>\n", doc->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVReady ? "true" : "false");
printf(" <EVErrorCode>%d</EVErrorCode>\n", doc->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVErrorCode);
printf(" <EVRESSSOC>%d</EVRESSSOC>\n", doc->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVRESSSOC);
printf(" </DC_EVStatus>\n");
printf(" <EVTargetCurrent>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Value);
printf(" </EVTargetCurrent>\n");
printf(" <EVTargetVoltage>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Value);
printf(" </EVTargetVoltage>\n");
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit_isUsed) {
printf(" <EVMaximumVoltageLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Value);
printf(" </EVMaximumVoltageLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit_isUsed) {
printf(" <EVMaximumCurrentLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Value);
printf(" </EVMaximumCurrentLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit_isUsed) {
printf(" <EVMaximumPowerLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Value);
printf(" </EVMaximumPowerLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandReq.BulkChargingComplete_isUsed) {
printf(" <BulkChargingComplete>%s</BulkChargingComplete>\n", doc->V2G_Message.Body.CurrentDemandReq.BulkChargingComplete ? "true" : "false");
}
printf(" <ChargingComplete>%s</ChargingComplete>\n", doc->V2G_Message.Body.CurrentDemandReq.ChargingComplete ? "true" : "false");
if (doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC_isUsed) {
printf(" <RemainingTimeToFullSoC>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Value);
printf(" </RemainingTimeToFullSoC>\n");
}
if (doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC_isUsed) {
printf(" <RemainingTimeToBulkSoC>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Value);
printf(" </RemainingTimeToBulkSoC>\n");
}
printf(" </CurrentDemandReq>\n");
}
else {
printf(" <!-- Other message types not implemented in XML mode -->\n");
}
printf(" </Body>\n");
print_xml_footer();
}
void print_iso1_message(struct iso1EXIDocument *doc) {
printf("=== ISO1 V2G Message ===\n");
if (doc->V2G_Message_isUsed) {
// Print Header
printf("Header:\n");
print_session_id(doc->V2G_Message.Header.SessionID.bytes,
doc->V2G_Message.Header.SessionID.bytesLen);
if (doc->V2G_Message.Header.Notification_isUsed) {
printf(" Notification: FaultCode=%d, FaultMsg=%s\n",
doc->V2G_Message.Header.Notification.FaultCode,
doc->V2G_Message.Header.Notification.FaultMsg.characters);
}
printf("\nBody:\n");
// Check all possible message types
if (doc->V2G_Message.Body.SessionSetupReq_isUsed) {
printf(" Message Type: SessionSetupReq\n");
printf(" EVCCID: ");
for(size_t i = 0; i < doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i]);
}
printf(" (");
for(size_t i = 0; i < doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen; i++) {
if (doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i] >= 32 &&
doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i] <= 126) {
printf("%c", doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i]);
} else {
printf(".");
}
}
printf(")\n");
}
else if (doc->V2G_Message.Body.SessionSetupRes_isUsed) {
printf(" Message Type: SessionSetupRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.SessionSetupRes.ResponseCode);
printf(" EVSEID: %s\n", doc->V2G_Message.Body.SessionSetupRes.EVSEID.characters);
if (doc->V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed) {
printf(" EVSETimeStamp: %ld\n", doc->V2G_Message.Body.SessionSetupRes.EVSETimeStamp);
}
}
else if (doc->V2G_Message.Body.ServiceDiscoveryReq_isUsed) {
printf(" Message Type: ServiceDiscoveryReq\n");
}
else if (doc->V2G_Message.Body.ServiceDiscoveryRes_isUsed) {
printf(" Message Type: ServiceDiscoveryRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.ServiceDiscoveryRes.ResponseCode);
}
else if (doc->V2G_Message.Body.ServiceDetailReq_isUsed) {
printf(" Message Type: ServiceDetailReq\n");
printf(" ServiceID: %d\n", doc->V2G_Message.Body.ServiceDetailReq.ServiceID);
}
else if (doc->V2G_Message.Body.ServiceDetailRes_isUsed) {
printf(" Message Type: ServiceDetailRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.ServiceDetailRes.ResponseCode);
}
else if (doc->V2G_Message.Body.PaymentServiceSelectionReq_isUsed) {
printf(" Message Type: PaymentServiceSelectionReq\n");
printf(" SelectedPaymentOption: %d\n", doc->V2G_Message.Body.PaymentServiceSelectionReq.SelectedPaymentOption);
}
else if (doc->V2G_Message.Body.PaymentServiceSelectionRes_isUsed) {
printf(" Message Type: PaymentServiceSelectionRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.PaymentServiceSelectionRes.ResponseCode);
}
else if (doc->V2G_Message.Body.AuthorizationReq_isUsed) {
printf(" Message Type: AuthorizationReq\n");
if (doc->V2G_Message.Body.AuthorizationReq.Id_isUsed) {
printf(" ID: %s\n", doc->V2G_Message.Body.AuthorizationReq.Id.characters);
}
if (doc->V2G_Message.Body.AuthorizationReq.GenChallenge_isUsed) {
printf(" GenChallenge: ");
for(size_t i = 0; i < doc->V2G_Message.Body.AuthorizationReq.GenChallenge.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.AuthorizationReq.GenChallenge.bytes[i]);
}
printf("\n");
}
}
else if (doc->V2G_Message.Body.AuthorizationRes_isUsed) {
printf(" Message Type: AuthorizationRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.AuthorizationRes.ResponseCode);
printf(" EVSEProcessing: %d\n", doc->V2G_Message.Body.AuthorizationRes.EVSEProcessing);
}
else if (doc->V2G_Message.Body.ChargeParameterDiscoveryReq_isUsed) {
printf(" Message Type: ChargeParameterDiscoveryReq\n");
}
else if (doc->V2G_Message.Body.ChargeParameterDiscoveryRes_isUsed) {
printf(" Message Type: ChargeParameterDiscoveryRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.ChargeParameterDiscoveryRes.ResponseCode);
}
else if (doc->V2G_Message.Body.CableCheckReq_isUsed) {
printf(" Message Type: CableCheckReq\n");
}
else if (doc->V2G_Message.Body.CableCheckRes_isUsed) {
printf(" Message Type: CableCheckRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.CableCheckRes.ResponseCode);
}
else if (doc->V2G_Message.Body.PreChargeReq_isUsed) {
printf(" Message Type: PreChargeReq\n");
printf(" EVTargetVoltage: %d\n", doc->V2G_Message.Body.PreChargeReq.EVTargetVoltage.Value);
printf(" EVTargetCurrent: %d\n", doc->V2G_Message.Body.PreChargeReq.EVTargetCurrent.Value);
}
else if (doc->V2G_Message.Body.PreChargeRes_isUsed) {
printf(" Message Type: PreChargeRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.PreChargeRes.ResponseCode);
}
else if (doc->V2G_Message.Body.PowerDeliveryReq_isUsed) {
printf(" Message Type: PowerDeliveryReq\n");
printf(" ChargeProgress: %d\n", doc->V2G_Message.Body.PowerDeliveryReq.ChargeProgress);
printf(" SAScheduleTupleID: %d\n", doc->V2G_Message.Body.PowerDeliveryReq.SAScheduleTupleID);
}
else if (doc->V2G_Message.Body.PowerDeliveryRes_isUsed) {
printf(" Message Type: PowerDeliveryRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.PowerDeliveryRes.ResponseCode);
}
else if (doc->V2G_Message.Body.ChargingStatusReq_isUsed) {
printf(" Message Type: ChargingStatusReq\n");
}
else if (doc->V2G_Message.Body.ChargingStatusRes_isUsed) {
printf(" Message Type: ChargingStatusRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.ChargingStatusRes.ResponseCode);
}
else if (doc->V2G_Message.Body.MeteringReceiptReq_isUsed) {
printf(" Message Type: MeteringReceiptReq\n");
}
else if (doc->V2G_Message.Body.MeteringReceiptRes_isUsed) {
printf(" Message Type: MeteringReceiptRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.MeteringReceiptRes.ResponseCode);
}
else if (doc->V2G_Message.Body.SessionStopReq_isUsed) {
printf(" Message Type: SessionStopReq\n");
printf(" ChargingSession: %d\n", doc->V2G_Message.Body.SessionStopReq.ChargingSession);
}
else if (doc->V2G_Message.Body.SessionStopRes_isUsed) {
printf(" Message Type: SessionStopRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.SessionStopRes.ResponseCode);
}
else if (doc->V2G_Message.Body.CurrentDemandReq_isUsed) {
printf(" Message Type: CurrentDemandReq\n");
printf(" DC_EVStatus:\n");
printf(" EVReady: %s\n", doc->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVReady ? "true" : "false");
printf(" EVErrorCode: %d\n", doc->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVErrorCode);
printf(" EVRESSSOC: %d%%\n", doc->V2G_Message.Body.CurrentDemandReq.DC_EVStatus.EVRESSSOC);
printf(" EVTargetCurrent: %d A (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Value,
doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Multiplier,
doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Unit);
printf(" EVTargetVoltage: %d V (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Value,
doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Multiplier,
doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Unit);
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit_isUsed) {
printf(" EVMaximumVoltageLimit: %d V (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Value,
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Multiplier,
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Unit);
}
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit_isUsed) {
printf(" EVMaximumCurrentLimit: %d A (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Value,
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Multiplier,
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Unit);
}
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit_isUsed) {
printf(" EVMaximumPowerLimit: %d W (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Value,
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Multiplier,
doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Unit);
}
if (doc->V2G_Message.Body.CurrentDemandReq.BulkChargingComplete_isUsed) {
printf(" BulkChargingComplete: %s\n", doc->V2G_Message.Body.CurrentDemandReq.BulkChargingComplete ? "true" : "false");
}
printf(" ChargingComplete: %s\n", doc->V2G_Message.Body.CurrentDemandReq.ChargingComplete ? "true" : "false");
if (doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC_isUsed) {
printf(" RemainingTimeToFullSoC: %d s (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Value,
doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Multiplier,
doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToFullSoC.Unit);
}
if (doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC_isUsed) {
printf(" RemainingTimeToBulkSoC: %d s (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Value,
doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Multiplier,
doc->V2G_Message.Body.CurrentDemandReq.RemainingTimeToBulkSoC.Unit);
}
}
else if (doc->V2G_Message.Body.CurrentDemandRes_isUsed) {
printf(" Message Type: CurrentDemandRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.CurrentDemandRes.ResponseCode);
printf(" DC_EVSEStatus:\n");
printf(" EVSENotification: %d\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSENotification);
printf(" NotificationMaxDelay: %d\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.NotificationMaxDelay);
if (doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEIsolationStatus_isUsed) {
printf(" EVSEIsolationStatus: %d\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEIsolationStatus);
}
printf(" EVSEStatusCode: %d\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEStatusCode);
printf(" EVSEPresentVoltage: %d V (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Value,
doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Multiplier,
doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Unit);
printf(" EVSEPresentCurrent: %d A (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Value,
doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Multiplier,
doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Unit);
printf(" EVSECurrentLimitAchieved: %s\n", doc->V2G_Message.Body.CurrentDemandRes.EVSECurrentLimitAchieved ? "true" : "false");
printf(" EVSEVoltageLimitAchieved: %s\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEVoltageLimitAchieved ? "true" : "false");
printf(" EVSEPowerLimitAchieved: %s\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPowerLimitAchieved ? "true" : "false");
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit_isUsed) {
printf(" EVSEMaximumVoltageLimit: %d V (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Value,
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Multiplier,
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Unit);
}
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit_isUsed) {
printf(" EVSEMaximumCurrentLimit: %d A (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Value,
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Multiplier,
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Unit);
}
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit_isUsed) {
printf(" EVSEMaximumPowerLimit: %d W (Multiplier: %d, Unit: %d)\n",
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Value,
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Multiplier,
doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Unit);
}
printf(" EVSEID: %.*s\n",
doc->V2G_Message.Body.CurrentDemandRes.EVSEID.charactersLen,
doc->V2G_Message.Body.CurrentDemandRes.EVSEID.characters);
printf(" SAScheduleTupleID: %d\n", doc->V2G_Message.Body.CurrentDemandRes.SAScheduleTupleID);
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo_isUsed) {
printf(" MeterInfo:\n");
printf(" MeterID: %.*s\n",
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.charactersLen,
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.characters);
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading_isUsed) {
printf(" MeterReading: %llu Wh\n",
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading);
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading_isUsed) {
printf(" SigMeterReading: ");
for(int i = 0; i < doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading.bytes[i]);
}
printf("\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus_isUsed) {
printf(" MeterStatus: %d\n", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus);
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter_isUsed) {
printf(" TMeter: %lld\n", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter);
}
}
if (doc->V2G_Message.Body.CurrentDemandRes.ReceiptRequired_isUsed) {
printf(" ReceiptRequired: %s\n", doc->V2G_Message.Body.CurrentDemandRes.ReceiptRequired ? "true" : "false");
}
}
else if (doc->V2G_Message.Body.WeldingDetectionReq_isUsed) {
printf(" Message Type: WeldingDetectionReq\n");
}
else if (doc->V2G_Message.Body.WeldingDetectionRes_isUsed) {
printf(" Message Type: WeldingDetectionRes\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.WeldingDetectionRes.ResponseCode);
}
else {
printf(" Message Type: Unknown or unhandled message type\n");
printf(" Debug: Checking which flags are set...\n");
// Debug output to see which flags might be set
}
}
printf("\n");
}
void print_iso2_message(struct iso2EXIDocument *doc) {
printf("=== ISO2 V2G Message ===\n");
if (doc->V2G_Message_isUsed) {
printf("Header:\n");
print_session_id(doc->V2G_Message.Header.SessionID.bytes,
doc->V2G_Message.Header.SessionID.bytesLen);
printf("\nBody:\n");
if (doc->V2G_Message.Body.SessionSetupReq_isUsed) {
printf(" Message Type: SessionSetupReq\n");
printf(" EVCCID: ");
for(size_t i = 0; i < doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i]);
}
printf(" (");
for(size_t i = 0; i < doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen; i++) {
if (doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i] >= 32 &&
doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i] <= 126) {
printf("%c", doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i]);
} else {
printf(".");
}
}
printf(")\n");
}
// Add more ISO2 message types as needed
else {
printf(" Message Type: Other ISO2 message (not fully implemented)\n");
}
}
printf("\n");
}
int main(int argc, char *argv[]) {
int xml_mode = 0;
char *filename = NULL;
if (argc == 2) {
filename = argv[1];
} else if (argc == 3 && strcmp(argv[1], "-decode") == 0) {
xml_mode = 1;
filename = argv[2];
} else {
printf("Usage: %s [-decode] input.exi\n", argv[0]);
printf("Enhanced EXI viewer with detailed message parsing\n");
printf(" -decode Output in XML format\n");
printf(" (default) Output detailed analysis\n");
return -1;
}
uint8_t buffer[BUFFER_SIZE];
bitstream_t stream;
size_t pos = 0;
int errn = 0;
struct iso1EXIDocument iso1Doc;
struct iso2EXIDocument iso2Doc;
struct dinEXIDocument dinDoc;
// Initialize documents
init_iso1EXIDocument(&iso1Doc);
init_iso2EXIDocument(&iso2Doc);
init_dinEXIDocument(&dinDoc);
// Read file
errn = readBytesFromFile(filename, buffer, BUFFER_SIZE, &pos);
if (errn != 0) {
printf("Error reading file: %s\n", filename);
return -1;
}
if (!xml_mode) {
printf("File: %s (%zu bytes)\n", filename, pos);
printf("Raw hex data: ");
for(size_t i = 0; i < (pos > 32 ? 32 : pos); i++) {
printf("%02X ", buffer[i]);
}
if (pos > 32) printf("...");
printf("\n\n");
}
// Setup stream
pos = 0; // reset position for decoding
stream.size = BUFFER_SIZE;
stream.data = buffer;
stream.pos = &pos;
stream.buffer = 0;
stream.capacity = 0;
// Try ISO1 first
pos = 0;
if (!xml_mode) printf("Trying ISO1 decoder...\n");
errn = decode_iso1ExiDocument(&stream, &iso1Doc);
if (errn == 0) {
if (!xml_mode) printf("✓ Successfully decoded as ISO1\n\n");
if (xml_mode) {
print_iso1_xml(&iso1Doc);
} else {
print_iso1_message(&iso1Doc);
}
return 0;
} else {
if (!xml_mode) printf("✗ ISO1 decode failed (error: %d)\n", errn);
}
// Try ISO2
pos = 0;
if (!xml_mode) printf("Trying ISO2 decoder...\n");
errn = decode_iso2ExiDocument(&stream, &iso2Doc);
if (errn == 0) {
if (!xml_mode) printf("✓ Successfully decoded as ISO2\n\n");
print_iso2_message(&iso2Doc);
return 0;
} else {
if (!xml_mode) printf("✗ ISO2 decode failed (error: %d)\n", errn);
}
// Try DIN
pos = 0;
if (!xml_mode) printf("Trying DIN decoder...\n");
errn = decode_dinExiDocument(&stream, &dinDoc);
if (errn == 0) {
if (!xml_mode) {
printf("✓ Successfully decoded as DIN\n\n");
printf("=== DIN V2G Message ===\n");
// Add DIN message printing as needed
}
return 0;
} else {
if (!xml_mode) printf("✗ DIN decode failed (error: %d)\n", errn);
}
if (!xml_mode) {
printf("\n❌ Could not decode EXI file with any supported codec\n");
printf("Supported formats: ISO1, ISO2, DIN\n");
}
return -1;
}

BIN
enhanced_exi_viewer.exe Normal file

Binary file not shown.

297
exi_to_xml.c Normal file
View File

@@ -0,0 +1,297 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* EXI codec headers */
#include "iso1EXIDatatypes.h"
#include "iso1EXIDatatypesDecoder.h"
#include "ByteStream.h"
#define BUFFER_SIZE 4096
void print_xml_header() {
printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
printf("<V2G_Message xmlns=\"urn:iso:15118:2:2013:MsgDef\"\n");
printf(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n");
}
void print_xml_footer() {
printf("</V2G_Message>\n");
}
void print_session_id_xml(uint8_t *bytes, size_t len) {
printf(" <SessionID>");
for(size_t i = 0; i < len; i++) {
printf("%02X", bytes[i]);
}
printf("</SessionID>\n");
}
void print_iso1_xml(struct iso1EXIDocument *doc) {
if (!doc->V2G_Message_isUsed) return;
print_xml_header();
// Header
printf(" <Header>\n");
print_session_id_xml(doc->V2G_Message.Header.SessionID.bytes,
doc->V2G_Message.Header.SessionID.bytesLen);
if (doc->V2G_Message.Header.Notification_isUsed) {
printf(" <Notification>\n");
printf(" <FaultCode>%d</FaultCode>\n", doc->V2G_Message.Header.Notification.FaultCode);
printf(" <FaultMsg>%s</FaultMsg>\n", doc->V2G_Message.Header.Notification.FaultMsg.characters);
printf(" </Notification>\n");
}
printf(" </Header>\n");
// Body
printf(" <Body>\n");
if (doc->V2G_Message.Body.SessionSetupReq_isUsed) {
printf(" <SessionSetupReq>\n");
printf(" <EVCCID>");
for(size_t i = 0; i < doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i]);
}
printf("</EVCCID>\n");
printf(" </SessionSetupReq>\n");
}
else if (doc->V2G_Message.Body.SessionSetupRes_isUsed) {
printf(" <SessionSetupRes>\n");
printf(" <ResponseCode>%d</ResponseCode>\n", doc->V2G_Message.Body.SessionSetupRes.ResponseCode);
printf(" <EVSEID>%s</EVSEID>\n", doc->V2G_Message.Body.SessionSetupRes.EVSEID.characters);
if (doc->V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed) {
printf(" <EVSETimeStamp>%ld</EVSETimeStamp>\n", doc->V2G_Message.Body.SessionSetupRes.EVSETimeStamp);
}
printf(" </SessionSetupRes>\n");
}
else if (doc->V2G_Message.Body.ServiceDiscoveryReq_isUsed) {
printf(" <ServiceDiscoveryReq/>\n");
}
else if (doc->V2G_Message.Body.ServiceDiscoveryRes_isUsed) {
printf(" <ServiceDiscoveryRes>\n");
printf(" <ResponseCode>%d</ResponseCode>\n", doc->V2G_Message.Body.ServiceDiscoveryRes.ResponseCode);
printf(" </ServiceDiscoveryRes>\n");
}
else if (doc->V2G_Message.Body.AuthorizationReq_isUsed) {
printf(" <AuthorizationReq>\n");
if (doc->V2G_Message.Body.AuthorizationReq.Id_isUsed) {
printf(" <Id>%s</Id>\n", doc->V2G_Message.Body.AuthorizationReq.Id.characters);
}
if (doc->V2G_Message.Body.AuthorizationReq.GenChallenge_isUsed) {
printf(" <GenChallenge>");
for(size_t i = 0; i < doc->V2G_Message.Body.AuthorizationReq.GenChallenge.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.AuthorizationReq.GenChallenge.bytes[i]);
}
printf("</GenChallenge>\n");
}
printf(" </AuthorizationReq>\n");
}
else if (doc->V2G_Message.Body.AuthorizationRes_isUsed) {
printf(" <AuthorizationRes>\n");
printf(" <ResponseCode>%d</ResponseCode>\n", doc->V2G_Message.Body.AuthorizationRes.ResponseCode);
printf(" <EVSEProcessing>%d</EVSEProcessing>\n", doc->V2G_Message.Body.AuthorizationRes.EVSEProcessing);
printf(" </AuthorizationRes>\n");
}
else if (doc->V2G_Message.Body.PreChargeReq_isUsed) {
printf(" <PreChargeReq>\n");
printf(" <EVTargetVoltage>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.PreChargeReq.EVTargetVoltage.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.PreChargeReq.EVTargetVoltage.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.PreChargeReq.EVTargetVoltage.Value);
printf(" </EVTargetVoltage>\n");
printf(" <EVTargetCurrent>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.PreChargeReq.EVTargetCurrent.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.PreChargeReq.EVTargetCurrent.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.PreChargeReq.EVTargetCurrent.Value);
printf(" </EVTargetCurrent>\n");
printf(" </PreChargeReq>\n");
}
else if (doc->V2G_Message.Body.PreChargeRes_isUsed) {
printf(" <PreChargeRes>\n");
printf(" <ResponseCode>%d</ResponseCode>\n", doc->V2G_Message.Body.PreChargeRes.ResponseCode);
printf(" </PreChargeRes>\n");
}
else if (doc->V2G_Message.Body.PowerDeliveryReq_isUsed) {
printf(" <PowerDeliveryReq>\n");
printf(" <ChargeProgress>%d</ChargeProgress>\n", doc->V2G_Message.Body.PowerDeliveryReq.ChargeProgress);
printf(" <SAScheduleTupleID>%d</SAScheduleTupleID>\n", doc->V2G_Message.Body.PowerDeliveryReq.SAScheduleTupleID);
printf(" </PowerDeliveryReq>\n");
}
else if (doc->V2G_Message.Body.PowerDeliveryRes_isUsed) {
printf(" <PowerDeliveryRes>\n");
printf(" <ResponseCode>%d</ResponseCode>\n", doc->V2G_Message.Body.PowerDeliveryRes.ResponseCode);
printf(" </PowerDeliveryRes>\n");
}
else if (doc->V2G_Message.Body.CurrentDemandReq_isUsed) {
printf(" <CurrentDemandReq>\n");
printf(" <EVTargetCurrent>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetCurrent.Value);
printf(" </EVTargetCurrent>\n");
printf(" <EVTargetVoltage>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVTargetVoltage.Value);
printf(" </EVTargetVoltage>\n");
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit_isUsed) {
printf(" <EVMaximumVoltageLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumVoltageLimit.Value);
printf(" </EVMaximumVoltageLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit_isUsed) {
printf(" <EVMaximumCurrentLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumCurrentLimit.Value);
printf(" </EVMaximumCurrentLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit_isUsed) {
printf(" <EVMaximumPowerLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandReq.EVMaximumPowerLimit.Value);
printf(" </EVMaximumPowerLimit>\n");
}
printf(" </CurrentDemandReq>\n");
}
else if (doc->V2G_Message.Body.CurrentDemandRes_isUsed) {
printf(" <CurrentDemandRes>\n");
printf(" <ResponseCode>%d</ResponseCode>\n", doc->V2G_Message.Body.CurrentDemandRes.ResponseCode);
printf(" <DC_EVSEStatus>\n");
printf(" <EVSENotification>%d</EVSENotification>\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSENotification);
printf(" <NotificationMaxDelay>%d</NotificationMaxDelay>\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.NotificationMaxDelay);
if (doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEIsolationStatus_isUsed) {
printf(" <EVSEIsolationStatus>%d</EVSEIsolationStatus>\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEIsolationStatus);
}
printf(" <EVSEStatusCode>%d</EVSEStatusCode>\n", doc->V2G_Message.Body.CurrentDemandRes.DC_EVSEStatus.EVSEStatusCode);
printf(" </DC_EVSEStatus>\n");
printf(" <EVSEPresentVoltage>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentVoltage.Value);
printf(" </EVSEPresentVoltage>\n");
printf(" <EVSEPresentCurrent>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPresentCurrent.Value);
printf(" </EVSEPresentCurrent>\n");
printf(" <EVSECurrentLimitAchieved>%s</EVSECurrentLimitAchieved>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSECurrentLimitAchieved ? "true" : "false");
printf(" <EVSEVoltageLimitAchieved>%s</EVSEVoltageLimitAchieved>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEVoltageLimitAchieved ? "true" : "false");
printf(" <EVSEPowerLimitAchieved>%s</EVSEPowerLimitAchieved>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEPowerLimitAchieved ? "true" : "false");
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit_isUsed) {
printf(" <EVSEMaximumVoltageLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumVoltageLimit.Value);
printf(" </EVSEMaximumVoltageLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit_isUsed) {
printf(" <EVSEMaximumCurrentLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumCurrentLimit.Value);
printf(" </EVSEMaximumCurrentLimit>\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit_isUsed) {
printf(" <EVSEMaximumPowerLimit>\n");
printf(" <Multiplier>%d</Multiplier>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Multiplier);
printf(" <Unit>%d</Unit>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Unit);
printf(" <Value>%d</Value>\n", doc->V2G_Message.Body.CurrentDemandRes.EVSEMaximumPowerLimit.Value);
printf(" </EVSEMaximumPowerLimit>\n");
}
printf(" <EVSEID>%.*s</EVSEID>\n",
doc->V2G_Message.Body.CurrentDemandRes.EVSEID.charactersLen,
doc->V2G_Message.Body.CurrentDemandRes.EVSEID.characters);
printf(" <SAScheduleTupleID>%d</SAScheduleTupleID>\n", doc->V2G_Message.Body.CurrentDemandRes.SAScheduleTupleID);
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo_isUsed) {
printf(" <MeterInfo>\n");
printf(" <MeterID>%.*s</MeterID>\n",
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.charactersLen,
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterID.characters);
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading_isUsed) {
printf(" <MeterReading>%llu</MeterReading>\n",
doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterReading);
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading_isUsed) {
printf(" <SigMeterReading>");
for(int i = 0; i < doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.SigMeterReading.bytes[i]);
}
printf("</SigMeterReading>\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus_isUsed) {
printf(" <MeterStatus>%d</MeterStatus>\n", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.MeterStatus);
}
if (doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter_isUsed) {
printf(" <TMeter>%lld</TMeter>\n", doc->V2G_Message.Body.CurrentDemandRes.MeterInfo.TMeter);
}
printf(" </MeterInfo>\n");
}
if (doc->V2G_Message.Body.CurrentDemandRes.ReceiptRequired_isUsed) {
printf(" <ReceiptRequired>%s</ReceiptRequired>\n", doc->V2G_Message.Body.CurrentDemandRes.ReceiptRequired ? "true" : "false");
}
printf(" </CurrentDemandRes>\n");
}
else if (doc->V2G_Message.Body.SessionStopReq_isUsed) {
printf(" <SessionStopReq>\n");
printf(" <ChargingSession>%d</ChargingSession>\n", doc->V2G_Message.Body.SessionStopReq.ChargingSession);
printf(" </SessionStopReq>\n");
}
else if (doc->V2G_Message.Body.SessionStopRes_isUsed) {
printf(" <SessionStopRes>\n");
printf(" <ResponseCode>%d</ResponseCode>\n", doc->V2G_Message.Body.SessionStopRes.ResponseCode);
printf(" </SessionStopRes>\n");
}
else {
printf(" <!-- Unknown message type -->\n");
}
printf(" </Body>\n");
print_xml_footer();
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s input.exi\n", argv[0]);
printf("Converts EXI files to XML format\n");
return -1;
}
uint8_t buffer[BUFFER_SIZE];
bitstream_t stream;
size_t pos = 0;
int errn = 0;
struct iso1EXIDocument iso1Doc;
init_iso1EXIDocument(&iso1Doc);
// Read file
errn = readBytesFromFile(argv[1], buffer, BUFFER_SIZE, &pos);
if (errn != 0) {
fprintf(stderr, "Error reading file: %s\n", argv[1]);
return -1;
}
// Setup stream
pos = 0; // reset position for decoding
stream.size = BUFFER_SIZE;
stream.data = buffer;
stream.pos = &pos;
stream.buffer = 0;
stream.capacity = 0;
// Try ISO1 decoder
errn = decode_iso1ExiDocument(&stream, &iso1Doc);
if (errn == 0) {
print_iso1_xml(&iso1Doc);
return 0;
} else {
fprintf(stderr, "Error: Could not decode EXI file (error: %d)\n", errn);
return -1;
}
}

BIN
exi_to_xml.exe Normal file

Binary file not shown.

197
exi_viewer.c Normal file
View File

@@ -0,0 +1,197 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* EXI codec headers */
#include "iso1EXIDatatypes.h"
#include "iso1EXIDatatypesDecoder.h"
#include "iso2EXIDatatypes.h"
#include "iso2EXIDatatypesDecoder.h"
#include "dinEXIDatatypes.h"
#include "dinEXIDatatypesDecoder.h"
#include "ByteStream.h"
#define BUFFER_SIZE 4096
void print_session_id(uint8_t *bytes, size_t len) {
printf("SessionID: ");
for(size_t i = 0; i < len; i++) {
printf("%02X", bytes[i]);
}
printf("\n");
}
void print_iso1_message(struct iso1EXIDocument *doc) {
printf("=== ISO1 V2G Message ===\n");
if (doc->V2G_Message_isUsed) {
// Print Header
printf("Header:\n");
print_session_id(doc->V2G_Message.Header.SessionID.bytes,
doc->V2G_Message.Header.SessionID.bytesLen);
if (doc->V2G_Message.Header.Notification_isUsed) {
printf("Notification: FaultCode=%d, FaultMsg=%s\n",
doc->V2G_Message.Header.Notification.FaultCode,
doc->V2G_Message.Header.Notification.FaultMsg.characters);
}
// Print Body
printf("Body:\n");
if (doc->V2G_Message.Body.SessionSetupReq_isUsed) {
printf(" SessionSetupReq:\n");
printf(" EVCCID: ");
for(size_t i = 0; i < doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen; i++) {
printf("%c", doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i]);
}
printf("\n");
}
if (doc->V2G_Message.Body.SessionSetupRes_isUsed) {
printf(" SessionSetupRes:\n");
printf(" ResponseCode: %d\n", doc->V2G_Message.Body.SessionSetupRes.ResponseCode);
printf(" EVSEID: %s\n", doc->V2G_Message.Body.SessionSetupRes.EVSEID.characters);
if (doc->V2G_Message.Body.SessionSetupRes.EVSETimeStamp_isUsed) {
printf(" EVSETimeStamp: %ld\n", doc->V2G_Message.Body.SessionSetupRes.EVSETimeStamp);
}
}
if (doc->V2G_Message.Body.ServiceDiscoveryReq_isUsed) {
printf(" ServiceDiscoveryReq:\n");
printf(" Service discovery request detected\n");
}
if (doc->V2G_Message.Body.AuthorizationReq_isUsed) {
printf(" AuthorizationReq:\n");
if (doc->V2G_Message.Body.AuthorizationReq.Id_isUsed) {
printf(" ID: %s\n", doc->V2G_Message.Body.AuthorizationReq.Id.characters);
}
if (doc->V2G_Message.Body.AuthorizationReq.GenChallenge_isUsed) {
printf(" GenChallenge: ");
for(size_t i = 0; i < doc->V2G_Message.Body.AuthorizationReq.GenChallenge.bytesLen; i++) {
printf("%02X", doc->V2G_Message.Body.AuthorizationReq.GenChallenge.bytes[i]);
}
printf("\n");
}
}
if (doc->V2G_Message.Body.PowerDeliveryReq_isUsed) {
printf(" PowerDeliveryReq:\n");
printf(" ChargeProgress: %d\n", doc->V2G_Message.Body.PowerDeliveryReq.ChargeProgress);
printf(" SAScheduleTupleID: %d\n", doc->V2G_Message.Body.PowerDeliveryReq.SAScheduleTupleID);
}
if (doc->V2G_Message.Body.SessionStopReq_isUsed) {
printf(" SessionStopReq:\n");
printf(" ChargingSession: %d\n", doc->V2G_Message.Body.SessionStopReq.ChargingSession);
}
// Add more message types as needed
}
printf("\n");
}
void print_iso2_message(struct iso2EXIDocument *doc) {
printf("=== ISO2 V2G Message ===\n");
if (doc->V2G_Message_isUsed) {
printf("Header:\n");
print_session_id(doc->V2G_Message.Header.SessionID.bytes,
doc->V2G_Message.Header.SessionID.bytesLen);
printf("Body:\n");
if (doc->V2G_Message.Body.SessionSetupReq_isUsed) {
printf(" SessionSetupReq:\n");
printf(" EVCCID: ");
for(size_t i = 0; i < doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytesLen; i++) {
printf("%c", doc->V2G_Message.Body.SessionSetupReq.EVCCID.bytes[i]);
}
printf("\n");
}
// Add more ISO2-specific message types as needed
}
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s input.exi\n", argv[0]);
printf("This tool decodes and displays the content of EXI files\n");
return -1;
}
uint8_t buffer[BUFFER_SIZE];
bitstream_t stream;
size_t pos = 0;
int errn = 0;
struct iso1EXIDocument iso1Doc;
struct iso2EXIDocument iso2Doc;
struct dinEXIDocument dinDoc;
// Read file
errn = readBytesFromFile(argv[1], buffer, BUFFER_SIZE, &pos);
if (errn != 0) {
printf("Error reading file: %s\n", argv[1]);
return -1;
}
printf("File: %s (%zu bytes)\n", argv[1], pos);
printf("Raw hex data: ");
for(size_t i = 0; i < (pos > 32 ? 32 : pos); i++) {
printf("%02X ", buffer[i]);
}
if (pos > 32) printf("...");
printf("\n\n");
// Setup stream
pos = 0; // reset position for decoding
stream.size = BUFFER_SIZE;
stream.data = buffer;
stream.pos = &pos;
stream.buffer = 0;
stream.capacity = 0;
// Try ISO1 first
pos = 0;
printf("Trying ISO1 decoder...\n");
errn = decode_iso1ExiDocument(&stream, &iso1Doc);
if (errn == 0) {
printf("✓ Successfully decoded as ISO1\n");
print_iso1_message(&iso1Doc);
return 0;
} else {
printf("✗ ISO1 decode failed (error: %d)\n", errn);
}
// Try ISO2
pos = 0;
printf("Trying ISO2 decoder...\n");
errn = decode_iso2ExiDocument(&stream, &iso2Doc);
if (errn == 0) {
printf("✓ Successfully decoded as ISO2\n");
print_iso2_message(&iso2Doc);
return 0;
} else {
printf("✗ ISO2 decode failed (error: %d)\n", errn);
}
// Try DIN
pos = 0;
printf("Trying DIN decoder...\n");
errn = decode_dinExiDocument(&stream, &dinDoc);
if (errn == 0) {
printf("✓ Successfully decoded as DIN\n");
printf("=== DIN V2G Message ===\n");
// Add DIN message printing as needed
return 0;
} else {
printf("✗ DIN decode failed (error: %d)\n", errn);
}
printf("\n❌ Could not decode EXI file with any supported codec\n");
printf("Supported formats: ISO1, ISO2, DIN\n");
return -1;
}

BIN
exi_viewer.exe Normal file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More