Compare commits

..
Author SHA1 Message Date
Milan Hanajik 6c996f9a03 Reconfigured for ROMA_200 2023-06-20 15:23:47 +02:00
Milan Hanajik 0a1d6b9dd6 Last RFID change reverted. 2023-06-20 15:23:47 +02:00
Milan Hanajik e93aa6a21e Roma200 : Hydraulical scheme updated, ELDE component dated 230613 2023-06-20 15:23:23 +02:00
Milan Hanajik 812ac96284 Bug in water meter chart fixed : Incorrect error limit lines 2023-06-16 15:32:25 +02:00
Milan Hanajik 363f42e75b 1. MainSeqUtils.CreateNewBatchResults( ) : WaterMeterData.ErrLimHi/LoQ initialized properly, 2. comments. 2023-06-16 13:36:15 +02:00
Milan Hanajik 2232c31451 DiverterTest : Delay TimeFlow2Mass (min. 5 s) between tests, UpgradeSlectionDlg changes, ver. 2.33.2061 2023-06-16 12:08:51 +02:00
Milan Hanajik 1c6e3c17fa Merge branch 'master-2' of gitserver:/srv/git/tbf into master-2 2023-06-15 12:03:26 +02:00
Milan Hanajik 4d0c34b544 UI.Procedures.ProceduresCtrl : MoreContent.DEAndSequences added, ver. 2.33.2059 2023-06-15 11:33:50 +02:00
Milan Hanajik 93c2338d6c ver. 2.33.2058 2023-06-13 10:30:36 +02:00
Jan Augustin a455d62e9e RfidCommunicationService.RfidRead method - return type changed to dynamic. 2023-06-09 09:29:57 +02:00
Milan Hanajik aed42818b5 Upgrade from 2.32 to 2.33 takes care for rounding of Volume and TestTime after a conversion to double. 2023-06-09 09:08:58 +02:00
Milan Hanajik 281aa93b4b Merge branch 'master-2-Clean-up-of-MySQL-DB-sessions' into master-2, ver. 2.33.2057
# Conflicts:
#	Config/FluentCommon.cs
#	TBF/Properties/AssemblyInfo.cs
#	TBF/Resources/Strings.resx
#	TBF/Rig/Output/DB/ProductionTracing/Tracing.cs
#	TBF/UI/Procedures/ProcedureDlg.cs
2023-06-07 16:21:54 +02:00
Milan Hanajik 3fee487c5d Access rights clean-up for PL 2023-05-30 11:23:29 +02:00
Milan Hanajik e50c636a34 ver. 2.32.2051 2023-05-22 13:02:59 +02:00
Milan Hanajik 1cbab1acd7 Timeout of all MySQL DB connections is 120 seconds, ver. 2.32.2050 2023-05-22 12:59:47 +02:00
Milan Hanajik 3bc8b55429 Access rights clean-up for PL 2023-05-22 12:59:36 +02:00
Milan Hanajik e6fc3c25d6 StateMachine bug fix : InitializeBoardEtc( ) session argument missing 2023-05-02 16:09:54 +02:00
Milan Hanajik b965541b1c TestWizard.VolumeAndErrorSelection fixed - conversion to float avoided. 2023-04-24 20:02:47 +02:00
Milan Hanajik 02fae9b11e Batch.SaveTime set at the end of a cycle, clean-up 2023-04-24 11:23:57 +02:00
Milan Hanajik 1eda22a391 (1) Initialization of components : Inner exception displayed, (2) Clean-up. 2023-04-24 10:36:51 +02:00
Milan Hanajik 15c916ae66 ver. 2.32.2039 2023-04-20 12:36:32 +02:00
Milan Hanajik 03fb87e6ed ver. 2.32.2038 2023-04-19 12:06:27 +02:00
Milan Hanajik bf67b4a4ec Events DB changes 2023-04-19 12:06:16 +02:00
Milan Hanajik 78d05fb1b9 TBF.DB with 4 static session factories, sessions in UI rewritten, TODO: keep session that loads components open, etc. 2023-04-19 12:06:04 +02:00
Milan Hanajik 0d47578441 Production tracing bug fix : Previous workstep result was not checked, mere existence of a record was sufficient for a WM to pass 2023-04-17 10:26:17 +02:00
Milan Hanajik 07d75b7d00 Bug fix in MakeSimulatedTrivial( ) 2023-04-17 10:26:17 +02:00
Milan Hanajik cc88308513 Production tracing bug fix II. 2023-04-14 12:34:08 +02:00
Milan Hanajik bdf3d155f4 Merge branch 'master-2' of gitserver:/srv/git/tbf into master-2 2023-04-14 09:38:16 +02:00
Jan Augustin fe4531ad4c libRfid1.dll removed 2023-04-14 09:29:56 +02:00
Milan Hanajik 23f9331460 Production tracing bug fix : Previous workstep result was not checked, mere existence of a record was sufficient for a WM to pass 2023-04-13 18:00:37 +02:00
Milan Hanajik 0d6875065c Clean-up 2023-04-12 12:25:36 +02:00
Milan Hanajik b56f712c71 Clean-up 2023-04-11 16:17:12 +02:00
Milan Hanajik 7cc20771fe Statistics.LocalSettings updated. 2023-04-11 16:15:57 +02:00
Milan Hanajik 3efb042d18 Statistics.LocalSettings updated. 2023-04-03 09:56:58 +02:00
Milan Hanajik fba8c52dfb 1. TestWizard.FlowSelection fixed: float avoided, 2. Rounding of test flows after conversion, ver. 2.33.2034 2023-04-02 12:27:38 +02:00
Milan Hanajik aa10ea5c04 float -> double : Qtg, Qfrom, Qto, Volume, TestTime, ver. 2.33.2033 2023-03-31 13:21:38 +02:00
Milan Hanajik f457278342 Batch.SaveTime set at the end of a cycle, clean-up 2023-03-30 16:55:13 +02:00
Milan Hanajik a0c45d2b39 UpgradeSelectionDlg changes : ver. 2.26 -> ver. 2.33 2023-03-29 11:57:50 +02:00
Milan Hanajik 799e5be919 All Output.Printers components : string PrinterName parameter specifies printer to be used. 2023-03-29 10:06:47 +02:00
Milan Hanajik 08c4541914 default_printer added to, Qmax,Qn,Qt,Qmin removed from TBF.Resources.Strings 2023-03-29 10:06:46 +02:00
Milan Hanajik 7b95f5f436 WMChart can plot error limits other then 2% and 5% and qp,qi style hyperbolic error limits, related DB and UI changes, ver. 2.33.2027 2023-03-29 10:06:46 +02:00
Milan Hanajik f0e57554f2 Printing from PreviousResultsDlg, ver. 2.32.2027 2023-03-13 10:14:54 +01:00
Milan Hanajik c8a5640ddc ver. 2.32.2026 2023-03-08 10:35:56 +01:00
Milan Hanajik 1a7a5661c4 iPerlCommunication : Activity 'Q2 corrected from <test> plus' supported, ver. 2.32.2025 2023-03-08 10:01:18 +01:00
Milan Hanajik 94e83ad63a ver. 2.32.2023 2023-03-02 10:42:43 +01:00
Milan Hanajik 5d2008a6dd DataEntry.S620 : Slovak keyboard check. 2023-03-02 10:36:24 +01:00
Milan Hanajik c315c8a42b TestMethods.Message added. 2023-03-02 10:25:33 +01:00
Milan Hanajik aaa78d60db Display batch end time estimate according to a sample batch, ver. 2.32.2022 2023-03-02 10:25:24 +01:00
Milan Hanajik 4b42b5ba7a Procedure number displayed in TBF.UI.ResultsMI.PreviousResultsCtrl, the form is wider, etc. 2023-03-01 11:04:09 +01:00
Milan Hanajik 6e04933eeb Refactorization : Common.Utils.GetParity( ) / GetStopBits( ) / GetHandshake( ) ... 2023-03-01 11:04:09 +01:00
Milan Hanajik f47e7670a3 BatchResultsDlg moved to TBF.UI.ResultsMI 2023-02-27 12:37:41 +01:00
Milan Hanajik 78575e4f6f iPerlCommunications : Modifications for Australia (plus), ver. 2.31.2018 2023-02-24 10:17:24 +01:00
Milan Hanajik b38ee92fe4 ver. 2.31.2017 2023-02-17 11:45:42 +01:00
Milan Hanajik 4ac72c6bbf IperlLogger handles more then 20 tests, previous results open on current screen, etc., ver. 2.31.2016 2023-02-17 09:22:00 +01:00
Milan Hanajik c0e7eab3b2 Order of saving results to MySql DB and to other destinations changed, try-catch for other destinations, ver. 2.31.2014 2023-02-02 11:08:12 +01:00
Milan Hanajik 5081969fdc DataEntry.iPerl.CycleBeginningForm supports up to 10 digit or letter purchase order, ver. 2.31. 2011 2023-01-25 12:11:14 +01:00
Milan Hanajik df386a14f8 SensusOracle.DB : Handling of a crash in transaction.Rollback(), ver. 2.31.2009 2023-01-23 13:10:13 +01:00
Milan Hanajik 2b0ee55901 SensusOracle.Database bug fix : No attempt to read bemerkung from vt_wztyp_sd, ver. 2.31.2007 2023-01-19 08:05:44 +01:00
Milan Hanajik 5b893d69b4 ver. 2.31.2006 2023-01-17 13:00:41 +01:00
Milan Hanajik a50c867b7e SensusOracle.Database uses LUTestData[] based complete test inof-s from test parameters OraId, OraDesignation, etc, ver. 2.31.2003 2023-01-17 12:57:52 +01:00
Milan Hanajik ebcbd47f91 PruefungsNr calculation that uses OraIdRepetMulti / RawDataIdRepetMulti modified, ver. 2.31.2002 2023-01-13 12:33:21 +01:00
Milan Hanajik 310ed6158a ver. 2.31.2001 2023-01-11 14:27:10 +01:00
Milan Hanajik c64e8e773f OraId, OraDesignation, RawDataId ... related : Fixed the case ORACLE_DB is not defined. 2023-01-04 09:03:08 +01:00
Milan Hanajik 56275063f7 Changes for Fuzhou PT300 done in version 2.26.1569 --> 2.26.1998. 2022-12-25 15:42:04 +01:00
Milan Hanajik d7401cfec4 Bug fix : DataEntry.StandardCamera.TestStartEndForm crashed when no RR was defined at certain position 2022-12-21 09:35:36 +01:00
Milan Hanajik 0849467857 IperlHead.DetermineExtraDataFileName( ) fixed, ver. 2.31.1996 2022-12-13 16:33:13 +01:00
Milan Hanajik d83762ddec Refactorization : Common.Utils.GetTestName(...) replaces Results.Utils.GetTestName(...) 2022-12-13 13:16:15 +01:00
Milan Hanajik 4640018e78 FileWriters.IperlLogger rewritten : uses OraId, OraIdRepetMulti, OraDesignation and LUTestData class, BatchResults bug fix 2022-12-13 13:15:33 +01:00
Milan Hanajik 67ebe0718a ProcedureDlg : 1. Qtg is displayed when ORACLE_DB defined, 2. Qtg can be changed when procedure is not protected. 2022-12-13 13:15:23 +01:00
Milan Hanajik b1bebbff50 ORACLE_DB : entities Test and TestData contain OraId, OraIdRepetMulti, OraDesignation, RawDataId, ... ver. 2.31.1994 2022-12-13 13:15:13 +01:00
Milan Hanajik 26126d380b Bug fix : Pruefindex / MaxTestIndex evaluated correctly now. 2022-12-06 10:54:55 +01:00
Milan Hanajik c6a2965faf iPerlCommunication : Milestones reset on start of the session. 2022-11-23 08:12:51 +01:00
Milan Hanajik 77c713425a ver. 2.31.1990 2022-11-21 12:08:48 +01:00
Milan Hanajik 604120e2b8 Test profile includes test method, ver. 2.31.1988 2022-11-18 13:35:43 +01:00
Milan Hanajik d29d8be81a FixedStartMassCollection : Flow adjustment during measurement, ver. 2.30.1987 2022-11-18 12:34:31 +01:00
Milan Hanajik 6a374c5af0 Approval by legalizator only when !string.IsNullOrEmpty(AltProcName), legalizator full name used in reports, ver. 2.30.1986 2022-11-18 11:55:23 +01:00
Milan Hanajik a14e21eb57 Profile import fixed. 2022-11-18 10:52:36 +01:00
Milan Hanajik 100a357fc1 MainSeq: Approval by legalizator, ver. 2.30.1984 2022-11-18 10:52:36 +01:00
Milan Hanajik 75fcffc9c3 Create from profile button in ProceduresDlg enabled again, etc, ver. 2.30.1983 2022-11-18 10:52:36 +01:00
Milan Hanajik 8d6d0c011b Procedures : Selection via profiles, More column can display profile, ver. 2.30.1982 2022-11-16 06:50:18 +01:00
Milan Hanajik be8f6814c8 Power user password changes. 2022-11-14 07:09:39 +01:00
Milan Hanajik 75766938be FixedStartMassCollection : Diverter to tank after start valve is closed, 'Winiki lub E' support MeterTestRslt, ver. 2.30.1980 2022-11-10 15:39:12 +01:00
Milan Hanajik 08b3ab45ba Browsing previous results : SerialNr can be used as search criterion, ver. 2.30.1978 2022-11-09 11:22:39 +01:00
Milan Hanajik 0539844d85 RegValvePosition class with RV/position pair, FeedingPath RV positions used in sequences, ver. 2.30.1976 2022-11-04 12:23:22 +01:00
Milan Hanajik da7ac83c75 Bug fix : Prevent crash in certain cases when using MakeSimulated( ). 2022-11-04 12:23:22 +01:00
Milan Hanajik 01f0c03f62 Bug fix : Prevent crash in certain cases when using MakeSimulated( ). 2022-11-02 08:57:57 +01:00
Milan Hanajik 9ac1b0b6fa Project dependencies fixed 2022-10-19 08:18:29 +02:00
Milan Hanajik 685d57db8b Clean-up 2022-10-10 08:12:49 +02:00
Milan Hanajik 7de5551c24 IperLogger.ProcParams (DesigMode, DesigType), etc. 2022-10-04 11:31:58 +02:00
Milan Hanajik 36c52e5d7e DataEntry.StandardCamera changes - OCR as for Hong Kong, ver. 2.30.1971 2022-10-04 11:29:45 +02:00
Milan Hanajik 9f6bfc6410 1 Common.Enums.Mounting.HV added, 2 iPerlCommunicationForm bug fix, ver. 2.30.1966 2022-09-26 17:09:30 +02:00
Milan Hanajik 81498a6db4 LiveStream : New default values for OverlayLeft/Top/Width/Height test parameters. 2022-09-26 09:47:58 +02:00
Milan Hanajik a595b6cd8d TURA_SPECIAL : WMsCount = LineSize = 8, ver. 2.30.1962 2022-09-19 09:25:45 +02:00
Milan Hanajik 668d68a80c ver. 2.30.1960 2022-09-14 08:34:27 +02:00
Milan Hanajik 61ea3ef86b Renaming transition sequences enhanced, ver. 2.30.1959 2022-09-08 12:46:03 +02:00
Milan Hanajik a7118935ca iPerlCommunication : Sequence conditions 2022-09-08 12:45:54 +02:00
Milan Hanajik b044b00571 Start/EndTestingSealedMeter activity for iPerlCommunicationForm. 2022-09-06 21:20:49 +02:00
Milan Hanajik 0e77a31a0f Remote database exception logging, ver. 2.30.1956 2022-09-06 13:44:48 +02:00
Milan Hanajik 2183d1c452 Components with proc. params. in 'More" tab in ProcedureDlg are determined automatically, ver. 2.30.1955 2022-09-04 21:01:39 +02:00
Milan Hanajik be97777159 1 CLP1611.Camera scp file upload disabled, 2 LiveStream method displays an overlay (test param.) in the image stream. 2022-08-30 14:58:27 +02:00
Milan Hanajik 4781acf3e2 Camera.CLP1611.GrabImagesOp does not delete and overwrite images in simulation mode. 2022-08-30 14:58:27 +02:00
Milan Hanajik 207d4be3d6 Batch nr. is displayed in MainWnd 2022-08-30 14:58:26 +02:00
Milan 92b2f55871 Clean-up 2022-08-30 14:58:26 +02:00
Milan Hanajik 0fd0c44c18 Better on-screen error message when a path is missing in a test. 2022-08-30 14:58:26 +02:00
Milan Hanajik 5629b94e47 All projects targer .Net Framework 4.7.2 2022-07-28 12:45:00 +02:00
Milan Hanajik 3bff80f64b Selectors are used in TestWizard in FlowSelection and TestProfileSelection, Map(x => x.selectors) in all paths, ver. 2.30.1930 2022-07-01 11:59:34 +02:00
Milan Hanajik b3df3307a0 When using 'Create from Profile' the generated tests can be renamed, order of profilesin ComboBox. 2022-06-30 17:48:17 +02:00
Milan Hanajik 1f12464218 TBF.UI.Procedures.Formulas static class, refactorization. 2022-06-28 12:26:01 +02:00
Milan Hanajik b17282f826 UI.Procedures.TestWizard.TestProfileSelection : Q1/2/3/4/min/t/n/max/p/i are not case sensitive, ver. 2.29.1929 2022-06-28 11:10:06 +02:00
Milan Hanajik ae348d13fd Custom units in MetrologyDlg tabs : Bug fixes : 1. Test after adding a value, 2. test of FlowMeter+rangeIx, ver. 2.29.1927 2022-06-23 15:30:51 +02:00
Milan Hanajik e7ab26669e Custom units in MetrologyDlg tabs Balance, FlowMeter, PressMeter and TempMeter, ver. 2.29.1926 2022-06-22 13:52:13 +02:00
Milan Hanajik c44202b0ce DataStream.Reader.ProcParams class added, ver. 2.28.1925 2022-06-14 13:53:27 +02:00
Milan Hanajik db0939ec0d ProcessTabPageCtrl24 English units support. 2022-06-08 13:47:55 +02:00
Milan Hanajik 3dc6f291bb Early loading of the 1st component implementing IBenchInfo to ProcessData.BenchInfo. 2022-06-08 13:47:46 +02:00
Milan Hanajik 38b8184dfb ErrorFlags and FlyingStartMassCollProlong : English units supported. 2022-06-03 12:29:38 +02:00
Milan Hanajik e12a3eecba TempControl.Novus : (1) fixes in sequence operations implementation, (2) N1040 support, ver. 2.28.1924 2022-06-03 12:29:13 +02:00
Milan Hanajik a7a7fbd403 Reservoir(s) in Elde component : T and SP display. 2022-06-01 12:09:39 +02:00
Milan Hanajik 0fa621bd6a Modbus.TempControl.Novus works OK, TODO: T and SP display on Elde component. 2022-06-01 12:09:39 +02:00
Milan Hanajik 1b14954a6d TBF.UI.Bench.Paths controls support imperial units for flow. 2022-06-01 12:09:39 +02:00
Milan Hanajik a70491d236 Clean-up 2022-06-01 12:09:31 +02:00
Milan Hanajik 071abc015b TURA_SPECIAL related fix. 2022-05-31 17:02:43 +02:00
Milan Hanajik 03e0120121 ProceduresDlg closing improvements : Double saving to DB and saving when the dialog is still locked prevented. 2022-05-30 11:45:04 +02:00
Milan Hanajik 87a60be61f OneWMResult...Ctrl caption with position, pruefindex, clean-up, more comments, ver. 2.28.1921 2022-05-30 11:44:49 +02:00
Milan Hanajik 420efb1ae0 Simulation of fixed start mass collection method with still camera images possible. 2022-05-27 14:20:21 +02:00
Milan Hanajik 23793d20da Bug fix (Test.TempControl related). 2022-05-27 09:54:09 +02:00
Milan Hanajik 0983270730 More Users.CurrentUser related changes (IPERL) 2022-05-27 09:54:09 +02:00
Milan Hanajik d8a6404e83 Users.CurrentUser static class with Stack<UserAndForm> userStack, Change() and Restore(). 2022-05-27 09:54:09 +02:00
Milan Hanajik 4197328be9 TBF.Rig.Dummy.TempControl added. 2022-05-27 09:54:09 +02:00
Milan Hanajik 7f3cc27138 Modbus.Novus --> Modbus.TempControl.Novus, Common.Modbus: string[] ComponentNames, etc. (builds OK) 2022-05-27 09:53:06 +02:00
Milan Hanajik 80d347ef54 Modbus.Easytherm --> Modbus.TempControl.Easytherm 2022-05-23 09:58:20 +02:00
Milan Hanajik 6d3ed2799b MainSeq uses string Test.TempControl to set temperature setpoint. 2022-05-23 09:58:20 +02:00
Milan Hanajik 72bf9135b5 UI.Procedures.ProcedureDlg Metrology 2 tab supports TempControl test parameter. 2022-05-19 16:31:57 +02:00
Milan Hanajik aa1d9e4b3b string Test.TempControl and string TestData.TempControl added and used in sequences. 2022-05-19 16:16:31 +02:00
Milan Hanajik dab575dc49 Clean-up after comparing DataEntry.S620 and SensusOracle with 1837 (iperlNew on WR19), ver. 2.27.1917 2022-05-18 10:28:11 +02:00
Milan Hanajik 2c91ded0db Safe wrappers in ProcessData, clean-up. 2022-05-16 15:18:42 +02:00
Milan Hanajik 8d640bb52a Bug fix in TBF.Rig.DataEntry.Double24.CycleBeginningForm 2022-05-04 12:50:11 +02:00
Milan Hanajik 1b4ac3451f Bug fix in TBF.Rig.Bench/Feeding/Meters/OutputPath 2022-04-15 13:30:58 +02:00
Milan Hanajik ef13de9874 LeakTest modified : 1. close valve+pump off 2. delay 3. start mass 4. leak test 5. end mass, ver. 2.27.1875 2022-04-08 11:10:01 +02:00
Milan Hanajik c2d5719d31 PMaxTest/LeakTest.TestMethodCfgCtrl removed, other minor changes. 2022-04-07 08:54:33 +02:00
Milan Hanajik 96a86a04da UserManagement fixed : DbType = DBType.MySql 2022-04-05 10:13:28 +02:00
Milan Hanajik 2a26da6337 IperlHead.CalculateQ2CorrectionFactor( ) bug fix for R400, etc, ver. 2.27.1873 2022-03-11 00:13:47 +01:00
Milan Hanajik 8ef21b3831 SensusTestInfo : LogType.JustA0_Q3Q2Q1 added, GetBestMatch( ) modified 2022-02-23 16:20:07 +01:00
Milan Hanajik 75c97d99e8 iPerlComm : Strict Q2 Error Check, Datastr.proc.started simult.after 'Set test mode', Input ser.buffers flushed, MT locking, Q2 corr.for all Rxyz, ver. 2.27.1870 2022-02-23 16:19:51 +01:00
Milan Hanajik d7fd270cd5 Clean-up, minor changes. 2022-01-28 10:40:08 +01:00
Milan Hanajik f6886a8fdc UI : ProcedureDlg : TempLo, TempHi, TempUnit, Uncertainty and Repeats in Metrology I and II swapped. 2022-01-28 10:40:07 +01:00
Milan Hanajik 947d0198c1 Some shared classes and interfaces moved to project Common, re-factorization. 2022-01-23 19:56:15 +01:00
Milan Hanajik a4a583c41a Everything uses Common.Forms.ListViewEx, other LIstViewEx-es removed. 2022-01-23 13:58:54 +01:00
Milan Hanajik 61add6be07 Common.Forms with ListViewE and ModelessForm as in ver. 3.1 2022-01-23 13:25:32 +01:00
Milan Hanajik 5a5f8493f2 IperlHead : Simultaneous serial port flushing after switching to the test mode. 2022-01-23 13:19:20 +01:00
Milan Hanajik cfaf8e6a59 FeatureVectorCalculatore bug fix : case when complete curve is below zero and fromZero == true 2022-01-20 13:16:33 +01:00
Milan Hanajik 5854a6e620 Water meter test results graph fixed, ver. 2.27.1851 2022-01-14 14:39:57 +01:00
Milan Hanajik 5623f27959 ELDE component for Luxemburg-40 upgraded, 13.01.2022. 2022-01-14 14:38:35 +01:00
Milan Hanajik 15e5d65ee9 Bug fixes : Ambient temperature, pressure, humidity calculation in Results. 2022-01-05 12:33:22 +01:00
Milan Hanajik 8e0417de9c MeterTestRslt.Passed set correctly in iPerlCommunicationSeq.MakeQ2CorrectedFrom( ) 2022-01-04 21:56:38 +01:00
Milan Hanajik ffb6401555 Clean-up 2022-01-04 18:15:49 +01:00
Milan Hanajik 7216ac321d Bug fixes : 1 Saving results cannot be stopped, 2 Processing statistics, 3 SensusTestInfo.AreCompatible( ) 2022-01-04 15:38:38 +01:00
Milan Hanajik 5fea1834bb Bug fix in Results.Output.SensusTestInfo, ver. 2.27.1844 2022-01-03 11:07:00 +01:00
Milan Hanajik 5c53929efe ResultsParser project added, ver. 1.0.0 2021-12-16 16:19:14 +01:00
Milan Hanajik 3812438e97 iPerlCommunication bug fix (OoR situation), Ora.Database bug fix (mech. meter update), ver. 2.27.1841 2021-12-15 17:00:51 +01:00
Milan Hanajik 3cb64b2684 TBF.Rig.Network.Comet.Ambient fixed : UpdateProcessData() was missing. 2021-12-15 17:00:44 +01:00
Milan Hanajik 7ea057dab4 S640CommForm cosmetical changes. 2021-12-07 12:05:28 +01:00
Milan Hanajik 0493f8fae5 Component for Gelsenwasser 2021-12-01 10:38:35 +01:00
Milan Hanajik ed606701c0 TestMethods.Evacuation added, ProcessData.FillState updated by SequenceBase.Transition(), ver. 2.27.1813, Statistics v. 2.27.1800 2021-11-22 15:22:01 +01:00
Milan Hanajik 1d152afd6c Output.FileWriters and Output.Printers changes, ver. 2.27.1807 2021-11-15 15:32:21 +01:00
Milan Hanajik 71517b6cdb TBF.Rig.DataEntry.Double24 2021-11-15 15:32:10 +01:00
Milan Hanajik 284feb73dc Bug fix : 6x try / catch to resolve crashes caused by GemCard, etc. 2021-11-11 06:32:47 +01:00
Milan Hanajik ce74b0a3bb Milwaukee component upgraded 2021-11-11 06:32:38 +01:00
Milan Hanajik 4de15b9a7c Clean-up / style changes. 2021-11-11 06:32:38 +01:00
Milan Hanajik 6fd7845d63 Unit selection in DataEntry.Standard24.TestStartEndForm, related changes in TestMethods, ver. 2.27.1802 2021-11-11 06:32:38 +01:00
Milan Hanajik 30c8433cb0 Results.Entities.WaterMeter bug fixes, style changes. 2021-11-11 06:32:38 +01:00
Milan Hanajik 7cf862410b Unit selection in UI.Procedures.TestWizard. 2021-11-09 12:12:52 +01:00
Milan Hanajik 766b52865a UI.Procedures.ProcedureDlg : Units selection in ProcedureDlg / Metrology1 Tab. 2021-11-09 12:12:44 +01:00
Milan Hanajik b9aebd8903 LeakTest : Delay when reading initial pressure, ver. 2.27.1800 2021-11-07 03:30:56 +01:00
Milan Hanajik 50494fccc9 Preferred units in all BenchInfo components and IBenchInfo, Units.ConvertFrom/To for float. 2021-11-04 08:53:12 +01:00
Milan Hanajik e0c2004f52 Milwaukee component update : Schematic drawing changes. 2021-11-02 18:04:49 +01:00
Milan Hanajik d86daefc81 bug fix in FlexFlow - SaveTestResult, ver. 2.27.1791 2021-11-02 12:23:51 +01:00
Milan Hanajik dd52b9d139 Bug fixes : Oracle in Chennai, ver. 2.27.1783 2021-10-26 19:38:39 +02:00
Milan Hanajik eec84351ac TBF.BenchControl... --> TBF.Rig... 2021-10-26 19:38:09 +02:00
Milan Hanajik 7b7b515154 More logging : List of component classes on program start-up, ver. 2.27.1783 2021-10-26 10:35:02 +02:00
Milan Hanajik 6c57f8c76a Output.DB.SensusOracle : New config. parameter TestBenchGroupId replaces constant 18000, ver. 2.27.1782 2021-10-25 12:44:54 +02:00
Milan Hanajik 3312dc40f8 S640 : Only 'passed' WMs are sealed at the end, counting pieces fixed, MeterTestRslt.Passed fixed. 2021-10-20 18:22:21 +02:00
Milan Hanajik 54cb6e4303 S640Communication : Skip bad meters feature added, file exchg timeouts up to 2000s, etc, ver. 2.27.1781 2021-10-20 17:37:15 +02:00
Milan Hanajik 4f2fb85372 SensusOracle.Database bug fix for mechanical meters. 2021-10-20 16:24:21 +02:00
Milan Hanajik a3f8902266 UI.ResultsMI.PreviousResultsDlg : Send again changes, interactive database and water meters selection, ver. 2.27.1781 2021-10-20 15:31:23 +02:00
Milan Hanajik 2e8b962d57 More S640 related changes. 2021-10-20 14:38:01 +02:00
Milan Hanajik ebad16b439 Bug fix in Output.FileWriters.IperlLogger.Writer, ver. 2.27.1780 2021-10-20 09:21:04 +02:00
Milan Hanajik 5b599c2ecd Various S640 related changes, ver. 2.27.1778 2021-10-19 14:43:54 +02:00
Milan Hanajik f3a889eed8 DataEntry.iPerl loads purchase order data from Oracle (if configured to do so). 2021-10-19 08:49:06 +02:00
Milan Hanajik 9aa41338ed S640Communication : Results.entities.WaterMeter.RadioAddress string -> long, optional scanning of serial numbers 2021-10-18 16:53:09 +02:00
Milan Hanajik 5797e97e0f SensusOracle.Database.ReadOrderDetails( ) reads from vt_auft_zaehlernr_pd 2021-10-18 16:53:09 +02:00
Milan Hanajik 352f2c1e28 Results.Entities.WaterMeter.RadioAddress added, ver. 2.27.1776 2021-10-14 14:02:41 +02:00
Milan Hanajik df63f4300a ver. 2.26.1775 2021-10-14 10:27:25 +02:00
Milan Hanajik 171aee4f1d SIRT component added, ver. 2.26.1774 2021-10-14 09:41:47 +02:00
Milan Hanajik e00e7556d6 Common.StatisticalMetrics, FeatureVectorCalculator: changes, SignalChart added, temporarily disabled in IperlHead, ver. 2.26.1771 2021-10-11 21:55:12 +02:00
Milan Hanajik 3f94318570 IperlHead.StartSession() starts datastream processing, IperlHead.TestIsGoingToStartSoon() saves raw-data, ISessionDataMngmnt. 2021-10-08 11:36:38 +02:00
Milan Hanajik 7356f45b93 Platform target AnyCPU whereever possible. 2021-10-07 11:26:02 +02:00
Milan Hanajik f725c2d2d8 FixedStartMassCollection fixes, ver. 2.26.1770 2021-10-05 15:56:36 +02:00
Milan Hanajik 4021ed1a7b S640CommForm supports 40 water meters, ver. 2.26.1769 2021-10-05 12:29:06 +02:00
Milan Hanajik 4a820af389 S640Comm.Start/End proc. params in More section, MainSeq invokes CommForm depending on RegReader type, ver. 2.26.1768 2021-10-05 11:03:11 +02:00
Milan Hanajik 0b8d51daba DEWA rework R-L / DEWA rework L-R, ver. 2.26.1767 2021-10-04 15:07:01 +02:00
Milan Hanajik 21408a962e RegReaders.S640Stream.*, TestMethods.S640Communication.*, IHasClearSessionData, ControlBoardDev.RefPulses added, ver. 2.26.1766 2021-10-04 11:24:20 +02:00
Milan Hanajik f854bf2277 Oracle.ManagedDataAccess package added, related changes, ver. 2.26.1765 2021-10-01 11:34:13 +02:00
Milan Hanajik e6d35e5178 FelxFlow : Changes related to Config.Entities.Enums --> Common.Enums, ver. 2.26.1764 2021-10-01 10:08:30 +02:00
Milan Hanajik a203885c16 Merge branch 'master-2-26-Flex' into master-2-26 2021-10-01 10:03:39 +02:00
Milan Hanajik 698e2dd6c4 Test.TstTime -> TestTime, Config.Ent.Enums + Events.Ent.Enums + Users.Ent.Enums -> Common.Enums, IRegulValve -> IRegValve, etc. 2021-10-01 09:58:06 +02:00
Milan Hanajik 5c55b2540a iPerlCommunicationForm: 40x libRfid.dll for each serial port, DewaRework( ) fixed, ver. 2.26.1751 2021-10-01 09:56:47 +02:00
Milan Hanajik 3d7ead8464 Output.FlexFlow : System.Net.WebRequest used, REST/SOAP support, etc, ver. 2.26.1763 2021-09-30 10:11:02 +02:00
Milan Hanajik 30845f4ca3 ver. 2.26.1742 2021-09-21 09:48:37 +02:00
Milan Hanajik f72457404b DB.SensusOracle.DatabaseCfg : database access passwords are not readable, ver. 2.26.1741 2021-09-20 17:09:57 +02:00
Milan Hanajik 7ab2930bf7 Output.DB.SensusOracle.Database : max_Pruefindex in VT_ZAEHLER_PD reverted, ver. 2.26.1738 2021-09-20 14:32:20 +02:00
Milan Hanajik 0cf2c442ec DB.SensusOracle.Database changes : DataSource / UserId / Password / AnbId can be configured now, ver. 2.26.1737 2021-09-20 14:29:02 +02:00
Milan Hanajik 756fa12456 Output.DB.SensusOracle.Database : max_Pruefindex in VT_ZAEHLER_PD 2021-09-20 14:29:02 +02:00
Milan Hanajik bb0361319d Config.Data --> TBF.Data and TBF.DB, etc. 2021-09-20 14:29:01 +02:00
Milan Hanajik 2cc92f3980 iPerlCommunicationForm : "DEWA rework" activity 2021-09-19 17:23:31 +02:00
Milan Hanajik abb2375500 IComponentCfg : GetControl( ) --> GetControl(IList<Component> cmpntEntities) 2021-09-16 14:21:18 +02:00
Milan Hanajik 64a5f7ceb8 ComponentParametersDlg moved from TBF.BenchControl to TBF.UI.Bench.Components. 2021-08-29 12:24:08 +02:00
Milan Hanajik adfb9ae8d5 iPerlCommunication cleanup. 2021-08-29 09:55:55 +02:00
Milan Hanajik 9e139279c7 Output.FlexFlow.Rest component added. 2021-08-26 13:24:03 +02:00
Milan Hanajik adf7a44a54 Bug fixes in MetrologyDlgDensityTab and MetrologyDlgBuoyancyTab. 2021-08-26 13:23:50 +02:00
Milan Hanajik c1860ab31c DEWA300 component upgraded, dated 25.8.2021 2021-08-26 12:08:50 +02:00
Milan Hanajik ba9d06ac3f ver. 2.26.1729 2021-08-20 15:42:00 +02:00
Milan Hanajik 8115ec4ac5 Effor flags do not stop a cycle in case test.Evaluate = false 2021-08-20 15:22:24 +02:00
Milan Hanajik f5e5d1fd0c iPerlCommunicationForm : wm.PassedFromTests() => q2adjResult/2/.Passed, limits for Q2 corr. from the iPerlComm test, ver. 2.26.1728 2021-08-20 15:21:55 +02:00
Milan Hanajik 9ecba98b4c Changes in iPerlCommunicationForm : CheckboxEditMode bug fixes, ver. 2.26.1725 2021-08-19 14:10:29 +02:00
Milan Hanajik 11ca2b7272 ver. 2.26.1724 2021-08-19 14:08:23 +02:00
Milan Hanajik df232cf508 SensusTestInfo : LogType.JustA0A4_Q3Q2Q1 added (ID_WZTYP=122), ver. 2.26.1723 2021-08-19 12:32:01 +02:00
Milan Hanajik 8c9643a8de SensusOracle.Database.Anbid_StaraTura --> Anbid_Producer, SensusOracle.Database.ReadOrderNumbersFromOracle( ). 2021-08-19 11:25:37 +02:00
Milan Hanajik 8a85458865 Minor DataStream.Reader and Elde.FlowMeter fixes 2021-08-18 13:06:37 +02:00
Milan Hanajik 848f9dff9d Initial values: CalibDate = Constants.MinDate, CalibValidDate = Constants.MaxDate, MaxDate = new DateTime(2039, 12, 31); 2021-08-18 10:40:51 +02:00
Milan Hanajik 5905d0850b DEWA300 Elde component upgraded - minor screen changes. 2021-08-18 09:35:41 +02:00
Milan Hanajik 5d144dfc24 FixedStart... methods use Math.Abs( ) of a difference of volumes to be able to cope with a reverse flow. 2021-08-18 09:35:40 +02:00
Milan Hanajik dcf746dc6b Color.DarkGoldenrod --> DarkGray in 59 forms (DataEntry, KPackE.DataEntryForRadio, Adjustment, ManualEntry, PulsesTest(Manual), ManualLevelMsrmnt). 2021-08-18 09:35:40 +02:00
Milan Hanajik 4e216c42de iPErlCommunicationForm bug fix : Test name is currentActivity.Substring(ConditnlUpdateQ2CorrRL/LRStr.Length).Trim() 2021-08-17 12:22:19 +02:00
Milan Hanajik 4f52093af6 SensusOracle.Database : Insert/update of VT_ZAEHLER_PD modified, ResultsMI.DeleteFromOracleForm, ver. 2.26.1719 2021-08-16 13:03:11 +02:00
Milan Hanajik c2826cbd27 iPerlCommunicationForm : Serious bug fix !!! ver. 2.26.1717 2021-08-03 18:27:10 +02:00
Milan Hanajik d3c62e353c Q2 correction uses q2AdjResult.Q2CorrRL / q2AdjResult.Q2CorrLR / q2AdjResult2.Q2CorrLR + iPerlCommunicationForm bug fixes 2021-08-03 13:07:13 +02:00
Milan Hanajik 1349c39d2d DataEntry.DataStream.EntryFormCfg clean-up 2021-08-03 12:20:17 +02:00
Milan Hanajik 7d1d9b1051 MeterTestRslt.CalibFactor / CalibFactorLNA / Q2CorrRL / Q2CorrLR / FlowDirection added and mapped to results database 2021-07-30 10:12:49 +02:00
Milan Hanajik c4ca299ce2 iPerlCommunication activity 'WriteDefaultQ2Corrections' modified. 2021-07-29 12:03:27 +02:00
Milan Hanajik 96a17b2d16 1. iPelrHead.MeterType.DN26 --> MeterType.DN25_Q3_10 2. TestMethodCfg.UseMuxBoards... removed 3. iPerlhead.ProcParams.InitQ2CorrRL/LR removed 4. Default Q2 corrections 2021-07-29 11:16:19 +02:00
Milan Hanajik 5b4ffd9327 Clean-up 2021-07-28 13:59:21 +02:00
Milan Hanajik 96abee384b IParamsProvider : IList<strig> ParamValues( ) --> ICollection<string> ParamValues( ) 2021-07-28 13:31:18 +02:00
Milan Hanajik 1e93a1e9ae iPerlCommunicationForm.cs changes (sync. .with 3.1 branch), ver. 2.26.1712 2021-07-28 12:42:03 +02:00
Milan Hanajik dfd6399d6c GraphsTabPageCtrl : 1. Unlimited history, 2. Dynamic subnodes. 2021-07-27 16:02:28 +02:00
Milan Hanajik 7bdf6efd9d ELDE komponent Badger-stredna-trat pre 4 vodomery. 2021-07-26 12:58:05 +02:00
Milan Hanajik 0e78f40cca DataStream.CycleBeginnigForm : Safer okButton_Click( ) 2021-07-26 10:06:08 +02:00
Milan Hanajik 56fc3b6380 MefImport : Wrappers for DatastreamInterface.StartMeasurement() / StopMeasurement() - connected meters only, ver. 2.26.1708 2021-07-20 09:24:41 +02:00
Milan Hanajik a1e73be9cb (1) MainSeq allows showCycleEndFormOp==null now, (2) iPerlCommunicationForm edit mode fixes, ver. 2.26.1707 2021-07-16 18:13:12 +02:00
Milan Hanajik bb4b1a1998 MefImport : IsConnected(), OpenConnection() and CloseAllConnections() wrappers, DataStream.EntryForm calls CloseAllConnections(). 2021-07-16 18:13:03 +02:00
Milan Hanajik c4afaf739a DataEntry.DataStream.CycleBeginningForm completed, ver. 2.26.1706 2021-07-16 16:54:50 +02:00
Milan Hanajik 2e8c5fa6f6 DataEntry.DataStream.CheckBoxImage added. 2021-07-16 14:26:24 +02:00
Milan Hanajik e46b64bd29 iPerlCommunicationForm changes. 2021-07-16 14:26:24 +02:00
Milan Hanajik 61ecb23294 LS.iPerlCommunicationsFormCheckBoxes -> OptoHeadsEnabled, MainWnd.optoHeadsToolStripMenuItem (+ visibility) 2021-07-15 10:31:32 +02:00
Milan Hanajik 674dde8d74 Changes for Milwaukee: DataStream.Reader bug fix, MefImport.MinSamplesCount =10. 2021-07-15 09:37:55 +02:00
Milan Hanajik 186bbdcc25 DataEntry.DataStream component added. 2021-07-15 09:36:28 +02:00
Milan Hanajik 2a82fbf2ca Component upgraded : VBB1+VBB2, etc. 2021-07-13 13:37:01 +02:00
Milan Hanajik 678fefb725 iPERL clean-up. 2021-07-13 13:37:01 +02:00
Milan Hanajik 58a57ba215 ver. 2.26.1698 2021-07-09 07:50:47 +02:00
Milan Hanajik 4d77926a9e iPERL : Q_WZ, KorrErrQ in VT_PRUEFREIHE_IST_PD, see email Joachim 12.1.2021, mtr.LastError not mapped to DB anymore, ver. 2.26.1697 2021-07-08 17:27:09 +02:00
Milan Hanajik a7e2947de7 Feature vector calculator - initial version of the offline tool. 2021-07-07 15:45:26 +02:00
Milan Hanajik 4a33339c63 OptoTelegramRaw class omved to Common.Iperl namespace, ver. 2.26.1694 2021-07-06 13:11:42 +02:00
Milan Hanajik 7b780d72a0 ver. 2.26.1693 2021-07-06 08:54:30 +02:00
Milan Hanajik 7a60055413 iPERL : X1 .. X9 added to result items, ver. 2.26.1692 2021-07-02 17:12:52 +02:00
Milan Hanajik c6f3751746 IPERL : Results.Entities.MeterTestRslt.X1..X9 added, X1 = flow st. dev., etc., ver. 2.26.1691 2021-07-02 11:26:48 +02:00
Milan Hanajik 300dabc800 TestMethods.PMaxTest bug fix : when pump reached 100% PMaxTest started regardless of the pressure. 2021-07-02 10:56:27 +02:00
Milan Hanajik d51ff414ca OptoTelegramRaw improvements 2021-07-02 10:56:14 +02:00
Milan Hanajik 6f65f0085e Milwaukee: TempCalibData = new float[16, 5], Diverters count bug fix, ver. 3.1.1688 2021-06-30 12:33:42 +02:00
Milan Hanajik 319cf0b8d4 New RR.DataStream.MefImport and RR.DataStream.Reader components. 2021-06-30 12:33:16 +02:00
Milan Hanajik c1daf13411 ver. 2.26.1682 2021-06-28 12:34:11 +02:00
Milan Hanajik 4fd107678d SensusOracle.Database bug fix: q_wz in VT_PRUEFREIHE_IST_PD 2021-06-28 12:22:18 +02:00
Milan Hanajik e1d3be7e56 (1) Stopping a cycle after ErrorFlags STOP, (2) Bug fix in R.Entities.MeterTestRslt, ver. 2.26.1681 2021-06-28 12:09:42 +02:00
Milan Hanajik 4f9b07ba20 RegulValve.SetFlowOp : RqrdFlowRangeRatio = 0.5, requiredFlowLo/HI -= Config.Formulas.GetCorrection(...), ver. 2.26.1679 2021-06-28 12:09:42 +02:00
Milan Hanajik 8e25fa6232 string Results.entities.MeterTestRslt.ExtraDataPath and related changes, supported by FlyingStart, FlStMassCollection and FlStMassCollProlonged. 2021-06-28 12:09:42 +02:00
Milan Hanajik 760ec598ca Event viewer changes in progress. 2021-06-02 13:52:18 +02:00
Milan Hanajik fd77380315 ver. 2.26.1675 2021-06-02 13:51:07 +02:00
Milan Hanajik bf91dc0aa6 ErrorFlagsMode.Stop added, can be used in UI, ver. 2.26.1674 2021-06-02 13:48:57 +02:00
Milan Hanajik 14a3d63f1f Small bug fixes in Results.FormsBatchResultsDlg.OneWMResults... 2021-06-01 07:58:05 +02:00
Milan Hanajik 0a60f9c64d ver. 2.26.1652 2021-05-21 11:24:53 +02:00
Milan Hanajik 258fd2579f IperlHead : Bug fix, case when there is no start or no end sample, ver. 2.26.1651 2021-05-21 11:20:17 +02:00
Milan Hanajik 4ec2dee3a2 ver. 2.26.1650 2021-05-19 15:01:31 +02:00
Milan Hanajik 723bf3fdeb ver. 2.26.1649 2021-05-19 14:13:08 +02:00
Milan Hanajik 315cccf74c iPerlHead : TimeFromSamples( ), VolumeFromSamples( ), StartEndFilterSamplesCount2 = 20, ver. 2.26.1648 2021-05-19 13:17:50 +02:00
Milan Hanajik 1b68ea8ab9 TBF.UI.Procedures.ProcedureDlg : 5-th file writer, ver. 2.26.1647 2021-05-17 11:54:07 +02:00
Milan Hanajik 9111bd7346 ResultsBrowser changes 2021-05-13 17:12:00 +02:00
Milan Hanajik cfdd59abce 10.42.128.16 --> 10.42.128.24 2021-04-30 12:22:12 +02:00
Milan Hanajik 4972347605 MettlerToledo.Standard scales robust against USB serial port drop-out. 2021-04-30 11:17:06 +02:00
Milan Hanajik 3459a5eac5 'Scale', 'Diverter' and 'RegValve' results items added. 2021-04-28 14:37:59 +02:00
Milan Hanajik 0553caac89 Bug fix in TBF.Utils.GetRegulVallvesPositions( ), TBF crashed when fn. was called from OutputPath from UI. 2021-04-28 10:44:59 +02:00
Milan Hanajik 4464a2025b Changes in binding between KPackE.Radio and KPackE.RegisterReader (Register(), Unregister(), ver. 2.26.1636 2021-04-28 08:45:19 +02:00
Milan Hanajik 03197dc8f3 FixedStartMassCollection cleanup. 2021-04-26 06:42:59 +02:00
Milan Hanajik e74c8692ce Paths : Selector : UI changes, Selector not mapped to the config DB yet. 2021-04-16 12:34:15 +02:00
Milan Hanajik cda8359623 ver. 2.26.1623 2021-04-16 12:32:57 +02:00
Milan Hanajik 508315a43f Output.SensusTestInfo : (1) S620_Kiwa, (2) CreateFromProcedure() fixed, ver. 2.26.1622 2021-04-16 12:12:24 +02:00
Milan Hanajik 9a8c9205d3 Izrael-50 component upgraded. 2021-04-15 12:06:19 +02:00
Milan Hanajik d7728d304a ver. 2.26.1617 2021-04-14 11:51:07 +02:00
Milan Hanajik fd0d7dcf7b A better bug fix in LeakTest, ver. 2.26.1616 2021-04-14 11:33:15 +02:00
Milan Hanajik 997e0d2a6b ver. 2.26.1609 2021-04-13 15:20:38 +02:00
Milan Hanajik 51e1e5721c Bug fix : Results.BatchResults.NewFromProcedure( ) uses GetTestInstances( ). 2021-04-13 14:40:38 +02:00
Milan Hanajik 34c3fa26c9 Trivial simulation mode for some test methods. 2021-04-13 13:57:28 +02:00
Milan Hanajik 5e3e70f43a Australia 169 MHz SensusTestInfo modified, first100 pieces with Q2ac, ver. 2.26.1608 2021-04-13 08:48:47 +02:00
Milan Hanajik 18880dc04d Assignment of drain valves to scales and tanks fixed. ver. 2.26.1607 2021-04-12 12:00:23 +02:00
Milan Hanajik 2673584113 MergeResultsDBs console application added to solution. 2021-04-12 05:59:37 +02:00
Milan Hanajik e90967b6ed Results.Entities bug fixes and copy constructors. 2021-04-12 05:19:47 +02:00
Milan Hanajik 46489224cf MainSeqUtils : Prevent crash when draining tanks at the end. 2021-04-08 13:52:05 +02:00
Milan Hanajik d8fc4a4c36 UI.Procedures.ProceduresCtrl can display procedure properties of Sensus-Oracle-DB component. 2021-04-08 12:03:25 +02:00
Milan Hanajik ae18e15fba Order of RunDeviceAfter( ), StopDevice( ) and StopDevice2( ) calls reversed, ver. 2.26.1599 2021-04-08 12:03:25 +02:00
Milan Hanajik 352ed581c2 Getting rid of warnings. 2021-04-08 12:03:25 +02:00
Milan Hanajik b5572c20e3 Factories are without ResetStaticProperties( ). 2021-04-08 12:03:25 +02:00
Milan Hanajik 1d50b7206d Components Initialize() rewritten, double StartChangeHandler() calls avoided, ToString() methods are equl, use ClassName. 2021-04-08 12:03:18 +02:00
Milan Hanajik 331803e51d MeterTestRslt.WriteBinary( ) hot fix. 2021-04-07 12:05:09 +02:00
Milan Hanajik ed25f1a360 Cosmetic changes in evaluation of tests. 2021-04-04 14:49:35 +02:00
Milan Hanajik 111fd8d96c ver. 2.26.1597 2021-03-31 11:10:56 +02:00
Milan Hanajik c86bafd779 UpgradeSelectionDlg/Custom, more logging in Output.DB.SensusOracle.ProcedureParams. 2021-03-31 09:21:43 +02:00
Milan Hanajik c472bfc99d iPerlCommmunication : New Q2 correction for Australia. 2021-03-30 11:36:01 +02:00
Milan Hanajik b8eaaeb64c ProcedureDlg bug fix : Copy button visible for all benches, ver. 2.26.1596 2021-03-30 11:35:40 +02:00
Milan Hanajik b09a057b02 ver. 2.26.1595 2021-03-30 00:08:47 +02:00
Milan Hanajik 9f19df7f3f Support for Statistics off-line mode: change LocalSettings.cs line 244. 2021-03-12 10:01:27 +01:00
Milan Hanajik db9506290a SerialStream simulation : Reads characters from a file instead of a serial port. 2021-03-08 18:01:48 +01:00
Milan Hanajik 4505759115 DataEntry.iPerl : No CycleEndForm, does not implement IHasCycleEndForm. 2021-03-08 13:12:40 +01:00
Milan Hanajik d15497f2b0 InfoFlagsStr in Results as an item in WMeterRsltItemSpec. 2021-02-19 11:18:11 +01:00
Milan Hanajik ec9edbf04c DataEntry.Standard24.CycleBeginningForm : Auto s/n feature. 2021-02-16 15:55:26 +01:00
Milan Hanajik 31b167cd62 MettlerToledo.Standard.BalanceDev/Old/NewDev clean-up, units (oz), 1st after draining, etc. 2021-02-16 11:34:46 +01:00
Milan Hanajik 1d33b9651b Milwaukee : Elde component upgraded, 09.02.2021 2021-02-11 08:51:13 +01:00
Milan Hanajik 3bf8b4fe54 DataEntry.S620 supports production tracing, S/Ns from OraDB + disp., flash and beep, ver. 2.26.1592 2021-02-10 13:58:54 +01:00
Milan Hanajik 2e75d91adc Bug fix in MetrologyDlgFlowMeterTab, etc. when ranges are enabled, ver. 2.26.1588 2021-02-08 10:12:12 +01:00
Milan Hanajik 55d9d58978 BenchControlPanel : Four main buttons are disabled on TBF start. 2021-02-04 15:04:19 +01:00
Milan Hanajik 241bb3aff1 TestTimeCorrection and MassOfEvapWater are stored in SummaryResults columns BK resp. BB 2021-01-29 10:46:45 +01:00
Milan Hanajik 0fa8057324 RealDensity, AtTemperature, Buoyancy are stored in Results DB in Batch table. 2021-01-28 13:55:27 +01:00
Milan Hanajik 4609abe6ea SensusOracle.Database SQL style changes, ver. 2.26.1586 2021-01-28 13:53:06 +01:00
Milan Hanajik cb6d9538c8 ver. 2.26.1585 2021-01-26 16:48:30 +01:00
Milan Hanajik 8ec062b165 DataEntry.S620 changes, ver. 2.26.1584 2021-01-26 14:54:51 +01:00
Milan Hanajik b2df02dd1b Changes in MainSeq, Procedure, BenchControlPanel, TestProgressControls, etc., ver. 2.26.1583 2021-01-25 13:01:59 +01:00
Milan Hanajik c403f9345f (1) FlyingStartMassCollProlonged fixed, more logging, (2) Password of day, ver. 2.26.1579 2021-01-25 13:01:16 +01:00
Milan Hanajik b97b795c93 ResultsBrowser supports 9 test benches, ver. 2.26.1577 2021-01-25 13:01:16 +01:00
Milan Hanajik 4a1c6ef031 Units : Ft3/h and US gal/min added. 2021-01-19 10:50:29 +01:00
Milan Hanajik 40f3aacd32 Milwaukee component updated (18.1.2021, imperial units) 2021-01-19 10:50:29 +01:00
Milan Hanajik 8e9344cc47 1. ResultsBrowserWnd custom query : GetListOfUsedProcedures, DEWA 2. SensusOracle.DB comments 2021-01-19 10:50:29 +01:00
Milan Hanajik b3160799c8 (1) PreviousResultsDlg with filters, (2) Procedure history can be inspected, ver. 2.26.1577 2021-01-19 10:50:10 +01:00
Milan Hanajik 66852682bf Elde.RegulValveMilwaukee, Modbus.Novus added, Elde component updated (18.12.2020), ver. 2.26.1571 2021-01-15 14:15:15 +01:00
Milan Hanajik 3399b07fc0 MainSeqUtils.CreateNewBatchResults( ) bug fix. 2021-01-08 09:16:20 +01:00
Milan Hanajik 844f5573dc Merge branch 'm2' into master-2.26, ver. 2.26.1569 2021-01-07 14:42:07 +01:00
Milan Hanajik e9cc77a2d5 Merge branch 'master-2.26' into m3 2021-01-07 10:09:18 +01:00
Milan Hanajik 2981ab2a5f Milwaukee : ADC-s for diverters can be calibrated, ver. 2.26.1568 2021-01-05 14:06:15 +01:00
Milan Hanajik a3227f356f DataEntry.WMStates restored - has been used in Fuzhou PT300 2021-01-05 09:45:43 +01:00
Milan Hanajik 0d8210614d EtPulsesK and DivSamples() fixed for all Fuzhou test benches, ver. 2.26.1567 2021-01-05 09:45:34 +01:00
Milan Hanajik 97df1250dc DataEntry.S620 added, Results.Entities.WaterMeter.AssignedSerialNr/Prefix/Suffix/CompleteSerialNr/WMTypeRevision mapped to DB. 2020-12-18 08:39:28 +01:00
Milan Hanajik 11eff5c962 EtPulsesK fixed for all Fuzhou test benches, ver. 2.26.1563 2020-12-18 08:39:28 +01:00
Milan Hanajik f95f961a5d Output.FileWriters.Enhanced with formatted WM subtitles 2020-12-18 08:38:16 +01:00
Milan Hanajik 4db2f475cd DataEntry.S620 added, Results.Entities.WaterMeter.AssignedSerialNr/Prefix/Suffix/CompleteSerialNr/WMTypeRevision mapped to DB. 2020-12-17 10:12:05 +01:00
Milan Hanajik 9dbbf03acd Output.FileWriters.Enhanced with formatted WM subtitles 2020-12-17 10:11:56 +01:00
Milan Hanajik d8ed144dee TracingDB synchronized with Production-Monitoring project, ver. 2.26.1562 2020-12-17 09:05:03 +01:00
Milan Hanajik 99cd84fb2a Changes for MILWAUKEE, component dated 16.12.2020, ver. 2.26.1561 2020-12-16 14:46:53 +01:00
Milan Hanajik de0b84076f UpgradeSelectionDlg : Cutom button with an action that is commented out, ver. 2.26.1555 2020-12-10 12:50:19 +01:00
Milan Hanajik 18506390fa Procedure.ProcedureParamsMixedCtrl added. 2020-12-10 12:50:07 +01:00
Milan Hanajik fd9a08406f IperlHead cleanup : No side effect on ProcessData.CompleteTestInfos 2020-12-10 11:20:56 +01:00
Milan Hanajik 6226fbedfc Merge branch 'Australia-169MHz' into master-2.26 2020-12-07 13:22:56 +01:00
Milan Hanajik 86fb107e73 WMPosition saved to SummaryResults, AllResults, column CQ ... 2020-12-07 13:06:46 +01:00
Milan Hanajik b32329cdf7 DiverterTest changes reverted back (Luxemburg: root cause of the isssue was in CB firmware), ver. 2.26.1554 2020-12-07 12:42:22 +01:00
Milan Hanajik 38c7d43a8a DiverterTest changes reverted back (Luxemburg: root cause of the isssue was in CB firmware). 2020-12-07 12:31:24 +01:00
Milan Hanajik c72fb29f36 Constructors of components : Logging level increased to WARN. 2020-12-04 11:59:26 +01:00
Milan Hanajik 0dd5c469f5 Spelling fixed, ver. 2.26.1553 2020-12-03 13:51:52 +01:00
Milan Hanajik df1b4527ba ValveCategory.All removed, cleanup, SequenceBase improvement. 2020-12-03 13:51:43 +01:00
Milan Hanajik 6da5bd92ec Positions of reg. valves are defined in output path 2020-12-02 15:45:59 +01:00
Milan Hanajik d4ac2453b8 Refactorization. 2020-12-02 13:44:59 +01:00
Milan Hanajik 59c1cb76f0 Gelsenwasser component updated (1.12.2020), ver. 2.26.1552 2020-12-02 13:44:42 +01:00
Milan Hanajik 89b47860a5 WARSAW_50 symbol, Warsaw-50 component. 2020-12-02 09:34:09 +01:00
Milan Hanajik 646cebe877 Q2 corr.: Correction inside range -0.5 .. 0.5 %, ver. 2.26.1549 2020-12-02 09:32:55 +01:00
Milan Hanajik f8b8c3bfec ver. 2.26.1551 2020-12-01 16:50:57 +01:00
Milan Hanajik 723c077c64 Q2 corr.: Correction inside range -0.5 .. 0.5 %, ver. 2.26.1550 2020-12-01 16:44:43 +01:00
Milan Hanajik 7e64c9299c WMPosition saved to SummaryResults, AllResults, column CQ ... 2020-11-30 13:32:29 +01:00
Milan Hanajik ea9c0615ee iPerlCommunicationForm bug fix, ver. 2.26.1542 2020-11-27 16:27:29 +01:00
Milan Hanajik 428d100f6c UI.Procedures.ProceduresCtrl : More column content is optional. 2020-11-27 16:27:14 +01:00
Milan Hanajik 8846f16546 ver. 2.26.1545 2020-11-20 11:24:38 +01:00
Milan Hanajik 37ec839807 ver. 2.26.1544 2020-11-18 14:58:52 +01:00
Milan Hanajik 5f44fd4bdb Saving events to Events DB : Fixed bugs when connection string was not defined, ver. 2.26.1543 2020-11-18 10:46:00 +01:00
Milan Hanajik 5f5063663c iPerlCommunicationForm bug fix, ver. 2.26.1542 2020-11-13 08:40:41 +01:00
Milan Hanajik 75f0cb2930 UI.Procedures.ProceduresCtrl : More column content is optional. 2020-11-09 09:18:51 +01:00
Milan Hanajik 1f581a72c1 Register readers cleanup, IRegReaderPulses added. 2020-11-06 14:33:32 +01:00
Milan Hanajik 705f4de0b0 DB.SensusOracle.Database : (1) Procedure params., (2) S620 support, (3) SensusTestInfo for 620. 2020-11-06 14:33:32 +01:00
Milan Hanajik 6ec3b7b287 UI.Procedures.ProcedureDlg 'Copy' a test feature added 2020-11-06 14:33:31 +01:00
Milan Hanajik 9758411519 Statistics : IP addresses updated, export in CSV format implemented. 2020-11-06 14:33:31 +01:00
Milan Hanajik e1a185efdf MettlerToledo.Standard (1) Always reads imm.mass when idle (2) Changes in logging 2020-11-06 14:33:31 +01:00
Milan Hanajik a2556bec35 TBF/CameraBinaryFiles2 folder with synchronization for SD v.2.x (!!! file upload NOK). 2020-11-06 14:33:31 +01:00
Milan Hanajik 483e2b4eb7 DataEntry.Camera (1) loads next image after 'Enter' key, (2) dealing with test parts fixed. 2020-11-06 14:33:31 +01:00
Milan Hanajik f1d46782d3 Luxemburg component, LUXEMBURG_40 symbol incl. StatusP, TestMethods.DiverterTest fixed. 2020-11-06 14:33:23 +01:00
Milan Hanajik d1adde9b63 Changes in FlyingStartMassCollProlong in v 2.26.1522 (Gelsenwasser) reverted back. 2020-11-06 14:31:36 +01:00
Milan Hanajik 95c7257d6f Defined symbols in expressions are sorted. 2020-10-22 10:26:27 +02:00
Milan Hanajik 91392f9452 Camera binary files are only synchronized for SD v.1.x, ver. 2.26.1528 2020-10-16 14:07:57 +02:00
Milan Hanajik b145c71ee3 Improved file name formatting for Output.FileWrites.Basic/Enhanced/Xml/XmlBatch components. 2020-10-14 14:12:00 +02:00
Milan Hanajik 1cf2eb8e06 TODO, ver. 2.26.1527 2020-10-14 14:09:22 +02:00
Milan Hanajik 037a5be3b3 SyncRoute( ) called in RunDeviceBefore( ), this should fix FixedStartMassCollection. 2020-10-09 09:41:03 +02:00
Milan Hanajik 0fc7d831b0 1. Login to camera v.2.x with user 'pi', 2. DeviceTest shutdown fix, ver. 2.26.1525 2020-10-08 12:55:38 +02:00
Milan Hanajik abf54f765f SummaryResults : try/catch and more logging, ver. 2.26.1524 2020-10-08 09:00:50 +02:00
Milan Hanajik 0e7ba933d8 ResultsBrowser : Custom query : Batch numbers and test bench 2020-09-28 13:56:21 +02:00
Milan Hanajik fa03c09f09 DataStreamInterface: (1) supports multiple meters, (2) Shutdown() added 2020-09-25 12:20:56 +02:00
Milan Hanajik 3ac90ee622 TURA_SPECIAL : MaxOptoDataCount = 250000 2020-09-23 11:04:56 +02:00
Milan Hanajik 774f561fcf Gelsenwasser component upgraded, ver. 2.26.1523 2020-09-18 08:52:13 +02:00
Milan Hanajik 3a626740c7 !!! Bug fix in FlyStMassCollProlonged test method, ver. 2.26.1521 2020-09-17 11:19:51 +02:00
Milan Hanajik 97ce601d31 DataStreamInterfaceTest and DataStreamMeter projects added 2020-09-09 10:00:23 +02:00
Milan Hanajik 49d4cf1ac0 HONGKONG_50 symbol added, HongKong component added, ver. 2.26.1519 2020-09-09 09:58:58 +02:00
Milan Hanajik dcb0ee680c ver. 2.26.1518 2020-09-08 09:10:17 +02:00
Milan Hanajik e94eb83c1d ver. 2.26.1517 2020-09-08 09:01:39 +02:00
Milan Hanajik ff3de55593 TracingDB/Enums.cs updated, Output/DB/ProductionTracing/Enums.cs removed 2020-09-03 14:45:51 +02:00
Milan Hanajik 1e50cc6fb7 ver. 2.26.1516 2020-09-03 14:45:51 +02:00
Milan Hanajik 7b31c6b2b6 Modbus.WaterAnalyzer2 : Conductivity comm. and conversion from 4-20 mA 2020-09-03 14:45:07 +02:00
Milan Hanajik 38ee1cc067 English and US units added. 2020-08-28 09:06:27 +02:00
Milan Hanajik e27dfe570d Genesis component updated (21.8.2020). 2020-08-27 16:40:06 +02:00
Milan Hanajik b2f2f595e5 Output.EventTriggers.Standard bug fix (E13 cannot be changed). 2020-08-27 16:40:06 +02:00
Milan Hanajik 67f4683026 FixedStart methods : order of operations fixed (1. open start valve, 2. start measurement) 2020-08-12 10:10:49 +02:00
Milan Hanajik 42f8d02a68 (1) Heat Meters related fixes, (2) SLM50 component upgraded (7.8.2020), ver. 2.26.1513 2020-08-07 14:24:57 +02:00
Milan Hanajik 14717d5d46 ver. 2.26.1512 2020-08-07 12:14:04 +02:00
Milan Hanajik 450530a707 In FIxedStart methods there is a delay after start of a test before the flow regulation starts. 2020-08-07 12:14:04 +02:00
Milan Hanajik adf30d615b (1) MettlerToledo: Zero instead of Taring, (2) RegValveCalib array size fixed for ADC#8..11, ver. 2.26.1511 2020-08-07 11:11:44 +02:00
Milan Hanajik 610387e071 (1) Compound WM results are displayed correctly, ver. 2.26.1510 2020-08-05 10:27:34 +02:00
Milan Hanajik 114e628305 (1) Diverter.flowMtrNr4Cmd for SLM_150, (2) Config.Data cleanup 2020-08-05 09:36:00 +02:00
Milan Hanajik 68d01aab14 Bug fix in CombinedWithDetectionSeq related to test.Part, ver. 2.26.1509 2020-07-31 11:58:30 +02:00
Milan Hanajik eaf0e2cf22 Barcode printing in Output.Printers.Enhanced and Output.Printers.OnePerMeter, ver. 2.26.1508 2020-07-29 10:06:43 +02:00
Milan Hanajik 02ec8d8124 Camera.CLP1611 : More comments, TODO list, ver. 2.26.1505 2020-07-17 14:13:57 +02:00
Milan Hanajik 1dc328746d Gelsenwasser component upgraded. 2020-07-15 10:31:46 +02:00
Milan Hanajik 5bb94666a4 (1) Diverter.nextIdx not incremented when DebugMode.Off, (2) VR1 accepts number entry, ver. 2.26.1499 2020-07-09 13:31:24 +02:00
Milan Hanajik c1f23b8481 ResultsBrowser with a custom query for SUEZ, ver. 2.26.1498 2020-07-09 13:22:52 +02:00
Milan Hanajik 70c11ad6d9 German resources, ver. 2.26.1498 2020-07-08 10:16:33 +02:00
Milan Hanajik 3a8c6b4d3e ResultsBrowser : DEWA custom queries. 2020-07-07 12:57:45 +02:00
Milan Hanajik b8f1b9293a (1) Units : Quantity.Enumerated added, (2) LoginDlgWithBenchSelection : List of benches is alphabetically sorted. 2020-06-25 12:10:55 +02:00
Milan Hanajik 6558951857 ver. 2.26.1497 2020-06-25 09:53:48 +02:00
Milan Hanajik 54e964ffde Flow calculation : TestRslt.FlowVolume is always the most accurate CTV flow (calculated from the measured mass in case of mass collection methods) 2020-06-25 09:35:10 +02:00
Milan Hanajik a5b270eec8 Two documents added. 2020-06-24 14:08:36 +02:00
Milan Hanajik 6f9c6596d5 ResultsBrowser: 1 WR13 IP addr.updated, 2 default DbType=MySql, 3 changes in progress, ver. 2.26.1496 2020-06-24 12:01:37 +02:00
Milan Hanajik d99c53bc8e (1) psi unit, (2) Transition seq. fixed (ISequenceCondition seqCondition null after renaming a component). 2020-06-08 14:34:51 +02:00
Milan Hanajik 3496fcbbba Critical bug fixes in sequences - STOP not working !!! 2020-05-21 16:37:09 +02:00
Milan Hanajik 77a29dadfc ResetBatchNr console application added to solution. 2020-05-18 12:59:17 +02:00
3074 changed files with 114580 additions and 1229689 deletions
+22 -45
View File
@@ -2,10 +2,12 @@ Common/bin/
Common/obj/
Config/bin/
Config/obj/
DataMatrix4Net/bin/
DataMatrix4Net/obj/
DataStreamInterface/bin/
DataStreamInterface/obj/
DataStreamInterfaceTest/bin/
DataStreamInterfaceTest/obj/
DataStreamMeter/bin/
DataStreamMeter/obj/
Decrypt/bin/
Decrypt/obj/
DeviceTest/bin/
@@ -16,42 +18,30 @@ Encrypt/bin/
Encrypt/obj/
EventViewer/bin/
EventViewer/obj/
Events/bin/
Events/obj/
FeatureVectorCalculator/bin/
FeatureVectorCalculator/obj/
GemCard/bin/
GemCard/obj/
GenCode128/bin/
GenCode128/obj/
GenericTest/bin/
GenericTest/obj/
GraphLib/bin/
GraphLib/obj/
LabelPrinting/bin/
LabelPrinting/obj/
MergeResultsDBs/bin/
MergeResultsDBs/obj/
OrderManagement/bin/
OrderManagement/obj/
ProductionTracing/bin/
ProductionTracing/obj/
RecordProcessing/bin/
RecordProcessing/obj/
ResetBatchNr/bin/
ResetBatchNr/obj/
RestClient/bin/
RestClient/obj/
GemCard/bin
GemCard/obj
GenCode128/bin
GenCode128/obj
GraphLib/bin
GraphLib/obj
MergeResultsDBs/bin
MergeResultsDBs/obj
TracingDB/bin
TracingDB/obj
ResetBatchNr/bin
ResetBatchNr/obj
RestClient/bin
RestClient/obj
Results/bin/
Results/obj/
ResultsBrowser/bin/
ResultsBrowser/obj/
ResultsParser/bin/
ResultsParser/obj/
S640TestApp/bin/
S640TestApp/obj/
SharedDatabase/bin
SharedDatabase/obj
SchematicDrawing/bin
SchematicDrawing/obj
Statistics/bin/
Statistics/obj/
TBF/bin/
@@ -60,23 +50,10 @@ ToFirstMonitor/bin/
ToFirstMonitor/obj/
ToSecondMonitor/bin/
ToSecondMonitor/obj/
UserManagement/bin/
UserManagement/obj/
WorkflowConfigurator/bin/
WorkflowConfigurator/obj/
Workplace/bin/
Workplace/obj/
DataStreamInterfaceTest/bin/
DataStreamInterfaceTest/obj/
DataStreamMeter/bin/
DataStreamMeter/obj/
Events/bin/
Events/obj/
TracingDB/bin/
TracingDB/obj/
Users/bin/
Users/obj/
UserManagement/bin/
UserManagement/obj/
.vs/
.idea/
*.suo
*.bak
+6 -11
View File
@@ -17,7 +17,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;LANG_PL</DefineConstants>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
@@ -25,14 +25,11 @@
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;LANG_PL</DefineConstants>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.15\lib\net45\log4net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
@@ -45,6 +42,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="BackgroundBeep.cs" />
<Compile Include="Const.cs" />
<Compile Include="DatabaseSettings.cs" />
<Compile Include="DBSettings.cs" />
<Compile Include="Enums.cs" />
@@ -63,21 +61,18 @@
<Compile Include="Forms\ModelessForm.designer.cs">
<DependentUpon>ModelessForm.cs</DependentUpon>
</Compile>
<Compile Include="Formulas.cs" />
<Compile Include="CurrentUser.cs" />
<Compile Include="GlobalData.cs" />
<Compile Include="IMeasurementCorrection.cs" />
<Compile Include="IOrderInfo.cs" />
<Compile Include="IParamsProvider.cs" />
<Compile Include="Iperl\OptoTelegramRaw.cs" />
<Compile Include="IUncertainty.cs" />
<Compile Include="IUser.cs" />
<Compile Include="Printers\PrintersCommon.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="QuitAppException.cs" />
<Compile Include="SerializableDictionary.cs" />
<Compile Include="StatisticalMetrics.cs" />
<Compile Include="Iperl\OptoTelegramRaw.cs" />
<Compile Include="SerializableDictionary.cs" />
<Compile Include="Telegram.cs" />
<Compile Include="UIControls\CoolButtonCtrl.cs">
<SubType>UserControl</SubType>
@@ -90,7 +85,6 @@
<Compile Include="Utils.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<EmbeddedResource Include="Forms\ListViewEx.resx">
<DependentUpon>ListViewEx.cs</DependentUpon>
@@ -99,6 +93,7 @@
<DependentUpon>ModelessForm.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
+12
View File
@@ -0,0 +1,12 @@
///
/// Copyright (c) 2023 Sensus Slovensko a.s.
///
using System;
namespace Common
{
public static class Const
{
public const string MySqlConnectTimeoutSec = "120";
}
}
+1
View File
@@ -12,6 +12,7 @@ namespace Common
{
public DBType DbType;
public string ConnectionString;
public bool IsValid { get { return (DbType != DBType.None) && !string.IsNullOrEmpty(ConnectionString); } }
public DBSettings()
{
+3 -3
View File
@@ -15,10 +15,10 @@ namespace Common
// Public fields
public string BenchName;
public bool IsRealBench;
public DBSettings ProceduresDBSettings; /// Configuration database settings
public DBSettings ProceduresDBSettings; /// Configuration database settings
public DBSettings WaterMetersDBSettings; /// Results database settings
public DBSettings EventsDBSettings; /// Events database settings
public DBSettings UsersDBSettings; /// Shared configuration database settings
public DBSettings EventsDBSettings; /// Events database settings
public DBSettings UsersDBSettings; /// Shared configuration database settings
// Constructor
public DatabaseSettings()
+40 -67
View File
@@ -49,15 +49,6 @@ namespace Common
Count
}
/// <summary> Identifies the database based on the content </summary>
public enum DBKind
{
Config,
Results,
RemoteConfig,
Count
}
public enum ProcedureSelection
{
#if LANG_CS
@@ -76,6 +67,44 @@ namespace Common
Count
}
/// <summary>
/// Obsolete - replaced by enum ProcedureSelection (above) in 3.1 and newer
/// </summary>
public enum RemoteDBUse
{
[Description("Local DB only")] LocalDBOnly,
[Description("Remote DB only")] RemoteDBOnly,
[Description("Both DB-s, local 1st")] BothDBsLocalFirst,
[Description("Both DB-s, remote 1st")] BothDBsRemoteFirst,
Count
}
/// <summary>
/// Obsolete - Contains a procedure name and a database specification (local/remote).
/// </summary>
public class ProcedureInfo
{
public readonly string Name;
public readonly bool IsRemote;
public ProcedureInfo(string name, bool isRemote)
{
Name = name;
IsRemote = isRemote;
}
}
/// <summary>
/// Test designation mode for IperlLogger and IperlHead opto data files
/// </summary>
public enum DesigMode
{
Auto,
Based_on_procedure,
As_specified,
Count
}
public enum LoginMethod
{
UserName, /// = alias, abbreviation
@@ -199,56 +228,10 @@ namespace Common
QnClassColdWater,
QnClassHotWater,
QpQi,
CompoundQ3RQ3R,
CompoundQnClassQnClass,
CompoundQ3RQnClass,
CompoundQnClassQ3R,
CompoundQpQiQpQi,
Manual,
Count,
}
public enum FlowId
{
Any,
Q4,
Q3,
Q2,
Q1,
Q4Main,
Q3Main,
Q2Main,
Q1Main,
Q4Aux,
Q3Aux,
Q2Aux,
Q1Aux,
Qmax,
Qn,
Qt,
Qmin,
QmaxMain,
QnMain,
QtMain,
QminMain,
QmaxAux,
QnAux,
QtAux,
QminAux,
Qp,
Qp10,
Qi,
QpMain,
Qp10Main,
QiMain,
QpAux,
Qp10Aux,
QiAux,
Qdetected,
Qfall,
Qrise,
}
public enum ErrorLimitType
{
Manual,
@@ -358,6 +341,7 @@ namespace Common
[Description("")] NotSpecified,
[Description("U0")] U0, /// ?
[Description("D0")] D0, /// ?
///
Count
}
@@ -520,10 +504,8 @@ namespace Common
public enum TestProfile
{
UserDefined,
UserDefinedCompound,
UserDefinedHeatMeter,
Protected, /// The first protected one
ProtectedCompound,
ProtectedHeatMeter,
}
@@ -698,16 +680,7 @@ namespace Common
Count,
}
public enum DivResolution : int
{
[Description("1 ms (0.25 s)")] _1ms = 0,
[Description("2 ms (0.5 s)")] _2ms = 1,
[Description("4 ms (1 s)")] _4ms = 2,
[Description("8 ms (2 s)")] _8ms = 3,
Count,
}
public enum ImageRotation
public enum ImageRotation
{
[Description("0 deg")] None,
[Description("90 deg")] Deg90,
+1 -4
View File
@@ -1,7 +1,4 @@
///
/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
///
using System;
using System;
namespace Common.Forms
{
+4 -7
View File
@@ -1,7 +1,4 @@
///
/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
///
using System;
using System;
using System.Drawing;
using System.Windows.Forms;
@@ -56,20 +53,20 @@ namespace Common.Forms
public event EventHandler<MessageEventArgs> UpdateMessageHandler;
void OnUpdateMessage(object sender, MessageEventArgs args)
{
if (args != null && args.Message != null) label1.Text = args.Message;
if (args.Message != null) label1.Text = args.Message;
}
/// <summary>
/// Called from the state machine when an operation forces a modeless dialog close.
/// </summary>
public void CloseForm()
public static void CloseForm()
{
if (CloseFormHandler == null) return;
try { CloseFormHandler(null, null); }
catch (Exception) { }
}
public event EventHandler<EventArgs> CloseFormHandler;
static public event EventHandler<EventArgs> CloseFormHandler;
void OnCloseForm(object sender, EventArgs args)
{
DialogResult = DialogResult.Cancel;
+2 -2
View File
@@ -213,9 +213,9 @@ namespace Common
/// </summary>
public static double ErrorFromVolumes(double measuredVolume, double trueVolume)
{
if (Math.Abs(trueVolume) <= float.Epsilon)
if (trueVolume <= float.Epsilon)
{
if (Math.Abs(measuredVolume) <= float.Epsilon)
if (measuredVolume <= float.Epsilon)
{
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0);
return -100.0;
-14
View File
@@ -1,14 +0,0 @@
///
/// Copyright (c) 2021 Sensus Slovensko a.s.
///
using System;
namespace Common
{
public static class GlobalData
{
public static double SampleDensity = 0; /// sample water density measured in an accredited labo [kg/m3]
public static double SampleTemp = 0; /// sample temperature when density measured in an accredited labo [°C]
public static double Buoyancy = 0;
}
}
-1
View File
@@ -10,7 +10,6 @@ namespace Common
int Number { get; }
/// Access rights
bool IsPowerUser();
bool IsMemberOf(GID group);
bool IsMemberOf(GID[] groups);
bool IsCorrectPassword(string password);
+1 -1
View File
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Common")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyCopyright("Copyright © 2020-2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
+1 -43
View File
@@ -105,14 +105,6 @@ namespace Common
///
[Description("pulse/kWh")] ppkWh, /// * 1 pulse/kWh
[Description("kWh/pulse")] kWhpp, /// 1 kWh/pulse
///
[Description("A")] A, /// *1 A
[Description("mA")] mA, /// 1 mA = 0.001 A
///
[Description("V")] V, /// *1 V
[Description("mV")] mV, /// 1 mV = 0.001 V
Count
}
@@ -143,8 +135,6 @@ namespace Common
[Description("Boolean")] Boolean,
[Description("Datum und Uhrzeit")] DateTime,
[Description("Aufgezählt")] Enumerated,
[Description("Strom")] Current,
[Description("Spannung")] Voltage,
#elif LANG_PL
[Description("Objętość")] Volume,
[Description("Przepływ")] Flow,
@@ -168,8 +158,6 @@ namespace Common
[Description("Boolean")] Boolean,
[Description("Data i czas")] DateTime,
[Description("Wyliczone")] Enumerated,
[Description("Prąd")] Current,
[Description("Napięcie")] Voltage,
#elif LANG_CS
[Description("Objem")] Volume,
[Description("Průtok")] Flow,
@@ -193,8 +181,6 @@ namespace Common
[Description("Boolean")] Boolean,
[Description("Datum a čas")] DateTime,
[Description("Vyjmenované")] Enumerated,
[Description("Proud")] Current,
[Description("Napětí")] Voltage,
#elif LANG_IT
[Description("Volume")] Volume,
[Description("Flusso")] Flow,
@@ -218,8 +204,6 @@ namespace Common
[Description("Boolean")] Boolean,
[Description("Data e ora")] DateTime,
[Description("Enumerato")] Enumerated,
[Description("Corrente")] Current,
[Description("Voltaggio")] Voltage,
#else
[Description("Volume")] Volume,
[Description("Flow")] Flow,
@@ -243,8 +227,6 @@ namespace Common
[Description("Boolean")] Boolean,
[Description("Date and time")] DateTime,
[Description("Enumerated")] Enumerated,
[Description("Current")] Current,
[Description("Voltage")] Voltage,
#endif
Count,
}
@@ -260,8 +242,7 @@ namespace Common
{
return unit == Unit.l || unit == Unit.m3ph || unit == Unit.kg || unit == Unit.s || unit == Unit.C ||
unit == Unit.bar || unit == Unit.RPct || unit == Unit.Pct || unit == Unit.mm || unit == Unit.kgpm3 ||
unit == Unit.J || unit == Unit.uSpcm || unit == Unit.ppl || unit == Unit.ppkWh || unit == Unit.A ||
unit == Unit.V;
unit == Unit.J || unit == Unit.uSpcm || unit == Unit.ppl || unit == Unit.ppkWh;
}
public static bool IsQuantity(Unit unit, Quantity quantity)
@@ -370,14 +351,6 @@ namespace Common
case Unit.ppkWh:
case Unit.kWhpp:
return Quantity.PulsePerKWh;
case Unit.A:
case Unit.mA:
return Quantity.Current;
case Unit.V:
case Unit.mV:
return Quantity.Voltage;
default:
return Quantity.Number;
@@ -399,8 +372,6 @@ namespace Common
public static bool IsPulsePerLtr(Unit unit) { return IsQuantity(unit, Quantity.PulsePerLtr); }
public static bool IsPulsePerKWh(Unit unit) { return IsQuantity(unit, Quantity.PulsePerKWh); }
public static bool IsConductivity(Unit unit) { return IsQuantity(unit, Quantity.Conductivity); }
public static bool IsCurrent(Unit unit) { return IsQuantity(unit, Quantity.Current); }
public static bool IsVoltage(Unit unit) { return IsQuantity(unit, Quantity.Voltage); }
@@ -484,13 +455,6 @@ namespace Common
case Unit.dm3pp:
case Unit.lpdeg:
case Unit.dm3pdeg: return (v <= float.Epsilon) ? 0 : 1/v;
/// Current: internal representation in A
case Unit.mA: return 1000 * v; /// 1000 mA = 1 A
/// Voltage: internal representation in V
case Unit.mV: return 1000 * v; /// 1000 mV = 1 V
default: return v; /// Do not convert
}
@@ -570,12 +534,6 @@ namespace Common
/// Electrical conductivity
case Unit.mSpm: return 10 * v;
/// Current: internal representation in A
case Unit.mA: return 0.001 * v; /// 1 mA = 0.001 A
/// Voltage: internal representation in V
case Unit.mV: return 0.001 * v; /// 1 mV = 0.001 V
/// Invert
case Unit.kWhpp:
+28 -248
View File
@@ -1,11 +1,12 @@
///
/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
/// Copyright (c) 2021-2022 Sensus Slovensko a.s.
///
using System;
using System.IO.Ports;
namespace Common
{
public static class Utils
public class Utils
{
public static string GetTestName(string name, int repeats, int repetitionNr)
{
@@ -20,26 +21,15 @@ namespace Common
return (format == "F0") ? value.ToString("F0") : value.ToString(format).TrimEnd(new char[] { '0' });
}
public static FlowNames ProfileType2FlowNames(ProfileType pt, bool isAux = false)
public static FlowNames ProfileType2FlowNames(ProfileType pt)
{
switch (pt)
{
case ProfileType.Q3R:
case ProfileType.CompoundQ3RQ3R:
return FlowNames.Q3Q2Q1;
case ProfileType.CompoundQ3RQnClass:
return isAux ? FlowNames.QnQtQmin : FlowNames.Q3Q2Q1;
case ProfileType.QnClassColdWater:
case ProfileType.QnClassHotWater:
case ProfileType.CompoundQnClassQnClass:
return FlowNames.QnQtQmin;
case ProfileType.CompoundQnClassQ3R:
return isAux ? FlowNames.Q3Q2Q1 : FlowNames.QnQtQmin;
case ProfileType.QpQi:
case ProfileType.CompoundQpQiQpQi:
return FlowNames.QpQi;
default:
return FlowNames.Q3Q2Q1;
case ProfileType.Q3R: return FlowNames.Q3Q2Q1;
case ProfileType.QnClassColdWater: return FlowNames.QnQtQmin;
case ProfileType.QnClassHotWater: return FlowNames.QnQtQmin;
case ProfileType.QpQi: return FlowNames.QpQi;
default: return FlowNames.Q3Q2Q1;
}
}
@@ -116,242 +106,32 @@ namespace Common
}
}
/// <summary>
/// Get either Q1 or Qmin flow for a given Qn and metrological class
/// </summary>
/// <param name="Qn">Nominal flow in m3/h</param>
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
/// <returns>Q1 or Qmin flow in m3/h</returns>
public static double GetQ1Qmin(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
public static Parity GetParity(string str, Parity defaultParity = Parity.None)
{
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
int metroClassRatio;
if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0))
{
return Qn / (double)metroClassRatio;
}
else
{
if (medium == Medium.HotWater)
{
switch (metroClass)
{
case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn);
case "B": return (Qn < 15) ? (0.02 * Qn) : (0.04 * Qn);
case "C": return (Qn < 15) ? (0.01 * Qn) : (0.02 * Qn);
case "D": return (Qn < 15) ? (0.01 * Qn) : Qdflt;
default: break;
}
}
else
{
switch (metroClass)
{
case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn);
case "B": return (Qn < 15) ? (0.02 * Qn) : (0.03 * Qn);
case "C": return (Qn < 15) ? (0.01 * Qn) : (0.006 * Qn);
default: break;
}
}
}
return Qdflt;
if (str.Equals(Parity.None.ToString())) return Parity.None;
if (str.Equals(Parity.Even.ToString())) return Parity.Even;
if (str.Equals(Parity.Odd.ToString())) return Parity.Odd;
if (str.Equals(Parity.Mark.ToString())) return Parity.Mark;
if (str.Equals(Parity.Space.ToString())) return Parity.Space;
return defaultParity;
}
/// <summary>
/// Get either Q2 or Qt flow for a given Qn and metrological class
/// </summary>
/// <param name="Qn">Nominal flow in m3/h</param>
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
/// <returns>Q2 or Qt flow in m3/h</returns>
public static double GetQ2Qt(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
public static StopBits GetStopBits(string str, StopBits defaultStopBits = StopBits.One)
{
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
int metroClassRatio;
if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0))
{
return 1.6 * Qn / (double)metroClassRatio;
}
if (medium == Medium.HotWater)
{
switch (metroClass)
{
case "A": return (Qn < 15) ? (0.1 * Qn) : (0.2 * Qn);
case "B": return (Qn < 15) ? (0.08 * Qn) : (0.15 * Qn);
case "C": return (Qn < 15) ? (0.06 * Qn) : (0.1 * Qn);
case "D": return (Qn < 15) ? (0.015 * Qn) : Qdflt;
default: break;
}
}
else
{
switch (metroClass)
{
case "A": return (Qn < 15) ? (0.1 * Qn) : (0.3 * Qn);
case "B": return (Qn < 15) ? (0.08 * Qn) : (0.2 * Qn);
case "C": return (Qn < 15) ? (0.015 * Qn) : (0.015 * Qn);
default: break;
}
}
return Qdflt;
if (str.Equals(StopBits.None.ToString())) return StopBits.None;
if (str.Equals(StopBits.One.ToString())) return StopBits.One;
if (str.Equals(StopBits.OnePointFive.ToString())) return StopBits.OnePointFive;
if (str.Equals(StopBits.Two.ToString())) return StopBits.Two;
return defaultStopBits;
}
/// <summary>
/// Get either Q4 or Qmax flow for a given Qn and metrological class
/// </summary>
/// <param name="Qn">Nominal flow in m3/h</param>
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
/// <returns>Q4 or Qmax flow in m3/h</returns>
public static double GetQ4Qmax(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
public static Handshake GetHandshake(string str, Handshake defaultHandshake = Handshake.None)
{
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
switch (metroClass[0])
{
case 'A':
case 'B':
case 'C':
case 'D':
return 2 * Qn;
case 'R':
return 1.25 * Qn;
default:
return Qdflt;
}
}
/// <summary>
/// Checks requirements on the password regardless of the password history
/// </summary>
/// <param name="password">Password</param>
/// <returns>true when the password is OK</returns>
public static bool IsPasswordMeetsRequirements(string password, out string explanation)
{
int length = string.IsNullOrEmpty(password) ? 0 : password.Length;
/// Password length must be at least 6
if (length < CurrentUser.MinPasswdLength)
{
explanation = string.Format("Password must have at least {0} characters", CurrentUser.MinPasswdLength);
return false;
}
else
{
explanation = string.Empty;
return true;
}
}
/// <summary>
/// getHash encrypts a string
/// </summary>
/// <param name="text">the string to encrypt</param>
/// <returns></returns>
public static string GetHash(string text)
{
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(text);
System.Security.Cryptography.SHA512Managed hashstring = new System.Security.Cryptography.SHA512Managed();
byte[] hash = hashstring.ComputeHash(bytes);
string hashString = string.Empty;
foreach (byte x in hash)
{
hashString += String.Format("{0:x2}", x);
}
return hashString;
}
public static string EncodedStrToUserName(string encodedStr)
{
string[] subStrings = encodedStr.Split(new char[] { '~' });
return (subStrings.Length >= 1) ? subStrings[0] : string.Empty;
}
public static string EncodedStrToFullName(string encodedStr)
{
string[] subStrings = encodedStr.Split(new char[] { '~' });
return (subStrings.Length >= 2) ? subStrings[1] : string.Empty;
}
public static string EncodedStrToLegalizator(string encodedStr)
{
string[] subStrings = encodedStr.Split(new char[] { '~' });
return (subStrings.Length >= 3) ? subStrings[2] : string.Empty;
}
/// <summary>
/// Returns 'true' when authentication data are valid for a power user.
/// </summary>
/// <param name="userName">User name</param>
/// <param name="password">Password</param>
/// <returns>true = authenticated, false = refused</returns>
public static bool IsPowerUser(string userName, string password)
{
DateTime date = DateTime.Now.Date;
int number = (date.Year % 10) + 10 * (date.Month - 1) + 120 * date.Day;
string passwordOfDay = Convert.ToString(number, 8);
return (userName.Equals("milan") && password.Equals("kraken")) ||
(userName.Equals("igor") && password.Equals("mojronko8")) ||
(userName.Equals("lubo1212") && password.Equals("Tatry52")) ||
(userName.Equals("Michal") && password.Equals("Plok789456123")) ||
(userName.Equals("martin") && password.Equals("vaclavek84")) ||
(userName.Equals("pakan") && password.Equals("kuriatko")) ||
(userName.Equals("jan") && password.Equals("jaugust")) ||
(userName.Equals("JCermak") && password.Equals("Zt6911")) ||
(userName.Equals("gilles") && password.Equals("alibaba")) ||
(userName.Equals(passwordOfDay) && password.Equals(passwordOfDay));
}
public static void CalculateFeatureVector(Iperl.OptoTelegramRaw[] optoData, int optoDataCount, int startIx, int endIx, ref float[] x)
{
if (startIx < 0 || endIx >= optoDataCount || startIx >= endIx) return;
int n = 0;
Int64 sumFlow = 0;
Int64 sumFlow2 = 0;
Int64 sumEmf = 0;
Int64 sumEmf2 = 0;
Int64 sumMagF = 0;
Int64 sumMagF2 = 0;
Int64 sumImp = 0;
Int64 sumImp2 = 0;
for (int ix = startIx; ix <= endIx; ix++)
{
if (optoData[ix].Flags == Iperl.OptoTelegramFlags.OK ||
optoData[ix].Flags == Iperl.OptoTelegramFlags.OK_TestStart ||
optoData[ix].Flags == Iperl.OptoTelegramFlags.OK_TestEnd)
{
n++;
sumFlow += optoData[ix].FlowRaw;
sumFlow2 += ((int)optoData[ix].FlowRaw * (int)optoData[ix].FlowRaw);
sumEmf += (int)optoData[ix].EmfRaw;
sumEmf2 += ((Int64)optoData[ix].EmfRaw * (Int64)optoData[ix].EmfRaw);
sumMagF += optoData[ix].MagneticFieldRaw;
sumMagF2 += ((int)optoData[ix].MagneticFieldRaw * (int)optoData[ix].MagneticFieldRaw);
sumImp += optoData[ix].Impedance;
sumImp2 += ((int)optoData[ix].Impedance * (int)optoData[ix].Impedance);
}
}
if (n >= 2)
{
if (x.Length > 0) x[0] = ((float)sumFlow2 - (float)sumFlow * (float)sumFlow / n) / (n - 1);
if (x.Length > 1) x[1] = ((float)sumEmf2 - (float)sumEmf * (float)sumEmf / n) / (n - 1);
if (x.Length > 2) x[2] = ((float)sumMagF2 - (float)sumMagF * (float)sumMagF / n) / (n - 1);
if (x.Length > 3) x[3] = ((float)sumImp2 - (float)sumImp * (float)sumImp / n) / (n - 1);
}
if (str.Equals(Handshake.None.ToString())) return Handshake.None;
if (str.Equals(Handshake.RequestToSend.ToString())) return Handshake.RequestToSend;
if (str.Equals(Handshake.XOnXOff.ToString())) return Handshake.XOnXOff;
if (str.Equals(Handshake.RequestToSendXOnXOff.ToString())) return Handshake.RequestToSendXOnXOff;
return defaultHandshake;
}
}
}
-4
View File
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="log4net" version="2.0.15" targetFramework="net472" />
</packages>
+4 -4
View File
@@ -122,7 +122,7 @@ namespace Config.CalendarEvent
}
public static bool IsCalendarEventTrigerred(ICalendarEvent evnt, DateTime currentDate)
public static bool IsCalendarEventTrigerred(ICalendarEvent evnt, DateTime dateTimeNow)
{
DateTime evntDT = evnt.AllDay
? new DateTime(evnt.Date.Year, evnt.Date.Month, evnt.Date.Day, 0, 0, 0)
@@ -133,17 +133,17 @@ namespace Config.CalendarEvent
DateTime dt1 = evntDT;
DateTime dt2 = evntDT + new TimeSpan(8, 0, 0);
DateTime dt3 = evntDT + new TimeSpan(16, 0, 0);
return (currentDate >= dt1) || (currentDate >= dt1) || (currentDate >= dt3);
return (dateTimeNow >= dt1) || (dateTimeNow >= dt1) || (dateTimeNow >= dt3);
}
else if (!evnt.TriggerOnExactDayOnly)
{
/// Trigger after event expires
return (currentDate >= evntDT);
return (dateTimeNow >= evntDT);
}
else
{
/// Trigger event on exact date only
return (currentDate >= evntDT) && DayMatchesExactly(evnt, currentDate);
return (dateTimeNow >= evntDT) && DayMatchesExactly(evnt, dateTimeNow);
}
}
+10 -4
View File
@@ -19,7 +19,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG</DefineConstants>
<DefineConstants>TRACE;DEBUG;ROMA_200;LANG_IT;TEST_PROFILES</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
@@ -30,7 +30,7 @@
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;JUZNA_AFRIKA_NEW</DefineConstants>
<DefineConstants>TRACE;ROMA_200;LANG_IT;TEST_PROFILES</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
@@ -43,7 +43,7 @@
<HintPath>..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\packages\log4net.2.0.15\lib\net45\log4net.dll</HintPath>
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
@@ -68,6 +68,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="CalendarEvent\ICalendarEvent.cs" />
<Compile Include="Data.cs" />
<Compile Include="Entities\BenchPath.cs" />
<Compile Include="Entities\CustomEvent.cs" />
<Compile Include="Entities\Component.cs" />
@@ -95,6 +96,7 @@
<Compile Include="Entities\VirtualBenchStep.cs" />
<Compile Include="CalendarEvent\Utils.cs" />
<Compile Include="FluentCommon.cs" />
<Compile Include="Formulas.cs" />
<Compile Include="Mappings\BenchPathMap.cs" />
<Compile Include="Mappings\ComponentMap.cs" />
<Compile Include="Mappings\ComponentProcedureMap.cs" />
@@ -115,12 +117,12 @@
<Compile Include="Mappings\UncertaintyMap.cs" />
<Compile Include="Mappings\UserMap.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="PurchaseResources.cs" />
<Compile Include="Resources\Strings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Strings.resx</DependentUpon>
</Compile>
<Compile Include="Utils.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Strings.cs.resx" />
@@ -139,6 +141,10 @@
<Project>{c8939821-ba5c-4988-a3d0-bf53b74865c7}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\Users\Users.csproj">
<Project>{6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}</Project>
<Name>Users</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+95
View File
@@ -0,0 +1,95 @@
using System;
namespace Config
{
public class Data : Users.CurrentUser
{
public const string AdminUsername = "admin";
public const string AdminPassword = "staratura";
public const string SQLiteDbFName = "SQLite.db";
#if DN100 || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT || CEVAK_200
public const int WMsCount = 3;
public const int LineSize = 3;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = 1;
#elif MUNICH
public const int WMsCount = 3;
public const int LineSize = 3;
public const int CompoundWMsCount = 3;
public const int HeatMetersCount = 0;
public const int MaxPartNr = 3;
#elif MALTA_WSD25
public const int WMsCount = 6;
public const int LineSize = 6;
public const int CompoundWMsCount = 0;
public const int HeatMetersCount = 0;
public const int MaxPartNr = 1;
#elif BADGER_MALA_TRAT || BERLIN || FUZHOU_150 || FUZHOU_300 || GELSENWASSER || GENESIS || IZRAEL_200 || PETERSBURG_200 || SENTEC || SLM_150 || TORINO_50
public const int WMsCount = 6;
public const int LineSize = 6;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = 1;
#elif PUCHONG_200
public const int WMsCount = 6;
public const int LineSize = 6;
public const int CompoundWMsCount = 3;
public const int HeatMetersCount = 0;
public const int MaxPartNr = 3;
#elif RUM_MOB || TURA_SPECIAL
public const int WMsCount = 8;
public const int LineSize = 8;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#elif DEWA_300 || FUZHOU_100 || ROMA_200 || LUXEMBURG_40
public const int WMsCount = 10;
public const int LineSize = 10;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#elif DUBAJ_50
public const int WMsCount = 10;
public const int LineSize = 5;
public const int CompoundWMsCount = 0;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#elif SLM_END || WARSAW_END
public const int WMsCount = 10;
public const int LineSize = 5;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = 4;
#elif SLM_50
public const int WMsCount = 12;
public const int LineSize = 12;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 6;
public const int MaxPartNr = WMsCount / LineSize;
#elif ALZIR_25 || BAHRAIN_50 || CEVAK_40 || FEWA_50 || FILIPINY_50 || FUZHOU_50 || HONGKONG_50 || IZRAEL_25 || JUZNA_AFRIKA_50 || KEMPNO_50 || KRAKOW_50 || MILWAUKEE || MURES_40 || PETERSBURG_50 || TORUN_50 || WARSAW_50 || ZAMBIA || ZODINO
public const int WMsCount = 20;
public const int LineSize = 10;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#elif TURA_IPERL || TURA_IPERL_NEW
public const int WMsCount = 40;
public const int LineSize = 20;
public const int CompoundWMsCount = 1;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#elif IZRAEL_50
public const int WMsCount = 40;
public const int LineSize = 10;
public const int CompoundWMsCount = 0;
public const int HeatMetersCount = 0;
public const int MaxPartNr = WMsCount / LineSize;
#endif
public static double RealDensity = 0; /// true water density [kg/m3]
public static double AtTemperature = 0; /// measured at temperature [°C]
public static double Buoyancy = 0;
}
}
+2 -8
View File
@@ -13,8 +13,8 @@ namespace Config.Entities
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual string OriName { get; set; } /// Not mapped to database
public virtual double Qfrom { get; set; } /// Water flow in [m3/h]
public virtual double Qto { get; set; } /// Water flow in [m3/h]
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
public virtual float Qto { get; set; } /// Water flow in [m3/h]
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
public virtual string Selector { get; set; }
public virtual string TempMtrUp { get; set; }
@@ -22,9 +22,6 @@ namespace Config.Entities
public virtual string PressMtrUp { get; set; }
public virtual string PressMtrDown { get; set; }
public virtual string PressMtrDelta { get; set; }
public virtual string ElectricMtrUp { get; set; }
public virtual string ElectricMtrDown { get; set; }
public virtual string ElectricMtrDelta { get; set; }
public virtual string StopBFValve { get; set; }
/// Valves
@@ -62,9 +59,6 @@ namespace Config.Entities
result.PressMtrUp = PressMtrUp;
result.PressMtrDown = PressMtrDown;
result.PressMtrDelta = PressMtrDelta;
result.ElectricMtrUp = ElectricMtrUp;
result.ElectricMtrDown = ElectricMtrDown;
result.ElectricMtrDelta = ElectricMtrDelta;
result.StopBFValve = StopBFValve;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
+36 -36
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -14,11 +14,11 @@ namespace Config.Entities
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual string ClassName { get; set; }
public virtual string Parent { get; set; }
public virtual DebugMode DebugMode { get; set; }
public virtual LogLevel LogLevel { get; set; }
public virtual string ParentName { get; set; }
public virtual DebugMode Mode { get; set; }
public virtual LogLevel Logging { get; set; }
public virtual string Parameters { get; set; }
public virtual IList<MeasurementCorrection> Corrections { get; set; }
public virtual IList<MeasurementCorrection> Corrections { get; set; }
public virtual IList<Uncertainty> Uncertainties { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
@@ -38,9 +38,9 @@ namespace Config.Entities
result.ItemNr = itemNr;
result.Name = name;
result.ClassName = className;
result.Parent = parentName;
result.DebugMode = debugLevel;
result.LogLevel = logLevel;
result.ParentName = parentName;
result.Mode = debugLevel;
result.Logging = logLevel;
result.Parameters = parameters;
return result;
}
@@ -52,9 +52,9 @@ namespace Config.Entities
result.ItemNr = ItemNr;
result.Name = Name;
result.ClassName = ClassName;
result.Parent = Parent;
result.DebugMode = DebugMode;
result.LogLevel = LogLevel;
result.ParentName = ParentName;
result.Mode = Mode;
result.Logging = Logging;
result.Parameters = Parameters;
return result;
}
@@ -63,9 +63,9 @@ namespace Config.Entities
{
output.WriteLine(Name);
output.WriteLine(ClassName);
output.WriteLine(Parent);
output.WriteLine(DebugMode.ToString());
output.WriteLine(LogLevel.ToString());
output.WriteLine(ParentName);
output.WriteLine(Mode.ToString());
output.WriteLine(Logging.ToString());
output.Write(Parameters);
output.Close();
@@ -77,28 +77,28 @@ namespace Config.Entities
result.Name = input.ReadLine();
result.ClassName = input.ReadLine();
result.Parent = input.ReadLine();
result.ParentName = input.ReadLine();
string line = input.ReadLine();
if (line.Equals(DebugMode.DetectedOff.ToString())) result.DebugMode = DebugMode.DetectedOff;
else if (line.Equals(DebugMode.DetectedOn.ToString())) result.DebugMode = DebugMode.DetectedOn;
else if (line.Equals(DebugMode.Normal.ToString())) result.DebugMode = DebugMode.Normal;
else if (line.Equals(DebugMode.AutoDetect.ToString())) result.DebugMode = DebugMode.AutoDetect;
else if (line.Equals(DebugMode.FailureDuringOperation.ToString())) result.DebugMode = DebugMode.FailureDuringOperation;
else if (line.Equals(DebugMode.Off.ToString())) result.DebugMode = DebugMode.Off;
else if (line.Equals(DebugMode.Record.ToString())) result.DebugMode = DebugMode.Record;
else if (line.Equals(DebugMode.Replay.ToString())) result.DebugMode = DebugMode.Replay;
else if (line.Equals(DebugMode.Simulate.ToString())) result.DebugMode = DebugMode.Simulate;
else if (line.Equals(DebugMode.Inherit.ToString())) result.DebugMode = DebugMode.Inherit;
if (line.Equals(DebugMode.DetectedOff.ToString())) result.Mode = DebugMode.DetectedOff;
else if (line.Equals(DebugMode.DetectedOn.ToString())) result.Mode = DebugMode.DetectedOn;
else if (line.Equals(DebugMode.Normal.ToString())) result.Mode = DebugMode.Normal;
else if (line.Equals(DebugMode.AutoDetect.ToString())) result.Mode = DebugMode.AutoDetect;
else if (line.Equals(DebugMode.FailureDuringOperation.ToString())) result.Mode = DebugMode.FailureDuringOperation;
else if (line.Equals(DebugMode.Off.ToString())) result.Mode = DebugMode.Off;
else if (line.Equals(DebugMode.Record.ToString())) result.Mode = DebugMode.Record;
else if (line.Equals(DebugMode.Replay.ToString())) result.Mode = DebugMode.Replay;
else if (line.Equals(DebugMode.Simulate.ToString())) result.Mode = DebugMode.Simulate;
else if (line.Equals(DebugMode.Inherit.ToString())) result.Mode = DebugMode.Inherit;
line = input.ReadLine();
if (line.Equals(LogLevel.Off.ToString())) result.LogLevel = LogLevel.Off;
else if (line.Equals(LogLevel.Fatal.ToString())) result.LogLevel = LogLevel.Fatal;
else if (line.Equals(LogLevel.Error.ToString())) result.LogLevel = LogLevel.Error;
else if (line.Equals(LogLevel.Warn.ToString())) result.LogLevel = LogLevel.Warn;
else if (line.Equals(LogLevel.Info.ToString())) result.LogLevel = LogLevel.Info;
else if (line.Equals(LogLevel.Debug.ToString())) result.LogLevel = LogLevel.Debug;
else if (line.Equals(LogLevel.All.ToString())) result.LogLevel = LogLevel.All;
if (line.Equals(LogLevel.Off.ToString())) result.Logging = LogLevel.Off;
else if (line.Equals(LogLevel.Fatal.ToString())) result.Logging = LogLevel.Fatal;
else if (line.Equals(LogLevel.Error.ToString())) result.Logging = LogLevel.Error;
else if (line.Equals(LogLevel.Warn.ToString())) result.Logging = LogLevel.Warn;
else if (line.Equals(LogLevel.Info.ToString())) result.Logging = LogLevel.Info;
else if (line.Equals(LogLevel.Debug.ToString())) result.Logging = LogLevel.Debug;
else if (line.Equals(LogLevel.All.ToString())) result.Logging = LogLevel.All;
result.Parameters = string.Empty;
line = input.ReadLine();
@@ -119,12 +119,12 @@ namespace Config.Entities
result += indent + "ItemNr = " + (ItemNr + 1).ToString() + Environment.NewLine;
result += indent + "Name = " + Name + Environment.NewLine;
result += indent + "ClassName = " + ClassName + Environment.NewLine;
if (Parent != null)
if (ParentName != null)
{
result += indent + "ParentName = " + Parent + Environment.NewLine;
result += indent + "ParentName = " + ParentName + Environment.NewLine;
}
result += indent + "DebugLevel = " + DebugMode.ToString() + Environment.NewLine;
result += indent + "LogLevel = " + LogLevel.ToString() + Environment.NewLine;
result += indent + "DebugLevel = " + Mode.ToString() + Environment.NewLine;
result += indent + "LogLevel = " + Logging.ToString() + Environment.NewLine;
result += indent + "Parameters = " + Parameters + Environment.NewLine;
return result;
+1 -1
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.IO;
+1 -1
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.IO;
+2 -2
View File
@@ -46,8 +46,8 @@ namespace Config.Entities
Rank = 2;
Hidden = false;
ReadOnly = false;
BackColor = unchecked((int)0xFFFF5050);
TextColor = unchecked((int)0xFFFFFFFF);
BackColor = unchecked((int)0xFFFF5050); /// (MSB)AARRGGBB(LSB) ... pink
TextColor = unchecked((int)0xFFFFFFFF); /// (MSB)AARRGGBB(LSB) ... white
TooltipEnabled = true;
CustomRecurringFunction = null;
}
+11 -11
View File
@@ -13,12 +13,12 @@ namespace Config.Entities
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual string OriName { get; set; } /// Not mapped to database
public virtual double Qfrom { get; set; } /// Water flow in [m3/h]
public virtual double Qto { get; set; } /// Water flow in [m3/h]
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
public virtual float Qto { get; set; } /// Water flow in [m3/h]
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
public virtual string Selector { get; set; }
public virtual string Pump { get; set; }
public virtual string RegVPositions { get; set; } /// Positions of regulation valves in Category.Feeding in % separated by ';'
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
/// Valves
public virtual string ValvesOpen { get; set; }
@@ -46,14 +46,14 @@ namespace Config.Entities
{
FeedingPath result = new FeedingPath(name, itemNr);
result.Qfrom = Qfrom;
result.Qto = Qto;
result.FlowUnit = FlowUnit;
result.Selector = Selector;
result.Pump = Pump;
result.RegVPositions = RegVPositions;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
result.Qfrom = Qfrom;
result.Qto = Qto;
result.FlowUnit = FlowUnit;
result.Selector = Selector;
result.Pump = Pump;
result.RegulValvesPct = RegulValvesPct;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
return result;
}
+3 -4
View File
@@ -1,16 +1,15 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2020 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using Common;
namespace Config.Entities
{
public class Group
{
public virtual int Id { get; protected set; }
public virtual GID GID { get; set; }
public virtual Common.GID GID { get; set; }
public virtual long AccessFlags { get; set; } /// Bitfield of access flags: bit0 .. bit62
public virtual IList<User> Users { get; set; } /// Group can be a member of a list of users
@@ -19,7 +18,7 @@ namespace Config.Entities
Users = new List<User>();
}
public Group(GID gid)
public Group(Common.GID gid)
: this()
{
GID = gid;
+1 -2
View File
@@ -6,7 +6,7 @@ using System.Collections.Generic;
namespace Config.Entities
{
public class MeasurementCorrection : Common.IMeasurementCorrection, IComparable<MeasurementCorrection>
public class MeasurementCorrection : Common.IMeasurementCorrection, IComparable<MeasurementCorrection>
{
public virtual int Id { get; protected set; }
public virtual int RangeIx { get; set; } /// 0..5
@@ -28,7 +28,6 @@ namespace Config.Entities
return (Measurement > other.Measurement) ? 1 : ((Measurement == other.Measurement) ? 0 : -1);
}
/// <summary>
/// Calculates corrected value from a list of corrections by interpolation.
/// It is assumed that values in the list 'corrections' are sorted.
+141 -61
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
@@ -14,15 +14,15 @@ namespace Config.Entities
public virtual string OriName { get; set; } /// Not mapped to database
/// Sensors
public virtual string Sensor1 { get; set; }
public virtual string Sensor2 { get; set; }
public virtual string Sensor3 { get; set; }
public virtual string Sensor4 { get; set; }
public virtual string Sensor5 { get; set; }
public virtual string Sensor6 { get; set; }
public virtual string Sensor7 { get; set; }
public virtual string Sensor8 { get; set; }
public virtual string Sensor9 { get; set; }
public virtual string Sensor1 { get; set; }
public virtual string Sensor2 { get; set; }
public virtual string Sensor3 { get; set; }
public virtual string Sensor4 { get; set; }
public virtual string Sensor5 { get; set; }
public virtual string Sensor6 { get; set; }
public virtual string Sensor7 { get; set; }
public virtual string Sensor8 { get; set; }
public virtual string Sensor9 { get; set; }
public virtual string Sensor10 { get; set; }
public virtual string Sensor11 { get; set; }
public virtual string Sensor12 { get; set; }
@@ -34,6 +34,26 @@ namespace Config.Entities
public virtual string Sensor18 { get; set; }
public virtual string Sensor19 { get; set; }
public virtual string Sensor20 { get; set; }
public virtual string Sensor21 { get; set; }
public virtual string Sensor22 { get; set; }
public virtual string Sensor23 { get; set; }
public virtual string Sensor24 { get; set; }
public virtual string Sensor25 { get; set; }
public virtual string Sensor26 { get; set; }
public virtual string Sensor27 { get; set; }
public virtual string Sensor28 { get; set; }
public virtual string Sensor29 { get; set; }
public virtual string Sensor30 { get; set; }
public virtual string Sensor31 { get; set; }
public virtual string Sensor32 { get; set; }
public virtual string Sensor33 { get; set; }
public virtual string Sensor34 { get; set; }
public virtual string Sensor35 { get; set; }
public virtual string Sensor36 { get; set; }
public virtual string Sensor37 { get; set; }
public virtual string Sensor38 { get; set; }
public virtual string Sensor39 { get; set; }
public virtual string Sensor40 { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
@@ -51,15 +71,15 @@ namespace Config.Entities
public virtual MetersPath Clone(string name, int itemNr)
{
MetersPath result = new MetersPath(name, itemNr);
result.Sensor1 = Sensor1;
result.Sensor2 = Sensor2;
result.Sensor3 = Sensor3;
result.Sensor4 = Sensor4;
result.Sensor5 = Sensor5;
result.Sensor6 = Sensor6;
result.Sensor7 = Sensor7;
result.Sensor8 = Sensor8;
result.Sensor9 = Sensor9;
result.Sensor1 = Sensor1;
result.Sensor2 = Sensor2;
result.Sensor3 = Sensor3;
result.Sensor4 = Sensor4;
result.Sensor5 = Sensor5;
result.Sensor6 = Sensor6;
result.Sensor7 = Sensor7;
result.Sensor8 = Sensor8;
result.Sensor9 = Sensor9;
result.Sensor10 = Sensor10;
result.Sensor11 = Sensor11;
result.Sensor12 = Sensor12;
@@ -71,59 +91,119 @@ namespace Config.Entities
result.Sensor18 = Sensor18;
result.Sensor19 = Sensor19;
result.Sensor20 = Sensor20;
result.Sensor21 = Sensor21;
result.Sensor22 = Sensor22;
result.Sensor23 = Sensor23;
result.Sensor24 = Sensor24;
result.Sensor25 = Sensor25;
result.Sensor26 = Sensor26;
result.Sensor27 = Sensor27;
result.Sensor28 = Sensor28;
result.Sensor29 = Sensor29;
result.Sensor30 = Sensor30;
result.Sensor31 = Sensor31;
result.Sensor32 = Sensor32;
result.Sensor33 = Sensor33;
result.Sensor34 = Sensor34;
result.Sensor35 = Sensor35;
result.Sensor36 = Sensor36;
result.Sensor37 = Sensor37;
result.Sensor38 = Sensor38;
result.Sensor39 = Sensor39;
result.Sensor40 = Sensor40;
return result;
}
/// Returns the component name
public virtual string GetSensor(int wmNr0)
public virtual string GetSensor(int i)
{
if (wmNr0 == 0) return Sensor1;
else if (wmNr0 == 1) return Sensor2;
else if (wmNr0 == 2) return Sensor3;
else if (wmNr0 == 3) return Sensor4;
else if (wmNr0 == 4) return Sensor5;
else if (wmNr0 == 5) return Sensor6;
else if (wmNr0 == 6) return Sensor7;
else if (wmNr0 == 7) return Sensor8;
else if (wmNr0 == 8) return Sensor9;
else if (wmNr0 == 9) return Sensor10;
else if (wmNr0 == 10) return Sensor11;
else if (wmNr0 == 11) return Sensor12;
else if (wmNr0 == 12) return Sensor13;
else if (wmNr0 == 13) return Sensor14;
else if (wmNr0 == 14) return Sensor15;
else if (wmNr0 == 15) return Sensor16;
else if (wmNr0 == 16) return Sensor17;
else if (wmNr0 == 17) return Sensor18;
else if (wmNr0 == 18) return Sensor19;
else if (wmNr0 == 19) return Sensor20;
if (i == 0) return Sensor1;
else if (i == 1) return Sensor2;
else if (i == 2) return Sensor3;
else if (i == 3) return Sensor4;
else if (i == 4) return Sensor5;
else if (i == 5) return Sensor6;
else if (i == 6) return Sensor7;
else if (i == 7) return Sensor8;
else if (i == 8) return Sensor9;
else if (i == 9) return Sensor10;
else if (i == 10) return Sensor11;
else if (i == 11) return Sensor12;
else if (i == 12) return Sensor13;
else if (i == 13) return Sensor14;
else if (i == 14) return Sensor15;
else if (i == 15) return Sensor16;
else if (i == 16) return Sensor17;
else if (i == 17) return Sensor18;
else if (i == 18) return Sensor19;
else if (i == 19) return Sensor20;
else if (i == 20) return Sensor21;
else if (i == 21) return Sensor22;
else if (i == 22) return Sensor23;
else if (i == 23) return Sensor24;
else if (i == 24) return Sensor25;
else if (i == 25) return Sensor26;
else if (i == 26) return Sensor27;
else if (i == 27) return Sensor28;
else if (i == 28) return Sensor29;
else if (i == 29) return Sensor30;
else if (i == 30) return Sensor31;
else if (i == 31) return Sensor32;
else if (i == 32) return Sensor33;
else if (i == 33) return Sensor34;
else if (i == 34) return Sensor35;
else if (i == 35) return Sensor36;
else if (i == 36) return Sensor37;
else if (i == 37) return Sensor38;
else if (i == 38) return Sensor39;
else if (i == 39) return Sensor40;
else return null;
}
/// Sets the component name
public virtual void SetSensor(int wmNr0, string cmpntName)
public virtual void SetSensor(int i, string cmpntName)
{
if (wmNr0 == 0) Sensor1 = cmpntName;
else if (wmNr0 == 1) Sensor2 = cmpntName;
else if (wmNr0 == 2) Sensor3 = cmpntName;
else if (wmNr0 == 3) Sensor4 = cmpntName;
else if (wmNr0 == 4) Sensor5 = cmpntName;
else if (wmNr0 == 5) Sensor6 = cmpntName;
else if (wmNr0 == 6) Sensor7 = cmpntName;
else if (wmNr0 == 7) Sensor8 = cmpntName;
else if (wmNr0 == 8) Sensor9 = cmpntName;
else if (wmNr0 == 9) Sensor10 = cmpntName;
else if (wmNr0 == 10) Sensor11 = cmpntName;
else if (wmNr0 == 11) Sensor12 = cmpntName;
else if (wmNr0 == 12) Sensor13 = cmpntName;
else if (wmNr0 == 13) Sensor14 = cmpntName;
else if (wmNr0 == 14) Sensor15 = cmpntName;
else if (wmNr0 == 15) Sensor16 = cmpntName;
else if (wmNr0 == 16) Sensor17 = cmpntName;
else if (wmNr0 == 17) Sensor18 = cmpntName;
else if (wmNr0 == 18) Sensor19 = cmpntName;
else if (wmNr0 == 19) Sensor20 = cmpntName;
if (i == 0) Sensor1 = cmpntName;
else if (i == 1) Sensor2 = cmpntName;
else if (i == 2) Sensor3 = cmpntName;
else if (i == 3) Sensor4 = cmpntName;
else if (i == 4) Sensor5 = cmpntName;
else if (i == 5) Sensor6 = cmpntName;
else if (i == 6) Sensor7 = cmpntName;
else if (i == 7) Sensor8 = cmpntName;
else if (i == 8) Sensor9 = cmpntName;
else if (i == 9) Sensor10 = cmpntName;
else if (i == 10) Sensor11 = cmpntName;
else if (i == 11) Sensor12 = cmpntName;
else if (i == 12) Sensor13 = cmpntName;
else if (i == 13) Sensor14 = cmpntName;
else if (i == 14) Sensor15 = cmpntName;
else if (i == 15) Sensor16 = cmpntName;
else if (i == 16) Sensor17 = cmpntName;
else if (i == 17) Sensor18 = cmpntName;
else if (i == 18) Sensor19 = cmpntName;
else if (i == 19) Sensor20 = cmpntName;
else if (i == 20) Sensor21 = cmpntName;
else if (i == 21) Sensor22 = cmpntName;
else if (i == 22) Sensor23 = cmpntName;
else if (i == 23) Sensor24 = cmpntName;
else if (i == 24) Sensor25 = cmpntName;
else if (i == 25) Sensor26 = cmpntName;
else if (i == 26) Sensor27 = cmpntName;
else if (i == 27) Sensor28 = cmpntName;
else if (i == 28) Sensor29 = cmpntName;
else if (i == 29) Sensor30 = cmpntName;
else if (i == 30) Sensor31 = cmpntName;
else if (i == 31) Sensor32 = cmpntName;
else if (i == 32) Sensor33 = cmpntName;
else if (i == 33) Sensor34 = cmpntName;
else if (i == 34) Sensor35 = cmpntName;
else if (i == 35) Sensor36 = cmpntName;
else if (i == 36) Sensor37 = cmpntName;
else if (i == 37) Sensor38 = cmpntName;
else if (i == 38) Sensor39 = cmpntName;
else if (i == 39) Sensor40 = cmpntName;
}
}
}
+20 -20
View File
@@ -13,18 +13,18 @@ namespace Config.Entities
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual string OriName { get; set; } /// Not mapped to database
public virtual double Qfrom { get; set; } /// Water flow in [m3/h]
public virtual double Qto { get; set; } /// Water flow in [m3/h]
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
public virtual float Qto { get; set; } /// Water flow in [m3/h]
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
public virtual string Selector { get; set; }
public virtual string RegValve { get; set; }
public virtual string RegulValve { get; set; }
public virtual string FlowMeter { get; set; }
public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path
public virtual string StartValve { get; set; }
public virtual string Diverter { get; set; }
public virtual string TempMtrDiv { get; set; }
public virtual string TempDiv { get; set; }
public virtual string Scale { get; set; }
public virtual string RegVPositions { get; set; } /// Positions of regulation valves in Category.Output in % separated by ';'
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
/// Valves
public virtual string ValvesOpen { get; set; }
@@ -52,21 +52,21 @@ namespace Config.Entities
{
OutputPath result = new OutputPath(name, itemNr);
result.Name = Name;
result.Qfrom = Qfrom;
result.Qto = Qto;
result.FlowUnit = FlowUnit;
result.Selector = Selector;
result.RegValve = RegValve;
result.FlowMeter = FlowMeter;
result.PidCoef = PidCoef;
result.StartValve = StartValve;
result.Diverter = Diverter;
result.TempMtrDiv = TempMtrDiv;
result.Scale = Scale;
result.RegVPositions= RegVPositions;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
result.Name = Name;
result.Qfrom = Qfrom;
result.Qto = Qto;
result.FlowUnit = FlowUnit;
result.Selector = Selector;
result.RegulValve = RegulValve;
result.FlowMeter = FlowMeter;
result.PidCoef = PidCoef;
result.StartValve = StartValve;
result.Diverter = Diverter;
result.TempDiv = TempDiv;
result.Scale = Scale;
result.RegulValvesPct = RegulValvesPct;
result.ValvesOpen = ValvesOpen;
result.ValvesClose = ValvesClose;
return result;
}
+2 -7
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2019-2023 Sensus Slovensko a.s.
/// Copyright (c) 2019-2022 Sensus Slovensko a.s.
///
using System;
using System.Globalization;
@@ -16,9 +16,7 @@ namespace Config.Entities
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
public virtual string Name { get; set; }
public virtual int Part { get; set; } /// Part=0 ... test of all WM-s
/// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath
public virtual FlowId FlowId { get; set; }
public virtual int Part { get; set; } /// Part=0 ... test of all WM-s /// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath
public virtual double CoefQfrom { get; set; } /// Water flow low limit in [m3/h]
public virtual double CoefQto { get; set; } /// Water flow high limit in [m3/h]
public virtual double ErrLimLo { get; set; } /// in [%] usually < 0, in case of heat meters: 1=class1, 2=class2, 3=class3
@@ -188,7 +186,6 @@ namespace Config.Entities
output.WriteLine(Name);
output.WriteLine(Part);
output.WriteLine(((ushort)FlowId).ToString(ci));
output.WriteLine(CoefQfrom.ToString(ci));
output.WriteLine(CoefQto.ToString(ci));
output.WriteLine(ErrLimLo.ToString(ci));
@@ -248,7 +245,6 @@ namespace Config.Entities
tst.Name = firstLine;
tst.Part = int.Parse(input.ReadLine());
tst.FlowId = (FlowId)ushort.Parse(input.ReadLine(), ci);
tst.CoefQfrom = double.Parse(input.ReadLine(), ci);
tst.CoefQto = double.Parse(input.ReadLine(), ci);
tst.ErrLimLo = double.Parse(input.ReadLine(), ci);
@@ -310,7 +306,6 @@ namespace Config.Entities
if (Name != firstLine) { diff.AppendFormat(fmt, "Name", Name, firstLine); };
ln = inp.ReadLine(); if (ln != Part.ToString()) { diff.AppendFormat(fmt, "Part", Part.ToString(), ln); };
ln = inp.ReadLine(); if (ln != ((ushort)FlowId).ToString()){diff.AppendFormat(fmt, "FlowId", ((ushort)FlowId).ToString(), ln); };
ln = inp.ReadLine(); if (ln != CoefQfrom.ToString(ci)) { diff.AppendFormat(fmt, "CoefQfrom", CoefQfrom.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != CoefQto.ToString(ci)) { diff.AppendFormat(fmt, "CoefQto", CoefQto.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != ErrLimLo.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimLo", ErrLimLo.ToString(ci), ln); };
+2 -2
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2023 Sensus Slovensko a.s.
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -75,7 +75,7 @@ namespace Config.Entities
///
/// Default values
///
CreationUser = Common.CurrentUser.UserName();
CreationUser = Users.CurrentUser.UserName();
CreationTime = DateTime.Now;
LastChgUser = CreationUser;
LastChgTime = CreationTime;
+1 -1
View File
@@ -36,7 +36,7 @@ namespace Config.Entities
///
/// Default values
///
CreationUser = CurrentUser.UserName();
CreationUser = Users.CurrentUser.UserName();
CreationTime = DateTime.Now;
LastChgUser = CreationUser;
LastChgTime = CreationTime;
+71 -47
View File
@@ -19,15 +19,14 @@ namespace Config.Entities
public virtual string Name { get; set; }
public virtual int Part { get; set; } /// Part=0 ... test of all WM-s
/// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath
public virtual TestProfile Profile { get; set; } /// UserDefined, UserDefinedCompound, UserDefinedHeatMeter, Protected, ProtectedCompound, ProtectedHeatMeter
public virtual TestProfile Profile { get; set; } /// UserDefined, Protected, UserDefinedHeatMeter, ProtectedHeatMeter
public virtual sbyte Publish { get; set; } /// 0=no, 1=in all protocols, 2=on screen, 3=internal
public virtual bool DoEvaluate { get; set; }
public virtual double Qtg { get; set; } /// When == -1 => Qtg is determined by the test method, otherwise Qtg is in [m3/h],
public virtual double Qfrom { get; set; } /// Water flow low limit in [m3/h] or in [%] of Qtg
public virtual double Qto { get; set; } /// Water flow high limit in [m3/h] or in [%] of Qtg
public virtual bool IsFromToInPct { get; set; } /// true: Qfrom and Qto are in % of Qtg, false: Qfrom and Qto are in [m3/h]
public virtual double Qtg { get; set; } /// Target water flow [m3/h]
public virtual double Qfrom { get; set; } /// Water flow low limit in [m3/h]
public virtual double Qto { get; set; } /// Water flow high limit in [m3/h]
public virtual double Volume { get; set; } /// Test volume (target) in [l]
public virtual double TestTime { get; set; } /// Test time (estimate) in [s]
public virtual double TestTime { get; set; } /// Test time (estimate) in [s]
public virtual string Method { get; set; }
public virtual float ErrLimLo { get; set; } /// in [%] usually < 0, in case of heat meters: 1=class1, 2=class2, 3=class3
public virtual float ErrLimHi { get; set; } /// in [%] usually > 0, in case of heat meters: -Qn in m3/h
@@ -46,7 +45,8 @@ namespace Config.Entities
public virtual int TimeFlow2Mass { get; set; } /// Delay time from the flow stable to the 1st mass measurement in [s]
public virtual int TimePump2StartV { get; set; } /// Delay time from the start of the pump to opening the start valve in [s]
public virtual int TimeStop2Mass { get; set; } /// Delay time from the test end (diverted) to the 2nd mass measuremen in [s]
public virtual int ShortPulses { get; set; } /// Short pulses
public virtual double ShortPulses { get; set; } /// = Filter
public virtual string RedType { get; set; }
public virtual string FeedingPath { get; set; }
public virtual string BenchPath { get; set; }
public virtual string OutputPath { get; set; }
@@ -57,12 +57,14 @@ namespace Config.Entities
public virtual string TransBefore { get; set; }
public virtual string TransBetween { get; set; }
public virtual string TransAfter { get; set; }
public virtual IList<ComponentTest> MoreParams { get; set; }
public virtual Procedure Procedure { get; set; }
/// Additional stuff not mapped into the database
#if ORACLE_DB
public virtual int OraId { get; set; }
public virtual int OraIdRepetMulti { get; set; }
public virtual string OraDesignation { get; set; }
public virtual int RawDataId { get; set; }
public virtual int RawDataIdRepetMulti { get; set; }
public virtual string RawDataDesignation { get; set; }
#endif
public virtual bool IsOuterLoopStart { get; set; } /// Not mapped to database
public virtual bool IsOuterLoopEnd { get; set; } /// Not mapped to database
@@ -78,17 +80,12 @@ namespace Config.Entities
public virtual Unit TempUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit PressUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit LengthUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
public virtual Unit ElectricUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
/// Wrappers
public virtual double QfromM3ph()
{
return !IsFromToInPct ? Qfrom : Qtg >= 0 ? Qtg * Qfrom / 100 : 0;
}
public virtual double QtoM3ph()
{
return !IsFromToInPct ? Qto : Qtg >= 0 ? Qtg * Qto / 100 : 0;
}
public virtual IList<ComponentTest> MoreParams { get; set; }
public virtual Procedure Procedure { get; set; }
/// ------------- Additional stuff not mapped into the database -------------
public Test()
{
@@ -101,7 +98,6 @@ namespace Config.Entities
Profile = TestProfile.UserDefined;
Publish = (sbyte)Common.Publish.Always;
DoEvaluate = true;
IsFromToInPct = false;
ErrLimLo = -2.0f; /// [%] lower error limit
ErrLimHi = 2.0f; /// [%] upper error limit
Uncertainty = 0;
@@ -123,7 +119,15 @@ namespace Config.Entities
TransBefore = string.Empty;
TransBetween = string.Empty;
TransAfter = string.Empty;
}
#if ORACLE_DB
OraId = 0;
OraIdRepetMulti = 0;
OraDesignation = string.Empty;
RawDataId = 0;
RawDataIdRepetMulti = 0;
RawDataDesignation = string.Empty;
#endif
}
public Test(string name, int itemNr, Procedure procedure)
: this()
@@ -171,8 +175,7 @@ namespace Config.Entities
result.Qtg = Qtg;
result.Qfrom = Qfrom;
result.Qto = Qto;
result.IsFromToInPct = IsFromToInPct;
result.Volume = Volume;
result.Volume = Volume;
result.TestTime = TestTime;
result.Method = Method;
result.ErrLimLo = ErrLimLo;
@@ -193,6 +196,7 @@ namespace Config.Entities
result.TimePump2StartV = TimePump2StartV;
result.TimeStop2Mass = TimeStop2Mass;
result.ShortPulses = ShortPulses;
result.RedType = RedType;
result.FeedingPath = FeedingPath;
result.BenchPath = BenchPath;
result.OutputPath = OutputPath;
@@ -203,14 +207,20 @@ namespace Config.Entities
result.TransBefore = TransBefore;
result.TransBetween = TransBetween;
result.TransAfter = TransAfter;
#if ORACLE_DB
result.OraId = OraId;
result.OraIdRepetMulti = OraIdRepetMulti;
result.OraDesignation = OraDesignation;
result.RawDataId = RawDataId;
result.RawDataIdRepetMulti = RawDataIdRepetMulti;
result.RawDataDesignation = RawDataDesignation;
#endif
result.VolumeUnit = VolumeUnit;
result.FlowUnit = FlowUnit;
result.FlowUnit = FlowUnit;
result.MassUnit = MassUnit;
result.TempUnit = TempUnit;
result.PressUnit = PressUnit;
result.LengthUnit = LengthUnit;
result.ElectricUnit = ElectricUnit;
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
return result;
@@ -227,7 +237,6 @@ namespace Config.Entities
output.WriteLine(Qtg.ToString(ci));
output.WriteLine(Qfrom.ToString(ci));
output.WriteLine(Qto.ToString(ci));
output.WriteLine(IsFromToInPct.ToString());
output.WriteLine(Volume.ToString(ci));
output.WriteLine(TestTime.ToString(ci));
output.WriteLine(Method);
@@ -248,7 +257,6 @@ namespace Config.Entities
output.WriteLine(TimeFlow2Mass.ToString(ci));
output.WriteLine(TimePump2StartV.ToString(ci));
output.WriteLine(TimeStop2Mass.ToString(ci));
output.WriteLine(ShortPulses.ToString(ci));
output.WriteLine(FeedingPath);
output.WriteLine(BenchPath);
output.WriteLine(OutputPath);
@@ -257,7 +265,14 @@ namespace Config.Entities
output.WriteLine(TransBetween);
output.WriteLine(Profile);
output.WriteLine(TransAfter);
#if ORACLE_DB
output.WriteLine(OraId);
output.WriteLine(OraIdRepetMulti);
output.WriteLine(OraDesignation);
output.WriteLine(RawDataId);
output.WriteLine(RawDataIdRepetMulti);
output.WriteLine(RawDataDesignation);
#endif
foreach (var prms in MoreParams) { prms.Export(output); }
output.WriteLine();
}
@@ -280,7 +295,6 @@ namespace Config.Entities
tst.Qtg = double.Parse(input.ReadLine(), ci);
tst.Qfrom = double.Parse(input.ReadLine(), ci);
tst.Qto = double.Parse(input.ReadLine(), ci);
tst.IsFromToInPct = bool.Parse(input.ReadLine());
tst.Volume = double.Parse(input.ReadLine(), ci);
tst.TestTime = double.Parse(input.ReadLine(), ci);
tst.Method = input.ReadLine();
@@ -301,7 +315,6 @@ namespace Config.Entities
tst.TimeFlow2Mass = int.Parse(input.ReadLine(), ci);
tst.TimePump2StartV = int.Parse(input.ReadLine(), ci);
tst.TimeStop2Mass = int.Parse(input.ReadLine(), ci);
tst.ShortPulses = int.Parse(input.ReadLine(), ci);
tst.FeedingPath = input.ReadLine();
tst.BenchPath = input.ReadLine();
tst.OutputPath = input.ReadLine();
@@ -310,12 +323,17 @@ namespace Config.Entities
tst.TransBetween = input.ReadLine();
string line = input.ReadLine();
tst.Profile = line.Equals(TestProfile.ProtectedHeatMeter.ToString()) ? TestProfile.ProtectedHeatMeter
: line.Equals(TestProfile.ProtectedCompound.ToString()) ? TestProfile.ProtectedCompound
: line.Equals(TestProfile.Protected.ToString()) ? TestProfile.Protected
: line.Equals(TestProfile.UserDefinedHeatMeter.ToString()) ? TestProfile.UserDefinedHeatMeter
: line.Equals(TestProfile.UserDefinedCompound.ToString()) ? TestProfile.UserDefinedCompound
: TestProfile.UserDefined; /// UserDefined is the default
: line.Equals(TestProfile.UserDefinedHeatMeter.ToString()) ? TestProfile.UserDefinedHeatMeter
: line.Equals(TestProfile.Protected.ToString()) ? TestProfile.Protected : TestProfile.UserDefined; /// UserDefined is the default
tst.TransAfter = input.ReadLine();
#if ORACLE_DB
tst.OraId = int.Parse(input.ReadLine(), ci);
tst.OraIdRepetMulti = int.Parse(input.ReadLine(), ci);
tst.OraDesignation = input.ReadLine();
tst.RawDataId = int.Parse(input.ReadLine(), ci);
tst.RawDataIdRepetMulti = int.Parse(input.ReadLine(), ci);
tst.RawDataDesignation = input.ReadLine();
#endif
while (true)
{
@@ -347,7 +365,6 @@ namespace Config.Entities
ln = inp.ReadLine(); if (ln != Qtg.ToString(ci)) { diff.AppendFormat(fmt, "Qtg", Qtg.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != Qfrom.ToString(ci)) { diff.AppendFormat(fmt, "Qfrom", Qfrom.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != Qto.ToString(ci)) { diff.AppendFormat(fmt, "Qto", Qto.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != IsFromToInPct.ToString()) { diff.AppendFormat(fmt, "IsFromToInPct", IsFromToInPct.ToString(), ln); };
ln = inp.ReadLine(); if (ln != Volume.ToString(ci)) { diff.AppendFormat(fmt, "Volume", Volume.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != TestTime.ToString(ci)) { diff.AppendFormat(fmt, "TstTime", TestTime.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != Method) { diff.AppendFormat(fmt, "Method", Method, ln); };
@@ -355,8 +372,8 @@ namespace Config.Entities
ln = inp.ReadLine(); if (ln != ErrLimHi.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimHi", ErrLimHi.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != Uncertainty.ToString(ci)) { diff.AppendFormat(fmt, "Uncertainty", Uncertainty.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != Repeats.ToString(ci)) { diff.AppendFormat(fmt, "Repeats", Repeats.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != DoDraining.ToString()) { diff.AppendFormat(fmt, "DoDraining", DoDraining.ToString(), ln); };
ln = inp.ReadLine(); if (ln != DoDrainingAfter.ToString()) { diff.AppendFormat(fmt, "DoDrainingAfter", DoDrainingAfter.ToString(), ln); };
ln = inp.ReadLine(); if (ln != DoDraining.ToString(ci)) { diff.AppendFormat(fmt, "Draining", DoDraining.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != DoDrainingAfter.ToString(ci)) { diff.AppendFormat(fmt, "Zeroing", DoDrainingAfter.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != TempLimLo.ToString(ci)) { diff.AppendFormat(fmt, "TempLimLo", TempLimLo.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != TempLimHi.ToString(ci)) { diff.AppendFormat(fmt, "TempLimHi", TempLimHi.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != TempControl) { diff.AppendFormat(fmt, "TempController", TempControl, ln); };
@@ -372,11 +389,18 @@ namespace Config.Entities
ln = inp.ReadLine(); if (ln != BenchPath) { diff.AppendFormat(fmt, "BenchPath", BenchPath, ln); };
ln = inp.ReadLine(); if (ln != OutputPath) { diff.AppendFormat(fmt, "OutputPath", OutputPath, ln); };
ln = inp.ReadLine(); if (ln != MetersPath) { diff.AppendFormat(fmt, "MetersPath", MetersPath, ln); };
ln = inp.ReadLine(); if (ln != TransBefore) { diff.AppendFormat(fmt, "TransBefore", TransBefore, ln); };
ln = inp.ReadLine(); if (ln != TransBetween) { diff.AppendFormat(fmt, "TransBetween", TransBetween, ln); };
ln = inp.ReadLine(); if (ln != Profile.ToString()) { diff.AppendFormat(fmt, "Profile", Profile, ln); };
ln = inp.ReadLine(); if (ln != TransAfter) { diff.AppendFormat(fmt, "TransAfter", TransAfter, ln); };
ln = inp.ReadLine(); if (ln != TransBefore) { diff.AppendFormat(fmt, "RelTransBefore", TransBefore, ln); };
ln = inp.ReadLine(); if (ln != TransBetween) { diff.AppendFormat(fmt, "RelTransBetween", TransBetween, ln); };
ln = inp.ReadLine(); if (ln != Profile.ToString()) { diff.AppendFormat(fmt, "RelTransAfter", Profile, ln); };
ln = inp.ReadLine(); if (ln != TransAfter) { diff.AppendFormat(fmt, "TransitionAfter", TransAfter, ln); };
#if ORACLE_DB
ln = inp.ReadLine(); if (ln != OraId.ToString(ci)) { diff.AppendFormat(fmt, "OraId", OraId.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != OraIdRepetMulti.ToString(ci)) { diff.AppendFormat(fmt, "OraIdRepetMulti", OraIdRepetMulti.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != OraDesignation) { diff.AppendFormat(fmt, "OraDesignation", OraDesignation, ln); };
ln = inp.ReadLine(); if (ln != RawDataId.ToString(ci)) { diff.AppendFormat(fmt, "RawDataId", RawDataId.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != RawDataIdRepetMulti.ToString(ci)){ diff.AppendFormat(fmt, "RawDataIdRepetMulti", RawDataIdRepetMulti.ToString(ci), ln); };
ln = inp.ReadLine(); if (ln != RawDataDesignation) { diff.AppendFormat(fmt, "RawDataDesignation", RawDataDesignation, ln); };
#endif
return diff.ToString();
}
+13 -175
View File
@@ -1,19 +1,14 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using log4net;
using Common;
using Config.Resources;
namespace Config.Entities
{
public class User : Common.IUser
public class User
{
static readonly ILog log = LogManager.GetLogger(typeof(User));
public virtual int Id { get; protected set; }
public virtual int Id { get; protected set; }
public virtual string UserName { get; set; } /// = name, alias, abbreviation
public virtual string FullName { get; set; } /// = description
public virtual string Tag { get; set; }
@@ -25,27 +20,11 @@ namespace Config.Entities
public virtual DateTime LastPwChange { get; set; }
public virtual IList<Group> Groups { get; set; } //User can be a member of a list of groups
private bool powerUser; /// true for built-in users, power users have full access even with empty Groups list
public virtual bool IsPowerUser() { return powerUser; }
private string legalizator; /// Not mapped to a database !!!, 2nd user entered in a logging dialog
public virtual void SetLegalizator(string value) { legalizator = value; }
public virtual string GetLegalizator() { return legalizator; }
public User()
{
Groups = new List<Group>();
}
public User(string userName, int number, bool powerUser)
{
UserName = userName;
Number = number;
this.powerUser = powerUser;
Groups = new List<Group>();
FullName = powerUser ? "Power User" : string.Empty;
}
/// <summary>
/// Adds a group to the user.
/// </summary>
@@ -55,155 +34,14 @@ namespace Config.Entities
Groups.Add(group);
}
/// <summary>
/// All members are copied except of ID (so that NHibernate works properly).
/// List of groups is empty.
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public virtual object Clone()
{
User newUser = new User(UserName, Number, false);
newUser.FullName = FullName;
newUser.Number = Number;
newUser.Tag = Tag;
newUser.Password = Password;
newUser.LastPwChange = LastPwChange;
return newUser;
}
public override string ToString()
{
return (UserName != null) ? UserName : Number.ToString();
}
/// ------------- Additional stuff not mapped into the database -------------
/// <summary>
/// Check whether user is a member of a group.
/// </summary>
/// <param name="groupId">Group GID</param>
/// <returns>true is user is a member of the specified group</returns>
public virtual bool IsMemberOf(GID groupId)
{
if (powerUser)
{
return true;
}
else if ((groupId >= 0) && (groupId < GID.NrOfGroups))
{
foreach (var g in Groups)
{
if (g.GID == groupId) return true;
}
}
return false;
}
/// <summary>
/// Check whether user is a member of any of specified groups.
/// Returns true also when no groups are defined (groupIds = null).
/// </summary>
/// <param name="groupIds">An array of group GID-s or null (no membership required)</param>
/// <returns>true if user is a member of any of specified groups</returns>
public virtual bool IsMemberOf(GID[] groupIds)
{
if (groupIds == null || powerUser)
{
return true;
}
foreach (var gid in groupIds)
{
if ((gid >= 0) && (gid < GID.NrOfGroups))
{
/// for all group elements in User.Groups
foreach (var grp in Groups)
{
/// element GID = parameter GroupId ?
if (grp.GID == gid) return true;
}
}
}
return false;
}
/// <summary>
/// Checks requirements on the password regardless of the password history
/// </summary>
/// <param name="password">Password</param>
/// <returns>true when the password is OK</returns>
public static bool IsPasswordMeetsRequirements(string password, out string explanation)
{
return Common.Utils.IsPasswordMeetsRequirements(password, out explanation);
}
/// <summary>
/// Returns true when password was already used in the past
/// </summary>
/// <param name="passwordCandidate">Password</param>
/// <returns>false when password is new, true when it was used in the past</returns>
public virtual bool IsPasswordUsedInPast(string passwordCandidate)
{
string encryptedPW = EncryptedPassword(passwordCandidate);
return (encryptedPW == Password) || (encryptedPW == Password2) || (encryptedPW == Password3);
}
/// <summary>
/// Checks 'LastPwChange' and returns true when password expired
/// </summary>
/// <returns></ returns>
public virtual bool IsPasswordExpired()
{
if (IsPowerUser() || IsMemberOf(GID.Administrators) || CurrentUser.PasswdExpirationPeriodDays == 0)
{
/// Password cannot expirate for this user or this feature is disabled in Backup and Security options
return false;
}
/// Password expiration time is 3 months
return (DateTime.Now - LastPwChange > new TimeSpan(CurrentUser.PasswdExpirationPeriodDays, 0, 0, 0));
}
/// <summary>
/// Encrypts and saves users password.
/// </summary>
/// <param name="password">Password</param>
public virtual void SetPassword(string password)
{
Password4 = Password3;
Password3 = Password2;
Password2 = Password;
Password = EncryptedPassword(password);
LastPwChange = DateTime.Now;
}
string EncryptedPassword(string password)
{
return Common.Utils.GetHash(password);
}
/// <summary>
/// Verifies users password. Used by static bool Authorisation(...)
/// </summary>
/// <param name="password">Password</param>
/// <returns>true if password is correct</returns>
public virtual bool IsCorrectPassword(string password)
{
if (string.IsNullOrEmpty(password) && string.IsNullOrEmpty(Password))
{
/// Currently saved and verified passwords are both empty => return true
return true;
}
return (Password == EncryptedPassword(password));
}
public virtual string ToEncodedStr()
{
return string.Format("{0}~{1}~{2}", UserName, FullName, legalizator);
}
}
/// <summary>
/// Encrypts and sets users password.
/// </summary>
/// <param name="password">Unencrypted password</param>
public virtual void SetPassword(string password)
{
Password = Users.Entities.User.getHash(password);
LastPwChange = DateTime.Now;
}
}
}
+2 -141
View File
@@ -1,149 +1,10 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.Windows.Forms;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using Common;
using Config.Resources;
namespace Config
{
public class FluentCommon
public static class FluentCommon
{
/// <summary>
/// NHibernate session factory (to create the database session 'SessionFactory')
/// </summary>
/// <returns>A database session</returns>
public static ISessionFactory CreateSessionFactory(DBKind database, DBType dbType, string connectionString, bool createDB)
{
try
{
FluentConfiguration cfg = Fluently.Configure();
switch (dbType)
{
default:
case DBType.MySql:
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
break;
case DBType.SQLite:
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
break;
}
switch (database)
{
default:
case DBKind.Config:
case DBKind.RemoteConfig:
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<FluentCommon>());
break;
case DBKind.Results:
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<FluentCommon>());
break;
}
if (createDB)
{
return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory();
}
else
{
return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory();
}
}
catch (Exception exc)
{
MessageBox.Show(string.Format(Strings.Cannot_open_DB_Cause_0, exc.Message),
Strings.Error,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return null;
}
}
public delegate void BuildSchemaDlgt(Configuration config);
static void BuildSchema(Configuration config)
{
/// This NHibernate tool takes a configuration (with mapping info in)
/// and exports a database schema from it
new SchemaExport(config).SetOutputFile("db_schema");
}
static void BuildSchemaCreate(Configuration config)
{
/// This NHibernate tool takes a configuration (with mapping info in)
/// and exports a database schema from it
new SchemaExport(config).Create(true, true);
}
/// <summary>
/// Create an empty users database.
/// Database contains only the user 'admin' and the control board component 'CB'.
/// </summary>
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
/// <param name="connectionString">Connection string</param>
/// <returns>true=success, false=error</returns>
public static bool CreateEmptyConfigDB(DBType dbType, string connectionString)
{
ISessionFactory sessionFactory = CreateSessionFactory(DBKind.Config, dbType, connectionString, true);
if (sessionFactory == null) return false;
/// Populate the database
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
///
/// Create user 'admin'
///
var admin = new Config.Entities.User
{
UserName = CurrentUser.AdminUsername,
FullName = Strings.Administrator,
LastPwChange = DateTime.Now
};
admin.SetPassword(CurrentUser.AdminPassword);
///
/// Prepare all groups, add some of them to admin
///
for (GID gid = 0; gid < GID.NrOfGroups; gid++)
{
Config.Entities.Group group = new Config.Entities.Group(gid);
switch (gid)
{
case GID.Testers:
case GID.TestingSpecialists:
case GID.HeadOfLab:
case GID.MaintenanceSpecialists:
case GID.Metrologists:
case GID.CalibrationSpecialists:
case GID.Administrators:
#if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL
case GID.TraceabilityManagement:
#elif LANG_PL
case GID.MetrologicalAuthority:
case GID.WaterMeterAuthority:
#endif
admin.AddGroup(group);
session.SaveOrUpdate(group); /// Save this group
break;
}
}
session.SaveOrUpdate(admin); /// Save user 'admin'
transaction.Commit();
}
}
return true;
}
}
}
+408
View File
@@ -0,0 +1,408 @@
///
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using log4net;
using Common;
namespace Config
{
public static class Formulas
{
private static readonly ILog log = LogManager.GetLogger(typeof(Formulas));
///
/// Wrappers
///
public static double RealDensity() { return Data.RealDensity; }
public static double AtTemperature() { return Data.AtTemperature; }
public static double Buoyancy() { return Data.Buoyancy; }
/// Private tables with coeficients to calculate specific enthalpy
static readonly int[] Ii;
static readonly int[] Ji;
static readonly double[] ni;
/// Private table with coeficients to calculate temperature of a platinum thermometer
static readonly double[] Di;
/// <summary>
/// Constructor
/// </summary>
static Formulas()
{
///
/// Initialize tables to calculate specific enthalpies
///
Ii = new int[34] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32 };
Ji = new int[34] { -2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0, 1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2, 10, -8, -11, -6, -29, -31, -38, -39, -40, -41 };
ni = new double[34] {
0.14632971213167, /// 1
-0.84548187169114, /// 2
-0.37563603672040E1, /// 3
0.33855169168385E1, /// 4
-0.95791963387872, /// 5
0.15772038513228, /// 6
-0.16616417199501E-1, /// 7
0.81214629983568E-3, /// 8
0.28319080123804E-3, /// 9
-0.60706301565874E-3, /// 10
-0.18990068218419E-1, /// 11
-0.32529748770505E-1, /// 12
-0.21841717175414E-1, /// 13
-0.52838357969930E-4, /// 14
-0.47184321073267E-3, /// 15
-0.30001780793026E-3, /// 16
0.47661393906987E-4, /// 17
-0.44141845330846E-5, /// 18
-0.72694996297594E-15, /// 19
-0.31679644845054E-4, /// 20
-0.28270797985312E-5, /// 21
-0.85205128120103E-9, /// 22
-0.22425281908000E-5, /// 23
-0.65171222895601E-6, /// 24
-0.14341729937924E-12, /// 25
-0.40516996860117E-6, /// 26
-0.12734301741641E-8, /// 27
-0.17424871230634E-9, /// 28
-0.68762131295531E-18, /// 29
0.14478307828521E-19, /// 30
0.26335781662795E-22, /// 31
-0.11947622640071E-22, /// 32
0.18228094581404E-23, /// 33
-0.93537087292458E-25, /// 34
};
///
/// Initialize a table to calculate temperature of a platinum thermometer from resistance
///
Di = new double[]
{
439.932854,
472.418020,
37.684494,
7.472018,
2.920828,
0.005184,
-0.963864,
-0.188732,
0.191203,
0.049025,
};
}
/// <summary>
/// Calculate density of distilled water from temperature
/// </summary>
/// <param name="t">ITS-90 temperature in [°C]</param>
/// <returns>Density in [kg/m3]</returns>
public static double DistilledWaterDensityFromTemp(double t)
{
if (t <= 40)
{
const double c0 = 999.839564;
const double c1 = 0.067998613;
const double c2 = -0.0091101468;
const double c3 = 0.00010058299;
const double c4 = -0.0000011275659;
const double c5 = 6.5985371e-09;
return ((((c5 * t + c4) * t + c3) * t + c2) * t + c1) * t + c0;
}
else
{
const double a0 = 9.9983952E2;
const double a1 = 1.6952577E1;
const double a2 = -7.9905127E-3;
const double a3 = -4.6241757E-5;
const double a4 = 1.0584601E-7;
const double a5 = -2.8103006E-10;
const double b = 1.6887236E-2;
return (((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0) / (1.0 + b * t);
}
}
/// <summary>
/// Calculate density of distilled water from temperature (obsolete)
/// </summary>
/// <param name="t">IPTS-68 temperature in [°C]</param>
/// <returns>Density in [kg/m3]</returns>
public static double DistilledWaterDensityFromTempIPTS68(double t)
{
const double a0 = 999.842594;
const double a1 = 0.06793952;
const double a2 = -0.009095290;
const double a3 = 0.0001001685;
const double a4 = -0.000001120083;
const double a5 = 6.536332e-09;
return ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0;
}
/// <summary>
/// Calculate density by comparing calculated data and data from a certificate
/// </summary>
/// <param name="realDensity">Density from a certificate in [kg/m3]</param>
/// <param name="atTemperature">Temperature from a certificate in [°C]</param>
/// <returns>Density correction in [kg/m3]</returns>
public static double DensityCorrection(double realDensity, double atTemperature)
{
/// Calculated data
double calculatedDensity = DistilledWaterDensityFromTemp(atTemperature);
return realDensity - calculatedDensity;
}
/// <summary>
/// Calculate corrected (real) water density from temperature
/// </summary>
/// <param name="t">Temperature in [°C]</param>
/// <returns>Density in [kg/m3]</returns>
public static double WaterDensityFromTemp(double t)
{
return DistilledWaterDensityFromTemp(t) + DensityCorrection(RealDensity(), AtTemperature());
}
/// <summary>
/// Calculate corrected (real) water density from temperature
/// </summary>
/// <param name="t">Temperature in [°C]</param>
/// <returns>Density in [kg/m3]</returns>
public static double WaterDensityFromTempPress(double temp, double pressure)
{
double x0 = 5.08821E-10;
double x1 = 1.2639418;
double x2 = 0.2660269;
double x3 = 0.3734838;
double x4 = 2.0205242;
double theta = temp / 100.0;
double B = x0 * (((x3 * theta + x2) * theta + x1) * theta + 1) / (1 + x4 * theta);
return WaterDensityFromTemp(temp) * (1 + B * Units.ConvertTo(Unit.Pa, pressure));
}
public static float AirDensityFromAmbientVales(float tempC, float pressureBar, float humiPct)
{
double pressurePa = 100000.0 * (double)pressureBar; /// [Pa]
double tempKelvin = 273.15 + (double)tempC;
double coef1 = 1.2811805 / 10000.0 * tempKelvin * tempKelvin
- 1.950987 / 100.0 * tempKelvin
+ 34.04926034
- 6.353631 * 1000.0 / tempKelvin;
double coef3 = humiPct / 100.0 * System.Math.Exp(coef1) / pressurePa;
double airDensityKgm3 = 0.00348353 * pressurePa * (1.0 - 0.378 * coef3) / tempKelvin; /// kg/m3
return (float)airDensityKgm3;
}
/// <summary>
/// Convert 'pulses' to 'volume', prevent division by zero
/// </summary>
public static double VolumeFromPulses(int pulses, double pulsesPerLiter)
{
if (pulsesPerLiter <= double.Epsilon) return 0;
return Convert.ToDouble(pulses) / pulsesPerLiter;
}
/// <summary>
/// Calculate the error in % from 'measured' and 'true' volume, prevent division by zero
/// </summary>
public static double ErrorFromVolumes(double measuredVolume, double trueVolume)
{
if (trueVolume <= float.Epsilon)
{
if (measuredVolume <= float.Epsilon)
{
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0);
return -100.0;
}
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, 99.0);
return 99.0;
}
double error = 100.0 * (measuredVolume - trueVolume) / trueVolume;
log.InfoFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, error);
return error;
}
/// <summary>
/// Calculates corrected value from a list of corrections by interpolation.
/// It is assumed that values in the list 'corrections' are sorted.
/// </summary>
/// <param name="rawMeasurement">Raw uncorrected value</param>
/// <param name="corrections">Sorted (value, correction) pairs</param>
/// <returns>Corrected value</returns>
public static double CorrectedValue(double rawValue, IList<IMeasurementCorrection> corrections)
{
return rawValue + GetCorrection(rawValue, corrections);
}
/// <summary>
/// Get a correction from a list of corrections by interpolation.
/// It is assumed that values in the list 'corrections' are sorted.
/// </summary>
/// <param name="rawMeasurement">Raw uncorrected value</param>
/// <param name="corrections">Sorted (value, correction) pairs</param>
/// <returns>Corrected value</returns>
public static double GetCorrection(double rawValue, IList<IMeasurementCorrection> corrections)
{
if ((corrections == null) || (corrections.Count == 0)) return 0; /// No correction
if (rawValue < corrections[0].Measurement)
{
/// rawValue is below the lowest value in the correction table
return corrections[0].Correction;
}
int count = corrections.Count;
for (int i = 1; i < count; i++)
{
if (rawValue < corrections[i].Measurement)
{
double d1 = rawValue - corrections[i - 1].Measurement;
double d2 = corrections[i].Measurement - rawValue;
if (d1 + d2 <= float.Epsilon)
{
/// Neigboring values in the corection table are close to each other -> calculate the average
return (corrections[i - 1].Correction + corrections[i].Correction) / 2.0;
}
else
{
/// Interpolate the correction from neigboring values in the corection table
return (corrections[i - 1].Correction * d2 + corrections[i].Correction * d1) / (d1 + d2);
}
}
}
/// rawValue is above the highest value in the correction table
return corrections[count - 1].Correction;
}
/// <summary>
/// Converts a measurement error to a correction (used when preparing correction tables).
/// </summary>
/// <param name="measuredValue">Measured value (in arbitrary units)</param>
/// <param name="error">Measurement error in %</param>
/// <returns>Correction in the same units as the measured value</returns>
public static double CorrectionFromError(double measuredValue, double error)
{
double trueValue = measuredValue / (1 + error/100);
double correction = trueValue - measuredValue;
return correction;
}
/// <summary>
/// Calculates the heat coefficient for water
/// </summary>
/// <param name="pressure">Pressure [bar]</param>
/// <param name="T_in">Inlet temperature [°C]</param>
/// <param name="T_out">Outlet temperature [°C]</param>
/// <param name="flowMeasuredAtInlet">true = flow measured @inlet, false = flow measured @outlet</param>
/// <returns> Heat coefficient for water [J/(m3 K)]</returns>
public static double HeatCoefficientWater(double pressure, double T_in, double T_out, bool flowMeasuredAtInlet)
{
if (T_in == T_out) return 0;
const double R = 461.526; /// [J kg^-1 K^-1]
const double p_star_Pa = 16.53E6; /// [Pa] (=16.53 MPa)
const double T_star = 1386.0; /// [K]
double T_in_K = Units.ConvertTo(Unit.K, T_in);
double T_out_K = Units.ConvertTo(Unit.K, T_out);
double tau_in = T_star / T_in_K;
double tau_out = T_star / T_out_K;
double pi = Units.ConvertTo(Unit.Pa, pressure) / p_star_Pa;
double h_in = tau_in * GammaTau(pi, tau_in) * R * T_in_K;
double h_out = tau_out * GammaTau(pi, tau_out) * R * T_out_K;
double ni = flowMeasuredAtInlet ? GammaPi(pi, tau_in) * R * T_in_K / p_star_Pa
: GammaPi(pi, tau_out) * R * T_out_K / p_star_Pa;
return (h_in - h_out) / (ni * (T_in - T_out));
}
/// <summary>
/// gamma(pi) see also STN EN 1434-1 Annex A (A.4)
/// </summary>
/// <param name="pi">pi = p / p* where p* = 16.53 MPa</param>
/// <param name="tau">tau = T* / T where T* = 1386 K</param>
/// <returns>gamma(pi)</returns>
static double GammaPi(double pi, double tau)
{
double result = 0;
for (int i = 0; i < 34; i++)
{
result -= ni[i] * Ii[i] * Math.Pow(7.1 - pi, Ii[i] - 1) * Math.Pow(tau - 1.222, Ji[i]);
}
return result;
}
/// <summary>
/// gamma(tau) see also STN EN 1434-1 Annex A (A.7)
/// </summary>
/// <param name="pi">pi = p / p* where p* = 16.53 MPa</param>
/// <param name="tau">tau = T* / T where T* = 1386 K</param>
/// <returns>gamma(tau)</returns>
static double GammaTau(double pi, double tau)
{
double result = 0;
for (int i = 0; i < 34; i++)
{
result += ni[i] * Math.Pow(7.1 - pi, Ii[i]) * Ji[i] * Math.Pow(tau - 1.222, Ji[i] - 1);
}
return result;
}
/// <summary>
/// Conversion of measured resistance of a platinum thermometer to temperature according to ITS-90
/// </summary>
/// <param name="R">Measured resistance in [°C]</param>
/// <param name="R001C">Calibrated resistance in Ohm at 0.01°C</param>
/// <param name="a7">Calibrated ITS-90 coefficient a7</param>
/// <param name="b7">Calibrated ITS-90 coefficient b7</param>
/// <param name="c7">Calibrated ITS-90 coefficient c7</param>
/// <returns>Temperature in [°C]</returns>
public static double PlatinumResistanceTM_ITS90_R2T(double R, double R001C, double a7, double b7, double c7)
{
double w = R / R001C; /// ratio
double r1 = w - 1.0;
double dw = r1 * (a7 + r1 * (b7 + r1 * c7)); /// = a7*r1 + b7*r1^2 + c7*r1^3
double wr = w - dw;
double x = (wr - 2.64) / 1.64;
double sum = 0;
for (int i = Di.Length - 1; i >= 0; i--)
{
sum = sum * x + Di[i];
}
return sum;
}
/// <summary>
/// Conversion of measured resistance of a platinum thermometer to temperature using Callendar-Van Dusen equations
/// </summary>
/// <param name="R">Measured resistance in [°C]</param>
/// <param name="R0">Calibrated resistance in Ohm at 0°C</param>
/// <param name="A">Calibration coefficient a</param>
/// <param name="B">Calibration coefficient b</param>
/// <returns>Temperature in [°C]</returns>
public static double PlatinumResistanceTM_ITS27_R2T(double R, double R0, double A, double B)
{
if (R0 * R0 * A * A - 4 * R0 * B * (R0 - R) <= 0) return 0; /// Out of range
return (-(R0 * A) + Math.Sqrt(R0 * R0 * A * A - 4 * R0 * B * (R0 - R))) / (2 * R0 * B);
}
}
}
+5 -8
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
///
using FluentNHibernate.Mapping;
using Config.Entities;
@@ -16,14 +16,11 @@ namespace Config.Mappings
Map(x => x.Qfrom);
Map(x => x.Qto);
Map(x => x.Selector);
Map(x => x.TempMtrUp);
Map(x => x.TempMtrDown);
Map(x => x.PressMtrUp);
Map(x => x.PressMtrDown);
Map(x => x.TempMtrUp).Column("TempIn");
Map(x => x.TempMtrDown).Column("TempOut");
Map(x => x.PressMtrUp).Column("PressIn");
Map(x => x.PressMtrDown).Column("PressOut");
Map(x => x.PressMtrDelta);
//Map(x => x.ElectricMtrUp);
//Map(x => x.ElectricMtrDown);
//Map(x => x.ElectricMtrDelta);
Map(x => x.StopBFValve);
Map(x => x.ValvesOpen)
.CustomType("StringClob")
+5 -5
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2023 Sensus Slovensko a.s.
/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
///
using FluentNHibernate.Mapping;
using Config.Entities;
@@ -13,13 +13,13 @@ namespace Config.Mappings
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.ClassName);
Map(x => x.Parent);
Map(x => x.ParentName);
Map(x => x.ItemNr);
Map(x => x.DebugMode);
Map(x => x.LogLevel);
Map(x => x.Mode);
Map(x => x.Logging);
Map(x => x.Parameters)
.CustomType("StringClob")
.CustomSqlType("varchar(12000)");
.CustomSqlType("varchar(8000)");
HasMany(x => x.Corrections)
.OrderBy("Measurement")
.Cascade.All();
+3 -3
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2015 Sensus Metering Systems
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
///
using FluentNHibernate.Mapping;
using Config.Entities;
@@ -16,8 +16,8 @@ namespace Config.Mappings
Map(x => x.Qfrom);
Map(x => x.Qto);
Map(x => x.Selector);
Map(x => x.Pump);
Map(x => x.RegVPositions);
Map(x => x.Pump);
Map(x => x.RegulValvesPct);
Map(x => x.ValvesOpen)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
+2 -2
View File
@@ -1,12 +1,12 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class MeasurementCorrectionMap : ClassMap<Entities.MeasurementCorrection>
class MeasurementCorrectionMap : ClassMap<MeasurementCorrection>
{
public MeasurementCorrectionMap()
{
+45 -22
View File
@@ -1,11 +1,12 @@
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// Copyright (c) 2013-2015 Sensus Metering Systems
///
using FluentNHibernate.Mapping;
using Config.Entities;
namespace Config.Mappings
{
class MetersPathMap : ClassMap<Entities.MetersPath>
class MetersPathMap : ClassMap<MetersPath>
{
public MetersPathMap()
{
@@ -13,26 +14,48 @@ namespace Config.Mappings
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Sensor1);
Map(x => x.Sensor2);
Map(x => x.Sensor3);
Map(x => x.Sensor4);
Map(x => x.Sensor5);
Map(x => x.Sensor6);
Map(x => x.Sensor7);
Map(x => x.Sensor8);
Map(x => x.Sensor9);
Map(x => x.Sensor10);
Map(x => x.Sensor11);
Map(x => x.Sensor12);
Map(x => x.Sensor13);
Map(x => x.Sensor14);
Map(x => x.Sensor15);
Map(x => x.Sensor16);
Map(x => x.Sensor17);
Map(x => x.Sensor18);
Map(x => x.Sensor19);
Map(x => x.Sensor20);
#pragma warning disable
if (Config.Data.WMsCount >= 1) Map(x => x.Sensor1);
if (Config.Data.WMsCount >= 2) Map(x => x.Sensor2);
if (Config.Data.WMsCount >= 3) Map(x => x.Sensor3);
if (Config.Data.WMsCount >= 4) Map(x => x.Sensor4);
if (Config.Data.WMsCount >= 5) Map(x => x.Sensor5);
if (Config.Data.WMsCount >= 6) Map(x => x.Sensor6);
if (Config.Data.WMsCount >= 7) Map(x => x.Sensor7);
if (Config.Data.WMsCount >= 8) Map(x => x.Sensor8);
if (Config.Data.WMsCount >= 9) Map(x => x.Sensor9);
if (Config.Data.WMsCount >= 10) Map(x => x.Sensor10);
if (Config.Data.WMsCount >= 11) Map(x => x.Sensor11);
if (Config.Data.WMsCount >= 12) Map(x => x.Sensor12);
if (Config.Data.WMsCount >= 13) Map(x => x.Sensor13);
if (Config.Data.WMsCount >= 14) Map(x => x.Sensor14);
if (Config.Data.WMsCount >= 15) Map(x => x.Sensor15);
if (Config.Data.WMsCount >= 16) Map(x => x.Sensor16);
if (Config.Data.WMsCount >= 17) Map(x => x.Sensor17);
if (Config.Data.WMsCount >= 18) Map(x => x.Sensor18);
if (Config.Data.WMsCount >= 19) Map(x => x.Sensor19);
if (Config.Data.WMsCount >= 20) Map(x => x.Sensor20);
if (Config.Data.WMsCount >= 21) Map(x => x.Sensor21);
if (Config.Data.WMsCount >= 22) Map(x => x.Sensor22);
if (Config.Data.WMsCount >= 23) Map(x => x.Sensor23);
if (Config.Data.WMsCount >= 24) Map(x => x.Sensor24);
if (Config.Data.WMsCount >= 25) Map(x => x.Sensor25);
if (Config.Data.WMsCount >= 26) Map(x => x.Sensor26);
if (Config.Data.WMsCount >= 27) Map(x => x.Sensor27);
if (Config.Data.WMsCount >= 28) Map(x => x.Sensor28);
if (Config.Data.WMsCount >= 29) Map(x => x.Sensor29);
if (Config.Data.WMsCount >= 30) Map(x => x.Sensor30);
if (Config.Data.WMsCount >= 31) Map(x => x.Sensor31);
if (Config.Data.WMsCount >= 32) Map(x => x.Sensor32);
if (Config.Data.WMsCount >= 33) Map(x => x.Sensor33);
if (Config.Data.WMsCount >= 34) Map(x => x.Sensor34);
if (Config.Data.WMsCount >= 35) Map(x => x.Sensor35);
if (Config.Data.WMsCount >= 36) Map(x => x.Sensor36);
if (Config.Data.WMsCount >= 37) Map(x => x.Sensor37);
if (Config.Data.WMsCount >= 38) Map(x => x.Sensor38);
if (Config.Data.WMsCount >= 39) Map(x => x.Sensor39);
if (Config.Data.WMsCount >= 40) Map(x => x.Sensor40);
#pragma warning restore
}
}
}
+6 -4
View File
@@ -16,14 +16,16 @@ namespace Config.Mappings
Map(x => x.Qfrom);
Map(x => x.Qto);
Map(x => x.Selector);
Map(x => x.RegValve);
Map(x => x.RegulValve);
Map(x => x.FlowMeter);
Map(x => x.PidCoef);
Map(x => x.StartValve);
Map(x => x.Diverter);
Map(x => x.TempMtrDiv);
Map(x => x.Scale);
Map(x => x.RegVPositions);
Map(x => x.TempDiv);
Map(x => x.Scale)
.Column("Balance");
Map(x => x.RegulValvesPct)
.Column("EmptyTankValve");
Map(x => x.ValvesOpen)
.CustomType("StringClob")
.CustomSqlType("varchar(8000)");
+1 -2
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2019-2023 Sensus Slovensko a.s.
/// Copyright (c) 2019 Sensus Slovensko a.s.
///
using FluentNHibernate.Mapping;
using Config.Entities;
@@ -14,7 +14,6 @@ namespace Config.Mappings
Map(x => x.ItemNr);
Map(x => x.Name);
Map(x => x.Part);
Map(x => x.FlowId);
Map(x => x.CoefQfrom);
Map(x => x.CoefQto);
Map(x => x.ErrLimLo);
+30 -13
View File
@@ -1,5 +1,5 @@
///
/// Copyright (c) 2013-2023 Sensus Slovensko a.s.
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
///
using FluentNHibernate.Mapping;
using Config.Entities;
@@ -16,16 +16,19 @@ namespace Config.Mappings
Map(x => x.Part);
Map(x => x.Profile);
Map(x => x.Publish);
Map(x => x.DoEvaluate);
Map(x => x.DoEvaluate)
.Column("Evaluate");
Map(x => x.Qtg);
Map(x => x.Qfrom);
Map(x => x.Qto);
Map(x => x.IsFromToInPct);
Map(x => x.Volume);
Map(x => x.TestTime);
Map(x => x.Volume);
Map(x => x.TestTime)
.Column("TstTime");
Map(x => x.Repeats);
Map(x => x.DoDraining);
Map(x => x.DoDrainingAfter);
Map(x => x.DoDraining)
.Column("Emptying");
Map(x => x.DoDrainingAfter)
.Column("Zeroing");
Map(x => x.TempLimLo);
Map(x => x.TempLimHi);
Map(x => x.TempControl);
@@ -33,16 +36,19 @@ namespace Config.Mappings
Map(x => x.MassRepeats);
Map(x => x.MassSpread);
Map(x => x.MassMethod)
.CustomType<byte>();
.CustomType<byte>();
Map(x => x.TimeBeforeFlow);
Map(x => x.TimeFlow2Mass);
Map(x => x.TimePump2StartV);
Map(x => x.TimePump2StartV)
.Column("TimeMass2Start");
Map(x => x.TimeStop2Mass);
Map(x => x.Method);
Map(x => x.ErrLimLo);
Map(x => x.ErrLimHi);
Map(x => x.Uncertainty);
Map(x => x.ShortPulses);
Map(x => x.ShortPulses)
.Column("TolerRed"); /// ???
Map(x => x.RedType);
Map(x => x.FeedingPath);
Map(x => x.BenchPath);
Map(x => x.OutputPath);
@@ -50,9 +56,20 @@ namespace Config.Mappings
#if HEAT_METERS
Map(x => x.HeatMetersPath);
#endif
Map(x => x.TransBefore);
Map(x => x.TransBetween);
Map(x => x.TransAfter);
Map(x => x.TransBefore)
.Column("RelTransBefore");
Map(x => x.TransBetween)
.Column("RelTransBetween");
Map(x => x.TransAfter)
.Column("TransitionAfter");
#if ORACLE_DB
Map(x => x.OraId);
Map(x => x.OraIdRepetMulti);
Map(x => x.OraDesignation);
Map(x => x.RawDataId);
Map(x => x.RawDataIdRepetMulti);
Map(x => x.RawDataDesignation);
#endif
HasMany(x => x.MoreParams)
.Cascade.All();
+2 -4
View File
@@ -10,16 +10,14 @@ namespace Config.Mappings
public UserMap()
{
Id(x => x.Id);
Map(x => x.UserName)
.Column("Name");
Map(x => x.UserName).Column("Name");
Map(x => x.Number);
Map(x => x.Tag);
Map(x => x.Password);
Map(x => x.Password2);
Map(x => x.Password3);
Map(x => x.Password4);
Map(x => x.FullName)
.Column("Description");
Map(x => x.FullName).Column("Description");
Map(x => x.LastPwChange);
HasManyToMany(x => x.Groups)
.Cascade.SaveUpdate()
+3 -3
View File
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Sensus")]
[assembly: AssemblyProduct("Config")]
[assembly: AssemblyCopyright("Copyright © 2013 - 2018 Sensus Slovensko a.s.")]
[assembly: AssemblyCopyright("Copyright © 2013 - 2022 Sensus Slovensko a.s.")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.1.1464.0")]
[assembly: AssemblyFileVersion("3.1.1464.0")]
[assembly: AssemblyVersion("2.31.1990.0")]
[assembly: AssemblyFileVersion("2.31.1990.0")]
-7
View File
@@ -1,7 +0,0 @@
namespace Config
{
public class PurchaseResources
{
}
}
-3
View File
@@ -162,7 +162,4 @@
<data name="Administrator" xml:space="preserve">
<value>Administrator</value>
</data>
<data name="Password_must_have_at_least_0_characters" xml:space="preserve">
<value>Password must have at least {0} characters</value>
</data>
</root>
+68
View File
@@ -0,0 +1,68 @@
///
/// Copyright (c) 2017-2022 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Config
{
public static class Utils
{
/// <summary>
/// Extract and return a DB server from a MySQL connection string.
/// </summary>
public static string GetDBServer(string connectionString)
{
return GetFromConnectionString(connectionString, new string[] { "SERVER=" });
}
/// <summary>
/// Extract and return a DB name from a MySQL connection string.
/// </summary>
public static string GetDBName(string connectionString)
{
return GetFromConnectionString(connectionString, new string[] { "DATABASE=" });
}
/// <summary>
/// Extract and return a username from a MySQL connection string
/// </summary>
public static string GetDBUser(string connectionString)
{
return GetFromConnectionString(connectionString, new string[] { "USER=", "UID=" });
}
/// <summary>
/// Extract and return a password from a MySQL connection string
/// </summary>
public static string GetDBPassword(string connectionString)
{
return GetFromConnectionString(connectionString, new string[] { "PASSWORD=", "PWD=" });
}
/// <summary>
/// Extract and return an element of a MySQL connection string
/// (a host, a database, a user name or a password).
/// Return an empty string on any error.
/// </summary>
public static string GetFromConnectionString(string connectionString, string[] patterns)
{
foreach (var pattern in patterns)
{
int startIx = connectionString.IndexOf(pattern);
if (startIx >= 0)
{
/// pattern found, extract the subsequent element
startIx += pattern.Length;
int endIx = connectionString.IndexOf(';', startIx);
return (endIx > 0) ? connectionString.Substring(startIx, endIx - startIx) : string.Empty;
}
}
/// pattern NOT found
return string.Empty;
}
}
}
-271
View File
@@ -1,271 +0,0 @@
using System;
namespace DataMatrix4Net
{
public class DataMatrix
{
///
/// Public interface
///
public bool isContainMatrix { get { return Matrix != null; } }
public Gma.QrCodeNet.Encoding.BitMatrix Matrix;
///
/// Internal member variables
///
readonly SymbolSize chosenSize;
readonly bool[,] visited;
int width { get { return isContainMatrix ? Matrix.Width : 0; } }
int height { get { return isContainMatrix ? Matrix.Height : 0; } }
/// <summary>
/// Data matrix constructor
/// Data matrix size up to 26x26 supported, one data region.
/// </summary>
/// <param name="content">Content of the data matrix (ASCII characters only)</param>
/// <param name="symbolSize">Chosen data matrix size</param>
public DataMatrix(string content, SymbolSize symbolSize = SymbolSize.SquareAuto)
{
byte[] contentBytes = Utils.MakeByteArray(content);
if (symbolSize >= 0)
{
chosenSize = symbolSize;
}
else if (symbolSize == SymbolSize.SquareAuto)
{
for (SymbolSize ss = 0; ss < Symbol.SymbolSquareCount; ss++)
{
if (contentBytes.Length <= Symbol.GetSymbolAttribute(SymbolAttribute.SymbolDataWords, ss))
{
chosenSize = ss;
break;
}
}
}
int w = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolCols, chosenSize);
int h = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolRows, chosenSize);
if (w == -1 || h == -1)
{
throw new ArgumentOutOfRangeException("symboSize");
}
/// Add padding and Reed-Solomon error correction bytes to the content
byte[] data = ReedSolomon.Encode(contentBytes, chosenSize);
/// Create matrix, fill in frame cells
Matrix = new MyBitMatrix(w, h);
visited = new bool[w - 2, h - 2];
MakeFrame(chosenSize);
int ix = 0;
int x = 0; /// inside data region in the range 0 .. width-2 (x coordinate, frame excluded)
int y = 4; /// inside data region in the range 0 .. height-2 (y coordinate, frame excluded)
/// Walk through the data matrix area and fill in data bytes
do
{
if (x == 0 && y == height - 2)
{
PlaceByteSpecial1(data[ix++], width, height);
}
else if (x == 0 && y == height - 4 && (height - 2) % 4 != 0)
{
PlaceByteSpecial2(data[ix++], width, height);
}
else if (x == 0 && y == height - 4 && (height - 2) % 8 == 4)
{
PlaceByteSpecial3(data[ix++], width, height);
}
else if (x == 2 && y == height + 2 && (height - 2) % 8 == 0)
{
PlaceByteSpecial4(data[ix++], width, height);
}
do
{
if (x >= 0 && y < height - 2 && !visited[x, y])
{
PlaceByteStandard(data[ix++], x, y, width, height);
visited[x, y] = true;
}
x += 2;
y -= 2;
}
while (x < width - 2 && y >= 0);
x += 3;
y += 1;
do
{
if (x < width - 2 && y >= 0 && !visited[x, y])
{
PlaceByteStandard(data[ix++], x, y, width, height);
visited[x, y] = true;
}
x -= 2;
y += 2;
}
while (x >= 0 && y < height - 2);
x += 1;
y += 3;
}
while (ix < data.Length);
}
/// All matrix sizes
void PlaceByteSpecial1(byte dataByte, int width, int height)
{
Matrix[width - 2, 4] = (dataByte & 0x01) != 0;
Matrix[width - 2, 3] = (dataByte & 0x02) != 0;
Matrix[width - 2, 2] = (dataByte & 0x04) != 0;
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
Matrix[3, height - 2] = (dataByte & 0x20) != 0;
Matrix[2, height - 2] = (dataByte & 0x40) != 0;
Matrix[1, height - 2] = (dataByte & 0x80) != 0;
visited[width - 3, 3] = true;
visited[width - 3, 2] = true;
visited[width - 3, 1] = true;
visited[width - 3, 0] = true;
visited[width - 4, 0] = true;
visited[2, height - 3] = true;
visited[1, height - 3] = true;
visited[0, height - 3] = true;
}
void PlaceByteSpecial2(byte dataByte, int width, int height)
{
Matrix[width - 2, 2] = (dataByte & 0x01) != 0;
Matrix[width - 2, 1] = (dataByte & 0x02) != 0;
Matrix[width - 3, 1] = (dataByte & 0x04) != 0;
Matrix[width - 4, 1] = (dataByte & 0x08) != 0;
Matrix[width - 5, 1] = (dataByte & 0x10) != 0;
Matrix[1, height - 2] = (dataByte & 0x20) != 0;
Matrix[1, height - 3] = (dataByte & 0x40) != 0;
Matrix[1, height - 4] = (dataByte & 0x80) != 0;
visited[width - 3, 1] = true;
visited[width - 3, 0] = true;
visited[width - 4, 0] = true;
visited[width - 5, 0] = true;
visited[width - 6, 0] = true;
visited[0, height - 3] = true;
visited[0, height - 4] = true;
visited[0, height - 5] = true;
}
void PlaceByteSpecial3(byte dataByte, int width, int height)
{
Matrix[width - 2, 2] = (dataByte & 0x01) != 0;
Matrix[width - 3, 2] = (dataByte & 0x02) != 0;
Matrix[width - 4, 2] = (dataByte & 0x04) != 0;
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
Matrix[width - 4, 1] = (dataByte & 0x20) != 0;
Matrix[width - 2, height - 2] = (dataByte & 0x40) != 0;
Matrix[1, height - 2] = (dataByte & 0x80) != 0;
visited[width - 3, 1] = true;
visited[width - 4, 1] = true;
visited[width - 5, 1] = true;
visited[width - 3, 0] = true;
visited[width - 4, 0] = true;
visited[width - 5, 0] = true;
visited[width - 3, height - 3] = true;
visited[0, height - 3] = true;
}
void PlaceByteSpecial4(byte dataByte, int width, int height)
{
Matrix[width - 2, 4] = (dataByte & 0x01) != 0;
Matrix[width - 2, 3] = (dataByte & 0x02) != 0;
Matrix[width - 2, 2] = (dataByte & 0x04) != 0;
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
Matrix[1, height - 2] = (dataByte & 0x20) != 0;
Matrix[1, height - 3] = (dataByte & 0x40) != 0;
Matrix[1, height - 4] = (dataByte & 0x80) != 0;
visited[width - 3, 3] = true;
visited[width - 3, 2] = true;
visited[width - 3, 1] = true;
visited[width - 3, 0] = true;
visited[width - 4, 0] = true;
visited[0, height - 3] = true;
visited[0, height - 4] = true;
visited[0, height - 5] = true;
}
///
/// Standard bit positioning (all matrix sizes)
///
int[] xOffs = new int[8] { 1, 0, -1, 1, 0, -1, 0, -1 };
int[] yOffs = new int[8] { 1, 1, 1, 0, 0, 0, -1, -1 };
/// <summary>
/// Standard placemnt of a byte into a matrix
/// </summary>
/// <param name="dataByte">Data byte</param>
/// <param name="x">X-coordinate in range 0..width-2 (from left, frame excluded)</param>
/// <param name="y">Y-coordinate in range 0..height-2 (from top, frame excluded)</param>
/// <param name="width">Matrix width incl. frame</param>
/// <param name="height">Matrix height incl. frame</param>
void PlaceByteStandard(byte dataByte, int x, int y, int width, int height)
{
int mask = 1;
for (int i = 0; i < 8; i++)
{
int xx = x + xOffs[i];
int yy = y + yOffs[i];
if (xx < 1)
{
xx += width - 2;
yy += 4 - (width + 4) % 8;
}
else if (yy < 1)
{
xx += 4 - (height + 4) % 8;
yy += height - 2;
}
Matrix[xx, yy] = (dataByte & mask) != 0;
mask = mask << 1;
}
}
/// <summary>
/// Crate data matrix frame.
/// All square data matrix sizes supported (incl. 4, 16 and 36 data regions).
/// </summary>
void MakeFrame(SymbolSize size)
{
int drw = Symbol.GetSymbolAttribute(SymbolAttribute.DataRegionCols, size);
int drh = Symbol.GetSymbolAttribute(SymbolAttribute.DataRegionRows, size);
int totalhdr = Symbol.GetSymbolAttribute(SymbolAttribute.HorizDataRegions, size);
int totalvdr = Symbol.GetSymbolAttribute(SymbolAttribute.VertDataRegions, size);
for (int hdr = 0; hdr < totalhdr; hdr++)
{
for (int vdr = 0; vdr < totalvdr; vdr++)
{
int offsx = hdr * (drw + 2);
int offsy = vdr * (drh + 2);
for (int i = 0; i < drw + 2; i++)
{
Matrix[offsx + i, offsy + drh + 1] = true;
if (i % 2 == 0) Matrix[offsx + i, offsy] = true;
}
for (int j = 0; j < drh + 2; j++)
{
Matrix[offsx, offsy + j] = true;
if (j % 2 == 1) Matrix[offsx + drw + 1, offsy + j] = true;
}
}
}
}
}
}
-39
View File
@@ -1,39 +0,0 @@
using System;
namespace DataMatrix4Net
{
public class MyBitMatrix : Gma.QrCodeNet.Encoding.BitMatrix
{
///
/// Public interface
///
public override int Width { get { return width; } }
public override int Height { get { return height; } }
public override bool[,] InternalArray { get { return internalArray; } }
///
public override bool this[int i, int j]
{
get { return (i >= 0 && j >= 0 && i < width && j < height) ? internalArray[i, j] : false; }
set { if (i >= 0 && j >= 0 && i < width && j < height) internalArray[i, j] = value; }
}
///
/// Private members
///
readonly int width;
readonly int height;
readonly bool[,] internalArray;
/// <summary>
/// Public constructor
/// </summary>
/// <param name="width">Matrix width</param>
/// <param name="height">Matrix height</param>
public MyBitMatrix(int width, int height)
{
this.width = width;
this.height = height;
internalArray = new bool[width, height];
}
}
}
-156
View File
@@ -1,156 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataMatrix4Net
{
public class ReedSolomon
{
const int NN = 255;
const int MAX_ERROR_WORD_COUNT = 68;
static byte[] log301 = new byte[]
{
255, 0, 1, 240, 2, 225, 241, 53, 3, 38, 226, 133, 242, 43, 54, 210,
4, 195, 39, 114, 227, 106, 134, 28, 243, 140, 44, 23, 55, 118, 211, 234,
5, 219, 196, 96, 40, 222, 115, 103, 228, 78, 107, 125, 135, 8, 29, 162,
244, 186, 141, 180, 45, 99, 24, 49, 56, 13, 119, 153, 212, 199, 235, 91,
6, 76, 220, 217, 197, 11, 97, 184, 41, 36, 223, 253, 116, 138, 104, 193,
229, 86, 79, 171, 108, 165, 126, 145, 136, 34, 9, 74, 30, 32, 163, 84,
245, 173, 187, 204, 142, 81, 181, 190, 46, 88, 100, 159, 25, 231, 50, 207,
57, 147, 14, 67, 120, 128, 154, 248, 213, 167, 200, 63, 236, 110, 92, 176,
7, 161, 77, 124, 221, 102, 218, 95, 198, 90, 12, 152, 98, 48, 185, 179,
42, 209, 37, 132, 224, 52, 254, 239, 117, 233, 139, 22, 105, 27, 194, 113,
230, 206, 87, 158, 80, 189, 172, 203, 109, 175, 166, 62, 127, 247, 146, 66,
137, 192, 35, 252, 10, 183, 75, 216, 31, 83, 33, 73, 164, 144, 85, 170,
246, 65, 174, 61, 188, 202, 205, 157, 143, 169, 82, 72, 182, 215, 191, 251,
47, 178, 89, 151, 101, 94, 160, 123, 26, 112, 232, 21, 51, 238, 208, 131,
58, 69, 148, 18, 15, 16, 68, 17, 121, 149, 129, 19, 155, 59, 249, 70,
214, 250, 168, 71, 201, 156, 64, 60, 237, 130, 111, 20, 93, 122, 177, 150,
};
static byte[] antilog301 = new byte[]
{
1, 2, 4, 8, 16, 32, 64, 128, 45, 90, 180, 69, 138, 57, 114, 228,
229, 231, 227, 235, 251, 219, 155, 27, 54, 108, 216, 157, 23, 46, 92, 184,
93, 186, 89, 178, 73, 146, 9, 18, 36, 72, 144, 13, 26, 52, 104, 208,
141, 55, 110, 220, 149, 7, 14, 28, 56, 112, 224, 237, 247, 195, 171, 123,
246, 193, 175, 115, 230, 225, 239, 243, 203, 187, 91, 182, 65, 130, 41, 82,
164, 101, 202, 185, 95, 190, 81, 162, 105, 210, 137, 63, 126, 252, 213, 135,
35, 70, 140, 53, 106, 212, 133, 39, 78, 156, 21, 42, 84, 168, 125, 250,
217, 159, 19, 38, 76, 152, 29, 58, 116, 232, 253, 215, 131, 43, 86, 172,
117, 234, 249, 223, 147, 11, 22, 44, 88, 176, 77, 154, 25, 50, 100, 200,
189, 87, 174, 113, 226, 233, 255, 211, 139, 59, 118, 236, 245, 199, 163, 107,
214, 129, 47, 94, 188, 85, 170, 121, 242, 201, 191, 83, 166, 97, 194, 169,
127, 254, 209, 143, 51, 102, 204, 181, 71, 142, 49, 98, 196, 165, 103, 206,
177, 79, 158, 17, 34, 68, 136, 61, 122, 244, 197, 167, 99, 198, 161, 111,
222, 145, 15, 30, 60, 120, 240, 205, 183, 67, 134, 33, 66, 132, 37, 74,
148, 5, 10, 20, 40, 80, 160, 109, 218, 153, 31, 62, 124, 248, 221, 151,
3, 6, 12, 24, 48, 96, 192, 173, 119, 238, 241, 207, 179, 75, 150, 0,
};
/// <summary>
/// GF add (a + b)
/// </summary>
static byte GfAdd(byte a, byte b)
{
return (byte)(a ^ b);
}
/// <summary>
/// GF multiply (a * b)
/// </summary>
static byte GfMult(byte a, byte b)
{
return (a == 0 || b == 0) ? (byte)0 : antilog301[(log301[a] + log301[b]) % NN];
}
/// <summary>
/// GF multiply by antilog (a * alpha**b)
/// </summary>
static byte GfMultAntilog(byte a, byte b)
{
return (a == 0) ? (byte)0 : antilog301[(log301[a] + b) % NN];
}
/// <summary>
/// Encode a byte array using Reed-Solomon error correction
/// </summary>
/// <param name="message">Input byte array</param>
/// <param name="sizeId"></param>
/// <returns>true when successful</returns>
public static byte[] Encode(byte[] message, SymbolSize sizeId)
{
int blockStride = Symbol.GetSymbolAttribute(SymbolAttribute.InterleavedBlocks, sizeId);
int blockErrorWords = Symbol.GetSymbolAttribute(SymbolAttribute.BlockErrorWords, sizeId);
int symbolDataWords = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolDataWords, sizeId);
int symbolErrorWords = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolErrorWords, sizeId);
int symbolTotalWords = symbolDataWords + symbolErrorWords;
byte[] output = new byte[symbolTotalWords];
for (int i = 0; i < Math.Min(message.Length, symbolDataWords); i++)
{
output[i] = message[i]; /// Copy the original message to output
}
/// Populate generator polynomial
byte[] gen = RsGenPoly(blockErrorWords);
/// For each interleaved block...
for (int blockIdx = 0; blockIdx < blockStride; blockIdx++)
{
/// Generate error codewords
byte[] ecc = new byte[blockErrorWords];
for (int i = 0; i < blockErrorWords; i++) ecc[i] = 0;
for (int i = blockIdx; i < symbolDataWords; i += blockStride)
{
byte val = (byte)(ecc[blockErrorWords - 1] ^ output[i]);
for (int j = blockErrorWords - 1; j > 0; j--)
{
//DMTX_CHECK_BOUNDS(&ecc, j); DMTX_CHECK_BOUNDS(&ecc, j-1); DMTX_CHECK_BOUNDS(&gen, j);
ecc[j] = GfAdd(ecc[j - 1], GfMult(gen[j], val));
}
ecc[0] = GfMult(gen[0], val);
}
/// Copy to output message
int jj = blockErrorWords;
for (int i = symbolDataWords + blockIdx; i < symbolTotalWords; i += blockStride)
{
output[i] = ecc[--jj];
}
}
return output;
}
static byte[] RsGenPoly(int errorWordCount)
{
byte[] gen = new byte[errorWordCount];
/// Initialize all coefficients to 1
for (int i = 0; i < errorWordCount; i++) gen[i] = (byte)1;
/* Generate polynomial */
for (int i = 0; i < gen.Length; i++)
{
for (int j = i; j >= 0; j--)
{
gen[j] = GfMultAntilog(gen[j], (byte)(i + 1));
if (j > 0)
{
gen[j] = (byte)(gen[j] ^ gen[j - 1]);
}
}
}
return gen;
}
}
}
-108
View File
@@ -1,108 +0,0 @@
using System;
namespace DataMatrix4Net
{
public enum SymbolSize
{
RectAuto = -3,
SquareAuto = -2,
ShapeAuto = -1,
Sq10x10 = 0,
Sq12x12,
Sq14x14,
Sq16x16,
Sq18x18,
Sq20x20,
Sq22x22,
Sq24x24,
Sq26x26,
Sq32x32,
Sq36x36,
Sq40x40,
Sq44x44,
Sq48x48,
Sq52x52,
Sq64x64,
Sq72x72,
Sq80x80,
Sq88x88,
Sq96x96,
Sq104x104,
Sq120x120,
Sq132x132,
Sq144x144,
Rect8x18,
Rect8x32,
Rect12x26,
Rect12x36,
Rect16x36,
Rect16x48,
Count
}
public enum SymbolAttribute
{
SymbolRows,
SymbolCols,
DataRegionRows,
DataRegionCols,
HorizDataRegions,
VertDataRegions,
MappingMatrixRows,
MappingMatrixCols,
InterleavedBlocks,
BlockErrorWords,
BlockMaxCorrectable,
SymbolDataWords,
SymbolErrorWords,
SymbolMaxCorrectable,
}
public static class Symbol
{
public const SymbolSize SymbolSquareCount = SymbolSize.Rect8x18;
/// (---------------------------------------------- square ------------------------------------------------------) (--- rectangular ---)
static readonly int[] symbolRows = new int[] { 10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144, 8, 8, 12, 12, 16, 16 };
static readonly int[] symbolCols = new int[] { 10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144, 18, 32, 26, 36, 36, 48 };
static readonly int[] dataRegionRows = new int[] { 8, 10, 12, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 18, 20, 22, 6, 6, 10, 10, 14, 14 };
static readonly int[] dataRegionCols = new int[] { 8, 10, 12, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 18, 20, 22, 16, 14, 24, 16, 16, 22 };
static readonly int[] horizDataRegions = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 6, 6, 6, 1, 2, 1, 2, 2, 2 };
static readonly int[] interleavedBlocks = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 4, 4, 4, 4, 6, 6, 8, 10, 1, 1, 1, 1, 1, 1 };
static readonly int[] symbolDataWords = new int[] { 3, 5, 8, 12, 18, 22, 30, 36, 44, 62, 86, 114, 144, 174, 204, 280, 368, 456, 576, 696, 816, 1050, 1304, 1558, 5, 10, 16, 22, 32, 49 };
static readonly int[] blockErrorWords = new int[] { 5, 7, 10, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 68, 42, 56, 36, 48, 56, 68, 56, 68, 62, 62, 7, 11, 14, 18, 24, 28 };
static readonly int[] blockMaxCorrectable = new int[] { 2, 3, 5, 6, 7, 9, 10, 12, 14, 18, 21, 24, 28, 34, 21, 28, 18, 24, 28, 34, 28, 34, 31, 31, 3, 5, 7, 9, 12, 14 };
/// <summary>
/// Return a symbol attribute
/// </summary>
/// <param name="attribute">Symbol attribute</param>
/// <param name="sizeId">Size ID (or index)</param>
/// <returns>Sybol attribute value, -1 when undefined</returns>
public static int GetSymbolAttribute(SymbolAttribute attribute, SymbolSize sizeId)
{
if (sizeId < 0 || sizeId >= SymbolSize.Count) return -1;
switch (attribute)
{
case SymbolAttribute.SymbolRows: return symbolRows[(int)sizeId];
case SymbolAttribute.SymbolCols: return symbolCols[(int)sizeId];
case SymbolAttribute.DataRegionRows: return dataRegionRows[(int)sizeId];
case SymbolAttribute.DataRegionCols: return dataRegionCols[(int)sizeId];
case SymbolAttribute.HorizDataRegions: return horizDataRegions[(int)sizeId];
case SymbolAttribute.VertDataRegions: return (sizeId < SymbolSquareCount) ? horizDataRegions[(int)sizeId] : 1;
case SymbolAttribute.MappingMatrixRows: return dataRegionRows[(int)sizeId] * GetSymbolAttribute(SymbolAttribute.VertDataRegions, sizeId);
case SymbolAttribute.MappingMatrixCols: return dataRegionCols[(int)sizeId] * horizDataRegions[(int)sizeId];
case SymbolAttribute.InterleavedBlocks: return interleavedBlocks[(int)sizeId];
case SymbolAttribute.BlockErrorWords: return blockErrorWords[(int)sizeId];
case SymbolAttribute.BlockMaxCorrectable: return blockMaxCorrectable[(int)sizeId];
case SymbolAttribute.SymbolDataWords: return symbolDataWords[(int)sizeId];
case SymbolAttribute.SymbolErrorWords: return blockErrorWords[(int)sizeId] * interleavedBlocks[(int)sizeId];
case SymbolAttribute.SymbolMaxCorrectable: return blockMaxCorrectable[(int)sizeId] * interleavedBlocks[(int)sizeId];
default: return -1;
}
}
}
}
-56
View File
@@ -1,56 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace DataMatrix4Net
{
public static class Utils
{
const byte EndOfMessage = (byte)129;
public static bool IsDigit(char znak)
{
if (znak >= '0' && znak <= '9') return true;
return false;
}
public static bool IsAscii(char znak)
{
if (znak >= 0 && znak <= '~' + 1) return true;
return false;
}
public static byte EncodeTwoDigits(char znak1, char znak2)
{
return (byte)(130 + 10 * (znak1 - '0') + znak2 - '0');
}
public static byte[] MakeByteArray(string text)
{
IList<byte> bytes = new List<byte>();
int ix = 0;
while (ix < text.Length)
{
if (ix < text.Length - 1 && Utils.IsDigit(text[ix]) && Utils.IsDigit(text[ix + 1]))
{
bytes.Add(Utils.EncodeTwoDigits(text[ix], text[ix + 1]));
ix += 2;
}
else if (Utils.IsAscii(text[ix]))
{
bytes.Add((byte)(text[ix] + 1));
ix++;
}
else
{
/// Skip non ASCII characters
ix++;
}
}
bytes.Add(EndOfMessage);
return bytes.ToArray();
}
}
}
+36
View File
@@ -0,0 +1,36 @@
using System;
using System.Text;
using System.Windows.Forms;
namespace DataStreamInterfaceTest
{
public class ActivityLog
{
const int LinesCount = 50;
TextBox textBox;
string[] lines;
string activity;
public ActivityLog(TextBox textBox)
{
this.textBox = textBox;
lines = new string[LinesCount];
for (int i = 0; i < LinesCount; i++) lines[i] = string.Empty;
}
public void Print(string log)
{
for (int i = LinesCount - 1; i > 0; i--) lines[i] = lines[i - 1];
lines[0] = log;
DisplayLines();
}
private void DisplayLines()
{
StringBuilder sb = new StringBuilder();
foreach (var line in lines) sb.AppendLine(line);
textBox.Text = sb.ToString();
}
}
}
@@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{1D1EEF9C-7F41-43D3-BD09-5054D00F7A23}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DataStreamInterfaceTest</RootNamespace>
<AssemblyName>DataStreamInterfaceTest</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ActivityLog.cs" />
<Compile Include="DemoMainWnd.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="DemoMainWnd.Designer.cs">
<DependentUpon>DemoMainWnd.cs</DependentUpon>
</Compile>
<Compile Include="GetDblValueDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GetDblValueDlg.designer.cs">
<DependentUpon>GetDblValueDlg.cs</DependentUpon>
</Compile>
<Compile Include="GetFrameBoundariesDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GetFrameBoundariesDlg.designer.cs">
<DependentUpon>GetFrameBoundariesDlg.cs</DependentUpon>
</Compile>
<Compile Include="GetIntegerNumberDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GetIntegerNumberDlg.Designer.cs">
<DependentUpon>GetIntegerNumberDlg.cs</DependentUpon>
</Compile>
<Compile Include="GetStateDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GetStateDlg.designer.cs">
<DependentUpon>GetStateDlg.cs</DependentUpon>
</Compile>
<Compile Include="LviIDComparer.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="DemoMainWnd.resx">
<DependentUpon>DemoMainWnd.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="GetDblValueDlg.resx">
<DependentUpon>GetDblValueDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GetFrameBoundariesDlg.resx">
<DependentUpon>GetFrameBoundariesDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GetIntegerNumberDlg.resx">
<DependentUpon>GetIntegerNumberDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GetStateDlg.resx">
<DependentUpon>GetStateDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DataStreamInterface\DataStreamInterface.csproj">
<Project>{7ebeea14-91c4-48d7-af0a-7a4bc3ff9a28}</Project>
<Name>DataStreamInterface</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
+380
View File
@@ -0,0 +1,380 @@
namespace DataStreamInterfaceTest
{
partial class DemoMainWnd
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.getIDButton = new System.Windows.Forms.Button();
this.getFramesButton = new System.Windows.Forms.Button();
this.measurementLabel = new System.Windows.Forms.Label();
this.stateLabel = new System.Windows.Forms.Label();
this.capabilitiesLabel = new System.Windows.Forms.Label();
this.getQuantityUnitsButton = new System.Windows.Forms.Button();
this.getQuantityCaptionButton = new System.Windows.Forms.Button();
this.getQuantitiesCountButton = new System.Windows.Forms.Button();
this.getVolumeUnitsButton = new System.Windows.Forms.Button();
this.getTimeUnitsButton = new System.Windows.Forms.Button();
this.setStateButton = new System.Windows.Forms.Button();
this.getStateButton = new System.Windows.Forms.Button();
this.stopMeasurementButton = new System.Windows.Forms.Button();
this.startMeasurementButton = new System.Windows.Forms.Button();
this.closeConnectionButton = new System.Windows.Forms.Button();
this.openConnectionButton = new System.Windows.Forms.Button();
this.splitContainer2 = new System.Windows.Forms.SplitContainer();
this.logsTextBox = new System.Windows.Forms.TextBox();
this.dataTabControl = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.framesListView = new System.Windows.Forms.ListView();
this.tabPage2 = new System.Windows.Forms.TabPage();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
this.splitContainer2.Panel1.SuspendLayout();
this.splitContainer2.Panel2.SuspendLayout();
this.splitContainer2.SuspendLayout();
this.dataTabControl.SuspendLayout();
this.tabPage1.SuspendLayout();
this.SuspendLayout();
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer1.IsSplitterFixed = true;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.getIDButton);
this.splitContainer1.Panel1.Controls.Add(this.getFramesButton);
this.splitContainer1.Panel1.Controls.Add(this.measurementLabel);
this.splitContainer1.Panel1.Controls.Add(this.stateLabel);
this.splitContainer1.Panel1.Controls.Add(this.capabilitiesLabel);
this.splitContainer1.Panel1.Controls.Add(this.getQuantityUnitsButton);
this.splitContainer1.Panel1.Controls.Add(this.getQuantityCaptionButton);
this.splitContainer1.Panel1.Controls.Add(this.getQuantitiesCountButton);
this.splitContainer1.Panel1.Controls.Add(this.getVolumeUnitsButton);
this.splitContainer1.Panel1.Controls.Add(this.getTimeUnitsButton);
this.splitContainer1.Panel1.Controls.Add(this.setStateButton);
this.splitContainer1.Panel1.Controls.Add(this.getStateButton);
this.splitContainer1.Panel1.Controls.Add(this.stopMeasurementButton);
this.splitContainer1.Panel1.Controls.Add(this.startMeasurementButton);
this.splitContainer1.Panel1.Controls.Add(this.closeConnectionButton);
this.splitContainer1.Panel1.Controls.Add(this.openConnectionButton);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.splitContainer2);
this.splitContainer1.Size = new System.Drawing.Size(826, 583);
this.splitContainer1.SplitterDistance = 150;
this.splitContainer1.TabIndex = 0;
//
// getIDButton
//
this.getIDButton.Location = new System.Drawing.Point(12, 480);
this.getIDButton.Name = "getIDButton";
this.getIDButton.Size = new System.Drawing.Size(128, 24);
this.getIDButton.TabIndex = 12;
this.getIDButton.Text = "Get ID";
this.getIDButton.UseVisualStyleBackColor = true;
this.getIDButton.Click += new System.EventHandler(this.getIDButton_Click);
//
// getFramesButton
//
this.getFramesButton.Location = new System.Drawing.Point(12, 450);
this.getFramesButton.Name = "getFramesButton";
this.getFramesButton.Size = new System.Drawing.Size(128, 24);
this.getFramesButton.TabIndex = 11;
this.getFramesButton.Text = "Get frames";
this.getFramesButton.UseVisualStyleBackColor = true;
this.getFramesButton.Click += new System.EventHandler(this.getFramesButton_Click);
//
// measurementLabel
//
this.measurementLabel.AutoSize = true;
this.measurementLabel.Location = new System.Drawing.Point(12, 374);
this.measurementLabel.Name = "measurementLabel";
this.measurementLabel.Size = new System.Drawing.Size(74, 13);
this.measurementLabel.TabIndex = 15;
this.measurementLabel.Text = "Measurement:";
//
// stateLabel
//
this.stateLabel.AutoSize = true;
this.stateLabel.Location = new System.Drawing.Point(12, 194);
this.stateLabel.Name = "stateLabel";
this.stateLabel.Size = new System.Drawing.Size(112, 13);
this.stateLabel.TabIndex = 14;
this.stateLabel.Text = "State and connection:";
//
// capabilitiesLabel
//
this.capabilitiesLabel.AutoSize = true;
this.capabilitiesLabel.Location = new System.Drawing.Point(12, 9);
this.capabilitiesLabel.Name = "capabilitiesLabel";
this.capabilitiesLabel.Size = new System.Drawing.Size(63, 13);
this.capabilitiesLabel.TabIndex = 13;
this.capabilitiesLabel.Text = "Capabilities:";
//
// getQuantityUnitsButton
//
this.getQuantityUnitsButton.Location = new System.Drawing.Point(12, 145);
this.getQuantityUnitsButton.Name = "getQuantityUnitsButton";
this.getQuantityUnitsButton.Size = new System.Drawing.Size(128, 24);
this.getQuantityUnitsButton.TabIndex = 4;
this.getQuantityUnitsButton.Text = "Get quantity units";
this.getQuantityUnitsButton.UseVisualStyleBackColor = true;
this.getQuantityUnitsButton.Click += new System.EventHandler(this.getQuantityUnitsButton_Click);
//
// getQuantityCaptionButton
//
this.getQuantityCaptionButton.Location = new System.Drawing.Point(12, 115);
this.getQuantityCaptionButton.Name = "getQuantityCaptionButton";
this.getQuantityCaptionButton.Size = new System.Drawing.Size(128, 24);
this.getQuantityCaptionButton.TabIndex = 3;
this.getQuantityCaptionButton.Text = "Get quantity caption";
this.getQuantityCaptionButton.UseVisualStyleBackColor = true;
this.getQuantityCaptionButton.Click += new System.EventHandler(this.getQuantityCaptionButton_Click);
//
// getQuantitiesCountButton
//
this.getQuantitiesCountButton.Location = new System.Drawing.Point(12, 85);
this.getQuantitiesCountButton.Name = "getQuantitiesCountButton";
this.getQuantitiesCountButton.Size = new System.Drawing.Size(128, 24);
this.getQuantitiesCountButton.TabIndex = 2;
this.getQuantitiesCountButton.Text = "Get quantities count";
this.getQuantitiesCountButton.UseVisualStyleBackColor = true;
this.getQuantitiesCountButton.Click += new System.EventHandler(this.getQuantitiesCountButton_Click);
//
// getVolumeUnitsButton
//
this.getVolumeUnitsButton.Location = new System.Drawing.Point(12, 55);
this.getVolumeUnitsButton.Name = "getVolumeUnitsButton";
this.getVolumeUnitsButton.Size = new System.Drawing.Size(128, 24);
this.getVolumeUnitsButton.TabIndex = 1;
this.getVolumeUnitsButton.Text = "Get volume units";
this.getVolumeUnitsButton.UseVisualStyleBackColor = true;
this.getVolumeUnitsButton.Click += new System.EventHandler(this.getVolumeUnitsButton_Click);
//
// getTimeUnitsButton
//
this.getTimeUnitsButton.Location = new System.Drawing.Point(12, 25);
this.getTimeUnitsButton.Name = "getTimeUnitsButton";
this.getTimeUnitsButton.Size = new System.Drawing.Size(128, 24);
this.getTimeUnitsButton.TabIndex = 0;
this.getTimeUnitsButton.Text = "Get time units";
this.getTimeUnitsButton.UseVisualStyleBackColor = true;
this.getTimeUnitsButton.Click += new System.EventHandler(this.getTimeUnitsButton_Click);
//
// setStateButton
//
this.setStateButton.Location = new System.Drawing.Point(12, 315);
this.setStateButton.Name = "setStateButton";
this.setStateButton.Size = new System.Drawing.Size(128, 24);
this.setStateButton.TabIndex = 8;
this.setStateButton.Text = "Set state";
this.setStateButton.UseVisualStyleBackColor = true;
this.setStateButton.Click += new System.EventHandler(this.setStateButton_Click);
//
// getStateButton
//
this.getStateButton.Location = new System.Drawing.Point(12, 285);
this.getStateButton.Name = "getStateButton";
this.getStateButton.Size = new System.Drawing.Size(128, 24);
this.getStateButton.TabIndex = 7;
this.getStateButton.Text = "Get state";
this.getStateButton.UseVisualStyleBackColor = true;
this.getStateButton.Click += new System.EventHandler(this.getStateButton_Click);
//
// stopMeasurementButton
//
this.stopMeasurementButton.Location = new System.Drawing.Point(12, 420);
this.stopMeasurementButton.Name = "stopMeasurementButton";
this.stopMeasurementButton.Size = new System.Drawing.Size(128, 24);
this.stopMeasurementButton.TabIndex = 10;
this.stopMeasurementButton.Text = "Stop measurement";
this.stopMeasurementButton.UseVisualStyleBackColor = true;
this.stopMeasurementButton.Click += new System.EventHandler(this.stopMeasurementButton_Click);
//
// startMeasurementButton
//
this.startMeasurementButton.Location = new System.Drawing.Point(12, 390);
this.startMeasurementButton.Name = "startMeasurementButton";
this.startMeasurementButton.Size = new System.Drawing.Size(128, 24);
this.startMeasurementButton.TabIndex = 9;
this.startMeasurementButton.Text = "Start measurement";
this.startMeasurementButton.UseVisualStyleBackColor = true;
this.startMeasurementButton.Click += new System.EventHandler(this.startMeasurementButton_Click);
//
// closeConnectionButton
//
this.closeConnectionButton.Location = new System.Drawing.Point(12, 240);
this.closeConnectionButton.Name = "closeConnectionButton";
this.closeConnectionButton.Size = new System.Drawing.Size(128, 24);
this.closeConnectionButton.TabIndex = 6;
this.closeConnectionButton.Text = "Close connection";
this.closeConnectionButton.UseVisualStyleBackColor = true;
this.closeConnectionButton.Click += new System.EventHandler(this.closeConnectionButton_Click);
//
// openConnectionButton
//
this.openConnectionButton.Location = new System.Drawing.Point(12, 210);
this.openConnectionButton.Name = "openConnectionButton";
this.openConnectionButton.Size = new System.Drawing.Size(128, 24);
this.openConnectionButton.TabIndex = 5;
this.openConnectionButton.Text = "Open connection";
this.openConnectionButton.UseVisualStyleBackColor = true;
this.openConnectionButton.Click += new System.EventHandler(this.openConnectionButton_Click);
//
// splitContainer2
//
this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer2.Location = new System.Drawing.Point(0, 0);
this.splitContainer2.Name = "splitContainer2";
this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainer2.Panel1
//
this.splitContainer2.Panel1.Controls.Add(this.logsTextBox);
//
// splitContainer2.Panel2
//
this.splitContainer2.Panel2.Controls.Add(this.dataTabControl);
this.splitContainer2.Size = new System.Drawing.Size(672, 583);
this.splitContainer2.SplitterDistance = 222;
this.splitContainer2.TabIndex = 0;
//
// logsTextBox
//
this.logsTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.logsTextBox.Location = new System.Drawing.Point(0, 0);
this.logsTextBox.Multiline = true;
this.logsTextBox.Name = "logsTextBox";
this.logsTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.logsTextBox.Size = new System.Drawing.Size(672, 222);
this.logsTextBox.TabIndex = 0;
//
// dataTabControl
//
this.dataTabControl.Controls.Add(this.tabPage1);
this.dataTabControl.Controls.Add(this.tabPage2);
this.dataTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataTabControl.Location = new System.Drawing.Point(0, 0);
this.dataTabControl.Name = "dataTabControl";
this.dataTabControl.SelectedIndex = 0;
this.dataTabControl.Size = new System.Drawing.Size(672, 357);
this.dataTabControl.TabIndex = 0;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.framesListView);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(664, 331);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "Transferred frames";
this.tabPage1.UseVisualStyleBackColor = true;
//
// framesListView
//
this.framesListView.Dock = System.Windows.Forms.DockStyle.Fill;
this.framesListView.GridLines = true;
this.framesListView.Location = new System.Drawing.Point(3, 3);
this.framesListView.Name = "framesListView";
this.framesListView.Size = new System.Drawing.Size(658, 325);
this.framesListView.TabIndex = 0;
this.framesListView.UseCompatibleStateImageBehavior = false;
this.framesListView.View = System.Windows.Forms.View.Details;
//
// tabPage2
//
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(664, 331);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "Graph";
this.tabPage2.UseVisualStyleBackColor = true;
//
// DemoMainWnd
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(826, 583);
this.Controls.Add(this.splitContainer1);
this.Name = "DemoMainWnd";
this.Text = "Datastream interface test";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DemoMainWnd_FormClosing);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.splitContainer2.Panel1.ResumeLayout(false);
this.splitContainer2.Panel1.PerformLayout();
this.splitContainer2.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
this.splitContainer2.ResumeLayout(false);
this.dataTabControl.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Button openConnectionButton;
private System.Windows.Forms.Button closeConnectionButton;
private System.Windows.Forms.Button stopMeasurementButton;
private System.Windows.Forms.Button startMeasurementButton;
private System.Windows.Forms.Button setStateButton;
private System.Windows.Forms.Button getStateButton;
private System.Windows.Forms.Button getQuantityUnitsButton;
private System.Windows.Forms.Button getQuantityCaptionButton;
private System.Windows.Forms.Button getQuantitiesCountButton;
private System.Windows.Forms.Button getVolumeUnitsButton;
private System.Windows.Forms.Button getTimeUnitsButton;
private System.Windows.Forms.Label measurementLabel;
private System.Windows.Forms.Label stateLabel;
private System.Windows.Forms.Label capabilitiesLabel;
private System.Windows.Forms.Button getIDButton;
private System.Windows.Forms.Button getFramesButton;
private System.Windows.Forms.SplitContainer splitContainer2;
private System.Windows.Forms.TextBox logsTextBox;
private System.Windows.Forms.TabControl dataTabControl;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.ListView framesListView;
private System.Windows.Forms.TabPage tabPage2;
}
}
+292
View File
@@ -0,0 +1,292 @@
using System;
using System.Text;
using System.Windows.Forms;
using DataStreamInterface;
namespace DataStreamInterfaceTest
{
public partial class DemoMainWnd : Form
{
IDataStreamMeter dataStreamMeter;
ActivityLog activityLog;
Unit timeUnits;
Unit volumeUnits;
int quantitiesCount;
string[] quantityCaption;
Unit[] quantityUnit;
Int64 storedFramesCount;
DataFrame[] transferredFrames;
public DemoMainWnd() : this(null) { }
public DemoMainWnd(IDataStreamMeter dataStreamMeter)
{
InitializeComponent();
this.dataStreamMeter = dataStreamMeter;
activityLog = new ActivityLog(logsTextBox);
framesListView.Columns.Add("ID", 100);
framesListView.Columns.Add("Time", 100);
framesListView.Columns.Add("Volume", 100);
framesListView.Columns.Add("Additional quantities", 300);
framesListView.ListViewItemSorter = new LviIDComparer();
}
void ShowNoMeterInterfaceMessage()
{
MessageBox.Show("No datastream meter interface");
}
private void getTimeUnitsButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
timeUnits = dataStreamMeter.GetTimeUnits();
activityLog.Print(string.Format("Time units are {0}", timeUnits));
}
}
private void getVolumeUnitsButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
volumeUnits = dataStreamMeter.GetVolumeUnits();
activityLog.Print(string.Format("Volume units are {0}", volumeUnits));
}
}
private void getQuantitiesCountButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
int quantitesCountOri = quantitiesCount;
quantitiesCount = dataStreamMeter.GetQuantitiesCount();
activityLog.Print(string.Format("There are {0} additional quantites", quantitiesCount));
if (quantitesCountOri == 0)
{
quantityUnit = new Unit[quantitiesCount];
quantityCaption = new string[quantitiesCount];
for (int i = 0; i < quantitiesCount; i++) quantityCaption[i] = string.Empty;
}
else if (quantitiesCount != quantitesCountOri)
{
quantityUnit = new Unit[quantitiesCount];
quantityCaption = new string[quantitiesCount];
for (int i = 0; i < quantitiesCount; i++) quantityCaption[i] = string.Empty;
activityLog.Print(string.Format("Quantities count changed during operation"));
MessageBox.Show("Quantities count changed during operation", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
private void getQuantityCaptionButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
GetIntegerNumberDlg dlg = new GetIntegerNumberDlg(string.Format("Enter index {0} .. {1}", 0, quantitiesCount - 1), 0, quantitiesCount - 1);
if (dlg.ShowDialog() == DialogResult.OK)
{
quantityCaption[dlg.Number] = dataStreamMeter.GetQuantityCaption(dlg.Number);
activityLog.Print(string.Format("Caption of quantity #{0} is {1}", dlg.Number, quantityCaption[dlg.Number]));
}
}
}
private void getQuantityUnitsButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
GetIntegerNumberDlg dlg = new GetIntegerNumberDlg(string.Format("Enter index {0} .. {1}", 0, quantitiesCount - 1), 0, quantitiesCount - 1);
if (dlg.ShowDialog() == DialogResult.OK)
{
quantityUnit[dlg.Number] = dataStreamMeter.GetQuantityUnits(dlg.Number);
activityLog.Print(string.Format("Units of quantity #{0} are {1}", dlg.Number, quantityUnit[dlg.Number]));
}
}
}
private void openConnectionButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
string meterId;
if (dataStreamMeter.OpenConnection(0, "no connection parameters", out meterId))
{
activityLog.Print(string.Format("Connection established, meter ID is {0}", meterId));
}
else
{
activityLog.Print("Failed to establish a connection");
}
}
}
private void closeConnectionButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
if (dataStreamMeter.CloseConnection(0))
{
framesListView.Items.Clear();
activityLog.Print("Connection closed");
}
else
{
activityLog.Print("Failed to close the connection");
}
}
}
private void DemoMainWnd_FormClosing(object sender, FormClosingEventArgs e)
{
if (dataStreamMeter == null)
{
dataStreamMeter.Shutdown();
}
}
private void getStateButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
int state;
string parameter;
if (dataStreamMeter.GetState(0, out state, out parameter))
{
activityLog.Print(string.Format("Water meter state is {0} / {1}", state, parameter));
}
else
{
activityLog.Print("Failed to obtain the water meter state");
}
}
}
private void setStateButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
GetStateDlg dlg = new GetStateDlg();
if (dlg.ShowDialog() == DialogResult.OK)
{
if (dataStreamMeter.SetState(0, dlg.State, dlg.Parameter))
{
activityLog.Print(string.Format("Water meter state set to {0} / {1}", dlg.State, dlg.Parameter));
}
else
{
activityLog.Print(string.Format("Failed to set the water meter state to {0} / {1}", dlg.State, dlg.Parameter));
}
}
}
}
private void startMeasurementButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
if (dataStreamMeter.StartMeasurement(0))
{
framesListView.Items.Clear();
activityLog.Print(string.Format("Measurement started"));
}
else
{
activityLog.Print("Failed to start a measurement");
}
}
}
private void stopMeasurementButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
if (dataStreamMeter.StopMeasurement(0, out storedFramesCount))
{
framesListView.Items.Clear();
activityLog.Print(string.Format("Measurement sopped, {0} frames acquired", storedFramesCount));
}
else
{
activityLog.Print("Failed to stop the measurement");
}
}
}
private void getFramesButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
GetFrameBoundariesDlg dlg = new GetFrameBoundariesDlg("Enter frames range boundaries", 0, storedFramesCount - 1);
if (dlg.ShowDialog() != DialogResult.OK) return;
DataFrame[] frames = dataStreamMeter.GetFrames(0, dlg.From, Convert.ToInt32(dlg.To - dlg.From + 1));
{
foreach (var frame in frames)
{
if (frame != null) framesListView.Items.Add(GetListViewItem(frame));
}
}
}
}
private void getIDButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
ShowNoMeterInterfaceMessage();
else
{
GetDblValueDlg dlg = new GetDblValueDlg("Enter time in seconds");
if (dlg.ShowDialog() == DialogResult.OK)
{
Int64 id = dataStreamMeter.GetID(0, dlg.DblValue);
activityLog.Print(string.Format("GetID({0}) returned {1}", dlg.DblValue, id));
}
}
}
ListViewItem GetListViewItem(DataFrame frame)
{
ListViewItem lvi = new ListViewItem(frame.ID.ToString());
lvi.SubItems.Add(frame.Time.ToString());
lvi.SubItems.Add(frame.Volume.ToString());
StringBuilder sb = new StringBuilder();
foreach (var quantity in frame.Quantity)
{
sb.Append(quantity.ToString());
sb.Append(" ");
}
lvi.SubItems.Add(sb.ToString());
lvi.Tag = frame;
return lvi;
}
}
}
+88
View File
@@ -0,0 +1,88 @@
namespace DataStreamInterfaceTest
{
partial class GetDblValueDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.valueTextBox = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// valueTextBox
//
this.valueTextBox.Location = new System.Drawing.Point(35, 20);
this.valueTextBox.Name = "valueTextBox";
this.valueTextBox.Size = new System.Drawing.Size(94, 20);
this.valueTextBox.TabIndex = 0;
//
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.Location = new System.Drawing.Point(216, 16);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(75, 29);
this.okButton.TabIndex = 1;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// cancelButton
//
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(306, 16);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(75, 29);
this.cancelButton.TabIndex = 2;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
//
// GetFlowDlg
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(396, 58);
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.okButton);
this.Controls.Add(this.valueTextBox);
this.Name = "GetFlowDlg";
this.Text = "Enter flow";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox valueTextBox;
private System.Windows.Forms.Button okButton;
private System.Windows.Forms.Button cancelButton;
}
}
+59
View File
@@ -0,0 +1,59 @@
using System;
using System.Globalization;
using System.Windows.Forms;
namespace DataStreamInterfaceTest
{
public partial class GetDblValueDlg : Form
{
public double DblValue;
double lowerLimit;
double upperLimit;
public GetDblValueDlg()
: this("Enter flow in [m3/h] please")
{
}
public GetDblValueDlg(string title)
: this(title, 0, 100.0)
{
}
public GetDblValueDlg(string title, double lowerLimit, double upperLimit)
{
InitializeComponent();
this.Text = title;
this.lowerLimit = lowerLimit;
this.upperLimit = upperLimit;
}
private void okButton_Click(object sender, EventArgs e)
{
double val;
if (TryParseUDouble(valueTextBox.Text, out val))
{
DblValue = val;
DialogResult = DialogResult.OK;
Close();
}
else
{
MessageBox.Show("Invalid value");
DialogResult = DialogResult.None;
}
}
/// <summary>
/// Parse an unsigned double number
/// </summary>
bool TryParseUDouble(string text, out double result)
{
return double.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out result) ||
double.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result);
}
}
}
+126
View File
@@ -0,0 +1,126 @@
namespace DataStreamInterfaceTest
{
partial class GetFrameBoundariesDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.fromTextBox = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.toTextBox = new System.Windows.Forms.TextBox();
this.fromLabel = new System.Windows.Forms.Label();
this.toLabel = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// fromTextBox
//
this.fromTextBox.Location = new System.Drawing.Point(89, 16);
this.fromTextBox.Name = "fromTextBox";
this.fromTextBox.Size = new System.Drawing.Size(100, 20);
this.fromTextBox.TabIndex = 0;
//
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.Location = new System.Drawing.Point(225, 24);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(75, 36);
this.okButton.TabIndex = 1;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// cancelButton
//
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(316, 24);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(75, 36);
this.cancelButton.TabIndex = 2;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
//
// toTextBox
//
this.toTextBox.Location = new System.Drawing.Point(89, 46);
this.toTextBox.Name = "toTextBox";
this.toTextBox.Size = new System.Drawing.Size(100, 20);
this.toTextBox.TabIndex = 3;
//
// fromLabel
//
this.fromLabel.AutoSize = true;
this.fromLabel.Location = new System.Drawing.Point(12, 19);
this.fromLabel.Name = "fromLabel";
this.fromLabel.Size = new System.Drawing.Size(30, 13);
this.fromLabel.TabIndex = 4;
this.fromLabel.Text = "From";
//
// toLabel
//
this.toLabel.AutoSize = true;
this.toLabel.Location = new System.Drawing.Point(12, 49);
this.toLabel.Name = "toLabel";
this.toLabel.Size = new System.Drawing.Size(20, 13);
this.toLabel.TabIndex = 5;
this.toLabel.Text = "To";
//
// GetFrameBoundariesDlg
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(419, 79);
this.ControlBox = false;
this.Controls.Add(this.toLabel);
this.Controls.Add(this.fromLabel);
this.Controls.Add(this.toTextBox);
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.okButton);
this.Controls.Add(this.fromTextBox);
this.Name = "GetFrameBoundariesDlg";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Enter frames range boundaries";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox fromTextBox;
private System.Windows.Forms.Button okButton;
private System.Windows.Forms.Button cancelButton;
private System.Windows.Forms.TextBox toTextBox;
private System.Windows.Forms.Label fromLabel;
private System.Windows.Forms.Label toLabel;
}
}
@@ -0,0 +1,88 @@
using System;
using System.Windows.Forms;
namespace DataStreamInterfaceTest
{
public partial class GetFrameBoundariesDlg : Form
{
/// <summary>
/// Integer number entered in this form
/// </summary>
public Int64 From;
public Int64 To;
Int64 lowerLimit;
Int64 upperLimit;
/// <summary>
/// Default constructor
/// </summary>
public GetFrameBoundariesDlg()
: this("Enter state please")
{
}
/// <summary>
/// Constructor with a custom window title.
/// </summary>
/// <param name="title">Window title</param>
public GetFrameBoundariesDlg(string title)
: this(title, Int64.MinValue, Int64.MaxValue)
{
}
/// <summary>
/// Constructor with a custom window title, limits and non-empty initial value.
/// </summary>
/// <param name="title">Window title</param>
/// <param name="lowerLimit">Lower limit</param>
/// <param name="upperLimit">Upper limit</param>
/// <param name="initialValue">Initial value</param>
public GetFrameBoundariesDlg(string title, Int64 lowerLimit, Int64 upperLimit, int initialValue)
: this(title, lowerLimit, upperLimit)
{
fromTextBox.Text = initialValue.ToString();
}
/// <summary>
/// Constructor with a custom window title and lower/upper limits.
/// </summary>
/// <param name="title">Window title</param>
/// <param name="lowerLimit">Lower limit</param>
/// <param name="upperLimit">Upper limit</param>
public GetFrameBoundariesDlg(string title, Int64 lowerLimit, Int64 upperLimit)
{
InitializeComponent();
this.Text = title;
this.lowerLimit = lowerLimit;
this.upperLimit = upperLimit;
}
/// <summary>
/// OK button handler that verifies validity of the entered value.
/// </summary>
private void okButton_Click(object sender, EventArgs e)
{
Int64 from;
Int64 to;
if (Int64.TryParse(fromTextBox.Text, out from) && from >= lowerLimit && from <= upperLimit &&
Int64.TryParse(toTextBox.Text, out to) && to >= lowerLimit && to <= upperLimit &&
to >= from && to < from + Int32.MaxValue)
{
From = from;
To = to;
DialogResult = DialogResult.OK;
}
else
{
string message = (lowerLimit != 0 || upperLimit != Int32.MaxValue)
? string.Format("Invalid boundaries ({0}..{1})", lowerLimit, upperLimit)
: "Invalid boundaries";
MessageBox.Show(message);
DialogResult = DialogResult.None; /// Prevent closing this window
}
}
}
}
+90
View File
@@ -0,0 +1,90 @@
namespace DataStreamInterfaceTest
{
partial class GetIntegerNumberDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.numberTextBox = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// numberTextBox
//
this.numberTextBox.Location = new System.Drawing.Point(36, 16);
this.numberTextBox.Name = "numberTextBox";
this.numberTextBox.Size = new System.Drawing.Size(100, 20);
this.numberTextBox.TabIndex = 0;
//
// okButton
//
this.okButton.Location = new System.Drawing.Point(174, 7);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(75, 36);
this.okButton.TabIndex = 1;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// cancelButton
//
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(265, 7);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(75, 36);
this.cancelButton.TabIndex = 2;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
//
// GetIntegerNumberDlg
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(363, 50);
this.ControlBox = false;
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.okButton);
this.Controls.Add(this.numberTextBox);
this.Name = "GetIntegerNumberDlg";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Enter integer number please";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox numberTextBox;
private System.Windows.Forms.Button okButton;
private System.Windows.Forms.Button cancelButton;
}
}
@@ -0,0 +1,83 @@
using System;
using System.Windows.Forms;
namespace DataStreamInterfaceTest
{
public partial class GetIntegerNumberDlg : Form
{
/// <summary>
/// Integer number entered in this form
/// </summary>
public int Number;
int lowerLimit;
int upperLimit;
/// <summary>
/// Default constructor
/// </summary>
public GetIntegerNumberDlg()
: this("Enter integer number please")
{
}
/// <summary>
/// Constructor with a custom window title.
/// </summary>
/// <param name="title">Window title</param>
public GetIntegerNumberDlg(string title)
: this(title, Int32.MinValue, Int32.MaxValue)
{
}
/// <summary>
/// Constructor with a custom window title, limits and non-empty initial value.
/// </summary>
/// <param name="title">Window title</param>
/// <param name="lowerLimit">Lower limit</param>
/// <param name="upperLimit">Upper limit</param>
/// <param name="initialValue">Initial value</param>
public GetIntegerNumberDlg(string title, int lowerLimit, int upperLimit, int initialValue)
: this(title, lowerLimit, upperLimit)
{
numberTextBox.Text = initialValue.ToString();
}
/// <summary>
/// Constructor with a custom window title and lower/upper limits.
/// </summary>
/// <param name="title">Window title</param>
/// <param name="lowerLimit">Lower limit</param>
/// <param name="upperLimit">Upper limit</param>
public GetIntegerNumberDlg(string title, int lowerLimit, int upperLimit)
{
InitializeComponent();
this.Text = title;
this.lowerLimit = lowerLimit;
this.upperLimit = upperLimit;
}
/// <summary>
/// OK button handler that verifies validity of the entered value.
/// </summary>
private void okButton_Click(object sender, EventArgs e)
{
int number;
if (int.TryParse(numberTextBox.Text, out number) && number >= lowerLimit && number <= upperLimit)
{
Number = number;
DialogResult = DialogResult.OK;
}
else
{
string message = (lowerLimit != Int32.MinValue || upperLimit != Int32.MaxValue)
? string.Format("Invalid integer number ({0}..{1})", lowerLimit, upperLimit)
: "Invalid integer number";
MessageBox.Show(message);
DialogResult = DialogResult.None; /// Prevent closing this window
}
}
}
}
+126
View File
@@ -0,0 +1,126 @@
namespace DataStreamInterfaceTest
{
partial class GetStateDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.stateTextBox = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.parameterTextBox = new System.Windows.Forms.TextBox();
this.stateLabel = new System.Windows.Forms.Label();
this.parameterLabel = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// stateTextBox
//
this.stateTextBox.Location = new System.Drawing.Point(89, 16);
this.stateTextBox.Name = "stateTextBox";
this.stateTextBox.Size = new System.Drawing.Size(100, 20);
this.stateTextBox.TabIndex = 0;
//
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.Location = new System.Drawing.Point(225, 24);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(75, 36);
this.okButton.TabIndex = 1;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// cancelButton
//
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(316, 24);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(75, 36);
this.cancelButton.TabIndex = 2;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
//
// parameterTextBox
//
this.parameterTextBox.Location = new System.Drawing.Point(89, 46);
this.parameterTextBox.Name = "parameterTextBox";
this.parameterTextBox.Size = new System.Drawing.Size(100, 20);
this.parameterTextBox.TabIndex = 3;
//
// stateLabel
//
this.stateLabel.AutoSize = true;
this.stateLabel.Location = new System.Drawing.Point(12, 19);
this.stateLabel.Name = "stateLabel";
this.stateLabel.Size = new System.Drawing.Size(32, 13);
this.stateLabel.TabIndex = 4;
this.stateLabel.Text = "State";
//
// parameterLabel
//
this.parameterLabel.AutoSize = true;
this.parameterLabel.Location = new System.Drawing.Point(12, 49);
this.parameterLabel.Name = "parameterLabel";
this.parameterLabel.Size = new System.Drawing.Size(55, 13);
this.parameterLabel.TabIndex = 5;
this.parameterLabel.Text = "Parameter";
//
// GetStateDlg
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(419, 79);
this.ControlBox = false;
this.Controls.Add(this.parameterLabel);
this.Controls.Add(this.stateLabel);
this.Controls.Add(this.parameterTextBox);
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.okButton);
this.Controls.Add(this.stateTextBox);
this.Name = "GetStateDlg";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Enter state please";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox stateTextBox;
private System.Windows.Forms.Button okButton;
private System.Windows.Forms.Button cancelButton;
private System.Windows.Forms.TextBox parameterTextBox;
private System.Windows.Forms.Label stateLabel;
private System.Windows.Forms.Label parameterLabel;
}
}
+85
View File
@@ -0,0 +1,85 @@
using System;
using System.Windows.Forms;
namespace DataStreamInterfaceTest
{
public partial class GetStateDlg : Form
{
/// <summary>
/// Integer number entered in this form
/// </summary>
public int State;
public string Parameter;
int lowerLimit;
int upperLimit;
/// <summary>
/// Default constructor
/// </summary>
public GetStateDlg()
: this("Enter state please")
{
}
/// <summary>
/// Constructor with a custom window title.
/// </summary>
/// <param name="title">Window title</param>
public GetStateDlg(string title)
: this(title, Int32.MinValue, Int32.MaxValue)
{
}
/// <summary>
/// Constructor with a custom window title, limits and non-empty initial value.
/// </summary>
/// <param name="title">Window title</param>
/// <param name="lowerLimit">Lower limit</param>
/// <param name="upperLimit">Upper limit</param>
/// <param name="initialValue">Initial value</param>
public GetStateDlg(string title, int lowerLimit, int upperLimit, int initialValue)
: this(title, lowerLimit, upperLimit)
{
stateTextBox.Text = initialValue.ToString();
}
/// <summary>
/// Constructor with a custom window title and lower/upper limits.
/// </summary>
/// <param name="title">Window title</param>
/// <param name="lowerLimit">Lower limit</param>
/// <param name="upperLimit">Upper limit</param>
public GetStateDlg(string title, int lowerLimit, int upperLimit)
{
InitializeComponent();
this.Text = title;
this.lowerLimit = lowerLimit;
this.upperLimit = upperLimit;
}
/// <summary>
/// OK button handler that verifies validity of the entered value.
/// </summary>
private void okButton_Click(object sender, EventArgs e)
{
int number;
if (int.TryParse(stateTextBox.Text, out number) && number >= lowerLimit && number <= upperLimit)
{
State = number;
Parameter = parameterTextBox.Text;
DialogResult = DialogResult.OK;
}
else
{
string message = (lowerLimit != Int32.MinValue || upperLimit != Int32.MaxValue)
? string.Format("Invalid state ({0}..{1})", lowerLimit, upperLimit)
: "Invalid state";
MessageBox.Show(message);
DialogResult = DialogResult.None; /// Prevent closing this window
}
}
}
}
+39
View File
@@ -0,0 +1,39 @@
using System;
using System.Collections;
using System.Windows.Forms;
namespace DataStreamInterfaceTest
{
public class LviIDComparer : IComparer
{
int column;
SortOrder order;
public LviIDComparer()
{
column = 0;
order = SortOrder.Ascending;
}
public LviIDComparer(int column, SortOrder order)
{
this.column = column;
this.order = order;
}
public int Compare(object x, object y)
{
Int64 valX = Int64.Parse(((ListViewItem)x).SubItems[column].Text);
Int64 valY = Int64.Parse(((ListViewItem)y).SubItems[column].Text);
if (order == SortOrder.Ascending)
{
return valX > valY ? 1 : valX == valY ? 0 : -1;
}
else
{
return valX < valY ? 1 : valX == valY ? 0 : -1;
}
}
}
}
+55
View File
@@ -0,0 +1,55 @@
using System;
using System.IO;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Windows.Forms;
using DataStreamInterface;
namespace DataStreamInterfaceTest
{
class Program
{
#if DEBUG
const string CatalogDir = "..\\..\\..\\DataStreamMeter\\bin\\Debug";
#else
const string CatalogDir = "..\\..\\..\\DataStreamMeter\\bin\\Release";
#endif
[Import(typeof(IDataStreamMeter))]
IDataStreamMeter dataStreamMeter;
private Program()
{
Console.WriteLine("Components found:");
foreach (var file in Directory.EnumerateFiles(CatalogDir))
{
Console.WriteLine(file);
}
try
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(DataStreamInterface.IDataStreamMeter).Assembly));
catalog.Catalogs.Add(new DirectoryCatalog(CatalogDir));
(new CompositionContainer(catalog)).ComposeParts(this);
}
catch (CompositionException compositionException)
{
Console.WriteLine(compositionException.ToString());
}
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Program p = new Program();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new DemoMainWnd(p.dataStreamMeter));
}
}
}
@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("SchematicDrawing")]
[assembly: AssemblyTitle("DataStreamInterfaceTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SchematicDrawing")]
[assembly: AssemblyProduct("DataStreamInterfaceTest")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -20,7 +20,7 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("ebe01d13-1510-46ae-9457-473e83584394")]
[assembly: Guid("429fdea9-ec3a-47d8-88b3-5df11de8b4c8")]
// Version information for an assembly consists of the following four values:
//
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.0.2.0")]
[assembly: AssemblyFileVersion("3.0.2.0")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace OrderManagement.Properties
namespace DataStreamInterfaceTest.Properties
{
@@ -44,7 +44,7 @@ namespace OrderManagement.Properties
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OrderManagement.Properties.Resources", typeof(Resources).Assembly);
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DataStreamMainDemo.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
@@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace OrderManagement.Properties
namespace DataStreamInterfaceTest.Properties
{
@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
@@ -1,15 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{67BD7A8F-0FED-4FDE-B875-78D5A2BC9B2C}</ProjectGuid>
<ProjectGuid>{E6925701-57A6-4167-B5C4-BF670F1DE310}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>RecordProcessing</RootNamespace>
<AssemblyName>RFPowerCommon</AssemblyName>
<RootNamespace>DataStreamMeter</RootNamespace>
<AssemblyName>DataStreamMeter</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
@@ -31,22 +30,11 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Gma.QrCodeNet.Encoding">
<HintPath>..\packages\QrCode.Net.0.4.0.0\net40\Gma.QrCodeNet.Encoding.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.15\lib\net45\log4net.dll</HintPath>
</Reference>
<Reference Include="NHibernate">
<HintPath>..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll</HintPath>
</Reference>
<Reference Include="Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Oracle\Oracle.DataAccess.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@@ -54,25 +42,38 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Enums.cs" />
<Compile Include="IRecord.cs" />
<Compile Include="RecordProcessing.cs" />
<Compile Include="GetDblValueDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GetDblValueDlg.Designer.cs">
<DependentUpon>GetDblValueDlg.cs</DependentUpon>
</Compile>
<Compile Include="MeterDataEventArgs.cs" />
<Compile Include="MeterSimulationDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MeterSimulationDlg.Designer.cs">
<DependentUpon>MeterSimulationDlg.cs</DependentUpon>
</Compile>
<Compile Include="MeterSimulation.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Records\CommTestRecord.cs" />
<Compile Include="Records\FlowtubeTestAirRecord.cs" />
<Compile Include="Records\FlowtubeTestHeRecord.cs" />
<Compile Include="Records\LaserNanjingRecord.cs" />
<Compile Include="Records\RFTestPrintDocument.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Records\RFTestPrintDocument_400_900.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Records\RFTestRecord.cs" />
<Compile Include="Records\RFTestRecord_400_900.cs" />
<Compile Include="SubmitRecordEventArgs.cs" />
<Compile Include="Sample.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DataStreamInterface\DataStreamInterface.csproj">
<Project>{7ebeea14-91c4-48d7-af0a-7a4bc3ff9a28}</Project>
<Name>DataStreamInterface</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="GetDblValueDlg.resx">
<DependentUpon>GetDblValueDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MeterSimulationDlg.resx">
<DependentUpon>MeterSimulationDlg.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
+88
View File
@@ -0,0 +1,88 @@
namespace DataStreamMeter
{
partial class GetDblValueDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.valueTextBox = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.cancelButton = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// valueTextBox
//
this.valueTextBox.Location = new System.Drawing.Point(35, 20);
this.valueTextBox.Name = "valueTextBox";
this.valueTextBox.Size = new System.Drawing.Size(94, 20);
this.valueTextBox.TabIndex = 0;
//
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.Location = new System.Drawing.Point(216, 16);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(75, 29);
this.okButton.TabIndex = 1;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// cancelButton
//
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(306, 16);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(75, 29);
this.cancelButton.TabIndex = 2;
this.cancelButton.Text = "Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
//
// GetFlowDlg
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(396, 58);
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.okButton);
this.Controls.Add(this.valueTextBox);
this.Name = "GetFlowDlg";
this.Text = "Enter flow";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox valueTextBox;
private System.Windows.Forms.Button okButton;
private System.Windows.Forms.Button cancelButton;
}
}
+59
View File
@@ -0,0 +1,59 @@
using System;
using System.Globalization;
using System.Windows.Forms;
namespace DataStreamMeter
{
public partial class GetDblValueDlg : Form
{
public double DblValue;
double lowerLimit;
double upperLimit;
public GetDblValueDlg()
: this("Enter flow in [m3/h] please")
{
}
public GetDblValueDlg(string title)
: this(title, 0, 100.0)
{
}
public GetDblValueDlg(string title, double lowerLimit, double upperLimit)
{
InitializeComponent();
this.Text = title;
this.lowerLimit = lowerLimit;
this.upperLimit = upperLimit;
}
private void okButton_Click(object sender, EventArgs e)
{
double val;
if (TryParseUDouble(valueTextBox.Text, out val))
{
DblValue = val;
DialogResult = DialogResult.OK;
Close();
}
else
{
MessageBox.Show("Invalid value");
DialogResult = DialogResult.None;
}
}
/// <summary>
/// Parse an unsigned double number
/// </summary>
bool TryParseUDouble(string text, out double result)
{
return double.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.CurrentCulture, out result) ||
double.TryParse(text, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result);
}
}
}
+20
View File
@@ -0,0 +1,20 @@
using System;
namespace DataStreamMeter
{
public class MeterDataEventArgs : EventArgs
{
public State State;
public double Time;
public double Volume;
public double Flow;
public MeterDataEventArgs(State state, double time, double volume, double flow)
{
State = state;
Time = time;
Volume = volume;
Flow = flow;
}
}
}
+351
View File
@@ -0,0 +1,351 @@
using System;
using System.ComponentModel.Composition;
using DataStreamInterface;
namespace DataStreamMeter
{
[Export(typeof(IDataStreamMeter))]
public class MeterSimulation : IDataStreamMeter
{
MeterSimulationDlg modelessDlg;
/// Water meter specification
public readonly string MeterID = "3141592653";
public const Unit TimeUnits = Unit.s; /// Unit.s, Unit.ms, ...
public const Unit VolumeUnits = Unit.l; /// Unit.l, Unit.USgal, ...
public const Unit FlowUnits = Unit.m3ph; /// Unit.m3ph, Unit.USgalps, Unit.cfs, ...
public const double SamplingPeriodSec = 0.125; /// Sampling period in seconds (here 125 ms, 8 Hz)
public readonly double SamplingPeriod;
public const Int64 MaxSamplesCount = 40000; /// Maximal test time is SamplingPeriod * MaxSamplesCount
Sample[] samples = new Sample[MaxSamplesCount];
Int64 storedSamplesCount;
readonly object stateChangeAndTimerTickLock = new object();
public State State;
string connectionParameters;
/// initialTime is time when simulation started
/// (lastSampleTime - initialTime).TotalSeconds is multiple of Sampling Period
DateTime initialTime;
/// Last user interface tick info
bool lastTickValid;
State lastTickState;
/// Values incrementally updated on each timer tick
double currentTime;
double currentVolume;
double currentFlow;
double currentFlow_m3ph;
DateTime startTimeStamp; /// Measurement start DateTime
double startTime; /// Measurement start time in seconds
DateTime stopTimeStamp; /// Measurement end DateTime
double stopTime; /// Measurement end time in seconds
public MeterSimulation()
{
modelessDlg = null;
State = State.Disconnected;
SamplingPeriod = DataStreamInterface.Units.ConvertTo(TimeUnits, SamplingPeriodSec);
lastTickValid = false;
initialTime = DateTime.Now.Date; /// An arbitrary initial time (in this case the last midnight)
}
public Unit GetTimeUnits()
{
return TimeUnits;
}
public Unit GetVolumeUnits()
{
return VolumeUnits;
}
public int GetQuantitiesCount()
{
return 1;
}
public string GetQuantityCaption(int quantityNr)
{
if (quantityNr == 0) return "Flow";
return string.Empty;
}
public Unit GetQuantityUnits(int quantityNr)
{
if (quantityNr == 0) return FlowUnits;
return Unit.None;
}
public int GetMetersCount()
{
return 20;
}
public bool OpenConnection(int meterIx, string connectionParameters, out string meterID)
{
lock (stateChangeAndTimerTickLock)
{
if (State != State.Disconnected)
{
/// Meter is already connected
meterID = MeterID;
return true;
}
/// Connect the meter
meterID = MeterID;
this.connectionParameters = connectionParameters;
lastTickValid = false;
State = State.Connected;
}
/// Open modeless form
modelessDlg = new MeterSimulationDlg(this, MeterID);
modelessDlg.Show();
return true;
}
public bool CloseConnection(int meterIx)
{
bool closeModelessDlg = false;
lock (stateChangeAndTimerTickLock)
{
if (State != State.Disconnected)
{
State = State.Disconnected;
storedSamplesCount = 0;
closeModelessDlg = true;
}
}
if (closeModelessDlg)
{
if (modelessDlg != null) modelessDlg.Close();
modelessDlg = null;
}
return true;
}
public bool CloseConnectionAll()
{
return CloseConnection(0);
}
public bool Shutdown()
{
return true;
}
public bool GetState(int meterIx, out int state, out string parameter)
{
state = (int)this.State;
parameter = this.connectionParameters;
return true;
}
public bool SetState(int meterIx, int state, string parameter)
{
/// It's not allowed to change the satate in this demo
return false;
}
public bool SetStateAll(int state, string parameter)
{
return SetState(0, state, parameter);
}
public bool StartMeasurement(int meterIx = 0)
{
lock (stateChangeAndTimerTickLock)
{
if (State == State.Connected)
{
startTimeStamp = DateTime.Now;
startTime = TimeInSecondsFromDateTime(startTimeStamp, initialTime, SamplingPeriodSec);
storedSamplesCount = 0;
State = State.MeasurementInProgress;
return true;
}
else
{
return false;
}
}
}
public bool StartMeasurementAll()
{
return StartMeasurement(0);
}
public bool StopMeasurement(int meterIx, out Int64 storedFramesCount)
{
lock (stateChangeAndTimerTickLock)
{
if (State == State.MeasurementInProgress)
{
stopTimeStamp = DateTime.Now;
stopTime = TimeInSecondsFromDateTime(stopTimeStamp, initialTime, SamplingPeriodSec);
int newSamplesCount = Convert.ToInt32(Math.Round((stopTime - currentTime) / SamplingPeriodSec));
double time = Units.ConvertTo(TimeUnits, currentTime);
double volume = currentVolume;
double volumeIncrement = Units.ConvertTo(VolumeUnits, currentFlow_m3ph * (SamplingPeriodSec / 3.6));
for (int i = 0; i < newSamplesCount; i++)
{
time += SamplingPeriod;
volume += volumeIncrement;
if (storedSamplesCount < MaxSamplesCount)
{
samples[storedSamplesCount++] = new Sample(time, volume, currentFlow);
}
}
State = State.Connected;
storedFramesCount = storedSamplesCount;
return true;
}
else
{
storedFramesCount = 0;
return false;
}
}
}
public bool StopMeasurementAll(out Int64[] storedFramesCount)
{
storedFramesCount = new Int64[1];
return StopMeasurement(0, out storedFramesCount[0]);
}
public void TimerTick(double flow_m3ph)
{
lock (stateChangeAndTimerTickLock)
{
double lastSampleTime = TimeInSecondsFromDateTime(DateTime.Now, initialTime, SamplingPeriodSec);
currentFlow_m3ph = flow_m3ph;
currentFlow = Units.ConvertTo(FlowUnits, flow_m3ph);
if (!lastTickValid)
{
currentTime = lastSampleTime;
currentVolume = 0;
lastTickValid = true;
lastTickState = State;
return;
}
else
{
int newSamplesCount = Convert.ToInt32(Math.Round((lastSampleTime - currentTime) / SamplingPeriodSec));
double volumeIncrement = Units.ConvertTo(VolumeUnits, currentFlow_m3ph * (SamplingPeriodSec / 3.6));
for (int i = 0; i < newSamplesCount; i++)
{
currentTime += SamplingPeriodSec;
currentVolume += volumeIncrement;
if (State == State.MeasurementInProgress && currentTime > startTime && storedSamplesCount < MaxSamplesCount)
{
samples[storedSamplesCount++] = new Sample(Units.ConvertTo(TimeUnits, currentTime), currentVolume, currentFlow);
}
}
currentTime = lastSampleTime; /// Rectify, prevent error propagation
lastTickState = State;
}
}
modelessDlg.OnMeterdata(new MeterDataEventArgs(State, currentTime, currentVolume, currentFlow));
}
/// <summary>
/// Obtain the last time instance before 'DateTime time' which is multiple of samplingPeriod-s after 'DateTime initialTime'.
/// </summary>
/// <param name="time">Time to be converted to seconds and rounded to samplingPeriod-s</param>
/// <param name="startTime">Initial time</param>
/// <param name="samplePeriod">Sampling period in seconds</param>
/// <returns></returns>
double TimeInSecondsFromDateTime(DateTime time, DateTime initialTime, double samplingPeriod)
{
TimeSpan span = time - initialTime;
return samplingPeriod * Math.Floor(span.TotalSeconds / samplingPeriod);
}
///---------------------------
/// Datastream data exchange
///---------------------------
/// <summary>
/// Retuns 'count' data frames starting with data frame with ID = 'id'
/// </summary>
/// <param name="id">First frame ID</param>
/// <param name="count">Frames count</param>
/// <returns>Selected data frames</returns>
public DataFrame[] GetFrames(int meterIx, Int64 startID, int count)
{
DataFrame[] frames = new DataFrame[count];
if (State != State.MeasurementInProgress)
{
for (int j = 0; j < count; j++)
{
Int64 id = startID + j;
if (id < storedSamplesCount)
{
frames[j] = new DataFrame(id, samples[id].Time, samples[id].Volume, new double[1] { samples[id].Flow });
}
}
}
return frames;
}
/// <summary>
/// Returns ID of the data frame where time equals or exceeds the specified time.
/// When time of the first frame (ID=0) is larger then specified time, function returns 0.
/// </summary>
/// <param name="time">Time</param>
/// <returns>ID of the data frame at or after the pecified time</returns>
public Int64 GetID(int meterIx, double time)
{
if (storedSamplesCount == 0) return -1;
Int64 lo = 0;
Int64 hi = storedSamplesCount - 1;
if (samples[hi].Time < time) return -1;
while (lo < hi)
{
Int64 mid = (lo + hi) / 2;
if (samples[mid].Time < time)
{
lo = mid + 1;
}
else
{
hi = mid;
}
}
return lo;
}
}
public enum State
{
Disconnected = 0,
Connected = 1,
MeasurementInProgress = 2,
}
}
+323
View File
@@ -0,0 +1,323 @@
namespace DataStreamMeter
{
partial class MeterSimulationDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.meterIDGroupBox = new System.Windows.Forms.GroupBox();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.volumeUnitsTextBox = new System.Windows.Forms.TextBox();
this.timeUnitsTextBox = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.meterIDTextBox = new System.Windows.Forms.TextBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.setFlowButton = new System.Windows.Forms.Button();
this.flowm3phTextBox = new System.Windows.Forms.TextBox();
this.flowTrackBar = new System.Windows.Forms.TrackBar();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.flowTextBox = new System.Windows.Forms.TextBox();
this.volumeTextBox = new System.Windows.Forms.TextBox();
this.timeTextBox = new System.Windows.Forms.TextBox();
this.stateTextBox = new System.Windows.Forms.TextBox();
this.label8 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.lastUITickTextBox = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.meterIDGroupBox.SuspendLayout();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.flowTrackBar)).BeginInit();
this.groupBox2.SuspendLayout();
this.SuspendLayout();
//
// meterIDGroupBox
//
this.meterIDGroupBox.Controls.Add(this.label3);
this.meterIDGroupBox.Controls.Add(this.label2);
this.meterIDGroupBox.Controls.Add(this.volumeUnitsTextBox);
this.meterIDGroupBox.Controls.Add(this.timeUnitsTextBox);
this.meterIDGroupBox.Controls.Add(this.label1);
this.meterIDGroupBox.Controls.Add(this.meterIDTextBox);
this.meterIDGroupBox.Location = new System.Drawing.Point(12, 12);
this.meterIDGroupBox.Name = "meterIDGroupBox";
this.meterIDGroupBox.Size = new System.Drawing.Size(453, 105);
this.meterIDGroupBox.TabIndex = 0;
this.meterIDGroupBox.TabStop = false;
this.meterIDGroupBox.Text = "Water meter info";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(18, 76);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(67, 13);
this.label3.TabIndex = 5;
this.label3.Text = "Volume units";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(18, 50);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(55, 13);
this.label2.TabIndex = 4;
this.label2.Text = "Time units";
//
// volumeUnitsTextBox
//
this.volumeUnitsTextBox.Enabled = false;
this.volumeUnitsTextBox.Location = new System.Drawing.Point(122, 73);
this.volumeUnitsTextBox.Name = "volumeUnitsTextBox";
this.volumeUnitsTextBox.Size = new System.Drawing.Size(52, 20);
this.volumeUnitsTextBox.TabIndex = 3;
//
// timeUnitsTextBox
//
this.timeUnitsTextBox.Enabled = false;
this.timeUnitsTextBox.Location = new System.Drawing.Point(122, 47);
this.timeUnitsTextBox.Name = "timeUnitsTextBox";
this.timeUnitsTextBox.Size = new System.Drawing.Size(52, 20);
this.timeUnitsTextBox.TabIndex = 2;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(18, 24);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(73, 13);
this.label1.TabIndex = 1;
this.label1.Text = "Meter ID (s/n)";
//
// meterIDTextBox
//
this.meterIDTextBox.Enabled = false;
this.meterIDTextBox.Location = new System.Drawing.Point(122, 21);
this.meterIDTextBox.Name = "meterIDTextBox";
this.meterIDTextBox.Size = new System.Drawing.Size(145, 20);
this.meterIDTextBox.TabIndex = 0;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.setFlowButton);
this.groupBox1.Controls.Add(this.flowm3phTextBox);
this.groupBox1.Controls.Add(this.flowTrackBar);
this.groupBox1.Location = new System.Drawing.Point(12, 123);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(453, 96);
this.groupBox1.TabIndex = 1;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Flow";
//
// setFlowButton
//
this.setFlowButton.Location = new System.Drawing.Point(289, 17);
this.setFlowButton.Name = "setFlowButton";
this.setFlowButton.Size = new System.Drawing.Size(75, 23);
this.setFlowButton.TabIndex = 4;
this.setFlowButton.Text = "Set value";
this.setFlowButton.UseVisualStyleBackColor = true;
this.setFlowButton.Click += new System.EventHandler(this.setFlowButton_Click);
//
// flowm3phTextBox
//
this.flowm3phTextBox.Enabled = false;
this.flowm3phTextBox.Location = new System.Drawing.Point(122, 19);
this.flowm3phTextBox.Name = "flowm3phTextBox";
this.flowm3phTextBox.Size = new System.Drawing.Size(145, 20);
this.flowm3phTextBox.TabIndex = 3;
//
// flowTrackBar
//
this.flowTrackBar.LargeChange = 1;
this.flowTrackBar.Location = new System.Drawing.Point(0, 43);
this.flowTrackBar.Maximum = 25;
this.flowTrackBar.Name = "flowTrackBar";
this.flowTrackBar.Size = new System.Drawing.Size(447, 45);
this.flowTrackBar.TabIndex = 2;
this.flowTrackBar.Scroll += new System.EventHandler(this.flowTrackBar_Scroll);
//
// groupBox2
//
this.groupBox2.Controls.Add(this.flowTextBox);
this.groupBox2.Controls.Add(this.volumeTextBox);
this.groupBox2.Controls.Add(this.timeTextBox);
this.groupBox2.Controls.Add(this.stateTextBox);
this.groupBox2.Controls.Add(this.label8);
this.groupBox2.Controls.Add(this.label7);
this.groupBox2.Controls.Add(this.label6);
this.groupBox2.Controls.Add(this.label5);
this.groupBox2.Controls.Add(this.lastUITickTextBox);
this.groupBox2.Controls.Add(this.label4);
this.groupBox2.Location = new System.Drawing.Point(12, 225);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(453, 150);
this.groupBox2.TabIndex = 2;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "State";
//
// flowTextBox
//
this.flowTextBox.Enabled = false;
this.flowTextBox.Location = new System.Drawing.Point(122, 121);
this.flowTextBox.Name = "flowTextBox";
this.flowTextBox.Size = new System.Drawing.Size(99, 20);
this.flowTextBox.TabIndex = 9;
//
// volumeTextBox
//
this.volumeTextBox.Enabled = false;
this.volumeTextBox.Location = new System.Drawing.Point(122, 95);
this.volumeTextBox.Name = "volumeTextBox";
this.volumeTextBox.Size = new System.Drawing.Size(99, 20);
this.volumeTextBox.TabIndex = 8;
//
// timeTextBox
//
this.timeTextBox.Enabled = false;
this.timeTextBox.Location = new System.Drawing.Point(122, 68);
this.timeTextBox.Name = "timeTextBox";
this.timeTextBox.Size = new System.Drawing.Size(99, 20);
this.timeTextBox.TabIndex = 7;
//
// stateTextBox
//
this.stateTextBox.Enabled = false;
this.stateTextBox.Location = new System.Drawing.Point(122, 42);
this.stateTextBox.Name = "stateTextBox";
this.stateTextBox.Size = new System.Drawing.Size(99, 20);
this.stateTextBox.TabIndex = 6;
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(18, 124);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(29, 13);
this.label8.TabIndex = 5;
this.label8.Text = "Flow";
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(18, 98);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(42, 13);
this.label7.TabIndex = 4;
this.label7.Text = "Volume";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(18, 71);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(30, 13);
this.label6.TabIndex = 3;
this.label6.Text = "Time";
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(18, 45);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(32, 13);
this.label5.TabIndex = 2;
this.label5.Text = "State";
//
// lastUITickTextBox
//
this.lastUITickTextBox.Enabled = false;
this.lastUITickTextBox.Location = new System.Drawing.Point(122, 13);
this.lastUITickTextBox.Name = "lastUITickTextBox";
this.lastUITickTextBox.Size = new System.Drawing.Size(145, 20);
this.lastUITickTextBox.TabIndex = 1;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(18, 16);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(61, 13);
this.label4.TabIndex = 0;
this.label4.Text = "Last UI tick";
//
// timer1
//
this.timer1.Interval = 1000;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// MeterSimulationDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(477, 387);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.meterIDGroupBox);
this.Name = "MeterSimulationDlg";
this.Text = "MeterDialog";
this.meterIDGroupBox.ResumeLayout(false);
this.meterIDGroupBox.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.flowTrackBar)).EndInit();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox meterIDGroupBox;
private System.Windows.Forms.TextBox meterIDTextBox;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox volumeUnitsTextBox;
private System.Windows.Forms.TextBox timeUnitsTextBox;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox flowm3phTextBox;
private System.Windows.Forms.TrackBar flowTrackBar;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Button setFlowButton;
private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.TextBox lastUITickTextBox;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox flowTextBox;
private System.Windows.Forms.TextBox volumeTextBox;
private System.Windows.Forms.TextBox timeTextBox;
private System.Windows.Forms.TextBox stateTextBox;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label5;
}
}
+91
View File
@@ -0,0 +1,91 @@
using System;
using System.Windows.Forms;
namespace DataStreamMeter
{
public partial class MeterSimulationDlg : Form
{
MeterSimulation meterSimulation;
double currentFlow;
public string MeterID;
public void OnMeterdata(MeterDataEventArgs args)
{
if (MeterDataHandler == null) return;
MeterDataHandler(null, args);
}
public event EventHandler<MeterDataEventArgs> MeterDataHandler;
/// <summary>
/// Default constructor with no meter
/// </summary>
public MeterSimulationDlg()
: this(null, string.Empty)
{
}
public MeterSimulationDlg(MeterSimulation meterSimulation, string meterID)
{
InitializeComponent();
this.meterSimulation = meterSimulation;
meterIDTextBox.Text = meterID;
currentFlow = 0;
flowm3phTextBox.Text = currentFlow.ToString();
flowTrackBar.Value = Convert.ToInt32(currentFlow);
MeterDataHandler += delegate(object sender, MeterDataEventArgs args)
{
if (InvokeRequired)
{
Invoke(new EventHandler<MeterDataEventArgs>(DisplayMeterData), sender, args);
}
else
{
DisplayMeterData(sender, args);
}
};
if (meterSimulation != null)
{
timer1.Enabled = true;
timer1.Start();
}
}
private void flowTrackBar_Scroll(object sender, EventArgs e)
{
currentFlow = flowTrackBar.Value;
flowm3phTextBox.Text = currentFlow.ToString("F2");
}
private void setFlowButton_Click(object sender, EventArgs e)
{
GetDblValueDlg dlg = new GetDblValueDlg("Enter flow in [m3/h] please", 0, 25.0);
if (dlg.ShowDialog() == DialogResult.OK)
{
currentFlow = dlg.DblValue;
flowm3phTextBox.Text = currentFlow.ToString();
flowTrackBar.Value = Convert.ToInt32(currentFlow);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
lastUITickTextBox.Text = DateTime.Now.ToString("HH:mm:ss fff");
meterSimulation.TimerTick(currentFlow);
}
void DisplayMeterData(object sender, MeterDataEventArgs args)
{
stateTextBox.Text = args.State.ToString();
timeTextBox.Text = args.Time.ToString();
volumeTextBox.Text = args.Volume.ToString();
flowTextBox.Text = args.Flow.ToString();
}
}
}
@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>
@@ -5,12 +5,12 @@ using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("S640TestApp")]
[assembly: AssemblyTitle("DataStreamMeter")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("S640TestApp")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyProduct("DataStreamMeter")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -20,7 +20,7 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("2b84f803-89f3-43cd-9e2d-6ed03de6c3b8")]
[assembly: Guid("8acd46eb-c84d-4199-9f40-7420b7ebabc2")]
// Version information for an assembly consists of the following four values:
//
+23
View File
@@ -0,0 +1,23 @@
using System;
namespace DataStreamMeter
{
public class Sample
{
public readonly double Time; /// In water meter time units
public readonly double Volume; /// In water meter colume units
public readonly double Flow; /// In water meter flow units
public Sample(double time, double volume, double flow)
{
Time = time;
Volume = volume;
Flow = flow;
}
public override string ToString()
{
return string.Format("time={0} volume={1} flow={2}", Time, Volume, Flow);
}
}
}
@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
+2 -2
View File
@@ -16,7 +16,7 @@
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
@@ -27,7 +27,7 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
+3 -6
View File
@@ -40,8 +40,9 @@
<StartupObject>DeviceTest.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.15\lib\net45\log4net.dll</HintPath>
<Reference Include="log4net, Version=1.2.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@@ -97,10 +98,6 @@
<Project>{743DF7DB-C7B6-42EB-986D-0F485E5588E4}</Project>
<Name>Config</Name>
</ProjectReference>
<ProjectReference Include="..\SchematicDrawing\SchematicDrawing.csproj">
<Project>{0f79ca69-9dbc-41f3-a6fc-5a2937365343}</Project>
<Name>SchematicDrawing</Name>
</ProjectReference>
<ProjectReference Include="..\TBF\TBF.csproj">
<Project>{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}</Project>
<Name>TBF</Name>
+21 -39
View File
@@ -2,10 +2,9 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.Windows.Forms;
using Common;
using TBF.Rig;
using TBF.Rig.Generic;
@@ -385,7 +384,7 @@ namespace DeviceTest
/// <returns>true when factory changed</returns>
bool FactoryFromClassName(string className, ref IComponentFactory factory)
{
foreach (var fac in TbfComponents.Factories)
foreach (var fac in TbfComponents.Factories)
{
if (className == fac.ClassName)
{
@@ -648,7 +647,7 @@ namespace DeviceTest
foreach (var dev in tbfDevices) dev.StopDevice();
foreach (var dev in tbfDevices) dev.StopDevice2();
tbfDevices.Clear();
tbfDevices.Clear();
startButton.Enabled = true;
stopButton.Enabled = false;
@@ -665,9 +664,9 @@ namespace DeviceTest
int previousOperation = 0;
if (tbfComponent1forOp is TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter)
if (tbfComponent1forOp is TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter)
{
operation1 = (tbfComponent1forOp as TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref dblBox1);
operation1 = (tbfComponent1forOp as TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
}
else if (tbfComponent1forOp is TBF.Rig.Network.Camera.CLP1611.Camera)
{
@@ -678,16 +677,11 @@ namespace DeviceTest
{
operation1 = (tbfComponent1forOp as TBF.Rig.Network.Camera.Roi.Roi).RoiDetectionOp();
}
else if (tbfComponent1forOp is TBF.Rig.Modbus.TempControl.Easytherm.TControl)
else if (tbfComponent1forOp is TBF.Rig.Modbus.TempControl.Easytherm.Easytherm)
{
operation1 = (tbfComponent1forOp as TBF.Rig.Modbus.TempControl.Easytherm.TControl).SetTemperatureSetpointOp(10);
operation2 = (tbfComponent1forOp as TBF.Rig.Modbus.TempControl.Easytherm.TControl).SetTemperatureSetpointOp(20);
operation1 = (tbfComponent1forOp as TBF.Rig.Modbus.TempControl.Easytherm.Easytherm).SetTemperatureOp(10);
operation2 = (tbfComponent1forOp as TBF.Rig.Modbus.TempControl.Easytherm.Easytherm).SetTemperatureOp(20);
}
else if (tbfComponent1forOp is TBF.Rig.Modbus.TempControl.Novus.TControl)
{
operation1 = (tbfComponent1forOp as TBF.Rig.Modbus.TempControl.Novus.TControl).SetTemperatureSetpointOp(10);
operation2 = (tbfComponent1forOp as TBF.Rig.Modbus.TempControl.Novus.TControl).SetTemperatureSetpointOp(20);
}
else if (tbfComponent1forOp is TBF.Rig.Modbus.UltrasoundLevelMeter.LevelMeter)
{
operation1 = (tbfComponent1forOp as TBF.Rig.Modbus.UltrasoundLevelMeter.LevelMeter).ReadLevelOp(ref dblBox1);
@@ -709,9 +703,9 @@ namespace DeviceTest
}
if (tbfComponent2forOp is TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter)
if (tbfComponent2forOp is TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter)
{
operation21 = (tbfComponent2forOp as TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref dblBox2);
operation21 = (tbfComponent2forOp as TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
}
else if (tbfComponent2forOp is TBF.Rig.Network.Camera.CLP1611.Camera)
{
@@ -722,16 +716,11 @@ namespace DeviceTest
{
operation21 = (tbfComponent2forOp as TBF.Rig.Network.Camera.Roi.Roi).RoiDetectionOp();
}
else if (tbfComponent2forOp is TBF.Rig.Modbus.TempControl.Easytherm.TControl)
else if (tbfComponent2forOp is TBF.Rig.Modbus.TempControl.Easytherm.Easytherm)
{
operation21 = (tbfComponent2forOp as TBF.Rig.Modbus.TempControl.Easytherm.TControl).SetTemperatureSetpointOp(10);
operation22 = (tbfComponent2forOp as TBF.Rig.Modbus.TempControl.Easytherm.TControl).SetTemperatureSetpointOp(20);
operation21 = (tbfComponent2forOp as TBF.Rig.Modbus.TempControl.Easytherm.Easytherm).SetTemperatureOp(10);
operation22 = (tbfComponent2forOp as TBF.Rig.Modbus.TempControl.Easytherm.Easytherm).SetTemperatureOp(20);
}
else if (tbfComponent2forOp is TBF.Rig.Modbus.TempControl.Novus.TControl)
{
operation21 = (tbfComponent2forOp as TBF.Rig.Modbus.TempControl.Novus.TControl).SetTemperatureSetpointOp(10);
operation22 = (tbfComponent2forOp as TBF.Rig.Modbus.TempControl.Novus.TControl).SetTemperatureSetpointOp(20);
}
else if (tbfComponent2forOp is TBF.Rig.Modbus.UltrasoundLevelMeter.LevelMeter)
{
operation21 = (tbfComponent2forOp as TBF.Rig.Modbus.UltrasoundLevelMeter.LevelMeter).ReadLevelOp(ref dblBox1);
@@ -753,9 +742,9 @@ namespace DeviceTest
}
if (tbfComponent3forOp is TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter)
if (tbfComponent3forOp is TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter)
{
operation31 = (tbfComponent3forOp as TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref dblBox3);
operation31 = (tbfComponent3forOp as TBF.Rig.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
}
else if (tbfComponent3forOp is TBF.Rig.Network.Camera.CLP1611.Camera)
{
@@ -766,16 +755,11 @@ namespace DeviceTest
{
operation31 = (tbfComponent3forOp as TBF.Rig.Network.Camera.Roi.Roi).RoiDetectionOp();
}
else if (tbfComponent3forOp is TBF.Rig.Modbus.TempControl.Easytherm.TControl)
{
operation31 = (tbfComponent3forOp as TBF.Rig.Modbus.TempControl.Easytherm.TControl).SetTemperatureSetpointOp(10);
operation32 = (tbfComponent3forOp as TBF.Rig.Modbus.TempControl.Easytherm.TControl).SetTemperatureSetpointOp(20);
}
else if (tbfComponent3forOp is TBF.Rig.Modbus.TempControl.Novus.TControl)
{
operation31 = (tbfComponent3forOp as TBF.Rig.Modbus.TempControl.Novus.TControl).SetTemperatureSetpointOp(10);
operation32 = (tbfComponent3forOp as TBF.Rig.Modbus.TempControl.Novus.TControl).SetTemperatureSetpointOp(20);
}
else if (tbfComponent3forOp is TBF.Rig.Modbus.TempControl.Easytherm.Easytherm)
{
operation31 = (tbfComponent3forOp as TBF.Rig.Modbus.TempControl.Easytherm.Easytherm).SetTemperatureOp(10);
operation32 = (tbfComponent3forOp as TBF.Rig.Modbus.TempControl.Easytherm.Easytherm).SetTemperatureOp(20);
}
else if (tbfComponent3forOp is TBF.Rig.Modbus.UltrasoundLevelMeter.LevelMeter)
{
operation31 = (tbfComponent3forOp as TBF.Rig.Modbus.UltrasoundLevelMeter.LevelMeter).ReadLevelOp(ref dblBox1);
@@ -875,7 +859,7 @@ namespace DeviceTest
foreach (var d in tbfDevices) d.StopDevice();
foreach (var d in tbfDevices) d.StopDevice2();
}
}
private void stopButton_Click(object sender, EventArgs e)
{
@@ -899,8 +883,6 @@ namespace DeviceTest
{
Cursor = Cursors.WaitCursor;
CurrentUser.Restore(this);
if (workerThread != null)
{
workerThreadRunning = false;
-4
View File
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="log4net" version="2.0.15" targetFramework="net472" />
</packages>
+1 -1
View File
@@ -183,7 +183,7 @@ namespace Dirichlet.Numerics
public override string ToString()
{
return ((BigInteger)this).ToString("x");
return ((BigInteger)this).ToString();
}
public string ToString(string format)
+2 -2
View File
@@ -16,7 +16,7 @@
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
@@ -27,7 +27,7 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
+143
View File
@@ -0,0 +1,143 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using Common;
using Events;
namespace EventViewer
{
public static class EViewerDB
{
/// <summary> Session factory for all regular sessions, not for CreateEmptyResultsDB(). </summary>
public static ISessionFactory SessionFactory;
/// <summary> Connection string for all sessions </summary>
static string connectionString;
///
public static string ConnectionString
{
get { return connectionString; }
set
{
if (value != connectionString)
{
connectionString = value;
SessionFactory = null; /// Clear SessionFactory on connection string change
}
}
}
/// <summary> Database type (MySQL or SQLite) for all sessions </summary>
private static DBType dbType;
///
public static DBType DbType
{
get { return dbType; }
set { dbType = value; SessionFactory = null; }
}
/// <summary>
/// NHibernate session factory (to create the database session 'SessionFactory')
/// </summary>
/// <returns>A database session</returns>
static ISessionFactory CreateSessionFactory()
{
return CreateSessionFactory(false);
}
/// <summary>
/// NHibernate session factory (to create the database session 'SessionFactory')
/// </summary>
/// <param name="createDB">true = Create a new DB, false = Regular DB</param>
/// <returns>A database session</returns>
public static ISessionFactory CreateSessionFactory(bool createDB)
{
FluentConfiguration cfg = Fluently.Configure();
switch (dbType)
{
default:
case DBType.MySql:
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
break;
case DBType.SQLite:
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
break;
}
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<global::Events.Entities.Event>());
if (createDB)
{
return cfg.ExposeConfiguration(BuildSchemaCreate)
.BuildConfiguration()
.SetProperty("hibernate.connection.connect_timeout", Const.MySqlConnectTimeoutSec)
.BuildSessionFactory();
}
else
{
return cfg.ExposeConfiguration(BuildSchema)
.BuildConfiguration()
.SetProperty("hibernate.connection.connect_timeout", Const.MySqlConnectTimeoutSec)
.BuildSessionFactory();
}
}
static void BuildSchema(Configuration config)
{
/// This NHibernate tool takes a configuration with mapping info and exports a database schema
new SchemaExport(config).SetOutputFile("db_schema");
}
static void BuildSchemaCreate(Configuration config)
{
/// This NHibernate tool takes a configuration with mapping info and exports a database schema
new SchemaExport(config).Create(true, true);
}
/// Create a NHibernate session for the given database
public static ISession CreateSession()
{
if (string.IsNullOrEmpty(connectionString))
{
throw new Exception("Connection string was not specified");
}
if (SessionFactory == null) SessionFactory = CreateSessionFactory();
return SessionFactory.OpenSession();
}
/// <summary>
/// Create an empty users database.
/// Database contains only the user 'admin' and the control board component 'CB'.
/// </summary>
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
/// <param name="connectionString">Connection string</param>
/// <returns>true=success, false=error</returns>
public static bool CreateEmptyDB()
{
ISessionFactory sessionFactory = CreateSessionFactory(true);
if (sessionFactory == null) return false;
/// Populate the database
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
transaction.Commit();
}
}
return true;
}
}
}

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