0822 Does not work
						commit
						a1981564a3
					
				| @ -0,0 +1,14 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8" ?> | ||||||
|  | <?ccsproject version="1.0"?> | ||||||
|  | <projectOptions> | ||||||
|  | 	<deviceVariant value="TMS320C28XX.TMS320F28335"/> | ||||||
|  | 	<deviceFamily value="C2000"/> | ||||||
|  | 	<codegenToolVersion value="6.2.0"/> | ||||||
|  | 	<isElfFormat value="false"/> | ||||||
|  | 	<linkerCommandFile value="28335_RAM_lnk.cmd"/> | ||||||
|  | 	<rts value="libc.a"/> | ||||||
|  | 	<templateProperties value="id=com.ti.common.project.core.emptyProjectTemplate,"/> | ||||||
|  | 	<isTargetManual value="false"/> | ||||||
|  | 	<origin value="C:/CCSWorkSpaces/temp/DVRFramework"/> | ||||||
|  | 	<connection value="common/targetdb/connections/TIXDS100v3_Dot7_Connection.xml"/> | ||||||
|  | </projectOptions> | ||||||
| @ -0,0 +1,194 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  | <?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> | ||||||
|  | 	<storageModule configRelations="2" moduleId="org.eclipse.cdt.core.settings"> | ||||||
|  | 		<cconfiguration id="com.ti.ccstudio.buildDefinitions.C2000.Debug.2040603795"> | ||||||
|  | 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.C2000.Debug.2040603795" moduleId="org.eclipse.cdt.core.settings" name="Debug"> | ||||||
|  | 				<externalSettings/> | ||||||
|  | 				<extensions> | ||||||
|  | 					<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/> | ||||||
|  | 					<extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||||
|  | 					<extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||||
|  | 					<extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||||
|  | 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||||
|  | 				</extensions> | ||||||
|  | 			</storageModule> | ||||||
|  | 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||||
|  | 				<configuration artifactExtension="out" artifactName="${SRC_ROOT}/sys/build/Debug/framework" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.C2000.Debug.2040603795" name="Debug" parent="com.ti.ccstudio.buildDefinitions.C2000.Debug"> | ||||||
|  | 					<folderInfo id="com.ti.ccstudio.buildDefinitions.C2000.Debug.2040603795." name="/" resourcePath=""> | ||||||
|  | 						<toolChain id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.DebugToolchain.830787211" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.linkerDebug.1778512584"> | ||||||
|  | 							<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.1197154302" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList"> | ||||||
|  | 								<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=TMS320C28XX.TMS320F28335"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="DEVICE_CORE_ID=C2800"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="CCS_MBS_VERSION=5.5.0"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="LINK_ORDER=F28335.cmd;-lrts2800_fpu32.lib;"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=28335_RAM_lnk.cmd"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="PRODUCTS="/> | ||||||
|  | 								<listOptionValue builtIn="false" value="PRODUCT_MACRO_IMPORTS={}"/> | ||||||
|  | 							</option> | ||||||
|  | 							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.624589266" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="21.6.0.LTS" valueType="string"/> | ||||||
|  | 							<targetPlatform id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.targetPlatformDebug.1195867980" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.targetPlatformDebug"/> | ||||||
|  | 							<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.builderDebug.1484000353" keepEnvironmentInBuildfile="false" name="GNU Make" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.builderDebug"/> | ||||||
|  | 							<tool id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.compilerDebug.1731246565" name="C2000 Compiler" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.compilerDebug"> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.LARGE_MEMORY_MODEL.2072485324" name="Option deprecated, set by default (--large_memory_model, -ml)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.LARGE_MEMORY_MODEL" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.UNIFIED_MEMORY.2020368090" name="Unified memory (--unified_memory, -mt)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.UNIFIED_MEMORY" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.SILICON_VERSION.200319597" name="Processor version (--silicon_version, -v)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.SILICON_VERSION.28" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FLOAT_SUPPORT.1002982879" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FLOAT_SUPPORT.fpu32" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_LEVEL.158333741" name="Optimization level (--opt_level, -O)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_LEVEL.4" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_FOR_SPEED.1189713323" name="Speed vs. size trade-offs (--opt_for_speed, -mf)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.OPT_FOR_SPEED.5" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FP_MODE.597990472" name="Floating Point mode (--fp_mode)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FP_MODE" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.FP_MODE.relaxed" valueType="enumerated"/> | ||||||
|  | 								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.INCLUDE_PATH.910773204" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.INCLUDE_PATH" valueType="includePath"> | ||||||
|  | 									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${SRC_ROOT}/sys/include"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${SRC_ROOT}/DSP2833x_headers/include"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${SRC_ROOT}/DSP2833x_common/include"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${WORKSPACE_LOC}/FLOATPOINTLIB"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/> | ||||||
|  | 								</option> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ADVICE__PERFORMANCE.1890281965" name="Provide advice on optimization techniques (--advice:performance)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ADVICE__PERFORMANCE" value="--advice:performance=all" valueType="string"/> | ||||||
|  | 								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEFINE.1385179336" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEFINE" valueType="definedSymbols"> | ||||||
|  | 									<listOptionValue builtIn="false" value="_DEBUG"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="LARGE_MODEL"/> | ||||||
|  | 								</option> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEBUGGING_MODEL.451239249" name="Debugging model" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEBUGGING_MODEL" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DIAG_WRAP.44979444" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DIAG_WRAP.off" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DISPLAY_ERROR_NUMBER.320946418" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ISSUE_REMARKS.1678891727" name="Issue remarks (--issue_remarks, -pdr)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ISSUE_REMARKS" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.QUIET_LEVEL.1661022843" name="Quiet Level" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.QUIET_LEVEL" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.QUIET_LEVEL.QUIET" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ABI.2128235277" name="Application binary interface [See 'General' page to edit] (--abi)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ABI" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ABI.coffabi" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ASM_LISTING.1104407996" name="Generate listing file (--asm_listing, -al)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.ASM_LISTING" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DISABLE_INLINING.31466939" name="Disable inlining (--disable_inlining)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compilerID.DISABLE_INLINING" value="false" valueType="boolean"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__C_SRCS.423959130" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__C_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__CPP_SRCS.447191296" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__CPP_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__ASM_SRCS.1088389375" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__ASM_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__ASM2_SRCS.274059361" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.compiler.inputType__ASM2_SRCS"/> | ||||||
|  | 							</tool> | ||||||
|  | 							<tool id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.linkerDebug.1778512584" name="C2000 Linker" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exe.linkerDebug"> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.STACK_SIZE.1215847210" name="Set C system stack size (--stack_size, -stack)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.STACK_SIZE" value="0x100" valueType="string"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.MAP_FILE.569103737" name="Link information (map) listed into <file> (--map_file, -m)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.MAP_FILE" value=""${SRC_ROOT}/sys/build/Debug/framework.map"" valueType="string"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.OUTPUT_FILE.167409769" name="Specify output file name (--output_file, -o)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.OUTPUT_FILE" value="${SRC_ROOT}/sys/build/Debug/framework.out" valueType="string"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.HEAP_SIZE.60955433" name="Heap size for C/C++ dynamic memory allocation (--heap_size, -heap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.HEAP_SIZE" value="0x100" valueType="string"/> | ||||||
|  | 								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.LIBRARY.1339269017" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.LIBRARY" valueType="libs"> | ||||||
|  | 									<listOptionValue builtIn="false" value="libc.a"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${UTILITIES}/flash_api/2833x/28335/v210/lib/Flash28335_API_V210.lib"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="rts2800_fpu32.lib"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="rts2800_fpu32_fast_supplement.lib"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${WORKSPACE_LOC}/FLOATPOINTLIB/Debug/FLOATPOINTLIB.lib"/> | ||||||
|  | 								</option> | ||||||
|  | 								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.SEARCH_PATH.345223286" name="Add <dir> to library search path (--search_path, -i)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.SEARCH_PATH" valueType="libPaths"> | ||||||
|  | 									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${UTILITIES}/flash_api/2833x/28335/v210/lib"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${PROJECT_ROOT}"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${SRC_ROOT}/sys/build"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${SRC_ROOT}/DSP2833x_headers/include"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${FAST_FPU32_SUPPLEMENT}/lib"/> | ||||||
|  | 									<listOptionValue builtIn="false" value="${WORKSPACE_LOC}/FLOATPOINTLIB/Debug"/> | ||||||
|  | 								</option> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DIAG_WRAP.1827120485" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DIAG_WRAP.off" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DISPLAY_ERROR_NUMBER.728966569" name="Emit diagnostic identifier numbers (--display_error_number)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.XML_LINK_INFO.689360326" name="Detailed link information data-base into <file> (--xml_link_info, -xml_link_info)" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.linkerID.XML_LINK_INFO" value=""${ProjName}_linkInfo.xml"" valueType="string"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__CMD_SRCS.1717731033" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__CMD_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__CMD2_SRCS.1965417765" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__CMD2_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__GEN_CMDS.1435745153" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.exeLinker.inputType__GEN_CMDS"/> | ||||||
|  | 							</tool> | ||||||
|  | 							<tool id="com.ti.ccstudio.buildDefinitions.C2000_21.6.hex.1661532341" name="C2000 Hex Utility" superClass="com.ti.ccstudio.buildDefinitions.C2000_21.6.hex"/> | ||||||
|  | 						</toolChain> | ||||||
|  | 					</folderInfo> | ||||||
|  | 					<sourceEntries> | ||||||
|  | 						<entry excluding="SYSCTRL/AlgorithmWorkEntry.cpp|spi_rom_interface.c|digital_io.c|analog_in.c|pwm_interface.c|hsm.c|app_main.c|cmd/F28335.cmd|modbus_slave.c|analog_out.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> | ||||||
|  | 					</sourceEntries> | ||||||
|  | 				</configuration> | ||||||
|  | 			</storageModule> | ||||||
|  | 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||||
|  | 		</cconfiguration> | ||||||
|  | 		<cconfiguration id="com.ti.ccstudio.buildDefinitions.C2000.Release.1688218530"> | ||||||
|  | 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.ti.ccstudio.buildDefinitions.C2000.Release.1688218530" moduleId="org.eclipse.cdt.core.settings" name="Release"> | ||||||
|  | 				<externalSettings/> | ||||||
|  | 				<extensions> | ||||||
|  | 					<extension id="com.ti.ccstudio.binaryparser.CoffParser" point="org.eclipse.cdt.core.BinaryParser"/> | ||||||
|  | 					<extension id="com.ti.ccstudio.errorparser.CoffErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||||
|  | 					<extension id="com.ti.ccstudio.errorparser.LinkErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||||
|  | 					<extension id="com.ti.ccstudio.errorparser.AsmErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||||
|  | 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | ||||||
|  | 				</extensions> | ||||||
|  | 			</storageModule> | ||||||
|  | 			<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||||
|  | 				<configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" id="com.ti.ccstudio.buildDefinitions.C2000.Release.1688218530" name="Release" parent="com.ti.ccstudio.buildDefinitions.C2000.Release"> | ||||||
|  | 					<folderInfo id="com.ti.ccstudio.buildDefinitions.C2000.Release.1688218530." name="/" resourcePath=""> | ||||||
|  | 						<toolChain id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.ReleaseToolchain.1897835650" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.ReleaseToolchain" targetTool="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.linkerRelease.114937104"> | ||||||
|  | 							<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.116122469" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList"> | ||||||
|  | 								<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=TMS320C28XX.TMS320F28335"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="OUTPUT_FORMAT=COFF"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="CCS_MBS_VERSION=5.5.0"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="LINKER_COMMAND_FILE=28335_RAM_lnk.cmd"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/> | ||||||
|  | 								<listOptionValue builtIn="false" value="OUTPUT_TYPE=executable"/> | ||||||
|  | 							</option> | ||||||
|  | 							<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.116123921" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="6.2.0" valueType="string"/> | ||||||
|  | 							<targetPlatform id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.targetPlatformRelease.1291109672" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.targetPlatformRelease"/> | ||||||
|  | 							<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.builderRelease.1360820187" keepEnvironmentInBuildfile="false" name="GNU Make" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.builderRelease"/> | ||||||
|  | 							<tool id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.compilerRelease.486955678" name="C2000 Compiler" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.compilerRelease"> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.LARGE_MEMORY_MODEL.258118407" name="Use large memory model (--large_memory_model, -ml)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.LARGE_MEMORY_MODEL" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.UNIFIED_MEMORY.685177003" name="Unified memory (--unified_memory, -mt)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.UNIFIED_MEMORY" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.SILICON_VERSION.1089679905" name="Processor version (--silicon_version, -v)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.SILICON_VERSION.28" valueType="enumerated"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.FLOAT_SUPPORT.330649707" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.FLOAT_SUPPORT.fpu32" valueType="enumerated"/> | ||||||
|  | 								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WARNING.202516022" name="Treat diagnostic <id> as warning (--diag_warning, -pdsw)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WARNING" valueType="stringList"> | ||||||
|  | 									<listOptionValue builtIn="false" value="225"/> | ||||||
|  | 								</option> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DISPLAY_ERROR_NUMBER.861584018" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WRAP.4729059" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.DIAG_WRAP.off" valueType="enumerated"/> | ||||||
|  | 								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.INCLUDE_PATH.277004018" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compilerID.INCLUDE_PATH" valueType="includePath"> | ||||||
|  | 									<listOptionValue builtIn="false" value=""${CG_TOOL_ROOT}/include""/> | ||||||
|  | 								</option> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__C_SRCS.1379003288" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__C_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__CPP_SRCS.1178256257" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__CPP_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__ASM_SRCS.103330727" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__ASM_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__ASM2_SRCS.1730673654" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.compiler.inputType__ASM2_SRCS"/> | ||||||
|  | 							</tool> | ||||||
|  | 							<tool id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.linkerRelease.114937104" name="C2000 Linker" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exe.linkerRelease"> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.STACK_SIZE.835162724" name="Set C system stack size (--stack_size, -stack)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.STACK_SIZE" value="0x300" valueType="string"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.OUTPUT_FILE.1105468446" name="Specify output file name (--output_file, -o)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.OUTPUT_FILE" useByScannerDiscovery="false" value="${ProjName}.out" valueType="string"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.MAP_FILE.1415258391" name="Input and output sections listed into <file> (--map_file, -m)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.MAP_FILE" value=""${ProjName}.map"" valueType="string"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.XML_LINK_INFO.1998060963" name="Detailed link information data-base into <file> (--xml_link_info, -xml_link_info)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.XML_LINK_INFO" value=""${ProjName}_linkInfo.xml"" valueType="string"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DISPLAY_ERROR_NUMBER.1519711672" name="Emit diagnostic identifier numbers (--display_error_number)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/> | ||||||
|  | 								<option id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DIAG_WRAP.1448229379" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.DIAG_WRAP.off" valueType="enumerated"/> | ||||||
|  | 								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.SEARCH_PATH.1579599178" name="Add <dir> to library search path (--search_path, -i)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.SEARCH_PATH" valueType="libPaths"> | ||||||
|  | 									<listOptionValue builtIn="false" value=""${CG_TOOL_ROOT}/lib""/> | ||||||
|  | 									<listOptionValue builtIn="false" value=""${CG_TOOL_ROOT}/include""/> | ||||||
|  | 								</option> | ||||||
|  | 								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.LIBRARY.117696091" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.linkerID.LIBRARY" valueType="libs"> | ||||||
|  | 									<listOptionValue builtIn="false" value=""libc.a""/> | ||||||
|  | 								</option> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__CMD_SRCS.1278335248" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__CMD_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__CMD2_SRCS.81365331" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__CMD2_SRCS"/> | ||||||
|  | 								<inputType id="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__GEN_CMDS.1350236437" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.C2000_6.2.exeLinker.inputType__GEN_CMDS"/> | ||||||
|  | 							</tool> | ||||||
|  | 						</toolChain> | ||||||
|  | 					</folderInfo> | ||||||
|  | 				</configuration> | ||||||
|  | 			</storageModule> | ||||||
|  | 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | ||||||
|  | 		</cconfiguration> | ||||||
|  | 	</storageModule> | ||||||
|  | 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | ||||||
|  | 	<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | ||||||
|  | 		<project id="Framework.com.ti.ccstudio.buildDefinitions.C2000.ProjectType.1226128593" name="C2000" projectType="com.ti.ccstudio.buildDefinitions.C2000.ProjectType"/> | ||||||
|  | 	</storageModule> | ||||||
|  | 	<storageModule moduleId="scannerConfiguration"/> | ||||||
|  | 	<storageModule moduleId="org.eclipse.cdt.core.language.mapping"> | ||||||
|  | 		<project-mappings> | ||||||
|  | 			<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.asmSource" language="com.ti.ccstudio.core.TIASMLanguage"/> | ||||||
|  | 			<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cHeader" language="com.ti.ccstudio.core.TIGCCLanguage"/> | ||||||
|  | 			<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cSource" language="com.ti.ccstudio.core.TIGCCLanguage"/> | ||||||
|  | 			<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cxxHeader" language="com.ti.ccstudio.core.TIGPPLanguage"/> | ||||||
|  | 			<content-type-mapping configuration="" content-type="org.eclipse.cdt.core.cxxSource" language="com.ti.ccstudio.core.TIGPPLanguage"/> | ||||||
|  | 		</project-mappings> | ||||||
|  | 	</storageModule> | ||||||
|  | 	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> | ||||||
|  | 	<storageModule moduleId="null.endianPreference"/> | ||||||
|  | 	<storageModule moduleId="cpuFamily"/> | ||||||
|  | </cproject> | ||||||
| @ -0,0 +1,32 @@ | |||||||
|  | 
 | ||||||
|  | # Created by https://www.gitignore.io/api/codecomposerstudio | ||||||
|  | # Edit at https://www.gitignore.io/?templates=codecomposerstudio | ||||||
|  | 
 | ||||||
|  | ### CodeComposerStudio ### | ||||||
|  | 
 | ||||||
|  | tmp/ | ||||||
|  | *.tmp | ||||||
|  | *.bak | ||||||
|  | # Generated build artifact directories | ||||||
|  | Debug/ | ||||||
|  | Release/ | ||||||
|  | Flash/ | ||||||
|  | RAM/ | ||||||
|  | # Generated build artifacts | ||||||
|  | makefile | ||||||
|  | *.map | ||||||
|  | *.mk | ||||||
|  | *.opt | ||||||
|  | *.pp | ||||||
|  | *.xml | ||||||
|  | # Generated directories | ||||||
|  | .config/ | ||||||
|  | .launches/ | ||||||
|  | # Generated file used to help display error messages in the problems view | ||||||
|  | .xdchelp | ||||||
|  | # Uniflash session files | ||||||
|  | *.uniflashsession | ||||||
|  | .settings/ | ||||||
|  | targetConfigs/ | ||||||
|  | 
 | ||||||
|  | # End of https://www.gitignore.io/api/codecomposerstudio | ||||||
| @ -0,0 +1,152 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <projectDescription> | ||||||
|  | 	<name>DVR500Framework</name> | ||||||
|  | 	<comment></comment> | ||||||
|  | 	<projects> | ||||||
|  | 	</projects> | ||||||
|  | 	<buildSpec> | ||||||
|  | 		<buildCommand> | ||||||
|  | 			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> | ||||||
|  | 			<arguments> | ||||||
|  | 			</arguments> | ||||||
|  | 		</buildCommand> | ||||||
|  | 		<buildCommand> | ||||||
|  | 			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> | ||||||
|  | 			<triggers>full,incremental,</triggers> | ||||||
|  | 			<arguments> | ||||||
|  | 			</arguments> | ||||||
|  | 		</buildCommand> | ||||||
|  | 	</buildSpec> | ||||||
|  | 	<natures> | ||||||
|  | 		<nature>com.ti.ccstudio.core.ccsNature</nature> | ||||||
|  | 		<nature>org.eclipse.cdt.core.cnature</nature> | ||||||
|  | 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> | ||||||
|  | 		<nature>org.eclipse.cdt.core.ccnature</nature> | ||||||
|  | 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> | ||||||
|  | 	</natures> | ||||||
|  | 	<linkedResources> | ||||||
|  | 		<link> | ||||||
|  | 			<name>app_main.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-2-ORIGINAL_PROJECT_ROOT/source/app_main.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>Debug/framework.out</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>EXTERNAL_BUILD_ARTIFACT</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_ADC_cal.asm</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_ADC_cal.asm</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_CodeStartBranch.asm</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_CodeStartBranch.asm</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_CpuTimers.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_CpuTimers.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_ECan.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-2-ORIGINAL_PROJECT_ROOT/source/DSP2833x_ECan.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_ECap.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_ECap.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_EPwm.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_EPwm.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_EQep.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_EQep.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_GlobalVariableDefs.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_MemCopy.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_MemCopy.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_PieCtrl.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_PieCtrl.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_PieVect.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_PieVect.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_SWPrioritizedDefaultIsr.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_SWPrioritizedDefaultIsr.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_Sci.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_Sci.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_SysCtrl.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_SysCtrl.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_Xintf.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_Xintf.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/DSP2833x_usDelay.asm</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/DSP2833x_usDelay.asm</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/Date_ComBoard.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-2-ORIGINAL_PROJECT_ROOT/source/Date_ComBoard.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/Ecap2.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/Ecap2.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 		<link> | ||||||
|  | 			<name>F28335/Gpio.c</name> | ||||||
|  | 			<type>1</type> | ||||||
|  | 			<locationURI>PARENT-3-ORIGINAL_PROJECT_ROOT/DSP2833x_common/source/Gpio.c</locationURI> | ||||||
|  | 		</link> | ||||||
|  | 	</linkedResources> | ||||||
|  | 	<variableList> | ||||||
|  | 		<variable> | ||||||
|  | 			<name>FAST_FPU32_SUPPLEMENT</name> | ||||||
|  | 			<value>file:/C:/ti/controlSUITE/libs/math/FPUfastRTS/V100</value> | ||||||
|  | 		</variable> | ||||||
|  | 		<variable> | ||||||
|  | 			<name>ORIGINAL_PROJECT_ROOT</name> | ||||||
|  | 			<value>file:/C:/CCSWorkSpaces/Framework_500_Hz/sys/build/framework</value> | ||||||
|  | 		</variable> | ||||||
|  | 		<variable> | ||||||
|  | 			<name>SRC_ROOT</name> | ||||||
|  | 			<value>$%7BPARENT-3-ORIGINAL_PROJECT_ROOT%7D</value> | ||||||
|  | 		</variable> | ||||||
|  | 		<variable> | ||||||
|  | 			<name>UTILITIES</name> | ||||||
|  | 			<value>file:/C:/ti/controlSUITE/libs/utilities</value> | ||||||
|  | 		</variable> | ||||||
|  | 	</variableList> | ||||||
|  | </projectDescription> | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlertBase.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/AlertBase.h" | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlertBase::AlertBase(): | ||||||
|  |         //m_mode(ALERT::AlertBase::UNDEFINED),
 | ||||||
|  |         m_time_sample(-1.0), | ||||||
|  |         m_level(FP_ZERO), | ||||||
|  |         m_period(FP_ZERO), | ||||||
|  |         m_timer(FP_ZERO) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | AlertBase::mode_t AlertBase::get_mode() const | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//get_mode()
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | bool AlertBase::compare(mode_t mode) const | ||||||
|  | { | ||||||
|  |     return m_mode == mode; | ||||||
|  |     //
 | ||||||
|  | }//compare()
 | ||||||
|  | //
 | ||||||
|  | */ | ||||||
|  | } /* namespace ALERT */ | ||||||
| @ -0,0 +1,62 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlertBase.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #ifndef ALERT_ALARMBASE_H_ | ||||||
|  | #define ALERT_ALARMBASE_H_ | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | struct AlertBaseConfiguration | ||||||
|  | { | ||||||
|  |     float level; | ||||||
|  |     float period; | ||||||
|  |     AlertBaseConfiguration(): | ||||||
|  |         level(-1.0), | ||||||
|  |         period(-1.0) | ||||||
|  |     {} | ||||||
|  | };//AlertBaseConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AlertBase | ||||||
|  | { | ||||||
|  | //public:
 | ||||||
|  | //    enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL};
 | ||||||
|  | //protected:
 | ||||||
|  | //    mode_t m_mode;
 | ||||||
|  | protected: | ||||||
|  |     float m_time_sample; | ||||||
|  | protected: | ||||||
|  |     float m_level; | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  |     float m_period; | ||||||
|  |     float m_timer; | ||||||
|  | //public:
 | ||||||
|  | //    mode_t mode;
 | ||||||
|  | public: | ||||||
|  |     AlertBase(); | ||||||
|  |     virtual void setup(float time_sample) = 0; | ||||||
|  |     virtual void configure(const AlertBaseConfiguration& config) = 0; | ||||||
|  | //public:
 | ||||||
|  |     //mode_t get_mode() const;
 | ||||||
|  |     //bool compare(mode_t mode) const;
 | ||||||
|  | public: | ||||||
|  |     virtual void reset() = 0; | ||||||
|  |     virtual void execute(float reference) = 0; | ||||||
|  | protected: | ||||||
|  |     virtual void _execute_undef(float reference) = 0; | ||||||
|  |     virtual void _execute_operational(float reference) = 0; | ||||||
|  | //
 | ||||||
|  | };//AlertBase
 | ||||||
|  | //
 | ||||||
|  | } /* namespace ALERT */ | ||||||
|  | //
 | ||||||
|  | #endif /* ALERT_ALARMBASE_H_ */ | ||||||
| @ -0,0 +1,96 @@ | |||||||
|  | /*
 | ||||||
|  |  * FaultDecrease.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/FaultDecrease.h" | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | FaultDecrease::FaultDecrease(): | ||||||
|  |         ALERT::AlertBase(), | ||||||
|  | //        m_state(ALERT::FaultDecrease::UNKNOWN),
 | ||||||
|  |         m_fault(false), | ||||||
|  |         fault(false), | ||||||
|  |         _execute(&ALERT::FaultDecrease::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void FaultDecrease::setup(float time_sample) | ||||||
|  | { | ||||||
|  |         m_time_sample = time_sample; | ||||||
|  |     //
 | ||||||
|  | }//setup()
 | ||||||
|  | //
 | ||||||
|  | void FaultDecrease::configure(const ALERT::AlertBaseConfiguration& config) | ||||||
|  | { | ||||||
|  |     m_level = config.level; | ||||||
|  |     m_period = config.period; | ||||||
|  |     m_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_fault = false; | ||||||
|  |     fault = false; | ||||||
|  |     //
 | ||||||
|  |     if((m_time_sample > FP_ZERO) && (m_period > m_time_sample) && (m_level >= FP_ZERO)) | ||||||
|  |     { | ||||||
|  |         _execute = &ALERT::FaultDecrease::_execute_operational; | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  | }//configure()
 | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FaultDecrease::reset() | ||||||
|  | { | ||||||
|  |     m_fault = false; | ||||||
|  |     fault = false; | ||||||
|  |     m_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//reset()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FaultDecrease::execute(float reference) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(reference); | ||||||
|  |     //
 | ||||||
|  | }//execute()
 | ||||||
|  | //
 | ||||||
|  | void FaultDecrease::_execute_undef(float reference) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  | }//_execute_undef()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FaultDecrease::_execute_operational(float reference) | ||||||
|  | { | ||||||
|  |     if(reference <= m_level) | ||||||
|  |     { | ||||||
|  |         if(m_timer >= m_period) | ||||||
|  |         { | ||||||
|  |             m_fault = true; | ||||||
|  |             fault = true; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             m_timer += m_time_sample; | ||||||
|  |             m_fault = false; | ||||||
|  |             fault = false; | ||||||
|  |             //
 | ||||||
|  |         }//
 | ||||||
|  |         //
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         m_timer = FP_ZERO; | ||||||
|  |         m_fault = false; | ||||||
|  |         fault = false; | ||||||
|  |         //
 | ||||||
|  |     }//
 | ||||||
|  |     //
 | ||||||
|  | }//_execute_operational_warning()
 | ||||||
|  | //
 | ||||||
|  | } /* namespace ALERT */ | ||||||
| @ -0,0 +1,46 @@ | |||||||
|  | /*
 | ||||||
|  |  * FaultDecrease.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/AlertBase.h" | ||||||
|  | 
 | ||||||
|  | #ifndef ALERT_FAULTDECREASE_H_ | ||||||
|  | #define ALERT_FAULTDECREASE_H_ | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class FaultDecrease: public ALERT::AlertBase | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | //    enum state_t {UNKNOWN, NORMAL, FAULT};
 | ||||||
|  | private: | ||||||
|  | //    state_t m_state;
 | ||||||
|  |     bool m_fault; | ||||||
|  | public: | ||||||
|  |     bool fault; | ||||||
|  | public: | ||||||
|  |     FaultDecrease(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const ALERT::AlertBaseConfiguration& config); | ||||||
|  | public: | ||||||
|  | //    state_t get_state() const;
 | ||||||
|  | //    bool compare_state(state_t state) const;
 | ||||||
|  | //    bool is_fault();
 | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(float reference); | ||||||
|  | private: | ||||||
|  |     void (FaultDecrease::*_execute)(float reference); | ||||||
|  |     void _execute_undef(float reference); | ||||||
|  |     void _execute_operational(float reference); | ||||||
|  |     //
 | ||||||
|  | };//FaultDecrease()
 | ||||||
|  | 
 | ||||||
|  | } /* namespace ALERT */ | ||||||
|  | 
 | ||||||
|  | #endif /* ALERT_FAULTDECREASE_H_ */ | ||||||
| @ -0,0 +1,92 @@ | |||||||
|  | /*
 | ||||||
|  |  * FaultExceed.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/FaultExceed.h" | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | FaultExceed::FaultExceed(): | ||||||
|  |         ALERT::AlertBase(), | ||||||
|  |         m_fault(false), | ||||||
|  |         fault(false), | ||||||
|  |         _execute(&ALERT::FaultExceed::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void FaultExceed::setup(float time_sample) | ||||||
|  | { | ||||||
|  |     m_time_sample = time_sample; | ||||||
|  |     //
 | ||||||
|  | }//setup()
 | ||||||
|  | //
 | ||||||
|  | void FaultExceed::configure(const AlertBaseConfiguration& config) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_level = config.level; | ||||||
|  |     m_period = config.period; | ||||||
|  |     //
 | ||||||
|  |     m_fault = false; | ||||||
|  |     fault = false; | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     if((m_time_sample > FP_ZERO) && (m_period >= m_time_sample)&&(m_level > FP_ZERO)) | ||||||
|  |     { | ||||||
|  |         _execute = &ALERT::FaultExceed::_execute_operational; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//configure()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FaultExceed::reset() | ||||||
|  | { | ||||||
|  |     m_fault = false; | ||||||
|  |     fault = false; | ||||||
|  |     m_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//reset()
 | ||||||
|  | //
 | ||||||
|  | void FaultExceed::execute(float reference) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(reference); | ||||||
|  |     //
 | ||||||
|  | }//execute()
 | ||||||
|  | //
 | ||||||
|  | void FaultExceed::_execute_undef(float reference) | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FaultExceed::_execute_operational(float reference) | ||||||
|  | { | ||||||
|  |     if(reference >= m_level) | ||||||
|  |     { | ||||||
|  |         if(m_timer >= m_period) | ||||||
|  |         { | ||||||
|  |             m_fault = true; | ||||||
|  |             fault = true; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             m_timer += m_time_sample; | ||||||
|  |             m_fault = false; | ||||||
|  |             fault = false; | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |         //
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         m_timer = FP_ZERO; | ||||||
|  |         m_fault = false; | ||||||
|  |         fault = false; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace ALERT */ | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | /*
 | ||||||
|  |  * FaultExceed.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/AlertBase.h" | ||||||
|  | 
 | ||||||
|  | #ifndef ALERT_FAULTEXCEED_H_ | ||||||
|  | #define ALERT_FAULTEXCEED_H_ | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class FaultExceed: public ALERT::AlertBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     bool m_fault; | ||||||
|  | public: | ||||||
|  |     bool fault; | ||||||
|  | public: | ||||||
|  |     FaultExceed(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const AlertBaseConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(float reference); | ||||||
|  | private: | ||||||
|  |     void (FaultExceed::*_execute)(float reference); | ||||||
|  |     void _execute_undef(float reference); | ||||||
|  |     void _execute_operational(float reference); | ||||||
|  |     //
 | ||||||
|  | };//FaultExceed()
 | ||||||
|  | 
 | ||||||
|  | } /* namespace ALERT */ | ||||||
|  | 
 | ||||||
|  | #endif /* ALERT_FAULTEXCEED_H_ */ | ||||||
| @ -0,0 +1,88 @@ | |||||||
|  | /*
 | ||||||
|  |  * WarningDecrease.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/WarningDecrease.h" | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | WarningDecrease::WarningDecrease(): | ||||||
|  |         ALERT::AlertBase(), | ||||||
|  |         m_warning(false), | ||||||
|  |         warning(false), | ||||||
|  |         _execute(&ALERT::WarningDecrease::_execute_undef) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void WarningDecrease::setup(float time_sample) | ||||||
|  | { | ||||||
|  |     m_time_sample = time_sample; | ||||||
|  |     //
 | ||||||
|  | }//setup()
 | ||||||
|  | //
 | ||||||
|  | void WarningDecrease::configure(const AlertBaseConfiguration& config) | ||||||
|  | { | ||||||
|  |     m_level = config.level; | ||||||
|  |     m_period = config.period; | ||||||
|  |     //
 | ||||||
|  |     m_warning = false; | ||||||
|  |     //
 | ||||||
|  |     if((m_time_sample > FP_ZERO) && (m_period >= m_time_sample) && (m_level > FP_ZERO)) | ||||||
|  |     { | ||||||
|  |         _execute = &ALERT::WarningDecrease::_execute_operational; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//configure()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void WarningDecrease::reset() | ||||||
|  | { | ||||||
|  |     m_warning = false; | ||||||
|  |     warning = false; | ||||||
|  |     m_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//reset()
 | ||||||
|  | //
 | ||||||
|  | void WarningDecrease::execute(float reference) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(reference); | ||||||
|  |     //
 | ||||||
|  | }//execute()
 | ||||||
|  | //
 | ||||||
|  | void WarningDecrease::_execute_undef(float reference) | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void WarningDecrease::_execute_operational(float reference) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     if(reference <= m_level) | ||||||
|  |     { | ||||||
|  |         if(m_timer >= m_period) | ||||||
|  |         { | ||||||
|  |             m_warning = true; | ||||||
|  |             warning = true; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             m_timer += m_time_sample; | ||||||
|  |             m_warning = false; | ||||||
|  |             warning = false; | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         m_warning = false; | ||||||
|  |         warning = false; | ||||||
|  |         m_timer = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |     }//else if
 | ||||||
|  |     //
 | ||||||
|  | }//_execute_operational()
 | ||||||
|  | //
 | ||||||
|  | } /* namespace ALERT */ | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | /*
 | ||||||
|  |  * WarningDecrease.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/AlertBase.h" | ||||||
|  | 
 | ||||||
|  | #ifndef ALERT_WARNINGDECREASE_H_ | ||||||
|  | #define ALERT_WARNINGDECREASE_H_ | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class WarningDecrease: public ALERT::AlertBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     bool m_warning; | ||||||
|  | public: | ||||||
|  |     bool warning; | ||||||
|  | public: | ||||||
|  |     WarningDecrease(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const AlertBaseConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(float reference); | ||||||
|  | private: | ||||||
|  |     void (WarningDecrease::*_execute)(float reference); | ||||||
|  |     void _execute_undef(float reference); | ||||||
|  |     void _execute_operational(float reference); | ||||||
|  | //
 | ||||||
|  | };//
 | ||||||
|  | 
 | ||||||
|  | } /* namespace ALERT */ | ||||||
|  | 
 | ||||||
|  | #endif /* ALERT_WARNINGDECREASE_H_ */ | ||||||
| @ -0,0 +1,96 @@ | |||||||
|  | /*
 | ||||||
|  |  * WarningExceed.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/WarningExceed.h" | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | WarningExceed::WarningExceed(): | ||||||
|  |         ALERT::AlertBase(), | ||||||
|  |         m_warning(false), | ||||||
|  |         warning(false), | ||||||
|  |         _execute(&ALERT::WarningExceed::_execute_undef) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void WarningExceed::setup(float time_sample) | ||||||
|  | { | ||||||
|  |     m_time_sample = time_sample; | ||||||
|  |     //
 | ||||||
|  | }//setup()
 | ||||||
|  | //
 | ||||||
|  | void WarningExceed::configure(const AlertBaseConfiguration& config) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_level = config.level; | ||||||
|  |     m_period = config.period; | ||||||
|  |     //
 | ||||||
|  |     m_warning = false; | ||||||
|  |     //
 | ||||||
|  |     if((m_time_sample > FP_ZERO)&&(m_period > m_time_sample)&&(m_level >= FP_ZERO)) | ||||||
|  |     { | ||||||
|  |         _execute = &ALERT::WarningExceed::_execute_operational; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//configure()
 | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void WarningExceed::reset() | ||||||
|  | { | ||||||
|  |     m_warning = false; | ||||||
|  |     warning = false; | ||||||
|  |     m_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//reset()
 | ||||||
|  | //
 | ||||||
|  | void WarningExceed::execute(float reference) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(reference); | ||||||
|  |     //
 | ||||||
|  | }//execute()
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | void WarningExceed::_execute_undef(float reference) | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void WarningExceed::_execute_operational(float reference) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     if(reference >= m_level) | ||||||
|  |     { | ||||||
|  |         if(m_timer >= m_period) | ||||||
|  |         { | ||||||
|  |             m_warning = true; | ||||||
|  |             warning = true; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             m_timer += m_time_sample; | ||||||
|  |             m_warning = false; | ||||||
|  |             warning = false; | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         m_warning = false; | ||||||
|  |         warning = false; | ||||||
|  |         m_timer = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |     }//else if
 | ||||||
|  |     //
 | ||||||
|  | }//_execute_operational()
 | ||||||
|  | //
 | ||||||
|  | } /* namespace ALERT */ | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | /*
 | ||||||
|  |  * WarningExceed.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Alert/AlertBase.h" | ||||||
|  | 
 | ||||||
|  | #ifndef ALERT_WARNINGEXCEED_H_ | ||||||
|  | #define ALERT_WARNINGEXCEED_H_ | ||||||
|  | 
 | ||||||
|  | namespace ALERT | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class WarningExceed: public ALERT::AlertBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     bool m_warning; | ||||||
|  | public: | ||||||
|  |     bool warning; | ||||||
|  | public: | ||||||
|  |     WarningExceed(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const AlertBaseConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(float reference); | ||||||
|  | private: | ||||||
|  |     void (WarningExceed::*_execute)(float reference); | ||||||
|  |     void _execute_undef(float reference); | ||||||
|  |     void _execute_operational(float reference); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace ALERT */ | ||||||
|  | 
 | ||||||
|  | #endif /* ALERT_WARNINGEXCEED_H_ */ | ||||||
| @ -0,0 +1,22 @@ | |||||||
|  | 
 | ||||||
|  | //###########################################################################
 | ||||||
|  | //
 | ||||||
|  | // FILE:   DSP28x_Project.h
 | ||||||
|  | //
 | ||||||
|  | // TITLE:  DSP28x Project Headerfile and Examples Include File
 | ||||||
|  | //
 | ||||||
|  | //###########################################################################
 | ||||||
|  | // $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
 | ||||||
|  | // $Release Date: November  1, 2016 $
 | ||||||
|  | // $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
 | ||||||
|  | //             http://www.ti.com/ ALL RIGHTS RESERVED $
 | ||||||
|  | //###########################################################################
 | ||||||
|  | 
 | ||||||
|  | #ifndef DSP28x_PROJECT_H | ||||||
|  | #define DSP28x_PROJECT_H | ||||||
|  | 
 | ||||||
|  | #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File | ||||||
|  | #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File | ||||||
|  | 
 | ||||||
|  | #endif  // end of DSP28x_PROJECT_H definition
 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,80 @@ | |||||||
|  | // TI File $Revision: /main/2 $
 | ||||||
|  | // Checkin $Date: June 22, 2007   13:11:24 $
 | ||||||
|  | //###########################################################################
 | ||||||
|  | //
 | ||||||
|  | // FILE:  Flash2833x_API_Config.h
 | ||||||
|  | //
 | ||||||
|  | // TITLE: F2833x Flash Algo's - User Settings
 | ||||||
|  | //
 | ||||||
|  | // NOTE:  This file contains user defined settings that
 | ||||||
|  | //        are used by the F2833x Flash APIs.
 | ||||||
|  | //
 | ||||||
|  | //###########################################################################
 | ||||||
|  | // $TI Release:$
 | ||||||
|  | // $Release Date:$
 | ||||||
|  | //###########################################################################
 | ||||||
|  | 
 | ||||||
|  | #ifndef FLASH2833X_API_CONFIG_H | ||||||
|  | #define FLASH2833X_API_CONFIG_H | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // Variables that can be configured by the user. 
 | ||||||
|  | 
 | ||||||
|  | /*-----------------------------------------------------------------------------
 | ||||||
|  |    1. Specify the device. | ||||||
|  |       Define the device to be programmed as "1" (no quotes). | ||||||
|  |       Define all other devices as "0" (no quotes).   | ||||||
|  | -----------------------------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | #define FLASH_F28335   1 | ||||||
|  | #define FLASH_F28334   0 | ||||||
|  | #define FLASH_F28332   0 | ||||||
|  | 
 | ||||||
|  | /*-----------------------------------------------------------------------------
 | ||||||
|  |    2. Specify the clock rate of the CPU (SYSCLKOUT) in nS. | ||||||
|  | 
 | ||||||
|  |       Take into account the input clock frequency and the PLL multiplier | ||||||
|  |       that your application will use. | ||||||
|  |   | ||||||
|  |       Use one of the values provided, or define your own. | ||||||
|  |       The trailing L is required tells the compiler to treat  | ||||||
|  |       the number as a 64-bit value.   | ||||||
|  | 
 | ||||||
|  |       Only one statement should be uncommented. | ||||||
|  | 
 | ||||||
|  |       Example:  CLKIN is a 30MHz crystal.  | ||||||
|  |   | ||||||
|  |                 If the application will set PLLCR = 0xA then the CPU clock  | ||||||
|  |                 will be 150Mhz (SYSCLKOUT = 150MHz).   | ||||||
|  | 
 | ||||||
|  |                 In this case, the CPU_RATE will be 6.667L | ||||||
|  |                 Uncomment the line:  #define CPU_RATE  6.667L    | ||||||
|  | -----------------------------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | #define CPU_RATE    6.667L   // for a 150MHz CPU clock speed (SYSCLKOUT)
 | ||||||
|  | //#define CPU_RATE   10.000L   // for a 100MHz CPU clock speed (SYSCLKOUT)
 | ||||||
|  | //#define CPU_RATE   13.330L   // for a 75MHz CPU clock speed (SYSCLKOUT)
 | ||||||
|  | //#define CPU_RATE   20.000L   // for a 50MHz CPU clock speed  (SYSCLKOUT)
 | ||||||
|  | //#define CPU_RATE   33.333L   // for a 30MHz CPU clock speed  (SYSCLKOUT)
 | ||||||
|  | //#define CPU_RATE   41.667L   // for a 24MHz CPU clock speed  (SYSCLKOUT)
 | ||||||
|  | //#define CPU_RATE   50.000L   // for a 20MHz CPU clock speed  (SYSCLKOUT)
 | ||||||
|  | //#define CPU_RATE   66.667L   // for a 15MHz CPU clock speed  (SYSCLKOUT)
 | ||||||
|  | //#define CPU_RATE  100.000L   // for a 10MHz CPU clock speed  (SYSCLKOUT)
 | ||||||
|  | 
 | ||||||
|  | //----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //-----------------------------------------------------------------------------
 | ||||||
|  | // **** DO NOT modify the code below this line ****
 | ||||||
|  | //-----------------------------------------------------------------------------
 | ||||||
|  | #define SCALE_FACTOR  1048576.0L*( (200L/CPU_RATE) )  // IQ20
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif /* extern "C" */ | ||||||
|  | 
 | ||||||
|  | #endif // -- end FLASH2833X_API_CONFIG_H 
 | ||||||
| @ -0,0 +1,272 @@ | |||||||
|  | // TI File $Revision: /main/3 $
 | ||||||
|  | // Checkin $Date: February 5, 2008   11:10:02 $
 | ||||||
|  | //###########################################################################
 | ||||||
|  | //
 | ||||||
|  | // FILE:  Flash2833x_API_Library.h	
 | ||||||
|  | //
 | ||||||
|  | // TITLE: F2833x Flash Algo's main include file
 | ||||||
|  | //
 | ||||||
|  | // DESCRIPTION:
 | ||||||
|  | //
 | ||||||
|  | //       This file should be included in any project that uses any of the
 | ||||||
|  | //       the F2833x flash APIs.    
 | ||||||
|  | //
 | ||||||
|  | //###########################################################################
 | ||||||
|  | // $TI Release:$
 | ||||||
|  | // $Release Date:$
 | ||||||
|  | //###########################################################################
 | ||||||
|  | 
 | ||||||
|  | #ifndef FLASH2833X_API_LIBRARY_H | ||||||
|  | #define FLASH2833X_API_LIBRARY_H | ||||||
|  | 
 | ||||||
|  | #include <F28335/Flash2833x_API_Config.h> | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*---------------------------------------------------------------------------
 | ||||||
|  |  28x Datatypes | ||||||
|  | 
 | ||||||
|  |  For Portability, User Is Recommended To Use Following Data Type Size | ||||||
|  |  Definitions For 16/32/64-Bit Signed/Unsigned Integers and floating point | ||||||
|  |  variables: | ||||||
|  | ---------------------------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | #ifndef DSP28_DATA_TYPES | ||||||
|  | #define DSP28_DATA_TYPES | ||||||
|  | typedef int                 int16; | ||||||
|  | typedef long                int32; | ||||||
|  | typedef long long           int64;    | ||||||
|  | typedef unsigned int        Uint16; | ||||||
|  | typedef unsigned long       Uint32; | ||||||
|  | typedef unsigned long long  Uint64; | ||||||
|  | typedef float               float32; | ||||||
|  | typedef long double         float64; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /*---------------------------------------------------------------------------
 | ||||||
|  |  API Status Messages | ||||||
|  | 
 | ||||||
|  |  The following status values are returned from the API to the calling | ||||||
|  |  program.  These can be used to determine if the API function passed | ||||||
|  |  or failed.   | ||||||
|  | ---------------------------------------------------------------------------*/ | ||||||
|  |  // Operation passed, no errors were flagged
 | ||||||
|  | #define STATUS_SUCCESS                        0    | ||||||
|  | 
 | ||||||
|  | // The CSM is preventing the function from performing its operation
 | ||||||
|  | #define STATUS_FAIL_CSM_LOCKED               10 | ||||||
|  | 
 | ||||||
|  | // Device REVID does not match that required by the API
 | ||||||
|  | #define STATUS_FAIL_REVID_INVALID            11 | ||||||
|  |      | ||||||
|  | // Invalid address passed to the API
 | ||||||
|  | #define STATUS_FAIL_ADDR_INVALID             12 | ||||||
|  | 
 | ||||||
|  | // Incorrect PARTID
 | ||||||
|  | // For example the F2806 API was used on a F2808 device. 
 | ||||||
|  | #define STATUS_FAIL_INCORRECT_PARTID         13 | ||||||
|  | 
 | ||||||
|  | // API/Silicon missmatch.  An old version of the
 | ||||||
|  | // API is being used on silicon it is not valid for
 | ||||||
|  | // Please update to the latest API. 
 | ||||||
|  | #define STATUS_FAIL_API_SILICON_MISMATCH     14 | ||||||
|  | 
 | ||||||
|  | // ---- Erase Specific errors ---- 
 | ||||||
|  | #define STATUS_FAIL_NO_SECTOR_SPECIFIED      20 | ||||||
|  | #define STATUS_FAIL_PRECONDITION             21 | ||||||
|  | #define STATUS_FAIL_ERASE                    22 | ||||||
|  | #define STATUS_FAIL_COMPACT                  23 | ||||||
|  | #define STATUS_FAIL_PRECOMPACT               24 | ||||||
|  | 
 | ||||||
|  | // ---- Program Specific errors ----  
 | ||||||
|  | #define STATUS_FAIL_PROGRAM                  30 | ||||||
|  | #define STATUS_FAIL_ZERO_BIT_ERROR           31 | ||||||
|  | 
 | ||||||
|  | // ---- Verify Specific errors ----
 | ||||||
|  | #define STATUS_FAIL_VERIFY                   40 | ||||||
|  | 
 | ||||||
|  | // Busy is set by each API function before it determines
 | ||||||
|  | // a pass or fail condition for that operation.  
 | ||||||
|  | // The calling function will will not receive this 
 | ||||||
|  | // status condition back from the API
 | ||||||
|  | #define STATUS_BUSY                999     | ||||||
|  | 
 | ||||||
|  | /*---------------------------------------------------------------------------
 | ||||||
|  |  Flash sector mask definitions | ||||||
|  | 
 | ||||||
|  |  The following macros can be used to form a mask specifying which sectors | ||||||
|  |  will be erased by the erase API function. | ||||||
|  |   | ||||||
|  |  Bit0 = Sector A | ||||||
|  |  Bit1 = Sector B | ||||||
|  |  Bit2 = Sector C | ||||||
|  |  Bit3 = Sector D | ||||||
|  |  Bit4 = Sector E | ||||||
|  |  Bit5 = Sector F | ||||||
|  |  Bit6 = Sector G | ||||||
|  |  Bit7 = Sector H | ||||||
|  | ---------------------------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | #define SECTORA   (Uint16)0x0001 | ||||||
|  | #define SECTORB   (Uint16)0x0002 | ||||||
|  | #define SECTORC   (Uint16)0x0004 | ||||||
|  | #define SECTORD   (Uint16)0x0008 | ||||||
|  | #define SECTORE   (Uint16)0x0010 | ||||||
|  | #define SECTORF   (Uint16)0x0020 | ||||||
|  | #define SECTORG   (Uint16)0x0040 | ||||||
|  | #define SECTORH   (Uint16)0x0080 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if FLASH_F28335 | ||||||
|  | // All sectors on an F28335 - Sectors A - H
 | ||||||
|  | #define SECTOR_F28335 (SECTORA|SECTORB|SECTORC|\ | ||||||
|  |                        SECTORD|SECTORE|SECTORF|\ | ||||||
|  |                        SECTORG|SECTORH) | ||||||
|  | #endif // -- end FLASH_F28335
 | ||||||
|  | 
 | ||||||
|  | #if FLASH_F28334 | ||||||
|  | // All sectors on an F28334 - Sectors A - H
 | ||||||
|  | #define SECTOR_F28334 (SECTORA|SECTORB|SECTORC|\ | ||||||
|  |                        SECTORD|SECTORE|SECTORF|\ | ||||||
|  |                        SECTORG|SECTORH) | ||||||
|  | #endif // -- end FLASH_F28334
 | ||||||
|  | 
 | ||||||
|  | #if FLASH_F28332 | ||||||
|  | // All sectors on an F28332 - Sectors A - D
 | ||||||
|  | #define SECTOR_F28332 (SECTORA|SECTORB|SECTORC|\ | ||||||
|  |                        SECTORD) | ||||||
|  | #endif // -- end FLASH_F28332
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /*---------------------------------------------------------------------------
 | ||||||
|  |  API Status Structure | ||||||
|  |   | ||||||
|  |  This structure is used to pass debug data back to the calling routine. | ||||||
|  |  Note that the Erase API function has 3 parts: precondition, erase and | ||||||
|  |  and compaction. Erase and compaction failures will not populate  | ||||||
|  |  the expected and actual data fields.   | ||||||
|  | ---------------------------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  |     Uint32  FirstFailAddr; | ||||||
|  |     Uint16  ExpectedData; | ||||||
|  |     Uint16  ActualData; | ||||||
|  | }FLASH_ST; | ||||||
|  | 
 | ||||||
|  | /*---------------------------------------------------------------------------
 | ||||||
|  |    Interface Function prototypes | ||||||
|  |     | ||||||
|  |    For each 28x Flash API library, the function names are of the form: | ||||||
|  |    Flash<DeviceNum>_<Operation>() | ||||||
|  |     | ||||||
|  |    Where <DeviceNum> is the device: ie 2808, 2806, 2801 | ||||||
|  |          <Operation> is the operation such as Erase, Program... | ||||||
|  |           | ||||||
|  |    For portability for users who may move between the F2808, F2806 and | ||||||
|  |    F2801, the following macro definitions are supplied.  | ||||||
|  |     | ||||||
|  |    Using these macro definitions,  the user can use instead make a generic | ||||||
|  |    call:  Flash_<Operation> and the macro will map the call to the proper | ||||||
|  |    device function | ||||||
|  |     | ||||||
|  |    Note except for the toggle test function, all of the function prototypes | ||||||
|  |    are compatible with F281x devices as well.  | ||||||
|  | ---------------------------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | #if FLASH_F28335 | ||||||
|  | #define Flash_Erase(a,b)          Flash28335_Erase(a,b) | ||||||
|  | #define Flash_Program(a,b,c,d)    Flash28335_Program(a,b,c,d) | ||||||
|  | #define Flash_Verify(a,b,c,d)     Flash28335_Verify(a,b,c,d) | ||||||
|  | #define Flash_ToggleTest(a,b)     Flash28335_ToggleTest(a,b) | ||||||
|  | #define Flash_DepRecover()        Flash28335_DepRecover() | ||||||
|  | #define Flash_APIVersionHex()     Flash28335_APIVersionHex() | ||||||
|  | #define Flash_APIVersion()        Flash28335_APIVersion() | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if FLASH_F28334 | ||||||
|  | #define Flash_Erase(a,b)          Flash28334_Erase(a,b) | ||||||
|  | #define Flash_Program(a,b,c,d)    Flash28334_Program(a,b,c,d) | ||||||
|  | #define Flash_Verify(a,b,c,d)     Flash28334_Verify(a,b,c,d) | ||||||
|  | #define Flash_ToggleTest(a,b)     Flash28334_ToggleTest(a,b) | ||||||
|  | #define Flash_DepRecover()        Flash28334_DepRecover() | ||||||
|  | #define Flash_APIVersionHex()     Flash28334_APIVersionHex() | ||||||
|  | #define Flash_APIVersion()        Flash28334_APIVersion() | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if FLASH_F28332 | ||||||
|  | #define Flash_Erase(a,b)          Flash28332_Erase(a,b) | ||||||
|  | #define Flash_Program(a,b,c,d)    Flash28332_Program(a,b,c,d) | ||||||
|  | #define Flash_Verify(a,b,c,d)     Flash28332_Verify(a,b,c,d) | ||||||
|  | #define Flash_ToggleTest(a,b)     Flash28332_ToggleTest(a,b) | ||||||
|  | #define Flash_DepRecover()        Flash28332_DepRecover() | ||||||
|  | #define Flash_APIVersionHex()     Flash28332_APIVersionHex() | ||||||
|  | #define Flash_APIVersion()        Flash28332_APIVersion() | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | extern Uint16  Flash_Erase(Uint16 SectorMask, FLASH_ST *FEraseStat); | ||||||
|  | extern Uint16  Flash_Program(Uint16 *FlashAddr, Uint16 *BufAddr, Uint32 Length, FLASH_ST *FProgStatus); | ||||||
|  | extern Uint16  Flash_Verify(Uint16 *StartAddr, Uint16 *BufAddr, Uint32 Length, FLASH_ST *FVerifyStat); | ||||||
|  | extern void    Flash_ToggleTest(volatile Uint32 *ToggleReg, Uint32 Mask); | ||||||
|  | extern Uint16  Flash_DepRecover(); | ||||||
|  | extern float32 Flash_APIVersion(); | ||||||
|  | extern Uint16  Flash_APIVersionHex();  | ||||||
|  | 
 | ||||||
|  | /*---------------------------------------------------------------------------
 | ||||||
|  |    Frequency Scale factor: | ||||||
|  |    The calling program must provide this global parameter used | ||||||
|  |    for frequency scaling the algo's. | ||||||
|  | ----------------------------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | extern Uint32 Flash_CPUScaleFactor; | ||||||
|  | 
 | ||||||
|  | /*---------------------------------------------------------------------------
 | ||||||
|  |    Callback Function Pointer: | ||||||
|  |    A callback function can be specified.  This function will be called | ||||||
|  |    at safe times during erase, program and verify.  This function can | ||||||
|  |    then be used to service an external watchdog or send a communications | ||||||
|  |    packet. | ||||||
|  |     | ||||||
|  |    Note:  | ||||||
|  |    THE FLASH AND OTP ARE NOT AVAILABLE DURING THIS FUNCTION CALL. | ||||||
|  |    THE FLASH/OTP CANNOT BE READ NOR CAN CODE EXECUTE FROM IT DURING THIS CALL | ||||||
|  |    DO NOT CALL ANY OF THE THE FLASH API FUNCTIONS DURING THIS CALL | ||||||
|  | ----------------------------------------------------------------------------*/ | ||||||
|  | extern void (*Flash_CallbackPtr) (void); | ||||||
|  | 
 | ||||||
|  | /*---------------------------------------------------------------------------
 | ||||||
|  |    API load/run symbols: | ||||||
|  |    These symbols are defined by the linker during the link.  Refer to the | ||||||
|  |    Flash28_API section in the example .cmd file: | ||||||
|  | 
 | ||||||
|  |    Flash28_API: | ||||||
|  |    { | ||||||
|  |         Flash28335_API_Library.lib(.econst)  | ||||||
|  |         Flash28335_API_Library.lib(.text) | ||||||
|  |    } LOAD = FLASH,  | ||||||
|  |      RUN = SARAM,  | ||||||
|  |      LOAD_START(_Flash28_API_LoadStart), | ||||||
|  |      LOAD_END(_Flash28_API_LoadEnd), | ||||||
|  |      RUN_START(_Flash28_API_RunStart), | ||||||
|  |      PAGE = 0 | ||||||
|  |     | ||||||
|  |    These are used to copy the flash API from flash to SARAM | ||||||
|  |     | ||||||
|  | ----------------------------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | extern Uint16 Flash28_API_LoadStart; | ||||||
|  | extern Uint16 Flash28_API_LoadEnd; | ||||||
|  | extern Uint16 Flash28_API_RunStart; | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif /* extern "C" */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif // -- end FLASH2833x_API_LIBRARY_H 
 | ||||||
|  | 
 | ||||||
|  | // --------- END OF FILE ----------------------------------
 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,118 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMBuffer.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "FRAM/FRAMBuffer.h" | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | FRAMBuffer::FRAMBuffer(): | ||||||
|  |         m_header(), | ||||||
|  |         m_config(), | ||||||
|  |         m_footer() | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void FRAMBuffer::update(const FRAM::FRAMHeader& header, const SYSCTRL::SystemControlConfiguration& config, const FRAM::FRAMFooter& footer) | ||||||
|  | { | ||||||
|  |     m_header = header; | ||||||
|  |     m_config = config; | ||||||
|  |     m_footer = footer; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | bool FRAMBuffer::verify_header_and_footer(const FRAM::FRAMHeader& header, const FRAM::FRAMFooter& footer) | ||||||
|  | { | ||||||
|  |     if((m_header.class_id == 0xFFFF) | ||||||
|  |        && (m_header.part_id == 0xFFFF) | ||||||
|  |        && (m_header.software_version == 0xFFFF) | ||||||
|  |        && (m_header.size_of_fram_data == 0xFFFF) | ||||||
|  |        && (m_footer.foot == 0xFFFF)) | ||||||
|  |     { | ||||||
|  |         return false; | ||||||
|  |         //
 | ||||||
|  |     }else{ | ||||||
|  |         if(m_header.class_id != header.class_id) | ||||||
|  |         { | ||||||
|  |             return false; | ||||||
|  |             //
 | ||||||
|  |         }else{ | ||||||
|  |             if(m_header.part_id != header.part_id) | ||||||
|  |             { | ||||||
|  |                 return false; | ||||||
|  |                 //
 | ||||||
|  |             }else{ | ||||||
|  |                 if(m_header.software_version != header.software_version) | ||||||
|  |                 { | ||||||
|  |                     return false; | ||||||
|  |                     //
 | ||||||
|  |                 }else{ | ||||||
|  |                     if(m_header.size_of_fram_data != header.size_of_fram_data) | ||||||
|  |                     { | ||||||
|  |                         return false; | ||||||
|  |                         //
 | ||||||
|  |                     }else{ | ||||||
|  |                         if(m_footer.foot != footer.foot) | ||||||
|  |                         { | ||||||
|  |                             return false; | ||||||
|  |                             //
 | ||||||
|  |                         }else{ | ||||||
|  |                             return true; | ||||||
|  |                             //
 | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void FRAMBuffer::extract(FRAM::FRAMHeader& header, SYSCTRL::SystemControlConfiguration& config, FRAM::FRAMFooter& footer) | ||||||
|  | { | ||||||
|  |     header = m_header; | ||||||
|  |     footer = m_footer; | ||||||
|  |     config = m_config; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMBuffer::extract_header(FRAMHeader& header) | ||||||
|  | { | ||||||
|  |     header = m_header; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | FRAM::FRAMHeader FRAMBuffer::get_header() | ||||||
|  | { | ||||||
|  |     return m_header; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMBuffer::extract_footer(FRAMFooter& footer) | ||||||
|  | { | ||||||
|  |     footer = m_footer; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | FRAM::FRAMFooter FRAMBuffer::get_footer() | ||||||
|  | { | ||||||
|  |     return m_footer; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMBuffer::extract_system_configuration(SYSCTRL::SystemControlConfiguration& config) | ||||||
|  | { | ||||||
|  |     config = m_config; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace FRAM */ | ||||||
| @ -0,0 +1,65 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMBuffer.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/TypeControl.h" | ||||||
|  | #include "SYSCTRL/SystemConfigurator.h" | ||||||
|  | 
 | ||||||
|  | #ifndef FRAM_FRAMBUFFER_H_ | ||||||
|  | #define FRAM_FRAMBUFFER_H_ | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct FRAMHeader | ||||||
|  | { | ||||||
|  |      int16_t class_id; | ||||||
|  |      int16_t part_id; | ||||||
|  |      int16_t software_version; | ||||||
|  |      int16_t size_of_fram_data; | ||||||
|  |      FRAMHeader(): | ||||||
|  |          class_id(0x0FFFF), | ||||||
|  |          part_id(0x0FFFF), | ||||||
|  |          software_version(0x0FFFF), | ||||||
|  |          size_of_fram_data(0x0FFFF) | ||||||
|  |      {} | ||||||
|  | };//FRAMHeader
 | ||||||
|  | 
 | ||||||
|  | struct FRAMFooter | ||||||
|  | { | ||||||
|  |      int16_t foot; | ||||||
|  |      FRAMFooter(): | ||||||
|  |          foot(0x0FFFF) | ||||||
|  |      {} | ||||||
|  | };//FRAMFooter
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class FRAMBuffer | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     FRAMHeader m_header; | ||||||
|  |     SYSCTRL::SystemControlConfiguration m_config; | ||||||
|  |     FRAMFooter m_footer; | ||||||
|  | public: | ||||||
|  |     FRAMBuffer(); | ||||||
|  | public: | ||||||
|  |     void update(const FRAM::FRAMHeader& header, const SYSCTRL::SystemControlConfiguration& config, const FRAM::FRAMFooter& footer); | ||||||
|  |     bool verify_header_and_footer(const FRAM::FRAMHeader& header, const FRAM::FRAMFooter& footer); | ||||||
|  |     void extract(FRAM::FRAMHeader& header, SYSCTRL::SystemControlConfiguration& config, FRAM::FRAMFooter& footer); | ||||||
|  |     void extract_header(FRAMHeader& header); | ||||||
|  |     FRAM::FRAMHeader get_header(); | ||||||
|  |     void extract_footer(FRAMFooter& footer); | ||||||
|  |     FRAM::FRAMFooter get_footer(); | ||||||
|  |     void extract_system_configuration(SYSCTRL::SystemControlConfiguration& config); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace FRAM */ | ||||||
|  | 
 | ||||||
|  | #endif /* FRAM_FRAMBUFFER_H_ */ | ||||||
| @ -0,0 +1,446 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMConfigurationParameters.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "FRAM/FRAMDATABASE.h" | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | void FRAMDATABASE::register_configuration_parameters(SYSCTRL::SystemControlConfiguration *sys_config) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_fram_object_index = 0; | ||||||
|  |     m_fram_object_address = 0; | ||||||
|  |     m_fram_object_last_address = 0; | ||||||
|  | 
 | ||||||
|  |     //add_register_float(uint8_t readonly, float* pParam, float default_value);
 | ||||||
|  |     //add_register_int(uint8_t readonly, int16_t* pParam, int16_t default_value);
 | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // References
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->reference_current_limit_rms, CURRENT_LIMIT_RMS); | ||||||
|  |     add_float( 0, &sys_config->reference_current_pfc_rms, CURRENT_PFC_RMS); | ||||||
|  |     add_float( 0, &sys_config->reference_voltage_rms, GRID_VOLTAGE_REFERENCE); | ||||||
|  |     add_float( 0, &sys_config->reference_voltage_high_limit_rms, GRID_VOLTAGE_HIGH_LIMIT); | ||||||
|  |     add_float( 0, &sys_config->reference_voltage_dc, CELL_DC_VOLTAGE_REFERENCE); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Algorithm Control Register
 | ||||||
|  |     add_uint16(0, &sys_config->algorithm_control.all, ENABLE_CONTROL_BIT); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // High Voltage Cell
 | ||||||
|  |     //
 | ||||||
|  |     add_uint16(0, &sys_config->hardware.cell_level, 4); | ||||||
|  |     add_uint16(0, &sys_config->hardware.version.pwm, 210); | ||||||
|  |     add_uint16(0, &sys_config->hardware.version.cell, 211); | ||||||
|  |     add_uint32(0, &sys_config->hardware.version.cpu_cpld, 202); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     add_float( 0, &sys_config->minimal_input_voltage_level, 10.0); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Scale Analog Signals
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->scale_voltage_input_a, 0.166324854);//0.0227386411//0.0233486816;
 | ||||||
|  |     add_float( 0, &sys_config->scale_voltage_input_b, 0.166955084);//0.0227597337//0.0234651081;
 | ||||||
|  |     add_float( 0, &sys_config->scale_voltage_input_c, 0.170290515);//0.02278281//0.0236082859;
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->scale_current_input_a, 0.0057266783); | ||||||
|  |     add_float( 0, &sys_config->scale_current_input_b, 0.00571648451); | ||||||
|  |     add_float( 0, &sys_config->scale_current_input_c, 0.00571565609); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->scale_current_cell_a, 0.0095403092);//0.00665648002;
 | ||||||
|  |     add_float( 0, &sys_config->scale_current_cell_b, 0.00967073813);//0.00667640707;
 | ||||||
|  |     add_float( 0, &sys_config->scale_current_cell_c, 0.00962774921);//0.00666095456;
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->scale_voltage_load_a, 0.168764219);//0.0227408651//0.0232194811;
 | ||||||
|  |     add_float( 0, &sys_config->scale_voltage_load_b, 0.167528242);//0.0227707103//0.0233941432;
 | ||||||
|  |     add_float( 0, &sys_config->scale_voltage_load_c, 0.171417475);//0.0229060184//0.0234934501;
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->scale_current_load_a, 0.00949461199);//0.00668919506;
 | ||||||
|  |     add_float( 0, &sys_config->scale_current_load_b, 0.00953965727);//0.00669770781;
 | ||||||
|  |     add_float( 0, &sys_config->scale_current_load_c, 0.00959520414);//0.00670575583;
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->scale_current_bypass_a, 0.00953388773); | ||||||
|  |     add_float( 0, &sys_config->scale_current_bypass_b, 0.00956917088); | ||||||
|  |     add_float( 0, &sys_config->scale_current_bypass_c, 0.00956158526); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Amplitude Filter Parameters
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->ampl_filter_current.time, 20.0e-3); | ||||||
|  |     add_float( 0, &sys_config->ampl_filter_current.a3, 2.61313); | ||||||
|  |     add_float( 0, &sys_config->ampl_filter_current.a2, 3.41422); | ||||||
|  |     add_float( 0, &sys_config->ampl_filter_current.a1, 2.61313); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // RMS Filter Parameters
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->rms_filter_analog_signal.time, 10.0e-3); | ||||||
|  |     add_float( 0, &sys_config->rms_filter_analog_signal.a3, 2.61313); | ||||||
|  |     add_float( 0, &sys_config->rms_filter_analog_signal.a2, 3.41422); | ||||||
|  |     add_float( 0, &sys_config->rms_filter_analog_signal.a1, 2.61313); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Zero Drift Current Input
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->zero_filter.time, 1.333); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Cell DC Voltage Filter
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->cell_dc_voltage_filter.time, 3.0e-3); | ||||||
|  |     add_float( 0, &sys_config->cell_dc_voltage_filter.a3, 2.61313); | ||||||
|  |     add_float( 0, &sys_config->cell_dc_voltage_filter.a2, 3.41422); | ||||||
|  |     add_float( 0, &sys_config->cell_dc_voltage_filter.a1, 2.61313); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Signal Decompose
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->signal_decompose.projection_filter.time, 10.0e-3); | ||||||
|  |     add_float( 0, &sys_config->signal_decompose.projection_filter.a3, 2.61313); | ||||||
|  |     add_float( 0, &sys_config->signal_decompose.projection_filter.a2, 3.41422); | ||||||
|  |     add_float( 0, &sys_config->signal_decompose.projection_filter.a1, 2.61313); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Relative
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->relative_voltage_input.minimal_amplitude_level, 0.1); | ||||||
|  |     add_float( 0, &sys_config->relative_voltage_input.limit_relative_high, 1.1); | ||||||
|  |     add_float( 0, &sys_config->relative_voltage_input.limit_relative_low, -1.1); | ||||||
|  |     add_float( 0, &sys_config->relative_voltage_input.amplitude_filter.time, (float)(1.0/2.0/FP_PI/10.0)); | ||||||
|  |     add_float( 0, &sys_config->relative_voltage_input.amplitude_filter.a3, 2.61313); | ||||||
|  |     add_float( 0, &sys_config->relative_voltage_input.amplitude_filter.a2, 3.41422); | ||||||
|  |     add_float( 0, &sys_config->relative_voltage_input.amplitude_filter.a1, 2.61313); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Voltage PLL-ABC Parameters
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.frequency_nominal, PLLABC_FREQUENCY_NOMINAL); | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.filter.time, 1.0/PLLABC_FREQUENCY_CUT); | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.controller.gain, PLLABC_FREQUENCY_CUT/2.0); | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.controller.time, 4.0/PLLABC_FREQUENCY_CUT); | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.controller.low_saturation, PLLABC_FREQUENCY_LIMIT_LOW); | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.controller.high_saturation, PLLABC_FREQUENCY_LIMIT_HI); | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.position.time, 1.0); | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.position.low_saturation, FP_ZERO); | ||||||
|  |     add_float( 0, &sys_config->pll_abc_input_voltage.position.high_saturation, 2.0 * FP_PI); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // System Alarm
 | ||||||
|  |     //
 | ||||||
|  |     // exceed voltage level 1
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_1.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 + (PROTECTION_EXCEED_VOLTAGE_LEVEL_1_PERCENT / (float)100.0)));//253.0;
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_1.period, 10.0); | ||||||
|  |     //
 | ||||||
|  |     // exceed voltage level 2
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_2.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 + (PROTECTION_EXCEED_VOLTAGE_LEVEL_2_PERCENT / (float)100.0)));//264.5;
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_2.period, 5.0); | ||||||
|  |     //
 | ||||||
|  |     // exceed voltage level 3
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_3.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 + (PROTECTION_EXCEED_VOLTAGE_LEVEL_3_PERCENT / (float)100.0)));//276.0;
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_3.period, 2.0); | ||||||
|  |     //
 | ||||||
|  |     // exceed voltage level 4
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_4.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 + (PROTECTION_EXCEED_VOLTAGE_LEVEL_4_PERCENT / (float)100.0))); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_exceed_level_4.period, 0.004);//1.0;
 | ||||||
|  |     //
 | ||||||
|  |     // decrease voltage level 1
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_1.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 - (PROTECTION_DECREASE_VOLTAGE_LEVEL_1_PERCENT / (float)100.0)));//218.5;//195.5;
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_1.period, 10.0); | ||||||
|  |     //
 | ||||||
|  |     // decrease voltage level 2
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_2.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 - (PROTECTION_DECREASE_VOLTAGE_LEVEL_2_PERCENT / (float)100.0)));//207.0;//172.5;
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_2.period, 5.0); | ||||||
|  |     //
 | ||||||
|  |     // decrease voltage level 3
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_3.level, NOMINAL_GRID_VOLTAGE * ((float)1.0 - (PROTECTION_DECREASE_VOLTAGE_LEVEL_3_PERCENT / (float)100.0))); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.voltage_decrease_level_3.period, 2.0); | ||||||
|  |     //
 | ||||||
|  |     // current overload level 1 120% 60s
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_1.level, 30.0 * 14.4); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_1.period, 60.0); | ||||||
|  |     //
 | ||||||
|  |     // current overload level 2 130% 10s
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_2.level, 30.0 * 15.6);//30.0*15.6
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_2.period, 10.0); | ||||||
|  |     //
 | ||||||
|  |     // current overload level 3 150% 1ms
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_3.level, 30.0 * 18.0); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_overload_level_3.period, 0.004); | ||||||
|  |     //
 | ||||||
|  |     // current invertor overload level 1 110% 60s
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_1.level, 13.2); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_1.period, 60.0); | ||||||
|  |     //
 | ||||||
|  |     // current invertor overload level 2 130% 10s
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_2.level, 15.6); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_2.period, 10.0); | ||||||
|  |     //
 | ||||||
|  |     // current invertor overload level 3 150% 1ms
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_3.level, 18.0); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_invertor_overload_level_3.period, 0.004); | ||||||
|  |     //
 | ||||||
|  |     // current input overload level 1 110% 60s
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_1.level, 99.0); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_1.period, 60.0); | ||||||
|  |     //
 | ||||||
|  |     // current input overload level 2 130% 10s
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_2.level, 117.0); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_2.period, 10.0); | ||||||
|  |     //
 | ||||||
|  |     // current input overload level 3 150% 1ms
 | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_3.level, 135.0); | ||||||
|  |     add_float( 0, &sys_config->phase_alert_monitor.current_input_overload_level_3.period, 0.004); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // DIGITAL INPUTS
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->digital_input_config.period, 50.0e-3);   //3001 - 3020
 | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     //  FAN CONTROL
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->fan_control.timer_period, 5.0*60.0); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Generator ABC
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->generator_abc.amplitude, 1.0); | ||||||
|  |     add_float( 0, &sys_config->generator_abc.frequency, 2.0*FP_PI*50.0); | ||||||
|  |     add_float( 0, &sys_config->generator_abc.phase_shift, 0.0); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Reference PWM-Generator
 | ||||||
|  |     //
 | ||||||
|  |     //add_float( 0, &sys_config->generator_pwm.frequency, 2.0*FP_PI*1.0);
 | ||||||
|  |     //add_float( 0, &sys_config->generator_abc.phase_shift, 0.0);
 | ||||||
|  | 
 | ||||||
|  |     //add_float( 0, &sys_config->gen_inp_volt.amplitude.direct.d, 220.0);
 | ||||||
|  |     //
 | ||||||
|  |     //add_float( 0, &sys_config->gen_out_volt.amplitude.direct.d, 220.0);
 | ||||||
|  |     //add_float( 0, &sys_config->gen_out_volt.phase.direct.phase, 0.122756);//FP_PI/4.0);
 | ||||||
|  |     //
 | ||||||
|  |     //add_float( 0, &sys_config->gen_out_current.amplitude.direct.d, 50.0);
 | ||||||
|  |     //add_float( 0, &sys_config->gen_out_current.phase.direct.phase, 0.122756);//FP_PI/3.0;
 | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // AlgorithmGeneratorReferences
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->algorithm_source_references.voltage, 0.0); | ||||||
|  |     add_float( 0, &sys_config->algorithm_source_references.phase_shift, 0.0); | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Harmonica Analyzer
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->ph_harmonica_5.time, 50.0e-3); | ||||||
|  |     add_float( 0, &sys_config->ph_harmonica_5.a3, 2.61313); | ||||||
|  |     add_float( 0, &sys_config->ph_harmonica_5.a2, 3.41422); | ||||||
|  |     add_float( 0, &sys_config->ph_harmonica_5.a1, 2.61313); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Reference Intensity Idref Iqref in Start Mode
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->intensity_id_iq_references.damp_factor, 0.7071); | ||||||
|  |     add_float( 0, &sys_config->intensity_id_iq_references.time, 20.0e-3); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Regulators
 | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  |     //
 | ||||||
|  | #if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_PII | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_dq.gain, 1.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_dq.time, 1.6e-3); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_dq.high_saturation, 4500.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_dq.low_saturation, -4500.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->integrator_voltage_dq.time, 2.0e-3); | ||||||
|  |     add_float( 0, &sys_config->integrator_voltage_dq.high_saturation, 4500.0); | ||||||
|  |     add_float( 0, &sys_config->integrator_voltage_dq.low_saturation, -4500.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->reference_voltage_dq_intensity.time, 200.0e-3); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | #if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_I | ||||||
|  | 
 | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_dq.gain, 0.4); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_dq.time, 1600.0e-6); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_dq.high_saturation, 4500.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_dq.low_saturation, -4500.0); | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->integrator_voltage_dq.time, 4.0e-3); // 4.0e-3 for single winding; 2.0e-3 for double winding
 | ||||||
|  |     add_float( 0, &sys_config->integrator_voltage_dq.high_saturation, 4500.0); | ||||||
|  |     add_float( 0, &sys_config->integrator_voltage_dq.low_saturation, -4500.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->reference_voltage_dq_intensity.time, 200.0e-3); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  |     //
 | ||||||
|  |     //add_float( 0, &sys_config->regulator_current_limit.gain, 1.0);
 | ||||||
|  |     add_float( 0, &sys_config->regulator_current_limit.time, 140.0e-3); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_limit.high_saturation, REGULATOR_CURRENT_LIMIT_HIGH_SATURATION); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_limit.low_saturation, REGULATOR_CURRENT_LIMIT_LOW_SATURATION); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->regulator_current_pfc.gain, 0.25); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_pfc.time, 800.0e-3); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_pfc.high_saturation, REGULATOR_CURRENT_PFC_HIGH_SATURATION); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_pfc.low_saturation, REGULATOR_CURRENT_PFC_LOW_SATURATION); | ||||||
|  |     //
 | ||||||
|  | #if TYPECURRENTCONTROLLER == CURRENTCONTROLLER_PI | ||||||
|  |     add_float( 0, &sys_config->regulator_current_load_dq.gain, 8.0);    // 4.0 for single winding; 8.0 for double winding
 | ||||||
|  |     add_float( 0, &sys_config->regulator_current_load_dq.time, 6.4e-3); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_load_dq.high_saturation, 500.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_load_dq.low_saturation, -500.0); | ||||||
|  | #endif | ||||||
|  | #if TYPECURRENTCONTROLLER == CURRENTCONTROLLER_P | ||||||
|  |     add_float( 0, &sys_config->regulator_current_load_dq.gain, 8.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_load_dq.high_saturation, 500.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_load_dq.low_saturation, -500.0); | ||||||
|  | #endif | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->referencer_current_bypass_dq.time, 25.6e-3); | ||||||
|  |     add_float( 0, &sys_config->referencer_current_bypass_dq.high_saturation, 240.0); | ||||||
|  |     add_float( 0, &sys_config->referencer_current_bypass_dq.low_saturation, -240.0); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_active_reactive.gain, 0.04); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_active_reactive.time, 10.0e-3); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_active_reactive.high_saturation, 4500.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_voltage_load_active_reactive.low_saturation, -4500.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->regulator_current_limit.gain, 1.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_limit.time, 5.0); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_limit.high_saturation, GRID_VOLTAGE_REFERENCE * 0.57735); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_limit.low_saturation, FP_ZERO); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->regulator_current_pfc.gain, 0.25); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_pfc.time, 800.0e-3); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_pfc.high_saturation, GRID_VOLTAGE_REFERENCE * 0.57735); | ||||||
|  |     add_float( 0, &sys_config->regulator_current_pfc.low_saturation, -GRID_VOLTAGE_REFERENCE * 0.57735); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->current_regulator_active.gain, 0.17); // 0.34 for single winding
 | ||||||
|  |     add_float( 0, &sys_config->current_regulator_active.time, 0.04); | ||||||
|  |     add_float( 0, &sys_config->current_regulator_active.high_saturation, 500.0); | ||||||
|  |     add_float( 0, &sys_config->current_regulator_active.low_saturation, -500.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->current_regulator_reactive.gain, 0.17);  // 0.34 for single winding
 | ||||||
|  |     add_float( 0, &sys_config->current_regulator_reactive.time, 0.04); | ||||||
|  |     add_float( 0, &sys_config->current_regulator_reactive.high_saturation, 500.0); | ||||||
|  |     add_float( 0, &sys_config->current_regulator_reactive.low_saturation, -500.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->current_referencer.gain, 1.0); | ||||||
|  |     add_float( 0, &sys_config->current_referencer.time, 0.160); | ||||||
|  |     add_float( 0, &sys_config->current_referencer.high_saturation, 20.0); | ||||||
|  |     add_float( 0, &sys_config->current_referencer.low_saturation, -20.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->regulator_dc_voltage.gain, 0.05); | ||||||
|  |     add_float( 0, &sys_config->regulator_dc_voltage.time, 800.0e-3); | ||||||
|  |     add_float( 0, &sys_config->regulator_dc_voltage.high_saturation, FP_ZERO); | ||||||
|  |     add_float( 0, &sys_config->regulator_dc_voltage.low_saturation, -GRID_VOLTAGE_REFERENCE * 0.57735); | ||||||
|  | #endif | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->drc_voltage_decomposer.filter.time, 31.83e-3); //31.83e-3//6.366e-3//3.183e-3
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->drc_voltage_controller.gain, 0.4);  //0.4 - for single winding; 0.7958 - for double winding.        //7.958//1.592//0.7958
 | ||||||
|  |     add_float( 0, &sys_config->drc_voltage_controller.time, 3.2e-3); //31.83e-3//6.366e-3//3.183e-3
 | ||||||
|  |     add_float( 0, &sys_config->drc_voltage_controller.high_saturation, 4500.0); | ||||||
|  |     add_float( 0, &sys_config->drc_voltage_controller.low_saturation, -4500.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->drc_reference_voltage_direct_intensity.time, 333.0e-3); | ||||||
|  |     add_float( 0, &sys_config->drc_reference_voltage_direct_intensity.damp_factor, 0.9); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_load.gain, 4.0);// 4.0 - for single winding; 8.0 - for double winding
 | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_load.time, 6.4e-3); | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_load.high_saturation, 500.0); | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_load.low_saturation, -500.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->drc_referencer_current_bypass.time, 25.6e-3); | ||||||
|  |     add_float( 0, &sys_config->drc_referencer_current_bypass.high_saturation, 240.0); | ||||||
|  |     add_float( 0, &sys_config->drc_referencer_current_bypass.low_saturation, -240.0); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_limit.time, 140.0e-3); | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_limit.high_saturation, REGULATOR_CURRENT_LIMIT_HIGH_SATURATION); | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_limit.low_saturation, REGULATOR_CURRENT_LIMIT_LOW_SATURATION); | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_pfc.gain, 0.25); | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_pfc.time, 800.0e-3); | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_pfc.high_saturation, REGULATOR_CURRENT_PFC_HIGH_SATURATION); | ||||||
|  |     add_float( 0, &sys_config->drc_regulator_current_pfc.low_saturation, REGULATOR_CURRENT_PFC_LOW_SATURATION); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Timers
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->timer_start.period, 5.0); | ||||||
|  |     add_float( 0, &sys_config->timer_stop.period, 5.0); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Contactor Control Fault
 | ||||||
|  |     //
 | ||||||
|  |     add_float( 0, &sys_config->contactor.period, 0.4); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | } /* namespace FRAM */ | ||||||
| @ -0,0 +1,439 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMDATABASE.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "FRAM/FRAMDATABASE.h" | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | FRAMDATABASE::FRAMDATABASE(): | ||||||
|  |         m_mode(), | ||||||
|  |         m_state(), | ||||||
|  |         m_fram_data_buffer(), | ||||||
|  |         m_buffer_pointer((uint16_t*)&m_fram_data_buffer), | ||||||
|  |         m_fram_object(), | ||||||
|  |         m_fram_size(FRAM_FRAM_SIZE), | ||||||
|  |         m_fram_object_index(0), | ||||||
|  |         m_fram_object_address(0), | ||||||
|  |         m_fram_object_last_address(0), | ||||||
|  |         m_fram_rw_index(0), | ||||||
|  |         m_header(), | ||||||
|  |         m_footer(), | ||||||
|  |         m_verify(false) | ||||||
|  | { | ||||||
|  |     m_header.class_id = HEADER_CLASS_ID; | ||||||
|  |     m_header.part_id = HEADER_PART_ID; | ||||||
|  |     m_header.software_version = HEADER_SOFTWARE_VERSION; | ||||||
|  |     m_header.size_of_fram_data = sizeof(m_fram_data_buffer); | ||||||
|  |     m_footer.foot = FOOTER_FOOT; | ||||||
|  | } | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | FRAM::FRAMDATABASE::mode_t FRAMDATABASE::get_mode() | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::compare_mode(FRAM::FRAMDATABASE::mode_t mode) | ||||||
|  | { | ||||||
|  |     return mode == m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | FRAM::FRAMDATABASE::state_t FRAMDATABASE::get_state() | ||||||
|  | { | ||||||
|  |     return m_state; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::compare_state(FRAM::FRAMDATABASE::state_t state) | ||||||
|  | { | ||||||
|  |     return state == m_state; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::is_free() | ||||||
|  | { | ||||||
|  |     return m_state == FRAM::FRAMDATABASE::FREE; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::is_busy() | ||||||
|  | { | ||||||
|  |     return m_state == FRAM::FRAMDATABASE::BUSY; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::is_read() | ||||||
|  | { | ||||||
|  |     return m_mode == FRAM::FRAMDATABASE::READ; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::is_burn() | ||||||
|  | { | ||||||
|  |     return m_mode == FRAM::FRAMDATABASE::BURN; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::is_erase() | ||||||
|  | { | ||||||
|  |     return m_mode == FRAM::FRAMDATABASE::ERASE; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::is_restore() | ||||||
|  | { | ||||||
|  |     return m_mode == FRAM::FRAMDATABASE::RESTORE; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FRAMDATABASE::is_verify() | ||||||
|  | { | ||||||
|  |     return m_mode == FRAM::FRAMDATABASE::VERIFY; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::set_read() | ||||||
|  | { | ||||||
|  |     m_state = FRAM::FRAMDATABASE::BUSY; | ||||||
|  |     m_mode = FRAM::FRAMDATABASE::READ; | ||||||
|  |     m_fram_rw_index = 0; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::set_burn() | ||||||
|  | { | ||||||
|  |     m_state = FRAM::FRAMDATABASE::BUSY; | ||||||
|  |     m_mode = FRAM::FRAMDATABASE::BURN; | ||||||
|  |     m_fram_rw_index = 0; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::set_erase() | ||||||
|  | { | ||||||
|  |     m_state = FRAM::FRAMDATABASE::BUSY; | ||||||
|  |     m_mode = FRAM::FRAMDATABASE::ERASE; | ||||||
|  |     m_fram_rw_index = 0; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::set_verify() | ||||||
|  | { | ||||||
|  |     m_state = FRAM::FRAMDATABASE::BUSY; | ||||||
|  |     m_mode = FRAM::FRAMDATABASE::VERIFY; | ||||||
|  |     m_fram_rw_index = 0; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::set_restore() | ||||||
|  | { | ||||||
|  |     m_state = FRAM::FRAMDATABASE::BUSY; | ||||||
|  |     m_mode = FRAM::FRAMDATABASE::RESTORE; | ||||||
|  |     m_fram_rw_index = 0; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::set_break() | ||||||
|  | { | ||||||
|  |     m_state = FRAM::FRAMDATABASE::FREE; | ||||||
|  |     m_mode = FRAM::FRAMDATABASE::WAIT; | ||||||
|  |     m_fram_rw_index = 0; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | FRAM::FRAMHeader FRAMDATABASE::get_header() | ||||||
|  | { | ||||||
|  |     return m_header; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | FRAM::FRAMFooter FRAMDATABASE::get_footer() | ||||||
|  | { | ||||||
|  |     return m_footer; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::extract_system_configuration(SYSCTRL::SystemControlConfiguration *sys_config) | ||||||
|  | { | ||||||
|  |     m_fram_data_buffer.extract_system_configuration(*sys_config); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::implement_dafault_configuration() | ||||||
|  | { | ||||||
|  |     for(uint16_t i = 0; i < m_fram_object_index; i++) | ||||||
|  |     { | ||||||
|  |         FRAM::FRAMDataObjects& o = m_fram_object[i]; | ||||||
|  |         o.restore_default_value(); | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | void FRAMDATABASE::upload_configuration(SYSCTRL::SystemControlConfiguration *sys_config) | ||||||
|  | { | ||||||
|  |     register_configuration_parameters(sys_config); | ||||||
|  | 
 | ||||||
|  |     //implement_dafault_configuration();
 | ||||||
|  | 
 | ||||||
|  |     read_from_fram_to_buffer(); | ||||||
|  | 
 | ||||||
|  |     m_verify = m_fram_data_buffer.verify_header_and_footer(m_header, m_footer); | ||||||
|  |     //m_verify = false;
 | ||||||
|  |     if(m_verify) | ||||||
|  |     { | ||||||
|  |         extract_system_configuration(sys_config); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         erase_fram_buffer(); | ||||||
|  | 
 | ||||||
|  |         implement_dafault_configuration(); | ||||||
|  | 
 | ||||||
|  |         m_fram_data_buffer.update(m_header, *sys_config, m_footer); | ||||||
|  | 
 | ||||||
|  |         write_to_fram_from_buffer(); | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | void FRAMDATABASE::update_buffer(const SYSCTRL::SystemControlConfiguration *sys_config) | ||||||
|  | { | ||||||
|  |     m_fram_data_buffer.update(m_header, *sys_config, m_footer); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::erase_fram_index() | ||||||
|  | { | ||||||
|  |     if(m_mode == FRAM::FRAMDATABASE::ERASE) | ||||||
|  |     { | ||||||
|  |         if(m_fram_rw_index < sizeof(m_fram_data_buffer)) | ||||||
|  |         { | ||||||
|  |             writeint(0xFFFF, m_fram_rw_index << 1); | ||||||
|  |             m_fram_rw_index++; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             set_break(); | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::verify_fram_index() | ||||||
|  | { | ||||||
|  |     if(m_mode == FRAM::FRAMDATABASE::VERIFY) | ||||||
|  |     { | ||||||
|  |         if(m_fram_rw_index < sizeof(m_fram_data_buffer)) | ||||||
|  |         { | ||||||
|  |             m_fram_rw_index++; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             set_break(); | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::write_fram_index() | ||||||
|  | { | ||||||
|  |     if(m_mode == FRAM::FRAMDATABASE::BURN) | ||||||
|  |     { | ||||||
|  |         if(m_fram_rw_index < sizeof(m_fram_data_buffer)) | ||||||
|  |         { | ||||||
|  |             writeint((*(m_buffer_pointer + m_fram_rw_index)), m_fram_rw_index << 1); | ||||||
|  |             m_fram_rw_index++; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             set_break(); | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::read_fram_index() | ||||||
|  | { | ||||||
|  |     if(m_mode == FRAM::FRAMDATABASE::READ) | ||||||
|  |     { | ||||||
|  |         if(m_fram_rw_index < sizeof(m_fram_data_buffer)) | ||||||
|  |         { | ||||||
|  |             *(m_buffer_pointer + m_fram_rw_index) = readint(m_fram_rw_index << 1); | ||||||
|  |             m_fram_rw_index++; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             set_break(); | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::restore_fram_index() | ||||||
|  | { | ||||||
|  |     if(m_mode == FRAM::FRAMDATABASE::RESTORE) | ||||||
|  |     { | ||||||
|  |         if(m_fram_rw_index < sizeof(m_fram_data_buffer)) | ||||||
|  |         { | ||||||
|  |             writeint((*(m_buffer_pointer + m_fram_rw_index)), m_fram_rw_index << 1); | ||||||
|  |             m_fram_rw_index++; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             set_break(); | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::read_from_fram_to_buffer() | ||||||
|  | { | ||||||
|  |     set_read(); | ||||||
|  |     for(m_fram_rw_index = 0; m_fram_rw_index < sizeof(m_fram_data_buffer); m_fram_rw_index++) | ||||||
|  |     { | ||||||
|  |         *(m_buffer_pointer + m_fram_rw_index) = readint(m_fram_rw_index << 1); | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  |     m_mode = FRAM::FRAMDATABASE::READ; | ||||||
|  |     m_state = FRAMDATABASE::BUSY; | ||||||
|  |     set_break(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::write_to_fram_from_buffer() | ||||||
|  | { | ||||||
|  |     set_burn(); | ||||||
|  |     for(m_fram_rw_index = 0; m_fram_rw_index < sizeof(m_fram_data_buffer); m_fram_rw_index++) | ||||||
|  |     { | ||||||
|  |         writeint((*(m_buffer_pointer + m_fram_rw_index)), m_fram_rw_index << 1); | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  |     set_break(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::erase_fram_buffer() | ||||||
|  | { | ||||||
|  |     set_verify(); | ||||||
|  |     for(m_fram_rw_index = 0; m_fram_rw_index < sizeof(m_fram_data_buffer); m_fram_rw_index++) | ||||||
|  |     { | ||||||
|  |         writeint(0xFFFF, m_fram_rw_index << 1); | ||||||
|  |         *(m_buffer_pointer + m_fram_rw_index) = readint(m_fram_rw_index << 1); | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  |     set_break(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void FRAMDATABASE::add_float(uint8_t readonly, float* pParam, float default_value) | ||||||
|  | { | ||||||
|  |     if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&& | ||||||
|  |             (((m_fram_object_address + (sizeof(float)<<1)) < m_fram_size))) | ||||||
|  |     { | ||||||
|  |         FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index]; | ||||||
|  |         object.add_register_float(m_fram_object_address, readonly, pParam, default_value); | ||||||
|  |         m_fram_object_index++; | ||||||
|  |         m_fram_object_address += (sizeof(float) << 1); | ||||||
|  |         m_fram_object_last_address = m_fram_object_address; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::add_int16(uint8_t readonly, int16_t* pParam, int16_t default_value) | ||||||
|  | { | ||||||
|  |     if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&& | ||||||
|  |             (((m_fram_object_address + (sizeof(uint16_t)<<1)) < m_fram_size))) | ||||||
|  |     { | ||||||
|  |         FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index]; | ||||||
|  |         object.add_register_int16(m_fram_object_address, readonly, pParam, default_value); | ||||||
|  |         m_fram_object_index++; | ||||||
|  |         m_fram_object_address += sizeof(int16_t) << 1; | ||||||
|  |         m_fram_object_last_address = m_fram_object_address; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::add_int32(uint8_t readonly, int32_t* pParam, int32_t default_value) | ||||||
|  | { | ||||||
|  |     if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&& | ||||||
|  |             (((m_fram_object_address + (sizeof(int32_t)<<1)) < m_fram_size))) | ||||||
|  |     { | ||||||
|  |         FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index]; | ||||||
|  |         object.add_register_int32(m_fram_object_address, readonly, pParam, default_value); | ||||||
|  |         m_fram_object_index++; | ||||||
|  |         m_fram_object_address += (sizeof(int32_t) << 1); | ||||||
|  |         m_fram_object_last_address = m_fram_object_address; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::add_uint16(uint8_t readonly, uint16_t* pParam, uint16_t default_value) | ||||||
|  | { | ||||||
|  |     if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&& | ||||||
|  |             (((m_fram_object_address + (sizeof(uint16_t)<<1)) < m_fram_size))) | ||||||
|  |     { | ||||||
|  |         FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index]; | ||||||
|  |         object.add_register_uint16(m_fram_object_address, readonly, pParam, default_value); | ||||||
|  |         m_fram_object_index++; | ||||||
|  |         m_fram_object_address += sizeof(uint16_t) << 1; | ||||||
|  |         m_fram_object_last_address = m_fram_object_address; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::add_uint32(uint8_t readonly, uint32_t* pParam, uint32_t default_value) | ||||||
|  | { | ||||||
|  |     if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&& | ||||||
|  |             (((m_fram_object_address + (sizeof(uint32_t)<<1)) < m_fram_size))) | ||||||
|  |     { | ||||||
|  |         FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index]; | ||||||
|  |         object.add_register_uint32(m_fram_object_address, readonly, pParam, default_value); | ||||||
|  |         m_fram_object_index++; | ||||||
|  |         m_fram_object_address += (sizeof(uint32_t) << 1); | ||||||
|  |         m_fram_object_last_address = m_fram_object_address; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDATABASE::add_bool(uint8_t readonly, bool* pParam, bool default_value) | ||||||
|  | { | ||||||
|  |     if((m_fram_object_index < NUMBER_FRAM_PARAMETERS)&& | ||||||
|  |             (((m_fram_object_address + (sizeof(uint16_t)<<1)) < m_fram_size))) | ||||||
|  |     { | ||||||
|  |         FRAM::FRAMDataObjects& object = m_fram_object[m_fram_object_index]; | ||||||
|  |         object.add_register_bool(m_fram_object_address, readonly, pParam, default_value); | ||||||
|  |         m_fram_object_index++; | ||||||
|  |         m_fram_object_address += sizeof(int16_t) << 1; | ||||||
|  |         m_fram_object_last_address = m_fram_object_address; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } /* namespace FRAM */ | ||||||
| @ -0,0 +1,101 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMDATABASE.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | #include "FRAM/FRAMDefinitions.h" | ||||||
|  | #include "FRAM/FRAMBuffer.h" | ||||||
|  | #include "FRAM/FRAMDataObjects.h" | ||||||
|  | #include "FRAM/FRAMVariant.h" | ||||||
|  | #include "SYSCTRL/SystemConfigurator.h" | ||||||
|  | #include "SYSCTRL/SystemDefinitions.h" | ||||||
|  | 
 | ||||||
|  | #ifndef FRAM_FRAMDATABASE_H_ | ||||||
|  | #define FRAM_FRAMDATABASE_H_ | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class FRAMDATABASE | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_t {WAIT, READ, BURN, ERASE, VERIFY, RESTORE}; | ||||||
|  |     enum state_t {BUSY, FREE}; | ||||||
|  | private: | ||||||
|  |     mode_t      m_mode; | ||||||
|  |     state_t     m_state; | ||||||
|  | private: | ||||||
|  |     FRAM::FRAMBuffer m_fram_data_buffer; | ||||||
|  |     uint16_t *m_buffer_pointer; | ||||||
|  |     FRAM::FRAMDataObjects m_fram_object[NUMBER_FRAM_PARAMETERS]; | ||||||
|  |     uint16_t m_fram_size; | ||||||
|  |     uint16_t m_fram_object_index; | ||||||
|  |     uint16_t m_fram_object_address; | ||||||
|  |     uint16_t m_fram_object_last_address; | ||||||
|  |     uint16_t m_fram_rw_index; | ||||||
|  |     FRAM::FRAMHeader m_header; | ||||||
|  |     FRAM::FRAMFooter m_footer; | ||||||
|  |     bool m_verify; | ||||||
|  | public: | ||||||
|  |     FRAMDATABASE(); | ||||||
|  | public: | ||||||
|  |     mode_t get_mode(); | ||||||
|  |     bool compare_mode(mode_t mode); | ||||||
|  |     state_t get_state(); | ||||||
|  |     bool compare_state(state_t state); | ||||||
|  | public: | ||||||
|  |     bool is_free(); | ||||||
|  |     bool is_busy(); | ||||||
|  |     bool is_read(); | ||||||
|  |     bool is_burn(); | ||||||
|  |     bool is_erase(); | ||||||
|  |     bool is_restore(); | ||||||
|  |     bool is_verify(); | ||||||
|  | public: | ||||||
|  |     void set_read(); | ||||||
|  |     void set_burn(); | ||||||
|  |     void set_erase(); | ||||||
|  |     void set_verify(); | ||||||
|  |     void set_restore(); | ||||||
|  |     void set_break(); | ||||||
|  | public: | ||||||
|  |     void upload_configuration(SYSCTRL::SystemControlConfiguration *sys_config); | ||||||
|  |     void update_buffer(const SYSCTRL::SystemControlConfiguration *sys_config); | ||||||
|  |     void erase_fram_index(); | ||||||
|  |     void verify_fram_index(); | ||||||
|  |     void write_fram_index(); | ||||||
|  |     void read_fram_index(); | ||||||
|  |     void restore_fram_index(); | ||||||
|  |     void read_from_fram_to_buffer(); | ||||||
|  |     void write_to_fram_from_buffer(); | ||||||
|  |     void erase_fram_buffer(); | ||||||
|  | public: | ||||||
|  |     FRAM::FRAMHeader get_header(); | ||||||
|  |     FRAM::FRAMFooter get_footer(); | ||||||
|  |     void extract_system_configuration(SYSCTRL::SystemControlConfiguration *sys_config); | ||||||
|  |     void implement_dafault_configuration(); | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  | private: | ||||||
|  |     void add_float(uint8_t readonly, float* pParam, float default_value); | ||||||
|  |     void add_int16(uint8_t readonly, int16_t* pParam, int16_t default_value); | ||||||
|  |     void add_int32(uint8_t readonly, int32_t* pParam, int32_t default_value); | ||||||
|  |     void add_uint16(uint8_t readonly, uint16_t* pParam, uint16_t default_value); | ||||||
|  |     void add_uint32(uint8_t readonly, uint32_t* pParam, uint32_t default_value); | ||||||
|  |     void add_bool(uint8_t readonly, bool* pParam, bool default_value); | ||||||
|  | public: | ||||||
|  |     void register_configuration_parameters(SYSCTRL::SystemControlConfiguration *sys_config); | ||||||
|  | 
 | ||||||
|  | };//class FRAMDATABASE
 | ||||||
|  | 
 | ||||||
|  | } /* namespace FRAM */ | ||||||
|  | 
 | ||||||
|  | #endif /* FRAM_FRAMDATABASE_H_ */ | ||||||
| @ -0,0 +1,201 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMDataObjects.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "FRAM/FRAMDataObjects.h" | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | FRAMDataObjects::FRAMDataObjects(): | ||||||
|  |         m_address(0), | ||||||
|  |         m_is_read_only(false), | ||||||
|  |         m_pParam(0), | ||||||
|  |         m_default_value() | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::restore_default_value() | ||||||
|  | { | ||||||
|  |     if(m_pParam != 0) | ||||||
|  |     { | ||||||
|  |         switch(m_default_value.get_type()) | ||||||
|  |         { | ||||||
|  |         case FRAM::FRAM_VARIANT_FLOAT:  { *((float*) m_pParam) = m_default_value.get_float();     break;} | ||||||
|  |         case FRAM::FRAM_VARIANT_INT16:  { *((int16_t*) m_pParam) = m_default_value.get_int16();   break;} | ||||||
|  |         case FRAM::FRAM_VARIANT_INT32:  { *((int32_t*) m_pParam) = m_default_value.get_int32();   break;} | ||||||
|  |         case FRAM::FRAM_VARIANT_UINT16: { *((uint16_t*) m_pParam) = m_default_value.get_uint16(); break;} | ||||||
|  |         case FRAM::FRAM_VARIANT_UINT32: { *((uint32_t*) m_pParam) = m_default_value.get_uint32(); break;} | ||||||
|  |         case FRAM::FRAM_VARIANT_BOOL:   { *((bool*) m_pParam) = m_default_value.get_bool();       break;} | ||||||
|  |         default: {break;} | ||||||
|  |         }//switch
 | ||||||
|  |     }//if
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::add_register_float(uint16_t address, uint8_t readonly, float* pParam, float default_value) | ||||||
|  | { | ||||||
|  |     m_address = address; | ||||||
|  |     m_is_read_only = 0 != readonly ? true : false; | ||||||
|  |     m_pParam = pParam; | ||||||
|  |     m_default_value.set_float(default_value); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::add_register_int16(uint16_t address, uint8_t readonly, int16_t* pParam, int16_t default_value) | ||||||
|  | { | ||||||
|  |     m_address = address; | ||||||
|  |     m_is_read_only = 0 != readonly ? true : false; | ||||||
|  |     m_pParam = pParam; | ||||||
|  |     m_default_value.set_int16(default_value); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::add_register_int32(uint16_t address, uint8_t readonly, int32_t* pParam, int32_t default_value) | ||||||
|  | { | ||||||
|  |     m_address = address; | ||||||
|  |     m_is_read_only = 0 != readonly ? true : false; | ||||||
|  |     m_pParam = pParam; | ||||||
|  |     m_default_value.set_int32(default_value); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::add_register_uint16(uint16_t address, uint8_t readonly, uint16_t* pParam, uint16_t default_value) | ||||||
|  | { | ||||||
|  |     m_address = address; | ||||||
|  |     m_is_read_only = 0 != readonly ? true : false; | ||||||
|  |     m_pParam = pParam; | ||||||
|  |     m_default_value.set_uint16(default_value); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::add_register_uint32(uint16_t address, uint8_t readonly, uint32_t* pParam, uint32_t default_value) | ||||||
|  | { | ||||||
|  |     m_address = address; | ||||||
|  |     m_is_read_only = 0 != readonly ? true : false; | ||||||
|  |     m_pParam = pParam; | ||||||
|  |     m_default_value.set_uint32(default_value); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::add_register_bool(uint16_t address, uint8_t readonly, bool* pParam, bool default_value) | ||||||
|  | { | ||||||
|  |     m_address = address; | ||||||
|  |     m_is_read_only = 0 != readonly ? true : false; | ||||||
|  |     m_pParam = pParam; | ||||||
|  |     m_default_value.set_bool(default_value); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | uint16_t FRAMDataObjects::get_address() const | ||||||
|  | { | ||||||
|  |     return m_address; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::write_parameter(const void *pBuffer, uint8_t buffer_size) | ||||||
|  | { | ||||||
|  |     if((m_pParam != 0)&& | ||||||
|  |             (pBuffer != 0) && | ||||||
|  |             (buffer_size > 0) && | ||||||
|  |             (m_is_read_only != true)) | ||||||
|  |     { | ||||||
|  |         switch(m_default_value.get_type()) | ||||||
|  |         { | ||||||
|  |         case FRAM::FRAM_VARIANT_FLOAT: { if(4 == buffer_size) *((float*)   m_pParam) = *((float*) pBuffer);   break;} | ||||||
|  |         case FRAM::FRAM_VARIANT_INT16: { if(2 == buffer_size) *((int16_t*) m_pParam) = *((int16_t*) pBuffer); break;} | ||||||
|  |         default: {break;} | ||||||
|  |         }//switch
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::read_parameter(void *pBuffer, uint8_t buffer_size) const | ||||||
|  | { | ||||||
|  |     if((m_pParam != 0) && | ||||||
|  |             (pBuffer != 0) && | ||||||
|  |             (buffer_size > 0)) | ||||||
|  |     { | ||||||
|  |         switch(m_default_value.get_type()) | ||||||
|  |         { | ||||||
|  |         case FRAM::FRAM_VARIANT_FLOAT: {if(4 == buffer_size) *((float*)   pBuffer) = *((float*) m_pParam);   break;} | ||||||
|  |         case FRAM::FRAM_VARIANT_INT16: {if(2 == buffer_size) *((int16_t*) pBuffer) = *((int16_t*) m_pParam); break;} | ||||||
|  |         default: {break;} | ||||||
|  |         }//switch
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | void FRAMDataObjects::fram_write_parameter() | ||||||
|  | { | ||||||
|  |     if(m_pParam != 0) | ||||||
|  |     { | ||||||
|  |         switch(m_default_value.get_type()) | ||||||
|  |         { | ||||||
|  |             case FRAM::FRAM_VARIANT_FLOAT: | ||||||
|  |             { | ||||||
|  |                 writefloat(*((float*) m_pParam), m_address); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             case FRAM::FRAM_VARIANT_INT16: | ||||||
|  |             { | ||||||
|  |                 writeint(*((int16_t*) m_pParam), m_address); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             default: {break;} | ||||||
|  |         }//switch
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::fram_read_parameter() | ||||||
|  | { | ||||||
|  |     if(m_pParam != 0) | ||||||
|  |     { | ||||||
|  |         switch(m_default_value.get_type()) | ||||||
|  |         { | ||||||
|  |             case FRAM::FRAM_VARIANT_FLOAT: | ||||||
|  |             { | ||||||
|  |                 *((float*) m_pParam) = readfloat(m_address); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             case FRAM::FRAM_VARIANT_INT16: | ||||||
|  |             { | ||||||
|  |                 *((int16_t*) m_pParam) = readint(m_address); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             default: {break;} | ||||||
|  |         }//switch
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::write_to_fram_data(Uint16 *Dest, Uint32 Length) | ||||||
|  | { | ||||||
|  |     for(Uint16 i = 0; i < Length; i++) | ||||||
|  |     { | ||||||
|  |         writeint((*Dest++),i); | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMDataObjects::read_from_fram_data(Uint16 *BuffAddr, Uint32 Length) | ||||||
|  | { | ||||||
|  |     for(Uint16 i = 0; i < Length; i++) | ||||||
|  |     { | ||||||
|  |         (*BuffAddr++) = readint(i); | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | } /* namespace FRAM */ | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMACCESS.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | #include "FRAM/FRAMVariant.h" | ||||||
|  | 
 | ||||||
|  | #ifndef FRAM_FRAMDATAOBJECTS_H_ | ||||||
|  | #define FRAM_FRAMDATAOBJECTS_H_ | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class FRAMDataObjects | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     uint16_t m_address; | ||||||
|  |     bool m_is_read_only; | ||||||
|  |     void* m_pParam; | ||||||
|  |     FRAM::FRAMVariant m_default_value; | ||||||
|  | public: | ||||||
|  |     FRAMDataObjects(); | ||||||
|  |     void restore_default_value(); | ||||||
|  |     void add_register_float(uint16_t address, uint8_t readonly, float* pParam, float default_value); | ||||||
|  |     void add_register_int16(uint16_t address, uint8_t readonly, int16_t* pParam, int16_t default_value); | ||||||
|  |     void add_register_int32(uint16_t address, uint8_t readonly, int32_t* pParam, int32_t default_value); | ||||||
|  |     void add_register_uint16(uint16_t address, uint8_t readonly, uint16_t* pParam, uint16_t default_value); | ||||||
|  |     void add_register_uint32(uint16_t address, uint8_t readonly, uint32_t* pParam, uint32_t default_value); | ||||||
|  |     void add_register_bool(uint16_t address, uint8_t readonly, bool* pParam, bool default_value); | ||||||
|  | public: | ||||||
|  |     uint16_t get_address() const; | ||||||
|  |     void write_parameter(const void *pBuffer, uint8_t buffer_size); | ||||||
|  |     void read_parameter(void *pBuffer, uint8_t buffer_size) const; | ||||||
|  | public: | ||||||
|  |     void fram_write_parameter(); | ||||||
|  |     void fram_read_parameter(); | ||||||
|  | public: | ||||||
|  |     void write_to_fram_data(Uint16 *Dest, Uint32 Length); | ||||||
|  |     void read_from_fram_data(Uint16 *BufAddr, Uint32 Length); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace FRAM */ | ||||||
|  | 
 | ||||||
|  | #endif /* FRAM_FRAMDATAOBJECTS_H_ */ | ||||||
| @ -0,0 +1,19 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMDefinitions.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef FRAM_FRAMDEFINITIONS_H_ | ||||||
|  | #define FRAM_FRAMDEFINITIONS_H_ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | #define FRAM_FRAM_SIZE                  ((uint16_t)(8192)) | ||||||
|  | //
 | ||||||
|  | } /* namespace FRAM */ | ||||||
|  | #endif /* FRAM_FRAMDEFINITIONS_H_ */ | ||||||
| @ -0,0 +1,112 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMVariant.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "FRAM/FRAMVariant.h" | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | FRAMVariant::FRAMVariant(): | ||||||
|  |         t(FRAM::FRAM_VARIANT_UNDEFINED), | ||||||
|  |         f(0) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | FRAM::fram_variant_type_t FRAMVariant::get_type() const | ||||||
|  | { | ||||||
|  |     return t; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | void FRAMVariant::set_float(float v) | ||||||
|  | { | ||||||
|  |     f = v; | ||||||
|  |     t = FRAM::FRAM_VARIANT_FLOAT; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | void FRAMVariant::set_int16(int16_t v) | ||||||
|  | { | ||||||
|  |     i16 = v; | ||||||
|  |     t = FRAM::FRAM_VARIANT_INT16; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMVariant::set_int32(int32_t v) | ||||||
|  | { | ||||||
|  |     i32 = v; | ||||||
|  |     t = FRAM::FRAM_VARIANT_INT32; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMVariant::set_uint16(uint16_t v) | ||||||
|  | { | ||||||
|  |     u16 = v; | ||||||
|  |     t = FRAM::FRAM_VARIANT_UINT16; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FRAMVariant::set_uint32(uint32_t v) | ||||||
|  | { | ||||||
|  |     u32 = v; | ||||||
|  |     t = FRAM::FRAM_VARIANT_UINT32; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void FRAMVariant::set_bool(bool v) | ||||||
|  | { | ||||||
|  |     b = v; | ||||||
|  |     t = FRAM::FRAM_VARIANT_BOOL; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | float FRAMVariant::get_float() const | ||||||
|  | { | ||||||
|  |     return f; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | int16_t FRAMVariant::get_int16() const | ||||||
|  | { | ||||||
|  |     return i16; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | int32_t  FRAMVariant::get_int32() const | ||||||
|  | { | ||||||
|  |     return i32; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | uint16_t FRAMVariant::get_uint16() const | ||||||
|  | { | ||||||
|  |     return u16; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | uint32_t FRAMVariant::get_uint32() const | ||||||
|  | { | ||||||
|  |     return u32; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | bool FRAMVariant::get_bool() const | ||||||
|  | { | ||||||
|  |     return b; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | }/* namespace FRAM */ | ||||||
| @ -0,0 +1,60 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMVariant.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <stdint.h> | ||||||
|  | #include "SYSCTRL/SystemDefinitions.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef FRAM_FRAMVARIANT_H_ | ||||||
|  | #define FRAM_FRAMVARIANT_H_ | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | typedef  unsigned char uint8_t; | ||||||
|  | 
 | ||||||
|  | enum fram_variant_type_t {FRAM_VARIANT_UNDEFINED, FRAM_VARIANT_FLOAT, FRAM_VARIANT_INT16, FRAM_VARIANT_INT32, FRAM_VARIANT_UINT16, FRAM_VARIANT_UINT32, FRAM_VARIANT_BOOL}; | ||||||
|  | 
 | ||||||
|  | class FRAMVariant | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     union | ||||||
|  |     { | ||||||
|  |         float   f; | ||||||
|  |         int16_t i16; | ||||||
|  |         int32_t i32; | ||||||
|  |         uint16_t u16; | ||||||
|  |         uint32_t u32; | ||||||
|  |         bool    b; | ||||||
|  |         SYSCTRL::Register16 r16; | ||||||
|  |         SYSCTRL::Register32 r32; | ||||||
|  |     }; | ||||||
|  | private: | ||||||
|  |     fram_variant_type_t t; | ||||||
|  | public: | ||||||
|  |     FRAMVariant(); | ||||||
|  |     fram_variant_type_t get_type() const; | ||||||
|  |     //setters
 | ||||||
|  |     void set_float(float v); | ||||||
|  |     void set_int16(int16_t v); | ||||||
|  |     void set_int32(int32_t v); | ||||||
|  |     void set_uint16(uint16_t v); | ||||||
|  |     void set_uint32(uint32_t v); | ||||||
|  |     void set_bool(bool v); | ||||||
|  |     //getters
 | ||||||
|  |     float    get_float() const; | ||||||
|  |     int16_t  get_int16() const; | ||||||
|  |     int32_t  get_int32() const; | ||||||
|  |     uint16_t get_uint16() const; | ||||||
|  |     uint32_t get_uint32() const; | ||||||
|  |     bool     get_bool() const; | ||||||
|  |     //
 | ||||||
|  | };//class fram_variant_t
 | ||||||
|  | //
 | ||||||
|  | }/* namespace FRAM */ | ||||||
|  | 
 | ||||||
|  | #endif /* FRAM_FRAMVARIANT_H_ */ | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | /*
 | ||||||
|  |  * FRAMheaders.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef FRAM_FRAMHEADERS_H_ | ||||||
|  | #define FRAM_FRAMHEADERS_H_ | ||||||
|  | 
 | ||||||
|  | #include "FRAM/FRAMBuffer.h" | ||||||
|  | #include "FRAM/FRAMDATABASE.h" | ||||||
|  | #include "FRAM/FRAMDataObjects.h" | ||||||
|  | #include "FRAM/FRAMVariant.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif /* FRAM_FRAMHEADERS_H_ */ | ||||||
| @ -0,0 +1,132 @@ | |||||||
|  | /*
 | ||||||
|  |  * ROM.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "FRAM/ROM.h" | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | ROM::ROM(): | ||||||
|  |         m_mode(FRAM::ROM::UNDEFINED), | ||||||
|  |         m_header(), | ||||||
|  |         m_footer(), | ||||||
|  |         m_int_last_address(0), | ||||||
|  |         m_flt_last_address(0), | ||||||
|  |         _write_float(&FRAM::ROM::_write_float_undef), | ||||||
|  |         _read_float(&FRAM::ROM::_read_float_undef), | ||||||
|  |         _write_int(&FRAM::ROM::_write_int_undef), | ||||||
|  |         _read_int(&FRAM::ROM::_read_int_undef) | ||||||
|  | {} | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void ROM::setup(const ROMSetup setup) | ||||||
|  | { | ||||||
|  |     static bool _status = true; | ||||||
|  |     if(m_mode == FRAM::ROM::UNDEFINED) | ||||||
|  |     { | ||||||
|  |         m_header = setup.header; | ||||||
|  |         m_footer = setup.footer; | ||||||
|  |         //
 | ||||||
|  |         _status &= m_header.class_id != 0 ? true : false; | ||||||
|  |         _status &= m_header.part_id != 0 ? true : false; | ||||||
|  |         _status &= m_header.rom_size != 0 ? true : false; | ||||||
|  |         _status &= m_header.software_version != 0 ? true : false; | ||||||
|  |         _status &= m_footer.magic != 0 ? true : false; | ||||||
|  |         //
 | ||||||
|  |         if(_status) | ||||||
|  |         { | ||||||
|  |             m_mode = FRAM::ROM::OPERATIONAL; | ||||||
|  |             //
 | ||||||
|  |             _write_float = &FRAM::ROM::_write_float_undef; | ||||||
|  |             _read_float = &FRAM::ROM::_read_float_undef; | ||||||
|  |             _write_int = &FRAM::ROM::_write_int_undef; | ||||||
|  |             _read_int = &FRAM::ROM::_read_int_undef; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | FRAM::ROM::mode_t ROM::get_mode() | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool ROM::compare(FRAM::ROM::mode_t mode) | ||||||
|  | { | ||||||
|  |     return m_mode == mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void ROM::write_float(float data, int16_t addr) | ||||||
|  | { | ||||||
|  |     (this->*_write_float)(data, addr); | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | float ROM::read_float(int16_t addr) | ||||||
|  | { | ||||||
|  |     return (this->*_read_float)(addr); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void ROM::write_int(int16_t data, int16_t addr) | ||||||
|  | { | ||||||
|  |     (this->*_write_int)(data, addr); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | int16_t ROM::read_int(int16_t addr) | ||||||
|  | { | ||||||
|  |     return (this->*_read_int)(addr); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void ROM::_write_float_undef(float data, int16_t addr) | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | void ROM::_write_float_operate(float data, int16_t addr) | ||||||
|  | { | ||||||
|  |     writefloat(data, addr); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | float ROM::_read_float_undef(int16_t addr) | ||||||
|  | { | ||||||
|  |     return (float)0.0; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | float ROM::_read_float_operate(int16_t addr) | ||||||
|  | { | ||||||
|  |     return readfloat(addr); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void ROM::_write_int_undef(int16_t data, int16_t addr) | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | void ROM::_write_int_operate(int16_t data, int16_t addr) | ||||||
|  | { | ||||||
|  |     writeint(data, addr); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | int16_t ROM::_read_int_undef(int16_t addr) | ||||||
|  | { | ||||||
|  |     return 0; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | int16_t ROM::_read_int_operate(int16_t addr) | ||||||
|  | { | ||||||
|  |     return readint(addr); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace FRAM */ | ||||||
| @ -0,0 +1,97 @@ | |||||||
|  | /*
 | ||||||
|  |  * ROM.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | 
 | ||||||
|  | #ifndef FRAM_ROM_H_ | ||||||
|  | #define FRAM_ROM_H_ | ||||||
|  | 
 | ||||||
|  | namespace FRAM | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct ROMHeader | ||||||
|  | { | ||||||
|  |     uint16_t class_id; | ||||||
|  |     uint16_t part_id; | ||||||
|  |     uint16_t software_version; | ||||||
|  |     uint16_t rom_size; | ||||||
|  |     ROMHeader(): | ||||||
|  |         class_id(0), | ||||||
|  |         part_id(0), | ||||||
|  |         software_version(0), | ||||||
|  |         rom_size(0) | ||||||
|  |         {} | ||||||
|  | };//ROMHeader
 | ||||||
|  | 
 | ||||||
|  | struct ROMFooter | ||||||
|  | { | ||||||
|  |     uint16_t magic; | ||||||
|  |     ROMFooter(): | ||||||
|  |         magic(0) | ||||||
|  |     {} | ||||||
|  | };//ROMFooter
 | ||||||
|  | 
 | ||||||
|  | struct ROMSetup | ||||||
|  | { | ||||||
|  |     ROMHeader header; | ||||||
|  |     ROMFooter footer; | ||||||
|  |     ROMSetup(): | ||||||
|  |         header(), | ||||||
|  |         footer() | ||||||
|  |     {} | ||||||
|  | };//ROMSetup
 | ||||||
|  | 
 | ||||||
|  | class ROM | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_t {UNDEFINED, OPERATIONAL}; | ||||||
|  | private: | ||||||
|  |     mode_t m_mode; | ||||||
|  | private: | ||||||
|  |     ROMHeader m_header; | ||||||
|  |     ROMFooter m_footer; | ||||||
|  |     uint16_t m_int_last_address; | ||||||
|  |     uint16_t m_flt_last_address; | ||||||
|  | public: | ||||||
|  |     ROM(); | ||||||
|  |     void setup(const ROMSetup setup); | ||||||
|  | public: | ||||||
|  |     mode_t get_mode(); | ||||||
|  |     bool compare(mode_t mode); | ||||||
|  | public: | ||||||
|  |     void write_float(float data, int16_t addr); | ||||||
|  |     float read_float(int16_t addr); | ||||||
|  |     void write_int(int16_t data, int16_t addr); | ||||||
|  |     int16_t read_int(int16_t addr); | ||||||
|  | private: | ||||||
|  |     void (ROM::*_write_float)(float data, int16_t addr); | ||||||
|  |     void _write_float_undef(float data, int16_t addr); | ||||||
|  |     void _write_float_operate(float data, int16_t addr); | ||||||
|  | private: | ||||||
|  |     float (ROM::*_read_float)(int16_t addr); | ||||||
|  |     float _read_float_undef(int16_t addr); | ||||||
|  |     float _read_float_operate(int16_t addr); | ||||||
|  | private: | ||||||
|  |     void (ROM::*_write_int)(int16_t data, int16_t addr); | ||||||
|  |     void _write_int_undef(int16_t data, int16_t addr); | ||||||
|  |     void _write_int_operate(int16_t data, int16_t addr); | ||||||
|  | private: | ||||||
|  |     int16_t (ROM::*_read_int)(int16_t addr); | ||||||
|  |     int16_t _read_int_undef(int16_t addr); | ||||||
|  |     int16_t _read_int_operate(int16_t addr); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  | };// class ROM
 | ||||||
|  | 
 | ||||||
|  | } /* namespace FRAM */ | ||||||
|  | 
 | ||||||
|  | #endif /* FRAM_ROM_H_ */ | ||||||
											
												Binary file not shown.
											
										
									
								| @ -0,0 +1,209 @@ | |||||||
|  | /*****************************************************************************
 | ||||||
|  |  * File Name:framework.c | ||||||
|  |  * Author:Zhangdi | ||||||
|  |  * Brief: | ||||||
|  |  * Note: | ||||||
|  |  * Last Updated for Version: | ||||||
|  |  * Date of the Last Update: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | #include"framework.h" | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  ** Constants | ||||||
|  |  *****************************************************************************/ | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  ** Maco Define | ||||||
|  |  *****************************************************************************/ | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  ** Data Type Define | ||||||
|  |  *****************************************************************************/ | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  ** Global Variable Declare | ||||||
|  |  *****************************************************************************/ | ||||||
|  | BaudRate comModbusBaudRateSet; | ||||||
|  | Uint16 comModbusADDRSet; | ||||||
|  | ParityMode comModbusParitySet; | ||||||
|  | 
 | ||||||
|  | Uint16 cpuCpldVersion; | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Analog input | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | AnalogInput analogInput = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Analog output | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | Uint16 a2001_2005 = 0; | ||||||
|  | Uint16 a2002_2006 = 0; | ||||||
|  | Uint16 a2003_2007 = 0; | ||||||
|  | Uint16 a2004_2008 = 0; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Digital input interface | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | DigitalInput digitalInput = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Digital output interface | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | DigitalOuput digitalOutput = { 0xffff }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: modbus output coils buffer | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | Uint16 readCoils[300] = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: modbus input coils buffer | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | Uint16 writeCoils[300] = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: modbus output registers buffer | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | Uint16 readRegisters[300] = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: modbus input registers buffer | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | Uint16 writeRegisters[300] = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Event for modbus state machine | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | hsmEvent etmp; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: modbus object | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | MODBUS_RTU_SLAVE modbusHMI; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: modbus event list | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | hsmEvent eBufferHMI[50]; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: modbus port object | ||||||
|  |  * Note: | ||||||
|  |  *****************************************************************************/ | ||||||
|  | MODBUS_RTU_PORT_INFOR modbusHMIPort = { 5, B9600, NO_PARITY, | ||||||
|  |         &(ScibRegs.SCIRXBUF.all), &(ScibRegs.SCITXBUF), 21, &(ScibRegs) }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Ecan data buffer. These data transport from cpu to communication | ||||||
|  |  *        board. | ||||||
|  |  * Note: These data used for communication board modbus output coils. | ||||||
|  |  *****************************************************************************/ | ||||||
|  | Uint16 canData_cpu2com_coils[16] = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Ecan data buffer. These data transport from cpu to communication | ||||||
|  |  *        board. | ||||||
|  |  * Note: These data used for communication board modbus output registers. | ||||||
|  |  *****************************************************************************/ | ||||||
|  |  Uint16 canData_cpu2com_registers[50] = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Ecan data buffer. These data transport from communication board to | ||||||
|  |  *      cpu board. | ||||||
|  |  * Note: These data are input coils data received by communication board modbus. | ||||||
|  |  *****************************************************************************/ | ||||||
|  |  Uint16 canData_com2cpu_coils[16] = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  * Brief: Ecan data buffer. These data transport from communication board to | ||||||
|  |  *      cpu board. | ||||||
|  |  * Note: These data are input registers data received by communication board | ||||||
|  |  *       modbus. | ||||||
|  |  *****************************************************************************/ | ||||||
|  |  Uint16 canData_com2cpu_registers[50] = { 0 }; | ||||||
|  | 
 | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  ** Global Function Declare | ||||||
|  |  *****************************************************************************/ | ||||||
|  | void frameworkDataInit(void) | ||||||
|  | { | ||||||
|  |   Uint32 i; | ||||||
|  |   int16 *p; | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)&analogInput; | ||||||
|  |   for(i = 0; i < sizeof(analogInput) / sizeof(int16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   a2001_2005 = 0; | ||||||
|  |   a2002_2006 = 0; | ||||||
|  |   a2003_2007 = 0; | ||||||
|  |   a2004_2008 = 0; | ||||||
|  | 
 | ||||||
|  |   digitalInput.all = 0xffffffff; | ||||||
|  |   digitalOutput.all = 0xffffffff; | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)readCoils; | ||||||
|  |   for(i = 0; i < sizeof(readCoils) / sizeof(Uint16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)writeCoils; | ||||||
|  |   for(i = 0; i < sizeof(writeCoils) / sizeof(Uint16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)readRegisters; | ||||||
|  |   for(i = 0; i < sizeof(readRegisters) / sizeof(Uint16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)writeRegisters; | ||||||
|  |   for(i = 0; i < sizeof(writeRegisters) / sizeof(Uint16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   etmp.signal = 0; | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)canData_cpu2com_coils; | ||||||
|  |   for(i = 0; i < sizeof(canData_cpu2com_coils) / sizeof(Uint16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)canData_cpu2com_registers; | ||||||
|  |   for(i = 0; i < sizeof(canData_cpu2com_registers) / sizeof(Uint16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)canData_com2cpu_coils; | ||||||
|  |   for(i = 0; i < sizeof(canData_com2cpu_coils) / sizeof(Uint16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   p = (int16 *)canData_com2cpu_registers; | ||||||
|  |   for(i = 0; i < sizeof(canData_com2cpu_registers) / sizeof(Uint16); i++) | ||||||
|  |   { | ||||||
|  |     p[i] = 0; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | /*****************************************************************************
 | ||||||
|  |  ** Local Function Declare | ||||||
|  |  *****************************************************************************/ | ||||||
| @ -0,0 +1,33 @@ | |||||||
|  | /*
 | ||||||
|  |  * HALBase.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "HAL/HALBase.h" | ||||||
|  | 
 | ||||||
|  | namespace HAL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | HALBase::HALBase(): | ||||||
|  |         m_mode(HAL::HALBase::UNDEFINED), | ||||||
|  |         m_status(false) | ||||||
|  | //
 | ||||||
|  | {}//end CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | HAL::HALBase::mode_t HAL::HALBase::get_mode() const | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | //
 | ||||||
|  | bool HAL::HALBase::compare(HAL::HALBase::mode_t mode) const | ||||||
|  | { | ||||||
|  |     return m_mode == mode; | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | //
 | ||||||
|  | } /* namespace HAL */ | ||||||
| @ -0,0 +1,48 @@ | |||||||
|  | /*
 | ||||||
|  |  * HALBase.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | //
 | ||||||
|  | #include "F28335/DSP28x_Project.h" | ||||||
|  | 
 | ||||||
|  | #ifndef HAL_HALVIRTUAL_H_ | ||||||
|  | #define HAL_HALVIRTUAL_H_ | ||||||
|  | 
 | ||||||
|  | namespace HAL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | typedef void (*pGPIO_FUNCTION)(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct HALSetup | ||||||
|  | { | ||||||
|  |     pGPIO_FUNCTION gpio_setup; | ||||||
|  |     HALSetup(): | ||||||
|  |         gpio_setup(0) | ||||||
|  |     {} | ||||||
|  | };//HALSetup
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class HALBase | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_t {UNDEFINED=0, OPERATIONAL=1}; | ||||||
|  | protected: | ||||||
|  |     mode_t  m_mode; | ||||||
|  |     bool m_status; | ||||||
|  | public: | ||||||
|  |     HALBase(); | ||||||
|  | public: | ||||||
|  |     mode_t get_mode() const; | ||||||
|  |     bool compare(mode_t mode) const; | ||||||
|  |     //
 | ||||||
|  | };//end class HALVirtual
 | ||||||
|  | 
 | ||||||
|  | } /* namespace HAL */ | ||||||
|  | 
 | ||||||
|  | #endif /* HAL_HALVIRTUAL_H_ */ | ||||||
| @ -0,0 +1,28 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUS.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "MODBUSRTU/RUBUS.h" | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | RUBUS::RUBUS(uint16_t len): | ||||||
|  |         mode(MODBUSRTU::RUBUS::RUBUS_RESET), | ||||||
|  |         size(len), | ||||||
|  |         accepted(), | ||||||
|  |         response_shadow(), | ||||||
|  |         response(), | ||||||
|  |         mask(), | ||||||
|  |         m_cell(), | ||||||
|  |         cell_data(0) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
| @ -0,0 +1,103 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUS.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef MODBUSRTU_RUBUS_H_ | ||||||
|  | #define MODBUSRTU_RUBUS_H_ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | #include "SYSCTRL/SystemEnvironment.h" | ||||||
|  | #include "MODBUSRTU/RUBUSRegister.h" | ||||||
|  | #include "MODBUSRTU/RUBUSTypes.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS_ACCEPTED_DATA | ||||||
|  | { | ||||||
|  |     RUBUS_REGISTER_16 command_start; | ||||||
|  |     RUBUS_REGISTER_16 command_end; | ||||||
|  |     uint16_t index; | ||||||
|  |     RUBUS_REGISTER_16 id; | ||||||
|  |     RUBUS_REGISTER_16 com; | ||||||
|  |     RUBUS_REGISTER_32 data; | ||||||
|  |     RUBUS_ACCEPTED_DATA(): | ||||||
|  |         command_start(0), | ||||||
|  |         command_end(0), | ||||||
|  |         index(0), | ||||||
|  |         id(0), | ||||||
|  |         com(0), | ||||||
|  |         data(0) | ||||||
|  |     {} | ||||||
|  | };//RUBUS_ACCEPTED_DATA
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS_MASK | ||||||
|  | { | ||||||
|  |     RUBUS_REGISTER_16 error_response; | ||||||
|  |     RUBUS_REGISTER_16 rubus_bool; | ||||||
|  |     RUBUS_REGISTER_16 rubus_float; | ||||||
|  |     RUBUS_REGISTER_16 rubus_uint8; | ||||||
|  |     RUBUS_REGISTER_16 rubus_uint16; | ||||||
|  |     RUBUS_REGISTER_16 rubus_uint32; | ||||||
|  |     RUBUS_REGISTER_16 rubus_int8; | ||||||
|  |     RUBUS_REGISTER_16 rubus_int16; | ||||||
|  |     RUBUS_REGISTER_16 rubus_int32; | ||||||
|  |     RUBUS_MASK(): | ||||||
|  |         error_response(0x80), | ||||||
|  |         rubus_bool(0x0000), | ||||||
|  |         rubus_float(0x0002), | ||||||
|  |         rubus_uint8(0x0004), | ||||||
|  |         rubus_uint16(0x0006), | ||||||
|  |         rubus_uint32(0x0008), | ||||||
|  |         rubus_int8(0x000A), | ||||||
|  |         rubus_int16(0x00C), | ||||||
|  |         rubus_int32(0x000E) | ||||||
|  |     {} | ||||||
|  | };//RUBUS_MASK
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS_RESPONSE | ||||||
|  | { | ||||||
|  |     RUBUS_REGISTER_16 command; | ||||||
|  |     uint16_t index; | ||||||
|  |     RUBUS_REGISTER_32 data; | ||||||
|  |     RUBUS_RESPONSE(): | ||||||
|  |         command(0), | ||||||
|  |         index(0), | ||||||
|  |         data(0) | ||||||
|  |     {} | ||||||
|  | };//RUBUS_RESPONSE
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS | ||||||
|  | { | ||||||
|  |     enum mode_rubus_t {RUBUS_RESET, RUBUS_READ, RUBUS_WRITE, RUBUS_ERROR}; | ||||||
|  |     mode_rubus_t mode; | ||||||
|  |     uint16_t size; | ||||||
|  |     RUBUS_ACCEPTED_DATA accepted; | ||||||
|  |     RUBUS_RESPONSE response_shadow; | ||||||
|  |     RUBUS_RESPONSE response; | ||||||
|  |     const RUBUS_MASK mask; | ||||||
|  |     MODBUSRTU::RUBUSRegister m_cell; | ||||||
|  |     RUBUS_REGISTER_32 cell_data; | ||||||
|  |     RUBUS(uint16_t size); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
|  | 
 | ||||||
|  | #endif /* MODBUSRTU_RUBUS_H_ */ | ||||||
| @ -0,0 +1,19 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUSCOPE.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "MODBUSRTU/RUBUSCOPE.h" | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | RUBUSCOPE::RUBUSCOPE(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         m_env(env), | ||||||
|  |         m_len(RUBUSCOPEARRAYLEN), | ||||||
|  |         m_channels() | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUSCOPE.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef MODBUSRTU_RUBUSCOPE_H_ | ||||||
|  | #define MODBUSRTU_RUBUSCOPE_H_ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | #include "SYSCTRL/SystemEnvironment.h" | ||||||
|  | #include "MODBUSRTU/RUBUSRegister.h" | ||||||
|  | #include "MODBUSRTU/RUBUSTypes.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | #define RUBUSCOPEARRAYLEN 100 | ||||||
|  | 
 | ||||||
|  | struct RUBUSCOPEVariables | ||||||
|  | { | ||||||
|  |     uint16_t command; | ||||||
|  |     uint16_t response; | ||||||
|  |     uint16_t channel; | ||||||
|  |     uint16_t pointer; | ||||||
|  |     float data; | ||||||
|  |     RUBUSCOPEVariables(){} | ||||||
|  | };//RUBUSCOPEVariables
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class RUBUSCOPE | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  |     uint16_t m_len; | ||||||
|  |     float m_channels[9][RUBUSCOPEARRAYLEN]; | ||||||
|  | public: | ||||||
|  |     RUBUSCOPE(SYSCTRL::SystemEnvironment& env); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
|  | 
 | ||||||
|  | #endif /* MODBUSRTU_RUBUSCOPE_H_ */ | ||||||
| @ -0,0 +1,565 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUSDataBase.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "MODBUSRTU/RUBUSDataBase.h" | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | RUBUSDataBase::RUBUSDataBase(): | ||||||
|  |         m_cell(), | ||||||
|  |         m_current_index_cell(0), | ||||||
|  |         m_index_cell(0), | ||||||
|  |         m_counter_cell(0), | ||||||
|  |         m_size_cell(NUMBER_RUBUSCELLS) | ||||||
|  | {}//
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void RUBUSDataBase::add_register_bool  (uint16_t index, uint16_t readonly, bool*     param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bool(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_float (uint16_t index, uint16_t readonly, float*    param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_float(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_uint8 (uint16_t index, uint16_t readonly, uint8_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_uint8(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_uint16(uint16_t index, uint16_t readonly, uint16_t* param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_uint16(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_uint32(uint16_t index, uint16_t readonly, uint32_t* param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_uint32(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_int8  (uint16_t index, uint16_t readonly, int8_t*   param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_int8(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_int16 (uint16_t index, uint16_t readonly, int16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_int16(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_int32 (uint16_t index, uint16_t readonly, int32_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_int32(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void RUBUSDataBase::add_register_bit0  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit0(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit1  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit1(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit2  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit2(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit3  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit3(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit4  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit4(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit5  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit5(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit6  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit6(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit7  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit7(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit8  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit8(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit9  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit9(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit10 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit10(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit11 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit11(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit12 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit12(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit13 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit13(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit14 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit14(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit15 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit15(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit16 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit16(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit17 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit17(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit18 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit18(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit19 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit19(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit20 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit20(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit21 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit21(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit22 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit22(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit23 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit23(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit24 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit24(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit25 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit25(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit26 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit26(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit27 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit27(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit28 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit28(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit29 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit29(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit30 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit30(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSDataBase::add_register_bit31 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     if(m_counter_cell < m_size_cell) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_counter_cell]; | ||||||
|  |         cell.register_bit31(index, readonly, param); | ||||||
|  |         m_counter_cell++; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | //#pragma CODE_SECTION("ramfuncs");
 | ||||||
|  | MODBUSRTU::RUBUSRegister& RUBUSDataBase::get_register(uint16_t index) | ||||||
|  | { | ||||||
|  |     m_current_index_cell = 0; | ||||||
|  |     for(m_index_cell = 0; m_index_cell < m_counter_cell; m_index_cell++) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_index_cell]; | ||||||
|  |         if(cell.get_index() == index) | ||||||
|  |         { | ||||||
|  |             m_current_index_cell = m_index_cell; | ||||||
|  |             break; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  |     return m_cell[m_current_index_cell]; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | //#pragma CODE_SECTION("ramfuncs");
 | ||||||
|  | void RUBUSDataBase::read_register(uint16_t index, RUBUS_REGISTER_32& data) | ||||||
|  | { | ||||||
|  |     m_current_index_cell = 0; | ||||||
|  |     for(m_index_cell = 0; m_index_cell < m_counter_cell; m_index_cell++) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_index_cell]; | ||||||
|  |         if(cell.get_index() == index) | ||||||
|  |         { | ||||||
|  |             m_current_index_cell = m_index_cell; | ||||||
|  |             break; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  |     data.all = m_cell[m_current_index_cell].read_register().all; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | //#pragma CODE_SECTION("ramfuncs");
 | ||||||
|  | uint16_t RUBUSDataBase::write_register(uint16_t index, RUBUS_REGISTER_32 data) | ||||||
|  | { | ||||||
|  |     m_current_index_cell = 0; | ||||||
|  |     for(m_index_cell = 0; m_index_cell < m_counter_cell; m_index_cell++) | ||||||
|  |     { | ||||||
|  |         MODBUSRTU::RUBUSRegister& cell = m_cell[m_index_cell]; | ||||||
|  |         if(cell.get_index() == index) | ||||||
|  |         { | ||||||
|  |             m_current_index_cell = m_index_cell; | ||||||
|  |             break; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  |     return m_cell[m_current_index_cell].write_register(data.all); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
| @ -0,0 +1,88 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUSDataBase.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef MODBUSRTU_RUBUSDATABASE_H_ | ||||||
|  | #define MODBUSRTU_RUBUSDATABASE_H_ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | #include "SYSCTRL/SystemEnvironment.h" | ||||||
|  | 
 | ||||||
|  | #include "MODBUSRTU/RUBUSTypes.h" | ||||||
|  | #include "MODBUSRTU/RUBUSRegister.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | #define NUMBER_RUBUSCELLS          ((uint16_t)(420)) | ||||||
|  | 
 | ||||||
|  | class RUBUSDataBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     MODBUSRTU::RUBUSRegister m_cell[NUMBER_RUBUSCELLS]; | ||||||
|  |     uint16_t m_current_index_cell; | ||||||
|  |     uint16_t m_index_cell; | ||||||
|  |     uint16_t m_counter_cell; | ||||||
|  |     uint16_t m_size_cell; | ||||||
|  | public: | ||||||
|  |     RUBUSDataBase(); | ||||||
|  | public: | ||||||
|  |     void configurate(); | ||||||
|  | public: | ||||||
|  |     void add_register_bool  (uint16_t index, uint16_t readonly, bool*     param); | ||||||
|  |     void add_register_float (uint16_t index, uint16_t readonly, float*    param); | ||||||
|  |     void add_register_uint8 (uint16_t index, uint16_t readonly, uint8_t*  param); | ||||||
|  |     void add_register_uint16(uint16_t index, uint16_t readonly, uint16_t* param); | ||||||
|  |     void add_register_uint32(uint16_t index, uint16_t readonly, uint32_t* param); | ||||||
|  |     void add_register_int8  (uint16_t index, uint16_t readonly, int8_t*   param); | ||||||
|  |     void add_register_int16 (uint16_t index, uint16_t readonly, int16_t*  param); | ||||||
|  |     void add_register_int32 (uint16_t index, uint16_t readonly, int32_t*  param); | ||||||
|  |     void add_register_bit0  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit1  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit2  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit3  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit4  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit5  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit6  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit7  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit8  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit9  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit10 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit11 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit12 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit13 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit14 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit15 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit16 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit17 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit18 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit19 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit20 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit21 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit22 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit23 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit24 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit25 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit26 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit27 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit28 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit29 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit30 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void add_register_bit31 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  | public: | ||||||
|  |     MODBUSRTU::RUBUSRegister& get_register(uint16_t index); | ||||||
|  |     void read_register(uint16_t index, RUBUS_REGISTER_32& data); | ||||||
|  |     uint16_t write_register(uint16_t index, RUBUS_REGISTER_32 data); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
|  | 
 | ||||||
|  | #endif /* MODBUSRTU_RUBUSDATABASE_H_ */ | ||||||
| @ -0,0 +1,862 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUSCell.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "MODBUSRTU/RUBUSRegister.h" | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | RUBUSRegister::RUBUSRegister(): | ||||||
|  |         m_index(0), | ||||||
|  |         m_is_read_only(true), | ||||||
|  |         m_param(0), | ||||||
|  |         m_type(MODBUSRTU::RUBUS_UNDEFINED) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | RUBUSRegister::RUBUSRegister(const RUBUSRegister& copyregister): | ||||||
|  |         m_index(copyregister.m_index), | ||||||
|  |         m_is_read_only(copyregister.m_is_read_only), | ||||||
|  |         m_param(copyregister.m_param), | ||||||
|  |         m_type(copyregister.m_type) | ||||||
|  | {} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void RUBUSRegister::register_bool  (uint16_t index, uint16_t readonly, bool*     param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BOOL; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_float (uint16_t index, uint16_t readonly, float*    param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_FLOAT; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_uint8 (uint16_t index, uint16_t readonly, uint8_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_UINT8; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_uint16(uint16_t index, uint16_t readonly, uint16_t* param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_UINT16; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_uint32(uint16_t index, uint16_t readonly, uint32_t* param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_UINT32; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_int8  (uint16_t index, uint16_t readonly, int8_t*   param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_INT8; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_int16 (uint16_t index, uint16_t readonly, int16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_INT16; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_int32 (uint16_t index, uint16_t readonly, int32_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_INT32; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit0  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT0; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit1  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT1; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit2  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT2; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit3  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT3; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit4  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT4; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit5  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT5; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit6  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT6; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit7  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT7; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit8  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT8; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit9  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT9; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit10  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT10; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit11  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT11; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit12  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT12; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit13  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT13; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit14  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT14; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit15  (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT15; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit16 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT16; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit17 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT17; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit18 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT18; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit19 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT19; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit20 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT20; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit21 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT21; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit22 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT22; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit23 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT23; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit24 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT24; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit25 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT25; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit26 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT26; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit27 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT27; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit28 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT28; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit29 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT29; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit30 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT30; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void RUBUSRegister::register_bit31 (uint16_t index, uint16_t readonly, uint16_t*  param) | ||||||
|  | { | ||||||
|  |     m_index = index; | ||||||
|  |     m_param = param; | ||||||
|  |     m_type = MODBUSRTU::RUBUS_BIT31; | ||||||
|  |     m_is_read_only = readonly == 0 ? false : true; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | uint16_t RUBUSRegister::get_index() | ||||||
|  | { | ||||||
|  |     return m_index; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | bool  RUBUSRegister::is_read_only() | ||||||
|  | { | ||||||
|  |     return m_is_read_only; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | MODBUSRTU::rubus_variant_type_t RUBUSRegister::get_type() | ||||||
|  | { | ||||||
|  |     return m_type; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | MODBUSRTU::RUBUS_REGISTER_32 RUBUSRegister::read_register() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     MODBUSRTU::RUBUS_REGISTER_32 _temp = MODBUSRTU::RUBUS_REGISTER_32(0); | ||||||
|  |     _temp.word.wL.all = 0x0000; | ||||||
|  |     _temp.word.wH.all = 0x0000; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     switch(m_type) | ||||||
|  |     { | ||||||
|  |     case MODBUSRTU::RUBUS_BOOL:   { _temp.b   = *((bool*)     m_param); break;} | ||||||
|  |     case MODBUSRTU::RUBUS_FLOAT:  { _temp.f   = *((float*)    m_param); break;} | ||||||
|  |     case MODBUSRTU::RUBUS_UINT8:  { _temp.u8  = *((uint8_t*)  m_param); break;} | ||||||
|  |     case MODBUSRTU::RUBUS_UINT16: { _temp.u16 = *((uint16_t*) m_param); break;} | ||||||
|  |     case MODBUSRTU::RUBUS_UINT32: { _temp.u32 = *((uint32_t*) m_param); break;} | ||||||
|  |     case MODBUSRTU::RUBUS_INT8:   { _temp.i8  = *((int8_t*)   m_param); break;} | ||||||
|  |     case MODBUSRTU::RUBUS_INT16:  { _temp.i16 = *((int16_t*)  m_param); break;} | ||||||
|  |     case MODBUSRTU::RUBUS_INT32:  { _temp.i32 = *((int32_t*)  m_param); break;} | ||||||
|  |     case MODBUSRTU::RUBUS_BIT0: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0001); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT1: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0002); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT2: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0004); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT3: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0008); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT4: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0010); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT5: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0020); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT6: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0040); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT7: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0080); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT8: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0100); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT9: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0200); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT10: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0400); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT11: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x0800); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT12: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x1000); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT13: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x2000); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT14: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x4000); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT15: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wL.all, 0x8000); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT16: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0001); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT17: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0002); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT18: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0004); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT19: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0008); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT20: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0010); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT21: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0020); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT22: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0040); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT23: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0080); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT24: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0100); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT25: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0200); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT26: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0400); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT27: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x0800); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT28: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x1000); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT29: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x2000); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT30: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x4000); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case MODBUSRTU::RUBUS_BIT31: | ||||||
|  |     { | ||||||
|  |         _read_bit(_temp.word.wH.all, 0x8000); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     }//switch
 | ||||||
|  |     //
 | ||||||
|  |     return _temp.all; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | uint16_t RUBUSRegister::write_register(MODBUSRTU::RUBUS_REGISTER_32 data) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     MODBUSRTU::RUBUS_REGISTER_32 _temp = MODBUSRTU::RUBUS_REGISTER_32(0); | ||||||
|  |     _temp.word.wL.all = 0x0000; | ||||||
|  |     _temp.word.wH.all = 0x0000; | ||||||
|  | 
 | ||||||
|  |     if(m_is_read_only) | ||||||
|  |     { | ||||||
|  |         // register is read only
 | ||||||
|  |         // write operation is not allowed
 | ||||||
|  |         return 0x0040; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         // writeable register
 | ||||||
|  |         switch(m_type) | ||||||
|  |         { | ||||||
|  |         case MODBUSRTU::RUBUS_BOOL:   { *((bool*)     m_param) = data.b;   break;} | ||||||
|  |         case MODBUSRTU::RUBUS_FLOAT:  { *((float*)    m_param) = data.f;   break;} | ||||||
|  |         case MODBUSRTU::RUBUS_UINT8:  { *((uint8_t*)  m_param) = data.u8;  break;} | ||||||
|  |         case MODBUSRTU::RUBUS_UINT16: { *((uint16_t*) m_param) = data.u16; break;} | ||||||
|  |         case MODBUSRTU::RUBUS_UINT32: { *((uint32_t*) m_param) = data.u32; break;} | ||||||
|  |         case MODBUSRTU::RUBUS_INT8:   { *((int8_t*)   m_param) = data.i8;  break;} | ||||||
|  |         case MODBUSRTU::RUBUS_INT16:  { *((int16_t*)  m_param) = data.i16; break;} | ||||||
|  |         case MODBUSRTU::RUBUS_INT32:  { *((int32_t*)  m_param) = data.i32; break;} | ||||||
|  |         case MODBUSRTU::RUBUS_BIT0: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b00 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = data.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT1: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b01 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT2: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b02 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT3: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b03 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT4: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b04 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT5: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b05 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT6: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b06 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT7: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b07 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT8: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b08 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT9: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b09 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT10: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b10 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT11: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b11 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT12: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b12 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT13: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b13 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT14: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b14 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT15: | ||||||
|  |         { | ||||||
|  |             _temp.u16 = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit16.b15 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.u16; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT16: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b16 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT17: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b17 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT18: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b18 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT19: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b19 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT20: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b20 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT21: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b21 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT22: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b22 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT23: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b23 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT24: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b24 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT25: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b25 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT26: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b26 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT27: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b27 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT28: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b28 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT29: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b29 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT30: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b30 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         case MODBUSRTU::RUBUS_BIT31: | ||||||
|  |         { | ||||||
|  |             _temp.word.wH.all = *((uint16_t*) m_param); | ||||||
|  |             _temp.bit32.b31 = data.bit16.b00; | ||||||
|  |             *((uint16_t*) m_param) = _temp.word.wH.all; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         }//switch
 | ||||||
|  |         //
 | ||||||
|  |         return 0; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | inline void RUBUSRegister::_read_bit(uint16_t& auxreg, uint16_t mask) | ||||||
|  | { | ||||||
|  |     auxreg = *((uint16_t*) m_param); | ||||||
|  |     auxreg &= mask; | ||||||
|  |     auxreg = auxreg == 0 ? 0 : 1; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
| @ -0,0 +1,89 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUSCell.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef MODBUSRTU_RUBUSREGISTER_H_ | ||||||
|  | #define MODBUSRTU_RUBUSREGISTER_H_ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/SystemEnvironment.h" | ||||||
|  | #include "MODBUSRTU/RUBUSTypes.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class RUBUSRegister | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     uint16_t    m_index; | ||||||
|  |     bool        m_is_read_only; | ||||||
|  |     void*       m_param; | ||||||
|  |     rubus_variant_type_t m_type; | ||||||
|  | public: | ||||||
|  |     RUBUSRegister(); | ||||||
|  |     RUBUSRegister(const RUBUSRegister& cell); | ||||||
|  | public: | ||||||
|  |     void register_bool  (uint16_t index, uint16_t readonly, bool*     param); | ||||||
|  |     void register_float (uint16_t index, uint16_t readonly, float*    param); | ||||||
|  |     void register_uint8 (uint16_t index, uint16_t readonly, uint8_t*  param); | ||||||
|  |     void register_uint16(uint16_t index, uint16_t readonly, uint16_t* param); | ||||||
|  |     void register_uint32(uint16_t index, uint16_t readonly, uint32_t* param); | ||||||
|  |     void register_int8  (uint16_t index, uint16_t readonly, int8_t*   param); | ||||||
|  |     void register_int16 (uint16_t index, uint16_t readonly, int16_t*  param); | ||||||
|  |     void register_int32 (uint16_t index, uint16_t readonly, int32_t*  param); | ||||||
|  |     void register_bit0  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit1  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit2  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit3  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit4  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit5  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit6  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit7  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit8  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit9  (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit10 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit11 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit12 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit13 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit14 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit15 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit16 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit17 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit18 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit19 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit20 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit21 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit22 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit23 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit24 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit25 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit26 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit27 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit28 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit29 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit30 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  |     void register_bit31 (uint16_t index, uint16_t readonly, uint16_t*  param); | ||||||
|  | public: | ||||||
|  |     uint16_t get_index(); | ||||||
|  |     bool  is_read_only(); | ||||||
|  |     MODBUSRTU::rubus_variant_type_t get_type(); | ||||||
|  | public: | ||||||
|  |     MODBUSRTU::RUBUS_REGISTER_32 read_register(); | ||||||
|  |     uint16_t write_register(MODBUSRTU::RUBUS_REGISTER_32 data); | ||||||
|  | private: | ||||||
|  |     inline void _read_bit(uint16_t& auxreg, uint16_t mask); | ||||||
|  | //
 | ||||||
|  | };//
 | ||||||
|  | 
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
|  | 
 | ||||||
|  | #endif /* MODBUSRTU_RUBUSREGISTER_H_ */ | ||||||
|  | 
 | ||||||
| @ -0,0 +1,197 @@ | |||||||
|  | /*
 | ||||||
|  |  * RUBUSTypes.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef MODBUSRTU_RUBUSTYPES_H_ | ||||||
|  | #define MODBUSRTU_RUBUSTYPES_H_ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace MODBUSRTU | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | typedef unsigned char uint8_t; | ||||||
|  | typedef signed   char  int8_t; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | enum rubus_variant_type_t { RUBUS_UNDEFINED, | ||||||
|  |                             RUBUS_BOOL, | ||||||
|  |                             RUBUS_FLOAT, | ||||||
|  |                             RUBUS_UINT8, | ||||||
|  |                             RUBUS_UINT16, | ||||||
|  |                             RUBUS_UINT32, | ||||||
|  |                             RUBUS_INT8, | ||||||
|  |                             RUBUS_INT16, | ||||||
|  |                             RUBUS_INT32, | ||||||
|  |                             RUBUS_BIT0, | ||||||
|  |                             RUBUS_BIT1, | ||||||
|  |                             RUBUS_BIT2, | ||||||
|  |                             RUBUS_BIT3, | ||||||
|  |                             RUBUS_BIT4, | ||||||
|  |                             RUBUS_BIT5, | ||||||
|  |                             RUBUS_BIT6, | ||||||
|  |                             RUBUS_BIT7, | ||||||
|  |                             RUBUS_BIT8, | ||||||
|  |                             RUBUS_BIT9, | ||||||
|  |                             RUBUS_BIT10, | ||||||
|  |                             RUBUS_BIT11, | ||||||
|  |                             RUBUS_BIT12, | ||||||
|  |                             RUBUS_BIT13, | ||||||
|  |                             RUBUS_BIT14, | ||||||
|  |                             RUBUS_BIT15, | ||||||
|  |                             RUBUS_BIT16, | ||||||
|  |                             RUBUS_BIT17, | ||||||
|  |                             RUBUS_BIT18, | ||||||
|  |                             RUBUS_BIT19, | ||||||
|  |                             RUBUS_BIT20, | ||||||
|  |                             RUBUS_BIT21, | ||||||
|  |                             RUBUS_BIT22, | ||||||
|  |                             RUBUS_BIT23, | ||||||
|  |                             RUBUS_BIT24, | ||||||
|  |                             RUBUS_BIT25, | ||||||
|  |                             RUBUS_BIT26, | ||||||
|  |                             RUBUS_BIT27, | ||||||
|  |                             RUBUS_BIT28, | ||||||
|  |                             RUBUS_BIT29, | ||||||
|  |                             RUBUS_BIT30, | ||||||
|  |                             RUBUS_BIT31}; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS_REGISTER_16_BIT_FIELD | ||||||
|  | { | ||||||
|  |     uint16_t b00: 1; | ||||||
|  |     uint16_t b01: 1; | ||||||
|  |     uint16_t b02: 1; | ||||||
|  |     uint16_t b03: 1; | ||||||
|  |     uint16_t b04: 1; | ||||||
|  |     uint16_t b05: 1; | ||||||
|  |     uint16_t b06: 1; | ||||||
|  |     uint16_t b07: 1; | ||||||
|  |     uint16_t b08: 1; | ||||||
|  |     uint16_t b09: 1; | ||||||
|  |     uint16_t b10: 1; | ||||||
|  |     uint16_t b11: 1; | ||||||
|  |     uint16_t b12: 1; | ||||||
|  |     uint16_t b13: 1; | ||||||
|  |     uint16_t b14: 1; | ||||||
|  |     uint16_t b15: 1; | ||||||
|  | };//RUBUS_REGISTER_16_BIT_FIELD
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS_REGISTER_32_BIT_FIELD | ||||||
|  | { | ||||||
|  |     uint32_t b00: 1; | ||||||
|  |     uint32_t b01: 1; | ||||||
|  |     uint32_t b02: 1; | ||||||
|  |     uint32_t b03: 1; | ||||||
|  |     uint32_t b04: 1; | ||||||
|  |     uint32_t b05: 1; | ||||||
|  |     uint32_t b06: 1; | ||||||
|  |     uint32_t b07: 1; | ||||||
|  |     uint32_t b08: 1; | ||||||
|  |     uint32_t b09: 1; | ||||||
|  |     uint32_t b10: 1; | ||||||
|  |     uint32_t b11: 1; | ||||||
|  |     uint32_t b12: 1; | ||||||
|  |     uint32_t b13: 1; | ||||||
|  |     uint32_t b14: 1; | ||||||
|  |     uint32_t b15: 1; | ||||||
|  |     uint32_t b16: 1; | ||||||
|  |     uint32_t b17: 1; | ||||||
|  |     uint32_t b18: 1; | ||||||
|  |     uint32_t b19: 1; | ||||||
|  |     uint32_t b20: 1; | ||||||
|  |     uint32_t b21: 1; | ||||||
|  |     uint32_t b22: 1; | ||||||
|  |     uint32_t b23: 1; | ||||||
|  |     uint32_t b24: 1; | ||||||
|  |     uint32_t b25: 1; | ||||||
|  |     uint32_t b26: 1; | ||||||
|  |     uint32_t b27: 1; | ||||||
|  |     uint32_t b28: 1; | ||||||
|  |     uint32_t b29: 1; | ||||||
|  |     uint32_t b30: 1; | ||||||
|  |     uint32_t b31: 1; | ||||||
|  | };//RUBUS_REGISTER_32_BIT_FIELD
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS_REGISTER_16_BYTE_FIELD | ||||||
|  | { | ||||||
|  |     uint16_t bt0 :8; | ||||||
|  |     uint16_t bt1 :8; | ||||||
|  | };//RUBUS_REGISTER_16_BYTE_FIELD
 | ||||||
|  | 
 | ||||||
|  | union RUBUS_REGISTER_16 | ||||||
|  | { | ||||||
|  |     uint16_t            all; | ||||||
|  |     RUBUS_REGISTER_16_BIT_FIELD  bit; | ||||||
|  |     RUBUS_REGISTER_16_BYTE_FIELD byte; | ||||||
|  |     RUBUS_REGISTER_16(uint16_t val): | ||||||
|  |         all(val) | ||||||
|  |     {} | ||||||
|  | };//RUBUS_REGISTER_16
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS_REGISTER_32_BYTE_FIELD | ||||||
|  | { | ||||||
|  |     uint16_t bt0 :8; | ||||||
|  |     uint16_t bt1 :8; | ||||||
|  |     uint16_t bt2 :8; | ||||||
|  |     uint16_t bt3 :8; | ||||||
|  | };//RUBUS_REGISTER_32_BYTE_FIELD
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | union RUBUS_REGISTER_16_WORD | ||||||
|  | { | ||||||
|  |     uint16_t            all; | ||||||
|  |     RUBUS_REGISTER_16_BIT_FIELD  bit; | ||||||
|  |     RUBUS_REGISTER_16_BYTE_FIELD byte; | ||||||
|  | };//RUBUS_REGISTER_16_WORD
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RUBUS_REGISTER_32_WORD_FIELD | ||||||
|  | { | ||||||
|  |     RUBUS_REGISTER_16_WORD wL; | ||||||
|  |     RUBUS_REGISTER_16_WORD wH; | ||||||
|  | };//RUBUS_REGISTER_32_WORD_FIELD
 | ||||||
|  | 
 | ||||||
|  | union RUBUS_REGISTER_32 | ||||||
|  | { | ||||||
|  |     uint32_t    all; | ||||||
|  |     bool        b; | ||||||
|  |     float       f; | ||||||
|  |     uint8_t     u8; | ||||||
|  |     uint16_t    u16; | ||||||
|  |     uint32_t    u32; | ||||||
|  |     int8_t      i8; | ||||||
|  |     int16_t     i16; | ||||||
|  |     int32_t     i32; | ||||||
|  |     RUBUS_REGISTER_16_BIT_FIELD bit16; | ||||||
|  |     RUBUS_REGISTER_32_BIT_FIELD bit32; | ||||||
|  |     RUBUS_REGISTER_32_WORD_FIELD word; | ||||||
|  |     RUBUS_REGISTER_32_BYTE_FIELD byte; | ||||||
|  |     RUBUS_REGISTER_32(): | ||||||
|  |         all((uint32_t)0) | ||||||
|  |     {}; | ||||||
|  |     RUBUS_REGISTER_32(uint32_t val): | ||||||
|  |         all(val) | ||||||
|  |     {} | ||||||
|  | };//RUBUS_REGISTER_32
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } /* namespace MODBUSRTU */ | ||||||
|  | 
 | ||||||
|  | #endif /* MODBUSRTU_RUBUSTYPES_H_ */ | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | /*
 | ||||||
|  |  * ALERTHeaders.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef ALERT_ALERTHEADERS_H_ | ||||||
|  | #define ALERT_ALERTHEADERS_H_ | ||||||
|  | 
 | ||||||
|  | #include "Alert/AlertBase.h" | ||||||
|  | #include "Alert/FaultDecrease.h" | ||||||
|  | #include "Alert/FaultExceed.h" | ||||||
|  | #include "Alert/WarningDecrease.h" | ||||||
|  | #include "Alert/WarningExceed.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif /* ALERT_ALERTHEADERS_H_ */ | ||||||
| @ -0,0 +1,32 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmBase.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmBase::AlgorithmBase(): | ||||||
|  |         m_voltage_a(FP_ZERO), | ||||||
|  |         m_voltage_b(FP_ZERO), | ||||||
|  |         m_voltage_c(FP_ZERO) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmBase::get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c) | ||||||
|  | { | ||||||
|  |     volt_a = m_voltage_a; | ||||||
|  |     volt_b = m_voltage_b; | ||||||
|  |     volt_c = m_voltage_c; | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmBase::_execute_undef(){} | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmBase.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/SystemEnvironment.h" | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITHMBASE_H_ | ||||||
|  | #define SYSCTRL_ALGORITHMBASE_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class AlgorithmBase | ||||||
|  | { | ||||||
|  | protected: | ||||||
|  |     float m_voltage_a; | ||||||
|  |     float m_voltage_b; | ||||||
|  |     float m_voltage_c; | ||||||
|  | public: | ||||||
|  |     AlgorithmBase(); | ||||||
|  | public: | ||||||
|  |     virtual void setup() = 0; | ||||||
|  | public: | ||||||
|  |     virtual void reset() = 0; | ||||||
|  | public: | ||||||
|  |     void get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c); | ||||||
|  | public: | ||||||
|  |     virtual void execute() = 0; | ||||||
|  | protected: | ||||||
|  |     void _execute_undef(); | ||||||
|  |     virtual void _execute_run() = 0; | ||||||
|  |     //
 | ||||||
|  | };//AlgorithmBase
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITHMBASE_H_ */ | ||||||
| @ -0,0 +1,701 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmContext.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmContext.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmContext::AlgorithmContext(SYSCTRL::SystemEnvironment&  env): | ||||||
|  |         m_mode(SYSCTRL::AlgorithmContext::UNDEFINED), | ||||||
|  |         m_algorithm(SYSCTRL::AlgorithmContext::UNKNOWN), | ||||||
|  |         m_algorithm_previous(SYSCTRL::AlgorithmContext::UNKNOWN), | ||||||
|  |         m_env(env), | ||||||
|  |         m_algorithm_pointer(&m_off), | ||||||
|  |         m_fault(env), | ||||||
|  |         m_work(env), | ||||||
|  |         m_stop(env), | ||||||
|  |         m_start(env), | ||||||
|  |         m_off(env), | ||||||
|  |         m_source(env), | ||||||
|  |         _strategy(&SYSCTRL::AlgorithmContext::_strategy_undef), | ||||||
|  |         _set_fault(&SYSCTRL::AlgorithmContext::_set_empty_exe), | ||||||
|  |         _set_work(&SYSCTRL::AlgorithmContext::_set_empty_exe), | ||||||
|  |         _set_stop(&SYSCTRL::AlgorithmContext::_set_empty_exe), | ||||||
|  |         _set_start(&SYSCTRL::AlgorithmContext::_set_empty_exe), | ||||||
|  |         _set_off(&SYSCTRL::AlgorithmContext::_set_empty_exe), | ||||||
|  |         _set_source(&SYSCTRL::AlgorithmContext::_set_empty_exe) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void AlgorithmContext::setup() | ||||||
|  | { | ||||||
|  |     static bool status = true; | ||||||
|  |     if(m_mode == SYSCTRL::AlgorithmContext::UNDEFINED) | ||||||
|  |     { | ||||||
|  | 
 | ||||||
|  |         m_algorithm = SYSCTRL::AlgorithmContext::UNKNOWN; | ||||||
|  |         m_algorithm_previous = SYSCTRL::AlgorithmContext::UNKNOWN; | ||||||
|  | 
 | ||||||
|  |         m_fault.setup(); | ||||||
|  |         m_work.setup(); | ||||||
|  |         m_stop.setup(); | ||||||
|  |         m_start.setup(); | ||||||
|  |         m_off.setup(); | ||||||
|  |         m_source.setup(); | ||||||
|  | 
 | ||||||
|  |         _strategy = &SYSCTRL::AlgorithmContext::_strategy_undef; | ||||||
|  |         _set_fault = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |         _set_work = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |         _set_stop = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |         _set_start = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |         _set_off = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |         _set_source = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  | 
 | ||||||
|  |         if(status) | ||||||
|  |         { | ||||||
|  |             m_mode = SYSCTRL::AlgorithmContext::CONFIGURATE; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmContext::configure() | ||||||
|  | { | ||||||
|  |     static bool status = true; | ||||||
|  |     if(m_mode == SYSCTRL::AlgorithmContext::CONFIGURATE) | ||||||
|  |     { | ||||||
|  | 
 | ||||||
|  |         _strategy = &SYSCTRL::AlgorithmContext::_strategy_off; | ||||||
|  |         _set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe; | ||||||
|  |         _set_work = &SYSCTRL::AlgorithmContext::_set_work_exe; | ||||||
|  |         _set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe; | ||||||
|  |         _set_start = &SYSCTRL::AlgorithmContext::_set_start_exe; | ||||||
|  |         _set_off = &SYSCTRL::AlgorithmContext::_set_off_exe; | ||||||
|  |         _set_source = &SYSCTRL::AlgorithmContext::_set_source_exe; | ||||||
|  | 
 | ||||||
|  |         if(status) | ||||||
|  |         { | ||||||
|  |             m_algorithm = SYSCTRL::AlgorithmContext::OFF; | ||||||
|  |             m_algorithm_previous = SYSCTRL::AlgorithmContext::OFF; | ||||||
|  | 
 | ||||||
|  |             m_mode = SYSCTRL::AlgorithmContext::OPERATIONAL; | ||||||
|  |             set_strategy_off(); | ||||||
|  |             set_off(); | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | SYSCTRL::AlgorithmContext::mode_t AlgorithmContext::get_mode() | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | SYSCTRL::AlgorithmContext::algorithm_t AlgorithmContext::get_algorithm() | ||||||
|  | { | ||||||
|  |     return m_algorithm; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool AlgorithmContext::compare(const SYSCTRL::AlgorithmContext::mode_t mode) | ||||||
|  | { | ||||||
|  |     return mode == m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool AlgorithmContext::compare_algorithm(const SYSCTRL::AlgorithmContext::algorithm_t algorithm) | ||||||
|  | { | ||||||
|  |     return algorithm == m_algorithm; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c) | ||||||
|  | { | ||||||
|  |     m_algorithm_pointer->get_ref_invertor_voltage(volt_a, volt_b, volt_c); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::strategy() | ||||||
|  | { | ||||||
|  |     (this->*_strategy)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmContext::_strategy_undef() | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_strategy_fault() | ||||||
|  | { | ||||||
|  |     if((!m_env.system_fault.boolbit.b0)&&(m_env.system_reset.boolbit.b0)) | ||||||
|  |     { | ||||||
|  |         set_strategy_off(); | ||||||
|  |         set_off(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_strategy_work() | ||||||
|  | { | ||||||
|  |     if(m_env.system_fault.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |         set_strategy_fault(); | ||||||
|  |         set_fault(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         //
 | ||||||
|  |         if(!m_env.enable_work.boolbit.b0) | ||||||
|  |         { | ||||||
|  |             m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |             set_strategy_off(); | ||||||
|  |             set_off(); | ||||||
|  |             //
 | ||||||
|  |         }else{ | ||||||
|  | 
 | ||||||
|  |             if((m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) | | ||||||
|  |                ((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on))) | ||||||
|  |                 { | ||||||
|  |                     //m_env.reference_intensity_voltage_load_direct.set_output(m_env.voltage_load_active);
 | ||||||
|  |                     //m_env.reference_intensity_voltage_load_quadrature.set_output(m_env.voltage_load_reactive);
 | ||||||
|  | 
 | ||||||
|  |                     set_strategy_stop(); | ||||||
|  |                     set_stop(); | ||||||
|  |                     //
 | ||||||
|  |                   }//if
 | ||||||
|  |         } | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_strategy_stop() | ||||||
|  | { | ||||||
|  |     if(m_env.system_fault.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |         set_strategy_fault(); | ||||||
|  |         set_fault(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if(!m_env.enable_work.boolbit.b0 | | ||||||
|  |            //(m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
 | ||||||
|  |            //(m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on)
 | ||||||
|  |            m_env.auxiliary_km2.state.signal.is_on | ||||||
|  |            ) | ||||||
|  |         { | ||||||
|  |             m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |             set_strategy_off(); | ||||||
|  |             set_off(); | ||||||
|  |             //
 | ||||||
|  |         } | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_strategy_start() | ||||||
|  | { | ||||||
|  |     if(m_env.system_fault.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |         set_strategy_fault(); | ||||||
|  |         set_fault(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if(!m_env.enable_work.boolbit.b0) | ||||||
|  |         { | ||||||
|  |             m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |             set_strategy_off(); | ||||||
|  |             set_off(); | ||||||
|  |             //
 | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  |             if((m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) | | ||||||
|  |                ((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on)) | ||||||
|  |                ) | ||||||
|  |             { | ||||||
|  |                 m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |                 set_strategy_off(); | ||||||
|  |                 set_off(); | ||||||
|  |                 //
 | ||||||
|  |             }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             if(m_env.auxiliary_km2.state.signal.is_off) | ||||||
|  |             { | ||||||
|  |                 //m_env.regulator_voltage_load_a.set_output(m_env.reference.start.voltage_a);
 | ||||||
|  |                 //m_env.regulator_voltage_load_b.set_output(m_env.reference.start.voltage_b);
 | ||||||
|  |                 //m_env.regulator_voltage_load_c.set_output(m_env.reference.start.voltage_c);
 | ||||||
|  |                 //
 | ||||||
|  |                 //m_env.current_regulator_active.reset();
 | ||||||
|  |                 //m_env.current_regulator_reactive.reset();
 | ||||||
|  |                 //
 | ||||||
|  |                 set_strategy_work(); | ||||||
|  |                 set_work(); | ||||||
|  |                 //
 | ||||||
|  |                 //set_strategy_stop();
 | ||||||
|  |                 //set_stop();
 | ||||||
|  |                 //
 | ||||||
|  |             }//if
 | ||||||
|  | 
 | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_strategy_off() | ||||||
|  | { | ||||||
|  |     if(m_env.system_fault.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         set_strategy_fault(); | ||||||
|  |         set_fault(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if(m_env.enable_work_is_on.boolbit.b0) | ||||||
|  |         { | ||||||
|  |             set_strategy_start(); | ||||||
|  |             set_start(); | ||||||
|  |             //
 | ||||||
|  |             //set_strategy_source();
 | ||||||
|  |             //set_source();
 | ||||||
|  |             //
 | ||||||
|  |             //set_strategy_stop();
 | ||||||
|  |             //set_stop();
 | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_strategy_source() | ||||||
|  | { | ||||||
|  |     if(m_env.system_fault.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |         set_strategy_fault(); | ||||||
|  |         set_fault(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         //
 | ||||||
|  |         if((!m_env.enable_work.boolbit.b0) | | ||||||
|  |            (m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) | | ||||||
|  |            ((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on)) | ||||||
|  |           ) | ||||||
|  |         { | ||||||
|  |             m_env.enable_work_reset.boolbit.b0 = true; | ||||||
|  |             set_strategy_off(); | ||||||
|  |             set_off(); | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_strategy_fault() | ||||||
|  | { | ||||||
|  |     _strategy = &SYSCTRL::AlgorithmContext::_strategy_fault; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_strategy_work() | ||||||
|  | { | ||||||
|  |     _strategy = &SYSCTRL::AlgorithmContext::_strategy_work; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_strategy_stop() | ||||||
|  | { | ||||||
|  |     _strategy = &SYSCTRL::AlgorithmContext::_strategy_stop; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_strategy_start() | ||||||
|  | { | ||||||
|  |     _strategy = &SYSCTRL::AlgorithmContext::_strategy_start; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_strategy_off() | ||||||
|  | { | ||||||
|  |     _strategy = &SYSCTRL::AlgorithmContext::_strategy_off; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_strategy_source() | ||||||
|  | { | ||||||
|  |     _strategy = &SYSCTRL::AlgorithmContext::_strategy_source; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_fault() | ||||||
|  | { | ||||||
|  |     (this->*_set_fault)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_work() | ||||||
|  | { | ||||||
|  |     (this->*_set_work)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_stop() | ||||||
|  | { | ||||||
|  |     (this->*_set_stop)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_start() | ||||||
|  | { | ||||||
|  |     (this->*_set_start)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_off() | ||||||
|  | { | ||||||
|  |     (this->*_set_off)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::set_source() | ||||||
|  | { | ||||||
|  |     (this->*_set_source)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::execute() | ||||||
|  | { | ||||||
|  |     m_algorithm_pointer->execute(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_set_fault_exe() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_previous = m_algorithm; | ||||||
|  |     m_algorithm = SYSCTRL::AlgorithmContext::FAULT; | ||||||
|  |     //
 | ||||||
|  |     _set_fault = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |     _set_work = &SYSCTRL::AlgorithmContext::_set_work_exe; | ||||||
|  |     _set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe; | ||||||
|  |     _set_start = &SYSCTRL::AlgorithmContext::_set_start_exe; | ||||||
|  |     _set_off = &SYSCTRL::AlgorithmContext::_set_off_exe; | ||||||
|  |     _set_source = &SYSCTRL::AlgorithmContext::_set_source_exe; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.reset(); | ||||||
|  |     m_env.timer_stop.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_pointer = &m_fault; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_set_work_exe() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_previous = m_algorithm; | ||||||
|  |     m_algorithm = SYSCTRL::AlgorithmContext::WORK; | ||||||
|  |     //
 | ||||||
|  |     _set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe; | ||||||
|  |     _set_work = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |     _set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe; | ||||||
|  |     _set_start = &SYSCTRL::AlgorithmContext::_set_start_exe; | ||||||
|  |     _set_off = &SYSCTRL::AlgorithmContext::_set_off_exe; | ||||||
|  |     _set_source = &SYSCTRL::AlgorithmContext::_set_source_exe; | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_voltage_load_direct.reset(); | ||||||
|  |     m_env.regulator_voltage_load_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.integrator_direct.reset(); | ||||||
|  |     m_env.integrator_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_current_limit.set_to_low_saturation(); | ||||||
|  |     m_env.regulator_current_pfc.reset(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_dc_a.reset(); | ||||||
|  |     m_env.regulator_dc_b.reset(); | ||||||
|  |     m_env.regulator_dc_c.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_current_limit_a.set_to_high_saturation(); | ||||||
|  |     m_env.regulator_current_pfc_a.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_current_limit_b.set_to_high_saturation(); | ||||||
|  |     m_env.regulator_current_pfc_b.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_current_limit_c.set_to_high_saturation(); | ||||||
|  |     m_env.regulator_current_pfc_c.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_voltage_load_a_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_a_reactive.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_voltage_load_b_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_b_reactive.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_voltage_load_c_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_c_reactive.reset(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  | 
 | ||||||
|  |     m_env.drc_positive_voltage_controller_direct.reset(); | ||||||
|  |     m_env.drc_positive_voltage_controller_quadrature.reset(); | ||||||
|  |     m_env.drc_negative_voltage_controller_direct.reset(); | ||||||
|  |     m_env.drc_negative_voltage_controller_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_regulator_current_limit.set_to_low_saturation(); | ||||||
|  |     m_env.drc_regulator_current_pfc.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_voltage_grid_direct); | ||||||
|  |     m_work.reset_switcher(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.reset(); | ||||||
|  |     m_env.timer_stop.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_pointer = &m_work; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_set_stop_exe() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_previous = m_algorithm; | ||||||
|  |     m_algorithm = SYSCTRL::AlgorithmContext::STOP; | ||||||
|  |     //
 | ||||||
|  |     _set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe; | ||||||
|  |     _set_work = &SYSCTRL::AlgorithmContext::_set_work_exe; | ||||||
|  |     _set_stop = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |     _set_start = &SYSCTRL::AlgorithmContext::_set_start_exe; | ||||||
|  |     _set_off = &SYSCTRL::AlgorithmContext::_set_off_exe; | ||||||
|  |     _set_source = &SYSCTRL::AlgorithmContext::_set_source_exe; | ||||||
|  |     //
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  |     m_env.reference_voltage_direct_intensity.set_output(m_env.regulator_current_limit.get_output()); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  |     //m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_voltage_grid_direct);
 | ||||||
|  |     m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_regulator_current_limit.get_output()); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  |     /* FOR DEBUG ONLY!!!! */ | ||||||
|  |     /*
 | ||||||
|  |     m_env.regulator_voltage_load_a_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_a_reactive.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_voltage_load_b_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_b_reactive.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_voltage_load_c_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_c_reactive.reset(); | ||||||
|  |     */ | ||||||
|  | 
 | ||||||
|  |     /* FOR DEBUG ONLY!!!! */ | ||||||
|  |     /* VECTOR CONTROL */ | ||||||
|  |     /*
 | ||||||
|  |     m_env.regulator_voltage_load_direct.reset(); | ||||||
|  |     m_env.regulator_voltage_load_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.integrator_direct.reset(); | ||||||
|  |     m_env.integrator_quadrature.reset(); | ||||||
|  |     */ | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.reset(); | ||||||
|  |     m_env.timer_stop.start(); | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_pointer = &m_stop; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_set_start_exe() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_previous = m_algorithm; | ||||||
|  |     m_algorithm = SYSCTRL::AlgorithmContext::START; | ||||||
|  |     //
 | ||||||
|  |     _set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe; | ||||||
|  |     _set_work = &SYSCTRL::AlgorithmContext::_set_work_exe; | ||||||
|  |     _set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe; | ||||||
|  |     _set_start = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |     _set_off = &SYSCTRL::AlgorithmContext::_set_off_exe; | ||||||
|  |     _set_source = &SYSCTRL::AlgorithmContext::_set_source_exe; | ||||||
|  |     //
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_current_load_direct.reset(); | ||||||
|  |     m_env.regulator_current_load_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.referencer_current_bypass_direct.reset(); | ||||||
|  |     m_env.referencer_current_bypass_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  |     //
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.current_referencer_a_active.reset(); | ||||||
|  |     m_env.current_referencer_a_reactive.reset(); | ||||||
|  |     m_env.current_referencer_b_active.reset(); | ||||||
|  |     m_env.current_referencer_b_reactive.reset(); | ||||||
|  |     m_env.current_referencer_c_active.reset(); | ||||||
|  |     m_env.current_referencer_c_reactive.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.current_regulator_a_active.reset(); | ||||||
|  |     m_env.current_regulator_a_reactive.reset(); | ||||||
|  |     m_env.current_regulator_b_active.reset(); | ||||||
|  |     m_env.current_regulator_b_reactive.reset(); | ||||||
|  |     m_env.current_regulator_c_active.reset(); | ||||||
|  |     m_env.current_regulator_c_reactive.reset(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_regulator_current_load_direct.reset(); | ||||||
|  |     m_env.drc_regulator_current_load_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_referencer_current_bypass_direct.reset(); | ||||||
|  |     m_env.drc_referencer_current_bypass_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_positive_voltage_cell_direct = FP_ZERO; | ||||||
|  |     m_env.drc_positive_voltage_cell_quadrature = FP_ZERO; | ||||||
|  |     m_env.drc_negative_voltage_cell_direct = FP_ZERO; | ||||||
|  |     m_env.drc_negative_voltage_cell_quadrature = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_positive_voltage_cell_alpha = FP_ZERO; | ||||||
|  |     m_env.drc_positive_voltage_cell_beta = FP_ZERO; | ||||||
|  |     m_env.drc_negative_voltage_cell_alpha = FP_ZERO; | ||||||
|  |     m_env.drc_negative_voltage_cell_beta = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_positive_voltage_cell_a = FP_ZERO; | ||||||
|  |     m_env.drc_positive_voltage_cell_b = FP_ZERO; | ||||||
|  |     m_env.drc_positive_voltage_cell_c = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_negative_voltage_cell_a = FP_ZERO; | ||||||
|  |     m_env.drc_negative_voltage_cell_b = FP_ZERO; | ||||||
|  |     m_env.drc_negative_voltage_cell_c = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.start(); | ||||||
|  |     m_env.timer_stop.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_pointer = &m_start; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_set_off_exe() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_previous = m_algorithm; | ||||||
|  |     m_algorithm = SYSCTRL::AlgorithmContext::OFF; | ||||||
|  |     //
 | ||||||
|  |     _set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe; | ||||||
|  |     _set_work = &SYSCTRL::AlgorithmContext::_set_work_exe; | ||||||
|  |     _set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe; | ||||||
|  |     _set_start = &SYSCTRL::AlgorithmContext::_set_start_exe; | ||||||
|  |     _set_off = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |     _set_source = &SYSCTRL::AlgorithmContext::_set_source_exe; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.reset(); | ||||||
|  |     m_env.timer_stop.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_pointer = &m_off; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmContext::_set_source_exe() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_previous = m_algorithm; | ||||||
|  |     m_algorithm = SYSCTRL::AlgorithmContext::SOURCE; | ||||||
|  |     //
 | ||||||
|  |     _set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe; | ||||||
|  |     _set_work = &SYSCTRL::AlgorithmContext::_set_work_exe; | ||||||
|  |     _set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe; | ||||||
|  |     _set_start = &SYSCTRL::AlgorithmContext::_set_start_exe; | ||||||
|  |     _set_off = &SYSCTRL::AlgorithmContext::_set_off_exe; | ||||||
|  |     _set_source = &SYSCTRL::AlgorithmContext::_set_empty_exe; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.reset(); | ||||||
|  |     m_env.timer_stop.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_algorithm_pointer = &m_source; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmContext::_set_empty_exe() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
| @ -0,0 +1,114 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmContext.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | #include "SYSCTRL/AlgorithmFault.h" | ||||||
|  | #include "SYSCTRL/AlgorithmOff.h" | ||||||
|  | #include "SYSCTRL/AlgorithmSource.h" | ||||||
|  | #include "SYSCTRL/AlgorithmStart.h" | ||||||
|  | #include "SYSCTRL/AlgorithmStop.h" | ||||||
|  | #include "SYSCTRL/AlgorithmWork.h" | ||||||
|  | #include "SYSCTRL/AlgorithmZero.h" | ||||||
|  | #include "SYSCTRL/SystemEnvironment.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITHMCONTEXT_H_ | ||||||
|  | #define SYSCTRL_ALGORITHMCONTEXT_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class AlgorithmContext | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     friend class SYSCTRL::AlgorithmBase; | ||||||
|  |     friend class SYSCTRL::AlgorithmFault; | ||||||
|  |     friend class SYSCTRL::AlgorithmWork; | ||||||
|  |     friend class SYSCTRL::AlgorithmStop; | ||||||
|  |     friend class SYSCTRL::AlgorithmStart; | ||||||
|  |     friend class SYSCTRL::AlgorithmOff; | ||||||
|  |     friend class SYSCTRL::AlgorithmSource; | ||||||
|  | public: | ||||||
|  |     enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL}; | ||||||
|  |     enum algorithm_t {UNKNOWN, OFF, START, ENTRY, WORK, STOP, FAULT, SOURCE}; | ||||||
|  | private: | ||||||
|  |     mode_t  m_mode; | ||||||
|  |     algorithm_t m_algorithm; | ||||||
|  |     algorithm_t m_algorithm_previous; | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment&  m_env; | ||||||
|  | private: | ||||||
|  |     SYSCTRL::AlgorithmBase*      m_algorithm_pointer; | ||||||
|  |     SYSCTRL::AlgorithmFault      m_fault; | ||||||
|  |     SYSCTRL::AlgorithmWork       m_work; | ||||||
|  |     SYSCTRL::AlgorithmStop       m_stop; | ||||||
|  |     SYSCTRL::AlgorithmStart      m_start; | ||||||
|  |     SYSCTRL::AlgorithmOff        m_off; | ||||||
|  |     SYSCTRL::AlgorithmSource     m_source; | ||||||
|  | public: | ||||||
|  |     AlgorithmContext(SYSCTRL::SystemEnvironment&  env); | ||||||
|  |     void setup(); | ||||||
|  |     void configure(); | ||||||
|  | public: | ||||||
|  |     mode_t get_mode(); | ||||||
|  |     algorithm_t get_algorithm(); | ||||||
|  |     bool compare(const mode_t mode); | ||||||
|  |     bool compare_algorithm(const algorithm_t algorithm); | ||||||
|  | public: | ||||||
|  |     void get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c); | ||||||
|  | public: | ||||||
|  |     void strategy(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmContext::*_strategy)(); | ||||||
|  |     void _strategy_undef(); | ||||||
|  |     void _strategy_fault(); | ||||||
|  |     void _strategy_work(); | ||||||
|  |     void _strategy_stop(); | ||||||
|  |     void _strategy_start(); | ||||||
|  |     void _strategy_off(); | ||||||
|  |     void _strategy_source(); | ||||||
|  | public: | ||||||
|  |     void set_strategy_fault(); | ||||||
|  |     void set_strategy_work(); | ||||||
|  |     void set_strategy_stop(); | ||||||
|  |     void set_strategy_start(); | ||||||
|  |     void set_strategy_off(); | ||||||
|  |     void set_strategy_source(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | public: | ||||||
|  |     void set_fault(); | ||||||
|  |     void set_work(); | ||||||
|  |     void set_stop(); | ||||||
|  |     void set_start(); | ||||||
|  |     void set_off(); | ||||||
|  |     void set_source(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmContext::*_set_fault)(); | ||||||
|  |     void (AlgorithmContext::*_set_work)(); | ||||||
|  |     void (AlgorithmContext::*_set_stop)(); | ||||||
|  |     void (AlgorithmContext::*_set_start)(); | ||||||
|  |     void (AlgorithmContext::*_set_off)(); | ||||||
|  |     void (AlgorithmContext::*_set_source)(); | ||||||
|  |     void _set_fault_exe(); | ||||||
|  |     void _set_work_exe(); | ||||||
|  |     void _set_stop_exe(); | ||||||
|  |     void _set_start_exe(); | ||||||
|  |     void _set_off_exe(); | ||||||
|  |     void _set_source_exe(); | ||||||
|  |     void _set_empty_exe(); | ||||||
|  |     //
 | ||||||
|  | };//class AlgorithmContext
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITHMCONTEXT_H_ */ | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmFault.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmFault.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmFault::AlgorithmFault(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         SYSCTRL::AlgorithmBase(), | ||||||
|  |         m_env(env), | ||||||
|  |         _execute(&SYSCTRL::AlgorithmFault::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmFault::setup() | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::AlgorithmFault::_execute_run; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmFault::reset() | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmFault::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmFault::_execute_run() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a = FP_ZERO; | ||||||
|  |     m_voltage_b = FP_ZERO; | ||||||
|  |     m_voltage_c = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmFault.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITHMFAULT_H_ | ||||||
|  | #define SYSCTRL_ALGORITHMFAULT_H_ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AlgorithmFault: public AlgorithmBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | public: | ||||||
|  |     AlgorithmFault(SYSCTRL::SystemEnvironment& env); | ||||||
|  | public: | ||||||
|  |     void setup(); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmFault::*_execute)(); | ||||||
|  |     void _execute_run(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITHMFAULT_H_ */ | ||||||
| @ -0,0 +1,78 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgoritmOff.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmOff.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmOff::AlgorithmOff(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         SYSCTRL::AlgorithmBase(), | ||||||
|  |         m_env(env), | ||||||
|  |         _execute(&SYSCTRL::AlgorithmOff::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmOff::setup() | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::AlgorithmOff::_execute_run; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmOff::reset() | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmOff::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmOff::_execute_run() | ||||||
|  | { | ||||||
|  |     static bool _high_level = true; | ||||||
|  |     _high_level = true; | ||||||
|  | 
 | ||||||
|  |     if(m_env.system_reset.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         m_env.hardware.ref_control_order = ORDER_RESET; | ||||||
|  |         //
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  | 
 | ||||||
|  |         for(Uint16 cellnum = 0; cellnum < m_env.hardware.level; cellnum++) | ||||||
|  |         { | ||||||
|  |             _high_level &= m_env.hardware.hvcell.dc_voltage[0][cellnum] > m_env.hardware.dc_voltage_low_level ? true : false; | ||||||
|  |             _high_level &= m_env.hardware.hvcell.dc_voltage[1][cellnum] > m_env.hardware.dc_voltage_low_level ? true : false; | ||||||
|  |             _high_level &= m_env.hardware.hvcell.dc_voltage[2][cellnum] > m_env.hardware.dc_voltage_low_level ? true : false; | ||||||
|  |             //
 | ||||||
|  |         }//for
 | ||||||
|  |         //
 | ||||||
|  |         if(!_high_level & m_env.hardware.low_level()) | ||||||
|  |         { | ||||||
|  |             m_env.hardware.ref_control_order = ORDER_RESET; | ||||||
|  |             m_env.hardware.fault_low_level = false; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |         } | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a = FP_ZERO; | ||||||
|  |     m_voltage_b = FP_ZERO; | ||||||
|  |     m_voltage_c = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgoritmOff.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITMSTOPPED_H_ | ||||||
|  | #define SYSCTRL_ALGORITMSTOPPED_H_ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AlgorithmOff: public AlgorithmBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | public: | ||||||
|  |     AlgorithmOff(SYSCTRL::SystemEnvironment& env); | ||||||
|  | public: | ||||||
|  |     void setup(); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmOff::*_execute)(); | ||||||
|  |     void _execute_run(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITMSTOPPED_H_ */ | ||||||
| @ -0,0 +1,73 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmSource.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmSource.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmSource::AlgorithmSource(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         AlgorithmBase(), | ||||||
|  |         m_env(env), | ||||||
|  |         m_voltage_direct(FP_ZERO), | ||||||
|  |         m_voltage_quadrature(FP_ZERO), | ||||||
|  |         m_voltage_alpha(FP_ZERO), | ||||||
|  |         m_voltage_beta(FP_ZERO), | ||||||
|  |         m_voltage_a_gen(FP_ZERO), | ||||||
|  |         m_voltage_b_gen(FP_ZERO), | ||||||
|  |         m_voltage_c_gen(FP_ZERO), | ||||||
|  |         m_voltage_a_relative(FP_ZERO), | ||||||
|  |         m_voltage_b_relative(FP_ZERO), | ||||||
|  |         m_voltage_c_relative(FP_ZERO), | ||||||
|  |         m_ort_alpha(FP_ZERO), | ||||||
|  |         m_ort_beta(FP_ZERO), | ||||||
|  |         _execute(&SYSCTRL::AlgorithmSource::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmSource::setup() | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::AlgorithmSource::_execute_run; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmSource::reset() | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmSource::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmSource::_execute_run() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  | 
 | ||||||
|  |     m_voltage_direct = m_env.algorithm_source_references.voltage * cosf(m_env.algorithm_source_references.phase_shift); | ||||||
|  |     m_voltage_quadrature = m_env.algorithm_source_references.voltage * sinf(m_env.algorithm_source_references.phase_shift); | ||||||
|  |     //
 | ||||||
|  |     m_ort_alpha = m_env.main_ab_orts.active; | ||||||
|  |     m_ort_beta = m_env.main_ab_orts.reactive; | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::park_inverse(m_ort_alpha, m_ort_beta, m_voltage_direct, m_voltage_quadrature, m_voltage_alpha, m_voltage_beta); | ||||||
|  |     FLTSYSLIB::Transformation::clarke_inverse(m_voltage_alpha, m_voltage_beta, m_voltage_a_gen, m_voltage_b_gen, m_voltage_c_gen); | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a_relative = m_voltage_a_gen * m_env.cell_dc_voltage_a_reciprocal; | ||||||
|  |     m_voltage_b_relative = m_voltage_b_gen * m_env.cell_dc_voltage_b_reciprocal; | ||||||
|  |     m_voltage_c_relative = m_voltage_c_gen * m_env.cell_dc_voltage_c_reciprocal; | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a = m_voltage_a_relative; | ||||||
|  |     m_voltage_b = m_voltage_b_relative; | ||||||
|  |     m_voltage_c = m_voltage_c_relative; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,54 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmSource.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGIRITHMSOURCE_H_ | ||||||
|  | #define SYSCTRL_ALGIRITHMSOURCE_H_ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class AlgorithmSource: public AlgorithmBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | private: | ||||||
|  |     float m_voltage_direct; | ||||||
|  |     float m_voltage_quadrature; | ||||||
|  |     float m_voltage_alpha; | ||||||
|  |     float m_voltage_beta; | ||||||
|  |     float m_voltage_a_gen; | ||||||
|  |     float m_voltage_b_gen; | ||||||
|  |     float m_voltage_c_gen; | ||||||
|  |     float m_voltage_a_relative; | ||||||
|  |     float m_voltage_b_relative; | ||||||
|  |     float m_voltage_c_relative; | ||||||
|  |     float m_ort_alpha; | ||||||
|  |     float m_ort_beta; | ||||||
|  | public: | ||||||
|  |     AlgorithmSource(SYSCTRL::SystemEnvironment& env); | ||||||
|  | public: | ||||||
|  |     void setup(); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmSource::*_execute)(); | ||||||
|  |     void _execute_run(); | ||||||
|  |     //
 | ||||||
|  | };//class AlgirithmSource
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGIRITHMSOURCE_H_ */ | ||||||
| @ -0,0 +1,291 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgoritmStart.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmStart.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmStart::AlgorithmStart(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         SYSCTRL::AlgorithmBase(), | ||||||
|  |         m_env(env), | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  |         m_reference_zero(FP_ZERO), | ||||||
|  |         m_reference_current_cell_direct(FP_ZERO), | ||||||
|  |         m_reference_current_cell_quadrature(FP_ZERO), | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  |         m_reference_zero(FP_ZERO), | ||||||
|  |         m_reference_current_cell_direct(FP_ZERO), | ||||||
|  |         m_reference_current_cell_quadrature(FP_ZERO), | ||||||
|  | #endif | ||||||
|  |         _execute(&SYSCTRL::AlgorithmStart::_execute_undef) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmStart::setup() | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::AlgorithmStart::_execute_run; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStart::reset() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_current_load_direct.reset(); | ||||||
|  |     m_env.regulator_current_load_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.referencer_current_bypass_direct.reset(); | ||||||
|  |     m_env.referencer_current_bypass_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  |     m_env.current_referencer_a_active.reset(); | ||||||
|  |     m_env.current_referencer_a_reactive.reset(); | ||||||
|  |     m_env.current_referencer_b_active.reset(); | ||||||
|  |     m_env.current_referencer_b_reactive.reset(); | ||||||
|  |     m_env.current_referencer_c_active.reset(); | ||||||
|  |     m_env.current_referencer_c_reactive.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.current_regulator_a_active.reset(); | ||||||
|  |     m_env.current_regulator_a_reactive.reset(); | ||||||
|  |     m_env.current_regulator_b_active.reset(); | ||||||
|  |     m_env.current_regulator_b_reactive.reset(); | ||||||
|  |     m_env.current_regulator_c_active.reset(); | ||||||
|  |     m_env.current_regulator_c_reactive.reset(); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_regulator_current_load_direct.reset(); | ||||||
|  |     m_env.drc_regulator_current_load_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_referencer_current_bypass_direct.reset(); | ||||||
|  |     m_env.drc_referencer_current_bypass_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     m_voltage_a = FP_ZERO; | ||||||
|  |     m_voltage_b = FP_ZERO; | ||||||
|  |     m_voltage_c = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStart::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStart::_execute_run() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.execute(); | ||||||
|  |     //
 | ||||||
|  |     m_reference_current_cell_direct = m_env.referencer_current_bypass_direct.execute(m_reference_zero, m_env.current_bypass_direct); | ||||||
|  |     m_reference_current_cell_quadrature = m_env.referencer_current_bypass_quadrature.execute(m_reference_zero, m_env.current_bypass_quadrature); | ||||||
|  |     //
 | ||||||
|  |     m_env.voltage_cell_direct = m_env.regulator_current_load_direct.execute(m_env.current_cell_direct, m_reference_current_cell_direct); | ||||||
|  |     m_env.voltage_cell_quadrature = m_env.regulator_current_load_quadrature.execute(m_env.current_cell_quadrature, m_reference_current_cell_quadrature); | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, | ||||||
|  |                                             m_env.main_ab_orts.reactive, | ||||||
|  |                                             m_env.voltage_cell_direct, | ||||||
|  |                                             m_env.voltage_cell_quadrature, | ||||||
|  |                                             m_env.voltage_cell_alpha, | ||||||
|  |                                             m_env.voltage_cell_beta); | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::clarke_inverse(m_env.voltage_cell_alpha, | ||||||
|  |                                               m_env.voltage_cell_beta, | ||||||
|  |                                               m_env.voltage_cell_a, | ||||||
|  |                                               m_env.voltage_cell_b, | ||||||
|  |                                               m_env.voltage_cell_c); | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a = m_env.voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; | ||||||
|  |     m_voltage_b = m_env.voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; | ||||||
|  |     m_voltage_c = m_env.voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStart::_execute_run() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.execute(); | ||||||
|  | 
 | ||||||
|  |     //**** Phase A ***
 | ||||||
|  |     //-reference constructor
 | ||||||
|  |     //m_env.start_control.phase_a.reference.current_bypass_active = FP_ZERO;
 | ||||||
|  |     //m_env.start_control.phase_a.reference.current_bypass_reactive = FP_ZERO;
 | ||||||
|  |     //
 | ||||||
|  |     m_env.start_control.phase_a.reference.current_bypass_active = m_env.start_control.common_ref.active; | ||||||
|  |     m_env.start_control.phase_a.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive; | ||||||
|  |     //
 | ||||||
|  |     //m_env.start_control.phase_a.test_ref = m_env.start_control.common_ref;
 | ||||||
|  | 
 | ||||||
|  |     //-feedback constructor
 | ||||||
|  |     m_env.start_control.phase_a.feedback.current_bypass_active = m_env.projection_current_bypass_a.active; | ||||||
|  |     m_env.start_control.phase_a.feedback.current_bypass_reactive = m_env.projection_current_bypass_a.reactive; | ||||||
|  |     //
 | ||||||
|  |     m_env.start_control.phase_a.feedback.current_cell_active = m_env.projection_current_cell_a.active; | ||||||
|  |     m_env.start_control.phase_a.feedback.current_cell_reactive = m_env.projection_current_cell_a.reactive; | ||||||
|  |     //
 | ||||||
|  |     //-control
 | ||||||
|  |     _execute_single_phase(m_env.start_control.phase_a, | ||||||
|  |                           m_env.main_abc_orts.phase_a, | ||||||
|  |                           m_env.cell_dc_voltage_a_reciprocal, | ||||||
|  |                           m_env.current_referencer_a_active, | ||||||
|  |                           m_env.current_referencer_a_reactive, | ||||||
|  |                           m_env.current_regulator_a_active, | ||||||
|  |                           m_env.current_regulator_a_reactive); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  |     //**** Phase B ***
 | ||||||
|  |     //-reference constructor
 | ||||||
|  |     //m_env.start_control.phase_b.reference.current_bypass_active = FP_ZERO;
 | ||||||
|  |     //m_env.start_control.phase_b.reference.current_bypass_reactive = FP_ZERO;
 | ||||||
|  |     //
 | ||||||
|  |     m_env.start_control.phase_b.reference.current_bypass_active = m_env.start_control.common_ref.active; | ||||||
|  |     m_env.start_control.phase_b.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive; | ||||||
|  |     //
 | ||||||
|  |     //m_env.start_control.phase_b.test_ref = m_env.start_control.common_ref;
 | ||||||
|  | 
 | ||||||
|  |     //-feedback constructor
 | ||||||
|  |     m_env.start_control.phase_b.feedback.current_bypass_active = m_env.projection_current_bypass_b.active; | ||||||
|  |     m_env.start_control.phase_b.feedback.current_bypass_reactive = m_env.projection_current_bypass_b.reactive; | ||||||
|  |     //
 | ||||||
|  |     m_env.start_control.phase_b.feedback.current_cell_active = m_env.projection_current_cell_b.active; | ||||||
|  |     m_env.start_control.phase_b.feedback.current_cell_reactive = m_env.projection_current_cell_b.reactive; | ||||||
|  |     //
 | ||||||
|  |     //-control
 | ||||||
|  |     _execute_single_phase(m_env.start_control.phase_b, | ||||||
|  |                           m_env.main_abc_orts.phase_b, | ||||||
|  |                           m_env.cell_dc_voltage_b_reciprocal, | ||||||
|  |                           m_env.current_referencer_b_active, | ||||||
|  |                           m_env.current_referencer_b_reactive, | ||||||
|  |                           m_env.current_regulator_b_active, | ||||||
|  |                           m_env.current_regulator_b_reactive); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //**** Phase C ***
 | ||||||
|  |     //-reference constructor
 | ||||||
|  |     //m_env.start_control.phase_c.reference.current_bypass_active = FP_ZERO;
 | ||||||
|  |     //m_env.start_control.phase_c.reference.current_bypass_reactive = FP_ZERO;
 | ||||||
|  |     //
 | ||||||
|  |     m_env.start_control.phase_c.reference.current_bypass_active = m_env.start_control.common_ref.active; | ||||||
|  |     m_env.start_control.phase_c.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive; | ||||||
|  |     //
 | ||||||
|  |     //m_env.start_control.phase_c.test_ref = m_env.start_control.common_ref;
 | ||||||
|  | 
 | ||||||
|  |     //-feedback constructor
 | ||||||
|  |     m_env.start_control.phase_c.feedback.current_bypass_active = m_env.projection_current_bypass_c.active; | ||||||
|  |     m_env.start_control.phase_c.feedback.current_bypass_reactive = m_env.projection_current_bypass_c.reactive; | ||||||
|  |     //
 | ||||||
|  |     m_env.start_control.phase_c.feedback.current_cell_active = m_env.projection_current_cell_c.active; | ||||||
|  |     m_env.start_control.phase_c.feedback.current_cell_reactive = m_env.projection_current_cell_c.reactive; | ||||||
|  |     //
 | ||||||
|  |     //-control
 | ||||||
|  |     _execute_single_phase(m_env.start_control.phase_c, | ||||||
|  |                           m_env.main_abc_orts.phase_c, | ||||||
|  |                           m_env.cell_dc_voltage_c_reciprocal, | ||||||
|  |                           m_env.current_referencer_c_active, | ||||||
|  |                           m_env.current_referencer_c_reactive, | ||||||
|  |                           m_env.current_regulator_c_active, | ||||||
|  |                           m_env.current_regulator_c_reactive); | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  |     m_voltage_a = m_env.start_control.phase_a.reference.voltage_cell_relative; | ||||||
|  |     m_voltage_b = m_env.start_control.phase_b.reference.voltage_cell_relative; | ||||||
|  |     m_voltage_c = m_env.start_control.phase_c.reference.voltage_cell_relative; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | //
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void AlgorithmStart::_execute_single_phase(SYSCTRL::AlgorithmStartSinglePhaseControl& phase, | ||||||
|  |                                                   SYSCTRL::VectorOrthogonalProjection& orts, | ||||||
|  |                                                   float dc_voltage_reciprocal, | ||||||
|  |                                                   FLTSYSLIB::PIController& referencer_active, | ||||||
|  |                                                   FLTSYSLIB::PIController& referencer_reactive, | ||||||
|  |                                                   FLTSYSLIB::PIController& regulator_active, | ||||||
|  |                                                   FLTSYSLIB::PIController& regulator_reactive) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     phase.reference.current_cell_active = referencer_active.execute(phase.reference.current_bypass_active, phase.feedback.current_bypass_active); | ||||||
|  |     phase.reference.current_cell_reactive = referencer_reactive.execute(phase.reference.current_bypass_reactive, phase.feedback.current_bypass_reactive); | ||||||
|  |     //
 | ||||||
|  |     phase.reference.voltage_cell_ampl_active = regulator_active.execute(phase.feedback.current_cell_active, phase.reference.current_cell_active); | ||||||
|  |     phase.reference.voltage_cell_ampl_reactive = regulator_reactive.execute(phase.feedback.current_cell_reactive, phase.reference.current_cell_reactive); | ||||||
|  |     //
 | ||||||
|  |     //phase.reference.voltage_cell_ampl_active = regulator_active.execute(phase.feedback.current_cell_active, phase.test_ref.active);
 | ||||||
|  |     //phase.reference.voltage_cell_ampl_reactive = regulator_reactive.execute(phase.feedback.current_cell_reactive, phase.test_ref.reactive);
 | ||||||
|  |     //
 | ||||||
|  |     phase.reference.voltage_cell_active = phase.reference.voltage_cell_ampl_active * orts.active; | ||||||
|  |     phase.reference.voltage_cell_reactive = phase.reference.voltage_cell_ampl_reactive * orts.reactive; | ||||||
|  |     //
 | ||||||
|  |     phase.reference.voltage_cell = phase.reference.voltage_cell_active - phase.reference.voltage_cell_reactive; | ||||||
|  |     phase.reference.voltage_cell_relative = phase.reference.voltage_cell * dc_voltage_reciprocal; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | //
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStart::_execute_run() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_start.execute(); | ||||||
|  |     //
 | ||||||
|  |     m_reference_current_cell_direct = m_env.drc_referencer_current_bypass_direct.execute(m_reference_zero, m_env.drc_current_bypass_direct); | ||||||
|  |     m_reference_current_cell_quadrature = m_env.drc_referencer_current_bypass_quadrature.execute(m_reference_zero, m_env.drc_current_bypass_quadrature); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_positive_voltage_cell_direct = m_env.drc_regulator_current_load_direct.execute(m_env.drc_current_cell_direct, m_reference_current_cell_direct); | ||||||
|  |     m_env.drc_positive_voltage_cell_quadrature = m_env.drc_regulator_current_load_quadrature.execute(m_env.drc_current_cell_quadrature, m_reference_current_cell_quadrature); | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, | ||||||
|  |                                             m_env.main_ab_orts.reactive, | ||||||
|  |                                             m_env.drc_positive_voltage_cell_direct, | ||||||
|  |                                             m_env.drc_positive_voltage_cell_quadrature, | ||||||
|  |                                             m_env.drc_positive_voltage_cell_alpha, | ||||||
|  |                                             m_env.drc_positive_voltage_cell_beta); | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha, | ||||||
|  |                                               m_env.drc_positive_voltage_cell_beta, | ||||||
|  |                                               m_env.drc_positive_voltage_cell_a, | ||||||
|  |                                               m_env.drc_positive_voltage_cell_b, | ||||||
|  |                                               m_env.drc_positive_voltage_cell_c); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a; | ||||||
|  |     m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b; | ||||||
|  |     m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c; | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; | ||||||
|  |     m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; | ||||||
|  |     m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,66 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgoritmStart.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITMPRESTART_H_ | ||||||
|  | #define SYSCTRL_ALGORITMPRESTART_H_ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class AlgorithmStart: public SYSCTRL::AlgorithmBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  | private: | ||||||
|  |     float m_reference_zero; | ||||||
|  |     float m_reference_current_cell_direct; | ||||||
|  |     float m_reference_current_cell_quadrature; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  |     float m_reference_zero; | ||||||
|  |     float m_reference_current_cell_direct; | ||||||
|  |     float m_reference_current_cell_quadrature; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     AlgorithmStart(SYSCTRL::SystemEnvironment& env); | ||||||
|  | public: | ||||||
|  |     void setup(); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmStart::*_execute)(); | ||||||
|  |     void _execute_run(); | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|  |     inline void _execute_single_phase(SYSCTRL::AlgorithmStartSinglePhaseControl& phase, | ||||||
|  |                                       SYSCTRL::VectorOrthogonalProjection& orts, | ||||||
|  |                                       float dc_voltage_reciprocal, | ||||||
|  |                                       FLTSYSLIB::PIController& referencer_active, | ||||||
|  |                                       FLTSYSLIB::PIController& referencer_reactive, | ||||||
|  |                                       FLTSYSLIB::PIController& regulator_active, | ||||||
|  |                                       FLTSYSLIB::PIController& regulator_reactive); | ||||||
|  | #endif | ||||||
|  |     //
 | ||||||
|  | };//AlgoritmPrestart
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITMPRESTART_H_ */ | ||||||
| @ -0,0 +1,247 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmStop.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmStop.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmStop::AlgorithmStop(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         SYSCTRL::AlgorithmBase(), | ||||||
|  |         m_env(env), | ||||||
|  |         _execute(&SYSCTRL::AlgorithmStop::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void AlgorithmStop::setup() | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::AlgorithmStop::_execute_run; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStop::reset() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStop::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStop::_execute_run() | ||||||
|  | { | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_stop.execute(); | ||||||
|  |     //
 | ||||||
|  |     if(m_env.timer_stop.is_finished()){ | ||||||
|  |         //
 | ||||||
|  |         m_voltage_a = FP_ZERO; | ||||||
|  |         m_voltage_b = FP_ZERO; | ||||||
|  |         m_voltage_c = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |     }else{ | ||||||
|  |         //
 | ||||||
|  | #if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_PII | ||||||
|  | 
 | ||||||
|  |         m_env.voltage_reference_load_direct = m_env.reference_voltage_direct_intensity.execute(m_env.voltage_grid_direct); | ||||||
|  |         //m_env.voltage_reference_load_direct = 0.33333*(m_env.rms_voltage_input_a + m_env.rms_voltage_input_b + m_env.rms_voltage_input_c);
 | ||||||
|  |         //m_env.voltage_reference_load_quadrature = m_env.voltage_grid_quadrature;
 | ||||||
|  |         m_env.voltage_reference_load_quadrature = FP_ZERO; | ||||||
|  |         m_env.voltage_pi_reg_out_direct = m_env.regulator_voltage_load_direct.execute(m_env.voltage_reference_load_direct, m_env.voltage_load_direct); | ||||||
|  |         //m_env.voltage_pi_reg_out_quadrature = m_env.regulator_voltage_load_quadrature.execute(m_env.voltage_reference_load_quadrature, m_env.voltage_load_quadrature);
 | ||||||
|  |         m_env.voltage_pi_reg_out_quadrature = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |         m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_pi_reg_out_direct); | ||||||
|  |         //m_env.voltage_cell_quadrature = m_env.integrator_quadrature.execute(m_env.voltage_pi_reg_out_quadrature);
 | ||||||
|  |         m_env.voltage_cell_quadrature = FP_ZERO; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_I | ||||||
|  |         m_env.voltage_reference_load_direct = m_env.reference_voltage_direct_intensity.execute(m_env.voltage_grid_direct); | ||||||
|  |         m_env.voltage_reference_load_quadrature = FP_ZERO; | ||||||
|  |         m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_reference_load_direct - m_env.voltage_load_direct); | ||||||
|  |         m_env.voltage_cell_quadrature = FP_ZERO; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |         //
 | ||||||
|  |         FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, | ||||||
|  |                                                 m_env.main_ab_orts.reactive, | ||||||
|  |                                                 m_env.voltage_cell_direct, | ||||||
|  |                                                 m_env.voltage_cell_quadrature, | ||||||
|  |                                                 m_env.voltage_cell_alpha, | ||||||
|  |                                                 m_env.voltage_cell_beta); | ||||||
|  |         //
 | ||||||
|  |         FLTSYSLIB::Transformation::clarke_inverse(m_env.voltage_cell_alpha, | ||||||
|  |                                                   m_env.voltage_cell_beta, | ||||||
|  |                                                   m_env.voltage_cell_a, | ||||||
|  |                                                   m_env.voltage_cell_b, | ||||||
|  |                                                   m_env.voltage_cell_c); | ||||||
|  |         //
 | ||||||
|  |         m_voltage_a = m_env.voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; | ||||||
|  |         m_voltage_b = m_env.voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; | ||||||
|  |         m_voltage_c = m_env.voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | //
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStop::_execute_run() | ||||||
|  | { | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_stop.execute(); | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  |     //reference constructor
 | ||||||
|  | //    m_env.phase_control.common_ref.voltage_rms_real = m_env.phase_control.common_ref.voltage_module_rms;
 | ||||||
|  |     //m_env.phase_control.common_ref.voltage_rms_jm = FP_ZERO;
 | ||||||
|  | //    m_env.phase_control.phase_a.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real;
 | ||||||
|  |     //m_env.phase_control.phase_a.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm;
 | ||||||
|  | //    m_env.phase_control.phase_a.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_a.reactive;
 | ||||||
|  | //    m_env.phase_control.phase_b.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real;
 | ||||||
|  |     //m_env.phase_control.phase_b.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm;
 | ||||||
|  | //    m_env.phase_control.phase_b.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_b.reactive;
 | ||||||
|  | //    m_env.phase_control.phase_c.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real;
 | ||||||
|  |     //m_env.phase_control.phase_c.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm;
 | ||||||
|  | //    m_env.phase_control.phase_c.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_c.reactive;
 | ||||||
|  |     //
 | ||||||
|  |     //m_env.phase_control.phase_a.reference.voltage_ampl_real = m_env.phase_control.phase_a.reference.voltage_ampl_real_const;
 | ||||||
|  |     //m_env.phase_control.phase_a.reference.voltage_ampl_jm = m_env.phase_control.phase_a.reference.voltage_ampl_jm_const;
 | ||||||
|  |     //m_env.phase_control.phase_b.reference.voltage_ampl_real = m_env.phase_control.phase_b.reference.voltage_ampl_real_const;
 | ||||||
|  |     //m_env.phase_control.phase_b.reference.voltage_ampl_jm = m_env.phase_control.phase_b.reference.voltage_ampl_jm_const;
 | ||||||
|  |     //m_env.phase_control.phase_c.reference.voltage_ampl_real = m_env.phase_control.phase_c.reference.voltage_ampl_real_const;
 | ||||||
|  |     //m_env.phase_control.phase_c.reference.voltage_ampl_jm = m_env.phase_control.phase_c.reference.voltage_ampl_jm_const;
 | ||||||
|  | 
 | ||||||
|  |     m_env.phase_control.phase_a.reference.voltage_ampl_real = m_env.projection_voltage_input_a.active; | ||||||
|  |     m_env.phase_control.phase_a.reference.voltage_ampl_jm = m_env.projection_voltage_input_a.reactive; | ||||||
|  |     m_env.phase_control.phase_b.reference.voltage_ampl_real = m_env.projection_voltage_input_b.active; | ||||||
|  |     m_env.phase_control.phase_b.reference.voltage_ampl_jm = m_env.projection_voltage_input_b.reactive; | ||||||
|  |     m_env.phase_control.phase_c.reference.voltage_ampl_real = m_env.projection_voltage_input_c.active; | ||||||
|  |     m_env.phase_control.phase_c.reference.voltage_ampl_jm = m_env.projection_voltage_input_c.reactive; | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     //control execute
 | ||||||
|  |     _execute_single_phase(m_env.phase_control.phase_a, | ||||||
|  |                           m_env.main_abc_orts.phase_a, | ||||||
|  |                           m_env.regulator_voltage_load_a_active, | ||||||
|  |                           m_env.regulator_voltage_load_a_reactive); | ||||||
|  |     //
 | ||||||
|  |     _execute_single_phase(m_env.phase_control.phase_b, | ||||||
|  |                           m_env.main_abc_orts.phase_b, | ||||||
|  |                           m_env.regulator_voltage_load_b_active, | ||||||
|  |                           m_env.regulator_voltage_load_b_reactive); | ||||||
|  |     //
 | ||||||
|  |     _execute_single_phase(m_env.phase_control.phase_c, | ||||||
|  |                           m_env.main_abc_orts.phase_c, | ||||||
|  |                           m_env.regulator_voltage_load_c_active, | ||||||
|  |                           m_env.regulator_voltage_load_c_reactive); | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(m_env.timer_stop.is_finished()){ | ||||||
|  |         m_voltage_a = FP_ZERO; | ||||||
|  |         m_voltage_b = FP_ZERO; | ||||||
|  |         m_voltage_c = FP_ZERO; | ||||||
|  |     }else{ | ||||||
|  |         m_voltage_a = m_env.phase_control.phase_a.reference.voltage_cell_relative; | ||||||
|  |         m_voltage_b = m_env.phase_control.phase_b.reference.voltage_cell_relative; | ||||||
|  |         m_voltage_c = m_env.phase_control.phase_c.reference.voltage_cell_relative; | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void AlgorithmStop::_execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase, | ||||||
|  |                                                  SYSCTRL::VectorOrthogonalProjection& orts, | ||||||
|  |                                                  FLTSYSLIB::PIController& regulator_active, | ||||||
|  |                                                  FLTSYSLIB::PIController& regulator_reactive) | ||||||
|  | { | ||||||
|  |     phase.reference.voltage_cell_ampl_real = regulator_active.execute(phase.reference.voltage_ampl_real, phase.feedback.voltage_ampl_real); | ||||||
|  |     phase.reference.voltage_cell_ampl_jm = regulator_reactive.execute(phase.reference.voltage_ampl_jm, phase.feedback.voltage_ampl_jm); | ||||||
|  |     //
 | ||||||
|  |     phase.reference.voltage_cell_real = phase.reference.voltage_cell_ampl_real * orts.active; | ||||||
|  |     phase.reference.voltage_cell_jm = phase.reference.voltage_cell_ampl_jm * orts.reactive; | ||||||
|  |     phase.reference.voltage_cell = phase.reference.voltage_cell_real - phase.reference.voltage_cell_jm; | ||||||
|  |     //
 | ||||||
|  |     phase.reference.voltage_cell_relative = phase.reference.voltage_cell * phase.feedback.voltage_cell_dc_reciprocal; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmStop::_execute_run() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_stop.execute(); | ||||||
|  |     //
 | ||||||
|  |     if(m_env.timer_stop.is_finished()){ | ||||||
|  |         //
 | ||||||
|  |         m_voltage_a = FP_ZERO; | ||||||
|  |         m_voltage_b = FP_ZERO; | ||||||
|  |         m_voltage_c = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |     }else{ | ||||||
|  |         //
 | ||||||
|  | 
 | ||||||
|  |         m_env.drc_voltage_reference_load_direct = m_env.drc_reference_voltage_direct_intensity.execute(m_env.drc_voltage_grid_direct); | ||||||
|  |         m_env.drc_voltage_reference_load_quadrature = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |         m_env.drc_positive_voltage_cell_direct = m_env.drc_positive_voltage_controller_direct.execute(m_env.drc_voltage_reference_load_direct, m_env.drc_positive_voltage_load_direct); | ||||||
|  |         m_env.drc_positive_voltage_cell_quadrature = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_direct = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_quadrature = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_alpha = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_beta = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_a = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_b = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_c = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |         FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, | ||||||
|  |                                                 m_env.main_ab_orts.reactive, | ||||||
|  |                                                 m_env.drc_positive_voltage_cell_direct, | ||||||
|  |                                                 m_env.drc_positive_voltage_cell_quadrature, | ||||||
|  |                                                 m_env.drc_positive_voltage_cell_alpha, | ||||||
|  |                                                 m_env.drc_positive_voltage_cell_beta); | ||||||
|  |         //
 | ||||||
|  |         FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha, | ||||||
|  |                                                   m_env.drc_positive_voltage_cell_beta, | ||||||
|  |                                                   m_env.drc_positive_voltage_cell_a, | ||||||
|  |                                                   m_env.drc_positive_voltage_cell_b, | ||||||
|  |                                                   m_env.drc_positive_voltage_cell_c); | ||||||
|  |         //
 | ||||||
|  |         m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a; | ||||||
|  |         m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b; | ||||||
|  |         m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c; | ||||||
|  |         //
 | ||||||
|  |         m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; | ||||||
|  |         m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; | ||||||
|  |         m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,48 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmStop.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITHMSTOP_H_ | ||||||
|  | #define SYSCTRL_ALGORITHMSTOP_H_ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class AlgorithmStop: public SYSCTRL::AlgorithmBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | public: | ||||||
|  |     AlgorithmStop(SYSCTRL::SystemEnvironment& env); | ||||||
|  | public: | ||||||
|  |     void setup(); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmStop::*_execute)(); | ||||||
|  |     void _execute_run(); | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | private: | ||||||
|  |     inline void _execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase, | ||||||
|  |                                       SYSCTRL::VectorOrthogonalProjection& orts, | ||||||
|  |                                       FLTSYSLIB::PIController& regulator_active, | ||||||
|  |                                       FLTSYSLIB::PIController& regulator_reactive); | ||||||
|  | #endif | ||||||
|  |     //
 | ||||||
|  | };//AlgorithmPrestop
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITHMSTOP_H_ */ | ||||||
| @ -0,0 +1,407 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmWork.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmWork.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmWork::AlgorithmWork(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         AlgorithmBase(), | ||||||
|  |         m_env(env), | ||||||
|  |         m_reference_switcher(false), | ||||||
|  |         _execute(&SYSCTRL::AlgorithmWork::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | void AlgorithmWork::setup() | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::AlgorithmWork::_execute_run; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWork::reset() | ||||||
|  | { | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_voltage_load_direct.reset(); | ||||||
|  |     m_env.regulator_voltage_load_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.integrator_direct.reset(); | ||||||
|  |     m_env.integrator_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_current_limit.set_to_high_saturation(); | ||||||
|  |     m_env.regulator_current_pfc.reset(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_env.regulator_current_limit_a.set_to_high_saturation(); | ||||||
|  |     m_env.regulator_current_pfc_a.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_current_limit_b.set_to_high_saturation(); | ||||||
|  |     m_env.regulator_current_pfc_b.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_current_limit_c.set_to_high_saturation(); | ||||||
|  |     m_env.regulator_current_pfc_c.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_voltage_load_a_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_a_reactive.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_voltage_load_b_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_b_reactive.reset(); | ||||||
|  | 
 | ||||||
|  |     m_env.regulator_voltage_load_c_active.reset(); | ||||||
|  |     m_env.regulator_voltage_load_c_reactive.reset(); | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  | 
 | ||||||
|  |     m_env.drc_positive_voltage_controller_direct.reset(); | ||||||
|  |     m_env.drc_positive_voltage_controller_quadrature.reset(); | ||||||
|  |     m_env.drc_negative_voltage_controller_direct.reset(); | ||||||
|  |     m_env.drc_negative_voltage_controller_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_reference_voltage_direct_intensity.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_regulator_current_load_direct.reset(); | ||||||
|  |     m_env.drc_regulator_current_load_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_referencer_current_bypass_direct.reset(); | ||||||
|  |     m_env.drc_referencer_current_bypass_quadrature.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_regulator_current_limit.set_to_low_saturation(); | ||||||
|  |     m_env.drc_regulator_current_pfc.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_reference_switcher = false; | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWork::reset_switcher() | ||||||
|  | { | ||||||
|  |     m_reference_switcher = false; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWork::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWork::_execute_run() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     //if(m_env.algorithm_control.signal.enable_current_limit)
 | ||||||
|  |     if(false) | ||||||
|  |     { | ||||||
|  |         m_env.voltage_reference_load_direct = m_env.regulator_current_limit.execute(m_env.rms_current_load_module, m_env.current_reference_limit); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         m_env.regulator_current_limit.set_to_low_saturation(); | ||||||
|  |         m_env.voltage_reference_load_direct = m_env.regulator_current_limit.get_output(); | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  |     //if(m_env.algorithm_control.signal.enable_pfc)
 | ||||||
|  |     if(false) | ||||||
|  |     { | ||||||
|  |         m_env.regulator_current_pfc.reset(); | ||||||
|  |         m_env.voltage_reference_load_quadrature = m_env.regulator_current_pfc.get_output(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         m_env.regulator_current_pfc.reset(); | ||||||
|  |         m_env.voltage_reference_load_quadrature = m_env.regulator_current_pfc.get_output(); | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  |     // for PII-Controller
 | ||||||
|  | #if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_PII | ||||||
|  |     m_env.voltage_pi_reg_out_direct = m_env.regulator_voltage_load_direct.execute(m_env.voltage_reference_load_direct, m_env.voltage_load_direct); | ||||||
|  |     //m_env.voltage_pi_reg_out_quadrature = m_env.regulator_voltage_load_quadrature.execute(m_env.voltage_reference_load_quadrature, m_env.voltage_load_quadrature);
 | ||||||
|  |     m_env.voltage_pi_reg_out_quadrature = FP_ZERO; | ||||||
|  |     m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_pi_reg_out_direct); | ||||||
|  |     //m_env.voltage_cell_quadrature = m_env.integrator_quadrature.execute(m_env.voltage_pi_reg_out_quadrature);
 | ||||||
|  |     m_env.voltage_cell_quadrature = FP_ZERO; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     // for I-Controller
 | ||||||
|  | #if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_I | ||||||
|  |     m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_reference_load_direct - m_env.voltage_load_direct); | ||||||
|  |     m_env.voltage_cell_quadrature = FP_ZERO; | ||||||
|  | #endif | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, | ||||||
|  |                                             m_env.main_ab_orts.reactive, | ||||||
|  |                                             m_env.voltage_cell_direct, | ||||||
|  |                                             m_env.voltage_cell_quadrature, | ||||||
|  |                                             m_env.voltage_cell_alpha, | ||||||
|  |                                             m_env.voltage_cell_beta); | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::clarke_inverse(m_env.voltage_cell_alpha, | ||||||
|  |                                               m_env.voltage_cell_beta, | ||||||
|  |                                               m_env.voltage_cell_a, | ||||||
|  |                                               m_env.voltage_cell_b, | ||||||
|  |                                               m_env.voltage_cell_c); | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a = m_env.voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; | ||||||
|  |     m_voltage_b = m_env.voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; | ||||||
|  |     m_voltage_c = m_env.voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWork::_execute_run() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  | 
 | ||||||
|  |     m_env.phase_control.phase_a.reference.voltage_dc = m_env.phase_control.common_ref.voltage_dc; | ||||||
|  |     m_env.phase_control.phase_b.reference.voltage_dc = m_env.phase_control.common_ref.voltage_dc; | ||||||
|  |     m_env.phase_control.phase_c.reference.voltage_dc = m_env.phase_control.common_ref.voltage_dc; | ||||||
|  | 
 | ||||||
|  |     m_env.phase_control.phase_a.reference.current_ampl_limit_const = m_env.phase_control.common_ref.current_limit_rms; | ||||||
|  |     m_env.phase_control.phase_b.reference.current_ampl_limit_const = m_env.phase_control.common_ref.current_limit_rms; | ||||||
|  |     m_env.phase_control.phase_c.reference.current_ampl_limit_const = m_env.phase_control.common_ref.current_limit_rms; | ||||||
|  | 
 | ||||||
|  |     m_env.phase_control.phase_a.reference.current_ampl_pfc_const = m_env.phase_control.common_ref.current_pfc_rms; | ||||||
|  |     m_env.phase_control.phase_b.reference.current_ampl_pfc_const = m_env.phase_control.common_ref.current_pfc_rms; | ||||||
|  |     m_env.phase_control.phase_c.reference.current_ampl_pfc_const = m_env.phase_control.common_ref.current_pfc_rms; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     _execute_single_phase(m_env.phase_control.phase_a, | ||||||
|  |                           m_env.projection_voltage_input_a, | ||||||
|  |                           m_env.main_abc_orts.phase_a, | ||||||
|  |                           m_env.regulator_current_limit_a, | ||||||
|  |                           m_env.regulator_current_pfc_a, | ||||||
|  |                           m_env.regulator_dc_a, | ||||||
|  |                           m_env.cell_dc_voltage_a, | ||||||
|  |                           m_env.regulator_voltage_load_a_active, | ||||||
|  |                           m_env.regulator_voltage_load_a_reactive); | ||||||
|  | 
 | ||||||
|  |     _execute_single_phase(m_env.phase_control.phase_b, | ||||||
|  |                           m_env.projection_voltage_input_b, | ||||||
|  |                           m_env.main_abc_orts.phase_b, | ||||||
|  |                           m_env.regulator_current_limit_b, | ||||||
|  |                           m_env.regulator_current_pfc_b, | ||||||
|  |                           m_env.regulator_dc_b, | ||||||
|  |                           m_env.cell_dc_voltage_b, | ||||||
|  |                           m_env.regulator_voltage_load_b_active, | ||||||
|  |                           m_env.regulator_voltage_load_b_reactive); | ||||||
|  | 
 | ||||||
|  |     _execute_single_phase(m_env.phase_control.phase_c, | ||||||
|  |                           m_env.projection_voltage_input_c, | ||||||
|  |                           m_env.main_abc_orts.phase_c, | ||||||
|  |                           m_env.regulator_current_limit_c, | ||||||
|  |                           m_env.regulator_current_pfc_c, | ||||||
|  |                           m_env.regulator_dc_c, | ||||||
|  |                           m_env.cell_dc_voltage_c, | ||||||
|  |                           m_env.regulator_voltage_load_c_active, | ||||||
|  |                           m_env.regulator_voltage_load_c_reactive); | ||||||
|  | 
 | ||||||
|  |     m_voltage_a = m_env.phase_control.phase_a.reference.voltage_cell_relative; | ||||||
|  |     m_voltage_b = m_env.phase_control.phase_b.reference.voltage_cell_relative; | ||||||
|  |     m_voltage_c = m_env.phase_control.phase_c.reference.voltage_cell_relative; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | //
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWork::_execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase, | ||||||
|  |                                           SYSCTRL::ProjectionAnalogSignalStructure& projection, | ||||||
|  |                                           SYSCTRL::VectorOrthogonalProjection& orts, | ||||||
|  |                                           FLTSYSLIB::PIController& regulator_limit, | ||||||
|  |                                           FLTSYSLIB::PIController& regulator_pfc, | ||||||
|  |                                           FLTSYSLIB::PIController& regulator_dc, | ||||||
|  |                                           float& dc_volatage, | ||||||
|  |                                           FLTSYSLIB::PIController& regulator_active, | ||||||
|  |                                           FLTSYSLIB::PIController& regulator_reactive) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(phase.control_bit.signal.enable_current_limit) | ||||||
|  |     { | ||||||
|  | 
 | ||||||
|  |         phase.reference.voltage_limit = regulator_limit.execute(phase.reference.current_ampl_limit_const, phase.feedback.current_ampl_real); | ||||||
|  | 
 | ||||||
|  |         if(phase.control_bit.signal.enable_pfc) | ||||||
|  |         { | ||||||
|  |             phase.reference.voltage_pfc = regulator_pfc.execute(phase.reference.current_ampl_pfc_const, phase.feedback.current_ampl_jm) + | ||||||
|  |                                           regulator_dc.execute(phase.reference.voltage_dc, dc_volatage); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             regulator_pfc.reset(); | ||||||
|  |             phase.reference.voltage_pfc = projection.reactive; | ||||||
|  |             //
 | ||||||
|  |         }//if else
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         regulator_limit.set_to_high_saturation(); | ||||||
|  |         phase.reference.voltage_limit = regulator_limit.get_output(); | ||||||
|  |         //
 | ||||||
|  |         regulator_pfc.reset(); | ||||||
|  |         phase.reference.voltage_pfc = projection.reactive; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(phase.control_bit.signal.enable_pfc) | ||||||
|  |     { | ||||||
|  |         phase.reference.voltage_ampl_real = sqrtf(phase.reference.voltage_limit * phase.reference.voltage_limit - phase.reference.voltage_pfc * phase.reference.voltage_pfc); | ||||||
|  |         phase.reference.voltage_ampl_jm = phase.reference.voltage_pfc; | ||||||
|  |         //
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         phase.reference.voltage_ampl_real = phase.reference.voltage_limit; | ||||||
|  |         phase.reference.voltage_ampl_jm = phase.reference.voltage_pfc; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  |     phase.reference.voltage_cell_ampl_real = regulator_active.execute(phase.reference.voltage_ampl_real, phase.feedback.voltage_ampl_real); | ||||||
|  |     //
 | ||||||
|  |     if(phase.control_bit.signal.enable_pfc) | ||||||
|  |     { | ||||||
|  |         phase.reference.voltage_cell_ampl_jm = regulator_reactive.execute(phase.reference.voltage_ampl_jm, phase.feedback.voltage_ampl_jm); | ||||||
|  |         //
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         phase.reference.voltage_cell_ampl_jm = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  |     phase.reference.voltage_cell_real = phase.reference.voltage_cell_ampl_real * orts.active; | ||||||
|  |     phase.reference.voltage_cell_jm = phase.reference.voltage_cell_ampl_jm * orts.reactive; | ||||||
|  |     phase.reference.voltage_cell = phase.reference.voltage_cell_real - phase.reference.voltage_cell_jm; | ||||||
|  |     //
 | ||||||
|  |     phase.reference.voltage_cell_relative = phase.reference.voltage_cell * phase.feedback.voltage_cell_dc_reciprocal; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWork::_execute_run() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  |     if(m_reference_switcher) | ||||||
|  |     { | ||||||
|  |         //if(m_env.algorithm_control.signal.enable_current_limit)
 | ||||||
|  |         if(false) | ||||||
|  |         { | ||||||
|  |             m_env.drc_voltage_reference_load_direct = m_env.drc_regulator_current_limit.execute(m_env.rms_current_load_module, m_env.drc_current_reference_limit); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             m_env.drc_regulator_current_limit.set_to_low_saturation(); | ||||||
|  |             m_env.drc_voltage_reference_load_direct = m_env.drc_regulator_current_limit.get_output(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         m_env.drc_voltage_reference_load_direct = m_env.drc_reference_voltage_direct_intensity.execute(m_env.drc_regulator_current_limit.get_output()); | ||||||
|  |         //
 | ||||||
|  |         if(m_env.drc_voltage_reference_load_direct >= m_env.drc_regulator_current_limit.get_output()) | ||||||
|  |         { | ||||||
|  |             m_reference_switcher = true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     //if(m_env.algorithm_control.signal.enable_pfc)
 | ||||||
|  |     if(false) | ||||||
|  |     { | ||||||
|  |         m_env.drc_regulator_current_pfc.reset(); | ||||||
|  |         m_env.drc_voltage_reference_load_quadrature = m_env.drc_regulator_current_pfc.get_output(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         m_env.drc_regulator_current_pfc.reset(); | ||||||
|  |         m_env.drc_voltage_reference_load_quadrature = m_env.drc_regulator_current_pfc.get_output(); | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_positive_voltage_cell_direct = m_env.drc_positive_voltage_controller_direct.execute(m_env.drc_voltage_reference_load_direct, m_env.drc_positive_voltage_load_direct); | ||||||
|  |     //m_env.drc_positive_voltage_cell_quadrature = m_env.drc_positive_voltage_controller_quadrature.execute(m_env.drc_voltage_reference_load_quadrature, m_env.drc_positive_voltage_load_quadrature);
 | ||||||
|  |     m_env.drc_positive_voltage_cell_quadrature = FP_ZERO; | ||||||
|  |     m_env.drc_negative_voltage_cell_direct = m_env.drc_negative_voltage_controller_direct.execute(m_env.drc_voltage_reference_zero, m_env.drc_negaative_voltage_load_direct); | ||||||
|  |     m_env.drc_negative_voltage_cell_quadrature = m_env.drc_negative_voltage_controller_quadrature.execute(m_env.drc_voltage_reference_zero, m_env.drc_negative_voltage_load_quadrature); | ||||||
|  |     //m_env.drc_negative_voltage_cell_direct = FP_ZERO;
 | ||||||
|  |     //m_env.drc_negative_voltage_cell_quadrature = FP_ZERO;
 | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, | ||||||
|  |                                             m_env.main_ab_orts.reactive, | ||||||
|  |                                             m_env.drc_positive_voltage_cell_direct, | ||||||
|  |                                             m_env.drc_positive_voltage_cell_quadrature, | ||||||
|  |                                             m_env.drc_positive_voltage_cell_alpha, | ||||||
|  |                                             m_env.drc_positive_voltage_cell_beta); | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, | ||||||
|  |                                             m_env.main_ab_orts.reactive, | ||||||
|  |                                             m_env.drc_negative_voltage_cell_direct, | ||||||
|  |                                             m_env.drc_negative_voltage_cell_quadrature, | ||||||
|  |                                             m_env.drc_negative_voltage_cell_alpha, | ||||||
|  |                                             m_env.drc_negative_voltage_cell_beta); | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha, | ||||||
|  |                                               m_env.drc_positive_voltage_cell_beta, | ||||||
|  |                                               m_env.drc_positive_voltage_cell_a, | ||||||
|  |                                               m_env.drc_positive_voltage_cell_b, | ||||||
|  |                                               m_env.drc_positive_voltage_cell_c); | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::clarke_inverse_back_order(m_env.drc_negative_voltage_cell_alpha, | ||||||
|  |                                                          m_env.drc_negative_voltage_cell_beta, | ||||||
|  |                                                          m_env.drc_negative_voltage_cell_a, | ||||||
|  |                                                          m_env.drc_negative_voltage_cell_b, | ||||||
|  |                                                          m_env.drc_negative_voltage_cell_c); | ||||||
|  |     //
 | ||||||
|  |     m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a + m_env.drc_negative_voltage_cell_a; | ||||||
|  |     m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b + m_env.drc_negative_voltage_cell_b; | ||||||
|  |     m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c + m_env.drc_negative_voltage_cell_c; | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; | ||||||
|  |     m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; | ||||||
|  |     m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,55 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmWork.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITHMNORMAL_H_ | ||||||
|  | #define SYSCTRL_ALGORITHMNORMAL_H_ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class AlgorithmWork: public SYSCTRL::AlgorithmBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     bool m_reference_switcher; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | public: | ||||||
|  |     AlgorithmWork(SYSCTRL::SystemEnvironment& env); | ||||||
|  | public: | ||||||
|  |     void setup(); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  |     void reset_switcher(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmWork::*_execute)(); | ||||||
|  |     void _execute_run(); | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  | private: | ||||||
|  |     void _execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase, | ||||||
|  |                                SYSCTRL::ProjectionAnalogSignalStructure& projection, | ||||||
|  |                                SYSCTRL::VectorOrthogonalProjection& orts, | ||||||
|  |                                FLTSYSLIB::PIController& regulator_limit, | ||||||
|  |                                FLTSYSLIB::PIController& regulator_pfc, | ||||||
|  |                                FLTSYSLIB::PIController& regulator_dc, | ||||||
|  |                                float& dc_volatage, | ||||||
|  |                                FLTSYSLIB::PIController& regulator_active, | ||||||
|  |                                FLTSYSLIB::PIController& regulator_reactive); | ||||||
|  | #endif | ||||||
|  | };//AlgorithmNormal
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITHMNORMAL_H_ */ | ||||||
| @ -0,0 +1,112 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmWorkEntry.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmWorkEntry.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmWorkEntry::AlgorithmWorkEntry(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         SYSCTRL::AlgorithmBase(), | ||||||
|  |         m_env(env), | ||||||
|  |         _execute(&SYSCTRL::AlgorithmWorkEntry::_execute_undef) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void AlgorithmWorkEntry::setup() | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::AlgorithmWorkEntry::_execute_run; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWorkEntry::reset() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWorkEntry::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool AlgorithmWorkEntry::compare_mode(mode_t mode) | ||||||
|  | { | ||||||
|  |     return m_mode == mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWorkEntry::set_mode(mode_t mode) | ||||||
|  | { | ||||||
|  |     m_mode = mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == DIRECTREVERSECONTROL | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmWorkEntry::_execute_run() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_env.timer_stop.execute(); | ||||||
|  |     //
 | ||||||
|  |     if(m_env.timer_stop.is_finished()){ | ||||||
|  |         //
 | ||||||
|  |         m_voltage_a = FP_ZERO; | ||||||
|  |         m_voltage_b = FP_ZERO; | ||||||
|  |         m_voltage_c = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |     }else{ | ||||||
|  |         //
 | ||||||
|  | 
 | ||||||
|  |         m_env.drc_voltage_reference_load_direct = m_env.drc_reference_voltage_direct_intensity.execute(m_env.drc_voltage_grid_direct); | ||||||
|  |         m_env.drc_voltage_reference_load_quadrature = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |         m_env.drc_positive_voltage_cell_direct = m_env.drc_positive_voltage_controller_direct.execute(m_env.drc_voltage_reference_load_direct, m_env.drc_positive_voltage_load_direct); | ||||||
|  |         m_env.drc_positive_voltage_cell_quadrature = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_direct = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_quadrature = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_alpha = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_beta = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_a = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_b = FP_ZERO; | ||||||
|  |         m_env.drc_negative_voltage_cell_c = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |         FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, | ||||||
|  |                                                 m_env.main_ab_orts.reactive, | ||||||
|  |                                                 m_env.drc_positive_voltage_cell_direct, | ||||||
|  |                                                 m_env.drc_positive_voltage_cell_quadrature, | ||||||
|  |                                                 m_env.drc_positive_voltage_cell_alpha, | ||||||
|  |                                                 m_env.drc_positive_voltage_cell_beta); | ||||||
|  |         //
 | ||||||
|  |         FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha, | ||||||
|  |                                                   m_env.drc_positive_voltage_cell_beta, | ||||||
|  |                                                   m_env.drc_positive_voltage_cell_a, | ||||||
|  |                                                   m_env.drc_positive_voltage_cell_b, | ||||||
|  |                                                   m_env.drc_positive_voltage_cell_c); | ||||||
|  |         //
 | ||||||
|  |         m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a; | ||||||
|  |         m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b; | ||||||
|  |         m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c; | ||||||
|  |         //
 | ||||||
|  |         m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; | ||||||
|  |         m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; | ||||||
|  |         m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmWorkEntry.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITHMWORKENTRY_H_ | ||||||
|  | #define SYSCTRL_ALGORITHMWORKENTRY_H_ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class AlgorithmWorkEntry: public AlgorithmBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | public: | ||||||
|  |     AlgorithmWorkEntry(SYSCTRL::SystemEnvironment& env); | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     void setup(); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmWorkEntry::*_execute)(); | ||||||
|  |     void _execute_run(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITHMWORKENTRY_H_ */ | ||||||
| @ -0,0 +1,50 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmZero.cpp | ||||||
|  |  * | ||||||
|  |  *  Created on: 20 ìàÿ 2022 ã. | ||||||
|  |  *      Author: geras | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmZero.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | AlgorithmZero::AlgorithmZero(SYSCTRL::SystemEnvironment& env): | ||||||
|  |         SYSCTRL::AlgorithmBase(), | ||||||
|  |         m_env(env), | ||||||
|  |         _execute(&SYSCTRL::AlgorithmZero::_execute_undef) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | void AlgorithmZero::setup() | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::AlgorithmZero::_execute_run; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmZero::reset() | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmZero::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void AlgorithmZero::_execute_run() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_env.hardware.ref_control_order = ORDER_START; | ||||||
|  |     //
 | ||||||
|  |     m_voltage_a = FP_ZERO; | ||||||
|  |     m_voltage_b = FP_ZERO; | ||||||
|  |     m_voltage_c = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | /*
 | ||||||
|  |  * AlgorithmZero.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ALGORITHMZERO_H_ | ||||||
|  | #define SYSCTRL_ALGORITHMZERO_H_ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/AlgorithmBase.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class AlgorithmZero: public AlgorithmBase | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | public: | ||||||
|  |     AlgorithmZero(SYSCTRL::SystemEnvironment& env); | ||||||
|  | public: | ||||||
|  |     void setup(); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (AlgorithmZero::*_execute)(); | ||||||
|  |     void _execute_run(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ALGORITHMZERO_H_ */ | ||||||
| @ -0,0 +1,33 @@ | |||||||
|  | /*
 | ||||||
|  |  * BaseComponent.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/BaseComponent.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | BaseComponent::BaseComponent(): | ||||||
|  |         m_mode(SYSCTRL::BaseComponent::UNDEFINED), | ||||||
|  |         m_time_sample(-1.0) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | SYSCTRL::BaseComponent::mode_t BaseComponent::get_mode() | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool BaseComponent::compare(SYSCTRL::BaseComponent::mode_t mode) | ||||||
|  | { | ||||||
|  |     return m_mode == mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | /*
 | ||||||
|  |  * BaseComponent.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_BASECOMPONENT_H_ | ||||||
|  | #define SYSCTRL_BASECOMPONENT_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class BaseComponent | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL}; | ||||||
|  | protected: | ||||||
|  |     mode_t m_mode; | ||||||
|  | protected: | ||||||
|  |     float m_time_sample; | ||||||
|  | public: | ||||||
|  |     BaseComponent(); | ||||||
|  | public: | ||||||
|  |     mode_t get_mode(); | ||||||
|  |     bool compare(mode_t mode); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_BASECOMPONENT_H_ */ | ||||||
| @ -0,0 +1,89 @@ | |||||||
|  | /*
 | ||||||
|  |  * ContactorFault.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | #include "SYSCTRL/ContactorFault.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | ContactorFault::ContactorFault(): | ||||||
|  |         m_time_sample(-1.0), | ||||||
|  |         m_period(-1.0), | ||||||
|  |         m_counter(FP_ZERO), | ||||||
|  |         m_status(), | ||||||
|  |         status(), | ||||||
|  |         _execute(&SYSCTRL::ContactorFault::_execute_undef) | ||||||
|  | {} | ||||||
|  | //end CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | void ContactorFault::setup(float time_sample) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_time_sample = time_sample; | ||||||
|  |     _execute = &SYSCTRL::ContactorFault::_execute_undef; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void ContactorFault::configure(ContactorFaultConfiguration& config) | ||||||
|  | { | ||||||
|  |     m_period = config.period; | ||||||
|  | 
 | ||||||
|  |     if((m_time_sample > FP_ZERO) && (m_period > m_time_sample)) | ||||||
|  |     { | ||||||
|  |         _execute = &SYSCTRL::ContactorFault::_execute_operational; | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | //#pragma CODE_SECTION("ramfuncs");
 | ||||||
|  | void ContactorFault::reset(bool ref) | ||||||
|  | { | ||||||
|  |     m_status.signal.fault &= !ref; | ||||||
|  |     status.all = m_status.all; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void ContactorFault::execute(bool ref, bool current) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(ref, current); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | void ContactorFault::_execute_undef(bool ref, bool current) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void ContactorFault::_execute_operational(bool ref, bool current) | ||||||
|  | { | ||||||
|  |     if(!m_status.signal.fault) | ||||||
|  |     { | ||||||
|  |         if(ref == current) | ||||||
|  |         { | ||||||
|  |             m_counter = FP_ZERO; | ||||||
|  | 
 | ||||||
|  |         }else{ | ||||||
|  | 
 | ||||||
|  |             if(m_counter >= m_period) | ||||||
|  |             { | ||||||
|  |                 m_status.signal.fault = 1; | ||||||
|  |                 m_counter = FP_ZERO; | ||||||
|  | 
 | ||||||
|  |             }else{ | ||||||
|  | 
 | ||||||
|  |                 m_counter += m_time_sample; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     status.all = m_status.all; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,69 @@ | |||||||
|  | /*
 | ||||||
|  |  * ContactorFault.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/BaseComponent.h" | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_CONTACTORFAULT_H_ | ||||||
|  | #define SYSCTRL_CONTACTORFAULT_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | struct ContactorFaultConfiguration | ||||||
|  | { | ||||||
|  |     float period; | ||||||
|  |     ContactorFaultConfiguration(): | ||||||
|  |         period(-1.0) | ||||||
|  |     {} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct ContactorFaultBitField | ||||||
|  | { | ||||||
|  |     uint16_t  fault: 1; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | union ContactorFaultRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     ContactorFaultBitField signal; | ||||||
|  |     ContactorFaultRegister(): | ||||||
|  |         all((uint16_t)0) | ||||||
|  |     {} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ContactorFault | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     float m_time_sample; | ||||||
|  |     float m_period; | ||||||
|  |     float m_counter; | ||||||
|  |     ContactorFaultRegister m_status; | ||||||
|  | public: | ||||||
|  |     ContactorFaultRegister status; | ||||||
|  | public: | ||||||
|  |     ContactorFault(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(ContactorFaultConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void reset(bool ref); | ||||||
|  | public: | ||||||
|  |     void execute(bool ref, bool current); | ||||||
|  | private: | ||||||
|  |     void (ContactorFault::*_execute)(bool ref, bool current); | ||||||
|  |     void _execute_undef(bool ref, bool current); | ||||||
|  |     void _execute_operational(bool ref, bool current); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_CONTACTORFAULT_H_ */ | ||||||
| @ -0,0 +1,101 @@ | |||||||
|  | /*
 | ||||||
|  |  * DRCDecomposer.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/DRCDecomposer.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | DRCDecomposer::DRCDecomposer(): | ||||||
|  |         m_time_sample(-1.0), | ||||||
|  |         m_filter_direct(), | ||||||
|  |         m_filter_quadrature(), | ||||||
|  |         _aux_reg(FP_ZERO), | ||||||
|  |         direct(FP_ZERO), | ||||||
|  |         quadrature(FP_ZERO), | ||||||
|  |         _execute(&SYSCTRL::DRCDecomposer::_execute_undef) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | void DRCDecomposer::setup(float time_sample) | ||||||
|  | { | ||||||
|  |     if(time_sample > FP_ZERO) | ||||||
|  |     { | ||||||
|  |         m_time_sample = time_sample; | ||||||
|  |         m_filter_direct.setup(m_time_sample); | ||||||
|  |         m_filter_quadrature.setup(m_time_sample); | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void DRCDecomposer::configure(const DRCDecomposerConfiguration& config) | ||||||
|  | { | ||||||
|  |     if(m_time_sample > FP_ZERO) | ||||||
|  |     { | ||||||
|  |         m_filter_direct.configure(config.filter); | ||||||
|  |         m_filter_quadrature.configure(config.filter); | ||||||
|  | 
 | ||||||
|  |         if(m_filter_direct.compare(FLTSYSLIB::Filter::OPERATIONAL) && m_filter_quadrature.compare(FLTSYSLIB::Filter::OPERATIONAL)) | ||||||
|  |         //if(m_filter_direct.compare(FLTSYSLIB::FilterSecond::OPERATIONAL) && m_filter_quadrature.compare(FLTSYSLIB::FilterSecond::OPERATIONAL))
 | ||||||
|  |         { | ||||||
|  |             _execute = &SYSCTRL::DRCDecomposer::_execute_operational; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void DRCDecomposer::reset() | ||||||
|  | { | ||||||
|  |     m_filter_direct.reset(); | ||||||
|  |     m_filter_quadrature.reset(); | ||||||
|  |     this->direct = FP_ZERO; | ||||||
|  |     this->quadrature = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void DRCDecomposer::get_outputs(float& outd, float& outq) | ||||||
|  | { | ||||||
|  |     this->direct = m_filter_direct.get_output(); | ||||||
|  |     this->quadrature = m_filter_quadrature.get_output(); | ||||||
|  |     outd = this->direct; | ||||||
|  |     outq = this->quadrature; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void DRCDecomposer::execute(float in_a, float in_b, float in_c, | ||||||
|  |                             float ort_direct_a, float ort_direct_b, float ort_direct_c, | ||||||
|  |                             float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(in_a, in_b, in_c, | ||||||
|  |                       ort_direct_a, ort_direct_b, ort_direct_c, | ||||||
|  |                       ort_orthogonal_a, ort_orthogonal_b, ort_orthogonal_c); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void DRCDecomposer::_execute_undef(float in_a, float in_b, float in_c, | ||||||
|  |                     float ort_direct_a, float ort_direct_b, float ort_direct_c, | ||||||
|  |                     float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void DRCDecomposer::_execute_operational(float in_a, float in_b, float in_c, | ||||||
|  |                           float ort_direct_a, float ort_direct_b, float ort_direct_c, | ||||||
|  |                           float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c) | ||||||
|  | { | ||||||
|  |     _aux_reg = (0.4714045)*(in_a * ort_direct_a + in_b * ort_direct_b + in_c * ort_direct_c); | ||||||
|  |     direct = m_filter_direct.execute(_aux_reg); | ||||||
|  |     _aux_reg = (-0.4714045)*(in_a * ort_orthogonal_a + in_b * ort_orthogonal_b + in_c * ort_orthogonal_c); | ||||||
|  |     quadrature = m_filter_quadrature.execute(_aux_reg); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,85 @@ | |||||||
|  | /*
 | ||||||
|  |  * DRCDecomposer.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/BaseComponent.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_DRCDECOMPOSER_H_ | ||||||
|  | #define SYSCTRL_DRCDECOMPOSER_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct DRCDecomposerStructure | ||||||
|  | { | ||||||
|  |     float direct; | ||||||
|  |     float quadrature; | ||||||
|  |     void reset() | ||||||
|  |     { | ||||||
|  |         direct = FP_ZERO; | ||||||
|  |         quadrature = FP_ZERO; | ||||||
|  |     } | ||||||
|  |     DRCDecomposerStructure(): | ||||||
|  |         direct(FP_ZERO), | ||||||
|  |         quadrature(FP_ZERO) | ||||||
|  |     {} | ||||||
|  | };//DRCDecomposerStructure
 | ||||||
|  | 
 | ||||||
|  | struct DRCDecomposerConfiguration | ||||||
|  | { | ||||||
|  |     FLTSYSLIB::FilterConfiguration filter; | ||||||
|  |     //FLTSYSLIB::FilterSecondConfiguration filter;
 | ||||||
|  |     DRCDecomposerConfiguration(): | ||||||
|  |         filter() | ||||||
|  |     {} | ||||||
|  | };//DRCDecomposerConfiguration
 | ||||||
|  | 
 | ||||||
|  | class DRCDecomposer | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     float m_time_sample; | ||||||
|  | private: | ||||||
|  |     FLTSYSLIB::Filter m_filter_direct; | ||||||
|  |     FLTSYSLIB::Filter m_filter_quadrature; | ||||||
|  |     //FLTSYSLIB::FilterSecond m_filter_direct;
 | ||||||
|  |     //FLTSYSLIB::FilterSecond m_filter_quadrature;
 | ||||||
|  | private: | ||||||
|  |     float _aux_reg; | ||||||
|  | public: | ||||||
|  |     float direct; | ||||||
|  |     float quadrature; | ||||||
|  | public: | ||||||
|  |     DRCDecomposer(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const DRCDecomposerConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  |     void get_outputs(float& d, float& q); | ||||||
|  | public: | ||||||
|  |     void execute(float in_a, float in_b, float in_c, | ||||||
|  |                  float ort_direct_a, float ort_direct_b, float ort_direct_c, | ||||||
|  |                  float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c); | ||||||
|  | private: | ||||||
|  |     void (DRCDecomposer::*_execute)(float in_a, float in_b, float in_c, | ||||||
|  |                                     float ort_direct_a, float ort_direct_b, float ort_direct_c, | ||||||
|  |                                     float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c); | ||||||
|  |     void _execute_undef(float in_a, float in_b, float in_c, | ||||||
|  |                         float ort_direct_a, float ort_direct_b, float ort_direct_c, | ||||||
|  |                         float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c); | ||||||
|  |     void _execute_operational(float in_a, float in_b, float in_c, | ||||||
|  |                               float ort_direct_a, float ort_direct_b, float ort_direct_c, | ||||||
|  |                               float ort_orthogonal_a, float ort_orthogonal_b, float ort_orthogonal_c); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_DRCDECOMPOSER_H_ */ | ||||||
| @ -0,0 +1,199 @@ | |||||||
|  | /*
 | ||||||
|  |  * FanControl.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/FanControl.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #define KM11_TURN_OFF   (Uint16)0 | ||||||
|  | #define KM11_TURN_ON    (Uint16)1 | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | FanControl::FanControl(): | ||||||
|  |         m_mode(SYSCTRL::FanControl::UNDEFINED), | ||||||
|  |         m_time_sample(-1.0), | ||||||
|  |         m_contact_bounce_period(FP_ZERO), | ||||||
|  |         m_voltage_level_on(FP_ZERO), | ||||||
|  |         m_voltage_level_off(FP_ZERO), | ||||||
|  |         m_km11_control(0), | ||||||
|  |         m_km11t_control(0), | ||||||
|  |         m_fan_state(false), | ||||||
|  |         m_fault(false), | ||||||
|  |         m_voltage_relay(), | ||||||
|  |         m_delay_off_timer(), | ||||||
|  |         m_control_state_timer(), | ||||||
|  |         _execute(&SYSCTRL::FanControl::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void FanControl::setup(float time_sample) | ||||||
|  | { | ||||||
|  |     static bool status = true; | ||||||
|  |     if(m_mode == SYSCTRL::FanControl::UNDEFINED) | ||||||
|  |     { | ||||||
|  |         m_time_sample = time_sample; | ||||||
|  | 
 | ||||||
|  |         m_delay_off_timer.setup(m_time_sample); | ||||||
|  |         m_control_state_timer.setup(m_time_sample); | ||||||
|  | 
 | ||||||
|  |         status &= m_time_sample > FP_ZERO ? true : false; | ||||||
|  |         status &= m_delay_off_timer.compare(FLTSYSLIB::FTimer::CONFIGURATE); | ||||||
|  |         status &= m_control_state_timer.compare(FLTSYSLIB::FTimer::CONFIGURATE); | ||||||
|  | 
 | ||||||
|  |         if(status) | ||||||
|  |         { | ||||||
|  |             m_mode = SYSCTRL::FanControl::CONFIGURATE; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//setup()
 | ||||||
|  | //
 | ||||||
|  | void FanControl::configure(const FanControlConfiguration& config) | ||||||
|  | { | ||||||
|  |     static bool status = true; | ||||||
|  |     if(m_mode == SYSCTRL::FanControl::CONFIGURATE) | ||||||
|  |     { | ||||||
|  |         m_voltage_level_on = config.voltage_level_on; | ||||||
|  |         m_voltage_level_off = config.voltage_level_off; | ||||||
|  | 
 | ||||||
|  |         FLTSYSLIB::HysteresisConfiguration hyst_config; | ||||||
|  |         hyst_config.level_high = 1.0; | ||||||
|  |         hyst_config.level_low = FP_ZERO; | ||||||
|  |         hyst_config.off = m_voltage_level_off; | ||||||
|  |         hyst_config.on = m_voltage_level_on; | ||||||
|  |         m_voltage_relay.configure(hyst_config); | ||||||
|  | 
 | ||||||
|  |         FLTSYSLIB::FTimerConfiguration tm_config; | ||||||
|  |         tm_config.period = config.delay_off_timer; | ||||||
|  |         m_delay_off_timer.configure(tm_config); | ||||||
|  |         tm_config.period = config.control_state_timer; | ||||||
|  |         m_control_state_timer.configure(tm_config); | ||||||
|  | 
 | ||||||
|  |         status &= m_voltage_relay.compare(FLTSYSLIB::Hysteresis::OPERATIONAL); | ||||||
|  |         status &= m_delay_off_timer.compare(FLTSYSLIB::FTimer::OPERATIONAL); | ||||||
|  |         status &= m_control_state_timer.compare(FLTSYSLIB::FTimer::OPERATIONAL); | ||||||
|  | 
 | ||||||
|  |         if(status) | ||||||
|  |         { | ||||||
|  |             m_mode = SYSCTRL::FanControl::OPERATIONAL; | ||||||
|  |             _execute = &SYSCTRL::FanControl::_execute_undef; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//configure()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | SYSCTRL::FanControl::mode_t FanControl::get_mode() | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//get_mode()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool FanControl::compare(SYSCTRL::FanControl::mode_t mode) | ||||||
|  | { | ||||||
|  |     return m_mode == mode; | ||||||
|  |     //
 | ||||||
|  | }//compare()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | Uint16 FanControl::get_km11_control() | ||||||
|  | { | ||||||
|  |     return m_km11_control; | ||||||
|  |     //
 | ||||||
|  | }//get_km11_control()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | Uint16 FanControl::get_km11t_control() | ||||||
|  | { | ||||||
|  |     return m_km11t_control; | ||||||
|  |     //
 | ||||||
|  | }//get_km11t_control()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool FanControl::is_on() | ||||||
|  | { | ||||||
|  |     return m_fan_state; | ||||||
|  |     //
 | ||||||
|  | }//is_on()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool FanControl::is_off() | ||||||
|  | { | ||||||
|  |     return !m_fan_state; | ||||||
|  |     //
 | ||||||
|  | }//is_off()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool FanControl::is_fault() | ||||||
|  | { | ||||||
|  |     return m_fault; | ||||||
|  |     //
 | ||||||
|  | }//get_fault()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FanControl::execute(float voltage, FLTSYSLIB::DigitalInput& aux_km) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(voltage, aux_km); | ||||||
|  |     //
 | ||||||
|  | }//execute()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FanControl::_execute_undef(float voltage, FLTSYSLIB::DigitalInput& aux_km) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  | }//_execute_undef()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FanControl::_execute_operational(float voltage, FLTSYSLIB::DigitalInput& aux_km) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_fan_state = aux_km.is_on(); | ||||||
|  |     m_voltage_relay.execute(voltage); | ||||||
|  |     m_delay_off_timer.execute(); | ||||||
|  |     m_control_state_timer.execute(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(m_voltage_relay.is_on()) | ||||||
|  |     { | ||||||
|  |         m_km11_control = KM11_TURN_ON; | ||||||
|  |         m_km11t_control = KM11_TURN_OFF; | ||||||
|  |         m_delay_off_timer.reset(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if((m_delay_off_timer.is_running()) || (m_voltage_relay.is_switched_to_off())) | ||||||
|  |         { | ||||||
|  |             m_km11_control = KM11_TURN_OFF; | ||||||
|  |             m_km11t_control = KM11_TURN_ON; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |         if(m_voltage_relay.is_switched_to_off()) | ||||||
|  |         { | ||||||
|  |             m_delay_off_timer.start(); | ||||||
|  |         }//if
 | ||||||
|  | 
 | ||||||
|  |         if(m_delay_off_timer.is_finished()) | ||||||
|  |         { | ||||||
|  |             m_km11_control = KM11_TURN_OFF; | ||||||
|  |             m_km11t_control = KM11_TURN_OFF; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//_execute_operational()
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,85 @@ | |||||||
|  | /*
 | ||||||
|  |  * FanControl.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | #include "DSP2833x_Device.h" | ||||||
|  | 
 | ||||||
|  | #include "FLTSYSLIB/Hysteresis.h" | ||||||
|  | #include "FLTSYSLIB/DigitalInput.h" | ||||||
|  | #include "FLTSYSLIB/FTimer.h" | ||||||
|  | #include "FLTSYSLIB/Relay.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_FANCONTROL_H_ | ||||||
|  | #define SYSCTRL_FANCONTROL_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct FanControlConfiguration | ||||||
|  | { | ||||||
|  |     float delay_off_timer; | ||||||
|  |     float control_state_timer; | ||||||
|  |     float voltage_level_on; | ||||||
|  |     float voltage_level_off; | ||||||
|  |     FanControlConfiguration(): | ||||||
|  |         delay_off_timer(FP_ZERO), | ||||||
|  |         control_state_timer(FP_ZERO), | ||||||
|  |         voltage_level_on(FP_ZERO), | ||||||
|  |         voltage_level_off(FP_ZERO) | ||||||
|  |     {} | ||||||
|  |     //
 | ||||||
|  | };//FanControlConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class FanControl | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL}; | ||||||
|  | private: | ||||||
|  |     mode_t m_mode; | ||||||
|  | private: | ||||||
|  |     float m_time_sample; | ||||||
|  |     float m_contact_bounce_period; | ||||||
|  |     float m_voltage_level_on; | ||||||
|  |     float m_voltage_level_off; | ||||||
|  | private: | ||||||
|  |     Uint16 m_km11_control; | ||||||
|  |     Uint16 m_km11t_control; | ||||||
|  |     bool m_fan_state;// false - is off, true - is on
 | ||||||
|  |     bool m_fault; | ||||||
|  |     FLTSYSLIB::Hysteresis m_voltage_relay; | ||||||
|  |     FLTSYSLIB::FTimer m_delay_off_timer; | ||||||
|  |     FLTSYSLIB::FTimer m_control_state_timer; | ||||||
|  | public: | ||||||
|  |     FanControl(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const FanControlConfiguration& config); | ||||||
|  | public: | ||||||
|  |     mode_t get_mode(); | ||||||
|  |     bool compare(mode_t mode); | ||||||
|  | public: | ||||||
|  |     Uint16 get_km11_control(); | ||||||
|  |     Uint16 get_km11t_control(); | ||||||
|  |     bool is_on(); | ||||||
|  |     bool is_off(); | ||||||
|  |     bool is_fault(); | ||||||
|  | public: | ||||||
|  |     void execute(float voltage, FLTSYSLIB::DigitalInput& aux_km); | ||||||
|  | private: | ||||||
|  |     void (FanControl::*_execute)(float voltage, FLTSYSLIB::DigitalInput& aux_km); | ||||||
|  |     void _execute_undef(float voltage, FLTSYSLIB::DigitalInput& aux_km); | ||||||
|  |     void _execute_operational(float voltage, FLTSYSLIB::DigitalInput& aux_km); | ||||||
|  |     //
 | ||||||
|  | };//FanControl
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_FANCONTROL_H_ */ | ||||||
| @ -0,0 +1,135 @@ | |||||||
|  | /*
 | ||||||
|  |  * FanTimerControl.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/FanTimerControl.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | FanTimerControl::FanTimerControl(): | ||||||
|  |         m_mode(SYSCTRL::FanTimerControl::UNDEFINED), | ||||||
|  |         m_time_sample(-1.0), | ||||||
|  |         m_timer_counter(FP_ZERO), | ||||||
|  |         m_timer_period(FP_ZERO), | ||||||
|  |         m_state(false), | ||||||
|  |         _execute(&SYSCTRL::FanTimerControl::_execute_undef) | ||||||
|  | {}//
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void FanTimerControl::setup(float time_sample) | ||||||
|  | { | ||||||
|  |     if(m_mode == SYSCTRL::FanTimerControl::UNDEFINED) | ||||||
|  |     { | ||||||
|  |         if(time_sample >= FP_ZERO) | ||||||
|  |         { | ||||||
|  |             m_time_sample = time_sample; | ||||||
|  |             m_mode = SYSCTRL::FanTimerControl::CONFIGURATE; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void FanTimerControl::configure(const FanTimerControlConfiguration& config) | ||||||
|  | { | ||||||
|  |     if(compare(SYSCTRL::FanTimerControl::CONFIGURATE)) | ||||||
|  |     { | ||||||
|  |         if(config.timer_period > m_time_sample) | ||||||
|  |         { | ||||||
|  |             m_timer_period = config.timer_period; | ||||||
|  |             m_timer_counter = config.timer_period; | ||||||
|  |             m_mode = SYSCTRL::FanTimerControl::OPERATIONAL; | ||||||
|  |             _execute = &SYSCTRL::FanTimerControl::_execute_operational; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | FanTimerControl::mode_t FanTimerControl::get_mode() | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool FanTimerControl::compare(mode_t mode) | ||||||
|  | { | ||||||
|  |     return m_mode == mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool FanTimerControl::is_on() | ||||||
|  | { | ||||||
|  |     return m_state; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool FanTimerControl::is_off() | ||||||
|  | { | ||||||
|  |     return !m_state; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FanTimerControl::execute(bool is_switched_on, bool is_switched_off) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(is_switched_on, is_switched_off); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FanTimerControl::_execute_undef(bool is_switched_on, bool is_switched_off) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void FanTimerControl::_execute_operational(bool is_switched_on, bool is_switched_off) | ||||||
|  | { | ||||||
|  |     if(m_state) | ||||||
|  |     { | ||||||
|  |         // is on
 | ||||||
|  |         if(m_timer_counter >= FP_ZERO) | ||||||
|  |         { | ||||||
|  |             m_timer_counter -= m_time_sample; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             m_state = false; | ||||||
|  |             m_timer_counter = m_timer_period; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         // is off
 | ||||||
|  |         if(is_switched_off) | ||||||
|  |         { | ||||||
|  |             m_state = true; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             m_timer_counter = m_timer_period; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  |     if(is_switched_on) | ||||||
|  |     { | ||||||
|  |         m_state = false; | ||||||
|  |         m_timer_counter = m_timer_period; | ||||||
|  |     } | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,62 @@ | |||||||
|  | /*
 | ||||||
|  |  * FanTimerControl.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_FANTIMERCONTROL_H_ | ||||||
|  | #define SYSCTRL_FANTIMERCONTROL_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct FanTimerControlConfiguration | ||||||
|  | { | ||||||
|  |     float timer_period; | ||||||
|  |     FanTimerControlConfiguration(): | ||||||
|  |         timer_period(-1.0) | ||||||
|  |     {} | ||||||
|  |     //
 | ||||||
|  | };//FanTimerControlConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class FanTimerControl | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL}; | ||||||
|  | private: | ||||||
|  |     mode_t m_mode; | ||||||
|  | private: | ||||||
|  |     float m_time_sample; | ||||||
|  | private: | ||||||
|  |     float m_timer_counter; | ||||||
|  |     float m_timer_period; | ||||||
|  |     bool m_state; | ||||||
|  | public: | ||||||
|  |     FanTimerControl(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const FanTimerControlConfiguration& config); | ||||||
|  | public: | ||||||
|  |     mode_t get_mode(); | ||||||
|  |     bool compare(mode_t mode); | ||||||
|  | public: | ||||||
|  |     bool is_on(); | ||||||
|  |     bool is_off(); | ||||||
|  | public: | ||||||
|  |     void execute(bool is_switched_on, bool is_switched_off); | ||||||
|  | private: | ||||||
|  |     void (FanTimerControl::*_execute)(bool is_switched_on, bool is_switched_off); | ||||||
|  |     void _execute_undef(bool is_switched_on, bool is_switched_off); | ||||||
|  |     void _execute_operational(bool is_switched_on, bool is_switched_off); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_FANTIMERCONTROL_H_ */ | ||||||
| @ -0,0 +1,81 @@ | |||||||
|  | /*
 | ||||||
|  |  * GeneratorSymmetricalComponents.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/GeneratorSymmetricalComponents.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | GeneratorSymmetricalComponents::GeneratorSymmetricalComponents(): | ||||||
|  |         m_amplitude(), | ||||||
|  |         m_phase(), | ||||||
|  |         m_ort_direct_alpha(FP_ZERO), | ||||||
|  |         m_ort_direct_beta(FP_ZERO), | ||||||
|  |         m_ort_inverse_alpha(FP_ZERO), | ||||||
|  |         m_ort_inverse_beta(FP_ZERO), | ||||||
|  |         m_direct_alpha(FP_ZERO), | ||||||
|  |         m_direct_beta(FP_ZERO), | ||||||
|  |         m_inverse_alpha(FP_ZERO), | ||||||
|  |         m_inverse_beta(FP_ZERO), | ||||||
|  |         m_direct_a(FP_ZERO), | ||||||
|  |         m_direct_b(FP_ZERO), | ||||||
|  |         m_direct_c(FP_ZERO), | ||||||
|  |         m_inverse_a(FP_ZERO), | ||||||
|  |         m_inverse_b(FP_ZERO), | ||||||
|  |         m_inverse_c(FP_ZERO), | ||||||
|  |         m_out_a(FP_ZERO), | ||||||
|  |         m_out_b(FP_ZERO), | ||||||
|  |         m_out_c(FP_ZERO) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void GeneratorSymmetricalComponents::configure(GeneratorSymmetricalComponentsConfiguration& config) | ||||||
|  | { | ||||||
|  |     m_amplitude = config.amplitude; | ||||||
|  |     m_phase = config.phase; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void GeneratorSymmetricalComponents::execute(float ort_alpha, float ort_beta) | ||||||
|  | { | ||||||
|  |     m_phase.direct.cos_phase = cosf(m_phase.direct.phase); | ||||||
|  |     m_phase.direct.sin_phase = sinf(m_phase.direct.phase); | ||||||
|  |     m_phase.inverse.cos_phase = cosf(m_phase.inverse.phase); | ||||||
|  |     m_phase.inverse.sin_phase = sinf(m_phase.inverse.phase); | ||||||
|  |     //
 | ||||||
|  |     m_ort_direct_alpha = ort_alpha * m_phase.direct.cos_phase - ort_beta * m_phase.direct.sin_phase; | ||||||
|  |     m_ort_direct_beta = ort_alpha * m_phase.direct.sin_phase + ort_beta * m_phase.direct.cos_phase; | ||||||
|  |     //
 | ||||||
|  |     m_ort_inverse_alpha = ort_alpha * m_phase.inverse.cos_phase + ort_beta * m_phase.inverse.sin_phase; | ||||||
|  |     m_ort_inverse_beta = ort_alpha * m_phase.inverse.sin_phase - ort_beta * m_phase.inverse.cos_phase; | ||||||
|  |     //
 | ||||||
|  |     FLTSYSLIB::Transformation::park_inverse(m_ort_direct_alpha, m_ort_direct_beta, m_amplitude.direct.d, m_amplitude.direct.q, m_direct_alpha, m_direct_beta); | ||||||
|  |     FLTSYSLIB::Transformation::park_inverse(m_ort_inverse_alpha, m_ort_inverse_beta, m_amplitude.inverse.d, m_amplitude.inverse.q, m_inverse_alpha, m_inverse_beta); | ||||||
|  |     FLTSYSLIB::Transformation::clarke_inverse(m_direct_alpha, m_direct_beta, m_direct_a, m_direct_b, m_direct_c); | ||||||
|  |     FLTSYSLIB::Transformation::clarke_inverse(m_inverse_alpha, m_inverse_beta, m_inverse_a, m_inverse_b, m_inverse_c); | ||||||
|  |     //
 | ||||||
|  |     m_out_a = m_direct_a + m_inverse_a + m_amplitude.zero_a; | ||||||
|  |     m_out_b = m_direct_b + m_inverse_b + m_amplitude.zero_b; | ||||||
|  |     m_out_c = m_direct_c + m_inverse_c + m_amplitude.zero_c; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void GeneratorSymmetricalComponents::get_output(float& out_a, float& out_b, float& out_c) | ||||||
|  | { | ||||||
|  |     out_a = m_out_a; | ||||||
|  |     out_b = m_out_b; | ||||||
|  |     out_c = m_out_c; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,123 @@ | |||||||
|  | /*
 | ||||||
|  |  * GeneratorSymmetricalComponents.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_GENERATORSYMMETRICALCOMPONENTS_H_ | ||||||
|  | #define SYSCTRL_GENERATORSYMMETRICALCOMPONENTS_H_ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //#include "SYSCTRL/HeadersFLTSYSLIB.h"
 | ||||||
|  | #include "FLTSYSLIB/Transformation.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct GeneratorPhase | ||||||
|  | { | ||||||
|  |     float phase; | ||||||
|  |     float cos_phase; | ||||||
|  |     float sin_phase; | ||||||
|  |     GeneratorPhase(): | ||||||
|  |         phase(FP_ZERO), | ||||||
|  |         cos_phase(FP_ZERO), | ||||||
|  |         sin_phase(FP_ZERO) | ||||||
|  |     {} | ||||||
|  | };//GeneratorPhase
 | ||||||
|  | 
 | ||||||
|  | struct GeneratorSymmetricalComponentsPhase | ||||||
|  | { | ||||||
|  |     GeneratorPhase direct; | ||||||
|  |     GeneratorPhase inverse; | ||||||
|  |     GeneratorSymmetricalComponentsPhase(): | ||||||
|  |         direct(), | ||||||
|  |         inverse() | ||||||
|  |     {} | ||||||
|  | };//GeneratorSymmetricalComponentsPhase
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct GeneratorAmplitude | ||||||
|  | { | ||||||
|  |     float d; | ||||||
|  |     float q; | ||||||
|  |     GeneratorAmplitude(): | ||||||
|  |         d(FP_ZERO), | ||||||
|  |         q(FP_ZERO) | ||||||
|  |     {} | ||||||
|  | };//GeneratorAmplitude
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct GeneratorSymmetricalComponentsAmplitude | ||||||
|  | { | ||||||
|  |     GeneratorAmplitude direct; | ||||||
|  |     GeneratorAmplitude inverse; | ||||||
|  |     float zero_a; | ||||||
|  |     float zero_b; | ||||||
|  |     float zero_c; | ||||||
|  |     GeneratorSymmetricalComponentsAmplitude(): | ||||||
|  |         direct(), | ||||||
|  |         inverse(), | ||||||
|  |         zero_a(FP_ZERO), | ||||||
|  |         zero_b(FP_ZERO), | ||||||
|  |         zero_c(FP_ZERO) | ||||||
|  |     {} | ||||||
|  | };//GeneratorSymmetricalComponentsAmplitude
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct GeneratorSymmetricalComponentsConfiguration | ||||||
|  | { | ||||||
|  |     GeneratorSymmetricalComponentsAmplitude amplitude; | ||||||
|  |     GeneratorSymmetricalComponentsPhase phase; | ||||||
|  |     GeneratorSymmetricalComponentsConfiguration(): | ||||||
|  |         amplitude(), | ||||||
|  |         phase() | ||||||
|  |     {} | ||||||
|  | };//GeneratorSymmetricalComponentsConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class GeneratorSymmetricalComponents | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     GeneratorSymmetricalComponentsAmplitude m_amplitude; | ||||||
|  |     GeneratorSymmetricalComponentsPhase m_phase; | ||||||
|  | private: | ||||||
|  |     float m_ort_direct_alpha; | ||||||
|  |     float m_ort_direct_beta; | ||||||
|  |     float m_ort_inverse_alpha; | ||||||
|  |     float m_ort_inverse_beta; | ||||||
|  | private: | ||||||
|  |     float m_direct_alpha; | ||||||
|  |     float m_direct_beta; | ||||||
|  |     float m_inverse_alpha; | ||||||
|  |     float m_inverse_beta; | ||||||
|  | private: | ||||||
|  |     float m_direct_a; | ||||||
|  |     float m_direct_b; | ||||||
|  |     float m_direct_c; | ||||||
|  |     float m_inverse_a; | ||||||
|  |     float m_inverse_b; | ||||||
|  |     float m_inverse_c; | ||||||
|  | private: | ||||||
|  |     float m_out_a; | ||||||
|  |     float m_out_b; | ||||||
|  |     float m_out_c; | ||||||
|  | public: | ||||||
|  |     GeneratorSymmetricalComponents(); | ||||||
|  | public: | ||||||
|  |     void configure(GeneratorSymmetricalComponentsConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void execute(float ort_alpha, float ort_beta); | ||||||
|  |     void get_output(float& out_a, float& out_b, float& out_c); | ||||||
|  | };//GeneratorSymmetricalComponents
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_GENERATORSYMMETRICALCOMPONENTS_H_ */ | ||||||
| @ -0,0 +1,243 @@ | |||||||
|  | /*
 | ||||||
|  |  * CELL.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/HVCELL.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | HVCELL::HVCELL(): | ||||||
|  |         m_mode(SYSCTRL::HVCELL::UNDEFINED), | ||||||
|  |         m_control_order(ORDER_STOP), | ||||||
|  |         //m_switching_freq(SWITCHING_FREQ_2500),
 | ||||||
|  |         m_cell_level(0), | ||||||
|  |         m_cell_error(0), | ||||||
|  |         m_pwm_version(), | ||||||
|  |         m_cell_state(), | ||||||
|  |         m_cell_dc_voltage(), | ||||||
|  |         m_cell_version(), | ||||||
|  |         m_cpu_cpld_version(0), | ||||||
|  |         m_data_u(FP_ZERO), | ||||||
|  |         m_data_v(FP_ZERO), | ||||||
|  |         m_data_w(FP_ZERO), | ||||||
|  |         //
 | ||||||
|  |         m_dc_voltage_a(FP_ZERO), | ||||||
|  |         m_dc_voltage_b(FP_ZERO), | ||||||
|  |         m_dc_voltage_c(FP_ZERO), | ||||||
|  |         //
 | ||||||
|  |         m_fault_cell(false), | ||||||
|  |         m_cell_error_fault(0), | ||||||
|  |         m_cell_state_fault(), | ||||||
|  |         //
 | ||||||
|  |         p_send_syn_signal(&SYSCTRL::HVCELL::_empty), | ||||||
|  |         p_send_control_order(&SYSCTRL::HVCELL::_empty), | ||||||
|  |         p_set_cell_level(&SYSCTRL::HVCELL::_empty), | ||||||
|  |         p_get_pwm_version(&SYSCTRL::HVCELL::_empty), | ||||||
|  |         p_get_cell_state(&SYSCTRL::HVCELL::_empty), | ||||||
|  |         p_get_cell_dc_voltage(&SYSCTRL::HVCELL::_empty), | ||||||
|  |         p_get_cell_version(&SYSCTRL::HVCELL::_empty), | ||||||
|  |         p_send_modulate_data(&SYSCTRL::HVCELL::_empty), | ||||||
|  |         p_get_cpu_cpld_version(&SYSCTRL::HVCELL::_empty) | ||||||
|  | {} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::configure(HVCELLConfiguration& config) | ||||||
|  | { | ||||||
|  |     static bool status = true; | ||||||
|  |     if(m_mode == SYSCTRL::HVCELL::UNDEFINED) | ||||||
|  |     { | ||||||
|  | 
 | ||||||
|  |         m_cell_level = config.cell_level; | ||||||
|  |         //m_switching_freq = config.switching_freq;
 | ||||||
|  | 
 | ||||||
|  |         status &= (m_cell_level >=  1)&&(m_cell_level <=  8) ? true : false; | ||||||
|  | 
 | ||||||
|  |         if(status) | ||||||
|  |         { | ||||||
|  |             m_mode = SYSCTRL::HVCELL::OPERATIONAL; | ||||||
|  |             //
 | ||||||
|  |             p_send_syn_signal = &SYSCTRL::HVCELL::_send_syn_signal; | ||||||
|  |             p_send_control_order = &SYSCTRL::HVCELL::_send_control_order; | ||||||
|  |             p_set_cell_level = &SYSCTRL::HVCELL::_set_cell_level; | ||||||
|  |             p_get_pwm_version = &SYSCTRL::HVCELL::_get_pwm_version; | ||||||
|  |             p_get_cell_state = &SYSCTRL::HVCELL::_get_cell_state; | ||||||
|  |             p_get_cell_dc_voltage = &SYSCTRL::HVCELL::_get_cell_dc_voltage; | ||||||
|  |             p_get_cell_version = &SYSCTRL::HVCELL::_get_cell_version; | ||||||
|  |             p_send_modulate_data = &SYSCTRL::HVCELL::_send_modulate_data; | ||||||
|  |             p_get_cpu_cpld_version = &SYSCTRL::HVCELL::_get_cpu_cpld_version; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//configure()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | SYSCTRL::HVCELL::mode_t HVCELL::get_mode() | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//get_mode()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool HVCELL::compare(SYSCTRL::HVCELL::mode_t mode) | ||||||
|  | { | ||||||
|  |     return m_mode == mode; | ||||||
|  |     //
 | ||||||
|  | }//compare()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::send_syn_signal() | ||||||
|  | { | ||||||
|  |     (this->*p_send_syn_signal)(); | ||||||
|  |     //
 | ||||||
|  | }//send_syn_signal()
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_send_syn_signal() | ||||||
|  | { | ||||||
|  |     sendSynSignal(); | ||||||
|  |     //
 | ||||||
|  | }//_send_syn_signal()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::send_control_order() | ||||||
|  | { | ||||||
|  |     (this->*p_send_control_order)(); | ||||||
|  |     //
 | ||||||
|  | }//send_control_order_start()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_send_control_order() | ||||||
|  | { | ||||||
|  |     sendControlOrder(m_control_order); | ||||||
|  |     //
 | ||||||
|  | }//_send_control_order()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::set_cell_level() | ||||||
|  | { | ||||||
|  |     (this->*p_set_cell_level)(); | ||||||
|  |     //
 | ||||||
|  | }//set_cell_level()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_set_cell_level() | ||||||
|  | { | ||||||
|  |     //m_cell_error = setCellLevel(m_cell_level, m_switching_freq);
 | ||||||
|  |     m_cell_error = setCellLevel(m_cell_level); | ||||||
|  |     //
 | ||||||
|  | }//_set_cell_level()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::get_pwm_version() | ||||||
|  | { | ||||||
|  |     (this->*p_get_pwm_version)(); | ||||||
|  |     //
 | ||||||
|  | }//get_pwm_version()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_get_pwm_version() | ||||||
|  | { | ||||||
|  |     getPwmVersion(m_pwm_version); | ||||||
|  |     //
 | ||||||
|  | }//_get_pwm_version()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::get_cell_state() | ||||||
|  | { | ||||||
|  |     (this->*p_get_cell_state)(); | ||||||
|  |     //
 | ||||||
|  | }//get_cell_state()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_get_cell_state() | ||||||
|  | { | ||||||
|  |     getCellState(m_cell_level, m_cell_state); | ||||||
|  |     //
 | ||||||
|  | }//_get_cell_state()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::get_cell_dc_voltage() | ||||||
|  | { | ||||||
|  |     (this->*p_get_cell_dc_voltage)(); | ||||||
|  |     //
 | ||||||
|  | }//get_cell_dc_voltage()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_get_cell_dc_voltage() | ||||||
|  | { | ||||||
|  |     static float aux_a, aux_b, aux_c; | ||||||
|  | 
 | ||||||
|  |     getCellDCVoltage(m_cell_level, m_cell_dc_voltage); | ||||||
|  | 
 | ||||||
|  |     aux_a = FP_ZERO; | ||||||
|  |     aux_b = FP_ZERO; | ||||||
|  |     aux_c = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     for(Uint16 cellnum = 0; cellnum < m_cell_level; cellnum++) | ||||||
|  |     { | ||||||
|  |         aux_a += m_cell_dc_voltage[0][cellnum]; | ||||||
|  |         aux_b += m_cell_dc_voltage[1][cellnum]; | ||||||
|  |         aux_c += m_cell_dc_voltage[2][cellnum]; | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  |     m_dc_voltage_a = aux_a; | ||||||
|  |     m_dc_voltage_b = aux_b; | ||||||
|  |     m_dc_voltage_c = aux_c; | ||||||
|  |     //
 | ||||||
|  | }//_get_cell_dc_voltage()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::get_cell_version() | ||||||
|  | { | ||||||
|  |     (this->*p_get_cell_version)(); | ||||||
|  |     //
 | ||||||
|  | }//get_cell_version()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_get_cell_version() | ||||||
|  | { | ||||||
|  |     getCellVersion(m_cell_level, m_cell_version); | ||||||
|  |     //
 | ||||||
|  | }//get_cell_version()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::send_modulate_data() | ||||||
|  | { | ||||||
|  |     (this->*p_send_modulate_data)(); | ||||||
|  |     //
 | ||||||
|  | }//send_modulate_data()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_send_modulate_data() | ||||||
|  | { | ||||||
|  |     //sendModulateData(m_data_u, m_data_v, m_data_w, m_switching_freq);
 | ||||||
|  |     sendModulateData(m_data_u, m_data_v, m_data_w); | ||||||
|  |     //
 | ||||||
|  | }//_send_modulate_data()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::get_cpu_cpld_version() | ||||||
|  | { | ||||||
|  |     (this->*p_get_cpu_cpld_version)(); | ||||||
|  |     //
 | ||||||
|  | }//get_cpu_cpld_version()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_get_cpu_cpld_version() | ||||||
|  | { | ||||||
|  |     m_cpu_cpld_version = getCpuCpldVersion(); | ||||||
|  |     //
 | ||||||
|  | }//_get_cpu_cpld_version()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HVCELL::_empty() | ||||||
|  | {}//_empty()
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,100 @@ | |||||||
|  | /*
 | ||||||
|  |  * HVCELL.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File | ||||||
|  | #include "DSP2833x_Examples.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_HVCELL_H_ | ||||||
|  | #define SYSCTRL_HVCELL_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | struct HVCELLConfiguration | ||||||
|  | { | ||||||
|  |     Uint16 cell_level; | ||||||
|  |     //UnitSwitchingFreq switching_freq;
 | ||||||
|  |     HVCELLConfiguration(): | ||||||
|  |         cell_level(0) | ||||||
|  |         //switching_freq(SWITCHING_FREQ_2500)
 | ||||||
|  |     {} | ||||||
|  | };//HVCELLConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class HVCELL | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL}; | ||||||
|  | private: | ||||||
|  |     mode_t m_mode; | ||||||
|  | private: | ||||||
|  |     ControlOrder m_control_order; | ||||||
|  |     //UnitSwitchingFreq m_switching_freq;
 | ||||||
|  |     Uint16      m_cell_level; | ||||||
|  |     Uint16      m_cell_error; | ||||||
|  |     Uint16      m_pwm_version[3]; | ||||||
|  |     CellState   m_cell_state[3][13]; | ||||||
|  |     float       m_cell_dc_voltage[3][13]; | ||||||
|  |     Uint16      m_cell_version[3][13]; | ||||||
|  |     Uint32      m_cpu_cpld_version; | ||||||
|  |     float       m_data_u; | ||||||
|  |     float       m_data_v; | ||||||
|  |     float       m_data_w; | ||||||
|  | private: | ||||||
|  |     float       m_dc_voltage_a; | ||||||
|  |     float       m_dc_voltage_b; | ||||||
|  |     float       m_dc_voltage_c; | ||||||
|  |     bool        m_fault_cell; | ||||||
|  |     Uint16      m_cell_error_fault; | ||||||
|  |     CellState   m_cell_state_fault[3][13]; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     HVCELL(); | ||||||
|  |     void configure(HVCELLConfiguration& config); | ||||||
|  |     mode_t get_mode(); | ||||||
|  |     bool compare(mode_t mode); | ||||||
|  | public: | ||||||
|  |     void send_syn_signal(); | ||||||
|  |     void send_control_order(); | ||||||
|  |     void set_cell_level(); | ||||||
|  |     void get_pwm_version(); | ||||||
|  |     void get_cell_state(); | ||||||
|  |     void get_cell_dc_voltage(); | ||||||
|  |     void get_cell_version(); | ||||||
|  |     void send_modulate_data(); | ||||||
|  |     void get_cpu_cpld_version(); | ||||||
|  | private: | ||||||
|  |     void (HVCELL::*p_send_syn_signal)(); | ||||||
|  |     void _send_syn_signal(); | ||||||
|  |     void (HVCELL::*p_send_control_order)(); | ||||||
|  |     void _send_control_order(); | ||||||
|  |     void (HVCELL::*p_set_cell_level)(); | ||||||
|  |     void _set_cell_level(); | ||||||
|  |     void (HVCELL::*p_get_pwm_version)(); | ||||||
|  |     void _get_pwm_version(); | ||||||
|  |     void (HVCELL::*p_get_cell_state)(); | ||||||
|  |     void _get_cell_state(); | ||||||
|  |     void (HVCELL::*p_get_cell_dc_voltage)(); | ||||||
|  |     void _get_cell_dc_voltage(); | ||||||
|  |     void (HVCELL::*p_get_cell_version)(); | ||||||
|  |     void _get_cell_version(); | ||||||
|  |     void (HVCELL::*p_send_modulate_data)(); | ||||||
|  |     void _send_modulate_data(); | ||||||
|  |     void (HVCELL::*p_get_cpu_cpld_version)(); | ||||||
|  |     void _get_cpu_cpld_version(); | ||||||
|  |     void _empty(); | ||||||
|  |     //
 | ||||||
|  | };//class HVCELL
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_HVCELL_H_ */ | ||||||
| @ -0,0 +1,238 @@ | |||||||
|  | /*
 | ||||||
|  |  * HardWare.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/HardWare.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | HardWare::HardWare(): | ||||||
|  |         enable(true), | ||||||
|  |         fault(false), | ||||||
|  |         fault_low_level(false), | ||||||
|  |         level((Uint16)0), | ||||||
|  |         error((Uint16)0), | ||||||
|  |         //switching_freq(SWITCHING_FREQ_2500),
 | ||||||
|  |         dc_voltage_low_level(500.0), | ||||||
|  |         control_order_cell(ORDER_STOP), | ||||||
|  |         ref_control_order(ORDER_STOP), | ||||||
|  |         pwm_version(), | ||||||
|  |         cpu_cpld_version((Uint32)0), | ||||||
|  |         hvcell(), | ||||||
|  |         disable_hw(), | ||||||
|  |         disable_a_cells(), | ||||||
|  |         disable_b_cells(), | ||||||
|  |         disable_c_cells(), | ||||||
|  |         version_default() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     for(Uint16 phase = 0; phase < 3; phase++) | ||||||
|  |     { | ||||||
|  |         for(Uint16 cellnum = 0; cellnum < 13; cellnum++) | ||||||
|  |             { | ||||||
|  |                 hvcell.dc_voltage[phase][cellnum] = FP_ZERO; | ||||||
|  |                 hvcell.state[phase][cellnum].all = 0; | ||||||
|  |                 hvcell.version[phase][cellnum] = 0; | ||||||
|  |                 //
 | ||||||
|  |             }//for
 | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  | }//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void HardWare::configure(const HardWareConfiguration config) | ||||||
|  | { | ||||||
|  |     //switching_freq = config.switching_freq;
 | ||||||
|  |     level = config.cell_level; | ||||||
|  |     version_default = config.version; | ||||||
|  |     disable_hw.all = (uint16_t)0; | ||||||
|  |     disable_a_cells.all = (uint32_t)0; | ||||||
|  |     disable_b_cells.all = (uint32_t)0; | ||||||
|  |     disable_c_cells.all = (uint32_t)0; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HardWare::check_status() | ||||||
|  | { | ||||||
|  |     if(cpu_cpld_version != version_default.cpu_cpld) | ||||||
|  |     { | ||||||
|  |         disable_hw.bits.cpu_cpld = 1; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         disable_hw.bits.cpu_cpld = 0; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  |     if(pwm_version[0] != version_default.pwm) | ||||||
|  |     { | ||||||
|  |         disable_hw.bits.pwm_a = 1; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         disable_hw.bits.pwm_a = 0; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  |     if(pwm_version[1] != version_default.pwm) | ||||||
|  |     { | ||||||
|  |         disable_hw.bits.pwm_b = 1; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         disable_hw.bits.pwm_b = 0; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  |     if(pwm_version[2] != version_default.pwm) | ||||||
|  |     { | ||||||
|  |         disable_hw.bits.pwm_c = 1; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         disable_hw.bits.pwm_c = 0; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  | 
 | ||||||
|  |     static uint32_t mask = (uint32_t)0; | ||||||
|  |     static uint32_t auxreg_0 = (uint32_t)0; | ||||||
|  |     static uint32_t auxreg_1 = (uint32_t)0; | ||||||
|  |     static uint32_t auxreg_2 = (uint32_t)0; | ||||||
|  |     auxreg_0 = (uint32_t)0; | ||||||
|  |     auxreg_1 = (uint32_t)0; | ||||||
|  |     auxreg_2 = (uint32_t)0; | ||||||
|  |     for(Uint16 cellnum = 0; cellnum < level; cellnum++) | ||||||
|  |     { | ||||||
|  |         mask = (uint32_t)0; | ||||||
|  |         if(hvcell.version[0][cellnum] != version_default.cell) | ||||||
|  |         { | ||||||
|  |             mask = (uint32_t)0; | ||||||
|  |             mask = 1 << (cellnum); | ||||||
|  |             auxreg_0 |= mask; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             mask = (uint32_t)0; | ||||||
|  |             mask = 1 << (cellnum); | ||||||
|  |             mask = (uint32_t)((uint32_t)0xFFFFFFFF ^ (uint32_t)mask); | ||||||
|  |             auxreg_0 &= mask; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |         mask = (uint32_t)0; | ||||||
|  |         if(hvcell.version[1][cellnum] != version_default.cell) | ||||||
|  |         { | ||||||
|  |             mask = 1 << (cellnum); | ||||||
|  |             auxreg_1 |= mask; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             mask = 1 << (cellnum); | ||||||
|  |             mask = (uint32_t)((uint32_t)0xFFFFFFFF ^ (uint32_t)mask); | ||||||
|  |             auxreg_1 &= mask; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |         mask = (uint32_t)0; | ||||||
|  |         if(hvcell.version[2][cellnum] != version_default.cell) | ||||||
|  |         { | ||||||
|  |             mask = 1 << (cellnum); | ||||||
|  |             auxreg_2 |= mask; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             mask = 1 << (cellnum); | ||||||
|  |             mask = (uint32_t)((uint32_t)0xFFFFFFFF ^ (uint32_t)mask); | ||||||
|  |             auxreg_2 &= mask; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  |     disable_a_cells.all = (uint32_t)auxreg_0; | ||||||
|  |     disable_c_cells.all = (uint32_t)auxreg_1; | ||||||
|  |     disable_b_cells.all = (uint32_t)auxreg_2; | ||||||
|  |     //
 | ||||||
|  |     static bool tmp_enable = true; | ||||||
|  |     tmp_enable = true; | ||||||
|  | //    tmp_enable &= disable_hw.all == 0 ? true : false;
 | ||||||
|  | //    tmp_enable &= disable_a_cells.all == 0 ? true : false;
 | ||||||
|  | //    tmp_enable &= disable_b_cells.all == 0 ? true : false;
 | ||||||
|  | //    tmp_enable &= disable_c_cells.all == 0 ? true : false;
 | ||||||
|  |     enable = tmp_enable; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool HardWare::is_enable() | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     return enable; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HardWare::check_faults(mode_fault_t fmode) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     for(Uint16 cellnum = 0; cellnum < level; cellnum++) | ||||||
|  |     { | ||||||
|  |         for(Uint16 phasenum = 0; phasenum < 3; phasenum++) | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  |             if(SYSCTRL::HardWare::COMPLETE == fmode) | ||||||
|  |             { | ||||||
|  |                 if(((Uint16)(MASK_CELL_STATE_FAULTS & hvcell.state[phasenum][cellnum].all)) != (Uint16)0) | ||||||
|  |                 { | ||||||
|  |                     fault = true; | ||||||
|  |                     //
 | ||||||
|  |                 }//
 | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 if(((Uint16)(MASK_CELL_STATE_FAULTS_SHORT & hvcell.state[phasenum][cellnum].all)) != (Uint16)0) | ||||||
|  |                 { | ||||||
|  |                     fault = true; | ||||||
|  |                     //
 | ||||||
|  |                 }//
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if(((Uint16)(MASK_CELL_LOW_LEVEL & hvcell.state[phasenum][cellnum].all)) != (Uint16)0) | ||||||
|  |             { | ||||||
|  |                 fault_low_level = true; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //
 | ||||||
|  |         };//for
 | ||||||
|  |         //
 | ||||||
|  |     }//for
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool HardWare::is_fault() | ||||||
|  | { | ||||||
|  |     return fault; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | bool HardWare::low_level() | ||||||
|  | { | ||||||
|  |     return fault_low_level; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void HardWare::reset() | ||||||
|  | { | ||||||
|  |     fault = false; | ||||||
|  |     fault_low_level = false; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,194 @@ | |||||||
|  | /*
 | ||||||
|  |  * HardWare.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "framework.h" | ||||||
|  | #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File | ||||||
|  | #include "DSP2833x_Examples.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_HARDWARE_H_ | ||||||
|  | #define SYSCTRL_HARDWARE_H_ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #define MASK_CELL_STATE_DOWN_COMM     (Uint16)0x0001 | ||||||
|  | #define MASK_CELL_STATE_UP_COMM       (Uint16)0x0002 | ||||||
|  | #define MASK_CELL_STATE_RESERVED_1    (Uint16)0x0004 | ||||||
|  | #define MASK_CELL_STATE_RUNNING       (Uint16)0x0008 | ||||||
|  | //
 | ||||||
|  | #define MASK_CELL_STATE_IGBT4_FAULT   (Uint16)0x0010 | ||||||
|  | #define MASK_CELL_STATE_IGBT3_FAULT   (Uint16)0x0020 | ||||||
|  | #define MASK_CELL_STATE_IGBT2_FAULT   (Uint16)0x0040 | ||||||
|  | #define MASK_CELL_STATE_IGBT1_FAULT   (Uint16)0x0080 | ||||||
|  | //
 | ||||||
|  | #define MASK_CELL_STATE_RESERVED_2    (Uint16)0x0100 | ||||||
|  | #define MASK_CELL_STATE_TEMP_OVER     (Uint16)0x0200 | ||||||
|  | #define MASK_CELL_STATE_UNDER_VOLTAGE (Uint16)0x0400 | ||||||
|  | #define MASK_CELL_STATE_OVER_VOLTAGE  (Uint16)0x0800 | ||||||
|  | //
 | ||||||
|  | #define MASK_CELL_STATE_RESERVED_3    (Uint16)0x0F800 | ||||||
|  | 
 | ||||||
|  | #define MASK_CELL_STATE_FAULTS        (Uint16)(MASK_CELL_STATE_DOWN_COMM   |\ | ||||||
|  |                                       MASK_CELL_STATE_UP_COMM     |\ | ||||||
|  |                                       MASK_CELL_STATE_IGBT4_FAULT |\ | ||||||
|  |                                       MASK_CELL_STATE_IGBT3_FAULT |\ | ||||||
|  |                                       MASK_CELL_STATE_IGBT2_FAULT |\ | ||||||
|  |                                       MASK_CELL_STATE_IGBT1_FAULT |\ | ||||||
|  |                                       MASK_CELL_STATE_TEMP_OVER   |\ | ||||||
|  |                                       MASK_CELL_STATE_UNDER_VOLTAGE |\ | ||||||
|  |                                       MASK_CELL_STATE_OVER_VOLTAGE) | ||||||
|  | 
 | ||||||
|  | #define MASK_CELL_STATE_FAULTS_SHORT  (Uint16)(MASK_CELL_STATE_IGBT4_FAULT |\ | ||||||
|  |                                       MASK_CELL_STATE_IGBT3_FAULT |\ | ||||||
|  |                                       MASK_CELL_STATE_IGBT2_FAULT |\ | ||||||
|  |                                       MASK_CELL_STATE_IGBT1_FAULT |\ | ||||||
|  |                                       MASK_CELL_STATE_TEMP_OVER   |\ | ||||||
|  |                                       MASK_CELL_STATE_OVER_VOLTAGE) | ||||||
|  | 
 | ||||||
|  | #define MASK_CELL_LOW_LEVEL           (Uint16)(MASK_CELL_STATE_DOWN_COMM |\ | ||||||
|  |                                       MASK_CELL_STATE_UP_COMM |\ | ||||||
|  |                                       MASK_CELL_STATE_UNDER_VOLTAGE) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct HardWareVersion | ||||||
|  | { | ||||||
|  |     uint16_t      pwm; | ||||||
|  |     uint16_t      cell; | ||||||
|  |     uint32_t      cpu_cpld; | ||||||
|  |     HardWareVersion(): | ||||||
|  |         pwm(uint16_t(0)), | ||||||
|  |         cell(uint16_t(0)), | ||||||
|  |         cpu_cpld(uint32_t(0)) | ||||||
|  |     {} | ||||||
|  | };//HardWareVersion
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct HardWareConfiguration | ||||||
|  | { | ||||||
|  |     uint16_t      cell_level; | ||||||
|  |     //UnitSwitchingFreq switching_freq;
 | ||||||
|  |     SYSCTRL::HardWareVersion version; | ||||||
|  |     HardWareConfiguration(): | ||||||
|  |         cell_level(0), | ||||||
|  |         //switching_freq(SWITCHING_FREQ_2500),
 | ||||||
|  |         version() | ||||||
|  |     {} | ||||||
|  | };//HardWareConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct Cell | ||||||
|  | { | ||||||
|  |     CellState   state[3][13]; | ||||||
|  |     float       dc_voltage[3][13]; | ||||||
|  |     uint16_t      version[3][13]; | ||||||
|  |     float       data_u; | ||||||
|  |     float       data_v; | ||||||
|  |     float       data_w; | ||||||
|  |     Cell(): | ||||||
|  |         state(), | ||||||
|  |         dc_voltage(), | ||||||
|  |         version(), | ||||||
|  |         data_u(FP_ZERO), | ||||||
|  |         data_v(FP_ZERO), | ||||||
|  |         data_w(FP_ZERO) | ||||||
|  |     {} | ||||||
|  | };//Cell
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct HVCellDisableBit | ||||||
|  | { | ||||||
|  |     uint32_t cell_1: 1; | ||||||
|  |     uint32_t cell_2: 1; | ||||||
|  |     uint32_t cell_3: 1; | ||||||
|  |     uint32_t cell_4: 1; | ||||||
|  |     uint32_t cell_5: 1; | ||||||
|  |     uint32_t cell_6: 1; | ||||||
|  |     uint32_t cell_7: 1; | ||||||
|  |     uint32_t cell_8: 1; | ||||||
|  |     uint32_t cell_9: 1; | ||||||
|  |     uint32_t cell_10: 1; | ||||||
|  |     uint32_t cell_11: 1; | ||||||
|  |     uint32_t cell_12: 1; | ||||||
|  |     uint32_t cell_13: 1; | ||||||
|  |     uint32_t cell_14: 1; | ||||||
|  |     uint32_t cell_15: 1; | ||||||
|  |     uint32_t cell_16: 1; | ||||||
|  |     uint32_t cell_17: 1; | ||||||
|  |     uint32_t cell_18: 1; | ||||||
|  | };//HVCellDisableBit
 | ||||||
|  | 
 | ||||||
|  | union HVCellDisableRegister | ||||||
|  | { | ||||||
|  |     uint32_t all; | ||||||
|  |     HVCellDisableBit bits; | ||||||
|  |     HVCellDisableRegister(): | ||||||
|  |         all((uint32_t)0) | ||||||
|  |     {} | ||||||
|  | };//HVCellDisableRegister
 | ||||||
|  | 
 | ||||||
|  | struct HardWareDisableBit | ||||||
|  | { | ||||||
|  |     uint16_t cpu_cpld: 1; | ||||||
|  |     uint16_t pwm_a: 1; | ||||||
|  |     uint16_t pwm_b: 1; | ||||||
|  |     uint16_t pwm_c: 1; | ||||||
|  | };//HardWareDisableBit
 | ||||||
|  | 
 | ||||||
|  | union HardWareDisableRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     HardWareDisableBit bits; | ||||||
|  |     HardWareDisableRegister(): | ||||||
|  |         all((uint16_t)0) | ||||||
|  |     {} | ||||||
|  | };//HardWareDisable
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class HardWare | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_fault_t {SHORT, COMPLETE}; | ||||||
|  | public: | ||||||
|  |     bool enable; | ||||||
|  |     bool fault; | ||||||
|  |     bool fault_low_level; | ||||||
|  |     //UnitSwitchingFreq switching_freq;
 | ||||||
|  |     float dc_voltage_low_level; | ||||||
|  |     uint16_t      level; | ||||||
|  |     uint16_t      error; | ||||||
|  |     ControlOrder control_order_cell; | ||||||
|  |     ControlOrder ref_control_order; | ||||||
|  |     uint16_t      pwm_version[3]; | ||||||
|  |     uint32_t      cpu_cpld_version; | ||||||
|  |     Cell        hvcell; | ||||||
|  |     HardWareDisableRegister disable_hw; | ||||||
|  |     HVCellDisableRegister disable_a_cells; | ||||||
|  |     HVCellDisableRegister disable_b_cells; | ||||||
|  |     HVCellDisableRegister disable_c_cells; | ||||||
|  |     HardWareVersion version_default; | ||||||
|  | public: | ||||||
|  |     HardWare(); | ||||||
|  |     void configure(const HardWareConfiguration config); | ||||||
|  |     void check_status(); | ||||||
|  |     void check_faults(mode_fault_t fmode); | ||||||
|  |     bool is_enable(); | ||||||
|  |     bool is_fault(); | ||||||
|  |     bool low_level(); | ||||||
|  |     void reset(); | ||||||
|  |     //
 | ||||||
|  | };//class HardWare
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_HARDWARE_H_ */ | ||||||
| @ -0,0 +1,358 @@ | |||||||
|  | /*
 | ||||||
|  |  * Hardcode.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/SystemControl.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | void SystemControl::get_hard_code_setup() | ||||||
|  | { | ||||||
|  |     m_system_setup.time_sample_control = 400.0e-6; | ||||||
|  |     m_system_setup.time_prescale_slow = 5; | ||||||
|  |     m_system_setup.time_prescale_additional = 1; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Relative
 | ||||||
|  |     //
 | ||||||
|  |     m_system_setup.relative_voltage_input.time_sample = m_system_setup.time_sample_control; | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  | }//hard_code_setup()
 | ||||||
|  | //
 | ||||||
|  | void SystemControl::upload_configuration() | ||||||
|  | { | ||||||
|  |     m_fram_db.upload_configuration(&m_system_configuration); | ||||||
|  |     //m_system_configuration.selfupdata();
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void SystemControl::get_hard_code_configuration() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // References
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.reference_current_limit_rms = 100.0; | ||||||
|  |     m_system_configuration.reference_current_pfc_rms = 0.0; | ||||||
|  |     m_system_configuration.reference_voltage_rms = 240.0; | ||||||
|  |     m_system_configuration.reference_voltage_dc = 900.0; | ||||||
|  | 
 | ||||||
|  |     m_system_configuration.algorithm_control.signal.enable_current_limit = true; | ||||||
|  |     m_system_configuration.algorithm_control.signal.enable_pfc = false; | ||||||
|  |     m_system_configuration.algorithm_control.signal.enable_harmonica = false; | ||||||
|  |     m_system_configuration.algorithm_control.signal.enable_auto_offset = true; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // High Voltage Cell
 | ||||||
|  |     //
 | ||||||
|  |     //m_system_configuration.hardware.switching_freq = SWITCHING_FREQ_2500;
 | ||||||
|  |     m_system_configuration.hardware.cell_level = 1; | ||||||
|  |     m_system_configuration.hardware.version.pwm = 210; | ||||||
|  |     m_system_configuration.hardware.version.cell = 211; | ||||||
|  |     m_system_configuration.hardware.version.cpu_cpld = 202; | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  |     m_system_configuration.minimal_input_voltage_level = 10.0; | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Scale Analog Signals
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.scale_voltage_input_a = 0.0227386411;//0.0233486816;
 | ||||||
|  |     m_system_configuration.scale_voltage_input_b = 0.0227597337;//0.0234651081;
 | ||||||
|  |     m_system_configuration.scale_voltage_input_c = 0.02278281;//0.0236082859;
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.scale_current_input_a = 0.00666328007; | ||||||
|  |     m_system_configuration.scale_current_input_b = 0.00667025521; | ||||||
|  |     m_system_configuration.scale_current_input_c = 0.00665952405; | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.scale_current_cell_a = 0.0123311505;//0.00665648002;
 | ||||||
|  |     m_system_configuration.scale_current_cell_b = 0.0123670474;//0.00667640707;
 | ||||||
|  |     m_system_configuration.scale_current_cell_c = 0.0124070868;//0.00666095456;
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.scale_voltage_load_a = 0.0227408651;//0.0232194811;
 | ||||||
|  |     m_system_configuration.scale_voltage_load_b = 0.0227707103;//0.0233941432;
 | ||||||
|  |     m_system_configuration.scale_voltage_load_c = 0.0229060184;//0.0234934501;
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.scale_current_load_a = 0.00622544903;//0.00668919506;
 | ||||||
|  |     m_system_configuration.scale_current_load_b = 0.00623486936;//0.00669770781;
 | ||||||
|  |     m_system_configuration.scale_current_load_c = 0.00624710508;//0.00670575583;
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.scale_current_bypass_a = 0.0063; | ||||||
|  |     m_system_configuration.scale_current_bypass_b = 0.0063; | ||||||
|  |     m_system_configuration.scale_current_bypass_c = 0.0063; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Amplitude Filter Parameters
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.ampl_filter_current.time = 20.0e-3; | ||||||
|  |     m_system_configuration.ampl_filter_current.a3 = 3.0; | ||||||
|  |     m_system_configuration.ampl_filter_current.a2 = 4.25; | ||||||
|  |     m_system_configuration.ampl_filter_current.a1 = 3.0; | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // RMS Filter Parameters
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.rms_filter_analog_signal.time = 10.0e-3; | ||||||
|  |     m_system_configuration.rms_filter_analog_signal.a3 = 3.0; | ||||||
|  |     m_system_configuration.rms_filter_analog_signal.a2 = 4.25; | ||||||
|  |     m_system_configuration.rms_filter_analog_signal.a1 = 3.0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Zero Drift Current Input
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.zero_filter.time = 1333.0e-3; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Cell DC Voltage Filter
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.cell_dc_voltage_filter.time = 3.0e-3; | ||||||
|  |     m_system_configuration.cell_dc_voltage_filter.a3 = 3.0; | ||||||
|  |     m_system_configuration.cell_dc_voltage_filter.a2 = 4.25; | ||||||
|  |     m_system_configuration.cell_dc_voltage_filter.a1 = 3.0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Signal Decompose
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.signal_decompose.projection_filter.time = 10.0e-3; | ||||||
|  |     m_system_configuration.signal_decompose.projection_filter.a3 = 2.61313;//3.0;
 | ||||||
|  |     m_system_configuration.signal_decompose.projection_filter.a2 = 3.41422;//4.25;
 | ||||||
|  |     m_system_configuration.signal_decompose.projection_filter.a1 = 2.61313;//3.0;
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Relative
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.relative_voltage_input.minimal_amplitude_level = 0.1; | ||||||
|  |     m_system_configuration.relative_voltage_input.limit_relative_high = 1.1; | ||||||
|  |     m_system_configuration.relative_voltage_input.limit_relative_low = -1.1; | ||||||
|  |     m_system_configuration.relative_voltage_input.amplitude_filter.time = (float)(1.0/2.0/FP_PI/10.0); | ||||||
|  |     m_system_configuration.relative_voltage_input.amplitude_filter.a3 = 3.0; | ||||||
|  |     m_system_configuration.relative_voltage_input.amplitude_filter.a2 = 4.25; | ||||||
|  |     m_system_configuration.relative_voltage_input.amplitude_filter.a1 = 3.0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Voltage PLL-ABC Parameters
 | ||||||
|  |     //
 | ||||||
|  | #define PLLABC_FREQUENCY_NOMINAL (float)(2.0*FP_PI*50.0) | ||||||
|  | #define PLLABC_FREQUENCY_CUT (float)(2.0*FP_PI*10.0) | ||||||
|  | #define PLLABC_FREQUENCY_LIMIT_HI  PLLABC_FREQUENCY_CUT | ||||||
|  | #define PLLABC_FREQUENCY_LIMIT_LOW -PLLABC_FREQUENCY_CUT | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.frequency_nominal = PLLABC_FREQUENCY_NOMINAL; | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.filter.time = 1.0/PLLABC_FREQUENCY_CUT; | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.controller.gain = PLLABC_FREQUENCY_CUT/2.0; | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.controller.time = 4.0/PLLABC_FREQUENCY_CUT; | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.controller.low_saturation = PLLABC_FREQUENCY_LIMIT_LOW; | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.controller.high_saturation = PLLABC_FREQUENCY_LIMIT_HI; | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.position.time = 1.0; | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.position.low_saturation = FP_ZERO; | ||||||
|  |     m_system_configuration.pll_abc_input_voltage.position.high_saturation = 2.0 * FP_PI; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // System Alarm
 | ||||||
|  |     //
 | ||||||
|  |     // exceed voltage level 1
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_exceed_level_1.level = 264.5;//253.0;
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_exceed_level_1.period = 10.0; | ||||||
|  |     //
 | ||||||
|  |     // exceed voltage level 2
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_exceed_level_2.level = 276.0;//264.5;
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_exceed_level_2.period = 5.0; | ||||||
|  |     //
 | ||||||
|  |     // exceed voltage level 3
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_exceed_level_3.level = 290.0;//276.0;
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_exceed_level_3.period = 2.0; | ||||||
|  |     //
 | ||||||
|  |     // exceed voltage level 4
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_exceed_level_4.level = 345.0; | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_exceed_level_4.period = 0.001;//1.0;
 | ||||||
|  |     //
 | ||||||
|  |     // decrease voltage level 1
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_decrease_level_1.level = 200.0;//218.5;//195.5;
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_decrease_level_1.period = 10.0; | ||||||
|  |     //
 | ||||||
|  |     // decrease voltage level 2
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_decrease_level_2.level = 170.0;//207.0;//172.5;
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_decrease_level_2.period = 5.0; | ||||||
|  |     //
 | ||||||
|  |     // decrease voltage level 3
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_decrease_level_3.level = 149.5; | ||||||
|  |     m_system_configuration.phase_alert_monitor.voltage_decrease_level_3.period = 2.0; | ||||||
|  |     //
 | ||||||
|  |     // current overload level 1 120% 60s
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_overload_level_1.level = 3.0 * 14.4; | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_overload_level_1.period = 60.0; | ||||||
|  |     //
 | ||||||
|  |     // current overload level 2 130% 10s
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_overload_level_2.level = 3.0 * 15.6; | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_overload_level_2.period = 10.0; | ||||||
|  |     //
 | ||||||
|  |     // current overload level 3 150% 1ms
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_overload_level_3.level = 3.0 * 18.0; | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_overload_level_3.period = 0.001; | ||||||
|  |     //
 | ||||||
|  |     // current invertor overload level 1 110% 60s
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_invertor_overload_level_1.level = 13.2; | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_invertor_overload_level_1.period = 60.0; | ||||||
|  |     //
 | ||||||
|  |     // current invertor overload level 2 130% 10s
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_invertor_overload_level_2.level = 15.6; | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_invertor_overload_level_2.period = 10.0; | ||||||
|  |     //
 | ||||||
|  |     // current invertor overload level 3 150% 1ms
 | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_invertor_overload_level_3.level = 18.0; | ||||||
|  |     m_system_configuration.phase_alert_monitor.current_invertor_overload_level_3.period = 0.001; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     //DIGITAL INPUTS
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.digital_input_config.period = 200.0e-3;   //3001 - 3020
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     //  FAN CONTROL
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.fan_control.timer_period = 5.0*60.0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Generator ABC
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.generator_abc.amplitude = 1.0; | ||||||
|  |     m_system_configuration.generator_abc.frequency = 2.0*FP_PI*50.0; | ||||||
|  |     m_system_configuration.generator_abc.phase_shift = 0.0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Reference PWM-Generator
 | ||||||
|  |     //
 | ||||||
|  |     //m_system_configuration.generator_pwm.frequency = 2.0*FP_PI*1.0;
 | ||||||
|  |     //m_system_configuration.generator_abc.phase_shift = 0.0;
 | ||||||
|  | 
 | ||||||
|  |     //m_system_configuration.gen_inp_volt.amplitude.direct.d = 220.0;
 | ||||||
|  |     //
 | ||||||
|  |     //m_system_configuration.gen_out_volt.amplitude.direct.d = 220.0;
 | ||||||
|  |     //m_system_configuration.gen_out_volt.phase.direct.phase = 0.122756;//FP_PI/4.0;
 | ||||||
|  |     //
 | ||||||
|  |     //m_system_configuration.gen_out_current.amplitude.direct.d = 50.0;
 | ||||||
|  |     //m_system_configuration.gen_out_current.phase.direct.phase = 0.122756;//FP_PI/3.0;
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Harmonica Analyzer
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.ph_harmonica_5.time = 50.0e-3; | ||||||
|  |     m_system_configuration.ph_harmonica_5.a3 = 3.0; | ||||||
|  |     m_system_configuration.ph_harmonica_5.a2 = 4.25; | ||||||
|  |     m_system_configuration.ph_harmonica_5.a1 = 3.0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Reference Intensity Idref Iqref in Start Mode
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.intensity_id_iq_references.damp_factor = 0.7071; | ||||||
|  |     m_system_configuration.intensity_id_iq_references.time = 20.0e-3; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Regulators
 | ||||||
|  |     //
 | ||||||
|  | #if TYPECONTROL == VECTORCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.regulator_voltage_load_dq.gain = 0.25; | ||||||
|  |     m_system_configuration.regulator_voltage_load_dq.time = 40.0e-3; | ||||||
|  |     m_system_configuration.regulator_voltage_load_dq.high_saturation = 950.0; | ||||||
|  |     m_system_configuration.regulator_voltage_load_dq.low_saturation = -950.0; | ||||||
|  |     //
 | ||||||
|  |     //m_system_configuration. = 1.0;
 | ||||||
|  |     m_system_configuration.integrator_voltage_dq.time = 1.0; | ||||||
|  |     m_system_configuration.integrator_voltage_dq.high_saturation = 1.0;; | ||||||
|  |     m_system_configuration.integrator_voltage_dq.low_saturation = -1.0; | ||||||
|  |     //
 | ||||||
|  |     //m_system_configuration. = 1.0;
 | ||||||
|  |     //m_system_configuration. = 1.0;
 | ||||||
|  |     //m_system_configuration. = 1.0;
 | ||||||
|  |     //m_system_configuration. = -1.0;
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.regulator_current_load_dq.gain = 1.0; | ||||||
|  | //    m_system_configuration.regulator_current_load_dq.time = 0.016;
 | ||||||
|  |     m_system_configuration.regulator_current_load_dq.high_saturation = 200.0; | ||||||
|  |     m_system_configuration.regulator_current_load_dq.low_saturation = -200.0; | ||||||
|  |     //
 | ||||||
|  |     //m_system_configuration. = 1.0;
 | ||||||
|  |     //m_system_configuration. = 0.016;
 | ||||||
|  |     //m_system_configuration. = 200.0;
 | ||||||
|  |     //m_system_configuration. = -200.0;
 | ||||||
|  |     //
 | ||||||
|  |     //m_system_configuration. = 1.0;
 | ||||||
|  |     m_system_configuration.referencer_current_bypass_dq.time = 0.016; | ||||||
|  |     m_system_configuration.referencer_current_bypass_dq.high_saturation = 200.0; | ||||||
|  |     m_system_configuration.referencer_current_bypass_dq.low_saturation = -200.0; | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if TYPECONTROL == SCALARCONTROL | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.regulator_voltage_load_active_reactive.gain = 0.25; | ||||||
|  |     m_system_configuration.regulator_voltage_load_active_reactive.time = 40.0e-3; | ||||||
|  |     m_system_configuration.regulator_voltage_load_active_reactive.high_saturation = 950.0; | ||||||
|  |     m_system_configuration.regulator_voltage_load_active_reactive.low_saturation = -950.0; | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.regulator_current_limit.gain = 1.0; | ||||||
|  |     m_system_configuration.regulator_current_limit.time = 1.0; | ||||||
|  |     m_system_configuration.regulator_current_limit.high_saturation = 1.0;; | ||||||
|  |     m_system_configuration.regulator_current_limit.low_saturation = -1.0; | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.regulator_current_pfc.gain = 1.0; | ||||||
|  |     m_system_configuration.regulator_current_pfc.time = 1.0; | ||||||
|  |     m_system_configuration.regulator_current_pfc.high_saturation = 1.0; | ||||||
|  |     m_system_configuration.regulator_current_pfc.low_saturation = -1.0; | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.current_regulator_active.gain = 1.0; | ||||||
|  |     m_system_configuration.current_regulator_active.time = 0.016; | ||||||
|  |     m_system_configuration.current_regulator_active.high_saturation = 200.0; | ||||||
|  |     m_system_configuration.current_regulator_active.low_saturation = -200.0; | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.current_regulator_reactive.gain = 1.0; | ||||||
|  |     m_system_configuration.current_regulator_reactive.time = 0.016; | ||||||
|  |     m_system_configuration.current_regulator_reactive.high_saturation = 200.0; | ||||||
|  |     m_system_configuration.current_regulator_reactive.low_saturation = -200.0; | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.current_referencer.gain = 1.0; | ||||||
|  |     m_system_configuration.current_referencer.time = 0.016; | ||||||
|  |     m_system_configuration.current_referencer.high_saturation = 200.0; | ||||||
|  |     m_system_configuration.current_referencer.low_saturation = -200.0; | ||||||
|  |     //
 | ||||||
|  | #endif | ||||||
|  |     //<>
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // Timers
 | ||||||
|  |     //
 | ||||||
|  |     m_system_configuration.timer_start.period = 2.0; | ||||||
|  |     m_system_configuration.timer_stop.period = 2.0; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  | }//hard_code_configuration()
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
| @ -0,0 +1,48 @@ | |||||||
|  | /*
 | ||||||
|  |  * FLTSYSLIBheaders.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef FLTSYSLIB_FLTSYSLIBHEADERS_H_ | ||||||
|  | #define FLTSYSLIB_FLTSYSLIBHEADERS_H_ | ||||||
|  | 
 | ||||||
|  | #include "FLTSYSLIB/AMPL.h" | ||||||
|  | #include "FLTSYSLIB/AMPLFSO.h" | ||||||
|  | #include "FLTSYSLIB/AMPLF4O.h" | ||||||
|  | #include "FLTSYSLIB/Contactor.h" | ||||||
|  | #include "FLTSYSLIB/DigitalInput.h" | ||||||
|  | #include "FLTSYSLIB/DigitalInputAntiNoise.h" | ||||||
|  | #include "FLTSYSLIB/DiscreteInput.h" | ||||||
|  | #include "FLTSYSLIB/DiscreteOutput.h" | ||||||
|  | #include "FLTSYSLIB/Filter.h" | ||||||
|  | #include "FLTSYSLIB/FilterSecond.h" | ||||||
|  | #include "FLTSYSLIB/FilterForth.h" | ||||||
|  | #include "FLTSYSLIB/FilterThird.h" | ||||||
|  | #include "FLTSYSLIB/FTimer.h" | ||||||
|  | #include "FLTSYSLIB/GeneratorABC.h" | ||||||
|  | #include "FLTSYSLIB/HarmonicaFilter4Order.h" | ||||||
|  | #include "FLTSYSLIB/HarmonicaFilterBase.h" | ||||||
|  | #include "FLTSYSLIB/Hysteresis.h" | ||||||
|  | #include "FLTSYSLIB/IController.h" | ||||||
|  | #include "FLTSYSLIB/Integrator.h" | ||||||
|  | #include "FLTSYSLIB/PController.h" | ||||||
|  | #include "FLTSYSLIB/PIController.h" | ||||||
|  | #include "FLTSYSLIB/PLLABC.h" | ||||||
|  | #include "FLTSYSLIB/PLLABCDVR.h" | ||||||
|  | #include "FLTSYSLIB/PLLABCreduced.h" | ||||||
|  | #include "FLTSYSLIB/PLLEQEP.h" | ||||||
|  | #include "FLTSYSLIB/Position.h" | ||||||
|  | #include "FLTSYSLIB/Relay.h" | ||||||
|  | #include "FLTSYSLIB/RMS.h" | ||||||
|  | #include "FLTSYSLIB/RMSF4O.h" | ||||||
|  | #include "FLTSYSLIB/RMSFFO.h" | ||||||
|  | #include "FLTSYSLIB/RMSFSO.h" | ||||||
|  | #include "FLTSYSLIB/Transformation.h" | ||||||
|  | #include "FLTSYSLIB/UNIPWM.h" | ||||||
|  | #include "FLTSYSLIB/ZeroDriftSecond.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif /* FLTSYSLIB_FLTSYSLIBHEADERS_H_ */ | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | /*
 | ||||||
|  |  * HeadersMODBUSRTU.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_HEADERSMODBUSRTU_H_ | ||||||
|  | #define SYSCTRL_HEADERSMODBUSRTU_H_ | ||||||
|  | 
 | ||||||
|  | #include "MODBUSRTU/RUBUS.h" | ||||||
|  | #include "MODBUSRTU/RUBUSCOPE.h" | ||||||
|  | #include "MODBUSRTU/RUBUSDataBase.h" | ||||||
|  | #include "MODBUSRTU/RUBUSRegister.h" | ||||||
|  | #include "MODBUSRTU/RUBUSTypes.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_HEADERSMODBUSRTU_H_ */ | ||||||
| @ -0,0 +1,59 @@ | |||||||
|  | /*
 | ||||||
|  |  * TimeStartStop.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/MeasureTimeInterval.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | //Constructor
 | ||||||
|  | MeasureTimeInterval::MeasureTimeInterval(CPUTIMER_VARS& CPUTimer, Uint32 magic): | ||||||
|  |         m_CPUTimer(CPUTimer), | ||||||
|  |         m_timer_result((Uint32)0), | ||||||
|  |         m_timer_result_previous((Uint32)0), | ||||||
|  |         m_magic_number((Uint32)magic), | ||||||
|  |         m_period((Uint32)0), | ||||||
|  |         m_tim((Uint32)0), | ||||||
|  |         m_counter((Uint32)0) | ||||||
|  | {}//end Constructor
 | ||||||
|  | 
 | ||||||
|  | //#pragma CODE_SECTION(".TI.ramfunc");
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MeasureTimeInterval::start(void) | ||||||
|  | { | ||||||
|  |     m_CPUTimer.RegsAddr->TCR.bit.TSS = 1; // Stop CPU Timer
 | ||||||
|  |     m_CPUTimer.RegsAddr->TCR.bit.TRB = 1; // Reload CPU Timer
 | ||||||
|  |     m_CPUTimer.RegsAddr->TCR.bit.TSS = 0; // Start CPU Timer
 | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | 
 | ||||||
|  | //#pragma CODE_SECTION(".TI.ramfunc");
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MeasureTimeInterval::stop(void) | ||||||
|  | { | ||||||
|  |     m_CPUTimer.RegsAddr->TCR.bit.TSS = 1; // Stop CPU Timer
 | ||||||
|  |     //
 | ||||||
|  |     m_timer_result_previous = m_timer_result; | ||||||
|  |     m_period = (Uint32)m_CPUTimer.RegsAddr->PRD.all; | ||||||
|  |     m_tim = (Uint32)m_CPUTimer.RegsAddr->TIM.all; | ||||||
|  |     //m_timer_result = m_CPUTimer.RegsAddr->PRD.all - m_CPUTimer.RegsAddr->TIM.all - m_magic_number;
 | ||||||
|  |     m_timer_result = (Uint32)((Uint32)m_period - (Uint32)m_tim - (Uint32)m_magic_number); | ||||||
|  |     m_counter++; | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | 
 | ||||||
|  | //#pragma CODE_SECTION(".TI.ramfunc");
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MeasureTimeInterval::reset(void) | ||||||
|  | { | ||||||
|  |     m_CPUTimer.RegsAddr->TCR.bit.TSS = 1; // Stop CPU Timer
 | ||||||
|  |     m_CPUTimer.RegsAddr->PRD.all = 0xFFFFFFFF; | ||||||
|  |     m_CPUTimer.RegsAddr->TCR.bit.TRB = 1; // Reload CPU Timer
 | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | /*
 | ||||||
|  |  * TimeStartStop.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File | ||||||
|  | #include "DSP2833x_Examples.h" | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_TIMEINTERVAL_H_ | ||||||
|  | #define SYSCTRL_TIMEINTERVAL_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class MeasureTimeInterval | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     CPUTIMER_VARS& m_CPUTimer; | ||||||
|  |     Uint32 m_timer_result; | ||||||
|  |     Uint32 m_timer_result_previous; | ||||||
|  |     Uint32 m_magic_number; | ||||||
|  |     Uint32 m_period; | ||||||
|  |     Uint32 m_tim; | ||||||
|  |     Uint32 m_counter; | ||||||
|  | public: | ||||||
|  |     MeasureTimeInterval(CPUTIMER_VARS& CPUTimer, Uint32 magic); | ||||||
|  | public: | ||||||
|  |     void start(void); | ||||||
|  |     void stop(void); | ||||||
|  |     void reset(void); | ||||||
|  |     //
 | ||||||
|  | };//end class MeasureTimeStartStop
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_TIMEINTERVAL_H_ */ | ||||||
| @ -0,0 +1,79 @@ | |||||||
|  | /*
 | ||||||
|  |  * MeasureTimePeriod.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/MeasureTimePeriod.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | //Constructor
 | ||||||
|  | MeasureTimePeriod::MeasureTimePeriod(CPUTIMER_REGS& CPUTimer, Uint32 magic): | ||||||
|  |         m_CPUTimer(CPUTimer), | ||||||
|  |         m_timer_result((Uint32)0), | ||||||
|  |         m_timer_result_previous((Uint32)0), | ||||||
|  |         m_magic_number((Uint32)magic), | ||||||
|  |         m_period((Uint32)0), | ||||||
|  |         m_tim((Uint32)0), | ||||||
|  |         m_counter((Uint32)0), | ||||||
|  |         _execute(&SYSCTRL::MeasureTimePeriod::_execute_start) | ||||||
|  | //
 | ||||||
|  | {}//end Constructor
 | ||||||
|  | 
 | ||||||
|  | //#pragma CODE_SECTION(".TI.ramfunc");
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MeasureTimePeriod::execute(void) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | //
 | ||||||
|  | //#pragma CODE_SECTION(".TI.ramfunc");
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MeasureTimePeriod::reset(void) | ||||||
|  | { | ||||||
|  |     m_CPUTimer.TCR.bit.TSS = 1; // Stop CPU Timer
 | ||||||
|  |     m_CPUTimer.PRD.all = (Uint32)0xFFFFFFFF; | ||||||
|  |     m_CPUTimer.TCR.bit.TRB = 1; // Reload CPU Timer
 | ||||||
|  |     //
 | ||||||
|  |     _execute = &SYSCTRL::MeasureTimePeriod::_execute_start; | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | //
 | ||||||
|  | //#pragma CODE_SECTION(".TI.ramfunc");
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MeasureTimePeriod::_execute_start(void) | ||||||
|  | { | ||||||
|  |     _execute = &SYSCTRL::MeasureTimePeriod::_execute_scan; | ||||||
|  |     //
 | ||||||
|  |     m_CPUTimer.TCR.bit.TSS = 1; // Stop CPU Timer
 | ||||||
|  |     m_CPUTimer.TCR.bit.TRB = 1; // Reload CPU Timer
 | ||||||
|  |     m_CPUTimer.TCR.bit.TSS = 0; // Start CPU Timer
 | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | //
 | ||||||
|  | //#pragma CODE_SECTION(".TI.ramfunc");
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MeasureTimePeriod::_execute_scan(void) | ||||||
|  | { | ||||||
|  |     m_CPUTimer.TCR.bit.TSS = 1; // Stop CPU Timer
 | ||||||
|  |     //
 | ||||||
|  |     m_timer_result_previous = (Uint32)m_timer_result; | ||||||
|  |     m_period = (Uint32)m_CPUTimer.PRD.all; | ||||||
|  |     m_tim = (Uint32)m_CPUTimer.TIM.all; | ||||||
|  |     m_timer_result = (Uint32)((Uint32)m_CPUTimer.PRD.all - (Uint32)m_CPUTimer.TIM.all - (Uint32)m_magic_number); | ||||||
|  |     //
 | ||||||
|  |     m_CPUTimer.TCR.bit.TRB = 1; // Reload CPU Timer
 | ||||||
|  |     m_CPUTimer.TCR.bit.TSS = 0; // Start CPU Timer
 | ||||||
|  |     //
 | ||||||
|  |     m_counter++; | ||||||
|  |     //
 | ||||||
|  | }//end
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | /*
 | ||||||
|  |  * MeasureTimePeriod.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File | ||||||
|  | #include "DSP2833x_Examples.h" | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_MEASURETIMEPERIOD_H_ | ||||||
|  | #define SYSCTRL_MEASURETIMEPERIOD_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | class MeasureTimePeriod | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     CPUTIMER_REGS& m_CPUTimer; | ||||||
|  |     //CPUTIMER_VARS& m_CPUTimer;
 | ||||||
|  |     Uint32 m_timer_result; | ||||||
|  |     Uint32 m_timer_result_previous; | ||||||
|  |     Uint32 m_magic_number; | ||||||
|  |     Uint32 m_period; | ||||||
|  |     Uint32 m_tim; | ||||||
|  |     Uint32 m_counter; | ||||||
|  | public: | ||||||
|  |     MeasureTimePeriod(CPUTIMER_REGS& pCPUTimer, Uint32 magic); | ||||||
|  |     void execute(void); | ||||||
|  |     void reset(void); | ||||||
|  | private: | ||||||
|  |     void (MeasureTimePeriod::*_execute)(void); | ||||||
|  |     void _execute_start(void); | ||||||
|  |     void _execute_scan(void); | ||||||
|  |     //
 | ||||||
|  | };//end class MeasureTimePeriod
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_MEASURETIMEPERIOD_H_ */ | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | /*
 | ||||||
|  |  * MonitorDigitalInputSignal.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/MonitorDigitalInputSignal.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | MonitorDigitalInputSignal::MonitorDigitalInputSignal() | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MonitorDigitalInputSignal::implement(bool input, MonitorDigitalInputSignalRegister& state) | ||||||
|  | { | ||||||
|  |     state.signal.privious = state.signal.state; | ||||||
|  |     state.signal.state = input; | ||||||
|  |     state.signal.is_on = state.signal.state; | ||||||
|  |     state.signal.is_off = !state.signal.state; | ||||||
|  |     state.signal.is_switched_on = state.signal.state & !state.signal.privious; | ||||||
|  |     state.signal.is_switched_off = !state.signal.state & state.signal.privious; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MonitorDigitalInputSignal::preset(bool input, MonitorDigitalInputSignalRegister& state) | ||||||
|  | { | ||||||
|  |     state.signal.privious = input; | ||||||
|  |     state.signal.state = input; | ||||||
|  |     state.signal.is_on = input; | ||||||
|  |     state.signal.is_off = !input; | ||||||
|  |     state.signal.is_switched_on = !state.signal.state & state.signal.privious; | ||||||
|  |     state.signal.is_switched_off = state.signal.state & !state.signal.privious; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void MonitorDigitalInputSignal::reset(MonitorDigitalInputSignalRegister& state) | ||||||
|  | { | ||||||
|  |     state.all = 0x0008; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,57 @@ | |||||||
|  | /*
 | ||||||
|  |  * MonitorDigitalInputSignal.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/SystemDefinitions.h" | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_MONITORDIGITALINPUTSIGNAL_H_ | ||||||
|  | #define SYSCTRL_MONITORDIGITALINPUTSIGNAL_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct MonitorDigitalInputSignalBitFiled | ||||||
|  | { | ||||||
|  |     uint16_t state:1; | ||||||
|  |     uint16_t privious:1; | ||||||
|  |     uint16_t is_on:1; | ||||||
|  |     uint16_t is_off:1; | ||||||
|  |     uint16_t is_switched_on:1; | ||||||
|  |     uint16_t is_switched_off:1; | ||||||
|  |     //
 | ||||||
|  | };//
 | ||||||
|  | 
 | ||||||
|  | union MonitorDigitalInputSignalRegister | ||||||
|  | { | ||||||
|  |     uint16_t                        all; | ||||||
|  |     Register16BitField              bit; | ||||||
|  |     MonitorDigitalInputSignalBitFiled     signal; | ||||||
|  |     MonitorDigitalInputSignalRegister(): | ||||||
|  |         all(uint16_t(0)) | ||||||
|  |     {} | ||||||
|  |     MonitorDigitalInputSignalRegister(uint16_t val): | ||||||
|  |         all(val) | ||||||
|  |         {} | ||||||
|  | };//MonitorDigitalInputSignalRegister
 | ||||||
|  | 
 | ||||||
|  | class MonitorDigitalInputSignal | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     MonitorDigitalInputSignal(); | ||||||
|  | public: | ||||||
|  |     static void implement(bool input, MonitorDigitalInputSignalRegister& state); | ||||||
|  |     static void preset(bool input, MonitorDigitalInputSignalRegister& state); | ||||||
|  |     static void reset(MonitorDigitalInputSignalRegister& state); | ||||||
|  |     //
 | ||||||
|  | };//MonitorDigitalInputSignal
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_MONITORDIGITALINPUTSIGNAL_H_ */ | ||||||
| @ -0,0 +1,430 @@ | |||||||
|  | /*
 | ||||||
|  |  * PhaseAlertMonitor.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/PhaseAlertMonitor.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | PhaseAlertMonitor::PhaseAlertMonitor(): | ||||||
|  |         m_time_sample(-1.0), | ||||||
|  |         m_fault(false), | ||||||
|  |         m_warning(false), | ||||||
|  |         m_monitor(), | ||||||
|  |         status(), | ||||||
|  |         fault(false), | ||||||
|  |         warning(false), | ||||||
|  |         m_voltage_ab_exceed_level_1(), | ||||||
|  |         m_voltage_bc_exceed_level_1(), | ||||||
|  |         m_voltage_ca_exceed_level_1(), | ||||||
|  |         m_voltage_ab_exceed_level_2(), | ||||||
|  |         m_voltage_bc_exceed_level_2(), | ||||||
|  |         m_voltage_ca_exceed_level_2(), | ||||||
|  |         m_voltage_ab_exceed_level_3(), | ||||||
|  |         m_voltage_bc_exceed_level_3(), | ||||||
|  |         m_voltage_ca_exceed_level_3(), | ||||||
|  |         m_voltage_ab_exceed_level_4(), | ||||||
|  |         m_voltage_bc_exceed_level_4(), | ||||||
|  |         m_voltage_ca_exceed_level_4(), | ||||||
|  |         m_voltage_ab_decrease_level_1(), | ||||||
|  |         m_voltage_bc_decrease_level_1(), | ||||||
|  |         m_voltage_ca_decrease_level_1(), | ||||||
|  |         m_voltage_ab_decrease_level_2(), | ||||||
|  |         m_voltage_bc_decrease_level_2(), | ||||||
|  |         m_voltage_ca_decrease_level_2(), | ||||||
|  |         m_voltage_ab_decrease_level_3(), | ||||||
|  |         m_voltage_bc_decrease_level_3(), | ||||||
|  |         m_voltage_ca_decrease_level_3(), | ||||||
|  |         m_current_a_overload_level_1(), | ||||||
|  |         m_current_b_overload_level_1(), | ||||||
|  |         m_current_c_overload_level_1(), | ||||||
|  |         m_current_a_overload_level_2(), | ||||||
|  |         m_current_b_overload_level_2(), | ||||||
|  |         m_current_c_overload_level_2(), | ||||||
|  |         m_current_a_overload_level_3(), | ||||||
|  |         m_current_b_overload_level_3(), | ||||||
|  |         m_current_c_overload_level_3(), | ||||||
|  |         //
 | ||||||
|  |         m_current_invertor_a_overload_level_1(), | ||||||
|  |         m_current_invertor_b_overload_level_1(), | ||||||
|  |         m_current_invertor_c_overload_level_1(), | ||||||
|  |         m_current_invertor_a_overload_level_2(), | ||||||
|  |         m_current_invertor_b_overload_level_2(), | ||||||
|  |         m_current_invertor_c_overload_level_2(), | ||||||
|  |         m_current_invertor_a_overload_level_3(), | ||||||
|  |         m_current_invertor_b_overload_level_3(), | ||||||
|  |         m_current_invertor_c_overload_level_3(), | ||||||
|  |         //
 | ||||||
|  |         m_current_input_a_overload_level_1(), | ||||||
|  |         m_current_input_b_overload_level_1(), | ||||||
|  |         m_current_input_c_overload_level_1(), | ||||||
|  |         m_current_input_a_overload_level_2(), | ||||||
|  |         m_current_input_b_overload_level_2(), | ||||||
|  |         m_current_input_c_overload_level_2(), | ||||||
|  |         m_current_input_a_overload_level_3(), | ||||||
|  |         m_current_input_b_overload_level_3(), | ||||||
|  |         m_current_input_c_overload_level_3(), | ||||||
|  |         //
 | ||||||
|  |         _execute(&SYSCTRL::PhaseAlertMonitor::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void PhaseAlertMonitor::setup(float time_sample) | ||||||
|  | { | ||||||
|  |     m_time_sample = time_sample; | ||||||
|  | 
 | ||||||
|  |     m_voltage_ab_exceed_level_1.setup(m_time_sample); | ||||||
|  |     m_voltage_bc_exceed_level_1.setup(m_time_sample); | ||||||
|  |     m_voltage_ca_exceed_level_1.setup(m_time_sample); | ||||||
|  |     m_voltage_ab_exceed_level_2.setup(m_time_sample); | ||||||
|  |     m_voltage_bc_exceed_level_2.setup(m_time_sample); | ||||||
|  |     m_voltage_ca_exceed_level_2.setup(m_time_sample); | ||||||
|  |     m_voltage_ab_exceed_level_3.setup(m_time_sample); | ||||||
|  |     m_voltage_bc_exceed_level_3.setup(m_time_sample); | ||||||
|  |     m_voltage_ca_exceed_level_3.setup(m_time_sample); | ||||||
|  |     m_voltage_ab_exceed_level_4.setup(m_time_sample); | ||||||
|  |     m_voltage_bc_exceed_level_4.setup(m_time_sample); | ||||||
|  |     m_voltage_ca_exceed_level_4.setup(m_time_sample); | ||||||
|  |     m_voltage_ab_decrease_level_1.setup(m_time_sample); | ||||||
|  |     m_voltage_bc_decrease_level_1.setup(m_time_sample); | ||||||
|  |     m_voltage_ca_decrease_level_1.setup(m_time_sample); | ||||||
|  |     m_voltage_ab_decrease_level_2.setup(m_time_sample); | ||||||
|  |     m_voltage_bc_decrease_level_2.setup(m_time_sample); | ||||||
|  |     m_voltage_ca_decrease_level_2.setup(m_time_sample); | ||||||
|  |     m_voltage_ab_decrease_level_3.setup(m_time_sample); | ||||||
|  |     m_voltage_bc_decrease_level_3.setup(m_time_sample); | ||||||
|  |     m_voltage_ca_decrease_level_3.setup(m_time_sample); | ||||||
|  |     m_current_a_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_b_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_c_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_a_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_b_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_c_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_a_overload_level_3.setup(m_time_sample); | ||||||
|  |     m_current_b_overload_level_3.setup(m_time_sample); | ||||||
|  |     m_current_c_overload_level_3.setup(m_time_sample); | ||||||
|  |     m_current_invertor_a_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_invertor_b_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_invertor_c_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_invertor_a_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_invertor_b_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_invertor_c_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_invertor_a_overload_level_3.setup(m_time_sample); | ||||||
|  |     m_current_invertor_b_overload_level_3.setup(m_time_sample); | ||||||
|  |     m_current_invertor_c_overload_level_3.setup(m_time_sample); | ||||||
|  | 
 | ||||||
|  |     m_current_input_a_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_input_b_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_input_c_overload_level_1.setup(m_time_sample); | ||||||
|  |     m_current_input_a_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_input_b_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_input_c_overload_level_2.setup(m_time_sample); | ||||||
|  |     m_current_input_a_overload_level_3.setup(m_time_sample); | ||||||
|  |     m_current_input_b_overload_level_3.setup(m_time_sample); | ||||||
|  |     m_current_input_c_overload_level_3.setup(m_time_sample); | ||||||
|  |     //
 | ||||||
|  | }//setup()
 | ||||||
|  | //
 | ||||||
|  | void PhaseAlertMonitor::configure(const PhaseAlertConfiguration& config) | ||||||
|  | { | ||||||
|  |     m_voltage_ab_exceed_level_1.configure(config.voltage_exceed_level_1); | ||||||
|  |     m_voltage_bc_exceed_level_1.configure(config.voltage_exceed_level_1); | ||||||
|  |     m_voltage_ca_exceed_level_1.configure(config.voltage_exceed_level_1); | ||||||
|  |     m_voltage_ab_exceed_level_2.configure(config.voltage_exceed_level_2); | ||||||
|  |     m_voltage_bc_exceed_level_2.configure(config.voltage_exceed_level_2); | ||||||
|  |     m_voltage_ca_exceed_level_2.configure(config.voltage_exceed_level_2); | ||||||
|  |     m_voltage_ab_exceed_level_3.configure(config.voltage_exceed_level_3); | ||||||
|  |     m_voltage_bc_exceed_level_3.configure(config.voltage_exceed_level_3); | ||||||
|  |     m_voltage_ca_exceed_level_3.configure(config.voltage_exceed_level_3); | ||||||
|  |     m_voltage_ab_exceed_level_4.configure(config.voltage_exceed_level_4); | ||||||
|  |     m_voltage_bc_exceed_level_4.configure(config.voltage_exceed_level_4); | ||||||
|  |     m_voltage_ca_exceed_level_4.configure(config.voltage_exceed_level_4); | ||||||
|  |     m_voltage_ab_decrease_level_1.configure(config.voltage_decrease_level_1); | ||||||
|  |     m_voltage_bc_decrease_level_1.configure(config.voltage_decrease_level_1); | ||||||
|  |     m_voltage_ca_decrease_level_1.configure(config.voltage_decrease_level_1); | ||||||
|  |     m_voltage_ab_decrease_level_2.configure(config.voltage_decrease_level_2); | ||||||
|  |     m_voltage_bc_decrease_level_2.configure(config.voltage_decrease_level_2); | ||||||
|  |     m_voltage_ca_decrease_level_2.configure(config.voltage_decrease_level_2); | ||||||
|  |     m_voltage_ab_decrease_level_3.configure(config.voltage_decrease_level_3); | ||||||
|  |     m_voltage_bc_decrease_level_3.configure(config.voltage_decrease_level_3); | ||||||
|  |     m_voltage_ca_decrease_level_3.configure(config.voltage_decrease_level_3); | ||||||
|  |     m_current_a_overload_level_1.configure(config.current_overload_level_1); | ||||||
|  |     m_current_b_overload_level_1.configure(config.current_overload_level_1); | ||||||
|  |     m_current_c_overload_level_1.configure(config.current_overload_level_1); | ||||||
|  |     m_current_a_overload_level_2.configure(config.current_overload_level_2); | ||||||
|  |     m_current_b_overload_level_2.configure(config.current_overload_level_2); | ||||||
|  |     m_current_c_overload_level_2.configure(config.current_overload_level_2); | ||||||
|  |     m_current_a_overload_level_3.configure(config.current_overload_level_3); | ||||||
|  |     m_current_b_overload_level_3.configure(config.current_overload_level_3); | ||||||
|  |     m_current_c_overload_level_3.configure(config.current_overload_level_3); | ||||||
|  |     //
 | ||||||
|  |     m_current_invertor_a_overload_level_1.configure(config.current_invertor_overload_level_1); | ||||||
|  |     m_current_invertor_b_overload_level_1.configure(config.current_invertor_overload_level_1); | ||||||
|  |     m_current_invertor_c_overload_level_1.configure(config.current_invertor_overload_level_1); | ||||||
|  |     m_current_invertor_a_overload_level_2.configure(config.current_invertor_overload_level_2); | ||||||
|  |     m_current_invertor_b_overload_level_2.configure(config.current_invertor_overload_level_2); | ||||||
|  |     m_current_invertor_c_overload_level_2.configure(config.current_invertor_overload_level_2); | ||||||
|  |     m_current_invertor_a_overload_level_3.configure(config.current_invertor_overload_level_3); | ||||||
|  |     m_current_invertor_b_overload_level_3.configure(config.current_invertor_overload_level_3); | ||||||
|  |     m_current_invertor_c_overload_level_3.configure(config.current_invertor_overload_level_3); | ||||||
|  |     //
 | ||||||
|  |     m_current_input_a_overload_level_1.configure(config.current_input_overload_level_1); | ||||||
|  |     m_current_input_b_overload_level_1.configure(config.current_input_overload_level_1); | ||||||
|  |     m_current_input_c_overload_level_1.configure(config.current_input_overload_level_1); | ||||||
|  |     m_current_input_a_overload_level_2.configure(config.current_input_overload_level_2); | ||||||
|  |     m_current_input_b_overload_level_2.configure(config.current_input_overload_level_2); | ||||||
|  |     m_current_input_c_overload_level_2.configure(config.current_input_overload_level_2); | ||||||
|  |     m_current_input_a_overload_level_3.configure(config.current_input_overload_level_3); | ||||||
|  |     m_current_input_b_overload_level_3.configure(config.current_input_overload_level_3); | ||||||
|  |     m_current_input_c_overload_level_3.configure(config.current_input_overload_level_3); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if((m_time_sample > FP_ZERO)) | ||||||
|  |     { | ||||||
|  |         _execute = &SYSCTRL::PhaseAlertMonitor::_execute_operational; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//configure()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void PhaseAlertMonitor::get_faults(PhaseFaultRegister& ph_a, PhaseFaultRegister& ph_b, PhaseFaultRegister& ph_c) | ||||||
|  | { | ||||||
|  |     ph_a.all = m_monitor.phase_a.fault.all; | ||||||
|  |     ph_b.all = m_monitor.phase_b.fault.all; | ||||||
|  |     ph_c.all = m_monitor.phase_c.fault.all; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void PhaseAlertMonitor::reset() | ||||||
|  | { | ||||||
|  |     m_monitor.phase_a.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_a.fault.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_b.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_b.fault.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_c.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_c.fault.all = (uint16_t)0; | ||||||
|  |     //
 | ||||||
|  |     m_monitor.phase_a.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_a.fault.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_b.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_b.fault.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_c.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_c.fault.all = (uint16_t)0; | ||||||
|  |     //
 | ||||||
|  |     m_voltage_ab_exceed_level_1.reset(); | ||||||
|  |     m_voltage_bc_exceed_level_1.reset(); | ||||||
|  |     m_voltage_ca_exceed_level_1.reset(); | ||||||
|  |     m_voltage_ab_exceed_level_2.reset(); | ||||||
|  |     m_voltage_bc_exceed_level_2.reset(); | ||||||
|  |     m_voltage_ca_exceed_level_2.reset(); | ||||||
|  |     m_voltage_ab_exceed_level_3.reset(); | ||||||
|  |     m_voltage_bc_exceed_level_3.reset(); | ||||||
|  |     m_voltage_ca_exceed_level_3.reset(); | ||||||
|  |     m_voltage_ab_exceed_level_4.reset(); | ||||||
|  |     m_voltage_bc_exceed_level_4.reset(); | ||||||
|  |     m_voltage_ca_exceed_level_4.reset(); | ||||||
|  |     m_voltage_ab_decrease_level_1.reset(); | ||||||
|  |     m_voltage_bc_decrease_level_1.reset(); | ||||||
|  |     m_voltage_ca_decrease_level_1.reset(); | ||||||
|  |     m_voltage_ab_decrease_level_2.reset(); | ||||||
|  |     m_voltage_bc_decrease_level_2.reset(); | ||||||
|  |     m_voltage_ca_decrease_level_2.reset(); | ||||||
|  |     m_voltage_ab_decrease_level_3.reset(); | ||||||
|  |     m_voltage_bc_decrease_level_3.reset(); | ||||||
|  |     m_voltage_ca_decrease_level_3.reset(); | ||||||
|  |     m_current_a_overload_level_1.reset(); | ||||||
|  |     m_current_b_overload_level_1.reset(); | ||||||
|  |     m_current_c_overload_level_1.reset(); | ||||||
|  |     m_current_a_overload_level_2.reset(); | ||||||
|  |     m_current_b_overload_level_2.reset(); | ||||||
|  |     m_current_c_overload_level_2.reset(); | ||||||
|  |     m_current_a_overload_level_3.reset(); | ||||||
|  |     m_current_b_overload_level_3.reset(); | ||||||
|  |     m_current_c_overload_level_3.reset(); | ||||||
|  |     m_current_invertor_a_overload_level_1.reset(); | ||||||
|  |     m_current_invertor_b_overload_level_1.reset(); | ||||||
|  |     m_current_invertor_c_overload_level_1.reset(); | ||||||
|  |     m_current_invertor_a_overload_level_2.reset(); | ||||||
|  |     m_current_invertor_b_overload_level_2.reset(); | ||||||
|  |     m_current_invertor_c_overload_level_2.reset(); | ||||||
|  |     m_current_invertor_a_overload_level_3.reset(); | ||||||
|  |     m_current_invertor_b_overload_level_3.reset(); | ||||||
|  |     m_current_invertor_c_overload_level_3.reset(); | ||||||
|  |     //
 | ||||||
|  |     m_fault = false; | ||||||
|  |     m_warning = false; | ||||||
|  |     warning = m_warning; | ||||||
|  |     fault = m_fault; | ||||||
|  |     status = m_monitor; | ||||||
|  |     //
 | ||||||
|  | }//reset()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void PhaseAlertMonitor::execute(float urmsa, float urmsb, float urmsc, | ||||||
|  |                                               float irmsa, float irmsb, float irmsc, | ||||||
|  |                                               float invrmsa, float invrmsb, float invrmsc, | ||||||
|  |                                               float inprmsa, float inprmsb, float inprmsc) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(urmsa, urmsb, urmsc, irmsa, irmsb, irmsc, invrmsa, invrmsb, invrmsc, inprmsa, inprmsb, inprmsc); | ||||||
|  |     //
 | ||||||
|  | }//execute()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void PhaseAlertMonitor::_execute_undef(float urmsa, float urmsb, float urmsc, | ||||||
|  |                                                      float irmsa, float irmsb, float irmsc, | ||||||
|  |                                                      float invrmsa, float invrmsb, float invrmsc, | ||||||
|  |                                                      float inprmsa, float inprmsb, float inprmsc) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  | }//_execute_undef()
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void PhaseAlertMonitor::_execute_operational(float urmsa, float urmsb, float urmsc, | ||||||
|  |                                                            float irmsa, float irmsb, float irmsc, | ||||||
|  |                                                            float invrmsa, float invrmsb, float invrmsc, | ||||||
|  |                                                            float inprmsa, float inprmsb, float inprmsc) | ||||||
|  | { | ||||||
|  |     static bool _warning = false; | ||||||
|  |     _warning = false; | ||||||
|  | 
 | ||||||
|  |     m_monitor.phase_a.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_a.fault.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_b.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_b.fault.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_c.warning.all = (uint16_t)0; | ||||||
|  |     m_monitor.phase_c.fault.all = (uint16_t)0; | ||||||
|  |     //
 | ||||||
|  |     m_voltage_ab_exceed_level_1.execute(urmsa); | ||||||
|  |     m_voltage_bc_exceed_level_1.execute(urmsb); | ||||||
|  |     m_voltage_ca_exceed_level_1.execute(urmsc); | ||||||
|  | 
 | ||||||
|  |     m_voltage_ab_exceed_level_2.execute(urmsa); | ||||||
|  |     m_voltage_bc_exceed_level_2.execute(urmsb); | ||||||
|  |     m_voltage_ca_exceed_level_2.execute(urmsc); | ||||||
|  | 
 | ||||||
|  |     m_voltage_ab_exceed_level_3.execute(urmsa); | ||||||
|  |     m_voltage_bc_exceed_level_3.execute(urmsb); | ||||||
|  |     m_voltage_ca_exceed_level_3.execute(urmsc); | ||||||
|  | 
 | ||||||
|  |     m_voltage_ab_exceed_level_4.execute(urmsa); | ||||||
|  |     m_voltage_bc_exceed_level_4.execute(urmsb); | ||||||
|  |     m_voltage_ca_exceed_level_4.execute(urmsc); | ||||||
|  | /*
 | ||||||
|  |     m_voltage_a_decrease_level_1.execute(urmsa); | ||||||
|  |     m_voltage_b_decrease_level_1.execute(urmsb); | ||||||
|  |     m_voltage_c_decrease_level_1.execute(urmsc); | ||||||
|  | 
 | ||||||
|  |     m_voltage_a_decrease_level_2.execute(urmsa); | ||||||
|  |     m_voltage_b_decrease_level_2.execute(urmsb); | ||||||
|  |     m_voltage_c_decrease_level_2.execute(urmsc); | ||||||
|  | 
 | ||||||
|  |     m_voltage_a_decrease_level_3.execute(urmsa); | ||||||
|  |     m_voltage_b_decrease_level_3.execute(urmsb); | ||||||
|  |     m_voltage_c_decrease_level_3.execute(urmsc); | ||||||
|  | */ | ||||||
|  |     m_current_a_overload_level_1.execute(irmsa); | ||||||
|  |     m_current_b_overload_level_1.execute(irmsb); | ||||||
|  |     m_current_c_overload_level_1.execute(irmsc); | ||||||
|  |     m_current_a_overload_level_2.execute(irmsa); | ||||||
|  |     m_current_b_overload_level_2.execute(irmsb); | ||||||
|  |     m_current_c_overload_level_2.execute(irmsc); | ||||||
|  |     m_current_a_overload_level_3.execute(irmsa); | ||||||
|  |     m_current_b_overload_level_3.execute(irmsb); | ||||||
|  |     m_current_c_overload_level_3.execute(irmsc); | ||||||
|  |     m_current_invertor_a_overload_level_1.execute(invrmsa); | ||||||
|  |     m_current_invertor_b_overload_level_1.execute(invrmsb); | ||||||
|  |     m_current_invertor_c_overload_level_1.execute(invrmsc); | ||||||
|  |     m_current_invertor_a_overload_level_2.execute(invrmsa); | ||||||
|  |     m_current_invertor_b_overload_level_2.execute(invrmsb); | ||||||
|  |     m_current_invertor_c_overload_level_2.execute(invrmsc); | ||||||
|  |     m_current_invertor_a_overload_level_3.execute(invrmsa); | ||||||
|  |     m_current_invertor_b_overload_level_3.execute(invrmsb); | ||||||
|  |     m_current_invertor_c_overload_level_3.execute(invrmsc); | ||||||
|  |     //
 | ||||||
|  |     m_current_input_a_overload_level_1.execute(inprmsa); | ||||||
|  |     m_current_input_b_overload_level_1.execute(inprmsb); | ||||||
|  |     m_current_input_c_overload_level_1.execute(inprmsc); | ||||||
|  |     m_current_input_a_overload_level_2.execute(inprmsa); | ||||||
|  |     m_current_input_b_overload_level_2.execute(inprmsb); | ||||||
|  |     m_current_input_c_overload_level_2.execute(inprmsc); | ||||||
|  |     m_current_input_a_overload_level_3.execute(inprmsa); | ||||||
|  |     m_current_input_b_overload_level_3.execute(inprmsb); | ||||||
|  |     m_current_input_c_overload_level_3.execute(inprmsc); | ||||||
|  |     //
 | ||||||
|  |     // set flags
 | ||||||
|  |     m_monitor.phase_a.warning.bit.exceed_voltage_level_1 = m_voltage_ab_exceed_level_1.warning; | ||||||
|  |     m_monitor.phase_a.warning.bit.exceed_voltage_level_2 = m_voltage_ab_exceed_level_2.warning; | ||||||
|  |     m_monitor.phase_a.fault.bit.exceed_voltage_level_3 = m_voltage_ab_exceed_level_3.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.exceed_voltage_level_4 = m_voltage_ab_exceed_level_4.fault; | ||||||
|  |     m_monitor.phase_a.warning.bit.decrease_voltage_level_1 = m_voltage_ab_decrease_level_1.warning; | ||||||
|  |     m_monitor.phase_a.warning.bit.decrease_voltage_level_2 = m_voltage_ab_decrease_level_2.warning; | ||||||
|  |     m_monitor.phase_a.fault.bit.decrease_voltage_level_3 = m_voltage_ab_decrease_level_3.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_current_level_1 = m_current_a_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_current_level_2 = m_current_a_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_current_level_3 = m_current_a_overload_level_3.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_invertor_current_level_1 = m_current_invertor_a_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_invertor_current_level_2 = m_current_invertor_a_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_invertor_current_level_3 = m_current_invertor_a_overload_level_3.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_input_current_level_1 = m_current_input_a_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_input_current_level_2 = m_current_input_a_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_a.fault.bit.overload_input_current_level_3 = m_current_input_a_overload_level_3.fault; | ||||||
|  |     //
 | ||||||
|  |     m_monitor.phase_b.warning.bit.exceed_voltage_level_1 = m_voltage_bc_exceed_level_1.warning; | ||||||
|  |     m_monitor.phase_b.warning.bit.exceed_voltage_level_2 = m_voltage_bc_exceed_level_2.warning; | ||||||
|  |     m_monitor.phase_b.fault.bit.exceed_voltage_level_3 = m_voltage_bc_exceed_level_3.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.exceed_voltage_level_4 = m_voltage_bc_exceed_level_4.fault; | ||||||
|  |     m_monitor.phase_b.warning.bit.decrease_voltage_level_1 = m_voltage_bc_decrease_level_1.warning; | ||||||
|  |     m_monitor.phase_b.warning.bit.decrease_voltage_level_2 = m_voltage_bc_decrease_level_2.warning; | ||||||
|  |     m_monitor.phase_b.fault.bit.decrease_voltage_level_3 = m_voltage_bc_decrease_level_3.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_current_level_1 = m_current_b_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_current_level_2 = m_current_b_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_current_level_3 = m_current_b_overload_level_3.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_invertor_current_level_1 = m_current_invertor_b_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_invertor_current_level_2 = m_current_invertor_b_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_invertor_current_level_3 = m_current_invertor_b_overload_level_3.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_input_current_level_1 = m_current_input_b_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_input_current_level_2 = m_current_input_b_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_b.fault.bit.overload_input_current_level_3 = m_current_input_b_overload_level_3.fault; | ||||||
|  |     //
 | ||||||
|  |     m_monitor.phase_c.warning.bit.exceed_voltage_level_1 = m_voltage_ca_exceed_level_1.warning; | ||||||
|  |     m_monitor.phase_c.warning.bit.exceed_voltage_level_2 = m_voltage_ca_exceed_level_2.warning; | ||||||
|  |     m_monitor.phase_c.fault.bit.exceed_voltage_level_3 = m_voltage_ca_exceed_level_3.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.exceed_voltage_level_4 = m_voltage_ca_exceed_level_4.fault; | ||||||
|  |     m_monitor.phase_c.warning.bit.decrease_voltage_level_1 = m_voltage_ca_decrease_level_1.warning; | ||||||
|  |     m_monitor.phase_c.warning.bit.decrease_voltage_level_2 = m_voltage_ca_decrease_level_2.warning; | ||||||
|  |     m_monitor.phase_c.fault.bit.decrease_voltage_level_3 = m_voltage_ca_decrease_level_3.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_current_level_1 = m_current_c_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_current_level_2 = m_current_c_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_current_level_3 = m_current_c_overload_level_3.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_invertor_current_level_1 = m_current_invertor_c_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_invertor_current_level_2 = m_current_invertor_c_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_invertor_current_level_3 = m_current_invertor_c_overload_level_3.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_input_current_level_1 = m_current_input_c_overload_level_1.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_input_current_level_2 = m_current_input_c_overload_level_2.fault; | ||||||
|  |     m_monitor.phase_c.fault.bit.overload_input_current_level_3 = m_current_input_c_overload_level_3.fault; | ||||||
|  |     //
 | ||||||
|  |     status = m_monitor; | ||||||
|  |     //
 | ||||||
|  |     if(m_monitor.phase_a.fault.all != (uint16_t)0){ m_fault = true;} | ||||||
|  |     if(m_monitor.phase_b.fault.all != (uint16_t)0){ m_fault = true;} | ||||||
|  |     if(m_monitor.phase_c.fault.all != (uint16_t)0){ m_fault = true;} | ||||||
|  |     //
 | ||||||
|  |     if(m_monitor.phase_a.warning.all != (uint16_t)0){ _warning = true;} | ||||||
|  |     if(m_monitor.phase_b.warning.all != (uint16_t)0){ _warning = true;} | ||||||
|  |     if(m_monitor.phase_c.warning.all != (uint16_t)0){ _warning = true;} | ||||||
|  | 
 | ||||||
|  |     m_warning = _warning; | ||||||
|  |     warning = m_warning; | ||||||
|  |     fault = m_fault; | ||||||
|  |     //
 | ||||||
|  | }//_execute_operational()
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,242 @@ | |||||||
|  | /*
 | ||||||
|  |  * PhaseAlertMonitor.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/ALERTHeaders.h" | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_PHASEALERTMONITOR_H_ | ||||||
|  | #define SYSCTRL_PHASEALERTMONITOR_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | struct PhaseAlertConfiguration | ||||||
|  | { | ||||||
|  |     ALERT::AlertBaseConfiguration voltage_exceed_level_1; | ||||||
|  |     ALERT::AlertBaseConfiguration voltage_exceed_level_2; | ||||||
|  |     ALERT::AlertBaseConfiguration voltage_exceed_level_3; | ||||||
|  |     ALERT::AlertBaseConfiguration voltage_exceed_level_4; | ||||||
|  |     ALERT::AlertBaseConfiguration voltage_decrease_level_1; | ||||||
|  |     ALERT::AlertBaseConfiguration voltage_decrease_level_2; | ||||||
|  |     ALERT::AlertBaseConfiguration voltage_decrease_level_3; | ||||||
|  |     ALERT::AlertBaseConfiguration current_overload_level_1; | ||||||
|  |     ALERT::AlertBaseConfiguration current_overload_level_2; | ||||||
|  |     ALERT::AlertBaseConfiguration current_overload_level_3; | ||||||
|  |     ALERT::AlertBaseConfiguration current_invertor_overload_level_1; | ||||||
|  |     ALERT::AlertBaseConfiguration current_invertor_overload_level_2; | ||||||
|  |     ALERT::AlertBaseConfiguration current_invertor_overload_level_3; | ||||||
|  |     ALERT::AlertBaseConfiguration current_input_overload_level_1; | ||||||
|  |     ALERT::AlertBaseConfiguration current_input_overload_level_2; | ||||||
|  |     ALERT::AlertBaseConfiguration current_input_overload_level_3; | ||||||
|  |     PhaseAlertConfiguration(): | ||||||
|  |         voltage_exceed_level_1(), | ||||||
|  |         voltage_exceed_level_2(), | ||||||
|  |         voltage_exceed_level_3(), | ||||||
|  |         voltage_exceed_level_4(), | ||||||
|  |         voltage_decrease_level_1(), | ||||||
|  |         voltage_decrease_level_2(), | ||||||
|  |         voltage_decrease_level_3(), | ||||||
|  |         current_overload_level_1(), | ||||||
|  |         current_overload_level_2(), | ||||||
|  |         current_overload_level_3(), | ||||||
|  |         current_invertor_overload_level_1(), | ||||||
|  |         current_invertor_overload_level_2(), | ||||||
|  |         current_invertor_overload_level_3(), | ||||||
|  |         current_input_overload_level_1(), | ||||||
|  |         current_input_overload_level_2(), | ||||||
|  |         current_input_overload_level_3() | ||||||
|  |     {} | ||||||
|  |     //
 | ||||||
|  | };//SystemAlertConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct PhaseWarningBit | ||||||
|  | { | ||||||
|  |     uint16_t exceed_voltage_level_1 :1; | ||||||
|  |     uint16_t exceed_voltage_level_2 :1; | ||||||
|  |     uint16_t decrease_voltage_level_1 :1; | ||||||
|  |     uint16_t decrease_voltage_level_2 :1; | ||||||
|  |     //
 | ||||||
|  | };//PhaseWarningBit
 | ||||||
|  | 
 | ||||||
|  | struct PhaseFaultBit | ||||||
|  | { | ||||||
|  |     uint16_t exceed_voltage_level_3 :1;                 // 0
 | ||||||
|  |     uint16_t exceed_voltage_level_4 :1;                 // 1
 | ||||||
|  |     uint16_t decrease_voltage_level_3 :1;               // 2
 | ||||||
|  |     uint16_t phase_lost :1;                             // 3
 | ||||||
|  |     //
 | ||||||
|  |     uint16_t short_circuit  :1;                         // 4
 | ||||||
|  |     uint16_t high_current   :1;                         // 5
 | ||||||
|  |     uint16_t overload_current_level_1   :1;             // 6
 | ||||||
|  |     uint16_t overload_current_level_2   :1;             // 7
 | ||||||
|  |     //
 | ||||||
|  |     uint16_t overload_current_level_3   :1;             // 8
 | ||||||
|  |     uint16_t overload_invertor_current_level_1   :1;    // 9
 | ||||||
|  |     uint16_t overload_invertor_current_level_2   :1;    // 10
 | ||||||
|  |     uint16_t overload_invertor_current_level_3   :1;    // 11
 | ||||||
|  |     //
 | ||||||
|  |     uint16_t overload_input_current_level_1   :1;      // 12
 | ||||||
|  |     uint16_t overload_input_current_level_2   :1;      // 13
 | ||||||
|  |     uint16_t overload_input_current_level_3   :1;      // 14
 | ||||||
|  |     uint16_t reserved_15   :1;                          // 15
 | ||||||
|  | };//PhaseFaultBit
 | ||||||
|  | 
 | ||||||
|  | union PhaseWarningRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     struct PhaseWarningBit bit; | ||||||
|  |     PhaseWarningRegister(): | ||||||
|  |         all(uint16_t(0)) | ||||||
|  |     {} | ||||||
|  |     //
 | ||||||
|  | };//PhaseWarningRegister
 | ||||||
|  | 
 | ||||||
|  | union PhaseFaultRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     struct PhaseFaultBit bit; | ||||||
|  |     PhaseFaultRegister(): | ||||||
|  |         all(uint16_t(0)) | ||||||
|  |     {} | ||||||
|  | };//PhaseFaultRegister
 | ||||||
|  | 
 | ||||||
|  | struct PhaseAlertStatusRegister | ||||||
|  | { | ||||||
|  |     union PhaseWarningRegister warning; | ||||||
|  |     union PhaseFaultRegister fault; | ||||||
|  |     PhaseAlertStatusRegister(): | ||||||
|  |         warning(), | ||||||
|  |         fault() | ||||||
|  |     {} | ||||||
|  | };//PhaseAlertStatusRegister
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct PhaseAlertRegister | ||||||
|  | { | ||||||
|  |     struct PhaseAlertStatusRegister phase_a; | ||||||
|  |     struct PhaseAlertStatusRegister phase_b; | ||||||
|  |     struct PhaseAlertStatusRegister phase_c; | ||||||
|  |     PhaseAlertRegister(): | ||||||
|  |         phase_a(), | ||||||
|  |         phase_b(), | ||||||
|  |         phase_c() | ||||||
|  |     {} | ||||||
|  |     //
 | ||||||
|  | };//PhaseAlertRegister
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PhaseAlertMonitor | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     float m_time_sample; | ||||||
|  |     bool m_fault; | ||||||
|  |     bool m_warning; | ||||||
|  | private: | ||||||
|  |     PhaseAlertRegister m_monitor; | ||||||
|  | public: | ||||||
|  |     PhaseAlertRegister status; | ||||||
|  |     bool fault; | ||||||
|  |     bool warning; | ||||||
|  | private: | ||||||
|  |     ALERT::WarningExceed m_voltage_ab_exceed_level_1; | ||||||
|  |     ALERT::WarningExceed m_voltage_bc_exceed_level_1; | ||||||
|  |     ALERT::WarningExceed m_voltage_ca_exceed_level_1; | ||||||
|  |     //
 | ||||||
|  |     ALERT::WarningExceed m_voltage_ab_exceed_level_2; | ||||||
|  |     ALERT::WarningExceed m_voltage_bc_exceed_level_2; | ||||||
|  |     ALERT::WarningExceed m_voltage_ca_exceed_level_2; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_voltage_ab_exceed_level_3; | ||||||
|  |     ALERT::FaultExceed m_voltage_bc_exceed_level_3; | ||||||
|  |     ALERT::FaultExceed m_voltage_ca_exceed_level_3; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_voltage_ab_exceed_level_4; | ||||||
|  |     ALERT::FaultExceed m_voltage_bc_exceed_level_4; | ||||||
|  |     ALERT::FaultExceed m_voltage_ca_exceed_level_4; | ||||||
|  |     //
 | ||||||
|  |     ALERT::WarningDecrease m_voltage_ab_decrease_level_1; | ||||||
|  |     ALERT::WarningDecrease m_voltage_bc_decrease_level_1; | ||||||
|  |     ALERT::WarningDecrease m_voltage_ca_decrease_level_1; | ||||||
|  |     //
 | ||||||
|  |     ALERT::WarningDecrease m_voltage_ab_decrease_level_2; | ||||||
|  |     ALERT::WarningDecrease m_voltage_bc_decrease_level_2; | ||||||
|  |     ALERT::WarningDecrease m_voltage_ca_decrease_level_2; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultDecrease m_voltage_ab_decrease_level_3; | ||||||
|  |     ALERT::FaultDecrease m_voltage_bc_decrease_level_3; | ||||||
|  |     ALERT::FaultDecrease m_voltage_ca_decrease_level_3; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_current_a_overload_level_1; | ||||||
|  |     ALERT::FaultExceed m_current_b_overload_level_1; | ||||||
|  |     ALERT::FaultExceed m_current_c_overload_level_1; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_current_a_overload_level_2; | ||||||
|  |     ALERT::FaultExceed m_current_b_overload_level_2; | ||||||
|  |     ALERT::FaultExceed m_current_c_overload_level_2; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_current_a_overload_level_3; | ||||||
|  |     ALERT::FaultExceed m_current_b_overload_level_3; | ||||||
|  |     ALERT::FaultExceed m_current_c_overload_level_3; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_current_invertor_a_overload_level_1; | ||||||
|  |     ALERT::FaultExceed m_current_invertor_b_overload_level_1; | ||||||
|  |     ALERT::FaultExceed m_current_invertor_c_overload_level_1; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_current_invertor_a_overload_level_2; | ||||||
|  |     ALERT::FaultExceed m_current_invertor_b_overload_level_2; | ||||||
|  |     ALERT::FaultExceed m_current_invertor_c_overload_level_2; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_current_invertor_a_overload_level_3; | ||||||
|  |     ALERT::FaultExceed m_current_invertor_b_overload_level_3; | ||||||
|  |     ALERT::FaultExceed m_current_invertor_c_overload_level_3; | ||||||
|  | 
 | ||||||
|  |     ALERT::FaultExceed m_current_input_a_overload_level_1; | ||||||
|  |     ALERT::FaultExceed m_current_input_b_overload_level_1; | ||||||
|  |     ALERT::FaultExceed m_current_input_c_overload_level_1; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_current_input_a_overload_level_2; | ||||||
|  |     ALERT::FaultExceed m_current_input_b_overload_level_2; | ||||||
|  |     ALERT::FaultExceed m_current_input_c_overload_level_2; | ||||||
|  |     //
 | ||||||
|  |     ALERT::FaultExceed m_current_input_a_overload_level_3; | ||||||
|  |     ALERT::FaultExceed m_current_input_b_overload_level_3; | ||||||
|  |     ALERT::FaultExceed m_current_input_c_overload_level_3; | ||||||
|  | public: | ||||||
|  |     PhaseAlertMonitor(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const PhaseAlertConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void get_faults(PhaseFaultRegister& ph_a, PhaseFaultRegister& ph_b, PhaseFaultRegister& ph_c); | ||||||
|  |     void reset(); | ||||||
|  | public: | ||||||
|  |     void execute(float urmsa, float urmsb, float urmsc, | ||||||
|  |                                float irmsa, float irmsb, float irmsc, | ||||||
|  |                                float invrmsa, float invrmsb, float invrmsc, | ||||||
|  |                                float inprmsa, float inmrmsb, float inmrmsc); | ||||||
|  | private: | ||||||
|  |     void (PhaseAlertMonitor::*_execute)(float urmsa, float urmsb, float urmsc, | ||||||
|  |                                                       float irmsa, float irmsb, float irmsc, | ||||||
|  |                                                       float invrmsa, float invrmsb, float invrmsc, | ||||||
|  |                                                       float inprmsa, float inmrmsb, float inmrmsc); | ||||||
|  |     void _execute_undef(float urmsa, float urmsb, float urmsc, | ||||||
|  |                                       float irmsa, float irmsb, float irmsc, | ||||||
|  |                                       float invrmsa, float invrmsb, float invrmsc, | ||||||
|  |                                       float inprmsa, float inmrmsb, float inmrmsc); | ||||||
|  |     void _execute_operational(float urmsa, float urmsb, float urmsc, | ||||||
|  |                                             float irmsa, float irmsb, float irmsc, | ||||||
|  |                                             float invrmsa, float invrmsb, float invrmsc, | ||||||
|  |                                             float inprmsa, float inmrmsb, float inmrmsc); | ||||||
|  | //
 | ||||||
|  | };//PhaseAlertMonitor
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_PHASEALERTMONITOR_H_ */ | ||||||
|  | 
 | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | /*
 | ||||||
|  |  * AnalogSignalStructure.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_ANALOGSIGNALSTRUCTURE_H_ | ||||||
|  | #define SYSCTRL_ANALOGSIGNALSTRUCTURE_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct ProjectionAnalogSignalStructure | ||||||
|  | { | ||||||
|  |     float active; | ||||||
|  |     float reactive; | ||||||
|  |     ProjectionAnalogSignalStructure(): | ||||||
|  |         active(FP_ZERO), | ||||||
|  |         reactive(FP_ZERO) | ||||||
|  |     {} | ||||||
|  | };//ProjectionAnalogSignalStructure
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct RelativeAnalogSignalStructure | ||||||
|  | { | ||||||
|  |     float amplitude; | ||||||
|  |     float relative; | ||||||
|  |     void reset() | ||||||
|  |     { | ||||||
|  |         amplitude = FP_ZERO; | ||||||
|  |         relative = FP_ZERO; | ||||||
|  |     } | ||||||
|  |     RelativeAnalogSignalStructure(): | ||||||
|  |         amplitude(FP_ZERO), | ||||||
|  |         relative(FP_ZERO) | ||||||
|  |     {} | ||||||
|  | };//AnalogSignalStructure
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_ANALOGSIGNALSTRUCTURE_H_ */ | ||||||
| @ -0,0 +1,663 @@ | |||||||
|  | /*
 | ||||||
|  |  * SYSRestart.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/SYSRestart.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | SYSRestart::SYSRestart(SYSCTRL::SystemEnvironment& env): | ||||||
|  |     m_env(env), | ||||||
|  |     m_mode(SYSCTRL::SYSRestart::UNDEFINED), | ||||||
|  |     m_state(SYSCTRL::SYSRestart::EMPTY), | ||||||
|  |     m_state_bit_field(), | ||||||
|  |     m_time_sample(-1.0), | ||||||
|  |     m_config(), | ||||||
|  |     m_registers(), | ||||||
|  |     status(), | ||||||
|  |     _execute(&SYSCTRL::SYSRestart::_execute_undef), | ||||||
|  |     _state_run(&SYSCTRL::SYSRestart::_state_empty) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | void SYSRestart::setup(float time_sample) | ||||||
|  | { | ||||||
|  |     if(m_mode == SYSCTRL::SYSRestart::UNDEFINED) | ||||||
|  |     { | ||||||
|  |         if(time_sample > FP_ZERO) | ||||||
|  |         { | ||||||
|  |             m_time_sample = time_sample; | ||||||
|  |             m_mode = SYSCTRL::SYSRestart::CONFIGURATE; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void SYSRestart::configure(SYSRestartConfiguration& config) | ||||||
|  | { | ||||||
|  |     bool _status = true; | ||||||
|  | 
 | ||||||
|  |     if(m_mode == SYSCTRL::SYSRestart::CONFIGURATE) | ||||||
|  |     { | ||||||
|  |         m_config = config; | ||||||
|  | 
 | ||||||
|  |         if((m_config.enable.equipment.all != (uint16_t)0)|| | ||||||
|  |            (m_config.enable.phase_a.all != (uint16_t)0)|| | ||||||
|  |            (m_config.enable.phase_b.all != (uint16_t)0)|| | ||||||
|  |            (m_config.enable.phase_c.all != (uint16_t)0)) | ||||||
|  |        { | ||||||
|  |            _status &= m_config.period_timer_hold_fault > m_time_sample ? true : false; | ||||||
|  |            _status &= m_config.period_timer_selfclear_attempts > m_time_sample ? true : false; | ||||||
|  |            _status &= m_config.period_timer_turnon_switch > m_time_sample ? true : false; | ||||||
|  |            _status &= m_config.attempts > 0 ? true : false; | ||||||
|  |        }//if
 | ||||||
|  |        //
 | ||||||
|  |        m_registers.counter_attempts = 0; | ||||||
|  |        m_registers.counter_timer = FP_ZERO; | ||||||
|  |        m_registers.counter_timer_selfclear_attempts = FP_ZERO; | ||||||
|  |        m_registers.status.all = 0; | ||||||
|  |        //
 | ||||||
|  |         if(_status) | ||||||
|  |         { | ||||||
|  |             m_mode = SYSCTRL::SYSRestart::OPERATIONAL; | ||||||
|  |             _execute = &SYSCTRL::SYSRestart::_execute_operational; | ||||||
|  | 
 | ||||||
|  |             if((m_config.restart_enable.signal.enable)&& | ||||||
|  |                ((m_config.enable.equipment.all != (uint16_t)0)|| | ||||||
|  |                (m_config.enable.phase_a.all    != (uint16_t)0)|| | ||||||
|  |                (m_config.enable.phase_b.all    != (uint16_t)0)|| | ||||||
|  |                (m_config.enable.phase_c.all    != (uint16_t)0))) | ||||||
|  |             { | ||||||
|  |                 _state_run = &SYSCTRL::SYSRestart::_state_free; | ||||||
|  |                 m_state = SYSCTRL::SYSRestart::FREE; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 _state_run = &SYSCTRL::SYSRestart::_state_empty; | ||||||
|  |                 m_state = SYSCTRL::SYSRestart::EMPTY; | ||||||
|  |                 //
 | ||||||
|  |             }// if else
 | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | SYSRestart::mode_t SYSRestart::get_mode() | ||||||
|  | { | ||||||
|  |     return m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | SYSRestart::state_t SYSRestart::get_state() | ||||||
|  | { | ||||||
|  |     return m_state; | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | uint16_t SYSRestart::get_state_steps() | ||||||
|  | { | ||||||
|  |     return m_state_bit_field.all; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | uint16_t SYSRestart::get_attempts() | ||||||
|  | { | ||||||
|  |     return m_registers.counter_attempts; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool SYSRestart::compare(SYSCTRL::SYSRestart::mode_t mode) | ||||||
|  | { | ||||||
|  |     return mode == m_mode; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | bool SYSRestart::compare_state(SYSRestart::SYSRestart::state_t state) | ||||||
|  | { | ||||||
|  |     return state == m_state; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::execute() | ||||||
|  | { | ||||||
|  |     (this->*_execute)(); | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void SYSRestart::_execute_undef() | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_execute_operational() | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(m_config.restart_enable.signal.enable) | ||||||
|  |     { | ||||||
|  |         m_registers.status_fault_register.equipment.all = m_config.enable.equipment.all & m_env.system_faults_register.equipment.all; | ||||||
|  |         m_registers.status_fault_register.phase_a.all = m_config.enable.phase_a.all & m_env.system_faults_register.phase_a.all; | ||||||
|  |         m_registers.status_fault_register.phase_b.all = m_config.enable.phase_b.all & m_env.system_faults_register.phase_b.all; | ||||||
|  |         m_registers.status_fault_register.phase_c.all = m_config.enable.phase_c.all & m_env.system_faults_register.phase_c.all; | ||||||
|  |         //
 | ||||||
|  |         m_registers.status.signal.fault = m_registers.status_fault_register.equipment.all == (uint16_t)0 ? false : true; | ||||||
|  |         m_registers.status.signal.fault |= m_registers.status_fault_register.phase_a.all == (uint16_t)0 ? false : true; | ||||||
|  |         m_registers.status.signal.fault |= m_registers.status_fault_register.phase_b.all == (uint16_t)0 ? false : true; | ||||||
|  |         m_registers.status.signal.fault |= m_registers.status_fault_register.phase_c.all == (uint16_t)0 ? false : true; | ||||||
|  |         //
 | ||||||
|  |         if(m_registers.counter_attempts != 0) | ||||||
|  |         { | ||||||
|  |             if(m_registers.counter_timer_selfclear_attempts < m_config.period_timer_selfclear_attempts) | ||||||
|  |             { | ||||||
|  |                 m_registers.counter_timer_selfclear_attempts += m_time_sample; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 m_registers.counter_attempts = 0; | ||||||
|  |                 m_registers.counter_timer_selfclear_attempts = FP_ZERO; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         //
 | ||||||
|  |         SYSCTRL::MonitorDigitalInputSignal::implement(m_registers.status.signal.fault, m_registers.monitor_fault); | ||||||
|  |         //
 | ||||||
|  |         _state_execute(); | ||||||
|  |         //
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         _set_state_free(); | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_empty() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::EMPTY; | ||||||
|  |     m_state_bit_field.all = 0; | ||||||
|  |     m_state_bit_field.signal.empty = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  | 
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     SYSCTRL::MonitorDigitalInputSignal::preset(false, m_registers.monitor_fault); | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_empty; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_free() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::FREE; | ||||||
|  |     m_state_bit_field.all = 0; | ||||||
|  |     m_state_bit_field.signal.free = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  |     //
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_free; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_holdfault() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::HOLDFAULT; | ||||||
|  |     m_state_bit_field.signal.free = 0; | ||||||
|  |     m_state_bit_field.signal.holdfault = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  |     //
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_holdfault; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_resetfault() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::RESETFAULT; | ||||||
|  |     m_state_bit_field.signal.resetfault = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 1; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  |     //
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_resetfault; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_freezefault() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::FREEZEFAULT; | ||||||
|  |     m_state_bit_field.all = 0; | ||||||
|  |     m_state_bit_field.signal.freezefault = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 1; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  |     //
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_freezefault; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_holdstop() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::HOLDSTOP; | ||||||
|  |     m_state_bit_field.signal.holdstop = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  |     //
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_holdstop; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_turnon_q1() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::TURNONQ1; | ||||||
|  |     m_state_bit_field.signal.turnonq1 = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 1; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  |     //
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_turnon_q1; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_turnon_km1() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::TURNONKM1; | ||||||
|  |     m_state_bit_field.signal.turnonkm1 = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 1; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  |     //
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_turnon_km1; | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_turnon_km3() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::TURNONKM3; | ||||||
|  |     m_state_bit_field.signal.turnonkm3 = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 0; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 1; | ||||||
|  |     //
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_turnon_km3; | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline void SYSRestart::_set_state_startup() | ||||||
|  | { | ||||||
|  |     m_state = SYSCTRL::SYSRestart::STARTUP; | ||||||
|  |     m_state_bit_field.signal.turnonq1 = 1; | ||||||
|  |     m_state_bit_field.signal.turnonkm1 = 1; | ||||||
|  |     m_state_bit_field.signal.turnonkm3 = 1; | ||||||
|  |     m_state_bit_field.signal.startup = 1; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_timer = FP_ZERO; | ||||||
|  |     //
 | ||||||
|  |     m_registers.status.signal.resetfault = 0; | ||||||
|  |     m_registers.status.signal.freezefault = 0; | ||||||
|  |     m_registers.status.signal.startup = 1; | ||||||
|  |     m_registers.status.signal.turnon_q1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km1 = 0; | ||||||
|  |     m_registers.status.signal.turnon_km3 = 0; | ||||||
|  | 
 | ||||||
|  |     status.all = m_registers.status.all; | ||||||
|  |     //
 | ||||||
|  |     m_registers.counter_attempts++; | ||||||
|  |     //
 | ||||||
|  |     _state_run = &SYSCTRL::SYSRestart::_state_startup; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_execute() | ||||||
|  | { | ||||||
|  |     (this->*_state_run)(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_empty() | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_free() | ||||||
|  | { | ||||||
|  |     // Change State if appropriate conditions was happened
 | ||||||
|  |     if(m_registers.monitor_fault.signal.is_on) | ||||||
|  |     { | ||||||
|  |         _set_state_holdfault(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_holdfault() | ||||||
|  | { | ||||||
|  |     // Change State if appropriate conditions was happened
 | ||||||
|  | 
 | ||||||
|  |     if(m_registers.counter_timer < m_config.period_timer_hold_fault) | ||||||
|  |     { | ||||||
|  |         m_registers.counter_timer += m_time_sample; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         _set_state_free(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(m_registers.counter_attempts >= m_config.attempts) | ||||||
|  |     { | ||||||
|  |         _set_state_freezefault(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(m_env.system_fault.boolbit.b0 & (m_registers.counter_timer >= m_config.period_timer_hold_fault)) | ||||||
|  |     { | ||||||
|  |         _set_state_resetfault(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_resetfault() | ||||||
|  | { | ||||||
|  |     // Change State if appropriate conditions was happened
 | ||||||
|  | 
 | ||||||
|  |     if(m_registers.counter_timer < m_config.period_timer_reset) | ||||||
|  |     { | ||||||
|  |         m_registers.counter_timer += m_time_sample; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         _set_state_holdstop(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(m_env.system_fault.boolbit.b0 & (m_registers.counter_timer >= m_config.period_timer_reset)) | ||||||
|  |     { | ||||||
|  |         _set_state_freezefault(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_freezefault() | ||||||
|  | { | ||||||
|  |     // Change State if appropriate conditions was happened
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         _set_state_free(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_holdstop() | ||||||
|  | { | ||||||
|  |     // Change State if appropriate conditions was happened
 | ||||||
|  | 
 | ||||||
|  |     if(m_registers.counter_timer < m_config.period_timer_hold_stop) | ||||||
|  |     { | ||||||
|  |         m_registers.counter_timer += m_time_sample; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(m_env.system_fault.boolbit.b0 | | ||||||
|  |       (!m_env.system_fault.boolbit.b0 & m_env.remote_stop.state.signal.is_on) | ||||||
|  |       ) | ||||||
|  |     { | ||||||
|  |         _set_state_free(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0 & | ||||||
|  |        !m_env.system_ready.boolbit.b0 & | ||||||
|  |        (m_registers.counter_timer >= m_config.period_timer_hold_stop) | ||||||
|  |       ) | ||||||
|  |     { | ||||||
|  |         _set_state_turnon_q1(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0 & m_env.system_ready.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         _set_state_startup(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_turnon_q1() | ||||||
|  | { | ||||||
|  |     if(m_registers.counter_timer < m_config.period_timer_turnon_switch) | ||||||
|  |     { | ||||||
|  |         m_registers.counter_timer += m_time_sample; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  |     if(m_env.system_fault.boolbit.b0 | | ||||||
|  |        (m_registers.counter_timer >= m_config.period_timer_turnon_switch) | ||||||
|  |        ) | ||||||
|  |     { | ||||||
|  |         _set_state_free(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0 & m_env.input_discrete.signal.auxiliary_q1) | ||||||
|  |     { | ||||||
|  |         _set_state_turnon_km1(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0 & m_env.system_ready.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         _set_state_startup(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_turnon_km1() | ||||||
|  | { | ||||||
|  |     if(m_registers.counter_timer < m_config.period_timer_turnon_switch) | ||||||
|  |    { | ||||||
|  |        m_registers.counter_timer += m_time_sample; | ||||||
|  |        //
 | ||||||
|  |    }//if
 | ||||||
|  | 
 | ||||||
|  |     if(m_env.system_fault.boolbit.b0 | | ||||||
|  |        (m_registers.counter_timer >= m_config.period_timer_turnon_switch) | ||||||
|  |        ) | ||||||
|  |     { | ||||||
|  |         _set_state_free(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0 & m_env.input_discrete.signal.auxiliary_km1) | ||||||
|  |     { | ||||||
|  |         _set_state_turnon_km3(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0 & m_env.system_ready.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         _set_state_startup(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_turnon_km3() | ||||||
|  | { | ||||||
|  |     if(m_registers.counter_timer < m_config.period_timer_turnon_switch) | ||||||
|  |    { | ||||||
|  |        m_registers.counter_timer += m_time_sample; | ||||||
|  |        //
 | ||||||
|  |    }//if
 | ||||||
|  | 
 | ||||||
|  |     if(m_env.system_fault.boolbit.b0 | | ||||||
|  |        (m_registers.counter_timer >= m_config.period_timer_turnon_switch) | ||||||
|  |        ) | ||||||
|  |     { | ||||||
|  |         _set_state_free(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | 
 | ||||||
|  |     if(!m_env.system_fault.boolbit.b0 & m_env.system_ready.boolbit.b0) | ||||||
|  |     { | ||||||
|  |         _set_state_startup(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SYSRestart::_state_startup() | ||||||
|  | { | ||||||
|  |     // Change State if appropriate conditions was happened
 | ||||||
|  | 
 | ||||||
|  |     if(m_registers.counter_timer < m_config.period_timer_startup) | ||||||
|  |     { | ||||||
|  |         m_registers.counter_timer += m_time_sample; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     if(m_env.system_fault.boolbit.b0 | | ||||||
|  |        (m_registers.counter_timer >= m_config.period_timer_startup) | | ||||||
|  |        (m_env.enable_work.boolbit.b0) | | ||||||
|  |        (m_env.remote_stop.state.signal.is_on) | ||||||
|  |        ) | ||||||
|  |     { | ||||||
|  |         _set_state_free(); | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,200 @@ | |||||||
|  | /*
 | ||||||
|  |  * SYSRestart.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/MonitorDigitalInputSignal.h" | ||||||
|  | #include "SYSCTRL/SystemDefinitions.h" | ||||||
|  | #include "SYSCTRL/PhaseAlertMonitor.h" | ||||||
|  | #include "SYSCTRL/SystemEnvironment.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_SYSRESTART_H_ | ||||||
|  | #define SYSCTRL_SYSRESTART_H_ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | struct SYSRestartEnableBitField | ||||||
|  | { | ||||||
|  |     uint16_t enable: 1; | ||||||
|  | };//SYSRestartEnableBitField
 | ||||||
|  | 
 | ||||||
|  | union SYSRestartEnableRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     struct SYSRestartEnableBitField signal; | ||||||
|  |     SYSRestartEnableRegister(): | ||||||
|  |         all((uint16_t)0) | ||||||
|  |     {} | ||||||
|  | };//SYSRestartEnableRegister
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct SYSRestartStatusBitField | ||||||
|  | { | ||||||
|  |     uint16_t fault       : 1; | ||||||
|  |     uint16_t resetfault  : 1; | ||||||
|  |     uint16_t freezefault : 1; | ||||||
|  |     uint16_t startup     : 1; | ||||||
|  |     uint16_t turnon_q1    : 1; | ||||||
|  |     uint16_t turnon_km1   : 1; | ||||||
|  |     uint16_t turnon_km3   : 1; | ||||||
|  | };//SYSRestartStatusBitField
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | union SYSRestartStatusRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     struct SYSRestartStatusBitField signal; | ||||||
|  |     SYSRestartStatusRegister(): | ||||||
|  |         all((uint16_t)0) | ||||||
|  |     {} | ||||||
|  | };//SYSRestartStatusRegister
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct SYSRestartRegisters | ||||||
|  | { | ||||||
|  |     float counter_timer; | ||||||
|  |     float counter_timer_selfclear_attempts; | ||||||
|  |     uint16_t counter_attempts; | ||||||
|  |     SYSCTRL::SystemFaultsRegister status_fault_register; | ||||||
|  |     SYSCTRL::MonitorDigitalInputSignalRegister monitor_fault; | ||||||
|  |     SYSCTRL::MonitorDigitalInputSignalRegister monitor_resetfault; | ||||||
|  |     SYSCTRL::MonitorDigitalInputSignalRegister monitor_startup; | ||||||
|  |     SYSRestartStatusRegister status; | ||||||
|  |     SYSRestartRegisters(): | ||||||
|  |         counter_timer(FP_ZERO), | ||||||
|  |         counter_timer_selfclear_attempts(FP_ZERO), | ||||||
|  |         counter_attempts(0), | ||||||
|  |         status_fault_register(), | ||||||
|  |         monitor_fault(), | ||||||
|  |         monitor_resetfault(), | ||||||
|  |         monitor_startup(), | ||||||
|  |         status() | ||||||
|  |     {} | ||||||
|  | };//SYSRestartRegisters
 | ||||||
|  | 
 | ||||||
|  | struct SYSRestartConfiguration | ||||||
|  | { | ||||||
|  |     SYSRestartEnableRegister  restart_enable; | ||||||
|  |     float period_timer_hold_fault; | ||||||
|  |     float period_timer_reset; | ||||||
|  |     float period_timer_hold_stop; | ||||||
|  |     float period_timer_turnon_switch; | ||||||
|  |     float period_timer_startup; | ||||||
|  |     float period_timer_selfclear_attempts; | ||||||
|  |     uint16_t attempts; | ||||||
|  |     SYSCTRL::SystemFaultsRegister enable; | ||||||
|  |     SYSRestartConfiguration(): | ||||||
|  |         restart_enable(), | ||||||
|  |         period_timer_hold_fault(-1.0), | ||||||
|  |         period_timer_reset(-1.0), | ||||||
|  |         period_timer_hold_stop(-1.0), | ||||||
|  |         period_timer_turnon_switch(-1.0), | ||||||
|  |         period_timer_startup(-1.0), | ||||||
|  |         period_timer_selfclear_attempts(-1.0), | ||||||
|  |         attempts(0), | ||||||
|  |         enable() | ||||||
|  |     {} | ||||||
|  | };//SYSRestartConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct SYSRestartStateBitField | ||||||
|  | { | ||||||
|  |     uint16_t free       : 1; // bit 0
 | ||||||
|  |     uint16_t holdfault  : 1; // bit 1
 | ||||||
|  |     uint16_t resetfault : 1; // bit 2
 | ||||||
|  |     uint16_t holdstop   : 1; // bit 3
 | ||||||
|  |     uint16_t turnonq1   : 1; // bit 4
 | ||||||
|  |     uint16_t turnonkm1  : 1; // bit 5
 | ||||||
|  |     uint16_t turnonkm3  : 1; // bit 6
 | ||||||
|  |     uint16_t startup    : 1; // bit 7
 | ||||||
|  |     uint16_t freezefault: 1; // bit 8
 | ||||||
|  |     uint16_t empty      : 1; // bit 9
 | ||||||
|  |     //
 | ||||||
|  | };//SYSRestartStateBitField
 | ||||||
|  | 
 | ||||||
|  | union SYSRestartStateRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     SYSRestartStateBitField signal; | ||||||
|  |     SYSRestartStateRegister(): | ||||||
|  |         all(0) | ||||||
|  |     {} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class SYSRestart | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     enum mode_t {UNDEFINED, CONFIGURATE, OPERATIONAL}; | ||||||
|  |     enum state_t {FREE, HOLDFAULT, RESETFAULT, HOLDSTOP, TURNONQ1, TURNONKM1, TURNONKM3, STARTUP, FREEZEFAULT, EMPTY}; | ||||||
|  | private: | ||||||
|  |     SYSCTRL::SystemEnvironment& m_env; | ||||||
|  | private: | ||||||
|  |     mode_t m_mode; | ||||||
|  |     state_t m_state; | ||||||
|  |     SYSRestartStateRegister m_state_bit_field; | ||||||
|  |     // Setup parameters
 | ||||||
|  |     float m_time_sample; | ||||||
|  |     // Configuration parameters
 | ||||||
|  |     SYSCTRL::SYSRestartConfiguration m_config; | ||||||
|  |     //
 | ||||||
|  |     SYSCTRL::SYSRestartRegisters m_registers; | ||||||
|  | public: | ||||||
|  |     SYSRestartStatusRegister status; | ||||||
|  | public: | ||||||
|  |     SYSRestart(SYSCTRL::SystemEnvironment& m_env); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(SYSRestartConfiguration& config); | ||||||
|  | public: | ||||||
|  |     mode_t get_mode(); | ||||||
|  |     state_t get_state(); | ||||||
|  |     uint16_t get_state_steps(); | ||||||
|  |     uint16_t get_attempts(); | ||||||
|  |     bool compare(mode_t mode); | ||||||
|  |     bool compare_state(state_t state); | ||||||
|  | public: | ||||||
|  |     void execute(); | ||||||
|  | private: | ||||||
|  |     void (SYSRestart::*_execute)(); | ||||||
|  |     void _execute_undef(); | ||||||
|  |     void _execute_operational(); | ||||||
|  | private: | ||||||
|  |     inline void _set_state_empty(); | ||||||
|  |     inline void _set_state_free(); | ||||||
|  |     inline void _set_state_holdfault(); | ||||||
|  |     inline void _set_state_resetfault(); | ||||||
|  |     inline void _set_state_freezefault(); | ||||||
|  |     inline void _set_state_holdstop(); | ||||||
|  |     inline void _set_state_turnon_q1(); | ||||||
|  |     inline void _set_state_turnon_km1(); | ||||||
|  |     inline void _set_state_turnon_km3(); | ||||||
|  |     inline void _set_state_startup(); | ||||||
|  | private: | ||||||
|  |     void _state_execute(); | ||||||
|  |     void (SYSRestart::*_state_run)(); | ||||||
|  |     void _state_empty(); | ||||||
|  |     void _state_free(); | ||||||
|  |     void _state_holdfault(); | ||||||
|  |     void _state_resetfault(); | ||||||
|  |     void _state_freezefault(); | ||||||
|  |     void _state_holdstop(); | ||||||
|  |     void _state_turnon_q1(); | ||||||
|  |     void _state_turnon_km1(); | ||||||
|  |     void _state_turnon_km3(); | ||||||
|  |     void _state_startup(); | ||||||
|  |     //
 | ||||||
|  | };// SYSRestart
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_SYSRESTART_H_ */ | ||||||
| @ -0,0 +1,94 @@ | |||||||
|  | /*
 | ||||||
|  |  * ScaleCompute.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/ScaleCompute.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | ScaleCompute::ScaleCompute(float& phase_a, float& phase_b, float& phase_c, float& scale_a, float& scale_b, float& scale_c): | ||||||
|  |         m_command(), | ||||||
|  |         m_enable(), | ||||||
|  |         //
 | ||||||
|  |         m_reference_value(FP_ZERO), | ||||||
|  |         //
 | ||||||
|  |         m_p_phase_a(phase_a), | ||||||
|  |         m_p_phase_b(phase_b), | ||||||
|  |         m_p_phase_c(phase_c), | ||||||
|  |         //
 | ||||||
|  |         m_p_scale_a(scale_a), | ||||||
|  |         m_p_scale_b(scale_b), | ||||||
|  |         m_p_scale_c(scale_c), | ||||||
|  |         //
 | ||||||
|  |         m_value_phase_a(FP_ZERO), | ||||||
|  |         m_value_phase_b(FP_ZERO), | ||||||
|  |         m_value_phase_c(FP_ZERO), | ||||||
|  |         //
 | ||||||
|  |         m_scale_phase_a(FP_ZERO), | ||||||
|  |         m_scale_phase_b(FP_ZERO), | ||||||
|  |         m_scale_phase_c(FP_ZERO) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void ScaleCompute::set_reference(float reference) | ||||||
|  | { | ||||||
|  |     m_reference_value = reference; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void ScaleCompute::set_enable() | ||||||
|  | { | ||||||
|  |     m_enable.bit.enable = 1; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void ScaleCompute::clear_enable() | ||||||
|  | { | ||||||
|  |     m_enable.bit.enable = 0; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void ScaleCompute::fix() | ||||||
|  | { | ||||||
|  |     if(m_enable.bit.enable == 1) | ||||||
|  |     { | ||||||
|  |         m_value_phase_a = m_p_phase_a; | ||||||
|  |         m_value_phase_b = m_p_phase_b; | ||||||
|  |         m_value_phase_c = m_p_phase_c; | ||||||
|  |         //
 | ||||||
|  |         m_scale_phase_a = new_scale_compute(m_reference_value, m_value_phase_a, m_p_scale_a); | ||||||
|  |         m_scale_phase_b = new_scale_compute(m_reference_value, m_value_phase_b, m_p_scale_b); | ||||||
|  |         m_scale_phase_c = new_scale_compute(m_reference_value, m_value_phase_c, m_p_scale_c); | ||||||
|  |         //
 | ||||||
|  |         m_p_scale_a = m_scale_phase_a; | ||||||
|  |         m_p_scale_b = m_scale_phase_b; | ||||||
|  |         m_p_scale_c = m_scale_phase_c; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | inline float ScaleCompute::new_scale_compute(float ref, float value, float scale) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     if((value != FP_ZERO) && (ref != FP_ZERO)) | ||||||
|  |     { | ||||||
|  |         return ref * scale / value; | ||||||
|  |         //
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         return scale; | ||||||
|  |         //
 | ||||||
|  |     }//if else
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,79 @@ | |||||||
|  | /*
 | ||||||
|  |  * ScaleCompute.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_SCALECOMPUTE_H_ | ||||||
|  | #define SYSCTRL_SCALECOMPUTE_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | struct ScaleComputeEnableBit | ||||||
|  | { | ||||||
|  |     uint16_t enable: 1; | ||||||
|  | };//ScaleComputeEnableBit
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | union ScaleComputeEnableRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     ScaleComputeEnableBit bit; | ||||||
|  | };//ScaleComputeEnableRegister
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct ScaleComputeCommandBit | ||||||
|  | { | ||||||
|  |     uint16_t start: 1; | ||||||
|  | };//ScaleComputeCommandBit
 | ||||||
|  | 
 | ||||||
|  | union ScaleComputeCommandRegister | ||||||
|  | { | ||||||
|  |     uint16_t all; | ||||||
|  |     ScaleComputeCommandBit bit; | ||||||
|  | };//ScaleComputeCommandRegister
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ScaleCompute | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     ScaleComputeCommandRegister m_command; | ||||||
|  |     ScaleComputeEnableRegister m_enable; | ||||||
|  |     float m_reference_value; | ||||||
|  |     //
 | ||||||
|  |     float& m_p_phase_a; | ||||||
|  |     float& m_p_phase_b; | ||||||
|  |     float& m_p_phase_c; | ||||||
|  |     //
 | ||||||
|  |     float& m_p_scale_a; | ||||||
|  |     float& m_p_scale_b; | ||||||
|  |     float& m_p_scale_c; | ||||||
|  |     //
 | ||||||
|  |     float m_value_phase_a; | ||||||
|  |     float m_value_phase_b; | ||||||
|  |     float m_value_phase_c; | ||||||
|  |     //
 | ||||||
|  |     float m_scale_phase_a; | ||||||
|  |     float m_scale_phase_b; | ||||||
|  |     float m_scale_phase_c; | ||||||
|  | public: | ||||||
|  |     ScaleCompute(float& phase_a, float& phase_b, float& phase_c, float& scale_a, float& scale_b, float& scale_c); | ||||||
|  |     void set_reference(float reference); | ||||||
|  |     void set_enable(); | ||||||
|  |     void clear_enable(); | ||||||
|  |     void fix(); | ||||||
|  | private: | ||||||
|  |     inline float new_scale_compute(float ref, float value, float scale); | ||||||
|  |     //
 | ||||||
|  | };//class ScaleCompute
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_SCALECOMPUTE_H_ */ | ||||||
| @ -0,0 +1,86 @@ | |||||||
|  | /*
 | ||||||
|  |  * SignalDecompose.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/SignalDecompose.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | SignalDecompose::SignalDecompose(): | ||||||
|  |         m_time_sample(-1.0), | ||||||
|  |         m_projection_active(), | ||||||
|  |         m_projection_reactive(), | ||||||
|  |         m_projection_filter_active(), | ||||||
|  |         m_projection_filter_reactive(), | ||||||
|  |         _execute(&SYSCTRL::SignalDecompose::_execute_undef) | ||||||
|  | //
 | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | 
 | ||||||
|  | void SignalDecompose::setup(float time_sample) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_time_sample = time_sample; | ||||||
|  |     m_projection_filter_active.setup(m_time_sample); | ||||||
|  |     m_projection_filter_reactive.setup(m_time_sample); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void SignalDecompose::configure(const SignalDecomposeConfiguration& config) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     m_projection_filter_active.configure(config.projection_filter); | ||||||
|  |     m_projection_filter_reactive.configure(config.projection_filter); | ||||||
|  |     //
 | ||||||
|  |     if((m_time_sample > FP_ZERO) && (config.projection_filter.time > m_time_sample)) | ||||||
|  |     { | ||||||
|  |         _execute = &SYSCTRL::SignalDecompose::_execute_operational; | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalDecompose::reset() | ||||||
|  | { | ||||||
|  |     m_projection_active = FP_ZERO; | ||||||
|  |     m_projection_reactive = FP_ZERO; | ||||||
|  |     m_projection_filter_active.reset(); | ||||||
|  |     m_projection_filter_reactive.reset(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalDecompose::get_outputs(float& projection_active, float& projection_reactive) | ||||||
|  | { | ||||||
|  |     projection_active = m_projection_active; | ||||||
|  |     projection_reactive = m_projection_reactive; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalDecompose::execute(float reference, float ort_cos, float ort_sin) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(reference, ort_cos, ort_sin); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void SignalDecompose::_execute_undef(float reference, float ort_cos, float ort_sin) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalDecompose::_execute_operational(float reference, float ort_cos, float ort_sin) | ||||||
|  | { | ||||||
|  |     //
 | ||||||
|  |     m_projection_active = m_projection_filter_active.execute(1.4142 * reference * ort_cos); | ||||||
|  |     //
 | ||||||
|  |     m_projection_reactive = m_projection_filter_reactive.execute(-(1.4142 * reference * ort_sin)); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,74 @@ | |||||||
|  | /*
 | ||||||
|  |  * SignalDecompose.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/BaseComponent.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_SIGNALDECOMPOSE_H_ | ||||||
|  | #define SYSCTRL_SIGNALDECOMPOSE_H_ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct SignalDecomposeStructure | ||||||
|  | { | ||||||
|  |     float projection_active; | ||||||
|  |     float projection_reactive; | ||||||
|  |     void reset() | ||||||
|  |     { | ||||||
|  |         projection_active = FP_ZERO; | ||||||
|  |         projection_reactive = FP_ZERO; | ||||||
|  |     } | ||||||
|  |     SignalDecomposeStructure(): | ||||||
|  |         projection_active(FP_ZERO), | ||||||
|  |         projection_reactive(FP_ZERO) | ||||||
|  |     {} | ||||||
|  | };//
 | ||||||
|  | 
 | ||||||
|  | struct SignalDecomposeConfiguration | ||||||
|  | { | ||||||
|  |     FLTSYSLIB::FilterForthConfiguration projection_filter; | ||||||
|  |     SignalDecomposeConfiguration(): | ||||||
|  |         projection_filter() | ||||||
|  |     {} | ||||||
|  | };//SignalDecomposeConfiguration
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class SignalDecompose | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     float m_time_sample; | ||||||
|  | private: | ||||||
|  |     float m_projection_active; | ||||||
|  |     float m_projection_reactive; | ||||||
|  |     FLTSYSLIB::FilterForth m_projection_filter_active; | ||||||
|  |     FLTSYSLIB::FilterForth m_projection_filter_reactive; | ||||||
|  | public: | ||||||
|  |     SignalDecompose(); | ||||||
|  |     void setup(float time_sample); | ||||||
|  |     void configure(const SignalDecomposeConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  |     void get_outputs(float& projection_active, float& projection_reactive); | ||||||
|  | public: | ||||||
|  |     void execute(float reference, float ort_cos, float ort_sin); | ||||||
|  | private: | ||||||
|  |     void (SignalDecompose::*_execute)(float reference, float ort_cos, float ort_sin); | ||||||
|  |     void _execute_undef(float reference, float ort_cos, float ort_sin); | ||||||
|  |     void _execute_operational(float reference, float ort_cos, float ort_sin); | ||||||
|  |     //
 | ||||||
|  | };//SignalDecompose
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_SIGNALDECOMPOSE_H_ */ | ||||||
| @ -0,0 +1,134 @@ | |||||||
|  | /*
 | ||||||
|  |  * RelativeSignal.cpp | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/SignalRelative.h" | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | //CONSTRUCTOR
 | ||||||
|  | SignalRelative::SignalRelative(): | ||||||
|  |         BaseComponent(), | ||||||
|  |         m_amplitude(FP_ZERO), | ||||||
|  |         m_relative(FP_ZERO), | ||||||
|  |         m_limit_relative_high(FP_ZERO), | ||||||
|  |         m_limit_relative_low(FP_ZERO), | ||||||
|  |         m_minimal_amplitude_level(FP_ZERO), | ||||||
|  |         m_ampl_filter(), | ||||||
|  |         _execute(&SYSCTRL::SignalRelative::_execute_undef) | ||||||
|  | {}//CONSTRUCTOR
 | ||||||
|  | //
 | ||||||
|  | void SignalRelative::setup(const SignalRelativeSetup& setup) | ||||||
|  | { | ||||||
|  |     static bool status = true; | ||||||
|  | 
 | ||||||
|  |     if(m_mode == SYSCTRL::SignalRelative::UNDEFINED) | ||||||
|  |     { | ||||||
|  |         m_time_sample = setup.time_sample; | ||||||
|  |         m_ampl_filter.setup(m_time_sample); | ||||||
|  | 
 | ||||||
|  |         status &= m_time_sample > FP_ZERO ? true : false; | ||||||
|  |         status &= m_ampl_filter.compare(FLTSYSLIB::AMPL::CONFIGURATE); | ||||||
|  | 
 | ||||||
|  |         if(status) | ||||||
|  |         { | ||||||
|  |             m_mode = SYSCTRL::SignalRelative::CONFIGURATE; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | void SignalRelative::configure(const SignalRelativeConfiguration& config) | ||||||
|  | { | ||||||
|  |     static bool status = true; | ||||||
|  | 
 | ||||||
|  |     if(m_mode == SYSCTRL::SignalRelative::CONFIGURATE) | ||||||
|  |     { | ||||||
|  |         m_limit_relative_high = config.limit_relative_high; | ||||||
|  |         m_limit_relative_low = config.limit_relative_low; | ||||||
|  |         m_minimal_amplitude_level = config.minimal_amplitude_level; | ||||||
|  |         m_ampl_filter.configure(config.amplitude_filter); | ||||||
|  | 
 | ||||||
|  |         status &= m_limit_relative_high > m_limit_relative_low ? true : false; | ||||||
|  |         status &= m_minimal_amplitude_level > FP_ZERO ? true : false; | ||||||
|  |         status &= m_ampl_filter.compare(FLTSYSLIB::AMPL::OPERATIONAL); | ||||||
|  | 
 | ||||||
|  |         if(status) | ||||||
|  |         { | ||||||
|  |             m_mode = SYSCTRL::SignalRelative::OPERATIONAL; | ||||||
|  |             _execute = &SYSCTRL::SignalRelative::_execute_operational; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     }//if
 | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalRelative::reset() | ||||||
|  | { | ||||||
|  |     m_amplitude = FP_ZERO; | ||||||
|  |     m_relative = FP_ZERO; | ||||||
|  |     m_ampl_filter.reset(); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalRelative::get_outputs(float& amplitude, float& relative) | ||||||
|  | { | ||||||
|  |     amplitude = m_amplitude; | ||||||
|  |     relative = m_relative; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalRelative::execute(float reference) | ||||||
|  | { | ||||||
|  |     (this->*_execute)(reference); | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalRelative::_execute_undef(float reference) | ||||||
|  | {}//
 | ||||||
|  | //
 | ||||||
|  | #pragma CODE_SECTION("ramfuncs"); | ||||||
|  | void SignalRelative::_execute_operational(float reference) | ||||||
|  | { | ||||||
|  |     static float _relative = FP_ZERO; | ||||||
|  |     m_amplitude = m_ampl_filter.execute(reference); | ||||||
|  | 
 | ||||||
|  |     if(m_amplitude > m_minimal_amplitude_level) | ||||||
|  |     { | ||||||
|  |         //
 | ||||||
|  |         _relative = reference / m_amplitude; | ||||||
|  |         //
 | ||||||
|  |         if(_relative > m_limit_relative_high) | ||||||
|  |         { | ||||||
|  |             _relative = m_limit_relative_high; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |         if(_relative < m_limit_relative_low) | ||||||
|  |         { | ||||||
|  |             _relative = m_limit_relative_low; | ||||||
|  |             //
 | ||||||
|  |         }//if
 | ||||||
|  |         //
 | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         _relative = FP_ZERO; | ||||||
|  |         //
 | ||||||
|  |     }// if else
 | ||||||
|  |     //
 | ||||||
|  |     m_relative = _relative; | ||||||
|  |     //
 | ||||||
|  | }//
 | ||||||
|  | //
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
| @ -0,0 +1,74 @@ | |||||||
|  | /*
 | ||||||
|  |  * RelativeSignal.h | ||||||
|  |  * | ||||||
|  |  *      Author: Aleksey Gerasimenko | ||||||
|  |  *      gerasimenko.aleksey.n@gmail.com | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include "SYSCTRL/BaseComponent.h" | ||||||
|  | #include "SYSCTRL/HeadersFLTSYSLIB.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef SYSCTRL_RELATIVESIGNAL_H_ | ||||||
|  | #define SYSCTRL_RELATIVESIGNAL_H_ | ||||||
|  | 
 | ||||||
|  | namespace SYSCTRL | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | struct SignalRelativeSetup | ||||||
|  | { | ||||||
|  |     float time_sample; | ||||||
|  |     SignalRelativeSetup(): | ||||||
|  |         time_sample(-1.0) | ||||||
|  |     {} | ||||||
|  | };//SignalRelativeSetup
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct SignalRelativeConfiguration | ||||||
|  | { | ||||||
|  |     float limit_relative_high; | ||||||
|  |     float limit_relative_low; | ||||||
|  |     float minimal_amplitude_level; | ||||||
|  |     FLTSYSLIB::AMPLF4OConfiguration amplitude_filter; | ||||||
|  |     SignalRelativeConfiguration(): | ||||||
|  |         limit_relative_high(1.0), | ||||||
|  |         limit_relative_low(-1.0), | ||||||
|  |         minimal_amplitude_level(0.1), | ||||||
|  |         amplitude_filter() | ||||||
|  |     {} | ||||||
|  | };//SignalRelativeConfiguration
 | ||||||
|  | 
 | ||||||
|  | class SignalRelative: public BaseComponent | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     float m_amplitude; | ||||||
|  |     float m_relative; | ||||||
|  | private: | ||||||
|  |     float m_limit_relative_high; | ||||||
|  |     float m_limit_relative_low; | ||||||
|  |     float m_minimal_amplitude_level; | ||||||
|  | private: | ||||||
|  |     FLTSYSLIB::AMPLF4O          m_ampl_filter; | ||||||
|  | public: | ||||||
|  |     SignalRelative(); | ||||||
|  |     void setup(const SignalRelativeSetup& setup); | ||||||
|  |     void configure(const SignalRelativeConfiguration& config); | ||||||
|  | public: | ||||||
|  |     void reset(); | ||||||
|  |     void get_outputs(float& amplitude, float& relative); | ||||||
|  | public: | ||||||
|  |     void execute(float reference); | ||||||
|  | private: | ||||||
|  |     void (SignalRelative::*_execute)(float reference); | ||||||
|  |     void _execute_undef(float reference); | ||||||
|  |     void _execute_operational(float reference); | ||||||
|  |     //
 | ||||||
|  | };//RelativeSignal
 | ||||||
|  | 
 | ||||||
|  | } /* namespace SYSCTRL */ | ||||||
|  | 
 | ||||||
|  | #endif /* SYSCTRL_RELATIVESIGNAL_H_ */ | ||||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in New Issue