From c689fcb7f9094b96b3eb218ff3a7f0e27c78dbf3 Mon Sep 17 00:00:00 2001 From: Duc Date: Mon, 6 Jan 2025 11:29:57 -0700 Subject: [PATCH] Minor changes --- .../Misc/FileAndFolderManager.Datatypes.cs | 3 -- .../Common/Misc/FileAndFolderManager.cs | 32 +++++++++--------- .../Program/DataDef/PowerSupplySharedData.cs | 7 ++-- Source/Program/ProgramConfigFile/config.ini | 5 +-- .../Threads/PowerSupplyUpdateThread.cs | 3 +- Source/TestStand/power_on.seq | Bin 7319 -> 7276 bytes 6 files changed, 22 insertions(+), 28 deletions(-) diff --git a/Source/Program/Common/Misc/FileAndFolderManager.Datatypes.cs b/Source/Program/Common/Misc/FileAndFolderManager.Datatypes.cs index bf4a78c..04f00f8 100644 --- a/Source/Program/Common/Misc/FileAndFolderManager.Datatypes.cs +++ b/Source/Program/Common/Misc/FileAndFolderManager.Datatypes.cs @@ -33,9 +33,6 @@ namespace ProgramLib // List data folder + its subfolders DATA, DATA_TEMP, - - // List app folder + its folders - APP } public enum Files diff --git a/Source/Program/Common/Misc/FileAndFolderManager.cs b/Source/Program/Common/Misc/FileAndFolderManager.cs index ffdc1e0..45e1c2b 100644 --- a/Source/Program/Common/Misc/FileAndFolderManager.cs +++ b/Source/Program/Common/Misc/FileAndFolderManager.cs @@ -15,13 +15,11 @@ GOVERNMENT. UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY. -------------------------------------------------------------------------*/ +using Raytheon.Common; using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Raytheon.Common; +using System.Reflection; namespace ProgramLib { @@ -44,9 +42,9 @@ namespace ProgramLib { _programConfig = programConfig; - buildFolders(); - createFolders(); - buildFiles(); + ConstructFolderPaths(); + CreateFolders(); + ConstructFilePaths(); } /// @@ -54,16 +52,18 @@ namespace ProgramLib /// /// /// - private void buildFolders() + private void ConstructFolderPaths() { - string dataBasePath = _programConfig.ReadValue(ProgramConfigIni.GENERAL.ToString(), ProgramConfigIni.DATA_BASE_PATH.ToString(), "NOT SET"); - foldersDict[Folders.DATA] = dataBasePath; + string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + + string dataRootPath = _programConfig.ReadValue(ProgramConfigIni.GENERAL.ToString(), ProgramConfigIni.DATA_BASE_PATH.ToString(), "NOT SET"); + if (!Path.IsPathRooted(dataRootPath)) + dataRootPath = Path.Combine(assemblyFolder, dataRootPath); + + foldersDict[Folders.DATA] = Path.GetFullPath(dataRootPath); string val = _programConfig.ReadValue(ProgramConfigIni.GENERAL.ToString(), ProgramConfigIni.DATA_TEMP_PATH.ToString(), "NOT SET"); - foldersDict[Folders.DATA_TEMP] = Path.Combine(dataBasePath, val); - - string appBasePath = _programConfig.ReadValue(ProgramConfigIni.GENERAL.ToString(), ProgramConfigIni.APP_BASE_PATH.ToString(), "NOT SET"); - foldersDict[Folders.APP] = dataBasePath; + foldersDict[Folders.DATA_TEMP] = Path.Combine(dataRootPath, val); } /// @@ -71,7 +71,7 @@ namespace ProgramLib /// /// /// - private void createFolders() + private void CreateFolders() { Directory.CreateDirectory(foldersDict[Folders.DATA_TEMP]); } @@ -81,7 +81,7 @@ namespace ProgramLib /// /// /// - private void buildFiles() + private void ConstructFilePaths() { string val = _programConfig.ReadValue(ProgramConfigIni.GENERAL.ToString(), ProgramConfigIni.POWER_SUPPLY_SELF_TEST_DATETIME.ToString(), "NOT SET"); filesDict[Files.POWER_SUPPLY_SELF_TEST_DATETIME] = Path.Combine(foldersDict[Folders.DATA_TEMP], val); diff --git a/Source/Program/DataDef/PowerSupplySharedData.cs b/Source/Program/DataDef/PowerSupplySharedData.cs index a77cd50..46db319 100644 --- a/Source/Program/DataDef/PowerSupplySharedData.cs +++ b/Source/Program/DataDef/PowerSupplySharedData.cs @@ -59,12 +59,13 @@ namespace ProgramLib lock (syncObjDict[moduleName]) { - if (!_powerSupplyDataDict.ContainsKey(moduleName)) + PowerSupplyData data = null; + if (_powerSupplyDataDict.ContainsKey(moduleName)) { - throw new Exception($"{moduleName} is invalid"); + data = _powerSupplyDataDict[moduleName]; } - return _powerSupplyDataDict[moduleName]; + return data; } } diff --git a/Source/Program/ProgramConfigFile/config.ini b/Source/Program/ProgramConfigFile/config.ini index 39f0483..d79781b 100644 --- a/Source/Program/ProgramConfigFile/config.ini +++ b/Source/Program/ProgramConfigFile/config.ini @@ -1,11 +1,8 @@ [GENERAL] ; specify data folder and all subfolders in it -DATA_BASE_PATH = C:\NGSRI\Data +DATA_BASE_PATH = .\Output DATA_TEMP_PATH = Temp -; specify app folder and all subfolders in it -APP_BASE_PATH = C:\NGSRI\App - ; Log names POWER_SUPPLY_SELF_TEST_DATETIME = power_supply_self_test_datetime.xml diff --git a/Source/Program/Threads/PowerSupplyUpdateThread.cs b/Source/Program/Threads/PowerSupplyUpdateThread.cs index 5b5cc38..15797a2 100644 --- a/Source/Program/Threads/PowerSupplyUpdateThread.cs +++ b/Source/Program/Threads/PowerSupplyUpdateThread.cs @@ -131,7 +131,6 @@ namespace ProgramLib EventGroup eventGroup = new EventGroup(eventDict); - Random rnd = new Random(); while (true) { Events id = eventGroup.WaitAny(pollRateMs); @@ -140,7 +139,7 @@ namespace ProgramLib { PowerSupplyData data = Program.Instance()._powerSupplySharedData.GetData(PowerSupplyConstants.POWER_DEVICE.STE_PVM_5V.ToString()); - if (data._initialized) + if (data != null && data._initialized) { _powerModuleToPowerDataModelDict["UUT_P20V"].ActualVoltage = data._voltage.ToString("0.00"); _powerModuleToPowerDataModelDict["UUT_P20V"].ExpectedVoltage = data._powerSupplyModuleInfo.voltageSetpoint_.ToString("0.00"); diff --git a/Source/TestStand/power_on.seq b/Source/TestStand/power_on.seq index 3e6a31eb8680ba04b5d319c558cd7d2cb84d99da..ac6efb4aadbd6b1a0faeafed1e1a9f65a780d0f6 100644 GIT binary patch delta 5957 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 delta 6000 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