updated printer profile
@ -1,122 +1,122 @@
|
||||
<?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.toolchain.gnu.cross.base.1504376676">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.cross.base.1504376676" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings>
|
||||
<externalSetting>
|
||||
<entry flags="RESOLVED" kind="includePath" name="C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\variants\nano_zero"/>
|
||||
<entry flags="RESOLVED" kind="includePath" name="C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\cores\arduino"/>
|
||||
</externalSetting>
|
||||
</externalSettings>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" 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.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="cdt.managedbuild.toolchain.gnu.cross.base.1504376676" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
|
||||
<folderInfo id="cdt.managedbuild.toolchain.gnu.cross.base.1504376676.350447049" name="/" resourcePath="">
|
||||
<toolChain id="cdt.managedbuild.toolchain.gnu.cross.base.515513271" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.base">
|
||||
<option id="cdt.managedbuild.option.gnu.cross.prefix.582370251" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix"/>
|
||||
<option id="cdt.managedbuild.option.gnu.cross.path.231717393" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path"/>
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1339435354" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
|
||||
<builder id="cdt.managedbuild.builder.gnu.cross.241627781" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross">
|
||||
<outputEntries/>
|
||||
</builder>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.c.compiler.1805317535" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
|
||||
<option id="gnu.c.compiler.option.include.paths.1641555759" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\variants\nano_zero""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit_SSD1306-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit-GFX-Library-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\pio""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\instance""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\component""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\cores\arduino""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\TSTERN\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.6\libraries\SPI""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\CMSIS\include""/>
|
||||
</option>
|
||||
<option id="gnu.c.compiler.option.preprocessor.def.symbols.77778103" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="ARDUINO_SAMD_ZERO"/>
|
||||
<listOptionValue builtIn="false" value="__SAMD21G18A__"/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1328245026" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1543385682" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
|
||||
<option id="gnu.cpp.compiler.option.include.paths.784350866" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\cores\arduino""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\variants\nano_zero""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit_SSD1306-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit-GFX-Library-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\pio""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\instance""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\component""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\TSTERN\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.6\libraries\SPI""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\CMSIS\include""/>
|
||||
</option>
|
||||
<option id="gnu.cpp.compiler.option.preprocessor.def.215333140" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__SAMD21G18A__"/>
|
||||
<listOptionValue builtIn="false" value="ARDUINO_SAMD_ZERO"/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1198492994" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1644022969" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1373326859" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
|
||||
<option id="gnu.cpp.link.option.paths.1624146493" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1257879712" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.archiver.722380566" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.assembler.7579640" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
|
||||
<option id="gnu.both.asm.option.include.paths.2128933212" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\variants\nano_zero""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit_SSD1306-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit-GFX-Library-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\pio""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\instance""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\component""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\cores\arduino""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\TSTERN\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.6\libraries\SPI""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\CMSIS\Include""/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.474088881" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry excluding="Adafruit-GFX-Library-master|Adafruit_SSD1306-master" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
<storageModule moduleId="ilg.gnuarmeclipse.managedbuild.packs"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="NZS.null.440051529" name="NZS"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.cross.base.1504376676;cdt.managedbuild.toolchain.gnu.cross.base.1504376676.350447049;cdt.managedbuild.tool.gnu.cross.c.compiler.1805317535;cdt.managedbuild.tool.gnu.c.compiler.input.1328245026">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.cross.base.1504376676;cdt.managedbuild.toolchain.gnu.cross.base.1504376676.350447049;cdt.managedbuild.tool.gnu.cross.cpp.compiler.1543385682;cdt.managedbuild.tool.gnu.cpp.compiler.input.1198492994">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="refreshScope"/>
|
||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||
</cproject>
|
||||
<?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.toolchain.gnu.cross.base.1504376676">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.cross.base.1504376676" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings>
|
||||
<externalSetting>
|
||||
<entry flags="RESOLVED" kind="includePath" name="C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\variants\nano_zero"/>
|
||||
<entry flags="RESOLVED" kind="includePath" name="C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\cores\arduino"/>
|
||||
</externalSetting>
|
||||
</externalSettings>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" 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.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="cdt.managedbuild.toolchain.gnu.cross.base.1504376676" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
|
||||
<folderInfo id="cdt.managedbuild.toolchain.gnu.cross.base.1504376676.350447049" name="/" resourcePath="">
|
||||
<toolChain id="cdt.managedbuild.toolchain.gnu.cross.base.515513271" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.base">
|
||||
<option id="cdt.managedbuild.option.gnu.cross.prefix.582370251" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix"/>
|
||||
<option id="cdt.managedbuild.option.gnu.cross.path.231717393" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path"/>
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.1339435354" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
|
||||
<builder id="cdt.managedbuild.builder.gnu.cross.241627781" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross">
|
||||
<outputEntries/>
|
||||
</builder>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.c.compiler.1805317535" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
|
||||
<option id="gnu.c.compiler.option.include.paths.1641555759" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\variants\nano_zero""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit_SSD1306-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit-GFX-Library-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\pio""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\instance""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\component""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\cores\arduino""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\TSTERN\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.6\libraries\SPI""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\CMSIS\include""/>
|
||||
</option>
|
||||
<option id="gnu.c.compiler.option.preprocessor.def.symbols.77778103" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="ARDUINO_SAMD_ZERO"/>
|
||||
<listOptionValue builtIn="false" value="__SAMD21G18A__"/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1328245026" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.1543385682" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
|
||||
<option id="gnu.cpp.compiler.option.include.paths.784350866" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\cores\arduino""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\variants\nano_zero""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit_SSD1306-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit-GFX-Library-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\pio""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\instance""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\component""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\TSTERN\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.6\libraries\SPI""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\CMSIS\include""/>
|
||||
</option>
|
||||
<option id="gnu.cpp.compiler.option.preprocessor.def.215333140" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||
<listOptionValue builtIn="false" value="__SAMD21G18A__"/>
|
||||
<listOptionValue builtIn="false" value="ARDUINO_SAMD_ZERO"/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1198492994" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1644022969" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1373326859" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
|
||||
<option id="gnu.cpp.link.option.paths.1624146493" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1257879712" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.archiver.722380566" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cross.assembler.7579640" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
|
||||
<option id="gnu.both.asm.option.include.paths.2128933212" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\variants\nano_zero""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit_SSD1306-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\Documents\Arduino\libraries\Adafruit-GFX-Library-master""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\pio""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\instance""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL\samd21\include\component""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\misfittech\hardware\samd\1.0.0\cores\arduino""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\Device\ATMEL""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\TSTERN\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.6\libraries\SPI""/>
|
||||
<listOptionValue builtIn="false" value=""C:\Users\tstern\AppData\Local\Arduino15\packages\arduino\tools\CMSIS\4.0.0-atmel\CMSIS\Include""/>
|
||||
</option>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.474088881" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry excluding="Adafruit-GFX-Library-master|Adafruit_SSD1306-master" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
<storageModule moduleId="ilg.gnuarmeclipse.managedbuild.packs"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="NZS.null.440051529" name="NZS"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.cross.base.1504376676;cdt.managedbuild.toolchain.gnu.cross.base.1504376676.350447049;cdt.managedbuild.tool.gnu.cross.c.compiler.1805317535;cdt.managedbuild.tool.gnu.c.compiler.input.1328245026">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.cross.base.1504376676;cdt.managedbuild.toolchain.gnu.cross.base.1504376676.350447049;cdt.managedbuild.tool.gnu.cross.cpp.compiler.1543385682;cdt.managedbuild.tool.gnu.cpp.compiler.input.1198492994">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="refreshScope"/>
|
||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||
</cproject>
|
||||
|
@ -1,34 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>NZS</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
<linkedResources>
|
||||
<link>
|
||||
<name>arduino</name>
|
||||
<type>2</type>
|
||||
<location>C:/Users/tramp_000/AppData/Local/Arduino15/packages/arduino/hardware/samd/1.6.8/cores/arduino</location>
|
||||
</link>
|
||||
</linkedResources>
|
||||
</projectDescription>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>NZS</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
<linkedResources>
|
||||
<link>
|
||||
<name>arduino</name>
|
||||
<type>2</type>
|
||||
<location>C:/Users/tramp_000/AppData/Local/Arduino15/packages/arduino/hardware/samd/1.6.8/cores/arduino</location>
|
||||
</link>
|
||||
</linkedResources>
|
||||
</projectDescription>
|
||||
|
@ -1,152 +1,152 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2019 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
#include "A1333.h"
|
||||
#include "SPI.h"
|
||||
#include <stdio.h>
|
||||
#include "board.h"
|
||||
|
||||
|
||||
#define A1333_CMD_NOP (0x0000)
|
||||
#define A1333_ANG15 (0x3200)
|
||||
|
||||
SPISettings settingsA(500000, MSBFIRST, SPI_MODE3); ///400000, MSBFIRST, SPI_MODE1);
|
||||
|
||||
boolean A1333::begin(int csPin)
|
||||
{
|
||||
|
||||
digitalWrite(PIN_AS5047D_CS,LOW); //pull CS LOW by default (chip powered off)
|
||||
digitalWrite(PIN_MOSI,LOW);
|
||||
digitalWrite(PIN_SCK,LOW);
|
||||
digitalWrite(PIN_MISO,LOW);
|
||||
pinMode(PIN_MISO,OUTPUT);
|
||||
delay(1000);
|
||||
|
||||
|
||||
digitalWrite(PIN_AS5047D_CS,HIGH); //pull CS high
|
||||
|
||||
pinMode(PIN_MISO,INPUT);
|
||||
|
||||
|
||||
chipSelectPin=csPin;
|
||||
|
||||
LOG("csPin is %d",csPin);
|
||||
pinMode(chipSelectPin,OUTPUT);
|
||||
digitalWrite(chipSelectPin,HIGH); //pull CS high by default
|
||||
delay(1);
|
||||
|
||||
SPI.begin(); //AS5047D SPI uses mode=1 (CPOL=0, CPHA=1)
|
||||
|
||||
LOG("Begin A1333...");
|
||||
|
||||
LOG("Address is 0x%04X",readAddress(A1333_ANG15));
|
||||
}
|
||||
|
||||
|
||||
//read the encoders
|
||||
int16_t A1333::readAddress(uint16_t addr)
|
||||
{
|
||||
uint16_t data;
|
||||
//make sure it is a write by setting bit 14
|
||||
//addr=addr | 0x4000;
|
||||
|
||||
SPI.beginTransaction(settingsA);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out the address to read
|
||||
//LOG("address 0x%04X",addr);
|
||||
SPI.transfer16(addr);
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
delayMicroseconds(1);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
//clock out zeros to read in the data from address
|
||||
data=SPI.transfer16(0x00);
|
||||
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
SPI.endTransaction();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
//read the encoders
|
||||
int16_t A1333::readEncoderAngle(void)
|
||||
{
|
||||
|
||||
return readAddress(A1333_ANG15)>>1;
|
||||
}
|
||||
|
||||
int16_t A1333::readEncoderAnglePipeLineRead(void)
|
||||
{
|
||||
static bool first=true;
|
||||
uint16_t addr = A1333_ANG15;
|
||||
uint16_t addr2;
|
||||
uint16_t data;
|
||||
|
||||
if (first)
|
||||
{
|
||||
//make sure it is a write by setting bit 14
|
||||
//addr2=addr | 0x4000;
|
||||
SPI.beginTransaction(settingsA);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out the address to read
|
||||
SPI.transfer16(addr);
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
delayMicroseconds(1);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out zeros to read in the data from address
|
||||
data=SPI.transfer16(addr);
|
||||
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
SPI.endTransaction();
|
||||
first=false;
|
||||
return data>>1;
|
||||
}
|
||||
|
||||
SPI.beginTransaction(settingsA);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out zeros to read in the data from address
|
||||
data=SPI.transfer16(addr);
|
||||
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
SPI.endTransaction();
|
||||
return data>>1;
|
||||
}
|
||||
/**********************************************************************
|
||||
Copyright (C) 2019 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
#include "A1333.h"
|
||||
#include "SPI.h"
|
||||
#include <stdio.h>
|
||||
#include "board.h"
|
||||
|
||||
|
||||
#define A1333_CMD_NOP (0x0000)
|
||||
#define A1333_ANG15 (0x3200)
|
||||
|
||||
SPISettings settingsA(500000, MSBFIRST, SPI_MODE3); ///400000, MSBFIRST, SPI_MODE1);
|
||||
|
||||
boolean A1333::begin(int csPin)
|
||||
{
|
||||
|
||||
digitalWrite(PIN_AS5047D_CS,LOW); //pull CS LOW by default (chip powered off)
|
||||
digitalWrite(PIN_MOSI,LOW);
|
||||
digitalWrite(PIN_SCK,LOW);
|
||||
digitalWrite(PIN_MISO,LOW);
|
||||
pinMode(PIN_MISO,OUTPUT);
|
||||
delay(1000);
|
||||
|
||||
|
||||
digitalWrite(PIN_AS5047D_CS,HIGH); //pull CS high
|
||||
|
||||
pinMode(PIN_MISO,INPUT);
|
||||
|
||||
|
||||
chipSelectPin=csPin;
|
||||
|
||||
LOG("csPin is %d",csPin);
|
||||
pinMode(chipSelectPin,OUTPUT);
|
||||
digitalWrite(chipSelectPin,HIGH); //pull CS high by default
|
||||
delay(1);
|
||||
|
||||
SPI.begin(); //AS5047D SPI uses mode=1 (CPOL=0, CPHA=1)
|
||||
|
||||
LOG("Begin A1333...");
|
||||
|
||||
LOG("Address is 0x%04X",readAddress(A1333_ANG15));
|
||||
}
|
||||
|
||||
|
||||
//read the encoders
|
||||
int16_t A1333::readAddress(uint16_t addr)
|
||||
{
|
||||
uint16_t data;
|
||||
//make sure it is a write by setting bit 14
|
||||
//addr=addr | 0x4000;
|
||||
|
||||
SPI.beginTransaction(settingsA);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out the address to read
|
||||
//LOG("address 0x%04X",addr);
|
||||
SPI.transfer16(addr);
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
delayMicroseconds(1);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
//clock out zeros to read in the data from address
|
||||
data=SPI.transfer16(0x00);
|
||||
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
SPI.endTransaction();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
//read the encoders
|
||||
int16_t A1333::readEncoderAngle(void)
|
||||
{
|
||||
|
||||
return readAddress(A1333_ANG15)>>1;
|
||||
}
|
||||
|
||||
int16_t A1333::readEncoderAnglePipeLineRead(void)
|
||||
{
|
||||
static bool first=true;
|
||||
uint16_t addr = A1333_ANG15;
|
||||
uint16_t addr2;
|
||||
uint16_t data;
|
||||
|
||||
if (first)
|
||||
{
|
||||
//make sure it is a write by setting bit 14
|
||||
//addr2=addr | 0x4000;
|
||||
SPI.beginTransaction(settingsA);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out the address to read
|
||||
SPI.transfer16(addr);
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
delayMicroseconds(1);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out zeros to read in the data from address
|
||||
data=SPI.transfer16(addr);
|
||||
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
SPI.endTransaction();
|
||||
first=false;
|
||||
return data>>1;
|
||||
}
|
||||
|
||||
SPI.beginTransaction(settingsA);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out zeros to read in the data from address
|
||||
data=SPI.transfer16(addr);
|
||||
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
SPI.endTransaction();
|
||||
return data>>1;
|
||||
}
|
||||
|
@ -1,59 +1,59 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2019 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef A1333_H_
|
||||
#define A1333_H_
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
#define A1333_DEGREES_PER_BIT (360.0/(float)(0x7FFF))
|
||||
|
||||
class A1333 {
|
||||
private:
|
||||
int chipSelectPin;
|
||||
public:
|
||||
boolean begin(int csPin);
|
||||
int16_t readEncoderAngle(void);
|
||||
int16_t readAddress(uint16_t addr);
|
||||
int16_t readEncoderAnglePipeLineRead(void);
|
||||
void diagnostics(char *ptrStr) {return;};
|
||||
bool getError(void) {return false;};
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* A1333_H_ */
|
||||
/**********************************************************************
|
||||
Copyright (C) 2019 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef A1333_H_
|
||||
#define A1333_H_
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
#define A1333_DEGREES_PER_BIT (360.0/(float)(0x7FFF))
|
||||
|
||||
class A1333 {
|
||||
private:
|
||||
int chipSelectPin;
|
||||
public:
|
||||
boolean begin(int csPin);
|
||||
int16_t readEncoderAngle(void);
|
||||
int16_t readAddress(uint16_t addr);
|
||||
int16_t readEncoderAnglePipeLineRead(void);
|
||||
void diagnostics(char *ptrStr) {return;};
|
||||
bool getError(void) {return false;};
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* A1333_H_ */
|
||||
|
@ -1,412 +1,412 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "A4954.h"
|
||||
#include "wiring_private.h"
|
||||
#include "syslog.h"
|
||||
#include "angle.h"
|
||||
#include "Arduino.h"
|
||||
#include "sine.h"
|
||||
|
||||
static uint8_t pinState=0;
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-Ofast")
|
||||
|
||||
|
||||
|
||||
|
||||
#define DAC_MAX (0x01FFL)
|
||||
// Wait for synchronization of registers between the clock domains
|
||||
static __inline__ void syncTCC(Tcc* TCCx) __attribute__((always_inline, unused));
|
||||
static void syncTCC(Tcc* TCCx) {
|
||||
//int32_t t0=1000;
|
||||
while (TCCx->SYNCBUSY.reg & TCC_SYNCBUSY_MASK)
|
||||
{
|
||||
// t0--;
|
||||
// if (t0==0)
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
// delay(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline void bridge1(int state)
|
||||
{
|
||||
if (state==0)
|
||||
{
|
||||
PORT->Group[g_APinDescription[PIN_A4954_IN1].ulPort].PINCFG[g_APinDescription[PIN_A4954_IN1].ulPin].bit.PMUXEN = 0;
|
||||
GPIO_OUTPUT(PIN_A4954_IN1);//pinMode(PIN_A4954_IN1,OUTPUT);
|
||||
GPIO_OUTPUT(PIN_A4954_IN2);//pinMode(PIN_A4954_IN2,OUTPUT);
|
||||
GPIO_HIGH(PIN_A4954_IN1);// digitalWrite(PIN_A4954_IN1, HIGH);
|
||||
GPIO_LOW(PIN_A4954_IN2);//digitalWrite(PIN_A4954_IN2, LOW);
|
||||
//pinPeripheral(PIN_A4954_IN2, PIO_TIMER_ALT);
|
||||
pinState=(pinState & 0x0C) | 0x1;
|
||||
}
|
||||
if (state==1)
|
||||
{
|
||||
PORT->Group[g_APinDescription[PIN_A4954_IN2].ulPort].PINCFG[g_APinDescription[PIN_A4954_IN2].ulPin].bit.PMUXEN = 0;
|
||||
GPIO_OUTPUT(PIN_A4954_IN2);//pinMode(PIN_A4954_IN2,OUTPUT);
|
||||
GPIO_OUTPUT(PIN_A4954_IN1);pinMode(PIN_A4954_IN1,OUTPUT);
|
||||
GPIO_LOW(PIN_A4954_IN1);//digitalWrite(PIN_A4954_IN1, LOW);
|
||||
GPIO_HIGH(PIN_A4954_IN2);//digitalWrite(PIN_A4954_IN2, HIGH);
|
||||
//pinPeripheral(PIN_A4954_IN1, PIO_TIMER);
|
||||
pinState=(pinState & 0x0C) | 0x2;
|
||||
}
|
||||
if (state==3)
|
||||
{
|
||||
GPIO_LOW(PIN_A4954_IN1);
|
||||
GPIO_LOW(PIN_A4954_IN2);
|
||||
//digitalWrite(PIN_A4954_IN1, LOW);
|
||||
//digitalWrite(PIN_A4954_IN2, LOW);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void bridge2(int state)
|
||||
{
|
||||
if (state==0)
|
||||
{
|
||||
PORT->Group[g_APinDescription[PIN_A4954_IN3].ulPort].PINCFG[g_APinDescription[PIN_A4954_IN3].ulPin].bit.PMUXEN = 0;
|
||||
GPIO_OUTPUT(PIN_A4954_IN3); //pinMode(PIN_A4954_IN3,OUTPUT);
|
||||
GPIO_OUTPUT(PIN_A4954_IN4);//pinMode(PIN_A4954_IN4,OUTPUT);
|
||||
GPIO_HIGH(PIN_A4954_IN3);//digitalWrite(PIN_A4954_IN3, HIGH);
|
||||
GPIO_LOW(PIN_A4954_IN4);//digitalWrite(PIN_A4954_IN4, LOW);
|
||||
//pinPeripheral(PIN_A4954_IN4, PIO_TIMER_ALT);
|
||||
pinState=(pinState & 0x03) | 0x4;
|
||||
}
|
||||
if (state==1)
|
||||
{
|
||||
PORT->Group[g_APinDescription[PIN_A4954_IN4].ulPort].PINCFG[g_APinDescription[PIN_A4954_IN4].ulPin].bit.PMUXEN = 0;
|
||||
GPIO_OUTPUT(PIN_A4954_IN4);//pinMode(PIN_A4954_IN4,OUTPUT);
|
||||
GPIO_OUTPUT(PIN_A4954_IN3);//pinMode(PIN_A4954_IN3,OUTPUT);
|
||||
GPIO_LOW(PIN_A4954_IN3);//digitalWrite(PIN_A4954_IN3, LOW);
|
||||
GPIO_HIGH(PIN_A4954_IN4);//digitalWrite(PIN_A4954_IN4, HIGH);
|
||||
//pinPeripheral(PIN_A4954_IN3, PIO_TIMER_ALT);
|
||||
pinState=(pinState & 0x03) | 0x8;
|
||||
}
|
||||
if (state==3)
|
||||
{
|
||||
GPIO_LOW(PIN_A4954_IN3);
|
||||
GPIO_LOW(PIN_A4954_IN4);
|
||||
//digitalWrite(PIN_A4954_IN3, LOW);
|
||||
//digitalWrite(PIN_A4954_IN4, LOW);
|
||||
}
|
||||
}
|
||||
|
||||
static void enableTCC0(uint8_t percent)
|
||||
{
|
||||
#ifdef MECHADUINO_HARDWARE
|
||||
return;
|
||||
#else
|
||||
Tcc* TCCx = TCC0 ;
|
||||
|
||||
|
||||
uint32_t ulValue=((uint32_t)(100-percent)*480)/100;
|
||||
//ERROR("Enable TCC0");
|
||||
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC0_TCC1 )) ;
|
||||
|
||||
while ( GCLK->STATUS.bit.SYNCBUSY == 1 ) ;
|
||||
|
||||
//ERROR("Setting TCC %d %d",ulValue,ulPin);
|
||||
TCCx->CTRLA.reg &= ~TCC_CTRLA_ENABLE;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx as normal PWM
|
||||
TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx in waveform mode Normal PWM
|
||||
TCCx->CC[1].reg = (uint32_t)ulValue; //ch5 //IN3
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[2].reg = (uint32_t)ulValue; //ch6 //IN4
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[3].reg = (uint32_t)ulValue; //ch7 //IN2
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[1].reg = (uint32_t)ulValue; //ch1 == ch5 //IN1
|
||||
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set PER to maximum counter value (resolution : 0xFF)
|
||||
TCCx->PER.reg = DAC_MAX;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Enable TCCx
|
||||
TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ;
|
||||
syncTCC(TCCx);
|
||||
//ERROR("Enable TCC0 DONE");
|
||||
#endif
|
||||
}
|
||||
|
||||
static void setDAC(uint32_t DAC1, uint32_t DAC2)
|
||||
{
|
||||
TCC1->CC[1].reg = (uint32_t)DAC1; //D9 PA07 - VREF12
|
||||
syncTCC(TCC1);
|
||||
TCC1->CC[0].reg = (uint32_t)DAC2; //D4 - VREF34
|
||||
syncTCC(TCC1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void setupDAC(void)
|
||||
{
|
||||
Tcc* TCCx = TCC1 ;
|
||||
|
||||
|
||||
pinPeripheral(PIN_A4954_VREF34, PIO_TIMER_ALT);
|
||||
pinPeripheral(PIN_A4954_VREF12, PIO_TIMER);
|
||||
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC0_TCC1 )) ;
|
||||
|
||||
while ( GCLK->STATUS.bit.SYNCBUSY == 1 ) ;
|
||||
|
||||
//ERROR("Setting TCC %d %d",ulValue,ulPin);
|
||||
TCCx->CTRLA.reg &= ~TCC_CTRLA_ENABLE;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx as normal PWM
|
||||
TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx in waveform mode Normal PWM
|
||||
TCCx->CC[1].reg = (uint32_t)0;
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[0].reg = (uint32_t)0;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set PER to maximum counter value (resolution : 0xFFF = 12 bits)
|
||||
// =48e6/2^12=11kHz frequency
|
||||
TCCx->PER.reg = DAC_MAX;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Enable TCCx
|
||||
TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ;
|
||||
syncTCC(TCCx);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void A4954::begin()
|
||||
{
|
||||
//setup the A4954 pins
|
||||
digitalWrite(PIN_A4954_IN3,LOW);
|
||||
pinMode(PIN_A4954_IN3,OUTPUT);
|
||||
digitalWrite(PIN_A4954_IN4,LOW);
|
||||
pinMode(PIN_A4954_IN4,OUTPUT);
|
||||
digitalWrite(PIN_A4954_IN2,LOW);
|
||||
pinMode(PIN_A4954_IN2,OUTPUT);
|
||||
digitalWrite(PIN_A4954_IN1,LOW);
|
||||
pinMode(PIN_A4954_IN1,OUTPUT);
|
||||
|
||||
//setup the PWM for current on the A4954, set for low current
|
||||
digitalWrite(PIN_A4954_VREF12,LOW);
|
||||
digitalWrite(PIN_A4954_VREF34,LOW);
|
||||
pinMode(PIN_A4954_VREF34, OUTPUT);
|
||||
pinMode(PIN_A4954_VREF12, OUTPUT);
|
||||
|
||||
enabled=true;
|
||||
lastStepMicros=0;
|
||||
forwardRotation=true;
|
||||
|
||||
enableTCC0(90);
|
||||
setupDAC();
|
||||
//
|
||||
// int i=0;
|
||||
// bridge1(0);
|
||||
// bridge2(0);
|
||||
//while (1)
|
||||
// {
|
||||
// int32_t x;
|
||||
// WARNING("MA %d",i);
|
||||
// x=(int32_t)((int64_t)i*(DAC_MAX))/3300;
|
||||
// setDAC(x,x);
|
||||
// delay(1000);
|
||||
// i=i+10;
|
||||
// if (i>1000)
|
||||
// {
|
||||
// i=0;
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
//
|
||||
// WARNING("Setting DAC for 500mA output");
|
||||
// setDAC((int32_t)((int64_t)1000*(DAC_MAX))/3300,(int32_t)((int64_t)1000*(DAC_MAX))/3300);
|
||||
// bridge1(0);
|
||||
// bridge2(0);
|
||||
// while(1)
|
||||
// {
|
||||
//
|
||||
// }
|
||||
return;
|
||||
}
|
||||
|
||||
void A4954::limitCurrent(uint8_t percent)
|
||||
{
|
||||
#ifdef MECHADUINO_HARDWARE
|
||||
return;
|
||||
#else
|
||||
//WARNING("current limit %d",percent);
|
||||
enableTCC0(percent);
|
||||
if (pinState & 0x01)
|
||||
{
|
||||
pinPeripheral(PIN_A4954_IN2, PIO_TIMER_ALT); //TCC0 WO[7]
|
||||
}
|
||||
if (pinState & 0x02)
|
||||
{
|
||||
pinPeripheral(PIN_A4954_IN1, PIO_TIMER); //TCC0 WO[1]
|
||||
}
|
||||
if (pinState & 0x04)
|
||||
{
|
||||
pinPeripheral(PIN_A4954_IN4, PIO_TIMER_ALT);
|
||||
}
|
||||
if (pinState & 0x08)
|
||||
{
|
||||
pinPeripheral(PIN_A4954_IN3, PIO_TIMER_ALT);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void A4954::enable(bool enable)
|
||||
{
|
||||
enabled=enable;
|
||||
if (enabled == false)
|
||||
{
|
||||
WARNING("A4954 disabled");
|
||||
setDAC(0,0); //turn current off
|
||||
bridge1(3); //tri state bridge outputs
|
||||
bridge2(3); //tri state bridge outputs
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//this is precise move and modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
// stepAngle is in A4954_NUM_MICROSTEPS units..
|
||||
// The A4954 has no idea where the motor is, so the calling function has to
|
||||
// to tell the A4954 what phase to drive motor coils.
|
||||
// A4954_NUM_MICROSTEPS is 256 by default so stepAngle of 1024 is 360 degrees
|
||||
// Note you can only move up to +/-A4954_NUM_MICROSTEPS from where you
|
||||
// currently are.
|
||||
int32_t A4954::move(int32_t stepAngle, uint32_t mA)
|
||||
{
|
||||
uint16_t angle;
|
||||
int32_t cos,sin;
|
||||
int32_t dacSin,dacCos;
|
||||
//static int i=0;
|
||||
|
||||
if (enabled == false)
|
||||
{
|
||||
//WARNING("A4954 disabled");
|
||||
setDAC(0,0); //turn current off
|
||||
bridge1(3); //tri state bridge outputs
|
||||
bridge2(3); //tri state bridge outputs
|
||||
return stepAngle;
|
||||
}
|
||||
|
||||
//WARNING("move %d %d",stepAngle,mA);
|
||||
//handle roll overs, could do with modulo operator
|
||||
stepAngle=stepAngle%SINE_STEPS;
|
||||
|
||||
//figure out our sine Angle
|
||||
// note our SINE_STEPS is 4x of microsteps for a reason
|
||||
//angle=(stepAngle+(SINE_STEPS/8)) % SINE_STEPS;
|
||||
angle=(stepAngle);
|
||||
|
||||
//calculate the sine and cosine of our angle
|
||||
sin=sine(angle);
|
||||
cos=cosine(angle);
|
||||
|
||||
//if we are reverse swap the sign of one of the angels
|
||||
if (false == forwardRotation)
|
||||
{
|
||||
cos=-cos;
|
||||
}
|
||||
|
||||
//scale sine result by current(mA)
|
||||
dacSin=((int32_t)mA*(int64_t)abs(sin))/SINE_MAX;
|
||||
|
||||
//scale cosine result by current(mA)
|
||||
dacCos=((int32_t)mA*(int64_t)abs(cos))/SINE_MAX;
|
||||
|
||||
// if (i==0)
|
||||
// {
|
||||
// WARNING("dacs are %d %d",dacSin,dacCos);
|
||||
// }
|
||||
|
||||
//convert value into DAC scaled to 3300mA max
|
||||
dacCos=(int32_t)((int64_t)dacCos*(DAC_MAX))/3300;
|
||||
//convert value into DAC scaled to 3300mA max
|
||||
dacSin=(int32_t)((int64_t)dacSin*(DAC_MAX))/3300;
|
||||
|
||||
//WARNING("dacs are %d %d ",dacSin,dacCos);
|
||||
|
||||
setDAC(dacSin,dacCos);
|
||||
|
||||
if (sin>0)
|
||||
{
|
||||
bridge1(1);
|
||||
}else
|
||||
{
|
||||
bridge1(0);
|
||||
}
|
||||
if (cos>0)
|
||||
{
|
||||
bridge2(1);
|
||||
}else
|
||||
{
|
||||
bridge2(0);
|
||||
}
|
||||
|
||||
// if (i++>3000)
|
||||
// {
|
||||
// i=0;
|
||||
// }
|
||||
// YELLOW_LED(led);
|
||||
// led=(led+1) & 0x01;
|
||||
lastStepMicros=micros();
|
||||
return stepAngle;
|
||||
}
|
||||
#pragma GCC pop_options
|
||||
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "A4954.h"
|
||||
#include "wiring_private.h"
|
||||
#include "syslog.h"
|
||||
#include "angle.h"
|
||||
#include "Arduino.h"
|
||||
#include "sine.h"
|
||||
|
||||
static uint8_t pinState=0;
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-Ofast")
|
||||
|
||||
|
||||
|
||||
|
||||
#define DAC_MAX (0x01FFL)
|
||||
// Wait for synchronization of registers between the clock domains
|
||||
static __inline__ void syncTCC(Tcc* TCCx) __attribute__((always_inline, unused));
|
||||
static void syncTCC(Tcc* TCCx) {
|
||||
//int32_t t0=1000;
|
||||
while (TCCx->SYNCBUSY.reg & TCC_SYNCBUSY_MASK)
|
||||
{
|
||||
// t0--;
|
||||
// if (t0==0)
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
// delay(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline void bridge1(int state)
|
||||
{
|
||||
if (state==0)
|
||||
{
|
||||
PORT->Group[g_APinDescription[PIN_A4954_IN1].ulPort].PINCFG[g_APinDescription[PIN_A4954_IN1].ulPin].bit.PMUXEN = 0;
|
||||
GPIO_OUTPUT(PIN_A4954_IN1);//pinMode(PIN_A4954_IN1,OUTPUT);
|
||||
GPIO_OUTPUT(PIN_A4954_IN2);//pinMode(PIN_A4954_IN2,OUTPUT);
|
||||
GPIO_HIGH(PIN_A4954_IN1);// digitalWrite(PIN_A4954_IN1, HIGH);
|
||||
GPIO_LOW(PIN_A4954_IN2);//digitalWrite(PIN_A4954_IN2, LOW);
|
||||
//pinPeripheral(PIN_A4954_IN2, PIO_TIMER_ALT);
|
||||
pinState=(pinState & 0x0C) | 0x1;
|
||||
}
|
||||
if (state==1)
|
||||
{
|
||||
PORT->Group[g_APinDescription[PIN_A4954_IN2].ulPort].PINCFG[g_APinDescription[PIN_A4954_IN2].ulPin].bit.PMUXEN = 0;
|
||||
GPIO_OUTPUT(PIN_A4954_IN2);//pinMode(PIN_A4954_IN2,OUTPUT);
|
||||
GPIO_OUTPUT(PIN_A4954_IN1);pinMode(PIN_A4954_IN1,OUTPUT);
|
||||
GPIO_LOW(PIN_A4954_IN1);//digitalWrite(PIN_A4954_IN1, LOW);
|
||||
GPIO_HIGH(PIN_A4954_IN2);//digitalWrite(PIN_A4954_IN2, HIGH);
|
||||
//pinPeripheral(PIN_A4954_IN1, PIO_TIMER);
|
||||
pinState=(pinState & 0x0C) | 0x2;
|
||||
}
|
||||
if (state==3)
|
||||
{
|
||||
GPIO_LOW(PIN_A4954_IN1);
|
||||
GPIO_LOW(PIN_A4954_IN2);
|
||||
//digitalWrite(PIN_A4954_IN1, LOW);
|
||||
//digitalWrite(PIN_A4954_IN2, LOW);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void bridge2(int state)
|
||||
{
|
||||
if (state==0)
|
||||
{
|
||||
PORT->Group[g_APinDescription[PIN_A4954_IN3].ulPort].PINCFG[g_APinDescription[PIN_A4954_IN3].ulPin].bit.PMUXEN = 0;
|
||||
GPIO_OUTPUT(PIN_A4954_IN3); //pinMode(PIN_A4954_IN3,OUTPUT);
|
||||
GPIO_OUTPUT(PIN_A4954_IN4);//pinMode(PIN_A4954_IN4,OUTPUT);
|
||||
GPIO_HIGH(PIN_A4954_IN3);//digitalWrite(PIN_A4954_IN3, HIGH);
|
||||
GPIO_LOW(PIN_A4954_IN4);//digitalWrite(PIN_A4954_IN4, LOW);
|
||||
//pinPeripheral(PIN_A4954_IN4, PIO_TIMER_ALT);
|
||||
pinState=(pinState & 0x03) | 0x4;
|
||||
}
|
||||
if (state==1)
|
||||
{
|
||||
PORT->Group[g_APinDescription[PIN_A4954_IN4].ulPort].PINCFG[g_APinDescription[PIN_A4954_IN4].ulPin].bit.PMUXEN = 0;
|
||||
GPIO_OUTPUT(PIN_A4954_IN4);//pinMode(PIN_A4954_IN4,OUTPUT);
|
||||
GPIO_OUTPUT(PIN_A4954_IN3);//pinMode(PIN_A4954_IN3,OUTPUT);
|
||||
GPIO_LOW(PIN_A4954_IN3);//digitalWrite(PIN_A4954_IN3, LOW);
|
||||
GPIO_HIGH(PIN_A4954_IN4);//digitalWrite(PIN_A4954_IN4, HIGH);
|
||||
//pinPeripheral(PIN_A4954_IN3, PIO_TIMER_ALT);
|
||||
pinState=(pinState & 0x03) | 0x8;
|
||||
}
|
||||
if (state==3)
|
||||
{
|
||||
GPIO_LOW(PIN_A4954_IN3);
|
||||
GPIO_LOW(PIN_A4954_IN4);
|
||||
//digitalWrite(PIN_A4954_IN3, LOW);
|
||||
//digitalWrite(PIN_A4954_IN4, LOW);
|
||||
}
|
||||
}
|
||||
|
||||
static void enableTCC0(uint8_t percent)
|
||||
{
|
||||
#ifdef MECHADUINO_HARDWARE
|
||||
return;
|
||||
#else
|
||||
Tcc* TCCx = TCC0 ;
|
||||
|
||||
|
||||
uint32_t ulValue=((uint32_t)(100-percent)*480)/100;
|
||||
//ERROR("Enable TCC0");
|
||||
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC0_TCC1 )) ;
|
||||
|
||||
while ( GCLK->STATUS.bit.SYNCBUSY == 1 ) ;
|
||||
|
||||
//ERROR("Setting TCC %d %d",ulValue,ulPin);
|
||||
TCCx->CTRLA.reg &= ~TCC_CTRLA_ENABLE;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx as normal PWM
|
||||
TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx in waveform mode Normal PWM
|
||||
TCCx->CC[1].reg = (uint32_t)ulValue; //ch5 //IN3
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[2].reg = (uint32_t)ulValue; //ch6 //IN4
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[3].reg = (uint32_t)ulValue; //ch7 //IN2
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[1].reg = (uint32_t)ulValue; //ch1 == ch5 //IN1
|
||||
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set PER to maximum counter value (resolution : 0xFF)
|
||||
TCCx->PER.reg = DAC_MAX;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Enable TCCx
|
||||
TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ;
|
||||
syncTCC(TCCx);
|
||||
//ERROR("Enable TCC0 DONE");
|
||||
#endif
|
||||
}
|
||||
|
||||
static void setDAC(uint32_t DAC1, uint32_t DAC2)
|
||||
{
|
||||
TCC1->CC[1].reg = (uint32_t)DAC1; //D9 PA07 - VREF12
|
||||
syncTCC(TCC1);
|
||||
TCC1->CC[0].reg = (uint32_t)DAC2; //D4 - VREF34
|
||||
syncTCC(TCC1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void setupDAC(void)
|
||||
{
|
||||
Tcc* TCCx = TCC1 ;
|
||||
|
||||
|
||||
pinPeripheral(PIN_A4954_VREF34, PIO_TIMER_ALT);
|
||||
pinPeripheral(PIN_A4954_VREF12, PIO_TIMER);
|
||||
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC0_TCC1 )) ;
|
||||
|
||||
while ( GCLK->STATUS.bit.SYNCBUSY == 1 ) ;
|
||||
|
||||
//ERROR("Setting TCC %d %d",ulValue,ulPin);
|
||||
TCCx->CTRLA.reg &= ~TCC_CTRLA_ENABLE;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx as normal PWM
|
||||
TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx in waveform mode Normal PWM
|
||||
TCCx->CC[1].reg = (uint32_t)0;
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[0].reg = (uint32_t)0;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set PER to maximum counter value (resolution : 0xFFF = 12 bits)
|
||||
// =48e6/2^12=11kHz frequency
|
||||
TCCx->PER.reg = DAC_MAX;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Enable TCCx
|
||||
TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ;
|
||||
syncTCC(TCCx);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void A4954::begin()
|
||||
{
|
||||
//setup the A4954 pins
|
||||
digitalWrite(PIN_A4954_IN3,LOW);
|
||||
pinMode(PIN_A4954_IN3,OUTPUT);
|
||||
digitalWrite(PIN_A4954_IN4,LOW);
|
||||
pinMode(PIN_A4954_IN4,OUTPUT);
|
||||
digitalWrite(PIN_A4954_IN2,LOW);
|
||||
pinMode(PIN_A4954_IN2,OUTPUT);
|
||||
digitalWrite(PIN_A4954_IN1,LOW);
|
||||
pinMode(PIN_A4954_IN1,OUTPUT);
|
||||
|
||||
//setup the PWM for current on the A4954, set for low current
|
||||
digitalWrite(PIN_A4954_VREF12,LOW);
|
||||
digitalWrite(PIN_A4954_VREF34,LOW);
|
||||
pinMode(PIN_A4954_VREF34, OUTPUT);
|
||||
pinMode(PIN_A4954_VREF12, OUTPUT);
|
||||
|
||||
enabled=true;
|
||||
lastStepMicros=0;
|
||||
forwardRotation=true;
|
||||
|
||||
enableTCC0(90);
|
||||
setupDAC();
|
||||
//
|
||||
// int i=0;
|
||||
// bridge1(0);
|
||||
// bridge2(0);
|
||||
//while (1)
|
||||
// {
|
||||
// int32_t x;
|
||||
// WARNING("MA %d",i);
|
||||
// x=(int32_t)((int64_t)i*(DAC_MAX))/3300;
|
||||
// setDAC(x,x);
|
||||
// delay(1000);
|
||||
// i=i+10;
|
||||
// if (i>1000)
|
||||
// {
|
||||
// i=0;
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
//
|
||||
// WARNING("Setting DAC for 500mA output");
|
||||
// setDAC((int32_t)((int64_t)1000*(DAC_MAX))/3300,(int32_t)((int64_t)1000*(DAC_MAX))/3300);
|
||||
// bridge1(0);
|
||||
// bridge2(0);
|
||||
// while(1)
|
||||
// {
|
||||
//
|
||||
// }
|
||||
return;
|
||||
}
|
||||
|
||||
void A4954::limitCurrent(uint8_t percent)
|
||||
{
|
||||
#ifdef MECHADUINO_HARDWARE
|
||||
return;
|
||||
#else
|
||||
//WARNING("current limit %d",percent);
|
||||
enableTCC0(percent);
|
||||
if (pinState & 0x01)
|
||||
{
|
||||
pinPeripheral(PIN_A4954_IN2, PIO_TIMER_ALT); //TCC0 WO[7]
|
||||
}
|
||||
if (pinState & 0x02)
|
||||
{
|
||||
pinPeripheral(PIN_A4954_IN1, PIO_TIMER); //TCC0 WO[1]
|
||||
}
|
||||
if (pinState & 0x04)
|
||||
{
|
||||
pinPeripheral(PIN_A4954_IN4, PIO_TIMER_ALT);
|
||||
}
|
||||
if (pinState & 0x08)
|
||||
{
|
||||
pinPeripheral(PIN_A4954_IN3, PIO_TIMER_ALT);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void A4954::enable(bool enable)
|
||||
{
|
||||
enabled=enable;
|
||||
if (enabled == false)
|
||||
{
|
||||
WARNING("A4954 disabled");
|
||||
setDAC(0,0); //turn current off
|
||||
bridge1(3); //tri state bridge outputs
|
||||
bridge2(3); //tri state bridge outputs
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//this is precise move and modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
// stepAngle is in A4954_NUM_MICROSTEPS units..
|
||||
// The A4954 has no idea where the motor is, so the calling function has to
|
||||
// to tell the A4954 what phase to drive motor coils.
|
||||
// A4954_NUM_MICROSTEPS is 256 by default so stepAngle of 1024 is 360 degrees
|
||||
// Note you can only move up to +/-A4954_NUM_MICROSTEPS from where you
|
||||
// currently are.
|
||||
int32_t A4954::move(int32_t stepAngle, uint32_t mA)
|
||||
{
|
||||
uint16_t angle;
|
||||
int32_t cos,sin;
|
||||
int32_t dacSin,dacCos;
|
||||
//static int i=0;
|
||||
|
||||
if (enabled == false)
|
||||
{
|
||||
//WARNING("A4954 disabled");
|
||||
setDAC(0,0); //turn current off
|
||||
bridge1(3); //tri state bridge outputs
|
||||
bridge2(3); //tri state bridge outputs
|
||||
return stepAngle;
|
||||
}
|
||||
|
||||
//WARNING("move %d %d",stepAngle,mA);
|
||||
//handle roll overs, could do with modulo operator
|
||||
stepAngle=stepAngle%SINE_STEPS;
|
||||
|
||||
//figure out our sine Angle
|
||||
// note our SINE_STEPS is 4x of microsteps for a reason
|
||||
//angle=(stepAngle+(SINE_STEPS/8)) % SINE_STEPS;
|
||||
angle=(stepAngle);
|
||||
|
||||
//calculate the sine and cosine of our angle
|
||||
sin=sine(angle);
|
||||
cos=cosine(angle);
|
||||
|
||||
//if we are reverse swap the sign of one of the angels
|
||||
if (false == forwardRotation)
|
||||
{
|
||||
cos=-cos;
|
||||
}
|
||||
|
||||
//scale sine result by current(mA)
|
||||
dacSin=((int32_t)mA*(int64_t)abs(sin))/SINE_MAX;
|
||||
|
||||
//scale cosine result by current(mA)
|
||||
dacCos=((int32_t)mA*(int64_t)abs(cos))/SINE_MAX;
|
||||
|
||||
// if (i==0)
|
||||
// {
|
||||
// WARNING("dacs are %d %d",dacSin,dacCos);
|
||||
// }
|
||||
|
||||
//convert value into DAC scaled to 3300mA max
|
||||
dacCos=(int32_t)((int64_t)dacCos*(DAC_MAX))/3300;
|
||||
//convert value into DAC scaled to 3300mA max
|
||||
dacSin=(int32_t)((int64_t)dacSin*(DAC_MAX))/3300;
|
||||
|
||||
//WARNING("dacs are %d %d ",dacSin,dacCos);
|
||||
|
||||
setDAC(dacSin,dacCos);
|
||||
|
||||
if (sin>0)
|
||||
{
|
||||
bridge1(1);
|
||||
}else
|
||||
{
|
||||
bridge1(0);
|
||||
}
|
||||
if (cos>0)
|
||||
{
|
||||
bridge2(1);
|
||||
}else
|
||||
{
|
||||
bridge2(0);
|
||||
}
|
||||
|
||||
// if (i++>3000)
|
||||
// {
|
||||
// i=0;
|
||||
// }
|
||||
// YELLOW_LED(led);
|
||||
// led=(led+1) & 0x01;
|
||||
lastStepMicros=micros();
|
||||
return stepAngle;
|
||||
}
|
||||
#pragma GCC pop_options
|
||||
|
||||
|
@ -1,90 +1,90 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2019 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __A4954__H__
|
||||
#define __A4954__H__
|
||||
#include <Arduino.h>
|
||||
#include "board.h"
|
||||
#include "angle.h"
|
||||
#include "sine.h"
|
||||
|
||||
#define A4954_NUM_MICROSTEPS (256)
|
||||
#define A4954_MIN_TIME_BETWEEN_STEPS_MICROS (1000)
|
||||
|
||||
//prevent someone for making a mistake with the code
|
||||
#if ((A4954_NUM_MICROSTEPS*4) != SINE_STEPS)
|
||||
#error "SINE_STEPS must be 4x of Micro steps for the move function"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* When it comes to the stepper driver if we use angles
|
||||
* we will always have a rounding error. For example
|
||||
* a 0-65536(360) angle for 1.8 degree step is 327.68 so
|
||||
* if you increment 200 of these as 327 you have a 13.6 error
|
||||
* after one rotation.
|
||||
* If you use floating point the effect is the same but takes longer.
|
||||
*
|
||||
* The only error-less accumulation system is to use native units, ie full
|
||||
* steps and microsteps.
|
||||
*
|
||||
*/
|
||||
|
||||
class A4954
|
||||
{
|
||||
private:
|
||||
uint32_t lastStepMicros; // time in microseconds that last step happened
|
||||
bool forwardRotation=true;
|
||||
volatile bool enabled=true;
|
||||
|
||||
public:
|
||||
void begin(void);
|
||||
|
||||
//moves motor where the modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
int32_t move(int32_t stepAngle, uint32_t mA);
|
||||
|
||||
uint32_t microsSinceStep(void) {return micros()-lastStepMicros;};
|
||||
void setRotationDirection(bool forward) {forwardRotation=forward;};
|
||||
|
||||
void enable(bool enable);
|
||||
void limitCurrent(uint8_t percent); //higher more current
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif //__A4954__H__
|
||||
/**********************************************************************
|
||||
Copyright (C) 2019 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __A4954__H__
|
||||
#define __A4954__H__
|
||||
#include <Arduino.h>
|
||||
#include "board.h"
|
||||
#include "angle.h"
|
||||
#include "sine.h"
|
||||
|
||||
#define A4954_NUM_MICROSTEPS (256)
|
||||
#define A4954_MIN_TIME_BETWEEN_STEPS_MICROS (1000)
|
||||
|
||||
//prevent someone for making a mistake with the code
|
||||
#if ((A4954_NUM_MICROSTEPS*4) != SINE_STEPS)
|
||||
#error "SINE_STEPS must be 4x of Micro steps for the move function"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* When it comes to the stepper driver if we use angles
|
||||
* we will always have a rounding error. For example
|
||||
* a 0-65536(360) angle for 1.8 degree step is 327.68 so
|
||||
* if you increment 200 of these as 327 you have a 13.6 error
|
||||
* after one rotation.
|
||||
* If you use floating point the effect is the same but takes longer.
|
||||
*
|
||||
* The only error-less accumulation system is to use native units, ie full
|
||||
* steps and microsteps.
|
||||
*
|
||||
*/
|
||||
|
||||
class A4954
|
||||
{
|
||||
private:
|
||||
uint32_t lastStepMicros; // time in microseconds that last step happened
|
||||
bool forwardRotation=true;
|
||||
volatile bool enabled=true;
|
||||
|
||||
public:
|
||||
void begin(void);
|
||||
|
||||
//moves motor where the modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
int32_t move(int32_t stepAngle, uint32_t mA);
|
||||
|
||||
uint32_t microsSinceStep(void) {return micros()-lastStepMicros;};
|
||||
void setRotationDirection(bool forward) {forwardRotation=forward;};
|
||||
|
||||
void enable(bool enable);
|
||||
void limitCurrent(uint8_t percent); //higher more current
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif //__A4954__H__
|
||||
|
@ -1,337 +1,337 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
|
||||
#include "A5995.h"
|
||||
#include "wiring_private.h"
|
||||
#include "syslog.h"
|
||||
#include "angle.h"
|
||||
#include "Arduino.h"
|
||||
#include "sine.h"
|
||||
|
||||
static uint8_t pinState=0;
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-Ofast")
|
||||
|
||||
|
||||
|
||||
|
||||
#define DAC_MAX (0x01FFL)
|
||||
// Wait for synchronization of registers between the clock domains
|
||||
static __inline__ void syncTCC(Tcc* TCCx) __attribute__((always_inline, unused));
|
||||
static void syncTCC(Tcc* TCCx) {
|
||||
//int32_t t0=1000;
|
||||
while (TCCx->SYNCBUSY.reg & TCC_SYNCBUSY_MASK)
|
||||
{
|
||||
// t0--;
|
||||
// if (t0==0)
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
// delay(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void setDAC(uint32_t DAC1, uint32_t DAC2)
|
||||
{
|
||||
TCC1->CC[1].reg = (uint32_t)DAC1; //D9 PA07 - VREF2
|
||||
syncTCC(TCC1);
|
||||
TCC1->CC[0].reg = (uint32_t)DAC2; //D4 - VREF1
|
||||
syncTCC(TCC1);
|
||||
|
||||
}
|
||||
|
||||
static void setupDAC(void)
|
||||
{
|
||||
Tcc* TCCx = TCC1 ;
|
||||
|
||||
|
||||
pinPeripheral(PIN_A5995_VREF1, PIO_TIMER_ALT);
|
||||
pinPeripheral(PIN_A5995_VREF2, PIO_TIMER);
|
||||
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC0_TCC1 )) ;
|
||||
|
||||
while ( GCLK->STATUS.bit.SYNCBUSY == 1 ) ;
|
||||
|
||||
//ERROR("Setting TCC %d %d",ulValue,ulPin);
|
||||
TCCx->CTRLA.reg &= ~TCC_CTRLA_ENABLE;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx as normal PWM
|
||||
TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx in waveform mode Normal PWM
|
||||
TCCx->CC[1].reg = (uint32_t)0;
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[0].reg = (uint32_t)0;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set PER to maximum counter value (resolution : 0xFFF = 12 bits)
|
||||
// =48e6/2^12=11kHz frequency
|
||||
TCCx->PER.reg = DAC_MAX;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Enable TCCx
|
||||
TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ;
|
||||
syncTCC(TCCx);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void A5995::begin()
|
||||
{
|
||||
//setup the A5995 pins
|
||||
digitalWrite(PIN_A5995_ENABLE1,LOW);
|
||||
pinMode(PIN_A5995_ENABLE1,OUTPUT);
|
||||
digitalWrite(PIN_A5995_ENABLE2,LOW);
|
||||
pinMode(PIN_A5995_ENABLE2,OUTPUT);
|
||||
digitalWrite(PIN_A5995_MODE1,LOW);
|
||||
pinMode(PIN_A5995_MODE1,OUTPUT);
|
||||
digitalWrite(PIN_A5995_MODE2,LOW);
|
||||
pinMode(PIN_A5995_MODE2,OUTPUT);
|
||||
digitalWrite(PIN_A5995_PHASE1,LOW);
|
||||
pinMode(PIN_A5995_PHASE1,OUTPUT);
|
||||
digitalWrite(PIN_A5995_PHASE2,LOW);
|
||||
pinMode(PIN_A5995_PHASE2,OUTPUT);
|
||||
|
||||
digitalWrite(PIN_A5995_SLEEPn,HIGH);
|
||||
pinMode(PIN_A5995_SLEEPn,OUTPUT);
|
||||
|
||||
|
||||
|
||||
//setup the PWM for current on the A4954, set for low current
|
||||
digitalWrite(PIN_A5995_VREF1,LOW);
|
||||
digitalWrite(PIN_A5995_VREF2,LOW);
|
||||
pinMode(PIN_A5995_VREF1, OUTPUT);
|
||||
pinMode(PIN_A5995_VREF2, OUTPUT);
|
||||
|
||||
enabled=true;
|
||||
lastStepMicros=0;
|
||||
forwardRotation=true;
|
||||
|
||||
setupDAC();
|
||||
|
||||
|
||||
//
|
||||
// GPIO_HIGH(PIN_A5995_ENABLE1);
|
||||
// GPIO_HIGH(PIN_A5995_ENABLE2);
|
||||
// GPIO_LOW(PIN_A5995_MODE1);
|
||||
// GPIO_LOW(PIN_A5995_MODE2);
|
||||
// GPIO_HIGH(PIN_A5995_PHASE1);
|
||||
// GPIO_HIGH(PIN_A5995_PHASE2);
|
||||
// int i=0;;
|
||||
// while (1)
|
||||
// {
|
||||
// int32_t x;
|
||||
// WARNING("MA %d",i);
|
||||
// x=(int32_t)((int64_t)i*(DAC_MAX))/3300;
|
||||
// setDAC(x,x);
|
||||
// delay(1000);
|
||||
// i=i+10;
|
||||
// if (i>1000)
|
||||
// {
|
||||
// i=0;
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void A5995::enable(bool enable)
|
||||
{
|
||||
enabled=enable;
|
||||
if (enabled == false)
|
||||
{
|
||||
WARNING("A4954 disabled");
|
||||
setDAC(0,0); //turn current off
|
||||
GPIO_LOW(PIN_A5995_ENABLE1);
|
||||
GPIO_LOW(PIN_A5995_ENABLE2);
|
||||
GPIO_LOW(PIN_A5995_MODE1);
|
||||
GPIO_LOW(PIN_A5995_MODE2);
|
||||
GPIO_LOW(PIN_A5995_PHASE1);
|
||||
GPIO_LOW(PIN_A5995_PHASE2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//this is precise move and modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
// stepAngle is in A4954_NUM_MICROSTEPS units..
|
||||
// The A4954 has no idea where the motor is, so the calling function has to
|
||||
// to tell the A4954 what phase to drive motor coils.
|
||||
// A4954_NUM_MICROSTEPS is 256 by default so stepAngle of 1024 is 360 degrees
|
||||
// Note you can only move up to +/-A4954_NUM_MICROSTEPS from where you
|
||||
// currently are.
|
||||
int32_t A5995::move(int32_t stepAngle, uint32_t mA)
|
||||
{
|
||||
uint16_t angle;
|
||||
int32_t cos,sin;
|
||||
int32_t dacSin,dacCos;
|
||||
static int32_t lastSin=0,lastCos=0;
|
||||
static int i=1;
|
||||
|
||||
if (enabled == false)
|
||||
{
|
||||
WARNING("A4954 disabled");
|
||||
setDAC(0,0); //turn current off
|
||||
GPIO_LOW(PIN_A5995_ENABLE1);
|
||||
GPIO_LOW(PIN_A5995_ENABLE2);
|
||||
GPIO_LOW(PIN_A5995_MODE1);
|
||||
GPIO_LOW(PIN_A5995_MODE2);
|
||||
GPIO_LOW(PIN_A5995_PHASE1);
|
||||
GPIO_LOW(PIN_A5995_PHASE2);
|
||||
return stepAngle;
|
||||
}
|
||||
|
||||
//WARNING("move %d %d",stepAngle,mA);
|
||||
|
||||
stepAngle=(stepAngle) % SINE_STEPS;
|
||||
//figure out our sine Angle
|
||||
// note our SINE_STEPS is 4x of microsteps for a reason
|
||||
//angle=(stepAngle+(SINE_STEPS/8)) % SINE_STEPS;
|
||||
angle=stepAngle;
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("angle %d ",angle);
|
||||
}
|
||||
//calculate the sine and cosine of our angle
|
||||
sin=sine(angle);
|
||||
cos=cosine(angle);
|
||||
|
||||
//if we are reverse swap the sign of one of the angels
|
||||
if (false == forwardRotation)
|
||||
{
|
||||
cos=-cos;
|
||||
}
|
||||
|
||||
//scale sine result by current(mA)
|
||||
dacSin=((int32_t)mA*(int64_t)(sin))/SINE_MAX;
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("dacsine %d ",dacSin);
|
||||
}
|
||||
// if ((lastSin-dacSin)>100) //decreasing current
|
||||
// {
|
||||
// GPIO_LOW(PIN_A5995_MODE2); //fast decay
|
||||
// } else
|
||||
// {
|
||||
// GPIO_HIGH(PIN_A5995_MODE2); //slow decay
|
||||
// }
|
||||
lastSin=dacSin;
|
||||
|
||||
//convert value into DAC scaled to 3300mA max
|
||||
dacSin=(int32_t)((int64_t)abs(dacSin)*(DAC_MAX))/3300;
|
||||
|
||||
|
||||
//scale cosine result by current(mA)
|
||||
dacCos=((int32_t)mA*(int64_t)(cos))/SINE_MAX;
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("daccos %d ",dacCos);
|
||||
}
|
||||
// if ((lastCos-dacCos)>100) //decreasing current
|
||||
// {
|
||||
// GPIO_LOW(PIN_A5995_MODE1); //fast decay
|
||||
// } else
|
||||
// {
|
||||
// GPIO_HIGH(PIN_A5995_MODE1); //slow decay
|
||||
// }
|
||||
lastCos=dacCos;
|
||||
|
||||
//convert value into DAC scaled to 3300mA max
|
||||
dacCos=(int32_t)((int64_t)abs(dacCos)*(DAC_MAX))/3300;
|
||||
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("dacs are %d %d",dacSin,dacCos);
|
||||
}
|
||||
setDAC(dacSin,dacCos);
|
||||
|
||||
GPIO_HIGH(PIN_A5995_ENABLE1);
|
||||
GPIO_HIGH(PIN_A5995_ENABLE2);
|
||||
GPIO_LOW(PIN_A5995_MODE1);
|
||||
GPIO_LOW(PIN_A5995_MODE2);
|
||||
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("sins are %d %d",sin,cos);
|
||||
}
|
||||
|
||||
if (sin>0)
|
||||
{
|
||||
GPIO_HIGH(PIN_A5995_PHASE2);
|
||||
}else
|
||||
{
|
||||
GPIO_LOW(PIN_A5995_PHASE2);
|
||||
|
||||
}
|
||||
if (cos>0)
|
||||
{
|
||||
GPIO_HIGH(PIN_A5995_PHASE1);
|
||||
|
||||
}else
|
||||
{
|
||||
GPIO_LOW(PIN_A5995_PHASE1);
|
||||
|
||||
}
|
||||
|
||||
// i++;
|
||||
// if (i>3000) i=0;
|
||||
// YELLOW_LED(led);
|
||||
// led=(led+1) & 0x01;
|
||||
lastStepMicros=micros();
|
||||
return stepAngle;
|
||||
}
|
||||
#pragma GCC pop_options
|
||||
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
|
||||
#include "A5995.h"
|
||||
#include "wiring_private.h"
|
||||
#include "syslog.h"
|
||||
#include "angle.h"
|
||||
#include "Arduino.h"
|
||||
#include "sine.h"
|
||||
|
||||
static uint8_t pinState=0;
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-Ofast")
|
||||
|
||||
|
||||
|
||||
|
||||
#define DAC_MAX (0x01FFL)
|
||||
// Wait for synchronization of registers between the clock domains
|
||||
static __inline__ void syncTCC(Tcc* TCCx) __attribute__((always_inline, unused));
|
||||
static void syncTCC(Tcc* TCCx) {
|
||||
//int32_t t0=1000;
|
||||
while (TCCx->SYNCBUSY.reg & TCC_SYNCBUSY_MASK)
|
||||
{
|
||||
// t0--;
|
||||
// if (t0==0)
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
// delay(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void setDAC(uint32_t DAC1, uint32_t DAC2)
|
||||
{
|
||||
TCC1->CC[1].reg = (uint32_t)DAC1; //D9 PA07 - VREF2
|
||||
syncTCC(TCC1);
|
||||
TCC1->CC[0].reg = (uint32_t)DAC2; //D4 - VREF1
|
||||
syncTCC(TCC1);
|
||||
|
||||
}
|
||||
|
||||
static void setupDAC(void)
|
||||
{
|
||||
Tcc* TCCx = TCC1 ;
|
||||
|
||||
|
||||
pinPeripheral(PIN_A5995_VREF1, PIO_TIMER_ALT);
|
||||
pinPeripheral(PIN_A5995_VREF2, PIO_TIMER);
|
||||
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC0_TCC1 )) ;
|
||||
|
||||
while ( GCLK->STATUS.bit.SYNCBUSY == 1 ) ;
|
||||
|
||||
//ERROR("Setting TCC %d %d",ulValue,ulPin);
|
||||
TCCx->CTRLA.reg &= ~TCC_CTRLA_ENABLE;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx as normal PWM
|
||||
TCCx->WAVE.reg |= TCC_WAVE_WAVEGEN_NPWM;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set TCx in waveform mode Normal PWM
|
||||
TCCx->CC[1].reg = (uint32_t)0;
|
||||
syncTCC(TCCx);
|
||||
|
||||
TCCx->CC[0].reg = (uint32_t)0;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Set PER to maximum counter value (resolution : 0xFFF = 12 bits)
|
||||
// =48e6/2^12=11kHz frequency
|
||||
TCCx->PER.reg = DAC_MAX;
|
||||
syncTCC(TCCx);
|
||||
|
||||
// Enable TCCx
|
||||
TCCx->CTRLA.reg |= TCC_CTRLA_ENABLE ;
|
||||
syncTCC(TCCx);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void A5995::begin()
|
||||
{
|
||||
//setup the A5995 pins
|
||||
digitalWrite(PIN_A5995_ENABLE1,LOW);
|
||||
pinMode(PIN_A5995_ENABLE1,OUTPUT);
|
||||
digitalWrite(PIN_A5995_ENABLE2,LOW);
|
||||
pinMode(PIN_A5995_ENABLE2,OUTPUT);
|
||||
digitalWrite(PIN_A5995_MODE1,LOW);
|
||||
pinMode(PIN_A5995_MODE1,OUTPUT);
|
||||
digitalWrite(PIN_A5995_MODE2,LOW);
|
||||
pinMode(PIN_A5995_MODE2,OUTPUT);
|
||||
digitalWrite(PIN_A5995_PHASE1,LOW);
|
||||
pinMode(PIN_A5995_PHASE1,OUTPUT);
|
||||
digitalWrite(PIN_A5995_PHASE2,LOW);
|
||||
pinMode(PIN_A5995_PHASE2,OUTPUT);
|
||||
|
||||
digitalWrite(PIN_A5995_SLEEPn,HIGH);
|
||||
pinMode(PIN_A5995_SLEEPn,OUTPUT);
|
||||
|
||||
|
||||
|
||||
//setup the PWM for current on the A4954, set for low current
|
||||
digitalWrite(PIN_A5995_VREF1,LOW);
|
||||
digitalWrite(PIN_A5995_VREF2,LOW);
|
||||
pinMode(PIN_A5995_VREF1, OUTPUT);
|
||||
pinMode(PIN_A5995_VREF2, OUTPUT);
|
||||
|
||||
enabled=true;
|
||||
lastStepMicros=0;
|
||||
forwardRotation=true;
|
||||
|
||||
setupDAC();
|
||||
|
||||
|
||||
//
|
||||
// GPIO_HIGH(PIN_A5995_ENABLE1);
|
||||
// GPIO_HIGH(PIN_A5995_ENABLE2);
|
||||
// GPIO_LOW(PIN_A5995_MODE1);
|
||||
// GPIO_LOW(PIN_A5995_MODE2);
|
||||
// GPIO_HIGH(PIN_A5995_PHASE1);
|
||||
// GPIO_HIGH(PIN_A5995_PHASE2);
|
||||
// int i=0;;
|
||||
// while (1)
|
||||
// {
|
||||
// int32_t x;
|
||||
// WARNING("MA %d",i);
|
||||
// x=(int32_t)((int64_t)i*(DAC_MAX))/3300;
|
||||
// setDAC(x,x);
|
||||
// delay(1000);
|
||||
// i=i+10;
|
||||
// if (i>1000)
|
||||
// {
|
||||
// i=0;
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void A5995::enable(bool enable)
|
||||
{
|
||||
enabled=enable;
|
||||
if (enabled == false)
|
||||
{
|
||||
WARNING("A4954 disabled");
|
||||
setDAC(0,0); //turn current off
|
||||
GPIO_LOW(PIN_A5995_ENABLE1);
|
||||
GPIO_LOW(PIN_A5995_ENABLE2);
|
||||
GPIO_LOW(PIN_A5995_MODE1);
|
||||
GPIO_LOW(PIN_A5995_MODE2);
|
||||
GPIO_LOW(PIN_A5995_PHASE1);
|
||||
GPIO_LOW(PIN_A5995_PHASE2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//this is precise move and modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
// stepAngle is in A4954_NUM_MICROSTEPS units..
|
||||
// The A4954 has no idea where the motor is, so the calling function has to
|
||||
// to tell the A4954 what phase to drive motor coils.
|
||||
// A4954_NUM_MICROSTEPS is 256 by default so stepAngle of 1024 is 360 degrees
|
||||
// Note you can only move up to +/-A4954_NUM_MICROSTEPS from where you
|
||||
// currently are.
|
||||
int32_t A5995::move(int32_t stepAngle, uint32_t mA)
|
||||
{
|
||||
uint16_t angle;
|
||||
int32_t cos,sin;
|
||||
int32_t dacSin,dacCos;
|
||||
static int32_t lastSin=0,lastCos=0;
|
||||
static int i=1;
|
||||
|
||||
if (enabled == false)
|
||||
{
|
||||
WARNING("A4954 disabled");
|
||||
setDAC(0,0); //turn current off
|
||||
GPIO_LOW(PIN_A5995_ENABLE1);
|
||||
GPIO_LOW(PIN_A5995_ENABLE2);
|
||||
GPIO_LOW(PIN_A5995_MODE1);
|
||||
GPIO_LOW(PIN_A5995_MODE2);
|
||||
GPIO_LOW(PIN_A5995_PHASE1);
|
||||
GPIO_LOW(PIN_A5995_PHASE2);
|
||||
return stepAngle;
|
||||
}
|
||||
|
||||
//WARNING("move %d %d",stepAngle,mA);
|
||||
|
||||
stepAngle=(stepAngle) % SINE_STEPS;
|
||||
//figure out our sine Angle
|
||||
// note our SINE_STEPS is 4x of microsteps for a reason
|
||||
//angle=(stepAngle+(SINE_STEPS/8)) % SINE_STEPS;
|
||||
angle=stepAngle;
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("angle %d ",angle);
|
||||
}
|
||||
//calculate the sine and cosine of our angle
|
||||
sin=sine(angle);
|
||||
cos=cosine(angle);
|
||||
|
||||
//if we are reverse swap the sign of one of the angels
|
||||
if (false == forwardRotation)
|
||||
{
|
||||
cos=-cos;
|
||||
}
|
||||
|
||||
//scale sine result by current(mA)
|
||||
dacSin=((int32_t)mA*(int64_t)(sin))/SINE_MAX;
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("dacsine %d ",dacSin);
|
||||
}
|
||||
// if ((lastSin-dacSin)>100) //decreasing current
|
||||
// {
|
||||
// GPIO_LOW(PIN_A5995_MODE2); //fast decay
|
||||
// } else
|
||||
// {
|
||||
// GPIO_HIGH(PIN_A5995_MODE2); //slow decay
|
||||
// }
|
||||
lastSin=dacSin;
|
||||
|
||||
//convert value into DAC scaled to 3300mA max
|
||||
dacSin=(int32_t)((int64_t)abs(dacSin)*(DAC_MAX))/3300;
|
||||
|
||||
|
||||
//scale cosine result by current(mA)
|
||||
dacCos=((int32_t)mA*(int64_t)(cos))/SINE_MAX;
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("daccos %d ",dacCos);
|
||||
}
|
||||
// if ((lastCos-dacCos)>100) //decreasing current
|
||||
// {
|
||||
// GPIO_LOW(PIN_A5995_MODE1); //fast decay
|
||||
// } else
|
||||
// {
|
||||
// GPIO_HIGH(PIN_A5995_MODE1); //slow decay
|
||||
// }
|
||||
lastCos=dacCos;
|
||||
|
||||
//convert value into DAC scaled to 3300mA max
|
||||
dacCos=(int32_t)((int64_t)abs(dacCos)*(DAC_MAX))/3300;
|
||||
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("dacs are %d %d",dacSin,dacCos);
|
||||
}
|
||||
setDAC(dacSin,dacCos);
|
||||
|
||||
GPIO_HIGH(PIN_A5995_ENABLE1);
|
||||
GPIO_HIGH(PIN_A5995_ENABLE2);
|
||||
GPIO_LOW(PIN_A5995_MODE1);
|
||||
GPIO_LOW(PIN_A5995_MODE2);
|
||||
|
||||
|
||||
if (i==0)
|
||||
{
|
||||
WARNING("sins are %d %d",sin,cos);
|
||||
}
|
||||
|
||||
if (sin>0)
|
||||
{
|
||||
GPIO_HIGH(PIN_A5995_PHASE2);
|
||||
}else
|
||||
{
|
||||
GPIO_LOW(PIN_A5995_PHASE2);
|
||||
|
||||
}
|
||||
if (cos>0)
|
||||
{
|
||||
GPIO_HIGH(PIN_A5995_PHASE1);
|
||||
|
||||
}else
|
||||
{
|
||||
GPIO_LOW(PIN_A5995_PHASE1);
|
||||
|
||||
}
|
||||
|
||||
// i++;
|
||||
// if (i>3000) i=0;
|
||||
// YELLOW_LED(led);
|
||||
// led=(led+1) & 0x01;
|
||||
lastStepMicros=micros();
|
||||
return stepAngle;
|
||||
}
|
||||
#pragma GCC pop_options
|
||||
|
||||
|
||||
|
||||
|
@ -1,92 +1,92 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef A5995_H_
|
||||
#define A5995_H_
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "board.h"
|
||||
#include "angle.h"
|
||||
#include "sine.h"
|
||||
|
||||
#define A5995_NUM_MICROSTEPS (256)
|
||||
|
||||
|
||||
//prevent someone for making a mistake with the code
|
||||
#if ((A5995_NUM_MICROSTEPS*4) != SINE_STEPS)
|
||||
#error "SINE_STEPS must be 4x of Micro steps for the move function"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* When it comes to the stepper driver if we use angles
|
||||
* we will always have a rounding error. For example
|
||||
* a 0-65536(360) angle for 1.8 degree step is 327.68 so
|
||||
* if you increment 200 of these as 327 you have a 13.6 error
|
||||
* after one rotation.
|
||||
* If you use floating point the effect is the same but takes longer.
|
||||
*
|
||||
* The only error-less accumulation system is to use native units, ie full
|
||||
* steps and microsteps.
|
||||
*
|
||||
*/
|
||||
|
||||
class A5995
|
||||
{
|
||||
private:
|
||||
uint32_t lastStepMicros; // time in microseconds that last step happened
|
||||
bool forwardRotation=true;
|
||||
volatile bool enabled=true;
|
||||
|
||||
public:
|
||||
void begin(void);
|
||||
|
||||
//moves motor where the modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
int32_t move(int32_t stepAngle, uint32_t mA);
|
||||
|
||||
uint32_t microsSinceStep(void) {return micros()-lastStepMicros;};
|
||||
void setRotationDirection(bool forward) {forwardRotation=forward;};
|
||||
|
||||
void enable(bool enable);
|
||||
void limitCurrent(uint8_t percent) {return;}; //Not used
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* A5995_H_ */
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef A5995_H_
|
||||
#define A5995_H_
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "board.h"
|
||||
#include "angle.h"
|
||||
#include "sine.h"
|
||||
|
||||
#define A5995_NUM_MICROSTEPS (256)
|
||||
|
||||
|
||||
//prevent someone for making a mistake with the code
|
||||
#if ((A5995_NUM_MICROSTEPS*4) != SINE_STEPS)
|
||||
#error "SINE_STEPS must be 4x of Micro steps for the move function"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* When it comes to the stepper driver if we use angles
|
||||
* we will always have a rounding error. For example
|
||||
* a 0-65536(360) angle for 1.8 degree step is 327.68 so
|
||||
* if you increment 200 of these as 327 you have a 13.6 error
|
||||
* after one rotation.
|
||||
* If you use floating point the effect is the same but takes longer.
|
||||
*
|
||||
* The only error-less accumulation system is to use native units, ie full
|
||||
* steps and microsteps.
|
||||
*
|
||||
*/
|
||||
|
||||
class A5995
|
||||
{
|
||||
private:
|
||||
uint32_t lastStepMicros; // time in microseconds that last step happened
|
||||
bool forwardRotation=true;
|
||||
volatile bool enabled=true;
|
||||
|
||||
public:
|
||||
void begin(void);
|
||||
|
||||
//moves motor where the modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
int32_t move(int32_t stepAngle, uint32_t mA);
|
||||
|
||||
uint32_t microsSinceStep(void) {return micros()-lastStepMicros;};
|
||||
void setRotationDirection(bool forward) {forwardRotation=forward;};
|
||||
|
||||
void enable(bool enable);
|
||||
void limitCurrent(uint8_t percent) {return;}; //Not used
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* A5995_H_ */
|
||||
|
@ -1,155 +1,155 @@
|
||||
#ifndef _ADAFRUIT_GFX_H
|
||||
#define _ADAFRUIT_GFX_H
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#include "Print.h"
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#endif
|
||||
|
||||
#include "gfxfont.h"
|
||||
|
||||
class Adafruit_GFX : public Print {
|
||||
|
||||
public:
|
||||
|
||||
Adafruit_GFX(int16_t w, int16_t h); // Constructor
|
||||
|
||||
// This MUST be defined by the subclass:
|
||||
virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;
|
||||
|
||||
// These MAY be overridden by the subclass to provide device-specific
|
||||
// optimized code. Otherwise 'generic' versions are used.
|
||||
virtual void
|
||||
drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),
|
||||
drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
|
||||
drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
|
||||
drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
|
||||
fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
|
||||
fillScreen(uint16_t color),
|
||||
invertDisplay(boolean i);
|
||||
|
||||
// These exist only with Adafruit_GFX (no subclass overrides)
|
||||
void
|
||||
drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
|
||||
drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
|
||||
uint16_t color),
|
||||
fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
|
||||
fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
|
||||
int16_t delta, uint16_t color),
|
||||
drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
|
||||
int16_t x2, int16_t y2, uint16_t color),
|
||||
fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
|
||||
int16_t x2, int16_t y2, uint16_t color),
|
||||
drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
|
||||
int16_t radius, uint16_t color),
|
||||
fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
|
||||
int16_t radius, uint16_t color),
|
||||
drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color),
|
||||
drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color, uint16_t bg),
|
||||
drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color),
|
||||
drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color, uint16_t bg),
|
||||
drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color),
|
||||
drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
|
||||
uint16_t bg, uint8_t size),
|
||||
setCursor(int16_t x, int16_t y),
|
||||
setTextColor(uint16_t c),
|
||||
setTextColor(uint16_t c, uint16_t bg),
|
||||
setTextSize(uint8_t s),
|
||||
setTextWrap(boolean w),
|
||||
setRotation(uint8_t r),
|
||||
cp437(boolean x=true),
|
||||
setFont(const GFXfont *f = NULL),
|
||||
getTextBounds(char *string, int16_t x, int16_t y,
|
||||
int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h),
|
||||
getTextBounds(const __FlashStringHelper *s, int16_t x, int16_t y,
|
||||
int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
|
||||
|
||||
#if ARDUINO >= 100
|
||||
virtual size_t write(uint8_t);
|
||||
#else
|
||||
virtual void write(uint8_t);
|
||||
#endif
|
||||
|
||||
int16_t height(void) const;
|
||||
int16_t width(void) const;
|
||||
|
||||
uint8_t getRotation(void) const;
|
||||
|
||||
// get current cursor position (get rotation safe maximum values, using: width() for x, height() for y)
|
||||
int16_t getCursorX(void) const;
|
||||
int16_t getCursorY(void) const;
|
||||
|
||||
protected:
|
||||
const int16_t
|
||||
WIDTH, HEIGHT; // This is the 'raw' display w/h - never changes
|
||||
int16_t
|
||||
_width, _height, // Display w/h as modified by current rotation
|
||||
cursor_x, cursor_y;
|
||||
uint16_t
|
||||
textcolor, textbgcolor;
|
||||
uint8_t
|
||||
textsize,
|
||||
rotation;
|
||||
boolean
|
||||
wrap, // If set, 'wrap' text at right edge of display
|
||||
_cp437; // If set, use correct CP437 charset (default is off)
|
||||
GFXfont
|
||||
*gfxFont;
|
||||
};
|
||||
|
||||
class Adafruit_GFX_Button {
|
||||
|
||||
public:
|
||||
Adafruit_GFX_Button(void);
|
||||
void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y,
|
||||
uint8_t w, uint8_t h, uint16_t outline, uint16_t fill,
|
||||
uint16_t textcolor, char *label, uint8_t textsize);
|
||||
void drawButton(boolean inverted = false);
|
||||
boolean contains(int16_t x, int16_t y);
|
||||
|
||||
void press(boolean p);
|
||||
boolean isPressed();
|
||||
boolean justPressed();
|
||||
boolean justReleased();
|
||||
|
||||
private:
|
||||
Adafruit_GFX *_gfx;
|
||||
int16_t _x, _y;
|
||||
uint16_t _w, _h;
|
||||
uint8_t _textsize;
|
||||
uint16_t _outlinecolor, _fillcolor, _textcolor;
|
||||
char _label[10];
|
||||
|
||||
boolean currstate, laststate;
|
||||
};
|
||||
|
||||
class GFXcanvas1 : public Adafruit_GFX {
|
||||
|
||||
public:
|
||||
GFXcanvas1(uint16_t w, uint16_t h);
|
||||
~GFXcanvas1(void);
|
||||
void drawPixel(int16_t x, int16_t y, uint16_t color),
|
||||
fillScreen(uint16_t color);
|
||||
uint8_t *getBuffer(void);
|
||||
private:
|
||||
uint8_t *buffer;
|
||||
};
|
||||
|
||||
class GFXcanvas16 : public Adafruit_GFX {
|
||||
GFXcanvas16(uint16_t w, uint16_t h);
|
||||
~GFXcanvas16(void);
|
||||
void drawPixel(int16_t x, int16_t y, uint16_t color),
|
||||
fillScreen(uint16_t color);
|
||||
uint16_t *getBuffer(void);
|
||||
private:
|
||||
uint16_t *buffer;
|
||||
};
|
||||
|
||||
#endif // _ADAFRUIT_GFX_H
|
||||
#ifndef _ADAFRUIT_GFX_H
|
||||
#define _ADAFRUIT_GFX_H
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#include "Print.h"
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#endif
|
||||
|
||||
#include "gfxfont.h"
|
||||
|
||||
class Adafruit_GFX : public Print {
|
||||
|
||||
public:
|
||||
|
||||
Adafruit_GFX(int16_t w, int16_t h); // Constructor
|
||||
|
||||
// This MUST be defined by the subclass:
|
||||
virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;
|
||||
|
||||
// These MAY be overridden by the subclass to provide device-specific
|
||||
// optimized code. Otherwise 'generic' versions are used.
|
||||
virtual void
|
||||
drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),
|
||||
drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
|
||||
drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
|
||||
drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
|
||||
fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
|
||||
fillScreen(uint16_t color),
|
||||
invertDisplay(boolean i);
|
||||
|
||||
// These exist only with Adafruit_GFX (no subclass overrides)
|
||||
void
|
||||
drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
|
||||
drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
|
||||
uint16_t color),
|
||||
fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
|
||||
fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
|
||||
int16_t delta, uint16_t color),
|
||||
drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
|
||||
int16_t x2, int16_t y2, uint16_t color),
|
||||
fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
|
||||
int16_t x2, int16_t y2, uint16_t color),
|
||||
drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
|
||||
int16_t radius, uint16_t color),
|
||||
fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
|
||||
int16_t radius, uint16_t color),
|
||||
drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color),
|
||||
drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color, uint16_t bg),
|
||||
drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color),
|
||||
drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color, uint16_t bg),
|
||||
drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
|
||||
int16_t w, int16_t h, uint16_t color),
|
||||
drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
|
||||
uint16_t bg, uint8_t size),
|
||||
setCursor(int16_t x, int16_t y),
|
||||
setTextColor(uint16_t c),
|
||||
setTextColor(uint16_t c, uint16_t bg),
|
||||
setTextSize(uint8_t s),
|
||||
setTextWrap(boolean w),
|
||||
setRotation(uint8_t r),
|
||||
cp437(boolean x=true),
|
||||
setFont(const GFXfont *f = NULL),
|
||||
getTextBounds(char *string, int16_t x, int16_t y,
|
||||
int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h),
|
||||
getTextBounds(const __FlashStringHelper *s, int16_t x, int16_t y,
|
||||
int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
|
||||
|
||||
#if ARDUINO >= 100
|
||||
virtual size_t write(uint8_t);
|
||||
#else
|
||||
virtual void write(uint8_t);
|
||||
#endif
|
||||
|
||||
int16_t height(void) const;
|
||||
int16_t width(void) const;
|
||||
|
||||
uint8_t getRotation(void) const;
|
||||
|
||||
// get current cursor position (get rotation safe maximum values, using: width() for x, height() for y)
|
||||
int16_t getCursorX(void) const;
|
||||
int16_t getCursorY(void) const;
|
||||
|
||||
protected:
|
||||
const int16_t
|
||||
WIDTH, HEIGHT; // This is the 'raw' display w/h - never changes
|
||||
int16_t
|
||||
_width, _height, // Display w/h as modified by current rotation
|
||||
cursor_x, cursor_y;
|
||||
uint16_t
|
||||
textcolor, textbgcolor;
|
||||
uint8_t
|
||||
textsize,
|
||||
rotation;
|
||||
boolean
|
||||
wrap, // If set, 'wrap' text at right edge of display
|
||||
_cp437; // If set, use correct CP437 charset (default is off)
|
||||
GFXfont
|
||||
*gfxFont;
|
||||
};
|
||||
|
||||
class Adafruit_GFX_Button {
|
||||
|
||||
public:
|
||||
Adafruit_GFX_Button(void);
|
||||
void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y,
|
||||
uint8_t w, uint8_t h, uint16_t outline, uint16_t fill,
|
||||
uint16_t textcolor, char *label, uint8_t textsize);
|
||||
void drawButton(boolean inverted = false);
|
||||
boolean contains(int16_t x, int16_t y);
|
||||
|
||||
void press(boolean p);
|
||||
boolean isPressed();
|
||||
boolean justPressed();
|
||||
boolean justReleased();
|
||||
|
||||
private:
|
||||
Adafruit_GFX *_gfx;
|
||||
int16_t _x, _y;
|
||||
uint16_t _w, _h;
|
||||
uint8_t _textsize;
|
||||
uint16_t _outlinecolor, _fillcolor, _textcolor;
|
||||
char _label[10];
|
||||
|
||||
boolean currstate, laststate;
|
||||
};
|
||||
|
||||
class GFXcanvas1 : public Adafruit_GFX {
|
||||
|
||||
public:
|
||||
GFXcanvas1(uint16_t w, uint16_t h);
|
||||
~GFXcanvas1(void);
|
||||
void drawPixel(int16_t x, int16_t y, uint16_t color),
|
||||
fillScreen(uint16_t color);
|
||||
uint8_t *getBuffer(void);
|
||||
private:
|
||||
uint8_t *buffer;
|
||||
};
|
||||
|
||||
class GFXcanvas16 : public Adafruit_GFX {
|
||||
GFXcanvas16(uint16_t w, uint16_t h);
|
||||
~GFXcanvas16(void);
|
||||
void drawPixel(int16_t x, int16_t y, uint16_t color),
|
||||
fillScreen(uint16_t color);
|
||||
uint16_t *getBuffer(void);
|
||||
private:
|
||||
uint16_t *buffer;
|
||||
};
|
||||
|
||||
#endif // _ADAFRUIT_GFX_H
|
||||
|
@ -1,182 +1,182 @@
|
||||
/*********************************************************************
|
||||
This is a library for our Monochrome OLEDs based on SSD1306 drivers
|
||||
|
||||
Pick one up today in the adafruit shop!
|
||||
------> http://www.adafruit.com/category/63_98
|
||||
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
BSD license, check license.txt for more information
|
||||
All text above, and the splash screen must be included in any redistribution
|
||||
*********************************************************************/
|
||||
#ifndef _Adafruit_SSD1306_H_
|
||||
#define _Adafruit_SSD1306_H_
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#define WIRE_WRITE Wire.write
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#define WIRE_WRITE Wire.send
|
||||
#endif
|
||||
|
||||
#if defined(__SAM3X8E__)
|
||||
typedef volatile RwReg PortReg;
|
||||
typedef uint32_t PortMask;
|
||||
#define HAVE_PORTREG
|
||||
#elif defined(ARDUINO_ARCH_SAMD)
|
||||
// not supported
|
||||
#elif defined(ESP8266) || defined(ARDUINO_STM32_FEATHER)
|
||||
typedef volatile uint32_t PortReg;
|
||||
typedef uint32_t PortMask;
|
||||
#else
|
||||
typedef volatile uint8_t PortReg;
|
||||
typedef uint8_t PortMask;
|
||||
#define HAVE_PORTREG
|
||||
#endif
|
||||
|
||||
#include <SPI.h>
|
||||
#include "Adafruit_GFX.h"
|
||||
|
||||
#define BLACK 0
|
||||
#define WHITE 1
|
||||
#define INVERSE 2
|
||||
|
||||
#define SSD1306_I2C_ADDRESS 0x3C // 011110+SA0+RW - 0x3C or 0x3D
|
||||
// Address for 128x32 is 0x3C
|
||||
// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)
|
||||
|
||||
/*=========================================================================
|
||||
SSD1306 Displays
|
||||
-----------------------------------------------------------------------
|
||||
The driver is used in multiple displays (128x64, 128x32, etc.).
|
||||
Select the appropriate display below to create an appropriately
|
||||
sized framebuffer, etc.
|
||||
|
||||
SSD1306_128_64 128x64 pixel display
|
||||
|
||||
SSD1306_128_32 128x32 pixel display
|
||||
|
||||
SSD1306_96_16
|
||||
|
||||
-----------------------------------------------------------------------*/
|
||||
#define SSD1306_128_64
|
||||
// #define SSD1306_128_32
|
||||
// #define SSD1306_96_16
|
||||
/*=========================================================================*/
|
||||
|
||||
#if defined SSD1306_128_64 && defined SSD1306_128_32
|
||||
#error "Only one SSD1306 display can be specified at once in SSD1306.h"
|
||||
#endif
|
||||
#if !defined SSD1306_128_64 && !defined SSD1306_128_32 && !defined SSD1306_96_16
|
||||
#error "At least one SSD1306 display must be specified in SSD1306.h"
|
||||
#endif
|
||||
|
||||
#if defined SSD1306_128_64
|
||||
#define SSD1306_LCDWIDTH 128
|
||||
#define SSD1306_LCDHEIGHT 64
|
||||
#endif
|
||||
#if defined SSD1306_128_32
|
||||
#define SSD1306_LCDWIDTH 128
|
||||
#define SSD1306_LCDHEIGHT 32
|
||||
#endif
|
||||
#if defined SSD1306_96_16
|
||||
#define SSD1306_LCDWIDTH 96
|
||||
#define SSD1306_LCDHEIGHT 16
|
||||
#endif
|
||||
|
||||
#define SSD1306_SETCONTRAST 0x81
|
||||
#define SSD1306_DISPLAYALLON_RESUME 0xA4
|
||||
#define SSD1306_DISPLAYALLON 0xA5
|
||||
#define SSD1306_NORMALDISPLAY 0xA6
|
||||
#define SSD1306_INVERTDISPLAY 0xA7
|
||||
#define SSD1306_DISPLAYOFF 0xAE
|
||||
#define SSD1306_DISPLAYON 0xAF
|
||||
|
||||
#define SSD1306_SETDISPLAYOFFSET 0xD3
|
||||
#define SSD1306_SETCOMPINS 0xDA
|
||||
|
||||
#define SSD1306_SETVCOMDETECT 0xDB
|
||||
|
||||
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
|
||||
#define SSD1306_SETPRECHARGE 0xD9
|
||||
|
||||
#define SSD1306_SETMULTIPLEX 0xA8
|
||||
|
||||
#define SSD1306_SETLOWCOLUMN 0x00
|
||||
#define SSD1306_SETHIGHCOLUMN 0x10
|
||||
|
||||
#define SSD1306_SETSTARTLINE 0x40
|
||||
|
||||
#define SSD1306_MEMORYMODE 0x20
|
||||
#define SSD1306_COLUMNADDR 0x21
|
||||
#define SSD1306_PAGEADDR 0x22
|
||||
|
||||
#define SSD1306_COMSCANINC 0xC0
|
||||
#define SSD1306_COMSCANDEC 0xC8
|
||||
|
||||
#define SSD1306_SEGREMAP 0xA0
|
||||
|
||||
#define SSD1306_CHARGEPUMP 0x8D
|
||||
|
||||
#define SSD1306_EXTERNALVCC 0x1
|
||||
#define SSD1306_SWITCHCAPVCC 0x2
|
||||
|
||||
// Scrolling #defines
|
||||
#define SSD1306_ACTIVATE_SCROLL 0x2F
|
||||
#define SSD1306_DEACTIVATE_SCROLL 0x2E
|
||||
#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
|
||||
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
|
||||
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
|
||||
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
|
||||
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
|
||||
|
||||
class Adafruit_SSD1306 : public Adafruit_GFX {
|
||||
public:
|
||||
Adafruit_SSD1306(int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS);
|
||||
Adafruit_SSD1306(int8_t DC, int8_t RST, int8_t CS);
|
||||
Adafruit_SSD1306(int8_t RST = -1);
|
||||
|
||||
bool begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC, uint8_t i2caddr = SSD1306_I2C_ADDRESS, bool reset=true);
|
||||
uint8_t ssd1306_command(uint8_t c);
|
||||
|
||||
void clearDisplay(void);
|
||||
void invertDisplay(uint8_t i);
|
||||
void display();
|
||||
|
||||
void startscrollright(uint8_t start, uint8_t stop);
|
||||
void startscrollleft(uint8_t start, uint8_t stop);
|
||||
|
||||
void startscrolldiagright(uint8_t start, uint8_t stop);
|
||||
void startscrolldiagleft(uint8_t start, uint8_t stop);
|
||||
void stopscroll(void);
|
||||
|
||||
void dim(boolean dim);
|
||||
|
||||
void drawPixel(int16_t x, int16_t y, uint16_t color);
|
||||
|
||||
virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||
virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||
|
||||
private:
|
||||
int8_t _i2caddr, _vccstate, sid, sclk, dc, rst, cs;
|
||||
void fastSPIwrite(uint8_t c);
|
||||
|
||||
boolean hwSPI;
|
||||
#ifdef HAVE_PORTREG
|
||||
PortReg *mosiport, *clkport, *csport, *dcport;
|
||||
PortMask mosipinmask, clkpinmask, cspinmask, dcpinmask;
|
||||
#endif
|
||||
|
||||
inline void drawFastVLineInternal(int16_t x, int16_t y, int16_t h, uint16_t color) __attribute__((always_inline));
|
||||
inline void drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color) __attribute__((always_inline));
|
||||
|
||||
};
|
||||
|
||||
#endif /* _Adafruit_SSD1306_H_ */
|
||||
/*********************************************************************
|
||||
This is a library for our Monochrome OLEDs based on SSD1306 drivers
|
||||
|
||||
Pick one up today in the adafruit shop!
|
||||
------> http://www.adafruit.com/category/63_98
|
||||
|
||||
These displays use SPI to communicate, 4 or 5 pins are required to
|
||||
interface
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
BSD license, check license.txt for more information
|
||||
All text above, and the splash screen must be included in any redistribution
|
||||
*********************************************************************/
|
||||
#ifndef _Adafruit_SSD1306_H_
|
||||
#define _Adafruit_SSD1306_H_
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#define WIRE_WRITE Wire.write
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#define WIRE_WRITE Wire.send
|
||||
#endif
|
||||
|
||||
#if defined(__SAM3X8E__)
|
||||
typedef volatile RwReg PortReg;
|
||||
typedef uint32_t PortMask;
|
||||
#define HAVE_PORTREG
|
||||
#elif defined(ARDUINO_ARCH_SAMD)
|
||||
// not supported
|
||||
#elif defined(ESP8266) || defined(ARDUINO_STM32_FEATHER)
|
||||
typedef volatile uint32_t PortReg;
|
||||
typedef uint32_t PortMask;
|
||||
#else
|
||||
typedef volatile uint8_t PortReg;
|
||||
typedef uint8_t PortMask;
|
||||
#define HAVE_PORTREG
|
||||
#endif
|
||||
|
||||
#include <SPI.h>
|
||||
#include "Adafruit_GFX.h"
|
||||
|
||||
#define BLACK 0
|
||||
#define WHITE 1
|
||||
#define INVERSE 2
|
||||
|
||||
#define SSD1306_I2C_ADDRESS 0x3C // 011110+SA0+RW - 0x3C or 0x3D
|
||||
// Address for 128x32 is 0x3C
|
||||
// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)
|
||||
|
||||
/*=========================================================================
|
||||
SSD1306 Displays
|
||||
-----------------------------------------------------------------------
|
||||
The driver is used in multiple displays (128x64, 128x32, etc.).
|
||||
Select the appropriate display below to create an appropriately
|
||||
sized framebuffer, etc.
|
||||
|
||||
SSD1306_128_64 128x64 pixel display
|
||||
|
||||
SSD1306_128_32 128x32 pixel display
|
||||
|
||||
SSD1306_96_16
|
||||
|
||||
-----------------------------------------------------------------------*/
|
||||
#define SSD1306_128_64
|
||||
// #define SSD1306_128_32
|
||||
// #define SSD1306_96_16
|
||||
/*=========================================================================*/
|
||||
|
||||
#if defined SSD1306_128_64 && defined SSD1306_128_32
|
||||
#error "Only one SSD1306 display can be specified at once in SSD1306.h"
|
||||
#endif
|
||||
#if !defined SSD1306_128_64 && !defined SSD1306_128_32 && !defined SSD1306_96_16
|
||||
#error "At least one SSD1306 display must be specified in SSD1306.h"
|
||||
#endif
|
||||
|
||||
#if defined SSD1306_128_64
|
||||
#define SSD1306_LCDWIDTH 128
|
||||
#define SSD1306_LCDHEIGHT 64
|
||||
#endif
|
||||
#if defined SSD1306_128_32
|
||||
#define SSD1306_LCDWIDTH 128
|
||||
#define SSD1306_LCDHEIGHT 32
|
||||
#endif
|
||||
#if defined SSD1306_96_16
|
||||
#define SSD1306_LCDWIDTH 96
|
||||
#define SSD1306_LCDHEIGHT 16
|
||||
#endif
|
||||
|
||||
#define SSD1306_SETCONTRAST 0x81
|
||||
#define SSD1306_DISPLAYALLON_RESUME 0xA4
|
||||
#define SSD1306_DISPLAYALLON 0xA5
|
||||
#define SSD1306_NORMALDISPLAY 0xA6
|
||||
#define SSD1306_INVERTDISPLAY 0xA7
|
||||
#define SSD1306_DISPLAYOFF 0xAE
|
||||
#define SSD1306_DISPLAYON 0xAF
|
||||
|
||||
#define SSD1306_SETDISPLAYOFFSET 0xD3
|
||||
#define SSD1306_SETCOMPINS 0xDA
|
||||
|
||||
#define SSD1306_SETVCOMDETECT 0xDB
|
||||
|
||||
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
|
||||
#define SSD1306_SETPRECHARGE 0xD9
|
||||
|
||||
#define SSD1306_SETMULTIPLEX 0xA8
|
||||
|
||||
#define SSD1306_SETLOWCOLUMN 0x00
|
||||
#define SSD1306_SETHIGHCOLUMN 0x10
|
||||
|
||||
#define SSD1306_SETSTARTLINE 0x40
|
||||
|
||||
#define SSD1306_MEMORYMODE 0x20
|
||||
#define SSD1306_COLUMNADDR 0x21
|
||||
#define SSD1306_PAGEADDR 0x22
|
||||
|
||||
#define SSD1306_COMSCANINC 0xC0
|
||||
#define SSD1306_COMSCANDEC 0xC8
|
||||
|
||||
#define SSD1306_SEGREMAP 0xA0
|
||||
|
||||
#define SSD1306_CHARGEPUMP 0x8D
|
||||
|
||||
#define SSD1306_EXTERNALVCC 0x1
|
||||
#define SSD1306_SWITCHCAPVCC 0x2
|
||||
|
||||
// Scrolling #defines
|
||||
#define SSD1306_ACTIVATE_SCROLL 0x2F
|
||||
#define SSD1306_DEACTIVATE_SCROLL 0x2E
|
||||
#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
|
||||
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
|
||||
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
|
||||
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
|
||||
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
|
||||
|
||||
class Adafruit_SSD1306 : public Adafruit_GFX {
|
||||
public:
|
||||
Adafruit_SSD1306(int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS);
|
||||
Adafruit_SSD1306(int8_t DC, int8_t RST, int8_t CS);
|
||||
Adafruit_SSD1306(int8_t RST = -1);
|
||||
|
||||
bool begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC, uint8_t i2caddr = SSD1306_I2C_ADDRESS, bool reset=true);
|
||||
uint8_t ssd1306_command(uint8_t c);
|
||||
|
||||
void clearDisplay(void);
|
||||
void invertDisplay(uint8_t i);
|
||||
void display();
|
||||
|
||||
void startscrollright(uint8_t start, uint8_t stop);
|
||||
void startscrollleft(uint8_t start, uint8_t stop);
|
||||
|
||||
void startscrolldiagright(uint8_t start, uint8_t stop);
|
||||
void startscrolldiagleft(uint8_t start, uint8_t stop);
|
||||
void stopscroll(void);
|
||||
|
||||
void dim(boolean dim);
|
||||
|
||||
void drawPixel(int16_t x, int16_t y, uint16_t color);
|
||||
|
||||
virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
|
||||
virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
|
||||
|
||||
private:
|
||||
int8_t _i2caddr, _vccstate, sid, sclk, dc, rst, cs;
|
||||
void fastSPIwrite(uint8_t c);
|
||||
|
||||
boolean hwSPI;
|
||||
#ifdef HAVE_PORTREG
|
||||
PortReg *mosiport, *clkport, *csport, *dcport;
|
||||
PortMask mosipinmask, clkpinmask, cspinmask, dcpinmask;
|
||||
#endif
|
||||
|
||||
inline void drawFastVLineInternal(int16_t x, int16_t y, int16_t h, uint16_t color) __attribute__((always_inline));
|
||||
inline void drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color) __attribute__((always_inline));
|
||||
|
||||
};
|
||||
|
||||
#endif /* _Adafruit_SSD1306_H_ */
|
||||
|
@ -1,192 +1,192 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "Flash.h"
|
||||
#include "syslog.h"
|
||||
|
||||
bool flashInit(void){
|
||||
if (NVMCTRL->PARAM.bit.PSZ != 3)
|
||||
{
|
||||
ERROR("FLASH PAGE SIZE is not 64 bytes");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static void erase(const volatile void *flash_ptr)
|
||||
{
|
||||
NVMCTRL->ADDR.reg = ((uint32_t)flash_ptr) / 2;
|
||||
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_ER;
|
||||
while (!NVMCTRL->INTFLAG.bit.READY) { }
|
||||
}
|
||||
|
||||
bool flashErase(const volatile void *flash_ptr, uint32_t size)
|
||||
{
|
||||
const uint8_t *ptr = (const uint8_t *)flash_ptr;
|
||||
while (size > FLASH_ROW_SIZE) {
|
||||
erase(ptr);
|
||||
ptr += FLASH_ROW_SIZE;
|
||||
size -= FLASH_ROW_SIZE;
|
||||
}
|
||||
if (size>0)
|
||||
{
|
||||
erase(ptr);
|
||||
}
|
||||
return true; //TODO should verify the erase
|
||||
}
|
||||
|
||||
static inline uint32_t read_unaligned_uint32(const void *data)
|
||||
{
|
||||
union {
|
||||
uint32_t u32;
|
||||
uint8_t u8[4];
|
||||
} res;
|
||||
const uint8_t *d = (const uint8_t *)data;
|
||||
res.u8[0] = d[0];
|
||||
res.u8[1] = d[1];
|
||||
res.u8[2] = d[2];
|
||||
res.u8[3] = d[3];
|
||||
return res.u32;
|
||||
}
|
||||
|
||||
|
||||
void flashWrite(const volatile void *flash_ptr,const void *data, uint32_t size)
|
||||
{
|
||||
uint32_t *ptrPage;
|
||||
uint8_t *destPtr;
|
||||
uint8_t *srcPtr;
|
||||
uint32_t bytesInBlock;
|
||||
__attribute__((__aligned__(4))) uint8_t buffer[FLASH_ROW_SIZE];
|
||||
uint32_t offset;
|
||||
|
||||
destPtr=(uint8_t *)flash_ptr;
|
||||
srcPtr=(uint8_t *)data;
|
||||
|
||||
//LOG("flash write called");
|
||||
while(size>0)
|
||||
{
|
||||
uint32_t i,j;
|
||||
|
||||
//calculate the maximum number of bytes we can write in page
|
||||
offset=((uint32_t)destPtr)%(FLASH_ROW_SIZE); //offset into page
|
||||
bytesInBlock=FLASH_ROW_SIZE-offset; //this is how many bytes we need to overwrite in this page
|
||||
|
||||
//LOG("offset %d, bytesInBlock %d size %d", offset, bytesInBlock,size);
|
||||
//get pointer to start of page
|
||||
ptrPage=(uint32_t *) ((((uint32_t)destPtr)/(FLASH_ROW_SIZE)) * FLASH_ROW_SIZE);
|
||||
|
||||
//LOG("pointer to page %d(0x%08x) %d",(uint32_t)ptrPage,(uint32_t)ptrPage,destPtr);
|
||||
|
||||
//fill page buffer with data from flash
|
||||
memcpy(buffer,ptrPage,FLASH_ROW_SIZE);
|
||||
|
||||
//now fill buffer with new data that needs changing
|
||||
i=bytesInBlock;
|
||||
if (size<i)
|
||||
{
|
||||
i=size;
|
||||
}
|
||||
//LOG("changing %d bytes",i);
|
||||
memcpy(&buffer[offset],srcPtr,i);
|
||||
|
||||
//erase page
|
||||
flashErase(ptrPage,FLASH_ROW_SIZE);
|
||||
//write new data to flash
|
||||
flashWritePage(ptrPage,buffer,FLASH_ROW_SIZE);
|
||||
|
||||
uint32_t *ptr=(uint32_t *)buffer;
|
||||
for (j=0; j<FLASH_ROW_SIZE/4; j++)
|
||||
{
|
||||
if (*ptrPage != *ptr)
|
||||
{
|
||||
ERROR("write failed on byte %d %x %x",j,*ptrPage, *ptr);
|
||||
}
|
||||
ptrPage++;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
|
||||
size=size-i; //decrease number of bytes to write
|
||||
srcPtr+=i; //increase pointer to next bytes to read
|
||||
destPtr+=i; //increment destination pointer
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void flashWritePage(const volatile void *flash_ptr, const void *data, uint32_t size)
|
||||
{
|
||||
// Calculate data boundaries
|
||||
size = (size + 3) / 4; //convert bytes to words with rounding
|
||||
|
||||
volatile uint32_t *dst_addr = (volatile uint32_t *)flash_ptr;
|
||||
const uint8_t *src_addr = (uint8_t *)data;
|
||||
|
||||
if (0 != ((uint32_t)flash_ptr)%(FLASH_PAGE_SIZE))
|
||||
{
|
||||
ERROR("Flash page write must be on boundry");
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable automatic page write
|
||||
NVMCTRL->CTRLB.bit.MANW = 1;
|
||||
|
||||
// Do writes in pages
|
||||
while (size)
|
||||
{
|
||||
// Execute "PBC" Page Buffer Clear
|
||||
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC;
|
||||
while (NVMCTRL->INTFLAG.bit.READY == 0) { }
|
||||
|
||||
// Fill page buffer
|
||||
uint32_t i;
|
||||
for (i=0; i<(FLASH_PAGE_SIZE/4) && size; i++) //we write 4 bytes at a time
|
||||
{
|
||||
*dst_addr = read_unaligned_uint32(src_addr);
|
||||
src_addr += 4;
|
||||
dst_addr++;
|
||||
size--; //size is set to number of 32bit words in first line above
|
||||
}
|
||||
|
||||
// Execute "WP" Write Page
|
||||
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_WP;
|
||||
while (NVMCTRL->INTFLAG.bit.READY == 0) { }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "Flash.h"
|
||||
#include "syslog.h"
|
||||
|
||||
bool flashInit(void){
|
||||
if (NVMCTRL->PARAM.bit.PSZ != 3)
|
||||
{
|
||||
ERROR("FLASH PAGE SIZE is not 64 bytes");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static void erase(const volatile void *flash_ptr)
|
||||
{
|
||||
NVMCTRL->ADDR.reg = ((uint32_t)flash_ptr) / 2;
|
||||
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_ER;
|
||||
while (!NVMCTRL->INTFLAG.bit.READY) { }
|
||||
}
|
||||
|
||||
bool flashErase(const volatile void *flash_ptr, uint32_t size)
|
||||
{
|
||||
const uint8_t *ptr = (const uint8_t *)flash_ptr;
|
||||
while (size > FLASH_ROW_SIZE) {
|
||||
erase(ptr);
|
||||
ptr += FLASH_ROW_SIZE;
|
||||
size -= FLASH_ROW_SIZE;
|
||||
}
|
||||
if (size>0)
|
||||
{
|
||||
erase(ptr);
|
||||
}
|
||||
return true; //TODO should verify the erase
|
||||
}
|
||||
|
||||
static inline uint32_t read_unaligned_uint32(const void *data)
|
||||
{
|
||||
union {
|
||||
uint32_t u32;
|
||||
uint8_t u8[4];
|
||||
} res;
|
||||
const uint8_t *d = (const uint8_t *)data;
|
||||
res.u8[0] = d[0];
|
||||
res.u8[1] = d[1];
|
||||
res.u8[2] = d[2];
|
||||
res.u8[3] = d[3];
|
||||
return res.u32;
|
||||
}
|
||||
|
||||
|
||||
void flashWrite(const volatile void *flash_ptr,const void *data, uint32_t size)
|
||||
{
|
||||
uint32_t *ptrPage;
|
||||
uint8_t *destPtr;
|
||||
uint8_t *srcPtr;
|
||||
uint32_t bytesInBlock;
|
||||
__attribute__((__aligned__(4))) uint8_t buffer[FLASH_ROW_SIZE];
|
||||
uint32_t offset;
|
||||
|
||||
destPtr=(uint8_t *)flash_ptr;
|
||||
srcPtr=(uint8_t *)data;
|
||||
|
||||
//LOG("flash write called");
|
||||
while(size>0)
|
||||
{
|
||||
uint32_t i,j;
|
||||
|
||||
//calculate the maximum number of bytes we can write in page
|
||||
offset=((uint32_t)destPtr)%(FLASH_ROW_SIZE); //offset into page
|
||||
bytesInBlock=FLASH_ROW_SIZE-offset; //this is how many bytes we need to overwrite in this page
|
||||
|
||||
//LOG("offset %d, bytesInBlock %d size %d", offset, bytesInBlock,size);
|
||||
//get pointer to start of page
|
||||
ptrPage=(uint32_t *) ((((uint32_t)destPtr)/(FLASH_ROW_SIZE)) * FLASH_ROW_SIZE);
|
||||
|
||||
//LOG("pointer to page %d(0x%08x) %d",(uint32_t)ptrPage,(uint32_t)ptrPage,destPtr);
|
||||
|
||||
//fill page buffer with data from flash
|
||||
memcpy(buffer,ptrPage,FLASH_ROW_SIZE);
|
||||
|
||||
//now fill buffer with new data that needs changing
|
||||
i=bytesInBlock;
|
||||
if (size<i)
|
||||
{
|
||||
i=size;
|
||||
}
|
||||
//LOG("changing %d bytes",i);
|
||||
memcpy(&buffer[offset],srcPtr,i);
|
||||
|
||||
//erase page
|
||||
flashErase(ptrPage,FLASH_ROW_SIZE);
|
||||
//write new data to flash
|
||||
flashWritePage(ptrPage,buffer,FLASH_ROW_SIZE);
|
||||
|
||||
uint32_t *ptr=(uint32_t *)buffer;
|
||||
for (j=0; j<FLASH_ROW_SIZE/4; j++)
|
||||
{
|
||||
if (*ptrPage != *ptr)
|
||||
{
|
||||
ERROR("write failed on byte %d %x %x",j,*ptrPage, *ptr);
|
||||
}
|
||||
ptrPage++;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
|
||||
size=size-i; //decrease number of bytes to write
|
||||
srcPtr+=i; //increase pointer to next bytes to read
|
||||
destPtr+=i; //increment destination pointer
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void flashWritePage(const volatile void *flash_ptr, const void *data, uint32_t size)
|
||||
{
|
||||
// Calculate data boundaries
|
||||
size = (size + 3) / 4; //convert bytes to words with rounding
|
||||
|
||||
volatile uint32_t *dst_addr = (volatile uint32_t *)flash_ptr;
|
||||
const uint8_t *src_addr = (uint8_t *)data;
|
||||
|
||||
if (0 != ((uint32_t)flash_ptr)%(FLASH_PAGE_SIZE))
|
||||
{
|
||||
ERROR("Flash page write must be on boundry");
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable automatic page write
|
||||
NVMCTRL->CTRLB.bit.MANW = 1;
|
||||
|
||||
// Do writes in pages
|
||||
while (size)
|
||||
{
|
||||
// Execute "PBC" Page Buffer Clear
|
||||
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC;
|
||||
while (NVMCTRL->INTFLAG.bit.READY == 0) { }
|
||||
|
||||
// Fill page buffer
|
||||
uint32_t i;
|
||||
for (i=0; i<(FLASH_PAGE_SIZE/4) && size; i++) //we write 4 bytes at a time
|
||||
{
|
||||
*dst_addr = read_unaligned_uint32(src_addr);
|
||||
src_addr += 4;
|
||||
dst_addr++;
|
||||
size--; //size is set to number of 32bit words in first line above
|
||||
}
|
||||
|
||||
// Execute "WP" Write Page
|
||||
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_WP;
|
||||
while (NVMCTRL->INTFLAG.bit.READY == 0) { }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,68 +1,68 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __FLASH__H__
|
||||
#define __FLASH__H__
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
|
||||
|
||||
#define FLASH_PAGE_SIZE_NZS (64) //bytes
|
||||
#define FLASH_ROW_SIZE (FLASH_PAGE_SIZE_NZS*4) //defined in the datasheet as 4x page size
|
||||
#define FLASH_ERASE_VALUE (0xFF) //value of flash after an erase
|
||||
|
||||
#define FLASH_ALLOCATE(name, size) \
|
||||
__attribute__((__aligned__(FLASH_ROW_SIZE))) \
|
||||
const uint8_t name[(size+(FLASH_ROW_SIZE-1))/FLASH_ROW_SIZE*FLASH_ROW_SIZE] = { };
|
||||
|
||||
bool flashInit(void); //this checks that our assumptions are true
|
||||
|
||||
bool flashErase(const volatile void *flash_ptr, uint32_t size);
|
||||
void flashWrite(const volatile void *flash_ptr,const void *data,uint32_t size);
|
||||
void flashWritePage(const volatile void *flash_ptr, const void *data, uint32_t size);
|
||||
|
||||
//you can read by dereferencing pointer but we will add a read
|
||||
static inline int32_t flashRead(const volatile void *flash_ptr, void *data, uint32_t size)
|
||||
{
|
||||
memcpy(data, (const void *)flash_ptr, size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#endif //__FLASH__H__
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __FLASH__H__
|
||||
#define __FLASH__H__
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
|
||||
|
||||
#define FLASH_PAGE_SIZE_NZS (64) //bytes
|
||||
#define FLASH_ROW_SIZE (FLASH_PAGE_SIZE_NZS*4) //defined in the datasheet as 4x page size
|
||||
#define FLASH_ERASE_VALUE (0xFF) //value of flash after an erase
|
||||
|
||||
#define FLASH_ALLOCATE(name, size) \
|
||||
__attribute__((__aligned__(FLASH_ROW_SIZE))) \
|
||||
const uint8_t name[(size+(FLASH_ROW_SIZE-1))/FLASH_ROW_SIZE*FLASH_ROW_SIZE] = { };
|
||||
|
||||
bool flashInit(void); //this checks that our assumptions are true
|
||||
|
||||
bool flashErase(const volatile void *flash_ptr, uint32_t size);
|
||||
void flashWrite(const volatile void *flash_ptr,const void *data,uint32_t size);
|
||||
void flashWritePage(const volatile void *flash_ptr, const void *data, uint32_t size);
|
||||
|
||||
//you can read by dereferencing pointer but we will add a read
|
||||
static inline int32_t flashRead(const volatile void *flash_ptr, void *data, uint32_t size)
|
||||
{
|
||||
memcpy(data, (const void *)flash_ptr, size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#endif //__FLASH__H__
|
||||
|
@ -1,147 +1,147 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef ANGLE_H_
|
||||
#define ANGLE_H_
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
|
||||
#define ANGLE_STEPS (0x010000UL)
|
||||
#define ANGLE_MAX ((uint16_t)0x0FFFF)
|
||||
|
||||
#define ANGLE_FROM_DEGREES(x) ((int32_t) ( ((float)ANGLE_STEPS*(float)(x)+180.0)/360.0 ) )
|
||||
#define ANGLE_T0_DEGREES(x) ( (float) ((float(x)*360.0)/((float)ANGLE_STEPS) ))
|
||||
class Angle
|
||||
{
|
||||
private:
|
||||
uint16_t angle;
|
||||
public:
|
||||
Angle(void) {angle=0;}
|
||||
Angle(int32_t x) {angle=(uint16_t)x;}
|
||||
Angle(const Angle &x) {angle=x.angle;}
|
||||
|
||||
int16_t operator-( const Angle &a2)
|
||||
{
|
||||
int32_t x,y,dx;
|
||||
x=(int32_t)angle;
|
||||
y=(int32_t)a2.angle;
|
||||
dx=x-y;
|
||||
if (abs(x-y)>ANGLE_STEPS/2)
|
||||
{
|
||||
//we have a wrap condition
|
||||
if (x>y)
|
||||
{
|
||||
dx=x-(y+ANGLE_STEPS);
|
||||
}else if (x<y)
|
||||
{
|
||||
dx=(ANGLE_STEPS+x)-y;
|
||||
}
|
||||
}
|
||||
return (int16_t)dx;
|
||||
}
|
||||
//
|
||||
// int16_t operator-( const int32_t y)
|
||||
// {
|
||||
// int32_t x,y,dx;
|
||||
// x=(int32_t)angle;
|
||||
// while(y>ANGLE_MAX)
|
||||
// {
|
||||
// y=y-ANGLE_STEPS;
|
||||
// }
|
||||
// while(y<-ANGLE_MAX)
|
||||
// {
|
||||
// y=y+ANGLE_STEPS;
|
||||
// }
|
||||
//
|
||||
// dx=x-y;
|
||||
// if (abs(x-y)>ANGLE_STEPS/2)
|
||||
// {
|
||||
// //we have a wrap condition
|
||||
// if (x>y)
|
||||
// {
|
||||
// dx=x-(y+ANGLE_STEPS);
|
||||
// }else if (x<y)
|
||||
// {
|
||||
// dx=(ANGLE_STEPS+x)-y;
|
||||
// }
|
||||
// }
|
||||
// return (int16_t)dx;
|
||||
// }
|
||||
|
||||
Angle operator+(const Angle &y)
|
||||
{
|
||||
uint16_t a;
|
||||
a=angle+ (uint16_t)y.angle;
|
||||
return Angle(a);
|
||||
}
|
||||
Angle operator+(const long int x)
|
||||
{
|
||||
int32_t a;
|
||||
a=(int32_t)angle+ x;
|
||||
while (a>=ANGLE_STEPS)
|
||||
{
|
||||
a=a-ANGLE_STEPS;
|
||||
}
|
||||
while (a<0)
|
||||
{
|
||||
a=a+ANGLE_STEPS;
|
||||
}
|
||||
return Angle((uint16_t)a);
|
||||
}
|
||||
Angle operator+(const unsigned long int x)
|
||||
{
|
||||
uint32_t a;
|
||||
a=(uint32_t)angle+ x;
|
||||
while (a>=ANGLE_STEPS)
|
||||
{
|
||||
a=a-ANGLE_STEPS;
|
||||
}
|
||||
return Angle((uint16_t)a);
|
||||
}
|
||||
|
||||
operator uint16_t() const {return angle;}
|
||||
operator uint32_t() const {return (uint32_t)angle;}
|
||||
operator int32_t() const {return (int32_t)angle;}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif /* ANGLE_H_ */
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef ANGLE_H_
|
||||
#define ANGLE_H_
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
|
||||
#define ANGLE_STEPS (0x010000UL)
|
||||
#define ANGLE_MAX ((uint16_t)0x0FFFF)
|
||||
|
||||
#define ANGLE_FROM_DEGREES(x) ((int32_t) ( ((float)ANGLE_STEPS*(float)(x)+180.0)/360.0 ) )
|
||||
#define ANGLE_T0_DEGREES(x) ( (float) ((float(x)*360.0)/((float)ANGLE_STEPS) ))
|
||||
class Angle
|
||||
{
|
||||
private:
|
||||
uint16_t angle;
|
||||
public:
|
||||
Angle(void) {angle=0;}
|
||||
Angle(int32_t x) {angle=(uint16_t)x;}
|
||||
Angle(const Angle &x) {angle=x.angle;}
|
||||
|
||||
int16_t operator-( const Angle &a2)
|
||||
{
|
||||
int32_t x,y,dx;
|
||||
x=(int32_t)angle;
|
||||
y=(int32_t)a2.angle;
|
||||
dx=x-y;
|
||||
if (abs(x-y)>ANGLE_STEPS/2)
|
||||
{
|
||||
//we have a wrap condition
|
||||
if (x>y)
|
||||
{
|
||||
dx=x-(y+ANGLE_STEPS);
|
||||
}else if (x<y)
|
||||
{
|
||||
dx=(ANGLE_STEPS+x)-y;
|
||||
}
|
||||
}
|
||||
return (int16_t)dx;
|
||||
}
|
||||
//
|
||||
// int16_t operator-( const int32_t y)
|
||||
// {
|
||||
// int32_t x,y,dx;
|
||||
// x=(int32_t)angle;
|
||||
// while(y>ANGLE_MAX)
|
||||
// {
|
||||
// y=y-ANGLE_STEPS;
|
||||
// }
|
||||
// while(y<-ANGLE_MAX)
|
||||
// {
|
||||
// y=y+ANGLE_STEPS;
|
||||
// }
|
||||
//
|
||||
// dx=x-y;
|
||||
// if (abs(x-y)>ANGLE_STEPS/2)
|
||||
// {
|
||||
// //we have a wrap condition
|
||||
// if (x>y)
|
||||
// {
|
||||
// dx=x-(y+ANGLE_STEPS);
|
||||
// }else if (x<y)
|
||||
// {
|
||||
// dx=(ANGLE_STEPS+x)-y;
|
||||
// }
|
||||
// }
|
||||
// return (int16_t)dx;
|
||||
// }
|
||||
|
||||
Angle operator+(const Angle &y)
|
||||
{
|
||||
uint16_t a;
|
||||
a=angle+ (uint16_t)y.angle;
|
||||
return Angle(a);
|
||||
}
|
||||
Angle operator+(const long int x)
|
||||
{
|
||||
int32_t a;
|
||||
a=(int32_t)angle+ x;
|
||||
while (a>=ANGLE_STEPS)
|
||||
{
|
||||
a=a-ANGLE_STEPS;
|
||||
}
|
||||
while (a<0)
|
||||
{
|
||||
a=a+ANGLE_STEPS;
|
||||
}
|
||||
return Angle((uint16_t)a);
|
||||
}
|
||||
Angle operator+(const unsigned long int x)
|
||||
{
|
||||
uint32_t a;
|
||||
a=(uint32_t)angle+ x;
|
||||
while (a>=ANGLE_STEPS)
|
||||
{
|
||||
a=a-ANGLE_STEPS;
|
||||
}
|
||||
return Angle((uint16_t)a);
|
||||
}
|
||||
|
||||
operator uint16_t() const {return angle;}
|
||||
operator uint32_t() const {return (uint32_t)angle;}
|
||||
operator int32_t() const {return (int32_t)angle;}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif /* ANGLE_H_ */
|
||||
|
@ -1,322 +1,322 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
#include "as5047d.h"
|
||||
#include "SPI.h"
|
||||
#include <stdio.h>
|
||||
#include "board.h"
|
||||
|
||||
#define AS5047D_CMD_NOP (0x0000)
|
||||
#define AS5047D_CMD_ERRFL (0x0001)
|
||||
#define AS5047D_CMD_PROG (0x0003)
|
||||
#define AS5047D_CMD_DIAAGC (0x3FFC)
|
||||
#define AS5047D_CMD_MAG (0x3FFD)
|
||||
#define AS5047D_CMD_ANGLEUNC (0x3FFE)
|
||||
#define AS5047D_CMD_ANGLECOM (0x3FFF)
|
||||
|
||||
|
||||
#define AS5048A_CMD_NOP (0x0000)
|
||||
#define AS5048A_CMD_ERRFL (0x0001)
|
||||
#define AS5048A_CMD_PROG (0x0003)
|
||||
#define AS5048A_CMD_DIAAGC (0x3FFD)
|
||||
#define AS5048A_CMD_MAG (0x3FFE)
|
||||
#define AS5048A_CMD_ANGLE (0x3FFF)
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-Ofast")
|
||||
|
||||
static int getBit(int16_t data, int bit)
|
||||
{
|
||||
return (data>>bit) & 0x01;
|
||||
}
|
||||
|
||||
static int getParity(uint16_t data)
|
||||
{
|
||||
int i,bits;
|
||||
data=data & 0x7FFF; //mask out upper bit
|
||||
|
||||
//count number of bits, brute force
|
||||
bits=0;
|
||||
for(i=0; i<16; i++)
|
||||
{
|
||||
if (0 != (data & ((0x0001)<<i)))
|
||||
{
|
||||
bits++;
|
||||
}
|
||||
}
|
||||
return (bits & 0x01); //return 1 if odd
|
||||
}
|
||||
|
||||
boolean AS5047D::begin(int csPin)
|
||||
{
|
||||
#ifdef PIN_AS5047D_PWR
|
||||
digitalWrite(PIN_AS5047D_PWR,HIGH);
|
||||
#endif
|
||||
digitalWrite(PIN_AS5047D_CS,LOW); //pull CS LOW by default (chip powered off)
|
||||
digitalWrite(PIN_MOSI,LOW);
|
||||
digitalWrite(PIN_SCK,LOW);
|
||||
digitalWrite(PIN_MISO,LOW);
|
||||
pinMode(PIN_MISO,OUTPUT);
|
||||
delay(1000);
|
||||
|
||||
|
||||
digitalWrite(PIN_AS5047D_CS,HIGH); //pull CS high
|
||||
#ifdef PIN_AS5047D_PWR
|
||||
digitalWrite(PIN_AS5047D_PWR,LOW);
|
||||
#endif
|
||||
|
||||
pinMode(PIN_MISO,INPUT);
|
||||
|
||||
error=false;
|
||||
SPISettings settingsA(5000000, MSBFIRST, SPI_MODE1); ///400000, MSBFIRST, SPI_MODE1);
|
||||
chipSelectPin=csPin;
|
||||
|
||||
LOG("csPin is %d",csPin);
|
||||
pinMode(chipSelectPin,OUTPUT);
|
||||
digitalWrite(chipSelectPin,HIGH); //pull CS high by default
|
||||
delay(1);
|
||||
SPI.begin(); //AS5047D SPI uses mode=1 (CPOL=0, CPHA=1)
|
||||
LOG("Begin AS5047D...");
|
||||
|
||||
SPI.beginTransaction(settingsA);
|
||||
SPI.transfer16(AS5047D_CMD_NOP);
|
||||
delay(10);
|
||||
|
||||
//wait for the LF bit to be set
|
||||
uint16_t data=0,t0=100;
|
||||
while (getBit(data,8)==0 && t0>0)
|
||||
{
|
||||
delay(1);
|
||||
t0--;
|
||||
if (t0==0)
|
||||
{
|
||||
ERROR("LF bit not set");
|
||||
error=true;
|
||||
break;
|
||||
//return false;
|
||||
}
|
||||
LOG("AS5047D diag data is 0x%04X",data);
|
||||
data=readAddress(AS5047D_CMD_DIAAGC);
|
||||
}
|
||||
|
||||
if (error)
|
||||
{
|
||||
error=false;
|
||||
uint16_t data=0,t0=100;
|
||||
while (getBit(data,8)==0 && t0>0)
|
||||
{
|
||||
delay(1);
|
||||
t0--;
|
||||
if (t0==0)
|
||||
{
|
||||
ERROR("AS5048A OCF bit not set");
|
||||
error=true;
|
||||
return false;
|
||||
}
|
||||
data=readAddress(AS5048A_CMD_DIAAGC);
|
||||
LOG("AS5048A diag data is 0x%04X",data);
|
||||
}
|
||||
as5047d=false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef NZS_AS5047_PIPELINE
|
||||
//read encoder a few times to flush the pipeline
|
||||
readEncoderAnglePipeLineRead();
|
||||
readEncoderAnglePipeLineRead();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//read the encoders
|
||||
int16_t AS5047D::readAddress(uint16_t addr)
|
||||
{
|
||||
uint16_t data;
|
||||
error=false;
|
||||
//make sure it is a read by setting bit 14
|
||||
addr=addr | 0x4000;
|
||||
|
||||
//add the parity to the command
|
||||
if (1 == getParity(addr))
|
||||
{
|
||||
addr=(addr & 0x7FFF) | 0x8000; //add parity bit to make command even number of bits
|
||||
}
|
||||
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out the address to read
|
||||
SPI.transfer16(addr);
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
delayMicroseconds(1);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
//clock out zeros to read in the data from address
|
||||
data=SPI.transfer16(0x00);
|
||||
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
|
||||
if (data & (1<<14))
|
||||
{
|
||||
//if bit 14 is set then we have an error
|
||||
ERROR("read command 0x%04X failed",addr);
|
||||
error=true;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (data>>15 != getParity(data))
|
||||
{
|
||||
//parity did not match
|
||||
ERROR("read command parity error 0x%04X ",addr);
|
||||
error=true;
|
||||
return -2;
|
||||
}
|
||||
|
||||
data=data & 0x3FFF; //mask off the error and parity bits
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
//read the encoders
|
||||
int16_t AS5047D::readEncoderAngle(void)
|
||||
{
|
||||
if (as5047d)
|
||||
{
|
||||
return readAddress(AS5047D_CMD_ANGLECOM);
|
||||
}
|
||||
return readAddress(AS5048A_CMD_ANGLE);
|
||||
}
|
||||
|
||||
//pipelined read of the encoder angle used for high speed reads, but value is always one read behind
|
||||
int16_t AS5047D::readEncoderAnglePipeLineRead(void)
|
||||
{
|
||||
|
||||
int16_t data;
|
||||
int error, t0=10;
|
||||
GPIO_LOW(chipSelectPin);//(chipSelectPin, LOW);
|
||||
//delayMicroseconds(1);
|
||||
do {
|
||||
|
||||
// doing two 8 bit transfers is faster than one 16 bit
|
||||
data =(uint16_t)SPI.transfer(0xFF)<<8 | ((uint16_t)SPI.transfer(0xFF) & 0x0FF);
|
||||
t0--;
|
||||
if (t0<=0)
|
||||
{
|
||||
ERROR("AS5047D problem");
|
||||
break;
|
||||
}
|
||||
//data=SPI.transfer16(0xFFFF); //to speed things up we know the parity and address for the read
|
||||
}while(data & (1<<14)); //while error bit is set
|
||||
|
||||
data=data & 0x3FFF; //mask off the error and parity bits
|
||||
GPIO_HIGH(chipSelectPin);
|
||||
//digitalWrite(chipSelectPin, HIGH);
|
||||
//TODO we really should check for errors and return a negative result or something
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void AS5047D::diagnostics(char *ptrStr)
|
||||
{
|
||||
int16_t data;
|
||||
int m,d;
|
||||
|
||||
if (as5047d)
|
||||
{
|
||||
|
||||
data=readAddress(AS5047D_CMD_DIAAGC);
|
||||
|
||||
if (NULL == ptrStr)
|
||||
{
|
||||
LOG("DIAAGC: 0x%04X", data);
|
||||
LOG("MAGL: %d", getBit(data,11));
|
||||
LOG("MAGH: %d", getBit(data,10));
|
||||
LOG("COF: %d", getBit(data,9));
|
||||
LOG("LFGL: %d", getBit(data,8));
|
||||
LOG("AGC: %d", data & 0x0FF);
|
||||
|
||||
data=readAddress(AS5047D_CMD_MAG);
|
||||
LOG("CMAG: 0x%04X(%d)",data,data);
|
||||
|
||||
data=readAddress(AS5047D_CMD_ANGLEUNC);
|
||||
m=(int)((float)data*AS5047D_DEGREES_PER_BIT);
|
||||
d=(int)((float)data*AS5047D_DEGREES_PER_BIT*100 -m*100);
|
||||
LOG("CORDICANG: 0x%04X(%d) %d.%02d deg(est)",data,data,m,d);
|
||||
|
||||
data=readAddress(AS5047D_CMD_ANGLECOM);
|
||||
m=(int)((float)data*AS5047D_DEGREES_PER_BIT);
|
||||
d=(int)((float)data*AS5047D_DEGREES_PER_BIT*100 -m*100);
|
||||
LOG("DAECANG: 0x%04X(%d) %d.%02d deg(est)",data,data,m,d);
|
||||
}else
|
||||
{
|
||||
sprintf(ptrStr,"DIAAGC: 0x%04X\n\r", data);
|
||||
sprintf(ptrStr,"%sMAGL: %d\n\r", ptrStr,getBit(data,11));
|
||||
sprintf(ptrStr,"%sMAGH: %d\n\r", ptrStr,getBit(data,10));
|
||||
sprintf(ptrStr,"%sCOF: %d\n\r", ptrStr, getBit(data,9));
|
||||
sprintf(ptrStr,"%sLFGL: %d\n\r", ptrStr, getBit(data,8));
|
||||
sprintf(ptrStr,"%sAGC: %d\n\r", ptrStr,data & 0x0FF);
|
||||
|
||||
data=readAddress(AS5047D_CMD_MAG);
|
||||
sprintf(ptrStr,"%sCMAG: 0x%04X(%d)\n\r", ptrStr,data,data);
|
||||
|
||||
data=readAddress(AS5047D_CMD_ANGLEUNC);
|
||||
m=(int)((float)data*AS5047D_DEGREES_PER_BIT);
|
||||
d=(int)((float)data*AS5047D_DEGREES_PER_BIT*100 -m*100);
|
||||
sprintf(ptrStr,"%sCORDICANG: 0x%04X(%d) %d.%02d deg(est)\n\r", ptrStr,data,data,m,d);
|
||||
|
||||
data=readAddress(AS5047D_CMD_ANGLECOM);
|
||||
m=(int)((float)data*AS5047D_DEGREES_PER_BIT);
|
||||
d=(int)((float)data*AS5047D_DEGREES_PER_BIT*100 -m*100);
|
||||
sprintf(ptrStr,"%sDAECANG: 0x%04X(%d) %d.%02d deg(est)\n\r", ptrStr,data,data,m,d);
|
||||
|
||||
}
|
||||
} else
|
||||
{
|
||||
data=readAddress(AS5048A_CMD_DIAAGC);
|
||||
sprintf(ptrStr,"AS5048A DIAAGC: 0x%04X\n\r", data);
|
||||
data=readAddress(AS5048A_CMD_MAG);
|
||||
sprintf(ptrStr,"%sMagnitude: %d\n\r", ptrStr,data);
|
||||
data=readAddress(AS5048A_CMD_ANGLE);
|
||||
sprintf(ptrStr,"%sAngle: %d\n\r", ptrStr,data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#pragma GCC pop_options
|
||||
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
#include "as5047d.h"
|
||||
#include "SPI.h"
|
||||
#include <stdio.h>
|
||||
#include "board.h"
|
||||
|
||||
#define AS5047D_CMD_NOP (0x0000)
|
||||
#define AS5047D_CMD_ERRFL (0x0001)
|
||||
#define AS5047D_CMD_PROG (0x0003)
|
||||
#define AS5047D_CMD_DIAAGC (0x3FFC)
|
||||
#define AS5047D_CMD_MAG (0x3FFD)
|
||||
#define AS5047D_CMD_ANGLEUNC (0x3FFE)
|
||||
#define AS5047D_CMD_ANGLECOM (0x3FFF)
|
||||
|
||||
|
||||
#define AS5048A_CMD_NOP (0x0000)
|
||||
#define AS5048A_CMD_ERRFL (0x0001)
|
||||
#define AS5048A_CMD_PROG (0x0003)
|
||||
#define AS5048A_CMD_DIAAGC (0x3FFD)
|
||||
#define AS5048A_CMD_MAG (0x3FFE)
|
||||
#define AS5048A_CMD_ANGLE (0x3FFF)
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-Ofast")
|
||||
|
||||
static int getBit(int16_t data, int bit)
|
||||
{
|
||||
return (data>>bit) & 0x01;
|
||||
}
|
||||
|
||||
static int getParity(uint16_t data)
|
||||
{
|
||||
int i,bits;
|
||||
data=data & 0x7FFF; //mask out upper bit
|
||||
|
||||
//count number of bits, brute force
|
||||
bits=0;
|
||||
for(i=0; i<16; i++)
|
||||
{
|
||||
if (0 != (data & ((0x0001)<<i)))
|
||||
{
|
||||
bits++;
|
||||
}
|
||||
}
|
||||
return (bits & 0x01); //return 1 if odd
|
||||
}
|
||||
|
||||
boolean AS5047D::begin(int csPin)
|
||||
{
|
||||
#ifdef PIN_AS5047D_PWR
|
||||
digitalWrite(PIN_AS5047D_PWR,HIGH);
|
||||
#endif
|
||||
digitalWrite(PIN_AS5047D_CS,LOW); //pull CS LOW by default (chip powered off)
|
||||
digitalWrite(PIN_MOSI,LOW);
|
||||
digitalWrite(PIN_SCK,LOW);
|
||||
digitalWrite(PIN_MISO,LOW);
|
||||
pinMode(PIN_MISO,OUTPUT);
|
||||
delay(1000);
|
||||
|
||||
|
||||
digitalWrite(PIN_AS5047D_CS,HIGH); //pull CS high
|
||||
#ifdef PIN_AS5047D_PWR
|
||||
digitalWrite(PIN_AS5047D_PWR,LOW);
|
||||
#endif
|
||||
|
||||
pinMode(PIN_MISO,INPUT);
|
||||
|
||||
error=false;
|
||||
SPISettings settingsA(5000000, MSBFIRST, SPI_MODE1); ///400000, MSBFIRST, SPI_MODE1);
|
||||
chipSelectPin=csPin;
|
||||
|
||||
LOG("csPin is %d",csPin);
|
||||
pinMode(chipSelectPin,OUTPUT);
|
||||
digitalWrite(chipSelectPin,HIGH); //pull CS high by default
|
||||
delay(1);
|
||||
SPI.begin(); //AS5047D SPI uses mode=1 (CPOL=0, CPHA=1)
|
||||
LOG("Begin AS5047D...");
|
||||
|
||||
SPI.beginTransaction(settingsA);
|
||||
SPI.transfer16(AS5047D_CMD_NOP);
|
||||
delay(10);
|
||||
|
||||
//wait for the LF bit to be set
|
||||
uint16_t data=0,t0=100;
|
||||
while (getBit(data,8)==0 && t0>0)
|
||||
{
|
||||
delay(1);
|
||||
t0--;
|
||||
if (t0==0)
|
||||
{
|
||||
ERROR("LF bit not set");
|
||||
error=true;
|
||||
break;
|
||||
//return false;
|
||||
}
|
||||
LOG("AS5047D diag data is 0x%04X",data);
|
||||
data=readAddress(AS5047D_CMD_DIAAGC);
|
||||
}
|
||||
|
||||
if (error)
|
||||
{
|
||||
error=false;
|
||||
uint16_t data=0,t0=100;
|
||||
while (getBit(data,8)==0 && t0>0)
|
||||
{
|
||||
delay(1);
|
||||
t0--;
|
||||
if (t0==0)
|
||||
{
|
||||
ERROR("AS5048A OCF bit not set");
|
||||
error=true;
|
||||
return false;
|
||||
}
|
||||
data=readAddress(AS5048A_CMD_DIAAGC);
|
||||
LOG("AS5048A diag data is 0x%04X",data);
|
||||
}
|
||||
as5047d=false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef NZS_AS5047_PIPELINE
|
||||
//read encoder a few times to flush the pipeline
|
||||
readEncoderAnglePipeLineRead();
|
||||
readEncoderAnglePipeLineRead();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//read the encoders
|
||||
int16_t AS5047D::readAddress(uint16_t addr)
|
||||
{
|
||||
uint16_t data;
|
||||
error=false;
|
||||
//make sure it is a read by setting bit 14
|
||||
addr=addr | 0x4000;
|
||||
|
||||
//add the parity to the command
|
||||
if (1 == getParity(addr))
|
||||
{
|
||||
addr=(addr & 0x7FFF) | 0x8000; //add parity bit to make command even number of bits
|
||||
}
|
||||
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
delayMicroseconds(1);
|
||||
//clock out the address to read
|
||||
SPI.transfer16(addr);
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
delayMicroseconds(1);
|
||||
digitalWrite(chipSelectPin, LOW);
|
||||
//clock out zeros to read in the data from address
|
||||
data=SPI.transfer16(0x00);
|
||||
|
||||
digitalWrite(chipSelectPin, HIGH);
|
||||
|
||||
if (data & (1<<14))
|
||||
{
|
||||
//if bit 14 is set then we have an error
|
||||
ERROR("read command 0x%04X failed",addr);
|
||||
error=true;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (data>>15 != getParity(data))
|
||||
{
|
||||
//parity did not match
|
||||
ERROR("read command parity error 0x%04X ",addr);
|
||||
error=true;
|
||||
return -2;
|
||||
}
|
||||
|
||||
data=data & 0x3FFF; //mask off the error and parity bits
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
//read the encoders
|
||||
int16_t AS5047D::readEncoderAngle(void)
|
||||
{
|
||||
if (as5047d)
|
||||
{
|
||||
return readAddress(AS5047D_CMD_ANGLECOM);
|
||||
}
|
||||
return readAddress(AS5048A_CMD_ANGLE);
|
||||
}
|
||||
|
||||
//pipelined read of the encoder angle used for high speed reads, but value is always one read behind
|
||||
int16_t AS5047D::readEncoderAnglePipeLineRead(void)
|
||||
{
|
||||
|
||||
int16_t data;
|
||||
int error, t0=10;
|
||||
GPIO_LOW(chipSelectPin);//(chipSelectPin, LOW);
|
||||
//delayMicroseconds(1);
|
||||
do {
|
||||
|
||||
// doing two 8 bit transfers is faster than one 16 bit
|
||||
data =(uint16_t)SPI.transfer(0xFF)<<8 | ((uint16_t)SPI.transfer(0xFF) & 0x0FF);
|
||||
t0--;
|
||||
if (t0<=0)
|
||||
{
|
||||
ERROR("AS5047D problem");
|
||||
break;
|
||||
}
|
||||
//data=SPI.transfer16(0xFFFF); //to speed things up we know the parity and address for the read
|
||||
}while(data & (1<<14)); //while error bit is set
|
||||
|
||||
data=data & 0x3FFF; //mask off the error and parity bits
|
||||
GPIO_HIGH(chipSelectPin);
|
||||
//digitalWrite(chipSelectPin, HIGH);
|
||||
//TODO we really should check for errors and return a negative result or something
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void AS5047D::diagnostics(char *ptrStr)
|
||||
{
|
||||
int16_t data;
|
||||
int m,d;
|
||||
|
||||
if (as5047d)
|
||||
{
|
||||
|
||||
data=readAddress(AS5047D_CMD_DIAAGC);
|
||||
|
||||
if (NULL == ptrStr)
|
||||
{
|
||||
LOG("DIAAGC: 0x%04X", data);
|
||||
LOG("MAGL: %d", getBit(data,11));
|
||||
LOG("MAGH: %d", getBit(data,10));
|
||||
LOG("COF: %d", getBit(data,9));
|
||||
LOG("LFGL: %d", getBit(data,8));
|
||||
LOG("AGC: %d", data & 0x0FF);
|
||||
|
||||
data=readAddress(AS5047D_CMD_MAG);
|
||||
LOG("CMAG: 0x%04X(%d)",data,data);
|
||||
|
||||
data=readAddress(AS5047D_CMD_ANGLEUNC);
|
||||
m=(int)((float)data*AS5047D_DEGREES_PER_BIT);
|
||||
d=(int)((float)data*AS5047D_DEGREES_PER_BIT*100 -m*100);
|
||||
LOG("CORDICANG: 0x%04X(%d) %d.%02d deg(est)",data,data,m,d);
|
||||
|
||||
data=readAddress(AS5047D_CMD_ANGLECOM);
|
||||
m=(int)((float)data*AS5047D_DEGREES_PER_BIT);
|
||||
d=(int)((float)data*AS5047D_DEGREES_PER_BIT*100 -m*100);
|
||||
LOG("DAECANG: 0x%04X(%d) %d.%02d deg(est)",data,data,m,d);
|
||||
}else
|
||||
{
|
||||
sprintf(ptrStr,"DIAAGC: 0x%04X\n\r", data);
|
||||
sprintf(ptrStr,"%sMAGL: %d\n\r", ptrStr,getBit(data,11));
|
||||
sprintf(ptrStr,"%sMAGH: %d\n\r", ptrStr,getBit(data,10));
|
||||
sprintf(ptrStr,"%sCOF: %d\n\r", ptrStr, getBit(data,9));
|
||||
sprintf(ptrStr,"%sLFGL: %d\n\r", ptrStr, getBit(data,8));
|
||||
sprintf(ptrStr,"%sAGC: %d\n\r", ptrStr,data & 0x0FF);
|
||||
|
||||
data=readAddress(AS5047D_CMD_MAG);
|
||||
sprintf(ptrStr,"%sCMAG: 0x%04X(%d)\n\r", ptrStr,data,data);
|
||||
|
||||
data=readAddress(AS5047D_CMD_ANGLEUNC);
|
||||
m=(int)((float)data*AS5047D_DEGREES_PER_BIT);
|
||||
d=(int)((float)data*AS5047D_DEGREES_PER_BIT*100 -m*100);
|
||||
sprintf(ptrStr,"%sCORDICANG: 0x%04X(%d) %d.%02d deg(est)\n\r", ptrStr,data,data,m,d);
|
||||
|
||||
data=readAddress(AS5047D_CMD_ANGLECOM);
|
||||
m=(int)((float)data*AS5047D_DEGREES_PER_BIT);
|
||||
d=(int)((float)data*AS5047D_DEGREES_PER_BIT*100 -m*100);
|
||||
sprintf(ptrStr,"%sDAECANG: 0x%04X(%d) %d.%02d deg(est)\n\r", ptrStr,data,data,m,d);
|
||||
|
||||
}
|
||||
} else
|
||||
{
|
||||
data=readAddress(AS5048A_CMD_DIAAGC);
|
||||
sprintf(ptrStr,"AS5048A DIAAGC: 0x%04X\n\r", data);
|
||||
data=readAddress(AS5048A_CMD_MAG);
|
||||
sprintf(ptrStr,"%sMagnitude: %d\n\r", ptrStr,data);
|
||||
data=readAddress(AS5048A_CMD_ANGLE);
|
||||
sprintf(ptrStr,"%sAngle: %d\n\r", ptrStr,data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#pragma GCC pop_options
|
||||
|
||||
|
@ -1,58 +1,58 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2019 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __AS5047D_H__
|
||||
#define __AS5047D_H__
|
||||
|
||||
#include <Arduino.h>
|
||||
#define AS5047D_DEGREES_PER_BIT (360.0/(float)(0x3FFF))
|
||||
|
||||
class AS5047D {
|
||||
private:
|
||||
int chipSelectPin;
|
||||
int16_t readAddress(uint16_t addr);
|
||||
bool error=false;
|
||||
bool as5047d=true;
|
||||
public:
|
||||
boolean begin(int csPin);
|
||||
int16_t readEncoderAngle(void);
|
||||
void diagnostics(char *ptrStr);
|
||||
int16_t readEncoderAnglePipeLineRead(void);
|
||||
bool getError(void) {return error;};
|
||||
};
|
||||
|
||||
#endif //__AS5047D_H__
|
||||
/**********************************************************************
|
||||
Copyright (C) 2019 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __AS5047D_H__
|
||||
#define __AS5047D_H__
|
||||
|
||||
#include <Arduino.h>
|
||||
#define AS5047D_DEGREES_PER_BIT (360.0/(float)(0x3FFF))
|
||||
|
||||
class AS5047D {
|
||||
private:
|
||||
int chipSelectPin;
|
||||
int16_t readAddress(uint16_t addr);
|
||||
bool error=false;
|
||||
bool as5047d=true;
|
||||
public:
|
||||
boolean begin(int csPin);
|
||||
int16_t readEncoderAngle(void);
|
||||
void diagnostics(char *ptrStr);
|
||||
int16_t readEncoderAnglePipeLineRead(void);
|
||||
bool getError(void) {return error;};
|
||||
};
|
||||
|
||||
#endif //__AS5047D_H__
|
||||
|
@ -1,104 +1,104 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __CALIBRAITON_H__
|
||||
#define __CALIBRAITON_H__
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
#include "angle.h"
|
||||
|
||||
|
||||
//this file implements a table that is linearly interpolated circular calibration table
|
||||
// it is assumed the data wraps around, ie you interpolated 65536==0
|
||||
//we want this to be "whole" steps, for 1.8 degree motors this should be 200.
|
||||
// 200 will work for 0.9 degree too, but could be 400. However 400 is not good for 1.8 degree motors
|
||||
#define CALIBRATION_TABLE_SIZE (200)
|
||||
|
||||
#define CALIBRATION_STEPS ((uint32_t)ANGLE_STEPS) // this is one rotation ie 0-65535 aka 65536 steps is 0-360 degrees
|
||||
|
||||
#define CALIBRATION_ERROR_NOT_SET (-1) //indicated that the calibration value is not set.
|
||||
|
||||
#define CALIBRATION_UPDATE_RATE (32) //number of samples to keep 1 pole running average
|
||||
#define CALIBRATION_MIN_ERROR (4) //the minimal expected error on our calibration 4 ~=+/0.2 degrees
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint16_t table[CALIBRATION_TABLE_SIZE];
|
||||
bool status;
|
||||
} FlashCalData_t;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
Angle value; //cal value
|
||||
int16_t error; //error assuming it is constantly updated
|
||||
} CalData_t;
|
||||
|
||||
class CalibrationTable
|
||||
{
|
||||
private:
|
||||
CalData_t table[CALIBRATION_TABLE_SIZE];
|
||||
|
||||
bool fastCalVaild=false;
|
||||
void loadFromFlash(void);
|
||||
bool flashGood(void); //returns true if the flash copy of calibration is valid
|
||||
|
||||
void updateFastCal(void);
|
||||
void createFastCal(void);
|
||||
|
||||
public:
|
||||
void init(void);
|
||||
void saveToFlash(void); //saves the calibration to flash
|
||||
bool updateTableValue(int32_t index, int32_t value);
|
||||
void updateTable(Angle actualAngle, Angle encoderValue);
|
||||
int getValue(Angle actualAngle, CalData_t *ptrData);
|
||||
Angle getCal(Angle actualAngle);
|
||||
bool calValid(void);
|
||||
Angle reverseLookup(Angle encoderAngle); //this turns encoder angle into real angle
|
||||
void printCalTable(void);
|
||||
void smoothTable(void);
|
||||
|
||||
Angle fastReverseLookup(Angle encoderAngle);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif //__CALIBRAITON_H__
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __CALIBRAITON_H__
|
||||
#define __CALIBRAITON_H__
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
#include "angle.h"
|
||||
|
||||
|
||||
//this file implements a table that is linearly interpolated circular calibration table
|
||||
// it is assumed the data wraps around, ie you interpolated 65536==0
|
||||
//we want this to be "whole" steps, for 1.8 degree motors this should be 200.
|
||||
// 200 will work for 0.9 degree too, but could be 400. However 400 is not good for 1.8 degree motors
|
||||
#define CALIBRATION_TABLE_SIZE (200)
|
||||
|
||||
#define CALIBRATION_STEPS ((uint32_t)ANGLE_STEPS) // this is one rotation ie 0-65535 aka 65536 steps is 0-360 degrees
|
||||
|
||||
#define CALIBRATION_ERROR_NOT_SET (-1) //indicated that the calibration value is not set.
|
||||
|
||||
#define CALIBRATION_UPDATE_RATE (32) //number of samples to keep 1 pole running average
|
||||
#define CALIBRATION_MIN_ERROR (4) //the minimal expected error on our calibration 4 ~=+/0.2 degrees
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint16_t table[CALIBRATION_TABLE_SIZE];
|
||||
bool status;
|
||||
} FlashCalData_t;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
Angle value; //cal value
|
||||
int16_t error; //error assuming it is constantly updated
|
||||
} CalData_t;
|
||||
|
||||
class CalibrationTable
|
||||
{
|
||||
private:
|
||||
CalData_t table[CALIBRATION_TABLE_SIZE];
|
||||
|
||||
bool fastCalVaild=false;
|
||||
void loadFromFlash(void);
|
||||
bool flashGood(void); //returns true if the flash copy of calibration is valid
|
||||
|
||||
void updateFastCal(void);
|
||||
void createFastCal(void);
|
||||
|
||||
public:
|
||||
void init(void);
|
||||
void saveToFlash(void); //saves the calibration to flash
|
||||
bool updateTableValue(int32_t index, int32_t value);
|
||||
void updateTable(Angle actualAngle, Angle encoderValue);
|
||||
int getValue(Angle actualAngle, CalData_t *ptrData);
|
||||
Angle getCal(Angle actualAngle);
|
||||
bool calValid(void);
|
||||
Angle reverseLookup(Angle encoderAngle); //this turns encoder angle into real angle
|
||||
void printCalTable(void);
|
||||
void smoothTable(void);
|
||||
|
||||
Angle fastReverseLookup(Angle encoderAngle);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif //__CALIBRAITON_H__
|
||||
|
@ -1,381 +1,381 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#include "command.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#define ASCII_BACKSPACE 0x08
|
||||
#define ASCII_ESC 0x1B
|
||||
#define ASCII_UP_ARROW 0x9b
|
||||
//const char CMD_ANSI_UP[]= {ASCII_ESC,'[','A',0};
|
||||
|
||||
int strcicmp(char const *a, char const *b)
|
||||
{
|
||||
for (;; a++, b++) {
|
||||
int d = tolower(*a) - tolower(*b);
|
||||
if (d != 0 || !*a)
|
||||
return d;
|
||||
}
|
||||
}
|
||||
|
||||
int CommandInit(sCmdUart *ptrUart, uint8_t (*kbhit)(void), uint8_t (*getch)(void),uint8_t (*putch)(char data),uint8_t (*puts)(uint8_t *buffer, uint8_t size) )
|
||||
{
|
||||
ptrUart->kbhit=kbhit;
|
||||
ptrUart->getch=getch;
|
||||
ptrUart->putch=putch;
|
||||
ptrUart->puts=puts;
|
||||
ptrUart->histIndex=0;
|
||||
ptrUart->buffIndex=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef PGM_P //check and see if the PGM_P is defined for the AVR
|
||||
|
||||
int CommandPrintf(sCmdUart *ptrUart, const char *fmt, ...)
|
||||
{
|
||||
int ret=0;
|
||||
char vastr[MAX_STRING]={0};
|
||||
//char str[MAX_STRING]={0};
|
||||
char *ptr;
|
||||
va_list ap;
|
||||
|
||||
//LOG("Command printf");
|
||||
memset(vastr,0,MAX_STRING);
|
||||
va_start(ap,fmt);
|
||||
ret=vsprintf(vastr,(const char *)fmt,ap);
|
||||
//ret=sprintf(vastr,"%s\r\n",str);
|
||||
//LOG("%s",vastr);
|
||||
if (ptrUart->puts!=NULL)
|
||||
{
|
||||
return ptrUart->puts((uint8_t *)vastr, (uint8_t)ret);
|
||||
}
|
||||
|
||||
if (ptrUart->putch!=NULL)
|
||||
{
|
||||
ptr=vastr;
|
||||
while(*ptr)
|
||||
{
|
||||
ptrUart->putch(*ptr++);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
int CommandPrintf(sCmdUart *ptrUart, char *fmt, ...)
|
||||
{
|
||||
int ret=0;
|
||||
char vastr[MAX_STRING]={0};
|
||||
char *ptr;
|
||||
va_list ap;
|
||||
|
||||
|
||||
memset(vastr,0,MAX_STRING);
|
||||
va_start(ap,fmt);
|
||||
ret=vsprintf(vastr,(char *)fmt,ap);
|
||||
if (ptrUart->puts!=NULL)
|
||||
{
|
||||
return ptrUart->puts((uint8_t *)vastr, (uint8_t)ret);
|
||||
}
|
||||
|
||||
if (ptrUart->putch!=NULL)
|
||||
{
|
||||
ptr=vastr;
|
||||
while(*ptr)
|
||||
{
|
||||
ptrUart->putch(*ptr++);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// the delimiter is command/parameter delimiter
|
||||
// by default a ' '0x20 is used but for the TDR with GUI a ':' was preferred, not sure why
|
||||
// set to ' '/0x20 if you want normal command parsing, like DOS
|
||||
unsigned int CommandParse(sCmdUart *ptrUart,sCommand *ptrCmds, char *str, char delimitor )
|
||||
{
|
||||
char *ptr;
|
||||
char *ptr2;
|
||||
unsigned int i;
|
||||
//char cmd[MAX_STRING];
|
||||
char buff[MAX_CMD_LENGTH];
|
||||
char argv[MAX_ARGS][MAX_ARG_LENGTH];
|
||||
char *ptrArgv[MAX_ARGS];
|
||||
unsigned int numArgs;
|
||||
int emptyArg=0;
|
||||
|
||||
sCommand cmd_list;
|
||||
|
||||
|
||||
while (*str==0x20 || *str=='\n' || *str=='\r' || *str=='\t') str++;
|
||||
//first we need find command and arguments
|
||||
ptr=strchr(str,delimitor); //find first char
|
||||
|
||||
//LOG("2parsing %s",str);
|
||||
|
||||
|
||||
if (ptr==0)
|
||||
{
|
||||
//we have two options, frist whole thing is command
|
||||
//second bad command
|
||||
if(strlen(str)>0)
|
||||
ptr=str+strlen(str);
|
||||
else
|
||||
return 0; //bad command
|
||||
}
|
||||
|
||||
//copy string to command buffer.
|
||||
i=0;
|
||||
ptr2=str;
|
||||
while(ptr!=0 && ptr!=ptr2 && i<(MAX_CMD_LENGTH-1))
|
||||
{
|
||||
//if (*ptr2!='\n' && *ptr2!='\r') //do not include newlines
|
||||
{
|
||||
buff[i++]=*ptr2;
|
||||
}
|
||||
ptr2++;
|
||||
}
|
||||
buff[i]=0;
|
||||
|
||||
//now buff contains the command let's get the args
|
||||
numArgs=0;
|
||||
while(*ptr!=0 && (*ptr==' ' || *ptr==delimitor))
|
||||
ptr++; //increment pointer past ' '
|
||||
if (*ptr!=0)
|
||||
{
|
||||
if (*ptr==34) // " char
|
||||
{
|
||||
ptr++;
|
||||
ptr2=strchr(ptr,34); //find match
|
||||
} else if (*ptr==39) // 'char
|
||||
{
|
||||
ptr++;
|
||||
ptr2=strchr(ptr,39); //find match
|
||||
} else
|
||||
{
|
||||
ptr2=strchr(ptr,delimitor);
|
||||
}
|
||||
if (ptr2==0)
|
||||
{
|
||||
//we have two options, frist whole thing is command
|
||||
//second bad command
|
||||
//LOG("strlen ptr is %d",strlen(ptr));
|
||||
if(strlen(ptr)>0)
|
||||
ptr2=ptr+strlen(ptr);
|
||||
}
|
||||
emptyArg=0;
|
||||
while((ptr2!=0 && numArgs<MAX_ARGS) || emptyArg==1)
|
||||
{
|
||||
int j;
|
||||
emptyArg=0;
|
||||
j=0;
|
||||
//LOG("arg %s",ptr);
|
||||
while (ptr2!=ptr && j<(MAX_ARG_LENGTH-1) && ptr2!=0)
|
||||
{
|
||||
argv[numArgs][j++]=*ptr++;
|
||||
}
|
||||
argv[numArgs][j++]=0;
|
||||
numArgs++;
|
||||
ptr2=0;
|
||||
if (*ptr!=0)
|
||||
{
|
||||
if (*ptr==34 || *ptr==39) ptr++;
|
||||
if (*ptr==delimitor && strlen(ptr)==1)
|
||||
{
|
||||
//LOG("Empty arg");
|
||||
emptyArg=1;
|
||||
}
|
||||
while(*ptr!=0 && (*ptr==' ' || *ptr==delimitor))//p || *ptr==34 || *ptr==39))
|
||||
ptr++; //increment pointer past ' '
|
||||
if (*ptr==34) // " char
|
||||
{
|
||||
ptr++;
|
||||
ptr2=strchr(ptr,34); //find match
|
||||
} else if (*ptr==39) // 'char
|
||||
{
|
||||
ptr++;
|
||||
ptr2=strchr(ptr,39); //find match
|
||||
} else
|
||||
{
|
||||
ptr2=strchr(ptr,delimitor);
|
||||
}
|
||||
if (ptr2==0)
|
||||
{
|
||||
//we have two options, frist whole thing is command
|
||||
//second bad command
|
||||
if(strlen(ptr)>0)
|
||||
ptr2=ptr+strlen(ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(i=0; i<MAX_ARGS; i++)
|
||||
{
|
||||
ptrArgv[i]=argv[i];
|
||||
}
|
||||
|
||||
//now let's parse the command
|
||||
i=0;
|
||||
memcpy(&cmd_list, &ptrCmds[i], sizeof(sCommand));
|
||||
|
||||
|
||||
//LOG("command is %s %d",buff,numArgs);
|
||||
|
||||
while(cmd_list.function!=0)
|
||||
{
|
||||
/*char str[20];
|
||||
strcpy_P(str,cmd_list.name);
|
||||
LOG("checkign '%s' to '%s'",buff,str);
|
||||
LOG("comapre is %d",strcmp_P(buff,cmd_list.name));
|
||||
*/
|
||||
|
||||
//memcpy_P(&p, cmd_list.name, sizeof(PGM_P));
|
||||
#ifdef PGM_P //check and see if the PGM_P is defined for the AVR
|
||||
if (strlen(buff)==strlen_P(cmd_list.name))
|
||||
{
|
||||
if (strcicmp(buff,cmd_list.name)==0) //ignore device ID
|
||||
#else
|
||||
if (strlen(buff)==strlen(cmd_list.name))
|
||||
{
|
||||
if (strcicmp(buff,cmd_list.name)==0) //ignore device ID
|
||||
#endif
|
||||
{
|
||||
//LOG("calling function");
|
||||
//return 1;
|
||||
return (*cmd_list.function)(ptrUart,numArgs,ptrArgv);
|
||||
}
|
||||
}
|
||||
i=i+1;
|
||||
memcpy(&cmd_list, &ptrCmds[i], sizeof(sCommand));
|
||||
}
|
||||
CommandPrintf(ptrUart,PSTR("Unknown command (try 'help')\n\r"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
//This function will process commands from the UART
|
||||
int CommandProcess(sCmdUart *ptrUart,sCommand *ptrCmds, char delimitor, char *cmdPrompt)
|
||||
{
|
||||
if(ptrUart->kbhit())
|
||||
{
|
||||
ptrUart->data=ptrUart->getch();
|
||||
|
||||
//echo the data
|
||||
ptrUart->putch(ptrUart->data);
|
||||
|
||||
//if the data is the CR we need to process buffer
|
||||
if (ptrUart->data==0x0D)
|
||||
{
|
||||
ptrUart->putch(0x0A);
|
||||
if (strlen(ptrUart->buffer)>0)
|
||||
{
|
||||
if (ptrUart->lastChar!=ASCII_UP_ARROW)
|
||||
{
|
||||
strcpy(ptrUart->bufferHist[ptrUart->histIndex],ptrUart->buffer);
|
||||
ptrUart->histIndex=(ptrUart->histIndex+1) % CMD_HISTORY;
|
||||
}
|
||||
CommandParse(ptrUart,ptrCmds,ptrUart->buffer,delimitor);
|
||||
}
|
||||
|
||||
CommandPrintf(ptrUart,PSTR("\n\r%s"),cmdPrompt);
|
||||
ptrUart->buffIndex=0;
|
||||
ptrUart->buffer[ptrUart->buffIndex]=0;
|
||||
}
|
||||
|
||||
if (ptrUart->data==ASCII_BACKSPACE) //backspace
|
||||
{
|
||||
if (ptrUart->buffIndex>0)
|
||||
{
|
||||
ptrUart->buffIndex--;
|
||||
ptrUart->buffer[ptrUart->buffIndex]='\0';
|
||||
//Echo the backspace
|
||||
ptrUart->putch(' ');
|
||||
ptrUart->putch(ASCII_BACKSPACE);
|
||||
}
|
||||
}else if (ptrUart->data != 0x0A && ptrUart->data !=0x0D && ptrUart->data<127)
|
||||
{
|
||||
ptrUart->buffer[ptrUart->buffIndex++]=ptrUart->data;
|
||||
ptrUart->buffer[ptrUart->buffIndex]=0;
|
||||
}
|
||||
if (ptrUart->buffIndex>=(MAX_CMD_LENGTH-1))
|
||||
{
|
||||
CommandPrintf(ptrUart,PSTR("\n\rERROR: Command buffer overflow\n\r"));\
|
||||
ERROR("Command buffer overflow");
|
||||
ptrUart->buffIndex=0;
|
||||
ptrUart->buffer[0]=0;
|
||||
CommandPrintf(ptrUart,PSTR("\n\r%s"),cmdPrompt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (strstr(ptrUart->buffer,ANSI_UP)) //up arrow
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
CommandPrintf(ptrUart,PSTR("\n\r%s"),cmdPrompt);
|
||||
i=CMD_HISTORY-1;
|
||||
if (ptrUart->histIndex>0)
|
||||
{
|
||||
i=ptrUart->histIndex-1;
|
||||
}
|
||||
if (strlen(ptrUart->bufferHist[i])>0)
|
||||
{
|
||||
strcpy(ptrUart->buffer,ptrUart->bufferHist[i]);
|
||||
ptrUart->buffIndex=strlen(ptrUart->buffer);
|
||||
CommandPrintf(ptrUart,PSTR("%s"),ptrUart->buffer);
|
||||
}else
|
||||
{
|
||||
ptrUart->buffIndex=0;
|
||||
ptrUart->buffer[0]=0;
|
||||
}
|
||||
ptrUart->data=ASCII_UP_ARROW;
|
||||
}
|
||||
|
||||
|
||||
ptrUart->lastChar=ptrUart->data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#include "command.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#define ASCII_BACKSPACE 0x08
|
||||
#define ASCII_ESC 0x1B
|
||||
#define ASCII_UP_ARROW 0x9b
|
||||
//const char CMD_ANSI_UP[]= {ASCII_ESC,'[','A',0};
|
||||
|
||||
int strcicmp(char const *a, char const *b)
|
||||
{
|
||||
for (;; a++, b++) {
|
||||
int d = tolower(*a) - tolower(*b);
|
||||
if (d != 0 || !*a)
|
||||
return d;
|
||||
}
|
||||
}
|
||||
|
||||
int CommandInit(sCmdUart *ptrUart, uint8_t (*kbhit)(void), uint8_t (*getch)(void),uint8_t (*putch)(char data),uint8_t (*puts)(uint8_t *buffer, uint8_t size) )
|
||||
{
|
||||
ptrUart->kbhit=kbhit;
|
||||
ptrUart->getch=getch;
|
||||
ptrUart->putch=putch;
|
||||
ptrUart->puts=puts;
|
||||
ptrUart->histIndex=0;
|
||||
ptrUart->buffIndex=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef PGM_P //check and see if the PGM_P is defined for the AVR
|
||||
|
||||
int CommandPrintf(sCmdUart *ptrUart, const char *fmt, ...)
|
||||
{
|
||||
int ret=0;
|
||||
char vastr[MAX_STRING]={0};
|
||||
//char str[MAX_STRING]={0};
|
||||
char *ptr;
|
||||
va_list ap;
|
||||
|
||||
//LOG("Command printf");
|
||||
memset(vastr,0,MAX_STRING);
|
||||
va_start(ap,fmt);
|
||||
ret=vsprintf(vastr,(const char *)fmt,ap);
|
||||
//ret=sprintf(vastr,"%s\r\n",str);
|
||||
//LOG("%s",vastr);
|
||||
if (ptrUart->puts!=NULL)
|
||||
{
|
||||
return ptrUart->puts((uint8_t *)vastr, (uint8_t)ret);
|
||||
}
|
||||
|
||||
if (ptrUart->putch!=NULL)
|
||||
{
|
||||
ptr=vastr;
|
||||
while(*ptr)
|
||||
{
|
||||
ptrUart->putch(*ptr++);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
int CommandPrintf(sCmdUart *ptrUart, char *fmt, ...)
|
||||
{
|
||||
int ret=0;
|
||||
char vastr[MAX_STRING]={0};
|
||||
char *ptr;
|
||||
va_list ap;
|
||||
|
||||
|
||||
memset(vastr,0,MAX_STRING);
|
||||
va_start(ap,fmt);
|
||||
ret=vsprintf(vastr,(char *)fmt,ap);
|
||||
if (ptrUart->puts!=NULL)
|
||||
{
|
||||
return ptrUart->puts((uint8_t *)vastr, (uint8_t)ret);
|
||||
}
|
||||
|
||||
if (ptrUart->putch!=NULL)
|
||||
{
|
||||
ptr=vastr;
|
||||
while(*ptr)
|
||||
{
|
||||
ptrUart->putch(*ptr++);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// the delimiter is command/parameter delimiter
|
||||
// by default a ' '0x20 is used but for the TDR with GUI a ':' was preferred, not sure why
|
||||
// set to ' '/0x20 if you want normal command parsing, like DOS
|
||||
unsigned int CommandParse(sCmdUart *ptrUart,sCommand *ptrCmds, char *str, char delimitor )
|
||||
{
|
||||
char *ptr;
|
||||
char *ptr2;
|
||||
unsigned int i;
|
||||
//char cmd[MAX_STRING];
|
||||
char buff[MAX_CMD_LENGTH];
|
||||
char argv[MAX_ARGS][MAX_ARG_LENGTH];
|
||||
char *ptrArgv[MAX_ARGS];
|
||||
unsigned int numArgs;
|
||||
int emptyArg=0;
|
||||
|
||||
sCommand cmd_list;
|
||||
|
||||
|
||||
while (*str==0x20 || *str=='\n' || *str=='\r' || *str=='\t') str++;
|
||||
//first we need find command and arguments
|
||||
ptr=strchr(str,delimitor); //find first char
|
||||
|
||||
//LOG("2parsing %s",str);
|
||||
|
||||
|
||||
if (ptr==0)
|
||||
{
|
||||
//we have two options, frist whole thing is command
|
||||
//second bad command
|
||||
if(strlen(str)>0)
|
||||
ptr=str+strlen(str);
|
||||
else
|
||||
return 0; //bad command
|
||||
}
|
||||
|
||||
//copy string to command buffer.
|
||||
i=0;
|
||||
ptr2=str;
|
||||
while(ptr!=0 && ptr!=ptr2 && i<(MAX_CMD_LENGTH-1))
|
||||
{
|
||||
//if (*ptr2!='\n' && *ptr2!='\r') //do not include newlines
|
||||
{
|
||||
buff[i++]=*ptr2;
|
||||
}
|
||||
ptr2++;
|
||||
}
|
||||
buff[i]=0;
|
||||
|
||||
//now buff contains the command let's get the args
|
||||
numArgs=0;
|
||||
while(*ptr!=0 && (*ptr==' ' || *ptr==delimitor))
|
||||
ptr++; //increment pointer past ' '
|
||||
if (*ptr!=0)
|
||||
{
|
||||
if (*ptr==34) // " char
|
||||
{
|
||||
ptr++;
|
||||
ptr2=strchr(ptr,34); //find match
|
||||
} else if (*ptr==39) // 'char
|
||||
{
|
||||
ptr++;
|
||||
ptr2=strchr(ptr,39); //find match
|
||||
} else
|
||||
{
|
||||
ptr2=strchr(ptr,delimitor);
|
||||
}
|
||||
if (ptr2==0)
|
||||
{
|
||||
//we have two options, frist whole thing is command
|
||||
//second bad command
|
||||
//LOG("strlen ptr is %d",strlen(ptr));
|
||||
if(strlen(ptr)>0)
|
||||
ptr2=ptr+strlen(ptr);
|
||||
}
|
||||
emptyArg=0;
|
||||
while((ptr2!=0 && numArgs<MAX_ARGS) || emptyArg==1)
|
||||
{
|
||||
int j;
|
||||
emptyArg=0;
|
||||
j=0;
|
||||
//LOG("arg %s",ptr);
|
||||
while (ptr2!=ptr && j<(MAX_ARG_LENGTH-1) && ptr2!=0)
|
||||
{
|
||||
argv[numArgs][j++]=*ptr++;
|
||||
}
|
||||
argv[numArgs][j++]=0;
|
||||
numArgs++;
|
||||
ptr2=0;
|
||||
if (*ptr!=0)
|
||||
{
|
||||
if (*ptr==34 || *ptr==39) ptr++;
|
||||
if (*ptr==delimitor && strlen(ptr)==1)
|
||||
{
|
||||
//LOG("Empty arg");
|
||||
emptyArg=1;
|
||||
}
|
||||
while(*ptr!=0 && (*ptr==' ' || *ptr==delimitor))//p || *ptr==34 || *ptr==39))
|
||||
ptr++; //increment pointer past ' '
|
||||
if (*ptr==34) // " char
|
||||
{
|
||||
ptr++;
|
||||
ptr2=strchr(ptr,34); //find match
|
||||
} else if (*ptr==39) // 'char
|
||||
{
|
||||
ptr++;
|
||||
ptr2=strchr(ptr,39); //find match
|
||||
} else
|
||||
{
|
||||
ptr2=strchr(ptr,delimitor);
|
||||
}
|
||||
if (ptr2==0)
|
||||
{
|
||||
//we have two options, frist whole thing is command
|
||||
//second bad command
|
||||
if(strlen(ptr)>0)
|
||||
ptr2=ptr+strlen(ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(i=0; i<MAX_ARGS; i++)
|
||||
{
|
||||
ptrArgv[i]=argv[i];
|
||||
}
|
||||
|
||||
//now let's parse the command
|
||||
i=0;
|
||||
memcpy(&cmd_list, &ptrCmds[i], sizeof(sCommand));
|
||||
|
||||
|
||||
//LOG("command is %s %d",buff,numArgs);
|
||||
|
||||
while(cmd_list.function!=0)
|
||||
{
|
||||
/*char str[20];
|
||||
strcpy_P(str,cmd_list.name);
|
||||
LOG("checkign '%s' to '%s'",buff,str);
|
||||
LOG("comapre is %d",strcmp_P(buff,cmd_list.name));
|
||||
*/
|
||||
|
||||
//memcpy_P(&p, cmd_list.name, sizeof(PGM_P));
|
||||
#ifdef PGM_P //check and see if the PGM_P is defined for the AVR
|
||||
if (strlen(buff)==strlen_P(cmd_list.name))
|
||||
{
|
||||
if (strcicmp(buff,cmd_list.name)==0) //ignore device ID
|
||||
#else
|
||||
if (strlen(buff)==strlen(cmd_list.name))
|
||||
{
|
||||
if (strcicmp(buff,cmd_list.name)==0) //ignore device ID
|
||||
#endif
|
||||
{
|
||||
//LOG("calling function");
|
||||
//return 1;
|
||||
return (*cmd_list.function)(ptrUart,numArgs,ptrArgv);
|
||||
}
|
||||
}
|
||||
i=i+1;
|
||||
memcpy(&cmd_list, &ptrCmds[i], sizeof(sCommand));
|
||||
}
|
||||
CommandPrintf(ptrUart,PSTR("Unknown command (try 'help')\n\r"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
//This function will process commands from the UART
|
||||
int CommandProcess(sCmdUart *ptrUart,sCommand *ptrCmds, char delimitor, char *cmdPrompt)
|
||||
{
|
||||
if(ptrUart->kbhit())
|
||||
{
|
||||
ptrUart->data=ptrUart->getch();
|
||||
|
||||
//echo the data
|
||||
ptrUart->putch(ptrUart->data);
|
||||
|
||||
//if the data is the CR we need to process buffer
|
||||
if (ptrUart->data==0x0D)
|
||||
{
|
||||
ptrUart->putch(0x0A);
|
||||
if (strlen(ptrUart->buffer)>0)
|
||||
{
|
||||
if (ptrUart->lastChar!=ASCII_UP_ARROW)
|
||||
{
|
||||
strcpy(ptrUart->bufferHist[ptrUart->histIndex],ptrUart->buffer);
|
||||
ptrUart->histIndex=(ptrUart->histIndex+1) % CMD_HISTORY;
|
||||
}
|
||||
CommandParse(ptrUart,ptrCmds,ptrUart->buffer,delimitor);
|
||||
}
|
||||
|
||||
CommandPrintf(ptrUart,PSTR("\n\r%s"),cmdPrompt);
|
||||
ptrUart->buffIndex=0;
|
||||
ptrUart->buffer[ptrUart->buffIndex]=0;
|
||||
}
|
||||
|
||||
if (ptrUart->data==ASCII_BACKSPACE) //backspace
|
||||
{
|
||||
if (ptrUart->buffIndex>0)
|
||||
{
|
||||
ptrUart->buffIndex--;
|
||||
ptrUart->buffer[ptrUart->buffIndex]='\0';
|
||||
//Echo the backspace
|
||||
ptrUart->putch(' ');
|
||||
ptrUart->putch(ASCII_BACKSPACE);
|
||||
}
|
||||
}else if (ptrUart->data != 0x0A && ptrUart->data !=0x0D && ptrUart->data<127)
|
||||
{
|
||||
ptrUart->buffer[ptrUart->buffIndex++]=ptrUart->data;
|
||||
ptrUart->buffer[ptrUart->buffIndex]=0;
|
||||
}
|
||||
if (ptrUart->buffIndex>=(MAX_CMD_LENGTH-1))
|
||||
{
|
||||
CommandPrintf(ptrUart,PSTR("\n\rERROR: Command buffer overflow\n\r"));\
|
||||
ERROR("Command buffer overflow");
|
||||
ptrUart->buffIndex=0;
|
||||
ptrUart->buffer[0]=0;
|
||||
CommandPrintf(ptrUart,PSTR("\n\r%s"),cmdPrompt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (strstr(ptrUart->buffer,ANSI_UP)) //up arrow
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
CommandPrintf(ptrUart,PSTR("\n\r%s"),cmdPrompt);
|
||||
i=CMD_HISTORY-1;
|
||||
if (ptrUart->histIndex>0)
|
||||
{
|
||||
i=ptrUart->histIndex-1;
|
||||
}
|
||||
if (strlen(ptrUart->bufferHist[i])>0)
|
||||
{
|
||||
strcpy(ptrUart->buffer,ptrUart->bufferHist[i]);
|
||||
ptrUart->buffIndex=strlen(ptrUart->buffer);
|
||||
CommandPrintf(ptrUart,PSTR("%s"),ptrUart->buffer);
|
||||
}else
|
||||
{
|
||||
ptrUart->buffIndex=0;
|
||||
ptrUart->buffer[0]=0;
|
||||
}
|
||||
ptrUart->data=ASCII_UP_ARROW;
|
||||
}
|
||||
|
||||
|
||||
ptrUart->lastChar=ptrUart->data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,179 +1,179 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __COMMAND_H
|
||||
#define __COMMAND_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <stdarg.h>
|
||||
#include "syslog.h"
|
||||
/*
|
||||
* Usage:
|
||||
*
|
||||
#include <command.h>
|
||||
#include "uart_e0.h"
|
||||
|
||||
sCmdUart KeyfobCmdUart; // UART used for the keyfob command line interface
|
||||
|
||||
CMD_STR(help,"Displays this message");
|
||||
|
||||
//List of supported commands
|
||||
sCommand KeyfobCmds[] =
|
||||
{
|
||||
COMMAND(help),
|
||||
{"",0,""}, //End of list signal
|
||||
};
|
||||
|
||||
// print out the help strings for the commands
|
||||
static int help_cmd(sCmdUart *ptrUart,int argc, char * argv[])
|
||||
{
|
||||
sCommand cmd_list;
|
||||
int i;
|
||||
|
||||
//now let's parse the command
|
||||
i=0;
|
||||
memcpy(&cmd_list, &KeyfobCmds[i], sizeof(sCommand));
|
||||
while(cmd_list.function!=0)
|
||||
{
|
||||
|
||||
CommandPrintf(ptrUart,(cmd_list.name));
|
||||
CommandPrintf(ptrUart,PSTR(" - "));
|
||||
CommandPrintf(ptrUart,(cmd_list.help));
|
||||
CommandPrintf(ptrUart,PSTR("\n\r"));
|
||||
i=i+1;
|
||||
memcpy(&cmd_list, &KeyfobCmds[i], sizeof(sCommand));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t KeyfobCmdGetChar(void)
|
||||
{
|
||||
uint8_t c;
|
||||
if (UARTE0_getc(&c)!=0)
|
||||
{
|
||||
ERROR("Uart getchar failed");
|
||||
return 0;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
int KeyfobCmdInit(PIN tx_pin, PIN rx_pin, uint32_t baud)
|
||||
{
|
||||
LOG("UARTE0 init");
|
||||
UARTE0_Init(tx_pin, rx_pin, baud);
|
||||
CommandInit(&KeyfobCmdUart, UARTE0_kbhit, KeyfobCmdGetChar, UARTE0_putc,NULL); //set up the UART structure
|
||||
return 0;
|
||||
}
|
||||
|
||||
int KeyfobCmdProcess(void)
|
||||
{
|
||||
return CommandProcess(&KeyfobCmdUart,KeyfobCmds,' ',KEYFOB_CMD_PROMPT);
|
||||
}
|
||||
|
||||
Advantages:
|
||||
1. You can actually have more than one UART/device connected to same command line interface.
|
||||
2. works with harvard machines to save SRAM space using the PSTR functionality
|
||||
3. You can swap out commands "on the fly"
|
||||
|
||||
|
||||
*/
|
||||
#define MAX_CMD_LENGTH 60
|
||||
#define MAX_ARGS 10
|
||||
#define MAX_ARG_LENGTH 40
|
||||
#define CMD_HISTORY 3 //number of commands in history buffer
|
||||
#define ASCII_BACKSPACE 0x08
|
||||
#define ASCII_ESC 0x1B
|
||||
#define ASCII_UP_ARROW 0x9b
|
||||
#define ANSI_UP "\x1B[A\0"
|
||||
|
||||
#define MAX_STRING 255
|
||||
//const char ANSI_UP[]= {ASCII_ESC,'[','A',0};
|
||||
|
||||
typedef struct {
|
||||
uint8_t (*kbhit)(void);
|
||||
uint8_t (*getch)(void);
|
||||
uint8_t (*putch)(char data);
|
||||
uint8_t (*puts)(uint8_t *buffer, uint8_t size);
|
||||
uint8_t data;
|
||||
char buffer[MAX_CMD_LENGTH];
|
||||
|
||||
char bufferHist[CMD_HISTORY][MAX_CMD_LENGTH];
|
||||
uint8_t histIndex;
|
||||
uint8_t buffIndex;
|
||||
uint8_t lastChar;
|
||||
}sCmdUart;
|
||||
|
||||
|
||||
#define COMMAND(NAME) { NAME ## _str, NAME ## _cmd, NAME ## _help}
|
||||
|
||||
|
||||
#ifdef PGM_P //check and see if the PGM_P is defined for the AVR
|
||||
|
||||
//If so then we use the strings in flash not SRAM
|
||||
#define CMD_STR(NAME,STR) static const char NAME ## _help[] PROGMEM = STR; static const char NAME ## _str[] PROGMEM = #NAME; static int NAME ##_cmd(sCmdUart *ptrUart,int, char **);
|
||||
//Command structure
|
||||
typedef struct
|
||||
{
|
||||
PGM_P name;
|
||||
int (*function) (sCmdUart *ptrUart,int, char **);
|
||||
PGM_P help;
|
||||
} sCommand;
|
||||
int CommandPrintf(sCmdUart *ptrUart, const char *fmt, ...);
|
||||
|
||||
#else
|
||||
|
||||
#define CMD_STR(NAME,STR) static char NAME ## _help[] = STR; static char NAME ## _str[] = #NAME; static int NAME ##_cmd(sCmdUart *ptrUart,int, char **);
|
||||
|
||||
//Command structure
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
int (*function) (sCmdUart *ptrUart,int, char **);
|
||||
char *help;
|
||||
} sCommand;
|
||||
|
||||
int CommandPrintf(sCmdUart *ptrUart, char *fmt, ...);
|
||||
#endif
|
||||
|
||||
|
||||
int CommandInit(sCmdUart *ptrUart, uint8_t (*kbhit)(void), uint8_t (*getch)(void),uint8_t (*putch)(char data),uint8_t (*puts)(uint8_t *buffer, uint8_t size));
|
||||
unsigned int CommandParse(sCmdUart *ptrUart,sCommand *ptrCmds, char *str, char delimitor);
|
||||
int CommandProcess(sCmdUart *ptrUart,sCommand *ptrCmds, char delimitor, char *cmdPrompt);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __COMMAND_H
|
||||
#define __COMMAND_H
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <stdarg.h>
|
||||
#include "syslog.h"
|
||||
/*
|
||||
* Usage:
|
||||
*
|
||||
#include <command.h>
|
||||
#include "uart_e0.h"
|
||||
|
||||
sCmdUart KeyfobCmdUart; // UART used for the keyfob command line interface
|
||||
|
||||
CMD_STR(help,"Displays this message");
|
||||
|
||||
//List of supported commands
|
||||
sCommand KeyfobCmds[] =
|
||||
{
|
||||
COMMAND(help),
|
||||
{"",0,""}, //End of list signal
|
||||
};
|
||||
|
||||
// print out the help strings for the commands
|
||||
static int help_cmd(sCmdUart *ptrUart,int argc, char * argv[])
|
||||
{
|
||||
sCommand cmd_list;
|
||||
int i;
|
||||
|
||||
//now let's parse the command
|
||||
i=0;
|
||||
memcpy(&cmd_list, &KeyfobCmds[i], sizeof(sCommand));
|
||||
while(cmd_list.function!=0)
|
||||
{
|
||||
|
||||
CommandPrintf(ptrUart,(cmd_list.name));
|
||||
CommandPrintf(ptrUart,PSTR(" - "));
|
||||
CommandPrintf(ptrUart,(cmd_list.help));
|
||||
CommandPrintf(ptrUart,PSTR("\n\r"));
|
||||
i=i+1;
|
||||
memcpy(&cmd_list, &KeyfobCmds[i], sizeof(sCommand));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t KeyfobCmdGetChar(void)
|
||||
{
|
||||
uint8_t c;
|
||||
if (UARTE0_getc(&c)!=0)
|
||||
{
|
||||
ERROR("Uart getchar failed");
|
||||
return 0;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
int KeyfobCmdInit(PIN tx_pin, PIN rx_pin, uint32_t baud)
|
||||
{
|
||||
LOG("UARTE0 init");
|
||||
UARTE0_Init(tx_pin, rx_pin, baud);
|
||||
CommandInit(&KeyfobCmdUart, UARTE0_kbhit, KeyfobCmdGetChar, UARTE0_putc,NULL); //set up the UART structure
|
||||
return 0;
|
||||
}
|
||||
|
||||
int KeyfobCmdProcess(void)
|
||||
{
|
||||
return CommandProcess(&KeyfobCmdUart,KeyfobCmds,' ',KEYFOB_CMD_PROMPT);
|
||||
}
|
||||
|
||||
Advantages:
|
||||
1. You can actually have more than one UART/device connected to same command line interface.
|
||||
2. works with harvard machines to save SRAM space using the PSTR functionality
|
||||
3. You can swap out commands "on the fly"
|
||||
|
||||
|
||||
*/
|
||||
#define MAX_CMD_LENGTH 60
|
||||
#define MAX_ARGS 10
|
||||
#define MAX_ARG_LENGTH 40
|
||||
#define CMD_HISTORY 3 //number of commands in history buffer
|
||||
#define ASCII_BACKSPACE 0x08
|
||||
#define ASCII_ESC 0x1B
|
||||
#define ASCII_UP_ARROW 0x9b
|
||||
#define ANSI_UP "\x1B[A\0"
|
||||
|
||||
#define MAX_STRING 255
|
||||
//const char ANSI_UP[]= {ASCII_ESC,'[','A',0};
|
||||
|
||||
typedef struct {
|
||||
uint8_t (*kbhit)(void);
|
||||
uint8_t (*getch)(void);
|
||||
uint8_t (*putch)(char data);
|
||||
uint8_t (*puts)(uint8_t *buffer, uint8_t size);
|
||||
uint8_t data;
|
||||
char buffer[MAX_CMD_LENGTH];
|
||||
|
||||
char bufferHist[CMD_HISTORY][MAX_CMD_LENGTH];
|
||||
uint8_t histIndex;
|
||||
uint8_t buffIndex;
|
||||
uint8_t lastChar;
|
||||
}sCmdUart;
|
||||
|
||||
|
||||
#define COMMAND(NAME) { NAME ## _str, NAME ## _cmd, NAME ## _help}
|
||||
|
||||
|
||||
#ifdef PGM_P //check and see if the PGM_P is defined for the AVR
|
||||
|
||||
//If so then we use the strings in flash not SRAM
|
||||
#define CMD_STR(NAME,STR) static const char NAME ## _help[] PROGMEM = STR; static const char NAME ## _str[] PROGMEM = #NAME; static int NAME ##_cmd(sCmdUart *ptrUart,int, char **);
|
||||
//Command structure
|
||||
typedef struct
|
||||
{
|
||||
PGM_P name;
|
||||
int (*function) (sCmdUart *ptrUart,int, char **);
|
||||
PGM_P help;
|
||||
} sCommand;
|
||||
int CommandPrintf(sCmdUart *ptrUart, const char *fmt, ...);
|
||||
|
||||
#else
|
||||
|
||||
#define CMD_STR(NAME,STR) static char NAME ## _help[] = STR; static char NAME ## _str[] = #NAME; static int NAME ##_cmd(sCmdUart *ptrUart,int, char **);
|
||||
|
||||
//Command structure
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
int (*function) (sCmdUart *ptrUart,int, char **);
|
||||
char *help;
|
||||
} sCommand;
|
||||
|
||||
int CommandPrintf(sCmdUart *ptrUart, char *fmt, ...);
|
||||
#endif
|
||||
|
||||
|
||||
int CommandInit(sCmdUart *ptrUart, uint8_t (*kbhit)(void), uint8_t (*getch)(void),uint8_t (*putch)(char data),uint8_t (*puts)(uint8_t *buffer, uint8_t size));
|
||||
unsigned int CommandParse(sCmdUart *ptrUart,sCommand *ptrCmds, char *str, char delimitor);
|
||||
int CommandProcess(sCmdUart *ptrUart,sCommand *ptrCmds, char delimitor, char *cmdPrompt);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,51 +1,51 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __COMMANDS_H__
|
||||
#define __COMMANDS_H__
|
||||
#include <Arduino.h>
|
||||
#include "stepper_controller.h"
|
||||
#include "nzs.h"
|
||||
|
||||
extern StepperCtrl stepperCtrl;
|
||||
extern eepromData_t PowerupEEPROM;
|
||||
|
||||
void commandsInit(void);
|
||||
int commandsProcess(void);
|
||||
void torqueSetToZeroSpecialBehaviour(void);
|
||||
|
||||
#endif //__COMMANDS_H__
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __COMMANDS_H__
|
||||
#define __COMMANDS_H__
|
||||
#include <Arduino.h>
|
||||
#include "stepper_controller.h"
|
||||
#include "nzs.h"
|
||||
|
||||
extern StepperCtrl stepperCtrl;
|
||||
extern eepromData_t PowerupEEPROM;
|
||||
|
||||
void commandsInit(void);
|
||||
int commandsProcess(void);
|
||||
void torqueSetToZeroSpecialBehaviour(void);
|
||||
|
||||
#endif //__COMMANDS_H__
|
||||
|
@ -1,309 +1,309 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "eeprom.h"
|
||||
#include "calibration.h"
|
||||
#include "Flash.h"
|
||||
#include "board.h" //for divide with rounding macro
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
|
||||
//since we will write the following structure into each page, we need to find our latest page
|
||||
// to do this we will use the header to contain a checksum and write counter.
|
||||
#define EEPROM_SIZE (FLASH_ROW_SIZE*2)
|
||||
|
||||
typedef struct {
|
||||
uint16_t checksum;
|
||||
uint16_t count;
|
||||
}eepromHeader_t;
|
||||
|
||||
#define EEPROM_DATA_SIZE (FLASH_PAGE_SIZE_NZS-sizeof(eepromHeader_t))
|
||||
typedef struct {
|
||||
eepromHeader_t header;
|
||||
uint8_t data[EEPROM_DATA_SIZE];
|
||||
} eepromData_t;
|
||||
|
||||
|
||||
|
||||
static eepromData_t EEPROMCache;
|
||||
|
||||
static int32_t NextPageWrite=-1;
|
||||
|
||||
//we need to reserve two pages for EEPROM
|
||||
__attribute__((__aligned__(FLASH_ROW_SIZE))) const uint8_t NVM_eeprom[EEPROM_SIZE]={0xFF};
|
||||
|
||||
|
||||
static uint16_t checksum(uint8_t *ptrData, uint32_t nBytes)
|
||||
{
|
||||
uint16_t sum=0;
|
||||
uint32_t i;
|
||||
i=0;
|
||||
//LOG("running checksum %d",nBytes);
|
||||
while(i<nBytes)
|
||||
{
|
||||
sum += ptrData[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
static bool isPageGood(uint32_t page)
|
||||
{
|
||||
eepromData_t *ptrData;
|
||||
uint16_t cs;
|
||||
ptrData=(eepromData_t *)&NVM_eeprom[page];
|
||||
|
||||
cs=checksum(ptrData->data, EEPROM_DATA_SIZE);
|
||||
//LOG("checksum is %d %d",cs,ptrData->header.checksum);
|
||||
|
||||
if (cs==ptrData->header.checksum)
|
||||
{
|
||||
//LOG("Page good %d",page);
|
||||
return true;
|
||||
}
|
||||
//LOG("page bad %d",page);
|
||||
return false;
|
||||
}
|
||||
|
||||
static void printEEPROM(uint32_t page)
|
||||
{
|
||||
eepromData_t *ptrData;
|
||||
int i;
|
||||
ptrData=(eepromData_t *)&NVM_eeprom[page];
|
||||
LOG("count %d", ptrData->header.count);
|
||||
LOG("checksum %d", ptrData->header.checksum);
|
||||
for (i=0; i<10; i++)
|
||||
{
|
||||
LOG("Data[%d]=%02X",i,ptrData->data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t findLastGoodPage(void)
|
||||
{
|
||||
uint32_t lastGoodPage=0;
|
||||
uint32_t page;
|
||||
uint16_t lastCnt=0;
|
||||
eepromData_t *ptrData;
|
||||
|
||||
page=0;
|
||||
while(page < (EEPROM_SIZE))
|
||||
{
|
||||
//LOG("checking page %d",page);
|
||||
if (isPageGood(page))
|
||||
{
|
||||
ptrData=(eepromData_t *)&NVM_eeprom[page];
|
||||
|
||||
//check for roll over which is OK
|
||||
if (lastCnt==16534 && ptrData->header.count==1)
|
||||
{
|
||||
lastCnt=ptrData->header.count;
|
||||
lastGoodPage=page;
|
||||
}
|
||||
if (ptrData->header.count>lastCnt)
|
||||
{
|
||||
//make sure we have not rolled over.
|
||||
if ((ptrData->header.count-lastCnt)<(16534/2))
|
||||
{
|
||||
lastCnt=ptrData->header.count;
|
||||
lastGoodPage=page;
|
||||
}
|
||||
}
|
||||
}
|
||||
page=page + FLASH_PAGE_SIZE_NZS;
|
||||
}
|
||||
//LOG("last good page %d",lastGoodPage);
|
||||
return lastGoodPage;
|
||||
}
|
||||
|
||||
//find the next page to write
|
||||
static uint32_t eepromGetNextWritPage(void)
|
||||
{
|
||||
eepromHeader_t *ptrHeader;
|
||||
uint32_t page;
|
||||
uint32_t row;
|
||||
int blockCount;
|
||||
int done=0;
|
||||
|
||||
//start at first address:
|
||||
page=0;
|
||||
|
||||
while(page < (EEPROM_SIZE))
|
||||
{
|
||||
//LOG("checking page %d",page);
|
||||
ptrHeader=(eepromHeader_t *) &NVM_eeprom[page];
|
||||
if (ptrHeader->count == 0xFFFF)
|
||||
{
|
||||
uint32_t i;
|
||||
uint8_t *ptrData;
|
||||
//uint8_t erasedByte=(uint8_t)ptrHeader->count;
|
||||
bool erased=true;
|
||||
|
||||
//verify page is erased
|
||||
ptrData= (uint8_t *)&NVM_eeprom[page];
|
||||
|
||||
for (i=0; i<FLASH_PAGE_SIZE_NZS; i++)
|
||||
{
|
||||
if (ptrData[i] != FLASH_ERASE_VALUE)
|
||||
{
|
||||
erased=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (erased)
|
||||
{
|
||||
//LOG("Found Page %d erased",page);
|
||||
return page;
|
||||
}
|
||||
}
|
||||
page=page+FLASH_PAGE_SIZE_NZS;
|
||||
}
|
||||
//if we get get here all the pages are full...
|
||||
// we need to find the page with last good data.
|
||||
page=findLastGoodPage();
|
||||
|
||||
//find which row the page is in
|
||||
row=page/FLASH_ROW_SIZE;
|
||||
|
||||
//increment to next row for erase
|
||||
row++;
|
||||
if ((row*FLASH_ROW_SIZE)>=EEPROM_SIZE)
|
||||
{
|
||||
row=0;
|
||||
//TODO we should make sure this not where good data is
|
||||
// however if it is what should we do?
|
||||
}
|
||||
|
||||
//now we need to erase that row
|
||||
//WARNING("Erasing page %d",row*FLASH_ROW_SIZE);
|
||||
flashErase(&NVM_eeprom[row*FLASH_ROW_SIZE],FLASH_ROW_SIZE);
|
||||
page=row*FLASH_ROW_SIZE;
|
||||
//LOG("Next free page is %d",page);
|
||||
return page;
|
||||
}
|
||||
|
||||
|
||||
eepromError_t eepromInit(void)
|
||||
{
|
||||
uint32_t page;
|
||||
|
||||
|
||||
//find the last good page offset in flash
|
||||
page=findLastGoodPage();
|
||||
LOG("EEPROM Init found page %d",page);
|
||||
if (isPageGood(page))
|
||||
{
|
||||
LOG("EEPROM page good %d",page);
|
||||
memcpy(&EEPROMCache, &NVM_eeprom[page], sizeof(EEPROMCache));
|
||||
|
||||
NextPageWrite=eepromGetNextWritPage();
|
||||
return EEPROM_OK;
|
||||
}
|
||||
//ERROR("page is bad");
|
||||
memset(&EEPROMCache, 0, sizeof(EEPROMCache));
|
||||
NextPageWrite=eepromGetNextWritPage();
|
||||
return EEPROM_CORRUPT;
|
||||
}
|
||||
|
||||
|
||||
int eepromWriteCache(uint8_t *ptrData, uint32_t size)
|
||||
{
|
||||
//LOG("Cache write %d",size);
|
||||
if (NextPageWrite==-1) //some one did not init the module
|
||||
{
|
||||
//lets handle gracefully and do it ourselves
|
||||
eepromInit();
|
||||
}
|
||||
if (size>EEPROM_DATA_SIZE)
|
||||
{
|
||||
size =EEPROM_DATA_SIZE;
|
||||
}
|
||||
memcpy(EEPROMCache.data, ptrData, size);
|
||||
EEPROMCache.header.checksum=checksum(EEPROMCache.data,EEPROM_DATA_SIZE);
|
||||
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
int eepromRead(uint8_t *ptrData, uint32_t size) //returns number of bytes actually read, whcih could be less than size requested
|
||||
{
|
||||
if (NextPageWrite==-1) //some one did not init the module
|
||||
{
|
||||
//lets handle gracefully and do it ourselves
|
||||
eepromInit();
|
||||
}
|
||||
if (size>EEPROM_DATA_SIZE)
|
||||
{
|
||||
size =EEPROM_DATA_SIZE;
|
||||
}
|
||||
if (EEPROMCache.header.count == 0)
|
||||
{
|
||||
return 0; //cache is new/corrupt
|
||||
}
|
||||
memcpy(ptrData, EEPROMCache.data, size);
|
||||
return size;
|
||||
}
|
||||
|
||||
eepromError_t eepromFlush(void) //flush the cache to flash memory
|
||||
{
|
||||
if (NextPageWrite==-1)
|
||||
{
|
||||
ERROR("EEPROM WRITE FAILED");
|
||||
return EEPROM_FAILED; //most likely no one has written to cache
|
||||
}
|
||||
EEPROMCache.header.count++;
|
||||
if (EEPROMCache.header.count>=16535)
|
||||
{
|
||||
EEPROMCache.header.count=1;
|
||||
}
|
||||
//WARNING("Writting to Page %d",NextPageWrite);
|
||||
flashWrite(&NVM_eeprom[NextPageWrite], &EEPROMCache, sizeof(EEPROMCache));
|
||||
|
||||
// printEEPROM(NextPageWrite);
|
||||
|
||||
if (!SYSCTRL->PCLKSR.bit.BOD33DET) //if not in brown out condition find next write location
|
||||
{
|
||||
//LOG("getting next page to write");
|
||||
NextPageWrite=eepromGetNextWritPage(); //find next write location and erase if needed
|
||||
} else
|
||||
{
|
||||
//LOG("BOD active");
|
||||
NextPageWrite=-1; //else we will just clear NextPageWrite location just in case we recover from brown out
|
||||
}
|
||||
return EEPROM_OK;
|
||||
}
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "eeprom.h"
|
||||
#include "calibration.h"
|
||||
#include "Flash.h"
|
||||
#include "board.h" //for divide with rounding macro
|
||||
#include <Arduino.h>
|
||||
#include "syslog.h"
|
||||
|
||||
//since we will write the following structure into each page, we need to find our latest page
|
||||
// to do this we will use the header to contain a checksum and write counter.
|
||||
#define EEPROM_SIZE (FLASH_ROW_SIZE*2)
|
||||
|
||||
typedef struct {
|
||||
uint16_t checksum;
|
||||
uint16_t count;
|
||||
}eepromHeader_t;
|
||||
|
||||
#define EEPROM_DATA_SIZE (FLASH_PAGE_SIZE_NZS-sizeof(eepromHeader_t))
|
||||
typedef struct {
|
||||
eepromHeader_t header;
|
||||
uint8_t data[EEPROM_DATA_SIZE];
|
||||
} eepromData_t;
|
||||
|
||||
|
||||
|
||||
static eepromData_t EEPROMCache;
|
||||
|
||||
static int32_t NextPageWrite=-1;
|
||||
|
||||
//we need to reserve two pages for EEPROM
|
||||
__attribute__((__aligned__(FLASH_ROW_SIZE))) const uint8_t NVM_eeprom[EEPROM_SIZE]={0xFF};
|
||||
|
||||
|
||||
static uint16_t checksum(uint8_t *ptrData, uint32_t nBytes)
|
||||
{
|
||||
uint16_t sum=0;
|
||||
uint32_t i;
|
||||
i=0;
|
||||
//LOG("running checksum %d",nBytes);
|
||||
while(i<nBytes)
|
||||
{
|
||||
sum += ptrData[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
static bool isPageGood(uint32_t page)
|
||||
{
|
||||
eepromData_t *ptrData;
|
||||
uint16_t cs;
|
||||
ptrData=(eepromData_t *)&NVM_eeprom[page];
|
||||
|
||||
cs=checksum(ptrData->data, EEPROM_DATA_SIZE);
|
||||
//LOG("checksum is %d %d",cs,ptrData->header.checksum);
|
||||
|
||||
if (cs==ptrData->header.checksum)
|
||||
{
|
||||
//LOG("Page good %d",page);
|
||||
return true;
|
||||
}
|
||||
//LOG("page bad %d",page);
|
||||
return false;
|
||||
}
|
||||
|
||||
static void printEEPROM(uint32_t page)
|
||||
{
|
||||
eepromData_t *ptrData;
|
||||
int i;
|
||||
ptrData=(eepromData_t *)&NVM_eeprom[page];
|
||||
LOG("count %d", ptrData->header.count);
|
||||
LOG("checksum %d", ptrData->header.checksum);
|
||||
for (i=0; i<10; i++)
|
||||
{
|
||||
LOG("Data[%d]=%02X",i,ptrData->data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t findLastGoodPage(void)
|
||||
{
|
||||
uint32_t lastGoodPage=0;
|
||||
uint32_t page;
|
||||
uint16_t lastCnt=0;
|
||||
eepromData_t *ptrData;
|
||||
|
||||
page=0;
|
||||
while(page < (EEPROM_SIZE))
|
||||
{
|
||||
//LOG("checking page %d",page);
|
||||
if (isPageGood(page))
|
||||
{
|
||||
ptrData=(eepromData_t *)&NVM_eeprom[page];
|
||||
|
||||
//check for roll over which is OK
|
||||
if (lastCnt==16534 && ptrData->header.count==1)
|
||||
{
|
||||
lastCnt=ptrData->header.count;
|
||||
lastGoodPage=page;
|
||||
}
|
||||
if (ptrData->header.count>lastCnt)
|
||||
{
|
||||
//make sure we have not rolled over.
|
||||
if ((ptrData->header.count-lastCnt)<(16534/2))
|
||||
{
|
||||
lastCnt=ptrData->header.count;
|
||||
lastGoodPage=page;
|
||||
}
|
||||
}
|
||||
}
|
||||
page=page + FLASH_PAGE_SIZE_NZS;
|
||||
}
|
||||
//LOG("last good page %d",lastGoodPage);
|
||||
return lastGoodPage;
|
||||
}
|
||||
|
||||
//find the next page to write
|
||||
static uint32_t eepromGetNextWritPage(void)
|
||||
{
|
||||
eepromHeader_t *ptrHeader;
|
||||
uint32_t page;
|
||||
uint32_t row;
|
||||
int blockCount;
|
||||
int done=0;
|
||||
|
||||
//start at first address:
|
||||
page=0;
|
||||
|
||||
while(page < (EEPROM_SIZE))
|
||||
{
|
||||
//LOG("checking page %d",page);
|
||||
ptrHeader=(eepromHeader_t *) &NVM_eeprom[page];
|
||||
if (ptrHeader->count == 0xFFFF)
|
||||
{
|
||||
uint32_t i;
|
||||
uint8_t *ptrData;
|
||||
//uint8_t erasedByte=(uint8_t)ptrHeader->count;
|
||||
bool erased=true;
|
||||
|
||||
//verify page is erased
|
||||
ptrData= (uint8_t *)&NVM_eeprom[page];
|
||||
|
||||
for (i=0; i<FLASH_PAGE_SIZE_NZS; i++)
|
||||
{
|
||||
if (ptrData[i] != FLASH_ERASE_VALUE)
|
||||
{
|
||||
erased=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (erased)
|
||||
{
|
||||
//LOG("Found Page %d erased",page);
|
||||
return page;
|
||||
}
|
||||
}
|
||||
page=page+FLASH_PAGE_SIZE_NZS;
|
||||
}
|
||||
//if we get get here all the pages are full...
|
||||
// we need to find the page with last good data.
|
||||
page=findLastGoodPage();
|
||||
|
||||
//find which row the page is in
|
||||
row=page/FLASH_ROW_SIZE;
|
||||
|
||||
//increment to next row for erase
|
||||
row++;
|
||||
if ((row*FLASH_ROW_SIZE)>=EEPROM_SIZE)
|
||||
{
|
||||
row=0;
|
||||
//TODO we should make sure this not where good data is
|
||||
// however if it is what should we do?
|
||||
}
|
||||
|
||||
//now we need to erase that row
|
||||
//WARNING("Erasing page %d",row*FLASH_ROW_SIZE);
|
||||
flashErase(&NVM_eeprom[row*FLASH_ROW_SIZE],FLASH_ROW_SIZE);
|
||||
page=row*FLASH_ROW_SIZE;
|
||||
//LOG("Next free page is %d",page);
|
||||
return page;
|
||||
}
|
||||
|
||||
|
||||
eepromError_t eepromInit(void)
|
||||
{
|
||||
uint32_t page;
|
||||
|
||||
|
||||
//find the last good page offset in flash
|
||||
page=findLastGoodPage();
|
||||
LOG("EEPROM Init found page %d",page);
|
||||
if (isPageGood(page))
|
||||
{
|
||||
LOG("EEPROM page good %d",page);
|
||||
memcpy(&EEPROMCache, &NVM_eeprom[page], sizeof(EEPROMCache));
|
||||
|
||||
NextPageWrite=eepromGetNextWritPage();
|
||||
return EEPROM_OK;
|
||||
}
|
||||
//ERROR("page is bad");
|
||||
memset(&EEPROMCache, 0, sizeof(EEPROMCache));
|
||||
NextPageWrite=eepromGetNextWritPage();
|
||||
return EEPROM_CORRUPT;
|
||||
}
|
||||
|
||||
|
||||
int eepromWriteCache(uint8_t *ptrData, uint32_t size)
|
||||
{
|
||||
//LOG("Cache write %d",size);
|
||||
if (NextPageWrite==-1) //some one did not init the module
|
||||
{
|
||||
//lets handle gracefully and do it ourselves
|
||||
eepromInit();
|
||||
}
|
||||
if (size>EEPROM_DATA_SIZE)
|
||||
{
|
||||
size =EEPROM_DATA_SIZE;
|
||||
}
|
||||
memcpy(EEPROMCache.data, ptrData, size);
|
||||
EEPROMCache.header.checksum=checksum(EEPROMCache.data,EEPROM_DATA_SIZE);
|
||||
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
int eepromRead(uint8_t *ptrData, uint32_t size) //returns number of bytes actually read, whcih could be less than size requested
|
||||
{
|
||||
if (NextPageWrite==-1) //some one did not init the module
|
||||
{
|
||||
//lets handle gracefully and do it ourselves
|
||||
eepromInit();
|
||||
}
|
||||
if (size>EEPROM_DATA_SIZE)
|
||||
{
|
||||
size =EEPROM_DATA_SIZE;
|
||||
}
|
||||
if (EEPROMCache.header.count == 0)
|
||||
{
|
||||
return 0; //cache is new/corrupt
|
||||
}
|
||||
memcpy(ptrData, EEPROMCache.data, size);
|
||||
return size;
|
||||
}
|
||||
|
||||
eepromError_t eepromFlush(void) //flush the cache to flash memory
|
||||
{
|
||||
if (NextPageWrite==-1)
|
||||
{
|
||||
ERROR("EEPROM WRITE FAILED");
|
||||
return EEPROM_FAILED; //most likely no one has written to cache
|
||||
}
|
||||
EEPROMCache.header.count++;
|
||||
if (EEPROMCache.header.count>=16535)
|
||||
{
|
||||
EEPROMCache.header.count=1;
|
||||
}
|
||||
//WARNING("Writting to Page %d",NextPageWrite);
|
||||
flashWrite(&NVM_eeprom[NextPageWrite], &EEPROMCache, sizeof(EEPROMCache));
|
||||
|
||||
// printEEPROM(NextPageWrite);
|
||||
|
||||
if (!SYSCTRL->PCLKSR.bit.BOD33DET) //if not in brown out condition find next write location
|
||||
{
|
||||
//LOG("getting next page to write");
|
||||
NextPageWrite=eepromGetNextWritPage(); //find next write location and erase if needed
|
||||
} else
|
||||
{
|
||||
//LOG("BOD active");
|
||||
NextPageWrite=-1; //else we will just clear NextPageWrite location just in case we recover from brown out
|
||||
}
|
||||
return EEPROM_OK;
|
||||
}
|
||||
|
@ -1,62 +1,62 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef EEPROM_H_
|
||||
#define EEPROM_H_
|
||||
#include "Flash.h"
|
||||
#include "calibration.h"
|
||||
#include "board.h"
|
||||
|
||||
/*
|
||||
* This EEPROM implementation provides 60bytes of "eeprom space" (we reserve 4 bytes for overhead)
|
||||
* The EEPROM uses two rows of flash (256 bytes per row), which
|
||||
* for the SAMD21G18A this allows a minimual 200k writes, but typically 1200k
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
EEPROM_OK =0,
|
||||
EEPROM_FAILED=1,
|
||||
EEPROM_CORRUPT=2,
|
||||
} eepromError_t;
|
||||
|
||||
|
||||
eepromError_t eepromInit(void);
|
||||
int eepromWriteCache(uint8_t *ptrData, uint32_t size); //returns number bytes written to cache
|
||||
eepromError_t eepromFlush(void); //flush the cache to flash memory
|
||||
int eepromRead(uint8_t *ptrData, uint32_t size); //returns number of bytes actually read, whcih could be less than size requested
|
||||
|
||||
#endif /* EEPROM_H_ */
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef EEPROM_H_
|
||||
#define EEPROM_H_
|
||||
#include "Flash.h"
|
||||
#include "calibration.h"
|
||||
#include "board.h"
|
||||
|
||||
/*
|
||||
* This EEPROM implementation provides 60bytes of "eeprom space" (we reserve 4 bytes for overhead)
|
||||
* The EEPROM uses two rows of flash (256 bytes per row), which
|
||||
* for the SAMD21G18A this allows a minimual 200k writes, but typically 1200k
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
EEPROM_OK =0,
|
||||
EEPROM_FAILED=1,
|
||||
EEPROM_CORRUPT=2,
|
||||
} eepromError_t;
|
||||
|
||||
|
||||
eepromError_t eepromInit(void);
|
||||
int eepromWriteCache(uint8_t *ptrData, uint32_t size); //returns number bytes written to cache
|
||||
eepromError_t eepromFlush(void); //flush the cache to flash memory
|
||||
int eepromRead(uint8_t *ptrData, uint32_t size); //returns number of bytes actually read, whcih could be less than size requested
|
||||
|
||||
#endif /* EEPROM_H_ */
|
||||
|
@ -1,124 +1,124 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef FET_DRIVER_H_
|
||||
#define FET_DRIVER_H_
|
||||
|
||||
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "board.h"
|
||||
#include "angle.h"
|
||||
#include "sine.h"
|
||||
|
||||
#ifdef NEMA_23_10A_HW
|
||||
#define FET_DRIVER_NUM_MICROSTEPS (SINE_STEPS/4) //number of steps to use for microstepping, default is 256
|
||||
#define FET_DRIVER_NUM_ZERO_AVG (100)
|
||||
|
||||
|
||||
#define FET_ADC_TO_MA(x) (((x)*2537)/1000)
|
||||
#define FET_MA_TO_ADC(x) (((x)*1000)/2537)
|
||||
//prvent someone for making a mistake with the code
|
||||
#if ((FET_DRIVER_NUM_MICROSTEPS*4) != SINE_STEPS)
|
||||
#error "SINE_STEPS must be 4x of Micro steps for the move function"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* When it comes to the stepper driver if we use angles
|
||||
* we will always have a rounding error. For example
|
||||
* a 0-65536(360) angle for 1.8 degree step is 327.68 so
|
||||
* if you increment 200 of these as 327 you have a 13.6 error
|
||||
* after one rotation.
|
||||
* If you use floating point the effect is the same but takes longer.
|
||||
*
|
||||
* The only error-less accumulation system is to use native units, ie full
|
||||
* steps and microsteps.
|
||||
*
|
||||
*/
|
||||
|
||||
class FetDriver
|
||||
{
|
||||
static FetDriver *ptrInstance;
|
||||
private:
|
||||
uint32_t lastStepMicros; // time in microseconds that last step happened
|
||||
|
||||
int32_t PWM_Table_B[512];
|
||||
int32_t PWM_Table_A[512];
|
||||
|
||||
bool forwardRotation=true;
|
||||
volatile bool enabled=true;
|
||||
|
||||
volatile int32_t adc;
|
||||
|
||||
|
||||
volatile int32_t coilB_value=0;
|
||||
volatile int32_t coilB_Zero=-1;
|
||||
volatile int32_t coilB_SetPoint=100;
|
||||
volatile int32_t coilB_error=0;
|
||||
|
||||
volatile int32_t coilA_value=0;
|
||||
volatile int32_t coilA_Zero=-1;
|
||||
volatile int32_t coilA_SetPoint=200;
|
||||
volatile int32_t coilA_error=0;
|
||||
void ctrl_update(uint16_t channel, uint16_t value);
|
||||
void measureCoilB_zero(void);
|
||||
void measureCoilA_zero(void);
|
||||
void CalTableB(int32_t maxMA);
|
||||
void CalTableA(int32_t maxMA);
|
||||
int coilA_PWM(int32_t value);
|
||||
void coilB_PWM(int32_t value);
|
||||
int32_t getCoilB_mA(void);
|
||||
int32_t getCoilA_mA(void);
|
||||
public:
|
||||
|
||||
static void ADC_Callback(uint16_t channel, uint16_t value);
|
||||
void begin(void);
|
||||
|
||||
//moves motor where the modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
int32_t move(int32_t stepAngle, uint32_t mA);
|
||||
|
||||
uint32_t microsSinceStep(void) {return micros()-lastStepMicros;};
|
||||
void setRotationDirection(bool forward) {forwardRotation=forward;};
|
||||
|
||||
void enable(bool enable) {enabled=enable;};
|
||||
void limitCurrent(uint8_t x) {return;};
|
||||
};
|
||||
|
||||
|
||||
#endif //#ifdef NEMA_23_10A_HW
|
||||
#endif /* FET_DRIVER_H_ */
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef FET_DRIVER_H_
|
||||
#define FET_DRIVER_H_
|
||||
|
||||
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "board.h"
|
||||
#include "angle.h"
|
||||
#include "sine.h"
|
||||
|
||||
#ifdef NEMA_23_10A_HW
|
||||
#define FET_DRIVER_NUM_MICROSTEPS (SINE_STEPS/4) //number of steps to use for microstepping, default is 256
|
||||
#define FET_DRIVER_NUM_ZERO_AVG (100)
|
||||
|
||||
|
||||
#define FET_ADC_TO_MA(x) (((x)*2537)/1000)
|
||||
#define FET_MA_TO_ADC(x) (((x)*1000)/2537)
|
||||
//prvent someone for making a mistake with the code
|
||||
#if ((FET_DRIVER_NUM_MICROSTEPS*4) != SINE_STEPS)
|
||||
#error "SINE_STEPS must be 4x of Micro steps for the move function"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* When it comes to the stepper driver if we use angles
|
||||
* we will always have a rounding error. For example
|
||||
* a 0-65536(360) angle for 1.8 degree step is 327.68 so
|
||||
* if you increment 200 of these as 327 you have a 13.6 error
|
||||
* after one rotation.
|
||||
* If you use floating point the effect is the same but takes longer.
|
||||
*
|
||||
* The only error-less accumulation system is to use native units, ie full
|
||||
* steps and microsteps.
|
||||
*
|
||||
*/
|
||||
|
||||
class FetDriver
|
||||
{
|
||||
static FetDriver *ptrInstance;
|
||||
private:
|
||||
uint32_t lastStepMicros; // time in microseconds that last step happened
|
||||
|
||||
int32_t PWM_Table_B[512];
|
||||
int32_t PWM_Table_A[512];
|
||||
|
||||
bool forwardRotation=true;
|
||||
volatile bool enabled=true;
|
||||
|
||||
volatile int32_t adc;
|
||||
|
||||
|
||||
volatile int32_t coilB_value=0;
|
||||
volatile int32_t coilB_Zero=-1;
|
||||
volatile int32_t coilB_SetPoint=100;
|
||||
volatile int32_t coilB_error=0;
|
||||
|
||||
volatile int32_t coilA_value=0;
|
||||
volatile int32_t coilA_Zero=-1;
|
||||
volatile int32_t coilA_SetPoint=200;
|
||||
volatile int32_t coilA_error=0;
|
||||
void ctrl_update(uint16_t channel, uint16_t value);
|
||||
void measureCoilB_zero(void);
|
||||
void measureCoilA_zero(void);
|
||||
void CalTableB(int32_t maxMA);
|
||||
void CalTableA(int32_t maxMA);
|
||||
int coilA_PWM(int32_t value);
|
||||
void coilB_PWM(int32_t value);
|
||||
int32_t getCoilB_mA(void);
|
||||
int32_t getCoilA_mA(void);
|
||||
public:
|
||||
|
||||
static void ADC_Callback(uint16_t channel, uint16_t value);
|
||||
void begin(void);
|
||||
|
||||
//moves motor where the modulo of A4954_NUM_MICROSTEPS is a full step.
|
||||
int32_t move(int32_t stepAngle, uint32_t mA);
|
||||
|
||||
uint32_t microsSinceStep(void) {return micros()-lastStepMicros;};
|
||||
void setRotationDirection(bool forward) {forwardRotation=forward;};
|
||||
|
||||
void enable(bool enable) {enabled=enable;};
|
||||
void limitCurrent(uint8_t x) {return;};
|
||||
};
|
||||
|
||||
|
||||
#endif //#ifdef NEMA_23_10A_HW
|
||||
#endif /* FET_DRIVER_H_ */
|
||||
|
@ -1,193 +1,193 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "board.h"
|
||||
#include "ftoa.h"
|
||||
/*******************************************************************
|
||||
* FUNCTION: ftoa
|
||||
* AUTHOR = TRAMPAS STERN
|
||||
* FILE = strio.c
|
||||
* DATE = 2/6/2003 4:27:14 PM
|
||||
*
|
||||
* PARAMETERS: long,*str, int count
|
||||
*
|
||||
* DESCRIPTION: Convets an float to string
|
||||
* format 'f', 'E', or 'e'
|
||||
*
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
* NOTE this code was found on the web and modified to actually work
|
||||
*******************************************************************/
|
||||
int ftoa (float x, char *str, char prec, char format)
|
||||
{
|
||||
|
||||
int ie, i, k, ndig, fstyle;
|
||||
double y;
|
||||
char *start;
|
||||
|
||||
start=str;
|
||||
|
||||
//based on percission set number digits
|
||||
ndig=prec+1;
|
||||
if (prec<0)
|
||||
ndig=7;
|
||||
if (prec>22)
|
||||
ndig=23;
|
||||
|
||||
fstyle = 0; //exponent 'e'
|
||||
if (format == 'f' || format == 'F')
|
||||
fstyle = 1; //normal 'f'
|
||||
if (format=='g' || format=='G')
|
||||
fstyle=2;
|
||||
|
||||
ie = 0;
|
||||
/* if x negative, write minus and reverse */
|
||||
if ( x < 0)
|
||||
{
|
||||
*str++ = '-';
|
||||
x = -x;
|
||||
}
|
||||
|
||||
//if (x<0.0) then increment by 10 till betwen 1.0 and 10.0
|
||||
if (x!=0.0)
|
||||
{
|
||||
while (x < 1.0)
|
||||
{
|
||||
x =x* 10.0;
|
||||
ie--;
|
||||
}
|
||||
}
|
||||
|
||||
//if x>10 then let's shift it down
|
||||
while (x >= 10.0)
|
||||
{
|
||||
x = x*(1.0/10.0);
|
||||
ie++;
|
||||
}
|
||||
|
||||
if (ABS(ie)>MAX_MANTISA)
|
||||
{
|
||||
if (fstyle==1)
|
||||
{
|
||||
fstyle=0;
|
||||
format='e';
|
||||
//ie=2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* in f format, number of digits is related to size */
|
||||
if (fstyle)
|
||||
ndig =ndig + ie;
|
||||
|
||||
if(prec==0 && ie>ndig && fstyle)
|
||||
{
|
||||
ndig=ie;
|
||||
}
|
||||
|
||||
/* round. x is between 1 and 10 and ndig will be printed to
|
||||
right of decimal point so rounding is ... */
|
||||
y=1;
|
||||
for (i = 1; i < ndig; i++) //find lest significant digit
|
||||
y = y *(1.0/10.0); //multiply by 1/10 is faster than divides
|
||||
|
||||
x = x+ y *(1.0/2.0); //add rounding
|
||||
|
||||
/* repair rounding disasters */
|
||||
if (x >= 10.0)
|
||||
{
|
||||
x = 1.0;
|
||||
ie++;
|
||||
ndig++;
|
||||
}
|
||||
|
||||
//check and see if the number is less than 1.0
|
||||
if (fstyle && ie<0)
|
||||
{
|
||||
*str++ = '0';
|
||||
if (prec!=0)
|
||||
*str++ = '.';
|
||||
if (ndig < 0)
|
||||
ie = ie-ndig; /* limit zeros if underflow */
|
||||
for (i = -1; i > ie; i--)
|
||||
*str++ = '0';
|
||||
}
|
||||
|
||||
//for each digit
|
||||
for (i=0; i < ndig; i++)
|
||||
{
|
||||
float b;
|
||||
k = x; //k = most significant digit
|
||||
*str++ = k + '0'; //output the char representation
|
||||
if (((!fstyle && i==0) || (fstyle && i==ie)) && prec!=0)
|
||||
*str++ = '.'; //output a decimal point
|
||||
b=(float)k;
|
||||
//multiply by 10 before subtraction to remove
|
||||
//errors from limited number of bits in float.
|
||||
b=b*10.0;
|
||||
x=x*10.0;
|
||||
x =x - b; //subtract k from x
|
||||
//b=x+b;
|
||||
//x =x* 10.0; //get next digit
|
||||
}
|
||||
|
||||
/* now, in estyle, put out exponent if not zero */
|
||||
if (!fstyle && ie != 0)
|
||||
{
|
||||
*str++ = format;
|
||||
if (ie < 0) //if number has negative exponent
|
||||
{
|
||||
ie = -ie;
|
||||
*str++ = '-';
|
||||
}
|
||||
|
||||
//now we need to convert the exponent to string
|
||||
for (k=1000; k>ie; k=k/10); //find the decade of exponent
|
||||
|
||||
for (; k > 0; k=k/10)
|
||||
{
|
||||
char t;
|
||||
t=DIV(ie,k);
|
||||
*str++ = t + '0';
|
||||
ie = ie -(t*k);
|
||||
}
|
||||
|
||||
}
|
||||
*str++ = '\0';
|
||||
return (str-start); //return string length
|
||||
}
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "board.h"
|
||||
#include "ftoa.h"
|
||||
/*******************************************************************
|
||||
* FUNCTION: ftoa
|
||||
* AUTHOR = TRAMPAS STERN
|
||||
* FILE = strio.c
|
||||
* DATE = 2/6/2003 4:27:14 PM
|
||||
*
|
||||
* PARAMETERS: long,*str, int count
|
||||
*
|
||||
* DESCRIPTION: Convets an float to string
|
||||
* format 'f', 'E', or 'e'
|
||||
*
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
* NOTE this code was found on the web and modified to actually work
|
||||
*******************************************************************/
|
||||
int ftoa (float x, char *str, char prec, char format)
|
||||
{
|
||||
|
||||
int ie, i, k, ndig, fstyle;
|
||||
double y;
|
||||
char *start;
|
||||
|
||||
start=str;
|
||||
|
||||
//based on percission set number digits
|
||||
ndig=prec+1;
|
||||
if (prec<0)
|
||||
ndig=7;
|
||||
if (prec>22)
|
||||
ndig=23;
|
||||
|
||||
fstyle = 0; //exponent 'e'
|
||||
if (format == 'f' || format == 'F')
|
||||
fstyle = 1; //normal 'f'
|
||||
if (format=='g' || format=='G')
|
||||
fstyle=2;
|
||||
|
||||
ie = 0;
|
||||
/* if x negative, write minus and reverse */
|
||||
if ( x < 0)
|
||||
{
|
||||
*str++ = '-';
|
||||
x = -x;
|
||||
}
|
||||
|
||||
//if (x<0.0) then increment by 10 till betwen 1.0 and 10.0
|
||||
if (x!=0.0)
|
||||
{
|
||||
while (x < 1.0)
|
||||
{
|
||||
x =x* 10.0;
|
||||
ie--;
|
||||
}
|
||||
}
|
||||
|
||||
//if x>10 then let's shift it down
|
||||
while (x >= 10.0)
|
||||
{
|
||||
x = x*(1.0/10.0);
|
||||
ie++;
|
||||
}
|
||||
|
||||
if (ABS(ie)>MAX_MANTISA)
|
||||
{
|
||||
if (fstyle==1)
|
||||
{
|
||||
fstyle=0;
|
||||
format='e';
|
||||
//ie=2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* in f format, number of digits is related to size */
|
||||
if (fstyle)
|
||||
ndig =ndig + ie;
|
||||
|
||||
if(prec==0 && ie>ndig && fstyle)
|
||||
{
|
||||
ndig=ie;
|
||||
}
|
||||
|
||||
/* round. x is between 1 and 10 and ndig will be printed to
|
||||
right of decimal point so rounding is ... */
|
||||
y=1;
|
||||
for (i = 1; i < ndig; i++) //find lest significant digit
|
||||
y = y *(1.0/10.0); //multiply by 1/10 is faster than divides
|
||||
|
||||
x = x+ y *(1.0/2.0); //add rounding
|
||||
|
||||
/* repair rounding disasters */
|
||||
if (x >= 10.0)
|
||||
{
|
||||
x = 1.0;
|
||||
ie++;
|
||||
ndig++;
|
||||
}
|
||||
|
||||
//check and see if the number is less than 1.0
|
||||
if (fstyle && ie<0)
|
||||
{
|
||||
*str++ = '0';
|
||||
if (prec!=0)
|
||||
*str++ = '.';
|
||||
if (ndig < 0)
|
||||
ie = ie-ndig; /* limit zeros if underflow */
|
||||
for (i = -1; i > ie; i--)
|
||||
*str++ = '0';
|
||||
}
|
||||
|
||||
//for each digit
|
||||
for (i=0; i < ndig; i++)
|
||||
{
|
||||
float b;
|
||||
k = x; //k = most significant digit
|
||||
*str++ = k + '0'; //output the char representation
|
||||
if (((!fstyle && i==0) || (fstyle && i==ie)) && prec!=0)
|
||||
*str++ = '.'; //output a decimal point
|
||||
b=(float)k;
|
||||
//multiply by 10 before subtraction to remove
|
||||
//errors from limited number of bits in float.
|
||||
b=b*10.0;
|
||||
x=x*10.0;
|
||||
x =x - b; //subtract k from x
|
||||
//b=x+b;
|
||||
//x =x* 10.0; //get next digit
|
||||
}
|
||||
|
||||
/* now, in estyle, put out exponent if not zero */
|
||||
if (!fstyle && ie != 0)
|
||||
{
|
||||
*str++ = format;
|
||||
if (ie < 0) //if number has negative exponent
|
||||
{
|
||||
ie = -ie;
|
||||
*str++ = '-';
|
||||
}
|
||||
|
||||
//now we need to convert the exponent to string
|
||||
for (k=1000; k>ie; k=k/10); //find the decade of exponent
|
||||
|
||||
for (; k > 0; k=k/10)
|
||||
{
|
||||
char t;
|
||||
t=DIV(ie,k);
|
||||
*str++ = t + '0';
|
||||
ie = ie -(t*k);
|
||||
}
|
||||
|
||||
}
|
||||
*str++ = '\0';
|
||||
return (str-start); //return string length
|
||||
}
|
||||
|
@ -1,48 +1,48 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef FTOA_H_
|
||||
#define FTOA_H_
|
||||
|
||||
#define MAX_MANTISA (1000)
|
||||
|
||||
int ftoa (float x, char *str, char prec, char format);
|
||||
|
||||
|
||||
|
||||
#endif /* FTOA_H_ */
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef FTOA_H_
|
||||
#define FTOA_H_
|
||||
|
||||
#define MAX_MANTISA (1000)
|
||||
|
||||
int ftoa (float x, char *str, char prec, char format);
|
||||
|
||||
|
||||
|
||||
#endif /* FTOA_H_ */
|
||||
|
@ -1,24 +1,24 @@
|
||||
// Font structures for newer Adafruit_GFX (1.1 and later).
|
||||
// Example fonts are included in 'Fonts' directory.
|
||||
// To use a font in your Arduino sketch, #include the corresponding .h
|
||||
// file and pass address of GFXfont struct to setFont(). Pass NULL to
|
||||
// revert to 'classic' fixed-space bitmap font.
|
||||
|
||||
#ifndef _GFXFONT_H_
|
||||
#define _GFXFONT_H_
|
||||
|
||||
typedef struct { // Data stored PER GLYPH
|
||||
uint16_t bitmapOffset; // Pointer into GFXfont->bitmap
|
||||
uint8_t width, height; // Bitmap dimensions in pixels
|
||||
uint8_t xAdvance; // Distance to advance cursor (x axis)
|
||||
int8_t xOffset, yOffset; // Dist from cursor pos to UL corner
|
||||
} GFXglyph;
|
||||
|
||||
typedef struct { // Data stored for FONT AS A WHOLE:
|
||||
uint8_t *bitmap; // Glyph bitmaps, concatenated
|
||||
GFXglyph *glyph; // Glyph array
|
||||
uint8_t first, last; // ASCII extents
|
||||
uint8_t yAdvance; // Newline distance (y axis)
|
||||
} GFXfont;
|
||||
|
||||
#endif // _GFXFONT_H_
|
||||
// Font structures for newer Adafruit_GFX (1.1 and later).
|
||||
// Example fonts are included in 'Fonts' directory.
|
||||
// To use a font in your Arduino sketch, #include the corresponding .h
|
||||
// file and pass address of GFXfont struct to setFont(). Pass NULL to
|
||||
// revert to 'classic' fixed-space bitmap font.
|
||||
|
||||
#ifndef _GFXFONT_H_
|
||||
#define _GFXFONT_H_
|
||||
|
||||
typedef struct { // Data stored PER GLYPH
|
||||
uint16_t bitmapOffset; // Pointer into GFXfont->bitmap
|
||||
uint8_t width, height; // Bitmap dimensions in pixels
|
||||
uint8_t xAdvance; // Distance to advance cursor (x axis)
|
||||
int8_t xOffset, yOffset; // Dist from cursor pos to UL corner
|
||||
} GFXglyph;
|
||||
|
||||
typedef struct { // Data stored for FONT AS A WHOLE:
|
||||
uint8_t *bitmap; // Glyph bitmaps, concatenated
|
||||
GFXglyph *glyph; // Glyph array
|
||||
uint8_t first, last; // ASCII extents
|
||||
uint8_t yAdvance; // Newline distance (y axis)
|
||||
} GFXfont;
|
||||
|
||||
#endif // _GFXFONT_H_
|
||||
|
@ -1,276 +1,276 @@
|
||||
// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
|
||||
// See gfxfont.h for newer custom bitmap font info.
|
||||
|
||||
#ifndef FONT5X7_H
|
||||
#define FONT5X7_H
|
||||
|
||||
#ifdef __AVR__
|
||||
#include <avr/io.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#elif defined(ESP8266)
|
||||
#include <pgmspace.h>
|
||||
#else
|
||||
#define PROGMEM
|
||||
#endif
|
||||
|
||||
// Standard ASCII 5x7 font
|
||||
|
||||
static const unsigned char font[] PROGMEM = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
|
||||
0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
|
||||
0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
|
||||
0x18, 0x3C, 0x7E, 0x3C, 0x18,
|
||||
0x1C, 0x57, 0x7D, 0x57, 0x1C,
|
||||
0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
|
||||
0x00, 0x18, 0x3C, 0x18, 0x00,
|
||||
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
|
||||
0x00, 0x18, 0x24, 0x18, 0x00,
|
||||
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
|
||||
0x30, 0x48, 0x3A, 0x06, 0x0E,
|
||||
0x26, 0x29, 0x79, 0x29, 0x26,
|
||||
0x40, 0x7F, 0x05, 0x05, 0x07,
|
||||
0x40, 0x7F, 0x05, 0x25, 0x3F,
|
||||
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
|
||||
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
|
||||
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
|
||||
0x14, 0x22, 0x7F, 0x22, 0x14,
|
||||
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
|
||||
0x06, 0x09, 0x7F, 0x01, 0x7F,
|
||||
0x00, 0x66, 0x89, 0x95, 0x6A,
|
||||
0x60, 0x60, 0x60, 0x60, 0x60,
|
||||
0x94, 0xA2, 0xFF, 0xA2, 0x94,
|
||||
0x08, 0x04, 0x7E, 0x04, 0x08,
|
||||
0x10, 0x20, 0x7E, 0x20, 0x10,
|
||||
0x08, 0x08, 0x2A, 0x1C, 0x08,
|
||||
0x08, 0x1C, 0x2A, 0x08, 0x08,
|
||||
0x1E, 0x10, 0x10, 0x10, 0x10,
|
||||
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
|
||||
0x30, 0x38, 0x3E, 0x38, 0x30,
|
||||
0x06, 0x0E, 0x3E, 0x0E, 0x06,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x5F, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x07, 0x00,
|
||||
0x14, 0x7F, 0x14, 0x7F, 0x14,
|
||||
0x24, 0x2A, 0x7F, 0x2A, 0x12,
|
||||
0x23, 0x13, 0x08, 0x64, 0x62,
|
||||
0x36, 0x49, 0x56, 0x20, 0x50,
|
||||
0x00, 0x08, 0x07, 0x03, 0x00,
|
||||
0x00, 0x1C, 0x22, 0x41, 0x00,
|
||||
0x00, 0x41, 0x22, 0x1C, 0x00,
|
||||
0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
|
||||
0x08, 0x08, 0x3E, 0x08, 0x08,
|
||||
0x00, 0x80, 0x70, 0x30, 0x00,
|
||||
0x08, 0x08, 0x08, 0x08, 0x08,
|
||||
0x00, 0x00, 0x60, 0x60, 0x00,
|
||||
0x20, 0x10, 0x08, 0x04, 0x02,
|
||||
0x3E, 0x51, 0x49, 0x45, 0x3E,
|
||||
0x00, 0x42, 0x7F, 0x40, 0x00,
|
||||
0x72, 0x49, 0x49, 0x49, 0x46,
|
||||
0x21, 0x41, 0x49, 0x4D, 0x33,
|
||||
0x18, 0x14, 0x12, 0x7F, 0x10,
|
||||
0x27, 0x45, 0x45, 0x45, 0x39,
|
||||
0x3C, 0x4A, 0x49, 0x49, 0x31,
|
||||
0x41, 0x21, 0x11, 0x09, 0x07,
|
||||
0x36, 0x49, 0x49, 0x49, 0x36,
|
||||
0x46, 0x49, 0x49, 0x29, 0x1E,
|
||||
0x00, 0x00, 0x14, 0x00, 0x00,
|
||||
0x00, 0x40, 0x34, 0x00, 0x00,
|
||||
0x00, 0x08, 0x14, 0x22, 0x41,
|
||||
0x14, 0x14, 0x14, 0x14, 0x14,
|
||||
0x00, 0x41, 0x22, 0x14, 0x08,
|
||||
0x02, 0x01, 0x59, 0x09, 0x06,
|
||||
0x3E, 0x41, 0x5D, 0x59, 0x4E,
|
||||
0x7C, 0x12, 0x11, 0x12, 0x7C,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x36,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x22,
|
||||
0x7F, 0x41, 0x41, 0x41, 0x3E,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x41,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x01,
|
||||
0x3E, 0x41, 0x41, 0x51, 0x73,
|
||||
0x7F, 0x08, 0x08, 0x08, 0x7F,
|
||||
0x00, 0x41, 0x7F, 0x41, 0x00,
|
||||
0x20, 0x40, 0x41, 0x3F, 0x01,
|
||||
0x7F, 0x08, 0x14, 0x22, 0x41,
|
||||
0x7F, 0x40, 0x40, 0x40, 0x40,
|
||||
0x7F, 0x02, 0x1C, 0x02, 0x7F,
|
||||
0x7F, 0x04, 0x08, 0x10, 0x7F,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x3E,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x06,
|
||||
0x3E, 0x41, 0x51, 0x21, 0x5E,
|
||||
0x7F, 0x09, 0x19, 0x29, 0x46,
|
||||
0x26, 0x49, 0x49, 0x49, 0x32,
|
||||
0x03, 0x01, 0x7F, 0x01, 0x03,
|
||||
0x3F, 0x40, 0x40, 0x40, 0x3F,
|
||||
0x1F, 0x20, 0x40, 0x20, 0x1F,
|
||||
0x3F, 0x40, 0x38, 0x40, 0x3F,
|
||||
0x63, 0x14, 0x08, 0x14, 0x63,
|
||||
0x03, 0x04, 0x78, 0x04, 0x03,
|
||||
0x61, 0x59, 0x49, 0x4D, 0x43,
|
||||
0x00, 0x7F, 0x41, 0x41, 0x41,
|
||||
0x02, 0x04, 0x08, 0x10, 0x20,
|
||||
0x00, 0x41, 0x41, 0x41, 0x7F,
|
||||
0x04, 0x02, 0x01, 0x02, 0x04,
|
||||
0x40, 0x40, 0x40, 0x40, 0x40,
|
||||
0x00, 0x03, 0x07, 0x08, 0x00,
|
||||
0x20, 0x54, 0x54, 0x78, 0x40,
|
||||
0x7F, 0x28, 0x44, 0x44, 0x38,
|
||||
0x38, 0x44, 0x44, 0x44, 0x28,
|
||||
0x38, 0x44, 0x44, 0x28, 0x7F,
|
||||
0x38, 0x54, 0x54, 0x54, 0x18,
|
||||
0x00, 0x08, 0x7E, 0x09, 0x02,
|
||||
0x18, 0xA4, 0xA4, 0x9C, 0x78,
|
||||
0x7F, 0x08, 0x04, 0x04, 0x78,
|
||||
0x00, 0x44, 0x7D, 0x40, 0x00,
|
||||
0x20, 0x40, 0x40, 0x3D, 0x00,
|
||||
0x7F, 0x10, 0x28, 0x44, 0x00,
|
||||
0x00, 0x41, 0x7F, 0x40, 0x00,
|
||||
0x7C, 0x04, 0x78, 0x04, 0x78,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x78,
|
||||
0x38, 0x44, 0x44, 0x44, 0x38,
|
||||
0xFC, 0x18, 0x24, 0x24, 0x18,
|
||||
0x18, 0x24, 0x24, 0x18, 0xFC,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x08,
|
||||
0x48, 0x54, 0x54, 0x54, 0x24,
|
||||
0x04, 0x04, 0x3F, 0x44, 0x24,
|
||||
0x3C, 0x40, 0x40, 0x20, 0x7C,
|
||||
0x1C, 0x20, 0x40, 0x20, 0x1C,
|
||||
0x3C, 0x40, 0x30, 0x40, 0x3C,
|
||||
0x44, 0x28, 0x10, 0x28, 0x44,
|
||||
0x4C, 0x90, 0x90, 0x90, 0x7C,
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44,
|
||||
0x00, 0x08, 0x36, 0x41, 0x00,
|
||||
0x00, 0x00, 0x77, 0x00, 0x00,
|
||||
0x00, 0x41, 0x36, 0x08, 0x00,
|
||||
0x02, 0x01, 0x02, 0x04, 0x02,
|
||||
0x3C, 0x26, 0x23, 0x26, 0x3C,
|
||||
0x1E, 0xA1, 0xA1, 0x61, 0x12,
|
||||
0x3A, 0x40, 0x40, 0x20, 0x7A,
|
||||
0x38, 0x54, 0x54, 0x55, 0x59,
|
||||
0x21, 0x55, 0x55, 0x79, 0x41,
|
||||
0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
|
||||
0x21, 0x55, 0x54, 0x78, 0x40,
|
||||
0x20, 0x54, 0x55, 0x79, 0x40,
|
||||
0x0C, 0x1E, 0x52, 0x72, 0x12,
|
||||
0x39, 0x55, 0x55, 0x55, 0x59,
|
||||
0x39, 0x54, 0x54, 0x54, 0x59,
|
||||
0x39, 0x55, 0x54, 0x54, 0x58,
|
||||
0x00, 0x00, 0x45, 0x7C, 0x41,
|
||||
0x00, 0x02, 0x45, 0x7D, 0x42,
|
||||
0x00, 0x01, 0x45, 0x7C, 0x40,
|
||||
0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
|
||||
0xF0, 0x28, 0x25, 0x28, 0xF0,
|
||||
0x7C, 0x54, 0x55, 0x45, 0x00,
|
||||
0x20, 0x54, 0x54, 0x7C, 0x54,
|
||||
0x7C, 0x0A, 0x09, 0x7F, 0x49,
|
||||
0x32, 0x49, 0x49, 0x49, 0x32,
|
||||
0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
|
||||
0x32, 0x4A, 0x48, 0x48, 0x30,
|
||||
0x3A, 0x41, 0x41, 0x21, 0x7A,
|
||||
0x3A, 0x42, 0x40, 0x20, 0x78,
|
||||
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
|
||||
0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
|
||||
0x3D, 0x40, 0x40, 0x40, 0x3D,
|
||||
0x3C, 0x24, 0xFF, 0x24, 0x24,
|
||||
0x48, 0x7E, 0x49, 0x43, 0x66,
|
||||
0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
|
||||
0xFF, 0x09, 0x29, 0xF6, 0x20,
|
||||
0xC0, 0x88, 0x7E, 0x09, 0x03,
|
||||
0x20, 0x54, 0x54, 0x79, 0x41,
|
||||
0x00, 0x00, 0x44, 0x7D, 0x41,
|
||||
0x30, 0x48, 0x48, 0x4A, 0x32,
|
||||
0x38, 0x40, 0x40, 0x22, 0x7A,
|
||||
0x00, 0x7A, 0x0A, 0x0A, 0x72,
|
||||
0x7D, 0x0D, 0x19, 0x31, 0x7D,
|
||||
0x26, 0x29, 0x29, 0x2F, 0x28,
|
||||
0x26, 0x29, 0x29, 0x29, 0x26,
|
||||
0x30, 0x48, 0x4D, 0x40, 0x20,
|
||||
0x38, 0x08, 0x08, 0x08, 0x08,
|
||||
0x08, 0x08, 0x08, 0x08, 0x38,
|
||||
0x2F, 0x10, 0xC8, 0xAC, 0xBA,
|
||||
0x2F, 0x10, 0x28, 0x34, 0xFA,
|
||||
0x00, 0x00, 0x7B, 0x00, 0x00,
|
||||
0x08, 0x14, 0x2A, 0x14, 0x22,
|
||||
0x22, 0x14, 0x2A, 0x14, 0x08,
|
||||
0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
|
||||
0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block
|
||||
0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block
|
||||
0x00, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x10, 0x10, 0x10, 0xFF, 0x00,
|
||||
0x14, 0x14, 0x14, 0xFF, 0x00,
|
||||
0x10, 0x10, 0xFF, 0x00, 0xFF,
|
||||
0x10, 0x10, 0xF0, 0x10, 0xF0,
|
||||
0x14, 0x14, 0x14, 0xFC, 0x00,
|
||||
0x14, 0x14, 0xF7, 0x00, 0xFF,
|
||||
0x00, 0x00, 0xFF, 0x00, 0xFF,
|
||||
0x14, 0x14, 0xF4, 0x04, 0xFC,
|
||||
0x14, 0x14, 0x17, 0x10, 0x1F,
|
||||
0x10, 0x10, 0x1F, 0x10, 0x1F,
|
||||
0x14, 0x14, 0x14, 0x1F, 0x00,
|
||||
0x10, 0x10, 0x10, 0xF0, 0x00,
|
||||
0x00, 0x00, 0x00, 0x1F, 0x10,
|
||||
0x10, 0x10, 0x10, 0x1F, 0x10,
|
||||
0x10, 0x10, 0x10, 0xF0, 0x10,
|
||||
0x00, 0x00, 0x00, 0xFF, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0xFF, 0x10,
|
||||
0x00, 0x00, 0x00, 0xFF, 0x14,
|
||||
0x00, 0x00, 0xFF, 0x00, 0xFF,
|
||||
0x00, 0x00, 0x1F, 0x10, 0x17,
|
||||
0x00, 0x00, 0xFC, 0x04, 0xF4,
|
||||
0x14, 0x14, 0x17, 0x10, 0x17,
|
||||
0x14, 0x14, 0xF4, 0x04, 0xF4,
|
||||
0x00, 0x00, 0xFF, 0x00, 0xF7,
|
||||
0x14, 0x14, 0x14, 0x14, 0x14,
|
||||
0x14, 0x14, 0xF7, 0x00, 0xF7,
|
||||
0x14, 0x14, 0x14, 0x17, 0x14,
|
||||
0x10, 0x10, 0x1F, 0x10, 0x1F,
|
||||
0x14, 0x14, 0x14, 0xF4, 0x14,
|
||||
0x10, 0x10, 0xF0, 0x10, 0xF0,
|
||||
0x00, 0x00, 0x1F, 0x10, 0x1F,
|
||||
0x00, 0x00, 0x00, 0x1F, 0x14,
|
||||
0x00, 0x00, 0x00, 0xFC, 0x14,
|
||||
0x00, 0x00, 0xF0, 0x10, 0xF0,
|
||||
0x10, 0x10, 0xFF, 0x10, 0xFF,
|
||||
0x14, 0x14, 0x14, 0xFF, 0x14,
|
||||
0x10, 0x10, 0x10, 0x1F, 0x00,
|
||||
0x00, 0x00, 0x00, 0xF0, 0x10,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
|
||||
0xFF, 0xFF, 0xFF, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0xFF, 0xFF,
|
||||
0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||
0x38, 0x44, 0x44, 0x38, 0x44,
|
||||
0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
|
||||
0x7E, 0x02, 0x02, 0x06, 0x06,
|
||||
0x02, 0x7E, 0x02, 0x7E, 0x02,
|
||||
0x63, 0x55, 0x49, 0x41, 0x63,
|
||||
0x38, 0x44, 0x44, 0x3C, 0x04,
|
||||
0x40, 0x7E, 0x20, 0x1E, 0x20,
|
||||
0x06, 0x02, 0x7E, 0x02, 0x02,
|
||||
0x99, 0xA5, 0xE7, 0xA5, 0x99,
|
||||
0x1C, 0x2A, 0x49, 0x2A, 0x1C,
|
||||
0x4C, 0x72, 0x01, 0x72, 0x4C,
|
||||
0x30, 0x4A, 0x4D, 0x4D, 0x30,
|
||||
0x30, 0x48, 0x78, 0x48, 0x30,
|
||||
0xBC, 0x62, 0x5A, 0x46, 0x3D,
|
||||
0x3E, 0x49, 0x49, 0x49, 0x00,
|
||||
0x7E, 0x01, 0x01, 0x01, 0x7E,
|
||||
0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
|
||||
0x44, 0x44, 0x5F, 0x44, 0x44,
|
||||
0x40, 0x51, 0x4A, 0x44, 0x40,
|
||||
0x40, 0x44, 0x4A, 0x51, 0x40,
|
||||
0x00, 0x00, 0xFF, 0x01, 0x03,
|
||||
0xE0, 0x80, 0xFF, 0x00, 0x00,
|
||||
0x08, 0x08, 0x6B, 0x6B, 0x08,
|
||||
0x36, 0x12, 0x36, 0x24, 0x36,
|
||||
0x06, 0x0F, 0x09, 0x0F, 0x06,
|
||||
0x00, 0x00, 0x18, 0x18, 0x00,
|
||||
0x00, 0x00, 0x10, 0x10, 0x00,
|
||||
0x30, 0x40, 0xFF, 0x01, 0x01,
|
||||
0x00, 0x1F, 0x01, 0x01, 0x1E,
|
||||
0x00, 0x19, 0x1D, 0x17, 0x12,
|
||||
0x00, 0x3C, 0x3C, 0x3C, 0x3C,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP
|
||||
};
|
||||
#endif // FONT5X7_H
|
||||
// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
|
||||
// See gfxfont.h for newer custom bitmap font info.
|
||||
|
||||
#ifndef FONT5X7_H
|
||||
#define FONT5X7_H
|
||||
|
||||
#ifdef __AVR__
|
||||
#include <avr/io.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#elif defined(ESP8266)
|
||||
#include <pgmspace.h>
|
||||
#else
|
||||
#define PROGMEM
|
||||
#endif
|
||||
|
||||
// Standard ASCII 5x7 font
|
||||
|
||||
static const unsigned char font[] PROGMEM = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
|
||||
0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
|
||||
0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
|
||||
0x18, 0x3C, 0x7E, 0x3C, 0x18,
|
||||
0x1C, 0x57, 0x7D, 0x57, 0x1C,
|
||||
0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
|
||||
0x00, 0x18, 0x3C, 0x18, 0x00,
|
||||
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
|
||||
0x00, 0x18, 0x24, 0x18, 0x00,
|
||||
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
|
||||
0x30, 0x48, 0x3A, 0x06, 0x0E,
|
||||
0x26, 0x29, 0x79, 0x29, 0x26,
|
||||
0x40, 0x7F, 0x05, 0x05, 0x07,
|
||||
0x40, 0x7F, 0x05, 0x25, 0x3F,
|
||||
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
|
||||
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
|
||||
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
|
||||
0x14, 0x22, 0x7F, 0x22, 0x14,
|
||||
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
|
||||
0x06, 0x09, 0x7F, 0x01, 0x7F,
|
||||
0x00, 0x66, 0x89, 0x95, 0x6A,
|
||||
0x60, 0x60, 0x60, 0x60, 0x60,
|
||||
0x94, 0xA2, 0xFF, 0xA2, 0x94,
|
||||
0x08, 0x04, 0x7E, 0x04, 0x08,
|
||||
0x10, 0x20, 0x7E, 0x20, 0x10,
|
||||
0x08, 0x08, 0x2A, 0x1C, 0x08,
|
||||
0x08, 0x1C, 0x2A, 0x08, 0x08,
|
||||
0x1E, 0x10, 0x10, 0x10, 0x10,
|
||||
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
|
||||
0x30, 0x38, 0x3E, 0x38, 0x30,
|
||||
0x06, 0x0E, 0x3E, 0x0E, 0x06,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x5F, 0x00, 0x00,
|
||||
0x00, 0x07, 0x00, 0x07, 0x00,
|
||||
0x14, 0x7F, 0x14, 0x7F, 0x14,
|
||||
0x24, 0x2A, 0x7F, 0x2A, 0x12,
|
||||
0x23, 0x13, 0x08, 0x64, 0x62,
|
||||
0x36, 0x49, 0x56, 0x20, 0x50,
|
||||
0x00, 0x08, 0x07, 0x03, 0x00,
|
||||
0x00, 0x1C, 0x22, 0x41, 0x00,
|
||||
0x00, 0x41, 0x22, 0x1C, 0x00,
|
||||
0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
|
||||
0x08, 0x08, 0x3E, 0x08, 0x08,
|
||||
0x00, 0x80, 0x70, 0x30, 0x00,
|
||||
0x08, 0x08, 0x08, 0x08, 0x08,
|
||||
0x00, 0x00, 0x60, 0x60, 0x00,
|
||||
0x20, 0x10, 0x08, 0x04, 0x02,
|
||||
0x3E, 0x51, 0x49, 0x45, 0x3E,
|
||||
0x00, 0x42, 0x7F, 0x40, 0x00,
|
||||
0x72, 0x49, 0x49, 0x49, 0x46,
|
||||
0x21, 0x41, 0x49, 0x4D, 0x33,
|
||||
0x18, 0x14, 0x12, 0x7F, 0x10,
|
||||
0x27, 0x45, 0x45, 0x45, 0x39,
|
||||
0x3C, 0x4A, 0x49, 0x49, 0x31,
|
||||
0x41, 0x21, 0x11, 0x09, 0x07,
|
||||
0x36, 0x49, 0x49, 0x49, 0x36,
|
||||
0x46, 0x49, 0x49, 0x29, 0x1E,
|
||||
0x00, 0x00, 0x14, 0x00, 0x00,
|
||||
0x00, 0x40, 0x34, 0x00, 0x00,
|
||||
0x00, 0x08, 0x14, 0x22, 0x41,
|
||||
0x14, 0x14, 0x14, 0x14, 0x14,
|
||||
0x00, 0x41, 0x22, 0x14, 0x08,
|
||||
0x02, 0x01, 0x59, 0x09, 0x06,
|
||||
0x3E, 0x41, 0x5D, 0x59, 0x4E,
|
||||
0x7C, 0x12, 0x11, 0x12, 0x7C,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x36,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x22,
|
||||
0x7F, 0x41, 0x41, 0x41, 0x3E,
|
||||
0x7F, 0x49, 0x49, 0x49, 0x41,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x01,
|
||||
0x3E, 0x41, 0x41, 0x51, 0x73,
|
||||
0x7F, 0x08, 0x08, 0x08, 0x7F,
|
||||
0x00, 0x41, 0x7F, 0x41, 0x00,
|
||||
0x20, 0x40, 0x41, 0x3F, 0x01,
|
||||
0x7F, 0x08, 0x14, 0x22, 0x41,
|
||||
0x7F, 0x40, 0x40, 0x40, 0x40,
|
||||
0x7F, 0x02, 0x1C, 0x02, 0x7F,
|
||||
0x7F, 0x04, 0x08, 0x10, 0x7F,
|
||||
0x3E, 0x41, 0x41, 0x41, 0x3E,
|
||||
0x7F, 0x09, 0x09, 0x09, 0x06,
|
||||
0x3E, 0x41, 0x51, 0x21, 0x5E,
|
||||
0x7F, 0x09, 0x19, 0x29, 0x46,
|
||||
0x26, 0x49, 0x49, 0x49, 0x32,
|
||||
0x03, 0x01, 0x7F, 0x01, 0x03,
|
||||
0x3F, 0x40, 0x40, 0x40, 0x3F,
|
||||
0x1F, 0x20, 0x40, 0x20, 0x1F,
|
||||
0x3F, 0x40, 0x38, 0x40, 0x3F,
|
||||
0x63, 0x14, 0x08, 0x14, 0x63,
|
||||
0x03, 0x04, 0x78, 0x04, 0x03,
|
||||
0x61, 0x59, 0x49, 0x4D, 0x43,
|
||||
0x00, 0x7F, 0x41, 0x41, 0x41,
|
||||
0x02, 0x04, 0x08, 0x10, 0x20,
|
||||
0x00, 0x41, 0x41, 0x41, 0x7F,
|
||||
0x04, 0x02, 0x01, 0x02, 0x04,
|
||||
0x40, 0x40, 0x40, 0x40, 0x40,
|
||||
0x00, 0x03, 0x07, 0x08, 0x00,
|
||||
0x20, 0x54, 0x54, 0x78, 0x40,
|
||||
0x7F, 0x28, 0x44, 0x44, 0x38,
|
||||
0x38, 0x44, 0x44, 0x44, 0x28,
|
||||
0x38, 0x44, 0x44, 0x28, 0x7F,
|
||||
0x38, 0x54, 0x54, 0x54, 0x18,
|
||||
0x00, 0x08, 0x7E, 0x09, 0x02,
|
||||
0x18, 0xA4, 0xA4, 0x9C, 0x78,
|
||||
0x7F, 0x08, 0x04, 0x04, 0x78,
|
||||
0x00, 0x44, 0x7D, 0x40, 0x00,
|
||||
0x20, 0x40, 0x40, 0x3D, 0x00,
|
||||
0x7F, 0x10, 0x28, 0x44, 0x00,
|
||||
0x00, 0x41, 0x7F, 0x40, 0x00,
|
||||
0x7C, 0x04, 0x78, 0x04, 0x78,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x78,
|
||||
0x38, 0x44, 0x44, 0x44, 0x38,
|
||||
0xFC, 0x18, 0x24, 0x24, 0x18,
|
||||
0x18, 0x24, 0x24, 0x18, 0xFC,
|
||||
0x7C, 0x08, 0x04, 0x04, 0x08,
|
||||
0x48, 0x54, 0x54, 0x54, 0x24,
|
||||
0x04, 0x04, 0x3F, 0x44, 0x24,
|
||||
0x3C, 0x40, 0x40, 0x20, 0x7C,
|
||||
0x1C, 0x20, 0x40, 0x20, 0x1C,
|
||||
0x3C, 0x40, 0x30, 0x40, 0x3C,
|
||||
0x44, 0x28, 0x10, 0x28, 0x44,
|
||||
0x4C, 0x90, 0x90, 0x90, 0x7C,
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44,
|
||||
0x00, 0x08, 0x36, 0x41, 0x00,
|
||||
0x00, 0x00, 0x77, 0x00, 0x00,
|
||||
0x00, 0x41, 0x36, 0x08, 0x00,
|
||||
0x02, 0x01, 0x02, 0x04, 0x02,
|
||||
0x3C, 0x26, 0x23, 0x26, 0x3C,
|
||||
0x1E, 0xA1, 0xA1, 0x61, 0x12,
|
||||
0x3A, 0x40, 0x40, 0x20, 0x7A,
|
||||
0x38, 0x54, 0x54, 0x55, 0x59,
|
||||
0x21, 0x55, 0x55, 0x79, 0x41,
|
||||
0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
|
||||
0x21, 0x55, 0x54, 0x78, 0x40,
|
||||
0x20, 0x54, 0x55, 0x79, 0x40,
|
||||
0x0C, 0x1E, 0x52, 0x72, 0x12,
|
||||
0x39, 0x55, 0x55, 0x55, 0x59,
|
||||
0x39, 0x54, 0x54, 0x54, 0x59,
|
||||
0x39, 0x55, 0x54, 0x54, 0x58,
|
||||
0x00, 0x00, 0x45, 0x7C, 0x41,
|
||||
0x00, 0x02, 0x45, 0x7D, 0x42,
|
||||
0x00, 0x01, 0x45, 0x7C, 0x40,
|
||||
0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
|
||||
0xF0, 0x28, 0x25, 0x28, 0xF0,
|
||||
0x7C, 0x54, 0x55, 0x45, 0x00,
|
||||
0x20, 0x54, 0x54, 0x7C, 0x54,
|
||||
0x7C, 0x0A, 0x09, 0x7F, 0x49,
|
||||
0x32, 0x49, 0x49, 0x49, 0x32,
|
||||
0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
|
||||
0x32, 0x4A, 0x48, 0x48, 0x30,
|
||||
0x3A, 0x41, 0x41, 0x21, 0x7A,
|
||||
0x3A, 0x42, 0x40, 0x20, 0x78,
|
||||
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
|
||||
0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
|
||||
0x3D, 0x40, 0x40, 0x40, 0x3D,
|
||||
0x3C, 0x24, 0xFF, 0x24, 0x24,
|
||||
0x48, 0x7E, 0x49, 0x43, 0x66,
|
||||
0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
|
||||
0xFF, 0x09, 0x29, 0xF6, 0x20,
|
||||
0xC0, 0x88, 0x7E, 0x09, 0x03,
|
||||
0x20, 0x54, 0x54, 0x79, 0x41,
|
||||
0x00, 0x00, 0x44, 0x7D, 0x41,
|
||||
0x30, 0x48, 0x48, 0x4A, 0x32,
|
||||
0x38, 0x40, 0x40, 0x22, 0x7A,
|
||||
0x00, 0x7A, 0x0A, 0x0A, 0x72,
|
||||
0x7D, 0x0D, 0x19, 0x31, 0x7D,
|
||||
0x26, 0x29, 0x29, 0x2F, 0x28,
|
||||
0x26, 0x29, 0x29, 0x29, 0x26,
|
||||
0x30, 0x48, 0x4D, 0x40, 0x20,
|
||||
0x38, 0x08, 0x08, 0x08, 0x08,
|
||||
0x08, 0x08, 0x08, 0x08, 0x38,
|
||||
0x2F, 0x10, 0xC8, 0xAC, 0xBA,
|
||||
0x2F, 0x10, 0x28, 0x34, 0xFA,
|
||||
0x00, 0x00, 0x7B, 0x00, 0x00,
|
||||
0x08, 0x14, 0x2A, 0x14, 0x22,
|
||||
0x22, 0x14, 0x2A, 0x14, 0x08,
|
||||
0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
|
||||
0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block
|
||||
0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block
|
||||
0x00, 0x00, 0x00, 0xFF, 0x00,
|
||||
0x10, 0x10, 0x10, 0xFF, 0x00,
|
||||
0x14, 0x14, 0x14, 0xFF, 0x00,
|
||||
0x10, 0x10, 0xFF, 0x00, 0xFF,
|
||||
0x10, 0x10, 0xF0, 0x10, 0xF0,
|
||||
0x14, 0x14, 0x14, 0xFC, 0x00,
|
||||
0x14, 0x14, 0xF7, 0x00, 0xFF,
|
||||
0x00, 0x00, 0xFF, 0x00, 0xFF,
|
||||
0x14, 0x14, 0xF4, 0x04, 0xFC,
|
||||
0x14, 0x14, 0x17, 0x10, 0x1F,
|
||||
0x10, 0x10, 0x1F, 0x10, 0x1F,
|
||||
0x14, 0x14, 0x14, 0x1F, 0x00,
|
||||
0x10, 0x10, 0x10, 0xF0, 0x00,
|
||||
0x00, 0x00, 0x00, 0x1F, 0x10,
|
||||
0x10, 0x10, 0x10, 0x1F, 0x10,
|
||||
0x10, 0x10, 0x10, 0xF0, 0x10,
|
||||
0x00, 0x00, 0x00, 0xFF, 0x10,
|
||||
0x10, 0x10, 0x10, 0x10, 0x10,
|
||||
0x10, 0x10, 0x10, 0xFF, 0x10,
|
||||
0x00, 0x00, 0x00, 0xFF, 0x14,
|
||||
0x00, 0x00, 0xFF, 0x00, 0xFF,
|
||||
0x00, 0x00, 0x1F, 0x10, 0x17,
|
||||
0x00, 0x00, 0xFC, 0x04, 0xF4,
|
||||
0x14, 0x14, 0x17, 0x10, 0x17,
|
||||
0x14, 0x14, 0xF4, 0x04, 0xF4,
|
||||
0x00, 0x00, 0xFF, 0x00, 0xF7,
|
||||
0x14, 0x14, 0x14, 0x14, 0x14,
|
||||
0x14, 0x14, 0xF7, 0x00, 0xF7,
|
||||
0x14, 0x14, 0x14, 0x17, 0x14,
|
||||
0x10, 0x10, 0x1F, 0x10, 0x1F,
|
||||
0x14, 0x14, 0x14, 0xF4, 0x14,
|
||||
0x10, 0x10, 0xF0, 0x10, 0xF0,
|
||||
0x00, 0x00, 0x1F, 0x10, 0x1F,
|
||||
0x00, 0x00, 0x00, 0x1F, 0x14,
|
||||
0x00, 0x00, 0x00, 0xFC, 0x14,
|
||||
0x00, 0x00, 0xF0, 0x10, 0xF0,
|
||||
0x10, 0x10, 0xFF, 0x10, 0xFF,
|
||||
0x14, 0x14, 0x14, 0xFF, 0x14,
|
||||
0x10, 0x10, 0x10, 0x1F, 0x00,
|
||||
0x00, 0x00, 0x00, 0xF0, 0x10,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
|
||||
0xFF, 0xFF, 0xFF, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0xFF, 0xFF,
|
||||
0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||
0x38, 0x44, 0x44, 0x38, 0x44,
|
||||
0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
|
||||
0x7E, 0x02, 0x02, 0x06, 0x06,
|
||||
0x02, 0x7E, 0x02, 0x7E, 0x02,
|
||||
0x63, 0x55, 0x49, 0x41, 0x63,
|
||||
0x38, 0x44, 0x44, 0x3C, 0x04,
|
||||
0x40, 0x7E, 0x20, 0x1E, 0x20,
|
||||
0x06, 0x02, 0x7E, 0x02, 0x02,
|
||||
0x99, 0xA5, 0xE7, 0xA5, 0x99,
|
||||
0x1C, 0x2A, 0x49, 0x2A, 0x1C,
|
||||
0x4C, 0x72, 0x01, 0x72, 0x4C,
|
||||
0x30, 0x4A, 0x4D, 0x4D, 0x30,
|
||||
0x30, 0x48, 0x78, 0x48, 0x30,
|
||||
0xBC, 0x62, 0x5A, 0x46, 0x3D,
|
||||
0x3E, 0x49, 0x49, 0x49, 0x00,
|
||||
0x7E, 0x01, 0x01, 0x01, 0x7E,
|
||||
0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
|
||||
0x44, 0x44, 0x5F, 0x44, 0x44,
|
||||
0x40, 0x51, 0x4A, 0x44, 0x40,
|
||||
0x40, 0x44, 0x4A, 0x51, 0x40,
|
||||
0x00, 0x00, 0xFF, 0x01, 0x03,
|
||||
0xE0, 0x80, 0xFF, 0x00, 0x00,
|
||||
0x08, 0x08, 0x6B, 0x6B, 0x08,
|
||||
0x36, 0x12, 0x36, 0x24, 0x36,
|
||||
0x06, 0x0F, 0x09, 0x0F, 0x06,
|
||||
0x00, 0x00, 0x18, 0x18, 0x00,
|
||||
0x00, 0x00, 0x10, 0x10, 0x00,
|
||||
0x30, 0x40, 0xFF, 0x01, 0x01,
|
||||
0x00, 0x1F, 0x01, 0x01, 0x1E,
|
||||
0x00, 0x19, 0x1D, 0x17, 0x12,
|
||||
0x00, 0x3C, 0x3C, 0x3C, 0x3C,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP
|
||||
};
|
||||
#endif // FONT5X7_H
|
||||
|
@ -1,145 +1,145 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "nonvolatile.h"
|
||||
#include "Flash.h" //thanks to Kent Larsen for pointing out the lower case error
|
||||
#include <Arduino.h>
|
||||
|
||||
|
||||
|
||||
|
||||
//we use this so we can hard code calibration table
|
||||
// be sure to set the last word as status flag
|
||||
// this save time calibrating each time we do a code build
|
||||
#ifdef NZS_FAST_CAL
|
||||
__attribute__((__aligned__(FLASH_ROW_SIZE))) const uint16_t NVM_flash[16767]={ //allocates 33280 bytes
|
||||
#else
|
||||
__attribute__((__aligned__(FLASH_ROW_SIZE))) const uint16_t NVM_flash[256]={ //allocates 512 bytes
|
||||
#endif
|
||||
25758,26078,26399,26720,27043,27372,27698,28024,28353,28688,29017,29345,29671,30009,30340,30663,30997,31335,31664,31994,32325,32666,32997,33324,33661,33997,34330,34657,34986,35324,35653,35981,36303,36637,36962,37282,37605,37938,38260,38581,38901,39232,39554,39877,40198,40528,40849,41178,41500,41835,42163,42485,42815,43149,43475,43804,44139,44476,44801,45136,45460,45804,46130,46460,46790,47119,47449,47777,48103,48442,48772,49099,49424,49759,50087,50410,50735,51067,51394,51716,52045,52379,52703,53024,53348,53680,54002,54326,54648,54987,55309,55629,55958,56292,56612,56936,57262,57594,57917,58246,58569,58902,59225,59552,59873,60206,60534,60862,61192,61531,61864,62194,62529,62873,63210,63544,63878,64222,64562,64899,65241,45,384,719,1058,1398,1733,2058,2390,2732,3060,3394,3720,4056,4386,4710,5036,5366,5693,6016,6340,6665,6989,7308,7622,7952,8263,8586,8903,9232,9551,9874,10200,10534,10859,11185,11513,11852,12184,12514,12848,13185,13511,13841,14170,14504,14830,15156,15490,15827,16153,16481,16808,17143,17474,17801,18121,18458,18783,19111,19433,19765,20084,20405,20721,21045,21360,21673,21984,22305,22614,22922,23231,23551,23861,24173,24482,24808,25118,25435,
|
||||
|
||||
0xFFFF
|
||||
};
|
||||
|
||||
|
||||
|
||||
static_assert (sizeof(nvm_t)<sizeof(NVM_flash), "nvm_t structure larger than allocated memory");
|
||||
|
||||
|
||||
|
||||
|
||||
//FLASH_ALLOCATE(NVM_flash, sizeof(nvm_t));
|
||||
|
||||
|
||||
bool nvmWriteCalTable(void *ptrData, uint32_t size)
|
||||
{
|
||||
bool x=true;
|
||||
flashWrite(&NVM->CalibrationTable,ptrData,size);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWrite_sPID(float Kp, float Ki, float Kd)
|
||||
{
|
||||
PIDparams_t pid;
|
||||
|
||||
pid.Kp=Kp;
|
||||
pid.Ki=Ki;
|
||||
pid.Kd=Kd;
|
||||
pid.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->sPID,&pid,sizeof(pid));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWrite_vPID(float Kp, float Ki, float Kd)
|
||||
{
|
||||
PIDparams_t pid;
|
||||
|
||||
pid.Kp=Kp;
|
||||
pid.Ki=Ki;
|
||||
pid.Kd=Kd;
|
||||
pid.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->vPID,&pid,sizeof(pid));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWrite_pPID(float Kp, float Ki, float Kd)
|
||||
{
|
||||
PIDparams_t pid;
|
||||
|
||||
pid.Kp=Kp;
|
||||
pid.Ki=Ki;
|
||||
pid.Kd=Kd;
|
||||
pid.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->pPID,&pid,sizeof(pid));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWriteSystemParms(SystemParams_t &systemParams)
|
||||
{
|
||||
systemParams.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->SystemParams,&systemParams,sizeof(systemParams));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWriteMotorParms(MotorParams_t &motorParams)
|
||||
{
|
||||
motorParams.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->motorParams,&motorParams,sizeof(motorParams));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmErase(void)
|
||||
{
|
||||
bool data=false;
|
||||
uint16_t cs=0;
|
||||
|
||||
flashWrite((void *)&NVM->CalibrationTable.status,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->sPID.parametersVaild ,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->vPID.parametersVaild ,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->pPID.parametersVaild ,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->motorParams.parametersVaild ,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->SystemParams.parametersVaild ,&data,sizeof(data));
|
||||
#ifdef NZS_FAST_CAL
|
||||
flashWrite((void *)&NVM->FastCal.checkSum,&cs,sizeof(cs));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "nonvolatile.h"
|
||||
#include "Flash.h" //thanks to Kent Larsen for pointing out the lower case error
|
||||
#include <Arduino.h>
|
||||
|
||||
|
||||
|
||||
|
||||
//we use this so we can hard code calibration table
|
||||
// be sure to set the last word as status flag
|
||||
// this save time calibrating each time we do a code build
|
||||
#ifdef NZS_FAST_CAL
|
||||
__attribute__((__aligned__(FLASH_ROW_SIZE))) const uint16_t NVM_flash[16767]={ //allocates 33280 bytes
|
||||
#else
|
||||
__attribute__((__aligned__(FLASH_ROW_SIZE))) const uint16_t NVM_flash[256]={ //allocates 512 bytes
|
||||
#endif
|
||||
25758,26078,26399,26720,27043,27372,27698,28024,28353,28688,29017,29345,29671,30009,30340,30663,30997,31335,31664,31994,32325,32666,32997,33324,33661,33997,34330,34657,34986,35324,35653,35981,36303,36637,36962,37282,37605,37938,38260,38581,38901,39232,39554,39877,40198,40528,40849,41178,41500,41835,42163,42485,42815,43149,43475,43804,44139,44476,44801,45136,45460,45804,46130,46460,46790,47119,47449,47777,48103,48442,48772,49099,49424,49759,50087,50410,50735,51067,51394,51716,52045,52379,52703,53024,53348,53680,54002,54326,54648,54987,55309,55629,55958,56292,56612,56936,57262,57594,57917,58246,58569,58902,59225,59552,59873,60206,60534,60862,61192,61531,61864,62194,62529,62873,63210,63544,63878,64222,64562,64899,65241,45,384,719,1058,1398,1733,2058,2390,2732,3060,3394,3720,4056,4386,4710,5036,5366,5693,6016,6340,6665,6989,7308,7622,7952,8263,8586,8903,9232,9551,9874,10200,10534,10859,11185,11513,11852,12184,12514,12848,13185,13511,13841,14170,14504,14830,15156,15490,15827,16153,16481,16808,17143,17474,17801,18121,18458,18783,19111,19433,19765,20084,20405,20721,21045,21360,21673,21984,22305,22614,22922,23231,23551,23861,24173,24482,24808,25118,25435,
|
||||
|
||||
0xFFFF
|
||||
};
|
||||
|
||||
|
||||
|
||||
static_assert (sizeof(nvm_t)<sizeof(NVM_flash), "nvm_t structure larger than allocated memory");
|
||||
|
||||
|
||||
|
||||
|
||||
//FLASH_ALLOCATE(NVM_flash, sizeof(nvm_t));
|
||||
|
||||
|
||||
bool nvmWriteCalTable(void *ptrData, uint32_t size)
|
||||
{
|
||||
bool x=true;
|
||||
flashWrite(&NVM->CalibrationTable,ptrData,size);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWrite_sPID(float Kp, float Ki, float Kd)
|
||||
{
|
||||
PIDparams_t pid;
|
||||
|
||||
pid.Kp=Kp;
|
||||
pid.Ki=Ki;
|
||||
pid.Kd=Kd;
|
||||
pid.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->sPID,&pid,sizeof(pid));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWrite_vPID(float Kp, float Ki, float Kd)
|
||||
{
|
||||
PIDparams_t pid;
|
||||
|
||||
pid.Kp=Kp;
|
||||
pid.Ki=Ki;
|
||||
pid.Kd=Kd;
|
||||
pid.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->vPID,&pid,sizeof(pid));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWrite_pPID(float Kp, float Ki, float Kd)
|
||||
{
|
||||
PIDparams_t pid;
|
||||
|
||||
pid.Kp=Kp;
|
||||
pid.Ki=Ki;
|
||||
pid.Kd=Kd;
|
||||
pid.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->pPID,&pid,sizeof(pid));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWriteSystemParms(SystemParams_t &systemParams)
|
||||
{
|
||||
systemParams.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->SystemParams,&systemParams,sizeof(systemParams));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmWriteMotorParms(MotorParams_t &motorParams)
|
||||
{
|
||||
motorParams.parametersVaild=true;
|
||||
|
||||
flashWrite((void *)&NVM->motorParams,&motorParams,sizeof(motorParams));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool nvmErase(void)
|
||||
{
|
||||
bool data=false;
|
||||
uint16_t cs=0;
|
||||
|
||||
flashWrite((void *)&NVM->CalibrationTable.status,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->sPID.parametersVaild ,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->vPID.parametersVaild ,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->pPID.parametersVaild ,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->motorParams.parametersVaild ,&data,sizeof(data));
|
||||
flashWrite((void *)&NVM->SystemParams.parametersVaild ,&data,sizeof(data));
|
||||
#ifdef NZS_FAST_CAL
|
||||
flashWrite((void *)&NVM->FastCal.checkSum,&cs,sizeof(cs));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1,108 +1,108 @@
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __NONVOLATILE__H__
|
||||
#define __NONVOLATILE__H__
|
||||
|
||||
#include "calibration.h"
|
||||
#include "board.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
float Kp;
|
||||
float Ki;
|
||||
float Kd;
|
||||
bool parametersVaild;
|
||||
} PIDparams_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t currentMa; //maximum current for the motor
|
||||
int32_t currentHoldMa; //hold current for the motor
|
||||
int32_t homeMa; //maximum current when error homing
|
||||
int32_t homeHoldMa; //hold current when error homing
|
||||
bool motorWiring; //forward wiring of motor or reverse
|
||||
int32_t fullStepsPerRotation; //how many full steps per rotation is the motor
|
||||
bool parametersVaild;
|
||||
} MotorParams_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t microsteps; //number of microsteps on the dir/step pin interface from host
|
||||
RotationDir_t dirPinRotation; //is the direction pin high for clockwise or counterClockWise
|
||||
int32_t errorLimit; //error limit before error pin asserts 65536==360degrees
|
||||
ErrorPinMode_t errorPinMode; //is error pin used for enable, error, or bidirectional
|
||||
feedbackCtrl_t controllerMode; //feedback mode for the controller
|
||||
int32_t homePin; //if greater than zero this is the pin we use trigger home current settings
|
||||
bool errorLogic; //if high and error will be high on output pin
|
||||
int32_t homeAngleDelay; //the angle to delay before switching to lower homing current
|
||||
bool parametersVaild;
|
||||
} SystemParams_t;
|
||||
|
||||
#ifdef NZS_FAST_CAL
|
||||
typedef struct {
|
||||
uint16_t angle[16384];
|
||||
uint16_t checkSum;
|
||||
}FastCal_t;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
FlashCalData_t CalibrationTable;
|
||||
__attribute__((__aligned__(8))) PIDparams_t sPID; //simple PID parameters
|
||||
__attribute__((__aligned__(8))) PIDparams_t pPID; //position PID parameters
|
||||
__attribute__((__aligned__(8))) PIDparams_t vPID; //velocity PID parameters
|
||||
__attribute__((__aligned__(8))) SystemParams_t SystemParams;
|
||||
__attribute__((__aligned__(8))) MotorParams_t motorParams;
|
||||
#ifdef NZS_FAST_CAL
|
||||
__attribute__((__aligned__(8))) FastCal_t FastCal;
|
||||
#endif
|
||||
} nvm_t;
|
||||
|
||||
#ifdef NZS_FAST_CAL
|
||||
extern const uint16_t NVM_flash[16767];
|
||||
#else
|
||||
extern const uint16_t NVM_flash[256];
|
||||
#endif
|
||||
#define NVM ((const nvm_t *)NVM_flash)
|
||||
|
||||
bool nvmWriteCalTable(void *ptrData, uint32_t size);
|
||||
bool nvmWrite_sPID(float Kp, float Ki, float Kd);
|
||||
bool nvmWrite_pPID(float Kp, float Ki, float Kd);
|
||||
bool nvmWrite_vPID(float Kp, float Ki, float Kd);
|
||||
bool nvmWriteSystemParms(SystemParams_t &systemParams);
|
||||
bool nvmWriteMotorParms(MotorParams_t &motorParams);
|
||||
bool nvmErase(void);
|
||||
|
||||
#endif // __NONVOLATILE__H__
|
||||
/**********************************************************************
|
||||
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
|
||||
|
||||
MisfitTech uses a dual license model that allows the software to be used under
|
||||
a standard GPL open source license, or a commercial license. The standard GPL
|
||||
license requires that all software statically linked with MisfitTec Code is
|
||||
also distributed under the same GPL V2 license terms. Details of both license
|
||||
options follow:
|
||||
|
||||
- Open source licensing -
|
||||
MisfitTech is a free download and may be used, modified, evaluated and
|
||||
distributed without charge provided the user adheres to version two of the GNU
|
||||
General Public License (GPL) and does not remove the copyright notice or this
|
||||
text. The GPL V2 text is available on the gnu.org web site
|
||||
|
||||
- Commercial licensing -
|
||||
Businesses and individuals that for commercial or other reasons cannot comply
|
||||
with the terms of the GPL V2 license must obtain a low cost commercial license
|
||||
before incorporating MisfitTech code into proprietary software for distribution in
|
||||
any form. Commercial licenses can be purchased from www.misfittech.net
|
||||
and do not require any source files to be changed.
|
||||
|
||||
|
||||
This code is distributed in the hope that it will be useful. You cannot
|
||||
use MisfitTech's code unless you agree that you use the software 'as is'.
|
||||
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
|
||||
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
|
||||
implied, expressed, or statutory.
|
||||
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __NONVOLATILE__H__
|
||||
#define __NONVOLATILE__H__
|
||||
|
||||
#include "calibration.h"
|
||||
#include "board.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
float Kp;
|
||||
float Ki;
|
||||
float Kd;
|
||||
bool parametersVaild;
|
||||
} PIDparams_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t currentMa; //maximum current for the motor
|
||||
int32_t currentHoldMa; //hold current for the motor
|
||||
int32_t homeMa; //maximum current when error homing
|
||||
int32_t homeHoldMa; //hold current when error homing
|
||||
bool motorWiring; //forward wiring of motor or reverse
|
||||
int32_t fullStepsPerRotation; //how many full steps per rotation is the motor
|
||||
bool parametersVaild;
|
||||
} MotorParams_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t microsteps; //number of microsteps on the dir/step pin interface from host
|
||||
RotationDir_t dirPinRotation; //is the direction pin high for clockwise or counterClockWise
|
||||
int32_t errorLimit; //error limit before error pin asserts 65536==360degrees
|
||||
ErrorPinMode_t errorPinMode; //is error pin used for enable, error, or bidirectional
|
||||
feedbackCtrl_t controllerMode; //feedback mode for the controller
|
||||
int32_t homePin; //if greater than zero this is the pin we use trigger home current settings
|
||||
bool errorLogic; //if high and error will be high on output pin
|
||||
int32_t homeAngleDelay; //the angle to delay before switching to lower homing current
|
||||
bool parametersVaild;
|
||||
} SystemParams_t;
|
||||
|
||||
#ifdef NZS_FAST_CAL
|
||||
typedef struct {
|
||||
uint16_t angle[16384];
|
||||
uint16_t checkSum;
|
||||
}FastCal_t;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
FlashCalData_t CalibrationTable;
|
||||
__attribute__((__aligned__(8))) PIDparams_t sPID; //simple PID parameters
|
||||
__attribute__((__aligned__(8))) PIDparams_t pPID; //position PID parameters
|
||||
__attribute__((__aligned__(8))) PIDparams_t vPID; //velocity PID parameters
|
||||
__attribute__((__aligned__(8))) SystemParams_t SystemParams;
|
||||
__attribute__((__aligned__(8))) MotorParams_t motorParams;
|
||||
#ifdef NZS_FAST_CAL
|
||||
__attribute__((__aligned__(8))) FastCal_t FastCal;
|
||||
#endif
|
||||
} nvm_t;
|
||||
|
||||
#ifdef NZS_FAST_CAL
|
||||
extern const uint16_t NVM_flash[16767];
|
||||
#else
|
||||
extern const uint16_t NVM_flash[256];
|
||||
#endif
|
||||
#define NVM ((const nvm_t *)NVM_flash)
|
||||
|
||||
bool nvmWriteCalTable(void *ptrData, uint32_t size);
|
||||
bool nvmWrite_sPID(float Kp, float Ki, float Kd);
|
||||
bool nvmWrite_pPID(float Kp, float Ki, float Kd);
|
||||
bool nvmWrite_vPID(float Kp, float Ki, float Kd);
|
||||
bool nvmWriteSystemParms(SystemParams_t &systemParams);
|
||||
bool nvmWriteMotorParms(MotorParams_t &motorParams);
|
||||
bool nvmErase(void);
|
||||
|
||||
#endif // __NONVOLATILE__H__
|
||||
|
@ -1,53 +1,53 @@
|
||||
/*
|
||||
* nzs.h
|
||||
*
|
||||
* Created on: Dec 8, 2016
|
||||
* Author: trampas
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef NZS_H_
|
||||
#define NZS_H_
|
||||
|
||||
#include "board.h"
|
||||
#include "nzs_lcd.h"
|
||||
#include "stepper_controller.h"
|
||||
#include "planner.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int64_t angle;
|
||||
uint16_t encoderAngle;
|
||||
uint8_t valid;
|
||||
}eepromData_t;
|
||||
|
||||
class NZS //nano Zero Stepper
|
||||
{
|
||||
|
||||
public:
|
||||
void begin(void);
|
||||
void loop(void);
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif /* NZS_H_ */
|
||||
/*
|
||||
* nzs.h
|
||||
*
|
||||
* Created on: Dec 8, 2016
|
||||
* Author: trampas
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef NZS_H_
|
||||
#define NZS_H_
|
||||
|
||||
#include "board.h"
|
||||
#include "nzs_lcd.h"
|
||||
#include "stepper_controller.h"
|
||||
#include "planner.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int64_t angle;
|
||||
uint16_t encoderAngle;
|
||||
uint8_t valid;
|
||||
}eepromData_t;
|
||||
|
||||
class NZS //nano Zero Stepper
|
||||
{
|
||||
|
||||
public:
|
||||
void begin(void);
|
||||
void loop(void);
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif /* NZS_H_ */
|
||||
|
@ -1,90 +1,90 @@
|
||||
/*
|
||||
* nzs_lcd.h
|
||||
*
|
||||
* Created on: Dec 8, 2016
|
||||
* Author: trampas
|
||||
*
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef NZS_LCD_H_
|
||||
#define NZS_LCD_H_
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "syslog.h"
|
||||
#include "board.h"
|
||||
#include "stepper_controller.h"
|
||||
|
||||
#include "Adafruit_GFX.h"
|
||||
#include "Adafruit_SSD1306.h"
|
||||
#include "gfxfont.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
char str[15];
|
||||
} options_t;
|
||||
|
||||
typedef struct {
|
||||
char str[15];
|
||||
|
||||
//only one of the following should be not null
|
||||
int (*func)(int argc, char *argv[]);
|
||||
options_t *ptrOptions;
|
||||
|
||||
} menuItem_t;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class LCD
|
||||
{
|
||||
private:
|
||||
bool displayEnabled;
|
||||
Adafruit_SSD1306 display;
|
||||
StepperCtrl *ptrStepperCtrl;
|
||||
menuItem_t *ptrMenu;
|
||||
int32_t menuIndex;
|
||||
bool menuActive;
|
||||
|
||||
options_t *ptrOptions;
|
||||
int32_t optionIndex;
|
||||
|
||||
int32_t buttonState;
|
||||
|
||||
void updateLCD(void);
|
||||
void showMenu(void);
|
||||
void updateMenu(void);
|
||||
void showOptions(void);
|
||||
public:
|
||||
void forceMenuActive(void);
|
||||
void setMenu(menuItem_t *pMenu);
|
||||
void begin(StepperCtrl *ptrStepperCtrl); //sets up the LCD
|
||||
void process(void); //processes the LCD and updates as needed
|
||||
void showSplash(void);
|
||||
void lcdShow(const char *line1, const char *line2,const char *line3);
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif /* NZS_LCD_H_ */
|
||||
/*
|
||||
* nzs_lcd.h
|
||||
*
|
||||
* Created on: Dec 8, 2016
|
||||
* Author: trampas
|
||||
*
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef NZS_LCD_H_
|
||||
#define NZS_LCD_H_
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "syslog.h"
|
||||
#include "board.h"
|
||||
#include "stepper_controller.h"
|
||||
|
||||
#include "Adafruit_GFX.h"
|
||||
#include "Adafruit_SSD1306.h"
|
||||
#include "gfxfont.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
char str[15];
|
||||
} options_t;
|
||||
|
||||
typedef struct {
|
||||
char str[15];
|
||||
|
||||
//only one of the following should be not null
|
||||
int (*func)(int argc, char *argv[]);
|
||||
options_t *ptrOptions;
|
||||
|
||||
} menuItem_t;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class LCD
|
||||
{
|
||||
private:
|
||||
bool displayEnabled;
|
||||
Adafruit_SSD1306 display;
|
||||
StepperCtrl *ptrStepperCtrl;
|
||||
menuItem_t *ptrMenu;
|
||||
int32_t menuIndex;
|
||||
bool menuActive;
|
||||
|
||||
options_t *ptrOptions;
|
||||
int32_t optionIndex;
|
||||
|
||||
int32_t buttonState;
|
||||
|
||||
void updateLCD(void);
|
||||
void showMenu(void);
|
||||
void updateMenu(void);
|
||||
void showOptions(void);
|
||||
public:
|
||||
void forceMenuActive(void);
|
||||
void setMenu(menuItem_t *pMenu);
|
||||
void begin(StepperCtrl *ptrStepperCtrl); //sets up the LCD
|
||||
void process(void); //processes the LCD and updates as needed
|
||||
void showSplash(void);
|
||||
void lcdShow(const char *line1, const char *line2,const char *line3);
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif /* NZS_LCD_H_ */
|
||||
|
@ -1,207 +1,207 @@
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "planner.h"
|
||||
|
||||
#include "board.h"
|
||||
#include "wiring_private.h"
|
||||
#include "syslog.h"
|
||||
#include "angle.h"
|
||||
#include "Arduino.h"
|
||||
|
||||
#define WAIT_TC16_REGS_SYNC(x) while(x->COUNT16.STATUS.bit.SYNCBUSY);
|
||||
|
||||
//define the planner class as being global
|
||||
Planner SmartPlanner;
|
||||
|
||||
static bool enterTC3CriticalSection()
|
||||
{
|
||||
bool state=NVIC_IS_IRQ_ENABLED(TC3_IRQn);
|
||||
NVIC_DisableIRQ(TC3_IRQn);
|
||||
return state;
|
||||
}
|
||||
|
||||
static void exitTC3CriticalSection(bool prevState)
|
||||
{
|
||||
if (prevState)
|
||||
{
|
||||
NVIC_EnableIRQ(TC3_IRQn);
|
||||
} //else do nothing
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void TC3_Init(void)
|
||||
{
|
||||
// Enable GCLK for TC3
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC2_TC3 )) ;
|
||||
while (GCLK->STATUS.bit.SYNCBUSY);
|
||||
|
||||
TC3->COUNT16.CTRLA.reg &= ~TC_CTRLA_ENABLE; // Disable TCx
|
||||
WAIT_TC16_REGS_SYNC(TC3) // wait for sync
|
||||
|
||||
TC3->COUNT16.CTRLA.reg |= TC_CTRLA_MODE_COUNT16; // Set Timer counter Mode to 16 bits
|
||||
WAIT_TC16_REGS_SYNC(TC3)
|
||||
|
||||
TC3->COUNT16.CTRLA.reg |= TC_CTRLA_WAVEGEN_MFRQ; // Set TC as normal Normal Frq
|
||||
WAIT_TC16_REGS_SYNC(TC3)
|
||||
|
||||
TC3->COUNT16.CTRLA.reg |= TC_CTRLA_PRESCALER_DIV2; // Set perscaler
|
||||
WAIT_TC16_REGS_SYNC(TC3)
|
||||
|
||||
|
||||
TC3->COUNT16.CC[0].reg = F_CPU/PLANNER_UPDATE_RATE_HZ/2; //divide by two because of prescaler
|
||||
|
||||
WAIT_TC16_REGS_SYNC(TC3)
|
||||
|
||||
|
||||
TC3->COUNT16.INTENSET.reg = 0; // disable all interrupts
|
||||
TC3->COUNT16.INTENSET.bit.OVF = 1; // enable overfollow
|
||||
|
||||
|
||||
|
||||
NVIC_SetPriority(TC3_IRQn, 3);
|
||||
|
||||
|
||||
// Enable InterruptVector
|
||||
NVIC_EnableIRQ(TC3_IRQn);
|
||||
|
||||
|
||||
// Enable TC
|
||||
TC3->COUNT16.CTRLA.reg |= TC_CTRLA_ENABLE;
|
||||
WAIT_TC16_REGS_SYNC(TC3);
|
||||
}
|
||||
|
||||
|
||||
void TC3_Handler(void)
|
||||
{
|
||||
interrupts(); //allow other interrupts
|
||||
//do the planner tick
|
||||
SmartPlanner.tick();
|
||||
//SerialUSB.println('x');
|
||||
TC3->COUNT16.INTFLAG.bit.OVF = 1; //clear interrupt by writing 1 to flag
|
||||
}
|
||||
|
||||
void Planner::begin(StepperCtrl *ptrStepper)
|
||||
{
|
||||
|
||||
ptrStepperCtrl=ptrStepper;
|
||||
currentMode=PLANNER_NONE;
|
||||
//setup the timer and interrupt as the last thing
|
||||
TC3_Init();
|
||||
}
|
||||
|
||||
void Planner::tick(void)
|
||||
{
|
||||
if (currentMode == PLANNER_NONE)
|
||||
{
|
||||
return; //do nothing
|
||||
}
|
||||
|
||||
if (PLANNER_CV == currentMode)
|
||||
{
|
||||
// SerialUSB.println(currentSetAngle);
|
||||
// SerialUSB.println(endAngle);
|
||||
// SerialUSB.println(tickIncrement);
|
||||
// SerialUSB.println(fabs(currentSetAngle-endAngle));
|
||||
// SerialUSB.println(fabs(tickIncrement*2));
|
||||
// SerialUSB.println();
|
||||
int32_t x;
|
||||
if (fabs(currentSetAngle-endAngle) >= fabs(tickIncrement))
|
||||
{
|
||||
currentSetAngle+=tickIncrement;
|
||||
x=ANGLE_FROM_DEGREES(currentSetAngle);
|
||||
ptrStepperCtrl->moveToAbsAngle(x);
|
||||
}else
|
||||
{
|
||||
//we are done, make sure we end at the right point
|
||||
//SerialUSB.println("done");
|
||||
x=ANGLE_FROM_DEGREES(endAngle);
|
||||
ptrStepperCtrl->moveToAbsAngle(x);
|
||||
currentMode=PLANNER_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Planner::stop(void)
|
||||
{
|
||||
bool state;
|
||||
state = enterTC3CriticalSection();
|
||||
currentMode=PLANNER_NONE;
|
||||
exitTC3CriticalSection(state);
|
||||
}
|
||||
|
||||
bool Planner::moveConstantVelocity(float finalAngle, float rpm)
|
||||
{
|
||||
bool state;
|
||||
state = enterTC3CriticalSection();
|
||||
|
||||
//first determine if operation is in progress
|
||||
if (PLANNER_NONE != currentMode)
|
||||
{
|
||||
#ifndef MECHADUINO_HARDWARE
|
||||
//we are in operation return false
|
||||
SerialUSB.println("planner operational");
|
||||
#else
|
||||
Serial5.println("planner operational");
|
||||
#endif
|
||||
exitTC3CriticalSection(state);
|
||||
return false;
|
||||
}
|
||||
|
||||
//get current posistion
|
||||
startAngle = ANGLE_T0_DEGREES(ptrStepperCtrl->getCurrentAngle());
|
||||
|
||||
//deterime the tick increment
|
||||
tickIncrement=360.0*fabs(rpm)/60/PLANNER_UPDATE_RATE_HZ;
|
||||
|
||||
|
||||
|
||||
//set the desired end angle
|
||||
endAngle=finalAngle;
|
||||
|
||||
|
||||
//set the current angle
|
||||
currentSetAngle=startAngle;
|
||||
|
||||
if (startAngle>endAngle)
|
||||
{
|
||||
#ifndef MECHADUINO_HARDWARE
|
||||
SerialUSB.println("reverse");
|
||||
#endif
|
||||
tickIncrement=-tickIncrement;
|
||||
}
|
||||
|
||||
// SerialUSB.println(currentSetAngle);
|
||||
// SerialUSB.println(endAngle);
|
||||
// SerialUSB.println(tickIncrement);
|
||||
// SerialUSB.println();
|
||||
|
||||
currentMode=PLANNER_CV;
|
||||
|
||||
exitTC3CriticalSection(state);
|
||||
return true;
|
||||
}
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "planner.h"
|
||||
|
||||
#include "board.h"
|
||||
#include "wiring_private.h"
|
||||
#include "syslog.h"
|
||||
#include "angle.h"
|
||||
#include "Arduino.h"
|
||||
|
||||
#define WAIT_TC16_REGS_SYNC(x) while(x->COUNT16.STATUS.bit.SYNCBUSY);
|
||||
|
||||
//define the planner class as being global
|
||||
Planner SmartPlanner;
|
||||
|
||||
static bool enterTC3CriticalSection()
|
||||
{
|
||||
bool state=NVIC_IS_IRQ_ENABLED(TC3_IRQn);
|
||||
NVIC_DisableIRQ(TC3_IRQn);
|
||||
return state;
|
||||
}
|
||||
|
||||
static void exitTC3CriticalSection(bool prevState)
|
||||
{
|
||||
if (prevState)
|
||||
{
|
||||
NVIC_EnableIRQ(TC3_IRQn);
|
||||
} //else do nothing
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void TC3_Init(void)
|
||||
{
|
||||
// Enable GCLK for TC3
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_TCC2_TC3 )) ;
|
||||
while (GCLK->STATUS.bit.SYNCBUSY);
|
||||
|
||||
TC3->COUNT16.CTRLA.reg &= ~TC_CTRLA_ENABLE; // Disable TCx
|
||||
WAIT_TC16_REGS_SYNC(TC3) // wait for sync
|
||||
|
||||
TC3->COUNT16.CTRLA.reg |= TC_CTRLA_MODE_COUNT16; // Set Timer counter Mode to 16 bits
|
||||
WAIT_TC16_REGS_SYNC(TC3)
|
||||
|
||||
TC3->COUNT16.CTRLA.reg |= TC_CTRLA_WAVEGEN_MFRQ; // Set TC as normal Normal Frq
|
||||
WAIT_TC16_REGS_SYNC(TC3)
|
||||
|
||||
TC3->COUNT16.CTRLA.reg |= TC_CTRLA_PRESCALER_DIV2; // Set perscaler
|
||||
WAIT_TC16_REGS_SYNC(TC3)
|
||||
|
||||
|
||||
TC3->COUNT16.CC[0].reg = F_CPU/PLANNER_UPDATE_RATE_HZ/2; //divide by two because of prescaler
|
||||
|
||||
WAIT_TC16_REGS_SYNC(TC3)
|
||||
|
||||
|
||||
TC3->COUNT16.INTENSET.reg = 0; // disable all interrupts
|
||||
TC3->COUNT16.INTENSET.bit.OVF = 1; // enable overfollow
|
||||
|
||||
|
||||
|
||||
NVIC_SetPriority(TC3_IRQn, 3);
|
||||
|
||||
|
||||
// Enable InterruptVector
|
||||
NVIC_EnableIRQ(TC3_IRQn);
|
||||
|
||||
|
||||
// Enable TC
|
||||
TC3->COUNT16.CTRLA.reg |= TC_CTRLA_ENABLE;
|
||||
WAIT_TC16_REGS_SYNC(TC3);
|
||||
}
|
||||
|
||||
|
||||
void TC3_Handler(void)
|
||||
{
|
||||
interrupts(); //allow other interrupts
|
||||
//do the planner tick
|
||||
SmartPlanner.tick();
|
||||
//SerialUSB.println('x');
|
||||
TC3->COUNT16.INTFLAG.bit.OVF = 1; //clear interrupt by writing 1 to flag
|
||||
}
|
||||
|
||||
void Planner::begin(StepperCtrl *ptrStepper)
|
||||
{
|
||||
|
||||
ptrStepperCtrl=ptrStepper;
|
||||
currentMode=PLANNER_NONE;
|
||||
//setup the timer and interrupt as the last thing
|
||||
TC3_Init();
|
||||
}
|
||||
|
||||
void Planner::tick(void)
|
||||
{
|
||||
if (currentMode == PLANNER_NONE)
|
||||
{
|
||||
return; //do nothing
|
||||
}
|
||||
|
||||
if (PLANNER_CV == currentMode)
|
||||
{
|
||||
// SerialUSB.println(currentSetAngle);
|
||||
// SerialUSB.println(endAngle);
|
||||
// SerialUSB.println(tickIncrement);
|
||||
// SerialUSB.println(fabs(currentSetAngle-endAngle));
|
||||
// SerialUSB.println(fabs(tickIncrement*2));
|
||||
// SerialUSB.println();
|
||||
int32_t x;
|
||||
if (fabs(currentSetAngle-endAngle) >= fabs(tickIncrement))
|
||||
{
|
||||
currentSetAngle+=tickIncrement;
|
||||
x=ANGLE_FROM_DEGREES(currentSetAngle);
|
||||
ptrStepperCtrl->moveToAbsAngle(x);
|
||||
}else
|
||||
{
|
||||
//we are done, make sure we end at the right point
|
||||
//SerialUSB.println("done");
|
||||
x=ANGLE_FROM_DEGREES(endAngle);
|
||||
ptrStepperCtrl->moveToAbsAngle(x);
|
||||
currentMode=PLANNER_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Planner::stop(void)
|
||||
{
|
||||
bool state;
|
||||
state = enterTC3CriticalSection();
|
||||
currentMode=PLANNER_NONE;
|
||||
exitTC3CriticalSection(state);
|
||||
}
|
||||
|
||||
bool Planner::moveConstantVelocity(float finalAngle, float rpm)
|
||||
{
|
||||
bool state;
|
||||
state = enterTC3CriticalSection();
|
||||
|
||||
//first determine if operation is in progress
|
||||
if (PLANNER_NONE != currentMode)
|
||||
{
|
||||
#ifndef MECHADUINO_HARDWARE
|
||||
//we are in operation return false
|
||||
SerialUSB.println("planner operational");
|
||||
#else
|
||||
Serial5.println("planner operational");
|
||||
#endif
|
||||
exitTC3CriticalSection(state);
|
||||
return false;
|
||||
}
|
||||
|
||||
//get current posistion
|
||||
startAngle = ANGLE_T0_DEGREES(ptrStepperCtrl->getCurrentAngle());
|
||||
|
||||
//deterime the tick increment
|
||||
tickIncrement=360.0*fabs(rpm)/60/PLANNER_UPDATE_RATE_HZ;
|
||||
|
||||
|
||||
|
||||
//set the desired end angle
|
||||
endAngle=finalAngle;
|
||||
|
||||
|
||||
//set the current angle
|
||||
currentSetAngle=startAngle;
|
||||
|
||||
if (startAngle>endAngle)
|
||||
{
|
||||
#ifndef MECHADUINO_HARDWARE
|
||||
SerialUSB.println("reverse");
|
||||
#endif
|
||||
tickIncrement=-tickIncrement;
|
||||
}
|
||||
|
||||
// SerialUSB.println(currentSetAngle);
|
||||
// SerialUSB.println(endAngle);
|
||||
// SerialUSB.println(tickIncrement);
|
||||
// SerialUSB.println();
|
||||
|
||||
currentMode=PLANNER_CV;
|
||||
|
||||
exitTC3CriticalSection(state);
|
||||
return true;
|
||||
}
|
||||
|
@ -1,68 +1,68 @@
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
/*
|
||||
* This file implements a trajectory planner for use with serial
|
||||
* interface. It allows the smart stepper to move at constant velocity.
|
||||
* Additionally you can move to some location at constant velocity or
|
||||
* with a trajectory curve
|
||||
*/
|
||||
|
||||
#ifndef PLANNER_H_
|
||||
#define PLANNER_H_
|
||||
#include "board.h"
|
||||
#include "stepper_controller.h"
|
||||
|
||||
#define PLANNER_UPDATE_RATE_HZ (3000UL) //how often planner updates PID
|
||||
|
||||
typedef enum {
|
||||
PLANNER_NONE =0,
|
||||
PLANNER_CV =1, //constant velocity
|
||||
//PLANNER_CA =2, //constant accleration
|
||||
//PLANNER_S_CURVE =3, //s-curve move
|
||||
} PlannerMode;
|
||||
class Planner
|
||||
{
|
||||
private:
|
||||
StepperCtrl *ptrStepperCtrl;
|
||||
volatile PlannerMode currentMode=PLANNER_NONE;
|
||||
//todo we should not use floating point, rather use "Angle"
|
||||
volatile float endAngle;
|
||||
volatile float startAngle;
|
||||
volatile float currentSetAngle;
|
||||
volatile float tickIncrement;
|
||||
|
||||
public:
|
||||
void begin(StepperCtrl *ptrStepper);
|
||||
bool moveConstantVelocity(float finalAngle, float rpm); //moves to the final location at a constant RPM
|
||||
void tick(void); //this is called on regular tick interval
|
||||
void stop(void);
|
||||
bool done(void) {return currentMode==PLANNER_NONE;}
|
||||
};
|
||||
|
||||
|
||||
extern Planner SmartPlanner;
|
||||
|
||||
|
||||
#endif /* PLANNER_H_ */
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
/*
|
||||
* This file implements a trajectory planner for use with serial
|
||||
* interface. It allows the smart stepper to move at constant velocity.
|
||||
* Additionally you can move to some location at constant velocity or
|
||||
* with a trajectory curve
|
||||
*/
|
||||
|
||||
#ifndef PLANNER_H_
|
||||
#define PLANNER_H_
|
||||
#include "board.h"
|
||||
#include "stepper_controller.h"
|
||||
|
||||
#define PLANNER_UPDATE_RATE_HZ (3000UL) //how often planner updates PID
|
||||
|
||||
typedef enum {
|
||||
PLANNER_NONE =0,
|
||||
PLANNER_CV =1, //constant velocity
|
||||
//PLANNER_CA =2, //constant accleration
|
||||
//PLANNER_S_CURVE =3, //s-curve move
|
||||
} PlannerMode;
|
||||
class Planner
|
||||
{
|
||||
private:
|
||||
StepperCtrl *ptrStepperCtrl;
|
||||
volatile PlannerMode currentMode=PLANNER_NONE;
|
||||
//todo we should not use floating point, rather use "Angle"
|
||||
volatile float endAngle;
|
||||
volatile float startAngle;
|
||||
volatile float currentSetAngle;
|
||||
volatile float tickIncrement;
|
||||
|
||||
public:
|
||||
void begin(StepperCtrl *ptrStepper);
|
||||
bool moveConstantVelocity(float finalAngle, float rpm); //moves to the final location at a constant RPM
|
||||
void tick(void); //this is called on regular tick interval
|
||||
void stop(void);
|
||||
bool done(void) {return currentMode==PLANNER_NONE;}
|
||||
};
|
||||
|
||||
|
||||
extern Planner SmartPlanner;
|
||||
|
||||
|
||||
#endif /* PLANNER_H_ */
|
||||
|
@ -1,198 +1,198 @@
|
||||
/*
|
||||
* since.cpp
|
||||
*
|
||||
* Created on: Dec 24, 2016
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#include "sine.h"
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-Ofast")
|
||||
|
||||
#ifdef NZS_FAST_SINE
|
||||
static const int16_t sineTable[1280]={
|
||||
0,201,402,603,804,1005,1206,1407,1608,1808,2009,2210,2410,2611,2811,3011,
|
||||
3212,3412,3611,3811,4011,4210,4410,4609,4808,5007,5205,5404,5602,5800,5998,6195,
|
||||
6392,6589,6786,6983,7179,7375,7571,7766,7962,8156,8351,8545,8739,8933,9126,9319,
|
||||
9512,9704,9896,10087,10278,10469,10659,10849,11039,11228,11417,11605,11793,11980,12167,12353,
|
||||
12539,12725,12910,13094,13278,13462,13645,13828,14010,14191,14372,14553,14732,14912,15090,15269,
|
||||
15446,15623,15800,15976,16151,16325,16499,16673,16846,17018,17189,17360,17530,17700,17869,18037,
|
||||
18204,18371,18537,18703,18868,19032,19195,19357,19519,19680,19841,20000,20159,20317,20475,20631,
|
||||
20787,20942,21097,21250,21403,21554,21705,21856,22005,22154,22301,22448,22594,22739,22884,23027,
|
||||
23170,23312,23452,23592,23732,23870,24007,24143,24279,24413,24547,24680,24812,24942,25072,25201,
|
||||
25329,25456,25583,25708,25832,25955,26077,26199,26319,26438,26556,26674,26790,26905,27019,27133,
|
||||
27245,27356,27466,27575,27683,27791,27897,28001,28105,28208,28310,28411,28510,28609,28706,28803,
|
||||
28898,28992,29085,29178,29268,29358,29447,29535,29621,29707,29791,29874,29956,30037,30117,30195,
|
||||
30273,30349,30425,30499,30572,30643,30714,30783,30852,30919,30985,31050,31113,31176,31237,31297,
|
||||
31356,31414,31471,31526,31580,31633,31685,31736,31785,31834,31881,31926,31971,32015,32057,32098,
|
||||
32138,32176,32214,32250,32285,32319,32351,32382,32413,32441,32469,32496,32521,32545,32568,32589,
|
||||
32609,32629,32646,32663,32678,32693,32706,32717,32728,32737,32745,32752,32757,32762,32765,32767,
|
||||
32767,32767,32765,32762,32757,32752,32745,32737,32728,32717,32706,32693,32678,32663,32646,32629,
|
||||
32609,32589,32568,32545,32521,32496,32469,32441,32413,32382,32351,32319,32285,32250,32214,32176,
|
||||
32138,32098,32057,32015,31971,31926,31881,31834,31785,31736,31685,31633,31580,31526,31471,31414,
|
||||
31356,31297,31237,31176,31113,31050,30985,30919,30852,30783,30714,30643,30572,30499,30425,30349,
|
||||
30273,30195,30117,30037,29956,29874,29791,29707,29621,29535,29447,29358,29268,29178,29085,28992,
|
||||
28898,28803,28706,28609,28510,28411,28310,28208,28105,28001,27897,27791,27683,27575,27466,27356,
|
||||
27245,27133,27019,26905,26790,26674,26556,26438,26319,26199,26077,25955,25832,25708,25583,25456,
|
||||
25329,25201,25072,24942,24812,24680,24547,24413,24279,24143,24007,23870,23732,23592,23452,23312,
|
||||
23170,23027,22884,22739,22594,22448,22301,22154,22005,21856,21705,21554,21403,21250,21097,20942,
|
||||
20787,20631,20475,20317,20159,20000,19841,19680,19519,19357,19195,19032,18868,18703,18537,18371,
|
||||
18204,18037,17869,17700,17530,17360,17189,17018,16846,16673,16499,16325,16151,15976,15800,15623,
|
||||
15446,15269,15090,14912,14732,14553,14372,14191,14010,13828,13645,13462,13278,13094,12910,12725,
|
||||
12539,12353,12167,11980,11793,11605,11417,11228,11039,10849,10659,10469,10278,10087,9896,9704,
|
||||
9512,9319,9126,8933,8739,8545,8351,8156,7962,7766,7571,7375,7179,6983,6786,6589,
|
||||
6392,6195,5998,5800,5602,5404,5205,5007,4808,4609,4410,4210,4011,3811,3611,3412,
|
||||
3212,3011,2811,2611,2410,2210,2009,1808,1608,1407,1206,1005,804,603,402,201,
|
||||
0,-201,-402,-603,-804,-1005,-1206,-1407,-1608,-1809,-2010,-2210,-2411,-2611,-2812,-3012,
|
||||
-3212,-3412,-3612,-3812,-4011,-4211,-4410,-4609,-4808,-5007,-5206,-5404,-5602,-5800,-5998,-6196,
|
||||
-6393,-6590,-6787,-6983,-7180,-7376,-7571,-7767,-7962,-8157,-8352,-8546,-8740,-8933,-9127,-9320,
|
||||
-9512,-9704,-9896,-10088,-10279,-10470,-10660,-10850,-11039,-11228,-11417,-11605,-11793,-11980,-12167,-12354,
|
||||
-12540,-12725,-12910,-13095,-13279,-13463,-13646,-13828,-14010,-14192,-14373,-14553,-14733,-14912,-15091,-15269,
|
||||
-15447,-15624,-15800,-15976,-16151,-16326,-16500,-16673,-16846,-17018,-17190,-17361,-17531,-17700,-17869,-18037,
|
||||
-18205,-18372,-18538,-18703,-18868,-19032,-19195,-19358,-19520,-19681,-19841,-20001,-20160,-20318,-20475,-20632,
|
||||
-20788,-20943,-21097,-21250,-21403,-21555,-21706,-21856,-22006,-22154,-22302,-22449,-22595,-22740,-22884,-23028,
|
||||
-23170,-23312,-23453,-23593,-23732,-23870,-24007,-24144,-24279,-24414,-24548,-24680,-24812,-24943,-25073,-25202,
|
||||
-25330,-25457,-25583,-25708,-25832,-25956,-26078,-26199,-26319,-26439,-26557,-26674,-26790,-26906,-27020,-27133,
|
||||
-27245,-27357,-27467,-27576,-27684,-27791,-27897,-28002,-28106,-28209,-28310,-28411,-28511,-28609,-28707,-28803,
|
||||
-28899,-28993,-29086,-29178,-29269,-29359,-29448,-29535,-29622,-29707,-29791,-29875,-29957,-30038,-30117,-30196,
|
||||
-30273,-30350,-30425,-30499,-30572,-30644,-30715,-30784,-30852,-30919,-30985,-31050,-31114,-31176,-31238,-31298,
|
||||
-31357,-31415,-31471,-31527,-31581,-31634,-31686,-31736,-31786,-31834,-31881,-31927,-31972,-32015,-32057,-32098,
|
||||
-32138,-32177,-32214,-32250,-32285,-32319,-32352,-32383,-32413,-32442,-32470,-32496,-32521,-32545,-32568,-32590,
|
||||
-32610,-32629,-32647,-32664,-32679,-32693,-32706,-32718,-32728,-32738,-32746,-32752,-32758,-32762,-32765,-32767,
|
||||
-32768,-32767,-32765,-32762,-32758,-32752,-32746,-32738,-32728,-32718,-32706,-32693,-32679,-32664,-32647,-32629,
|
||||
-32610,-32590,-32568,-32545,-32521,-32496,-32470,-32442,-32413,-32383,-32352,-32319,-32285,-32250,-32214,-32177,
|
||||
-32138,-32098,-32057,-32015,-31972,-31927,-31881,-31834,-31786,-31736,-31686,-31634,-31581,-31527,-31471,-31415,
|
||||
-31357,-31298,-31238,-31176,-31114,-31050,-30985,-30919,-30852,-30784,-30715,-30644,-30572,-30499,-30425,-30350,
|
||||
-30273,-30196,-30117,-30038,-29957,-29875,-29791,-29707,-29622,-29535,-29448,-29359,-29269,-29178,-29086,-28993,
|
||||
-28899,-28803,-28707,-28609,-28511,-28411,-28310,-28209,-28106,-28002,-27897,-27791,-27684,-27576,-27467,-27357,
|
||||
-27245,-27133,-27020,-26906,-26790,-26674,-26557,-26439,-26319,-26199,-26078,-25956,-25832,-25708,-25583,-25457,
|
||||
-25330,-25202,-25073,-24943,-24812,-24680,-24548,-24414,-24279,-24144,-24007,-23870,-23732,-23593,-23453,-23312,
|
||||
-23170,-23028,-22884,-22740,-22595,-22449,-22302,-22154,-22006,-21856,-21706,-21555,-21403,-21250,-21097,-20943,
|
||||
-20788,-20632,-20475,-20318,-20160,-20001,-19841,-19681,-19520,-19358,-19195,-19032,-18868,-18703,-18538,-18372,
|
||||
-18205,-18037,-17869,-17700,-17531,-17361,-17190,-17018,-16846,-16673,-16500,-16326,-16151,-15976,-15800,-15624,
|
||||
-15447,-15269,-15091,-14912,-14733,-14553,-14373,-14192,-14010,-13828,-13646,-13463,-13279,-13095,-12910,-12725,
|
||||
-12540,-12354,-12167,-11980,-11793,-11605,-11417,-11228,-11039,-10850,-10660,-10470,-10279,-10088,-9896,-9704,
|
||||
-9512,-9320,-9127,-8933,-8740,-8546,-8352,-8157,-7962,-7767,-7571,-7376,-7180,-6983,-6787,-6590,
|
||||
-6393,-6196,-5998,-5800,-5602,-5404,-5206,-5007,-4808,-4609,-4410,-4211,-4011,-3812,-3612,-3412,
|
||||
-3212,-3012,-2812,-2611,-2411,-2210,-2010,-1809,-1608,-1407,-1206,-1005,-804,-603,-402,-201,
|
||||
0,201,402,603,804,1005,1206,1407,1608,1808,2009,2210,2410,2611,2811,3011,
|
||||
3212,3412,3611,3811,4011,4210,4410,4609,4808,5007,5205,5404,5602,5800,5998,6195,
|
||||
6392,6589,6786,6983,7179,7375,7571,7766,7962,8156,8351,8545,8739,8933,9126,9319,
|
||||
9512,9704,9896,10087,10278,10469,10659,10849,11039,11228,11417,11605,11793,11980,12167,12353,
|
||||
12539,12725,12910,13094,13278,13462,13645,13828,14010,14191,14372,14553,14732,14912,15090,15269,
|
||||
15446,15623,15800,15976,16151,16325,16499,16673,16846,17018,17189,17360,17530,17700,17869,18037,
|
||||
18204,18371,18537,18703,18868,19032,19195,19357,19519,19680,19841,20000,20159,20317,20475,20631,
|
||||
20787,20942,21097,21250,21403,21554,21705,21856,22005,22154,22301,22448,22594,22739,22884,23027,
|
||||
23170,23312,23452,23592,23732,23870,24007,24143,24279,24413,24547,24680,24812,24942,25072,25201,
|
||||
25329,25456,25583,25708,25832,25955,26077,26199,26319,26438,26556,26674,26790,26905,27019,27133,
|
||||
27245,27356,27466,27575,27683,27791,27897,28001,28105,28208,28310,28411,28510,28609,28706,28803,
|
||||
28898,28992,29085,29178,29268,29358,29447,29535,29621,29707,29791,29874,29956,30037,30117,30195,
|
||||
30273,30349,30425,30499,30572,30643,30714,30783,30852,30919,30985,31050,31113,31176,31237,31297,
|
||||
31356,31414,31471,31526,31580,31633,31685,31736,31785,31834,31881,31926,31971,32015,32057,32098,
|
||||
32138,32176,32214,32250,32285,32319,32351,32382,32413,32441,32469,32496,32521,32545,32568,32589,
|
||||
32609,32629,32646,32663,32678,32693,32706,32717,32728,32737,32745,32752,32757,32762,32765,32767
|
||||
};
|
||||
#else
|
||||
static const uint16_t sineTable[257]={
|
||||
0,402,804,1206,1608,2010,2412,2814,3216,3617,4019,4420,4821,5222,5623,6023,
|
||||
6424,6824,7223,7623,8022,8421,8820,9218,9616,10014,10411,10808,11204,11600,11996,12391,
|
||||
12785,13179,13573,13966,14359,14751,15142,15533,15924,16313,16703,17091,17479,17866,18253,18639,
|
||||
19024,19408,19792,20175,20557,20939,21319,21699,22078,22456,22834,23210,23586,23960,24334,24707,
|
||||
25079,25450,25820,26189,26557,26925,27291,27656,28020,28383,28745,29106,29465,29824,30181,30538,
|
||||
30893,31247,31600,31952,32302,32651,32999,33346,33692,34036,34379,34721,35061,35400,35738,36074,
|
||||
36409,36743,37075,37406,37736,38064,38390,38715,39039,39361,39682,40001,40319,40635,40950,41263,
|
||||
41575,41885,42194,42500,42806,43109,43411,43712,44011,44308,44603,44897,45189,45479,45768,46055,
|
||||
46340,46624,46905,47185,47464,47740,48014,48287,48558,48827,49095,49360,49624,49885,50145,50403,
|
||||
50659,50913,51166,51416,51664,51911,52155,52398,52638,52877,53113,53348,53580,53811,54039,54266,
|
||||
54490,54713,54933,55151,55367,55582,55794,56003,56211,56417,56620,56822,57021,57218,57413,57606,
|
||||
57797,57985,58171,58356,58537,58717,58895,59070,59243,59414,59582,59749,59913,60075,60234,60391,
|
||||
60546,60699,60850,60998,61144,61287,61429,61567,61704,61838,61970,62100,62227,62352,62475,62595,
|
||||
62713,62829,62942,63053,63161,63267,63371,63472,63571,63668,63762,63853,63943,64030,64114,64196,
|
||||
64276,64353,64428,64500,64570,64638,64703,64765,64826,64883,64939,64992,65042,65090,65136,65179,
|
||||
65219,65258,65293,65327,65357,65386,65412,65435,65456,65475,65491,65504,65515,65524,65530,65534,
|
||||
65535,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
int16_t sine(uint16_t angle)
|
||||
{
|
||||
#ifdef NZS_FAST_SINE
|
||||
return sineTable[angle];
|
||||
#else
|
||||
int sign=1;
|
||||
int16_t ret;
|
||||
//our sine table has 1024 points per rotation so convert angle to closest step
|
||||
|
||||
if (angle>=(SINE_STEPS/2))
|
||||
{
|
||||
sign=-1;
|
||||
}
|
||||
|
||||
angle=angle % (SINE_STEPS/2); //limit to 0-180 as sign takes care of 180-360
|
||||
|
||||
if (angle>(SINE_STEPS/4-1)) //if we are greater than 90 we need to look up table backwards
|
||||
{
|
||||
angle=(SINE_STEPS/2)-angle;
|
||||
}
|
||||
|
||||
ret=(int16_t)(sineTable[angle]/2)*sign;
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
int16_t cosine(uint16_t angle)
|
||||
{
|
||||
#ifdef NZS_FAST_SINE
|
||||
angle=angle+(SINE_STEPS/4);
|
||||
return sineTable[angle];
|
||||
#else
|
||||
|
||||
int sign=1;
|
||||
int16_t ret;
|
||||
//our sine table has 1024 points per rotation so convert angle to closest step
|
||||
|
||||
if (angle>=(SINE_STEPS/4) and angle<(3*(SINE_STEPS/4)))
|
||||
{
|
||||
sign=-1;
|
||||
}
|
||||
|
||||
angle=angle % (SINE_STEPS/2); //limit to 0-180 as sign takes care of 180-360
|
||||
|
||||
if (angle>(SINE_STEPS/4-1)) //if we are greater than 90 we need to look up table backwards
|
||||
{
|
||||
angle=(SINE_STEPS/2)-angle;
|
||||
}
|
||||
|
||||
//for cosine we need 90 degree phase shift
|
||||
angle=(SINE_STEPS/4)-angle;
|
||||
|
||||
ret=(int16_t)(sineTable[angle]/2)*sign;
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
#pragma GCC pop_options
|
||||
/*
|
||||
* since.cpp
|
||||
*
|
||||
* Created on: Dec 24, 2016
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#include "sine.h"
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("-Ofast")
|
||||
|
||||
#ifdef NZS_FAST_SINE
|
||||
static const int16_t sineTable[1280]={
|
||||
0,201,402,603,804,1005,1206,1407,1608,1808,2009,2210,2410,2611,2811,3011,
|
||||
3212,3412,3611,3811,4011,4210,4410,4609,4808,5007,5205,5404,5602,5800,5998,6195,
|
||||
6392,6589,6786,6983,7179,7375,7571,7766,7962,8156,8351,8545,8739,8933,9126,9319,
|
||||
9512,9704,9896,10087,10278,10469,10659,10849,11039,11228,11417,11605,11793,11980,12167,12353,
|
||||
12539,12725,12910,13094,13278,13462,13645,13828,14010,14191,14372,14553,14732,14912,15090,15269,
|
||||
15446,15623,15800,15976,16151,16325,16499,16673,16846,17018,17189,17360,17530,17700,17869,18037,
|
||||
18204,18371,18537,18703,18868,19032,19195,19357,19519,19680,19841,20000,20159,20317,20475,20631,
|
||||
20787,20942,21097,21250,21403,21554,21705,21856,22005,22154,22301,22448,22594,22739,22884,23027,
|
||||
23170,23312,23452,23592,23732,23870,24007,24143,24279,24413,24547,24680,24812,24942,25072,25201,
|
||||
25329,25456,25583,25708,25832,25955,26077,26199,26319,26438,26556,26674,26790,26905,27019,27133,
|
||||
27245,27356,27466,27575,27683,27791,27897,28001,28105,28208,28310,28411,28510,28609,28706,28803,
|
||||
28898,28992,29085,29178,29268,29358,29447,29535,29621,29707,29791,29874,29956,30037,30117,30195,
|
||||
30273,30349,30425,30499,30572,30643,30714,30783,30852,30919,30985,31050,31113,31176,31237,31297,
|
||||
31356,31414,31471,31526,31580,31633,31685,31736,31785,31834,31881,31926,31971,32015,32057,32098,
|
||||
32138,32176,32214,32250,32285,32319,32351,32382,32413,32441,32469,32496,32521,32545,32568,32589,
|
||||
32609,32629,32646,32663,32678,32693,32706,32717,32728,32737,32745,32752,32757,32762,32765,32767,
|
||||
32767,32767,32765,32762,32757,32752,32745,32737,32728,32717,32706,32693,32678,32663,32646,32629,
|
||||
32609,32589,32568,32545,32521,32496,32469,32441,32413,32382,32351,32319,32285,32250,32214,32176,
|
||||
32138,32098,32057,32015,31971,31926,31881,31834,31785,31736,31685,31633,31580,31526,31471,31414,
|
||||
31356,31297,31237,31176,31113,31050,30985,30919,30852,30783,30714,30643,30572,30499,30425,30349,
|
||||
30273,30195,30117,30037,29956,29874,29791,29707,29621,29535,29447,29358,29268,29178,29085,28992,
|
||||
28898,28803,28706,28609,28510,28411,28310,28208,28105,28001,27897,27791,27683,27575,27466,27356,
|
||||
27245,27133,27019,26905,26790,26674,26556,26438,26319,26199,26077,25955,25832,25708,25583,25456,
|
||||
25329,25201,25072,24942,24812,24680,24547,24413,24279,24143,24007,23870,23732,23592,23452,23312,
|
||||
23170,23027,22884,22739,22594,22448,22301,22154,22005,21856,21705,21554,21403,21250,21097,20942,
|
||||
20787,20631,20475,20317,20159,20000,19841,19680,19519,19357,19195,19032,18868,18703,18537,18371,
|
||||
18204,18037,17869,17700,17530,17360,17189,17018,16846,16673,16499,16325,16151,15976,15800,15623,
|
||||
15446,15269,15090,14912,14732,14553,14372,14191,14010,13828,13645,13462,13278,13094,12910,12725,
|
||||
12539,12353,12167,11980,11793,11605,11417,11228,11039,10849,10659,10469,10278,10087,9896,9704,
|
||||
9512,9319,9126,8933,8739,8545,8351,8156,7962,7766,7571,7375,7179,6983,6786,6589,
|
||||
6392,6195,5998,5800,5602,5404,5205,5007,4808,4609,4410,4210,4011,3811,3611,3412,
|
||||
3212,3011,2811,2611,2410,2210,2009,1808,1608,1407,1206,1005,804,603,402,201,
|
||||
0,-201,-402,-603,-804,-1005,-1206,-1407,-1608,-1809,-2010,-2210,-2411,-2611,-2812,-3012,
|
||||
-3212,-3412,-3612,-3812,-4011,-4211,-4410,-4609,-4808,-5007,-5206,-5404,-5602,-5800,-5998,-6196,
|
||||
-6393,-6590,-6787,-6983,-7180,-7376,-7571,-7767,-7962,-8157,-8352,-8546,-8740,-8933,-9127,-9320,
|
||||
-9512,-9704,-9896,-10088,-10279,-10470,-10660,-10850,-11039,-11228,-11417,-11605,-11793,-11980,-12167,-12354,
|
||||
-12540,-12725,-12910,-13095,-13279,-13463,-13646,-13828,-14010,-14192,-14373,-14553,-14733,-14912,-15091,-15269,
|
||||
-15447,-15624,-15800,-15976,-16151,-16326,-16500,-16673,-16846,-17018,-17190,-17361,-17531,-17700,-17869,-18037,
|
||||
-18205,-18372,-18538,-18703,-18868,-19032,-19195,-19358,-19520,-19681,-19841,-20001,-20160,-20318,-20475,-20632,
|
||||
-20788,-20943,-21097,-21250,-21403,-21555,-21706,-21856,-22006,-22154,-22302,-22449,-22595,-22740,-22884,-23028,
|
||||
-23170,-23312,-23453,-23593,-23732,-23870,-24007,-24144,-24279,-24414,-24548,-24680,-24812,-24943,-25073,-25202,
|
||||
-25330,-25457,-25583,-25708,-25832,-25956,-26078,-26199,-26319,-26439,-26557,-26674,-26790,-26906,-27020,-27133,
|
||||
-27245,-27357,-27467,-27576,-27684,-27791,-27897,-28002,-28106,-28209,-28310,-28411,-28511,-28609,-28707,-28803,
|
||||
-28899,-28993,-29086,-29178,-29269,-29359,-29448,-29535,-29622,-29707,-29791,-29875,-29957,-30038,-30117,-30196,
|
||||
-30273,-30350,-30425,-30499,-30572,-30644,-30715,-30784,-30852,-30919,-30985,-31050,-31114,-31176,-31238,-31298,
|
||||
-31357,-31415,-31471,-31527,-31581,-31634,-31686,-31736,-31786,-31834,-31881,-31927,-31972,-32015,-32057,-32098,
|
||||
-32138,-32177,-32214,-32250,-32285,-32319,-32352,-32383,-32413,-32442,-32470,-32496,-32521,-32545,-32568,-32590,
|
||||
-32610,-32629,-32647,-32664,-32679,-32693,-32706,-32718,-32728,-32738,-32746,-32752,-32758,-32762,-32765,-32767,
|
||||
-32768,-32767,-32765,-32762,-32758,-32752,-32746,-32738,-32728,-32718,-32706,-32693,-32679,-32664,-32647,-32629,
|
||||
-32610,-32590,-32568,-32545,-32521,-32496,-32470,-32442,-32413,-32383,-32352,-32319,-32285,-32250,-32214,-32177,
|
||||
-32138,-32098,-32057,-32015,-31972,-31927,-31881,-31834,-31786,-31736,-31686,-31634,-31581,-31527,-31471,-31415,
|
||||
-31357,-31298,-31238,-31176,-31114,-31050,-30985,-30919,-30852,-30784,-30715,-30644,-30572,-30499,-30425,-30350,
|
||||
-30273,-30196,-30117,-30038,-29957,-29875,-29791,-29707,-29622,-29535,-29448,-29359,-29269,-29178,-29086,-28993,
|
||||
-28899,-28803,-28707,-28609,-28511,-28411,-28310,-28209,-28106,-28002,-27897,-27791,-27684,-27576,-27467,-27357,
|
||||
-27245,-27133,-27020,-26906,-26790,-26674,-26557,-26439,-26319,-26199,-26078,-25956,-25832,-25708,-25583,-25457,
|
||||
-25330,-25202,-25073,-24943,-24812,-24680,-24548,-24414,-24279,-24144,-24007,-23870,-23732,-23593,-23453,-23312,
|
||||
-23170,-23028,-22884,-22740,-22595,-22449,-22302,-22154,-22006,-21856,-21706,-21555,-21403,-21250,-21097,-20943,
|
||||
-20788,-20632,-20475,-20318,-20160,-20001,-19841,-19681,-19520,-19358,-19195,-19032,-18868,-18703,-18538,-18372,
|
||||
-18205,-18037,-17869,-17700,-17531,-17361,-17190,-17018,-16846,-16673,-16500,-16326,-16151,-15976,-15800,-15624,
|
||||
-15447,-15269,-15091,-14912,-14733,-14553,-14373,-14192,-14010,-13828,-13646,-13463,-13279,-13095,-12910,-12725,
|
||||
-12540,-12354,-12167,-11980,-11793,-11605,-11417,-11228,-11039,-10850,-10660,-10470,-10279,-10088,-9896,-9704,
|
||||
-9512,-9320,-9127,-8933,-8740,-8546,-8352,-8157,-7962,-7767,-7571,-7376,-7180,-6983,-6787,-6590,
|
||||
-6393,-6196,-5998,-5800,-5602,-5404,-5206,-5007,-4808,-4609,-4410,-4211,-4011,-3812,-3612,-3412,
|
||||
-3212,-3012,-2812,-2611,-2411,-2210,-2010,-1809,-1608,-1407,-1206,-1005,-804,-603,-402,-201,
|
||||
0,201,402,603,804,1005,1206,1407,1608,1808,2009,2210,2410,2611,2811,3011,
|
||||
3212,3412,3611,3811,4011,4210,4410,4609,4808,5007,5205,5404,5602,5800,5998,6195,
|
||||
6392,6589,6786,6983,7179,7375,7571,7766,7962,8156,8351,8545,8739,8933,9126,9319,
|
||||
9512,9704,9896,10087,10278,10469,10659,10849,11039,11228,11417,11605,11793,11980,12167,12353,
|
||||
12539,12725,12910,13094,13278,13462,13645,13828,14010,14191,14372,14553,14732,14912,15090,15269,
|
||||
15446,15623,15800,15976,16151,16325,16499,16673,16846,17018,17189,17360,17530,17700,17869,18037,
|
||||
18204,18371,18537,18703,18868,19032,19195,19357,19519,19680,19841,20000,20159,20317,20475,20631,
|
||||
20787,20942,21097,21250,21403,21554,21705,21856,22005,22154,22301,22448,22594,22739,22884,23027,
|
||||
23170,23312,23452,23592,23732,23870,24007,24143,24279,24413,24547,24680,24812,24942,25072,25201,
|
||||
25329,25456,25583,25708,25832,25955,26077,26199,26319,26438,26556,26674,26790,26905,27019,27133,
|
||||
27245,27356,27466,27575,27683,27791,27897,28001,28105,28208,28310,28411,28510,28609,28706,28803,
|
||||
28898,28992,29085,29178,29268,29358,29447,29535,29621,29707,29791,29874,29956,30037,30117,30195,
|
||||
30273,30349,30425,30499,30572,30643,30714,30783,30852,30919,30985,31050,31113,31176,31237,31297,
|
||||
31356,31414,31471,31526,31580,31633,31685,31736,31785,31834,31881,31926,31971,32015,32057,32098,
|
||||
32138,32176,32214,32250,32285,32319,32351,32382,32413,32441,32469,32496,32521,32545,32568,32589,
|
||||
32609,32629,32646,32663,32678,32693,32706,32717,32728,32737,32745,32752,32757,32762,32765,32767
|
||||
};
|
||||
#else
|
||||
static const uint16_t sineTable[257]={
|
||||
0,402,804,1206,1608,2010,2412,2814,3216,3617,4019,4420,4821,5222,5623,6023,
|
||||
6424,6824,7223,7623,8022,8421,8820,9218,9616,10014,10411,10808,11204,11600,11996,12391,
|
||||
12785,13179,13573,13966,14359,14751,15142,15533,15924,16313,16703,17091,17479,17866,18253,18639,
|
||||
19024,19408,19792,20175,20557,20939,21319,21699,22078,22456,22834,23210,23586,23960,24334,24707,
|
||||
25079,25450,25820,26189,26557,26925,27291,27656,28020,28383,28745,29106,29465,29824,30181,30538,
|
||||
30893,31247,31600,31952,32302,32651,32999,33346,33692,34036,34379,34721,35061,35400,35738,36074,
|
||||
36409,36743,37075,37406,37736,38064,38390,38715,39039,39361,39682,40001,40319,40635,40950,41263,
|
||||
41575,41885,42194,42500,42806,43109,43411,43712,44011,44308,44603,44897,45189,45479,45768,46055,
|
||||
46340,46624,46905,47185,47464,47740,48014,48287,48558,48827,49095,49360,49624,49885,50145,50403,
|
||||
50659,50913,51166,51416,51664,51911,52155,52398,52638,52877,53113,53348,53580,53811,54039,54266,
|
||||
54490,54713,54933,55151,55367,55582,55794,56003,56211,56417,56620,56822,57021,57218,57413,57606,
|
||||
57797,57985,58171,58356,58537,58717,58895,59070,59243,59414,59582,59749,59913,60075,60234,60391,
|
||||
60546,60699,60850,60998,61144,61287,61429,61567,61704,61838,61970,62100,62227,62352,62475,62595,
|
||||
62713,62829,62942,63053,63161,63267,63371,63472,63571,63668,63762,63853,63943,64030,64114,64196,
|
||||
64276,64353,64428,64500,64570,64638,64703,64765,64826,64883,64939,64992,65042,65090,65136,65179,
|
||||
65219,65258,65293,65327,65357,65386,65412,65435,65456,65475,65491,65504,65515,65524,65530,65534,
|
||||
65535,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
int16_t sine(uint16_t angle)
|
||||
{
|
||||
#ifdef NZS_FAST_SINE
|
||||
return sineTable[angle];
|
||||
#else
|
||||
int sign=1;
|
||||
int16_t ret;
|
||||
//our sine table has 1024 points per rotation so convert angle to closest step
|
||||
|
||||
if (angle>=(SINE_STEPS/2))
|
||||
{
|
||||
sign=-1;
|
||||
}
|
||||
|
||||
angle=angle % (SINE_STEPS/2); //limit to 0-180 as sign takes care of 180-360
|
||||
|
||||
if (angle>(SINE_STEPS/4-1)) //if we are greater than 90 we need to look up table backwards
|
||||
{
|
||||
angle=(SINE_STEPS/2)-angle;
|
||||
}
|
||||
|
||||
ret=(int16_t)(sineTable[angle]/2)*sign;
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
int16_t cosine(uint16_t angle)
|
||||
{
|
||||
#ifdef NZS_FAST_SINE
|
||||
angle=angle+(SINE_STEPS/4);
|
||||
return sineTable[angle];
|
||||
#else
|
||||
|
||||
int sign=1;
|
||||
int16_t ret;
|
||||
//our sine table has 1024 points per rotation so convert angle to closest step
|
||||
|
||||
if (angle>=(SINE_STEPS/4) and angle<(3*(SINE_STEPS/4)))
|
||||
{
|
||||
sign=-1;
|
||||
}
|
||||
|
||||
angle=angle % (SINE_STEPS/2); //limit to 0-180 as sign takes care of 180-360
|
||||
|
||||
if (angle>(SINE_STEPS/4-1)) //if we are greater than 90 we need to look up table backwards
|
||||
{
|
||||
angle=(SINE_STEPS/2)-angle;
|
||||
}
|
||||
|
||||
//for cosine we need 90 degree phase shift
|
||||
angle=(SINE_STEPS/4)-angle;
|
||||
|
||||
ret=(int16_t)(sineTable[angle]/2)*sign;
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
#pragma GCC pop_options
|
||||
|
@ -1,43 +1,43 @@
|
||||
/**********************************************************************
|
||||
* sine.h
|
||||
*
|
||||
* Created on: Dec 24, 2016
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
|
||||
#ifndef SINE_H_
|
||||
#define SINE_H_
|
||||
|
||||
#include "board.h"
|
||||
|
||||
#define SINE_STEPS (1024L)
|
||||
|
||||
#define SINE_MAX ((int32_t)(32768L))
|
||||
|
||||
|
||||
int16_t sine(uint16_t angle);
|
||||
int16_t cosine(uint16_t angle);
|
||||
|
||||
|
||||
#endif /* SINE_H_ */
|
||||
/**********************************************************************
|
||||
* sine.h
|
||||
*
|
||||
* Created on: Dec 24, 2016
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
|
||||
#ifndef SINE_H_
|
||||
#define SINE_H_
|
||||
|
||||
#include "board.h"
|
||||
|
||||
#define SINE_STEPS (1024L)
|
||||
|
||||
#define SINE_MAX ((int32_t)(32768L))
|
||||
|
||||
|
||||
int16_t sine(uint16_t angle);
|
||||
int16_t cosine(uint16_t angle);
|
||||
|
||||
|
||||
#endif /* SINE_H_ */
|
||||
|
@ -1,224 +1,224 @@
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __STEPPER_CONTROLLER_H__
|
||||
#define __STEPPER_CONTROLLER_H__
|
||||
|
||||
#include "syslog.h"
|
||||
#include "board.h"
|
||||
#include "as5047d.h"
|
||||
#include "A1333.h"
|
||||
#include "calibration.h"
|
||||
#include "A4954.h"
|
||||
#include "A5995.h"
|
||||
#include "nonvolatile.h"
|
||||
#include "fet_driver.h" //for the NEMA23 10A
|
||||
|
||||
|
||||
#define N_DATA (1024)
|
||||
|
||||
|
||||
typedef enum {
|
||||
STEPCTRL_NO_ERROR=0,
|
||||
STEPCTRL_NO_POWER=1, //no power to motor
|
||||
STEPCTRL_NO_CAL=2, //calibration not set
|
||||
STEPCTRL_NO_ENCODER=3, //encoder not working
|
||||
} stepCtrlError_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int32_t Kp;
|
||||
int32_t Ki;
|
||||
int32_t Kd;
|
||||
} PID_t;
|
||||
|
||||
|
||||
typedef __attribute__((aligned(4))) struct {
|
||||
int32_t microSecs;
|
||||
int32_t desiredLoc;
|
||||
int32_t actualLoc;
|
||||
int32_t angle;
|
||||
int32_t ma;
|
||||
} Location_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int32_t angle;
|
||||
int32_t ma;
|
||||
}Control_t;
|
||||
|
||||
#define MAX_NUM_LOCATIONS (64) //maximum number of locations to buffer
|
||||
|
||||
|
||||
//this scales the PID parameters from Flash to floating point
|
||||
// to fixed point int32_t values
|
||||
#define CTRL_PID_SCALING (1024)
|
||||
|
||||
// Uncommenting this will make motor go into ctrl_pos_pid mode
|
||||
// at startup and when exiting ctrl_torque mode by setting torque=0
|
||||
//#define CTRL_POS_PID_AS_DEFAULT
|
||||
|
||||
class StepperCtrl
|
||||
{
|
||||
private:
|
||||
volatile bool enableFeedback; //true if we are using PID control algorithm
|
||||
|
||||
#ifdef A1333_ENCODER
|
||||
A1333 encoder;
|
||||
#else
|
||||
AS5047D encoder;
|
||||
#endif
|
||||
|
||||
#ifdef NEMA_23_10A_HW
|
||||
FetDriver stepperDriver;
|
||||
#else
|
||||
#ifdef A5995_DRIVER
|
||||
A5995 stepperDriver;
|
||||
#else
|
||||
A4954 stepperDriver;
|
||||
#endif
|
||||
#endif
|
||||
uint16_t startUpEncoder;
|
||||
volatile int32_t ticks=0;
|
||||
volatile Location_t locs[MAX_NUM_LOCATIONS];
|
||||
volatile int32_t locReadIndx=0;
|
||||
volatile int32_t locWriteIndx=0;
|
||||
|
||||
volatile MotorParams_t motorParams;
|
||||
volatile SystemParams_t systemParams;
|
||||
volatile bool enabled;
|
||||
|
||||
|
||||
|
||||
volatile int32_t loopTimeus; //time to run loop in microseconds
|
||||
|
||||
volatile PID_t sPID; //simple control loop PID parameters
|
||||
volatile PID_t pPID; //positional current based PID control parameters
|
||||
volatile PID_t vPID; //velocity PID control parameters
|
||||
|
||||
volatile int64_t numSteps; //this is the number of steps we have taken from our start angle
|
||||
|
||||
volatile int32_t loopError;
|
||||
|
||||
volatile int64_t currentLocation; //estimate of the current location from encoder feedback
|
||||
// the current location lower 16 bits is angle (0-360 degrees in 65536 steps) while upper
|
||||
// bits is the number of full rotations.
|
||||
|
||||
//this is used for the velocity PID feedback
|
||||
// units are in Angles/sec where 1 Angle=360deg/65536
|
||||
volatile int64_t velocity;
|
||||
volatile int8_t torque=0;
|
||||
|
||||
int64_t zeroAngleOffset=0;
|
||||
|
||||
|
||||
//volatile int16_t data[N_DATA];
|
||||
|
||||
//does linear interpolation of the encoder calibration table
|
||||
int32_t getAngleCalibration(int32_t encoderAngle);
|
||||
|
||||
//updates the currentMeasuredAngle with our best guess where we are
|
||||
Angle sampleAngle(void);
|
||||
Angle sampleMeanEncoder(int32_t numSamples);
|
||||
|
||||
float measureStepSize(void); //steps motor and estimates step size
|
||||
uint32_t measureMaxCalibrationError(void);
|
||||
void setLocationFromEncoder(void);
|
||||
|
||||
void motorReset(void);
|
||||
void updateStep(int dir, uint16_t steps);
|
||||
|
||||
bool torqueLoop(int64_t currentLoc, Control_t *ptrCtrl);
|
||||
bool pidFeedback(int64_t desiredLoc, int64_t currentLoc, Control_t *ptrCtrl);
|
||||
bool simpleFeedback(int64_t desiredLoc, int64_t currentLoc,Control_t *ptrCtrl);
|
||||
bool vpidFeedback(int64_t desiredLoc, int64_t currentLoc,Control_t *ptrCtrl);
|
||||
int64_t getCurrentLocation(void);
|
||||
int64_t getDesiredLocation(void);
|
||||
void updateLocTable(int64_t desiredLoc, int64_t currentLoc,Control_t *ptrCtrl);
|
||||
|
||||
int64_t calculatePhasePrediction(int64_t currentLoc);
|
||||
bool determineError(int64_t currentLoc, int64_t error);
|
||||
|
||||
public:
|
||||
uint16_t getStartupEncoder(void) {return startUpEncoder;}
|
||||
int32_t getLocation(Location_t *ptrLoc);
|
||||
|
||||
//int32_t getSteps(void);
|
||||
Angle getEncoderAngle(void);
|
||||
|
||||
void setAngle(int64_t loc);
|
||||
|
||||
int64_t getZeroAngleOffset(void);
|
||||
void PrintData(void);
|
||||
void setTorque(int8_t tor); //set torqu for torque mode
|
||||
int8_t getTorque(void);
|
||||
void setVelocity(int64_t vel); //set velocity for vPID mode
|
||||
int64_t getVelocity(void);
|
||||
int32_t getLoopError(void) {return loopError;}; //assume atomic read
|
||||
|
||||
bool calibrationValid(void) { return calTable.calValid();} //returns true if calbiration is good
|
||||
|
||||
void updateParamsFromNVM(void); //updates the parameters from NVM
|
||||
CalibrationTable calTable;
|
||||
//void printData(void);
|
||||
|
||||
bool calibrateEncoder(void); //do manual calibration of the encoder
|
||||
Angle maxCalibrationError(void); //measures the maximum calibration error as an angle
|
||||
|
||||
void moveToAbsAngle(int32_t a);
|
||||
void moveToAngle(int32_t a, uint32_t ma);
|
||||
|
||||
stepCtrlError_t begin(void); //returns false if we can not use motor
|
||||
|
||||
bool processFeedback(void); // does the feedback loop
|
||||
|
||||
feedbackCtrl_t getControlMode(void) { return systemParams.controllerMode;};
|
||||
|
||||
void updateSteps(int64_t steps);
|
||||
void requestStep(int dir, uint16_t steps); //requests a step, if feedback controller is off motor does not move
|
||||
|
||||
void feedback(bool enable);
|
||||
bool getFeedback(void) {return enableFeedback;}
|
||||
|
||||
void encoderDiagnostics(char *ptrStr);
|
||||
int32_t measureError(void);
|
||||
|
||||
//these two functions are compenstated by the zero offset
|
||||
int64_t getCurrentAngle(void);
|
||||
int64_t getDesiredAngle(void);
|
||||
|
||||
void move(int dir, uint16_t steps); //forces motor to move even if feedback controller is turned off.
|
||||
void currentLocationIsDesiredLocation();
|
||||
void stealthSwitchMode(feedbackCtrl_t m);
|
||||
void acceptPositionAndStealthSwitchMode(feedbackCtrl_t m);
|
||||
void enable(bool enable);
|
||||
bool getEnable(void) {return enabled;}
|
||||
|
||||
int32_t getLoopTime(void) { return loopTimeus;}
|
||||
|
||||
void PID_Autotune(void);
|
||||
void setZero(void);
|
||||
};
|
||||
|
||||
#endif //__STEPPER_CONTROLLER_H__
|
||||
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#ifndef __STEPPER_CONTROLLER_H__
|
||||
#define __STEPPER_CONTROLLER_H__
|
||||
|
||||
#include "syslog.h"
|
||||
#include "board.h"
|
||||
#include "as5047d.h"
|
||||
#include "A1333.h"
|
||||
#include "calibration.h"
|
||||
#include "A4954.h"
|
||||
#include "A5995.h"
|
||||
#include "nonvolatile.h"
|
||||
#include "fet_driver.h" //for the NEMA23 10A
|
||||
|
||||
|
||||
#define N_DATA (1024)
|
||||
|
||||
|
||||
typedef enum {
|
||||
STEPCTRL_NO_ERROR=0,
|
||||
STEPCTRL_NO_POWER=1, //no power to motor
|
||||
STEPCTRL_NO_CAL=2, //calibration not set
|
||||
STEPCTRL_NO_ENCODER=3, //encoder not working
|
||||
} stepCtrlError_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int32_t Kp;
|
||||
int32_t Ki;
|
||||
int32_t Kd;
|
||||
} PID_t;
|
||||
|
||||
|
||||
typedef __attribute__((aligned(4))) struct {
|
||||
int32_t microSecs;
|
||||
int32_t desiredLoc;
|
||||
int32_t actualLoc;
|
||||
int32_t angle;
|
||||
int32_t ma;
|
||||
} Location_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int32_t angle;
|
||||
int32_t ma;
|
||||
}Control_t;
|
||||
|
||||
#define MAX_NUM_LOCATIONS (64) //maximum number of locations to buffer
|
||||
|
||||
|
||||
//this scales the PID parameters from Flash to floating point
|
||||
// to fixed point int32_t values
|
||||
#define CTRL_PID_SCALING (1024)
|
||||
|
||||
// Uncommenting this will make motor go into ctrl_pos_pid mode
|
||||
// at startup and when exiting ctrl_torque mode by setting torque=0
|
||||
//#define CTRL_POS_PID_AS_DEFAULT
|
||||
|
||||
class StepperCtrl
|
||||
{
|
||||
private:
|
||||
volatile bool enableFeedback; //true if we are using PID control algorithm
|
||||
|
||||
#ifdef A1333_ENCODER
|
||||
A1333 encoder;
|
||||
#else
|
||||
AS5047D encoder;
|
||||
#endif
|
||||
|
||||
#ifdef NEMA_23_10A_HW
|
||||
FetDriver stepperDriver;
|
||||
#else
|
||||
#ifdef A5995_DRIVER
|
||||
A5995 stepperDriver;
|
||||
#else
|
||||
A4954 stepperDriver;
|
||||
#endif
|
||||
#endif
|
||||
uint16_t startUpEncoder;
|
||||
volatile int32_t ticks=0;
|
||||
volatile Location_t locs[MAX_NUM_LOCATIONS];
|
||||
volatile int32_t locReadIndx=0;
|
||||
volatile int32_t locWriteIndx=0;
|
||||
|
||||
volatile MotorParams_t motorParams;
|
||||
volatile SystemParams_t systemParams;
|
||||
volatile bool enabled;
|
||||
|
||||
|
||||
|
||||
volatile int32_t loopTimeus; //time to run loop in microseconds
|
||||
|
||||
volatile PID_t sPID; //simple control loop PID parameters
|
||||
volatile PID_t pPID; //positional current based PID control parameters
|
||||
volatile PID_t vPID; //velocity PID control parameters
|
||||
|
||||
volatile int64_t numSteps; //this is the number of steps we have taken from our start angle
|
||||
|
||||
volatile int32_t loopError;
|
||||
|
||||
volatile int64_t currentLocation; //estimate of the current location from encoder feedback
|
||||
// the current location lower 16 bits is angle (0-360 degrees in 65536 steps) while upper
|
||||
// bits is the number of full rotations.
|
||||
|
||||
//this is used for the velocity PID feedback
|
||||
// units are in Angles/sec where 1 Angle=360deg/65536
|
||||
volatile int64_t velocity;
|
||||
volatile int8_t torque=0;
|
||||
|
||||
int64_t zeroAngleOffset=0;
|
||||
|
||||
|
||||
//volatile int16_t data[N_DATA];
|
||||
|
||||
//does linear interpolation of the encoder calibration table
|
||||
int32_t getAngleCalibration(int32_t encoderAngle);
|
||||
|
||||
//updates the currentMeasuredAngle with our best guess where we are
|
||||
Angle sampleAngle(void);
|
||||
Angle sampleMeanEncoder(int32_t numSamples);
|
||||
|
||||
float measureStepSize(void); //steps motor and estimates step size
|
||||
uint32_t measureMaxCalibrationError(void);
|
||||
void setLocationFromEncoder(void);
|
||||
|
||||
void motorReset(void);
|
||||
void updateStep(int dir, uint16_t steps);
|
||||
|
||||
bool torqueLoop(int64_t currentLoc, Control_t *ptrCtrl);
|
||||
bool pidFeedback(int64_t desiredLoc, int64_t currentLoc, Control_t *ptrCtrl);
|
||||
bool simpleFeedback(int64_t desiredLoc, int64_t currentLoc,Control_t *ptrCtrl);
|
||||
bool vpidFeedback(int64_t desiredLoc, int64_t currentLoc,Control_t *ptrCtrl);
|
||||
int64_t getCurrentLocation(void);
|
||||
int64_t getDesiredLocation(void);
|
||||
void updateLocTable(int64_t desiredLoc, int64_t currentLoc,Control_t *ptrCtrl);
|
||||
|
||||
int64_t calculatePhasePrediction(int64_t currentLoc);
|
||||
bool determineError(int64_t currentLoc, int64_t error);
|
||||
|
||||
public:
|
||||
uint16_t getStartupEncoder(void) {return startUpEncoder;}
|
||||
int32_t getLocation(Location_t *ptrLoc);
|
||||
|
||||
//int32_t getSteps(void);
|
||||
Angle getEncoderAngle(void);
|
||||
|
||||
void setAngle(int64_t loc);
|
||||
|
||||
int64_t getZeroAngleOffset(void);
|
||||
void PrintData(void);
|
||||
void setTorque(int8_t tor); //set torqu for torque mode
|
||||
int8_t getTorque(void);
|
||||
void setVelocity(int64_t vel); //set velocity for vPID mode
|
||||
int64_t getVelocity(void);
|
||||
int32_t getLoopError(void) {return loopError;}; //assume atomic read
|
||||
|
||||
bool calibrationValid(void) { return calTable.calValid();} //returns true if calbiration is good
|
||||
|
||||
void updateParamsFromNVM(void); //updates the parameters from NVM
|
||||
CalibrationTable calTable;
|
||||
//void printData(void);
|
||||
|
||||
bool calibrateEncoder(void); //do manual calibration of the encoder
|
||||
Angle maxCalibrationError(void); //measures the maximum calibration error as an angle
|
||||
|
||||
void moveToAbsAngle(int32_t a);
|
||||
void moveToAngle(int32_t a, uint32_t ma);
|
||||
|
||||
stepCtrlError_t begin(void); //returns false if we can not use motor
|
||||
|
||||
bool processFeedback(void); // does the feedback loop
|
||||
|
||||
feedbackCtrl_t getControlMode(void) { return systemParams.controllerMode;};
|
||||
|
||||
void updateSteps(int64_t steps);
|
||||
void requestStep(int dir, uint16_t steps); //requests a step, if feedback controller is off motor does not move
|
||||
|
||||
void feedback(bool enable);
|
||||
bool getFeedback(void) {return enableFeedback;}
|
||||
|
||||
void encoderDiagnostics(char *ptrStr);
|
||||
int32_t measureError(void);
|
||||
|
||||
//these two functions are compenstated by the zero offset
|
||||
int64_t getCurrentAngle(void);
|
||||
int64_t getDesiredAngle(void);
|
||||
|
||||
void move(int dir, uint16_t steps); //forces motor to move even if feedback controller is turned off.
|
||||
void currentLocationIsDesiredLocation();
|
||||
void stealthSwitchMode(feedbackCtrl_t m);
|
||||
void acceptPositionAndStealthSwitchMode(feedbackCtrl_t m);
|
||||
void enable(bool enable);
|
||||
bool getEnable(void) {return enabled;}
|
||||
|
||||
int32_t getLoopTime(void) { return loopTimeus;}
|
||||
|
||||
void PID_Autotune(void);
|
||||
void setZero(void);
|
||||
};
|
||||
|
||||
#endif //__STEPPER_CONTROLLER_H__
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
#include "nzs.h"
|
||||
|
||||
NZS nzs;
|
||||
|
||||
|
||||
void setup() {
|
||||
nzs.begin();
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
nzs.loop();
|
||||
}
|
||||
#include "nzs.h"
|
||||
|
||||
NZS nzs;
|
||||
|
||||
|
||||
void setup() {
|
||||
nzs.begin();
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
nzs.loop();
|
||||
}
|
||||
|
@ -1,314 +1,314 @@
|
||||
/*
|
||||
* Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*/
|
||||
#include "steppin.h"
|
||||
#include "stepper_controller.h"
|
||||
#include "wiring_private.h"
|
||||
#include "Arduino.h"
|
||||
|
||||
extern StepperCtrl stepperCtrl;
|
||||
|
||||
volatile int32_t stepsChanged=0;
|
||||
volatile int64_t steps=0;
|
||||
|
||||
|
||||
#if (PIN_STEP_INPUT != 0)
|
||||
#error "this code only works with step pin being D0 (PA11, EXTINT11)"
|
||||
#endif
|
||||
|
||||
|
||||
#define WAIT_TCC2_SYNC() while(TCC2->SYNCBUSY.reg)
|
||||
|
||||
void checkDir(void)
|
||||
{
|
||||
int dir=1;
|
||||
static int lastDir=-1;
|
||||
|
||||
|
||||
if (CW_ROTATION == NVM->SystemParams.dirPinRotation)
|
||||
{
|
||||
dir=0; //reverse the rotation
|
||||
}
|
||||
|
||||
if (lastDir != dir)
|
||||
{
|
||||
if (dir)
|
||||
{
|
||||
EIC->CONFIG[1].reg &= ~EIC_CONFIG_SENSE2_Msk;
|
||||
EIC->CONFIG[1].reg |= EIC_CONFIG_SENSE2_HIGH;
|
||||
|
||||
} else
|
||||
{
|
||||
EIC->CONFIG[1].reg &= ~EIC_CONFIG_SENSE2_Msk;
|
||||
EIC->CONFIG[1].reg |= EIC_CONFIG_SENSE2_LOW;
|
||||
}
|
||||
lastDir=dir;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//this function can not be called in interrupt context as the overflow interrupt for tC4 needs to run.
|
||||
int64_t getSteps(void)
|
||||
{
|
||||
|
||||
//#ifndef USE_NEW_STEP
|
||||
// return 0;
|
||||
//#endif
|
||||
int64_t x;
|
||||
#ifdef USE_TC_STEP
|
||||
uint16_t y;
|
||||
static uint16_t lasty=0;
|
||||
|
||||
TCC2->CTRLBSET.reg=TCC_CTRLBSET_CMD_READSYNC;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
|
||||
y=(uint16_t)(TCC2->COUNT.reg & 0x0FFFFul); //use only lowest 16bits
|
||||
//LOG("count is %d",y);
|
||||
steps += (int16_t)(y-lasty);
|
||||
lasty=y;
|
||||
|
||||
checkDir();
|
||||
return steps;
|
||||
|
||||
#else
|
||||
EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT11;
|
||||
x=stepsChanged;
|
||||
stepsChanged=0;
|
||||
EIC->INTENSET.reg = EIC_INTENSET_EXTINT11;
|
||||
return x;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//this function is called on the rising edge of a step from external device
|
||||
static void stepInput(void)
|
||||
{
|
||||
static int dir;
|
||||
|
||||
//read our direction pin
|
||||
dir = digitalRead(PIN_DIR_INPUT);
|
||||
|
||||
if (CW_ROTATION == NVM->SystemParams.dirPinRotation)
|
||||
{
|
||||
dir=!dir; //reverse the rotation
|
||||
}
|
||||
|
||||
#ifndef USE_NEW_STEP
|
||||
stepperCtrl.requestStep(dir,1);
|
||||
#else
|
||||
if (dir)
|
||||
{
|
||||
stepsChanged++;
|
||||
}else
|
||||
{
|
||||
stepsChanged--;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void enableEIC(void)
|
||||
{
|
||||
PM->APBAMASK.reg |= PM_APBAMASK_EIC;
|
||||
if (EIC->CTRL.bit.ENABLE == 0)
|
||||
{
|
||||
// Enable GCLK for IEC (External Interrupt Controller)
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_EIC));
|
||||
|
||||
// Enable EIC
|
||||
EIC->CTRL.bit.ENABLE = 1;
|
||||
while (EIC->STATUS.bit.SYNCBUSY == 1) { }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void setupStepEvent(void)
|
||||
{
|
||||
//we will set up the EIC to generate an even on rising edge of step pin
|
||||
//make sure EIC is setup
|
||||
enableEIC();
|
||||
|
||||
|
||||
// Assign step pin to EIC
|
||||
// Step pin is PA11, EXTINT11
|
||||
pinPeripheral(PIN_STEP_INPUT, PIO_EXTINT);
|
||||
|
||||
//set up the direction pin PA10 to trigger external interrupt
|
||||
pinPeripheral(PIN_DIR_INPUT, PIO_EXTINT); //EXTINT10
|
||||
|
||||
|
||||
//***** setup EIC ******
|
||||
EIC->EVCTRL.bit.EXTINTEO11=1; //enable event for EXTINT11
|
||||
EIC->EVCTRL.bit.EXTINTEO10=1; //enable event for EXTINT10
|
||||
//setup up external interurpt 11 to be rising edge triggered
|
||||
//setup up external interurpt 10 to be both edge triggered
|
||||
EIC->CONFIG[1].reg |= EIC_CONFIG_SENSE3_RISE | EIC_CONFIG_SENSE2_HIGH;
|
||||
|
||||
checkDir();
|
||||
|
||||
//disable actually generating an interrupt, we only want event triggered
|
||||
EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT11;
|
||||
EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT10;
|
||||
|
||||
//**** setup the event system ***
|
||||
// Enable GCLK for EVSYS channel 0
|
||||
PM->APBCMASK.reg |= PM_APBCMASK_EVSYS;
|
||||
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_EVSYS_CHANNEL_0));
|
||||
while (GCLK->STATUS.bit.SYNCBUSY);
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_EVSYS_CHANNEL_1));
|
||||
while (GCLK->STATUS.bit.SYNCBUSY);
|
||||
|
||||
//setup the step pin to trigger event 0 on the TCC2 (step)
|
||||
EVSYS->CHANNEL.reg=EVSYS_CHANNEL_CHANNEL(0)
|
||||
| EVSYS_CHANNEL_EDGSEL_RISING_EDGE
|
||||
| EVSYS_CHANNEL_EVGEN(EVSYS_ID_GEN_EIC_EXTINT_11)
|
||||
| EVSYS_CHANNEL_PATH_ASYNCHRONOUS;
|
||||
|
||||
EVSYS->USER.reg = EVSYS_USER_CHANNEL(1)
|
||||
| EVSYS_USER_USER(EVSYS_ID_USER_TCC2_EV_0);
|
||||
|
||||
//setup the dir pin to trigger event 2 on the TCC2 (dir change)
|
||||
EVSYS->CHANNEL.reg=EVSYS_CHANNEL_CHANNEL(1)
|
||||
| EVSYS_CHANNEL_EDGSEL_BOTH_EDGES
|
||||
| EVSYS_CHANNEL_EVGEN(EVSYS_ID_GEN_EIC_EXTINT_10)
|
||||
| EVSYS_CHANNEL_PATH_ASYNCHRONOUS;
|
||||
|
||||
EVSYS->USER.reg = EVSYS_USER_CHANNEL(2)
|
||||
| EVSYS_USER_USER(EVSYS_ID_USER_TCC2_EV_1);
|
||||
|
||||
//**** setup the Timer counter ******
|
||||
PM->APBCMASK.reg |= PM_APBCMASK_TCC2;
|
||||
|
||||
// Enable GCLK for TCC2 (timer counter input clock)
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_TCC2_TC3));
|
||||
while (GCLK->STATUS.bit.SYNCBUSY);
|
||||
|
||||
|
||||
|
||||
TCC2->CTRLA.reg &= ~TCC_CTRLA_ENABLE;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
TCC2->CTRLA.reg= TCC_CTRLA_SWRST; //reset TCC2
|
||||
WAIT_TCC2_SYNC();
|
||||
while(TCC2->CTRLA.bit.SWRST ==1);
|
||||
|
||||
|
||||
//TCC2->WAVE.reg = TCC_WAVE_WAVEGEN_NFRQ;
|
||||
//WAIT_TCC2_SYNC();
|
||||
|
||||
TCC2->EVCTRL.reg=TCC_EVCTRL_EVACT0_COUNTEV | TCC_EVCTRL_TCEI0
|
||||
| TCC_EVCTRL_EVACT1_DIR | TCC_EVCTRL_TCEI1;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
|
||||
TCC2->COUNT.reg=0;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
//TCC2->CTRLBSET.bit.CMD=TCC_CTRLBSET_CMD_RETRIGGER;
|
||||
//checkDirPin();
|
||||
TCC2->CTRLBSET.bit.DIR=1;
|
||||
|
||||
WAIT_TCC2_SYNC();
|
||||
TCC2->CTRLA.reg |=TCC_CTRLA_ENABLE;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
|
||||
//checkDirPin();
|
||||
|
||||
//
|
||||
// TC4->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 // Set Timer counter Mode to 16 bits
|
||||
// | TC_CTRLA_WAVEGEN_NFRQ //normal counting mode (not using waveforms)
|
||||
// | TC_CTRLA_PRESCALER_DIV1; //count each pulse
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
//
|
||||
// TC4->COUNT16.CTRLBCLR.reg=0xFF; //clear all values.
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
//
|
||||
// TC4->COUNT16.EVCTRL.reg=TC_EVCTRL_TCEI | TC_EVCTRL_EVACT_COUNT; //enable event input and count
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
//
|
||||
// TC4->COUNT16.COUNT.reg=0;
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
//
|
||||
// TC4->COUNT16.INTENSET.bit.OVF = 1; //enable over/under flow interrupt
|
||||
// //setup the TC overflow/underflow interrupt
|
||||
// NVIC_SetPriority(TC4_IRQn, 0);
|
||||
// // Enable InterruptVector
|
||||
// NVIC_EnableIRQ(TC4_IRQn);
|
||||
//
|
||||
//
|
||||
// // Enable TC
|
||||
// TC4->COUNT16.CTRLA.reg |= TC_CTRLA_ENABLE;
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
}
|
||||
|
||||
//static void dirChanged_ISR(void)
|
||||
//{
|
||||
// int dir=0;
|
||||
// //read our direction pin
|
||||
// //dir = digitalRead(PIN_DIR_INPUT);
|
||||
// if ( (PORT->Group[g_APinDescription[PIN_DIR_INPUT].ulPort].IN.reg & (1ul << g_APinDescription[PIN_DIR_INPUT].ulPin)) != 0 )
|
||||
// {
|
||||
// dir=1;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// if (CW_ROTATION == NVM->SystemParams.dirPinRotation)
|
||||
// {
|
||||
// dir=!dir; //reverse the rotation
|
||||
// }
|
||||
// if (dir)
|
||||
// {
|
||||
// TC4->COUNT16.CTRLBSET.bit.DIR=1;
|
||||
// } else
|
||||
// {
|
||||
// TC4->COUNT16.CTRLBCLR.bit.DIR=1;
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
void stepPinSetup(void)
|
||||
{
|
||||
|
||||
|
||||
#ifdef USE_TC_STEP
|
||||
|
||||
// //setup the direction pin
|
||||
// dirChanged_ISR();
|
||||
//
|
||||
// //attachInterrupt configures the EIC as highest priority interrupts.
|
||||
// attachInterrupt(digitalPinToInterrupt(PIN_DIR_INPUT), dirChanged_ISR, CHANGE);
|
||||
setupStepEvent();
|
||||
// NVIC_SetPriority(EIC_IRQn, 1); //set port A interrupt as highest priority
|
||||
|
||||
|
||||
#else
|
||||
attachInterrupt(digitalPinToInterrupt(PIN_STEP_INPUT), stepInput, RISING);
|
||||
NVIC_SetPriority(EIC_IRQn, 0); //set port A interrupt as highest priority
|
||||
#endif
|
||||
|
||||
}
|
||||
/*
|
||||
* Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*/
|
||||
#include "steppin.h"
|
||||
#include "stepper_controller.h"
|
||||
#include "wiring_private.h"
|
||||
#include "Arduino.h"
|
||||
|
||||
extern StepperCtrl stepperCtrl;
|
||||
|
||||
volatile int32_t stepsChanged=0;
|
||||
volatile int64_t steps=0;
|
||||
|
||||
|
||||
#if (PIN_STEP_INPUT != 0)
|
||||
#error "this code only works with step pin being D0 (PA11, EXTINT11)"
|
||||
#endif
|
||||
|
||||
|
||||
#define WAIT_TCC2_SYNC() while(TCC2->SYNCBUSY.reg)
|
||||
|
||||
void checkDir(void)
|
||||
{
|
||||
int dir=1;
|
||||
static int lastDir=-1;
|
||||
|
||||
|
||||
if (CW_ROTATION == NVM->SystemParams.dirPinRotation)
|
||||
{
|
||||
dir=0; //reverse the rotation
|
||||
}
|
||||
|
||||
if (lastDir != dir)
|
||||
{
|
||||
if (dir)
|
||||
{
|
||||
EIC->CONFIG[1].reg &= ~EIC_CONFIG_SENSE2_Msk;
|
||||
EIC->CONFIG[1].reg |= EIC_CONFIG_SENSE2_HIGH;
|
||||
|
||||
} else
|
||||
{
|
||||
EIC->CONFIG[1].reg &= ~EIC_CONFIG_SENSE2_Msk;
|
||||
EIC->CONFIG[1].reg |= EIC_CONFIG_SENSE2_LOW;
|
||||
}
|
||||
lastDir=dir;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//this function can not be called in interrupt context as the overflow interrupt for tC4 needs to run.
|
||||
int64_t getSteps(void)
|
||||
{
|
||||
|
||||
//#ifndef USE_NEW_STEP
|
||||
// return 0;
|
||||
//#endif
|
||||
int64_t x;
|
||||
#ifdef USE_TC_STEP
|
||||
uint16_t y;
|
||||
static uint16_t lasty=0;
|
||||
|
||||
TCC2->CTRLBSET.reg=TCC_CTRLBSET_CMD_READSYNC;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
|
||||
y=(uint16_t)(TCC2->COUNT.reg & 0x0FFFFul); //use only lowest 16bits
|
||||
//LOG("count is %d",y);
|
||||
steps += (int16_t)(y-lasty);
|
||||
lasty=y;
|
||||
|
||||
checkDir();
|
||||
return steps;
|
||||
|
||||
#else
|
||||
EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT11;
|
||||
x=stepsChanged;
|
||||
stepsChanged=0;
|
||||
EIC->INTENSET.reg = EIC_INTENSET_EXTINT11;
|
||||
return x;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//this function is called on the rising edge of a step from external device
|
||||
static void stepInput(void)
|
||||
{
|
||||
static int dir;
|
||||
|
||||
//read our direction pin
|
||||
dir = digitalRead(PIN_DIR_INPUT);
|
||||
|
||||
if (CW_ROTATION == NVM->SystemParams.dirPinRotation)
|
||||
{
|
||||
dir=!dir; //reverse the rotation
|
||||
}
|
||||
|
||||
#ifndef USE_NEW_STEP
|
||||
stepperCtrl.requestStep(dir,1);
|
||||
#else
|
||||
if (dir)
|
||||
{
|
||||
stepsChanged++;
|
||||
}else
|
||||
{
|
||||
stepsChanged--;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void enableEIC(void)
|
||||
{
|
||||
PM->APBAMASK.reg |= PM_APBAMASK_EIC;
|
||||
if (EIC->CTRL.bit.ENABLE == 0)
|
||||
{
|
||||
// Enable GCLK for IEC (External Interrupt Controller)
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_EIC));
|
||||
|
||||
// Enable EIC
|
||||
EIC->CTRL.bit.ENABLE = 1;
|
||||
while (EIC->STATUS.bit.SYNCBUSY == 1) { }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void setupStepEvent(void)
|
||||
{
|
||||
//we will set up the EIC to generate an even on rising edge of step pin
|
||||
//make sure EIC is setup
|
||||
enableEIC();
|
||||
|
||||
|
||||
// Assign step pin to EIC
|
||||
// Step pin is PA11, EXTINT11
|
||||
pinPeripheral(PIN_STEP_INPUT, PIO_EXTINT);
|
||||
|
||||
//set up the direction pin PA10 to trigger external interrupt
|
||||
pinPeripheral(PIN_DIR_INPUT, PIO_EXTINT); //EXTINT10
|
||||
|
||||
|
||||
//***** setup EIC ******
|
||||
EIC->EVCTRL.bit.EXTINTEO11=1; //enable event for EXTINT11
|
||||
EIC->EVCTRL.bit.EXTINTEO10=1; //enable event for EXTINT10
|
||||
//setup up external interurpt 11 to be rising edge triggered
|
||||
//setup up external interurpt 10 to be both edge triggered
|
||||
EIC->CONFIG[1].reg |= EIC_CONFIG_SENSE3_RISE | EIC_CONFIG_SENSE2_HIGH;
|
||||
|
||||
checkDir();
|
||||
|
||||
//disable actually generating an interrupt, we only want event triggered
|
||||
EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT11;
|
||||
EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT10;
|
||||
|
||||
//**** setup the event system ***
|
||||
// Enable GCLK for EVSYS channel 0
|
||||
PM->APBCMASK.reg |= PM_APBCMASK_EVSYS;
|
||||
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_EVSYS_CHANNEL_0));
|
||||
while (GCLK->STATUS.bit.SYNCBUSY);
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_EVSYS_CHANNEL_1));
|
||||
while (GCLK->STATUS.bit.SYNCBUSY);
|
||||
|
||||
//setup the step pin to trigger event 0 on the TCC2 (step)
|
||||
EVSYS->CHANNEL.reg=EVSYS_CHANNEL_CHANNEL(0)
|
||||
| EVSYS_CHANNEL_EDGSEL_RISING_EDGE
|
||||
| EVSYS_CHANNEL_EVGEN(EVSYS_ID_GEN_EIC_EXTINT_11)
|
||||
| EVSYS_CHANNEL_PATH_ASYNCHRONOUS;
|
||||
|
||||
EVSYS->USER.reg = EVSYS_USER_CHANNEL(1)
|
||||
| EVSYS_USER_USER(EVSYS_ID_USER_TCC2_EV_0);
|
||||
|
||||
//setup the dir pin to trigger event 2 on the TCC2 (dir change)
|
||||
EVSYS->CHANNEL.reg=EVSYS_CHANNEL_CHANNEL(1)
|
||||
| EVSYS_CHANNEL_EDGSEL_BOTH_EDGES
|
||||
| EVSYS_CHANNEL_EVGEN(EVSYS_ID_GEN_EIC_EXTINT_10)
|
||||
| EVSYS_CHANNEL_PATH_ASYNCHRONOUS;
|
||||
|
||||
EVSYS->USER.reg = EVSYS_USER_CHANNEL(2)
|
||||
| EVSYS_USER_USER(EVSYS_ID_USER_TCC2_EV_1);
|
||||
|
||||
//**** setup the Timer counter ******
|
||||
PM->APBCMASK.reg |= PM_APBCMASK_TCC2;
|
||||
|
||||
// Enable GCLK for TCC2 (timer counter input clock)
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_TCC2_TC3));
|
||||
while (GCLK->STATUS.bit.SYNCBUSY);
|
||||
|
||||
|
||||
|
||||
TCC2->CTRLA.reg &= ~TCC_CTRLA_ENABLE;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
TCC2->CTRLA.reg= TCC_CTRLA_SWRST; //reset TCC2
|
||||
WAIT_TCC2_SYNC();
|
||||
while(TCC2->CTRLA.bit.SWRST ==1);
|
||||
|
||||
|
||||
//TCC2->WAVE.reg = TCC_WAVE_WAVEGEN_NFRQ;
|
||||
//WAIT_TCC2_SYNC();
|
||||
|
||||
TCC2->EVCTRL.reg=TCC_EVCTRL_EVACT0_COUNTEV | TCC_EVCTRL_TCEI0
|
||||
| TCC_EVCTRL_EVACT1_DIR | TCC_EVCTRL_TCEI1;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
|
||||
TCC2->COUNT.reg=0;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
//TCC2->CTRLBSET.bit.CMD=TCC_CTRLBSET_CMD_RETRIGGER;
|
||||
//checkDirPin();
|
||||
TCC2->CTRLBSET.bit.DIR=1;
|
||||
|
||||
WAIT_TCC2_SYNC();
|
||||
TCC2->CTRLA.reg |=TCC_CTRLA_ENABLE;
|
||||
WAIT_TCC2_SYNC();
|
||||
|
||||
|
||||
//checkDirPin();
|
||||
|
||||
//
|
||||
// TC4->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 // Set Timer counter Mode to 16 bits
|
||||
// | TC_CTRLA_WAVEGEN_NFRQ //normal counting mode (not using waveforms)
|
||||
// | TC_CTRLA_PRESCALER_DIV1; //count each pulse
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
//
|
||||
// TC4->COUNT16.CTRLBCLR.reg=0xFF; //clear all values.
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
//
|
||||
// TC4->COUNT16.EVCTRL.reg=TC_EVCTRL_TCEI | TC_EVCTRL_EVACT_COUNT; //enable event input and count
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
//
|
||||
// TC4->COUNT16.COUNT.reg=0;
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
//
|
||||
// TC4->COUNT16.INTENSET.bit.OVF = 1; //enable over/under flow interrupt
|
||||
// //setup the TC overflow/underflow interrupt
|
||||
// NVIC_SetPriority(TC4_IRQn, 0);
|
||||
// // Enable InterruptVector
|
||||
// NVIC_EnableIRQ(TC4_IRQn);
|
||||
//
|
||||
//
|
||||
// // Enable TC
|
||||
// TC4->COUNT16.CTRLA.reg |= TC_CTRLA_ENABLE;
|
||||
// WAIT_TC32_REGS_SYNC(TC4)
|
||||
}
|
||||
|
||||
//static void dirChanged_ISR(void)
|
||||
//{
|
||||
// int dir=0;
|
||||
// //read our direction pin
|
||||
// //dir = digitalRead(PIN_DIR_INPUT);
|
||||
// if ( (PORT->Group[g_APinDescription[PIN_DIR_INPUT].ulPort].IN.reg & (1ul << g_APinDescription[PIN_DIR_INPUT].ulPin)) != 0 )
|
||||
// {
|
||||
// dir=1;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// if (CW_ROTATION == NVM->SystemParams.dirPinRotation)
|
||||
// {
|
||||
// dir=!dir; //reverse the rotation
|
||||
// }
|
||||
// if (dir)
|
||||
// {
|
||||
// TC4->COUNT16.CTRLBSET.bit.DIR=1;
|
||||
// } else
|
||||
// {
|
||||
// TC4->COUNT16.CTRLBCLR.bit.DIR=1;
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
void stepPinSetup(void)
|
||||
{
|
||||
|
||||
|
||||
#ifdef USE_TC_STEP
|
||||
|
||||
// //setup the direction pin
|
||||
// dirChanged_ISR();
|
||||
//
|
||||
// //attachInterrupt configures the EIC as highest priority interrupts.
|
||||
// attachInterrupt(digitalPinToInterrupt(PIN_DIR_INPUT), dirChanged_ISR, CHANGE);
|
||||
setupStepEvent();
|
||||
// NVIC_SetPriority(EIC_IRQn, 1); //set port A interrupt as highest priority
|
||||
|
||||
|
||||
#else
|
||||
attachInterrupt(digitalPinToInterrupt(PIN_STEP_INPUT), stepInput, RISING);
|
||||
NVIC_SetPriority(EIC_IRQn, 0); //set port A interrupt as highest priority
|
||||
#endif
|
||||
|
||||
}
|
||||
|
@ -1,31 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*/
|
||||
#ifndef __STEPPIN_H___
|
||||
#define __STEPPIN_H___
|
||||
#include "board.h"
|
||||
|
||||
void stepPinSetup(void); //setup step pin
|
||||
|
||||
int64_t getSteps(void); //returns the number of steps changed since last call
|
||||
|
||||
|
||||
#endif // __STEPPIN_H___
|
||||
/*
|
||||
* Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*/
|
||||
#ifndef __STEPPIN_H___
|
||||
#define __STEPPIN_H___
|
||||
#include "board.h"
|
||||
|
||||
void stepPinSetup(void); //setup step pin
|
||||
|
||||
int64_t getSteps(void); //returns the number of steps changed since last call
|
||||
|
||||
|
||||
#endif // __STEPPIN_H___
|
||||
|
@ -1,243 +1,243 @@
|
||||
/*
|
||||
* syslog.c
|
||||
*
|
||||
* Created on: Sep 14, 2011
|
||||
* Author: trampas.stern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "syslog.h"
|
||||
#include <Arduino.h>
|
||||
#include "board.h"
|
||||
|
||||
|
||||
#define ANSI_WHITE "\033[37m"
|
||||
#define ANSI_NORMAL "\033[0m"
|
||||
#define ANSI_BLINK "\033[5m"
|
||||
#define ANSI_BLUE "\033[34m"
|
||||
#define ANSI_MAGENTA "\033[35m"
|
||||
#define ANSI_CYAN "\033[36m"
|
||||
#define ANSI_WHITE "\033[37m"
|
||||
#define ANSI_RED "\033[31m"
|
||||
#define ANSI_GREEN "\033[32m"
|
||||
#define ANSI_PINK "\033[35m\033[1m"
|
||||
#define ANSI_BROWN "\033[33m"
|
||||
#define ANSI_YELLOW "\033[33m\033[1m"
|
||||
#define ANSI_BLACK "\033[30m"
|
||||
#define ANSI_BELL_AND_RED "\a\033[31m"
|
||||
|
||||
#define NEW_LINE "\n\r"
|
||||
|
||||
Stream *ptrSerial=NULL;
|
||||
eLogLevel SyslogLevelToWrite;
|
||||
|
||||
bool DebugUART=false;
|
||||
static char buffer[SYSLOG_BUFFER_SIZE];
|
||||
static unsigned int BufIndex=0;
|
||||
|
||||
static int SysLog_Enabled=1;
|
||||
|
||||
int SysLogDisable(void)
|
||||
{
|
||||
SysLog_Enabled=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SysLogEnable(void)
|
||||
{
|
||||
SysLog_Enabled=1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SysLogIsEnabled(void)
|
||||
{
|
||||
return SysLog_Enabled;
|
||||
}
|
||||
void SysLogDebug(bool x)
|
||||
{
|
||||
DebugUART=x;
|
||||
}
|
||||
|
||||
void SysLogPuts(const char *ptrStr)
|
||||
{
|
||||
if (!SysLog_Enabled)
|
||||
return;
|
||||
|
||||
if (NULL == ptrSerial)
|
||||
{
|
||||
while(*ptrStr)
|
||||
{
|
||||
|
||||
SYSLOG_PUTC(*ptrStr);
|
||||
ptrStr++;
|
||||
}
|
||||
} else
|
||||
{
|
||||
ptrSerial->write(ptrStr);
|
||||
}
|
||||
#ifndef MECHADUINO_HARDWARE
|
||||
if (DebugUART)
|
||||
{
|
||||
SerialUSB.write(ptrStr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int SysLogInitDone=0;
|
||||
void SysLogInit(Stream *ptrSerialObj, eLogLevel LevelToWrite)
|
||||
{
|
||||
ptrSerial=ptrSerialObj;
|
||||
SyslogLevelToWrite=LevelToWrite;
|
||||
|
||||
SysLogInitDone=1;
|
||||
BufIndex=0;
|
||||
memset(buffer,0,SYSLOG_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
|
||||
int SysLogProcessing=0; // this is used such that syslog can be reentrent
|
||||
int SysLogMissed=0;
|
||||
|
||||
|
||||
void SysLog(eLogLevel priorty, const char *fmt, ...)
|
||||
{
|
||||
//UINT32 ret;
|
||||
int previousState=SysLog_Enabled;
|
||||
char vastr[MAX_SYSLOG_STRING]={0};
|
||||
//char outstr[MAX_SYSLOG_STRING]={0};
|
||||
|
||||
|
||||
va_list ap;
|
||||
|
||||
if (SysLogProcessing)
|
||||
{
|
||||
//we have a syslog from a syslog call thus return as not much we can do...
|
||||
//memset(buffer,0,SYSLOG_BUFFER_SIZE);
|
||||
va_start(ap,fmt);
|
||||
vsnprintf(&buffer[BufIndex],SYSLOG_BUFFER_SIZE-BufIndex,(char *)fmt,ap);
|
||||
BufIndex=strlen(buffer);
|
||||
snprintf(&buffer[BufIndex],SYSLOG_BUFFER_SIZE-BufIndex,NEW_LINE);
|
||||
BufIndex=strlen(buffer);
|
||||
SysLogMissed++; //set flag that we missed a call
|
||||
return;
|
||||
}
|
||||
|
||||
SysLogProcessing=1;
|
||||
|
||||
//stop the watch dog will doing a SysLog print
|
||||
Sys_WDogHoldOn();
|
||||
|
||||
if(!SysLogInitDone)
|
||||
{
|
||||
SysLogInit(NULL, LOG_WARNING); //not sure who is reseting serial port but before we print set it up
|
||||
WARNING("You should init SysLog");
|
||||
//SysLogInitDone=0;
|
||||
}
|
||||
|
||||
//Send out a * that we missed a SysLog Message before this current message
|
||||
if (SysLogMissed)
|
||||
{
|
||||
//SysLogPuts(ANSI_RED);
|
||||
SysLogPuts("*** Reentrant Log call possible loss of message(s):");
|
||||
SysLogPuts(NEW_LINE);
|
||||
if (BufIndex>0)
|
||||
{
|
||||
SysLogPuts(buffer);
|
||||
memset(buffer,0,SYSLOG_BUFFER_SIZE);
|
||||
BufIndex=0;
|
||||
}
|
||||
//SysLogPuts(ANSI_RED);
|
||||
SysLogPuts("***********");
|
||||
SysLogPuts(NEW_LINE);
|
||||
SysLogMissed=0;
|
||||
}
|
||||
memset(vastr,0,MAX_SYSLOG_STRING);
|
||||
va_start(ap,fmt);
|
||||
//#ifndef PGM_P
|
||||
#if 1
|
||||
vsnprintf(vastr,MAX_SYSLOG_STRING,(char *)fmt,ap);
|
||||
#else
|
||||
vsprintf_P(vastr,(const char *)fmt,ap);
|
||||
#endif
|
||||
//get time and store in datetimestr if desired
|
||||
//sprintf(outstr, "[%s] %s\r\n", datetimestr, vastr);
|
||||
|
||||
|
||||
|
||||
if (priorty<=LOG_ERROR)
|
||||
{
|
||||
SysLog_Enabled=1;
|
||||
SysLogPuts(ANSI_RED);
|
||||
|
||||
}else if (priorty==LOG_DEBUG)
|
||||
{
|
||||
SysLogPuts(ANSI_WHITE);
|
||||
}else if (priorty==LOG_WARNING)
|
||||
{
|
||||
SysLogPuts(ANSI_BLUE);
|
||||
}
|
||||
|
||||
#ifdef RTC_H_
|
||||
#ifdef TIME_H_
|
||||
{
|
||||
struct tm tp;
|
||||
RTC_Time_s tm;
|
||||
time_t secs;
|
||||
char datetimestr[MAX_SYSLOG_STRING]={0};
|
||||
|
||||
RTC_ReadTime(&tm);
|
||||
secs=tm.seconds;
|
||||
convertFlexNetTime((time_t *)&secs, &tp);
|
||||
time_str(datetimestr,&tp);
|
||||
SysLogPuts(datetimestr);
|
||||
|
||||
if (priorty<=SyslogLevelToWrite && SysLogWriteFunc!=NULL)
|
||||
{
|
||||
SysLogWriteFunc(datetimestr,strlen(datetimestr));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
SysLogPuts(vastr);
|
||||
//
|
||||
// if (priorty<=SyslogLevelToWrite && SysLogWriteFunc!=NULL)
|
||||
// {
|
||||
// SysLogWriteFunc(vastr,strlen(vastr));
|
||||
// SysLogWriteFunc(NEW_LINE,strlen(NEW_LINE));
|
||||
// }
|
||||
|
||||
|
||||
SysLogPuts(ANSI_NORMAL);
|
||||
SysLogPuts(NEW_LINE);
|
||||
|
||||
|
||||
|
||||
if (priorty == LOG_EMERG) {
|
||||
//you can reboot processor here
|
||||
}
|
||||
|
||||
//start the watch dog where left off..
|
||||
Sys_WDogHoldOff();
|
||||
SysLogProcessing=0;
|
||||
SysLog_Enabled=previousState;
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* syslog.c
|
||||
*
|
||||
* Created on: Sep 14, 2011
|
||||
* Author: trampas.stern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
#include "syslog.h"
|
||||
#include <Arduino.h>
|
||||
#include "board.h"
|
||||
|
||||
|
||||
#define ANSI_WHITE "\033[37m"
|
||||
#define ANSI_NORMAL "\033[0m"
|
||||
#define ANSI_BLINK "\033[5m"
|
||||
#define ANSI_BLUE "\033[34m"
|
||||
#define ANSI_MAGENTA "\033[35m"
|
||||
#define ANSI_CYAN "\033[36m"
|
||||
#define ANSI_WHITE "\033[37m"
|
||||
#define ANSI_RED "\033[31m"
|
||||
#define ANSI_GREEN "\033[32m"
|
||||
#define ANSI_PINK "\033[35m\033[1m"
|
||||
#define ANSI_BROWN "\033[33m"
|
||||
#define ANSI_YELLOW "\033[33m\033[1m"
|
||||
#define ANSI_BLACK "\033[30m"
|
||||
#define ANSI_BELL_AND_RED "\a\033[31m"
|
||||
|
||||
#define NEW_LINE "\n\r"
|
||||
|
||||
Stream *ptrSerial=NULL;
|
||||
eLogLevel SyslogLevelToWrite;
|
||||
|
||||
bool DebugUART=false;
|
||||
static char buffer[SYSLOG_BUFFER_SIZE];
|
||||
static unsigned int BufIndex=0;
|
||||
|
||||
static int SysLog_Enabled=1;
|
||||
|
||||
int SysLogDisable(void)
|
||||
{
|
||||
SysLog_Enabled=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SysLogEnable(void)
|
||||
{
|
||||
SysLog_Enabled=1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SysLogIsEnabled(void)
|
||||
{
|
||||
return SysLog_Enabled;
|
||||
}
|
||||
void SysLogDebug(bool x)
|
||||
{
|
||||
DebugUART=x;
|
||||
}
|
||||
|
||||
void SysLogPuts(const char *ptrStr)
|
||||
{
|
||||
if (!SysLog_Enabled)
|
||||
return;
|
||||
|
||||
if (NULL == ptrSerial)
|
||||
{
|
||||
while(*ptrStr)
|
||||
{
|
||||
|
||||
SYSLOG_PUTC(*ptrStr);
|
||||
ptrStr++;
|
||||
}
|
||||
} else
|
||||
{
|
||||
ptrSerial->write(ptrStr);
|
||||
}
|
||||
#ifndef MECHADUINO_HARDWARE
|
||||
if (DebugUART)
|
||||
{
|
||||
SerialUSB.write(ptrStr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int SysLogInitDone=0;
|
||||
void SysLogInit(Stream *ptrSerialObj, eLogLevel LevelToWrite)
|
||||
{
|
||||
ptrSerial=ptrSerialObj;
|
||||
SyslogLevelToWrite=LevelToWrite;
|
||||
|
||||
SysLogInitDone=1;
|
||||
BufIndex=0;
|
||||
memset(buffer,0,SYSLOG_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
|
||||
int SysLogProcessing=0; // this is used such that syslog can be reentrent
|
||||
int SysLogMissed=0;
|
||||
|
||||
|
||||
void SysLog(eLogLevel priorty, const char *fmt, ...)
|
||||
{
|
||||
//UINT32 ret;
|
||||
int previousState=SysLog_Enabled;
|
||||
char vastr[MAX_SYSLOG_STRING]={0};
|
||||
//char outstr[MAX_SYSLOG_STRING]={0};
|
||||
|
||||
|
||||
va_list ap;
|
||||
|
||||
if (SysLogProcessing)
|
||||
{
|
||||
//we have a syslog from a syslog call thus return as not much we can do...
|
||||
//memset(buffer,0,SYSLOG_BUFFER_SIZE);
|
||||
va_start(ap,fmt);
|
||||
vsnprintf(&buffer[BufIndex],SYSLOG_BUFFER_SIZE-BufIndex,(char *)fmt,ap);
|
||||
BufIndex=strlen(buffer);
|
||||
snprintf(&buffer[BufIndex],SYSLOG_BUFFER_SIZE-BufIndex,NEW_LINE);
|
||||
BufIndex=strlen(buffer);
|
||||
SysLogMissed++; //set flag that we missed a call
|
||||
return;
|
||||
}
|
||||
|
||||
SysLogProcessing=1;
|
||||
|
||||
//stop the watch dog will doing a SysLog print
|
||||
Sys_WDogHoldOn();
|
||||
|
||||
if(!SysLogInitDone)
|
||||
{
|
||||
SysLogInit(NULL, LOG_WARNING); //not sure who is reseting serial port but before we print set it up
|
||||
WARNING("You should init SysLog");
|
||||
//SysLogInitDone=0;
|
||||
}
|
||||
|
||||
//Send out a * that we missed a SysLog Message before this current message
|
||||
if (SysLogMissed)
|
||||
{
|
||||
//SysLogPuts(ANSI_RED);
|
||||
SysLogPuts("*** Reentrant Log call possible loss of message(s):");
|
||||
SysLogPuts(NEW_LINE);
|
||||
if (BufIndex>0)
|
||||
{
|
||||
SysLogPuts(buffer);
|
||||
memset(buffer,0,SYSLOG_BUFFER_SIZE);
|
||||
BufIndex=0;
|
||||
}
|
||||
//SysLogPuts(ANSI_RED);
|
||||
SysLogPuts("***********");
|
||||
SysLogPuts(NEW_LINE);
|
||||
SysLogMissed=0;
|
||||
}
|
||||
memset(vastr,0,MAX_SYSLOG_STRING);
|
||||
va_start(ap,fmt);
|
||||
//#ifndef PGM_P
|
||||
#if 1
|
||||
vsnprintf(vastr,MAX_SYSLOG_STRING,(char *)fmt,ap);
|
||||
#else
|
||||
vsprintf_P(vastr,(const char *)fmt,ap);
|
||||
#endif
|
||||
//get time and store in datetimestr if desired
|
||||
//sprintf(outstr, "[%s] %s\r\n", datetimestr, vastr);
|
||||
|
||||
|
||||
|
||||
if (priorty<=LOG_ERROR)
|
||||
{
|
||||
SysLog_Enabled=1;
|
||||
SysLogPuts(ANSI_RED);
|
||||
|
||||
}else if (priorty==LOG_DEBUG)
|
||||
{
|
||||
SysLogPuts(ANSI_WHITE);
|
||||
}else if (priorty==LOG_WARNING)
|
||||
{
|
||||
SysLogPuts(ANSI_BLUE);
|
||||
}
|
||||
|
||||
#ifdef RTC_H_
|
||||
#ifdef TIME_H_
|
||||
{
|
||||
struct tm tp;
|
||||
RTC_Time_s tm;
|
||||
time_t secs;
|
||||
char datetimestr[MAX_SYSLOG_STRING]={0};
|
||||
|
||||
RTC_ReadTime(&tm);
|
||||
secs=tm.seconds;
|
||||
convertFlexNetTime((time_t *)&secs, &tp);
|
||||
time_str(datetimestr,&tp);
|
||||
SysLogPuts(datetimestr);
|
||||
|
||||
if (priorty<=SyslogLevelToWrite && SysLogWriteFunc!=NULL)
|
||||
{
|
||||
SysLogWriteFunc(datetimestr,strlen(datetimestr));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
SysLogPuts(vastr);
|
||||
//
|
||||
// if (priorty<=SyslogLevelToWrite && SysLogWriteFunc!=NULL)
|
||||
// {
|
||||
// SysLogWriteFunc(vastr,strlen(vastr));
|
||||
// SysLogWriteFunc(NEW_LINE,strlen(NEW_LINE));
|
||||
// }
|
||||
|
||||
|
||||
SysLogPuts(ANSI_NORMAL);
|
||||
SysLogPuts(NEW_LINE);
|
||||
|
||||
|
||||
|
||||
if (priorty == LOG_EMERG) {
|
||||
//you can reboot processor here
|
||||
}
|
||||
|
||||
//start the watch dog where left off..
|
||||
Sys_WDogHoldOff();
|
||||
SysLogProcessing=0;
|
||||
SysLog_Enabled=previousState;
|
||||
return;
|
||||
}
|
||||
|
@ -1,210 +1,210 @@
|
||||
/*
|
||||
* syslog.h
|
||||
*
|
||||
* Created on: Sep 14, 2011
|
||||
* Author: trampas.stern
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef SYSLOG_H_
|
||||
#define SYSLOG_H_
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "Arduino.h"
|
||||
#include "variant.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif // __cplusplus
|
||||
|
||||
#define SYSLOG_BUFFER_SIZE (250)
|
||||
|
||||
#define MAX_SYSLOG_STRING (250)
|
||||
#define __FILENAME1__ (__builtin_strrchr(__FILE__, '\\') ? __builtin_strrchr(__FILE__, '\\') + 1 : __FILE__)
|
||||
#define __FILENAME__ (__builtin_strrchr(__FILENAME1__, '/') ? __builtin_strrchr(__FILENAME1__, '/') + 1 : __FILENAME1__)
|
||||
|
||||
#define SYSLOG_WRITE(buffer,nBytes)
|
||||
|
||||
#ifdef CMD_SERIAL_PORT
|
||||
#define SYSLOG_PUTC(x)
|
||||
#else
|
||||
#define SYSLOG_PUTC(x) //SerialUSB.write(x)
|
||||
#endif
|
||||
|
||||
#define Sys_WDogHoldOn()
|
||||
#define Sys_WDogHoldOff()
|
||||
/*
|
||||
* priorities/facilities are encoded into a single 32-bit quantity, where the
|
||||
* bottom 3 bits are the priority (0-7) and the top 28 bits are the facility
|
||||
* (0-big number). Both the priorities and the facilities map roughly
|
||||
* one-to-one to strings in the syslogd(8) source code. This mapping is
|
||||
* included in this file.
|
||||
*
|
||||
* priorities (these are ordered)
|
||||
*/
|
||||
|
||||
typedef enum _eLogLevel {
|
||||
LOG_EMERG = 0, // system is unusable
|
||||
LOG_ALERT = 1, // action must be taken immediately
|
||||
LOG_CRIT = 2, // critical conditions
|
||||
LOG_ERROR = 3, // error conditions
|
||||
LOG_WARNING = 4, // warning conditions
|
||||
LOG_NOTICE = 5, // normal but significant condition
|
||||
LOG_INFO = 6, // informational
|
||||
LOG_DEBUG = 7, // debug-level messages
|
||||
LOG_DISABLED = 8 // disabled messages
|
||||
} eLogLevel;
|
||||
|
||||
#if 0
|
||||
#define CONCAT(x, y) CONCAT_(x, y)
|
||||
#define CONCAT_(x, y) x##y
|
||||
|
||||
#define ID(...) __VA_ARGS__
|
||||
|
||||
#define IFMULTIARG(if,then,else) \
|
||||
CONCAT(IFMULTIARG_, IFMULTIARG_(if, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 0, ))(then,else)
|
||||
#define IFMULTIARG_(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \
|
||||
_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \
|
||||
_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \
|
||||
_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \
|
||||
_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \
|
||||
_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \
|
||||
_60, _61, _62, _63, ...) _63
|
||||
#define IFMULTIARG_0(then, else) else
|
||||
#define IFMULTIARG_1(then, else) then
|
||||
|
||||
#define PROVIDE_SECOND_ARGUMENT(x, ...) CONCAT( IFMULTIARG(ID(__VA_ARGS__), INSERT_, ADD_), SECOND_ARGUMENT ) (x, __VA_ARGS__)
|
||||
#define PROVIDE_SECOND_ARGUMENT2(x, y, ...) CONCAT( IFMULTIARG(ID(__VA_ARGS__), INSERT_, ADD_), SECOND_ARGUMENT2 ) (x, y, __VA_ARGS__)
|
||||
|
||||
#define ADD_SECOND_ARGUMENT(x, y) y, x
|
||||
#define INSERT_SECOND_ARGUMENT(x, y, ...) y, x, __VA_ARGS__
|
||||
|
||||
#define ADD_SECOND_ARGUMENT2(x, z, y) y, x, z
|
||||
#define INSERT_SECOND_ARGUMENT2(x, z, y, ...) y, x, z, __VA_ARGS__
|
||||
|
||||
#endif
|
||||
//#define DEBUG1(...) printf( "DEBUG %s %s: "
|
||||
//PROVIDE_SECOND_ARGUMENT2(__FILE__, __LINE__, __VA_ARGS__))
|
||||
|
||||
|
||||
//TXT(x) macro is used for system which can store strings in flash, like AVR processors
|
||||
#ifndef TXT
|
||||
#define TXT(x) x
|
||||
#endif
|
||||
|
||||
void SysLog(eLogLevel priorty, const char *fmt, ...);
|
||||
|
||||
|
||||
|
||||
static inline const char * __file__( const char *filename ) {
|
||||
char const *p = strrchr( filename, '/' );
|
||||
if ( p )
|
||||
return p+1;
|
||||
else
|
||||
return filename;
|
||||
} // __file__
|
||||
|
||||
|
||||
//These macros abstract the logging and append the file and line number to errors.
|
||||
#ifndef SYSLOG_DISABLE
|
||||
//#ifndef PGM_P
|
||||
#if 1
|
||||
//EMERG means system is unstable thus will force a reboot!
|
||||
#define EMERG(fmt, ...) SysLog( LOG_EMERG, "EMERG: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define ALERT(fmt, ...) SysLog( LOG_ALERT, "ALERT: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define CRITICAL(fmt, ...) SysLog( LOG_CRIT, "CRITICAL: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define ERROR(fmt, ...) SysLog( LOG_ERROR, "ERROR: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define WARNING(fmt, ...) SysLog( LOG_WARNING, "WARNING: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define NOTICE(fmt, ...) SysLog( LOG_NOTICE, "NOTICE: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define INFO(fmt, ...) SysLog( LOG_INFO, "INFO: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define LOG(fmt, ...) SysLog( LOG_DEBUG, "%s %4d: " fmt, __FILENAME__ , __LINE__, ## __VA_ARGS__ )
|
||||
//
|
||||
//#define EMERG(...) SysLog( LOG_EMERG, "EMERG: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define ALERT(...) SysLog( LOG_ALERT, "ALERT: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define CRITICAL(...) SysLog( LOG_CRIT, "CRITICAL: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define ERROR(...) SysLog( LOG_ERROR, "ERROR: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define WARNING(...) SysLog( LOG_WARNING, "WARNING: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define NOTICE(...) SysLog( LOG_NOTICE, "NOTICE: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define INFO(...) SysLog( LOG_INFO, "INFO: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define LOG(...) SysLog( LOG_DEBUG, "%s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
#else
|
||||
//EMERG means system is unstable thus will force a reboot!
|
||||
#define EMERG(fmt, ...) SysLog( LOG_EMERG, PSTR("EMERG: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define ALERT(fmt, ...) SysLog( LOG_ALERT, PSTR("ALERT: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define CRITICAL(fmt, ...) SysLog( LOG_CRIT, PSTR("CRITICAL: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define ERROR(fmt, ...) SysLog( LOG_ERROR, PSTR("ERROR: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define WARNING(fmt, ...) SysLog( LOG_WARNING, PSTR("WARNING: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define NOTICE(fmt, ...) SysLog( LOG_NOTICE, PSTR("NOTICE: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define INFO(fmt, ...) SysLog( LOG_INFO, PSTR("INFO: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define LOG(fmt, ...) SysLog( LOG_DEBUG, PSTR("%15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
|
||||
#endif
|
||||
#else
|
||||
#define EMERG(fmt, ...)
|
||||
#define ALERT(fmt, ...)
|
||||
#define CRITICAL(fmt, ...)
|
||||
#define ERROR(fmt, ...)
|
||||
#define WARNING(fmt, ...)
|
||||
#define NOTICE(fmt, ...)
|
||||
#define INFO(fmt, ...)
|
||||
#define LOG(fmt, ...)
|
||||
|
||||
#endif //SYSLOG_DIABLE
|
||||
|
||||
//Note that if you are running debug code with JTAG the assert will stop
|
||||
// However you might want to run release code with syslog enabled for testing
|
||||
// where you want error logging, but asserts are not enabled.
|
||||
// Thus this macro does error logging and an assert.
|
||||
//This macro assumed to take a constant string as argument
|
||||
|
||||
|
||||
//this can be enabled to log asserts to the history file, if you have code space to do it.
|
||||
#ifdef ASSERT_HISTORY
|
||||
#define ASSERT(x) {if(!(x)){ERROR(#x); HISTORY_ASSERT();} assert(x);}
|
||||
#define ASSERT_ERROR(x) {HISTORY_ASSERT(); ERROR(x); ASSERT_FAIL(x);}
|
||||
#else
|
||||
#define ASSERT(x) {if(!(x)){ERROR(#x);} assert(x);}
|
||||
#define ASSERT_ERROR(x) {ERROR(x); ASSERT_FAIL(x);}
|
||||
#endif
|
||||
|
||||
|
||||
void SysLogInit(Stream *ptrSerialObj, eLogLevel LevelToWrite);
|
||||
int SysLogDisable(void);
|
||||
int SysLogEnable(void);
|
||||
int SysLogIsEnabled(void);
|
||||
|
||||
void SysLogDebug(bool x);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif /* SYSLOG_H_ */
|
||||
/*
|
||||
* syslog.h
|
||||
*
|
||||
* Created on: Sep 14, 2011
|
||||
* Author: trampas.stern
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef SYSLOG_H_
|
||||
#define SYSLOG_H_
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "Arduino.h"
|
||||
#include "variant.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif // __cplusplus
|
||||
|
||||
#define SYSLOG_BUFFER_SIZE (250)
|
||||
|
||||
#define MAX_SYSLOG_STRING (250)
|
||||
#define __FILENAME1__ (__builtin_strrchr(__FILE__, '\\') ? __builtin_strrchr(__FILE__, '\\') + 1 : __FILE__)
|
||||
#define __FILENAME__ (__builtin_strrchr(__FILENAME1__, '/') ? __builtin_strrchr(__FILENAME1__, '/') + 1 : __FILENAME1__)
|
||||
|
||||
#define SYSLOG_WRITE(buffer,nBytes)
|
||||
|
||||
#ifdef CMD_SERIAL_PORT
|
||||
#define SYSLOG_PUTC(x)
|
||||
#else
|
||||
#define SYSLOG_PUTC(x) //SerialUSB.write(x)
|
||||
#endif
|
||||
|
||||
#define Sys_WDogHoldOn()
|
||||
#define Sys_WDogHoldOff()
|
||||
/*
|
||||
* priorities/facilities are encoded into a single 32-bit quantity, where the
|
||||
* bottom 3 bits are the priority (0-7) and the top 28 bits are the facility
|
||||
* (0-big number). Both the priorities and the facilities map roughly
|
||||
* one-to-one to strings in the syslogd(8) source code. This mapping is
|
||||
* included in this file.
|
||||
*
|
||||
* priorities (these are ordered)
|
||||
*/
|
||||
|
||||
typedef enum _eLogLevel {
|
||||
LOG_EMERG = 0, // system is unusable
|
||||
LOG_ALERT = 1, // action must be taken immediately
|
||||
LOG_CRIT = 2, // critical conditions
|
||||
LOG_ERROR = 3, // error conditions
|
||||
LOG_WARNING = 4, // warning conditions
|
||||
LOG_NOTICE = 5, // normal but significant condition
|
||||
LOG_INFO = 6, // informational
|
||||
LOG_DEBUG = 7, // debug-level messages
|
||||
LOG_DISABLED = 8 // disabled messages
|
||||
} eLogLevel;
|
||||
|
||||
#if 0
|
||||
#define CONCAT(x, y) CONCAT_(x, y)
|
||||
#define CONCAT_(x, y) x##y
|
||||
|
||||
#define ID(...) __VA_ARGS__
|
||||
|
||||
#define IFMULTIARG(if,then,else) \
|
||||
CONCAT(IFMULTIARG_, IFMULTIARG_(if, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
|
||||
1, 1, 0, ))(then,else)
|
||||
#define IFMULTIARG_(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \
|
||||
_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \
|
||||
_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \
|
||||
_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \
|
||||
_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \
|
||||
_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \
|
||||
_60, _61, _62, _63, ...) _63
|
||||
#define IFMULTIARG_0(then, else) else
|
||||
#define IFMULTIARG_1(then, else) then
|
||||
|
||||
#define PROVIDE_SECOND_ARGUMENT(x, ...) CONCAT( IFMULTIARG(ID(__VA_ARGS__), INSERT_, ADD_), SECOND_ARGUMENT ) (x, __VA_ARGS__)
|
||||
#define PROVIDE_SECOND_ARGUMENT2(x, y, ...) CONCAT( IFMULTIARG(ID(__VA_ARGS__), INSERT_, ADD_), SECOND_ARGUMENT2 ) (x, y, __VA_ARGS__)
|
||||
|
||||
#define ADD_SECOND_ARGUMENT(x, y) y, x
|
||||
#define INSERT_SECOND_ARGUMENT(x, y, ...) y, x, __VA_ARGS__
|
||||
|
||||
#define ADD_SECOND_ARGUMENT2(x, z, y) y, x, z
|
||||
#define INSERT_SECOND_ARGUMENT2(x, z, y, ...) y, x, z, __VA_ARGS__
|
||||
|
||||
#endif
|
||||
//#define DEBUG1(...) printf( "DEBUG %s %s: "
|
||||
//PROVIDE_SECOND_ARGUMENT2(__FILE__, __LINE__, __VA_ARGS__))
|
||||
|
||||
|
||||
//TXT(x) macro is used for system which can store strings in flash, like AVR processors
|
||||
#ifndef TXT
|
||||
#define TXT(x) x
|
||||
#endif
|
||||
|
||||
void SysLog(eLogLevel priorty, const char *fmt, ...);
|
||||
|
||||
|
||||
|
||||
static inline const char * __file__( const char *filename ) {
|
||||
char const *p = strrchr( filename, '/' );
|
||||
if ( p )
|
||||
return p+1;
|
||||
else
|
||||
return filename;
|
||||
} // __file__
|
||||
|
||||
|
||||
//These macros abstract the logging and append the file and line number to errors.
|
||||
#ifndef SYSLOG_DISABLE
|
||||
//#ifndef PGM_P
|
||||
#if 1
|
||||
//EMERG means system is unstable thus will force a reboot!
|
||||
#define EMERG(fmt, ...) SysLog( LOG_EMERG, "EMERG: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define ALERT(fmt, ...) SysLog( LOG_ALERT, "ALERT: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define CRITICAL(fmt, ...) SysLog( LOG_CRIT, "CRITICAL: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define ERROR(fmt, ...) SysLog( LOG_ERROR, "ERROR: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define WARNING(fmt, ...) SysLog( LOG_WARNING, "WARNING: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define NOTICE(fmt, ...) SysLog( LOG_NOTICE, "NOTICE: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define INFO(fmt, ...) SysLog( LOG_INFO, "INFO: %s %4d: " fmt, __FILENAME__, __LINE__, ## __VA_ARGS__ )
|
||||
#define LOG(fmt, ...) SysLog( LOG_DEBUG, "%s %4d: " fmt, __FILENAME__ , __LINE__, ## __VA_ARGS__ )
|
||||
//
|
||||
//#define EMERG(...) SysLog( LOG_EMERG, "EMERG: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define ALERT(...) SysLog( LOG_ALERT, "ALERT: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define CRITICAL(...) SysLog( LOG_CRIT, "CRITICAL: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define ERROR(...) SysLog( LOG_ERROR, "ERROR: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define WARNING(...) SysLog( LOG_WARNING, "WARNING: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define NOTICE(...) SysLog( LOG_NOTICE, "NOTICE: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define INFO(...) SysLog( LOG_INFO, "INFO: %15s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
//#define LOG(...) SysLog( LOG_DEBUG, "%s %4d: " PROVIDE_SECOND_ARGUMENT2(BASE_FILE_NAME, __LINE__,__VA_ARGS__ ) )
|
||||
#else
|
||||
//EMERG means system is unstable thus will force a reboot!
|
||||
#define EMERG(fmt, ...) SysLog( LOG_EMERG, PSTR("EMERG: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define ALERT(fmt, ...) SysLog( LOG_ALERT, PSTR("ALERT: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define CRITICAL(fmt, ...) SysLog( LOG_CRIT, PSTR("CRITICAL: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define ERROR(fmt, ...) SysLog( LOG_ERROR, PSTR("ERROR: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define WARNING(fmt, ...) SysLog( LOG_WARNING, PSTR("WARNING: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define NOTICE(fmt, ...) SysLog( LOG_NOTICE, PSTR("NOTICE: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define INFO(fmt, ...) SysLog( LOG_INFO, PSTR("INFO: %15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
#define LOG(fmt, ...) SysLog( LOG_DEBUG, PSTR("%15s %4d: " fmt), __file__(__FILE__), __LINE__, ## __VA_ARGS__ )
|
||||
|
||||
#endif
|
||||
#else
|
||||
#define EMERG(fmt, ...)
|
||||
#define ALERT(fmt, ...)
|
||||
#define CRITICAL(fmt, ...)
|
||||
#define ERROR(fmt, ...)
|
||||
#define WARNING(fmt, ...)
|
||||
#define NOTICE(fmt, ...)
|
||||
#define INFO(fmt, ...)
|
||||
#define LOG(fmt, ...)
|
||||
|
||||
#endif //SYSLOG_DIABLE
|
||||
|
||||
//Note that if you are running debug code with JTAG the assert will stop
|
||||
// However you might want to run release code with syslog enabled for testing
|
||||
// where you want error logging, but asserts are not enabled.
|
||||
// Thus this macro does error logging and an assert.
|
||||
//This macro assumed to take a constant string as argument
|
||||
|
||||
|
||||
//this can be enabled to log asserts to the history file, if you have code space to do it.
|
||||
#ifdef ASSERT_HISTORY
|
||||
#define ASSERT(x) {if(!(x)){ERROR(#x); HISTORY_ASSERT();} assert(x);}
|
||||
#define ASSERT_ERROR(x) {HISTORY_ASSERT(); ERROR(x); ASSERT_FAIL(x);}
|
||||
#else
|
||||
#define ASSERT(x) {if(!(x)){ERROR(#x);} assert(x);}
|
||||
#define ASSERT_ERROR(x) {ERROR(x); ASSERT_FAIL(x);}
|
||||
#endif
|
||||
|
||||
|
||||
void SysLogInit(Stream *ptrSerialObj, eLogLevel LevelToWrite);
|
||||
int SysLogDisable(void);
|
||||
int SysLogEnable(void);
|
||||
int SysLogIsEnabled(void);
|
||||
|
||||
void SysLogDebug(bool x);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif /* SYSLOG_H_ */
|
||||
|
@ -1,45 +1,45 @@
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#include "utils.h"
|
||||
#include "syslog.h"
|
||||
|
||||
double CubicInterpolate(
|
||||
double y0,double y1,
|
||||
double y2,double y3,
|
||||
double mu)
|
||||
{
|
||||
double a0,a1,a2,a3,mu2;
|
||||
|
||||
mu2 = mu*mu;
|
||||
a0 = y3 - y2 - y0 + y1;
|
||||
a1 = y0 - y1 - a0;
|
||||
a2 = y2 - y0;
|
||||
a3 = y1;
|
||||
|
||||
return(a0*mu*mu2+a1*mu2+a2*mu+a3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
#include "utils.h"
|
||||
#include "syslog.h"
|
||||
|
||||
double CubicInterpolate(
|
||||
double y0,double y1,
|
||||
double y2,double y3,
|
||||
double mu)
|
||||
{
|
||||
double a0,a1,a2,a3,mu2;
|
||||
|
||||
mu2 = mu*mu;
|
||||
a0 = y3 - y2 - y0 + y1;
|
||||
a1 = y0 - y1 - a0;
|
||||
a2 = y2 - y0;
|
||||
a3 = y1;
|
||||
|
||||
return(a0*mu*mu2+a1*mu2+a2*mu+a3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1,39 +1,39 @@
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
/* this file contains generic utilities and functions */
|
||||
|
||||
#ifndef UTILS_H_
|
||||
#define UTILS_H_
|
||||
|
||||
|
||||
double CubicInterpolate(
|
||||
double y0,double y1,
|
||||
double y2,double y3,
|
||||
double mu);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* UTILS_H_ */
|
||||
/**********************************************************************
|
||||
* Author: tstern
|
||||
*
|
||||
Copyright (C) 2018 MisfitTech, All rights reserved.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License.
|
||||
|
||||
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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Trampas Stern for MisfitTech.
|
||||
|
||||
Misfit Tech invests time and resources providing this open source code,
|
||||
please support MisfitTech and open-source hardware by purchasing
|
||||
products from MisfitTech, www.misifittech.net!
|
||||
*********************************************************************/
|
||||
|
||||
/* this file contains generic utilities and functions */
|
||||
|
||||
#ifndef UTILS_H_
|
||||
#define UTILS_H_
|
||||
|
||||
|
||||
double CubicInterpolate(
|
||||
double y0,double y1,
|
||||
double y2,double y3,
|
||||
double mu);
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* UTILS_H_ */
|
||||
|
@ -1,259 +1,259 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="60degrees.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 100.00001 86.011261"
|
||||
height="86.011261mm"
|
||||
width="100.00001mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="251.28519"
|
||||
inkscape:cx="185.38959"
|
||||
inkscape:zoom="1.28"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(2589.2871,3027.3873)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.03028581,0,0,0.03028581,-31994.336,-39983.419)"
|
||||
id="g2022">
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97387,0,0,121.97387,-1634713.7,-447528.16)"><flowRegion
|
||||
id="flowRegion8812-7-0"><rect
|
||||
id="rect8814-2-8"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1">60°</flowPara></flowRoot>
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4828-5-6-3-8"
|
||||
d="m -74060.283,-13480.223 36936.476,-61926.638 h 13263.71 L 11307.692,-13480.223 4675.8414,-1986.9563 H -67428.412 Z"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1048.86;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
transform="matrix(-0.63952475,-183.20961,183.20961,-0.63952475,-49619.929,-5311.4643)"
|
||||
inkscape:randomized="0"
|
||||
inkscape:rounded="0"
|
||||
inkscape:flatsided="true"
|
||||
sodipodi:arg2="1.0509414"
|
||||
sodipodi:arg1="0.52734265"
|
||||
sodipodi:r2="64.395599"
|
||||
sodipodi:r1="74.357628"
|
||||
sodipodi:cy="100.0744"
|
||||
sodipodi:cx="145.14285"
|
||||
sodipodi:sides="6"
|
||||
id="path4828-5"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a0af9a;stroke-width:5.72489;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
sodipodi:type="star"
|
||||
d="M 209.3988,137.49404 144.86447,174.43151 80.608517,137.01187 80.886902,62.65476 145.42124,25.717295 209.67719,63.136937 Z" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-9"
|
||||
d="m -37758.409,-35404.732 -35328.793,23615.531"
|
||||
style="display:inline;fill:none;stroke:#00ad00;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-9"
|
||||
d="M -31729.036,-24994.592 -67914.087,-2361.6243"
|
||||
style="display:inline;fill:none;stroke:#00ad00;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-1-5"
|
||||
d="M 5456.3344,-3136.0263 -31024.729,-24928.651"
|
||||
style="display:inline;fill:none;stroke:#4e6ab4;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-1-7-8"
|
||||
d="M 10891.397,-12619.884 -25043.689,-35286.417"
|
||||
style="display:inline;fill:none;stroke:#4e6ab4;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8766-1-9-8"
|
||||
d="m -24553.919,-75406.861 -775.09,39398.893"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8766-1-9-6-8"
|
||||
d="m -35708.408,-75406.861 -1486.194,39454.954"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path16495-5"
|
||||
d="m -38126.98,-36033.469 6630.518,4267.751 6866.697,-4271.894"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path16497-6"
|
||||
d="m -31496.462,-31765.718 121.691,7418.992"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6909-5-8"
|
||||
d="m -31374.511,-24191.094 3439.861,-5962.139 3439.85,-5962.241 -6883.382,2.124 -6883.382,2.124 33.703,58.354 3409.819,5901.769 z m -0.264,-155.629 -3376.103,-5843.317 -3376.103,-5843.429 6748.606,-2.071 6748.607,-2.072 -3372.503,5845.498 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#facf00;stroke-width:300.677;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
<circle
|
||||
r="622.96948"
|
||||
cy="-31828.615"
|
||||
cx="-31501.23"
|
||||
id="path7360-7-8-0-8-3-5"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:124.372;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:original-d="m -12845.121,-4717.2923 c 1612.102,-5214.392 -8030.73,-11095.8677 -3922.613,-14689.2327 3780.164,-3306.514 -6194.621,-6390.045 -9335.279,-9281.551"
|
||||
inkscape:path-effect="#path-effect7064"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7062"
|
||||
d="m -12845.121,-4717.2923 c 113.628,-5135.0526 -1264.136,-10294.4427 -3922.613,-14689.2327 -2293.93,-3792.148 -5529.954,-7009.548 -9335.279,-9281.551"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:262.215;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start);marker-end:url(#ArrowDIN-end)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="60degrees.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 100.00001 86.011261"
|
||||
height="86.011261mm"
|
||||
width="100.00001mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="251.28519"
|
||||
inkscape:cx="185.38959"
|
||||
inkscape:zoom="1.28"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(2589.2871,3027.3873)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.03028581,0,0,0.03028581,-31994.336,-39983.419)"
|
||||
id="g2022">
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97387,0,0,121.97387,-1634713.7,-447528.16)"><flowRegion
|
||||
id="flowRegion8812-7-0"><rect
|
||||
id="rect8814-2-8"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1">60°</flowPara></flowRoot>
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4828-5-6-3-8"
|
||||
d="m -74060.283,-13480.223 36936.476,-61926.638 h 13263.71 L 11307.692,-13480.223 4675.8414,-1986.9563 H -67428.412 Z"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1048.86;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
transform="matrix(-0.63952475,-183.20961,183.20961,-0.63952475,-49619.929,-5311.4643)"
|
||||
inkscape:randomized="0"
|
||||
inkscape:rounded="0"
|
||||
inkscape:flatsided="true"
|
||||
sodipodi:arg2="1.0509414"
|
||||
sodipodi:arg1="0.52734265"
|
||||
sodipodi:r2="64.395599"
|
||||
sodipodi:r1="74.357628"
|
||||
sodipodi:cy="100.0744"
|
||||
sodipodi:cx="145.14285"
|
||||
sodipodi:sides="6"
|
||||
id="path4828-5"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a0af9a;stroke-width:5.72489;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
sodipodi:type="star"
|
||||
d="M 209.3988,137.49404 144.86447,174.43151 80.608517,137.01187 80.886902,62.65476 145.42124,25.717295 209.67719,63.136937 Z" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-9"
|
||||
d="m -37758.409,-35404.732 -35328.793,23615.531"
|
||||
style="display:inline;fill:none;stroke:#00ad00;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-9"
|
||||
d="M -31729.036,-24994.592 -67914.087,-2361.6243"
|
||||
style="display:inline;fill:none;stroke:#00ad00;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-1-5"
|
||||
d="M 5456.3344,-3136.0263 -31024.729,-24928.651"
|
||||
style="display:inline;fill:none;stroke:#4e6ab4;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-1-7-8"
|
||||
d="M 10891.397,-12619.884 -25043.689,-35286.417"
|
||||
style="display:inline;fill:none;stroke:#4e6ab4;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8766-1-9-8"
|
||||
d="m -24553.919,-75406.861 -775.09,39398.893"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8766-1-9-6-8"
|
||||
d="m -35708.408,-75406.861 -1486.194,39454.954"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path16495-5"
|
||||
d="m -38126.98,-36033.469 6630.518,4267.751 6866.697,-4271.894"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path16497-6"
|
||||
d="m -31496.462,-31765.718 121.691,7418.992"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6909-5-8"
|
||||
d="m -31374.511,-24191.094 3439.861,-5962.139 3439.85,-5962.241 -6883.382,2.124 -6883.382,2.124 33.703,58.354 3409.819,5901.769 z m -0.264,-155.629 -3376.103,-5843.317 -3376.103,-5843.429 6748.606,-2.071 6748.607,-2.072 -3372.503,5845.498 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#facf00;stroke-width:300.677;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
<circle
|
||||
r="622.96948"
|
||||
cy="-31828.615"
|
||||
cx="-31501.23"
|
||||
id="path7360-7-8-0-8-3-5"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:124.372;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:original-d="m -12845.121,-4717.2923 c 1612.102,-5214.392 -8030.73,-11095.8677 -3922.613,-14689.2327 3780.164,-3306.514 -6194.621,-6390.045 -9335.279,-9281.551"
|
||||
inkscape:path-effect="#path-effect7064"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7062"
|
||||
d="m -12845.121,-4717.2923 c 113.628,-5135.0526 -1264.136,-10294.4427 -3922.613,-14689.2327 -2293.93,-3792.148 -5529.954,-7009.548 -9335.279,-9281.551"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:262.215;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start);marker-end:url(#ArrowDIN-end)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
@ -1,315 +1,315 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="angle-misalignment.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 100 86.011261"
|
||||
height="86.011261mm"
|
||||
width="100mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-71"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-379" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-24" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-1"
|
||||
effect="spiro" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="199.20219"
|
||||
inkscape:cx="163.16912"
|
||||
inkscape:zoom="1.8101934"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(4217.4877,4375.2393)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.03028581,0,0,0.03028581,-74619.154,-75274.84)"
|
||||
id="g2181">
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-36740.863"
|
||||
cx="-26360.814"
|
||||
id="path7360-7-8-0-8-3-5-1"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4828-5-6-3-8-3"
|
||||
d="m -76341.626,-15174.744 36936.46,-61926.638 H -26141.45 L 9026.3417,-15174.744 2394.5247,-3681.4778 H -69709.729 Z"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1048.86;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-9-2"
|
||||
d="m -40112.544,-37053.26 -35256.001,23569.537"
|
||||
style="display:inline;fill:none;stroke:#00ad00;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-9-5"
|
||||
d="M -34098.505,-26639.29 -70195.43,-4056.1458"
|
||||
style="display:inline;fill:none;stroke:#00ad00;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-1-5-0"
|
||||
d="M 3175.0047,-4830.5478 -33240.878,-26592.511"
|
||||
style="display:inline;fill:none;stroke:#4e6ab4;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-1-7-8-5"
|
||||
d="M 8324.7587,-15035.956 -27030.36,-37361.022"
|
||||
style="display:inline;fill:none;stroke:#4e6ab4;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8766-1-9-8-6"
|
||||
d="m -26835.272,-77101.382 -769.654,39295.911"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8766-1-9-6-8-1"
|
||||
d="m -37989.727,-77101.382 -1480.756,39300.481"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6909-5-8-2"
|
||||
d="m -33655.833,-25885.615 3439.845,-5962.139 3439.846,-5962.241 -6883.388,2.125 -6883.388,2.123 33.721,58.354 3409.795,5901.769 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#facf00;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
transform="matrix(21.333198,-181.96446,181.96446,21.333198,-54965.828,-9177.2938)"
|
||||
inkscape:randomized="0"
|
||||
inkscape:rounded="0"
|
||||
inkscape:flatsided="true"
|
||||
sodipodi:arg2="1.0509414"
|
||||
sodipodi:arg1="0.52734265"
|
||||
sodipodi:r2="64.395599"
|
||||
sodipodi:r1="74.357628"
|
||||
sodipodi:cy="100.0744"
|
||||
sodipodi:cx="145.14285"
|
||||
sodipodi:sides="6"
|
||||
id="path4828-5-5-7"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a0af9a;stroke-width:5.72489;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
sodipodi:type="star"
|
||||
d="M 209.3988,137.49404 144.86447,174.43151 80.608517,137.01187 80.886902,62.65476 145.42124,25.717295 209.67719,63.136937 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6909-5-8-2-0"
|
||||
d="m -34588.271,-25732.955 4129.97,-5506.658 4129.944,-5506.763 -6833.987,-823.259 -6833.986,-823.257 26.483,61.975 2677.534,6268.047 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:209.772, 209.772;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-25913.945"
|
||||
cx="-33628.633"
|
||||
id="path7360-7-8-0-8-3-5-1-1"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-25745.299"
|
||||
cx="-34594.422"
|
||||
id="path7360-7-8-0-8-3-5-1-1-0"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-37779.727"
|
||||
cx="-40527.301"
|
||||
id="path7360-7-8-0-8-3-5-1-1-3"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-38423.602"
|
||||
cx="-40006.098"
|
||||
id="path7360-7-8-0-8-3-5-1-1-5"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-37841.055"
|
||||
cx="-26898.559"
|
||||
id="path7360-7-8-0-8-3-5-1-1-59"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-4"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(45.001051,0,0,45.001051,-629830.14,-198314.55)"><flowRegion
|
||||
id="flowRegion8812-7-0-0"><rect
|
||||
id="rect8814-2-8-3"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-5">angle misalignment</flowPara></flowRoot>
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:original-d="m -33461.243,-44292.846 c -1200.264,862.342 1292.931,2976.574 -355.826,3256.271 -1517.125,257.369 63.587,1975.577 504.004,2877.212"
|
||||
inkscape:path-effect="#path-effect7064-1"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7062-1"
|
||||
d="m -33461.243,-44292.846 c -279.734,1059.648 -400.107,2161.216 -355.826,3256.271 39.457,975.753 209.441,1946.146 504.004,2877.212"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:69.1242;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start-71);marker-end:url(#ArrowDIN-end-5)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="angle-misalignment.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 100 86.011261"
|
||||
height="86.011261mm"
|
||||
width="100mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-71"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-379" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-24" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-1"
|
||||
effect="spiro" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="199.20219"
|
||||
inkscape:cx="163.16912"
|
||||
inkscape:zoom="1.8101934"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(4217.4877,4375.2393)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.03028581,0,0,0.03028581,-74619.154,-75274.84)"
|
||||
id="g2181">
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-36740.863"
|
||||
cx="-26360.814"
|
||||
id="path7360-7-8-0-8-3-5-1"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4828-5-6-3-8-3"
|
||||
d="m -76341.626,-15174.744 36936.46,-61926.638 H -26141.45 L 9026.3417,-15174.744 2394.5247,-3681.4778 H -69709.729 Z"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1048.86;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-9-2"
|
||||
d="m -40112.544,-37053.26 -35256.001,23569.537"
|
||||
style="display:inline;fill:none;stroke:#00ad00;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-9-5"
|
||||
d="M -34098.505,-26639.29 -70195.43,-4056.1458"
|
||||
style="display:inline;fill:none;stroke:#00ad00;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-1-5-0"
|
||||
d="M 3175.0047,-4830.5478 -33240.878,-26592.511"
|
||||
style="display:inline;fill:none;stroke:#4e6ab4;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15371-6-1-7-8-5"
|
||||
d="M 8324.7587,-15035.956 -27030.36,-37361.022"
|
||||
style="display:inline;fill:none;stroke:#4e6ab4;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8766-1-9-8-6"
|
||||
d="m -26835.272,-77101.382 -769.654,39295.911"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8766-1-9-6-8-1"
|
||||
d="m -37989.727,-77101.382 -1480.756,39300.481"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6909-5-8-2"
|
||||
d="m -33655.833,-25885.615 3439.845,-5962.139 3439.846,-5962.241 -6883.388,2.125 -6883.388,2.123 33.721,58.354 3409.795,5901.769 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#facf00;stroke-width:131.107;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<path
|
||||
transform="matrix(21.333198,-181.96446,181.96446,21.333198,-54965.828,-9177.2938)"
|
||||
inkscape:randomized="0"
|
||||
inkscape:rounded="0"
|
||||
inkscape:flatsided="true"
|
||||
sodipodi:arg2="1.0509414"
|
||||
sodipodi:arg1="0.52734265"
|
||||
sodipodi:r2="64.395599"
|
||||
sodipodi:r1="74.357628"
|
||||
sodipodi:cy="100.0744"
|
||||
sodipodi:cx="145.14285"
|
||||
sodipodi:sides="6"
|
||||
id="path4828-5-5-7"
|
||||
style="display:inline;fill:none;fill-opacity:1;stroke:#a0af9a;stroke-width:5.72489;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
sodipodi:type="star"
|
||||
d="M 209.3988,137.49404 144.86447,174.43151 80.608517,137.01187 80.886902,62.65476 145.42124,25.717295 209.67719,63.136937 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6909-5-8-2-0"
|
||||
d="m -34588.271,-25732.955 4129.97,-5506.658 4129.944,-5506.763 -6833.987,-823.259 -6833.986,-823.257 26.483,61.975 2677.534,6268.047 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:209.772, 209.772;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-25913.945"
|
||||
cx="-33628.633"
|
||||
id="path7360-7-8-0-8-3-5-1-1"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-25745.299"
|
||||
cx="-34594.422"
|
||||
id="path7360-7-8-0-8-3-5-1-1-0"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-37779.727"
|
||||
cx="-40527.301"
|
||||
id="path7360-7-8-0-8-3-5-1-1-3"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-38423.602"
|
||||
cx="-40006.098"
|
||||
id="path7360-7-8-0-8-3-5-1-1-5"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="178.38574"
|
||||
cy="-37841.055"
|
||||
cx="-26898.559"
|
||||
id="path7360-7-8-0-8-3-5-1-1-59"
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:35.6138;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-4"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(45.001051,0,0,45.001051,-629830.14,-198314.55)"><flowRegion
|
||||
id="flowRegion8812-7-0-0"><rect
|
||||
id="rect8814-2-8-3"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-5">angle misalignment</flowPara></flowRoot>
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:original-d="m -33461.243,-44292.846 c -1200.264,862.342 1292.931,2976.574 -355.826,3256.271 -1517.125,257.369 63.587,1975.577 504.004,2877.212"
|
||||
inkscape:path-effect="#path-effect7064-1"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7062-1"
|
||||
d="m -33461.243,-44292.846 c -279.734,1059.648 -400.107,2161.216 -355.826,3256.271 39.457,975.753 209.441,1946.146 504.004,2877.212"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:69.1242;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start-71);marker-end:url(#ArrowDIN-end-5)" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 155 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 50 KiB |
@ -1,436 +1,436 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="coords-cheat.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 99.999992 102.73526"
|
||||
height="102.73526mm"
|
||||
width="99.999992mm">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect1225"
|
||||
is_visible="true" />
|
||||
<marker
|
||||
inkscape:stockid="ArrowDIN-start"
|
||||
style="overflow:visible"
|
||||
refY="0"
|
||||
refX="0"
|
||||
orient="auto"
|
||||
id="ArrowDIN-start-7-6">
|
||||
<path
|
||||
id="path13335-9-7"
|
||||
style="fill:#000000;stroke:none"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="ArrowDIN-end"
|
||||
style="overflow:visible"
|
||||
refY="0"
|
||||
refX="0"
|
||||
orient="auto"
|
||||
id="ArrowDIN-end-1-8">
|
||||
<path
|
||||
id="path13338-7-5"
|
||||
style="fill:#000000;stroke:none"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect7064-4-4"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect1225-5"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect1225-9"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect1225-9-8"
|
||||
is_visible="true" />
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-9"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-7"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-9-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-7-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-7-2"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-5-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-76"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-53"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-8-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-76-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-8-0"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-53-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-8-0"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-76-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-8-4"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-53-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-8-5-2"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-76-7-6"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-8-0-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-53-9-8"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker1150"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path1148"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path829"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="740.76634"
|
||||
inkscape:cx="146.00828"
|
||||
inkscape:zoom="0.24748737"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(1115.743,1177.1015)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0384431,0,0,0.0384431,-1070.7646,-1141.9065)"
|
||||
id="layer1-7"
|
||||
inkscape:label="Ebene 1">
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833"
|
||||
d="m 0,1756.8901 v -1170"
|
||||
style="fill:none;stroke:#4964aa;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#07ac07;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -1013.2497,1.8901 0,586.8901"
|
||||
id="path833-1"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-1-8"
|
||||
d="M 1013.2498,1.8901 0,586.8901"
|
||||
style="fill:none;stroke:#a900a6;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
|
||||
d="M 0,586.8901 V -583.10989"
|
||||
id="path833-2"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-2-7"
|
||||
d="m 0,586.89 1170,10e-5"
|
||||
style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1150)"
|
||||
inkscape:connector-curvature="0" />
|
||||
<text
|
||||
id="text905"
|
||||
y="764.29883"
|
||||
x="1176.6508"
|
||||
style="font-style:normal;font-weight:normal;font-size:390.279px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:9.75701"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:9.75701"
|
||||
y="764.29883"
|
||||
x="1176.6508"
|
||||
id="tspan903"
|
||||
sodipodi:role="line">X</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:390.279px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:9.75701"
|
||||
x="-121.42204"
|
||||
y="-631.75507"
|
||||
id="text905-5"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan903-7"
|
||||
x="-121.42204"
|
||||
y="-631.75507"
|
||||
style="stroke-width:9.75701">Y</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#646464;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 1013.2498,1.89 H -3e-5"
|
||||
id="path833-1-8-2"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-1-8-2-8"
|
||||
d="m 1013.2501,1.89 v 585"
|
||||
style="fill:none;stroke:#646464;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-1-8-2-4"
|
||||
d="M -3e-5,1.89 H -1013.2498"
|
||||
style="fill:none;stroke:#646464;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#646464;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -1013.2498,1.89 V 586.88999"
|
||||
id="path833-1-8-2-8-0"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-2-7-7"
|
||||
d="M -1170.0001,586.89 0,586.8901"
|
||||
style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:80, 80;stroke-dashoffset:0;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="coords-cheat.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 99.999992 102.73526"
|
||||
height="102.73526mm"
|
||||
width="99.999992mm">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect1225"
|
||||
is_visible="true" />
|
||||
<marker
|
||||
inkscape:stockid="ArrowDIN-start"
|
||||
style="overflow:visible"
|
||||
refY="0"
|
||||
refX="0"
|
||||
orient="auto"
|
||||
id="ArrowDIN-start-7-6">
|
||||
<path
|
||||
id="path13335-9-7"
|
||||
style="fill:#000000;stroke:none"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="ArrowDIN-end"
|
||||
style="overflow:visible"
|
||||
refY="0"
|
||||
refX="0"
|
||||
orient="auto"
|
||||
id="ArrowDIN-end-1-8">
|
||||
<path
|
||||
id="path13338-7-5"
|
||||
style="fill:#000000;stroke:none"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect7064-4-4"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect1225-5"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect1225-9"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
effect="spiro"
|
||||
id="path-effect1225-9-8"
|
||||
is_visible="true" />
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-9"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-7"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-9-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-7-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-7-2"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-5-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-76"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-53"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-8-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-76-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-8-0"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-53-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-8-0"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-76-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-8-4"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-53-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1-8-5-2"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-7-76-7-6"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-6-8-0-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-0-53-9-8"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker1150"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path1148"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path829"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="740.76634"
|
||||
inkscape:cx="146.00828"
|
||||
inkscape:zoom="0.24748737"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(1115.743,1177.1015)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0384431,0,0,0.0384431,-1070.7646,-1141.9065)"
|
||||
id="layer1-7"
|
||||
inkscape:label="Ebene 1">
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833"
|
||||
d="m 0,1756.8901 v -1170"
|
||||
style="fill:none;stroke:#4964aa;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#07ac07;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -1013.2497,1.8901 0,586.8901"
|
||||
id="path833-1"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-1-8"
|
||||
d="M 1013.2498,1.8901 0,586.8901"
|
||||
style="fill:none;stroke:#a900a6;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
|
||||
d="M 0,586.8901 V -583.10989"
|
||||
id="path833-2"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-2-7"
|
||||
d="m 0,586.89 1170,10e-5"
|
||||
style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1150)"
|
||||
inkscape:connector-curvature="0" />
|
||||
<text
|
||||
id="text905"
|
||||
y="764.29883"
|
||||
x="1176.6508"
|
||||
style="font-style:normal;font-weight:normal;font-size:390.279px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:9.75701"
|
||||
xml:space="preserve"><tspan
|
||||
style="stroke-width:9.75701"
|
||||
y="764.29883"
|
||||
x="1176.6508"
|
||||
id="tspan903"
|
||||
sodipodi:role="line">X</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:390.279px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:9.75701"
|
||||
x="-121.42204"
|
||||
y="-631.75507"
|
||||
id="text905-5"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan903-7"
|
||||
x="-121.42204"
|
||||
y="-631.75507"
|
||||
style="stroke-width:9.75701">Y</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#646464;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 1013.2498,1.89 H -3e-5"
|
||||
id="path833-1-8-2"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-1-8-2-8"
|
||||
d="m 1013.2501,1.89 v 585"
|
||||
style="fill:none;stroke:#646464;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-1-8-2-4"
|
||||
d="M -3e-5,1.89 H -1013.2498"
|
||||
style="fill:none;stroke:#646464;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#646464;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -1013.2498,1.89 V 586.88999"
|
||||
id="path833-1-8-2-8-0"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path833-2-7-7"
|
||||
d="M -1170.0001,586.89 0,586.8901"
|
||||
style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:80, 80;stroke-dashoffset:0;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
@ -1,459 +1,459 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="coordinate-system.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 99.999489 81.734001"
|
||||
height="81.734001mm"
|
||||
width="99.999489mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-71"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-379" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-24" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-1"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-3" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-9-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-5-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart-3-4"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path15451-1-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="166.2105"
|
||||
inkscape:cx="194.40856"
|
||||
inkscape:zoom="1.8101934"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(6851.365,6500.5424)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.01874409,0,0,0.01874409,-143277.03,-130854.89)"
|
||||
id="g2449">
|
||||
<circle
|
||||
style="fill:#00ad00;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-5-4"
|
||||
cx="-144998.06"
|
||||
cy="56319.141"
|
||||
r="1132.4626"
|
||||
transform="rotate(60)" />
|
||||
<circle
|
||||
style="fill:#a900a6;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-9-0-2"
|
||||
cx="-104741.58"
|
||||
cy="-11552.343"
|
||||
r="1132.4626"
|
||||
transform="rotate(60)" />
|
||||
<circle
|
||||
style="fill:#4e6ab4;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-1-5-4"
|
||||
cx="-66362.375"
|
||||
cy="55833.223"
|
||||
r="1132.4626"
|
||||
transform="rotate(60)" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#4e6ab4;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97385,0.06665798,-0.06665798,121.97385,-1710325,-448706.16)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9"
|
||||
style="fill:#4e6ab4;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#4e6ab4;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5">A anchor</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-4-6"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#00ad00;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97386,0.04581266,-0.04581266,121.97386,-1764599.9,-525642.41)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-7-2"
|
||||
style="fill:#00ad00;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-0-2"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#00ad00;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-9-2">C anchor</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-4-7-0"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a900a6;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97298,0.46625238,-0.46625238,121.97298,-1656209.6,-530614.75)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-7-9-4"
|
||||
style="fill:#a900a6;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-0-0-3"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#a900a6;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-9-3-9">B anchor</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-9-3-8"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97387,0,0,121.97387,-1675636.4,-479584.87)"><flowRegion
|
||||
id="flowRegion8812-7-1-2-9"><rect
|
||||
id="rect8814-2-3-2-4"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-9-1-1">origin 0,0,0 ("origo")</flowPara></flowRoot>
|
||||
<g
|
||||
transform="matrix(26.22153,0,0,26.22153,214562.56,-133064.87)"
|
||||
id="g3926">
|
||||
<flowRoot
|
||||
transform="matrix(4.9232402,0,0,4.9232402,-74488.709,-15026.213)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
id="flowRoot8810-95-8"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-5-33"
|
||||
style="fill:#000000;fill-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-0-3"
|
||||
style="fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8816-1-4">X</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
transform="matrix(4.9232402,0,0,4.9232402,-76597.329,-17172.418)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
id="flowRoot8810-95-3-7"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-5-3-7"
|
||||
style="fill:#000000;fill-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-0-7-4"
|
||||
style="fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8816-1-7-2">Y</flowPara></flowRoot>
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15449-3"
|
||||
d="M -11204.178,327.28783 V 2203.9918"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:18.0682;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start-1)"
|
||||
transform="translate(-1.2291667e-4,-8.9583334e-5)" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15449-4-3"
|
||||
d="M -9327.4743,2203.9918 H -11204.178"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:18.0682;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start-9-3)"
|
||||
transform="translate(-1.2291667e-4,-8.9583334e-5)" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#00ad00;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -87890.509,-89688.289 -118327.99,-102802.03"
|
||||
id="path15371-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00ad00;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -93239.622,-80343.36 -124049.11,-92773.687"
|
||||
id="path15371-6-92"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#4e6ab4;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87546.64,-29534.673 -5108.4,-49788.043"
|
||||
id="path15371-6-1-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#4e6ab4;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -75947.666,-29427.449 -5094.739,-49899.103"
|
||||
id="path15371-6-1-7-85"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -39482.113,-91592.661 -41003.923,11314.576"
|
||||
id="path8766-1-9-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -45258.266,-101535.93 -41095.53,11094.595"
|
||||
id="path8766-1-9-6-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -86907.097,-91146.143 -380.736,7876.072 7132.948,3810.788"
|
||||
id="path16495-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87287.807,-83270.066 -6364.201,3814.879"
|
||||
id="path16497-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#facf00;stroke-width:300.677;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m -93786.656,-79377.147 6883.283,-2.071 6883.398,-2.124 -3443.542,-5960.122 -3443.527,-5960.123 -33.695,58.364 -3406.177,5903.875 z m 134.648,-78.043 3372.403,-5845.447 3372.508,-5845.506 3376.111,5843.429 3376.101,5843.428 -6748.619,2.072 z"
|
||||
id="path6909-5-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
<circle
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:124.372;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-3-7"
|
||||
cx="-115762.66"
|
||||
cy="33895.559"
|
||||
r="622.96948"
|
||||
transform="rotate(60)" />
|
||||
<path
|
||||
style="fill:none;stroke:#ff0000;stroke-width:78.6647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Lstart-3-4)"
|
||||
d="m -79228.164,-75272.837 21734.291,23037.79"
|
||||
id="path8808-3-5-4-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#4e6ab4;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -81766.591,-29573.6 -4932.254,-49942.854"
|
||||
id="path15371-6-1-7-2-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00ad00;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -90563.27,-84901.803 -30774.64,-12507.148"
|
||||
id="path15371-4-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#4963a8;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -81531.647,-29549.922 -87229.91,-79453.281"
|
||||
id="path15371-6-1-0-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -42259.292,-96320.603 -41297.81,10896.606"
|
||||
id="path8766-1-9-6-3-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:52.4431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87287.833,-83270.074 c 1214.843,-767.761 2515.914,-1386.156 3730.731,-2153.923"
|
||||
id="path7282-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:52.4431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87229.91,-79453.281 -57.923,-3816.793"
|
||||
id="path7284-2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:52.4431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87287.833,-83270.063 -3275.437,-1631.74"
|
||||
id="path7284-4-7"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="coordinate-system.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 99.999489 81.734001"
|
||||
height="81.734001mm"
|
||||
width="99.999489mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-71"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-379" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-24" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-1"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-3" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-9-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-5-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart-3-4"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path15451-1-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="166.2105"
|
||||
inkscape:cx="194.40856"
|
||||
inkscape:zoom="1.8101934"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(6851.365,6500.5424)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.01874409,0,0,0.01874409,-143277.03,-130854.89)"
|
||||
id="g2449">
|
||||
<circle
|
||||
style="fill:#00ad00;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-5-4"
|
||||
cx="-144998.06"
|
||||
cy="56319.141"
|
||||
r="1132.4626"
|
||||
transform="rotate(60)" />
|
||||
<circle
|
||||
style="fill:#a900a6;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-9-0-2"
|
||||
cx="-104741.58"
|
||||
cy="-11552.343"
|
||||
r="1132.4626"
|
||||
transform="rotate(60)" />
|
||||
<circle
|
||||
style="fill:#4e6ab4;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-1-5-4"
|
||||
cx="-66362.375"
|
||||
cy="55833.223"
|
||||
r="1132.4626"
|
||||
transform="rotate(60)" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#4e6ab4;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97385,0.06665798,-0.06665798,121.97385,-1710325,-448706.16)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9"
|
||||
style="fill:#4e6ab4;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#4e6ab4;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5">A anchor</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-4-6"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#00ad00;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97386,0.04581266,-0.04581266,121.97386,-1764599.9,-525642.41)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-7-2"
|
||||
style="fill:#00ad00;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-0-2"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#00ad00;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-9-2">C anchor</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-4-7-0"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a900a6;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97298,0.46625238,-0.46625238,121.97298,-1656209.6,-530614.75)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-7-9-4"
|
||||
style="fill:#a900a6;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-0-0-3"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#a900a6;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-9-3-9">B anchor</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-9-3-8"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97387,0,0,121.97387,-1675636.4,-479584.87)"><flowRegion
|
||||
id="flowRegion8812-7-1-2-9"><rect
|
||||
id="rect8814-2-3-2-4"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-9-1-1">origin 0,0,0 ("origo")</flowPara></flowRoot>
|
||||
<g
|
||||
transform="matrix(26.22153,0,0,26.22153,214562.56,-133064.87)"
|
||||
id="g3926">
|
||||
<flowRoot
|
||||
transform="matrix(4.9232402,0,0,4.9232402,-74488.709,-15026.213)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
id="flowRoot8810-95-8"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-5-33"
|
||||
style="fill:#000000;fill-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-0-3"
|
||||
style="fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8816-1-4">X</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
transform="matrix(4.9232402,0,0,4.9232402,-76597.329,-17172.418)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
id="flowRoot8810-95-3-7"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-5-3-7"
|
||||
style="fill:#000000;fill-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-0-7-4"
|
||||
style="fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8816-1-7-2">Y</flowPara></flowRoot>
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15449-3"
|
||||
d="M -11204.178,327.28783 V 2203.9918"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:18.0682;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start-1)"
|
||||
transform="translate(-1.2291667e-4,-8.9583334e-5)" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path15449-4-3"
|
||||
d="M -9327.4743,2203.9918 H -11204.178"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:18.0682;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start-9-3)"
|
||||
transform="translate(-1.2291667e-4,-8.9583334e-5)" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#00ad00;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -87890.509,-89688.289 -118327.99,-102802.03"
|
||||
id="path15371-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00ad00;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -93239.622,-80343.36 -124049.11,-92773.687"
|
||||
id="path15371-6-92"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#4e6ab4;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87546.64,-29534.673 -5108.4,-49788.043"
|
||||
id="path15371-6-1-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#4e6ab4;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -75947.666,-29427.449 -5094.739,-49899.103"
|
||||
id="path15371-6-1-7-85"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -39482.113,-91592.661 -41003.923,11314.576"
|
||||
id="path8766-1-9-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:52.4431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -45258.266,-101535.93 -41095.53,11094.595"
|
||||
id="path8766-1-9-6-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -86907.097,-91146.143 -380.736,7876.072 7132.948,3810.788"
|
||||
id="path16495-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87287.807,-83270.066 -6364.201,3814.879"
|
||||
id="path16497-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#facf00;stroke-width:300.677;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m -93786.656,-79377.147 6883.283,-2.071 6883.398,-2.124 -3443.542,-5960.122 -3443.527,-5960.123 -33.695,58.364 -3406.177,5903.875 z m 134.648,-78.043 3372.403,-5845.447 3372.508,-5845.506 3376.111,5843.429 3376.101,5843.428 -6748.619,2.072 z"
|
||||
id="path6909-5-5"
|
||||
inkscape:connector-curvature="0" />
|
||||
<circle
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:124.372;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-3-7"
|
||||
cx="-115762.66"
|
||||
cy="33895.559"
|
||||
r="622.96948"
|
||||
transform="rotate(60)" />
|
||||
<path
|
||||
style="fill:none;stroke:#ff0000;stroke-width:78.6647;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Lstart-3-4)"
|
||||
d="m -79228.164,-75272.837 21734.291,23037.79"
|
||||
id="path8808-3-5-4-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#4e6ab4;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -81766.591,-29573.6 -4932.254,-49942.854"
|
||||
id="path15371-6-1-7-2-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00ad00;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -90563.27,-84901.803 -30774.64,-12507.148"
|
||||
id="path15371-4-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#4963a8;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M -81531.647,-29549.922 -87229.91,-79453.281"
|
||||
id="path15371-6-1-0-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#a900a6;stroke-width:524.431;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -42259.292,-96320.603 -41297.81,10896.606"
|
||||
id="path8766-1-9-6-3-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:52.4431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87287.833,-83270.074 c 1214.843,-767.761 2515.914,-1386.156 3730.731,-2153.923"
|
||||
id="path7282-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:52.4431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87229.91,-79453.281 -57.923,-3816.793"
|
||||
id="path7284-2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:52.4431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -87287.833,-83270.063 -3275.437,-1631.74"
|
||||
id="path7284-4-7"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 558 KiB After Width: | Height: | Size: 558 KiB |
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 1.6 MiB |
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |
@ -1,315 +1,315 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="effector-line-guiding.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 100.00053 44.215004"
|
||||
height="44.215004mm"
|
||||
width="100.00053mm">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="138.37077"
|
||||
inkscape:cx="197.42218"
|
||||
inkscape:zoom="1.979899"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(1017.1069,321.35564)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.04416939,0,0,0.04416939,-972.18189,-307.16156)"
|
||||
id="g975">
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:27.437;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-0-3-3-1-9-6-4"
|
||||
width="81.733612"
|
||||
height="243.63861"
|
||||
x="-1003.3881"
|
||||
y="244.60229" />
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:30;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-5-3-8-3-8-5"
|
||||
width="1144.0638"
|
||||
height="103.66059"
|
||||
x="-1002.1069"
|
||||
y="245.8855" />
|
||||
<path
|
||||
style="fill:#b2c032;fill-opacity:1;stroke:#000000;stroke-width:30;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m -668.53591,364.83876 h 104.179 v 134.858 l -50.64998,55.39901 -53.52902,-55.39901 z"
|
||||
id="rect9439-9-1-4-6-1-9-2-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:29.151;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-24-0-8-9-1-3"
|
||||
width="155.79805"
|
||||
height="256.63565"
|
||||
x="141.53377"
|
||||
y="245.46167" />
|
||||
<ellipse
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path9422-5-4-6-3-7-3-4-7-6-5-8-6-0"
|
||||
cx="56.674393"
|
||||
cy="312.50269"
|
||||
rx="32.502956"
|
||||
ry="32.502953" />
|
||||
<circle
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-7-3-4-9-3-0-8-1-4"
|
||||
cx="56.674393"
|
||||
cy="312.50269"
|
||||
r="6.5636883" />
|
||||
<path
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:5.71283;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 24.310144,265.01475 c -11.37,0 -20.5869998,-16.975 -20.5869998,-37.91601 0,-20.93899 8.7769998,4.28401 20.1469998,4.28401 11.368,0 21.026,-25.223 21.026,-4.28401 0,20.94101 -9.217,37.91601 -20.586,37.91601 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-4-0-7-8-2-6-7"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:5.71283;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 91.556144,264.93974 c -11.37,0 -20.587,-16.97497 -20.587,-37.91598 0,-20.93899 8.777,4.284 20.146,4.284 11.368996,0 21.026996,-25.22299 21.026996,-4.284 0,20.94101 -9.218,37.91598 -20.585996,37.91598 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-4-2-5-4-8-6-6-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
style="fill:none;stroke:#bf4b00;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 90.316144,229.42777 0.719,88.95799"
|
||||
id="path9777-8-7-1-6-6-4-4-6-3-7-2-1-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#bf4b00;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 22.444144,230.01474 0.357,88.33803"
|
||||
id="path9777-8-7-1-6-6-4-4-7-9-2-9-3-9-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 184.86214,330.57075 2.038,104.34601"
|
||||
id="path9777-9-7-1-1-4-9-2-6-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<g
|
||||
id="g3124-7-1-2-0-4-9"
|
||||
transform="translate(-5669.7971,-7970.2537)">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path9422-5-4-6-3-7-3-4-2-1-1-6-6-4-5"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path7360-7-8-0-8-7-3-4-0-4-5-6-5-7-3"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
<g
|
||||
id="g3111-5-3-6-0-6-5"
|
||||
transform="translate(-5668.9701,-7993.9995)">
|
||||
<g
|
||||
id="g3120-4-8-6-7-8-4">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8418.7197"
|
||||
cx="5887.2949"
|
||||
id="path9422-5-4-6-3-7-3-4-6-4-7-2-8-9-6"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
transform="translate(-1.2291667e-4,-8.9583334e-5)" />
|
||||
<g
|
||||
id="g3114-4-8-9-0-4-3">
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8418.7197"
|
||||
cx="5887.2949"
|
||||
id="path7360-7-8-0-8-7-3-4-67-1-3-1-2-4-3"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
style="display:inline;fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:33.0824;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-9-9-9-8-1-3-4"
|
||||
width="380.06577"
|
||||
height="415.92224"
|
||||
x="655.27985"
|
||||
y="247.21362" />
|
||||
<path
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:8.23143;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 696.52114,444.60175 c 0,16.38202 -24.459,29.66201 -54.631,29.66201 -30.172,0 6.172,-12.64499 6.172,-29.02701 0,-16.383 -36.344,-30.29799 -6.172,-30.29799 30.172,0 54.631,13.28099 54.631,29.66299 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-8-0-5-7-5-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:3.57849;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 844.23914,428.18475 a 17.500391,17.50039 0 0 0 -17.5,17.50002 17.500391,17.50039 0 0 0 17.5,17.501 17.500391,17.50039 0 0 0 17.501,-17.501 17.500391,17.50039 0 0 0 -17.501,-17.50002 z m 0,13.96601 a 3.5340507,3.5340507 0 0 1 3.534,3.53401 3.5340507,3.5340507 0 0 1 -3.534,3.53499 3.5340507,3.5340507 0 0 1 -3.534,-3.53499 3.5340507,3.5340507 0 0 1 3.534,-3.53401 z"
|
||||
id="path9422-5-4-6-3-7-3-0-9-0-5-8-4-4-5-0-2" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 984.68414,364.90975 -125.397,222.02201"
|
||||
id="path9777-9-54-9-9-3-0-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 646.41614,445.73176 197.719,-0.48001"
|
||||
id="path9777-9-5-8-9-7-2-3-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 311.81414,300.37177 334.602,145.35999"
|
||||
id="path9777-9-7-1-9-02-1-1-4-5-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<circle
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:8.62229;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-7-0-7-1-95-9-3-2-2-0"
|
||||
cx="1203.7281"
|
||||
cy="386.41284"
|
||||
r="43.188274" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.89;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:39.12, 39.12;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="M 844.13514,445.25175 1205.2161,387.17677"
|
||||
id="path9777-9-5-2-9-7-0-3-9-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g3087-9-6-6-8-0-2"
|
||||
transform="translate(-8247.11,-9410.0579)">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="9754.8525"
|
||||
cx="9206.0586"
|
||||
id="path9422-5-4-6-3-7-3-4-6-8-76-9-7-3-8-4"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="6.5636878"
|
||||
cy="9754.8525"
|
||||
cx="9206.0586"
|
||||
id="path7360-7-8-0-8-7-3-4-67-5-5-7-3-1-7-7"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
<path
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:8.23143;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 261.64114,301.16975 c 0,16.38202 24.459,29.66201 54.631,29.66201 30.172,0 -6.172,-12.64499 -6.172,-29.02701 0,-16.383 36.344,-30.29799 6.172,-30.29799 -30.172,0 -54.631,13.28099 -54.631,29.66299 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-8-0-5-7-5-3-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:8.23143;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 261.64114,459.22175 c 0,16.38202 24.459,29.66202 54.631,29.66202 30.172,0 -6.172,-12.645 -6.172,-29.02702 0,-16.383 36.344,-30.29799 6.172,-30.29799 -30.172,0 -54.631,13.281 -54.631,29.66299 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-8-0-5-7-5-3-0-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g3111-5-3-6-0-6-5-6"
|
||||
transform="matrix(-1,0,0,1,6717.0978,-7847.6733)">
|
||||
<g
|
||||
id="g3120-4-8-6-7-8-4-9">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8418.7197"
|
||||
cx="5887.2949"
|
||||
id="path9422-5-4-6-3-7-3-4-6-4-7-2-8-9-6-4"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
transform="translate(-1.2291667e-4,-8.9583334e-5)" />
|
||||
<g
|
||||
id="g3114-4-8-9-0-4-3-6">
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8418.7197"
|
||||
cx="5887.2949"
|
||||
id="path7360-7-8-0-8-7-3-4-67-1-3-1-2-4-3-9"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:8.23143;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 696.52114,602.65375 c 0,16.38202 -24.458,29.66202 -54.63,29.66202 -30.173,0 6.171,-12.645 6.171,-29.02702 0,-16.383 -36.344,-30.29799 -6.171,-30.29799 30.172,0 54.63,13.281 54.63,29.66299 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-8-0-5-7-5-3-0-1-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 645.63914,604.05477 185.841,0.11499"
|
||||
id="path9777-9-5-8-9-7-2-3-3-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 311.03714,458.69475 334.602,145.36002"
|
||||
id="path9777-9-7-1-9-02-1-1-4-5-9-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 311.81414,300.37177 -95.009,-0.507"
|
||||
id="path9777-9-7-1-1-4-9-2-6-0-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 311.03714,458.69475 -95.009,-0.50699"
|
||||
id="path9777-9-7-1-1-4-9-2-6-0-4-2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 986.79814,327.81676 -441.698,-647.76397"
|
||||
id="path9777-9-7-1-9-02-1-1-4-5-9-1-1-6-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="effector-line-guiding.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 100.00053 44.215004"
|
||||
height="44.215004mm"
|
||||
width="100.00053mm">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="138.37077"
|
||||
inkscape:cx="197.42218"
|
||||
inkscape:zoom="1.979899"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(1017.1069,321.35564)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.04416939,0,0,0.04416939,-972.18189,-307.16156)"
|
||||
id="g975">
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:27.437;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-0-3-3-1-9-6-4"
|
||||
width="81.733612"
|
||||
height="243.63861"
|
||||
x="-1003.3881"
|
||||
y="244.60229" />
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:30;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-5-3-8-3-8-5"
|
||||
width="1144.0638"
|
||||
height="103.66059"
|
||||
x="-1002.1069"
|
||||
y="245.8855" />
|
||||
<path
|
||||
style="fill:#b2c032;fill-opacity:1;stroke:#000000;stroke-width:30;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m -668.53591,364.83876 h 104.179 v 134.858 l -50.64998,55.39901 -53.52902,-55.39901 z"
|
||||
id="rect9439-9-1-4-6-1-9-2-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:29.151;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-24-0-8-9-1-3"
|
||||
width="155.79805"
|
||||
height="256.63565"
|
||||
x="141.53377"
|
||||
y="245.46167" />
|
||||
<ellipse
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path9422-5-4-6-3-7-3-4-7-6-5-8-6-0"
|
||||
cx="56.674393"
|
||||
cy="312.50269"
|
||||
rx="32.502956"
|
||||
ry="32.502953" />
|
||||
<circle
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-7-3-4-9-3-0-8-1-4"
|
||||
cx="56.674393"
|
||||
cy="312.50269"
|
||||
r="6.5636883" />
|
||||
<path
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:5.71283;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 24.310144,265.01475 c -11.37,0 -20.5869998,-16.975 -20.5869998,-37.91601 0,-20.93899 8.7769998,4.28401 20.1469998,4.28401 11.368,0 21.026,-25.223 21.026,-4.28401 0,20.94101 -9.217,37.91601 -20.586,37.91601 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-4-0-7-8-2-6-7"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:5.71283;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 91.556144,264.93974 c -11.37,0 -20.587,-16.97497 -20.587,-37.91598 0,-20.93899 8.777,4.284 20.146,4.284 11.368996,0 21.026996,-25.22299 21.026996,-4.284 0,20.94101 -9.218,37.91598 -20.585996,37.91598 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-4-2-5-4-8-6-6-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
style="fill:none;stroke:#bf4b00;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 90.316144,229.42777 0.719,88.95799"
|
||||
id="path9777-8-7-1-6-6-4-4-6-3-7-2-1-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#bf4b00;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 22.444144,230.01474 0.357,88.33803"
|
||||
id="path9777-8-7-1-6-6-4-4-7-9-2-9-3-9-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 184.86214,330.57075 2.038,104.34601"
|
||||
id="path9777-9-7-1-1-4-9-2-6-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<g
|
||||
id="g3124-7-1-2-0-4-9"
|
||||
transform="translate(-5669.7971,-7970.2537)">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path9422-5-4-6-3-7-3-4-2-1-1-6-6-4-5"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path7360-7-8-0-8-7-3-4-0-4-5-6-5-7-3"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
<g
|
||||
id="g3111-5-3-6-0-6-5"
|
||||
transform="translate(-5668.9701,-7993.9995)">
|
||||
<g
|
||||
id="g3120-4-8-6-7-8-4">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8418.7197"
|
||||
cx="5887.2949"
|
||||
id="path9422-5-4-6-3-7-3-4-6-4-7-2-8-9-6"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
transform="translate(-1.2291667e-4,-8.9583334e-5)" />
|
||||
<g
|
||||
id="g3114-4-8-9-0-4-3">
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8418.7197"
|
||||
cx="5887.2949"
|
||||
id="path7360-7-8-0-8-7-3-4-67-1-3-1-2-4-3"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
style="display:inline;fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:33.0824;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-9-9-9-8-1-3-4"
|
||||
width="380.06577"
|
||||
height="415.92224"
|
||||
x="655.27985"
|
||||
y="247.21362" />
|
||||
<path
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:8.23143;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 696.52114,444.60175 c 0,16.38202 -24.459,29.66201 -54.631,29.66201 -30.172,0 6.172,-12.64499 6.172,-29.02701 0,-16.383 -36.344,-30.29799 -6.172,-30.29799 30.172,0 54.631,13.28099 54.631,29.66299 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-8-0-5-7-5-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:3.57849;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 844.23914,428.18475 a 17.500391,17.50039 0 0 0 -17.5,17.50002 17.500391,17.50039 0 0 0 17.5,17.501 17.500391,17.50039 0 0 0 17.501,-17.501 17.500391,17.50039 0 0 0 -17.501,-17.50002 z m 0,13.96601 a 3.5340507,3.5340507 0 0 1 3.534,3.53401 3.5340507,3.5340507 0 0 1 -3.534,3.53499 3.5340507,3.5340507 0 0 1 -3.534,-3.53499 3.5340507,3.5340507 0 0 1 3.534,-3.53401 z"
|
||||
id="path9422-5-4-6-3-7-3-0-9-0-5-8-4-4-5-0-2" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 984.68414,364.90975 -125.397,222.02201"
|
||||
id="path9777-9-54-9-9-3-0-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 646.41614,445.73176 197.719,-0.48001"
|
||||
id="path9777-9-5-8-9-7-2-3-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 311.81414,300.37177 334.602,145.35999"
|
||||
id="path9777-9-7-1-9-02-1-1-4-5-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<circle
|
||||
style="display:inline;fill:#000900;fill-opacity:1;stroke:none;stroke-width:8.62229;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-7-0-7-1-95-9-3-2-2-0"
|
||||
cx="1203.7281"
|
||||
cy="386.41284"
|
||||
r="43.188274" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.89;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:39.12, 39.12;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="M 844.13514,445.25175 1205.2161,387.17677"
|
||||
id="path9777-9-5-2-9-7-0-3-9-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g3087-9-6-6-8-0-2"
|
||||
transform="translate(-8247.11,-9410.0579)">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="9754.8525"
|
||||
cx="9206.0586"
|
||||
id="path9422-5-4-6-3-7-3-4-6-8-76-9-7-3-8-4"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="6.5636878"
|
||||
cy="9754.8525"
|
||||
cx="9206.0586"
|
||||
id="path7360-7-8-0-8-7-3-4-67-5-5-7-3-1-7-7"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
<path
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:8.23143;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 261.64114,301.16975 c 0,16.38202 24.459,29.66201 54.631,29.66201 30.172,0 -6.172,-12.64499 -6.172,-29.02701 0,-16.383 36.344,-30.29799 6.172,-30.29799 -30.172,0 -54.631,13.28099 -54.631,29.66299 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-8-0-5-7-5-3-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:8.23143;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 261.64114,459.22175 c 0,16.38202 24.459,29.66202 54.631,29.66202 30.172,0 -6.172,-12.645 -6.172,-29.02702 0,-16.383 36.344,-30.29799 6.172,-30.29799 -30.172,0 -54.631,13.281 -54.631,29.66299 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-8-0-5-7-5-3-0-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g3111-5-3-6-0-6-5-6"
|
||||
transform="matrix(-1,0,0,1,6717.0978,-7847.6733)">
|
||||
<g
|
||||
id="g3120-4-8-6-7-8-4-9">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8418.7197"
|
||||
cx="5887.2949"
|
||||
id="path9422-5-4-6-3-7-3-4-6-4-7-2-8-9-6-4"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
transform="translate(-1.2291667e-4,-8.9583334e-5)" />
|
||||
<g
|
||||
id="g3114-4-8-9-0-4-3-6">
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8418.7197"
|
||||
cx="5887.2949"
|
||||
id="path7360-7-8-0-8-7-3-4-67-1-3-1-2-4-3-9"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
style="display:inline;fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:8.23143;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="m 696.52114,602.65375 c 0,16.38202 -24.458,29.66202 -54.63,29.66202 -30.173,0 6.171,-12.645 6.171,-29.02702 0,-16.383 -36.344,-30.29799 -6.171,-30.29799 30.172,0 54.63,13.281 54.63,29.66299 z"
|
||||
id="path9422-5-4-6-3-7-0-8-4-8-0-5-7-5-3-0-1-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 645.63914,604.05477 185.841,0.11499"
|
||||
id="path9777-9-5-8-9-7-2-3-3-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 311.03714,458.69475 334.602,145.36002"
|
||||
id="path9777-9-7-1-9-02-1-1-4-5-9-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 311.81414,300.37177 -95.009,-0.507"
|
||||
id="path9777-9-7-1-1-4-9-2-6-0-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 311.03714,458.69475 -95.009,-0.50699"
|
||||
id="path9777-9-7-1-1-4-9-2-6-0-4-2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#433ab2;stroke-width:4.99999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 986.79814,327.81676 -441.698,-647.76397"
|
||||
id="path9777-9-7-1-9-02-1-1-4-5-9-1-1-6-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 43 KiB |
@ -1,491 +1,491 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="feature-single-lines.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 100.00001 85.494713"
|
||||
height="85.494713mm"
|
||||
width="100.00001mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-71"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-379" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-24" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-1"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-3" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-9-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-5-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart-3-4"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path15451-1-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker21821"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path21819"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:collect="always"
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker19587-1"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path19585-6"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:collect="always"
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker19013-1"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path19011-7" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:collect="always"
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker21247-2"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path21245-5" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker21821-0"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path21819-2"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="261.60915"
|
||||
inkscape:cx="283.35446"
|
||||
inkscape:zoom="0.90509668"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(13114.181,11901.61)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.01620016,0,0,0.01620016,-305208.69,-270524.05)"
|
||||
id="g3744">
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker19587-1)"
|
||||
d="m -209124.94,-201493.73 -16973.43,-9799.59"
|
||||
id="path12500-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker19013-1)"
|
||||
d="m -250455.89,-173751.09 -16973.41,-9799.62"
|
||||
id="path12500-0-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker21247-2)"
|
||||
d="m -226098.35,-211293.32 30194.67,-33560.1"
|
||||
id="path12535-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker21821-0)"
|
||||
d="m -267429.3,-183550.71 65025.51,-62994.57"
|
||||
id="path12535-0-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1048.86, 1048.86;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m -195978.41,-244786.19 18619.1,-20694.32"
|
||||
id="path12535-7-8"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1048.86, 1048.86;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m -202530.91,-246414.07 19721.22,-19105.27"
|
||||
id="path12535-0-7-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-9-3-8-4-2"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(86.749888,0,0,86.749888,-1349748.7,-577240.02)"><flowRegion
|
||||
id="flowRegion8812-7-1-2-9-9-9"
|
||||
style="fill:#000000;fill-opacity:1"><rect
|
||||
id="rect8814-2-3-2-4-8-9"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-9-1-1-0-4">C1/C2 line pair from </flowPara><flowPara
|
||||
id="flowPara28589-20">C drive spool</flowPara></flowRoot>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -209124.94,-201493.73 -2293.18,-4113.69"
|
||||
id="path12793-8"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:6.93777px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M -209124.94,-201493.73 Z"
|
||||
id="path12795-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<ellipse
|
||||
style="fill:#00a600;fill-opacity:0.153571;stroke:#000000;stroke-width:426.549;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:853.097, 853.097;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path24092-8"
|
||||
cx="-267141.31"
|
||||
cy="-183946.56"
|
||||
rx="5425.7344"
|
||||
ry="10889.211" />
|
||||
<ellipse
|
||||
style="fill:#00a600;fill-opacity:0.153571;stroke:#000000;stroke-width:426.549;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:853.097, 853.097;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path24092-2-4"
|
||||
cx="-226014.02"
|
||||
cy="-210876.42"
|
||||
rx="5425.7344"
|
||||
ry="10889.211" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1-5-2-1-5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1;stroke:none"
|
||||
transform="matrix(105.59912,61.044652,-61.044652,105.59912,-1374337.7,-1369942.9)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9-8-7-4-70"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8-8-1-4-4"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.78525162px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5-2-7-0-1">line C1</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1-5-2-1-0-5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1;stroke:none"
|
||||
transform="matrix(105.59912,61.044652,-61.044652,105.59912,-1411072.8,-1339819.7)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9-8-7-4-7-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8-8-1-4-8-9"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.78525162px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5-2-7-0-3-6">line C2</flowPara></flowRoot>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1048.86, 1048.86;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m -203845.03,-146840.3 -46610.86,-26910.79"
|
||||
id="path12500-0-8-8-0-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1048.86, 1048.86;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m -164053.64,-175471.8 -46610.87,-26910.79"
|
||||
id="path12500-0-8-8-0-9-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-9-3-8-4-4-5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(105.63247,60.986934,-60.986934,105.63247,-1351470.6,-1353176.1)"><flowRegion
|
||||
id="flowRegion8812-7-1-2-9-9-4-3"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1"><rect
|
||||
id="rect8814-2-3-2-4-8-5-5"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.78525162px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara28589-2-6">to effector</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-9-3-8-4-4-74-2"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(105.63247,60.986934,-60.986934,105.63247,-1390499.6,-1323929.1)"><flowRegion
|
||||
id="flowRegion8812-7-1-2-9-9-4-9-7"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1"><rect
|
||||
id="rect8814-2-3-2-4-8-5-7-1"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.78525162px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara28589-2-7-8">to effector</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-4-6-0-1"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:39.9997px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#00ad00;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97386,0.04581266,-0.04581266,121.97386,-1893980.5,-636153.61)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-7-2-0-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:39.9997px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00ad00;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-0-2-5-3"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:39.99974823px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00ad00;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-9-2-5-3">C anchor</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1-5-8"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#00a600;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97385,0.06665798,-0.06665798,121.97385,-1836765.9,-641503.96)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9-8-8"
|
||||
style="fill:#00a600;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8-8-3"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#00a600;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5-2-6">C1 pivot point</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1-5-7-4"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#00a600;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97385,0.06665798,-0.06665798,121.97385,-1928747.1,-611596.45)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9-8-6-0"
|
||||
style="fill:#00a600;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8-8-5-8"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#00a600;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5-2-1-1">C2 pivot point</flowPara></flowRoot>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="feature-single-lines.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 100.00001 85.494713"
|
||||
height="85.494713mm"
|
||||
width="100.00001mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-71"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-379" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-24" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-1"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-3" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-9-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-5-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart-3-4"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path15451-1-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker21821"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path21819"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:collect="always"
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker19587-1"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path19585-6"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:collect="always"
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker19013-1"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path19011-7" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:collect="always"
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="marker21247-2"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path21245-5" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker21821-0"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path21819-2"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="261.60915"
|
||||
inkscape:cx="283.35446"
|
||||
inkscape:zoom="0.90509668"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(13114.181,11901.61)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.01620016,0,0,0.01620016,-305208.69,-270524.05)"
|
||||
id="g3744">
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker19587-1)"
|
||||
d="m -209124.94,-201493.73 -16973.43,-9799.59"
|
||||
id="path12500-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker19013-1)"
|
||||
d="m -250455.89,-173751.09 -16973.41,-9799.62"
|
||||
id="path12500-0-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker21247-2)"
|
||||
d="m -226098.35,-211293.32 30194.67,-33560.1"
|
||||
id="path12535-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker21821-0)"
|
||||
d="m -267429.3,-183550.71 65025.51,-62994.57"
|
||||
id="path12535-0-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1048.86, 1048.86;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m -195978.41,-244786.19 18619.1,-20694.32"
|
||||
id="path12535-7-8"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1048.86, 1048.86;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m -202530.91,-246414.07 19721.22,-19105.27"
|
||||
id="path12535-0-7-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-9-3-8-4-2"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(86.749888,0,0,86.749888,-1349748.7,-577240.02)"><flowRegion
|
||||
id="flowRegion8812-7-1-2-9-9-9"
|
||||
style="fill:#000000;fill-opacity:1"><rect
|
||||
id="rect8814-2-3-2-4-8-9"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-9-1-1-0-4">C1/C2 line pair from </flowPara><flowPara
|
||||
id="flowPara28589-20">C drive spool</flowPara></flowRoot>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -209124.94,-201493.73 -2293.18,-4113.69"
|
||||
id="path12793-8"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:6.93777px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M -209124.94,-201493.73 Z"
|
||||
id="path12795-4"
|
||||
inkscape:connector-curvature="0" />
|
||||
<ellipse
|
||||
style="fill:#00a600;fill-opacity:0.153571;stroke:#000000;stroke-width:426.549;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:853.097, 853.097;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path24092-8"
|
||||
cx="-267141.31"
|
||||
cy="-183946.56"
|
||||
rx="5425.7344"
|
||||
ry="10889.211" />
|
||||
<ellipse
|
||||
style="fill:#00a600;fill-opacity:0.153571;stroke:#000000;stroke-width:426.549;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:853.097, 853.097;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path24092-2-4"
|
||||
cx="-226014.02"
|
||||
cy="-210876.42"
|
||||
rx="5425.7344"
|
||||
ry="10889.211" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1-5-2-1-5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1;stroke:none"
|
||||
transform="matrix(105.59912,61.044652,-61.044652,105.59912,-1374337.7,-1369942.9)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9-8-7-4-70"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8-8-1-4-4"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.78525162px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5-2-7-0-1">line C1</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1-5-2-1-0-5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1;stroke:none"
|
||||
transform="matrix(105.59912,61.044652,-61.044652,105.59912,-1411072.8,-1339819.7)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9-8-7-4-7-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8-8-1-4-8-9"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.78525162px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00a600;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5-2-7-0-3-6">line C2</flowPara></flowRoot>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1048.86, 1048.86;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m -203845.03,-146840.3 -46610.86,-26910.79"
|
||||
id="path12500-0-8-8-0-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:524.431;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1048.86, 1048.86;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m -164053.64,-175471.8 -46610.87,-26910.79"
|
||||
id="path12500-0-8-8-0-9-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-9-3-8-4-4-5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(105.63247,60.986934,-60.986934,105.63247,-1351470.6,-1353176.1)"><flowRegion
|
||||
id="flowRegion8812-7-1-2-9-9-4-3"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1"><rect
|
||||
id="rect8814-2-3-2-4-8-5-5"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.78525162px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara28589-2-6">to effector</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-9-3-8-4-4-74-2"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
|
||||
transform="matrix(105.63247,60.986934,-60.986934,105.63247,-1390499.6,-1323929.1)"><flowRegion
|
||||
id="flowRegion8812-7-1-2-9-9-4-9-7"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.7853px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1"><rect
|
||||
id="rect8814-2-3-2-4-8-5-7-1"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.78525162px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara28589-2-7-8">to effector</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-4-6-0-1"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:39.9997px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#00ad00;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97386,0.04581266,-0.04581266,121.97386,-1893980.5,-636153.61)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-7-2-0-9"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:39.9997px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00ad00;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-0-2-5-3"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:39.99974823px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#00ad00;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-9-2-5-3">C anchor</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1-5-8"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#00a600;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97385,0.06665798,-0.06665798,121.97385,-1836765.9,-641503.96)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9-8-8"
|
||||
style="fill:#00a600;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8-8-3"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#00a600;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5-2-6">C1 pivot point</flowPara></flowRoot>
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-7-7-50-1-5-7-4"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#00a600;fill-opacity:1;stroke:none"
|
||||
transform="matrix(121.97385,0.06665798,-0.06665798,121.97385,-1928747.1,-611596.45)"><flowRegion
|
||||
id="flowRegion8812-7-9-1-5-9-8-6-0"
|
||||
style="fill:#00a600;fill-opacity:1"><rect
|
||||
id="rect8814-2-7-8-2-8-8-5-8"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762"
|
||||
style="fill:#00a600;fill-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-7-22-2-5-2-1-1">C2 pivot point</flowPara></flowRoot>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 150 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 91 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 47 KiB |
@ -1,88 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="platform.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 99.999991 89.926879"
|
||||
height="89.92688mm"
|
||||
width="99.999992mm">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="208.22018"
|
||||
inkscape:cx="84.302757"
|
||||
inkscape:zoom="1.4"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(915.92267,683.24888)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.05213699,0,0,0.05213699,-868.16922,-647.62634)"
|
||||
id="g858">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000400;stroke-width:49.9999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 42.596299,-633.2497 -457.613409,793.1585 -457.61211,793.17211 915.714019,-0.2816 915.714041,-0.2817 -4.4837,-7.7628 -453.6168,-785.12771 z m 0.01,20.7039 449.131641,777.3509 449.1317,777.36651 -897.784261,0.2749 -897.784299,0.2764 448.65266,-777.6414 z"
|
||||
id="path6909-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;fill:#309ad1;fill-opacity:1;stroke:none;stroke-width:13.5155;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 39.715889,413.33331 -539.934999,308.1506 -177.91181,-308.3326 359.0808,-621.5809 358.766009,0.089 z"
|
||||
id="path4828-4-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="display:inline;fill:#309ad1;fill-opacity:1;stroke:none;stroke-width:13.5155;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 46.454799,413.33331 3.10118,-621.67271 355.980061,0.091 358.7645,621.76371 -179.4599,310.656 z"
|
||||
id="path4828-4-8-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="display:inline;fill:#309ad1;fill-opacity:1;stroke:none;stroke-width:13.5155;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 42.642599,419.80591 536.833941,313.5219 -178.0684,308.24249 -717.84555,-0.1827 -179.30611,-310.74489 z"
|
||||
id="path4828-4-8-1-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="platform.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 99.999991 89.926879"
|
||||
height="89.92688mm"
|
||||
width="99.999992mm">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="208.22018"
|
||||
inkscape:cx="84.302757"
|
||||
inkscape:zoom="1.4"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(915.92267,683.24888)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.05213699,0,0,0.05213699,-868.16922,-647.62634)"
|
||||
id="g858">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000400;stroke-width:49.9999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 42.596299,-633.2497 -457.613409,793.1585 -457.61211,793.17211 915.714019,-0.2816 915.714041,-0.2817 -4.4837,-7.7628 -453.6168,-785.12771 z m 0.01,20.7039 449.131641,777.3509 449.1317,777.36651 -897.784261,0.2749 -897.784299,0.2764 448.65266,-777.6414 z"
|
||||
id="path6909-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;fill:#309ad1;fill-opacity:1;stroke:none;stroke-width:13.5155;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 39.715889,413.33331 -539.934999,308.1506 -177.91181,-308.3326 359.0808,-621.5809 358.766009,0.089 z"
|
||||
id="path4828-4-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="display:inline;fill:#309ad1;fill-opacity:1;stroke:none;stroke-width:13.5155;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 46.454799,413.33331 3.10118,-621.67271 355.980061,0.091 358.7645,621.76371 -179.4599,310.656 z"
|
||||
id="path4828-4-8-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="display:inline;fill:#309ad1;fill-opacity:1;stroke:none;stroke-width:13.5155;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
d="m 42.642599,419.80591 536.833941,313.5219 -178.0684,308.24249 -717.84555,-0.1827 -179.30611,-310.74489 z"
|
||||
id="path4828-4-8-1-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.7 KiB |
@ -1,379 +1,379 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
viewBox="0 0 210 297"
|
||||
version="1.1"
|
||||
id="svg5151"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="print diameter.svg">
|
||||
<defs
|
||||
id="defs5145">
|
||||
<marker
|
||||
inkscape:stockid="ArrowDIN-start"
|
||||
style="overflow:visible"
|
||||
refY="0"
|
||||
refX="0"
|
||||
orient="auto"
|
||||
id="ArrowDIN-start-7-6">
|
||||
<path
|
||||
id="path13335-9-7"
|
||||
style="fill:#000000;stroke:none"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="ArrowDIN-end"
|
||||
style="overflow:visible"
|
||||
refY="0"
|
||||
refX="0"
|
||||
orient="auto"
|
||||
id="ArrowDIN-end-1-8">
|
||||
<path
|
||||
id="path13338-7-5"
|
||||
style="fill:#000000;stroke:none"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect7064-4-4"
|
||||
is_visible="true" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.1"
|
||||
inkscape:cx="393.55778"
|
||||
inkscape:cy="649.164"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="950"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
showguides="false"
|
||||
showborder="false" />
|
||||
<metadata
|
||||
id="metadata5148">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4828-5-6-3-8"
|
||||
d="M 13.04691,165.85962 89.253593,38.093669 h 27.365457 l 72.55757,127.765951 -13.68272,23.7127 H 26.729669 Z"
|
||||
style="fill:none;fill-opacity:1;stroke:#17796d;stroke-width:2.16399193;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6"
|
||||
d="M 142.27061,106.13961 114.28983,38.60343"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-2"
|
||||
d="M 118.97488,106.14697 90.989276,38.60343"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-2-6"
|
||||
d="m 131.26874,130.94101 44.65125,56.88145"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-2-6-1"
|
||||
d="m 143.64907,109.53659 43.9212,58.10699"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0"
|
||||
d="M 116.60054,109.56839 14.577306,167.50043"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-2-6-2"
|
||||
d="M 128.95977,130.94101 26.227584,187.6793"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000002;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:1,2;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path10008"
|
||||
cx="101.16153"
|
||||
cy="131.45352"
|
||||
r="95.199142" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:1, 2;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path10008-7"
|
||||
cx="101.6907"
|
||||
cy="131.45352"
|
||||
r="58.380852" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#5cd680;stroke-width:1.08199596;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 130.12344,132.97386 -7.7493,-13.4124 -7.7493,-13.41265 15.49034,-0.005 15.49034,-0.005 -7.74104,13.4174 z"
|
||||
id="path6909-5-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0"
|
||||
d="M 130.17344,115.13706 114.6518,106.17564"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6"
|
||||
d="m 130.08388,115.10023 15.52164,-8.96142"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6-4"
|
||||
d="m 130.08388,115.10023 v 17.92284"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path10008-7-8"
|
||||
cx="101.16153"
|
||||
cy="131.45352"
|
||||
r="33.054626" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6-4-1"
|
||||
d="M 114.28983,38.724479 V 67.89781"
|
||||
style="fill:none;fill-opacity:1;stroke:#4e2082;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-880.51675,-196.99059)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1">angle</flowPara></flowRoot> <path
|
||||
style="fill:none;stroke:#00000e;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start-7-6);marker-end:url(#ArrowDIN-end-1-8)"
|
||||
d="m -10229.879,4037.4811 c 35.622,-35.4133 67.401,-74.6903 94.598,-116.9199 31.349,-48.6752 56.6,-101.2728 74.978,-156.1752"
|
||||
id="path7062-2-1"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:path-effect="#path-effect7064-4-4"
|
||||
inkscape:original-d="m -10229.879,4037.4811 c -63.679,109.5098 148.044,-293.0376 94.598,-116.9199 -55.619,183.2769 -84.875,-125.3076 74.978,-156.1752"
|
||||
transform="matrix(0.01282356,0.01737065,-0.01737065,0.01282356,317.13947,189.29821)"
|
||||
sodipodi:nodetypes="csc" />
|
||||
<g
|
||||
id="g10395"
|
||||
transform="translate(-106.79545,-27.78125)">
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-3"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-821.96199,-196.88819)"><flowRegion
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRegion8812-7-0-9"><rect
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="rect8814-2-8-0"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4">d</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-3-6"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-820.27904,-195.5652)"><flowRegion
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRegion8812-7-0-9-5"><rect
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="rect8814-2-8-0-5"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-5">1</flowPara></flowRoot> </g>
|
||||
<g
|
||||
transform="translate(-91.54589,5.9570615)"
|
||||
id="g10480">
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-3-4"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-821.96199,-196.88819)"><flowRegion
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRegion8812-7-0-9-6"><rect
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="rect8814-2-8-0-0"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-4">d</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-3-6-1"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-820.27904,-195.5652)"><flowRegion
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRegion8812-7-0-9-5-3"><rect
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="rect8814-2-8-0-5-7"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-5-7">2</flowPara></flowRoot> </g>
|
||||
<flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-909.27618,-174.36988)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97-3-4-7"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0-9-6-9"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8-0-0-1"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-4-3">d</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-907.59324,-173.04689)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97-3-6-1-3"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0-9-5-3-7"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8-0-5-7-6"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-5-7-6">3</flowPara></flowRoot> <path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff2082;stroke-width:1.08199599;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:2.16399198, 2.16399198000000004;stroke-dashoffset:0;stroke-opacity:0.72941178;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 137.47125,128.71179 -7.7493,-13.4124 -7.7493,-13.41265 15.49034,-0.005 15.49034,-0.005 -7.74104,13.4174 z"
|
||||
id="path6909-5-8-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-0"
|
||||
d="m 137.52125,110.87499 -15.52164,-8.96142"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-opacity:0.72941178;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6-0"
|
||||
d="m 137.43169,110.83816 15.52164,-8.96142"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76052935, 1.52105869000000005;stroke-opacity:0.72941178;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6-4-8"
|
||||
d="M 137.43169,110.83816 V 128.761"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76052935, 1.52105869000000005;stroke-opacity:0.72941178;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-27"
|
||||
d="M 149.74237,101.37678 114.28732,38.721961"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-opacity:1;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-27-5"
|
||||
d="M 187.57213,167.64545 151.97626,104.74177"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-opacity:1;stroke-dashoffset:0" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path10008-7-8-0"
|
||||
cx="101.16153"
|
||||
cy="131.45352"
|
||||
r="41.610188" />
|
||||
<flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-904.72046,-166.73898)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97-3-4-7-3"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0-9-6-9-9"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8-0-0-1-8"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-4-3-8">d</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-903.03753,-165.41598)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97-3-6-1-3-5"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0-9-5-3-7-7"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8-0-5-7-6-1"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-5-7-6-9">4</flowPara></flowRoot> <path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-27-6"
|
||||
d="M 126.44433,101.25825 90.989276,38.60343"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-opacity:1;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-27-5-3"
|
||||
d="M 175.91999,187.82246 140.32412,124.91878"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-4"
|
||||
d="m 123.86711,105.4422 -7.26657,4.12619"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path10667"
|
||||
d="m 136.22634,126.81482 -7.26657,4.12619"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
viewBox="0 0 210 297"
|
||||
version="1.1"
|
||||
id="svg5151"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="print diameter.svg">
|
||||
<defs
|
||||
id="defs5145">
|
||||
<marker
|
||||
inkscape:stockid="ArrowDIN-start"
|
||||
style="overflow:visible"
|
||||
refY="0"
|
||||
refX="0"
|
||||
orient="auto"
|
||||
id="ArrowDIN-start-7-6">
|
||||
<path
|
||||
id="path13335-9-7"
|
||||
style="fill:#000000;stroke:none"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="ArrowDIN-end"
|
||||
style="overflow:visible"
|
||||
refY="0"
|
||||
refX="0"
|
||||
orient="auto"
|
||||
id="ArrowDIN-end-1-8">
|
||||
<path
|
||||
id="path13338-7-5"
|
||||
style="fill:#000000;stroke:none"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect7064-4-4"
|
||||
is_visible="true" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.1"
|
||||
inkscape:cx="393.55778"
|
||||
inkscape:cy="649.164"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="950"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
showguides="false"
|
||||
showborder="false" />
|
||||
<metadata
|
||||
id="metadata5148">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4828-5-6-3-8"
|
||||
d="M 13.04691,165.85962 89.253593,38.093669 h 27.365457 l 72.55757,127.765951 -13.68272,23.7127 H 26.729669 Z"
|
||||
style="fill:none;fill-opacity:1;stroke:#17796d;stroke-width:2.16399193;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6"
|
||||
d="M 142.27061,106.13961 114.28983,38.60343"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-2"
|
||||
d="M 118.97488,106.14697 90.989276,38.60343"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-2-6"
|
||||
d="m 131.26874,130.94101 44.65125,56.88145"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-2-6-1"
|
||||
d="m 143.64907,109.53659 43.9212,58.10699"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0"
|
||||
d="M 116.60054,109.56839 14.577306,167.50043"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-2-6-2"
|
||||
d="M 128.95977,130.94101 26.227584,187.6793"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000002;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:1,2;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path10008"
|
||||
cx="101.16153"
|
||||
cy="131.45352"
|
||||
r="95.199142" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:1, 2;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path10008-7"
|
||||
cx="101.6907"
|
||||
cy="131.45352"
|
||||
r="58.380852" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#5cd680;stroke-width:1.08199596;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 130.12344,132.97386 -7.7493,-13.4124 -7.7493,-13.41265 15.49034,-0.005 15.49034,-0.005 -7.74104,13.4174 z"
|
||||
id="path6909-5-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0"
|
||||
d="M 130.17344,115.13706 114.6518,106.17564"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6"
|
||||
d="m 130.08388,115.10023 15.52164,-8.96142"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6-4"
|
||||
d="m 130.08388,115.10023 v 17.92284"
|
||||
style="fill:none;fill-opacity:1;stroke:#5cd680;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path10008-7-8"
|
||||
cx="101.16153"
|
||||
cy="131.45352"
|
||||
r="33.054626" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6-4-1"
|
||||
d="M 114.28983,38.724479 V 67.89781"
|
||||
style="fill:none;fill-opacity:1;stroke:#4e2082;stroke-width:0.327;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-880.51675,-196.99059)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1">angle</flowPara></flowRoot> <path
|
||||
style="fill:none;stroke:#00000e;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowDIN-start-7-6);marker-end:url(#ArrowDIN-end-1-8)"
|
||||
d="m -10229.879,4037.4811 c 35.622,-35.4133 67.401,-74.6903 94.598,-116.9199 31.349,-48.6752 56.6,-101.2728 74.978,-156.1752"
|
||||
id="path7062-2-1"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:path-effect="#path-effect7064-4-4"
|
||||
inkscape:original-d="m -10229.879,4037.4811 c -63.679,109.5098 148.044,-293.0376 94.598,-116.9199 -55.619,183.2769 -84.875,-125.3076 74.978,-156.1752"
|
||||
transform="matrix(0.01282356,0.01737065,-0.01737065,0.01282356,317.13947,189.29821)"
|
||||
sodipodi:nodetypes="csc" />
|
||||
<g
|
||||
id="g10395"
|
||||
transform="translate(-106.79545,-27.78125)">
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-3"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-821.96199,-196.88819)"><flowRegion
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRegion8812-7-0-9"><rect
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="rect8814-2-8-0"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4">d</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-3-6"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-820.27904,-195.5652)"><flowRegion
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRegion8812-7-0-9-5"><rect
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="rect8814-2-8-0-5"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-5">1</flowPara></flowRoot> </g>
|
||||
<g
|
||||
transform="translate(-91.54589,5.9570615)"
|
||||
id="g10480">
|
||||
<flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-3-4"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-821.96199,-196.88819)"><flowRegion
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRegion8812-7-0-9-6"><rect
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="rect8814-2-8-0-0"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-4">d</flowPara></flowRoot> <flowRoot
|
||||
xml:space="preserve"
|
||||
id="flowRoot8810-6-97-3-6-1"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-820.27904,-195.5652)"><flowRegion
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRegion8812-7-0-9-5-3"><rect
|
||||
style="stroke:#00000e;stroke-opacity:1"
|
||||
id="rect8814-2-8-0-5-7"
|
||||
width="588.96417"
|
||||
height="103.93485"
|
||||
x="13269.016"
|
||||
y="3478.3762" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-5-7">2</flowPara></flowRoot> </g>
|
||||
<flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-909.27618,-174.36988)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97-3-4-7"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0-9-6-9"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8-0-0-1"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-4-3">d</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-907.59324,-173.04689)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97-3-6-1-3"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0-9-5-3-7"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8-0-5-7-6"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-5-7-6">3</flowPara></flowRoot> <path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff2082;stroke-width:1.08199599;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:2.16399198, 2.16399198000000004;stroke-dashoffset:0;stroke-opacity:0.72941178;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 137.47125,128.71179 -7.7493,-13.4124 -7.7493,-13.41265 15.49034,-0.005 15.49034,-0.005 -7.74104,13.4174 z"
|
||||
id="path6909-5-8-1"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-0"
|
||||
d="m 137.52125,110.87499 -15.52164,-8.96142"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-opacity:0.72941178;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6-0"
|
||||
d="m 137.43169,110.83816 15.52164,-8.96142"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76052935, 1.52105869000000005;stroke-opacity:0.72941178;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-0-0-6-4-8"
|
||||
d="M 137.43169,110.83816 V 128.761"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38026467;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76052935, 1.52105869000000005;stroke-opacity:0.72941178;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-27"
|
||||
d="M 149.74237,101.37678 114.28732,38.721961"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-opacity:1;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-27-5"
|
||||
d="M 187.57213,167.64545 151.97626,104.74177"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-opacity:1;stroke-dashoffset:0" />
|
||||
<circle
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
id="path10008-7-8-0"
|
||||
cx="101.16153"
|
||||
cy="131.45352"
|
||||
r="41.610188" />
|
||||
<flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-904.72046,-166.73898)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97-3-4-7-3"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0-9-6-9-9"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8-0-0-1-8"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-4-3-8">d</flowPara></flowRoot> <flowRoot
|
||||
transform="matrix(0.07505191,0,0,0.07505191,-903.03753,-165.41598)"
|
||||
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#00000e;stroke-opacity:1"
|
||||
id="flowRoot8810-6-97-3-6-1-3-5"
|
||||
xml:space="preserve"><flowRegion
|
||||
id="flowRegion8812-7-0-9-5-3-7-7"
|
||||
style="stroke:#00000e;stroke-opacity:1"><rect
|
||||
y="3478.3762"
|
||||
x="13269.016"
|
||||
height="103.93485"
|
||||
width="588.96417"
|
||||
id="rect8814-2-8-0-5-7-6-1"
|
||||
style="stroke:#00000e;stroke-opacity:1" /></flowRegion><flowPara
|
||||
id="flowPara8857-1-4-5-7-6-9">4</flowPara></flowRoot> <path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-27-6"
|
||||
d="M 126.44433,101.25825 90.989276,38.60343"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-opacity:1;stroke-dashoffset:0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-27-5-3"
|
||||
d="M 175.91999,187.82246 140.32412,124.91878"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path912-7-7-6-7-0-4"
|
||||
d="m 123.86711,105.4422 -7.26657,4.12619"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path10667"
|
||||
d="m 136.22634,126.81482 -7.26657,4.12619"
|
||||
style="fill:none;fill-opacity:1;stroke:#ff2082;stroke-width:0.38;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.76, 1.52000000000000002;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 22 KiB |
@ -1,181 +1,181 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="281.76974mm"
|
||||
height="137.57664mm"
|
||||
viewBox="0 0 281.76975 137.57664"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="print volume.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect1000"
|
||||
is_visible="true" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 148.49998 : 1"
|
||||
inkscape:vp_y="0 : 999.99992 : 0"
|
||||
inkscape:vp_z="210.00001 : 148.49998 : 1"
|
||||
inkscape:persp3d-origin="105 : 98.999992 : 1"
|
||||
id="perspective926" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect839"
|
||||
is_visible="true" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="477.16853"
|
||||
inkscape:cy="212.76487"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="g1010"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
showborder="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="950"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Ebene 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-55.532538,6.6791818)">
|
||||
<g
|
||||
id="g954"
|
||||
transform="translate(0.96555799,-6.7551595)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path826"
|
||||
d="M 192.89802,7.6108973 211.04088,136.68976 238.06617,114.01119 Z"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path828"
|
||||
d="M 211.04088,136.68976 153.02153,123.64958 192.89802,7.6108973"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path830"
|
||||
d="m 153.02153,123.64958 85.04464,-9.63839"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.00000008, 3.00000008;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g949"
|
||||
transform="translate(0,4.4565659)">
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837"
|
||||
d="M 96.005952,-11.050597 C 95.155257,36.359034 110.42288,118.94994 127.37798,125.96577"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-9"
|
||||
d="M 96.005952,-11.050597 C 103.14693,30.268273 120.17333,93.540616 138.33929,96.105651"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-4"
|
||||
d="m 138.33929,96.105651 c -7.65427,3.375404 -12.41938,15.851739 -10.96131,29.860119"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-4-7"
|
||||
d="m 127.37798,125.96577 c -23.71826,-7.7749 -38.877716,-8.9057 -71.437501,-5.29167"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-4-7-7"
|
||||
d="M 96.005952,-11.050597 C 90.997519,46.564386 82.07467,83.798164 55.940479,120.6741"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-4-7-7-1"
|
||||
d="M 138.33929,96.105651 C 110.46329,109.49742 95.114848,114.79222 55.940479,120.6741"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.00000008, 3.00000008;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g1010">
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path956"
|
||||
d="m 255.0485,6.5032805 c 0,-4.4964 18.3012,-8.14146 40.87689,-8.14146 22.57567,0 40.87688,3.64506 40.87688,8.14146"
|
||||
style="fill:#ffffff;fill-opacity:0.66408273;stroke:#000000;stroke-width:1.00000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path956-5"
|
||||
d="m 255.0485,6.5032805 c 0,4.4963995 18.30121,8.1414595 40.87689,8.1414595 22.57568,0 40.87689,-3.64506 40.87689,-8.1414595"
|
||||
style="fill:#ffffff;fill-opacity:0.66408273;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path956-2"
|
||||
d="m 255.0485,122.256 c 0,-4.4964 18.3012,-8.14146 40.87688,-8.14146 22.57568,0 40.87689,3.64506 40.87689,8.14146"
|
||||
style="fill:#ffffff;fill-opacity:0.66408273;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3.00000011, 3.00000011;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path956-5-5"
|
||||
d="m 255.0485,122.256 c 0,4.4964 18.30121,8.14146 40.87689,8.14146 22.57568,0 40.87689,-3.64506 40.87689,-8.14146"
|
||||
style="fill:#ffffff;fill-opacity:0.66408273;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
transform="translate(195.79167,-177.64881)"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:original-d="m 141.01061,184.15209 c 2.6e-4,27.29501 2.6e-4,88.45716 0,115.75272"
|
||||
inkscape:path-effect="#path-effect1000"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path998"
|
||||
d="M 141.01061,184.15209 V 299.90481"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1002"
|
||||
d="M 255.0485,6.5032805 V 122.256"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="281.76974mm"
|
||||
height="137.57664mm"
|
||||
viewBox="0 0 281.76975 137.57664"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="print volume.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect1000"
|
||||
is_visible="true" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 148.49998 : 1"
|
||||
inkscape:vp_y="0 : 999.99992 : 0"
|
||||
inkscape:vp_z="210.00001 : 148.49998 : 1"
|
||||
inkscape:persp3d-origin="105 : 98.999992 : 1"
|
||||
id="perspective926" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect839"
|
||||
is_visible="true" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="477.16853"
|
||||
inkscape:cy="212.76487"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="g1010"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
showborder="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="950"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Ebene 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-55.532538,6.6791818)">
|
||||
<g
|
||||
id="g954"
|
||||
transform="translate(0.96555799,-6.7551595)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path826"
|
||||
d="M 192.89802,7.6108973 211.04088,136.68976 238.06617,114.01119 Z"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path828"
|
||||
d="M 211.04088,136.68976 153.02153,123.64958 192.89802,7.6108973"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path830"
|
||||
d="m 153.02153,123.64958 85.04464,-9.63839"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.00000008, 3.00000008;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g949"
|
||||
transform="translate(0,4.4565659)">
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837"
|
||||
d="M 96.005952,-11.050597 C 95.155257,36.359034 110.42288,118.94994 127.37798,125.96577"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-9"
|
||||
d="M 96.005952,-11.050597 C 103.14693,30.268273 120.17333,93.540616 138.33929,96.105651"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-4"
|
||||
d="m 138.33929,96.105651 c -7.65427,3.375404 -12.41938,15.851739 -10.96131,29.860119"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-4-7"
|
||||
d="m 127.37798,125.96577 c -23.71826,-7.7749 -38.877716,-8.9057 -71.437501,-5.29167"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-4-7-7"
|
||||
d="M 96.005952,-11.050597 C 90.997519,46.564386 82.07467,83.798164 55.940479,120.6741"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path837-4-7-7-1"
|
||||
d="M 138.33929,96.105651 C 110.46329,109.49742 95.114848,114.79222 55.940479,120.6741"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.00000008, 3.00000008;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
id="g1010">
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path956"
|
||||
d="m 255.0485,6.5032805 c 0,-4.4964 18.3012,-8.14146 40.87689,-8.14146 22.57567,0 40.87688,3.64506 40.87688,8.14146"
|
||||
style="fill:#ffffff;fill-opacity:0.66408273;stroke:#000000;stroke-width:1.00000003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path956-5"
|
||||
d="m 255.0485,6.5032805 c 0,4.4963995 18.30121,8.1414595 40.87689,8.1414595 22.57568,0 40.87689,-3.64506 40.87689,-8.1414595"
|
||||
style="fill:#ffffff;fill-opacity:0.66408273;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path956-2"
|
||||
d="m 255.0485,122.256 c 0,-4.4964 18.3012,-8.14146 40.87688,-8.14146 22.57568,0 40.87689,3.64506 40.87689,8.14146"
|
||||
style="fill:#ffffff;fill-opacity:0.66408273;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:3.00000011, 3.00000011;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path956-5-5"
|
||||
d="m 255.0485,122.256 c 0,4.4964 18.30121,8.14146 40.87689,8.14146 22.57568,0 40.87689,-3.64506 40.87689,-8.14146"
|
||||
style="fill:#ffffff;fill-opacity:0.66408273;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
transform="translate(195.79167,-177.64881)"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:original-d="m 141.01061,184.15209 c 2.6e-4,27.29501 2.6e-4,88.45716 0,115.75272"
|
||||
inkscape:path-effect="#path-effect1000"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path998"
|
||||
d="M 141.01061,184.15209 V 299.90481"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path1002"
|
||||
d="M 255.0485,6.5032805 V 122.256"
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
@ -1,392 +1,392 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="line-deflection.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 100 68.849297"
|
||||
height="68.849297mm"
|
||||
width="100mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-71"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-379" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-24" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-1"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-3" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-9-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-5-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart-3-4"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path15451-1-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker21821"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path21819"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker21821-0"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path21819-2"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="87.001087"
|
||||
inkscape:cx="374.0719"
|
||||
inkscape:zoom="1.28"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(14057.59,12512.791)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.05096223,0,0,0.05096223,-317901.25,-276174.61)"
|
||||
id="g3992">
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:531.127;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-24-0-8-2"
|
||||
width="4042.5703"
|
||||
height="3283.322"
|
||||
x="-330771.94"
|
||||
y="-286140.34" />
|
||||
<g
|
||||
id="g3124-7-1-2-5"
|
||||
transform="matrix(26.22153,0,0,26.22153,-483146.16,-502236.81)">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path9422-5-4-6-3-7-3-4-2-1-1-6-7"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path7360-7-8-0-8-7-3-4-0-4-5-6-4"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
<rect
|
||||
style="fill:#b2c0ae;fill-opacity:1;stroke:#000000;stroke-width:1048.86;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-5"
|
||||
width="23178.729"
|
||||
height="3567.8171"
|
||||
x="-334447.75"
|
||||
y="-290480.44" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -327986.2,-284969.05 3457.01,10736.98"
|
||||
id="path9777-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<ellipse
|
||||
style="fill:#dcbb2e;fill-opacity:1;stroke:#332eb4;stroke-width:1311.07;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path9422-5-4-6-7"
|
||||
cx="-318195.5"
|
||||
cy="-277284.28"
|
||||
rx="6411.7617"
|
||||
ry="6411.7612" />
|
||||
<circle
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-7-5"
|
||||
cx="-318195.5"
|
||||
cy="-277284.28"
|
||||
r="1132.4626" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:573.195;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -318215.66,-277313.2 -6340.21,-9425.91"
|
||||
id="path9783-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:573.195;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -318181.78,-277313.2 6340.21,-9425.91"
|
||||
id="path9783-6-3"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -329593.19,-284297.57 8719.85,28676.42"
|
||||
id="path9777-5-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:531.127;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-24-0-8-2-3"
|
||||
width="4042.5703"
|
||||
height="3283.322"
|
||||
x="-303546.66"
|
||||
y="-286118.19" />
|
||||
<g
|
||||
id="g3124-7-1-2-5-0"
|
||||
transform="matrix(26.22153,0,0,26.22153,-455920.87,-502214.66)">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path9422-5-4-6-3-7-3-4-2-1-1-6-7-6"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path7360-7-8-0-8-7-3-4-0-4-5-6-4-2"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
<rect
|
||||
style="fill:#b2c0ae;fill-opacity:1;stroke:#000000;stroke-width:1048.86;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-5-8"
|
||||
width="23178.729"
|
||||
height="3567.8171"
|
||||
x="-307222.47"
|
||||
y="-290458.28" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -301420.13,-285360.83 11444.18,1186.11"
|
||||
id="path9777-5-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<ellipse
|
||||
style="fill:#dcbb2e;fill-opacity:1;stroke:#332eb4;stroke-width:1311.07;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path9422-5-4-6-7-3"
|
||||
cx="-290970.22"
|
||||
cy="-277262.09"
|
||||
rx="6411.7617"
|
||||
ry="6411.7612" />
|
||||
<circle
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-7-5-5"
|
||||
cx="-290970.22"
|
||||
cy="-277262.09"
|
||||
r="1132.4626" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:573.195;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -290990.38,-277291.04 -6340.21,-9425.91"
|
||||
id="path9783-7-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:573.195;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -290956.5,-277291.04 6340.21,-9425.91"
|
||||
id="path9783-6-3-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -302367.91,-284275.41 8719.85,28676.41"
|
||||
id="path9777-5-6-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="line-deflection.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
id="svg866"
|
||||
version="1.1"
|
||||
viewBox="0 0 100 68.849297"
|
||||
height="68.849297mm"
|
||||
width="100mm">
|
||||
<defs
|
||||
id="defs860">
|
||||
<marker
|
||||
id="ArrowDIN-start-02-8-4-8-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-2-1-5-62"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-6-8-9-3-17"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-9-2-0-0-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-7-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-9-4" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-1-8"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-7-6" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-4-5"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-71"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-379" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-end-5"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-end">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 8,0 -8,2.11 v -4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13338-24" />
|
||||
</marker>
|
||||
<inkscape:path-effect
|
||||
lpeversion="0"
|
||||
is_visible="true"
|
||||
id="path-effect7064-1"
|
||||
effect="spiro" />
|
||||
<marker
|
||||
id="ArrowDIN-start-1"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-3" />
|
||||
</marker>
|
||||
<marker
|
||||
id="ArrowDIN-start-9-3"
|
||||
orient="auto"
|
||||
refX="0"
|
||||
refY="0"
|
||||
style="overflow:visible"
|
||||
inkscape:stockid="ArrowDIN-start">
|
||||
<path
|
||||
d="M -8,0 8,-2.11 v 4.22 z"
|
||||
style="fill:#000000;stroke:none"
|
||||
id="path13335-5-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:isstock="true"
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart-3-4"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path15451-1-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker21821"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path21819"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="marker21821-0"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path21819-2"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-height="976"
|
||||
inkscape:window-width="1920"
|
||||
showborder="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="g1692"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:cy="87.001087"
|
||||
inkscape:cx="374.0719"
|
||||
inkscape:zoom="1.28"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata863">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(14057.59,12512.791)"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<g
|
||||
transform="matrix(0.0381366,0,0,0.0381366,-1282.8902,-1414.8552)"
|
||||
id="g1692">
|
||||
<g
|
||||
transform="matrix(0.05096223,0,0,0.05096223,-317901.25,-276174.61)"
|
||||
id="g3992">
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:531.127;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-24-0-8-2"
|
||||
width="4042.5703"
|
||||
height="3283.322"
|
||||
x="-330771.94"
|
||||
y="-286140.34" />
|
||||
<g
|
||||
id="g3124-7-1-2-5"
|
||||
transform="matrix(26.22153,0,0,26.22153,-483146.16,-502236.81)">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path9422-5-4-6-3-7-3-4-2-1-1-6-7"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path7360-7-8-0-8-7-3-4-0-4-5-6-4"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
<rect
|
||||
style="fill:#b2c0ae;fill-opacity:1;stroke:#000000;stroke-width:1048.86;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-5"
|
||||
width="23178.729"
|
||||
height="3567.8171"
|
||||
x="-334447.75"
|
||||
y="-290480.44" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -327986.2,-284969.05 3457.01,10736.98"
|
||||
id="path9777-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<ellipse
|
||||
style="fill:#dcbb2e;fill-opacity:1;stroke:#332eb4;stroke-width:1311.07;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path9422-5-4-6-7"
|
||||
cx="-318195.5"
|
||||
cy="-277284.28"
|
||||
rx="6411.7617"
|
||||
ry="6411.7612" />
|
||||
<circle
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-7-5"
|
||||
cx="-318195.5"
|
||||
cy="-277284.28"
|
||||
r="1132.4626" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:573.195;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -318215.66,-277313.2 -6340.21,-9425.91"
|
||||
id="path9783-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:573.195;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -318181.78,-277313.2 6340.21,-9425.91"
|
||||
id="path9783-6-3"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -329593.19,-284297.57 8719.85,28676.42"
|
||||
id="path9777-5-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<rect
|
||||
style="fill:#ccc021;fill-opacity:1;stroke:#000000;stroke-width:531.127;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-9-8-24-0-8-2-3"
|
||||
width="4042.5703"
|
||||
height="3283.322"
|
||||
x="-303546.66"
|
||||
y="-286118.19" />
|
||||
<g
|
||||
id="g3124-7-1-2-5-0"
|
||||
transform="matrix(26.22153,0,0,26.22153,-455920.87,-502214.66)">
|
||||
<ellipse
|
||||
ry="32.502953"
|
||||
rx="32.502956"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path9422-5-4-6-3-7-3-4-2-1-1-6-7-6"
|
||||
style="fill:#c2c7bd;fill-opacity:1;stroke:#7f8688;stroke-width:6.6462;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<circle
|
||||
r="6.5636873"
|
||||
cy="8303.792"
|
||||
cx="5888.1216"
|
||||
id="path7360-7-8-0-8-7-3-4-0-4-5-6-4-2"
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:1.3104;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</g>
|
||||
<rect
|
||||
style="fill:#b2c0ae;fill-opacity:1;stroke:#000000;stroke-width:1048.86;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="rect9439-5-8"
|
||||
width="23178.729"
|
||||
height="3567.8171"
|
||||
x="-307222.47"
|
||||
y="-290458.28" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -301420.13,-285360.83 11444.18,1186.11"
|
||||
id="path9777-5-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<ellipse
|
||||
style="fill:#dcbb2e;fill-opacity:1;stroke:#332eb4;stroke-width:1311.07;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path9422-5-4-6-7-3"
|
||||
cx="-290970.22"
|
||||
cy="-277262.09"
|
||||
rx="6411.7617"
|
||||
ry="6411.7612" />
|
||||
<circle
|
||||
style="fill:#000900;fill-opacity:1;stroke:none;stroke-width:226.09;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
id="path7360-7-8-0-8-7-5-5"
|
||||
cx="-290970.22"
|
||||
cy="-277262.09"
|
||||
r="1132.4626" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:573.195;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -290990.38,-277291.04 -6340.21,-9425.91"
|
||||
id="path9783-7-7"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:573.195;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -290956.5,-277291.04 6340.21,-9425.91"
|
||||
id="path9783-6-3-9"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;stroke:#433ab2;stroke-width:131.107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m -302367.91,-284275.41 8719.85,28676.41"
|
||||
id="path9777-5-6-4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 15 KiB |
@ -1,4 +1,4 @@
|
||||
# generated by PrusaSlicer 2.2.0 on 2021-07-25 at 16:56:32 UTC
|
||||
# generated by PrusaSlicer 2.2.0 on 2021-08-07 at 12:59:12 UTC
|
||||
bed_temperature = 0
|
||||
bridge_fan_speed = 100
|
||||
compatible_printers = Trikarus
|
||||
@ -6,7 +6,7 @@ compatible_printers_condition =
|
||||
compatible_prints = Trikarus
|
||||
compatible_prints_condition =
|
||||
cooling = 1
|
||||
disable_fan_first_layers = 2
|
||||
disable_fan_first_layers = 3
|
||||
end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n"
|
||||
extrusion_multiplier = 0.9
|
||||
fan_always_on = 1
|
||||
@ -45,11 +45,11 @@ filament_unloading_speed_start = 100
|
||||
filament_vendor = (Unknown)
|
||||
filament_wipe = nil
|
||||
first_layer_bed_temperature = 0
|
||||
first_layer_temperature = 210
|
||||
first_layer_temperature = 200
|
||||
inherits =
|
||||
max_fan_speed = 100
|
||||
min_fan_speed = 65
|
||||
min_print_speed = 10
|
||||
slowdown_below_layer_time = 5
|
||||
start_filament_gcode = "; Filament gcode\n"
|
||||
temperature = 215
|
||||
temperature = 200
|
||||
|
@ -1,4 +1,4 @@
|
||||
# generated by PrusaSlicer 2.2.0 on 2021-07-25 at 16:56:30 UTC
|
||||
# generated by PrusaSlicer 2.2.0 on 2021-08-07 at 13:05:18 UTC
|
||||
avoid_crossing_perimeters = 0
|
||||
bottom_fill_pattern = concentric
|
||||
bottom_solid_layers = 2
|
||||
@ -17,36 +17,36 @@ dont_support_bridges = 1
|
||||
draft_shield = 0
|
||||
elefant_foot_compensation = 0.2
|
||||
ensure_vertical_shell_thickness = 1
|
||||
external_perimeter_extrusion_width = 0
|
||||
external_perimeter_extrusion_width = 1.57
|
||||
external_perimeter_speed = 50%
|
||||
external_perimeters_first = 0
|
||||
extra_perimeters = 1
|
||||
extruder_clearance_height = 20
|
||||
extruder_clearance_radius = 20
|
||||
extrusion_width = 0
|
||||
extrusion_width = 1.57
|
||||
fill_angle = 45
|
||||
fill_density = 100%
|
||||
fill_pattern = concentric
|
||||
first_layer_acceleration = 0
|
||||
first_layer_extrusion_width = 120%
|
||||
first_layer_extrusion_width = 150%
|
||||
first_layer_height = 100%
|
||||
first_layer_speed = 20
|
||||
gap_fill_speed = 11
|
||||
first_layer_speed = 15
|
||||
gap_fill_speed = 20
|
||||
gcode_comments = 0
|
||||
gcode_label_objects = 0
|
||||
infill_acceleration = 0
|
||||
infill_every_layers = 1
|
||||
infill_extruder = 1
|
||||
infill_extrusion_width = 0
|
||||
infill_extrusion_width = 1.57
|
||||
infill_first = 0
|
||||
infill_only_where_needed = 0
|
||||
infill_overlap = 35%
|
||||
infill_speed = 45
|
||||
infill_overlap = 30%
|
||||
infill_speed = 33
|
||||
inherits =
|
||||
interface_shells = 0
|
||||
layer_height = 1
|
||||
max_print_speed = 50
|
||||
max_volumetric_speed = 50
|
||||
max_print_speed = 33
|
||||
max_volumetric_speed = 40
|
||||
min_skirt_length = 100
|
||||
notes =
|
||||
only_retract_when_crossing_perimeters = 1
|
||||
@ -55,7 +55,7 @@ output_filename_format = [input_filename_base].gcode
|
||||
overhangs = 1
|
||||
perimeter_acceleration = 0
|
||||
perimeter_extruder = 1
|
||||
perimeter_extrusion_width = 0
|
||||
perimeter_extrusion_width = 1.57
|
||||
perimeter_speed = 33
|
||||
perimeters = 2
|
||||
post_process =
|
||||
@ -68,12 +68,12 @@ skirt_distance = 40
|
||||
skirt_height = 1
|
||||
skirts = 1
|
||||
slice_closing_radius = 0.049
|
||||
small_perimeter_speed = 25%
|
||||
small_perimeter_speed = 15
|
||||
solid_infill_below_area = 70
|
||||
solid_infill_every_layers = 0
|
||||
solid_infill_extruder = 1
|
||||
solid_infill_extrusion_width = 0
|
||||
solid_infill_speed = 33%
|
||||
solid_infill_extrusion_width = 1.57
|
||||
solid_infill_speed = 20
|
||||
spiral_vase = 0
|
||||
standby_temperature_delta = -5
|
||||
support_material = 1
|
||||
@ -83,7 +83,7 @@ support_material_buildplate_only = 0
|
||||
support_material_contact_distance = 0.2
|
||||
support_material_enforce_layers = 0
|
||||
support_material_extruder = 1
|
||||
support_material_extrusion_width = 0
|
||||
support_material_extrusion_width = 1.22
|
||||
support_material_interface_contact_loops = 0
|
||||
support_material_interface_extruder = 1
|
||||
support_material_interface_layers = 2
|
||||
@ -91,7 +91,7 @@ support_material_interface_spacing = 4
|
||||
support_material_interface_speed = 100%
|
||||
support_material_pattern = rectilinear
|
||||
support_material_spacing = 8
|
||||
support_material_speed = 35
|
||||
support_material_speed = 33
|
||||
support_material_synchronize_layers = 0
|
||||
support_material_threshold = 0
|
||||
support_material_with_sheath = 1
|
||||
@ -99,8 +99,8 @@ support_material_xy_spacing = 50%
|
||||
thin_walls = 1
|
||||
threads = 6
|
||||
top_fill_pattern = concentric
|
||||
top_infill_extrusion_width = 0
|
||||
top_solid_infill_speed = 60%
|
||||
top_infill_extrusion_width = 1.4
|
||||
top_solid_infill_speed = 15
|
||||
top_solid_layers = 4
|
||||
top_solid_min_thickness = 0
|
||||
travel_speed = 130
|
||||
|
@ -1,4 +1,4 @@
|
||||
# generated by PrusaSlicer 2.2.0 on 2021-07-25 at 16:56:35 UTC
|
||||
# generated by PrusaSlicer 2.2.0 on 2021-08-03 at 14:29:33 UTC
|
||||
bed_custom_model = /home/tomate/.PrusaSlicer/printer/trikarus-bed.stl
|
||||
bed_custom_texture = /home/tomate/.PrusaSlicer/printer/trikarus-bed.svg
|
||||
bed_shape = 498.097x43.5779,492.404x86.8241,482.963x129.41,469.846x171.01,453.154x211.309,433.013x250,409.576x286.788,383.022x321.394,353.553x353.553,321.394x383.022,286.788x409.576,250x433.013,211.309x453.154,171.01x469.846,129.41x482.963,86.8241x492.404,43.5779x498.097,3.06162e-14x500,-43.5779x498.097,-86.8241x492.404,-129.41x482.963,-171.01x469.846,-211.309x453.154,-250x433.013,-286.788x409.576,-321.394x383.022,-353.553x353.553,-383.022x321.394,-409.576x286.788,-433.013x250,-453.154x211.309,-469.846x171.01,-482.963x129.41,-492.404x86.8241,-498.097x43.5779,-500x6.12323e-14,-498.097x-43.5779,-492.404x-86.8241,-482.963x-129.41,-469.846x-171.01,-453.154x-211.309,-433.013x-250,-409.576x-286.788,-383.022x-321.394,-353.553x-353.553,-321.394x-383.022,-286.788x-409.576,-250x-433.013,-211.309x-453.154,-171.01x-469.846,-129.41x-482.963,-86.8241x-492.404,-43.5779x-498.097,-9.18485e-14x-500,43.5779x-498.097,86.8241x-492.404,129.41x-482.963,171.01x-469.846,211.309x-453.154,250x-433.013,286.788x-409.576,321.394x-383.022,353.553x-353.553,383.022x-321.394,409.576x-286.788,433.013x-250,453.154x-211.309,469.846x-171.01,482.963x-129.41,492.404x-86.8241,498.097x-43.5779,500x-1.22465e-13
|
||||
@ -41,7 +41,7 @@ nozzle_diameter = 1.4
|
||||
parking_pos_retraction = 92
|
||||
print_host =
|
||||
printer_model =
|
||||
printer_notes = - M203 command in PrusaSlicer takes mm/second but Duet RRF takes those values as mm/minute. So you need to enter the mm/minute values without conversion\n- M73 not supported by RRF\n- retraction is configured by firmware and is set to M207 S0.8 R0.0 F2500 Z0.8 (0.8 mm) - so we skip to use the suggestion of 3 mm in PrusaSlicer (it is disabled)
|
||||
printer_notes = - M203 command in PrusaSlicer takes mm/second but Duet RRF takes those values as mm/minute. So you need to enter the mm/minute values without conversion\n- M73 not supported by RRF\n- retraction is configured by firmware and is set to M207 S1.6 R0.0 F2500 Z0.8 (1.6 mm) - so we skip to use the suggestion of 3 mm in PrusaSlicer (it is disabled)
|
||||
printer_settings_id = Trikarus
|
||||
printer_technology = FFF
|
||||
printer_variant =
|
||||
@ -69,7 +69,7 @@ thumbnails =
|
||||
toolchange_gcode =
|
||||
use_firmware_retraction = 1
|
||||
use_relative_e_distances = 0
|
||||
use_volumetric_e = 1
|
||||
variable_layer_height = 1
|
||||
use_volumetric_e = 0
|
||||
variable_layer_height = 0
|
||||
wipe = 0
|
||||
z_offset = 0
|
||||
|